// Generated by the protocol buffer compiler.  DO NOT EDIT!
// NO CHECKED-IN PROTOBUF GENCODE
// source: google/protobuf/descriptor.proto
// Protobuf C++ Version: 6.33.0-dev

#include "google/protobuf/descriptor.pb.h"

#include <algorithm>
#include <type_traits>
#include "google/protobuf/io/coded_stream.h"
#include "google/protobuf/generated_message_tctable_impl.h"
#include "google/protobuf/extension_set.h"
#include "google/protobuf/generated_message_util.h"
#include "google/protobuf/wire_format_lite.h"
#include "google/protobuf/descriptor.h"
#include "google/protobuf/generated_message_reflection.h"
#include "google/protobuf/reflection_ops.h"
#include "google/protobuf/wire_format.h"
// @@protoc_insertion_point(includes)

// Must be included last.
#include "google/protobuf/port_def.inc"
PROTOBUF_PRAGMA_INIT_SEG
namespace _pb = ::google::protobuf;
namespace _pbi = ::google::protobuf::internal;
namespace _fl = ::google::protobuf::internal::field_layout;
namespace google {
namespace protobuf {

inline constexpr UninterpretedOption_NamePart::Impl_::Impl_(
    ::_pbi::ConstantInitialized) noexcept
      : _cached_size_{0},
        name_part_(
            &::google::protobuf::internal::fixed_address_empty_string,
            ::_pbi::ConstantInitialized()),
        is_extension_{false} {}

template <typename>
PROTOBUF_CONSTEXPR UninterpretedOption_NamePart::UninterpretedOption_NamePart(::_pbi::ConstantInitialized)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(UninterpretedOption_NamePart_class_data_.base()),
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(),
#endif  // PROTOBUF_CUSTOM_VTABLE
      _impl_(::_pbi::ConstantInitialized()) {
}
struct UninterpretedOption_NamePartDefaultTypeInternal {
#if defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  constexpr UninterpretedOption_NamePartDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
#else   // defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  UninterpretedOption_NamePartDefaultTypeInternal() {}
  void Init() { ::new (&_instance) UninterpretedOption_NamePart(); };
#endif  // defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  ~UninterpretedOption_NamePartDefaultTypeInternal() {}
  union {
    UninterpretedOption_NamePart _instance;
  };
};

PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_EXPORT
    PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 UninterpretedOption_NamePartDefaultTypeInternal _UninterpretedOption_NamePart_default_instance_;

inline constexpr SourceCodeInfo_Location::Impl_::Impl_(
    ::_pbi::ConstantInitialized) noexcept
      : _cached_size_{0},
        path_{},
        _path_cached_byte_size_{0},
        span_{},
        _span_cached_byte_size_{0},
        leading_detached_comments_{},
        leading_comments_(
            &::google::protobuf::internal::fixed_address_empty_string,
            ::_pbi::ConstantInitialized()),
        trailing_comments_(
            &::google::protobuf::internal::fixed_address_empty_string,
            ::_pbi::ConstantInitialized()) {}

template <typename>
PROTOBUF_CONSTEXPR SourceCodeInfo_Location::SourceCodeInfo_Location(::_pbi::ConstantInitialized)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(SourceCodeInfo_Location_class_data_.base()),
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(),
#endif  // PROTOBUF_CUSTOM_VTABLE
      _impl_(::_pbi::ConstantInitialized()) {
}
struct SourceCodeInfo_LocationDefaultTypeInternal {
#if defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  constexpr SourceCodeInfo_LocationDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
#else   // defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  SourceCodeInfo_LocationDefaultTypeInternal() {}
  void Init() { ::new (&_instance) SourceCodeInfo_Location(); };
#endif  // defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  ~SourceCodeInfo_LocationDefaultTypeInternal() {}
  union {
    SourceCodeInfo_Location _instance;
  };
};

PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_EXPORT
    PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 SourceCodeInfo_LocationDefaultTypeInternal _SourceCodeInfo_Location_default_instance_;

inline constexpr GeneratedCodeInfo_Annotation::Impl_::Impl_(
    ::_pbi::ConstantInitialized) noexcept
      : _cached_size_{0},
        path_{},
        _path_cached_byte_size_{0},
        source_file_(
            &::google::protobuf::internal::fixed_address_empty_string,
            ::_pbi::ConstantInitialized()),
        begin_{0},
        end_{0},
        semantic_{static_cast< ::google::protobuf::GeneratedCodeInfo_Annotation_Semantic >(0)} {}

template <typename>
PROTOBUF_CONSTEXPR GeneratedCodeInfo_Annotation::GeneratedCodeInfo_Annotation(::_pbi::ConstantInitialized)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(GeneratedCodeInfo_Annotation_class_data_.base()),
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(),
#endif  // PROTOBUF_CUSTOM_VTABLE
      _impl_(::_pbi::ConstantInitialized()) {
}
struct GeneratedCodeInfo_AnnotationDefaultTypeInternal {
#if defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  constexpr GeneratedCodeInfo_AnnotationDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
#else   // defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  GeneratedCodeInfo_AnnotationDefaultTypeInternal() {}
  void Init() { ::new (&_instance) GeneratedCodeInfo_Annotation(); };
#endif  // defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  ~GeneratedCodeInfo_AnnotationDefaultTypeInternal() {}
  union {
    GeneratedCodeInfo_Annotation _instance;
  };
};

PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_EXPORT
    PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 GeneratedCodeInfo_AnnotationDefaultTypeInternal _GeneratedCodeInfo_Annotation_default_instance_;

inline constexpr FieldOptions_FeatureSupport::Impl_::Impl_(
    ::_pbi::ConstantInitialized) noexcept
      : _cached_size_{0},
        deprecation_warning_(
            &::google::protobuf::internal::fixed_address_empty_string,
            ::_pbi::ConstantInitialized()),
        edition_introduced_{static_cast< ::google::protobuf::Edition >(0)},
        edition_deprecated_{static_cast< ::google::protobuf::Edition >(0)},
        edition_removed_{static_cast< ::google::protobuf::Edition >(0)} {}

template <typename>
PROTOBUF_CONSTEXPR FieldOptions_FeatureSupport::FieldOptions_FeatureSupport(::_pbi::ConstantInitialized)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(FieldOptions_FeatureSupport_class_data_.base()),
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(),
#endif  // PROTOBUF_CUSTOM_VTABLE
      _impl_(::_pbi::ConstantInitialized()) {
}
struct FieldOptions_FeatureSupportDefaultTypeInternal {
#if defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  constexpr FieldOptions_FeatureSupportDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
#else   // defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  FieldOptions_FeatureSupportDefaultTypeInternal() {}
  void Init() { ::new (&_instance) FieldOptions_FeatureSupport(); };
#endif  // defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  ~FieldOptions_FeatureSupportDefaultTypeInternal() {}
  union {
    FieldOptions_FeatureSupport _instance;
  };
};

PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_EXPORT
    PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 FieldOptions_FeatureSupportDefaultTypeInternal _FieldOptions_FeatureSupport_default_instance_;

inline constexpr FieldOptions_EditionDefault::Impl_::Impl_(
    ::_pbi::ConstantInitialized) noexcept
      : _cached_size_{0},
        value_(
            &::google::protobuf::internal::fixed_address_empty_string,
            ::_pbi::ConstantInitialized()),
        edition_{static_cast< ::google::protobuf::Edition >(0)} {}

template <typename>
PROTOBUF_CONSTEXPR FieldOptions_EditionDefault::FieldOptions_EditionDefault(::_pbi::ConstantInitialized)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(FieldOptions_EditionDefault_class_data_.base()),
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(),
#endif  // PROTOBUF_CUSTOM_VTABLE
      _impl_(::_pbi::ConstantInitialized()) {
}
struct FieldOptions_EditionDefaultDefaultTypeInternal {
#if defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  constexpr FieldOptions_EditionDefaultDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
#else   // defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  FieldOptions_EditionDefaultDefaultTypeInternal() {}
  void Init() { ::new (&_instance) FieldOptions_EditionDefault(); };
#endif  // defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  ~FieldOptions_EditionDefaultDefaultTypeInternal() {}
  union {
    FieldOptions_EditionDefault _instance;
  };
};

PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_EXPORT
    PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 FieldOptions_EditionDefaultDefaultTypeInternal _FieldOptions_EditionDefault_default_instance_;
template <typename>
PROTOBUF_CONSTEXPR FeatureSet_VisibilityFeature::FeatureSet_VisibilityFeature(::_pbi::ConstantInitialized)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::internal::ZeroFieldsBase(FeatureSet_VisibilityFeature_class_data_.base()){}
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::internal::ZeroFieldsBase() {
}
#endif  // PROTOBUF_CUSTOM_VTABLE
struct FeatureSet_VisibilityFeatureDefaultTypeInternal {
#if defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  constexpr FeatureSet_VisibilityFeatureDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
#else   // defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  FeatureSet_VisibilityFeatureDefaultTypeInternal() {}
  void Init() { ::new (&_instance) FeatureSet_VisibilityFeature(); };
#endif  // defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  ~FeatureSet_VisibilityFeatureDefaultTypeInternal() {}
  union {
    FeatureSet_VisibilityFeature _instance;
  };
};

PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_EXPORT
    PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 FeatureSet_VisibilityFeatureDefaultTypeInternal _FeatureSet_VisibilityFeature_default_instance_;

inline constexpr FeatureSet::Impl_::Impl_(
    ::_pbi::ConstantInitialized) noexcept
      : _cached_size_{0},
        field_presence_{static_cast< ::google::protobuf::FeatureSet_FieldPresence >(0)},
        enum_type_{static_cast< ::google::protobuf::FeatureSet_EnumType >(0)},
        repeated_field_encoding_{static_cast< ::google::protobuf::FeatureSet_RepeatedFieldEncoding >(0)},
        utf8_validation_{static_cast< ::google::protobuf::FeatureSet_Utf8Validation >(0)},
        message_encoding_{static_cast< ::google::protobuf::FeatureSet_MessageEncoding >(0)},
        json_format_{static_cast< ::google::protobuf::FeatureSet_JsonFormat >(0)},
        enforce_naming_style_{static_cast< ::google::protobuf::FeatureSet_EnforceNamingStyle >(0)},
        default_symbol_visibility_{static_cast< ::google::protobuf::FeatureSet_VisibilityFeature_DefaultSymbolVisibility >(0)} {}

template <typename>
PROTOBUF_CONSTEXPR FeatureSet::FeatureSet(::_pbi::ConstantInitialized)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(FeatureSet_class_data_.base()),
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(),
#endif  // PROTOBUF_CUSTOM_VTABLE
      _impl_(::_pbi::ConstantInitialized()) {
}
struct FeatureSetDefaultTypeInternal {
#if defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  constexpr FeatureSetDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
#else   // defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  FeatureSetDefaultTypeInternal() {}
  void Init() { ::new (&_instance) FeatureSet(); };
#endif  // defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  ~FeatureSetDefaultTypeInternal() {}
  union {
    FeatureSet _instance;
  };
};

PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_EXPORT
    PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 FeatureSetDefaultTypeInternal _FeatureSet_default_instance_;

inline constexpr ExtensionRangeOptions_Declaration::Impl_::Impl_(
    ::_pbi::ConstantInitialized) noexcept
      : _cached_size_{0},
        full_name_(
            &::google::protobuf::internal::fixed_address_empty_string,
            ::_pbi::ConstantInitialized()),
        type_(
            &::google::protobuf::internal::fixed_address_empty_string,
            ::_pbi::ConstantInitialized()),
        number_{0},
        reserved_{false},
        repeated_{false} {}

template <typename>
PROTOBUF_CONSTEXPR ExtensionRangeOptions_Declaration::ExtensionRangeOptions_Declaration(::_pbi::ConstantInitialized)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(ExtensionRangeOptions_Declaration_class_data_.base()),
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(),
#endif  // PROTOBUF_CUSTOM_VTABLE
      _impl_(::_pbi::ConstantInitialized()) {
}
struct ExtensionRangeOptions_DeclarationDefaultTypeInternal {
#if defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  constexpr ExtensionRangeOptions_DeclarationDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
#else   // defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  ExtensionRangeOptions_DeclarationDefaultTypeInternal() {}
  void Init() { ::new (&_instance) ExtensionRangeOptions_Declaration(); };
#endif  // defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  ~ExtensionRangeOptions_DeclarationDefaultTypeInternal() {}
  union {
    ExtensionRangeOptions_Declaration _instance;
  };
};

PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_EXPORT
    PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 ExtensionRangeOptions_DeclarationDefaultTypeInternal _ExtensionRangeOptions_Declaration_default_instance_;

inline constexpr EnumDescriptorProto_EnumReservedRange::Impl_::Impl_(
    ::_pbi::ConstantInitialized) noexcept
      : _cached_size_{0},
        start_{0},
        end_{0} {}

template <typename>
PROTOBUF_CONSTEXPR EnumDescriptorProto_EnumReservedRange::EnumDescriptorProto_EnumReservedRange(::_pbi::ConstantInitialized)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(EnumDescriptorProto_EnumReservedRange_class_data_.base()),
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(),
#endif  // PROTOBUF_CUSTOM_VTABLE
      _impl_(::_pbi::ConstantInitialized()) {
}
struct EnumDescriptorProto_EnumReservedRangeDefaultTypeInternal {
#if defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  constexpr EnumDescriptorProto_EnumReservedRangeDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
#else   // defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  EnumDescriptorProto_EnumReservedRangeDefaultTypeInternal() {}
  void Init() { ::new (&_instance) EnumDescriptorProto_EnumReservedRange(); };
#endif  // defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  ~EnumDescriptorProto_EnumReservedRangeDefaultTypeInternal() {}
  union {
    EnumDescriptorProto_EnumReservedRange _instance;
  };
};

PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_EXPORT
    PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 EnumDescriptorProto_EnumReservedRangeDefaultTypeInternal _EnumDescriptorProto_EnumReservedRange_default_instance_;

inline constexpr DescriptorProto_ReservedRange::Impl_::Impl_(
    ::_pbi::ConstantInitialized) noexcept
      : _cached_size_{0},
        start_{0},
        end_{0} {}

template <typename>
PROTOBUF_CONSTEXPR DescriptorProto_ReservedRange::DescriptorProto_ReservedRange(::_pbi::ConstantInitialized)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(DescriptorProto_ReservedRange_class_data_.base()),
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(),
#endif  // PROTOBUF_CUSTOM_VTABLE
      _impl_(::_pbi::ConstantInitialized()) {
}
struct DescriptorProto_ReservedRangeDefaultTypeInternal {
#if defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  constexpr DescriptorProto_ReservedRangeDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
#else   // defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  DescriptorProto_ReservedRangeDefaultTypeInternal() {}
  void Init() { ::new (&_instance) DescriptorProto_ReservedRange(); };
#endif  // defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  ~DescriptorProto_ReservedRangeDefaultTypeInternal() {}
  union {
    DescriptorProto_ReservedRange _instance;
  };
};

PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_EXPORT
    PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 DescriptorProto_ReservedRangeDefaultTypeInternal _DescriptorProto_ReservedRange_default_instance_;

inline constexpr UninterpretedOption::Impl_::Impl_(
    ::_pbi::ConstantInitialized) noexcept
      : _cached_size_{0},
        name_{},
        identifier_value_(
            &::google::protobuf::internal::fixed_address_empty_string,
            ::_pbi::ConstantInitialized()),
        string_value_(
            &::google::protobuf::internal::fixed_address_empty_string,
            ::_pbi::ConstantInitialized()),
        aggregate_value_(
            &::google::protobuf::internal::fixed_address_empty_string,
            ::_pbi::ConstantInitialized()),
        positive_int_value_{::uint64_t{0u}},
        negative_int_value_{::int64_t{0}},
        double_value_{0} {}

template <typename>
PROTOBUF_CONSTEXPR UninterpretedOption::UninterpretedOption(::_pbi::ConstantInitialized)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(UninterpretedOption_class_data_.base()),
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(),
#endif  // PROTOBUF_CUSTOM_VTABLE
      _impl_(::_pbi::ConstantInitialized()) {
}
struct UninterpretedOptionDefaultTypeInternal {
#if defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  constexpr UninterpretedOptionDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
#else   // defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  UninterpretedOptionDefaultTypeInternal() {}
  void Init() { ::new (&_instance) UninterpretedOption(); };
#endif  // defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  ~UninterpretedOptionDefaultTypeInternal() {}
  union {
    UninterpretedOption _instance;
  };
};

PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_EXPORT
    PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 UninterpretedOptionDefaultTypeInternal _UninterpretedOption_default_instance_;

inline constexpr SourceCodeInfo::Impl_::Impl_(
    ::_pbi::ConstantInitialized) noexcept
      : _cached_size_{0},
        location_{} {}

template <typename>
PROTOBUF_CONSTEXPR SourceCodeInfo::SourceCodeInfo(::_pbi::ConstantInitialized)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(SourceCodeInfo_class_data_.base()),
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(),
#endif  // PROTOBUF_CUSTOM_VTABLE
      _impl_(::_pbi::ConstantInitialized()) {
}
struct SourceCodeInfoDefaultTypeInternal {
#if defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  constexpr SourceCodeInfoDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
#else   // defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  SourceCodeInfoDefaultTypeInternal() {}
  void Init() { ::new (&_instance) SourceCodeInfo(); };
#endif  // defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  ~SourceCodeInfoDefaultTypeInternal() {}
  union {
    SourceCodeInfo _instance;
  };
};

PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_EXPORT
    PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 SourceCodeInfoDefaultTypeInternal _SourceCodeInfo_default_instance_;

inline constexpr GeneratedCodeInfo::Impl_::Impl_(
    ::_pbi::ConstantInitialized) noexcept
      : _cached_size_{0},
        annotation_{} {}

template <typename>
PROTOBUF_CONSTEXPR GeneratedCodeInfo::GeneratedCodeInfo(::_pbi::ConstantInitialized)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(GeneratedCodeInfo_class_data_.base()),
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(),
#endif  // PROTOBUF_CUSTOM_VTABLE
      _impl_(::_pbi::ConstantInitialized()) {
}
struct GeneratedCodeInfoDefaultTypeInternal {
#if defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  constexpr GeneratedCodeInfoDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
#else   // defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  GeneratedCodeInfoDefaultTypeInternal() {}
  void Init() { ::new (&_instance) GeneratedCodeInfo(); };
#endif  // defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  ~GeneratedCodeInfoDefaultTypeInternal() {}
  union {
    GeneratedCodeInfo _instance;
  };
};

PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_EXPORT
    PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 GeneratedCodeInfoDefaultTypeInternal _GeneratedCodeInfo_default_instance_;

inline constexpr FeatureSetDefaults_FeatureSetEditionDefault::Impl_::Impl_(
    ::_pbi::ConstantInitialized) noexcept
      : _cached_size_{0},
        overridable_features_{nullptr},
        fixed_features_{nullptr},
        edition_{static_cast< ::google::protobuf::Edition >(0)} {}

template <typename>
PROTOBUF_CONSTEXPR FeatureSetDefaults_FeatureSetEditionDefault::FeatureSetDefaults_FeatureSetEditionDefault(::_pbi::ConstantInitialized)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(FeatureSetDefaults_FeatureSetEditionDefault_class_data_.base()),
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(),
#endif  // PROTOBUF_CUSTOM_VTABLE
      _impl_(::_pbi::ConstantInitialized()) {
}
struct FeatureSetDefaults_FeatureSetEditionDefaultDefaultTypeInternal {
#if defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  constexpr FeatureSetDefaults_FeatureSetEditionDefaultDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
#else   // defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  FeatureSetDefaults_FeatureSetEditionDefaultDefaultTypeInternal() {}
  void Init() { ::new (&_instance) FeatureSetDefaults_FeatureSetEditionDefault(); };
#endif  // defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  ~FeatureSetDefaults_FeatureSetEditionDefaultDefaultTypeInternal() {}
  union {
    FeatureSetDefaults_FeatureSetEditionDefault _instance;
  };
};

PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_EXPORT
    PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 FeatureSetDefaults_FeatureSetEditionDefaultDefaultTypeInternal _FeatureSetDefaults_FeatureSetEditionDefault_default_instance_;

inline constexpr ServiceOptions::Impl_::Impl_(
    ::_pbi::ConstantInitialized) noexcept
      : _cached_size_{0},
        uninterpreted_option_{},
        features_{nullptr},
        deprecated_{false} {}

template <typename>
PROTOBUF_CONSTEXPR ServiceOptions::ServiceOptions(::_pbi::ConstantInitialized)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(ServiceOptions_class_data_.base()),
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(),
#endif  // PROTOBUF_CUSTOM_VTABLE
      _impl_(::_pbi::ConstantInitialized()) {
}
struct ServiceOptionsDefaultTypeInternal {
#if defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  constexpr ServiceOptionsDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
#else   // defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  ServiceOptionsDefaultTypeInternal() {}
  void Init() { ::new (&_instance) ServiceOptions(); };
#endif  // defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  ~ServiceOptionsDefaultTypeInternal() {}
  union {
    ServiceOptions _instance;
  };
};

PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_EXPORT
    PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 ServiceOptionsDefaultTypeInternal _ServiceOptions_default_instance_;

inline constexpr OneofOptions::Impl_::Impl_(
    ::_pbi::ConstantInitialized) noexcept
      : _cached_size_{0},
        uninterpreted_option_{},
        features_{nullptr} {}

template <typename>
PROTOBUF_CONSTEXPR OneofOptions::OneofOptions(::_pbi::ConstantInitialized)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(OneofOptions_class_data_.base()),
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(),
#endif  // PROTOBUF_CUSTOM_VTABLE
      _impl_(::_pbi::ConstantInitialized()) {
}
struct OneofOptionsDefaultTypeInternal {
#if defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  constexpr OneofOptionsDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
#else   // defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  OneofOptionsDefaultTypeInternal() {}
  void Init() { ::new (&_instance) OneofOptions(); };
#endif  // defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  ~OneofOptionsDefaultTypeInternal() {}
  union {
    OneofOptions _instance;
  };
};

PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_EXPORT
    PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 OneofOptionsDefaultTypeInternal _OneofOptions_default_instance_;

inline constexpr MethodOptions::Impl_::Impl_(
    ::_pbi::ConstantInitialized) noexcept
      : _cached_size_{0},
        uninterpreted_option_{},
        features_{nullptr},
        deprecated_{false},
        idempotency_level_{static_cast< ::google::protobuf::MethodOptions_IdempotencyLevel >(0)} {}

template <typename>
PROTOBUF_CONSTEXPR MethodOptions::MethodOptions(::_pbi::ConstantInitialized)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(MethodOptions_class_data_.base()),
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(),
#endif  // PROTOBUF_CUSTOM_VTABLE
      _impl_(::_pbi::ConstantInitialized()) {
}
struct MethodOptionsDefaultTypeInternal {
#if defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  constexpr MethodOptionsDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
#else   // defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  MethodOptionsDefaultTypeInternal() {}
  void Init() { ::new (&_instance) MethodOptions(); };
#endif  // defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  ~MethodOptionsDefaultTypeInternal() {}
  union {
    MethodOptions _instance;
  };
};

PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_EXPORT
    PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 MethodOptionsDefaultTypeInternal _MethodOptions_default_instance_;

inline constexpr MessageOptions::Impl_::Impl_(
    ::_pbi::ConstantInitialized) noexcept
      : _cached_size_{0},
        features_{nullptr},
        message_set_wire_format_{false},
        no_standard_descriptor_accessor_{false},
        deprecated_{false},
        map_entry_{false},
        deprecated_legacy_json_field_conflicts_{false},
        uninterpreted_option_{} {}

template <typename>
PROTOBUF_CONSTEXPR MessageOptions::MessageOptions(::_pbi::ConstantInitialized)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(MessageOptions_class_data_.base()),
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(),
#endif  // PROTOBUF_CUSTOM_VTABLE
      _impl_(::_pbi::ConstantInitialized()) {
}
struct MessageOptionsDefaultTypeInternal {
#if defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  constexpr MessageOptionsDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
#else   // defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  MessageOptionsDefaultTypeInternal() {}
  void Init() { ::new (&_instance) MessageOptions(); };
#endif  // defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  ~MessageOptionsDefaultTypeInternal() {}
  union {
    MessageOptions _instance;
  };
};

PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_EXPORT
    PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 MessageOptionsDefaultTypeInternal _MessageOptions_default_instance_;

inline constexpr FileOptions::Impl_::Impl_(
    ::_pbi::ConstantInitialized) noexcept
      : _cached_size_{0},
        java_package_(
            &::google::protobuf::internal::fixed_address_empty_string,
            ::_pbi::ConstantInitialized()),
        java_outer_classname_(
            &::google::protobuf::internal::fixed_address_empty_string,
            ::_pbi::ConstantInitialized()),
        go_package_(
            &::google::protobuf::internal::fixed_address_empty_string,
            ::_pbi::ConstantInitialized()),
        objc_class_prefix_(
            &::google::protobuf::internal::fixed_address_empty_string,
            ::_pbi::ConstantInitialized()),
        csharp_namespace_(
            &::google::protobuf::internal::fixed_address_empty_string,
            ::_pbi::ConstantInitialized()),
        swift_prefix_(
            &::google::protobuf::internal::fixed_address_empty_string,
            ::_pbi::ConstantInitialized()),
        php_class_prefix_(
            &::google::protobuf::internal::fixed_address_empty_string,
            ::_pbi::ConstantInitialized()),
        php_namespace_(
            &::google::protobuf::internal::fixed_address_empty_string,
            ::_pbi::ConstantInitialized()),
        php_metadata_namespace_(
            &::google::protobuf::internal::fixed_address_empty_string,
            ::_pbi::ConstantInitialized()),
        ruby_package_(
            &::google::protobuf::internal::fixed_address_empty_string,
            ::_pbi::ConstantInitialized()),
        features_{nullptr},
        java_multiple_files_{false},
        cc_generic_services_{false},
        java_generic_services_{false},
        py_generic_services_{false},
        java_generate_equals_and_hash_{false},
        deprecated_{false},
        java_string_check_utf8_{false},
        optimize_for_{static_cast< ::google::protobuf::FileOptions_OptimizeMode >(1)},
        cc_enable_arenas_{true},
        uninterpreted_option_{} {}

template <typename>
PROTOBUF_CONSTEXPR FileOptions::FileOptions(::_pbi::ConstantInitialized)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(FileOptions_class_data_.base()),
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(),
#endif  // PROTOBUF_CUSTOM_VTABLE
      _impl_(::_pbi::ConstantInitialized()) {
}
struct FileOptionsDefaultTypeInternal {
#if defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  constexpr FileOptionsDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
#else   // defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  FileOptionsDefaultTypeInternal() {}
  void Init() { ::new (&_instance) FileOptions(); };
#endif  // defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  ~FileOptionsDefaultTypeInternal() {}
  union {
    FileOptions _instance;
  };
};

PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_EXPORT
    PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 FileOptionsDefaultTypeInternal _FileOptions_default_instance_;

inline constexpr FieldOptions::Impl_::Impl_(
    ::_pbi::ConstantInitialized) noexcept
      : _cached_size_{0},
        edition_defaults_{},
        uninterpreted_option_{},
        features_{nullptr},
        feature_support_{nullptr},
        ctype_{static_cast< ::google::protobuf::FieldOptions_CType >(0)},
        packed_{false},
        deprecated_{false},
        lazy_{false},
        weak_{false},
        jstype_{static_cast< ::google::protobuf::FieldOptions_JSType >(0)},
        unverified_lazy_{false},
        debug_redact_{false},
        retention_{static_cast< ::google::protobuf::FieldOptions_OptionRetention >(0)},
        targets_{} {}

template <typename>
PROTOBUF_CONSTEXPR FieldOptions::FieldOptions(::_pbi::ConstantInitialized)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(FieldOptions_class_data_.base()),
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(),
#endif  // PROTOBUF_CUSTOM_VTABLE
      _impl_(::_pbi::ConstantInitialized()) {
}
struct FieldOptionsDefaultTypeInternal {
#if defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  constexpr FieldOptionsDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
#else   // defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  FieldOptionsDefaultTypeInternal() {}
  void Init() { ::new (&_instance) FieldOptions(); };
#endif  // defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  ~FieldOptionsDefaultTypeInternal() {}
  union {
    FieldOptions _instance;
  };
};

PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_EXPORT
    PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 FieldOptionsDefaultTypeInternal _FieldOptions_default_instance_;

inline constexpr FeatureSetDefaults::Impl_::Impl_(
    ::_pbi::ConstantInitialized) noexcept
      : _cached_size_{0},
        defaults_{},
        minimum_edition_{static_cast< ::google::protobuf::Edition >(0)},
        maximum_edition_{static_cast< ::google::protobuf::Edition >(0)} {}

template <typename>
PROTOBUF_CONSTEXPR FeatureSetDefaults::FeatureSetDefaults(::_pbi::ConstantInitialized)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(FeatureSetDefaults_class_data_.base()),
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(),
#endif  // PROTOBUF_CUSTOM_VTABLE
      _impl_(::_pbi::ConstantInitialized()) {
}
struct FeatureSetDefaultsDefaultTypeInternal {
#if defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  constexpr FeatureSetDefaultsDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
#else   // defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  FeatureSetDefaultsDefaultTypeInternal() {}
  void Init() { ::new (&_instance) FeatureSetDefaults(); };
#endif  // defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  ~FeatureSetDefaultsDefaultTypeInternal() {}
  union {
    FeatureSetDefaults _instance;
  };
};

PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_EXPORT
    PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 FeatureSetDefaultsDefaultTypeInternal _FeatureSetDefaults_default_instance_;

inline constexpr ExtensionRangeOptions::Impl_::Impl_(
    ::_pbi::ConstantInitialized) noexcept
      : _cached_size_{0},
        declaration_{},
        uninterpreted_option_{},
        features_{nullptr},
        verification_{static_cast< ::google::protobuf::ExtensionRangeOptions_VerificationState >(1)} {}

template <typename>
PROTOBUF_CONSTEXPR ExtensionRangeOptions::ExtensionRangeOptions(::_pbi::ConstantInitialized)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(ExtensionRangeOptions_class_data_.base()),
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(),
#endif  // PROTOBUF_CUSTOM_VTABLE
      _impl_(::_pbi::ConstantInitialized()) {
}
struct ExtensionRangeOptionsDefaultTypeInternal {
#if defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  constexpr ExtensionRangeOptionsDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
#else   // defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  ExtensionRangeOptionsDefaultTypeInternal() {}
  void Init() { ::new (&_instance) ExtensionRangeOptions(); };
#endif  // defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  ~ExtensionRangeOptionsDefaultTypeInternal() {}
  union {
    ExtensionRangeOptions _instance;
  };
};

PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_EXPORT
    PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 ExtensionRangeOptionsDefaultTypeInternal _ExtensionRangeOptions_default_instance_;

inline constexpr EnumValueOptions::Impl_::Impl_(
    ::_pbi::ConstantInitialized) noexcept
      : _cached_size_{0},
        uninterpreted_option_{},
        features_{nullptr},
        feature_support_{nullptr},
        deprecated_{false},
        debug_redact_{false} {}

template <typename>
PROTOBUF_CONSTEXPR EnumValueOptions::EnumValueOptions(::_pbi::ConstantInitialized)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(EnumValueOptions_class_data_.base()),
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(),
#endif  // PROTOBUF_CUSTOM_VTABLE
      _impl_(::_pbi::ConstantInitialized()) {
}
struct EnumValueOptionsDefaultTypeInternal {
#if defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  constexpr EnumValueOptionsDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
#else   // defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  EnumValueOptionsDefaultTypeInternal() {}
  void Init() { ::new (&_instance) EnumValueOptions(); };
#endif  // defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  ~EnumValueOptionsDefaultTypeInternal() {}
  union {
    EnumValueOptions _instance;
  };
};

PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_EXPORT
    PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 EnumValueOptionsDefaultTypeInternal _EnumValueOptions_default_instance_;

inline constexpr EnumOptions::Impl_::Impl_(
    ::_pbi::ConstantInitialized) noexcept
      : _cached_size_{0},
        features_{nullptr},
        allow_alias_{false},
        deprecated_{false},
        deprecated_legacy_json_field_conflicts_{false},
        uninterpreted_option_{} {}

template <typename>
PROTOBUF_CONSTEXPR EnumOptions::EnumOptions(::_pbi::ConstantInitialized)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(EnumOptions_class_data_.base()),
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(),
#endif  // PROTOBUF_CUSTOM_VTABLE
      _impl_(::_pbi::ConstantInitialized()) {
}
struct EnumOptionsDefaultTypeInternal {
#if defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  constexpr EnumOptionsDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
#else   // defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  EnumOptionsDefaultTypeInternal() {}
  void Init() { ::new (&_instance) EnumOptions(); };
#endif  // defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  ~EnumOptionsDefaultTypeInternal() {}
  union {
    EnumOptions _instance;
  };
};

PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_EXPORT
    PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 EnumOptionsDefaultTypeInternal _EnumOptions_default_instance_;

inline constexpr OneofDescriptorProto::Impl_::Impl_(
    ::_pbi::ConstantInitialized) noexcept
      : _cached_size_{0},
        name_(
            &::google::protobuf::internal::fixed_address_empty_string,
            ::_pbi::ConstantInitialized()),
        options_{nullptr} {}

template <typename>
PROTOBUF_CONSTEXPR OneofDescriptorProto::OneofDescriptorProto(::_pbi::ConstantInitialized)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(OneofDescriptorProto_class_data_.base()),
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(),
#endif  // PROTOBUF_CUSTOM_VTABLE
      _impl_(::_pbi::ConstantInitialized()) {
}
struct OneofDescriptorProtoDefaultTypeInternal {
#if defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  constexpr OneofDescriptorProtoDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
#else   // defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  OneofDescriptorProtoDefaultTypeInternal() {}
  void Init() { ::new (&_instance) OneofDescriptorProto(); };
#endif  // defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  ~OneofDescriptorProtoDefaultTypeInternal() {}
  union {
    OneofDescriptorProto _instance;
  };
};

PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_EXPORT
    PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 OneofDescriptorProtoDefaultTypeInternal _OneofDescriptorProto_default_instance_;

inline constexpr MethodDescriptorProto::Impl_::Impl_(
    ::_pbi::ConstantInitialized) noexcept
      : _cached_size_{0},
        name_(
            &::google::protobuf::internal::fixed_address_empty_string,
            ::_pbi::ConstantInitialized()),
        input_type_(
            &::google::protobuf::internal::fixed_address_empty_string,
            ::_pbi::ConstantInitialized()),
        output_type_(
            &::google::protobuf::internal::fixed_address_empty_string,
            ::_pbi::ConstantInitialized()),
        options_{nullptr},
        client_streaming_{false},
        server_streaming_{false} {}

template <typename>
PROTOBUF_CONSTEXPR MethodDescriptorProto::MethodDescriptorProto(::_pbi::ConstantInitialized)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(MethodDescriptorProto_class_data_.base()),
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(),
#endif  // PROTOBUF_CUSTOM_VTABLE
      _impl_(::_pbi::ConstantInitialized()) {
}
struct MethodDescriptorProtoDefaultTypeInternal {
#if defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  constexpr MethodDescriptorProtoDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
#else   // defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  MethodDescriptorProtoDefaultTypeInternal() {}
  void Init() { ::new (&_instance) MethodDescriptorProto(); };
#endif  // defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  ~MethodDescriptorProtoDefaultTypeInternal() {}
  union {
    MethodDescriptorProto _instance;
  };
};

PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_EXPORT
    PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 MethodDescriptorProtoDefaultTypeInternal _MethodDescriptorProto_default_instance_;

inline constexpr FieldDescriptorProto::Impl_::Impl_(
    ::_pbi::ConstantInitialized) noexcept
      : _cached_size_{0},
        name_(
            &::google::protobuf::internal::fixed_address_empty_string,
            ::_pbi::ConstantInitialized()),
        extendee_(
            &::google::protobuf::internal::fixed_address_empty_string,
            ::_pbi::ConstantInitialized()),
        type_name_(
            &::google::protobuf::internal::fixed_address_empty_string,
            ::_pbi::ConstantInitialized()),
        default_value_(
            &::google::protobuf::internal::fixed_address_empty_string,
            ::_pbi::ConstantInitialized()),
        json_name_(
            &::google::protobuf::internal::fixed_address_empty_string,
            ::_pbi::ConstantInitialized()),
        options_{nullptr},
        number_{0},
        oneof_index_{0},
        proto3_optional_{false},
        label_{static_cast< ::google::protobuf::FieldDescriptorProto_Label >(1)},
        type_{static_cast< ::google::protobuf::FieldDescriptorProto_Type >(1)} {}

template <typename>
PROTOBUF_CONSTEXPR FieldDescriptorProto::FieldDescriptorProto(::_pbi::ConstantInitialized)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(FieldDescriptorProto_class_data_.base()),
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(),
#endif  // PROTOBUF_CUSTOM_VTABLE
      _impl_(::_pbi::ConstantInitialized()) {
}
struct FieldDescriptorProtoDefaultTypeInternal {
#if defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  constexpr FieldDescriptorProtoDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
#else   // defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  FieldDescriptorProtoDefaultTypeInternal() {}
  void Init() { ::new (&_instance) FieldDescriptorProto(); };
#endif  // defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  ~FieldDescriptorProtoDefaultTypeInternal() {}
  union {
    FieldDescriptorProto _instance;
  };
};

PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_EXPORT
    PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 FieldDescriptorProtoDefaultTypeInternal _FieldDescriptorProto_default_instance_;

inline constexpr EnumValueDescriptorProto::Impl_::Impl_(
    ::_pbi::ConstantInitialized) noexcept
      : _cached_size_{0},
        name_(
            &::google::protobuf::internal::fixed_address_empty_string,
            ::_pbi::ConstantInitialized()),
        options_{nullptr},
        number_{0} {}

template <typename>
PROTOBUF_CONSTEXPR EnumValueDescriptorProto::EnumValueDescriptorProto(::_pbi::ConstantInitialized)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(EnumValueDescriptorProto_class_data_.base()),
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(),
#endif  // PROTOBUF_CUSTOM_VTABLE
      _impl_(::_pbi::ConstantInitialized()) {
}
struct EnumValueDescriptorProtoDefaultTypeInternal {
#if defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  constexpr EnumValueDescriptorProtoDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
#else   // defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  EnumValueDescriptorProtoDefaultTypeInternal() {}
  void Init() { ::new (&_instance) EnumValueDescriptorProto(); };
#endif  // defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  ~EnumValueDescriptorProtoDefaultTypeInternal() {}
  union {
    EnumValueDescriptorProto _instance;
  };
};

PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_EXPORT
    PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 EnumValueDescriptorProtoDefaultTypeInternal _EnumValueDescriptorProto_default_instance_;

inline constexpr DescriptorProto_ExtensionRange::Impl_::Impl_(
    ::_pbi::ConstantInitialized) noexcept
      : _cached_size_{0},
        options_{nullptr},
        start_{0},
        end_{0} {}

template <typename>
PROTOBUF_CONSTEXPR DescriptorProto_ExtensionRange::DescriptorProto_ExtensionRange(::_pbi::ConstantInitialized)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(DescriptorProto_ExtensionRange_class_data_.base()),
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(),
#endif  // PROTOBUF_CUSTOM_VTABLE
      _impl_(::_pbi::ConstantInitialized()) {
}
struct DescriptorProto_ExtensionRangeDefaultTypeInternal {
#if defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  constexpr DescriptorProto_ExtensionRangeDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
#else   // defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  DescriptorProto_ExtensionRangeDefaultTypeInternal() {}
  void Init() { ::new (&_instance) DescriptorProto_ExtensionRange(); };
#endif  // defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  ~DescriptorProto_ExtensionRangeDefaultTypeInternal() {}
  union {
    DescriptorProto_ExtensionRange _instance;
  };
};

PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_EXPORT
    PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 DescriptorProto_ExtensionRangeDefaultTypeInternal _DescriptorProto_ExtensionRange_default_instance_;

inline constexpr ServiceDescriptorProto::Impl_::Impl_(
    ::_pbi::ConstantInitialized) noexcept
      : _cached_size_{0},
        method_{},
        name_(
            &::google::protobuf::internal::fixed_address_empty_string,
            ::_pbi::ConstantInitialized()),
        options_{nullptr} {}

template <typename>
PROTOBUF_CONSTEXPR ServiceDescriptorProto::ServiceDescriptorProto(::_pbi::ConstantInitialized)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(ServiceDescriptorProto_class_data_.base()),
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(),
#endif  // PROTOBUF_CUSTOM_VTABLE
      _impl_(::_pbi::ConstantInitialized()) {
}
struct ServiceDescriptorProtoDefaultTypeInternal {
#if defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  constexpr ServiceDescriptorProtoDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
#else   // defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  ServiceDescriptorProtoDefaultTypeInternal() {}
  void Init() { ::new (&_instance) ServiceDescriptorProto(); };
#endif  // defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  ~ServiceDescriptorProtoDefaultTypeInternal() {}
  union {
    ServiceDescriptorProto _instance;
  };
};

PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_EXPORT
    PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 ServiceDescriptorProtoDefaultTypeInternal _ServiceDescriptorProto_default_instance_;

inline constexpr EnumDescriptorProto::Impl_::Impl_(
    ::_pbi::ConstantInitialized) noexcept
      : _cached_size_{0},
        value_{},
        reserved_range_{},
        reserved_name_{},
        name_(
            &::google::protobuf::internal::fixed_address_empty_string,
            ::_pbi::ConstantInitialized()),
        options_{nullptr},
        visibility_{static_cast< ::google::protobuf::SymbolVisibility >(0)} {}

template <typename>
PROTOBUF_CONSTEXPR EnumDescriptorProto::EnumDescriptorProto(::_pbi::ConstantInitialized)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(EnumDescriptorProto_class_data_.base()),
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(),
#endif  // PROTOBUF_CUSTOM_VTABLE
      _impl_(::_pbi::ConstantInitialized()) {
}
struct EnumDescriptorProtoDefaultTypeInternal {
#if defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  constexpr EnumDescriptorProtoDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
#else   // defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  EnumDescriptorProtoDefaultTypeInternal() {}
  void Init() { ::new (&_instance) EnumDescriptorProto(); };
#endif  // defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  ~EnumDescriptorProtoDefaultTypeInternal() {}
  union {
    EnumDescriptorProto _instance;
  };
};

PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_EXPORT
    PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 EnumDescriptorProtoDefaultTypeInternal _EnumDescriptorProto_default_instance_;

inline constexpr DescriptorProto::Impl_::Impl_(
    ::_pbi::ConstantInitialized) noexcept
      : _cached_size_{0},
        field_{},
        nested_type_{},
        enum_type_{},
        extension_range_{},
        extension_{},
        oneof_decl_{},
        reserved_range_{},
        reserved_name_{},
        name_(
            &::google::protobuf::internal::fixed_address_empty_string,
            ::_pbi::ConstantInitialized()),
        options_{nullptr},
        visibility_{static_cast< ::google::protobuf::SymbolVisibility >(0)} {}

template <typename>
PROTOBUF_CONSTEXPR DescriptorProto::DescriptorProto(::_pbi::ConstantInitialized)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(DescriptorProto_class_data_.base()),
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(),
#endif  // PROTOBUF_CUSTOM_VTABLE
      _impl_(::_pbi::ConstantInitialized()) {
}
struct DescriptorProtoDefaultTypeInternal {
#if defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  constexpr DescriptorProtoDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
#else   // defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  DescriptorProtoDefaultTypeInternal() {}
  void Init() { ::new (&_instance) DescriptorProto(); };
#endif  // defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  ~DescriptorProtoDefaultTypeInternal() {}
  union {
    DescriptorProto _instance;
  };
};

PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_EXPORT
    PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 DescriptorProtoDefaultTypeInternal _DescriptorProto_default_instance_;

inline constexpr FileDescriptorProto::Impl_::Impl_(
    ::_pbi::ConstantInitialized) noexcept
      : _cached_size_{0},
        dependency_{},
        message_type_{},
        enum_type_{},
        service_{},
        extension_{},
        public_dependency_{},
        weak_dependency_{},
        option_dependency_{},
        name_(
            &::google::protobuf::internal::fixed_address_empty_string,
            ::_pbi::ConstantInitialized()),
        package_(
            &::google::protobuf::internal::fixed_address_empty_string,
            ::_pbi::ConstantInitialized()),
        syntax_(
            &::google::protobuf::internal::fixed_address_empty_string,
            ::_pbi::ConstantInitialized()),
        options_{nullptr},
        source_code_info_{nullptr},
        edition_{static_cast< ::google::protobuf::Edition >(0)} {}

template <typename>
PROTOBUF_CONSTEXPR FileDescriptorProto::FileDescriptorProto(::_pbi::ConstantInitialized)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(FileDescriptorProto_class_data_.base()),
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(),
#endif  // PROTOBUF_CUSTOM_VTABLE
      _impl_(::_pbi::ConstantInitialized()) {
}
struct FileDescriptorProtoDefaultTypeInternal {
#if defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  constexpr FileDescriptorProtoDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
#else   // defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  FileDescriptorProtoDefaultTypeInternal() {}
  void Init() { ::new (&_instance) FileDescriptorProto(); };
#endif  // defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  ~FileDescriptorProtoDefaultTypeInternal() {}
  union {
    FileDescriptorProto _instance;
  };
};

PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_EXPORT
    PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 FileDescriptorProtoDefaultTypeInternal _FileDescriptorProto_default_instance_;

inline constexpr FileDescriptorSet::Impl_::Impl_(
    ::_pbi::ConstantInitialized) noexcept
      : _cached_size_{0},
        file_{} {}

template <typename>
PROTOBUF_CONSTEXPR FileDescriptorSet::FileDescriptorSet(::_pbi::ConstantInitialized)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(FileDescriptorSet_class_data_.base()),
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(),
#endif  // PROTOBUF_CUSTOM_VTABLE
      _impl_(::_pbi::ConstantInitialized()) {
}
struct FileDescriptorSetDefaultTypeInternal {
#if defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  constexpr FileDescriptorSetDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
#else   // defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  FileDescriptorSetDefaultTypeInternal() {}
  void Init() { ::new (&_instance) FileDescriptorSet(); };
#endif  // defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
  ~FileDescriptorSetDefaultTypeInternal() {}
  union {
    FileDescriptorSet _instance;
  };
};

PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_EXPORT
    PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 FileDescriptorSetDefaultTypeInternal _FileDescriptorSet_default_instance_;
}  // namespace protobuf
}  // namespace google
static const ::_pb::EnumDescriptor* PROTOBUF_NONNULL
    file_level_enum_descriptors_google_2fprotobuf_2fdescriptor_2eproto[20];
static constexpr const ::_pb::ServiceDescriptor* PROTOBUF_NONNULL* PROTOBUF_NULLABLE
    file_level_service_descriptors_google_2fprotobuf_2fdescriptor_2eproto = nullptr;
const ::uint32_t
    TableStruct_google_2fprotobuf_2fdescriptor_2eproto::offsets[] ABSL_ATTRIBUTE_SECTION_VARIABLE(
        protodesc_cold) = {
        0x083, // bitmap
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FileDescriptorSet, _impl_._has_bits_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FileDescriptorSet, _impl_._extensions_),
        5, // hasbit index offset
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FileDescriptorSet, _impl_.file_),
        0,
        0x081, // bitmap
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FileDescriptorProto, _impl_._has_bits_),
        17, // hasbit index offset
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FileDescriptorProto, _impl_.name_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FileDescriptorProto, _impl_.package_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FileDescriptorProto, _impl_.dependency_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FileDescriptorProto, _impl_.public_dependency_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FileDescriptorProto, _impl_.weak_dependency_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FileDescriptorProto, _impl_.option_dependency_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FileDescriptorProto, _impl_.message_type_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FileDescriptorProto, _impl_.enum_type_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FileDescriptorProto, _impl_.service_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FileDescriptorProto, _impl_.extension_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FileDescriptorProto, _impl_.options_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FileDescriptorProto, _impl_.source_code_info_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FileDescriptorProto, _impl_.syntax_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FileDescriptorProto, _impl_.edition_),
        8,
        9,
        0,
        5,
        6,
        7,
        1,
        2,
        3,
        4,
        11,
        12,
        10,
        13,
        0x081, // bitmap
        PROTOBUF_FIELD_OFFSET(::google::protobuf::DescriptorProto_ExtensionRange, _impl_._has_bits_),
        6, // hasbit index offset
        PROTOBUF_FIELD_OFFSET(::google::protobuf::DescriptorProto_ExtensionRange, _impl_.start_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::DescriptorProto_ExtensionRange, _impl_.end_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::DescriptorProto_ExtensionRange, _impl_.options_),
        1,
        2,
        0,
        0x081, // bitmap
        PROTOBUF_FIELD_OFFSET(::google::protobuf::DescriptorProto_ReservedRange, _impl_._has_bits_),
        5, // hasbit index offset
        PROTOBUF_FIELD_OFFSET(::google::protobuf::DescriptorProto_ReservedRange, _impl_.start_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::DescriptorProto_ReservedRange, _impl_.end_),
        0,
        1,
        0x081, // bitmap
        PROTOBUF_FIELD_OFFSET(::google::protobuf::DescriptorProto, _impl_._has_bits_),
        14, // hasbit index offset
        PROTOBUF_FIELD_OFFSET(::google::protobuf::DescriptorProto, _impl_.name_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::DescriptorProto, _impl_.field_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::DescriptorProto, _impl_.extension_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::DescriptorProto, _impl_.nested_type_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::DescriptorProto, _impl_.enum_type_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::DescriptorProto, _impl_.extension_range_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::DescriptorProto, _impl_.oneof_decl_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::DescriptorProto, _impl_.options_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::DescriptorProto, _impl_.reserved_range_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::DescriptorProto, _impl_.reserved_name_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::DescriptorProto, _impl_.visibility_),
        8,
        0,
        4,
        1,
        2,
        3,
        5,
        9,
        6,
        7,
        10,
        0x081, // bitmap
        PROTOBUF_FIELD_OFFSET(::google::protobuf::ExtensionRangeOptions_Declaration, _impl_._has_bits_),
        8, // hasbit index offset
        PROTOBUF_FIELD_OFFSET(::google::protobuf::ExtensionRangeOptions_Declaration, _impl_.number_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::ExtensionRangeOptions_Declaration, _impl_.full_name_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::ExtensionRangeOptions_Declaration, _impl_.type_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::ExtensionRangeOptions_Declaration, _impl_.reserved_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::ExtensionRangeOptions_Declaration, _impl_.repeated_),
        2,
        0,
        1,
        3,
        4,
        0x083, // bitmap
        PROTOBUF_FIELD_OFFSET(::google::protobuf::ExtensionRangeOptions, _impl_._has_bits_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::ExtensionRangeOptions, _impl_._extensions_),
        8, // hasbit index offset
        PROTOBUF_FIELD_OFFSET(::google::protobuf::ExtensionRangeOptions, _impl_.uninterpreted_option_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::ExtensionRangeOptions, _impl_.declaration_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::ExtensionRangeOptions, _impl_.features_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::ExtensionRangeOptions, _impl_.verification_),
        1,
        0,
        2,
        3,
        0x081, // bitmap
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FieldDescriptorProto, _impl_._has_bits_),
        14, // hasbit index offset
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FieldDescriptorProto, _impl_.name_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FieldDescriptorProto, _impl_.number_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FieldDescriptorProto, _impl_.label_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FieldDescriptorProto, _impl_.type_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FieldDescriptorProto, _impl_.type_name_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FieldDescriptorProto, _impl_.extendee_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FieldDescriptorProto, _impl_.default_value_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FieldDescriptorProto, _impl_.oneof_index_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FieldDescriptorProto, _impl_.json_name_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FieldDescriptorProto, _impl_.options_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FieldDescriptorProto, _impl_.proto3_optional_),
        0,
        6,
        9,
        10,
        2,
        1,
        3,
        7,
        4,
        5,
        8,
        0x081, // bitmap
        PROTOBUF_FIELD_OFFSET(::google::protobuf::OneofDescriptorProto, _impl_._has_bits_),
        5, // hasbit index offset
        PROTOBUF_FIELD_OFFSET(::google::protobuf::OneofDescriptorProto, _impl_.name_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::OneofDescriptorProto, _impl_.options_),
        0,
        1,
        0x081, // bitmap
        PROTOBUF_FIELD_OFFSET(::google::protobuf::EnumDescriptorProto_EnumReservedRange, _impl_._has_bits_),
        5, // hasbit index offset
        PROTOBUF_FIELD_OFFSET(::google::protobuf::EnumDescriptorProto_EnumReservedRange, _impl_.start_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::EnumDescriptorProto_EnumReservedRange, _impl_.end_),
        0,
        1,
        0x081, // bitmap
        PROTOBUF_FIELD_OFFSET(::google::protobuf::EnumDescriptorProto, _impl_._has_bits_),
        9, // hasbit index offset
        PROTOBUF_FIELD_OFFSET(::google::protobuf::EnumDescriptorProto, _impl_.name_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::EnumDescriptorProto, _impl_.value_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::EnumDescriptorProto, _impl_.options_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::EnumDescriptorProto, _impl_.reserved_range_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::EnumDescriptorProto, _impl_.reserved_name_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::EnumDescriptorProto, _impl_.visibility_),
        3,
        0,
        4,
        1,
        2,
        5,
        0x081, // bitmap
        PROTOBUF_FIELD_OFFSET(::google::protobuf::EnumValueDescriptorProto, _impl_._has_bits_),
        6, // hasbit index offset
        PROTOBUF_FIELD_OFFSET(::google::protobuf::EnumValueDescriptorProto, _impl_.name_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::EnumValueDescriptorProto, _impl_.number_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::EnumValueDescriptorProto, _impl_.options_),
        0,
        2,
        1,
        0x081, // bitmap
        PROTOBUF_FIELD_OFFSET(::google::protobuf::ServiceDescriptorProto, _impl_._has_bits_),
        6, // hasbit index offset
        PROTOBUF_FIELD_OFFSET(::google::protobuf::ServiceDescriptorProto, _impl_.name_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::ServiceDescriptorProto, _impl_.method_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::ServiceDescriptorProto, _impl_.options_),
        1,
        0,
        2,
        0x081, // bitmap
        PROTOBUF_FIELD_OFFSET(::google::protobuf::MethodDescriptorProto, _impl_._has_bits_),
        9, // hasbit index offset
        PROTOBUF_FIELD_OFFSET(::google::protobuf::MethodDescriptorProto, _impl_.name_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::MethodDescriptorProto, _impl_.input_type_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::MethodDescriptorProto, _impl_.output_type_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::MethodDescriptorProto, _impl_.options_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::MethodDescriptorProto, _impl_.client_streaming_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::MethodDescriptorProto, _impl_.server_streaming_),
        0,
        1,
        2,
        3,
        4,
        5,
        0x083, // bitmap
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FileOptions, _impl_._has_bits_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FileOptions, _impl_._extensions_),
        25, // hasbit index offset
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FileOptions, _impl_.java_package_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FileOptions, _impl_.java_outer_classname_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FileOptions, _impl_.java_multiple_files_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FileOptions, _impl_.java_generate_equals_and_hash_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FileOptions, _impl_.java_string_check_utf8_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FileOptions, _impl_.optimize_for_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FileOptions, _impl_.go_package_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FileOptions, _impl_.cc_generic_services_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FileOptions, _impl_.java_generic_services_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FileOptions, _impl_.py_generic_services_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FileOptions, _impl_.deprecated_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FileOptions, _impl_.cc_enable_arenas_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FileOptions, _impl_.objc_class_prefix_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FileOptions, _impl_.csharp_namespace_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FileOptions, _impl_.swift_prefix_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FileOptions, _impl_.php_class_prefix_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FileOptions, _impl_.php_namespace_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FileOptions, _impl_.php_metadata_namespace_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FileOptions, _impl_.ruby_package_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FileOptions, _impl_.features_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FileOptions, _impl_.uninterpreted_option_),
        0,
        1,
        11,
        15,
        17,
        18,
        2,
        12,
        13,
        14,
        16,
        19,
        3,
        4,
        5,
        6,
        7,
        8,
        9,
        10,
        20,
        0x083, // bitmap
        PROTOBUF_FIELD_OFFSET(::google::protobuf::MessageOptions, _impl_._has_bits_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::MessageOptions, _impl_._extensions_),
        11, // hasbit index offset
        PROTOBUF_FIELD_OFFSET(::google::protobuf::MessageOptions, _impl_.message_set_wire_format_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::MessageOptions, _impl_.no_standard_descriptor_accessor_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::MessageOptions, _impl_.deprecated_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::MessageOptions, _impl_.map_entry_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::MessageOptions, _impl_.deprecated_legacy_json_field_conflicts_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::MessageOptions, _impl_.features_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::MessageOptions, _impl_.uninterpreted_option_),
        1,
        2,
        3,
        4,
        5,
        0,
        6,
        0x081, // bitmap
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FieldOptions_EditionDefault, _impl_._has_bits_),
        5, // hasbit index offset
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FieldOptions_EditionDefault, _impl_.edition_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FieldOptions_EditionDefault, _impl_.value_),
        1,
        0,
        0x081, // bitmap
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FieldOptions_FeatureSupport, _impl_._has_bits_),
        7, // hasbit index offset
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FieldOptions_FeatureSupport, _impl_.edition_introduced_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FieldOptions_FeatureSupport, _impl_.edition_deprecated_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FieldOptions_FeatureSupport, _impl_.deprecation_warning_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FieldOptions_FeatureSupport, _impl_.edition_removed_),
        1,
        2,
        0,
        3,
        0x083, // bitmap
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FieldOptions, _impl_._has_bits_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FieldOptions, _impl_._extensions_),
        18, // hasbit index offset
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FieldOptions, _impl_.ctype_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FieldOptions, _impl_.packed_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FieldOptions, _impl_.jstype_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FieldOptions, _impl_.lazy_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FieldOptions, _impl_.unverified_lazy_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FieldOptions, _impl_.deprecated_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FieldOptions, _impl_.weak_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FieldOptions, _impl_.debug_redact_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FieldOptions, _impl_.retention_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FieldOptions, _impl_.targets_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FieldOptions, _impl_.edition_defaults_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FieldOptions, _impl_.features_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FieldOptions, _impl_.feature_support_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FieldOptions, _impl_.uninterpreted_option_),
        4,
        5,
        9,
        7,
        10,
        6,
        8,
        11,
        12,
        13,
        0,
        2,
        3,
        1,
        0x083, // bitmap
        PROTOBUF_FIELD_OFFSET(::google::protobuf::OneofOptions, _impl_._has_bits_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::OneofOptions, _impl_._extensions_),
        6, // hasbit index offset
        PROTOBUF_FIELD_OFFSET(::google::protobuf::OneofOptions, _impl_.features_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::OneofOptions, _impl_.uninterpreted_option_),
        1,
        0,
        0x083, // bitmap
        PROTOBUF_FIELD_OFFSET(::google::protobuf::EnumOptions, _impl_._has_bits_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::EnumOptions, _impl_._extensions_),
        9, // hasbit index offset
        PROTOBUF_FIELD_OFFSET(::google::protobuf::EnumOptions, _impl_.allow_alias_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::EnumOptions, _impl_.deprecated_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::EnumOptions, _impl_.deprecated_legacy_json_field_conflicts_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::EnumOptions, _impl_.features_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::EnumOptions, _impl_.uninterpreted_option_),
        1,
        2,
        3,
        0,
        4,
        0x083, // bitmap
        PROTOBUF_FIELD_OFFSET(::google::protobuf::EnumValueOptions, _impl_._has_bits_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::EnumValueOptions, _impl_._extensions_),
        9, // hasbit index offset
        PROTOBUF_FIELD_OFFSET(::google::protobuf::EnumValueOptions, _impl_.deprecated_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::EnumValueOptions, _impl_.features_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::EnumValueOptions, _impl_.debug_redact_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::EnumValueOptions, _impl_.feature_support_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::EnumValueOptions, _impl_.uninterpreted_option_),
        3,
        1,
        4,
        2,
        0,
        0x083, // bitmap
        PROTOBUF_FIELD_OFFSET(::google::protobuf::ServiceOptions, _impl_._has_bits_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::ServiceOptions, _impl_._extensions_),
        7, // hasbit index offset
        PROTOBUF_FIELD_OFFSET(::google::protobuf::ServiceOptions, _impl_.features_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::ServiceOptions, _impl_.deprecated_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::ServiceOptions, _impl_.uninterpreted_option_),
        1,
        2,
        0,
        0x083, // bitmap
        PROTOBUF_FIELD_OFFSET(::google::protobuf::MethodOptions, _impl_._has_bits_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::MethodOptions, _impl_._extensions_),
        8, // hasbit index offset
        PROTOBUF_FIELD_OFFSET(::google::protobuf::MethodOptions, _impl_.deprecated_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::MethodOptions, _impl_.idempotency_level_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::MethodOptions, _impl_.features_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::MethodOptions, _impl_.uninterpreted_option_),
        2,
        3,
        1,
        0,
        0x081, // bitmap
        PROTOBUF_FIELD_OFFSET(::google::protobuf::UninterpretedOption_NamePart, _impl_._has_bits_),
        5, // hasbit index offset
        PROTOBUF_FIELD_OFFSET(::google::protobuf::UninterpretedOption_NamePart, _impl_.name_part_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::UninterpretedOption_NamePart, _impl_.is_extension_),
        0,
        1,
        0x081, // bitmap
        PROTOBUF_FIELD_OFFSET(::google::protobuf::UninterpretedOption, _impl_._has_bits_),
        10, // hasbit index offset
        PROTOBUF_FIELD_OFFSET(::google::protobuf::UninterpretedOption, _impl_.name_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::UninterpretedOption, _impl_.identifier_value_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::UninterpretedOption, _impl_.positive_int_value_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::UninterpretedOption, _impl_.negative_int_value_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::UninterpretedOption, _impl_.double_value_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::UninterpretedOption, _impl_.string_value_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::UninterpretedOption, _impl_.aggregate_value_),
        0,
        1,
        4,
        5,
        6,
        2,
        3,
        0x000, // bitmap
        0x083, // bitmap
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FeatureSet, _impl_._has_bits_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FeatureSet, _impl_._extensions_),
        12, // hasbit index offset
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FeatureSet, _impl_.field_presence_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FeatureSet, _impl_.enum_type_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FeatureSet, _impl_.repeated_field_encoding_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FeatureSet, _impl_.utf8_validation_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FeatureSet, _impl_.message_encoding_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FeatureSet, _impl_.json_format_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FeatureSet, _impl_.enforce_naming_style_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FeatureSet, _impl_.default_symbol_visibility_),
        0,
        1,
        2,
        3,
        4,
        5,
        6,
        7,
        0x081, // bitmap
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FeatureSetDefaults_FeatureSetEditionDefault, _impl_._has_bits_),
        6, // hasbit index offset
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FeatureSetDefaults_FeatureSetEditionDefault, _impl_.edition_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FeatureSetDefaults_FeatureSetEditionDefault, _impl_.overridable_features_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FeatureSetDefaults_FeatureSetEditionDefault, _impl_.fixed_features_),
        2,
        0,
        1,
        0x081, // bitmap
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FeatureSetDefaults, _impl_._has_bits_),
        6, // hasbit index offset
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FeatureSetDefaults, _impl_.defaults_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FeatureSetDefaults, _impl_.minimum_edition_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::FeatureSetDefaults, _impl_.maximum_edition_),
        0,
        1,
        2,
        0x081, // bitmap
        PROTOBUF_FIELD_OFFSET(::google::protobuf::SourceCodeInfo_Location, _impl_._has_bits_),
        8, // hasbit index offset
        PROTOBUF_FIELD_OFFSET(::google::protobuf::SourceCodeInfo_Location, _impl_.path_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::SourceCodeInfo_Location, _impl_.span_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::SourceCodeInfo_Location, _impl_.leading_comments_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::SourceCodeInfo_Location, _impl_.trailing_comments_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::SourceCodeInfo_Location, _impl_.leading_detached_comments_),
        0,
        1,
        3,
        4,
        2,
        0x083, // bitmap
        PROTOBUF_FIELD_OFFSET(::google::protobuf::SourceCodeInfo, _impl_._has_bits_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::SourceCodeInfo, _impl_._extensions_),
        5, // hasbit index offset
        PROTOBUF_FIELD_OFFSET(::google::protobuf::SourceCodeInfo, _impl_.location_),
        0,
        0x081, // bitmap
        PROTOBUF_FIELD_OFFSET(::google::protobuf::GeneratedCodeInfo_Annotation, _impl_._has_bits_),
        8, // hasbit index offset
        PROTOBUF_FIELD_OFFSET(::google::protobuf::GeneratedCodeInfo_Annotation, _impl_.path_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::GeneratedCodeInfo_Annotation, _impl_.source_file_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::GeneratedCodeInfo_Annotation, _impl_.begin_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::GeneratedCodeInfo_Annotation, _impl_.end_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::GeneratedCodeInfo_Annotation, _impl_.semantic_),
        0,
        1,
        2,
        3,
        4,
        0x081, // bitmap
        PROTOBUF_FIELD_OFFSET(::google::protobuf::GeneratedCodeInfo, _impl_._has_bits_),
        4, // hasbit index offset
        PROTOBUF_FIELD_OFFSET(::google::protobuf::GeneratedCodeInfo, _impl_.annotation_),
        0,
};

static const ::_pbi::MigrationSchema
    schemas[] ABSL_ATTRIBUTE_SECTION_VARIABLE(protodesc_cold) = {
        {0, sizeof(::google::protobuf::FileDescriptorSet)},
        {6, sizeof(::google::protobuf::FileDescriptorProto)},
        {37, sizeof(::google::protobuf::DescriptorProto_ExtensionRange)},
        {46, sizeof(::google::protobuf::DescriptorProto_ReservedRange)},
        {53, sizeof(::google::protobuf::DescriptorProto)},
        {78, sizeof(::google::protobuf::ExtensionRangeOptions_Declaration)},
        {91, sizeof(::google::protobuf::ExtensionRangeOptions)},
        {103, sizeof(::google::protobuf::FieldDescriptorProto)},
        {128, sizeof(::google::protobuf::OneofDescriptorProto)},
        {135, sizeof(::google::protobuf::EnumDescriptorProto_EnumReservedRange)},
        {142, sizeof(::google::protobuf::EnumDescriptorProto)},
        {157, sizeof(::google::protobuf::EnumValueDescriptorProto)},
        {166, sizeof(::google::protobuf::ServiceDescriptorProto)},
        {175, sizeof(::google::protobuf::MethodDescriptorProto)},
        {190, sizeof(::google::protobuf::FileOptions)},
        {236, sizeof(::google::protobuf::MessageOptions)},
        {254, sizeof(::google::protobuf::FieldOptions_EditionDefault)},
        {261, sizeof(::google::protobuf::FieldOptions_FeatureSupport)},
        {272, sizeof(::google::protobuf::FieldOptions)},
        {304, sizeof(::google::protobuf::OneofOptions)},
        {312, sizeof(::google::protobuf::EnumOptions)},
        {326, sizeof(::google::protobuf::EnumValueOptions)},
        {340, sizeof(::google::protobuf::ServiceOptions)},
        {350, sizeof(::google::protobuf::MethodOptions)},
        {362, sizeof(::google::protobuf::UninterpretedOption_NamePart)},
        {369, sizeof(::google::protobuf::UninterpretedOption)},
        {386, sizeof(::google::protobuf::FeatureSet_VisibilityFeature)},
        {387, sizeof(::google::protobuf::FeatureSet)},
        {407, sizeof(::google::protobuf::FeatureSetDefaults_FeatureSetEditionDefault)},
        {416, sizeof(::google::protobuf::FeatureSetDefaults)},
        {425, sizeof(::google::protobuf::SourceCodeInfo_Location)},
        {438, sizeof(::google::protobuf::SourceCodeInfo)},
        {444, sizeof(::google::protobuf::GeneratedCodeInfo_Annotation)},
        {457, sizeof(::google::protobuf::GeneratedCodeInfo)},
};
static const ::_pb::Message* PROTOBUF_NONNULL const file_default_instances[] = {
    &::google::protobuf::_FileDescriptorSet_default_instance_._instance,
    &::google::protobuf::_FileDescriptorProto_default_instance_._instance,
    &::google::protobuf::_DescriptorProto_ExtensionRange_default_instance_._instance,
    &::google::protobuf::_DescriptorProto_ReservedRange_default_instance_._instance,
    &::google::protobuf::_DescriptorProto_default_instance_._instance,
    &::google::protobuf::_ExtensionRangeOptions_Declaration_default_instance_._instance,
    &::google::protobuf::_ExtensionRangeOptions_default_instance_._instance,
    &::google::protobuf::_FieldDescriptorProto_default_instance_._instance,
    &::google::protobuf::_OneofDescriptorProto_default_instance_._instance,
    &::google::protobuf::_EnumDescriptorProto_EnumReservedRange_default_instance_._instance,
    &::google::protobuf::_EnumDescriptorProto_default_instance_._instance,
    &::google::protobuf::_EnumValueDescriptorProto_default_instance_._instance,
    &::google::protobuf::_ServiceDescriptorProto_default_instance_._instance,
    &::google::protobuf::_MethodDescriptorProto_default_instance_._instance,
    &::google::protobuf::_FileOptions_default_instance_._instance,
    &::google::protobuf::_MessageOptions_default_instance_._instance,
    &::google::protobuf::_FieldOptions_EditionDefault_default_instance_._instance,
    &::google::protobuf::_FieldOptions_FeatureSupport_default_instance_._instance,
    &::google::protobuf::_FieldOptions_default_instance_._instance,
    &::google::protobuf::_OneofOptions_default_instance_._instance,
    &::google::protobuf::_EnumOptions_default_instance_._instance,
    &::google::protobuf::_EnumValueOptions_default_instance_._instance,
    &::google::protobuf::_ServiceOptions_default_instance_._instance,
    &::google::protobuf::_MethodOptions_default_instance_._instance,
    &::google::protobuf::_UninterpretedOption_NamePart_default_instance_._instance,
    &::google::protobuf::_UninterpretedOption_default_instance_._instance,
    &::google::protobuf::_FeatureSet_VisibilityFeature_default_instance_._instance,
    &::google::protobuf::_FeatureSet_default_instance_._instance,
    &::google::protobuf::_FeatureSetDefaults_FeatureSetEditionDefault_default_instance_._instance,
    &::google::protobuf::_FeatureSetDefaults_default_instance_._instance,
    &::google::protobuf::_SourceCodeInfo_Location_default_instance_._instance,
    &::google::protobuf::_SourceCodeInfo_default_instance_._instance,
    &::google::protobuf::_GeneratedCodeInfo_Annotation_default_instance_._instance,
    &::google::protobuf::_GeneratedCodeInfo_default_instance_._instance,
};
const char descriptor_table_protodef_google_2fprotobuf_2fdescriptor_2eproto[] ABSL_ATTRIBUTE_SECTION_VARIABLE(
    protodesc_cold) = {
    "\n google/protobuf/descriptor.proto\022\017goog"
    "le.protobuf\"U\n\021FileDescriptorSet\0222\n\004file"
    "\030\001 \003(\0132$.google.protobuf.FileDescriptorP"
    "roto*\014\010\200\354\312\377\001\020\201\354\312\377\001\"\241\004\n\023FileDescriptorPro"
    "to\022\014\n\004name\030\001 \001(\t\022\017\n\007package\030\002 \001(\t\022\022\n\ndep"
    "endency\030\003 \003(\t\022\031\n\021public_dependency\030\n \003(\005"
    "\022\027\n\017weak_dependency\030\013 \003(\005\022\031\n\021option_depe"
    "ndency\030\017 \003(\t\0226\n\014message_type\030\004 \003(\0132 .goo"
    "gle.protobuf.DescriptorProto\0227\n\tenum_typ"
    "e\030\005 \003(\0132$.google.protobuf.EnumDescriptor"
    "Proto\0228\n\007service\030\006 \003(\0132\'.google.protobuf"
    ".ServiceDescriptorProto\0228\n\textension\030\007 \003"
    "(\0132%.google.protobuf.FieldDescriptorProt"
    "o\022-\n\007options\030\010 \001(\0132\034.google.protobuf.Fil"
    "eOptions\0229\n\020source_code_info\030\t \001(\0132\037.goo"
    "gle.protobuf.SourceCodeInfo\022\016\n\006syntax\030\014 "
    "\001(\t\022)\n\007edition\030\016 \001(\0162\030.google.protobuf.E"
    "dition\"\340\005\n\017DescriptorProto\022\014\n\004name\030\001 \001(\t"
    "\0224\n\005field\030\002 \003(\0132%.google.protobuf.FieldD"
    "escriptorProto\0228\n\textension\030\006 \003(\0132%.goog"
    "le.protobuf.FieldDescriptorProto\0225\n\013nest"
    "ed_type\030\003 \003(\0132 .google.protobuf.Descript"
    "orProto\0227\n\tenum_type\030\004 \003(\0132$.google.prot"
    "obuf.EnumDescriptorProto\022H\n\017extension_ra"
    "nge\030\005 \003(\0132/.google.protobuf.DescriptorPr"
    "oto.ExtensionRange\0229\n\noneof_decl\030\010 \003(\0132%"
    ".google.protobuf.OneofDescriptorProto\0220\n"
    "\007options\030\007 \001(\0132\037.google.protobuf.Message"
    "Options\022F\n\016reserved_range\030\t \003(\0132..google"
    ".protobuf.DescriptorProto.ReservedRange\022"
    "\025\n\rreserved_name\030\n \003(\t\0225\n\nvisibility\030\013 \001"
    "(\0162!.google.protobuf.SymbolVisibility\032e\n"
    "\016ExtensionRange\022\r\n\005start\030\001 \001(\005\022\013\n\003end\030\002 "
    "\001(\005\0227\n\007options\030\003 \001(\0132&.google.protobuf.E"
    "xtensionRangeOptions\032+\n\rReservedRange\022\r\n"
    "\005start\030\001 \001(\005\022\013\n\003end\030\002 \001(\005\"\345\003\n\025ExtensionR"
    "angeOptions\022C\n\024uninterpreted_option\030\347\007 \003"
    "(\0132$.google.protobuf.UninterpretedOption"
    "\022L\n\013declaration\030\002 \003(\01322.google.protobuf."
    "ExtensionRangeOptions.DeclarationB\003\210\001\002\022-"
    "\n\010features\0302 \001(\0132\033.google.protobuf.Featu"
    "reSet\022_\n\014verification\030\003 \001(\01628.google.pro"
    "tobuf.ExtensionRangeOptions.Verification"
    "State:\nUNVERIFIEDB\003\210\001\002\032h\n\013Declaration\022\016\n"
    "\006number\030\001 \001(\005\022\021\n\tfull_name\030\002 \001(\t\022\014\n\004type"
    "\030\003 \001(\t\022\020\n\010reserved\030\005 \001(\010\022\020\n\010repeated\030\006 \001"
    "(\010J\004\010\004\020\005\"4\n\021VerificationState\022\017\n\013DECLARA"
    "TION\020\000\022\016\n\nUNVERIFIED\020\001*\t\010\350\007\020\200\200\200\200\002\"\325\005\n\024Fi"
    "eldDescriptorProto\022\014\n\004name\030\001 \001(\t\022\016\n\006numb"
    "er\030\003 \001(\005\022:\n\005label\030\004 \001(\0162+.google.protobu"
    "f.FieldDescriptorProto.Label\0228\n\004type\030\005 \001"
    "(\0162*.google.protobuf.FieldDescriptorProt"
    "o.Type\022\021\n\ttype_name\030\006 \001(\t\022\020\n\010extendee\030\002 "
    "\001(\t\022\025\n\rdefault_value\030\007 \001(\t\022\023\n\013oneof_inde"
    "x\030\t \001(\005\022\021\n\tjson_name\030\n \001(\t\022.\n\007options\030\010 "
    "\001(\0132\035.google.protobuf.FieldOptions\022\027\n\017pr"
    "oto3_optional\030\021 \001(\010\"\266\002\n\004Type\022\017\n\013TYPE_DOU"
    "BLE\020\001\022\016\n\nTYPE_FLOAT\020\002\022\016\n\nTYPE_INT64\020\003\022\017\n"
    "\013TYPE_UINT64\020\004\022\016\n\nTYPE_INT32\020\005\022\020\n\014TYPE_F"
    "IXED64\020\006\022\020\n\014TYPE_FIXED32\020\007\022\r\n\tTYPE_BOOL\020"
    "\010\022\017\n\013TYPE_STRING\020\t\022\016\n\nTYPE_GROUP\020\n\022\020\n\014TY"
    "PE_MESSAGE\020\013\022\016\n\nTYPE_BYTES\020\014\022\017\n\013TYPE_UIN"
    "T32\020\r\022\r\n\tTYPE_ENUM\020\016\022\021\n\rTYPE_SFIXED32\020\017\022"
    "\021\n\rTYPE_SFIXED64\020\020\022\017\n\013TYPE_SINT32\020\021\022\017\n\013T"
    "YPE_SINT64\020\022\"C\n\005Label\022\022\n\016LABEL_OPTIONAL\020"
    "\001\022\022\n\016LABEL_REPEATED\020\003\022\022\n\016LABEL_REQUIRED\020"
    "\002\"T\n\024OneofDescriptorProto\022\014\n\004name\030\001 \001(\t\022"
    ".\n\007options\030\002 \001(\0132\035.google.protobuf.Oneof"
    "Options\"\333\002\n\023EnumDescriptorProto\022\014\n\004name\030"
    "\001 \001(\t\0228\n\005value\030\002 \003(\0132).google.protobuf.E"
    "numValueDescriptorProto\022-\n\007options\030\003 \001(\013"
    "2\034.google.protobuf.EnumOptions\022N\n\016reserv"
    "ed_range\030\004 \003(\01326.google.protobuf.EnumDes"
    "criptorProto.EnumReservedRange\022\025\n\rreserv"
    "ed_name\030\005 \003(\t\0225\n\nvisibility\030\006 \001(\0162!.goog"
    "le.protobuf.SymbolVisibility\032/\n\021EnumRese"
    "rvedRange\022\r\n\005start\030\001 \001(\005\022\013\n\003end\030\002 \001(\005\"l\n"
    "\030EnumValueDescriptorProto\022\014\n\004name\030\001 \001(\t\022"
    "\016\n\006number\030\002 \001(\005\0222\n\007options\030\003 \001(\0132!.googl"
    "e.protobuf.EnumValueOptions\"\236\001\n\026ServiceD"
    "escriptorProto\022\014\n\004name\030\001 \001(\t\0226\n\006method\030\002"
    " \003(\0132&.google.protobuf.MethodDescriptorP"
    "roto\0220\n\007options\030\003 \001(\0132\037.google.protobuf."
    "ServiceOptionsJ\004\010\004\020\005R\006stream\"\301\001\n\025MethodD"
    "escriptorProto\022\014\n\004name\030\001 \001(\t\022\022\n\ninput_ty"
    "pe\030\002 \001(\t\022\023\n\013output_type\030\003 \001(\t\022/\n\007options"
    "\030\004 \001(\0132\036.google.protobuf.MethodOptions\022\037"
    "\n\020client_streaming\030\005 \001(\010:\005false\022\037\n\020serve"
    "r_streaming\030\006 \001(\010:\005false\"\313\006\n\013FileOptions"
    "\022\024\n\014java_package\030\001 \001(\t\022\034\n\024java_outer_cla"
    "ssname\030\010 \001(\t\022\"\n\023java_multiple_files\030\n \001("
    "\010:\005false\022)\n\035java_generate_equals_and_has"
    "h\030\024 \001(\010B\002\030\001\022%\n\026java_string_check_utf8\030\033 "
    "\001(\010:\005false\022F\n\014optimize_for\030\t \001(\0162).googl"
    "e.protobuf.FileOptions.OptimizeMode:\005SPE"
    "ED\022\022\n\ngo_package\030\013 \001(\t\022\"\n\023cc_generic_ser"
    "vices\030\020 \001(\010:\005false\022$\n\025java_generic_servi"
    "ces\030\021 \001(\010:\005false\022\"\n\023py_generic_services\030"
    "\022 \001(\010:\005false\022\031\n\ndeprecated\030\027 \001(\010:\005false\022"
    "\036\n\020cc_enable_arenas\030\037 \001(\010:\004true\022\031\n\021objc_"
    "class_prefix\030$ \001(\t\022\030\n\020csharp_namespace\030%"
    " \001(\t\022\024\n\014swift_prefix\030\' \001(\t\022\030\n\020php_class_"
    "prefix\030( \001(\t\022\025\n\rphp_namespace\030) \001(\t\022\036\n\026p"
    "hp_metadata_namespace\030, \001(\t\022\024\n\014ruby_pack"
    "age\030- \001(\t\022-\n\010features\0302 \001(\0132\033.google.pro"
    "tobuf.FeatureSet\022C\n\024uninterpreted_option"
    "\030\347\007 \003(\0132$.google.protobuf.UninterpretedO"
    "ption\":\n\014OptimizeMode\022\t\n\005SPEED\020\001\022\r\n\tCODE"
    "_SIZE\020\002\022\020\n\014LITE_RUNTIME\020\003*\t\010\350\007\020\200\200\200\200\002J\004\010*"
    "\020+J\004\010&\020\'R\024php_generic_services\"\347\002\n\016Messa"
    "geOptions\022&\n\027message_set_wire_format\030\001 \001"
    "(\010:\005false\022.\n\037no_standard_descriptor_acce"
    "ssor\030\002 \001(\010:\005false\022\031\n\ndeprecated\030\003 \001(\010:\005f"
    "alse\022\021\n\tmap_entry\030\007 \001(\010\0222\n&deprecated_le"
    "gacy_json_field_conflicts\030\013 \001(\010B\002\030\001\022-\n\010f"
    "eatures\030\014 \001(\0132\033.google.protobuf.FeatureS"
    "et\022C\n\024uninterpreted_option\030\347\007 \003(\0132$.goog"
    "le.protobuf.UninterpretedOption*\t\010\350\007\020\200\200\200"
    "\200\002J\004\010\004\020\005J\004\010\005\020\006J\004\010\006\020\007J\004\010\010\020\tJ\004\010\t\020\n\"\247\013\n\014Fie"
    "ldOptions\022:\n\005ctype\030\001 \001(\0162#.google.protob"
    "uf.FieldOptions.CType:\006STRING\022\016\n\006packed\030"
    "\002 \001(\010\022\?\n\006jstype\030\006 \001(\0162$.google.protobuf."
    "FieldOptions.JSType:\tJS_NORMAL\022\023\n\004lazy\030\005"
    " \001(\010:\005false\022\036\n\017unverified_lazy\030\017 \001(\010:\005fa"
    "lse\022\031\n\ndeprecated\030\003 \001(\010:\005false\022\027\n\004weak\030\n"
    " \001(\010:\005falseB\002\030\001\022\033\n\014debug_redact\030\020 \001(\010:\005f"
    "alse\022@\n\tretention\030\021 \001(\0162-.google.protobu"
    "f.FieldOptions.OptionRetention\022\?\n\007target"
    "s\030\023 \003(\0162..google.protobuf.FieldOptions.O"
    "ptionTargetType\022F\n\020edition_defaults\030\024 \003("
    "\0132,.google.protobuf.FieldOptions.Edition"
    "Default\022-\n\010features\030\025 \001(\0132\033.google.proto"
    "buf.FeatureSet\022E\n\017feature_support\030\026 \001(\0132"
    ",.google.protobuf.FieldOptions.FeatureSu"
    "pport\022C\n\024uninterpreted_option\030\347\007 \003(\0132$.g"
    "oogle.protobuf.UninterpretedOption\032J\n\016Ed"
    "itionDefault\022)\n\007edition\030\003 \001(\0162\030.google.p"
    "rotobuf.Edition\022\r\n\005value\030\002 \001(\t\032\314\001\n\016Featu"
    "reSupport\0224\n\022edition_introduced\030\001 \001(\0162\030."
    "google.protobuf.Edition\0224\n\022edition_depre"
    "cated\030\002 \001(\0162\030.google.protobuf.Edition\022\033\n"
    "\023deprecation_warning\030\003 \001(\t\0221\n\017edition_re"
    "moved\030\004 \001(\0162\030.google.protobuf.Edition\"/\n"
    "\005CType\022\n\n\006STRING\020\000\022\010\n\004CORD\020\001\022\020\n\014STRING_P"
    "IECE\020\002\"5\n\006JSType\022\r\n\tJS_NORMAL\020\000\022\r\n\tJS_ST"
    "RING\020\001\022\r\n\tJS_NUMBER\020\002\"U\n\017OptionRetention"
    "\022\025\n\021RETENTION_UNKNOWN\020\000\022\025\n\021RETENTION_RUN"
    "TIME\020\001\022\024\n\020RETENTION_SOURCE\020\002\"\214\002\n\020OptionT"
    "argetType\022\027\n\023TARGET_TYPE_UNKNOWN\020\000\022\024\n\020TA"
    "RGET_TYPE_FILE\020\001\022\037\n\033TARGET_TYPE_EXTENSIO"
    "N_RANGE\020\002\022\027\n\023TARGET_TYPE_MESSAGE\020\003\022\025\n\021TA"
    "RGET_TYPE_FIELD\020\004\022\025\n\021TARGET_TYPE_ONEOF\020\005"
    "\022\024\n\020TARGET_TYPE_ENUM\020\006\022\032\n\026TARGET_TYPE_EN"
    "UM_ENTRY\020\007\022\027\n\023TARGET_TYPE_SERVICE\020\010\022\026\n\022T"
    "ARGET_TYPE_METHOD\020\t*\t\010\350\007\020\200\200\200\200\002J\004\010\004\020\005J\004\010\022"
    "\020\023\"\215\001\n\014OneofOptions\022-\n\010features\030\001 \001(\0132\033."
    "google.protobuf.FeatureSet\022C\n\024uninterpre"
    "ted_option\030\347\007 \003(\0132$.google.protobuf.Unin"
    "terpretedOption*\t\010\350\007\020\200\200\200\200\002\"\366\001\n\013EnumOptio"
    "ns\022\023\n\013allow_alias\030\002 \001(\010\022\031\n\ndeprecated\030\003 "
    "\001(\010:\005false\0222\n&deprecated_legacy_json_fie"
    "ld_conflicts\030\006 \001(\010B\002\030\001\022-\n\010features\030\007 \001(\013"
    "2\033.google.protobuf.FeatureSet\022C\n\024uninter"
    "preted_option\030\347\007 \003(\0132$.google.protobuf.U"
    "ninterpretedOption*\t\010\350\007\020\200\200\200\200\002J\004\010\005\020\006\"\220\002\n\020"
    "EnumValueOptions\022\031\n\ndeprecated\030\001 \001(\010:\005fa"
    "lse\022-\n\010features\030\002 \001(\0132\033.google.protobuf."
    "FeatureSet\022\033\n\014debug_redact\030\003 \001(\010:\005false\022"
    "E\n\017feature_support\030\004 \001(\0132,.google.protob"
    "uf.FieldOptions.FeatureSupport\022C\n\024uninte"
    "rpreted_option\030\347\007 \003(\0132$.google.protobuf."
    "UninterpretedOption*\t\010\350\007\020\200\200\200\200\002\"\252\001\n\016Servi"
    "ceOptions\022-\n\010features\030\" \001(\0132\033.google.pro"
    "tobuf.FeatureSet\022\031\n\ndeprecated\030! \001(\010:\005fa"
    "lse\022C\n\024uninterpreted_option\030\347\007 \003(\0132$.goo"
    "gle.protobuf.UninterpretedOption*\t\010\350\007\020\200\200"
    "\200\200\002\"\334\002\n\rMethodOptions\022\031\n\ndeprecated\030! \001("
    "\010:\005false\022_\n\021idempotency_level\030\" \001(\0162/.go"
    "ogle.protobuf.MethodOptions.IdempotencyL"
    "evel:\023IDEMPOTENCY_UNKNOWN\022-\n\010features\030# "
    "\001(\0132\033.google.protobuf.FeatureSet\022C\n\024unin"
    "terpreted_option\030\347\007 \003(\0132$.google.protobu"
    "f.UninterpretedOption\"P\n\020IdempotencyLeve"
    "l\022\027\n\023IDEMPOTENCY_UNKNOWN\020\000\022\023\n\017NO_SIDE_EF"
    "FECTS\020\001\022\016\n\nIDEMPOTENT\020\002*\t\010\350\007\020\200\200\200\200\002\"\236\002\n\023U"
    "ninterpretedOption\022;\n\004name\030\002 \003(\0132-.googl"
    "e.protobuf.UninterpretedOption.NamePart\022"
    "\030\n\020identifier_value\030\003 \001(\t\022\032\n\022positive_in"
    "t_value\030\004 \001(\004\022\032\n\022negative_int_value\030\005 \001("
    "\003\022\024\n\014double_value\030\006 \001(\001\022\024\n\014string_value\030"
    "\007 \001(\014\022\027\n\017aggregate_value\030\010 \001(\t\0323\n\010NamePa"
    "rt\022\021\n\tname_part\030\001 \002(\t\022\024\n\014is_extension\030\002 "
    "\002(\010\"\203\016\n\nFeatureSet\022\202\001\n\016field_presence\030\001 "
    "\001(\0162).google.protobuf.FeatureSet.FieldPr"
    "esenceB\?\210\001\001\230\001\004\230\001\001\242\001\r\022\010EXPLICIT\030\204\007\242\001\r\022\010IM"
    "PLICIT\030\347\007\242\001\r\022\010EXPLICIT\030\350\007\262\001\003\010\350\007\022b\n\tenum_"
    "type\030\002 \001(\0162$.google.protobuf.FeatureSet."
    "EnumTypeB)\210\001\001\230\001\006\230\001\001\242\001\013\022\006CLOSED\030\204\007\242\001\t\022\004OP"
    "EN\030\347\007\262\001\003\010\350\007\022\201\001\n\027repeated_field_encoding\030"
    "\003 \001(\01621.google.protobuf.FeatureSet.Repea"
    "tedFieldEncodingB-\210\001\001\230\001\004\230\001\001\242\001\r\022\010EXPANDED"
    "\030\204\007\242\001\013\022\006PACKED\030\347\007\262\001\003\010\350\007\022n\n\017utf8_validati"
    "on\030\004 \001(\0162*.google.protobuf.FeatureSet.Ut"
    "f8ValidationB)\210\001\001\230\001\004\230\001\001\242\001\t\022\004NONE\030\204\007\242\001\013\022\006"
    "VERIFY\030\347\007\262\001\003\010\350\007\022m\n\020message_encoding\030\005 \001("
    "\0162+.google.protobuf.FeatureSet.MessageEn"
    "codingB&\210\001\001\230\001\004\230\001\001\242\001\024\022\017LENGTH_PREFIXED\030\204\007"
    "\262\001\003\010\350\007\022v\n\013json_format\030\006 \001(\0162&.google.pro"
    "tobuf.FeatureSet.JsonFormatB9\210\001\001\230\001\003\230\001\006\230\001"
    "\001\242\001\027\022\022LEGACY_BEST_EFFORT\030\204\007\242\001\n\022\005ALLOW\030\347\007"
    "\262\001\003\010\350\007\022\227\001\n\024enforce_naming_style\030\007 \001(\0162.."
    "google.protobuf.FeatureSet.EnforceNaming"
    "StyleBI\210\001\002\230\001\001\230\001\002\230\001\003\230\001\004\230\001\005\230\001\006\230\001\007\230\001\010\230\001\t\242\001\021"
    "\022\014STYLE_LEGACY\030\204\007\242\001\016\022\tSTYLE2024\030\351\007\262\001\003\010\351\007"
    "\022\240\001\n\031default_symbol_visibility\030\010 \001(\0162E.g"
    "oogle.protobuf.FeatureSet.VisibilityFeat"
    "ure.DefaultSymbolVisibilityB6\210\001\002\230\001\001\242\001\017\022\n"
    "EXPORT_ALL\030\204\007\242\001\025\022\020EXPORT_TOP_LEVEL\030\351\007\262\001\003"
    "\010\351\007\032\241\001\n\021VisibilityFeature\"\201\001\n\027DefaultSym"
    "bolVisibility\022%\n!DEFAULT_SYMBOL_VISIBILI"
    "TY_UNKNOWN\020\000\022\016\n\nEXPORT_ALL\020\001\022\024\n\020EXPORT_T"
    "OP_LEVEL\020\002\022\r\n\tLOCAL_ALL\020\003\022\n\n\006STRICT\020\004J\010\010"
    "\001\020\200\200\200\200\002\"\\\n\rFieldPresence\022\032\n\026FIELD_PRESEN"
    "CE_UNKNOWN\020\000\022\014\n\010EXPLICIT\020\001\022\014\n\010IMPLICIT\020\002"
    "\022\023\n\017LEGACY_REQUIRED\020\003\"7\n\010EnumType\022\025\n\021ENU"
    "M_TYPE_UNKNOWN\020\000\022\010\n\004OPEN\020\001\022\n\n\006CLOSED\020\002\"V"
    "\n\025RepeatedFieldEncoding\022#\n\037REPEATED_FIEL"
    "D_ENCODING_UNKNOWN\020\000\022\n\n\006PACKED\020\001\022\014\n\010EXPA"
    "NDED\020\002\"I\n\016Utf8Validation\022\033\n\027UTF8_VALIDAT"
    "ION_UNKNOWN\020\000\022\n\n\006VERIFY\020\002\022\010\n\004NONE\020\003\"\004\010\001\020"
    "\001\"S\n\017MessageEncoding\022\034\n\030MESSAGE_ENCODING"
    "_UNKNOWN\020\000\022\023\n\017LENGTH_PREFIXED\020\001\022\r\n\tDELIM"
    "ITED\020\002\"H\n\nJsonFormat\022\027\n\023JSON_FORMAT_UNKN"
    "OWN\020\000\022\t\n\005ALLOW\020\001\022\026\n\022LEGACY_BEST_EFFORT\020\002"
    "\"W\n\022EnforceNamingStyle\022 \n\034ENFORCE_NAMING"
    "_STYLE_UNKNOWN\020\000\022\r\n\tSTYLE2024\020\001\022\020\n\014STYLE"
    "_LEGACY\020\002*\006\010\350\007\020\213N*\006\010\213N\020\220N*\006\010\220N\020\221NJ\006\010\347\007\020\350"
    "\007\"\230\003\n\022FeatureSetDefaults\022N\n\010defaults\030\001 \003"
    "(\0132<.google.protobuf.FeatureSetDefaults."
    "FeatureSetEditionDefault\0221\n\017minimum_edit"
    "ion\030\004 \001(\0162\030.google.protobuf.Edition\0221\n\017m"
    "aximum_edition\030\005 \001(\0162\030.google.protobuf.E"
    "dition\032\313\001\n\030FeatureSetEditionDefault\022)\n\007e"
    "dition\030\003 \001(\0162\030.google.protobuf.Edition\0229"
    "\n\024overridable_features\030\004 \001(\0132\033.google.pr"
    "otobuf.FeatureSet\0223\n\016fixed_features\030\005 \001("
    "\0132\033.google.protobuf.FeatureSetJ\004\010\001\020\002J\004\010\002"
    "\020\003R\010features\"\343\001\n\016SourceCodeInfo\022:\n\010locat"
    "ion\030\001 \003(\0132(.google.protobuf.SourceCodeIn"
    "fo.Location\032\206\001\n\010Location\022\020\n\004path\030\001 \003(\005B\002"
    "\020\001\022\020\n\004span\030\002 \003(\005B\002\020\001\022\030\n\020leading_comments"
    "\030\003 \001(\t\022\031\n\021trailing_comments\030\004 \001(\t\022!\n\031lea"
    "ding_detached_comments\030\006 \003(\t*\014\010\200\354\312\377\001\020\201\354\312"
    "\377\001\"\234\002\n\021GeneratedCodeInfo\022A\n\nannotation\030\001"
    " \003(\0132-.google.protobuf.GeneratedCodeInfo"
    ".Annotation\032\303\001\n\nAnnotation\022\020\n\004path\030\001 \003(\005"
    "B\002\020\001\022\023\n\013source_file\030\002 \001(\t\022\r\n\005begin\030\003 \001(\005"
    "\022\013\n\003end\030\004 \001(\005\022H\n\010semantic\030\005 \001(\01626.google"
    ".protobuf.GeneratedCodeInfo.Annotation.S"
    "emantic\"(\n\010Semantic\022\010\n\004NONE\020\000\022\007\n\003SET\020\001\022\t"
    "\n\005ALIAS\020\002*\247\002\n\007Edition\022\023\n\017EDITION_UNKNOWN"
    "\020\000\022\023\n\016EDITION_LEGACY\020\204\007\022\023\n\016EDITION_PROTO"
    "2\020\346\007\022\023\n\016EDITION_PROTO3\020\347\007\022\021\n\014EDITION_202"
    "3\020\350\007\022\021\n\014EDITION_2024\020\351\007\022\027\n\023EDITION_1_TES"
    "T_ONLY\020\001\022\027\n\023EDITION_2_TEST_ONLY\020\002\022\035\n\027EDI"
    "TION_99997_TEST_ONLY\020\235\215\006\022\035\n\027EDITION_9999"
    "8_TEST_ONLY\020\236\215\006\022\035\n\027EDITION_99999_TEST_ON"
    "LY\020\237\215\006\022\023\n\013EDITION_MAX\020\377\377\377\377\007*U\n\020SymbolVis"
    "ibility\022\024\n\020VISIBILITY_UNSET\020\000\022\024\n\020VISIBIL"
    "ITY_LOCAL\020\001\022\025\n\021VISIBILITY_EXPORT\020\002B~\n\023co"
    "m.google.protobufB\020DescriptorProtosH\001Z-g"
    "oogle.golang.org/protobuf/types/descript"
    "orpb\370\001\001\242\002\003GPB\252\002\032Google.Protobuf.Reflecti"
    "on"
};
static ::absl::once_flag descriptor_table_google_2fprotobuf_2fdescriptor_2eproto_once;
PROTOBUF_CONSTINIT const ::_pbi::DescriptorTable descriptor_table_google_2fprotobuf_2fdescriptor_2eproto = {
    false,
    false,
    10922,
    descriptor_table_protodef_google_2fprotobuf_2fdescriptor_2eproto,
    "google/protobuf/descriptor.proto",
    &descriptor_table_google_2fprotobuf_2fdescriptor_2eproto_once,
    nullptr,
    0,
    34,
    schemas,
    file_default_instances,
    TableStruct_google_2fprotobuf_2fdescriptor_2eproto::offsets,
    file_level_enum_descriptors_google_2fprotobuf_2fdescriptor_2eproto,
    file_level_service_descriptors_google_2fprotobuf_2fdescriptor_2eproto,
};
namespace google {
namespace protobuf {
namespace internal {
#if !defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
PROTOBUF_EXPORT void InitializeFileDescriptorDefaultInstancesSlow() {
  _FileDescriptorSet_default_instance_.Init();
_FileDescriptorProto_default_instance_.Init();
_DescriptorProto_ExtensionRange_default_instance_.Init();
_DescriptorProto_ReservedRange_default_instance_.Init();
_DescriptorProto_default_instance_.Init();
_ExtensionRangeOptions_Declaration_default_instance_.Init();
_ExtensionRangeOptions_default_instance_.Init();
_FieldDescriptorProto_default_instance_.Init();
_OneofDescriptorProto_default_instance_.Init();
_EnumDescriptorProto_EnumReservedRange_default_instance_.Init();
_EnumDescriptorProto_default_instance_.Init();
_EnumValueDescriptorProto_default_instance_.Init();
_ServiceDescriptorProto_default_instance_.Init();
_MethodDescriptorProto_default_instance_.Init();
_FileOptions_default_instance_.Init();
_MessageOptions_default_instance_.Init();
_FieldOptions_EditionDefault_default_instance_.Init();
_FieldOptions_FeatureSupport_default_instance_.Init();
_FieldOptions_default_instance_.Init();
_OneofOptions_default_instance_.Init();
_EnumOptions_default_instance_.Init();
_EnumValueOptions_default_instance_.Init();
_ServiceOptions_default_instance_.Init();
_MethodOptions_default_instance_.Init();
_UninterpretedOption_NamePart_default_instance_.Init();
_UninterpretedOption_default_instance_.Init();
_FeatureSet_VisibilityFeature_default_instance_.Init();
_FeatureSet_default_instance_.Init();
_FeatureSetDefaults_FeatureSetEditionDefault_default_instance_.Init();
_FeatureSetDefaults_default_instance_.Init();
_SourceCodeInfo_Location_default_instance_.Init();
_SourceCodeInfo_default_instance_.Init();
_GeneratedCodeInfo_Annotation_default_instance_.Init();
_GeneratedCodeInfo_default_instance_.Init();;
}
PROTOBUF_ATTRIBUTE_INIT_PRIORITY1
static ::std::true_type dynamic_init_dummy_google_2fprotobuf_2fdescriptor_2eproto{
    (InitializeFileDescriptorDefaultInstances(), ::std::true_type{})};
#endif  // !defined(PROTOBUF_CONSTINIT_DEFAULT_INSTANCES)
}  // namespace internal
}  // namespace protobuf
}  // namespace google
namespace google {
namespace protobuf {
const ::google::protobuf::EnumDescriptor* PROTOBUF_NONNULL ExtensionRangeOptions_VerificationState_descriptor() {
  ::google::protobuf::internal::AssignDescriptors(&descriptor_table_google_2fprotobuf_2fdescriptor_2eproto);
  return file_level_enum_descriptors_google_2fprotobuf_2fdescriptor_2eproto[0];
}
PROTOBUF_CONSTINIT const uint32_t ExtensionRangeOptions_VerificationState_internal_data_[] = {
    131072u, 0u, };
const ::google::protobuf::EnumDescriptor* PROTOBUF_NONNULL FieldDescriptorProto_Type_descriptor() {
  ::google::protobuf::internal::AssignDescriptors(&descriptor_table_google_2fprotobuf_2fdescriptor_2eproto);
  return file_level_enum_descriptors_google_2fprotobuf_2fdescriptor_2eproto[1];
}
PROTOBUF_CONSTINIT const uint32_t FieldDescriptorProto_Type_internal_data_[] = {
    1179649u, 0u, };
const ::google::protobuf::EnumDescriptor* PROTOBUF_NONNULL FieldDescriptorProto_Label_descriptor() {
  ::google::protobuf::internal::AssignDescriptors(&descriptor_table_google_2fprotobuf_2fdescriptor_2eproto);
  return file_level_enum_descriptors_google_2fprotobuf_2fdescriptor_2eproto[2];
}
PROTOBUF_CONSTINIT const uint32_t FieldDescriptorProto_Label_internal_data_[] = {
    196609u, 0u, };
const ::google::protobuf::EnumDescriptor* PROTOBUF_NONNULL FileOptions_OptimizeMode_descriptor() {
  ::google::protobuf::internal::AssignDescriptors(&descriptor_table_google_2fprotobuf_2fdescriptor_2eproto);
  return file_level_enum_descriptors_google_2fprotobuf_2fdescriptor_2eproto[3];
}
PROTOBUF_CONSTINIT const uint32_t FileOptions_OptimizeMode_internal_data_[] = {
    196609u, 0u, };
const ::google::protobuf::EnumDescriptor* PROTOBUF_NONNULL FieldOptions_CType_descriptor() {
  ::google::protobuf::internal::AssignDescriptors(&descriptor_table_google_2fprotobuf_2fdescriptor_2eproto);
  return file_level_enum_descriptors_google_2fprotobuf_2fdescriptor_2eproto[4];
}
PROTOBUF_CONSTINIT const uint32_t FieldOptions_CType_internal_data_[] = {
    196608u, 0u, };
const ::google::protobuf::EnumDescriptor* PROTOBUF_NONNULL FieldOptions_JSType_descriptor() {
  ::google::protobuf::internal::AssignDescriptors(&descriptor_table_google_2fprotobuf_2fdescriptor_2eproto);
  return file_level_enum_descriptors_google_2fprotobuf_2fdescriptor_2eproto[5];
}
PROTOBUF_CONSTINIT const uint32_t FieldOptions_JSType_internal_data_[] = {
    196608u, 0u, };
const ::google::protobuf::EnumDescriptor* PROTOBUF_NONNULL FieldOptions_OptionRetention_descriptor() {
  ::google::protobuf::internal::AssignDescriptors(&descriptor_table_google_2fprotobuf_2fdescriptor_2eproto);
  return file_level_enum_descriptors_google_2fprotobuf_2fdescriptor_2eproto[6];
}
PROTOBUF_CONSTINIT const uint32_t FieldOptions_OptionRetention_internal_data_[] = {
    196608u, 0u, };
const ::google::protobuf::EnumDescriptor* PROTOBUF_NONNULL FieldOptions_OptionTargetType_descriptor() {
  ::google::protobuf::internal::AssignDescriptors(&descriptor_table_google_2fprotobuf_2fdescriptor_2eproto);
  return file_level_enum_descriptors_google_2fprotobuf_2fdescriptor_2eproto[7];
}
PROTOBUF_CONSTINIT const uint32_t FieldOptions_OptionTargetType_internal_data_[] = {
    655360u, 0u, };
const ::google::protobuf::EnumDescriptor* PROTOBUF_NONNULL MethodOptions_IdempotencyLevel_descriptor() {
  ::google::protobuf::internal::AssignDescriptors(&descriptor_table_google_2fprotobuf_2fdescriptor_2eproto);
  return file_level_enum_descriptors_google_2fprotobuf_2fdescriptor_2eproto[8];
}
PROTOBUF_CONSTINIT const uint32_t MethodOptions_IdempotencyLevel_internal_data_[] = {
    196608u, 0u, };
const ::google::protobuf::EnumDescriptor* PROTOBUF_NONNULL FeatureSet_VisibilityFeature_DefaultSymbolVisibility_descriptor() {
  ::google::protobuf::internal::AssignDescriptors(&descriptor_table_google_2fprotobuf_2fdescriptor_2eproto);
  return file_level_enum_descriptors_google_2fprotobuf_2fdescriptor_2eproto[9];
}
PROTOBUF_CONSTINIT const uint32_t FeatureSet_VisibilityFeature_DefaultSymbolVisibility_internal_data_[] = {
    327680u, 0u, };
const ::google::protobuf::EnumDescriptor* PROTOBUF_NONNULL FeatureSet_FieldPresence_descriptor() {
  ::google::protobuf::internal::AssignDescriptors(&descriptor_table_google_2fprotobuf_2fdescriptor_2eproto);
  return file_level_enum_descriptors_google_2fprotobuf_2fdescriptor_2eproto[10];
}
PROTOBUF_CONSTINIT const uint32_t FeatureSet_FieldPresence_internal_data_[] = {
    262144u, 0u, };
const ::google::protobuf::EnumDescriptor* PROTOBUF_NONNULL FeatureSet_EnumType_descriptor() {
  ::google::protobuf::internal::AssignDescriptors(&descriptor_table_google_2fprotobuf_2fdescriptor_2eproto);
  return file_level_enum_descriptors_google_2fprotobuf_2fdescriptor_2eproto[11];
}
PROTOBUF_CONSTINIT const uint32_t FeatureSet_EnumType_internal_data_[] = {
    196608u, 0u, };
const ::google::protobuf::EnumDescriptor* PROTOBUF_NONNULL FeatureSet_RepeatedFieldEncoding_descriptor() {
  ::google::protobuf::internal::AssignDescriptors(&descriptor_table_google_2fprotobuf_2fdescriptor_2eproto);
  return file_level_enum_descriptors_google_2fprotobuf_2fdescriptor_2eproto[12];
}
PROTOBUF_CONSTINIT const uint32_t FeatureSet_RepeatedFieldEncoding_internal_data_[] = {
    196608u, 0u, };
const ::google::protobuf::EnumDescriptor* PROTOBUF_NONNULL FeatureSet_Utf8Validation_descriptor() {
  ::google::protobuf::internal::AssignDescriptors(&descriptor_table_google_2fprotobuf_2fdescriptor_2eproto);
  return file_level_enum_descriptors_google_2fprotobuf_2fdescriptor_2eproto[13];
}
PROTOBUF_CONSTINIT const uint32_t FeatureSet_Utf8Validation_internal_data_[] = {
    65536u, 32u, 6u, };
const ::google::protobuf::EnumDescriptor* PROTOBUF_NONNULL FeatureSet_MessageEncoding_descriptor() {
  ::google::protobuf::internal::AssignDescriptors(&descriptor_table_google_2fprotobuf_2fdescriptor_2eproto);
  return file_level_enum_descriptors_google_2fprotobuf_2fdescriptor_2eproto[14];
}
PROTOBUF_CONSTINIT const uint32_t FeatureSet_MessageEncoding_internal_data_[] = {
    196608u, 0u, };
const ::google::protobuf::EnumDescriptor* PROTOBUF_NONNULL FeatureSet_JsonFormat_descriptor() {
  ::google::protobuf::internal::AssignDescriptors(&descriptor_table_google_2fprotobuf_2fdescriptor_2eproto);
  return file_level_enum_descriptors_google_2fprotobuf_2fdescriptor_2eproto[15];
}
PROTOBUF_CONSTINIT const uint32_t FeatureSet_JsonFormat_internal_data_[] = {
    196608u, 0u, };
const ::google::protobuf::EnumDescriptor* PROTOBUF_NONNULL FeatureSet_EnforceNamingStyle_descriptor() {
  ::google::protobuf::internal::AssignDescriptors(&descriptor_table_google_2fprotobuf_2fdescriptor_2eproto);
  return file_level_enum_descriptors_google_2fprotobuf_2fdescriptor_2eproto[16];
}
PROTOBUF_CONSTINIT const uint32_t FeatureSet_EnforceNamingStyle_internal_data_[] = {
    196608u, 0u, };
const ::google::protobuf::EnumDescriptor* PROTOBUF_NONNULL GeneratedCodeInfo_Annotation_Semantic_descriptor() {
  ::google::protobuf::internal::AssignDescriptors(&descriptor_table_google_2fprotobuf_2fdescriptor_2eproto);
  return file_level_enum_descriptors_google_2fprotobuf_2fdescriptor_2eproto[17];
}
PROTOBUF_CONSTINIT const uint32_t GeneratedCodeInfo_Annotation_Semantic_internal_data_[] = {
    196608u, 0u, };
const ::google::protobuf::EnumDescriptor* PROTOBUF_NONNULL Edition_descriptor() {
  ::google::protobuf::internal::AssignDescriptors(&descriptor_table_google_2fprotobuf_2fdescriptor_2eproto);
  return file_level_enum_descriptors_google_2fprotobuf_2fdescriptor_2eproto[18];
}
PROTOBUF_CONSTINIT const uint32_t Edition_internal_data_[] = {
    196608u, 589824u, 99997u, 1000u, 99999u, 998u, 1001u, 99998u, 2147483647u, 900u, 999u, };
const ::google::protobuf::EnumDescriptor* PROTOBUF_NONNULL SymbolVisibility_descriptor() {
  ::google::protobuf::internal::AssignDescriptors(&descriptor_table_google_2fprotobuf_2fdescriptor_2eproto);
  return file_level_enum_descriptors_google_2fprotobuf_2fdescriptor_2eproto[19];
}
PROTOBUF_CONSTINIT const uint32_t SymbolVisibility_internal_data_[] = {
    196608u, 0u, };
// ===================================================================

class FileDescriptorSet::_Internal {
 public:
  using HasBits =
      decltype(::std::declval<FileDescriptorSet>()._impl_._has_bits_);
  static constexpr ::int32_t kHasBitsOffset =
      8 * PROTOBUF_FIELD_OFFSET(FileDescriptorSet, _impl_._has_bits_);
};

FileDescriptorSet::FileDescriptorSet(::google::protobuf::Arena* PROTOBUF_NULLABLE arena)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(arena, FileDescriptorSet_class_data_.base()) {
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(arena) {
#endif  // PROTOBUF_CUSTOM_VTABLE
  SharedCtor(arena);
  // @@protoc_insertion_point(arena_constructor:google.protobuf.FileDescriptorSet)
}
PROTOBUF_NDEBUG_INLINE FileDescriptorSet::Impl_::Impl_(
    [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility,
    [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from,
    [[maybe_unused]] const ::google::protobuf::FileDescriptorSet& from_msg)
      : _extensions_{visibility, arena},
        _has_bits_{from._has_bits_},
        _cached_size_{0},
        file_{visibility, arena, from.file_} {}

FileDescriptorSet::FileDescriptorSet(
    ::google::protobuf::Arena* PROTOBUF_NULLABLE arena,
    const FileDescriptorSet& from)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(arena, FileDescriptorSet_class_data_.base()) {
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(arena) {
#endif  // PROTOBUF_CUSTOM_VTABLE
  FileDescriptorSet* const _this = this;
  (void)_this;
  _internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(
      from._internal_metadata_);
  new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from);
  _impl_._extensions_.MergeFrom(this, from._impl_._extensions_);

  // @@protoc_insertion_point(copy_constructor:google.protobuf.FileDescriptorSet)
}
PROTOBUF_NDEBUG_INLINE FileDescriptorSet::Impl_::Impl_(
    [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility,
    [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena)
      : _extensions_{visibility, arena},
        _cached_size_{0},
        file_{visibility, arena} {}

inline void FileDescriptorSet::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) {
  new (&_impl_) Impl_(internal_visibility(), arena);
}
FileDescriptorSet::~FileDescriptorSet() {
  // @@protoc_insertion_point(destructor:google.protobuf.FileDescriptorSet)
  SharedDtor(*this);
}
inline void FileDescriptorSet::SharedDtor(MessageLite& self) {
  FileDescriptorSet& this_ = static_cast<FileDescriptorSet&>(self);
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    this_.CheckHasBitConsistency();
  }
  this_._internal_metadata_.Delete<::google::protobuf::UnknownFieldSet>();
  ABSL_DCHECK(this_.GetArena() == nullptr);
  this_._impl_.~Impl_();
}

inline void* PROTOBUF_NONNULL FileDescriptorSet::PlacementNew_(
    const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem,
    ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) {
  return ::new (mem) FileDescriptorSet(arena);
}
constexpr auto FileDescriptorSet::InternalNewImpl_() {
  constexpr auto arena_bits = ::google::protobuf::internal::EncodePlacementArenaOffsets({
      PROTOBUF_FIELD_OFFSET(FileDescriptorSet, _impl_._extensions_) +
          decltype(FileDescriptorSet::_impl_._extensions_)::InternalGetArenaOffset(
              ::google::protobuf::Message::internal_visibility()),
      PROTOBUF_FIELD_OFFSET(FileDescriptorSet, _impl_.file_) +
          decltype(FileDescriptorSet::_impl_.file_)::
              InternalGetArenaOffset(
                  ::google::protobuf::Message::internal_visibility()),
  });
  if (arena_bits.has_value()) {
    return ::google::protobuf::internal::MessageCreator::ZeroInit(
        sizeof(FileDescriptorSet), alignof(FileDescriptorSet), *arena_bits);
  } else {
    return ::google::protobuf::internal::MessageCreator(&FileDescriptorSet::PlacementNew_,
                                 sizeof(FileDescriptorSet),
                                 alignof(FileDescriptorSet));
  }
}
constexpr auto FileDescriptorSet::InternalGenerateClassData_() {
  return ::google::protobuf::internal::ClassDataFull{
      ::google::protobuf::internal::ClassData{
          &_FileDescriptorSet_default_instance_._instance,
          &_table_.header,
          nullptr,  // OnDemandRegisterArenaDtor
          FileDescriptorSet::IsInitializedImpl,
          &FileDescriptorSet::MergeImpl,
          ::google::protobuf::Message::GetNewImpl<FileDescriptorSet>(),
#if defined(PROTOBUF_CUSTOM_VTABLE)
          &FileDescriptorSet::SharedDtor,
          ::google::protobuf::Message::GetClearImpl<FileDescriptorSet>(), &FileDescriptorSet::ByteSizeLong,
              &FileDescriptorSet::_InternalSerialize,
#endif  // PROTOBUF_CUSTOM_VTABLE
          PROTOBUF_FIELD_OFFSET(FileDescriptorSet, _impl_._cached_size_),
          false,
      },
      &FileDescriptorSet::kDescriptorMethods,
      &descriptor_table_google_2fprotobuf_2fdescriptor_2eproto,
      nullptr,  // tracker
  };
}

PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 const
    ::google::protobuf::internal::ClassDataFull FileDescriptorSet_class_data_ =
        FileDescriptorSet::InternalGenerateClassData_();

PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL
FileDescriptorSet::GetClassData() const {
  ::google::protobuf::internal::PrefetchToLocalCache(&FileDescriptorSet_class_data_);
  ::google::protobuf::internal::PrefetchToLocalCache(FileDescriptorSet_class_data_.tc_table);
  return FileDescriptorSet_class_data_.base();
}
constexpr ::_pbi::TcParseTable<0, 1, 1, 0, 2>
FileDescriptorSet::_table_ = {
  {
    PROTOBUF_FIELD_OFFSET(FileDescriptorSet, _impl_._has_bits_),
    PROTOBUF_FIELD_OFFSET(FileDescriptorSet, _impl_._extensions_),
    1, 0,  // max_field_number, fast_idx_mask
    offsetof(decltype(_table_), field_lookup_table),
    4294967294,  // skipmap
    offsetof(decltype(_table_), field_entries),
    1,  // num_field_entries
    1,  // num_aux_entries
    offsetof(decltype(_table_), aux_entries),
    FileDescriptorSet_class_data_.base(),
    nullptr,  // post_loop_handler
    ::_pbi::TcParser::GenericFallback,  // fallback
    #ifdef PROTOBUF_PREFETCH_PARSE_TABLE
    ::_pbi::TcParser::GetTable<::google::protobuf::FileDescriptorSet>(),  // to_prefetch
    #endif  // PROTOBUF_PREFETCH_PARSE_TABLE
  }, {{
    // repeated .google.protobuf.FileDescriptorProto file = 1;
    {::_pbi::TcParser::FastMtR1,
     {10, 0, 0,
      PROTOBUF_FIELD_OFFSET(FileDescriptorSet, _impl_.file_)}},
  }}, {{
    65535, 65535
  }}, {{
    // repeated .google.protobuf.FileDescriptorProto file = 1;
    {PROTOBUF_FIELD_OFFSET(FileDescriptorSet, _impl_.file_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)},
  }},
  {{
      {::_pbi::TcParser::GetTable<::google::protobuf::FileDescriptorProto>()},
  }},
  {{
  }},
};
PROTOBUF_NOINLINE void FileDescriptorSet::Clear() {
// @@protoc_insertion_point(message_clear_start:google.protobuf.FileDescriptorSet)
  ::google::protobuf::internal::TSanWrite(&_impl_);
  ::uint32_t cached_has_bits = 0;
  // Prevent compiler warnings about cached_has_bits being unused
  (void) cached_has_bits;

  _impl_._extensions_.Clear();
  cached_has_bits = _impl_._has_bits_[0];
  if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) {
    _impl_.file_.Clear();
  }
  _impl_._has_bits_.Clear();
  _internal_metadata_.Clear<::google::protobuf::UnknownFieldSet>();
}

#if defined(PROTOBUF_CUSTOM_VTABLE)
::uint8_t* PROTOBUF_NONNULL FileDescriptorSet::_InternalSerialize(
    const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target,
    ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) {
  const FileDescriptorSet& this_ = static_cast<const FileDescriptorSet&>(base);
#else   // PROTOBUF_CUSTOM_VTABLE
::uint8_t* PROTOBUF_NONNULL FileDescriptorSet::_InternalSerialize(
    ::uint8_t* PROTOBUF_NONNULL target,
    ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const {
  const FileDescriptorSet& this_ = *this;
#endif  // PROTOBUF_CUSTOM_VTABLE
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    this_.CheckHasBitConsistency();
  }
  // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.FileDescriptorSet)
  ::uint32_t cached_has_bits = 0;
  (void)cached_has_bits;

  cached_has_bits = this_._impl_._has_bits_[0];
  // repeated .google.protobuf.FileDescriptorProto file = 1;
  if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) {
    for (unsigned i = 0, n = static_cast<unsigned>(
                             this_._internal_file_size());
         i < n; i++) {
      const auto& repfield = this_._internal_file().Get(i);
      target =
          ::google::protobuf::internal::WireFormatLite::InternalWriteMessage(
              1, repfield, repfield.GetCachedSize(),
              target, stream);
    }
  }

  // All extensions.
  target = this_._impl_._extensions_._InternalSerializeAll(&default_instance(),
                                                    target, stream);
  if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) {
    target =
        ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray(
            this_._internal_metadata_.unknown_fields<::google::protobuf::UnknownFieldSet>(::google::protobuf::UnknownFieldSet::default_instance), target, stream);
  }
  // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.FileDescriptorSet)
  return target;
}

#if defined(PROTOBUF_CUSTOM_VTABLE)
::size_t FileDescriptorSet::ByteSizeLong(const MessageLite& base) {
  const FileDescriptorSet& this_ = static_cast<const FileDescriptorSet&>(base);
#else   // PROTOBUF_CUSTOM_VTABLE
::size_t FileDescriptorSet::ByteSizeLong() const {
  const FileDescriptorSet& this_ = *this;
#endif  // PROTOBUF_CUSTOM_VTABLE
  // @@protoc_insertion_point(message_byte_size_start:google.protobuf.FileDescriptorSet)
  ::size_t total_size = 0;
  total_size += this_._impl_._extensions_.ByteSize();

  ::uint32_t cached_has_bits = 0;
  // Prevent compiler warnings about cached_has_bits being unused
  (void)cached_has_bits;

  ::_pbi::Prefetch5LinesFrom7Lines(&this_);
   {
    // repeated .google.protobuf.FileDescriptorProto file = 1;
    cached_has_bits = this_._impl_._has_bits_[0];
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) {
      total_size += 1UL * this_._internal_file_size();
      for (const auto& msg : this_._internal_file()) {
        total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg);
      }
    }
  }
  return this_.MaybeComputeUnknownFieldsSize(total_size,
                                             &this_._impl_._cached_size_);
}

void FileDescriptorSet::MergeImpl(::google::protobuf::MessageLite& to_msg,
                            const ::google::protobuf::MessageLite& from_msg) {
   auto* const _this =
      static_cast<FileDescriptorSet*>(&to_msg);
  auto& from = static_cast<const FileDescriptorSet&>(from_msg);
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    from.CheckHasBitConsistency();
  }
  ::google::protobuf::Arena* arena = _this->GetArena();
  // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.FileDescriptorSet)
  ABSL_DCHECK_NE(&from, _this);
  ::uint32_t cached_has_bits = 0;
  (void)cached_has_bits;

  cached_has_bits = from._impl_._has_bits_[0];
  if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) {
    _this->_internal_mutable_file()->InternalMergeFromWithArena(
        ::google::protobuf::MessageLite::internal_visibility(), arena,
        from._internal_file());
  }
  _this->_impl_._has_bits_[0] |= cached_has_bits;
  _this->_impl_._extensions_.MergeFrom(&default_instance(),
                                from._impl_._extensions_);
  _this->_internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(
      from._internal_metadata_);
}

void FileDescriptorSet::CopyFrom(const FileDescriptorSet& from) {
  // @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.FileDescriptorSet)
  if (&from == this) return;
  Clear();
  MergeFrom(from);
}

PROTOBUF_NOINLINE bool FileDescriptorSet::IsInitializedImpl(
    const MessageLite& msg) {
  auto& this_ = static_cast<const FileDescriptorSet&>(msg);
  if (!this_._impl_._extensions_.IsInitialized(&default_instance())) {
    return false;
  }
  if (!::google::protobuf::internal::AllAreInitialized(this_._internal_file()))
    return false;
  return true;
}

void FileDescriptorSet::InternalSwap(FileDescriptorSet* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) {
  using ::std::swap;
  _impl_._extensions_.InternalSwap(&other->_impl_._extensions_);
  _internal_metadata_.InternalSwap(&other->_internal_metadata_);
  swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]);
  _impl_.file_.InternalSwap(&other->_impl_.file_);
}

::google::protobuf::Metadata FileDescriptorSet::GetMetadata() const {
  return ::google::protobuf::Message::GetMetadataImpl(GetClassData()->full());
}
// ===================================================================

class FileDescriptorProto::_Internal {
 public:
  using HasBits =
      decltype(::std::declval<FileDescriptorProto>()._impl_._has_bits_);
  static constexpr ::int32_t kHasBitsOffset =
      8 * PROTOBUF_FIELD_OFFSET(FileDescriptorProto, _impl_._has_bits_);
};

FileDescriptorProto::FileDescriptorProto(::google::protobuf::Arena* PROTOBUF_NULLABLE arena)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(arena, FileDescriptorProto_class_data_.base()) {
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(arena) {
#endif  // PROTOBUF_CUSTOM_VTABLE
  SharedCtor(arena);
  // @@protoc_insertion_point(arena_constructor:google.protobuf.FileDescriptorProto)
}
PROTOBUF_NDEBUG_INLINE FileDescriptorProto::Impl_::Impl_(
    [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility,
    [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from,
    [[maybe_unused]] const ::google::protobuf::FileDescriptorProto& from_msg)
      : _has_bits_{from._has_bits_},
        _cached_size_{0},
        dependency_{visibility, arena, from.dependency_},
        message_type_{visibility, arena, from.message_type_},
        enum_type_{visibility, arena, from.enum_type_},
        service_{visibility, arena, from.service_},
        extension_{visibility, arena, from.extension_},
        public_dependency_{visibility, arena, from.public_dependency_},
        weak_dependency_{visibility, arena, from.weak_dependency_},
        option_dependency_{visibility, arena, from.option_dependency_},
        name_(arena, from.name_),
        package_(arena, from.package_),
        syntax_(arena, from.syntax_) {}

FileDescriptorProto::FileDescriptorProto(
    ::google::protobuf::Arena* PROTOBUF_NULLABLE arena,
    const FileDescriptorProto& from)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(arena, FileDescriptorProto_class_data_.base()) {
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(arena) {
#endif  // PROTOBUF_CUSTOM_VTABLE
  FileDescriptorProto* const _this = this;
  (void)_this;
  _internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(
      from._internal_metadata_);
  new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from);
  ::uint32_t cached_has_bits = _impl_._has_bits_[0];
  _impl_.options_ = (CheckHasBit(cached_has_bits, 0x00000800U))
                ? ::google::protobuf::Message::CopyConstruct(arena, *from._impl_.options_)
                : nullptr;
  _impl_.source_code_info_ = (CheckHasBit(cached_has_bits, 0x00001000U))
                ? ::google::protobuf::Message::CopyConstruct(arena, *from._impl_.source_code_info_)
                : nullptr;
  _impl_.edition_ = from._impl_.edition_;

  // @@protoc_insertion_point(copy_constructor:google.protobuf.FileDescriptorProto)
}
PROTOBUF_NDEBUG_INLINE FileDescriptorProto::Impl_::Impl_(
    [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility,
    [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena)
      : _cached_size_{0},
        dependency_{visibility, arena},
        message_type_{visibility, arena},
        enum_type_{visibility, arena},
        service_{visibility, arena},
        extension_{visibility, arena},
        public_dependency_{visibility, arena},
        weak_dependency_{visibility, arena},
        option_dependency_{visibility, arena},
        name_(arena),
        package_(arena),
        syntax_(arena) {}

inline void FileDescriptorProto::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) {
  new (&_impl_) Impl_(internal_visibility(), arena);
  ::memset(reinterpret_cast<char*>(&_impl_) +
               offsetof(Impl_, options_),
           0,
           offsetof(Impl_, edition_) -
               offsetof(Impl_, options_) +
               sizeof(Impl_::edition_));
}
FileDescriptorProto::~FileDescriptorProto() {
  // @@protoc_insertion_point(destructor:google.protobuf.FileDescriptorProto)
  SharedDtor(*this);
}
inline void FileDescriptorProto::SharedDtor(MessageLite& self) {
  FileDescriptorProto& this_ = static_cast<FileDescriptorProto&>(self);
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    this_.CheckHasBitConsistency();
  }
  this_._internal_metadata_.Delete<::google::protobuf::UnknownFieldSet>();
  ABSL_DCHECK(this_.GetArena() == nullptr);
  this_._impl_.name_.Destroy();
  this_._impl_.package_.Destroy();
  this_._impl_.syntax_.Destroy();
  delete this_._impl_.options_;
  delete this_._impl_.source_code_info_;
  this_._impl_.~Impl_();
}

inline void* PROTOBUF_NONNULL FileDescriptorProto::PlacementNew_(
    const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem,
    ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) {
  return ::new (mem) FileDescriptorProto(arena);
}
constexpr auto FileDescriptorProto::InternalNewImpl_() {
  constexpr auto arena_bits = ::google::protobuf::internal::EncodePlacementArenaOffsets({
      PROTOBUF_FIELD_OFFSET(FileDescriptorProto, _impl_.dependency_) +
          decltype(FileDescriptorProto::_impl_.dependency_)::
              InternalGetArenaOffset(
                  ::google::protobuf::Message::internal_visibility()),
      PROTOBUF_FIELD_OFFSET(FileDescriptorProto, _impl_.public_dependency_) +
          decltype(FileDescriptorProto::_impl_.public_dependency_)::
              InternalGetArenaOffset(
                  ::google::protobuf::Message::internal_visibility()),
      PROTOBUF_FIELD_OFFSET(FileDescriptorProto, _impl_.weak_dependency_) +
          decltype(FileDescriptorProto::_impl_.weak_dependency_)::
              InternalGetArenaOffset(
                  ::google::protobuf::Message::internal_visibility()),
      PROTOBUF_FIELD_OFFSET(FileDescriptorProto, _impl_.option_dependency_) +
          decltype(FileDescriptorProto::_impl_.option_dependency_)::
              InternalGetArenaOffset(
                  ::google::protobuf::Message::internal_visibility()),
      PROTOBUF_FIELD_OFFSET(FileDescriptorProto, _impl_.message_type_) +
          decltype(FileDescriptorProto::_impl_.message_type_)::
              InternalGetArenaOffset(
                  ::google::protobuf::Message::internal_visibility()),
      PROTOBUF_FIELD_OFFSET(FileDescriptorProto, _impl_.enum_type_) +
          decltype(FileDescriptorProto::_impl_.enum_type_)::
              InternalGetArenaOffset(
                  ::google::protobuf::Message::internal_visibility()),
      PROTOBUF_FIELD_OFFSET(FileDescriptorProto, _impl_.service_) +
          decltype(FileDescriptorProto::_impl_.service_)::
              InternalGetArenaOffset(
                  ::google::protobuf::Message::internal_visibility()),
      PROTOBUF_FIELD_OFFSET(FileDescriptorProto, _impl_.extension_) +
          decltype(FileDescriptorProto::_impl_.extension_)::
              InternalGetArenaOffset(
                  ::google::protobuf::Message::internal_visibility()),
  });
  if (arena_bits.has_value()) {
    return ::google::protobuf::internal::MessageCreator::CopyInit(
        sizeof(FileDescriptorProto), alignof(FileDescriptorProto), *arena_bits);
  } else {
    return ::google::protobuf::internal::MessageCreator(&FileDescriptorProto::PlacementNew_,
                                 sizeof(FileDescriptorProto),
                                 alignof(FileDescriptorProto));
  }
}
constexpr auto FileDescriptorProto::InternalGenerateClassData_() {
  return ::google::protobuf::internal::ClassDataFull{
      ::google::protobuf::internal::ClassData{
          &_FileDescriptorProto_default_instance_._instance,
          &_table_.header,
          nullptr,  // OnDemandRegisterArenaDtor
          FileDescriptorProto::IsInitializedImpl,
          &FileDescriptorProto::MergeImpl,
          ::google::protobuf::Message::GetNewImpl<FileDescriptorProto>(),
#if defined(PROTOBUF_CUSTOM_VTABLE)
          &FileDescriptorProto::SharedDtor,
          ::google::protobuf::Message::GetClearImpl<FileDescriptorProto>(), &FileDescriptorProto::ByteSizeLong,
              &FileDescriptorProto::_InternalSerialize,
#endif  // PROTOBUF_CUSTOM_VTABLE
          PROTOBUF_FIELD_OFFSET(FileDescriptorProto, _impl_._cached_size_),
          false,
      },
      &FileDescriptorProto::kDescriptorMethods,
      &descriptor_table_google_2fprotobuf_2fdescriptor_2eproto,
      nullptr,  // tracker
  };
}

PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 const
    ::google::protobuf::internal::ClassDataFull FileDescriptorProto_class_data_ =
        FileDescriptorProto::InternalGenerateClassData_();

PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL
FileDescriptorProto::GetClassData() const {
  ::google::protobuf::internal::PrefetchToLocalCache(&FileDescriptorProto_class_data_);
  ::google::protobuf::internal::PrefetchToLocalCache(FileDescriptorProto_class_data_.tc_table);
  return FileDescriptorProto_class_data_.base();
}
constexpr ::_pbi::TcParseTable<4, 14, 7, 0, 2>
FileDescriptorProto::_table_ = {
  {
    PROTOBUF_FIELD_OFFSET(FileDescriptorProto, _impl_._has_bits_),
    0, // no _extensions_
    15, 120,  // max_field_number, fast_idx_mask
    offsetof(decltype(_table_), field_lookup_table),
    4294938624,  // skipmap
    offsetof(decltype(_table_), field_entries),
    14,  // num_field_entries
    7,  // num_aux_entries
    offsetof(decltype(_table_), aux_entries),
    FileDescriptorProto_class_data_.base(),
    nullptr,  // post_loop_handler
    ::_pbi::TcParser::GenericFallback,  // fallback
    #ifdef PROTOBUF_PREFETCH_PARSE_TABLE
    ::_pbi::TcParser::GetTable<::google::protobuf::FileDescriptorProto>(),  // to_prefetch
    #endif  // PROTOBUF_PREFETCH_PARSE_TABLE
  }, {{
    {::_pbi::TcParser::MiniParse, {}},
    // optional string name = 1;
    {::_pbi::TcParser::FastBS1,
     {10, 8, 0,
      PROTOBUF_FIELD_OFFSET(FileDescriptorProto, _impl_.name_)}},
    // optional string package = 2;
    {::_pbi::TcParser::FastBS1,
     {18, 9, 0,
      PROTOBUF_FIELD_OFFSET(FileDescriptorProto, _impl_.package_)}},
    // repeated string dependency = 3;
    {::_pbi::TcParser::FastBR1,
     {26, 0, 0,
      PROTOBUF_FIELD_OFFSET(FileDescriptorProto, _impl_.dependency_)}},
    // repeated .google.protobuf.DescriptorProto message_type = 4;
    {::_pbi::TcParser::FastMtR1,
     {34, 1, 0,
      PROTOBUF_FIELD_OFFSET(FileDescriptorProto, _impl_.message_type_)}},
    // repeated .google.protobuf.EnumDescriptorProto enum_type = 5;
    {::_pbi::TcParser::FastMtR1,
     {42, 2, 1,
      PROTOBUF_FIELD_OFFSET(FileDescriptorProto, _impl_.enum_type_)}},
    // repeated .google.protobuf.ServiceDescriptorProto service = 6;
    {::_pbi::TcParser::FastMtR1,
     {50, 3, 2,
      PROTOBUF_FIELD_OFFSET(FileDescriptorProto, _impl_.service_)}},
    // repeated .google.protobuf.FieldDescriptorProto extension = 7;
    {::_pbi::TcParser::FastMtR1,
     {58, 4, 3,
      PROTOBUF_FIELD_OFFSET(FileDescriptorProto, _impl_.extension_)}},
    // optional .google.protobuf.FileOptions options = 8;
    {::_pbi::TcParser::FastMtS1,
     {66, 11, 4,
      PROTOBUF_FIELD_OFFSET(FileDescriptorProto, _impl_.options_)}},
    // optional .google.protobuf.SourceCodeInfo source_code_info = 9;
    {::_pbi::TcParser::FastMtS1,
     {74, 12, 5,
      PROTOBUF_FIELD_OFFSET(FileDescriptorProto, _impl_.source_code_info_)}},
    // repeated int32 public_dependency = 10;
    {::_pbi::TcParser::FastV32R1,
     {80, 5, 0,
      PROTOBUF_FIELD_OFFSET(FileDescriptorProto, _impl_.public_dependency_)}},
    // repeated int32 weak_dependency = 11;
    {::_pbi::TcParser::FastV32R1,
     {88, 6, 0,
      PROTOBUF_FIELD_OFFSET(FileDescriptorProto, _impl_.weak_dependency_)}},
    // optional string syntax = 12;
    {::_pbi::TcParser::FastBS1,
     {98, 10, 0,
      PROTOBUF_FIELD_OFFSET(FileDescriptorProto, _impl_.syntax_)}},
    {::_pbi::TcParser::MiniParse, {}},
    // optional .google.protobuf.Edition edition = 14;
    {::_pbi::TcParser::FastEvS1,
     {112, 13, 6,
      PROTOBUF_FIELD_OFFSET(FileDescriptorProto, _impl_.edition_)}},
    // repeated string option_dependency = 15;
    {::_pbi::TcParser::FastBR1,
     {122, 7, 0,
      PROTOBUF_FIELD_OFFSET(FileDescriptorProto, _impl_.option_dependency_)}},
  }}, {{
    65535, 65535
  }}, {{
    // optional string name = 1;
    {PROTOBUF_FIELD_OFFSET(FileDescriptorProto, _impl_.name_), _Internal::kHasBitsOffset + 8, 0, (0 | ::_fl::kFcOptional | ::_fl::kBytes | ::_fl::kRepAString)},
    // optional string package = 2;
    {PROTOBUF_FIELD_OFFSET(FileDescriptorProto, _impl_.package_), _Internal::kHasBitsOffset + 9, 0, (0 | ::_fl::kFcOptional | ::_fl::kBytes | ::_fl::kRepAString)},
    // repeated string dependency = 3;
    {PROTOBUF_FIELD_OFFSET(FileDescriptorProto, _impl_.dependency_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcRepeated | ::_fl::kBytes | ::_fl::kRepSString)},
    // repeated .google.protobuf.DescriptorProto message_type = 4;
    {PROTOBUF_FIELD_OFFSET(FileDescriptorProto, _impl_.message_type_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)},
    // repeated .google.protobuf.EnumDescriptorProto enum_type = 5;
    {PROTOBUF_FIELD_OFFSET(FileDescriptorProto, _impl_.enum_type_), _Internal::kHasBitsOffset + 2, 1, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)},
    // repeated .google.protobuf.ServiceDescriptorProto service = 6;
    {PROTOBUF_FIELD_OFFSET(FileDescriptorProto, _impl_.service_), _Internal::kHasBitsOffset + 3, 2, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)},
    // repeated .google.protobuf.FieldDescriptorProto extension = 7;
    {PROTOBUF_FIELD_OFFSET(FileDescriptorProto, _impl_.extension_), _Internal::kHasBitsOffset + 4, 3, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)},
    // optional .google.protobuf.FileOptions options = 8;
    {PROTOBUF_FIELD_OFFSET(FileDescriptorProto, _impl_.options_), _Internal::kHasBitsOffset + 11, 4, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)},
    // optional .google.protobuf.SourceCodeInfo source_code_info = 9;
    {PROTOBUF_FIELD_OFFSET(FileDescriptorProto, _impl_.source_code_info_), _Internal::kHasBitsOffset + 12, 5, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)},
    // repeated int32 public_dependency = 10;
    {PROTOBUF_FIELD_OFFSET(FileDescriptorProto, _impl_.public_dependency_), _Internal::kHasBitsOffset + 5, 0, (0 | ::_fl::kFcRepeated | ::_fl::kInt32)},
    // repeated int32 weak_dependency = 11;
    {PROTOBUF_FIELD_OFFSET(FileDescriptorProto, _impl_.weak_dependency_), _Internal::kHasBitsOffset + 6, 0, (0 | ::_fl::kFcRepeated | ::_fl::kInt32)},
    // optional string syntax = 12;
    {PROTOBUF_FIELD_OFFSET(FileDescriptorProto, _impl_.syntax_), _Internal::kHasBitsOffset + 10, 0, (0 | ::_fl::kFcOptional | ::_fl::kBytes | ::_fl::kRepAString)},
    // optional .google.protobuf.Edition edition = 14;
    {PROTOBUF_FIELD_OFFSET(FileDescriptorProto, _impl_.edition_), _Internal::kHasBitsOffset + 13, 6, (0 | ::_fl::kFcOptional | ::_fl::kEnum)},
    // repeated string option_dependency = 15;
    {PROTOBUF_FIELD_OFFSET(FileDescriptorProto, _impl_.option_dependency_), _Internal::kHasBitsOffset + 7, 0, (0 | ::_fl::kFcRepeated | ::_fl::kBytes | ::_fl::kRepSString)},
  }},
  {{
      {::_pbi::TcParser::GetTable<::google::protobuf::DescriptorProto>()},
      {::_pbi::TcParser::GetTable<::google::protobuf::EnumDescriptorProto>()},
      {::_pbi::TcParser::GetTable<::google::protobuf::ServiceDescriptorProto>()},
      {::_pbi::TcParser::GetTable<::google::protobuf::FieldDescriptorProto>()},
      {::_pbi::TcParser::GetTable<::google::protobuf::FileOptions>()},
      {::_pbi::TcParser::GetTable<::google::protobuf::SourceCodeInfo>()},
      {::_pbi::FieldAuxEnumData{}, ::google::protobuf::Edition_internal_data_},
  }},
  {{
  }},
};
PROTOBUF_NOINLINE void FileDescriptorProto::Clear() {
// @@protoc_insertion_point(message_clear_start:google.protobuf.FileDescriptorProto)
  ::google::protobuf::internal::TSanWrite(&_impl_);
  ::uint32_t cached_has_bits = 0;
  // Prevent compiler warnings about cached_has_bits being unused
  (void) cached_has_bits;

  cached_has_bits = _impl_._has_bits_[0];
  if (BatchCheckHasBit(cached_has_bits, 0x000000ffU)) {
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) {
      _impl_.dependency_.Clear();
    }
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000002U)) {
      _impl_.message_type_.Clear();
    }
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000004U)) {
      _impl_.enum_type_.Clear();
    }
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000008U)) {
      _impl_.service_.Clear();
    }
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000010U)) {
      _impl_.extension_.Clear();
    }
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000020U)) {
      _impl_.public_dependency_.Clear();
    }
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000040U)) {
      _impl_.weak_dependency_.Clear();
    }
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000080U)) {
      _impl_.option_dependency_.Clear();
    }
  }
  if (BatchCheckHasBit(cached_has_bits, 0x00001f00U)) {
    if (CheckHasBit(cached_has_bits, 0x00000100U)) {
      _impl_.name_.ClearNonDefaultToEmpty();
    }
    if (CheckHasBit(cached_has_bits, 0x00000200U)) {
      _impl_.package_.ClearNonDefaultToEmpty();
    }
    if (CheckHasBit(cached_has_bits, 0x00000400U)) {
      _impl_.syntax_.ClearNonDefaultToEmpty();
    }
    if (CheckHasBit(cached_has_bits, 0x00000800U)) {
      ABSL_DCHECK(_impl_.options_ != nullptr);
      _impl_.options_->Clear();
    }
    if (CheckHasBit(cached_has_bits, 0x00001000U)) {
      ABSL_DCHECK(_impl_.source_code_info_ != nullptr);
      _impl_.source_code_info_->Clear();
    }
  }
  _impl_.edition_ = 0;
  _impl_._has_bits_.Clear();
  _internal_metadata_.Clear<::google::protobuf::UnknownFieldSet>();
}

#if defined(PROTOBUF_CUSTOM_VTABLE)
::uint8_t* PROTOBUF_NONNULL FileDescriptorProto::_InternalSerialize(
    const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target,
    ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) {
  const FileDescriptorProto& this_ = static_cast<const FileDescriptorProto&>(base);
#else   // PROTOBUF_CUSTOM_VTABLE
::uint8_t* PROTOBUF_NONNULL FileDescriptorProto::_InternalSerialize(
    ::uint8_t* PROTOBUF_NONNULL target,
    ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const {
  const FileDescriptorProto& this_ = *this;
#endif  // PROTOBUF_CUSTOM_VTABLE
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    this_.CheckHasBitConsistency();
  }
  // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.FileDescriptorProto)
  ::uint32_t cached_has_bits = 0;
  (void)cached_has_bits;

  cached_has_bits = this_._impl_._has_bits_[0];
  // optional string name = 1;
  if (CheckHasBit(cached_has_bits, 0x00000100U)) {
    const ::std::string& _s = this_._internal_name();
    target = stream->WriteStringMaybeAliased(1, _s, target);
  }

  // optional string package = 2;
  if (CheckHasBit(cached_has_bits, 0x00000200U)) {
    const ::std::string& _s = this_._internal_package();
    target = stream->WriteStringMaybeAliased(2, _s, target);
  }

  // repeated string dependency = 3;
  if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) {
    for (int i = 0, n = this_._internal_dependency_size(); i < n; ++i) {
      const auto& s = this_._internal_dependency().Get(i);
      target = stream->WriteString(3, s, target);
    }
  }

  // repeated .google.protobuf.DescriptorProto message_type = 4;
  if (CheckHasBitForRepeated(cached_has_bits, 0x00000002U)) {
    for (unsigned i = 0, n = static_cast<unsigned>(
                             this_._internal_message_type_size());
         i < n; i++) {
      const auto& repfield = this_._internal_message_type().Get(i);
      target =
          ::google::protobuf::internal::WireFormatLite::InternalWriteMessage(
              4, repfield, repfield.GetCachedSize(),
              target, stream);
    }
  }

  // repeated .google.protobuf.EnumDescriptorProto enum_type = 5;
  if (CheckHasBitForRepeated(cached_has_bits, 0x00000004U)) {
    for (unsigned i = 0, n = static_cast<unsigned>(
                             this_._internal_enum_type_size());
         i < n; i++) {
      const auto& repfield = this_._internal_enum_type().Get(i);
      target =
          ::google::protobuf::internal::WireFormatLite::InternalWriteMessage(
              5, repfield, repfield.GetCachedSize(),
              target, stream);
    }
  }

  // repeated .google.protobuf.ServiceDescriptorProto service = 6;
  if (CheckHasBitForRepeated(cached_has_bits, 0x00000008U)) {
    for (unsigned i = 0, n = static_cast<unsigned>(
                             this_._internal_service_size());
         i < n; i++) {
      const auto& repfield = this_._internal_service().Get(i);
      target =
          ::google::protobuf::internal::WireFormatLite::InternalWriteMessage(
              6, repfield, repfield.GetCachedSize(),
              target, stream);
    }
  }

  // repeated .google.protobuf.FieldDescriptorProto extension = 7;
  if (CheckHasBitForRepeated(cached_has_bits, 0x00000010U)) {
    for (unsigned i = 0, n = static_cast<unsigned>(
                             this_._internal_extension_size());
         i < n; i++) {
      const auto& repfield = this_._internal_extension().Get(i);
      target =
          ::google::protobuf::internal::WireFormatLite::InternalWriteMessage(
              7, repfield, repfield.GetCachedSize(),
              target, stream);
    }
  }

  // optional .google.protobuf.FileOptions options = 8;
  if (CheckHasBit(cached_has_bits, 0x00000800U)) {
    target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage(
        8, *this_._impl_.options_, this_._impl_.options_->GetCachedSize(), target,
        stream);
  }

  // optional .google.protobuf.SourceCodeInfo source_code_info = 9;
  if (CheckHasBit(cached_has_bits, 0x00001000U)) {
    target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage(
        9, *this_._impl_.source_code_info_, this_._impl_.source_code_info_->GetCachedSize(), target,
        stream);
  }

  // repeated int32 public_dependency = 10;
  if (CheckHasBitForRepeated(cached_has_bits, 0x00000020U)) {
    for (int i = 0, n = this_._internal_public_dependency_size(); i < n; ++i) {
      target = stream->EnsureSpace(target);
      target = ::_pbi::WireFormatLite::WriteInt32ToArray(
          10, this_._internal_public_dependency().Get(i), target);
    }
  }

  // repeated int32 weak_dependency = 11;
  if (CheckHasBitForRepeated(cached_has_bits, 0x00000040U)) {
    for (int i = 0, n = this_._internal_weak_dependency_size(); i < n; ++i) {
      target = stream->EnsureSpace(target);
      target = ::_pbi::WireFormatLite::WriteInt32ToArray(
          11, this_._internal_weak_dependency().Get(i), target);
    }
  }

  // optional string syntax = 12;
  if (CheckHasBit(cached_has_bits, 0x00000400U)) {
    const ::std::string& _s = this_._internal_syntax();
    target = stream->WriteStringMaybeAliased(12, _s, target);
  }

  // optional .google.protobuf.Edition edition = 14;
  if (CheckHasBit(cached_has_bits, 0x00002000U)) {
    target = stream->EnsureSpace(target);
    target = ::_pbi::WireFormatLite::WriteEnumToArray(
        14, this_._internal_edition(), target);
  }

  // repeated string option_dependency = 15;
  if (CheckHasBitForRepeated(cached_has_bits, 0x00000080U)) {
    for (int i = 0, n = this_._internal_option_dependency_size(); i < n; ++i) {
      const auto& s = this_._internal_option_dependency().Get(i);
      target = stream->WriteString(15, s, target);
    }
  }

  if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) {
    target =
        ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray(
            this_._internal_metadata_.unknown_fields<::google::protobuf::UnknownFieldSet>(::google::protobuf::UnknownFieldSet::default_instance), target, stream);
  }
  // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.FileDescriptorProto)
  return target;
}

#if defined(PROTOBUF_CUSTOM_VTABLE)
::size_t FileDescriptorProto::ByteSizeLong(const MessageLite& base) {
  const FileDescriptorProto& this_ = static_cast<const FileDescriptorProto&>(base);
#else   // PROTOBUF_CUSTOM_VTABLE
::size_t FileDescriptorProto::ByteSizeLong() const {
  const FileDescriptorProto& this_ = *this;
#endif  // PROTOBUF_CUSTOM_VTABLE
  // @@protoc_insertion_point(message_byte_size_start:google.protobuf.FileDescriptorProto)
  ::size_t total_size = 0;

  ::uint32_t cached_has_bits = 0;
  // Prevent compiler warnings about cached_has_bits being unused
  (void)cached_has_bits;

  ::_pbi::Prefetch5LinesFrom7Lines(&this_);
  cached_has_bits = this_._impl_._has_bits_[0];
  if (BatchCheckHasBit(cached_has_bits, 0x000000ffU)) {
    // repeated string dependency = 3;
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) {
      total_size +=
          1 * ::google::protobuf::internal::FromIntSize(this_._internal_dependency().size());
      for (int i = 0, n = this_._internal_dependency().size(); i < n; ++i) {
        total_size += ::google::protobuf::internal::WireFormatLite::StringSize(
            this_._internal_dependency().Get(i));
      }
    }
    // repeated .google.protobuf.DescriptorProto message_type = 4;
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000002U)) {
      total_size += 1UL * this_._internal_message_type_size();
      for (const auto& msg : this_._internal_message_type()) {
        total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg);
      }
    }
    // repeated .google.protobuf.EnumDescriptorProto enum_type = 5;
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000004U)) {
      total_size += 1UL * this_._internal_enum_type_size();
      for (const auto& msg : this_._internal_enum_type()) {
        total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg);
      }
    }
    // repeated .google.protobuf.ServiceDescriptorProto service = 6;
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000008U)) {
      total_size += 1UL * this_._internal_service_size();
      for (const auto& msg : this_._internal_service()) {
        total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg);
      }
    }
    // repeated .google.protobuf.FieldDescriptorProto extension = 7;
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000010U)) {
      total_size += 1UL * this_._internal_extension_size();
      for (const auto& msg : this_._internal_extension()) {
        total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg);
      }
    }
    // repeated int32 public_dependency = 10;
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000020U)) {
      ::size_t data_size = ::_pbi::WireFormatLite::Int32Size(
          this_._internal_public_dependency());
      ::size_t tag_size = ::size_t{1} *
          ::_pbi::FromIntSize(this_._internal_public_dependency_size());
      total_size += tag_size + data_size;
    }
    // repeated int32 weak_dependency = 11;
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000040U)) {
      ::size_t data_size = ::_pbi::WireFormatLite::Int32Size(
          this_._internal_weak_dependency());
      ::size_t tag_size = ::size_t{1} *
          ::_pbi::FromIntSize(this_._internal_weak_dependency_size());
      total_size += tag_size + data_size;
    }
    // repeated string option_dependency = 15;
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000080U)) {
      total_size +=
          1 * ::google::protobuf::internal::FromIntSize(this_._internal_option_dependency().size());
      for (int i = 0, n = this_._internal_option_dependency().size(); i < n; ++i) {
        total_size += ::google::protobuf::internal::WireFormatLite::StringSize(
            this_._internal_option_dependency().Get(i));
      }
    }
  }
  if (BatchCheckHasBit(cached_has_bits, 0x00003f00U)) {
    // optional string name = 1;
    if (CheckHasBit(cached_has_bits, 0x00000100U)) {
      total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize(
                                      this_._internal_name());
    }
    // optional string package = 2;
    if (CheckHasBit(cached_has_bits, 0x00000200U)) {
      total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize(
                                      this_._internal_package());
    }
    // optional string syntax = 12;
    if (CheckHasBit(cached_has_bits, 0x00000400U)) {
      total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize(
                                      this_._internal_syntax());
    }
    // optional .google.protobuf.FileOptions options = 8;
    if (CheckHasBit(cached_has_bits, 0x00000800U)) {
      total_size += 1 +
                    ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.options_);
    }
    // optional .google.protobuf.SourceCodeInfo source_code_info = 9;
    if (CheckHasBit(cached_has_bits, 0x00001000U)) {
      total_size += 1 +
                    ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.source_code_info_);
    }
    // optional .google.protobuf.Edition edition = 14;
    if (CheckHasBit(cached_has_bits, 0x00002000U)) {
      total_size += 1 +
                    ::_pbi::WireFormatLite::EnumSize(this_._internal_edition());
    }
  }
  return this_.MaybeComputeUnknownFieldsSize(total_size,
                                             &this_._impl_._cached_size_);
}

void FileDescriptorProto::MergeImpl(::google::protobuf::MessageLite& to_msg,
                            const ::google::protobuf::MessageLite& from_msg) {
   auto* const _this =
      static_cast<FileDescriptorProto*>(&to_msg);
  auto& from = static_cast<const FileDescriptorProto&>(from_msg);
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    from.CheckHasBitConsistency();
  }
  ::google::protobuf::Arena* arena = _this->GetArena();
  // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.FileDescriptorProto)
  ABSL_DCHECK_NE(&from, _this);
  ::uint32_t cached_has_bits = 0;
  (void)cached_has_bits;

  cached_has_bits = from._impl_._has_bits_[0];
  if (BatchCheckHasBit(cached_has_bits, 0x000000ffU)) {
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) {
      _this->_internal_mutable_dependency()->InternalMergeFromWithArena(
          ::google::protobuf::MessageLite::internal_visibility(), arena,
          from._internal_dependency());
    }
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000002U)) {
      _this->_internal_mutable_message_type()->InternalMergeFromWithArena(
          ::google::protobuf::MessageLite::internal_visibility(), arena,
          from._internal_message_type());
    }
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000004U)) {
      _this->_internal_mutable_enum_type()->InternalMergeFromWithArena(
          ::google::protobuf::MessageLite::internal_visibility(), arena,
          from._internal_enum_type());
    }
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000008U)) {
      _this->_internal_mutable_service()->InternalMergeFromWithArena(
          ::google::protobuf::MessageLite::internal_visibility(), arena,
          from._internal_service());
    }
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000010U)) {
      _this->_internal_mutable_extension()->InternalMergeFromWithArena(
          ::google::protobuf::MessageLite::internal_visibility(), arena,
          from._internal_extension());
    }
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000020U)) {
      _this->_internal_mutable_public_dependency()->MergeFrom(from._internal_public_dependency());
    }
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000040U)) {
      _this->_internal_mutable_weak_dependency()->MergeFrom(from._internal_weak_dependency());
    }
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000080U)) {
      _this->_internal_mutable_option_dependency()->InternalMergeFromWithArena(
          ::google::protobuf::MessageLite::internal_visibility(), arena,
          from._internal_option_dependency());
    }
  }
  if (BatchCheckHasBit(cached_has_bits, 0x00003f00U)) {
    if (CheckHasBit(cached_has_bits, 0x00000100U)) {
      _this->_internal_set_name(from._internal_name());
    }
    if (CheckHasBit(cached_has_bits, 0x00000200U)) {
      _this->_internal_set_package(from._internal_package());
    }
    if (CheckHasBit(cached_has_bits, 0x00000400U)) {
      _this->_internal_set_syntax(from._internal_syntax());
    }
    if (CheckHasBit(cached_has_bits, 0x00000800U)) {
      ABSL_DCHECK(from._impl_.options_ != nullptr);
      if (_this->_impl_.options_ == nullptr) {
        _this->_impl_.options_ = ::google::protobuf::Message::CopyConstruct(arena, *from._impl_.options_);
      } else {
        _this->_impl_.options_->MergeFrom(*from._impl_.options_);
      }
    }
    if (CheckHasBit(cached_has_bits, 0x00001000U)) {
      ABSL_DCHECK(from._impl_.source_code_info_ != nullptr);
      if (_this->_impl_.source_code_info_ == nullptr) {
        _this->_impl_.source_code_info_ = ::google::protobuf::Message::CopyConstruct(arena, *from._impl_.source_code_info_);
      } else {
        _this->_impl_.source_code_info_->MergeFrom(*from._impl_.source_code_info_);
      }
    }
    if (CheckHasBit(cached_has_bits, 0x00002000U)) {
      _this->_impl_.edition_ = from._impl_.edition_;
    }
  }
  _this->_impl_._has_bits_[0] |= cached_has_bits;
  _this->_internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(
      from._internal_metadata_);
}

void FileDescriptorProto::CopyFrom(const FileDescriptorProto& from) {
  // @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.FileDescriptorProto)
  if (&from == this) return;
  Clear();
  MergeFrom(from);
}

PROTOBUF_NOINLINE bool FileDescriptorProto::IsInitializedImpl(
    const MessageLite& msg) {
  auto& this_ = static_cast<const FileDescriptorProto&>(msg);
  if (!::google::protobuf::internal::AllAreInitialized(this_._internal_message_type()))
    return false;
  if (!::google::protobuf::internal::AllAreInitialized(this_._internal_enum_type()))
    return false;
  if (!::google::protobuf::internal::AllAreInitialized(this_._internal_service()))
    return false;
  if (!::google::protobuf::internal::AllAreInitialized(this_._internal_extension()))
    return false;
  if (CheckHasBit(this_._impl_._has_bits_[0], 0x00000800U)) {
    if (!this_._impl_.options_->IsInitialized()) return false;
  }
  if (CheckHasBit(this_._impl_._has_bits_[0], 0x00001000U)) {
    if (!this_._impl_.source_code_info_->IsInitialized()) return false;
  }
  return true;
}

void FileDescriptorProto::InternalSwap(FileDescriptorProto* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) {
  using ::std::swap;
  auto* arena = GetArena();
  ABSL_DCHECK_EQ(arena, other->GetArena());
  _internal_metadata_.InternalSwap(&other->_internal_metadata_);
  swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]);
  _impl_.dependency_.InternalSwap(&other->_impl_.dependency_);
  _impl_.message_type_.InternalSwap(&other->_impl_.message_type_);
  _impl_.enum_type_.InternalSwap(&other->_impl_.enum_type_);
  _impl_.service_.InternalSwap(&other->_impl_.service_);
  _impl_.extension_.InternalSwap(&other->_impl_.extension_);
  _impl_.public_dependency_.InternalSwap(&other->_impl_.public_dependency_);
  _impl_.weak_dependency_.InternalSwap(&other->_impl_.weak_dependency_);
  _impl_.option_dependency_.InternalSwap(&other->_impl_.option_dependency_);
  ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.name_, &other->_impl_.name_, arena);
  ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.package_, &other->_impl_.package_, arena);
  ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.syntax_, &other->_impl_.syntax_, arena);
  ::google::protobuf::internal::memswap<
      PROTOBUF_FIELD_OFFSET(FileDescriptorProto, _impl_.edition_)
      + sizeof(FileDescriptorProto::_impl_.edition_)
      - PROTOBUF_FIELD_OFFSET(FileDescriptorProto, _impl_.options_)>(
          reinterpret_cast<char*>(&_impl_.options_),
          reinterpret_cast<char*>(&other->_impl_.options_));
}

::google::protobuf::Metadata FileDescriptorProto::GetMetadata() const {
  return ::google::protobuf::Message::GetMetadataImpl(GetClassData()->full());
}
// ===================================================================

class DescriptorProto_ExtensionRange::_Internal {
 public:
  using HasBits =
      decltype(::std::declval<DescriptorProto_ExtensionRange>()._impl_._has_bits_);
  static constexpr ::int32_t kHasBitsOffset =
      8 * PROTOBUF_FIELD_OFFSET(DescriptorProto_ExtensionRange, _impl_._has_bits_);
};

DescriptorProto_ExtensionRange::DescriptorProto_ExtensionRange(::google::protobuf::Arena* PROTOBUF_NULLABLE arena)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(arena, DescriptorProto_ExtensionRange_class_data_.base()) {
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(arena) {
#endif  // PROTOBUF_CUSTOM_VTABLE
  SharedCtor(arena);
  // @@protoc_insertion_point(arena_constructor:google.protobuf.DescriptorProto.ExtensionRange)
}
PROTOBUF_NDEBUG_INLINE DescriptorProto_ExtensionRange::Impl_::Impl_(
    [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility,
    [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from,
    [[maybe_unused]] const ::google::protobuf::DescriptorProto_ExtensionRange& from_msg)
      : _has_bits_{from._has_bits_},
        _cached_size_{0} {}

DescriptorProto_ExtensionRange::DescriptorProto_ExtensionRange(
    ::google::protobuf::Arena* PROTOBUF_NULLABLE arena,
    const DescriptorProto_ExtensionRange& from)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(arena, DescriptorProto_ExtensionRange_class_data_.base()) {
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(arena) {
#endif  // PROTOBUF_CUSTOM_VTABLE
  DescriptorProto_ExtensionRange* const _this = this;
  (void)_this;
  _internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(
      from._internal_metadata_);
  new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from);
  ::uint32_t cached_has_bits = _impl_._has_bits_[0];
  _impl_.options_ = (CheckHasBit(cached_has_bits, 0x00000001U))
                ? ::google::protobuf::Message::CopyConstruct(arena, *from._impl_.options_)
                : nullptr;
  ::memcpy(reinterpret_cast<char*>(&_impl_) +
               offsetof(Impl_, start_),
           reinterpret_cast<const char*>(&from._impl_) +
               offsetof(Impl_, start_),
           offsetof(Impl_, end_) -
               offsetof(Impl_, start_) +
               sizeof(Impl_::end_));

  // @@protoc_insertion_point(copy_constructor:google.protobuf.DescriptorProto.ExtensionRange)
}
PROTOBUF_NDEBUG_INLINE DescriptorProto_ExtensionRange::Impl_::Impl_(
    [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility,
    [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena)
      : _cached_size_{0} {}

inline void DescriptorProto_ExtensionRange::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) {
  new (&_impl_) Impl_(internal_visibility(), arena);
  ::memset(reinterpret_cast<char*>(&_impl_) +
               offsetof(Impl_, options_),
           0,
           offsetof(Impl_, end_) -
               offsetof(Impl_, options_) +
               sizeof(Impl_::end_));
}
DescriptorProto_ExtensionRange::~DescriptorProto_ExtensionRange() {
  // @@protoc_insertion_point(destructor:google.protobuf.DescriptorProto.ExtensionRange)
  SharedDtor(*this);
}
inline void DescriptorProto_ExtensionRange::SharedDtor(MessageLite& self) {
  DescriptorProto_ExtensionRange& this_ = static_cast<DescriptorProto_ExtensionRange&>(self);
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    this_.CheckHasBitConsistency();
  }
  this_._internal_metadata_.Delete<::google::protobuf::UnknownFieldSet>();
  ABSL_DCHECK(this_.GetArena() == nullptr);
  delete this_._impl_.options_;
  this_._impl_.~Impl_();
}

inline void* PROTOBUF_NONNULL DescriptorProto_ExtensionRange::PlacementNew_(
    const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem,
    ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) {
  return ::new (mem) DescriptorProto_ExtensionRange(arena);
}
constexpr auto DescriptorProto_ExtensionRange::InternalNewImpl_() {
  return ::google::protobuf::internal::MessageCreator::ZeroInit(sizeof(DescriptorProto_ExtensionRange),
                                            alignof(DescriptorProto_ExtensionRange));
}
constexpr auto DescriptorProto_ExtensionRange::InternalGenerateClassData_() {
  return ::google::protobuf::internal::ClassDataFull{
      ::google::protobuf::internal::ClassData{
          &_DescriptorProto_ExtensionRange_default_instance_._instance,
          &_table_.header,
          nullptr,  // OnDemandRegisterArenaDtor
          DescriptorProto_ExtensionRange::IsInitializedImpl,
          &DescriptorProto_ExtensionRange::MergeImpl,
          ::google::protobuf::Message::GetNewImpl<DescriptorProto_ExtensionRange>(),
#if defined(PROTOBUF_CUSTOM_VTABLE)
          &DescriptorProto_ExtensionRange::SharedDtor,
          ::google::protobuf::Message::GetClearImpl<DescriptorProto_ExtensionRange>(), &DescriptorProto_ExtensionRange::ByteSizeLong,
              &DescriptorProto_ExtensionRange::_InternalSerialize,
#endif  // PROTOBUF_CUSTOM_VTABLE
          PROTOBUF_FIELD_OFFSET(DescriptorProto_ExtensionRange, _impl_._cached_size_),
          false,
      },
      &DescriptorProto_ExtensionRange::kDescriptorMethods,
      &descriptor_table_google_2fprotobuf_2fdescriptor_2eproto,
      nullptr,  // tracker
  };
}

PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 const
    ::google::protobuf::internal::ClassDataFull DescriptorProto_ExtensionRange_class_data_ =
        DescriptorProto_ExtensionRange::InternalGenerateClassData_();

PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL
DescriptorProto_ExtensionRange::GetClassData() const {
  ::google::protobuf::internal::PrefetchToLocalCache(&DescriptorProto_ExtensionRange_class_data_);
  ::google::protobuf::internal::PrefetchToLocalCache(DescriptorProto_ExtensionRange_class_data_.tc_table);
  return DescriptorProto_ExtensionRange_class_data_.base();
}
constexpr ::_pbi::TcParseTable<2, 3, 1, 0, 2>
DescriptorProto_ExtensionRange::_table_ = {
  {
    PROTOBUF_FIELD_OFFSET(DescriptorProto_ExtensionRange, _impl_._has_bits_),
    0, // no _extensions_
    3, 24,  // max_field_number, fast_idx_mask
    offsetof(decltype(_table_), field_lookup_table),
    4294967288,  // skipmap
    offsetof(decltype(_table_), field_entries),
    3,  // num_field_entries
    1,  // num_aux_entries
    offsetof(decltype(_table_), aux_entries),
    DescriptorProto_ExtensionRange_class_data_.base(),
    nullptr,  // post_loop_handler
    ::_pbi::TcParser::GenericFallback,  // fallback
    #ifdef PROTOBUF_PREFETCH_PARSE_TABLE
    ::_pbi::TcParser::GetTable<::google::protobuf::DescriptorProto_ExtensionRange>(),  // to_prefetch
    #endif  // PROTOBUF_PREFETCH_PARSE_TABLE
  }, {{
    {::_pbi::TcParser::MiniParse, {}},
    // optional int32 start = 1;
    {::_pbi::TcParser::SingularVarintNoZag1<::uint32_t, offsetof(DescriptorProto_ExtensionRange, _impl_.start_), 1>(),
     {8, 1, 0,
      PROTOBUF_FIELD_OFFSET(DescriptorProto_ExtensionRange, _impl_.start_)}},
    // optional int32 end = 2;
    {::_pbi::TcParser::SingularVarintNoZag1<::uint32_t, offsetof(DescriptorProto_ExtensionRange, _impl_.end_), 2>(),
     {16, 2, 0,
      PROTOBUF_FIELD_OFFSET(DescriptorProto_ExtensionRange, _impl_.end_)}},
    // optional .google.protobuf.ExtensionRangeOptions options = 3;
    {::_pbi::TcParser::FastMtS1,
     {26, 0, 0,
      PROTOBUF_FIELD_OFFSET(DescriptorProto_ExtensionRange, _impl_.options_)}},
  }}, {{
    65535, 65535
  }}, {{
    // optional int32 start = 1;
    {PROTOBUF_FIELD_OFFSET(DescriptorProto_ExtensionRange, _impl_.start_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kInt32)},
    // optional int32 end = 2;
    {PROTOBUF_FIELD_OFFSET(DescriptorProto_ExtensionRange, _impl_.end_), _Internal::kHasBitsOffset + 2, 0, (0 | ::_fl::kFcOptional | ::_fl::kInt32)},
    // optional .google.protobuf.ExtensionRangeOptions options = 3;
    {PROTOBUF_FIELD_OFFSET(DescriptorProto_ExtensionRange, _impl_.options_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)},
  }},
  {{
      {::_pbi::TcParser::GetTable<::google::protobuf::ExtensionRangeOptions>()},
  }},
  {{
  }},
};
PROTOBUF_NOINLINE void DescriptorProto_ExtensionRange::Clear() {
// @@protoc_insertion_point(message_clear_start:google.protobuf.DescriptorProto.ExtensionRange)
  ::google::protobuf::internal::TSanWrite(&_impl_);
  ::uint32_t cached_has_bits = 0;
  // Prevent compiler warnings about cached_has_bits being unused
  (void) cached_has_bits;

  cached_has_bits = _impl_._has_bits_[0];
  if (CheckHasBit(cached_has_bits, 0x00000001U)) {
    ABSL_DCHECK(_impl_.options_ != nullptr);
    _impl_.options_->Clear();
  }
  if (BatchCheckHasBit(cached_has_bits, 0x00000006U)) {
    ::memset(&_impl_.start_, 0, static_cast<::size_t>(
        reinterpret_cast<char*>(&_impl_.end_) -
        reinterpret_cast<char*>(&_impl_.start_)) + sizeof(_impl_.end_));
  }
  _impl_._has_bits_.Clear();
  _internal_metadata_.Clear<::google::protobuf::UnknownFieldSet>();
}

#if defined(PROTOBUF_CUSTOM_VTABLE)
::uint8_t* PROTOBUF_NONNULL DescriptorProto_ExtensionRange::_InternalSerialize(
    const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target,
    ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) {
  const DescriptorProto_ExtensionRange& this_ = static_cast<const DescriptorProto_ExtensionRange&>(base);
#else   // PROTOBUF_CUSTOM_VTABLE
::uint8_t* PROTOBUF_NONNULL DescriptorProto_ExtensionRange::_InternalSerialize(
    ::uint8_t* PROTOBUF_NONNULL target,
    ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const {
  const DescriptorProto_ExtensionRange& this_ = *this;
#endif  // PROTOBUF_CUSTOM_VTABLE
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    this_.CheckHasBitConsistency();
  }
  // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.DescriptorProto.ExtensionRange)
  ::uint32_t cached_has_bits = 0;
  (void)cached_has_bits;

  cached_has_bits = this_._impl_._has_bits_[0];
  // optional int32 start = 1;
  if (CheckHasBit(cached_has_bits, 0x00000002U)) {
    target =
        ::google::protobuf::internal::WireFormatLite::WriteInt32ToArrayWithField<1>(
            stream, this_._internal_start(), target);
  }

  // optional int32 end = 2;
  if (CheckHasBit(cached_has_bits, 0x00000004U)) {
    target =
        ::google::protobuf::internal::WireFormatLite::WriteInt32ToArrayWithField<2>(
            stream, this_._internal_end(), target);
  }

  // optional .google.protobuf.ExtensionRangeOptions options = 3;
  if (CheckHasBit(cached_has_bits, 0x00000001U)) {
    target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage(
        3, *this_._impl_.options_, this_._impl_.options_->GetCachedSize(), target,
        stream);
  }

  if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) {
    target =
        ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray(
            this_._internal_metadata_.unknown_fields<::google::protobuf::UnknownFieldSet>(::google::protobuf::UnknownFieldSet::default_instance), target, stream);
  }
  // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.DescriptorProto.ExtensionRange)
  return target;
}

#if defined(PROTOBUF_CUSTOM_VTABLE)
::size_t DescriptorProto_ExtensionRange::ByteSizeLong(const MessageLite& base) {
  const DescriptorProto_ExtensionRange& this_ = static_cast<const DescriptorProto_ExtensionRange&>(base);
#else   // PROTOBUF_CUSTOM_VTABLE
::size_t DescriptorProto_ExtensionRange::ByteSizeLong() const {
  const DescriptorProto_ExtensionRange& this_ = *this;
#endif  // PROTOBUF_CUSTOM_VTABLE
  // @@protoc_insertion_point(message_byte_size_start:google.protobuf.DescriptorProto.ExtensionRange)
  ::size_t total_size = 0;

  ::uint32_t cached_has_bits = 0;
  // Prevent compiler warnings about cached_has_bits being unused
  (void)cached_has_bits;

  ::_pbi::Prefetch5LinesFrom7Lines(&this_);
  cached_has_bits = this_._impl_._has_bits_[0];
  if (BatchCheckHasBit(cached_has_bits, 0x00000007U)) {
    // optional .google.protobuf.ExtensionRangeOptions options = 3;
    if (CheckHasBit(cached_has_bits, 0x00000001U)) {
      total_size += 1 +
                    ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.options_);
    }
    // optional int32 start = 1;
    if (CheckHasBit(cached_has_bits, 0x00000002U)) {
      total_size += ::_pbi::WireFormatLite::Int32SizePlusOne(
          this_._internal_start());
    }
    // optional int32 end = 2;
    if (CheckHasBit(cached_has_bits, 0x00000004U)) {
      total_size += ::_pbi::WireFormatLite::Int32SizePlusOne(
          this_._internal_end());
    }
  }
  return this_.MaybeComputeUnknownFieldsSize(total_size,
                                             &this_._impl_._cached_size_);
}

void DescriptorProto_ExtensionRange::MergeImpl(::google::protobuf::MessageLite& to_msg,
                            const ::google::protobuf::MessageLite& from_msg) {
   auto* const _this =
      static_cast<DescriptorProto_ExtensionRange*>(&to_msg);
  auto& from = static_cast<const DescriptorProto_ExtensionRange&>(from_msg);
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    from.CheckHasBitConsistency();
  }
  ::google::protobuf::Arena* arena = _this->GetArena();
  // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.DescriptorProto.ExtensionRange)
  ABSL_DCHECK_NE(&from, _this);
  ::uint32_t cached_has_bits = 0;
  (void)cached_has_bits;

  cached_has_bits = from._impl_._has_bits_[0];
  if (BatchCheckHasBit(cached_has_bits, 0x00000007U)) {
    if (CheckHasBit(cached_has_bits, 0x00000001U)) {
      ABSL_DCHECK(from._impl_.options_ != nullptr);
      if (_this->_impl_.options_ == nullptr) {
        _this->_impl_.options_ = ::google::protobuf::Message::CopyConstruct(arena, *from._impl_.options_);
      } else {
        _this->_impl_.options_->MergeFrom(*from._impl_.options_);
      }
    }
    if (CheckHasBit(cached_has_bits, 0x00000002U)) {
      _this->_impl_.start_ = from._impl_.start_;
    }
    if (CheckHasBit(cached_has_bits, 0x00000004U)) {
      _this->_impl_.end_ = from._impl_.end_;
    }
  }
  _this->_impl_._has_bits_[0] |= cached_has_bits;
  _this->_internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(
      from._internal_metadata_);
}

void DescriptorProto_ExtensionRange::CopyFrom(const DescriptorProto_ExtensionRange& from) {
  // @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.DescriptorProto.ExtensionRange)
  if (&from == this) return;
  Clear();
  MergeFrom(from);
}

PROTOBUF_NOINLINE bool DescriptorProto_ExtensionRange::IsInitializedImpl(
    const MessageLite& msg) {
  auto& this_ = static_cast<const DescriptorProto_ExtensionRange&>(msg);
  if (CheckHasBit(this_._impl_._has_bits_[0], 0x00000001U)) {
    if (!this_._impl_.options_->IsInitialized()) return false;
  }
  return true;
}

void DescriptorProto_ExtensionRange::InternalSwap(DescriptorProto_ExtensionRange* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) {
  using ::std::swap;
  _internal_metadata_.InternalSwap(&other->_internal_metadata_);
  swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]);
  ::google::protobuf::internal::memswap<
      PROTOBUF_FIELD_OFFSET(DescriptorProto_ExtensionRange, _impl_.end_)
      + sizeof(DescriptorProto_ExtensionRange::_impl_.end_)
      - PROTOBUF_FIELD_OFFSET(DescriptorProto_ExtensionRange, _impl_.options_)>(
          reinterpret_cast<char*>(&_impl_.options_),
          reinterpret_cast<char*>(&other->_impl_.options_));
}

::google::protobuf::Metadata DescriptorProto_ExtensionRange::GetMetadata() const {
  return ::google::protobuf::Message::GetMetadataImpl(GetClassData()->full());
}
// ===================================================================

class DescriptorProto_ReservedRange::_Internal {
 public:
  using HasBits =
      decltype(::std::declval<DescriptorProto_ReservedRange>()._impl_._has_bits_);
  static constexpr ::int32_t kHasBitsOffset =
      8 * PROTOBUF_FIELD_OFFSET(DescriptorProto_ReservedRange, _impl_._has_bits_);
};

DescriptorProto_ReservedRange::DescriptorProto_ReservedRange(::google::protobuf::Arena* PROTOBUF_NULLABLE arena)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(arena, DescriptorProto_ReservedRange_class_data_.base()) {
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(arena) {
#endif  // PROTOBUF_CUSTOM_VTABLE
  SharedCtor(arena);
  // @@protoc_insertion_point(arena_constructor:google.protobuf.DescriptorProto.ReservedRange)
}
DescriptorProto_ReservedRange::DescriptorProto_ReservedRange(
    ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const DescriptorProto_ReservedRange& from)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(arena, DescriptorProto_ReservedRange_class_data_.base()),
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(arena),
#endif  // PROTOBUF_CUSTOM_VTABLE
      _impl_(from._impl_) {
  _internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(
      from._internal_metadata_);
}
PROTOBUF_NDEBUG_INLINE DescriptorProto_ReservedRange::Impl_::Impl_(
    [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility,
    [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena)
      : _cached_size_{0} {}

inline void DescriptorProto_ReservedRange::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) {
  new (&_impl_) Impl_(internal_visibility(), arena);
  ::memset(reinterpret_cast<char*>(&_impl_) +
               offsetof(Impl_, start_),
           0,
           offsetof(Impl_, end_) -
               offsetof(Impl_, start_) +
               sizeof(Impl_::end_));
}
DescriptorProto_ReservedRange::~DescriptorProto_ReservedRange() {
  // @@protoc_insertion_point(destructor:google.protobuf.DescriptorProto.ReservedRange)
  SharedDtor(*this);
}
inline void DescriptorProto_ReservedRange::SharedDtor(MessageLite& self) {
  DescriptorProto_ReservedRange& this_ = static_cast<DescriptorProto_ReservedRange&>(self);
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    this_.CheckHasBitConsistency();
  }
  this_._internal_metadata_.Delete<::google::protobuf::UnknownFieldSet>();
  ABSL_DCHECK(this_.GetArena() == nullptr);
  this_._impl_.~Impl_();
}

inline void* PROTOBUF_NONNULL DescriptorProto_ReservedRange::PlacementNew_(
    const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem,
    ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) {
  return ::new (mem) DescriptorProto_ReservedRange(arena);
}
constexpr auto DescriptorProto_ReservedRange::InternalNewImpl_() {
  return ::google::protobuf::internal::MessageCreator::ZeroInit(sizeof(DescriptorProto_ReservedRange),
                                            alignof(DescriptorProto_ReservedRange));
}
constexpr auto DescriptorProto_ReservedRange::InternalGenerateClassData_() {
  return ::google::protobuf::internal::ClassDataFull{
      ::google::protobuf::internal::ClassData{
          &_DescriptorProto_ReservedRange_default_instance_._instance,
          &_table_.header,
          nullptr,  // OnDemandRegisterArenaDtor
          nullptr,  // IsInitialized
          &DescriptorProto_ReservedRange::MergeImpl,
          ::google::protobuf::Message::GetNewImpl<DescriptorProto_ReservedRange>(),
#if defined(PROTOBUF_CUSTOM_VTABLE)
          &DescriptorProto_ReservedRange::SharedDtor,
          ::google::protobuf::Message::GetClearImpl<DescriptorProto_ReservedRange>(), &DescriptorProto_ReservedRange::ByteSizeLong,
              &DescriptorProto_ReservedRange::_InternalSerialize,
#endif  // PROTOBUF_CUSTOM_VTABLE
          PROTOBUF_FIELD_OFFSET(DescriptorProto_ReservedRange, _impl_._cached_size_),
          false,
      },
      &DescriptorProto_ReservedRange::kDescriptorMethods,
      &descriptor_table_google_2fprotobuf_2fdescriptor_2eproto,
      nullptr,  // tracker
  };
}

PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 const
    ::google::protobuf::internal::ClassDataFull DescriptorProto_ReservedRange_class_data_ =
        DescriptorProto_ReservedRange::InternalGenerateClassData_();

PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL
DescriptorProto_ReservedRange::GetClassData() const {
  ::google::protobuf::internal::PrefetchToLocalCache(&DescriptorProto_ReservedRange_class_data_);
  ::google::protobuf::internal::PrefetchToLocalCache(DescriptorProto_ReservedRange_class_data_.tc_table);
  return DescriptorProto_ReservedRange_class_data_.base();
}
constexpr ::_pbi::TcParseTable<1, 2, 0, 0, 2>
DescriptorProto_ReservedRange::_table_ = {
  {
    PROTOBUF_FIELD_OFFSET(DescriptorProto_ReservedRange, _impl_._has_bits_),
    0, // no _extensions_
    2, 8,  // max_field_number, fast_idx_mask
    offsetof(decltype(_table_), field_lookup_table),
    4294967292,  // skipmap
    offsetof(decltype(_table_), field_entries),
    2,  // num_field_entries
    0,  // num_aux_entries
    offsetof(decltype(_table_), field_names),  // no aux_entries
    DescriptorProto_ReservedRange_class_data_.base(),
    nullptr,  // post_loop_handler
    ::_pbi::TcParser::GenericFallback,  // fallback
    #ifdef PROTOBUF_PREFETCH_PARSE_TABLE
    ::_pbi::TcParser::GetTable<::google::protobuf::DescriptorProto_ReservedRange>(),  // to_prefetch
    #endif  // PROTOBUF_PREFETCH_PARSE_TABLE
  }, {{
    // optional int32 end = 2;
    {::_pbi::TcParser::SingularVarintNoZag1<::uint32_t, offsetof(DescriptorProto_ReservedRange, _impl_.end_), 1>(),
     {16, 1, 0,
      PROTOBUF_FIELD_OFFSET(DescriptorProto_ReservedRange, _impl_.end_)}},
    // optional int32 start = 1;
    {::_pbi::TcParser::SingularVarintNoZag1<::uint32_t, offsetof(DescriptorProto_ReservedRange, _impl_.start_), 0>(),
     {8, 0, 0,
      PROTOBUF_FIELD_OFFSET(DescriptorProto_ReservedRange, _impl_.start_)}},
  }}, {{
    65535, 65535
  }}, {{
    // optional int32 start = 1;
    {PROTOBUF_FIELD_OFFSET(DescriptorProto_ReservedRange, _impl_.start_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcOptional | ::_fl::kInt32)},
    // optional int32 end = 2;
    {PROTOBUF_FIELD_OFFSET(DescriptorProto_ReservedRange, _impl_.end_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kInt32)},
  }},
  // no aux_entries
  {{
  }},
};
PROTOBUF_NOINLINE void DescriptorProto_ReservedRange::Clear() {
// @@protoc_insertion_point(message_clear_start:google.protobuf.DescriptorProto.ReservedRange)
  ::google::protobuf::internal::TSanWrite(&_impl_);
  ::uint32_t cached_has_bits = 0;
  // Prevent compiler warnings about cached_has_bits being unused
  (void) cached_has_bits;

  cached_has_bits = _impl_._has_bits_[0];
  if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) {
    ::memset(&_impl_.start_, 0, static_cast<::size_t>(
        reinterpret_cast<char*>(&_impl_.end_) -
        reinterpret_cast<char*>(&_impl_.start_)) + sizeof(_impl_.end_));
  }
  _impl_._has_bits_.Clear();
  _internal_metadata_.Clear<::google::protobuf::UnknownFieldSet>();
}

#if defined(PROTOBUF_CUSTOM_VTABLE)
::uint8_t* PROTOBUF_NONNULL DescriptorProto_ReservedRange::_InternalSerialize(
    const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target,
    ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) {
  const DescriptorProto_ReservedRange& this_ = static_cast<const DescriptorProto_ReservedRange&>(base);
#else   // PROTOBUF_CUSTOM_VTABLE
::uint8_t* PROTOBUF_NONNULL DescriptorProto_ReservedRange::_InternalSerialize(
    ::uint8_t* PROTOBUF_NONNULL target,
    ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const {
  const DescriptorProto_ReservedRange& this_ = *this;
#endif  // PROTOBUF_CUSTOM_VTABLE
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    this_.CheckHasBitConsistency();
  }
  // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.DescriptorProto.ReservedRange)
  ::uint32_t cached_has_bits = 0;
  (void)cached_has_bits;

  cached_has_bits = this_._impl_._has_bits_[0];
  // optional int32 start = 1;
  if (CheckHasBit(cached_has_bits, 0x00000001U)) {
    target =
        ::google::protobuf::internal::WireFormatLite::WriteInt32ToArrayWithField<1>(
            stream, this_._internal_start(), target);
  }

  // optional int32 end = 2;
  if (CheckHasBit(cached_has_bits, 0x00000002U)) {
    target =
        ::google::protobuf::internal::WireFormatLite::WriteInt32ToArrayWithField<2>(
            stream, this_._internal_end(), target);
  }

  if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) {
    target =
        ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray(
            this_._internal_metadata_.unknown_fields<::google::protobuf::UnknownFieldSet>(::google::protobuf::UnknownFieldSet::default_instance), target, stream);
  }
  // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.DescriptorProto.ReservedRange)
  return target;
}

#if defined(PROTOBUF_CUSTOM_VTABLE)
::size_t DescriptorProto_ReservedRange::ByteSizeLong(const MessageLite& base) {
  const DescriptorProto_ReservedRange& this_ = static_cast<const DescriptorProto_ReservedRange&>(base);
#else   // PROTOBUF_CUSTOM_VTABLE
::size_t DescriptorProto_ReservedRange::ByteSizeLong() const {
  const DescriptorProto_ReservedRange& this_ = *this;
#endif  // PROTOBUF_CUSTOM_VTABLE
  // @@protoc_insertion_point(message_byte_size_start:google.protobuf.DescriptorProto.ReservedRange)
  ::size_t total_size = 0;

  ::uint32_t cached_has_bits = 0;
  // Prevent compiler warnings about cached_has_bits being unused
  (void)cached_has_bits;

  ::_pbi::Prefetch5LinesFrom7Lines(&this_);
  cached_has_bits = this_._impl_._has_bits_[0];
  if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) {
    // optional int32 start = 1;
    if (CheckHasBit(cached_has_bits, 0x00000001U)) {
      total_size += ::_pbi::WireFormatLite::Int32SizePlusOne(
          this_._internal_start());
    }
    // optional int32 end = 2;
    if (CheckHasBit(cached_has_bits, 0x00000002U)) {
      total_size += ::_pbi::WireFormatLite::Int32SizePlusOne(
          this_._internal_end());
    }
  }
  return this_.MaybeComputeUnknownFieldsSize(total_size,
                                             &this_._impl_._cached_size_);
}

void DescriptorProto_ReservedRange::MergeImpl(::google::protobuf::MessageLite& to_msg,
                            const ::google::protobuf::MessageLite& from_msg) {
   auto* const _this =
      static_cast<DescriptorProto_ReservedRange*>(&to_msg);
  auto& from = static_cast<const DescriptorProto_ReservedRange&>(from_msg);
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    from.CheckHasBitConsistency();
  }
  // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.DescriptorProto.ReservedRange)
  ABSL_DCHECK_NE(&from, _this);
  ::uint32_t cached_has_bits = 0;
  (void)cached_has_bits;

  cached_has_bits = from._impl_._has_bits_[0];
  if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) {
    if (CheckHasBit(cached_has_bits, 0x00000001U)) {
      _this->_impl_.start_ = from._impl_.start_;
    }
    if (CheckHasBit(cached_has_bits, 0x00000002U)) {
      _this->_impl_.end_ = from._impl_.end_;
    }
  }
  _this->_impl_._has_bits_[0] |= cached_has_bits;
  _this->_internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(
      from._internal_metadata_);
}

void DescriptorProto_ReservedRange::CopyFrom(const DescriptorProto_ReservedRange& from) {
  // @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.DescriptorProto.ReservedRange)
  if (&from == this) return;
  Clear();
  MergeFrom(from);
}


void DescriptorProto_ReservedRange::InternalSwap(DescriptorProto_ReservedRange* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) {
  using ::std::swap;
  _internal_metadata_.InternalSwap(&other->_internal_metadata_);
  swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]);
  ::google::protobuf::internal::memswap<
      PROTOBUF_FIELD_OFFSET(DescriptorProto_ReservedRange, _impl_.end_)
      + sizeof(DescriptorProto_ReservedRange::_impl_.end_)
      - PROTOBUF_FIELD_OFFSET(DescriptorProto_ReservedRange, _impl_.start_)>(
          reinterpret_cast<char*>(&_impl_.start_),
          reinterpret_cast<char*>(&other->_impl_.start_));
}

::google::protobuf::Metadata DescriptorProto_ReservedRange::GetMetadata() const {
  return ::google::protobuf::Message::GetMetadataImpl(GetClassData()->full());
}
// ===================================================================

class DescriptorProto::_Internal {
 public:
  using HasBits =
      decltype(::std::declval<DescriptorProto>()._impl_._has_bits_);
  static constexpr ::int32_t kHasBitsOffset =
      8 * PROTOBUF_FIELD_OFFSET(DescriptorProto, _impl_._has_bits_);
};

DescriptorProto::DescriptorProto(::google::protobuf::Arena* PROTOBUF_NULLABLE arena)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(arena, DescriptorProto_class_data_.base()) {
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(arena) {
#endif  // PROTOBUF_CUSTOM_VTABLE
  SharedCtor(arena);
  // @@protoc_insertion_point(arena_constructor:google.protobuf.DescriptorProto)
}
PROTOBUF_NDEBUG_INLINE DescriptorProto::Impl_::Impl_(
    [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility,
    [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from,
    [[maybe_unused]] const ::google::protobuf::DescriptorProto& from_msg)
      : _has_bits_{from._has_bits_},
        _cached_size_{0},
        field_{visibility, arena, from.field_},
        nested_type_{visibility, arena, from.nested_type_},
        enum_type_{visibility, arena, from.enum_type_},
        extension_range_{visibility, arena, from.extension_range_},
        extension_{visibility, arena, from.extension_},
        oneof_decl_{visibility, arena, from.oneof_decl_},
        reserved_range_{visibility, arena, from.reserved_range_},
        reserved_name_{visibility, arena, from.reserved_name_},
        name_(arena, from.name_) {}

DescriptorProto::DescriptorProto(
    ::google::protobuf::Arena* PROTOBUF_NULLABLE arena,
    const DescriptorProto& from)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(arena, DescriptorProto_class_data_.base()) {
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(arena) {
#endif  // PROTOBUF_CUSTOM_VTABLE
  DescriptorProto* const _this = this;
  (void)_this;
  _internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(
      from._internal_metadata_);
  new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from);
  ::uint32_t cached_has_bits = _impl_._has_bits_[0];
  _impl_.options_ = (CheckHasBit(cached_has_bits, 0x00000200U))
                ? ::google::protobuf::Message::CopyConstruct(arena, *from._impl_.options_)
                : nullptr;
  _impl_.visibility_ = from._impl_.visibility_;

  // @@protoc_insertion_point(copy_constructor:google.protobuf.DescriptorProto)
}
PROTOBUF_NDEBUG_INLINE DescriptorProto::Impl_::Impl_(
    [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility,
    [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena)
      : _cached_size_{0},
        field_{visibility, arena},
        nested_type_{visibility, arena},
        enum_type_{visibility, arena},
        extension_range_{visibility, arena},
        extension_{visibility, arena},
        oneof_decl_{visibility, arena},
        reserved_range_{visibility, arena},
        reserved_name_{visibility, arena},
        name_(arena) {}

inline void DescriptorProto::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) {
  new (&_impl_) Impl_(internal_visibility(), arena);
  ::memset(reinterpret_cast<char*>(&_impl_) +
               offsetof(Impl_, options_),
           0,
           offsetof(Impl_, visibility_) -
               offsetof(Impl_, options_) +
               sizeof(Impl_::visibility_));
}
DescriptorProto::~DescriptorProto() {
  // @@protoc_insertion_point(destructor:google.protobuf.DescriptorProto)
  SharedDtor(*this);
}
inline void DescriptorProto::SharedDtor(MessageLite& self) {
  DescriptorProto& this_ = static_cast<DescriptorProto&>(self);
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    this_.CheckHasBitConsistency();
  }
  this_._internal_metadata_.Delete<::google::protobuf::UnknownFieldSet>();
  ABSL_DCHECK(this_.GetArena() == nullptr);
  this_._impl_.name_.Destroy();
  delete this_._impl_.options_;
  this_._impl_.~Impl_();
}

inline void* PROTOBUF_NONNULL DescriptorProto::PlacementNew_(
    const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem,
    ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) {
  return ::new (mem) DescriptorProto(arena);
}
constexpr auto DescriptorProto::InternalNewImpl_() {
  constexpr auto arena_bits = ::google::protobuf::internal::EncodePlacementArenaOffsets({
      PROTOBUF_FIELD_OFFSET(DescriptorProto, _impl_.field_) +
          decltype(DescriptorProto::_impl_.field_)::
              InternalGetArenaOffset(
                  ::google::protobuf::Message::internal_visibility()),
      PROTOBUF_FIELD_OFFSET(DescriptorProto, _impl_.extension_) +
          decltype(DescriptorProto::_impl_.extension_)::
              InternalGetArenaOffset(
                  ::google::protobuf::Message::internal_visibility()),
      PROTOBUF_FIELD_OFFSET(DescriptorProto, _impl_.nested_type_) +
          decltype(DescriptorProto::_impl_.nested_type_)::
              InternalGetArenaOffset(
                  ::google::protobuf::Message::internal_visibility()),
      PROTOBUF_FIELD_OFFSET(DescriptorProto, _impl_.enum_type_) +
          decltype(DescriptorProto::_impl_.enum_type_)::
              InternalGetArenaOffset(
                  ::google::protobuf::Message::internal_visibility()),
      PROTOBUF_FIELD_OFFSET(DescriptorProto, _impl_.extension_range_) +
          decltype(DescriptorProto::_impl_.extension_range_)::
              InternalGetArenaOffset(
                  ::google::protobuf::Message::internal_visibility()),
      PROTOBUF_FIELD_OFFSET(DescriptorProto, _impl_.oneof_decl_) +
          decltype(DescriptorProto::_impl_.oneof_decl_)::
              InternalGetArenaOffset(
                  ::google::protobuf::Message::internal_visibility()),
      PROTOBUF_FIELD_OFFSET(DescriptorProto, _impl_.reserved_range_) +
          decltype(DescriptorProto::_impl_.reserved_range_)::
              InternalGetArenaOffset(
                  ::google::protobuf::Message::internal_visibility()),
      PROTOBUF_FIELD_OFFSET(DescriptorProto, _impl_.reserved_name_) +
          decltype(DescriptorProto::_impl_.reserved_name_)::
              InternalGetArenaOffset(
                  ::google::protobuf::Message::internal_visibility()),
  });
  if (arena_bits.has_value()) {
    return ::google::protobuf::internal::MessageCreator::CopyInit(
        sizeof(DescriptorProto), alignof(DescriptorProto), *arena_bits);
  } else {
    return ::google::protobuf::internal::MessageCreator(&DescriptorProto::PlacementNew_,
                                 sizeof(DescriptorProto),
                                 alignof(DescriptorProto));
  }
}
constexpr auto DescriptorProto::InternalGenerateClassData_() {
  return ::google::protobuf::internal::ClassDataFull{
      ::google::protobuf::internal::ClassData{
          &_DescriptorProto_default_instance_._instance,
          &_table_.header,
          nullptr,  // OnDemandRegisterArenaDtor
          DescriptorProto::IsInitializedImpl,
          &DescriptorProto::MergeImpl,
          ::google::protobuf::Message::GetNewImpl<DescriptorProto>(),
#if defined(PROTOBUF_CUSTOM_VTABLE)
          &DescriptorProto::SharedDtor,
          ::google::protobuf::Message::GetClearImpl<DescriptorProto>(), &DescriptorProto::ByteSizeLong,
              &DescriptorProto::_InternalSerialize,
#endif  // PROTOBUF_CUSTOM_VTABLE
          PROTOBUF_FIELD_OFFSET(DescriptorProto, _impl_._cached_size_),
          false,
      },
      &DescriptorProto::kDescriptorMethods,
      &descriptor_table_google_2fprotobuf_2fdescriptor_2eproto,
      nullptr,  // tracker
  };
}

PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 const
    ::google::protobuf::internal::ClassDataFull DescriptorProto_class_data_ =
        DescriptorProto::InternalGenerateClassData_();

PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL
DescriptorProto::GetClassData() const {
  ::google::protobuf::internal::PrefetchToLocalCache(&DescriptorProto_class_data_);
  ::google::protobuf::internal::PrefetchToLocalCache(DescriptorProto_class_data_.tc_table);
  return DescriptorProto_class_data_.base();
}
constexpr ::_pbi::TcParseTable<4, 11, 9, 0, 2>
DescriptorProto::_table_ = {
  {
    PROTOBUF_FIELD_OFFSET(DescriptorProto, _impl_._has_bits_),
    0, // no _extensions_
    11, 120,  // max_field_number, fast_idx_mask
    offsetof(decltype(_table_), field_lookup_table),
    4294965248,  // skipmap
    offsetof(decltype(_table_), field_entries),
    11,  // num_field_entries
    9,  // num_aux_entries
    offsetof(decltype(_table_), aux_entries),
    DescriptorProto_class_data_.base(),
    nullptr,  // post_loop_handler
    ::_pbi::TcParser::GenericFallback,  // fallback
    #ifdef PROTOBUF_PREFETCH_PARSE_TABLE
    ::_pbi::TcParser::GetTable<::google::protobuf::DescriptorProto>(),  // to_prefetch
    #endif  // PROTOBUF_PREFETCH_PARSE_TABLE
  }, {{
    {::_pbi::TcParser::MiniParse, {}},
    // optional string name = 1;
    {::_pbi::TcParser::FastBS1,
     {10, 8, 0,
      PROTOBUF_FIELD_OFFSET(DescriptorProto, _impl_.name_)}},
    // repeated .google.protobuf.FieldDescriptorProto field = 2;
    {::_pbi::TcParser::FastMtR1,
     {18, 0, 0,
      PROTOBUF_FIELD_OFFSET(DescriptorProto, _impl_.field_)}},
    // repeated .google.protobuf.DescriptorProto nested_type = 3;
    {::_pbi::TcParser::FastMtR1,
     {26, 1, 1,
      PROTOBUF_FIELD_OFFSET(DescriptorProto, _impl_.nested_type_)}},
    // repeated .google.protobuf.EnumDescriptorProto enum_type = 4;
    {::_pbi::TcParser::FastMtR1,
     {34, 2, 2,
      PROTOBUF_FIELD_OFFSET(DescriptorProto, _impl_.enum_type_)}},
    // repeated .google.protobuf.DescriptorProto.ExtensionRange extension_range = 5;
    {::_pbi::TcParser::FastMtR1,
     {42, 3, 3,
      PROTOBUF_FIELD_OFFSET(DescriptorProto, _impl_.extension_range_)}},
    // repeated .google.protobuf.FieldDescriptorProto extension = 6;
    {::_pbi::TcParser::FastMtR1,
     {50, 4, 4,
      PROTOBUF_FIELD_OFFSET(DescriptorProto, _impl_.extension_)}},
    // optional .google.protobuf.MessageOptions options = 7;
    {::_pbi::TcParser::FastMtS1,
     {58, 9, 5,
      PROTOBUF_FIELD_OFFSET(DescriptorProto, _impl_.options_)}},
    // repeated .google.protobuf.OneofDescriptorProto oneof_decl = 8;
    {::_pbi::TcParser::FastMtR1,
     {66, 5, 6,
      PROTOBUF_FIELD_OFFSET(DescriptorProto, _impl_.oneof_decl_)}},
    // repeated .google.protobuf.DescriptorProto.ReservedRange reserved_range = 9;
    {::_pbi::TcParser::FastMtR1,
     {74, 6, 7,
      PROTOBUF_FIELD_OFFSET(DescriptorProto, _impl_.reserved_range_)}},
    // repeated string reserved_name = 10;
    {::_pbi::TcParser::FastBR1,
     {82, 7, 0,
      PROTOBUF_FIELD_OFFSET(DescriptorProto, _impl_.reserved_name_)}},
    // optional .google.protobuf.SymbolVisibility visibility = 11;
    {::_pbi::TcParser::FastEr0S1,
     {88, 10, 2,
      PROTOBUF_FIELD_OFFSET(DescriptorProto, _impl_.visibility_)}},
    {::_pbi::TcParser::MiniParse, {}},
    {::_pbi::TcParser::MiniParse, {}},
    {::_pbi::TcParser::MiniParse, {}},
    {::_pbi::TcParser::MiniParse, {}},
  }}, {{
    65535, 65535
  }}, {{
    // optional string name = 1;
    {PROTOBUF_FIELD_OFFSET(DescriptorProto, _impl_.name_), _Internal::kHasBitsOffset + 8, 0, (0 | ::_fl::kFcOptional | ::_fl::kBytes | ::_fl::kRepAString)},
    // repeated .google.protobuf.FieldDescriptorProto field = 2;
    {PROTOBUF_FIELD_OFFSET(DescriptorProto, _impl_.field_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)},
    // repeated .google.protobuf.DescriptorProto nested_type = 3;
    {PROTOBUF_FIELD_OFFSET(DescriptorProto, _impl_.nested_type_), _Internal::kHasBitsOffset + 1, 1, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)},
    // repeated .google.protobuf.EnumDescriptorProto enum_type = 4;
    {PROTOBUF_FIELD_OFFSET(DescriptorProto, _impl_.enum_type_), _Internal::kHasBitsOffset + 2, 2, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)},
    // repeated .google.protobuf.DescriptorProto.ExtensionRange extension_range = 5;
    {PROTOBUF_FIELD_OFFSET(DescriptorProto, _impl_.extension_range_), _Internal::kHasBitsOffset + 3, 3, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)},
    // repeated .google.protobuf.FieldDescriptorProto extension = 6;
    {PROTOBUF_FIELD_OFFSET(DescriptorProto, _impl_.extension_), _Internal::kHasBitsOffset + 4, 4, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)},
    // optional .google.protobuf.MessageOptions options = 7;
    {PROTOBUF_FIELD_OFFSET(DescriptorProto, _impl_.options_), _Internal::kHasBitsOffset + 9, 5, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)},
    // repeated .google.protobuf.OneofDescriptorProto oneof_decl = 8;
    {PROTOBUF_FIELD_OFFSET(DescriptorProto, _impl_.oneof_decl_), _Internal::kHasBitsOffset + 5, 6, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)},
    // repeated .google.protobuf.DescriptorProto.ReservedRange reserved_range = 9;
    {PROTOBUF_FIELD_OFFSET(DescriptorProto, _impl_.reserved_range_), _Internal::kHasBitsOffset + 6, 7, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)},
    // repeated string reserved_name = 10;
    {PROTOBUF_FIELD_OFFSET(DescriptorProto, _impl_.reserved_name_), _Internal::kHasBitsOffset + 7, 0, (0 | ::_fl::kFcRepeated | ::_fl::kBytes | ::_fl::kRepSString)},
    // optional .google.protobuf.SymbolVisibility visibility = 11;
    {PROTOBUF_FIELD_OFFSET(DescriptorProto, _impl_.visibility_), _Internal::kHasBitsOffset + 10, 8, (0 | ::_fl::kFcOptional | ::_fl::kEnumRange)},
  }},
  {{
      {::_pbi::TcParser::GetTable<::google::protobuf::FieldDescriptorProto>()},
      {::_pbi::TcParser::GetTable<::google::protobuf::DescriptorProto>()},
      {::_pbi::TcParser::GetTable<::google::protobuf::EnumDescriptorProto>()},
      {::_pbi::TcParser::GetTable<::google::protobuf::DescriptorProto_ExtensionRange>()},
      {::_pbi::TcParser::GetTable<::google::protobuf::FieldDescriptorProto>()},
      {::_pbi::TcParser::GetTable<::google::protobuf::MessageOptions>()},
      {::_pbi::TcParser::GetTable<::google::protobuf::OneofDescriptorProto>()},
      {::_pbi::TcParser::GetTable<::google::protobuf::DescriptorProto_ReservedRange>()},
      {0, 2},
  }},
  {{
  }},
};
PROTOBUF_NOINLINE void DescriptorProto::Clear() {
// @@protoc_insertion_point(message_clear_start:google.protobuf.DescriptorProto)
  ::google::protobuf::internal::TSanWrite(&_impl_);
  ::uint32_t cached_has_bits = 0;
  // Prevent compiler warnings about cached_has_bits being unused
  (void) cached_has_bits;

  cached_has_bits = _impl_._has_bits_[0];
  if (BatchCheckHasBit(cached_has_bits, 0x000000ffU)) {
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) {
      _impl_.field_.Clear();
    }
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000002U)) {
      _impl_.nested_type_.Clear();
    }
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000004U)) {
      _impl_.enum_type_.Clear();
    }
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000008U)) {
      _impl_.extension_range_.Clear();
    }
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000010U)) {
      _impl_.extension_.Clear();
    }
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000020U)) {
      _impl_.oneof_decl_.Clear();
    }
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000040U)) {
      _impl_.reserved_range_.Clear();
    }
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000080U)) {
      _impl_.reserved_name_.Clear();
    }
  }
  if (BatchCheckHasBit(cached_has_bits, 0x00000300U)) {
    if (CheckHasBit(cached_has_bits, 0x00000100U)) {
      _impl_.name_.ClearNonDefaultToEmpty();
    }
    if (CheckHasBit(cached_has_bits, 0x00000200U)) {
      ABSL_DCHECK(_impl_.options_ != nullptr);
      _impl_.options_->Clear();
    }
  }
  _impl_.visibility_ = 0;
  _impl_._has_bits_.Clear();
  _internal_metadata_.Clear<::google::protobuf::UnknownFieldSet>();
}

#if defined(PROTOBUF_CUSTOM_VTABLE)
::uint8_t* PROTOBUF_NONNULL DescriptorProto::_InternalSerialize(
    const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target,
    ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) {
  const DescriptorProto& this_ = static_cast<const DescriptorProto&>(base);
#else   // PROTOBUF_CUSTOM_VTABLE
::uint8_t* PROTOBUF_NONNULL DescriptorProto::_InternalSerialize(
    ::uint8_t* PROTOBUF_NONNULL target,
    ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const {
  const DescriptorProto& this_ = *this;
#endif  // PROTOBUF_CUSTOM_VTABLE
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    this_.CheckHasBitConsistency();
  }
  // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.DescriptorProto)
  ::uint32_t cached_has_bits = 0;
  (void)cached_has_bits;

  cached_has_bits = this_._impl_._has_bits_[0];
  // optional string name = 1;
  if (CheckHasBit(cached_has_bits, 0x00000100U)) {
    const ::std::string& _s = this_._internal_name();
    target = stream->WriteStringMaybeAliased(1, _s, target);
  }

  // repeated .google.protobuf.FieldDescriptorProto field = 2;
  if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) {
    for (unsigned i = 0, n = static_cast<unsigned>(
                             this_._internal_field_size());
         i < n; i++) {
      const auto& repfield = this_._internal_field().Get(i);
      target =
          ::google::protobuf::internal::WireFormatLite::InternalWriteMessage(
              2, repfield, repfield.GetCachedSize(),
              target, stream);
    }
  }

  // repeated .google.protobuf.DescriptorProto nested_type = 3;
  if (CheckHasBitForRepeated(cached_has_bits, 0x00000002U)) {
    for (unsigned i = 0, n = static_cast<unsigned>(
                             this_._internal_nested_type_size());
         i < n; i++) {
      const auto& repfield = this_._internal_nested_type().Get(i);
      target =
          ::google::protobuf::internal::WireFormatLite::InternalWriteMessage(
              3, repfield, repfield.GetCachedSize(),
              target, stream);
    }
  }

  // repeated .google.protobuf.EnumDescriptorProto enum_type = 4;
  if (CheckHasBitForRepeated(cached_has_bits, 0x00000004U)) {
    for (unsigned i = 0, n = static_cast<unsigned>(
                             this_._internal_enum_type_size());
         i < n; i++) {
      const auto& repfield = this_._internal_enum_type().Get(i);
      target =
          ::google::protobuf::internal::WireFormatLite::InternalWriteMessage(
              4, repfield, repfield.GetCachedSize(),
              target, stream);
    }
  }

  // repeated .google.protobuf.DescriptorProto.ExtensionRange extension_range = 5;
  if (CheckHasBitForRepeated(cached_has_bits, 0x00000008U)) {
    for (unsigned i = 0, n = static_cast<unsigned>(
                             this_._internal_extension_range_size());
         i < n; i++) {
      const auto& repfield = this_._internal_extension_range().Get(i);
      target =
          ::google::protobuf::internal::WireFormatLite::InternalWriteMessage(
              5, repfield, repfield.GetCachedSize(),
              target, stream);
    }
  }

  // repeated .google.protobuf.FieldDescriptorProto extension = 6;
  if (CheckHasBitForRepeated(cached_has_bits, 0x00000010U)) {
    for (unsigned i = 0, n = static_cast<unsigned>(
                             this_._internal_extension_size());
         i < n; i++) {
      const auto& repfield = this_._internal_extension().Get(i);
      target =
          ::google::protobuf::internal::WireFormatLite::InternalWriteMessage(
              6, repfield, repfield.GetCachedSize(),
              target, stream);
    }
  }

  // optional .google.protobuf.MessageOptions options = 7;
  if (CheckHasBit(cached_has_bits, 0x00000200U)) {
    target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage(
        7, *this_._impl_.options_, this_._impl_.options_->GetCachedSize(), target,
        stream);
  }

  // repeated .google.protobuf.OneofDescriptorProto oneof_decl = 8;
  if (CheckHasBitForRepeated(cached_has_bits, 0x00000020U)) {
    for (unsigned i = 0, n = static_cast<unsigned>(
                             this_._internal_oneof_decl_size());
         i < n; i++) {
      const auto& repfield = this_._internal_oneof_decl().Get(i);
      target =
          ::google::protobuf::internal::WireFormatLite::InternalWriteMessage(
              8, repfield, repfield.GetCachedSize(),
              target, stream);
    }
  }

  // repeated .google.protobuf.DescriptorProto.ReservedRange reserved_range = 9;
  if (CheckHasBitForRepeated(cached_has_bits, 0x00000040U)) {
    for (unsigned i = 0, n = static_cast<unsigned>(
                             this_._internal_reserved_range_size());
         i < n; i++) {
      const auto& repfield = this_._internal_reserved_range().Get(i);
      target =
          ::google::protobuf::internal::WireFormatLite::InternalWriteMessage(
              9, repfield, repfield.GetCachedSize(),
              target, stream);
    }
  }

  // repeated string reserved_name = 10;
  if (CheckHasBitForRepeated(cached_has_bits, 0x00000080U)) {
    for (int i = 0, n = this_._internal_reserved_name_size(); i < n; ++i) {
      const auto& s = this_._internal_reserved_name().Get(i);
      target = stream->WriteString(10, s, target);
    }
  }

  // optional .google.protobuf.SymbolVisibility visibility = 11;
  if (CheckHasBit(cached_has_bits, 0x00000400U)) {
    target = stream->EnsureSpace(target);
    target = ::_pbi::WireFormatLite::WriteEnumToArray(
        11, this_._internal_visibility(), target);
  }

  if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) {
    target =
        ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray(
            this_._internal_metadata_.unknown_fields<::google::protobuf::UnknownFieldSet>(::google::protobuf::UnknownFieldSet::default_instance), target, stream);
  }
  // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.DescriptorProto)
  return target;
}

#if defined(PROTOBUF_CUSTOM_VTABLE)
::size_t DescriptorProto::ByteSizeLong(const MessageLite& base) {
  const DescriptorProto& this_ = static_cast<const DescriptorProto&>(base);
#else   // PROTOBUF_CUSTOM_VTABLE
::size_t DescriptorProto::ByteSizeLong() const {
  const DescriptorProto& this_ = *this;
#endif  // PROTOBUF_CUSTOM_VTABLE
  // @@protoc_insertion_point(message_byte_size_start:google.protobuf.DescriptorProto)
  ::size_t total_size = 0;

  ::uint32_t cached_has_bits = 0;
  // Prevent compiler warnings about cached_has_bits being unused
  (void)cached_has_bits;

  ::_pbi::Prefetch5LinesFrom7Lines(&this_);
  cached_has_bits = this_._impl_._has_bits_[0];
  if (BatchCheckHasBit(cached_has_bits, 0x000000ffU)) {
    // repeated .google.protobuf.FieldDescriptorProto field = 2;
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) {
      total_size += 1UL * this_._internal_field_size();
      for (const auto& msg : this_._internal_field()) {
        total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg);
      }
    }
    // repeated .google.protobuf.DescriptorProto nested_type = 3;
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000002U)) {
      total_size += 1UL * this_._internal_nested_type_size();
      for (const auto& msg : this_._internal_nested_type()) {
        total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg);
      }
    }
    // repeated .google.protobuf.EnumDescriptorProto enum_type = 4;
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000004U)) {
      total_size += 1UL * this_._internal_enum_type_size();
      for (const auto& msg : this_._internal_enum_type()) {
        total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg);
      }
    }
    // repeated .google.protobuf.DescriptorProto.ExtensionRange extension_range = 5;
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000008U)) {
      total_size += 1UL * this_._internal_extension_range_size();
      for (const auto& msg : this_._internal_extension_range()) {
        total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg);
      }
    }
    // repeated .google.protobuf.FieldDescriptorProto extension = 6;
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000010U)) {
      total_size += 1UL * this_._internal_extension_size();
      for (const auto& msg : this_._internal_extension()) {
        total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg);
      }
    }
    // repeated .google.protobuf.OneofDescriptorProto oneof_decl = 8;
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000020U)) {
      total_size += 1UL * this_._internal_oneof_decl_size();
      for (const auto& msg : this_._internal_oneof_decl()) {
        total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg);
      }
    }
    // repeated .google.protobuf.DescriptorProto.ReservedRange reserved_range = 9;
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000040U)) {
      total_size += 1UL * this_._internal_reserved_range_size();
      for (const auto& msg : this_._internal_reserved_range()) {
        total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg);
      }
    }
    // repeated string reserved_name = 10;
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000080U)) {
      total_size +=
          1 * ::google::protobuf::internal::FromIntSize(this_._internal_reserved_name().size());
      for (int i = 0, n = this_._internal_reserved_name().size(); i < n; ++i) {
        total_size += ::google::protobuf::internal::WireFormatLite::StringSize(
            this_._internal_reserved_name().Get(i));
      }
    }
  }
  if (BatchCheckHasBit(cached_has_bits, 0x00000700U)) {
    // optional string name = 1;
    if (CheckHasBit(cached_has_bits, 0x00000100U)) {
      total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize(
                                      this_._internal_name());
    }
    // optional .google.protobuf.MessageOptions options = 7;
    if (CheckHasBit(cached_has_bits, 0x00000200U)) {
      total_size += 1 +
                    ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.options_);
    }
    // optional .google.protobuf.SymbolVisibility visibility = 11;
    if (CheckHasBit(cached_has_bits, 0x00000400U)) {
      total_size += 1 +
                    ::_pbi::WireFormatLite::EnumSize(this_._internal_visibility());
    }
  }
  return this_.MaybeComputeUnknownFieldsSize(total_size,
                                             &this_._impl_._cached_size_);
}

void DescriptorProto::MergeImpl(::google::protobuf::MessageLite& to_msg,
                            const ::google::protobuf::MessageLite& from_msg) {
   auto* const _this =
      static_cast<DescriptorProto*>(&to_msg);
  auto& from = static_cast<const DescriptorProto&>(from_msg);
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    from.CheckHasBitConsistency();
  }
  ::google::protobuf::Arena* arena = _this->GetArena();
  // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.DescriptorProto)
  ABSL_DCHECK_NE(&from, _this);
  ::uint32_t cached_has_bits = 0;
  (void)cached_has_bits;

  cached_has_bits = from._impl_._has_bits_[0];
  if (BatchCheckHasBit(cached_has_bits, 0x000000ffU)) {
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) {
      _this->_internal_mutable_field()->InternalMergeFromWithArena(
          ::google::protobuf::MessageLite::internal_visibility(), arena,
          from._internal_field());
    }
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000002U)) {
      _this->_internal_mutable_nested_type()->InternalMergeFromWithArena(
          ::google::protobuf::MessageLite::internal_visibility(), arena,
          from._internal_nested_type());
    }
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000004U)) {
      _this->_internal_mutable_enum_type()->InternalMergeFromWithArena(
          ::google::protobuf::MessageLite::internal_visibility(), arena,
          from._internal_enum_type());
    }
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000008U)) {
      _this->_internal_mutable_extension_range()->InternalMergeFromWithArena(
          ::google::protobuf::MessageLite::internal_visibility(), arena,
          from._internal_extension_range());
    }
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000010U)) {
      _this->_internal_mutable_extension()->InternalMergeFromWithArena(
          ::google::protobuf::MessageLite::internal_visibility(), arena,
          from._internal_extension());
    }
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000020U)) {
      _this->_internal_mutable_oneof_decl()->InternalMergeFromWithArena(
          ::google::protobuf::MessageLite::internal_visibility(), arena,
          from._internal_oneof_decl());
    }
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000040U)) {
      _this->_internal_mutable_reserved_range()->InternalMergeFromWithArena(
          ::google::protobuf::MessageLite::internal_visibility(), arena,
          from._internal_reserved_range());
    }
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000080U)) {
      _this->_internal_mutable_reserved_name()->InternalMergeFromWithArena(
          ::google::protobuf::MessageLite::internal_visibility(), arena,
          from._internal_reserved_name());
    }
  }
  if (BatchCheckHasBit(cached_has_bits, 0x00000700U)) {
    if (CheckHasBit(cached_has_bits, 0x00000100U)) {
      _this->_internal_set_name(from._internal_name());
    }
    if (CheckHasBit(cached_has_bits, 0x00000200U)) {
      ABSL_DCHECK(from._impl_.options_ != nullptr);
      if (_this->_impl_.options_ == nullptr) {
        _this->_impl_.options_ = ::google::protobuf::Message::CopyConstruct(arena, *from._impl_.options_);
      } else {
        _this->_impl_.options_->MergeFrom(*from._impl_.options_);
      }
    }
    if (CheckHasBit(cached_has_bits, 0x00000400U)) {
      _this->_impl_.visibility_ = from._impl_.visibility_;
    }
  }
  _this->_impl_._has_bits_[0] |= cached_has_bits;
  _this->_internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(
      from._internal_metadata_);
}

void DescriptorProto::CopyFrom(const DescriptorProto& from) {
  // @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.DescriptorProto)
  if (&from == this) return;
  Clear();
  MergeFrom(from);
}

PROTOBUF_NOINLINE bool DescriptorProto::IsInitializedImpl(
    const MessageLite& msg) {
  auto& this_ = static_cast<const DescriptorProto&>(msg);
  if (!::google::protobuf::internal::AllAreInitialized(this_._internal_field()))
    return false;
  if (!::google::protobuf::internal::AllAreInitialized(this_._internal_nested_type()))
    return false;
  if (!::google::protobuf::internal::AllAreInitialized(this_._internal_enum_type()))
    return false;
  if (!::google::protobuf::internal::AllAreInitialized(this_._internal_extension_range()))
    return false;
  if (!::google::protobuf::internal::AllAreInitialized(this_._internal_extension()))
    return false;
  if (!::google::protobuf::internal::AllAreInitialized(this_._internal_oneof_decl()))
    return false;
  if (CheckHasBit(this_._impl_._has_bits_[0], 0x00000200U)) {
    if (!this_._impl_.options_->IsInitialized()) return false;
  }
  return true;
}

void DescriptorProto::InternalSwap(DescriptorProto* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) {
  using ::std::swap;
  auto* arena = GetArena();
  ABSL_DCHECK_EQ(arena, other->GetArena());
  _internal_metadata_.InternalSwap(&other->_internal_metadata_);
  swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]);
  _impl_.field_.InternalSwap(&other->_impl_.field_);
  _impl_.nested_type_.InternalSwap(&other->_impl_.nested_type_);
  _impl_.enum_type_.InternalSwap(&other->_impl_.enum_type_);
  _impl_.extension_range_.InternalSwap(&other->_impl_.extension_range_);
  _impl_.extension_.InternalSwap(&other->_impl_.extension_);
  _impl_.oneof_decl_.InternalSwap(&other->_impl_.oneof_decl_);
  _impl_.reserved_range_.InternalSwap(&other->_impl_.reserved_range_);
  _impl_.reserved_name_.InternalSwap(&other->_impl_.reserved_name_);
  ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.name_, &other->_impl_.name_, arena);
  ::google::protobuf::internal::memswap<
      PROTOBUF_FIELD_OFFSET(DescriptorProto, _impl_.visibility_)
      + sizeof(DescriptorProto::_impl_.visibility_)
      - PROTOBUF_FIELD_OFFSET(DescriptorProto, _impl_.options_)>(
          reinterpret_cast<char*>(&_impl_.options_),
          reinterpret_cast<char*>(&other->_impl_.options_));
}

::google::protobuf::Metadata DescriptorProto::GetMetadata() const {
  return ::google::protobuf::Message::GetMetadataImpl(GetClassData()->full());
}
// ===================================================================

class ExtensionRangeOptions_Declaration::_Internal {
 public:
  using HasBits =
      decltype(::std::declval<ExtensionRangeOptions_Declaration>()._impl_._has_bits_);
  static constexpr ::int32_t kHasBitsOffset =
      8 * PROTOBUF_FIELD_OFFSET(ExtensionRangeOptions_Declaration, _impl_._has_bits_);
};

ExtensionRangeOptions_Declaration::ExtensionRangeOptions_Declaration(::google::protobuf::Arena* PROTOBUF_NULLABLE arena)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(arena, ExtensionRangeOptions_Declaration_class_data_.base()) {
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(arena) {
#endif  // PROTOBUF_CUSTOM_VTABLE
  SharedCtor(arena);
  // @@protoc_insertion_point(arena_constructor:google.protobuf.ExtensionRangeOptions.Declaration)
}
PROTOBUF_NDEBUG_INLINE ExtensionRangeOptions_Declaration::Impl_::Impl_(
    [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility,
    [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from,
    [[maybe_unused]] const ::google::protobuf::ExtensionRangeOptions_Declaration& from_msg)
      : _has_bits_{from._has_bits_},
        _cached_size_{0},
        full_name_(arena, from.full_name_),
        type_(arena, from.type_) {}

ExtensionRangeOptions_Declaration::ExtensionRangeOptions_Declaration(
    ::google::protobuf::Arena* PROTOBUF_NULLABLE arena,
    const ExtensionRangeOptions_Declaration& from)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(arena, ExtensionRangeOptions_Declaration_class_data_.base()) {
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(arena) {
#endif  // PROTOBUF_CUSTOM_VTABLE
  ExtensionRangeOptions_Declaration* const _this = this;
  (void)_this;
  _internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(
      from._internal_metadata_);
  new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from);
  ::memcpy(reinterpret_cast<char*>(&_impl_) +
               offsetof(Impl_, number_),
           reinterpret_cast<const char*>(&from._impl_) +
               offsetof(Impl_, number_),
           offsetof(Impl_, repeated_) -
               offsetof(Impl_, number_) +
               sizeof(Impl_::repeated_));

  // @@protoc_insertion_point(copy_constructor:google.protobuf.ExtensionRangeOptions.Declaration)
}
PROTOBUF_NDEBUG_INLINE ExtensionRangeOptions_Declaration::Impl_::Impl_(
    [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility,
    [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena)
      : _cached_size_{0},
        full_name_(arena),
        type_(arena) {}

inline void ExtensionRangeOptions_Declaration::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) {
  new (&_impl_) Impl_(internal_visibility(), arena);
  ::memset(reinterpret_cast<char*>(&_impl_) +
               offsetof(Impl_, number_),
           0,
           offsetof(Impl_, repeated_) -
               offsetof(Impl_, number_) +
               sizeof(Impl_::repeated_));
}
ExtensionRangeOptions_Declaration::~ExtensionRangeOptions_Declaration() {
  // @@protoc_insertion_point(destructor:google.protobuf.ExtensionRangeOptions.Declaration)
  SharedDtor(*this);
}
inline void ExtensionRangeOptions_Declaration::SharedDtor(MessageLite& self) {
  ExtensionRangeOptions_Declaration& this_ = static_cast<ExtensionRangeOptions_Declaration&>(self);
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    this_.CheckHasBitConsistency();
  }
  this_._internal_metadata_.Delete<::google::protobuf::UnknownFieldSet>();
  ABSL_DCHECK(this_.GetArena() == nullptr);
  this_._impl_.full_name_.Destroy();
  this_._impl_.type_.Destroy();
  this_._impl_.~Impl_();
}

inline void* PROTOBUF_NONNULL ExtensionRangeOptions_Declaration::PlacementNew_(
    const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem,
    ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) {
  return ::new (mem) ExtensionRangeOptions_Declaration(arena);
}
constexpr auto ExtensionRangeOptions_Declaration::InternalNewImpl_() {
  return ::google::protobuf::internal::MessageCreator::CopyInit(sizeof(ExtensionRangeOptions_Declaration),
                                            alignof(ExtensionRangeOptions_Declaration));
}
constexpr auto ExtensionRangeOptions_Declaration::InternalGenerateClassData_() {
  return ::google::protobuf::internal::ClassDataFull{
      ::google::protobuf::internal::ClassData{
          &_ExtensionRangeOptions_Declaration_default_instance_._instance,
          &_table_.header,
          nullptr,  // OnDemandRegisterArenaDtor
          nullptr,  // IsInitialized
          &ExtensionRangeOptions_Declaration::MergeImpl,
          ::google::protobuf::Message::GetNewImpl<ExtensionRangeOptions_Declaration>(),
#if defined(PROTOBUF_CUSTOM_VTABLE)
          &ExtensionRangeOptions_Declaration::SharedDtor,
          ::google::protobuf::Message::GetClearImpl<ExtensionRangeOptions_Declaration>(), &ExtensionRangeOptions_Declaration::ByteSizeLong,
              &ExtensionRangeOptions_Declaration::_InternalSerialize,
#endif  // PROTOBUF_CUSTOM_VTABLE
          PROTOBUF_FIELD_OFFSET(ExtensionRangeOptions_Declaration, _impl_._cached_size_),
          false,
      },
      &ExtensionRangeOptions_Declaration::kDescriptorMethods,
      &descriptor_table_google_2fprotobuf_2fdescriptor_2eproto,
      nullptr,  // tracker
  };
}

PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 const
    ::google::protobuf::internal::ClassDataFull ExtensionRangeOptions_Declaration_class_data_ =
        ExtensionRangeOptions_Declaration::InternalGenerateClassData_();

PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL
ExtensionRangeOptions_Declaration::GetClassData() const {
  ::google::protobuf::internal::PrefetchToLocalCache(&ExtensionRangeOptions_Declaration_class_data_);
  ::google::protobuf::internal::PrefetchToLocalCache(ExtensionRangeOptions_Declaration_class_data_.tc_table);
  return ExtensionRangeOptions_Declaration_class_data_.base();
}
constexpr ::_pbi::TcParseTable<3, 5, 0, 0, 2>
ExtensionRangeOptions_Declaration::_table_ = {
  {
    PROTOBUF_FIELD_OFFSET(ExtensionRangeOptions_Declaration, _impl_._has_bits_),
    0, // no _extensions_
    6, 56,  // max_field_number, fast_idx_mask
    offsetof(decltype(_table_), field_lookup_table),
    4294967240,  // skipmap
    offsetof(decltype(_table_), field_entries),
    5,  // num_field_entries
    0,  // num_aux_entries
    offsetof(decltype(_table_), field_names),  // no aux_entries
    ExtensionRangeOptions_Declaration_class_data_.base(),
    nullptr,  // post_loop_handler
    ::_pbi::TcParser::GenericFallback,  // fallback
    #ifdef PROTOBUF_PREFETCH_PARSE_TABLE
    ::_pbi::TcParser::GetTable<::google::protobuf::ExtensionRangeOptions_Declaration>(),  // to_prefetch
    #endif  // PROTOBUF_PREFETCH_PARSE_TABLE
  }, {{
    {::_pbi::TcParser::MiniParse, {}},
    // optional int32 number = 1;
    {::_pbi::TcParser::SingularVarintNoZag1<::uint32_t, offsetof(ExtensionRangeOptions_Declaration, _impl_.number_), 2>(),
     {8, 2, 0,
      PROTOBUF_FIELD_OFFSET(ExtensionRangeOptions_Declaration, _impl_.number_)}},
    // optional string full_name = 2;
    {::_pbi::TcParser::FastBS1,
     {18, 0, 0,
      PROTOBUF_FIELD_OFFSET(ExtensionRangeOptions_Declaration, _impl_.full_name_)}},
    // optional string type = 3;
    {::_pbi::TcParser::FastBS1,
     {26, 1, 0,
      PROTOBUF_FIELD_OFFSET(ExtensionRangeOptions_Declaration, _impl_.type_)}},
    {::_pbi::TcParser::MiniParse, {}},
    // optional bool reserved = 5;
    {::_pbi::TcParser::SingularVarintNoZag1<bool, offsetof(ExtensionRangeOptions_Declaration, _impl_.reserved_), 3>(),
     {40, 3, 0,
      PROTOBUF_FIELD_OFFSET(ExtensionRangeOptions_Declaration, _impl_.reserved_)}},
    // optional bool repeated = 6;
    {::_pbi::TcParser::SingularVarintNoZag1<bool, offsetof(ExtensionRangeOptions_Declaration, _impl_.repeated_), 4>(),
     {48, 4, 0,
      PROTOBUF_FIELD_OFFSET(ExtensionRangeOptions_Declaration, _impl_.repeated_)}},
    {::_pbi::TcParser::MiniParse, {}},
  }}, {{
    65535, 65535
  }}, {{
    // optional int32 number = 1;
    {PROTOBUF_FIELD_OFFSET(ExtensionRangeOptions_Declaration, _impl_.number_), _Internal::kHasBitsOffset + 2, 0, (0 | ::_fl::kFcOptional | ::_fl::kInt32)},
    // optional string full_name = 2;
    {PROTOBUF_FIELD_OFFSET(ExtensionRangeOptions_Declaration, _impl_.full_name_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcOptional | ::_fl::kBytes | ::_fl::kRepAString)},
    // optional string type = 3;
    {PROTOBUF_FIELD_OFFSET(ExtensionRangeOptions_Declaration, _impl_.type_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kBytes | ::_fl::kRepAString)},
    // optional bool reserved = 5;
    {PROTOBUF_FIELD_OFFSET(ExtensionRangeOptions_Declaration, _impl_.reserved_), _Internal::kHasBitsOffset + 3, 0, (0 | ::_fl::kFcOptional | ::_fl::kBool)},
    // optional bool repeated = 6;
    {PROTOBUF_FIELD_OFFSET(ExtensionRangeOptions_Declaration, _impl_.repeated_), _Internal::kHasBitsOffset + 4, 0, (0 | ::_fl::kFcOptional | ::_fl::kBool)},
  }},
  // no aux_entries
  {{
  }},
};
PROTOBUF_NOINLINE void ExtensionRangeOptions_Declaration::Clear() {
// @@protoc_insertion_point(message_clear_start:google.protobuf.ExtensionRangeOptions.Declaration)
  ::google::protobuf::internal::TSanWrite(&_impl_);
  ::uint32_t cached_has_bits = 0;
  // Prevent compiler warnings about cached_has_bits being unused
  (void) cached_has_bits;

  cached_has_bits = _impl_._has_bits_[0];
  if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) {
    if (CheckHasBit(cached_has_bits, 0x00000001U)) {
      _impl_.full_name_.ClearNonDefaultToEmpty();
    }
    if (CheckHasBit(cached_has_bits, 0x00000002U)) {
      _impl_.type_.ClearNonDefaultToEmpty();
    }
  }
  if (BatchCheckHasBit(cached_has_bits, 0x0000001cU)) {
    ::memset(&_impl_.number_, 0, static_cast<::size_t>(
        reinterpret_cast<char*>(&_impl_.repeated_) -
        reinterpret_cast<char*>(&_impl_.number_)) + sizeof(_impl_.repeated_));
  }
  _impl_._has_bits_.Clear();
  _internal_metadata_.Clear<::google::protobuf::UnknownFieldSet>();
}

#if defined(PROTOBUF_CUSTOM_VTABLE)
::uint8_t* PROTOBUF_NONNULL ExtensionRangeOptions_Declaration::_InternalSerialize(
    const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target,
    ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) {
  const ExtensionRangeOptions_Declaration& this_ = static_cast<const ExtensionRangeOptions_Declaration&>(base);
#else   // PROTOBUF_CUSTOM_VTABLE
::uint8_t* PROTOBUF_NONNULL ExtensionRangeOptions_Declaration::_InternalSerialize(
    ::uint8_t* PROTOBUF_NONNULL target,
    ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const {
  const ExtensionRangeOptions_Declaration& this_ = *this;
#endif  // PROTOBUF_CUSTOM_VTABLE
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    this_.CheckHasBitConsistency();
  }
  // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.ExtensionRangeOptions.Declaration)
  ::uint32_t cached_has_bits = 0;
  (void)cached_has_bits;

  cached_has_bits = this_._impl_._has_bits_[0];
  // optional int32 number = 1;
  if (CheckHasBit(cached_has_bits, 0x00000004U)) {
    target =
        ::google::protobuf::internal::WireFormatLite::WriteInt32ToArrayWithField<1>(
            stream, this_._internal_number(), target);
  }

  // optional string full_name = 2;
  if (CheckHasBit(cached_has_bits, 0x00000001U)) {
    const ::std::string& _s = this_._internal_full_name();
    target = stream->WriteStringMaybeAliased(2, _s, target);
  }

  // optional string type = 3;
  if (CheckHasBit(cached_has_bits, 0x00000002U)) {
    const ::std::string& _s = this_._internal_type();
    target = stream->WriteStringMaybeAliased(3, _s, target);
  }

  // optional bool reserved = 5;
  if (CheckHasBit(cached_has_bits, 0x00000008U)) {
    target = stream->EnsureSpace(target);
    target = ::_pbi::WireFormatLite::WriteBoolToArray(
        5, this_._internal_reserved(), target);
  }

  // optional bool repeated = 6;
  if (CheckHasBit(cached_has_bits, 0x00000010U)) {
    target = stream->EnsureSpace(target);
    target = ::_pbi::WireFormatLite::WriteBoolToArray(
        6, this_._internal_repeated(), target);
  }

  if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) {
    target =
        ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray(
            this_._internal_metadata_.unknown_fields<::google::protobuf::UnknownFieldSet>(::google::protobuf::UnknownFieldSet::default_instance), target, stream);
  }
  // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.ExtensionRangeOptions.Declaration)
  return target;
}

#if defined(PROTOBUF_CUSTOM_VTABLE)
::size_t ExtensionRangeOptions_Declaration::ByteSizeLong(const MessageLite& base) {
  const ExtensionRangeOptions_Declaration& this_ = static_cast<const ExtensionRangeOptions_Declaration&>(base);
#else   // PROTOBUF_CUSTOM_VTABLE
::size_t ExtensionRangeOptions_Declaration::ByteSizeLong() const {
  const ExtensionRangeOptions_Declaration& this_ = *this;
#endif  // PROTOBUF_CUSTOM_VTABLE
  // @@protoc_insertion_point(message_byte_size_start:google.protobuf.ExtensionRangeOptions.Declaration)
  ::size_t total_size = 0;

  ::uint32_t cached_has_bits = 0;
  // Prevent compiler warnings about cached_has_bits being unused
  (void)cached_has_bits;

  ::_pbi::Prefetch5LinesFrom7Lines(&this_);
  cached_has_bits = this_._impl_._has_bits_[0];
  total_size += ::absl::popcount(0x00000018U & cached_has_bits) * 2;
  if (BatchCheckHasBit(cached_has_bits, 0x00000007U)) {
    // optional string full_name = 2;
    if (CheckHasBit(cached_has_bits, 0x00000001U)) {
      total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize(
                                      this_._internal_full_name());
    }
    // optional string type = 3;
    if (CheckHasBit(cached_has_bits, 0x00000002U)) {
      total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize(
                                      this_._internal_type());
    }
    // optional int32 number = 1;
    if (CheckHasBit(cached_has_bits, 0x00000004U)) {
      total_size += ::_pbi::WireFormatLite::Int32SizePlusOne(
          this_._internal_number());
    }
  }
  return this_.MaybeComputeUnknownFieldsSize(total_size,
                                             &this_._impl_._cached_size_);
}

void ExtensionRangeOptions_Declaration::MergeImpl(::google::protobuf::MessageLite& to_msg,
                            const ::google::protobuf::MessageLite& from_msg) {
   auto* const _this =
      static_cast<ExtensionRangeOptions_Declaration*>(&to_msg);
  auto& from = static_cast<const ExtensionRangeOptions_Declaration&>(from_msg);
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    from.CheckHasBitConsistency();
  }
  // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.ExtensionRangeOptions.Declaration)
  ABSL_DCHECK_NE(&from, _this);
  ::uint32_t cached_has_bits = 0;
  (void)cached_has_bits;

  cached_has_bits = from._impl_._has_bits_[0];
  if (BatchCheckHasBit(cached_has_bits, 0x0000001fU)) {
    if (CheckHasBit(cached_has_bits, 0x00000001U)) {
      _this->_internal_set_full_name(from._internal_full_name());
    }
    if (CheckHasBit(cached_has_bits, 0x00000002U)) {
      _this->_internal_set_type(from._internal_type());
    }
    if (CheckHasBit(cached_has_bits, 0x00000004U)) {
      _this->_impl_.number_ = from._impl_.number_;
    }
    if (CheckHasBit(cached_has_bits, 0x00000008U)) {
      _this->_impl_.reserved_ = from._impl_.reserved_;
    }
    if (CheckHasBit(cached_has_bits, 0x00000010U)) {
      _this->_impl_.repeated_ = from._impl_.repeated_;
    }
  }
  _this->_impl_._has_bits_[0] |= cached_has_bits;
  _this->_internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(
      from._internal_metadata_);
}

void ExtensionRangeOptions_Declaration::CopyFrom(const ExtensionRangeOptions_Declaration& from) {
  // @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.ExtensionRangeOptions.Declaration)
  if (&from == this) return;
  Clear();
  MergeFrom(from);
}


void ExtensionRangeOptions_Declaration::InternalSwap(ExtensionRangeOptions_Declaration* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) {
  using ::std::swap;
  auto* arena = GetArena();
  ABSL_DCHECK_EQ(arena, other->GetArena());
  _internal_metadata_.InternalSwap(&other->_internal_metadata_);
  swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]);
  ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.full_name_, &other->_impl_.full_name_, arena);
  ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.type_, &other->_impl_.type_, arena);
  ::google::protobuf::internal::memswap<
      PROTOBUF_FIELD_OFFSET(ExtensionRangeOptions_Declaration, _impl_.repeated_)
      + sizeof(ExtensionRangeOptions_Declaration::_impl_.repeated_)
      - PROTOBUF_FIELD_OFFSET(ExtensionRangeOptions_Declaration, _impl_.number_)>(
          reinterpret_cast<char*>(&_impl_.number_),
          reinterpret_cast<char*>(&other->_impl_.number_));
}

::google::protobuf::Metadata ExtensionRangeOptions_Declaration::GetMetadata() const {
  return ::google::protobuf::Message::GetMetadataImpl(GetClassData()->full());
}
// ===================================================================

class ExtensionRangeOptions::_Internal {
 public:
  using HasBits =
      decltype(::std::declval<ExtensionRangeOptions>()._impl_._has_bits_);
  static constexpr ::int32_t kHasBitsOffset =
      8 * PROTOBUF_FIELD_OFFSET(ExtensionRangeOptions, _impl_._has_bits_);
};

ExtensionRangeOptions::ExtensionRangeOptions(::google::protobuf::Arena* PROTOBUF_NULLABLE arena)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(arena, ExtensionRangeOptions_class_data_.base()) {
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(arena) {
#endif  // PROTOBUF_CUSTOM_VTABLE
  SharedCtor(arena);
  // @@protoc_insertion_point(arena_constructor:google.protobuf.ExtensionRangeOptions)
}
PROTOBUF_NDEBUG_INLINE ExtensionRangeOptions::Impl_::Impl_(
    [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility,
    [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from,
    [[maybe_unused]] const ::google::protobuf::ExtensionRangeOptions& from_msg)
      : _extensions_{visibility, arena},
        _has_bits_{from._has_bits_},
        _cached_size_{0},
        declaration_{visibility, arena, from.declaration_},
        uninterpreted_option_{visibility, arena, from.uninterpreted_option_} {}

ExtensionRangeOptions::ExtensionRangeOptions(
    ::google::protobuf::Arena* PROTOBUF_NULLABLE arena,
    const ExtensionRangeOptions& from)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(arena, ExtensionRangeOptions_class_data_.base()) {
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(arena) {
#endif  // PROTOBUF_CUSTOM_VTABLE
  ExtensionRangeOptions* const _this = this;
  (void)_this;
  _internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(
      from._internal_metadata_);
  new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from);
  _impl_._extensions_.MergeFrom(this, from._impl_._extensions_);
  ::uint32_t cached_has_bits = _impl_._has_bits_[0];
  _impl_.features_ = (CheckHasBit(cached_has_bits, 0x00000004U))
                ? ::google::protobuf::Message::CopyConstruct(arena, *from._impl_.features_)
                : nullptr;
  _impl_.verification_ = from._impl_.verification_;

  // @@protoc_insertion_point(copy_constructor:google.protobuf.ExtensionRangeOptions)
}
PROTOBUF_NDEBUG_INLINE ExtensionRangeOptions::Impl_::Impl_(
    [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility,
    [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena)
      : _extensions_{visibility, arena},
        _cached_size_{0},
        declaration_{visibility, arena},
        uninterpreted_option_{visibility, arena},
        verification_{static_cast< ::google::protobuf::ExtensionRangeOptions_VerificationState >(1)} {}

inline void ExtensionRangeOptions::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) {
  new (&_impl_) Impl_(internal_visibility(), arena);
  _impl_.features_ = {};
}
ExtensionRangeOptions::~ExtensionRangeOptions() {
  // @@protoc_insertion_point(destructor:google.protobuf.ExtensionRangeOptions)
  SharedDtor(*this);
}
inline void ExtensionRangeOptions::SharedDtor(MessageLite& self) {
  ExtensionRangeOptions& this_ = static_cast<ExtensionRangeOptions&>(self);
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    this_.CheckHasBitConsistency();
  }
  this_._internal_metadata_.Delete<::google::protobuf::UnknownFieldSet>();
  ABSL_DCHECK(this_.GetArena() == nullptr);
  delete this_._impl_.features_;
  this_._impl_.~Impl_();
}

inline void* PROTOBUF_NONNULL ExtensionRangeOptions::PlacementNew_(
    const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem,
    ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) {
  return ::new (mem) ExtensionRangeOptions(arena);
}
constexpr auto ExtensionRangeOptions::InternalNewImpl_() {
  constexpr auto arena_bits = ::google::protobuf::internal::EncodePlacementArenaOffsets({
      PROTOBUF_FIELD_OFFSET(ExtensionRangeOptions, _impl_._extensions_) +
          decltype(ExtensionRangeOptions::_impl_._extensions_)::InternalGetArenaOffset(
              ::google::protobuf::Message::internal_visibility()),
      PROTOBUF_FIELD_OFFSET(ExtensionRangeOptions, _impl_.uninterpreted_option_) +
          decltype(ExtensionRangeOptions::_impl_.uninterpreted_option_)::
              InternalGetArenaOffset(
                  ::google::protobuf::Message::internal_visibility()),
      PROTOBUF_FIELD_OFFSET(ExtensionRangeOptions, _impl_.declaration_) +
          decltype(ExtensionRangeOptions::_impl_.declaration_)::
              InternalGetArenaOffset(
                  ::google::protobuf::Message::internal_visibility()),
  });
  if (arena_bits.has_value()) {
    return ::google::protobuf::internal::MessageCreator::CopyInit(
        sizeof(ExtensionRangeOptions), alignof(ExtensionRangeOptions), *arena_bits);
  } else {
    return ::google::protobuf::internal::MessageCreator(&ExtensionRangeOptions::PlacementNew_,
                                 sizeof(ExtensionRangeOptions),
                                 alignof(ExtensionRangeOptions));
  }
}
constexpr auto ExtensionRangeOptions::InternalGenerateClassData_() {
  return ::google::protobuf::internal::ClassDataFull{
      ::google::protobuf::internal::ClassData{
          &_ExtensionRangeOptions_default_instance_._instance,
          &_table_.header,
          nullptr,  // OnDemandRegisterArenaDtor
          ExtensionRangeOptions::IsInitializedImpl,
          &ExtensionRangeOptions::MergeImpl,
          ::google::protobuf::Message::GetNewImpl<ExtensionRangeOptions>(),
#if defined(PROTOBUF_CUSTOM_VTABLE)
          &ExtensionRangeOptions::SharedDtor,
          ::google::protobuf::Message::GetClearImpl<ExtensionRangeOptions>(), &ExtensionRangeOptions::ByteSizeLong,
              &ExtensionRangeOptions::_InternalSerialize,
#endif  // PROTOBUF_CUSTOM_VTABLE
          PROTOBUF_FIELD_OFFSET(ExtensionRangeOptions, _impl_._cached_size_),
          false,
      },
      &ExtensionRangeOptions::kDescriptorMethods,
      &descriptor_table_google_2fprotobuf_2fdescriptor_2eproto,
      nullptr,  // tracker
  };
}

PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 const
    ::google::protobuf::internal::ClassDataFull ExtensionRangeOptions_class_data_ =
        ExtensionRangeOptions::InternalGenerateClassData_();

PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL
ExtensionRangeOptions::GetClassData() const {
  ::google::protobuf::internal::PrefetchToLocalCache(&ExtensionRangeOptions_class_data_);
  ::google::protobuf::internal::PrefetchToLocalCache(ExtensionRangeOptions_class_data_.tc_table);
  return ExtensionRangeOptions_class_data_.base();
}
constexpr ::_pbi::TcParseTable<3, 4, 4, 0, 12>
ExtensionRangeOptions::_table_ = {
  {
    PROTOBUF_FIELD_OFFSET(ExtensionRangeOptions, _impl_._has_bits_),
    PROTOBUF_FIELD_OFFSET(ExtensionRangeOptions, _impl_._extensions_),
    999, 56,  // max_field_number, fast_idx_mask
    offsetof(decltype(_table_), field_lookup_table),
    4294967289,  // skipmap
    offsetof(decltype(_table_), field_entries),
    4,  // num_field_entries
    4,  // num_aux_entries
    offsetof(decltype(_table_), aux_entries),
    ExtensionRangeOptions_class_data_.base(),
    nullptr,  // post_loop_handler
    ::_pbi::TcParser::GenericFallback,  // fallback
    #ifdef PROTOBUF_PREFETCH_PARSE_TABLE
    ::_pbi::TcParser::GetTable<::google::protobuf::ExtensionRangeOptions>(),  // to_prefetch
    #endif  // PROTOBUF_PREFETCH_PARSE_TABLE
  }, {{
    {::_pbi::TcParser::MiniParse, {}},
    {::_pbi::TcParser::MiniParse, {}},
    // repeated .google.protobuf.ExtensionRangeOptions.Declaration declaration = 2 [retention = RETENTION_SOURCE];
    {::_pbi::TcParser::FastMtR1,
     {18, 0, 0,
      PROTOBUF_FIELD_OFFSET(ExtensionRangeOptions, _impl_.declaration_)}},
    // optional .google.protobuf.ExtensionRangeOptions.VerificationState verification = 3 [default = UNVERIFIED, retention = RETENTION_SOURCE];
    {::_pbi::TcParser::FastEr0S1,
     {24, 3, 1,
      PROTOBUF_FIELD_OFFSET(ExtensionRangeOptions, _impl_.verification_)}},
    {::_pbi::TcParser::MiniParse, {}},
    {::_pbi::TcParser::MiniParse, {}},
    {::_pbi::TcParser::MiniParse, {}},
    // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
    {::_pbi::TcParser::FastMtR2,
     {16058, 1, 2,
      PROTOBUF_FIELD_OFFSET(ExtensionRangeOptions, _impl_.uninterpreted_option_)}},
  }}, {{
    50, 0, 1,
    65534, 2,
    999, 0, 1,
    65534, 3,
    65535, 65535
  }}, {{
    // repeated .google.protobuf.ExtensionRangeOptions.Declaration declaration = 2 [retention = RETENTION_SOURCE];
    {PROTOBUF_FIELD_OFFSET(ExtensionRangeOptions, _impl_.declaration_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)},
    // optional .google.protobuf.ExtensionRangeOptions.VerificationState verification = 3 [default = UNVERIFIED, retention = RETENTION_SOURCE];
    {PROTOBUF_FIELD_OFFSET(ExtensionRangeOptions, _impl_.verification_), _Internal::kHasBitsOffset + 3, 3, (0 | ::_fl::kFcOptional | ::_fl::kEnumRange)},
    // optional .google.protobuf.FeatureSet features = 50;
    {PROTOBUF_FIELD_OFFSET(ExtensionRangeOptions, _impl_.features_), _Internal::kHasBitsOffset + 2, 1, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)},
    // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
    {PROTOBUF_FIELD_OFFSET(ExtensionRangeOptions, _impl_.uninterpreted_option_), _Internal::kHasBitsOffset + 1, 2, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)},
  }},
  {{
      {::_pbi::TcParser::GetTable<::google::protobuf::ExtensionRangeOptions_Declaration>()},
      {::_pbi::TcParser::GetTable<::google::protobuf::FeatureSet>()},
      {::_pbi::TcParser::GetTable<::google::protobuf::UninterpretedOption>()},
      {0, 1},
  }},
  {{
  }},
};
PROTOBUF_NOINLINE void ExtensionRangeOptions::Clear() {
// @@protoc_insertion_point(message_clear_start:google.protobuf.ExtensionRangeOptions)
  ::google::protobuf::internal::TSanWrite(&_impl_);
  ::uint32_t cached_has_bits = 0;
  // Prevent compiler warnings about cached_has_bits being unused
  (void) cached_has_bits;

  _impl_._extensions_.Clear();
  cached_has_bits = _impl_._has_bits_[0];
  if (BatchCheckHasBit(cached_has_bits, 0x0000000fU)) {
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) {
      _impl_.declaration_.Clear();
    }
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000002U)) {
      _impl_.uninterpreted_option_.Clear();
    }
    if (CheckHasBit(cached_has_bits, 0x00000004U)) {
      ABSL_DCHECK(_impl_.features_ != nullptr);
      _impl_.features_->Clear();
    }
    _impl_.verification_ = 1;
  }
  _impl_._has_bits_.Clear();
  _internal_metadata_.Clear<::google::protobuf::UnknownFieldSet>();
}

#if defined(PROTOBUF_CUSTOM_VTABLE)
::uint8_t* PROTOBUF_NONNULL ExtensionRangeOptions::_InternalSerialize(
    const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target,
    ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) {
  const ExtensionRangeOptions& this_ = static_cast<const ExtensionRangeOptions&>(base);
#else   // PROTOBUF_CUSTOM_VTABLE
::uint8_t* PROTOBUF_NONNULL ExtensionRangeOptions::_InternalSerialize(
    ::uint8_t* PROTOBUF_NONNULL target,
    ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const {
  const ExtensionRangeOptions& this_ = *this;
#endif  // PROTOBUF_CUSTOM_VTABLE
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    this_.CheckHasBitConsistency();
  }
  // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.ExtensionRangeOptions)
  ::uint32_t cached_has_bits = 0;
  (void)cached_has_bits;

  cached_has_bits = this_._impl_._has_bits_[0];
  // repeated .google.protobuf.ExtensionRangeOptions.Declaration declaration = 2 [retention = RETENTION_SOURCE];
  if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) {
    for (unsigned i = 0, n = static_cast<unsigned>(
                             this_._internal_declaration_size());
         i < n; i++) {
      const auto& repfield = this_._internal_declaration().Get(i);
      target =
          ::google::protobuf::internal::WireFormatLite::InternalWriteMessage(
              2, repfield, repfield.GetCachedSize(),
              target, stream);
    }
  }

  // optional .google.protobuf.ExtensionRangeOptions.VerificationState verification = 3 [default = UNVERIFIED, retention = RETENTION_SOURCE];
  if (CheckHasBit(cached_has_bits, 0x00000008U)) {
    target = stream->EnsureSpace(target);
    target = ::_pbi::WireFormatLite::WriteEnumToArray(
        3, this_._internal_verification(), target);
  }

  // optional .google.protobuf.FeatureSet features = 50;
  if (CheckHasBit(cached_has_bits, 0x00000004U)) {
    target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage(
        50, *this_._impl_.features_, this_._impl_.features_->GetCachedSize(), target,
        stream);
  }

  // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
  if (CheckHasBitForRepeated(cached_has_bits, 0x00000002U)) {
    for (unsigned i = 0, n = static_cast<unsigned>(
                             this_._internal_uninterpreted_option_size());
         i < n; i++) {
      const auto& repfield = this_._internal_uninterpreted_option().Get(i);
      target =
          ::google::protobuf::internal::WireFormatLite::InternalWriteMessage(
              999, repfield, repfield.GetCachedSize(),
              target, stream);
    }
  }

  // All extensions.
  target = this_._impl_._extensions_._InternalSerializeAll(&default_instance(),
                                                    target, stream);
  if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) {
    target =
        ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray(
            this_._internal_metadata_.unknown_fields<::google::protobuf::UnknownFieldSet>(::google::protobuf::UnknownFieldSet::default_instance), target, stream);
  }
  // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.ExtensionRangeOptions)
  return target;
}

#if defined(PROTOBUF_CUSTOM_VTABLE)
::size_t ExtensionRangeOptions::ByteSizeLong(const MessageLite& base) {
  const ExtensionRangeOptions& this_ = static_cast<const ExtensionRangeOptions&>(base);
#else   // PROTOBUF_CUSTOM_VTABLE
::size_t ExtensionRangeOptions::ByteSizeLong() const {
  const ExtensionRangeOptions& this_ = *this;
#endif  // PROTOBUF_CUSTOM_VTABLE
  // @@protoc_insertion_point(message_byte_size_start:google.protobuf.ExtensionRangeOptions)
  ::size_t total_size = 0;
  total_size += this_._impl_._extensions_.ByteSize();

  ::uint32_t cached_has_bits = 0;
  // Prevent compiler warnings about cached_has_bits being unused
  (void)cached_has_bits;

  ::_pbi::Prefetch5LinesFrom7Lines(&this_);
  cached_has_bits = this_._impl_._has_bits_[0];
  if (BatchCheckHasBit(cached_has_bits, 0x0000000fU)) {
    // repeated .google.protobuf.ExtensionRangeOptions.Declaration declaration = 2 [retention = RETENTION_SOURCE];
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) {
      total_size += 1UL * this_._internal_declaration_size();
      for (const auto& msg : this_._internal_declaration()) {
        total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg);
      }
    }
    // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000002U)) {
      total_size += 2UL * this_._internal_uninterpreted_option_size();
      for (const auto& msg : this_._internal_uninterpreted_option()) {
        total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg);
      }
    }
    // optional .google.protobuf.FeatureSet features = 50;
    if (CheckHasBit(cached_has_bits, 0x00000004U)) {
      total_size += 2 +
                    ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.features_);
    }
    // optional .google.protobuf.ExtensionRangeOptions.VerificationState verification = 3 [default = UNVERIFIED, retention = RETENTION_SOURCE];
    if (CheckHasBit(cached_has_bits, 0x00000008U)) {
      total_size += 1 +
                    ::_pbi::WireFormatLite::EnumSize(this_._internal_verification());
    }
  }
  return this_.MaybeComputeUnknownFieldsSize(total_size,
                                             &this_._impl_._cached_size_);
}

void ExtensionRangeOptions::MergeImpl(::google::protobuf::MessageLite& to_msg,
                            const ::google::protobuf::MessageLite& from_msg) {
   auto* const _this =
      static_cast<ExtensionRangeOptions*>(&to_msg);
  auto& from = static_cast<const ExtensionRangeOptions&>(from_msg);
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    from.CheckHasBitConsistency();
  }
  ::google::protobuf::Arena* arena = _this->GetArena();
  // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.ExtensionRangeOptions)
  ABSL_DCHECK_NE(&from, _this);
  ::uint32_t cached_has_bits = 0;
  (void)cached_has_bits;

  cached_has_bits = from._impl_._has_bits_[0];
  if (BatchCheckHasBit(cached_has_bits, 0x0000000fU)) {
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) {
      _this->_internal_mutable_declaration()->InternalMergeFromWithArena(
          ::google::protobuf::MessageLite::internal_visibility(), arena,
          from._internal_declaration());
    }
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000002U)) {
      _this->_internal_mutable_uninterpreted_option()->InternalMergeFromWithArena(
          ::google::protobuf::MessageLite::internal_visibility(), arena,
          from._internal_uninterpreted_option());
    }
    if (CheckHasBit(cached_has_bits, 0x00000004U)) {
      ABSL_DCHECK(from._impl_.features_ != nullptr);
      if (_this->_impl_.features_ == nullptr) {
        _this->_impl_.features_ = ::google::protobuf::Message::CopyConstruct(arena, *from._impl_.features_);
      } else {
        _this->_impl_.features_->MergeFrom(*from._impl_.features_);
      }
    }
    if (CheckHasBit(cached_has_bits, 0x00000008U)) {
      _this->_impl_.verification_ = from._impl_.verification_;
    }
  }
  _this->_impl_._has_bits_[0] |= cached_has_bits;
  _this->_impl_._extensions_.MergeFrom(&default_instance(),
                                from._impl_._extensions_);
  _this->_internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(
      from._internal_metadata_);
}

void ExtensionRangeOptions::CopyFrom(const ExtensionRangeOptions& from) {
  // @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.ExtensionRangeOptions)
  if (&from == this) return;
  Clear();
  MergeFrom(from);
}

PROTOBUF_NOINLINE bool ExtensionRangeOptions::IsInitializedImpl(
    const MessageLite& msg) {
  auto& this_ = static_cast<const ExtensionRangeOptions&>(msg);
  if (!this_._impl_._extensions_.IsInitialized(&default_instance())) {
    return false;
  }
  if (!::google::protobuf::internal::AllAreInitialized(this_._internal_uninterpreted_option()))
    return false;
  if (CheckHasBit(this_._impl_._has_bits_[0], 0x00000004U)) {
    if (!this_._impl_.features_->IsInitialized()) return false;
  }
  return true;
}

void ExtensionRangeOptions::InternalSwap(ExtensionRangeOptions* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) {
  using ::std::swap;
  _impl_._extensions_.InternalSwap(&other->_impl_._extensions_);
  _internal_metadata_.InternalSwap(&other->_internal_metadata_);
  swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]);
  _impl_.declaration_.InternalSwap(&other->_impl_.declaration_);
  _impl_.uninterpreted_option_.InternalSwap(&other->_impl_.uninterpreted_option_);
  ::google::protobuf::internal::memswap<
      PROTOBUF_FIELD_OFFSET(ExtensionRangeOptions, _impl_.verification_)
      + sizeof(ExtensionRangeOptions::_impl_.verification_)
      - PROTOBUF_FIELD_OFFSET(ExtensionRangeOptions, _impl_.features_)>(
          reinterpret_cast<char*>(&_impl_.features_),
          reinterpret_cast<char*>(&other->_impl_.features_));
}

::google::protobuf::Metadata ExtensionRangeOptions::GetMetadata() const {
  return ::google::protobuf::Message::GetMetadataImpl(GetClassData()->full());
}
// ===================================================================

class FieldDescriptorProto::_Internal {
 public:
  using HasBits =
      decltype(::std::declval<FieldDescriptorProto>()._impl_._has_bits_);
  static constexpr ::int32_t kHasBitsOffset =
      8 * PROTOBUF_FIELD_OFFSET(FieldDescriptorProto, _impl_._has_bits_);
};

FieldDescriptorProto::FieldDescriptorProto(::google::protobuf::Arena* PROTOBUF_NULLABLE arena)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(arena, FieldDescriptorProto_class_data_.base()) {
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(arena) {
#endif  // PROTOBUF_CUSTOM_VTABLE
  SharedCtor(arena);
  // @@protoc_insertion_point(arena_constructor:google.protobuf.FieldDescriptorProto)
}
PROTOBUF_NDEBUG_INLINE FieldDescriptorProto::Impl_::Impl_(
    [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility,
    [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from,
    [[maybe_unused]] const ::google::protobuf::FieldDescriptorProto& from_msg)
      : _has_bits_{from._has_bits_},
        _cached_size_{0},
        name_(arena, from.name_),
        extendee_(arena, from.extendee_),
        type_name_(arena, from.type_name_),
        default_value_(arena, from.default_value_),
        json_name_(arena, from.json_name_) {}

FieldDescriptorProto::FieldDescriptorProto(
    ::google::protobuf::Arena* PROTOBUF_NULLABLE arena,
    const FieldDescriptorProto& from)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(arena, FieldDescriptorProto_class_data_.base()) {
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(arena) {
#endif  // PROTOBUF_CUSTOM_VTABLE
  FieldDescriptorProto* const _this = this;
  (void)_this;
  _internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(
      from._internal_metadata_);
  new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from);
  ::uint32_t cached_has_bits = _impl_._has_bits_[0];
  _impl_.options_ = (CheckHasBit(cached_has_bits, 0x00000020U))
                ? ::google::protobuf::Message::CopyConstruct(arena, *from._impl_.options_)
                : nullptr;
  ::memcpy(reinterpret_cast<char*>(&_impl_) +
               offsetof(Impl_, number_),
           reinterpret_cast<const char*>(&from._impl_) +
               offsetof(Impl_, number_),
           offsetof(Impl_, type_) -
               offsetof(Impl_, number_) +
               sizeof(Impl_::type_));

  // @@protoc_insertion_point(copy_constructor:google.protobuf.FieldDescriptorProto)
}
PROTOBUF_NDEBUG_INLINE FieldDescriptorProto::Impl_::Impl_(
    [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility,
    [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena)
      : _cached_size_{0},
        name_(arena),
        extendee_(arena),
        type_name_(arena),
        default_value_(arena),
        json_name_(arena),
        label_{static_cast< ::google::protobuf::FieldDescriptorProto_Label >(1)},
        type_{static_cast< ::google::protobuf::FieldDescriptorProto_Type >(1)} {}

inline void FieldDescriptorProto::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) {
  new (&_impl_) Impl_(internal_visibility(), arena);
  ::memset(reinterpret_cast<char*>(&_impl_) +
               offsetof(Impl_, options_),
           0,
           offsetof(Impl_, proto3_optional_) -
               offsetof(Impl_, options_) +
               sizeof(Impl_::proto3_optional_));
}
FieldDescriptorProto::~FieldDescriptorProto() {
  // @@protoc_insertion_point(destructor:google.protobuf.FieldDescriptorProto)
  SharedDtor(*this);
}
inline void FieldDescriptorProto::SharedDtor(MessageLite& self) {
  FieldDescriptorProto& this_ = static_cast<FieldDescriptorProto&>(self);
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    this_.CheckHasBitConsistency();
  }
  this_._internal_metadata_.Delete<::google::protobuf::UnknownFieldSet>();
  ABSL_DCHECK(this_.GetArena() == nullptr);
  this_._impl_.name_.Destroy();
  this_._impl_.extendee_.Destroy();
  this_._impl_.type_name_.Destroy();
  this_._impl_.default_value_.Destroy();
  this_._impl_.json_name_.Destroy();
  delete this_._impl_.options_;
  this_._impl_.~Impl_();
}

inline void* PROTOBUF_NONNULL FieldDescriptorProto::PlacementNew_(
    const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem,
    ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) {
  return ::new (mem) FieldDescriptorProto(arena);
}
constexpr auto FieldDescriptorProto::InternalNewImpl_() {
  return ::google::protobuf::internal::MessageCreator::CopyInit(sizeof(FieldDescriptorProto),
                                            alignof(FieldDescriptorProto));
}
constexpr auto FieldDescriptorProto::InternalGenerateClassData_() {
  return ::google::protobuf::internal::ClassDataFull{
      ::google::protobuf::internal::ClassData{
          &_FieldDescriptorProto_default_instance_._instance,
          &_table_.header,
          nullptr,  // OnDemandRegisterArenaDtor
          FieldDescriptorProto::IsInitializedImpl,
          &FieldDescriptorProto::MergeImpl,
          ::google::protobuf::Message::GetNewImpl<FieldDescriptorProto>(),
#if defined(PROTOBUF_CUSTOM_VTABLE)
          &FieldDescriptorProto::SharedDtor,
          ::google::protobuf::Message::GetClearImpl<FieldDescriptorProto>(), &FieldDescriptorProto::ByteSizeLong,
              &FieldDescriptorProto::_InternalSerialize,
#endif  // PROTOBUF_CUSTOM_VTABLE
          PROTOBUF_FIELD_OFFSET(FieldDescriptorProto, _impl_._cached_size_),
          false,
      },
      &FieldDescriptorProto::kDescriptorMethods,
      &descriptor_table_google_2fprotobuf_2fdescriptor_2eproto,
      nullptr,  // tracker
  };
}

PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 const
    ::google::protobuf::internal::ClassDataFull FieldDescriptorProto_class_data_ =
        FieldDescriptorProto::InternalGenerateClassData_();

PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL
FieldDescriptorProto::GetClassData() const {
  ::google::protobuf::internal::PrefetchToLocalCache(&FieldDescriptorProto_class_data_);
  ::google::protobuf::internal::PrefetchToLocalCache(FieldDescriptorProto_class_data_.tc_table);
  return FieldDescriptorProto_class_data_.base();
}
constexpr ::_pbi::TcParseTable<4, 11, 3, 0, 2>
FieldDescriptorProto::_table_ = {
  {
    PROTOBUF_FIELD_OFFSET(FieldDescriptorProto, _impl_._has_bits_),
    0, // no _extensions_
    17, 120,  // max_field_number, fast_idx_mask
    offsetof(decltype(_table_), field_lookup_table),
    4294900736,  // skipmap
    offsetof(decltype(_table_), field_entries),
    11,  // num_field_entries
    3,  // num_aux_entries
    offsetof(decltype(_table_), aux_entries),
    FieldDescriptorProto_class_data_.base(),
    nullptr,  // post_loop_handler
    ::_pbi::TcParser::GenericFallback,  // fallback
    #ifdef PROTOBUF_PREFETCH_PARSE_TABLE
    ::_pbi::TcParser::GetTable<::google::protobuf::FieldDescriptorProto>(),  // to_prefetch
    #endif  // PROTOBUF_PREFETCH_PARSE_TABLE
  }, {{
    {::_pbi::TcParser::MiniParse, {}},
    // optional string name = 1;
    {::_pbi::TcParser::FastBS1,
     {10, 0, 0,
      PROTOBUF_FIELD_OFFSET(FieldDescriptorProto, _impl_.name_)}},
    // optional string extendee = 2;
    {::_pbi::TcParser::FastBS1,
     {18, 1, 0,
      PROTOBUF_FIELD_OFFSET(FieldDescriptorProto, _impl_.extendee_)}},
    // optional int32 number = 3;
    {::_pbi::TcParser::SingularVarintNoZag1<::uint32_t, offsetof(FieldDescriptorProto, _impl_.number_), 6>(),
     {24, 6, 0,
      PROTOBUF_FIELD_OFFSET(FieldDescriptorProto, _impl_.number_)}},
    // optional .google.protobuf.FieldDescriptorProto.Label label = 4;
    {::_pbi::TcParser::FastEr1S1,
     {32, 9, 3,
      PROTOBUF_FIELD_OFFSET(FieldDescriptorProto, _impl_.label_)}},
    // optional .google.protobuf.FieldDescriptorProto.Type type = 5;
    {::_pbi::TcParser::FastEr1S1,
     {40, 10, 18,
      PROTOBUF_FIELD_OFFSET(FieldDescriptorProto, _impl_.type_)}},
    // optional string type_name = 6;
    {::_pbi::TcParser::FastBS1,
     {50, 2, 0,
      PROTOBUF_FIELD_OFFSET(FieldDescriptorProto, _impl_.type_name_)}},
    // optional string default_value = 7;
    {::_pbi::TcParser::FastBS1,
     {58, 3, 0,
      PROTOBUF_FIELD_OFFSET(FieldDescriptorProto, _impl_.default_value_)}},
    // optional .google.protobuf.FieldOptions options = 8;
    {::_pbi::TcParser::FastMtS1,
     {66, 5, 0,
      PROTOBUF_FIELD_OFFSET(FieldDescriptorProto, _impl_.options_)}},
    // optional int32 oneof_index = 9;
    {::_pbi::TcParser::SingularVarintNoZag1<::uint32_t, offsetof(FieldDescriptorProto, _impl_.oneof_index_), 7>(),
     {72, 7, 0,
      PROTOBUF_FIELD_OFFSET(FieldDescriptorProto, _impl_.oneof_index_)}},
    // optional string json_name = 10;
    {::_pbi::TcParser::FastBS1,
     {82, 4, 0,
      PROTOBUF_FIELD_OFFSET(FieldDescriptorProto, _impl_.json_name_)}},
    {::_pbi::TcParser::MiniParse, {}},
    {::_pbi::TcParser::MiniParse, {}},
    {::_pbi::TcParser::MiniParse, {}},
    {::_pbi::TcParser::MiniParse, {}},
    {::_pbi::TcParser::MiniParse, {}},
  }}, {{
    65535, 65535
  }}, {{
    // optional string name = 1;
    {PROTOBUF_FIELD_OFFSET(FieldDescriptorProto, _impl_.name_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcOptional | ::_fl::kBytes | ::_fl::kRepAString)},
    // optional string extendee = 2;
    {PROTOBUF_FIELD_OFFSET(FieldDescriptorProto, _impl_.extendee_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kBytes | ::_fl::kRepAString)},
    // optional int32 number = 3;
    {PROTOBUF_FIELD_OFFSET(FieldDescriptorProto, _impl_.number_), _Internal::kHasBitsOffset + 6, 0, (0 | ::_fl::kFcOptional | ::_fl::kInt32)},
    // optional .google.protobuf.FieldDescriptorProto.Label label = 4;
    {PROTOBUF_FIELD_OFFSET(FieldDescriptorProto, _impl_.label_), _Internal::kHasBitsOffset + 9, 1, (0 | ::_fl::kFcOptional | ::_fl::kEnumRange)},
    // optional .google.protobuf.FieldDescriptorProto.Type type = 5;
    {PROTOBUF_FIELD_OFFSET(FieldDescriptorProto, _impl_.type_), _Internal::kHasBitsOffset + 10, 2, (0 | ::_fl::kFcOptional | ::_fl::kEnumRange)},
    // optional string type_name = 6;
    {PROTOBUF_FIELD_OFFSET(FieldDescriptorProto, _impl_.type_name_), _Internal::kHasBitsOffset + 2, 0, (0 | ::_fl::kFcOptional | ::_fl::kBytes | ::_fl::kRepAString)},
    // optional string default_value = 7;
    {PROTOBUF_FIELD_OFFSET(FieldDescriptorProto, _impl_.default_value_), _Internal::kHasBitsOffset + 3, 0, (0 | ::_fl::kFcOptional | ::_fl::kBytes | ::_fl::kRepAString)},
    // optional .google.protobuf.FieldOptions options = 8;
    {PROTOBUF_FIELD_OFFSET(FieldDescriptorProto, _impl_.options_), _Internal::kHasBitsOffset + 5, 0, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)},
    // optional int32 oneof_index = 9;
    {PROTOBUF_FIELD_OFFSET(FieldDescriptorProto, _impl_.oneof_index_), _Internal::kHasBitsOffset + 7, 0, (0 | ::_fl::kFcOptional | ::_fl::kInt32)},
    // optional string json_name = 10;
    {PROTOBUF_FIELD_OFFSET(FieldDescriptorProto, _impl_.json_name_), _Internal::kHasBitsOffset + 4, 0, (0 | ::_fl::kFcOptional | ::_fl::kBytes | ::_fl::kRepAString)},
    // optional bool proto3_optional = 17;
    {PROTOBUF_FIELD_OFFSET(FieldDescriptorProto, _impl_.proto3_optional_), _Internal::kHasBitsOffset + 8, 0, (0 | ::_fl::kFcOptional | ::_fl::kBool)},
  }},
  {{
      {::_pbi::TcParser::GetTable<::google::protobuf::FieldOptions>()},
      {1, 3},
      {1, 18},
  }},
  {{
  }},
};
PROTOBUF_NOINLINE void FieldDescriptorProto::Clear() {
// @@protoc_insertion_point(message_clear_start:google.protobuf.FieldDescriptorProto)
  ::google::protobuf::internal::TSanWrite(&_impl_);
  ::uint32_t cached_has_bits = 0;
  // Prevent compiler warnings about cached_has_bits being unused
  (void) cached_has_bits;

  cached_has_bits = _impl_._has_bits_[0];
  if (BatchCheckHasBit(cached_has_bits, 0x0000003fU)) {
    if (CheckHasBit(cached_has_bits, 0x00000001U)) {
      _impl_.name_.ClearNonDefaultToEmpty();
    }
    if (CheckHasBit(cached_has_bits, 0x00000002U)) {
      _impl_.extendee_.ClearNonDefaultToEmpty();
    }
    if (CheckHasBit(cached_has_bits, 0x00000004U)) {
      _impl_.type_name_.ClearNonDefaultToEmpty();
    }
    if (CheckHasBit(cached_has_bits, 0x00000008U)) {
      _impl_.default_value_.ClearNonDefaultToEmpty();
    }
    if (CheckHasBit(cached_has_bits, 0x00000010U)) {
      _impl_.json_name_.ClearNonDefaultToEmpty();
    }
    if (CheckHasBit(cached_has_bits, 0x00000020U)) {
      ABSL_DCHECK(_impl_.options_ != nullptr);
      _impl_.options_->Clear();
    }
  }
  if (BatchCheckHasBit(cached_has_bits, 0x000000c0U)) {
    ::memset(&_impl_.number_, 0, static_cast<::size_t>(
        reinterpret_cast<char*>(&_impl_.oneof_index_) -
        reinterpret_cast<char*>(&_impl_.number_)) + sizeof(_impl_.oneof_index_));
  }
  if (BatchCheckHasBit(cached_has_bits, 0x00000700U)) {
    _impl_.proto3_optional_ = false;
    _impl_.label_ = 1;
    _impl_.type_ = 1;
  }
  _impl_._has_bits_.Clear();
  _internal_metadata_.Clear<::google::protobuf::UnknownFieldSet>();
}

#if defined(PROTOBUF_CUSTOM_VTABLE)
::uint8_t* PROTOBUF_NONNULL FieldDescriptorProto::_InternalSerialize(
    const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target,
    ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) {
  const FieldDescriptorProto& this_ = static_cast<const FieldDescriptorProto&>(base);
#else   // PROTOBUF_CUSTOM_VTABLE
::uint8_t* PROTOBUF_NONNULL FieldDescriptorProto::_InternalSerialize(
    ::uint8_t* PROTOBUF_NONNULL target,
    ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const {
  const FieldDescriptorProto& this_ = *this;
#endif  // PROTOBUF_CUSTOM_VTABLE
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    this_.CheckHasBitConsistency();
  }
  // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.FieldDescriptorProto)
  ::uint32_t cached_has_bits = 0;
  (void)cached_has_bits;

  cached_has_bits = this_._impl_._has_bits_[0];
  // optional string name = 1;
  if (CheckHasBit(cached_has_bits, 0x00000001U)) {
    const ::std::string& _s = this_._internal_name();
    target = stream->WriteStringMaybeAliased(1, _s, target);
  }

  // optional string extendee = 2;
  if (CheckHasBit(cached_has_bits, 0x00000002U)) {
    const ::std::string& _s = this_._internal_extendee();
    target = stream->WriteStringMaybeAliased(2, _s, target);
  }

  // optional int32 number = 3;
  if (CheckHasBit(cached_has_bits, 0x00000040U)) {
    target =
        ::google::protobuf::internal::WireFormatLite::WriteInt32ToArrayWithField<3>(
            stream, this_._internal_number(), target);
  }

  // optional .google.protobuf.FieldDescriptorProto.Label label = 4;
  if (CheckHasBit(cached_has_bits, 0x00000200U)) {
    target = stream->EnsureSpace(target);
    target = ::_pbi::WireFormatLite::WriteEnumToArray(
        4, this_._internal_label(), target);
  }

  // optional .google.protobuf.FieldDescriptorProto.Type type = 5;
  if (CheckHasBit(cached_has_bits, 0x00000400U)) {
    target = stream->EnsureSpace(target);
    target = ::_pbi::WireFormatLite::WriteEnumToArray(
        5, this_._internal_type(), target);
  }

  // optional string type_name = 6;
  if (CheckHasBit(cached_has_bits, 0x00000004U)) {
    const ::std::string& _s = this_._internal_type_name();
    target = stream->WriteStringMaybeAliased(6, _s, target);
  }

  // optional string default_value = 7;
  if (CheckHasBit(cached_has_bits, 0x00000008U)) {
    const ::std::string& _s = this_._internal_default_value();
    target = stream->WriteStringMaybeAliased(7, _s, target);
  }

  // optional .google.protobuf.FieldOptions options = 8;
  if (CheckHasBit(cached_has_bits, 0x00000020U)) {
    target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage(
        8, *this_._impl_.options_, this_._impl_.options_->GetCachedSize(), target,
        stream);
  }

  // optional int32 oneof_index = 9;
  if (CheckHasBit(cached_has_bits, 0x00000080U)) {
    target =
        ::google::protobuf::internal::WireFormatLite::WriteInt32ToArrayWithField<9>(
            stream, this_._internal_oneof_index(), target);
  }

  // optional string json_name = 10;
  if (CheckHasBit(cached_has_bits, 0x00000010U)) {
    const ::std::string& _s = this_._internal_json_name();
    target = stream->WriteStringMaybeAliased(10, _s, target);
  }

  // optional bool proto3_optional = 17;
  if (CheckHasBit(cached_has_bits, 0x00000100U)) {
    target = stream->EnsureSpace(target);
    target = ::_pbi::WireFormatLite::WriteBoolToArray(
        17, this_._internal_proto3_optional(), target);
  }

  if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) {
    target =
        ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray(
            this_._internal_metadata_.unknown_fields<::google::protobuf::UnknownFieldSet>(::google::protobuf::UnknownFieldSet::default_instance), target, stream);
  }
  // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.FieldDescriptorProto)
  return target;
}

#if defined(PROTOBUF_CUSTOM_VTABLE)
::size_t FieldDescriptorProto::ByteSizeLong(const MessageLite& base) {
  const FieldDescriptorProto& this_ = static_cast<const FieldDescriptorProto&>(base);
#else   // PROTOBUF_CUSTOM_VTABLE
::size_t FieldDescriptorProto::ByteSizeLong() const {
  const FieldDescriptorProto& this_ = *this;
#endif  // PROTOBUF_CUSTOM_VTABLE
  // @@protoc_insertion_point(message_byte_size_start:google.protobuf.FieldDescriptorProto)
  ::size_t total_size = 0;

  ::uint32_t cached_has_bits = 0;
  // Prevent compiler warnings about cached_has_bits being unused
  (void)cached_has_bits;

  ::_pbi::Prefetch5LinesFrom7Lines(&this_);
  cached_has_bits = this_._impl_._has_bits_[0];
  total_size += static_cast<bool>(0x00000100U & cached_has_bits) * 3;
  if (BatchCheckHasBit(cached_has_bits, 0x000000ffU)) {
    // optional string name = 1;
    if (CheckHasBit(cached_has_bits, 0x00000001U)) {
      total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize(
                                      this_._internal_name());
    }
    // optional string extendee = 2;
    if (CheckHasBit(cached_has_bits, 0x00000002U)) {
      total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize(
                                      this_._internal_extendee());
    }
    // optional string type_name = 6;
    if (CheckHasBit(cached_has_bits, 0x00000004U)) {
      total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize(
                                      this_._internal_type_name());
    }
    // optional string default_value = 7;
    if (CheckHasBit(cached_has_bits, 0x00000008U)) {
      total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize(
                                      this_._internal_default_value());
    }
    // optional string json_name = 10;
    if (CheckHasBit(cached_has_bits, 0x00000010U)) {
      total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize(
                                      this_._internal_json_name());
    }
    // optional .google.protobuf.FieldOptions options = 8;
    if (CheckHasBit(cached_has_bits, 0x00000020U)) {
      total_size += 1 +
                    ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.options_);
    }
    // optional int32 number = 3;
    if (CheckHasBit(cached_has_bits, 0x00000040U)) {
      total_size += ::_pbi::WireFormatLite::Int32SizePlusOne(
          this_._internal_number());
    }
    // optional int32 oneof_index = 9;
    if (CheckHasBit(cached_has_bits, 0x00000080U)) {
      total_size += ::_pbi::WireFormatLite::Int32SizePlusOne(
          this_._internal_oneof_index());
    }
  }
  if (BatchCheckHasBit(cached_has_bits, 0x00000600U)) {
    // optional .google.protobuf.FieldDescriptorProto.Label label = 4;
    if (CheckHasBit(cached_has_bits, 0x00000200U)) {
      total_size += 1 +
                    ::_pbi::WireFormatLite::EnumSize(this_._internal_label());
    }
    // optional .google.protobuf.FieldDescriptorProto.Type type = 5;
    if (CheckHasBit(cached_has_bits, 0x00000400U)) {
      total_size += 1 +
                    ::_pbi::WireFormatLite::EnumSize(this_._internal_type());
    }
  }
  return this_.MaybeComputeUnknownFieldsSize(total_size,
                                             &this_._impl_._cached_size_);
}

void FieldDescriptorProto::MergeImpl(::google::protobuf::MessageLite& to_msg,
                            const ::google::protobuf::MessageLite& from_msg) {
   auto* const _this =
      static_cast<FieldDescriptorProto*>(&to_msg);
  auto& from = static_cast<const FieldDescriptorProto&>(from_msg);
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    from.CheckHasBitConsistency();
  }
  ::google::protobuf::Arena* arena = _this->GetArena();
  // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.FieldDescriptorProto)
  ABSL_DCHECK_NE(&from, _this);
  ::uint32_t cached_has_bits = 0;
  (void)cached_has_bits;

  cached_has_bits = from._impl_._has_bits_[0];
  if (BatchCheckHasBit(cached_has_bits, 0x000000ffU)) {
    if (CheckHasBit(cached_has_bits, 0x00000001U)) {
      _this->_internal_set_name(from._internal_name());
    }
    if (CheckHasBit(cached_has_bits, 0x00000002U)) {
      _this->_internal_set_extendee(from._internal_extendee());
    }
    if (CheckHasBit(cached_has_bits, 0x00000004U)) {
      _this->_internal_set_type_name(from._internal_type_name());
    }
    if (CheckHasBit(cached_has_bits, 0x00000008U)) {
      _this->_internal_set_default_value(from._internal_default_value());
    }
    if (CheckHasBit(cached_has_bits, 0x00000010U)) {
      _this->_internal_set_json_name(from._internal_json_name());
    }
    if (CheckHasBit(cached_has_bits, 0x00000020U)) {
      ABSL_DCHECK(from._impl_.options_ != nullptr);
      if (_this->_impl_.options_ == nullptr) {
        _this->_impl_.options_ = ::google::protobuf::Message::CopyConstruct(arena, *from._impl_.options_);
      } else {
        _this->_impl_.options_->MergeFrom(*from._impl_.options_);
      }
    }
    if (CheckHasBit(cached_has_bits, 0x00000040U)) {
      _this->_impl_.number_ = from._impl_.number_;
    }
    if (CheckHasBit(cached_has_bits, 0x00000080U)) {
      _this->_impl_.oneof_index_ = from._impl_.oneof_index_;
    }
  }
  if (BatchCheckHasBit(cached_has_bits, 0x00000700U)) {
    if (CheckHasBit(cached_has_bits, 0x00000100U)) {
      _this->_impl_.proto3_optional_ = from._impl_.proto3_optional_;
    }
    if (CheckHasBit(cached_has_bits, 0x00000200U)) {
      _this->_impl_.label_ = from._impl_.label_;
    }
    if (CheckHasBit(cached_has_bits, 0x00000400U)) {
      _this->_impl_.type_ = from._impl_.type_;
    }
  }
  _this->_impl_._has_bits_[0] |= cached_has_bits;
  _this->_internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(
      from._internal_metadata_);
}

void FieldDescriptorProto::CopyFrom(const FieldDescriptorProto& from) {
  // @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.FieldDescriptorProto)
  if (&from == this) return;
  Clear();
  MergeFrom(from);
}

PROTOBUF_NOINLINE bool FieldDescriptorProto::IsInitializedImpl(
    const MessageLite& msg) {
  auto& this_ = static_cast<const FieldDescriptorProto&>(msg);
  if (CheckHasBit(this_._impl_._has_bits_[0], 0x00000020U)) {
    if (!this_._impl_.options_->IsInitialized()) return false;
  }
  return true;
}

void FieldDescriptorProto::InternalSwap(FieldDescriptorProto* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) {
  using ::std::swap;
  auto* arena = GetArena();
  ABSL_DCHECK_EQ(arena, other->GetArena());
  _internal_metadata_.InternalSwap(&other->_internal_metadata_);
  swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]);
  ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.name_, &other->_impl_.name_, arena);
  ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.extendee_, &other->_impl_.extendee_, arena);
  ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.type_name_, &other->_impl_.type_name_, arena);
  ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.default_value_, &other->_impl_.default_value_, arena);
  ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.json_name_, &other->_impl_.json_name_, arena);
  ::google::protobuf::internal::memswap<
      PROTOBUF_FIELD_OFFSET(FieldDescriptorProto, _impl_.type_)
      + sizeof(FieldDescriptorProto::_impl_.type_)
      - PROTOBUF_FIELD_OFFSET(FieldDescriptorProto, _impl_.options_)>(
          reinterpret_cast<char*>(&_impl_.options_),
          reinterpret_cast<char*>(&other->_impl_.options_));
}

::google::protobuf::Metadata FieldDescriptorProto::GetMetadata() const {
  return ::google::protobuf::Message::GetMetadataImpl(GetClassData()->full());
}
// ===================================================================

class OneofDescriptorProto::_Internal {
 public:
  using HasBits =
      decltype(::std::declval<OneofDescriptorProto>()._impl_._has_bits_);
  static constexpr ::int32_t kHasBitsOffset =
      8 * PROTOBUF_FIELD_OFFSET(OneofDescriptorProto, _impl_._has_bits_);
};

OneofDescriptorProto::OneofDescriptorProto(::google::protobuf::Arena* PROTOBUF_NULLABLE arena)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(arena, OneofDescriptorProto_class_data_.base()) {
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(arena) {
#endif  // PROTOBUF_CUSTOM_VTABLE
  SharedCtor(arena);
  // @@protoc_insertion_point(arena_constructor:google.protobuf.OneofDescriptorProto)
}
PROTOBUF_NDEBUG_INLINE OneofDescriptorProto::Impl_::Impl_(
    [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility,
    [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from,
    [[maybe_unused]] const ::google::protobuf::OneofDescriptorProto& from_msg)
      : _has_bits_{from._has_bits_},
        _cached_size_{0},
        name_(arena, from.name_) {}

OneofDescriptorProto::OneofDescriptorProto(
    ::google::protobuf::Arena* PROTOBUF_NULLABLE arena,
    const OneofDescriptorProto& from)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(arena, OneofDescriptorProto_class_data_.base()) {
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(arena) {
#endif  // PROTOBUF_CUSTOM_VTABLE
  OneofDescriptorProto* const _this = this;
  (void)_this;
  _internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(
      from._internal_metadata_);
  new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from);
  ::uint32_t cached_has_bits = _impl_._has_bits_[0];
  _impl_.options_ = (CheckHasBit(cached_has_bits, 0x00000002U))
                ? ::google::protobuf::Message::CopyConstruct(arena, *from._impl_.options_)
                : nullptr;

  // @@protoc_insertion_point(copy_constructor:google.protobuf.OneofDescriptorProto)
}
PROTOBUF_NDEBUG_INLINE OneofDescriptorProto::Impl_::Impl_(
    [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility,
    [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena)
      : _cached_size_{0},
        name_(arena) {}

inline void OneofDescriptorProto::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) {
  new (&_impl_) Impl_(internal_visibility(), arena);
  _impl_.options_ = {};
}
OneofDescriptorProto::~OneofDescriptorProto() {
  // @@protoc_insertion_point(destructor:google.protobuf.OneofDescriptorProto)
  SharedDtor(*this);
}
inline void OneofDescriptorProto::SharedDtor(MessageLite& self) {
  OneofDescriptorProto& this_ = static_cast<OneofDescriptorProto&>(self);
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    this_.CheckHasBitConsistency();
  }
  this_._internal_metadata_.Delete<::google::protobuf::UnknownFieldSet>();
  ABSL_DCHECK(this_.GetArena() == nullptr);
  this_._impl_.name_.Destroy();
  delete this_._impl_.options_;
  this_._impl_.~Impl_();
}

inline void* PROTOBUF_NONNULL OneofDescriptorProto::PlacementNew_(
    const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem,
    ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) {
  return ::new (mem) OneofDescriptorProto(arena);
}
constexpr auto OneofDescriptorProto::InternalNewImpl_() {
  return ::google::protobuf::internal::MessageCreator::CopyInit(sizeof(OneofDescriptorProto),
                                            alignof(OneofDescriptorProto));
}
constexpr auto OneofDescriptorProto::InternalGenerateClassData_() {
  return ::google::protobuf::internal::ClassDataFull{
      ::google::protobuf::internal::ClassData{
          &_OneofDescriptorProto_default_instance_._instance,
          &_table_.header,
          nullptr,  // OnDemandRegisterArenaDtor
          OneofDescriptorProto::IsInitializedImpl,
          &OneofDescriptorProto::MergeImpl,
          ::google::protobuf::Message::GetNewImpl<OneofDescriptorProto>(),
#if defined(PROTOBUF_CUSTOM_VTABLE)
          &OneofDescriptorProto::SharedDtor,
          ::google::protobuf::Message::GetClearImpl<OneofDescriptorProto>(), &OneofDescriptorProto::ByteSizeLong,
              &OneofDescriptorProto::_InternalSerialize,
#endif  // PROTOBUF_CUSTOM_VTABLE
          PROTOBUF_FIELD_OFFSET(OneofDescriptorProto, _impl_._cached_size_),
          false,
      },
      &OneofDescriptorProto::kDescriptorMethods,
      &descriptor_table_google_2fprotobuf_2fdescriptor_2eproto,
      nullptr,  // tracker
  };
}

PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 const
    ::google::protobuf::internal::ClassDataFull OneofDescriptorProto_class_data_ =
        OneofDescriptorProto::InternalGenerateClassData_();

PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL
OneofDescriptorProto::GetClassData() const {
  ::google::protobuf::internal::PrefetchToLocalCache(&OneofDescriptorProto_class_data_);
  ::google::protobuf::internal::PrefetchToLocalCache(OneofDescriptorProto_class_data_.tc_table);
  return OneofDescriptorProto_class_data_.base();
}
constexpr ::_pbi::TcParseTable<1, 2, 1, 0, 2>
OneofDescriptorProto::_table_ = {
  {
    PROTOBUF_FIELD_OFFSET(OneofDescriptorProto, _impl_._has_bits_),
    0, // no _extensions_
    2, 8,  // max_field_number, fast_idx_mask
    offsetof(decltype(_table_), field_lookup_table),
    4294967292,  // skipmap
    offsetof(decltype(_table_), field_entries),
    2,  // num_field_entries
    1,  // num_aux_entries
    offsetof(decltype(_table_), aux_entries),
    OneofDescriptorProto_class_data_.base(),
    nullptr,  // post_loop_handler
    ::_pbi::TcParser::GenericFallback,  // fallback
    #ifdef PROTOBUF_PREFETCH_PARSE_TABLE
    ::_pbi::TcParser::GetTable<::google::protobuf::OneofDescriptorProto>(),  // to_prefetch
    #endif  // PROTOBUF_PREFETCH_PARSE_TABLE
  }, {{
    // optional .google.protobuf.OneofOptions options = 2;
    {::_pbi::TcParser::FastMtS1,
     {18, 1, 0,
      PROTOBUF_FIELD_OFFSET(OneofDescriptorProto, _impl_.options_)}},
    // optional string name = 1;
    {::_pbi::TcParser::FastBS1,
     {10, 0, 0,
      PROTOBUF_FIELD_OFFSET(OneofDescriptorProto, _impl_.name_)}},
  }}, {{
    65535, 65535
  }}, {{
    // optional string name = 1;
    {PROTOBUF_FIELD_OFFSET(OneofDescriptorProto, _impl_.name_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcOptional | ::_fl::kBytes | ::_fl::kRepAString)},
    // optional .google.protobuf.OneofOptions options = 2;
    {PROTOBUF_FIELD_OFFSET(OneofDescriptorProto, _impl_.options_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)},
  }},
  {{
      {::_pbi::TcParser::GetTable<::google::protobuf::OneofOptions>()},
  }},
  {{
  }},
};
PROTOBUF_NOINLINE void OneofDescriptorProto::Clear() {
// @@protoc_insertion_point(message_clear_start:google.protobuf.OneofDescriptorProto)
  ::google::protobuf::internal::TSanWrite(&_impl_);
  ::uint32_t cached_has_bits = 0;
  // Prevent compiler warnings about cached_has_bits being unused
  (void) cached_has_bits;

  cached_has_bits = _impl_._has_bits_[0];
  if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) {
    if (CheckHasBit(cached_has_bits, 0x00000001U)) {
      _impl_.name_.ClearNonDefaultToEmpty();
    }
    if (CheckHasBit(cached_has_bits, 0x00000002U)) {
      ABSL_DCHECK(_impl_.options_ != nullptr);
      _impl_.options_->Clear();
    }
  }
  _impl_._has_bits_.Clear();
  _internal_metadata_.Clear<::google::protobuf::UnknownFieldSet>();
}

#if defined(PROTOBUF_CUSTOM_VTABLE)
::uint8_t* PROTOBUF_NONNULL OneofDescriptorProto::_InternalSerialize(
    const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target,
    ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) {
  const OneofDescriptorProto& this_ = static_cast<const OneofDescriptorProto&>(base);
#else   // PROTOBUF_CUSTOM_VTABLE
::uint8_t* PROTOBUF_NONNULL OneofDescriptorProto::_InternalSerialize(
    ::uint8_t* PROTOBUF_NONNULL target,
    ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const {
  const OneofDescriptorProto& this_ = *this;
#endif  // PROTOBUF_CUSTOM_VTABLE
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    this_.CheckHasBitConsistency();
  }
  // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.OneofDescriptorProto)
  ::uint32_t cached_has_bits = 0;
  (void)cached_has_bits;

  cached_has_bits = this_._impl_._has_bits_[0];
  // optional string name = 1;
  if (CheckHasBit(cached_has_bits, 0x00000001U)) {
    const ::std::string& _s = this_._internal_name();
    target = stream->WriteStringMaybeAliased(1, _s, target);
  }

  // optional .google.protobuf.OneofOptions options = 2;
  if (CheckHasBit(cached_has_bits, 0x00000002U)) {
    target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage(
        2, *this_._impl_.options_, this_._impl_.options_->GetCachedSize(), target,
        stream);
  }

  if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) {
    target =
        ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray(
            this_._internal_metadata_.unknown_fields<::google::protobuf::UnknownFieldSet>(::google::protobuf::UnknownFieldSet::default_instance), target, stream);
  }
  // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.OneofDescriptorProto)
  return target;
}

#if defined(PROTOBUF_CUSTOM_VTABLE)
::size_t OneofDescriptorProto::ByteSizeLong(const MessageLite& base) {
  const OneofDescriptorProto& this_ = static_cast<const OneofDescriptorProto&>(base);
#else   // PROTOBUF_CUSTOM_VTABLE
::size_t OneofDescriptorProto::ByteSizeLong() const {
  const OneofDescriptorProto& this_ = *this;
#endif  // PROTOBUF_CUSTOM_VTABLE
  // @@protoc_insertion_point(message_byte_size_start:google.protobuf.OneofDescriptorProto)
  ::size_t total_size = 0;

  ::uint32_t cached_has_bits = 0;
  // Prevent compiler warnings about cached_has_bits being unused
  (void)cached_has_bits;

  ::_pbi::Prefetch5LinesFrom7Lines(&this_);
  cached_has_bits = this_._impl_._has_bits_[0];
  if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) {
    // optional string name = 1;
    if (CheckHasBit(cached_has_bits, 0x00000001U)) {
      total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize(
                                      this_._internal_name());
    }
    // optional .google.protobuf.OneofOptions options = 2;
    if (CheckHasBit(cached_has_bits, 0x00000002U)) {
      total_size += 1 +
                    ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.options_);
    }
  }
  return this_.MaybeComputeUnknownFieldsSize(total_size,
                                             &this_._impl_._cached_size_);
}

void OneofDescriptorProto::MergeImpl(::google::protobuf::MessageLite& to_msg,
                            const ::google::protobuf::MessageLite& from_msg) {
   auto* const _this =
      static_cast<OneofDescriptorProto*>(&to_msg);
  auto& from = static_cast<const OneofDescriptorProto&>(from_msg);
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    from.CheckHasBitConsistency();
  }
  ::google::protobuf::Arena* arena = _this->GetArena();
  // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.OneofDescriptorProto)
  ABSL_DCHECK_NE(&from, _this);
  ::uint32_t cached_has_bits = 0;
  (void)cached_has_bits;

  cached_has_bits = from._impl_._has_bits_[0];
  if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) {
    if (CheckHasBit(cached_has_bits, 0x00000001U)) {
      _this->_internal_set_name(from._internal_name());
    }
    if (CheckHasBit(cached_has_bits, 0x00000002U)) {
      ABSL_DCHECK(from._impl_.options_ != nullptr);
      if (_this->_impl_.options_ == nullptr) {
        _this->_impl_.options_ = ::google::protobuf::Message::CopyConstruct(arena, *from._impl_.options_);
      } else {
        _this->_impl_.options_->MergeFrom(*from._impl_.options_);
      }
    }
  }
  _this->_impl_._has_bits_[0] |= cached_has_bits;
  _this->_internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(
      from._internal_metadata_);
}

void OneofDescriptorProto::CopyFrom(const OneofDescriptorProto& from) {
  // @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.OneofDescriptorProto)
  if (&from == this) return;
  Clear();
  MergeFrom(from);
}

PROTOBUF_NOINLINE bool OneofDescriptorProto::IsInitializedImpl(
    const MessageLite& msg) {
  auto& this_ = static_cast<const OneofDescriptorProto&>(msg);
  if (CheckHasBit(this_._impl_._has_bits_[0], 0x00000002U)) {
    if (!this_._impl_.options_->IsInitialized()) return false;
  }
  return true;
}

void OneofDescriptorProto::InternalSwap(OneofDescriptorProto* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) {
  using ::std::swap;
  auto* arena = GetArena();
  ABSL_DCHECK_EQ(arena, other->GetArena());
  _internal_metadata_.InternalSwap(&other->_internal_metadata_);
  swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]);
  ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.name_, &other->_impl_.name_, arena);
  swap(_impl_.options_, other->_impl_.options_);
}

::google::protobuf::Metadata OneofDescriptorProto::GetMetadata() const {
  return ::google::protobuf::Message::GetMetadataImpl(GetClassData()->full());
}
// ===================================================================

class EnumDescriptorProto_EnumReservedRange::_Internal {
 public:
  using HasBits =
      decltype(::std::declval<EnumDescriptorProto_EnumReservedRange>()._impl_._has_bits_);
  static constexpr ::int32_t kHasBitsOffset =
      8 * PROTOBUF_FIELD_OFFSET(EnumDescriptorProto_EnumReservedRange, _impl_._has_bits_);
};

EnumDescriptorProto_EnumReservedRange::EnumDescriptorProto_EnumReservedRange(::google::protobuf::Arena* PROTOBUF_NULLABLE arena)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(arena, EnumDescriptorProto_EnumReservedRange_class_data_.base()) {
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(arena) {
#endif  // PROTOBUF_CUSTOM_VTABLE
  SharedCtor(arena);
  // @@protoc_insertion_point(arena_constructor:google.protobuf.EnumDescriptorProto.EnumReservedRange)
}
EnumDescriptorProto_EnumReservedRange::EnumDescriptorProto_EnumReservedRange(
    ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const EnumDescriptorProto_EnumReservedRange& from)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(arena, EnumDescriptorProto_EnumReservedRange_class_data_.base()),
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(arena),
#endif  // PROTOBUF_CUSTOM_VTABLE
      _impl_(from._impl_) {
  _internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(
      from._internal_metadata_);
}
PROTOBUF_NDEBUG_INLINE EnumDescriptorProto_EnumReservedRange::Impl_::Impl_(
    [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility,
    [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena)
      : _cached_size_{0} {}

inline void EnumDescriptorProto_EnumReservedRange::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) {
  new (&_impl_) Impl_(internal_visibility(), arena);
  ::memset(reinterpret_cast<char*>(&_impl_) +
               offsetof(Impl_, start_),
           0,
           offsetof(Impl_, end_) -
               offsetof(Impl_, start_) +
               sizeof(Impl_::end_));
}
EnumDescriptorProto_EnumReservedRange::~EnumDescriptorProto_EnumReservedRange() {
  // @@protoc_insertion_point(destructor:google.protobuf.EnumDescriptorProto.EnumReservedRange)
  SharedDtor(*this);
}
inline void EnumDescriptorProto_EnumReservedRange::SharedDtor(MessageLite& self) {
  EnumDescriptorProto_EnumReservedRange& this_ = static_cast<EnumDescriptorProto_EnumReservedRange&>(self);
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    this_.CheckHasBitConsistency();
  }
  this_._internal_metadata_.Delete<::google::protobuf::UnknownFieldSet>();
  ABSL_DCHECK(this_.GetArena() == nullptr);
  this_._impl_.~Impl_();
}

inline void* PROTOBUF_NONNULL EnumDescriptorProto_EnumReservedRange::PlacementNew_(
    const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem,
    ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) {
  return ::new (mem) EnumDescriptorProto_EnumReservedRange(arena);
}
constexpr auto EnumDescriptorProto_EnumReservedRange::InternalNewImpl_() {
  return ::google::protobuf::internal::MessageCreator::ZeroInit(sizeof(EnumDescriptorProto_EnumReservedRange),
                                            alignof(EnumDescriptorProto_EnumReservedRange));
}
constexpr auto EnumDescriptorProto_EnumReservedRange::InternalGenerateClassData_() {
  return ::google::protobuf::internal::ClassDataFull{
      ::google::protobuf::internal::ClassData{
          &_EnumDescriptorProto_EnumReservedRange_default_instance_._instance,
          &_table_.header,
          nullptr,  // OnDemandRegisterArenaDtor
          nullptr,  // IsInitialized
          &EnumDescriptorProto_EnumReservedRange::MergeImpl,
          ::google::protobuf::Message::GetNewImpl<EnumDescriptorProto_EnumReservedRange>(),
#if defined(PROTOBUF_CUSTOM_VTABLE)
          &EnumDescriptorProto_EnumReservedRange::SharedDtor,
          ::google::protobuf::Message::GetClearImpl<EnumDescriptorProto_EnumReservedRange>(), &EnumDescriptorProto_EnumReservedRange::ByteSizeLong,
              &EnumDescriptorProto_EnumReservedRange::_InternalSerialize,
#endif  // PROTOBUF_CUSTOM_VTABLE
          PROTOBUF_FIELD_OFFSET(EnumDescriptorProto_EnumReservedRange, _impl_._cached_size_),
          false,
      },
      &EnumDescriptorProto_EnumReservedRange::kDescriptorMethods,
      &descriptor_table_google_2fprotobuf_2fdescriptor_2eproto,
      nullptr,  // tracker
  };
}

PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 const
    ::google::protobuf::internal::ClassDataFull EnumDescriptorProto_EnumReservedRange_class_data_ =
        EnumDescriptorProto_EnumReservedRange::InternalGenerateClassData_();

PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL
EnumDescriptorProto_EnumReservedRange::GetClassData() const {
  ::google::protobuf::internal::PrefetchToLocalCache(&EnumDescriptorProto_EnumReservedRange_class_data_);
  ::google::protobuf::internal::PrefetchToLocalCache(EnumDescriptorProto_EnumReservedRange_class_data_.tc_table);
  return EnumDescriptorProto_EnumReservedRange_class_data_.base();
}
constexpr ::_pbi::TcParseTable<1, 2, 0, 0, 2>
EnumDescriptorProto_EnumReservedRange::_table_ = {
  {
    PROTOBUF_FIELD_OFFSET(EnumDescriptorProto_EnumReservedRange, _impl_._has_bits_),
    0, // no _extensions_
    2, 8,  // max_field_number, fast_idx_mask
    offsetof(decltype(_table_), field_lookup_table),
    4294967292,  // skipmap
    offsetof(decltype(_table_), field_entries),
    2,  // num_field_entries
    0,  // num_aux_entries
    offsetof(decltype(_table_), field_names),  // no aux_entries
    EnumDescriptorProto_EnumReservedRange_class_data_.base(),
    nullptr,  // post_loop_handler
    ::_pbi::TcParser::GenericFallback,  // fallback
    #ifdef PROTOBUF_PREFETCH_PARSE_TABLE
    ::_pbi::TcParser::GetTable<::google::protobuf::EnumDescriptorProto_EnumReservedRange>(),  // to_prefetch
    #endif  // PROTOBUF_PREFETCH_PARSE_TABLE
  }, {{
    // optional int32 end = 2;
    {::_pbi::TcParser::SingularVarintNoZag1<::uint32_t, offsetof(EnumDescriptorProto_EnumReservedRange, _impl_.end_), 1>(),
     {16, 1, 0,
      PROTOBUF_FIELD_OFFSET(EnumDescriptorProto_EnumReservedRange, _impl_.end_)}},
    // optional int32 start = 1;
    {::_pbi::TcParser::SingularVarintNoZag1<::uint32_t, offsetof(EnumDescriptorProto_EnumReservedRange, _impl_.start_), 0>(),
     {8, 0, 0,
      PROTOBUF_FIELD_OFFSET(EnumDescriptorProto_EnumReservedRange, _impl_.start_)}},
  }}, {{
    65535, 65535
  }}, {{
    // optional int32 start = 1;
    {PROTOBUF_FIELD_OFFSET(EnumDescriptorProto_EnumReservedRange, _impl_.start_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcOptional | ::_fl::kInt32)},
    // optional int32 end = 2;
    {PROTOBUF_FIELD_OFFSET(EnumDescriptorProto_EnumReservedRange, _impl_.end_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kInt32)},
  }},
  // no aux_entries
  {{
  }},
};
PROTOBUF_NOINLINE void EnumDescriptorProto_EnumReservedRange::Clear() {
// @@protoc_insertion_point(message_clear_start:google.protobuf.EnumDescriptorProto.EnumReservedRange)
  ::google::protobuf::internal::TSanWrite(&_impl_);
  ::uint32_t cached_has_bits = 0;
  // Prevent compiler warnings about cached_has_bits being unused
  (void) cached_has_bits;

  cached_has_bits = _impl_._has_bits_[0];
  if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) {
    ::memset(&_impl_.start_, 0, static_cast<::size_t>(
        reinterpret_cast<char*>(&_impl_.end_) -
        reinterpret_cast<char*>(&_impl_.start_)) + sizeof(_impl_.end_));
  }
  _impl_._has_bits_.Clear();
  _internal_metadata_.Clear<::google::protobuf::UnknownFieldSet>();
}

#if defined(PROTOBUF_CUSTOM_VTABLE)
::uint8_t* PROTOBUF_NONNULL EnumDescriptorProto_EnumReservedRange::_InternalSerialize(
    const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target,
    ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) {
  const EnumDescriptorProto_EnumReservedRange& this_ = static_cast<const EnumDescriptorProto_EnumReservedRange&>(base);
#else   // PROTOBUF_CUSTOM_VTABLE
::uint8_t* PROTOBUF_NONNULL EnumDescriptorProto_EnumReservedRange::_InternalSerialize(
    ::uint8_t* PROTOBUF_NONNULL target,
    ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const {
  const EnumDescriptorProto_EnumReservedRange& this_ = *this;
#endif  // PROTOBUF_CUSTOM_VTABLE
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    this_.CheckHasBitConsistency();
  }
  // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.EnumDescriptorProto.EnumReservedRange)
  ::uint32_t cached_has_bits = 0;
  (void)cached_has_bits;

  cached_has_bits = this_._impl_._has_bits_[0];
  // optional int32 start = 1;
  if (CheckHasBit(cached_has_bits, 0x00000001U)) {
    target =
        ::google::protobuf::internal::WireFormatLite::WriteInt32ToArrayWithField<1>(
            stream, this_._internal_start(), target);
  }

  // optional int32 end = 2;
  if (CheckHasBit(cached_has_bits, 0x00000002U)) {
    target =
        ::google::protobuf::internal::WireFormatLite::WriteInt32ToArrayWithField<2>(
            stream, this_._internal_end(), target);
  }

  if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) {
    target =
        ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray(
            this_._internal_metadata_.unknown_fields<::google::protobuf::UnknownFieldSet>(::google::protobuf::UnknownFieldSet::default_instance), target, stream);
  }
  // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.EnumDescriptorProto.EnumReservedRange)
  return target;
}

#if defined(PROTOBUF_CUSTOM_VTABLE)
::size_t EnumDescriptorProto_EnumReservedRange::ByteSizeLong(const MessageLite& base) {
  const EnumDescriptorProto_EnumReservedRange& this_ = static_cast<const EnumDescriptorProto_EnumReservedRange&>(base);
#else   // PROTOBUF_CUSTOM_VTABLE
::size_t EnumDescriptorProto_EnumReservedRange::ByteSizeLong() const {
  const EnumDescriptorProto_EnumReservedRange& this_ = *this;
#endif  // PROTOBUF_CUSTOM_VTABLE
  // @@protoc_insertion_point(message_byte_size_start:google.protobuf.EnumDescriptorProto.EnumReservedRange)
  ::size_t total_size = 0;

  ::uint32_t cached_has_bits = 0;
  // Prevent compiler warnings about cached_has_bits being unused
  (void)cached_has_bits;

  ::_pbi::Prefetch5LinesFrom7Lines(&this_);
  cached_has_bits = this_._impl_._has_bits_[0];
  if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) {
    // optional int32 start = 1;
    if (CheckHasBit(cached_has_bits, 0x00000001U)) {
      total_size += ::_pbi::WireFormatLite::Int32SizePlusOne(
          this_._internal_start());
    }
    // optional int32 end = 2;
    if (CheckHasBit(cached_has_bits, 0x00000002U)) {
      total_size += ::_pbi::WireFormatLite::Int32SizePlusOne(
          this_._internal_end());
    }
  }
  return this_.MaybeComputeUnknownFieldsSize(total_size,
                                             &this_._impl_._cached_size_);
}

void EnumDescriptorProto_EnumReservedRange::MergeImpl(::google::protobuf::MessageLite& to_msg,
                            const ::google::protobuf::MessageLite& from_msg) {
   auto* const _this =
      static_cast<EnumDescriptorProto_EnumReservedRange*>(&to_msg);
  auto& from = static_cast<const EnumDescriptorProto_EnumReservedRange&>(from_msg);
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    from.CheckHasBitConsistency();
  }
  // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.EnumDescriptorProto.EnumReservedRange)
  ABSL_DCHECK_NE(&from, _this);
  ::uint32_t cached_has_bits = 0;
  (void)cached_has_bits;

  cached_has_bits = from._impl_._has_bits_[0];
  if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) {
    if (CheckHasBit(cached_has_bits, 0x00000001U)) {
      _this->_impl_.start_ = from._impl_.start_;
    }
    if (CheckHasBit(cached_has_bits, 0x00000002U)) {
      _this->_impl_.end_ = from._impl_.end_;
    }
  }
  _this->_impl_._has_bits_[0] |= cached_has_bits;
  _this->_internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(
      from._internal_metadata_);
}

void EnumDescriptorProto_EnumReservedRange::CopyFrom(const EnumDescriptorProto_EnumReservedRange& from) {
  // @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.EnumDescriptorProto.EnumReservedRange)
  if (&from == this) return;
  Clear();
  MergeFrom(from);
}


void EnumDescriptorProto_EnumReservedRange::InternalSwap(EnumDescriptorProto_EnumReservedRange* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) {
  using ::std::swap;
  _internal_metadata_.InternalSwap(&other->_internal_metadata_);
  swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]);
  ::google::protobuf::internal::memswap<
      PROTOBUF_FIELD_OFFSET(EnumDescriptorProto_EnumReservedRange, _impl_.end_)
      + sizeof(EnumDescriptorProto_EnumReservedRange::_impl_.end_)
      - PROTOBUF_FIELD_OFFSET(EnumDescriptorProto_EnumReservedRange, _impl_.start_)>(
          reinterpret_cast<char*>(&_impl_.start_),
          reinterpret_cast<char*>(&other->_impl_.start_));
}

::google::protobuf::Metadata EnumDescriptorProto_EnumReservedRange::GetMetadata() const {
  return ::google::protobuf::Message::GetMetadataImpl(GetClassData()->full());
}
// ===================================================================

class EnumDescriptorProto::_Internal {
 public:
  using HasBits =
      decltype(::std::declval<EnumDescriptorProto>()._impl_._has_bits_);
  static constexpr ::int32_t kHasBitsOffset =
      8 * PROTOBUF_FIELD_OFFSET(EnumDescriptorProto, _impl_._has_bits_);
};

EnumDescriptorProto::EnumDescriptorProto(::google::protobuf::Arena* PROTOBUF_NULLABLE arena)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(arena, EnumDescriptorProto_class_data_.base()) {
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(arena) {
#endif  // PROTOBUF_CUSTOM_VTABLE
  SharedCtor(arena);
  // @@protoc_insertion_point(arena_constructor:google.protobuf.EnumDescriptorProto)
}
PROTOBUF_NDEBUG_INLINE EnumDescriptorProto::Impl_::Impl_(
    [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility,
    [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from,
    [[maybe_unused]] const ::google::protobuf::EnumDescriptorProto& from_msg)
      : _has_bits_{from._has_bits_},
        _cached_size_{0},
        value_{visibility, arena, from.value_},
        reserved_range_{visibility, arena, from.reserved_range_},
        reserved_name_{visibility, arena, from.reserved_name_},
        name_(arena, from.name_) {}

EnumDescriptorProto::EnumDescriptorProto(
    ::google::protobuf::Arena* PROTOBUF_NULLABLE arena,
    const EnumDescriptorProto& from)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(arena, EnumDescriptorProto_class_data_.base()) {
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(arena) {
#endif  // PROTOBUF_CUSTOM_VTABLE
  EnumDescriptorProto* const _this = this;
  (void)_this;
  _internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(
      from._internal_metadata_);
  new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from);
  ::uint32_t cached_has_bits = _impl_._has_bits_[0];
  _impl_.options_ = (CheckHasBit(cached_has_bits, 0x00000010U))
                ? ::google::protobuf::Message::CopyConstruct(arena, *from._impl_.options_)
                : nullptr;
  _impl_.visibility_ = from._impl_.visibility_;

  // @@protoc_insertion_point(copy_constructor:google.protobuf.EnumDescriptorProto)
}
PROTOBUF_NDEBUG_INLINE EnumDescriptorProto::Impl_::Impl_(
    [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility,
    [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena)
      : _cached_size_{0},
        value_{visibility, arena},
        reserved_range_{visibility, arena},
        reserved_name_{visibility, arena},
        name_(arena) {}

inline void EnumDescriptorProto::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) {
  new (&_impl_) Impl_(internal_visibility(), arena);
  ::memset(reinterpret_cast<char*>(&_impl_) +
               offsetof(Impl_, options_),
           0,
           offsetof(Impl_, visibility_) -
               offsetof(Impl_, options_) +
               sizeof(Impl_::visibility_));
}
EnumDescriptorProto::~EnumDescriptorProto() {
  // @@protoc_insertion_point(destructor:google.protobuf.EnumDescriptorProto)
  SharedDtor(*this);
}
inline void EnumDescriptorProto::SharedDtor(MessageLite& self) {
  EnumDescriptorProto& this_ = static_cast<EnumDescriptorProto&>(self);
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    this_.CheckHasBitConsistency();
  }
  this_._internal_metadata_.Delete<::google::protobuf::UnknownFieldSet>();
  ABSL_DCHECK(this_.GetArena() == nullptr);
  this_._impl_.name_.Destroy();
  delete this_._impl_.options_;
  this_._impl_.~Impl_();
}

inline void* PROTOBUF_NONNULL EnumDescriptorProto::PlacementNew_(
    const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem,
    ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) {
  return ::new (mem) EnumDescriptorProto(arena);
}
constexpr auto EnumDescriptorProto::InternalNewImpl_() {
  constexpr auto arena_bits = ::google::protobuf::internal::EncodePlacementArenaOffsets({
      PROTOBUF_FIELD_OFFSET(EnumDescriptorProto, _impl_.value_) +
          decltype(EnumDescriptorProto::_impl_.value_)::
              InternalGetArenaOffset(
                  ::google::protobuf::Message::internal_visibility()),
      PROTOBUF_FIELD_OFFSET(EnumDescriptorProto, _impl_.reserved_range_) +
          decltype(EnumDescriptorProto::_impl_.reserved_range_)::
              InternalGetArenaOffset(
                  ::google::protobuf::Message::internal_visibility()),
      PROTOBUF_FIELD_OFFSET(EnumDescriptorProto, _impl_.reserved_name_) +
          decltype(EnumDescriptorProto::_impl_.reserved_name_)::
              InternalGetArenaOffset(
                  ::google::protobuf::Message::internal_visibility()),
  });
  if (arena_bits.has_value()) {
    return ::google::protobuf::internal::MessageCreator::CopyInit(
        sizeof(EnumDescriptorProto), alignof(EnumDescriptorProto), *arena_bits);
  } else {
    return ::google::protobuf::internal::MessageCreator(&EnumDescriptorProto::PlacementNew_,
                                 sizeof(EnumDescriptorProto),
                                 alignof(EnumDescriptorProto));
  }
}
constexpr auto EnumDescriptorProto::InternalGenerateClassData_() {
  return ::google::protobuf::internal::ClassDataFull{
      ::google::protobuf::internal::ClassData{
          &_EnumDescriptorProto_default_instance_._instance,
          &_table_.header,
          nullptr,  // OnDemandRegisterArenaDtor
          EnumDescriptorProto::IsInitializedImpl,
          &EnumDescriptorProto::MergeImpl,
          ::google::protobuf::Message::GetNewImpl<EnumDescriptorProto>(),
#if defined(PROTOBUF_CUSTOM_VTABLE)
          &EnumDescriptorProto::SharedDtor,
          ::google::protobuf::Message::GetClearImpl<EnumDescriptorProto>(), &EnumDescriptorProto::ByteSizeLong,
              &EnumDescriptorProto::_InternalSerialize,
#endif  // PROTOBUF_CUSTOM_VTABLE
          PROTOBUF_FIELD_OFFSET(EnumDescriptorProto, _impl_._cached_size_),
          false,
      },
      &EnumDescriptorProto::kDescriptorMethods,
      &descriptor_table_google_2fprotobuf_2fdescriptor_2eproto,
      nullptr,  // tracker
  };
}

PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 const
    ::google::protobuf::internal::ClassDataFull EnumDescriptorProto_class_data_ =
        EnumDescriptorProto::InternalGenerateClassData_();

PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL
EnumDescriptorProto::GetClassData() const {
  ::google::protobuf::internal::PrefetchToLocalCache(&EnumDescriptorProto_class_data_);
  ::google::protobuf::internal::PrefetchToLocalCache(EnumDescriptorProto_class_data_.tc_table);
  return EnumDescriptorProto_class_data_.base();
}
constexpr ::_pbi::TcParseTable<3, 6, 4, 0, 2>
EnumDescriptorProto::_table_ = {
  {
    PROTOBUF_FIELD_OFFSET(EnumDescriptorProto, _impl_._has_bits_),
    0, // no _extensions_
    6, 56,  // max_field_number, fast_idx_mask
    offsetof(decltype(_table_), field_lookup_table),
    4294967232,  // skipmap
    offsetof(decltype(_table_), field_entries),
    6,  // num_field_entries
    4,  // num_aux_entries
    offsetof(decltype(_table_), aux_entries),
    EnumDescriptorProto_class_data_.base(),
    nullptr,  // post_loop_handler
    ::_pbi::TcParser::GenericFallback,  // fallback
    #ifdef PROTOBUF_PREFETCH_PARSE_TABLE
    ::_pbi::TcParser::GetTable<::google::protobuf::EnumDescriptorProto>(),  // to_prefetch
    #endif  // PROTOBUF_PREFETCH_PARSE_TABLE
  }, {{
    {::_pbi::TcParser::MiniParse, {}},
    // optional string name = 1;
    {::_pbi::TcParser::FastBS1,
     {10, 3, 0,
      PROTOBUF_FIELD_OFFSET(EnumDescriptorProto, _impl_.name_)}},
    // repeated .google.protobuf.EnumValueDescriptorProto value = 2;
    {::_pbi::TcParser::FastMtR1,
     {18, 0, 0,
      PROTOBUF_FIELD_OFFSET(EnumDescriptorProto, _impl_.value_)}},
    // optional .google.protobuf.EnumOptions options = 3;
    {::_pbi::TcParser::FastMtS1,
     {26, 4, 1,
      PROTOBUF_FIELD_OFFSET(EnumDescriptorProto, _impl_.options_)}},
    // repeated .google.protobuf.EnumDescriptorProto.EnumReservedRange reserved_range = 4;
    {::_pbi::TcParser::FastMtR1,
     {34, 1, 2,
      PROTOBUF_FIELD_OFFSET(EnumDescriptorProto, _impl_.reserved_range_)}},
    // repeated string reserved_name = 5;
    {::_pbi::TcParser::FastBR1,
     {42, 2, 0,
      PROTOBUF_FIELD_OFFSET(EnumDescriptorProto, _impl_.reserved_name_)}},
    // optional .google.protobuf.SymbolVisibility visibility = 6;
    {::_pbi::TcParser::FastEr0S1,
     {48, 5, 2,
      PROTOBUF_FIELD_OFFSET(EnumDescriptorProto, _impl_.visibility_)}},
    {::_pbi::TcParser::MiniParse, {}},
  }}, {{
    65535, 65535
  }}, {{
    // optional string name = 1;
    {PROTOBUF_FIELD_OFFSET(EnumDescriptorProto, _impl_.name_), _Internal::kHasBitsOffset + 3, 0, (0 | ::_fl::kFcOptional | ::_fl::kBytes | ::_fl::kRepAString)},
    // repeated .google.protobuf.EnumValueDescriptorProto value = 2;
    {PROTOBUF_FIELD_OFFSET(EnumDescriptorProto, _impl_.value_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)},
    // optional .google.protobuf.EnumOptions options = 3;
    {PROTOBUF_FIELD_OFFSET(EnumDescriptorProto, _impl_.options_), _Internal::kHasBitsOffset + 4, 1, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)},
    // repeated .google.protobuf.EnumDescriptorProto.EnumReservedRange reserved_range = 4;
    {PROTOBUF_FIELD_OFFSET(EnumDescriptorProto, _impl_.reserved_range_), _Internal::kHasBitsOffset + 1, 2, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)},
    // repeated string reserved_name = 5;
    {PROTOBUF_FIELD_OFFSET(EnumDescriptorProto, _impl_.reserved_name_), _Internal::kHasBitsOffset + 2, 0, (0 | ::_fl::kFcRepeated | ::_fl::kBytes | ::_fl::kRepSString)},
    // optional .google.protobuf.SymbolVisibility visibility = 6;
    {PROTOBUF_FIELD_OFFSET(EnumDescriptorProto, _impl_.visibility_), _Internal::kHasBitsOffset + 5, 3, (0 | ::_fl::kFcOptional | ::_fl::kEnumRange)},
  }},
  {{
      {::_pbi::TcParser::GetTable<::google::protobuf::EnumValueDescriptorProto>()},
      {::_pbi::TcParser::GetTable<::google::protobuf::EnumOptions>()},
      {::_pbi::TcParser::GetTable<::google::protobuf::EnumDescriptorProto_EnumReservedRange>()},
      {0, 2},
  }},
  {{
  }},
};
PROTOBUF_NOINLINE void EnumDescriptorProto::Clear() {
// @@protoc_insertion_point(message_clear_start:google.protobuf.EnumDescriptorProto)
  ::google::protobuf::internal::TSanWrite(&_impl_);
  ::uint32_t cached_has_bits = 0;
  // Prevent compiler warnings about cached_has_bits being unused
  (void) cached_has_bits;

  cached_has_bits = _impl_._has_bits_[0];
  if (BatchCheckHasBit(cached_has_bits, 0x0000001fU)) {
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) {
      _impl_.value_.Clear();
    }
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000002U)) {
      _impl_.reserved_range_.Clear();
    }
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000004U)) {
      _impl_.reserved_name_.Clear();
    }
    if (CheckHasBit(cached_has_bits, 0x00000008U)) {
      _impl_.name_.ClearNonDefaultToEmpty();
    }
    if (CheckHasBit(cached_has_bits, 0x00000010U)) {
      ABSL_DCHECK(_impl_.options_ != nullptr);
      _impl_.options_->Clear();
    }
  }
  _impl_.visibility_ = 0;
  _impl_._has_bits_.Clear();
  _internal_metadata_.Clear<::google::protobuf::UnknownFieldSet>();
}

#if defined(PROTOBUF_CUSTOM_VTABLE)
::uint8_t* PROTOBUF_NONNULL EnumDescriptorProto::_InternalSerialize(
    const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target,
    ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) {
  const EnumDescriptorProto& this_ = static_cast<const EnumDescriptorProto&>(base);
#else   // PROTOBUF_CUSTOM_VTABLE
::uint8_t* PROTOBUF_NONNULL EnumDescriptorProto::_InternalSerialize(
    ::uint8_t* PROTOBUF_NONNULL target,
    ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const {
  const EnumDescriptorProto& this_ = *this;
#endif  // PROTOBUF_CUSTOM_VTABLE
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    this_.CheckHasBitConsistency();
  }
  // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.EnumDescriptorProto)
  ::uint32_t cached_has_bits = 0;
  (void)cached_has_bits;

  cached_has_bits = this_._impl_._has_bits_[0];
  // optional string name = 1;
  if (CheckHasBit(cached_has_bits, 0x00000008U)) {
    const ::std::string& _s = this_._internal_name();
    target = stream->WriteStringMaybeAliased(1, _s, target);
  }

  // repeated .google.protobuf.EnumValueDescriptorProto value = 2;
  if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) {
    for (unsigned i = 0, n = static_cast<unsigned>(
                             this_._internal_value_size());
         i < n; i++) {
      const auto& repfield = this_._internal_value().Get(i);
      target =
          ::google::protobuf::internal::WireFormatLite::InternalWriteMessage(
              2, repfield, repfield.GetCachedSize(),
              target, stream);
    }
  }

  // optional .google.protobuf.EnumOptions options = 3;
  if (CheckHasBit(cached_has_bits, 0x00000010U)) {
    target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage(
        3, *this_._impl_.options_, this_._impl_.options_->GetCachedSize(), target,
        stream);
  }

  // repeated .google.protobuf.EnumDescriptorProto.EnumReservedRange reserved_range = 4;
  if (CheckHasBitForRepeated(cached_has_bits, 0x00000002U)) {
    for (unsigned i = 0, n = static_cast<unsigned>(
                             this_._internal_reserved_range_size());
         i < n; i++) {
      const auto& repfield = this_._internal_reserved_range().Get(i);
      target =
          ::google::protobuf::internal::WireFormatLite::InternalWriteMessage(
              4, repfield, repfield.GetCachedSize(),
              target, stream);
    }
  }

  // repeated string reserved_name = 5;
  if (CheckHasBitForRepeated(cached_has_bits, 0x00000004U)) {
    for (int i = 0, n = this_._internal_reserved_name_size(); i < n; ++i) {
      const auto& s = this_._internal_reserved_name().Get(i);
      target = stream->WriteString(5, s, target);
    }
  }

  // optional .google.protobuf.SymbolVisibility visibility = 6;
  if (CheckHasBit(cached_has_bits, 0x00000020U)) {
    target = stream->EnsureSpace(target);
    target = ::_pbi::WireFormatLite::WriteEnumToArray(
        6, this_._internal_visibility(), target);
  }

  if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) {
    target =
        ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray(
            this_._internal_metadata_.unknown_fields<::google::protobuf::UnknownFieldSet>(::google::protobuf::UnknownFieldSet::default_instance), target, stream);
  }
  // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.EnumDescriptorProto)
  return target;
}

#if defined(PROTOBUF_CUSTOM_VTABLE)
::size_t EnumDescriptorProto::ByteSizeLong(const MessageLite& base) {
  const EnumDescriptorProto& this_ = static_cast<const EnumDescriptorProto&>(base);
#else   // PROTOBUF_CUSTOM_VTABLE
::size_t EnumDescriptorProto::ByteSizeLong() const {
  const EnumDescriptorProto& this_ = *this;
#endif  // PROTOBUF_CUSTOM_VTABLE
  // @@protoc_insertion_point(message_byte_size_start:google.protobuf.EnumDescriptorProto)
  ::size_t total_size = 0;

  ::uint32_t cached_has_bits = 0;
  // Prevent compiler warnings about cached_has_bits being unused
  (void)cached_has_bits;

  ::_pbi::Prefetch5LinesFrom7Lines(&this_);
  cached_has_bits = this_._impl_._has_bits_[0];
  if (BatchCheckHasBit(cached_has_bits, 0x0000003fU)) {
    // repeated .google.protobuf.EnumValueDescriptorProto value = 2;
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) {
      total_size += 1UL * this_._internal_value_size();
      for (const auto& msg : this_._internal_value()) {
        total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg);
      }
    }
    // repeated .google.protobuf.EnumDescriptorProto.EnumReservedRange reserved_range = 4;
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000002U)) {
      total_size += 1UL * this_._internal_reserved_range_size();
      for (const auto& msg : this_._internal_reserved_range()) {
        total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg);
      }
    }
    // repeated string reserved_name = 5;
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000004U)) {
      total_size +=
          1 * ::google::protobuf::internal::FromIntSize(this_._internal_reserved_name().size());
      for (int i = 0, n = this_._internal_reserved_name().size(); i < n; ++i) {
        total_size += ::google::protobuf::internal::WireFormatLite::StringSize(
            this_._internal_reserved_name().Get(i));
      }
    }
    // optional string name = 1;
    if (CheckHasBit(cached_has_bits, 0x00000008U)) {
      total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize(
                                      this_._internal_name());
    }
    // optional .google.protobuf.EnumOptions options = 3;
    if (CheckHasBit(cached_has_bits, 0x00000010U)) {
      total_size += 1 +
                    ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.options_);
    }
    // optional .google.protobuf.SymbolVisibility visibility = 6;
    if (CheckHasBit(cached_has_bits, 0x00000020U)) {
      total_size += 1 +
                    ::_pbi::WireFormatLite::EnumSize(this_._internal_visibility());
    }
  }
  return this_.MaybeComputeUnknownFieldsSize(total_size,
                                             &this_._impl_._cached_size_);
}

void EnumDescriptorProto::MergeImpl(::google::protobuf::MessageLite& to_msg,
                            const ::google::protobuf::MessageLite& from_msg) {
   auto* const _this =
      static_cast<EnumDescriptorProto*>(&to_msg);
  auto& from = static_cast<const EnumDescriptorProto&>(from_msg);
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    from.CheckHasBitConsistency();
  }
  ::google::protobuf::Arena* arena = _this->GetArena();
  // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.EnumDescriptorProto)
  ABSL_DCHECK_NE(&from, _this);
  ::uint32_t cached_has_bits = 0;
  (void)cached_has_bits;

  cached_has_bits = from._impl_._has_bits_[0];
  if (BatchCheckHasBit(cached_has_bits, 0x0000003fU)) {
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) {
      _this->_internal_mutable_value()->InternalMergeFromWithArena(
          ::google::protobuf::MessageLite::internal_visibility(), arena,
          from._internal_value());
    }
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000002U)) {
      _this->_internal_mutable_reserved_range()->InternalMergeFromWithArena(
          ::google::protobuf::MessageLite::internal_visibility(), arena,
          from._internal_reserved_range());
    }
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000004U)) {
      _this->_internal_mutable_reserved_name()->InternalMergeFromWithArena(
          ::google::protobuf::MessageLite::internal_visibility(), arena,
          from._internal_reserved_name());
    }
    if (CheckHasBit(cached_has_bits, 0x00000008U)) {
      _this->_internal_set_name(from._internal_name());
    }
    if (CheckHasBit(cached_has_bits, 0x00000010U)) {
      ABSL_DCHECK(from._impl_.options_ != nullptr);
      if (_this->_impl_.options_ == nullptr) {
        _this->_impl_.options_ = ::google::protobuf::Message::CopyConstruct(arena, *from._impl_.options_);
      } else {
        _this->_impl_.options_->MergeFrom(*from._impl_.options_);
      }
    }
    if (CheckHasBit(cached_has_bits, 0x00000020U)) {
      _this->_impl_.visibility_ = from._impl_.visibility_;
    }
  }
  _this->_impl_._has_bits_[0] |= cached_has_bits;
  _this->_internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(
      from._internal_metadata_);
}

void EnumDescriptorProto::CopyFrom(const EnumDescriptorProto& from) {
  // @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.EnumDescriptorProto)
  if (&from == this) return;
  Clear();
  MergeFrom(from);
}

PROTOBUF_NOINLINE bool EnumDescriptorProto::IsInitializedImpl(
    const MessageLite& msg) {
  auto& this_ = static_cast<const EnumDescriptorProto&>(msg);
  if (!::google::protobuf::internal::AllAreInitialized(this_._internal_value()))
    return false;
  if (CheckHasBit(this_._impl_._has_bits_[0], 0x00000010U)) {
    if (!this_._impl_.options_->IsInitialized()) return false;
  }
  return true;
}

void EnumDescriptorProto::InternalSwap(EnumDescriptorProto* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) {
  using ::std::swap;
  auto* arena = GetArena();
  ABSL_DCHECK_EQ(arena, other->GetArena());
  _internal_metadata_.InternalSwap(&other->_internal_metadata_);
  swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]);
  _impl_.value_.InternalSwap(&other->_impl_.value_);
  _impl_.reserved_range_.InternalSwap(&other->_impl_.reserved_range_);
  _impl_.reserved_name_.InternalSwap(&other->_impl_.reserved_name_);
  ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.name_, &other->_impl_.name_, arena);
  ::google::protobuf::internal::memswap<
      PROTOBUF_FIELD_OFFSET(EnumDescriptorProto, _impl_.visibility_)
      + sizeof(EnumDescriptorProto::_impl_.visibility_)
      - PROTOBUF_FIELD_OFFSET(EnumDescriptorProto, _impl_.options_)>(
          reinterpret_cast<char*>(&_impl_.options_),
          reinterpret_cast<char*>(&other->_impl_.options_));
}

::google::protobuf::Metadata EnumDescriptorProto::GetMetadata() const {
  return ::google::protobuf::Message::GetMetadataImpl(GetClassData()->full());
}
// ===================================================================

class EnumValueDescriptorProto::_Internal {
 public:
  using HasBits =
      decltype(::std::declval<EnumValueDescriptorProto>()._impl_._has_bits_);
  static constexpr ::int32_t kHasBitsOffset =
      8 * PROTOBUF_FIELD_OFFSET(EnumValueDescriptorProto, _impl_._has_bits_);
};

EnumValueDescriptorProto::EnumValueDescriptorProto(::google::protobuf::Arena* PROTOBUF_NULLABLE arena)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(arena, EnumValueDescriptorProto_class_data_.base()) {
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(arena) {
#endif  // PROTOBUF_CUSTOM_VTABLE
  SharedCtor(arena);
  // @@protoc_insertion_point(arena_constructor:google.protobuf.EnumValueDescriptorProto)
}
PROTOBUF_NDEBUG_INLINE EnumValueDescriptorProto::Impl_::Impl_(
    [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility,
    [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from,
    [[maybe_unused]] const ::google::protobuf::EnumValueDescriptorProto& from_msg)
      : _has_bits_{from._has_bits_},
        _cached_size_{0},
        name_(arena, from.name_) {}

EnumValueDescriptorProto::EnumValueDescriptorProto(
    ::google::protobuf::Arena* PROTOBUF_NULLABLE arena,
    const EnumValueDescriptorProto& from)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(arena, EnumValueDescriptorProto_class_data_.base()) {
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(arena) {
#endif  // PROTOBUF_CUSTOM_VTABLE
  EnumValueDescriptorProto* const _this = this;
  (void)_this;
  _internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(
      from._internal_metadata_);
  new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from);
  ::uint32_t cached_has_bits = _impl_._has_bits_[0];
  _impl_.options_ = (CheckHasBit(cached_has_bits, 0x00000002U))
                ? ::google::protobuf::Message::CopyConstruct(arena, *from._impl_.options_)
                : nullptr;
  _impl_.number_ = from._impl_.number_;

  // @@protoc_insertion_point(copy_constructor:google.protobuf.EnumValueDescriptorProto)
}
PROTOBUF_NDEBUG_INLINE EnumValueDescriptorProto::Impl_::Impl_(
    [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility,
    [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena)
      : _cached_size_{0},
        name_(arena) {}

inline void EnumValueDescriptorProto::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) {
  new (&_impl_) Impl_(internal_visibility(), arena);
  ::memset(reinterpret_cast<char*>(&_impl_) +
               offsetof(Impl_, options_),
           0,
           offsetof(Impl_, number_) -
               offsetof(Impl_, options_) +
               sizeof(Impl_::number_));
}
EnumValueDescriptorProto::~EnumValueDescriptorProto() {
  // @@protoc_insertion_point(destructor:google.protobuf.EnumValueDescriptorProto)
  SharedDtor(*this);
}
inline void EnumValueDescriptorProto::SharedDtor(MessageLite& self) {
  EnumValueDescriptorProto& this_ = static_cast<EnumValueDescriptorProto&>(self);
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    this_.CheckHasBitConsistency();
  }
  this_._internal_metadata_.Delete<::google::protobuf::UnknownFieldSet>();
  ABSL_DCHECK(this_.GetArena() == nullptr);
  this_._impl_.name_.Destroy();
  delete this_._impl_.options_;
  this_._impl_.~Impl_();
}

inline void* PROTOBUF_NONNULL EnumValueDescriptorProto::PlacementNew_(
    const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem,
    ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) {
  return ::new (mem) EnumValueDescriptorProto(arena);
}
constexpr auto EnumValueDescriptorProto::InternalNewImpl_() {
  return ::google::protobuf::internal::MessageCreator::CopyInit(sizeof(EnumValueDescriptorProto),
                                            alignof(EnumValueDescriptorProto));
}
constexpr auto EnumValueDescriptorProto::InternalGenerateClassData_() {
  return ::google::protobuf::internal::ClassDataFull{
      ::google::protobuf::internal::ClassData{
          &_EnumValueDescriptorProto_default_instance_._instance,
          &_table_.header,
          nullptr,  // OnDemandRegisterArenaDtor
          EnumValueDescriptorProto::IsInitializedImpl,
          &EnumValueDescriptorProto::MergeImpl,
          ::google::protobuf::Message::GetNewImpl<EnumValueDescriptorProto>(),
#if defined(PROTOBUF_CUSTOM_VTABLE)
          &EnumValueDescriptorProto::SharedDtor,
          ::google::protobuf::Message::GetClearImpl<EnumValueDescriptorProto>(), &EnumValueDescriptorProto::ByteSizeLong,
              &EnumValueDescriptorProto::_InternalSerialize,
#endif  // PROTOBUF_CUSTOM_VTABLE
          PROTOBUF_FIELD_OFFSET(EnumValueDescriptorProto, _impl_._cached_size_),
          false,
      },
      &EnumValueDescriptorProto::kDescriptorMethods,
      &descriptor_table_google_2fprotobuf_2fdescriptor_2eproto,
      nullptr,  // tracker
  };
}

PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 const
    ::google::protobuf::internal::ClassDataFull EnumValueDescriptorProto_class_data_ =
        EnumValueDescriptorProto::InternalGenerateClassData_();

PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL
EnumValueDescriptorProto::GetClassData() const {
  ::google::protobuf::internal::PrefetchToLocalCache(&EnumValueDescriptorProto_class_data_);
  ::google::protobuf::internal::PrefetchToLocalCache(EnumValueDescriptorProto_class_data_.tc_table);
  return EnumValueDescriptorProto_class_data_.base();
}
constexpr ::_pbi::TcParseTable<2, 3, 1, 0, 2>
EnumValueDescriptorProto::_table_ = {
  {
    PROTOBUF_FIELD_OFFSET(EnumValueDescriptorProto, _impl_._has_bits_),
    0, // no _extensions_
    3, 24,  // max_field_number, fast_idx_mask
    offsetof(decltype(_table_), field_lookup_table),
    4294967288,  // skipmap
    offsetof(decltype(_table_), field_entries),
    3,  // num_field_entries
    1,  // num_aux_entries
    offsetof(decltype(_table_), aux_entries),
    EnumValueDescriptorProto_class_data_.base(),
    nullptr,  // post_loop_handler
    ::_pbi::TcParser::GenericFallback,  // fallback
    #ifdef PROTOBUF_PREFETCH_PARSE_TABLE
    ::_pbi::TcParser::GetTable<::google::protobuf::EnumValueDescriptorProto>(),  // to_prefetch
    #endif  // PROTOBUF_PREFETCH_PARSE_TABLE
  }, {{
    {::_pbi::TcParser::MiniParse, {}},
    // optional string name = 1;
    {::_pbi::TcParser::FastBS1,
     {10, 0, 0,
      PROTOBUF_FIELD_OFFSET(EnumValueDescriptorProto, _impl_.name_)}},
    // optional int32 number = 2;
    {::_pbi::TcParser::SingularVarintNoZag1<::uint32_t, offsetof(EnumValueDescriptorProto, _impl_.number_), 2>(),
     {16, 2, 0,
      PROTOBUF_FIELD_OFFSET(EnumValueDescriptorProto, _impl_.number_)}},
    // optional .google.protobuf.EnumValueOptions options = 3;
    {::_pbi::TcParser::FastMtS1,
     {26, 1, 0,
      PROTOBUF_FIELD_OFFSET(EnumValueDescriptorProto, _impl_.options_)}},
  }}, {{
    65535, 65535
  }}, {{
    // optional string name = 1;
    {PROTOBUF_FIELD_OFFSET(EnumValueDescriptorProto, _impl_.name_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcOptional | ::_fl::kBytes | ::_fl::kRepAString)},
    // optional int32 number = 2;
    {PROTOBUF_FIELD_OFFSET(EnumValueDescriptorProto, _impl_.number_), _Internal::kHasBitsOffset + 2, 0, (0 | ::_fl::kFcOptional | ::_fl::kInt32)},
    // optional .google.protobuf.EnumValueOptions options = 3;
    {PROTOBUF_FIELD_OFFSET(EnumValueDescriptorProto, _impl_.options_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)},
  }},
  {{
      {::_pbi::TcParser::GetTable<::google::protobuf::EnumValueOptions>()},
  }},
  {{
  }},
};
PROTOBUF_NOINLINE void EnumValueDescriptorProto::Clear() {
// @@protoc_insertion_point(message_clear_start:google.protobuf.EnumValueDescriptorProto)
  ::google::protobuf::internal::TSanWrite(&_impl_);
  ::uint32_t cached_has_bits = 0;
  // Prevent compiler warnings about cached_has_bits being unused
  (void) cached_has_bits;

  cached_has_bits = _impl_._has_bits_[0];
  if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) {
    if (CheckHasBit(cached_has_bits, 0x00000001U)) {
      _impl_.name_.ClearNonDefaultToEmpty();
    }
    if (CheckHasBit(cached_has_bits, 0x00000002U)) {
      ABSL_DCHECK(_impl_.options_ != nullptr);
      _impl_.options_->Clear();
    }
  }
  _impl_.number_ = 0;
  _impl_._has_bits_.Clear();
  _internal_metadata_.Clear<::google::protobuf::UnknownFieldSet>();
}

#if defined(PROTOBUF_CUSTOM_VTABLE)
::uint8_t* PROTOBUF_NONNULL EnumValueDescriptorProto::_InternalSerialize(
    const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target,
    ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) {
  const EnumValueDescriptorProto& this_ = static_cast<const EnumValueDescriptorProto&>(base);
#else   // PROTOBUF_CUSTOM_VTABLE
::uint8_t* PROTOBUF_NONNULL EnumValueDescriptorProto::_InternalSerialize(
    ::uint8_t* PROTOBUF_NONNULL target,
    ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const {
  const EnumValueDescriptorProto& this_ = *this;
#endif  // PROTOBUF_CUSTOM_VTABLE
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    this_.CheckHasBitConsistency();
  }
  // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.EnumValueDescriptorProto)
  ::uint32_t cached_has_bits = 0;
  (void)cached_has_bits;

  cached_has_bits = this_._impl_._has_bits_[0];
  // optional string name = 1;
  if (CheckHasBit(cached_has_bits, 0x00000001U)) {
    const ::std::string& _s = this_._internal_name();
    target = stream->WriteStringMaybeAliased(1, _s, target);
  }

  // optional int32 number = 2;
  if (CheckHasBit(cached_has_bits, 0x00000004U)) {
    target =
        ::google::protobuf::internal::WireFormatLite::WriteInt32ToArrayWithField<2>(
            stream, this_._internal_number(), target);
  }

  // optional .google.protobuf.EnumValueOptions options = 3;
  if (CheckHasBit(cached_has_bits, 0x00000002U)) {
    target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage(
        3, *this_._impl_.options_, this_._impl_.options_->GetCachedSize(), target,
        stream);
  }

  if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) {
    target =
        ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray(
            this_._internal_metadata_.unknown_fields<::google::protobuf::UnknownFieldSet>(::google::protobuf::UnknownFieldSet::default_instance), target, stream);
  }
  // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.EnumValueDescriptorProto)
  return target;
}

#if defined(PROTOBUF_CUSTOM_VTABLE)
::size_t EnumValueDescriptorProto::ByteSizeLong(const MessageLite& base) {
  const EnumValueDescriptorProto& this_ = static_cast<const EnumValueDescriptorProto&>(base);
#else   // PROTOBUF_CUSTOM_VTABLE
::size_t EnumValueDescriptorProto::ByteSizeLong() const {
  const EnumValueDescriptorProto& this_ = *this;
#endif  // PROTOBUF_CUSTOM_VTABLE
  // @@protoc_insertion_point(message_byte_size_start:google.protobuf.EnumValueDescriptorProto)
  ::size_t total_size = 0;

  ::uint32_t cached_has_bits = 0;
  // Prevent compiler warnings about cached_has_bits being unused
  (void)cached_has_bits;

  ::_pbi::Prefetch5LinesFrom7Lines(&this_);
  cached_has_bits = this_._impl_._has_bits_[0];
  if (BatchCheckHasBit(cached_has_bits, 0x00000007U)) {
    // optional string name = 1;
    if (CheckHasBit(cached_has_bits, 0x00000001U)) {
      total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize(
                                      this_._internal_name());
    }
    // optional .google.protobuf.EnumValueOptions options = 3;
    if (CheckHasBit(cached_has_bits, 0x00000002U)) {
      total_size += 1 +
                    ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.options_);
    }
    // optional int32 number = 2;
    if (CheckHasBit(cached_has_bits, 0x00000004U)) {
      total_size += ::_pbi::WireFormatLite::Int32SizePlusOne(
          this_._internal_number());
    }
  }
  return this_.MaybeComputeUnknownFieldsSize(total_size,
                                             &this_._impl_._cached_size_);
}

void EnumValueDescriptorProto::MergeImpl(::google::protobuf::MessageLite& to_msg,
                            const ::google::protobuf::MessageLite& from_msg) {
   auto* const _this =
      static_cast<EnumValueDescriptorProto*>(&to_msg);
  auto& from = static_cast<const EnumValueDescriptorProto&>(from_msg);
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    from.CheckHasBitConsistency();
  }
  ::google::protobuf::Arena* arena = _this->GetArena();
  // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.EnumValueDescriptorProto)
  ABSL_DCHECK_NE(&from, _this);
  ::uint32_t cached_has_bits = 0;
  (void)cached_has_bits;

  cached_has_bits = from._impl_._has_bits_[0];
  if (BatchCheckHasBit(cached_has_bits, 0x00000007U)) {
    if (CheckHasBit(cached_has_bits, 0x00000001U)) {
      _this->_internal_set_name(from._internal_name());
    }
    if (CheckHasBit(cached_has_bits, 0x00000002U)) {
      ABSL_DCHECK(from._impl_.options_ != nullptr);
      if (_this->_impl_.options_ == nullptr) {
        _this->_impl_.options_ = ::google::protobuf::Message::CopyConstruct(arena, *from._impl_.options_);
      } else {
        _this->_impl_.options_->MergeFrom(*from._impl_.options_);
      }
    }
    if (CheckHasBit(cached_has_bits, 0x00000004U)) {
      _this->_impl_.number_ = from._impl_.number_;
    }
  }
  _this->_impl_._has_bits_[0] |= cached_has_bits;
  _this->_internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(
      from._internal_metadata_);
}

void EnumValueDescriptorProto::CopyFrom(const EnumValueDescriptorProto& from) {
  // @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.EnumValueDescriptorProto)
  if (&from == this) return;
  Clear();
  MergeFrom(from);
}

PROTOBUF_NOINLINE bool EnumValueDescriptorProto::IsInitializedImpl(
    const MessageLite& msg) {
  auto& this_ = static_cast<const EnumValueDescriptorProto&>(msg);
  if (CheckHasBit(this_._impl_._has_bits_[0], 0x00000002U)) {
    if (!this_._impl_.options_->IsInitialized()) return false;
  }
  return true;
}

void EnumValueDescriptorProto::InternalSwap(EnumValueDescriptorProto* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) {
  using ::std::swap;
  auto* arena = GetArena();
  ABSL_DCHECK_EQ(arena, other->GetArena());
  _internal_metadata_.InternalSwap(&other->_internal_metadata_);
  swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]);
  ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.name_, &other->_impl_.name_, arena);
  ::google::protobuf::internal::memswap<
      PROTOBUF_FIELD_OFFSET(EnumValueDescriptorProto, _impl_.number_)
      + sizeof(EnumValueDescriptorProto::_impl_.number_)
      - PROTOBUF_FIELD_OFFSET(EnumValueDescriptorProto, _impl_.options_)>(
          reinterpret_cast<char*>(&_impl_.options_),
          reinterpret_cast<char*>(&other->_impl_.options_));
}

::google::protobuf::Metadata EnumValueDescriptorProto::GetMetadata() const {
  return ::google::protobuf::Message::GetMetadataImpl(GetClassData()->full());
}
// ===================================================================

class ServiceDescriptorProto::_Internal {
 public:
  using HasBits =
      decltype(::std::declval<ServiceDescriptorProto>()._impl_._has_bits_);
  static constexpr ::int32_t kHasBitsOffset =
      8 * PROTOBUF_FIELD_OFFSET(ServiceDescriptorProto, _impl_._has_bits_);
};

ServiceDescriptorProto::ServiceDescriptorProto(::google::protobuf::Arena* PROTOBUF_NULLABLE arena)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(arena, ServiceDescriptorProto_class_data_.base()) {
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(arena) {
#endif  // PROTOBUF_CUSTOM_VTABLE
  SharedCtor(arena);
  // @@protoc_insertion_point(arena_constructor:google.protobuf.ServiceDescriptorProto)
}
PROTOBUF_NDEBUG_INLINE ServiceDescriptorProto::Impl_::Impl_(
    [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility,
    [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from,
    [[maybe_unused]] const ::google::protobuf::ServiceDescriptorProto& from_msg)
      : _has_bits_{from._has_bits_},
        _cached_size_{0},
        method_{visibility, arena, from.method_},
        name_(arena, from.name_) {}

ServiceDescriptorProto::ServiceDescriptorProto(
    ::google::protobuf::Arena* PROTOBUF_NULLABLE arena,
    const ServiceDescriptorProto& from)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(arena, ServiceDescriptorProto_class_data_.base()) {
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(arena) {
#endif  // PROTOBUF_CUSTOM_VTABLE
  ServiceDescriptorProto* const _this = this;
  (void)_this;
  _internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(
      from._internal_metadata_);
  new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from);
  ::uint32_t cached_has_bits = _impl_._has_bits_[0];
  _impl_.options_ = (CheckHasBit(cached_has_bits, 0x00000004U))
                ? ::google::protobuf::Message::CopyConstruct(arena, *from._impl_.options_)
                : nullptr;

  // @@protoc_insertion_point(copy_constructor:google.protobuf.ServiceDescriptorProto)
}
PROTOBUF_NDEBUG_INLINE ServiceDescriptorProto::Impl_::Impl_(
    [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility,
    [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena)
      : _cached_size_{0},
        method_{visibility, arena},
        name_(arena) {}

inline void ServiceDescriptorProto::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) {
  new (&_impl_) Impl_(internal_visibility(), arena);
  _impl_.options_ = {};
}
ServiceDescriptorProto::~ServiceDescriptorProto() {
  // @@protoc_insertion_point(destructor:google.protobuf.ServiceDescriptorProto)
  SharedDtor(*this);
}
inline void ServiceDescriptorProto::SharedDtor(MessageLite& self) {
  ServiceDescriptorProto& this_ = static_cast<ServiceDescriptorProto&>(self);
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    this_.CheckHasBitConsistency();
  }
  this_._internal_metadata_.Delete<::google::protobuf::UnknownFieldSet>();
  ABSL_DCHECK(this_.GetArena() == nullptr);
  this_._impl_.name_.Destroy();
  delete this_._impl_.options_;
  this_._impl_.~Impl_();
}

inline void* PROTOBUF_NONNULL ServiceDescriptorProto::PlacementNew_(
    const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem,
    ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) {
  return ::new (mem) ServiceDescriptorProto(arena);
}
constexpr auto ServiceDescriptorProto::InternalNewImpl_() {
  constexpr auto arena_bits = ::google::protobuf::internal::EncodePlacementArenaOffsets({
      PROTOBUF_FIELD_OFFSET(ServiceDescriptorProto, _impl_.method_) +
          decltype(ServiceDescriptorProto::_impl_.method_)::
              InternalGetArenaOffset(
                  ::google::protobuf::Message::internal_visibility()),
  });
  if (arena_bits.has_value()) {
    return ::google::protobuf::internal::MessageCreator::CopyInit(
        sizeof(ServiceDescriptorProto), alignof(ServiceDescriptorProto), *arena_bits);
  } else {
    return ::google::protobuf::internal::MessageCreator(&ServiceDescriptorProto::PlacementNew_,
                                 sizeof(ServiceDescriptorProto),
                                 alignof(ServiceDescriptorProto));
  }
}
constexpr auto ServiceDescriptorProto::InternalGenerateClassData_() {
  return ::google::protobuf::internal::ClassDataFull{
      ::google::protobuf::internal::ClassData{
          &_ServiceDescriptorProto_default_instance_._instance,
          &_table_.header,
          nullptr,  // OnDemandRegisterArenaDtor
          ServiceDescriptorProto::IsInitializedImpl,
          &ServiceDescriptorProto::MergeImpl,
          ::google::protobuf::Message::GetNewImpl<ServiceDescriptorProto>(),
#if defined(PROTOBUF_CUSTOM_VTABLE)
          &ServiceDescriptorProto::SharedDtor,
          ::google::protobuf::Message::GetClearImpl<ServiceDescriptorProto>(), &ServiceDescriptorProto::ByteSizeLong,
              &ServiceDescriptorProto::_InternalSerialize,
#endif  // PROTOBUF_CUSTOM_VTABLE
          PROTOBUF_FIELD_OFFSET(ServiceDescriptorProto, _impl_._cached_size_),
          false,
      },
      &ServiceDescriptorProto::kDescriptorMethods,
      &descriptor_table_google_2fprotobuf_2fdescriptor_2eproto,
      nullptr,  // tracker
  };
}

PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 const
    ::google::protobuf::internal::ClassDataFull ServiceDescriptorProto_class_data_ =
        ServiceDescriptorProto::InternalGenerateClassData_();

PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL
ServiceDescriptorProto::GetClassData() const {
  ::google::protobuf::internal::PrefetchToLocalCache(&ServiceDescriptorProto_class_data_);
  ::google::protobuf::internal::PrefetchToLocalCache(ServiceDescriptorProto_class_data_.tc_table);
  return ServiceDescriptorProto_class_data_.base();
}
constexpr ::_pbi::TcParseTable<2, 3, 2, 0, 2>
ServiceDescriptorProto::_table_ = {
  {
    PROTOBUF_FIELD_OFFSET(ServiceDescriptorProto, _impl_._has_bits_),
    0, // no _extensions_
    3, 24,  // max_field_number, fast_idx_mask
    offsetof(decltype(_table_), field_lookup_table),
    4294967288,  // skipmap
    offsetof(decltype(_table_), field_entries),
    3,  // num_field_entries
    2,  // num_aux_entries
    offsetof(decltype(_table_), aux_entries),
    ServiceDescriptorProto_class_data_.base(),
    nullptr,  // post_loop_handler
    ::_pbi::TcParser::GenericFallback,  // fallback
    #ifdef PROTOBUF_PREFETCH_PARSE_TABLE
    ::_pbi::TcParser::GetTable<::google::protobuf::ServiceDescriptorProto>(),  // to_prefetch
    #endif  // PROTOBUF_PREFETCH_PARSE_TABLE
  }, {{
    {::_pbi::TcParser::MiniParse, {}},
    // optional string name = 1;
    {::_pbi::TcParser::FastBS1,
     {10, 1, 0,
      PROTOBUF_FIELD_OFFSET(ServiceDescriptorProto, _impl_.name_)}},
    // repeated .google.protobuf.MethodDescriptorProto method = 2;
    {::_pbi::TcParser::FastMtR1,
     {18, 0, 0,
      PROTOBUF_FIELD_OFFSET(ServiceDescriptorProto, _impl_.method_)}},
    // optional .google.protobuf.ServiceOptions options = 3;
    {::_pbi::TcParser::FastMtS1,
     {26, 2, 1,
      PROTOBUF_FIELD_OFFSET(ServiceDescriptorProto, _impl_.options_)}},
  }}, {{
    65535, 65535
  }}, {{
    // optional string name = 1;
    {PROTOBUF_FIELD_OFFSET(ServiceDescriptorProto, _impl_.name_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kBytes | ::_fl::kRepAString)},
    // repeated .google.protobuf.MethodDescriptorProto method = 2;
    {PROTOBUF_FIELD_OFFSET(ServiceDescriptorProto, _impl_.method_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)},
    // optional .google.protobuf.ServiceOptions options = 3;
    {PROTOBUF_FIELD_OFFSET(ServiceDescriptorProto, _impl_.options_), _Internal::kHasBitsOffset + 2, 1, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)},
  }},
  {{
      {::_pbi::TcParser::GetTable<::google::protobuf::MethodDescriptorProto>()},
      {::_pbi::TcParser::GetTable<::google::protobuf::ServiceOptions>()},
  }},
  {{
  }},
};
PROTOBUF_NOINLINE void ServiceDescriptorProto::Clear() {
// @@protoc_insertion_point(message_clear_start:google.protobuf.ServiceDescriptorProto)
  ::google::protobuf::internal::TSanWrite(&_impl_);
  ::uint32_t cached_has_bits = 0;
  // Prevent compiler warnings about cached_has_bits being unused
  (void) cached_has_bits;

  cached_has_bits = _impl_._has_bits_[0];
  if (BatchCheckHasBit(cached_has_bits, 0x00000007U)) {
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) {
      _impl_.method_.Clear();
    }
    if (CheckHasBit(cached_has_bits, 0x00000002U)) {
      _impl_.name_.ClearNonDefaultToEmpty();
    }
    if (CheckHasBit(cached_has_bits, 0x00000004U)) {
      ABSL_DCHECK(_impl_.options_ != nullptr);
      _impl_.options_->Clear();
    }
  }
  _impl_._has_bits_.Clear();
  _internal_metadata_.Clear<::google::protobuf::UnknownFieldSet>();
}

#if defined(PROTOBUF_CUSTOM_VTABLE)
::uint8_t* PROTOBUF_NONNULL ServiceDescriptorProto::_InternalSerialize(
    const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target,
    ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) {
  const ServiceDescriptorProto& this_ = static_cast<const ServiceDescriptorProto&>(base);
#else   // PROTOBUF_CUSTOM_VTABLE
::uint8_t* PROTOBUF_NONNULL ServiceDescriptorProto::_InternalSerialize(
    ::uint8_t* PROTOBUF_NONNULL target,
    ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const {
  const ServiceDescriptorProto& this_ = *this;
#endif  // PROTOBUF_CUSTOM_VTABLE
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    this_.CheckHasBitConsistency();
  }
  // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.ServiceDescriptorProto)
  ::uint32_t cached_has_bits = 0;
  (void)cached_has_bits;

  cached_has_bits = this_._impl_._has_bits_[0];
  // optional string name = 1;
  if (CheckHasBit(cached_has_bits, 0x00000002U)) {
    const ::std::string& _s = this_._internal_name();
    target = stream->WriteStringMaybeAliased(1, _s, target);
  }

  // repeated .google.protobuf.MethodDescriptorProto method = 2;
  if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) {
    for (unsigned i = 0, n = static_cast<unsigned>(
                             this_._internal_method_size());
         i < n; i++) {
      const auto& repfield = this_._internal_method().Get(i);
      target =
          ::google::protobuf::internal::WireFormatLite::InternalWriteMessage(
              2, repfield, repfield.GetCachedSize(),
              target, stream);
    }
  }

  // optional .google.protobuf.ServiceOptions options = 3;
  if (CheckHasBit(cached_has_bits, 0x00000004U)) {
    target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage(
        3, *this_._impl_.options_, this_._impl_.options_->GetCachedSize(), target,
        stream);
  }

  if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) {
    target =
        ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray(
            this_._internal_metadata_.unknown_fields<::google::protobuf::UnknownFieldSet>(::google::protobuf::UnknownFieldSet::default_instance), target, stream);
  }
  // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.ServiceDescriptorProto)
  return target;
}

#if defined(PROTOBUF_CUSTOM_VTABLE)
::size_t ServiceDescriptorProto::ByteSizeLong(const MessageLite& base) {
  const ServiceDescriptorProto& this_ = static_cast<const ServiceDescriptorProto&>(base);
#else   // PROTOBUF_CUSTOM_VTABLE
::size_t ServiceDescriptorProto::ByteSizeLong() const {
  const ServiceDescriptorProto& this_ = *this;
#endif  // PROTOBUF_CUSTOM_VTABLE
  // @@protoc_insertion_point(message_byte_size_start:google.protobuf.ServiceDescriptorProto)
  ::size_t total_size = 0;

  ::uint32_t cached_has_bits = 0;
  // Prevent compiler warnings about cached_has_bits being unused
  (void)cached_has_bits;

  ::_pbi::Prefetch5LinesFrom7Lines(&this_);
  cached_has_bits = this_._impl_._has_bits_[0];
  if (BatchCheckHasBit(cached_has_bits, 0x00000007U)) {
    // repeated .google.protobuf.MethodDescriptorProto method = 2;
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) {
      total_size += 1UL * this_._internal_method_size();
      for (const auto& msg : this_._internal_method()) {
        total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg);
      }
    }
    // optional string name = 1;
    if (CheckHasBit(cached_has_bits, 0x00000002U)) {
      total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize(
                                      this_._internal_name());
    }
    // optional .google.protobuf.ServiceOptions options = 3;
    if (CheckHasBit(cached_has_bits, 0x00000004U)) {
      total_size += 1 +
                    ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.options_);
    }
  }
  return this_.MaybeComputeUnknownFieldsSize(total_size,
                                             &this_._impl_._cached_size_);
}

void ServiceDescriptorProto::MergeImpl(::google::protobuf::MessageLite& to_msg,
                            const ::google::protobuf::MessageLite& from_msg) {
   auto* const _this =
      static_cast<ServiceDescriptorProto*>(&to_msg);
  auto& from = static_cast<const ServiceDescriptorProto&>(from_msg);
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    from.CheckHasBitConsistency();
  }
  ::google::protobuf::Arena* arena = _this->GetArena();
  // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.ServiceDescriptorProto)
  ABSL_DCHECK_NE(&from, _this);
  ::uint32_t cached_has_bits = 0;
  (void)cached_has_bits;

  cached_has_bits = from._impl_._has_bits_[0];
  if (BatchCheckHasBit(cached_has_bits, 0x00000007U)) {
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) {
      _this->_internal_mutable_method()->InternalMergeFromWithArena(
          ::google::protobuf::MessageLite::internal_visibility(), arena,
          from._internal_method());
    }
    if (CheckHasBit(cached_has_bits, 0x00000002U)) {
      _this->_internal_set_name(from._internal_name());
    }
    if (CheckHasBit(cached_has_bits, 0x00000004U)) {
      ABSL_DCHECK(from._impl_.options_ != nullptr);
      if (_this->_impl_.options_ == nullptr) {
        _this->_impl_.options_ = ::google::protobuf::Message::CopyConstruct(arena, *from._impl_.options_);
      } else {
        _this->_impl_.options_->MergeFrom(*from._impl_.options_);
      }
    }
  }
  _this->_impl_._has_bits_[0] |= cached_has_bits;
  _this->_internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(
      from._internal_metadata_);
}

void ServiceDescriptorProto::CopyFrom(const ServiceDescriptorProto& from) {
  // @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.ServiceDescriptorProto)
  if (&from == this) return;
  Clear();
  MergeFrom(from);
}

PROTOBUF_NOINLINE bool ServiceDescriptorProto::IsInitializedImpl(
    const MessageLite& msg) {
  auto& this_ = static_cast<const ServiceDescriptorProto&>(msg);
  if (!::google::protobuf::internal::AllAreInitialized(this_._internal_method()))
    return false;
  if (CheckHasBit(this_._impl_._has_bits_[0], 0x00000004U)) {
    if (!this_._impl_.options_->IsInitialized()) return false;
  }
  return true;
}

void ServiceDescriptorProto::InternalSwap(ServiceDescriptorProto* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) {
  using ::std::swap;
  auto* arena = GetArena();
  ABSL_DCHECK_EQ(arena, other->GetArena());
  _internal_metadata_.InternalSwap(&other->_internal_metadata_);
  swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]);
  _impl_.method_.InternalSwap(&other->_impl_.method_);
  ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.name_, &other->_impl_.name_, arena);
  swap(_impl_.options_, other->_impl_.options_);
}

::google::protobuf::Metadata ServiceDescriptorProto::GetMetadata() const {
  return ::google::protobuf::Message::GetMetadataImpl(GetClassData()->full());
}
// ===================================================================

class MethodDescriptorProto::_Internal {
 public:
  using HasBits =
      decltype(::std::declval<MethodDescriptorProto>()._impl_._has_bits_);
  static constexpr ::int32_t kHasBitsOffset =
      8 * PROTOBUF_FIELD_OFFSET(MethodDescriptorProto, _impl_._has_bits_);
};

MethodDescriptorProto::MethodDescriptorProto(::google::protobuf::Arena* PROTOBUF_NULLABLE arena)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(arena, MethodDescriptorProto_class_data_.base()) {
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(arena) {
#endif  // PROTOBUF_CUSTOM_VTABLE
  SharedCtor(arena);
  // @@protoc_insertion_point(arena_constructor:google.protobuf.MethodDescriptorProto)
}
PROTOBUF_NDEBUG_INLINE MethodDescriptorProto::Impl_::Impl_(
    [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility,
    [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from,
    [[maybe_unused]] const ::google::protobuf::MethodDescriptorProto& from_msg)
      : _has_bits_{from._has_bits_},
        _cached_size_{0},
        name_(arena, from.name_),
        input_type_(arena, from.input_type_),
        output_type_(arena, from.output_type_) {}

MethodDescriptorProto::MethodDescriptorProto(
    ::google::protobuf::Arena* PROTOBUF_NULLABLE arena,
    const MethodDescriptorProto& from)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(arena, MethodDescriptorProto_class_data_.base()) {
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(arena) {
#endif  // PROTOBUF_CUSTOM_VTABLE
  MethodDescriptorProto* const _this = this;
  (void)_this;
  _internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(
      from._internal_metadata_);
  new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from);
  ::uint32_t cached_has_bits = _impl_._has_bits_[0];
  _impl_.options_ = (CheckHasBit(cached_has_bits, 0x00000008U))
                ? ::google::protobuf::Message::CopyConstruct(arena, *from._impl_.options_)
                : nullptr;
  ::memcpy(reinterpret_cast<char*>(&_impl_) +
               offsetof(Impl_, client_streaming_),
           reinterpret_cast<const char*>(&from._impl_) +
               offsetof(Impl_, client_streaming_),
           offsetof(Impl_, server_streaming_) -
               offsetof(Impl_, client_streaming_) +
               sizeof(Impl_::server_streaming_));

  // @@protoc_insertion_point(copy_constructor:google.protobuf.MethodDescriptorProto)
}
PROTOBUF_NDEBUG_INLINE MethodDescriptorProto::Impl_::Impl_(
    [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility,
    [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena)
      : _cached_size_{0},
        name_(arena),
        input_type_(arena),
        output_type_(arena) {}

inline void MethodDescriptorProto::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) {
  new (&_impl_) Impl_(internal_visibility(), arena);
  ::memset(reinterpret_cast<char*>(&_impl_) +
               offsetof(Impl_, options_),
           0,
           offsetof(Impl_, server_streaming_) -
               offsetof(Impl_, options_) +
               sizeof(Impl_::server_streaming_));
}
MethodDescriptorProto::~MethodDescriptorProto() {
  // @@protoc_insertion_point(destructor:google.protobuf.MethodDescriptorProto)
  SharedDtor(*this);
}
inline void MethodDescriptorProto::SharedDtor(MessageLite& self) {
  MethodDescriptorProto& this_ = static_cast<MethodDescriptorProto&>(self);
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    this_.CheckHasBitConsistency();
  }
  this_._internal_metadata_.Delete<::google::protobuf::UnknownFieldSet>();
  ABSL_DCHECK(this_.GetArena() == nullptr);
  this_._impl_.name_.Destroy();
  this_._impl_.input_type_.Destroy();
  this_._impl_.output_type_.Destroy();
  delete this_._impl_.options_;
  this_._impl_.~Impl_();
}

inline void* PROTOBUF_NONNULL MethodDescriptorProto::PlacementNew_(
    const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem,
    ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) {
  return ::new (mem) MethodDescriptorProto(arena);
}
constexpr auto MethodDescriptorProto::InternalNewImpl_() {
  return ::google::protobuf::internal::MessageCreator::CopyInit(sizeof(MethodDescriptorProto),
                                            alignof(MethodDescriptorProto));
}
constexpr auto MethodDescriptorProto::InternalGenerateClassData_() {
  return ::google::protobuf::internal::ClassDataFull{
      ::google::protobuf::internal::ClassData{
          &_MethodDescriptorProto_default_instance_._instance,
          &_table_.header,
          nullptr,  // OnDemandRegisterArenaDtor
          MethodDescriptorProto::IsInitializedImpl,
          &MethodDescriptorProto::MergeImpl,
          ::google::protobuf::Message::GetNewImpl<MethodDescriptorProto>(),
#if defined(PROTOBUF_CUSTOM_VTABLE)
          &MethodDescriptorProto::SharedDtor,
          ::google::protobuf::Message::GetClearImpl<MethodDescriptorProto>(), &MethodDescriptorProto::ByteSizeLong,
              &MethodDescriptorProto::_InternalSerialize,
#endif  // PROTOBUF_CUSTOM_VTABLE
          PROTOBUF_FIELD_OFFSET(MethodDescriptorProto, _impl_._cached_size_),
          false,
      },
      &MethodDescriptorProto::kDescriptorMethods,
      &descriptor_table_google_2fprotobuf_2fdescriptor_2eproto,
      nullptr,  // tracker
  };
}

PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 const
    ::google::protobuf::internal::ClassDataFull MethodDescriptorProto_class_data_ =
        MethodDescriptorProto::InternalGenerateClassData_();

PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL
MethodDescriptorProto::GetClassData() const {
  ::google::protobuf::internal::PrefetchToLocalCache(&MethodDescriptorProto_class_data_);
  ::google::protobuf::internal::PrefetchToLocalCache(MethodDescriptorProto_class_data_.tc_table);
  return MethodDescriptorProto_class_data_.base();
}
constexpr ::_pbi::TcParseTable<3, 6, 1, 0, 2>
MethodDescriptorProto::_table_ = {
  {
    PROTOBUF_FIELD_OFFSET(MethodDescriptorProto, _impl_._has_bits_),
    0, // no _extensions_
    6, 56,  // max_field_number, fast_idx_mask
    offsetof(decltype(_table_), field_lookup_table),
    4294967232,  // skipmap
    offsetof(decltype(_table_), field_entries),
    6,  // num_field_entries
    1,  // num_aux_entries
    offsetof(decltype(_table_), aux_entries),
    MethodDescriptorProto_class_data_.base(),
    nullptr,  // post_loop_handler
    ::_pbi::TcParser::GenericFallback,  // fallback
    #ifdef PROTOBUF_PREFETCH_PARSE_TABLE
    ::_pbi::TcParser::GetTable<::google::protobuf::MethodDescriptorProto>(),  // to_prefetch
    #endif  // PROTOBUF_PREFETCH_PARSE_TABLE
  }, {{
    {::_pbi::TcParser::MiniParse, {}},
    // optional string name = 1;
    {::_pbi::TcParser::FastBS1,
     {10, 0, 0,
      PROTOBUF_FIELD_OFFSET(MethodDescriptorProto, _impl_.name_)}},
    // optional string input_type = 2;
    {::_pbi::TcParser::FastBS1,
     {18, 1, 0,
      PROTOBUF_FIELD_OFFSET(MethodDescriptorProto, _impl_.input_type_)}},
    // optional string output_type = 3;
    {::_pbi::TcParser::FastBS1,
     {26, 2, 0,
      PROTOBUF_FIELD_OFFSET(MethodDescriptorProto, _impl_.output_type_)}},
    // optional .google.protobuf.MethodOptions options = 4;
    {::_pbi::TcParser::FastMtS1,
     {34, 3, 0,
      PROTOBUF_FIELD_OFFSET(MethodDescriptorProto, _impl_.options_)}},
    // optional bool client_streaming = 5 [default = false];
    {::_pbi::TcParser::SingularVarintNoZag1<bool, offsetof(MethodDescriptorProto, _impl_.client_streaming_), 4>(),
     {40, 4, 0,
      PROTOBUF_FIELD_OFFSET(MethodDescriptorProto, _impl_.client_streaming_)}},
    // optional bool server_streaming = 6 [default = false];
    {::_pbi::TcParser::SingularVarintNoZag1<bool, offsetof(MethodDescriptorProto, _impl_.server_streaming_), 5>(),
     {48, 5, 0,
      PROTOBUF_FIELD_OFFSET(MethodDescriptorProto, _impl_.server_streaming_)}},
    {::_pbi::TcParser::MiniParse, {}},
  }}, {{
    65535, 65535
  }}, {{
    // optional string name = 1;
    {PROTOBUF_FIELD_OFFSET(MethodDescriptorProto, _impl_.name_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcOptional | ::_fl::kBytes | ::_fl::kRepAString)},
    // optional string input_type = 2;
    {PROTOBUF_FIELD_OFFSET(MethodDescriptorProto, _impl_.input_type_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kBytes | ::_fl::kRepAString)},
    // optional string output_type = 3;
    {PROTOBUF_FIELD_OFFSET(MethodDescriptorProto, _impl_.output_type_), _Internal::kHasBitsOffset + 2, 0, (0 | ::_fl::kFcOptional | ::_fl::kBytes | ::_fl::kRepAString)},
    // optional .google.protobuf.MethodOptions options = 4;
    {PROTOBUF_FIELD_OFFSET(MethodDescriptorProto, _impl_.options_), _Internal::kHasBitsOffset + 3, 0, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)},
    // optional bool client_streaming = 5 [default = false];
    {PROTOBUF_FIELD_OFFSET(MethodDescriptorProto, _impl_.client_streaming_), _Internal::kHasBitsOffset + 4, 0, (0 | ::_fl::kFcOptional | ::_fl::kBool)},
    // optional bool server_streaming = 6 [default = false];
    {PROTOBUF_FIELD_OFFSET(MethodDescriptorProto, _impl_.server_streaming_), _Internal::kHasBitsOffset + 5, 0, (0 | ::_fl::kFcOptional | ::_fl::kBool)},
  }},
  {{
      {::_pbi::TcParser::GetTable<::google::protobuf::MethodOptions>()},
  }},
  {{
  }},
};
PROTOBUF_NOINLINE void MethodDescriptorProto::Clear() {
// @@protoc_insertion_point(message_clear_start:google.protobuf.MethodDescriptorProto)
  ::google::protobuf::internal::TSanWrite(&_impl_);
  ::uint32_t cached_has_bits = 0;
  // Prevent compiler warnings about cached_has_bits being unused
  (void) cached_has_bits;

  cached_has_bits = _impl_._has_bits_[0];
  if (BatchCheckHasBit(cached_has_bits, 0x0000000fU)) {
    if (CheckHasBit(cached_has_bits, 0x00000001U)) {
      _impl_.name_.ClearNonDefaultToEmpty();
    }
    if (CheckHasBit(cached_has_bits, 0x00000002U)) {
      _impl_.input_type_.ClearNonDefaultToEmpty();
    }
    if (CheckHasBit(cached_has_bits, 0x00000004U)) {
      _impl_.output_type_.ClearNonDefaultToEmpty();
    }
    if (CheckHasBit(cached_has_bits, 0x00000008U)) {
      ABSL_DCHECK(_impl_.options_ != nullptr);
      _impl_.options_->Clear();
    }
  }
  ::memset(&_impl_.client_streaming_, 0, static_cast<::size_t>(
      reinterpret_cast<char*>(&_impl_.server_streaming_) -
      reinterpret_cast<char*>(&_impl_.client_streaming_)) + sizeof(_impl_.server_streaming_));
  _impl_._has_bits_.Clear();
  _internal_metadata_.Clear<::google::protobuf::UnknownFieldSet>();
}

#if defined(PROTOBUF_CUSTOM_VTABLE)
::uint8_t* PROTOBUF_NONNULL MethodDescriptorProto::_InternalSerialize(
    const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target,
    ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) {
  const MethodDescriptorProto& this_ = static_cast<const MethodDescriptorProto&>(base);
#else   // PROTOBUF_CUSTOM_VTABLE
::uint8_t* PROTOBUF_NONNULL MethodDescriptorProto::_InternalSerialize(
    ::uint8_t* PROTOBUF_NONNULL target,
    ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const {
  const MethodDescriptorProto& this_ = *this;
#endif  // PROTOBUF_CUSTOM_VTABLE
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    this_.CheckHasBitConsistency();
  }
  // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.MethodDescriptorProto)
  ::uint32_t cached_has_bits = 0;
  (void)cached_has_bits;

  cached_has_bits = this_._impl_._has_bits_[0];
  // optional string name = 1;
  if (CheckHasBit(cached_has_bits, 0x00000001U)) {
    const ::std::string& _s = this_._internal_name();
    target = stream->WriteStringMaybeAliased(1, _s, target);
  }

  // optional string input_type = 2;
  if (CheckHasBit(cached_has_bits, 0x00000002U)) {
    const ::std::string& _s = this_._internal_input_type();
    target = stream->WriteStringMaybeAliased(2, _s, target);
  }

  // optional string output_type = 3;
  if (CheckHasBit(cached_has_bits, 0x00000004U)) {
    const ::std::string& _s = this_._internal_output_type();
    target = stream->WriteStringMaybeAliased(3, _s, target);
  }

  // optional .google.protobuf.MethodOptions options = 4;
  if (CheckHasBit(cached_has_bits, 0x00000008U)) {
    target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage(
        4, *this_._impl_.options_, this_._impl_.options_->GetCachedSize(), target,
        stream);
  }

  // optional bool client_streaming = 5 [default = false];
  if (CheckHasBit(cached_has_bits, 0x00000010U)) {
    target = stream->EnsureSpace(target);
    target = ::_pbi::WireFormatLite::WriteBoolToArray(
        5, this_._internal_client_streaming(), target);
  }

  // optional bool server_streaming = 6 [default = false];
  if (CheckHasBit(cached_has_bits, 0x00000020U)) {
    target = stream->EnsureSpace(target);
    target = ::_pbi::WireFormatLite::WriteBoolToArray(
        6, this_._internal_server_streaming(), target);
  }

  if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) {
    target =
        ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray(
            this_._internal_metadata_.unknown_fields<::google::protobuf::UnknownFieldSet>(::google::protobuf::UnknownFieldSet::default_instance), target, stream);
  }
  // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.MethodDescriptorProto)
  return target;
}

#if defined(PROTOBUF_CUSTOM_VTABLE)
::size_t MethodDescriptorProto::ByteSizeLong(const MessageLite& base) {
  const MethodDescriptorProto& this_ = static_cast<const MethodDescriptorProto&>(base);
#else   // PROTOBUF_CUSTOM_VTABLE
::size_t MethodDescriptorProto::ByteSizeLong() const {
  const MethodDescriptorProto& this_ = *this;
#endif  // PROTOBUF_CUSTOM_VTABLE
  // @@protoc_insertion_point(message_byte_size_start:google.protobuf.MethodDescriptorProto)
  ::size_t total_size = 0;

  ::uint32_t cached_has_bits = 0;
  // Prevent compiler warnings about cached_has_bits being unused
  (void)cached_has_bits;

  ::_pbi::Prefetch5LinesFrom7Lines(&this_);
  cached_has_bits = this_._impl_._has_bits_[0];
  total_size += ::absl::popcount(0x00000030U & cached_has_bits) * 2;
  if (BatchCheckHasBit(cached_has_bits, 0x0000000fU)) {
    // optional string name = 1;
    if (CheckHasBit(cached_has_bits, 0x00000001U)) {
      total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize(
                                      this_._internal_name());
    }
    // optional string input_type = 2;
    if (CheckHasBit(cached_has_bits, 0x00000002U)) {
      total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize(
                                      this_._internal_input_type());
    }
    // optional string output_type = 3;
    if (CheckHasBit(cached_has_bits, 0x00000004U)) {
      total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize(
                                      this_._internal_output_type());
    }
    // optional .google.protobuf.MethodOptions options = 4;
    if (CheckHasBit(cached_has_bits, 0x00000008U)) {
      total_size += 1 +
                    ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.options_);
    }
  }
  return this_.MaybeComputeUnknownFieldsSize(total_size,
                                             &this_._impl_._cached_size_);
}

void MethodDescriptorProto::MergeImpl(::google::protobuf::MessageLite& to_msg,
                            const ::google::protobuf::MessageLite& from_msg) {
   auto* const _this =
      static_cast<MethodDescriptorProto*>(&to_msg);
  auto& from = static_cast<const MethodDescriptorProto&>(from_msg);
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    from.CheckHasBitConsistency();
  }
  ::google::protobuf::Arena* arena = _this->GetArena();
  // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.MethodDescriptorProto)
  ABSL_DCHECK_NE(&from, _this);
  ::uint32_t cached_has_bits = 0;
  (void)cached_has_bits;

  cached_has_bits = from._impl_._has_bits_[0];
  if (BatchCheckHasBit(cached_has_bits, 0x0000003fU)) {
    if (CheckHasBit(cached_has_bits, 0x00000001U)) {
      _this->_internal_set_name(from._internal_name());
    }
    if (CheckHasBit(cached_has_bits, 0x00000002U)) {
      _this->_internal_set_input_type(from._internal_input_type());
    }
    if (CheckHasBit(cached_has_bits, 0x00000004U)) {
      _this->_internal_set_output_type(from._internal_output_type());
    }
    if (CheckHasBit(cached_has_bits, 0x00000008U)) {
      ABSL_DCHECK(from._impl_.options_ != nullptr);
      if (_this->_impl_.options_ == nullptr) {
        _this->_impl_.options_ = ::google::protobuf::Message::CopyConstruct(arena, *from._impl_.options_);
      } else {
        _this->_impl_.options_->MergeFrom(*from._impl_.options_);
      }
    }
    if (CheckHasBit(cached_has_bits, 0x00000010U)) {
      _this->_impl_.client_streaming_ = from._impl_.client_streaming_;
    }
    if (CheckHasBit(cached_has_bits, 0x00000020U)) {
      _this->_impl_.server_streaming_ = from._impl_.server_streaming_;
    }
  }
  _this->_impl_._has_bits_[0] |= cached_has_bits;
  _this->_internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(
      from._internal_metadata_);
}

void MethodDescriptorProto::CopyFrom(const MethodDescriptorProto& from) {
  // @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.MethodDescriptorProto)
  if (&from == this) return;
  Clear();
  MergeFrom(from);
}

PROTOBUF_NOINLINE bool MethodDescriptorProto::IsInitializedImpl(
    const MessageLite& msg) {
  auto& this_ = static_cast<const MethodDescriptorProto&>(msg);
  if (CheckHasBit(this_._impl_._has_bits_[0], 0x00000008U)) {
    if (!this_._impl_.options_->IsInitialized()) return false;
  }
  return true;
}

void MethodDescriptorProto::InternalSwap(MethodDescriptorProto* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) {
  using ::std::swap;
  auto* arena = GetArena();
  ABSL_DCHECK_EQ(arena, other->GetArena());
  _internal_metadata_.InternalSwap(&other->_internal_metadata_);
  swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]);
  ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.name_, &other->_impl_.name_, arena);
  ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.input_type_, &other->_impl_.input_type_, arena);
  ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.output_type_, &other->_impl_.output_type_, arena);
  ::google::protobuf::internal::memswap<
      PROTOBUF_FIELD_OFFSET(MethodDescriptorProto, _impl_.server_streaming_)
      + sizeof(MethodDescriptorProto::_impl_.server_streaming_)
      - PROTOBUF_FIELD_OFFSET(MethodDescriptorProto, _impl_.options_)>(
          reinterpret_cast<char*>(&_impl_.options_),
          reinterpret_cast<char*>(&other->_impl_.options_));
}

::google::protobuf::Metadata MethodDescriptorProto::GetMetadata() const {
  return ::google::protobuf::Message::GetMetadataImpl(GetClassData()->full());
}
// ===================================================================

class FileOptions::_Internal {
 public:
  using HasBits =
      decltype(::std::declval<FileOptions>()._impl_._has_bits_);
  static constexpr ::int32_t kHasBitsOffset =
      8 * PROTOBUF_FIELD_OFFSET(FileOptions, _impl_._has_bits_);
};

FileOptions::FileOptions(::google::protobuf::Arena* PROTOBUF_NULLABLE arena)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(arena, FileOptions_class_data_.base()) {
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(arena) {
#endif  // PROTOBUF_CUSTOM_VTABLE
  SharedCtor(arena);
  // @@protoc_insertion_point(arena_constructor:google.protobuf.FileOptions)
}
PROTOBUF_NDEBUG_INLINE FileOptions::Impl_::Impl_(
    [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility,
    [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from,
    [[maybe_unused]] const ::google::protobuf::FileOptions& from_msg)
      : _extensions_{visibility, arena},
        _has_bits_{from._has_bits_},
        _cached_size_{0},
        java_package_(arena, from.java_package_),
        java_outer_classname_(arena, from.java_outer_classname_),
        go_package_(arena, from.go_package_),
        objc_class_prefix_(arena, from.objc_class_prefix_),
        csharp_namespace_(arena, from.csharp_namespace_),
        swift_prefix_(arena, from.swift_prefix_),
        php_class_prefix_(arena, from.php_class_prefix_),
        php_namespace_(arena, from.php_namespace_),
        php_metadata_namespace_(arena, from.php_metadata_namespace_),
        ruby_package_(arena, from.ruby_package_),
        uninterpreted_option_{visibility, arena, from.uninterpreted_option_} {}

FileOptions::FileOptions(
    ::google::protobuf::Arena* PROTOBUF_NULLABLE arena,
    const FileOptions& from)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(arena, FileOptions_class_data_.base()) {
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(arena) {
#endif  // PROTOBUF_CUSTOM_VTABLE
  FileOptions* const _this = this;
  (void)_this;
  _internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(
      from._internal_metadata_);
  new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from);
  _impl_._extensions_.MergeFrom(this, from._impl_._extensions_);
  ::uint32_t cached_has_bits = _impl_._has_bits_[0];
  _impl_.features_ = (CheckHasBit(cached_has_bits, 0x00000400U))
                ? ::google::protobuf::Message::CopyConstruct(arena, *from._impl_.features_)
                : nullptr;
  ::memcpy(reinterpret_cast<char*>(&_impl_) +
               offsetof(Impl_, java_multiple_files_),
           reinterpret_cast<const char*>(&from._impl_) +
               offsetof(Impl_, java_multiple_files_),
           offsetof(Impl_, cc_enable_arenas_) -
               offsetof(Impl_, java_multiple_files_) +
               sizeof(Impl_::cc_enable_arenas_));

  // @@protoc_insertion_point(copy_constructor:google.protobuf.FileOptions)
}
PROTOBUF_NDEBUG_INLINE FileOptions::Impl_::Impl_(
    [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility,
    [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena)
      : _extensions_{visibility, arena},
        _cached_size_{0},
        java_package_(arena),
        java_outer_classname_(arena),
        go_package_(arena),
        objc_class_prefix_(arena),
        csharp_namespace_(arena),
        swift_prefix_(arena),
        php_class_prefix_(arena),
        php_namespace_(arena),
        php_metadata_namespace_(arena),
        ruby_package_(arena),
        optimize_for_{static_cast< ::google::protobuf::FileOptions_OptimizeMode >(1)},
        cc_enable_arenas_{true},
        uninterpreted_option_{visibility, arena} {}

inline void FileOptions::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) {
  new (&_impl_) Impl_(internal_visibility(), arena);
  ::memset(reinterpret_cast<char*>(&_impl_) +
               offsetof(Impl_, features_),
           0,
           offsetof(Impl_, java_string_check_utf8_) -
               offsetof(Impl_, features_) +
               sizeof(Impl_::java_string_check_utf8_));
}
FileOptions::~FileOptions() {
  // @@protoc_insertion_point(destructor:google.protobuf.FileOptions)
  SharedDtor(*this);
}
inline void FileOptions::SharedDtor(MessageLite& self) {
  FileOptions& this_ = static_cast<FileOptions&>(self);
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    this_.CheckHasBitConsistency();
  }
  this_._internal_metadata_.Delete<::google::protobuf::UnknownFieldSet>();
  ABSL_DCHECK(this_.GetArena() == nullptr);
  this_._impl_.java_package_.Destroy();
  this_._impl_.java_outer_classname_.Destroy();
  this_._impl_.go_package_.Destroy();
  this_._impl_.objc_class_prefix_.Destroy();
  this_._impl_.csharp_namespace_.Destroy();
  this_._impl_.swift_prefix_.Destroy();
  this_._impl_.php_class_prefix_.Destroy();
  this_._impl_.php_namespace_.Destroy();
  this_._impl_.php_metadata_namespace_.Destroy();
  this_._impl_.ruby_package_.Destroy();
  delete this_._impl_.features_;
  this_._impl_.~Impl_();
}

inline void* PROTOBUF_NONNULL FileOptions::PlacementNew_(
    const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem,
    ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) {
  return ::new (mem) FileOptions(arena);
}
constexpr auto FileOptions::InternalNewImpl_() {
  constexpr auto arena_bits = ::google::protobuf::internal::EncodePlacementArenaOffsets({
      PROTOBUF_FIELD_OFFSET(FileOptions, _impl_._extensions_) +
          decltype(FileOptions::_impl_._extensions_)::InternalGetArenaOffset(
              ::google::protobuf::Message::internal_visibility()),
      PROTOBUF_FIELD_OFFSET(FileOptions, _impl_.uninterpreted_option_) +
          decltype(FileOptions::_impl_.uninterpreted_option_)::
              InternalGetArenaOffset(
                  ::google::protobuf::Message::internal_visibility()),
  });
  if (arena_bits.has_value()) {
    return ::google::protobuf::internal::MessageCreator::CopyInit(
        sizeof(FileOptions), alignof(FileOptions), *arena_bits);
  } else {
    return ::google::protobuf::internal::MessageCreator(&FileOptions::PlacementNew_,
                                 sizeof(FileOptions),
                                 alignof(FileOptions));
  }
}
constexpr auto FileOptions::InternalGenerateClassData_() {
  return ::google::protobuf::internal::ClassDataFull{
      ::google::protobuf::internal::ClassData{
          &_FileOptions_default_instance_._instance,
          &_table_.header,
          nullptr,  // OnDemandRegisterArenaDtor
          FileOptions::IsInitializedImpl,
          &FileOptions::MergeImpl,
          ::google::protobuf::Message::GetNewImpl<FileOptions>(),
#if defined(PROTOBUF_CUSTOM_VTABLE)
          &FileOptions::SharedDtor,
          ::google::protobuf::Message::GetClearImpl<FileOptions>(), &FileOptions::ByteSizeLong,
              &FileOptions::_InternalSerialize,
#endif  // PROTOBUF_CUSTOM_VTABLE
          PROTOBUF_FIELD_OFFSET(FileOptions, _impl_._cached_size_),
          false,
      },
      &FileOptions::kDescriptorMethods,
      &descriptor_table_google_2fprotobuf_2fdescriptor_2eproto,
      nullptr,  // tracker
  };
}

PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 const
    ::google::protobuf::internal::ClassDataFull FileOptions_class_data_ =
        FileOptions::InternalGenerateClassData_();

PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL
FileOptions::GetClassData() const {
  ::google::protobuf::internal::PrefetchToLocalCache(&FileOptions_class_data_);
  ::google::protobuf::internal::PrefetchToLocalCache(FileOptions_class_data_.tc_table);
  return FileOptions_class_data_.base();
}
constexpr ::_pbi::TcParseTable<5, 21, 3, 0, 12>
FileOptions::_table_ = {
  {
    PROTOBUF_FIELD_OFFSET(FileOptions, _impl_._has_bits_),
    PROTOBUF_FIELD_OFFSET(FileOptions, _impl_._extensions_),
    999, 248,  // max_field_number, fast_idx_mask
    offsetof(decltype(_table_), field_lookup_table),
    3149166718,  // skipmap
    offsetof(decltype(_table_), field_entries),
    21,  // num_field_entries
    3,  // num_aux_entries
    offsetof(decltype(_table_), aux_entries),
    FileOptions_class_data_.base(),
    nullptr,  // post_loop_handler
    ::_pbi::TcParser::GenericFallback,  // fallback
    #ifdef PROTOBUF_PREFETCH_PARSE_TABLE
    ::_pbi::TcParser::GetTable<::google::protobuf::FileOptions>(),  // to_prefetch
    #endif  // PROTOBUF_PREFETCH_PARSE_TABLE
  }, {{
    {::_pbi::TcParser::MiniParse, {}},
    // optional string java_package = 1;
    {::_pbi::TcParser::FastBS1,
     {10, 0, 0,
      PROTOBUF_FIELD_OFFSET(FileOptions, _impl_.java_package_)}},
    {::_pbi::TcParser::MiniParse, {}},
    {::_pbi::TcParser::MiniParse, {}},
    {::_pbi::TcParser::MiniParse, {}},
    {::_pbi::TcParser::MiniParse, {}},
    {::_pbi::TcParser::MiniParse, {}},
    {::_pbi::TcParser::MiniParse, {}},
    // optional string java_outer_classname = 8;
    {::_pbi::TcParser::FastBS1,
     {66, 1, 0,
      PROTOBUF_FIELD_OFFSET(FileOptions, _impl_.java_outer_classname_)}},
    // optional .google.protobuf.FileOptions.OptimizeMode optimize_for = 9 [default = SPEED];
    {::_pbi::TcParser::FastEr1S1,
     {72, 18, 3,
      PROTOBUF_FIELD_OFFSET(FileOptions, _impl_.optimize_for_)}},
    // optional bool java_multiple_files = 10 [default = false];
    {::_pbi::TcParser::SingularVarintNoZag1<bool, offsetof(FileOptions, _impl_.java_multiple_files_), 11>(),
     {80, 11, 0,
      PROTOBUF_FIELD_OFFSET(FileOptions, _impl_.java_multiple_files_)}},
    // optional string go_package = 11;
    {::_pbi::TcParser::FastBS1,
     {90, 2, 0,
      PROTOBUF_FIELD_OFFSET(FileOptions, _impl_.go_package_)}},
    {::_pbi::TcParser::MiniParse, {}},
    {::_pbi::TcParser::MiniParse, {}},
    {::_pbi::TcParser::MiniParse, {}},
    {::_pbi::TcParser::MiniParse, {}},
    // optional bool cc_generic_services = 16 [default = false];
    {::_pbi::TcParser::FastV8S2,
     {384, 12, 0,
      PROTOBUF_FIELD_OFFSET(FileOptions, _impl_.cc_generic_services_)}},
    // optional bool java_generic_services = 17 [default = false];
    {::_pbi::TcParser::FastV8S2,
     {392, 13, 0,
      PROTOBUF_FIELD_OFFSET(FileOptions, _impl_.java_generic_services_)}},
    // optional bool py_generic_services = 18 [default = false];
    {::_pbi::TcParser::FastV8S2,
     {400, 14, 0,
      PROTOBUF_FIELD_OFFSET(FileOptions, _impl_.py_generic_services_)}},
    {::_pbi::TcParser::MiniParse, {}},
    // optional bool java_generate_equals_and_hash = 20 [deprecated = true];
    {::_pbi::TcParser::FastV8S2,
     {416, 15, 0,
      PROTOBUF_FIELD_OFFSET(FileOptions, _impl_.java_generate_equals_and_hash_)}},
    // optional string csharp_namespace = 37;
    {::_pbi::TcParser::FastBS2,
     {682, 4, 0,
      PROTOBUF_FIELD_OFFSET(FileOptions, _impl_.csharp_namespace_)}},
    {::_pbi::TcParser::MiniParse, {}},
    // optional bool deprecated = 23 [default = false];
    {::_pbi::TcParser::FastV8S2,
     {440, 16, 0,
      PROTOBUF_FIELD_OFFSET(FileOptions, _impl_.deprecated_)}},
    // optional string php_class_prefix = 40;
    {::_pbi::TcParser::FastBS2,
     {706, 6, 0,
      PROTOBUF_FIELD_OFFSET(FileOptions, _impl_.php_class_prefix_)}},
    // optional string php_namespace = 41;
    {::_pbi::TcParser::FastBS2,
     {714, 7, 0,
      PROTOBUF_FIELD_OFFSET(FileOptions, _impl_.php_namespace_)}},
    {::_pbi::TcParser::MiniParse, {}},
    // optional bool java_string_check_utf8 = 27 [default = false];
    {::_pbi::TcParser::FastV8S2,
     {472, 17, 0,
      PROTOBUF_FIELD_OFFSET(FileOptions, _impl_.java_string_check_utf8_)}},
    // optional string php_metadata_namespace = 44;
    {::_pbi::TcParser::FastBS2,
     {738, 8, 0,
      PROTOBUF_FIELD_OFFSET(FileOptions, _impl_.php_metadata_namespace_)}},
    // optional string ruby_package = 45;
    {::_pbi::TcParser::FastBS2,
     {746, 9, 0,
      PROTOBUF_FIELD_OFFSET(FileOptions, _impl_.ruby_package_)}},
    {::_pbi::TcParser::MiniParse, {}},
    // optional bool cc_enable_arenas = 31 [default = true];
    {::_pbi::TcParser::FastV8S2,
     {504, 19, 0,
      PROTOBUF_FIELD_OFFSET(FileOptions, _impl_.cc_enable_arenas_)}},
  }}, {{
    36, 0, 1,
    48324, 12,
    999, 0, 1,
    65534, 20,
    65535, 65535
  }}, {{
    // optional string java_package = 1;
    {PROTOBUF_FIELD_OFFSET(FileOptions, _impl_.java_package_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcOptional | ::_fl::kBytes | ::_fl::kRepAString)},
    // optional string java_outer_classname = 8;
    {PROTOBUF_FIELD_OFFSET(FileOptions, _impl_.java_outer_classname_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kBytes | ::_fl::kRepAString)},
    // optional .google.protobuf.FileOptions.OptimizeMode optimize_for = 9 [default = SPEED];
    {PROTOBUF_FIELD_OFFSET(FileOptions, _impl_.optimize_for_), _Internal::kHasBitsOffset + 18, 2, (0 | ::_fl::kFcOptional | ::_fl::kEnumRange)},
    // optional bool java_multiple_files = 10 [default = false];
    {PROTOBUF_FIELD_OFFSET(FileOptions, _impl_.java_multiple_files_), _Internal::kHasBitsOffset + 11, 0, (0 | ::_fl::kFcOptional | ::_fl::kBool)},
    // optional string go_package = 11;
    {PROTOBUF_FIELD_OFFSET(FileOptions, _impl_.go_package_), _Internal::kHasBitsOffset + 2, 0, (0 | ::_fl::kFcOptional | ::_fl::kBytes | ::_fl::kRepAString)},
    // optional bool cc_generic_services = 16 [default = false];
    {PROTOBUF_FIELD_OFFSET(FileOptions, _impl_.cc_generic_services_), _Internal::kHasBitsOffset + 12, 0, (0 | ::_fl::kFcOptional | ::_fl::kBool)},
    // optional bool java_generic_services = 17 [default = false];
    {PROTOBUF_FIELD_OFFSET(FileOptions, _impl_.java_generic_services_), _Internal::kHasBitsOffset + 13, 0, (0 | ::_fl::kFcOptional | ::_fl::kBool)},
    // optional bool py_generic_services = 18 [default = false];
    {PROTOBUF_FIELD_OFFSET(FileOptions, _impl_.py_generic_services_), _Internal::kHasBitsOffset + 14, 0, (0 | ::_fl::kFcOptional | ::_fl::kBool)},
    // optional bool java_generate_equals_and_hash = 20 [deprecated = true];
    {PROTOBUF_FIELD_OFFSET(FileOptions, _impl_.java_generate_equals_and_hash_), _Internal::kHasBitsOffset + 15, 0, (0 | ::_fl::kFcOptional | ::_fl::kBool)},
    // optional bool deprecated = 23 [default = false];
    {PROTOBUF_FIELD_OFFSET(FileOptions, _impl_.deprecated_), _Internal::kHasBitsOffset + 16, 0, (0 | ::_fl::kFcOptional | ::_fl::kBool)},
    // optional bool java_string_check_utf8 = 27 [default = false];
    {PROTOBUF_FIELD_OFFSET(FileOptions, _impl_.java_string_check_utf8_), _Internal::kHasBitsOffset + 17, 0, (0 | ::_fl::kFcOptional | ::_fl::kBool)},
    // optional bool cc_enable_arenas = 31 [default = true];
    {PROTOBUF_FIELD_OFFSET(FileOptions, _impl_.cc_enable_arenas_), _Internal::kHasBitsOffset + 19, 0, (0 | ::_fl::kFcOptional | ::_fl::kBool)},
    // optional string objc_class_prefix = 36;
    {PROTOBUF_FIELD_OFFSET(FileOptions, _impl_.objc_class_prefix_), _Internal::kHasBitsOffset + 3, 0, (0 | ::_fl::kFcOptional | ::_fl::kBytes | ::_fl::kRepAString)},
    // optional string csharp_namespace = 37;
    {PROTOBUF_FIELD_OFFSET(FileOptions, _impl_.csharp_namespace_), _Internal::kHasBitsOffset + 4, 0, (0 | ::_fl::kFcOptional | ::_fl::kBytes | ::_fl::kRepAString)},
    // optional string swift_prefix = 39;
    {PROTOBUF_FIELD_OFFSET(FileOptions, _impl_.swift_prefix_), _Internal::kHasBitsOffset + 5, 0, (0 | ::_fl::kFcOptional | ::_fl::kBytes | ::_fl::kRepAString)},
    // optional string php_class_prefix = 40;
    {PROTOBUF_FIELD_OFFSET(FileOptions, _impl_.php_class_prefix_), _Internal::kHasBitsOffset + 6, 0, (0 | ::_fl::kFcOptional | ::_fl::kBytes | ::_fl::kRepAString)},
    // optional string php_namespace = 41;
    {PROTOBUF_FIELD_OFFSET(FileOptions, _impl_.php_namespace_), _Internal::kHasBitsOffset + 7, 0, (0 | ::_fl::kFcOptional | ::_fl::kBytes | ::_fl::kRepAString)},
    // optional string php_metadata_namespace = 44;
    {PROTOBUF_FIELD_OFFSET(FileOptions, _impl_.php_metadata_namespace_), _Internal::kHasBitsOffset + 8, 0, (0 | ::_fl::kFcOptional | ::_fl::kBytes | ::_fl::kRepAString)},
    // optional string ruby_package = 45;
    {PROTOBUF_FIELD_OFFSET(FileOptions, _impl_.ruby_package_), _Internal::kHasBitsOffset + 9, 0, (0 | ::_fl::kFcOptional | ::_fl::kBytes | ::_fl::kRepAString)},
    // optional .google.protobuf.FeatureSet features = 50;
    {PROTOBUF_FIELD_OFFSET(FileOptions, _impl_.features_), _Internal::kHasBitsOffset + 10, 0, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)},
    // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
    {PROTOBUF_FIELD_OFFSET(FileOptions, _impl_.uninterpreted_option_), _Internal::kHasBitsOffset + 20, 1, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)},
  }},
  {{
      {::_pbi::TcParser::GetTable<::google::protobuf::FeatureSet>()},
      {::_pbi::TcParser::GetTable<::google::protobuf::UninterpretedOption>()},
      {1, 3},
  }},
  {{
  }},
};
PROTOBUF_NOINLINE void FileOptions::Clear() {
// @@protoc_insertion_point(message_clear_start:google.protobuf.FileOptions)
  ::google::protobuf::internal::TSanWrite(&_impl_);
  ::uint32_t cached_has_bits = 0;
  // Prevent compiler warnings about cached_has_bits being unused
  (void) cached_has_bits;

  _impl_._extensions_.Clear();
  cached_has_bits = _impl_._has_bits_[0];
  if (BatchCheckHasBit(cached_has_bits, 0x000000ffU)) {
    if (CheckHasBit(cached_has_bits, 0x00000001U)) {
      _impl_.java_package_.ClearNonDefaultToEmpty();
    }
    if (CheckHasBit(cached_has_bits, 0x00000002U)) {
      _impl_.java_outer_classname_.ClearNonDefaultToEmpty();
    }
    if (CheckHasBit(cached_has_bits, 0x00000004U)) {
      _impl_.go_package_.ClearNonDefaultToEmpty();
    }
    if (CheckHasBit(cached_has_bits, 0x00000008U)) {
      _impl_.objc_class_prefix_.ClearNonDefaultToEmpty();
    }
    if (CheckHasBit(cached_has_bits, 0x00000010U)) {
      _impl_.csharp_namespace_.ClearNonDefaultToEmpty();
    }
    if (CheckHasBit(cached_has_bits, 0x00000020U)) {
      _impl_.swift_prefix_.ClearNonDefaultToEmpty();
    }
    if (CheckHasBit(cached_has_bits, 0x00000040U)) {
      _impl_.php_class_prefix_.ClearNonDefaultToEmpty();
    }
    if (CheckHasBit(cached_has_bits, 0x00000080U)) {
      _impl_.php_namespace_.ClearNonDefaultToEmpty();
    }
  }
  if (BatchCheckHasBit(cached_has_bits, 0x00000700U)) {
    if (CheckHasBit(cached_has_bits, 0x00000100U)) {
      _impl_.php_metadata_namespace_.ClearNonDefaultToEmpty();
    }
    if (CheckHasBit(cached_has_bits, 0x00000200U)) {
      _impl_.ruby_package_.ClearNonDefaultToEmpty();
    }
    if (CheckHasBit(cached_has_bits, 0x00000400U)) {
      ABSL_DCHECK(_impl_.features_ != nullptr);
      _impl_.features_->Clear();
    }
  }
  if (BatchCheckHasBit(cached_has_bits, 0x0000f800U)) {
    ::memset(&_impl_.java_multiple_files_, 0, static_cast<::size_t>(
        reinterpret_cast<char*>(&_impl_.java_generate_equals_and_hash_) -
        reinterpret_cast<char*>(&_impl_.java_multiple_files_)) + sizeof(_impl_.java_generate_equals_and_hash_));
  }
  if (BatchCheckHasBit(cached_has_bits, 0x001f0000U)) {
    ::memset(&_impl_.deprecated_, 0, static_cast<::size_t>(
        reinterpret_cast<char*>(&_impl_.java_string_check_utf8_) -
        reinterpret_cast<char*>(&_impl_.deprecated_)) + sizeof(_impl_.java_string_check_utf8_));
    _impl_.optimize_for_ = 1;
    _impl_.cc_enable_arenas_ = true;
    if (CheckHasBitForRepeated(cached_has_bits, 0x00100000U)) {
      _impl_.uninterpreted_option_.Clear();
    }
  }
  _impl_._has_bits_.Clear();
  _internal_metadata_.Clear<::google::protobuf::UnknownFieldSet>();
}

#if defined(PROTOBUF_CUSTOM_VTABLE)
::uint8_t* PROTOBUF_NONNULL FileOptions::_InternalSerialize(
    const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target,
    ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) {
  const FileOptions& this_ = static_cast<const FileOptions&>(base);
#else   // PROTOBUF_CUSTOM_VTABLE
::uint8_t* PROTOBUF_NONNULL FileOptions::_InternalSerialize(
    ::uint8_t* PROTOBUF_NONNULL target,
    ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const {
  const FileOptions& this_ = *this;
#endif  // PROTOBUF_CUSTOM_VTABLE
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    this_.CheckHasBitConsistency();
  }
  // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.FileOptions)
  ::uint32_t cached_has_bits = 0;
  (void)cached_has_bits;

  cached_has_bits = this_._impl_._has_bits_[0];
  // optional string java_package = 1;
  if (CheckHasBit(cached_has_bits, 0x00000001U)) {
    const ::std::string& _s = this_._internal_java_package();
    target = stream->WriteStringMaybeAliased(1, _s, target);
  }

  // optional string java_outer_classname = 8;
  if (CheckHasBit(cached_has_bits, 0x00000002U)) {
    const ::std::string& _s = this_._internal_java_outer_classname();
    target = stream->WriteStringMaybeAliased(8, _s, target);
  }

  // optional .google.protobuf.FileOptions.OptimizeMode optimize_for = 9 [default = SPEED];
  if (CheckHasBit(cached_has_bits, 0x00040000U)) {
    target = stream->EnsureSpace(target);
    target = ::_pbi::WireFormatLite::WriteEnumToArray(
        9, this_._internal_optimize_for(), target);
  }

  // optional bool java_multiple_files = 10 [default = false];
  if (CheckHasBit(cached_has_bits, 0x00000800U)) {
    target = stream->EnsureSpace(target);
    target = ::_pbi::WireFormatLite::WriteBoolToArray(
        10, this_._internal_java_multiple_files(), target);
  }

  // optional string go_package = 11;
  if (CheckHasBit(cached_has_bits, 0x00000004U)) {
    const ::std::string& _s = this_._internal_go_package();
    target = stream->WriteStringMaybeAliased(11, _s, target);
  }

  // optional bool cc_generic_services = 16 [default = false];
  if (CheckHasBit(cached_has_bits, 0x00001000U)) {
    target = stream->EnsureSpace(target);
    target = ::_pbi::WireFormatLite::WriteBoolToArray(
        16, this_._internal_cc_generic_services(), target);
  }

  // optional bool java_generic_services = 17 [default = false];
  if (CheckHasBit(cached_has_bits, 0x00002000U)) {
    target = stream->EnsureSpace(target);
    target = ::_pbi::WireFormatLite::WriteBoolToArray(
        17, this_._internal_java_generic_services(), target);
  }

  // optional bool py_generic_services = 18 [default = false];
  if (CheckHasBit(cached_has_bits, 0x00004000U)) {
    target = stream->EnsureSpace(target);
    target = ::_pbi::WireFormatLite::WriteBoolToArray(
        18, this_._internal_py_generic_services(), target);
  }

  // optional bool java_generate_equals_and_hash = 20 [deprecated = true];
  if (CheckHasBit(cached_has_bits, 0x00008000U)) {
    target = stream->EnsureSpace(target);
    target = ::_pbi::WireFormatLite::WriteBoolToArray(
        20, this_._internal_java_generate_equals_and_hash(), target);
  }

  // optional bool deprecated = 23 [default = false];
  if (CheckHasBit(cached_has_bits, 0x00010000U)) {
    target = stream->EnsureSpace(target);
    target = ::_pbi::WireFormatLite::WriteBoolToArray(
        23, this_._internal_deprecated(), target);
  }

  // optional bool java_string_check_utf8 = 27 [default = false];
  if (CheckHasBit(cached_has_bits, 0x00020000U)) {
    target = stream->EnsureSpace(target);
    target = ::_pbi::WireFormatLite::WriteBoolToArray(
        27, this_._internal_java_string_check_utf8(), target);
  }

  // optional bool cc_enable_arenas = 31 [default = true];
  if (CheckHasBit(cached_has_bits, 0x00080000U)) {
    target = stream->EnsureSpace(target);
    target = ::_pbi::WireFormatLite::WriteBoolToArray(
        31, this_._internal_cc_enable_arenas(), target);
  }

  // optional string objc_class_prefix = 36;
  if (CheckHasBit(cached_has_bits, 0x00000008U)) {
    const ::std::string& _s = this_._internal_objc_class_prefix();
    target = stream->WriteStringMaybeAliased(36, _s, target);
  }

  // optional string csharp_namespace = 37;
  if (CheckHasBit(cached_has_bits, 0x00000010U)) {
    const ::std::string& _s = this_._internal_csharp_namespace();
    target = stream->WriteStringMaybeAliased(37, _s, target);
  }

  // optional string swift_prefix = 39;
  if (CheckHasBit(cached_has_bits, 0x00000020U)) {
    const ::std::string& _s = this_._internal_swift_prefix();
    target = stream->WriteStringMaybeAliased(39, _s, target);
  }

  // optional string php_class_prefix = 40;
  if (CheckHasBit(cached_has_bits, 0x00000040U)) {
    const ::std::string& _s = this_._internal_php_class_prefix();
    target = stream->WriteStringMaybeAliased(40, _s, target);
  }

  // optional string php_namespace = 41;
  if (CheckHasBit(cached_has_bits, 0x00000080U)) {
    const ::std::string& _s = this_._internal_php_namespace();
    target = stream->WriteStringMaybeAliased(41, _s, target);
  }

  // optional string php_metadata_namespace = 44;
  if (CheckHasBit(cached_has_bits, 0x00000100U)) {
    const ::std::string& _s = this_._internal_php_metadata_namespace();
    target = stream->WriteStringMaybeAliased(44, _s, target);
  }

  // optional string ruby_package = 45;
  if (CheckHasBit(cached_has_bits, 0x00000200U)) {
    const ::std::string& _s = this_._internal_ruby_package();
    target = stream->WriteStringMaybeAliased(45, _s, target);
  }

  // optional .google.protobuf.FeatureSet features = 50;
  if (CheckHasBit(cached_has_bits, 0x00000400U)) {
    target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage(
        50, *this_._impl_.features_, this_._impl_.features_->GetCachedSize(), target,
        stream);
  }

  // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
  if (CheckHasBitForRepeated(cached_has_bits, 0x00100000U)) {
    for (unsigned i = 0, n = static_cast<unsigned>(
                             this_._internal_uninterpreted_option_size());
         i < n; i++) {
      const auto& repfield = this_._internal_uninterpreted_option().Get(i);
      target =
          ::google::protobuf::internal::WireFormatLite::InternalWriteMessage(
              999, repfield, repfield.GetCachedSize(),
              target, stream);
    }
  }

  // All extensions.
  target = this_._impl_._extensions_._InternalSerializeAll(&default_instance(),
                                                    target, stream);
  if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) {
    target =
        ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray(
            this_._internal_metadata_.unknown_fields<::google::protobuf::UnknownFieldSet>(::google::protobuf::UnknownFieldSet::default_instance), target, stream);
  }
  // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.FileOptions)
  return target;
}

#if defined(PROTOBUF_CUSTOM_VTABLE)
::size_t FileOptions::ByteSizeLong(const MessageLite& base) {
  const FileOptions& this_ = static_cast<const FileOptions&>(base);
#else   // PROTOBUF_CUSTOM_VTABLE
::size_t FileOptions::ByteSizeLong() const {
  const FileOptions& this_ = *this;
#endif  // PROTOBUF_CUSTOM_VTABLE
  // @@protoc_insertion_point(message_byte_size_start:google.protobuf.FileOptions)
  ::size_t total_size = 0;
  total_size += this_._impl_._extensions_.ByteSize();

  ::uint32_t cached_has_bits = 0;
  // Prevent compiler warnings about cached_has_bits being unused
  (void)cached_has_bits;

  ::_pbi::Prefetch5LinesFrom7Lines(&this_);
  cached_has_bits = this_._impl_._has_bits_[0];
  total_size += ::absl::popcount(0x000bf000U & cached_has_bits) * 3;
  total_size += static_cast<bool>(0x00000800U & cached_has_bits) * 2;
  if (BatchCheckHasBit(cached_has_bits, 0x000000ffU)) {
    // optional string java_package = 1;
    if (CheckHasBit(cached_has_bits, 0x00000001U)) {
      total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize(
                                      this_._internal_java_package());
    }
    // optional string java_outer_classname = 8;
    if (CheckHasBit(cached_has_bits, 0x00000002U)) {
      total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize(
                                      this_._internal_java_outer_classname());
    }
    // optional string go_package = 11;
    if (CheckHasBit(cached_has_bits, 0x00000004U)) {
      total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize(
                                      this_._internal_go_package());
    }
    // optional string objc_class_prefix = 36;
    if (CheckHasBit(cached_has_bits, 0x00000008U)) {
      total_size += 2 + ::google::protobuf::internal::WireFormatLite::StringSize(
                                      this_._internal_objc_class_prefix());
    }
    // optional string csharp_namespace = 37;
    if (CheckHasBit(cached_has_bits, 0x00000010U)) {
      total_size += 2 + ::google::protobuf::internal::WireFormatLite::StringSize(
                                      this_._internal_csharp_namespace());
    }
    // optional string swift_prefix = 39;
    if (CheckHasBit(cached_has_bits, 0x00000020U)) {
      total_size += 2 + ::google::protobuf::internal::WireFormatLite::StringSize(
                                      this_._internal_swift_prefix());
    }
    // optional string php_class_prefix = 40;
    if (CheckHasBit(cached_has_bits, 0x00000040U)) {
      total_size += 2 + ::google::protobuf::internal::WireFormatLite::StringSize(
                                      this_._internal_php_class_prefix());
    }
    // optional string php_namespace = 41;
    if (CheckHasBit(cached_has_bits, 0x00000080U)) {
      total_size += 2 + ::google::protobuf::internal::WireFormatLite::StringSize(
                                      this_._internal_php_namespace());
    }
  }
  if (BatchCheckHasBit(cached_has_bits, 0x00000700U)) {
    // optional string php_metadata_namespace = 44;
    if (CheckHasBit(cached_has_bits, 0x00000100U)) {
      total_size += 2 + ::google::protobuf::internal::WireFormatLite::StringSize(
                                      this_._internal_php_metadata_namespace());
    }
    // optional string ruby_package = 45;
    if (CheckHasBit(cached_has_bits, 0x00000200U)) {
      total_size += 2 + ::google::protobuf::internal::WireFormatLite::StringSize(
                                      this_._internal_ruby_package());
    }
    // optional .google.protobuf.FeatureSet features = 50;
    if (CheckHasBit(cached_has_bits, 0x00000400U)) {
      total_size += 2 +
                    ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.features_);
    }
  }
  if (BatchCheckHasBit(cached_has_bits, 0x00140000U)) {
    // optional .google.protobuf.FileOptions.OptimizeMode optimize_for = 9 [default = SPEED];
    if (CheckHasBit(cached_has_bits, 0x00040000U)) {
      total_size += 1 +
                    ::_pbi::WireFormatLite::EnumSize(this_._internal_optimize_for());
    }
    // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
    if (CheckHasBitForRepeated(cached_has_bits, 0x00100000U)) {
      total_size += 2UL * this_._internal_uninterpreted_option_size();
      for (const auto& msg : this_._internal_uninterpreted_option()) {
        total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg);
      }
    }
  }
  return this_.MaybeComputeUnknownFieldsSize(total_size,
                                             &this_._impl_._cached_size_);
}

void FileOptions::MergeImpl(::google::protobuf::MessageLite& to_msg,
                            const ::google::protobuf::MessageLite& from_msg) {
   auto* const _this =
      static_cast<FileOptions*>(&to_msg);
  auto& from = static_cast<const FileOptions&>(from_msg);
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    from.CheckHasBitConsistency();
  }
  ::google::protobuf::Arena* arena = _this->GetArena();
  // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.FileOptions)
  ABSL_DCHECK_NE(&from, _this);
  ::uint32_t cached_has_bits = 0;
  (void)cached_has_bits;

  cached_has_bits = from._impl_._has_bits_[0];
  if (BatchCheckHasBit(cached_has_bits, 0x000000ffU)) {
    if (CheckHasBit(cached_has_bits, 0x00000001U)) {
      _this->_internal_set_java_package(from._internal_java_package());
    }
    if (CheckHasBit(cached_has_bits, 0x00000002U)) {
      _this->_internal_set_java_outer_classname(from._internal_java_outer_classname());
    }
    if (CheckHasBit(cached_has_bits, 0x00000004U)) {
      _this->_internal_set_go_package(from._internal_go_package());
    }
    if (CheckHasBit(cached_has_bits, 0x00000008U)) {
      _this->_internal_set_objc_class_prefix(from._internal_objc_class_prefix());
    }
    if (CheckHasBit(cached_has_bits, 0x00000010U)) {
      _this->_internal_set_csharp_namespace(from._internal_csharp_namespace());
    }
    if (CheckHasBit(cached_has_bits, 0x00000020U)) {
      _this->_internal_set_swift_prefix(from._internal_swift_prefix());
    }
    if (CheckHasBit(cached_has_bits, 0x00000040U)) {
      _this->_internal_set_php_class_prefix(from._internal_php_class_prefix());
    }
    if (CheckHasBit(cached_has_bits, 0x00000080U)) {
      _this->_internal_set_php_namespace(from._internal_php_namespace());
    }
  }
  if (BatchCheckHasBit(cached_has_bits, 0x0000ff00U)) {
    if (CheckHasBit(cached_has_bits, 0x00000100U)) {
      _this->_internal_set_php_metadata_namespace(from._internal_php_metadata_namespace());
    }
    if (CheckHasBit(cached_has_bits, 0x00000200U)) {
      _this->_internal_set_ruby_package(from._internal_ruby_package());
    }
    if (CheckHasBit(cached_has_bits, 0x00000400U)) {
      ABSL_DCHECK(from._impl_.features_ != nullptr);
      if (_this->_impl_.features_ == nullptr) {
        _this->_impl_.features_ = ::google::protobuf::Message::CopyConstruct(arena, *from._impl_.features_);
      } else {
        _this->_impl_.features_->MergeFrom(*from._impl_.features_);
      }
    }
    if (CheckHasBit(cached_has_bits, 0x00000800U)) {
      _this->_impl_.java_multiple_files_ = from._impl_.java_multiple_files_;
    }
    if (CheckHasBit(cached_has_bits, 0x00001000U)) {
      _this->_impl_.cc_generic_services_ = from._impl_.cc_generic_services_;
    }
    if (CheckHasBit(cached_has_bits, 0x00002000U)) {
      _this->_impl_.java_generic_services_ = from._impl_.java_generic_services_;
    }
    if (CheckHasBit(cached_has_bits, 0x00004000U)) {
      _this->_impl_.py_generic_services_ = from._impl_.py_generic_services_;
    }
    if (CheckHasBit(cached_has_bits, 0x00008000U)) {
      _this->_impl_.java_generate_equals_and_hash_ = from._impl_.java_generate_equals_and_hash_;
    }
  }
  if (BatchCheckHasBit(cached_has_bits, 0x001f0000U)) {
    if (CheckHasBit(cached_has_bits, 0x00010000U)) {
      _this->_impl_.deprecated_ = from._impl_.deprecated_;
    }
    if (CheckHasBit(cached_has_bits, 0x00020000U)) {
      _this->_impl_.java_string_check_utf8_ = from._impl_.java_string_check_utf8_;
    }
    if (CheckHasBit(cached_has_bits, 0x00040000U)) {
      _this->_impl_.optimize_for_ = from._impl_.optimize_for_;
    }
    if (CheckHasBit(cached_has_bits, 0x00080000U)) {
      _this->_impl_.cc_enable_arenas_ = from._impl_.cc_enable_arenas_;
    }
    if (CheckHasBitForRepeated(cached_has_bits, 0x00100000U)) {
      _this->_internal_mutable_uninterpreted_option()->InternalMergeFromWithArena(
          ::google::protobuf::MessageLite::internal_visibility(), arena,
          from._internal_uninterpreted_option());
    }
  }
  _this->_impl_._has_bits_[0] |= cached_has_bits;
  _this->_impl_._extensions_.MergeFrom(&default_instance(),
                                from._impl_._extensions_);
  _this->_internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(
      from._internal_metadata_);
}

void FileOptions::CopyFrom(const FileOptions& from) {
  // @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.FileOptions)
  if (&from == this) return;
  Clear();
  MergeFrom(from);
}

PROTOBUF_NOINLINE bool FileOptions::IsInitializedImpl(
    const MessageLite& msg) {
  auto& this_ = static_cast<const FileOptions&>(msg);
  if (!this_._impl_._extensions_.IsInitialized(&default_instance())) {
    return false;
  }
  if (CheckHasBit(this_._impl_._has_bits_[0], 0x00000400U)) {
    if (!this_._impl_.features_->IsInitialized()) return false;
  }
  if (!::google::protobuf::internal::AllAreInitialized(this_._internal_uninterpreted_option()))
    return false;
  return true;
}

void FileOptions::InternalSwap(FileOptions* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) {
  using ::std::swap;
  _impl_._extensions_.InternalSwap(&other->_impl_._extensions_);
  auto* arena = GetArena();
  ABSL_DCHECK_EQ(arena, other->GetArena());
  _internal_metadata_.InternalSwap(&other->_internal_metadata_);
  swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]);
  ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.java_package_, &other->_impl_.java_package_, arena);
  ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.java_outer_classname_, &other->_impl_.java_outer_classname_, arena);
  ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.go_package_, &other->_impl_.go_package_, arena);
  ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.objc_class_prefix_, &other->_impl_.objc_class_prefix_, arena);
  ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.csharp_namespace_, &other->_impl_.csharp_namespace_, arena);
  ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.swift_prefix_, &other->_impl_.swift_prefix_, arena);
  ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.php_class_prefix_, &other->_impl_.php_class_prefix_, arena);
  ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.php_namespace_, &other->_impl_.php_namespace_, arena);
  ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.php_metadata_namespace_, &other->_impl_.php_metadata_namespace_, arena);
  ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.ruby_package_, &other->_impl_.ruby_package_, arena);
  ::google::protobuf::internal::memswap<
      PROTOBUF_FIELD_OFFSET(FileOptions, _impl_.cc_enable_arenas_)
      + sizeof(FileOptions::_impl_.cc_enable_arenas_)
      - PROTOBUF_FIELD_OFFSET(FileOptions, _impl_.features_)>(
          reinterpret_cast<char*>(&_impl_.features_),
          reinterpret_cast<char*>(&other->_impl_.features_));
  _impl_.uninterpreted_option_.InternalSwap(&other->_impl_.uninterpreted_option_);
}

::google::protobuf::Metadata FileOptions::GetMetadata() const {
  return ::google::protobuf::Message::GetMetadataImpl(GetClassData()->full());
}
// ===================================================================

class MessageOptions::_Internal {
 public:
  using HasBits =
      decltype(::std::declval<MessageOptions>()._impl_._has_bits_);
  static constexpr ::int32_t kHasBitsOffset =
      8 * PROTOBUF_FIELD_OFFSET(MessageOptions, _impl_._has_bits_);
};

MessageOptions::MessageOptions(::google::protobuf::Arena* PROTOBUF_NULLABLE arena)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(arena, MessageOptions_class_data_.base()) {
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(arena) {
#endif  // PROTOBUF_CUSTOM_VTABLE
  SharedCtor(arena);
  // @@protoc_insertion_point(arena_constructor:google.protobuf.MessageOptions)
}
PROTOBUF_NDEBUG_INLINE MessageOptions::Impl_::Impl_(
    [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility,
    [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from,
    [[maybe_unused]] const ::google::protobuf::MessageOptions& from_msg)
      : _extensions_{visibility, arena},
        _has_bits_{from._has_bits_},
        _cached_size_{0},
        uninterpreted_option_{visibility, arena, from.uninterpreted_option_} {}

MessageOptions::MessageOptions(
    ::google::protobuf::Arena* PROTOBUF_NULLABLE arena,
    const MessageOptions& from)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(arena, MessageOptions_class_data_.base()) {
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(arena) {
#endif  // PROTOBUF_CUSTOM_VTABLE
  MessageOptions* const _this = this;
  (void)_this;
  _internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(
      from._internal_metadata_);
  new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from);
  _impl_._extensions_.MergeFrom(this, from._impl_._extensions_);
  ::uint32_t cached_has_bits = _impl_._has_bits_[0];
  _impl_.features_ = (CheckHasBit(cached_has_bits, 0x00000001U))
                ? ::google::protobuf::Message::CopyConstruct(arena, *from._impl_.features_)
                : nullptr;
  ::memcpy(reinterpret_cast<char*>(&_impl_) +
               offsetof(Impl_, message_set_wire_format_),
           reinterpret_cast<const char*>(&from._impl_) +
               offsetof(Impl_, message_set_wire_format_),
           offsetof(Impl_, deprecated_legacy_json_field_conflicts_) -
               offsetof(Impl_, message_set_wire_format_) +
               sizeof(Impl_::deprecated_legacy_json_field_conflicts_));

  // @@protoc_insertion_point(copy_constructor:google.protobuf.MessageOptions)
}
PROTOBUF_NDEBUG_INLINE MessageOptions::Impl_::Impl_(
    [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility,
    [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena)
      : _extensions_{visibility, arena},
        _cached_size_{0},
        uninterpreted_option_{visibility, arena} {}

inline void MessageOptions::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) {
  new (&_impl_) Impl_(internal_visibility(), arena);
  ::memset(reinterpret_cast<char*>(&_impl_) +
               offsetof(Impl_, features_),
           0,
           offsetof(Impl_, deprecated_legacy_json_field_conflicts_) -
               offsetof(Impl_, features_) +
               sizeof(Impl_::deprecated_legacy_json_field_conflicts_));
}
MessageOptions::~MessageOptions() {
  // @@protoc_insertion_point(destructor:google.protobuf.MessageOptions)
  SharedDtor(*this);
}
inline void MessageOptions::SharedDtor(MessageLite& self) {
  MessageOptions& this_ = static_cast<MessageOptions&>(self);
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    this_.CheckHasBitConsistency();
  }
  this_._internal_metadata_.Delete<::google::protobuf::UnknownFieldSet>();
  ABSL_DCHECK(this_.GetArena() == nullptr);
  delete this_._impl_.features_;
  this_._impl_.~Impl_();
}

inline void* PROTOBUF_NONNULL MessageOptions::PlacementNew_(
    const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem,
    ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) {
  return ::new (mem) MessageOptions(arena);
}
constexpr auto MessageOptions::InternalNewImpl_() {
  constexpr auto arena_bits = ::google::protobuf::internal::EncodePlacementArenaOffsets({
      PROTOBUF_FIELD_OFFSET(MessageOptions, _impl_._extensions_) +
          decltype(MessageOptions::_impl_._extensions_)::InternalGetArenaOffset(
              ::google::protobuf::Message::internal_visibility()),
      PROTOBUF_FIELD_OFFSET(MessageOptions, _impl_.uninterpreted_option_) +
          decltype(MessageOptions::_impl_.uninterpreted_option_)::
              InternalGetArenaOffset(
                  ::google::protobuf::Message::internal_visibility()),
  });
  if (arena_bits.has_value()) {
    return ::google::protobuf::internal::MessageCreator::ZeroInit(
        sizeof(MessageOptions), alignof(MessageOptions), *arena_bits);
  } else {
    return ::google::protobuf::internal::MessageCreator(&MessageOptions::PlacementNew_,
                                 sizeof(MessageOptions),
                                 alignof(MessageOptions));
  }
}
constexpr auto MessageOptions::InternalGenerateClassData_() {
  return ::google::protobuf::internal::ClassDataFull{
      ::google::protobuf::internal::ClassData{
          &_MessageOptions_default_instance_._instance,
          &_table_.header,
          nullptr,  // OnDemandRegisterArenaDtor
          MessageOptions::IsInitializedImpl,
          &MessageOptions::MergeImpl,
          ::google::protobuf::Message::GetNewImpl<MessageOptions>(),
#if defined(PROTOBUF_CUSTOM_VTABLE)
          &MessageOptions::SharedDtor,
          ::google::protobuf::Message::GetClearImpl<MessageOptions>(), &MessageOptions::ByteSizeLong,
              &MessageOptions::_InternalSerialize,
#endif  // PROTOBUF_CUSTOM_VTABLE
          PROTOBUF_FIELD_OFFSET(MessageOptions, _impl_._cached_size_),
          false,
      },
      &MessageOptions::kDescriptorMethods,
      &descriptor_table_google_2fprotobuf_2fdescriptor_2eproto,
      nullptr,  // tracker
  };
}

PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 const
    ::google::protobuf::internal::ClassDataFull MessageOptions_class_data_ =
        MessageOptions::InternalGenerateClassData_();

PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL
MessageOptions::GetClassData() const {
  ::google::protobuf::internal::PrefetchToLocalCache(&MessageOptions_class_data_);
  ::google::protobuf::internal::PrefetchToLocalCache(MessageOptions_class_data_.tc_table);
  return MessageOptions_class_data_.base();
}
constexpr ::_pbi::TcParseTable<3, 7, 2, 0, 7>
MessageOptions::_table_ = {
  {
    PROTOBUF_FIELD_OFFSET(MessageOptions, _impl_._has_bits_),
    PROTOBUF_FIELD_OFFSET(MessageOptions, _impl_._extensions_),
    999, 56,  // max_field_number, fast_idx_mask
    offsetof(decltype(_table_), field_lookup_table),
    4294964152,  // skipmap
    offsetof(decltype(_table_), field_entries),
    7,  // num_field_entries
    2,  // num_aux_entries
    offsetof(decltype(_table_), aux_entries),
    MessageOptions_class_data_.base(),
    nullptr,  // post_loop_handler
    ::_pbi::TcParser::GenericFallback,  // fallback
    #ifdef PROTOBUF_PREFETCH_PARSE_TABLE
    ::_pbi::TcParser::GetTable<::google::protobuf::MessageOptions>(),  // to_prefetch
    #endif  // PROTOBUF_PREFETCH_PARSE_TABLE
  }, {{
    {::_pbi::TcParser::MiniParse, {}},
    // optional bool message_set_wire_format = 1 [default = false];
    {::_pbi::TcParser::SingularVarintNoZag1<bool, offsetof(MessageOptions, _impl_.message_set_wire_format_), 1>(),
     {8, 1, 0,
      PROTOBUF_FIELD_OFFSET(MessageOptions, _impl_.message_set_wire_format_)}},
    // optional bool no_standard_descriptor_accessor = 2 [default = false];
    {::_pbi::TcParser::SingularVarintNoZag1<bool, offsetof(MessageOptions, _impl_.no_standard_descriptor_accessor_), 2>(),
     {16, 2, 0,
      PROTOBUF_FIELD_OFFSET(MessageOptions, _impl_.no_standard_descriptor_accessor_)}},
    // optional bool deprecated = 3 [default = false];
    {::_pbi::TcParser::SingularVarintNoZag1<bool, offsetof(MessageOptions, _impl_.deprecated_), 3>(),
     {24, 3, 0,
      PROTOBUF_FIELD_OFFSET(MessageOptions, _impl_.deprecated_)}},
    // optional .google.protobuf.FeatureSet features = 12;
    {::_pbi::TcParser::FastMtS1,
     {98, 0, 0,
      PROTOBUF_FIELD_OFFSET(MessageOptions, _impl_.features_)}},
    {::_pbi::TcParser::MiniParse, {}},
    {::_pbi::TcParser::MiniParse, {}},
    // optional bool map_entry = 7;
    {::_pbi::TcParser::SingularVarintNoZag1<bool, offsetof(MessageOptions, _impl_.map_entry_), 4>(),
     {56, 4, 0,
      PROTOBUF_FIELD_OFFSET(MessageOptions, _impl_.map_entry_)}},
  }}, {{
    999, 0, 1,
    65534, 6,
    65535, 65535
  }}, {{
    // optional bool message_set_wire_format = 1 [default = false];
    {PROTOBUF_FIELD_OFFSET(MessageOptions, _impl_.message_set_wire_format_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kBool)},
    // optional bool no_standard_descriptor_accessor = 2 [default = false];
    {PROTOBUF_FIELD_OFFSET(MessageOptions, _impl_.no_standard_descriptor_accessor_), _Internal::kHasBitsOffset + 2, 0, (0 | ::_fl::kFcOptional | ::_fl::kBool)},
    // optional bool deprecated = 3 [default = false];
    {PROTOBUF_FIELD_OFFSET(MessageOptions, _impl_.deprecated_), _Internal::kHasBitsOffset + 3, 0, (0 | ::_fl::kFcOptional | ::_fl::kBool)},
    // optional bool map_entry = 7;
    {PROTOBUF_FIELD_OFFSET(MessageOptions, _impl_.map_entry_), _Internal::kHasBitsOffset + 4, 0, (0 | ::_fl::kFcOptional | ::_fl::kBool)},
    // optional bool deprecated_legacy_json_field_conflicts = 11 [deprecated = true];
    {PROTOBUF_FIELD_OFFSET(MessageOptions, _impl_.deprecated_legacy_json_field_conflicts_), _Internal::kHasBitsOffset + 5, 0, (0 | ::_fl::kFcOptional | ::_fl::kBool)},
    // optional .google.protobuf.FeatureSet features = 12;
    {PROTOBUF_FIELD_OFFSET(MessageOptions, _impl_.features_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)},
    // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
    {PROTOBUF_FIELD_OFFSET(MessageOptions, _impl_.uninterpreted_option_), _Internal::kHasBitsOffset + 6, 1, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)},
  }},
  {{
      {::_pbi::TcParser::GetTable<::google::protobuf::FeatureSet>()},
      {::_pbi::TcParser::GetTable<::google::protobuf::UninterpretedOption>()},
  }},
  {{
  }},
};
PROTOBUF_NOINLINE void MessageOptions::Clear() {
// @@protoc_insertion_point(message_clear_start:google.protobuf.MessageOptions)
  ::google::protobuf::internal::TSanWrite(&_impl_);
  ::uint32_t cached_has_bits = 0;
  // Prevent compiler warnings about cached_has_bits being unused
  (void) cached_has_bits;

  _impl_._extensions_.Clear();
  cached_has_bits = _impl_._has_bits_[0];
  if (CheckHasBit(cached_has_bits, 0x00000001U)) {
    ABSL_DCHECK(_impl_.features_ != nullptr);
    _impl_.features_->Clear();
  }
  if (BatchCheckHasBit(cached_has_bits, 0x0000007eU)) {
    ::memset(&_impl_.message_set_wire_format_, 0, static_cast<::size_t>(
        reinterpret_cast<char*>(&_impl_.deprecated_legacy_json_field_conflicts_) -
        reinterpret_cast<char*>(&_impl_.message_set_wire_format_)) + sizeof(_impl_.deprecated_legacy_json_field_conflicts_));
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000040U)) {
      _impl_.uninterpreted_option_.Clear();
    }
  }
  _impl_._has_bits_.Clear();
  _internal_metadata_.Clear<::google::protobuf::UnknownFieldSet>();
}

#if defined(PROTOBUF_CUSTOM_VTABLE)
::uint8_t* PROTOBUF_NONNULL MessageOptions::_InternalSerialize(
    const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target,
    ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) {
  const MessageOptions& this_ = static_cast<const MessageOptions&>(base);
#else   // PROTOBUF_CUSTOM_VTABLE
::uint8_t* PROTOBUF_NONNULL MessageOptions::_InternalSerialize(
    ::uint8_t* PROTOBUF_NONNULL target,
    ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const {
  const MessageOptions& this_ = *this;
#endif  // PROTOBUF_CUSTOM_VTABLE
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    this_.CheckHasBitConsistency();
  }
  // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.MessageOptions)
  ::uint32_t cached_has_bits = 0;
  (void)cached_has_bits;

  cached_has_bits = this_._impl_._has_bits_[0];
  // optional bool message_set_wire_format = 1 [default = false];
  if (CheckHasBit(cached_has_bits, 0x00000002U)) {
    target = stream->EnsureSpace(target);
    target = ::_pbi::WireFormatLite::WriteBoolToArray(
        1, this_._internal_message_set_wire_format(), target);
  }

  // optional bool no_standard_descriptor_accessor = 2 [default = false];
  if (CheckHasBit(cached_has_bits, 0x00000004U)) {
    target = stream->EnsureSpace(target);
    target = ::_pbi::WireFormatLite::WriteBoolToArray(
        2, this_._internal_no_standard_descriptor_accessor(), target);
  }

  // optional bool deprecated = 3 [default = false];
  if (CheckHasBit(cached_has_bits, 0x00000008U)) {
    target = stream->EnsureSpace(target);
    target = ::_pbi::WireFormatLite::WriteBoolToArray(
        3, this_._internal_deprecated(), target);
  }

  // optional bool map_entry = 7;
  if (CheckHasBit(cached_has_bits, 0x00000010U)) {
    target = stream->EnsureSpace(target);
    target = ::_pbi::WireFormatLite::WriteBoolToArray(
        7, this_._internal_map_entry(), target);
  }

  // optional bool deprecated_legacy_json_field_conflicts = 11 [deprecated = true];
  if (CheckHasBit(cached_has_bits, 0x00000020U)) {
    target = stream->EnsureSpace(target);
    target = ::_pbi::WireFormatLite::WriteBoolToArray(
        11, this_._internal_deprecated_legacy_json_field_conflicts(), target);
  }

  // optional .google.protobuf.FeatureSet features = 12;
  if (CheckHasBit(cached_has_bits, 0x00000001U)) {
    target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage(
        12, *this_._impl_.features_, this_._impl_.features_->GetCachedSize(), target,
        stream);
  }

  // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
  if (CheckHasBitForRepeated(cached_has_bits, 0x00000040U)) {
    for (unsigned i = 0, n = static_cast<unsigned>(
                             this_._internal_uninterpreted_option_size());
         i < n; i++) {
      const auto& repfield = this_._internal_uninterpreted_option().Get(i);
      target =
          ::google::protobuf::internal::WireFormatLite::InternalWriteMessage(
              999, repfield, repfield.GetCachedSize(),
              target, stream);
    }
  }

  // All extensions.
  target = this_._impl_._extensions_._InternalSerializeAll(&default_instance(),
                                                    target, stream);
  if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) {
    target =
        ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray(
            this_._internal_metadata_.unknown_fields<::google::protobuf::UnknownFieldSet>(::google::protobuf::UnknownFieldSet::default_instance), target, stream);
  }
  // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.MessageOptions)
  return target;
}

#if defined(PROTOBUF_CUSTOM_VTABLE)
::size_t MessageOptions::ByteSizeLong(const MessageLite& base) {
  const MessageOptions& this_ = static_cast<const MessageOptions&>(base);
#else   // PROTOBUF_CUSTOM_VTABLE
::size_t MessageOptions::ByteSizeLong() const {
  const MessageOptions& this_ = *this;
#endif  // PROTOBUF_CUSTOM_VTABLE
  // @@protoc_insertion_point(message_byte_size_start:google.protobuf.MessageOptions)
  ::size_t total_size = 0;
  total_size += this_._impl_._extensions_.ByteSize();

  ::uint32_t cached_has_bits = 0;
  // Prevent compiler warnings about cached_has_bits being unused
  (void)cached_has_bits;

  ::_pbi::Prefetch5LinesFrom7Lines(&this_);
  cached_has_bits = this_._impl_._has_bits_[0];
  total_size += ::absl::popcount(0x0000003eU & cached_has_bits) * 2;
  if (BatchCheckHasBit(cached_has_bits, 0x00000041U)) {
    // optional .google.protobuf.FeatureSet features = 12;
    if (CheckHasBit(cached_has_bits, 0x00000001U)) {
      total_size += 1 +
                    ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.features_);
    }
    // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000040U)) {
      total_size += 2UL * this_._internal_uninterpreted_option_size();
      for (const auto& msg : this_._internal_uninterpreted_option()) {
        total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg);
      }
    }
  }
  return this_.MaybeComputeUnknownFieldsSize(total_size,
                                             &this_._impl_._cached_size_);
}

void MessageOptions::MergeImpl(::google::protobuf::MessageLite& to_msg,
                            const ::google::protobuf::MessageLite& from_msg) {
   auto* const _this =
      static_cast<MessageOptions*>(&to_msg);
  auto& from = static_cast<const MessageOptions&>(from_msg);
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    from.CheckHasBitConsistency();
  }
  ::google::protobuf::Arena* arena = _this->GetArena();
  // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.MessageOptions)
  ABSL_DCHECK_NE(&from, _this);
  ::uint32_t cached_has_bits = 0;
  (void)cached_has_bits;

  cached_has_bits = from._impl_._has_bits_[0];
  if (BatchCheckHasBit(cached_has_bits, 0x0000007fU)) {
    if (CheckHasBit(cached_has_bits, 0x00000001U)) {
      ABSL_DCHECK(from._impl_.features_ != nullptr);
      if (_this->_impl_.features_ == nullptr) {
        _this->_impl_.features_ = ::google::protobuf::Message::CopyConstruct(arena, *from._impl_.features_);
      } else {
        _this->_impl_.features_->MergeFrom(*from._impl_.features_);
      }
    }
    if (CheckHasBit(cached_has_bits, 0x00000002U)) {
      _this->_impl_.message_set_wire_format_ = from._impl_.message_set_wire_format_;
    }
    if (CheckHasBit(cached_has_bits, 0x00000004U)) {
      _this->_impl_.no_standard_descriptor_accessor_ = from._impl_.no_standard_descriptor_accessor_;
    }
    if (CheckHasBit(cached_has_bits, 0x00000008U)) {
      _this->_impl_.deprecated_ = from._impl_.deprecated_;
    }
    if (CheckHasBit(cached_has_bits, 0x00000010U)) {
      _this->_impl_.map_entry_ = from._impl_.map_entry_;
    }
    if (CheckHasBit(cached_has_bits, 0x00000020U)) {
      _this->_impl_.deprecated_legacy_json_field_conflicts_ = from._impl_.deprecated_legacy_json_field_conflicts_;
    }
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000040U)) {
      _this->_internal_mutable_uninterpreted_option()->InternalMergeFromWithArena(
          ::google::protobuf::MessageLite::internal_visibility(), arena,
          from._internal_uninterpreted_option());
    }
  }
  _this->_impl_._has_bits_[0] |= cached_has_bits;
  _this->_impl_._extensions_.MergeFrom(&default_instance(),
                                from._impl_._extensions_);
  _this->_internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(
      from._internal_metadata_);
}

void MessageOptions::CopyFrom(const MessageOptions& from) {
  // @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.MessageOptions)
  if (&from == this) return;
  Clear();
  MergeFrom(from);
}

PROTOBUF_NOINLINE bool MessageOptions::IsInitializedImpl(
    const MessageLite& msg) {
  auto& this_ = static_cast<const MessageOptions&>(msg);
  if (!this_._impl_._extensions_.IsInitialized(&default_instance())) {
    return false;
  }
  if (CheckHasBit(this_._impl_._has_bits_[0], 0x00000001U)) {
    if (!this_._impl_.features_->IsInitialized()) return false;
  }
  if (!::google::protobuf::internal::AllAreInitialized(this_._internal_uninterpreted_option()))
    return false;
  return true;
}

void MessageOptions::InternalSwap(MessageOptions* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) {
  using ::std::swap;
  _impl_._extensions_.InternalSwap(&other->_impl_._extensions_);
  _internal_metadata_.InternalSwap(&other->_internal_metadata_);
  swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]);
  ::google::protobuf::internal::memswap<
      PROTOBUF_FIELD_OFFSET(MessageOptions, _impl_.deprecated_legacy_json_field_conflicts_)
      + sizeof(MessageOptions::_impl_.deprecated_legacy_json_field_conflicts_)
      - PROTOBUF_FIELD_OFFSET(MessageOptions, _impl_.features_)>(
          reinterpret_cast<char*>(&_impl_.features_),
          reinterpret_cast<char*>(&other->_impl_.features_));
  _impl_.uninterpreted_option_.InternalSwap(&other->_impl_.uninterpreted_option_);
}

::google::protobuf::Metadata MessageOptions::GetMetadata() const {
  return ::google::protobuf::Message::GetMetadataImpl(GetClassData()->full());
}
// ===================================================================

class FieldOptions_EditionDefault::_Internal {
 public:
  using HasBits =
      decltype(::std::declval<FieldOptions_EditionDefault>()._impl_._has_bits_);
  static constexpr ::int32_t kHasBitsOffset =
      8 * PROTOBUF_FIELD_OFFSET(FieldOptions_EditionDefault, _impl_._has_bits_);
};

FieldOptions_EditionDefault::FieldOptions_EditionDefault(::google::protobuf::Arena* PROTOBUF_NULLABLE arena)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(arena, FieldOptions_EditionDefault_class_data_.base()) {
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(arena) {
#endif  // PROTOBUF_CUSTOM_VTABLE
  SharedCtor(arena);
  // @@protoc_insertion_point(arena_constructor:google.protobuf.FieldOptions.EditionDefault)
}
PROTOBUF_NDEBUG_INLINE FieldOptions_EditionDefault::Impl_::Impl_(
    [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility,
    [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from,
    [[maybe_unused]] const ::google::protobuf::FieldOptions_EditionDefault& from_msg)
      : _has_bits_{from._has_bits_},
        _cached_size_{0},
        value_(arena, from.value_) {}

FieldOptions_EditionDefault::FieldOptions_EditionDefault(
    ::google::protobuf::Arena* PROTOBUF_NULLABLE arena,
    const FieldOptions_EditionDefault& from)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(arena, FieldOptions_EditionDefault_class_data_.base()) {
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(arena) {
#endif  // PROTOBUF_CUSTOM_VTABLE
  FieldOptions_EditionDefault* const _this = this;
  (void)_this;
  _internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(
      from._internal_metadata_);
  new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from);
  _impl_.edition_ = from._impl_.edition_;

  // @@protoc_insertion_point(copy_constructor:google.protobuf.FieldOptions.EditionDefault)
}
PROTOBUF_NDEBUG_INLINE FieldOptions_EditionDefault::Impl_::Impl_(
    [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility,
    [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena)
      : _cached_size_{0},
        value_(arena) {}

inline void FieldOptions_EditionDefault::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) {
  new (&_impl_) Impl_(internal_visibility(), arena);
  _impl_.edition_ = {};
}
FieldOptions_EditionDefault::~FieldOptions_EditionDefault() {
  // @@protoc_insertion_point(destructor:google.protobuf.FieldOptions.EditionDefault)
  SharedDtor(*this);
}
inline void FieldOptions_EditionDefault::SharedDtor(MessageLite& self) {
  FieldOptions_EditionDefault& this_ = static_cast<FieldOptions_EditionDefault&>(self);
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    this_.CheckHasBitConsistency();
  }
  this_._internal_metadata_.Delete<::google::protobuf::UnknownFieldSet>();
  ABSL_DCHECK(this_.GetArena() == nullptr);
  this_._impl_.value_.Destroy();
  this_._impl_.~Impl_();
}

inline void* PROTOBUF_NONNULL FieldOptions_EditionDefault::PlacementNew_(
    const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem,
    ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) {
  return ::new (mem) FieldOptions_EditionDefault(arena);
}
constexpr auto FieldOptions_EditionDefault::InternalNewImpl_() {
  return ::google::protobuf::internal::MessageCreator::CopyInit(sizeof(FieldOptions_EditionDefault),
                                            alignof(FieldOptions_EditionDefault));
}
constexpr auto FieldOptions_EditionDefault::InternalGenerateClassData_() {
  return ::google::protobuf::internal::ClassDataFull{
      ::google::protobuf::internal::ClassData{
          &_FieldOptions_EditionDefault_default_instance_._instance,
          &_table_.header,
          nullptr,  // OnDemandRegisterArenaDtor
          nullptr,  // IsInitialized
          &FieldOptions_EditionDefault::MergeImpl,
          ::google::protobuf::Message::GetNewImpl<FieldOptions_EditionDefault>(),
#if defined(PROTOBUF_CUSTOM_VTABLE)
          &FieldOptions_EditionDefault::SharedDtor,
          ::google::protobuf::Message::GetClearImpl<FieldOptions_EditionDefault>(), &FieldOptions_EditionDefault::ByteSizeLong,
              &FieldOptions_EditionDefault::_InternalSerialize,
#endif  // PROTOBUF_CUSTOM_VTABLE
          PROTOBUF_FIELD_OFFSET(FieldOptions_EditionDefault, _impl_._cached_size_),
          false,
      },
      &FieldOptions_EditionDefault::kDescriptorMethods,
      &descriptor_table_google_2fprotobuf_2fdescriptor_2eproto,
      nullptr,  // tracker
  };
}

PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 const
    ::google::protobuf::internal::ClassDataFull FieldOptions_EditionDefault_class_data_ =
        FieldOptions_EditionDefault::InternalGenerateClassData_();

PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL
FieldOptions_EditionDefault::GetClassData() const {
  ::google::protobuf::internal::PrefetchToLocalCache(&FieldOptions_EditionDefault_class_data_);
  ::google::protobuf::internal::PrefetchToLocalCache(FieldOptions_EditionDefault_class_data_.tc_table);
  return FieldOptions_EditionDefault_class_data_.base();
}
constexpr ::_pbi::TcParseTable<1, 2, 1, 0, 2>
FieldOptions_EditionDefault::_table_ = {
  {
    PROTOBUF_FIELD_OFFSET(FieldOptions_EditionDefault, _impl_._has_bits_),
    0, // no _extensions_
    3, 8,  // max_field_number, fast_idx_mask
    offsetof(decltype(_table_), field_lookup_table),
    4294967289,  // skipmap
    offsetof(decltype(_table_), field_entries),
    2,  // num_field_entries
    1,  // num_aux_entries
    offsetof(decltype(_table_), aux_entries),
    FieldOptions_EditionDefault_class_data_.base(),
    nullptr,  // post_loop_handler
    ::_pbi::TcParser::GenericFallback,  // fallback
    #ifdef PROTOBUF_PREFETCH_PARSE_TABLE
    ::_pbi::TcParser::GetTable<::google::protobuf::FieldOptions_EditionDefault>(),  // to_prefetch
    #endif  // PROTOBUF_PREFETCH_PARSE_TABLE
  }, {{
    // optional string value = 2;
    {::_pbi::TcParser::FastBS1,
     {18, 0, 0,
      PROTOBUF_FIELD_OFFSET(FieldOptions_EditionDefault, _impl_.value_)}},
    // optional .google.protobuf.Edition edition = 3;
    {::_pbi::TcParser::FastEvS1,
     {24, 1, 0,
      PROTOBUF_FIELD_OFFSET(FieldOptions_EditionDefault, _impl_.edition_)}},
  }}, {{
    65535, 65535
  }}, {{
    // optional string value = 2;
    {PROTOBUF_FIELD_OFFSET(FieldOptions_EditionDefault, _impl_.value_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcOptional | ::_fl::kBytes | ::_fl::kRepAString)},
    // optional .google.protobuf.Edition edition = 3;
    {PROTOBUF_FIELD_OFFSET(FieldOptions_EditionDefault, _impl_.edition_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kEnum)},
  }},
  {{
      {::_pbi::FieldAuxEnumData{}, ::google::protobuf::Edition_internal_data_},
  }},
  {{
  }},
};
PROTOBUF_NOINLINE void FieldOptions_EditionDefault::Clear() {
// @@protoc_insertion_point(message_clear_start:google.protobuf.FieldOptions.EditionDefault)
  ::google::protobuf::internal::TSanWrite(&_impl_);
  ::uint32_t cached_has_bits = 0;
  // Prevent compiler warnings about cached_has_bits being unused
  (void) cached_has_bits;

  cached_has_bits = _impl_._has_bits_[0];
  if (CheckHasBit(cached_has_bits, 0x00000001U)) {
    _impl_.value_.ClearNonDefaultToEmpty();
  }
  _impl_.edition_ = 0;
  _impl_._has_bits_.Clear();
  _internal_metadata_.Clear<::google::protobuf::UnknownFieldSet>();
}

#if defined(PROTOBUF_CUSTOM_VTABLE)
::uint8_t* PROTOBUF_NONNULL FieldOptions_EditionDefault::_InternalSerialize(
    const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target,
    ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) {
  const FieldOptions_EditionDefault& this_ = static_cast<const FieldOptions_EditionDefault&>(base);
#else   // PROTOBUF_CUSTOM_VTABLE
::uint8_t* PROTOBUF_NONNULL FieldOptions_EditionDefault::_InternalSerialize(
    ::uint8_t* PROTOBUF_NONNULL target,
    ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const {
  const FieldOptions_EditionDefault& this_ = *this;
#endif  // PROTOBUF_CUSTOM_VTABLE
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    this_.CheckHasBitConsistency();
  }
  // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.FieldOptions.EditionDefault)
  ::uint32_t cached_has_bits = 0;
  (void)cached_has_bits;

  cached_has_bits = this_._impl_._has_bits_[0];
  // optional string value = 2;
  if (CheckHasBit(cached_has_bits, 0x00000001U)) {
    const ::std::string& _s = this_._internal_value();
    target = stream->WriteStringMaybeAliased(2, _s, target);
  }

  // optional .google.protobuf.Edition edition = 3;
  if (CheckHasBit(cached_has_bits, 0x00000002U)) {
    target = stream->EnsureSpace(target);
    target = ::_pbi::WireFormatLite::WriteEnumToArray(
        3, this_._internal_edition(), target);
  }

  if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) {
    target =
        ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray(
            this_._internal_metadata_.unknown_fields<::google::protobuf::UnknownFieldSet>(::google::protobuf::UnknownFieldSet::default_instance), target, stream);
  }
  // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.FieldOptions.EditionDefault)
  return target;
}

#if defined(PROTOBUF_CUSTOM_VTABLE)
::size_t FieldOptions_EditionDefault::ByteSizeLong(const MessageLite& base) {
  const FieldOptions_EditionDefault& this_ = static_cast<const FieldOptions_EditionDefault&>(base);
#else   // PROTOBUF_CUSTOM_VTABLE
::size_t FieldOptions_EditionDefault::ByteSizeLong() const {
  const FieldOptions_EditionDefault& this_ = *this;
#endif  // PROTOBUF_CUSTOM_VTABLE
  // @@protoc_insertion_point(message_byte_size_start:google.protobuf.FieldOptions.EditionDefault)
  ::size_t total_size = 0;

  ::uint32_t cached_has_bits = 0;
  // Prevent compiler warnings about cached_has_bits being unused
  (void)cached_has_bits;

  ::_pbi::Prefetch5LinesFrom7Lines(&this_);
  cached_has_bits = this_._impl_._has_bits_[0];
  if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) {
    // optional string value = 2;
    if (CheckHasBit(cached_has_bits, 0x00000001U)) {
      total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize(
                                      this_._internal_value());
    }
    // optional .google.protobuf.Edition edition = 3;
    if (CheckHasBit(cached_has_bits, 0x00000002U)) {
      total_size += 1 +
                    ::_pbi::WireFormatLite::EnumSize(this_._internal_edition());
    }
  }
  return this_.MaybeComputeUnknownFieldsSize(total_size,
                                             &this_._impl_._cached_size_);
}

void FieldOptions_EditionDefault::MergeImpl(::google::protobuf::MessageLite& to_msg,
                            const ::google::protobuf::MessageLite& from_msg) {
   auto* const _this =
      static_cast<FieldOptions_EditionDefault*>(&to_msg);
  auto& from = static_cast<const FieldOptions_EditionDefault&>(from_msg);
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    from.CheckHasBitConsistency();
  }
  // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.FieldOptions.EditionDefault)
  ABSL_DCHECK_NE(&from, _this);
  ::uint32_t cached_has_bits = 0;
  (void)cached_has_bits;

  cached_has_bits = from._impl_._has_bits_[0];
  if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) {
    if (CheckHasBit(cached_has_bits, 0x00000001U)) {
      _this->_internal_set_value(from._internal_value());
    }
    if (CheckHasBit(cached_has_bits, 0x00000002U)) {
      _this->_impl_.edition_ = from._impl_.edition_;
    }
  }
  _this->_impl_._has_bits_[0] |= cached_has_bits;
  _this->_internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(
      from._internal_metadata_);
}

void FieldOptions_EditionDefault::CopyFrom(const FieldOptions_EditionDefault& from) {
  // @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.FieldOptions.EditionDefault)
  if (&from == this) return;
  Clear();
  MergeFrom(from);
}


void FieldOptions_EditionDefault::InternalSwap(FieldOptions_EditionDefault* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) {
  using ::std::swap;
  auto* arena = GetArena();
  ABSL_DCHECK_EQ(arena, other->GetArena());
  _internal_metadata_.InternalSwap(&other->_internal_metadata_);
  swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]);
  ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.value_, &other->_impl_.value_, arena);
  swap(_impl_.edition_, other->_impl_.edition_);
}

::google::protobuf::Metadata FieldOptions_EditionDefault::GetMetadata() const {
  return ::google::protobuf::Message::GetMetadataImpl(GetClassData()->full());
}
// ===================================================================

class FieldOptions_FeatureSupport::_Internal {
 public:
  using HasBits =
      decltype(::std::declval<FieldOptions_FeatureSupport>()._impl_._has_bits_);
  static constexpr ::int32_t kHasBitsOffset =
      8 * PROTOBUF_FIELD_OFFSET(FieldOptions_FeatureSupport, _impl_._has_bits_);
};

FieldOptions_FeatureSupport::FieldOptions_FeatureSupport(::google::protobuf::Arena* PROTOBUF_NULLABLE arena)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(arena, FieldOptions_FeatureSupport_class_data_.base()) {
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(arena) {
#endif  // PROTOBUF_CUSTOM_VTABLE
  SharedCtor(arena);
  // @@protoc_insertion_point(arena_constructor:google.protobuf.FieldOptions.FeatureSupport)
}
PROTOBUF_NDEBUG_INLINE FieldOptions_FeatureSupport::Impl_::Impl_(
    [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility,
    [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from,
    [[maybe_unused]] const ::google::protobuf::FieldOptions_FeatureSupport& from_msg)
      : _has_bits_{from._has_bits_},
        _cached_size_{0},
        deprecation_warning_(arena, from.deprecation_warning_) {}

FieldOptions_FeatureSupport::FieldOptions_FeatureSupport(
    ::google::protobuf::Arena* PROTOBUF_NULLABLE arena,
    const FieldOptions_FeatureSupport& from)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(arena, FieldOptions_FeatureSupport_class_data_.base()) {
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(arena) {
#endif  // PROTOBUF_CUSTOM_VTABLE
  FieldOptions_FeatureSupport* const _this = this;
  (void)_this;
  _internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(
      from._internal_metadata_);
  new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from);
  ::memcpy(reinterpret_cast<char*>(&_impl_) +
               offsetof(Impl_, edition_introduced_),
           reinterpret_cast<const char*>(&from._impl_) +
               offsetof(Impl_, edition_introduced_),
           offsetof(Impl_, edition_removed_) -
               offsetof(Impl_, edition_introduced_) +
               sizeof(Impl_::edition_removed_));

  // @@protoc_insertion_point(copy_constructor:google.protobuf.FieldOptions.FeatureSupport)
}
PROTOBUF_NDEBUG_INLINE FieldOptions_FeatureSupport::Impl_::Impl_(
    [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility,
    [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena)
      : _cached_size_{0},
        deprecation_warning_(arena) {}

inline void FieldOptions_FeatureSupport::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) {
  new (&_impl_) Impl_(internal_visibility(), arena);
  ::memset(reinterpret_cast<char*>(&_impl_) +
               offsetof(Impl_, edition_introduced_),
           0,
           offsetof(Impl_, edition_removed_) -
               offsetof(Impl_, edition_introduced_) +
               sizeof(Impl_::edition_removed_));
}
FieldOptions_FeatureSupport::~FieldOptions_FeatureSupport() {
  // @@protoc_insertion_point(destructor:google.protobuf.FieldOptions.FeatureSupport)
  SharedDtor(*this);
}
inline void FieldOptions_FeatureSupport::SharedDtor(MessageLite& self) {
  FieldOptions_FeatureSupport& this_ = static_cast<FieldOptions_FeatureSupport&>(self);
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    this_.CheckHasBitConsistency();
  }
  this_._internal_metadata_.Delete<::google::protobuf::UnknownFieldSet>();
  ABSL_DCHECK(this_.GetArena() == nullptr);
  this_._impl_.deprecation_warning_.Destroy();
  this_._impl_.~Impl_();
}

inline void* PROTOBUF_NONNULL FieldOptions_FeatureSupport::PlacementNew_(
    const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem,
    ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) {
  return ::new (mem) FieldOptions_FeatureSupport(arena);
}
constexpr auto FieldOptions_FeatureSupport::InternalNewImpl_() {
  return ::google::protobuf::internal::MessageCreator::CopyInit(sizeof(FieldOptions_FeatureSupport),
                                            alignof(FieldOptions_FeatureSupport));
}
constexpr auto FieldOptions_FeatureSupport::InternalGenerateClassData_() {
  return ::google::protobuf::internal::ClassDataFull{
      ::google::protobuf::internal::ClassData{
          &_FieldOptions_FeatureSupport_default_instance_._instance,
          &_table_.header,
          nullptr,  // OnDemandRegisterArenaDtor
          nullptr,  // IsInitialized
          &FieldOptions_FeatureSupport::MergeImpl,
          ::google::protobuf::Message::GetNewImpl<FieldOptions_FeatureSupport>(),
#if defined(PROTOBUF_CUSTOM_VTABLE)
          &FieldOptions_FeatureSupport::SharedDtor,
          ::google::protobuf::Message::GetClearImpl<FieldOptions_FeatureSupport>(), &FieldOptions_FeatureSupport::ByteSizeLong,
              &FieldOptions_FeatureSupport::_InternalSerialize,
#endif  // PROTOBUF_CUSTOM_VTABLE
          PROTOBUF_FIELD_OFFSET(FieldOptions_FeatureSupport, _impl_._cached_size_),
          false,
      },
      &FieldOptions_FeatureSupport::kDescriptorMethods,
      &descriptor_table_google_2fprotobuf_2fdescriptor_2eproto,
      nullptr,  // tracker
  };
}

PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 const
    ::google::protobuf::internal::ClassDataFull FieldOptions_FeatureSupport_class_data_ =
        FieldOptions_FeatureSupport::InternalGenerateClassData_();

PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL
FieldOptions_FeatureSupport::GetClassData() const {
  ::google::protobuf::internal::PrefetchToLocalCache(&FieldOptions_FeatureSupport_class_data_);
  ::google::protobuf::internal::PrefetchToLocalCache(FieldOptions_FeatureSupport_class_data_.tc_table);
  return FieldOptions_FeatureSupport_class_data_.base();
}
constexpr ::_pbi::TcParseTable<2, 4, 3, 0, 2>
FieldOptions_FeatureSupport::_table_ = {
  {
    PROTOBUF_FIELD_OFFSET(FieldOptions_FeatureSupport, _impl_._has_bits_),
    0, // no _extensions_
    4, 24,  // max_field_number, fast_idx_mask
    offsetof(decltype(_table_), field_lookup_table),
    4294967280,  // skipmap
    offsetof(decltype(_table_), field_entries),
    4,  // num_field_entries
    3,  // num_aux_entries
    offsetof(decltype(_table_), aux_entries),
    FieldOptions_FeatureSupport_class_data_.base(),
    nullptr,  // post_loop_handler
    ::_pbi::TcParser::GenericFallback,  // fallback
    #ifdef PROTOBUF_PREFETCH_PARSE_TABLE
    ::_pbi::TcParser::GetTable<::google::protobuf::FieldOptions_FeatureSupport>(),  // to_prefetch
    #endif  // PROTOBUF_PREFETCH_PARSE_TABLE
  }, {{
    // optional .google.protobuf.Edition edition_removed = 4;
    {::_pbi::TcParser::FastEvS1,
     {32, 3, 2,
      PROTOBUF_FIELD_OFFSET(FieldOptions_FeatureSupport, _impl_.edition_removed_)}},
    // optional .google.protobuf.Edition edition_introduced = 1;
    {::_pbi::TcParser::FastEvS1,
     {8, 1, 0,
      PROTOBUF_FIELD_OFFSET(FieldOptions_FeatureSupport, _impl_.edition_introduced_)}},
    // optional .google.protobuf.Edition edition_deprecated = 2;
    {::_pbi::TcParser::FastEvS1,
     {16, 2, 1,
      PROTOBUF_FIELD_OFFSET(FieldOptions_FeatureSupport, _impl_.edition_deprecated_)}},
    // optional string deprecation_warning = 3;
    {::_pbi::TcParser::FastBS1,
     {26, 0, 0,
      PROTOBUF_FIELD_OFFSET(FieldOptions_FeatureSupport, _impl_.deprecation_warning_)}},
  }}, {{
    65535, 65535
  }}, {{
    // optional .google.protobuf.Edition edition_introduced = 1;
    {PROTOBUF_FIELD_OFFSET(FieldOptions_FeatureSupport, _impl_.edition_introduced_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kEnum)},
    // optional .google.protobuf.Edition edition_deprecated = 2;
    {PROTOBUF_FIELD_OFFSET(FieldOptions_FeatureSupport, _impl_.edition_deprecated_), _Internal::kHasBitsOffset + 2, 1, (0 | ::_fl::kFcOptional | ::_fl::kEnum)},
    // optional string deprecation_warning = 3;
    {PROTOBUF_FIELD_OFFSET(FieldOptions_FeatureSupport, _impl_.deprecation_warning_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcOptional | ::_fl::kBytes | ::_fl::kRepAString)},
    // optional .google.protobuf.Edition edition_removed = 4;
    {PROTOBUF_FIELD_OFFSET(FieldOptions_FeatureSupport, _impl_.edition_removed_), _Internal::kHasBitsOffset + 3, 2, (0 | ::_fl::kFcOptional | ::_fl::kEnum)},
  }},
  {{
      {::_pbi::FieldAuxEnumData{}, ::google::protobuf::Edition_internal_data_},
      {::_pbi::FieldAuxEnumData{}, ::google::protobuf::Edition_internal_data_},
      {::_pbi::FieldAuxEnumData{}, ::google::protobuf::Edition_internal_data_},
  }},
  {{
  }},
};
PROTOBUF_NOINLINE void FieldOptions_FeatureSupport::Clear() {
// @@protoc_insertion_point(message_clear_start:google.protobuf.FieldOptions.FeatureSupport)
  ::google::protobuf::internal::TSanWrite(&_impl_);
  ::uint32_t cached_has_bits = 0;
  // Prevent compiler warnings about cached_has_bits being unused
  (void) cached_has_bits;

  cached_has_bits = _impl_._has_bits_[0];
  if (CheckHasBit(cached_has_bits, 0x00000001U)) {
    _impl_.deprecation_warning_.ClearNonDefaultToEmpty();
  }
  if (BatchCheckHasBit(cached_has_bits, 0x0000000eU)) {
    ::memset(&_impl_.edition_introduced_, 0, static_cast<::size_t>(
        reinterpret_cast<char*>(&_impl_.edition_removed_) -
        reinterpret_cast<char*>(&_impl_.edition_introduced_)) + sizeof(_impl_.edition_removed_));
  }
  _impl_._has_bits_.Clear();
  _internal_metadata_.Clear<::google::protobuf::UnknownFieldSet>();
}

#if defined(PROTOBUF_CUSTOM_VTABLE)
::uint8_t* PROTOBUF_NONNULL FieldOptions_FeatureSupport::_InternalSerialize(
    const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target,
    ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) {
  const FieldOptions_FeatureSupport& this_ = static_cast<const FieldOptions_FeatureSupport&>(base);
#else   // PROTOBUF_CUSTOM_VTABLE
::uint8_t* PROTOBUF_NONNULL FieldOptions_FeatureSupport::_InternalSerialize(
    ::uint8_t* PROTOBUF_NONNULL target,
    ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const {
  const FieldOptions_FeatureSupport& this_ = *this;
#endif  // PROTOBUF_CUSTOM_VTABLE
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    this_.CheckHasBitConsistency();
  }
  // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.FieldOptions.FeatureSupport)
  ::uint32_t cached_has_bits = 0;
  (void)cached_has_bits;

  cached_has_bits = this_._impl_._has_bits_[0];
  // optional .google.protobuf.Edition edition_introduced = 1;
  if (CheckHasBit(cached_has_bits, 0x00000002U)) {
    target = stream->EnsureSpace(target);
    target = ::_pbi::WireFormatLite::WriteEnumToArray(
        1, this_._internal_edition_introduced(), target);
  }

  // optional .google.protobuf.Edition edition_deprecated = 2;
  if (CheckHasBit(cached_has_bits, 0x00000004U)) {
    target = stream->EnsureSpace(target);
    target = ::_pbi::WireFormatLite::WriteEnumToArray(
        2, this_._internal_edition_deprecated(), target);
  }

  // optional string deprecation_warning = 3;
  if (CheckHasBit(cached_has_bits, 0x00000001U)) {
    const ::std::string& _s = this_._internal_deprecation_warning();
    target = stream->WriteStringMaybeAliased(3, _s, target);
  }

  // optional .google.protobuf.Edition edition_removed = 4;
  if (CheckHasBit(cached_has_bits, 0x00000008U)) {
    target = stream->EnsureSpace(target);
    target = ::_pbi::WireFormatLite::WriteEnumToArray(
        4, this_._internal_edition_removed(), target);
  }

  if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) {
    target =
        ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray(
            this_._internal_metadata_.unknown_fields<::google::protobuf::UnknownFieldSet>(::google::protobuf::UnknownFieldSet::default_instance), target, stream);
  }
  // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.FieldOptions.FeatureSupport)
  return target;
}

#if defined(PROTOBUF_CUSTOM_VTABLE)
::size_t FieldOptions_FeatureSupport::ByteSizeLong(const MessageLite& base) {
  const FieldOptions_FeatureSupport& this_ = static_cast<const FieldOptions_FeatureSupport&>(base);
#else   // PROTOBUF_CUSTOM_VTABLE
::size_t FieldOptions_FeatureSupport::ByteSizeLong() const {
  const FieldOptions_FeatureSupport& this_ = *this;
#endif  // PROTOBUF_CUSTOM_VTABLE
  // @@protoc_insertion_point(message_byte_size_start:google.protobuf.FieldOptions.FeatureSupport)
  ::size_t total_size = 0;

  ::uint32_t cached_has_bits = 0;
  // Prevent compiler warnings about cached_has_bits being unused
  (void)cached_has_bits;

  ::_pbi::Prefetch5LinesFrom7Lines(&this_);
  cached_has_bits = this_._impl_._has_bits_[0];
  if (BatchCheckHasBit(cached_has_bits, 0x0000000fU)) {
    // optional string deprecation_warning = 3;
    if (CheckHasBit(cached_has_bits, 0x00000001U)) {
      total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize(
                                      this_._internal_deprecation_warning());
    }
    // optional .google.protobuf.Edition edition_introduced = 1;
    if (CheckHasBit(cached_has_bits, 0x00000002U)) {
      total_size += 1 +
                    ::_pbi::WireFormatLite::EnumSize(this_._internal_edition_introduced());
    }
    // optional .google.protobuf.Edition edition_deprecated = 2;
    if (CheckHasBit(cached_has_bits, 0x00000004U)) {
      total_size += 1 +
                    ::_pbi::WireFormatLite::EnumSize(this_._internal_edition_deprecated());
    }
    // optional .google.protobuf.Edition edition_removed = 4;
    if (CheckHasBit(cached_has_bits, 0x00000008U)) {
      total_size += 1 +
                    ::_pbi::WireFormatLite::EnumSize(this_._internal_edition_removed());
    }
  }
  return this_.MaybeComputeUnknownFieldsSize(total_size,
                                             &this_._impl_._cached_size_);
}

void FieldOptions_FeatureSupport::MergeImpl(::google::protobuf::MessageLite& to_msg,
                            const ::google::protobuf::MessageLite& from_msg) {
   auto* const _this =
      static_cast<FieldOptions_FeatureSupport*>(&to_msg);
  auto& from = static_cast<const FieldOptions_FeatureSupport&>(from_msg);
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    from.CheckHasBitConsistency();
  }
  // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.FieldOptions.FeatureSupport)
  ABSL_DCHECK_NE(&from, _this);
  ::uint32_t cached_has_bits = 0;
  (void)cached_has_bits;

  cached_has_bits = from._impl_._has_bits_[0];
  if (BatchCheckHasBit(cached_has_bits, 0x0000000fU)) {
    if (CheckHasBit(cached_has_bits, 0x00000001U)) {
      _this->_internal_set_deprecation_warning(from._internal_deprecation_warning());
    }
    if (CheckHasBit(cached_has_bits, 0x00000002U)) {
      _this->_impl_.edition_introduced_ = from._impl_.edition_introduced_;
    }
    if (CheckHasBit(cached_has_bits, 0x00000004U)) {
      _this->_impl_.edition_deprecated_ = from._impl_.edition_deprecated_;
    }
    if (CheckHasBit(cached_has_bits, 0x00000008U)) {
      _this->_impl_.edition_removed_ = from._impl_.edition_removed_;
    }
  }
  _this->_impl_._has_bits_[0] |= cached_has_bits;
  _this->_internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(
      from._internal_metadata_);
}

void FieldOptions_FeatureSupport::CopyFrom(const FieldOptions_FeatureSupport& from) {
  // @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.FieldOptions.FeatureSupport)
  if (&from == this) return;
  Clear();
  MergeFrom(from);
}


void FieldOptions_FeatureSupport::InternalSwap(FieldOptions_FeatureSupport* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) {
  using ::std::swap;
  auto* arena = GetArena();
  ABSL_DCHECK_EQ(arena, other->GetArena());
  _internal_metadata_.InternalSwap(&other->_internal_metadata_);
  swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]);
  ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.deprecation_warning_, &other->_impl_.deprecation_warning_, arena);
  ::google::protobuf::internal::memswap<
      PROTOBUF_FIELD_OFFSET(FieldOptions_FeatureSupport, _impl_.edition_removed_)
      + sizeof(FieldOptions_FeatureSupport::_impl_.edition_removed_)
      - PROTOBUF_FIELD_OFFSET(FieldOptions_FeatureSupport, _impl_.edition_introduced_)>(
          reinterpret_cast<char*>(&_impl_.edition_introduced_),
          reinterpret_cast<char*>(&other->_impl_.edition_introduced_));
}

::google::protobuf::Metadata FieldOptions_FeatureSupport::GetMetadata() const {
  return ::google::protobuf::Message::GetMetadataImpl(GetClassData()->full());
}
// ===================================================================

class FieldOptions::_Internal {
 public:
  using HasBits =
      decltype(::std::declval<FieldOptions>()._impl_._has_bits_);
  static constexpr ::int32_t kHasBitsOffset =
      8 * PROTOBUF_FIELD_OFFSET(FieldOptions, _impl_._has_bits_);
};

FieldOptions::FieldOptions(::google::protobuf::Arena* PROTOBUF_NULLABLE arena)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(arena, FieldOptions_class_data_.base()) {
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(arena) {
#endif  // PROTOBUF_CUSTOM_VTABLE
  SharedCtor(arena);
  // @@protoc_insertion_point(arena_constructor:google.protobuf.FieldOptions)
}
PROTOBUF_NDEBUG_INLINE FieldOptions::Impl_::Impl_(
    [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility,
    [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from,
    [[maybe_unused]] const ::google::protobuf::FieldOptions& from_msg)
      : _extensions_{visibility, arena},
        _has_bits_{from._has_bits_},
        _cached_size_{0},
        edition_defaults_{visibility, arena, from.edition_defaults_},
        uninterpreted_option_{visibility, arena, from.uninterpreted_option_},
        targets_{visibility, arena, from.targets_} {}

FieldOptions::FieldOptions(
    ::google::protobuf::Arena* PROTOBUF_NULLABLE arena,
    const FieldOptions& from)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(arena, FieldOptions_class_data_.base()) {
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(arena) {
#endif  // PROTOBUF_CUSTOM_VTABLE
  FieldOptions* const _this = this;
  (void)_this;
  _internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(
      from._internal_metadata_);
  new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from);
  _impl_._extensions_.MergeFrom(this, from._impl_._extensions_);
  ::uint32_t cached_has_bits = _impl_._has_bits_[0];
  _impl_.features_ = (CheckHasBit(cached_has_bits, 0x00000004U))
                ? ::google::protobuf::Message::CopyConstruct(arena, *from._impl_.features_)
                : nullptr;
  _impl_.feature_support_ = (CheckHasBit(cached_has_bits, 0x00000008U))
                ? ::google::protobuf::Message::CopyConstruct(arena, *from._impl_.feature_support_)
                : nullptr;
  ::memcpy(reinterpret_cast<char*>(&_impl_) +
               offsetof(Impl_, ctype_),
           reinterpret_cast<const char*>(&from._impl_) +
               offsetof(Impl_, ctype_),
           offsetof(Impl_, retention_) -
               offsetof(Impl_, ctype_) +
               sizeof(Impl_::retention_));

  // @@protoc_insertion_point(copy_constructor:google.protobuf.FieldOptions)
}
PROTOBUF_NDEBUG_INLINE FieldOptions::Impl_::Impl_(
    [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility,
    [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena)
      : _extensions_{visibility, arena},
        _cached_size_{0},
        edition_defaults_{visibility, arena},
        uninterpreted_option_{visibility, arena},
        targets_{visibility, arena} {}

inline void FieldOptions::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) {
  new (&_impl_) Impl_(internal_visibility(), arena);
  ::memset(reinterpret_cast<char*>(&_impl_) +
               offsetof(Impl_, features_),
           0,
           offsetof(Impl_, retention_) -
               offsetof(Impl_, features_) +
               sizeof(Impl_::retention_));
}
FieldOptions::~FieldOptions() {
  // @@protoc_insertion_point(destructor:google.protobuf.FieldOptions)
  SharedDtor(*this);
}
inline void FieldOptions::SharedDtor(MessageLite& self) {
  FieldOptions& this_ = static_cast<FieldOptions&>(self);
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    this_.CheckHasBitConsistency();
  }
  this_._internal_metadata_.Delete<::google::protobuf::UnknownFieldSet>();
  ABSL_DCHECK(this_.GetArena() == nullptr);
  delete this_._impl_.features_;
  delete this_._impl_.feature_support_;
  this_._impl_.~Impl_();
}

inline void* PROTOBUF_NONNULL FieldOptions::PlacementNew_(
    const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem,
    ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) {
  return ::new (mem) FieldOptions(arena);
}
constexpr auto FieldOptions::InternalNewImpl_() {
  constexpr auto arena_bits = ::google::protobuf::internal::EncodePlacementArenaOffsets({
      PROTOBUF_FIELD_OFFSET(FieldOptions, _impl_._extensions_) +
          decltype(FieldOptions::_impl_._extensions_)::InternalGetArenaOffset(
              ::google::protobuf::Message::internal_visibility()),
      PROTOBUF_FIELD_OFFSET(FieldOptions, _impl_.targets_) +
          decltype(FieldOptions::_impl_.targets_)::
              InternalGetArenaOffset(
                  ::google::protobuf::Message::internal_visibility()),
      PROTOBUF_FIELD_OFFSET(FieldOptions, _impl_.edition_defaults_) +
          decltype(FieldOptions::_impl_.edition_defaults_)::
              InternalGetArenaOffset(
                  ::google::protobuf::Message::internal_visibility()),
      PROTOBUF_FIELD_OFFSET(FieldOptions, _impl_.uninterpreted_option_) +
          decltype(FieldOptions::_impl_.uninterpreted_option_)::
              InternalGetArenaOffset(
                  ::google::protobuf::Message::internal_visibility()),
  });
  if (arena_bits.has_value()) {
    return ::google::protobuf::internal::MessageCreator::ZeroInit(
        sizeof(FieldOptions), alignof(FieldOptions), *arena_bits);
  } else {
    return ::google::protobuf::internal::MessageCreator(&FieldOptions::PlacementNew_,
                                 sizeof(FieldOptions),
                                 alignof(FieldOptions));
  }
}
constexpr auto FieldOptions::InternalGenerateClassData_() {
  return ::google::protobuf::internal::ClassDataFull{
      ::google::protobuf::internal::ClassData{
          &_FieldOptions_default_instance_._instance,
          &_table_.header,
          nullptr,  // OnDemandRegisterArenaDtor
          FieldOptions::IsInitializedImpl,
          &FieldOptions::MergeImpl,
          ::google::protobuf::Message::GetNewImpl<FieldOptions>(),
#if defined(PROTOBUF_CUSTOM_VTABLE)
          &FieldOptions::SharedDtor,
          ::google::protobuf::Message::GetClearImpl<FieldOptions>(), &FieldOptions::ByteSizeLong,
              &FieldOptions::_InternalSerialize,
#endif  // PROTOBUF_CUSTOM_VTABLE
          PROTOBUF_FIELD_OFFSET(FieldOptions, _impl_._cached_size_),
          false,
      },
      &FieldOptions::kDescriptorMethods,
      &descriptor_table_google_2fprotobuf_2fdescriptor_2eproto,
      nullptr,  // tracker
  };
}

PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 const
    ::google::protobuf::internal::ClassDataFull FieldOptions_class_data_ =
        FieldOptions::InternalGenerateClassData_();

PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL
FieldOptions::GetClassData() const {
  ::google::protobuf::internal::PrefetchToLocalCache(&FieldOptions_class_data_);
  ::google::protobuf::internal::PrefetchToLocalCache(FieldOptions_class_data_.tc_table);
  return FieldOptions_class_data_.base();
}
constexpr ::_pbi::TcParseTable<4, 14, 8, 0, 7>
FieldOptions::_table_ = {
  {
    PROTOBUF_FIELD_OFFSET(FieldOptions, _impl_._has_bits_),
    PROTOBUF_FIELD_OFFSET(FieldOptions, _impl_._extensions_),
    999, 120,  // max_field_number, fast_idx_mask
    offsetof(decltype(_table_), field_lookup_table),
    4290919880,  // skipmap
    offsetof(decltype(_table_), field_entries),
    14,  // num_field_entries
    8,  // num_aux_entries
    offsetof(decltype(_table_), aux_entries),
    FieldOptions_class_data_.base(),
    nullptr,  // post_loop_handler
    ::_pbi::TcParser::GenericFallback,  // fallback
    #ifdef PROTOBUF_PREFETCH_PARSE_TABLE
    ::_pbi::TcParser::GetTable<::google::protobuf::FieldOptions>(),  // to_prefetch
    #endif  // PROTOBUF_PREFETCH_PARSE_TABLE
  }, {{
    // optional bool debug_redact = 16 [default = false];
    {::_pbi::TcParser::FastV8S2,
     {384, 11, 0,
      PROTOBUF_FIELD_OFFSET(FieldOptions, _impl_.debug_redact_)}},
    // optional .google.protobuf.FieldOptions.CType ctype = 1 [default = STRING];
    {::_pbi::TcParser::FastEr0S1,
     {8, 4, 2,
      PROTOBUF_FIELD_OFFSET(FieldOptions, _impl_.ctype_)}},
    // optional bool packed = 2;
    {::_pbi::TcParser::SingularVarintNoZag1<bool, offsetof(FieldOptions, _impl_.packed_), 5>(),
     {16, 5, 0,
      PROTOBUF_FIELD_OFFSET(FieldOptions, _impl_.packed_)}},
    // optional bool deprecated = 3 [default = false];
    {::_pbi::TcParser::SingularVarintNoZag1<bool, offsetof(FieldOptions, _impl_.deprecated_), 6>(),
     {24, 6, 0,
      PROTOBUF_FIELD_OFFSET(FieldOptions, _impl_.deprecated_)}},
    // repeated .google.protobuf.FieldOptions.EditionDefault edition_defaults = 20;
    {::_pbi::TcParser::FastMtR2,
     {418, 0, 0,
      PROTOBUF_FIELD_OFFSET(FieldOptions, _impl_.edition_defaults_)}},
    // optional bool lazy = 5 [default = false];
    {::_pbi::TcParser::SingularVarintNoZag1<bool, offsetof(FieldOptions, _impl_.lazy_), 7>(),
     {40, 7, 0,
      PROTOBUF_FIELD_OFFSET(FieldOptions, _impl_.lazy_)}},
    // optional .google.protobuf.FieldOptions.JSType jstype = 6 [default = JS_NORMAL];
    {::_pbi::TcParser::FastEr0S1,
     {48, 9, 2,
      PROTOBUF_FIELD_OFFSET(FieldOptions, _impl_.jstype_)}},
    // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
    {::_pbi::TcParser::FastMtR2,
     {16058, 1, 3,
      PROTOBUF_FIELD_OFFSET(FieldOptions, _impl_.uninterpreted_option_)}},
    {::_pbi::TcParser::MiniParse, {}},
    {::_pbi::TcParser::MiniParse, {}},
    // optional bool weak = 10 [default = false, deprecated = true];
    {::_pbi::TcParser::SingularVarintNoZag1<bool, offsetof(FieldOptions, _impl_.weak_), 8>(),
     {80, 8, 0,
      PROTOBUF_FIELD_OFFSET(FieldOptions, _impl_.weak_)}},
    {::_pbi::TcParser::MiniParse, {}},
    {::_pbi::TcParser::MiniParse, {}},
    {::_pbi::TcParser::MiniParse, {}},
    {::_pbi::TcParser::MiniParse, {}},
    // optional bool unverified_lazy = 15 [default = false];
    {::_pbi::TcParser::SingularVarintNoZag1<bool, offsetof(FieldOptions, _impl_.unverified_lazy_), 10>(),
     {120, 10, 0,
      PROTOBUF_FIELD_OFFSET(FieldOptions, _impl_.unverified_lazy_)}},
  }}, {{
    999, 0, 1,
    65534, 13,
    65535, 65535
  }}, {{
    // optional .google.protobuf.FieldOptions.CType ctype = 1 [default = STRING];
    {PROTOBUF_FIELD_OFFSET(FieldOptions, _impl_.ctype_), _Internal::kHasBitsOffset + 4, 4, (0 | ::_fl::kFcOptional | ::_fl::kEnumRange)},
    // optional bool packed = 2;
    {PROTOBUF_FIELD_OFFSET(FieldOptions, _impl_.packed_), _Internal::kHasBitsOffset + 5, 0, (0 | ::_fl::kFcOptional | ::_fl::kBool)},
    // optional bool deprecated = 3 [default = false];
    {PROTOBUF_FIELD_OFFSET(FieldOptions, _impl_.deprecated_), _Internal::kHasBitsOffset + 6, 0, (0 | ::_fl::kFcOptional | ::_fl::kBool)},
    // optional bool lazy = 5 [default = false];
    {PROTOBUF_FIELD_OFFSET(FieldOptions, _impl_.lazy_), _Internal::kHasBitsOffset + 7, 0, (0 | ::_fl::kFcOptional | ::_fl::kBool)},
    // optional .google.protobuf.FieldOptions.JSType jstype = 6 [default = JS_NORMAL];
    {PROTOBUF_FIELD_OFFSET(FieldOptions, _impl_.jstype_), _Internal::kHasBitsOffset + 9, 5, (0 | ::_fl::kFcOptional | ::_fl::kEnumRange)},
    // optional bool weak = 10 [default = false, deprecated = true];
    {PROTOBUF_FIELD_OFFSET(FieldOptions, _impl_.weak_), _Internal::kHasBitsOffset + 8, 0, (0 | ::_fl::kFcOptional | ::_fl::kBool)},
    // optional bool unverified_lazy = 15 [default = false];
    {PROTOBUF_FIELD_OFFSET(FieldOptions, _impl_.unverified_lazy_), _Internal::kHasBitsOffset + 10, 0, (0 | ::_fl::kFcOptional | ::_fl::kBool)},
    // optional bool debug_redact = 16 [default = false];
    {PROTOBUF_FIELD_OFFSET(FieldOptions, _impl_.debug_redact_), _Internal::kHasBitsOffset + 11, 0, (0 | ::_fl::kFcOptional | ::_fl::kBool)},
    // optional .google.protobuf.FieldOptions.OptionRetention retention = 17;
    {PROTOBUF_FIELD_OFFSET(FieldOptions, _impl_.retention_), _Internal::kHasBitsOffset + 12, 6, (0 | ::_fl::kFcOptional | ::_fl::kEnumRange)},
    // repeated .google.protobuf.FieldOptions.OptionTargetType targets = 19;
    {PROTOBUF_FIELD_OFFSET(FieldOptions, _impl_.targets_), _Internal::kHasBitsOffset + 13, 7, (0 | ::_fl::kFcRepeated | ::_fl::kEnumRange)},
    // repeated .google.protobuf.FieldOptions.EditionDefault edition_defaults = 20;
    {PROTOBUF_FIELD_OFFSET(FieldOptions, _impl_.edition_defaults_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)},
    // optional .google.protobuf.FeatureSet features = 21;
    {PROTOBUF_FIELD_OFFSET(FieldOptions, _impl_.features_), _Internal::kHasBitsOffset + 2, 1, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)},
    // optional .google.protobuf.FieldOptions.FeatureSupport feature_support = 22;
    {PROTOBUF_FIELD_OFFSET(FieldOptions, _impl_.feature_support_), _Internal::kHasBitsOffset + 3, 2, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)},
    // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
    {PROTOBUF_FIELD_OFFSET(FieldOptions, _impl_.uninterpreted_option_), _Internal::kHasBitsOffset + 1, 3, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)},
  }},
  {{
      {::_pbi::TcParser::GetTable<::google::protobuf::FieldOptions_EditionDefault>()},
      {::_pbi::TcParser::GetTable<::google::protobuf::FeatureSet>()},
      {::_pbi::TcParser::GetTable<::google::protobuf::FieldOptions_FeatureSupport>()},
      {::_pbi::TcParser::GetTable<::google::protobuf::UninterpretedOption>()},
      {0, 2},
      {0, 2},
      {0, 2},
      {0, 9},
  }},
  {{
  }},
};
PROTOBUF_NOINLINE void FieldOptions::Clear() {
// @@protoc_insertion_point(message_clear_start:google.protobuf.FieldOptions)
  ::google::protobuf::internal::TSanWrite(&_impl_);
  ::uint32_t cached_has_bits = 0;
  // Prevent compiler warnings about cached_has_bits being unused
  (void) cached_has_bits;

  _impl_._extensions_.Clear();
  cached_has_bits = _impl_._has_bits_[0];
  if (BatchCheckHasBit(cached_has_bits, 0x0000000fU)) {
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) {
      _impl_.edition_defaults_.Clear();
    }
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000002U)) {
      _impl_.uninterpreted_option_.Clear();
    }
    if (CheckHasBit(cached_has_bits, 0x00000004U)) {
      ABSL_DCHECK(_impl_.features_ != nullptr);
      _impl_.features_->Clear();
    }
    if (CheckHasBit(cached_has_bits, 0x00000008U)) {
      ABSL_DCHECK(_impl_.feature_support_ != nullptr);
      _impl_.feature_support_->Clear();
    }
  }
  if (BatchCheckHasBit(cached_has_bits, 0x000000f0U)) {
    ::memset(&_impl_.ctype_, 0, static_cast<::size_t>(
        reinterpret_cast<char*>(&_impl_.lazy_) -
        reinterpret_cast<char*>(&_impl_.ctype_)) + sizeof(_impl_.lazy_));
  }
  if (BatchCheckHasBit(cached_has_bits, 0x00003f00U)) {
    ::memset(&_impl_.weak_, 0, static_cast<::size_t>(
        reinterpret_cast<char*>(&_impl_.retention_) -
        reinterpret_cast<char*>(&_impl_.weak_)) + sizeof(_impl_.retention_));
    if (CheckHasBitForRepeated(cached_has_bits, 0x00002000U)) {
      _impl_.targets_.Clear();
    }
  }
  _impl_._has_bits_.Clear();
  _internal_metadata_.Clear<::google::protobuf::UnknownFieldSet>();
}

#if defined(PROTOBUF_CUSTOM_VTABLE)
::uint8_t* PROTOBUF_NONNULL FieldOptions::_InternalSerialize(
    const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target,
    ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) {
  const FieldOptions& this_ = static_cast<const FieldOptions&>(base);
#else   // PROTOBUF_CUSTOM_VTABLE
::uint8_t* PROTOBUF_NONNULL FieldOptions::_InternalSerialize(
    ::uint8_t* PROTOBUF_NONNULL target,
    ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const {
  const FieldOptions& this_ = *this;
#endif  // PROTOBUF_CUSTOM_VTABLE
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    this_.CheckHasBitConsistency();
  }
  // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.FieldOptions)
  ::uint32_t cached_has_bits = 0;
  (void)cached_has_bits;

  cached_has_bits = this_._impl_._has_bits_[0];
  // optional .google.protobuf.FieldOptions.CType ctype = 1 [default = STRING];
  if (CheckHasBit(cached_has_bits, 0x00000010U)) {
    target = stream->EnsureSpace(target);
    target = ::_pbi::WireFormatLite::WriteEnumToArray(
        1, this_._internal_ctype(), target);
  }

  // optional bool packed = 2;
  if (CheckHasBit(cached_has_bits, 0x00000020U)) {
    target = stream->EnsureSpace(target);
    target = ::_pbi::WireFormatLite::WriteBoolToArray(
        2, this_._internal_packed(), target);
  }

  // optional bool deprecated = 3 [default = false];
  if (CheckHasBit(cached_has_bits, 0x00000040U)) {
    target = stream->EnsureSpace(target);
    target = ::_pbi::WireFormatLite::WriteBoolToArray(
        3, this_._internal_deprecated(), target);
  }

  // optional bool lazy = 5 [default = false];
  if (CheckHasBit(cached_has_bits, 0x00000080U)) {
    target = stream->EnsureSpace(target);
    target = ::_pbi::WireFormatLite::WriteBoolToArray(
        5, this_._internal_lazy(), target);
  }

  // optional .google.protobuf.FieldOptions.JSType jstype = 6 [default = JS_NORMAL];
  if (CheckHasBit(cached_has_bits, 0x00000200U)) {
    target = stream->EnsureSpace(target);
    target = ::_pbi::WireFormatLite::WriteEnumToArray(
        6, this_._internal_jstype(), target);
  }

  // optional bool weak = 10 [default = false, deprecated = true];
  if (CheckHasBit(cached_has_bits, 0x00000100U)) {
    target = stream->EnsureSpace(target);
    target = ::_pbi::WireFormatLite::WriteBoolToArray(
        10, this_._internal_weak(), target);
  }

  // optional bool unverified_lazy = 15 [default = false];
  if (CheckHasBit(cached_has_bits, 0x00000400U)) {
    target = stream->EnsureSpace(target);
    target = ::_pbi::WireFormatLite::WriteBoolToArray(
        15, this_._internal_unverified_lazy(), target);
  }

  // optional bool debug_redact = 16 [default = false];
  if (CheckHasBit(cached_has_bits, 0x00000800U)) {
    target = stream->EnsureSpace(target);
    target = ::_pbi::WireFormatLite::WriteBoolToArray(
        16, this_._internal_debug_redact(), target);
  }

  // optional .google.protobuf.FieldOptions.OptionRetention retention = 17;
  if (CheckHasBit(cached_has_bits, 0x00001000U)) {
    target = stream->EnsureSpace(target);
    target = ::_pbi::WireFormatLite::WriteEnumToArray(
        17, this_._internal_retention(), target);
  }

  // repeated .google.protobuf.FieldOptions.OptionTargetType targets = 19;
  if (CheckHasBitForRepeated(cached_has_bits, 0x00002000U)) {
    for (int i = 0, n = this_._internal_targets_size(); i < n; ++i) {
      target = stream->EnsureSpace(target);
      target = ::_pbi::WireFormatLite::WriteEnumToArray(
          19, static_cast<::google::protobuf::FieldOptions_OptionTargetType>(this_._internal_targets().Get(i)),
          target);
    }
  }

  // repeated .google.protobuf.FieldOptions.EditionDefault edition_defaults = 20;
  if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) {
    for (unsigned i = 0, n = static_cast<unsigned>(
                             this_._internal_edition_defaults_size());
         i < n; i++) {
      const auto& repfield = this_._internal_edition_defaults().Get(i);
      target =
          ::google::protobuf::internal::WireFormatLite::InternalWriteMessage(
              20, repfield, repfield.GetCachedSize(),
              target, stream);
    }
  }

  // optional .google.protobuf.FeatureSet features = 21;
  if (CheckHasBit(cached_has_bits, 0x00000004U)) {
    target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage(
        21, *this_._impl_.features_, this_._impl_.features_->GetCachedSize(), target,
        stream);
  }

  // optional .google.protobuf.FieldOptions.FeatureSupport feature_support = 22;
  if (CheckHasBit(cached_has_bits, 0x00000008U)) {
    target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage(
        22, *this_._impl_.feature_support_, this_._impl_.feature_support_->GetCachedSize(), target,
        stream);
  }

  // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
  if (CheckHasBitForRepeated(cached_has_bits, 0x00000002U)) {
    for (unsigned i = 0, n = static_cast<unsigned>(
                             this_._internal_uninterpreted_option_size());
         i < n; i++) {
      const auto& repfield = this_._internal_uninterpreted_option().Get(i);
      target =
          ::google::protobuf::internal::WireFormatLite::InternalWriteMessage(
              999, repfield, repfield.GetCachedSize(),
              target, stream);
    }
  }

  // All extensions.
  target = this_._impl_._extensions_._InternalSerializeAll(&default_instance(),
                                                    target, stream);
  if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) {
    target =
        ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray(
            this_._internal_metadata_.unknown_fields<::google::protobuf::UnknownFieldSet>(::google::protobuf::UnknownFieldSet::default_instance), target, stream);
  }
  // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.FieldOptions)
  return target;
}

#if defined(PROTOBUF_CUSTOM_VTABLE)
::size_t FieldOptions::ByteSizeLong(const MessageLite& base) {
  const FieldOptions& this_ = static_cast<const FieldOptions&>(base);
#else   // PROTOBUF_CUSTOM_VTABLE
::size_t FieldOptions::ByteSizeLong() const {
  const FieldOptions& this_ = *this;
#endif  // PROTOBUF_CUSTOM_VTABLE
  // @@protoc_insertion_point(message_byte_size_start:google.protobuf.FieldOptions)
  ::size_t total_size = 0;
  total_size += this_._impl_._extensions_.ByteSize();

  ::uint32_t cached_has_bits = 0;
  // Prevent compiler warnings about cached_has_bits being unused
  (void)cached_has_bits;

  ::_pbi::Prefetch5LinesFrom7Lines(&this_);
  cached_has_bits = this_._impl_._has_bits_[0];
  total_size += static_cast<bool>(0x00000800U & cached_has_bits) * 3;
  total_size += ::absl::popcount(0x000005e0U & cached_has_bits) * 2;
  if (BatchCheckHasBit(cached_has_bits, 0x0000001fU)) {
    // repeated .google.protobuf.FieldOptions.EditionDefault edition_defaults = 20;
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) {
      total_size += 2UL * this_._internal_edition_defaults_size();
      for (const auto& msg : this_._internal_edition_defaults()) {
        total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg);
      }
    }
    // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000002U)) {
      total_size += 2UL * this_._internal_uninterpreted_option_size();
      for (const auto& msg : this_._internal_uninterpreted_option()) {
        total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg);
      }
    }
    // optional .google.protobuf.FeatureSet features = 21;
    if (CheckHasBit(cached_has_bits, 0x00000004U)) {
      total_size += 2 +
                    ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.features_);
    }
    // optional .google.protobuf.FieldOptions.FeatureSupport feature_support = 22;
    if (CheckHasBit(cached_has_bits, 0x00000008U)) {
      total_size += 2 +
                    ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.feature_support_);
    }
    // optional .google.protobuf.FieldOptions.CType ctype = 1 [default = STRING];
    if (CheckHasBit(cached_has_bits, 0x00000010U)) {
      total_size += 1 +
                    ::_pbi::WireFormatLite::EnumSize(this_._internal_ctype());
    }
  }
  if (BatchCheckHasBit(cached_has_bits, 0x00003200U)) {
    // optional .google.protobuf.FieldOptions.JSType jstype = 6 [default = JS_NORMAL];
    if (CheckHasBit(cached_has_bits, 0x00000200U)) {
      total_size += 1 +
                    ::_pbi::WireFormatLite::EnumSize(this_._internal_jstype());
    }
    // optional .google.protobuf.FieldOptions.OptionRetention retention = 17;
    if (CheckHasBit(cached_has_bits, 0x00001000U)) {
      total_size += 2 +
                    ::_pbi::WireFormatLite::EnumSize(this_._internal_retention());
    }
    // repeated .google.protobuf.FieldOptions.OptionTargetType targets = 19;
    if (CheckHasBitForRepeated(cached_has_bits, 0x00002000U)) {
      ::size_t data_size =
          ::_pbi::WireFormatLite::EnumSize(this_._internal_targets());
      ::size_t tag_size = ::size_t{2} *
          ::_pbi::FromIntSize(this_._internal_targets_size());
      total_size += data_size + tag_size;
    }
  }
  return this_.MaybeComputeUnknownFieldsSize(total_size,
                                             &this_._impl_._cached_size_);
}

void FieldOptions::MergeImpl(::google::protobuf::MessageLite& to_msg,
                            const ::google::protobuf::MessageLite& from_msg) {
   auto* const _this =
      static_cast<FieldOptions*>(&to_msg);
  auto& from = static_cast<const FieldOptions&>(from_msg);
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    from.CheckHasBitConsistency();
  }
  ::google::protobuf::Arena* arena = _this->GetArena();
  // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.FieldOptions)
  ABSL_DCHECK_NE(&from, _this);
  ::uint32_t cached_has_bits = 0;
  (void)cached_has_bits;

  cached_has_bits = from._impl_._has_bits_[0];
  if (BatchCheckHasBit(cached_has_bits, 0x000000ffU)) {
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) {
      _this->_internal_mutable_edition_defaults()->InternalMergeFromWithArena(
          ::google::protobuf::MessageLite::internal_visibility(), arena,
          from._internal_edition_defaults());
    }
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000002U)) {
      _this->_internal_mutable_uninterpreted_option()->InternalMergeFromWithArena(
          ::google::protobuf::MessageLite::internal_visibility(), arena,
          from._internal_uninterpreted_option());
    }
    if (CheckHasBit(cached_has_bits, 0x00000004U)) {
      ABSL_DCHECK(from._impl_.features_ != nullptr);
      if (_this->_impl_.features_ == nullptr) {
        _this->_impl_.features_ = ::google::protobuf::Message::CopyConstruct(arena, *from._impl_.features_);
      } else {
        _this->_impl_.features_->MergeFrom(*from._impl_.features_);
      }
    }
    if (CheckHasBit(cached_has_bits, 0x00000008U)) {
      ABSL_DCHECK(from._impl_.feature_support_ != nullptr);
      if (_this->_impl_.feature_support_ == nullptr) {
        _this->_impl_.feature_support_ = ::google::protobuf::Message::CopyConstruct(arena, *from._impl_.feature_support_);
      } else {
        _this->_impl_.feature_support_->MergeFrom(*from._impl_.feature_support_);
      }
    }
    if (CheckHasBit(cached_has_bits, 0x00000010U)) {
      _this->_impl_.ctype_ = from._impl_.ctype_;
    }
    if (CheckHasBit(cached_has_bits, 0x00000020U)) {
      _this->_impl_.packed_ = from._impl_.packed_;
    }
    if (CheckHasBit(cached_has_bits, 0x00000040U)) {
      _this->_impl_.deprecated_ = from._impl_.deprecated_;
    }
    if (CheckHasBit(cached_has_bits, 0x00000080U)) {
      _this->_impl_.lazy_ = from._impl_.lazy_;
    }
  }
  if (BatchCheckHasBit(cached_has_bits, 0x00003f00U)) {
    if (CheckHasBit(cached_has_bits, 0x00000100U)) {
      _this->_impl_.weak_ = from._impl_.weak_;
    }
    if (CheckHasBit(cached_has_bits, 0x00000200U)) {
      _this->_impl_.jstype_ = from._impl_.jstype_;
    }
    if (CheckHasBit(cached_has_bits, 0x00000400U)) {
      _this->_impl_.unverified_lazy_ = from._impl_.unverified_lazy_;
    }
    if (CheckHasBit(cached_has_bits, 0x00000800U)) {
      _this->_impl_.debug_redact_ = from._impl_.debug_redact_;
    }
    if (CheckHasBit(cached_has_bits, 0x00001000U)) {
      _this->_impl_.retention_ = from._impl_.retention_;
    }
    if (CheckHasBitForRepeated(cached_has_bits, 0x00002000U)) {
      _this->_internal_mutable_targets()->MergeFrom(from._internal_targets());
    }
  }
  _this->_impl_._has_bits_[0] |= cached_has_bits;
  _this->_impl_._extensions_.MergeFrom(&default_instance(),
                                from._impl_._extensions_);
  _this->_internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(
      from._internal_metadata_);
}

void FieldOptions::CopyFrom(const FieldOptions& from) {
  // @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.FieldOptions)
  if (&from == this) return;
  Clear();
  MergeFrom(from);
}

PROTOBUF_NOINLINE bool FieldOptions::IsInitializedImpl(
    const MessageLite& msg) {
  auto& this_ = static_cast<const FieldOptions&>(msg);
  if (!this_._impl_._extensions_.IsInitialized(&default_instance())) {
    return false;
  }
  if (!::google::protobuf::internal::AllAreInitialized(this_._internal_uninterpreted_option()))
    return false;
  if (CheckHasBit(this_._impl_._has_bits_[0], 0x00000004U)) {
    if (!this_._impl_.features_->IsInitialized()) return false;
  }
  return true;
}

void FieldOptions::InternalSwap(FieldOptions* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) {
  using ::std::swap;
  _impl_._extensions_.InternalSwap(&other->_impl_._extensions_);
  _internal_metadata_.InternalSwap(&other->_internal_metadata_);
  swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]);
  _impl_.edition_defaults_.InternalSwap(&other->_impl_.edition_defaults_);
  _impl_.uninterpreted_option_.InternalSwap(&other->_impl_.uninterpreted_option_);
  ::google::protobuf::internal::memswap<
      PROTOBUF_FIELD_OFFSET(FieldOptions, _impl_.retention_)
      + sizeof(FieldOptions::_impl_.retention_)
      - PROTOBUF_FIELD_OFFSET(FieldOptions, _impl_.features_)>(
          reinterpret_cast<char*>(&_impl_.features_),
          reinterpret_cast<char*>(&other->_impl_.features_));
  _impl_.targets_.InternalSwap(&other->_impl_.targets_);
}

::google::protobuf::Metadata FieldOptions::GetMetadata() const {
  return ::google::protobuf::Message::GetMetadataImpl(GetClassData()->full());
}
// ===================================================================

class OneofOptions::_Internal {
 public:
  using HasBits =
      decltype(::std::declval<OneofOptions>()._impl_._has_bits_);
  static constexpr ::int32_t kHasBitsOffset =
      8 * PROTOBUF_FIELD_OFFSET(OneofOptions, _impl_._has_bits_);
};

OneofOptions::OneofOptions(::google::protobuf::Arena* PROTOBUF_NULLABLE arena)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(arena, OneofOptions_class_data_.base()) {
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(arena) {
#endif  // PROTOBUF_CUSTOM_VTABLE
  SharedCtor(arena);
  // @@protoc_insertion_point(arena_constructor:google.protobuf.OneofOptions)
}
PROTOBUF_NDEBUG_INLINE OneofOptions::Impl_::Impl_(
    [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility,
    [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from,
    [[maybe_unused]] const ::google::protobuf::OneofOptions& from_msg)
      : _extensions_{visibility, arena},
        _has_bits_{from._has_bits_},
        _cached_size_{0},
        uninterpreted_option_{visibility, arena, from.uninterpreted_option_} {}

OneofOptions::OneofOptions(
    ::google::protobuf::Arena* PROTOBUF_NULLABLE arena,
    const OneofOptions& from)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(arena, OneofOptions_class_data_.base()) {
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(arena) {
#endif  // PROTOBUF_CUSTOM_VTABLE
  OneofOptions* const _this = this;
  (void)_this;
  _internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(
      from._internal_metadata_);
  new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from);
  _impl_._extensions_.MergeFrom(this, from._impl_._extensions_);
  ::uint32_t cached_has_bits = _impl_._has_bits_[0];
  _impl_.features_ = (CheckHasBit(cached_has_bits, 0x00000002U))
                ? ::google::protobuf::Message::CopyConstruct(arena, *from._impl_.features_)
                : nullptr;

  // @@protoc_insertion_point(copy_constructor:google.protobuf.OneofOptions)
}
PROTOBUF_NDEBUG_INLINE OneofOptions::Impl_::Impl_(
    [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility,
    [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena)
      : _extensions_{visibility, arena},
        _cached_size_{0},
        uninterpreted_option_{visibility, arena} {}

inline void OneofOptions::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) {
  new (&_impl_) Impl_(internal_visibility(), arena);
  _impl_.features_ = {};
}
OneofOptions::~OneofOptions() {
  // @@protoc_insertion_point(destructor:google.protobuf.OneofOptions)
  SharedDtor(*this);
}
inline void OneofOptions::SharedDtor(MessageLite& self) {
  OneofOptions& this_ = static_cast<OneofOptions&>(self);
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    this_.CheckHasBitConsistency();
  }
  this_._internal_metadata_.Delete<::google::protobuf::UnknownFieldSet>();
  ABSL_DCHECK(this_.GetArena() == nullptr);
  delete this_._impl_.features_;
  this_._impl_.~Impl_();
}

inline void* PROTOBUF_NONNULL OneofOptions::PlacementNew_(
    const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem,
    ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) {
  return ::new (mem) OneofOptions(arena);
}
constexpr auto OneofOptions::InternalNewImpl_() {
  constexpr auto arena_bits = ::google::protobuf::internal::EncodePlacementArenaOffsets({
      PROTOBUF_FIELD_OFFSET(OneofOptions, _impl_._extensions_) +
          decltype(OneofOptions::_impl_._extensions_)::InternalGetArenaOffset(
              ::google::protobuf::Message::internal_visibility()),
      PROTOBUF_FIELD_OFFSET(OneofOptions, _impl_.uninterpreted_option_) +
          decltype(OneofOptions::_impl_.uninterpreted_option_)::
              InternalGetArenaOffset(
                  ::google::protobuf::Message::internal_visibility()),
  });
  if (arena_bits.has_value()) {
    return ::google::protobuf::internal::MessageCreator::ZeroInit(
        sizeof(OneofOptions), alignof(OneofOptions), *arena_bits);
  } else {
    return ::google::protobuf::internal::MessageCreator(&OneofOptions::PlacementNew_,
                                 sizeof(OneofOptions),
                                 alignof(OneofOptions));
  }
}
constexpr auto OneofOptions::InternalGenerateClassData_() {
  return ::google::protobuf::internal::ClassDataFull{
      ::google::protobuf::internal::ClassData{
          &_OneofOptions_default_instance_._instance,
          &_table_.header,
          nullptr,  // OnDemandRegisterArenaDtor
          OneofOptions::IsInitializedImpl,
          &OneofOptions::MergeImpl,
          ::google::protobuf::Message::GetNewImpl<OneofOptions>(),
#if defined(PROTOBUF_CUSTOM_VTABLE)
          &OneofOptions::SharedDtor,
          ::google::protobuf::Message::GetClearImpl<OneofOptions>(), &OneofOptions::ByteSizeLong,
              &OneofOptions::_InternalSerialize,
#endif  // PROTOBUF_CUSTOM_VTABLE
          PROTOBUF_FIELD_OFFSET(OneofOptions, _impl_._cached_size_),
          false,
      },
      &OneofOptions::kDescriptorMethods,
      &descriptor_table_google_2fprotobuf_2fdescriptor_2eproto,
      nullptr,  // tracker
  };
}

PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 const
    ::google::protobuf::internal::ClassDataFull OneofOptions_class_data_ =
        OneofOptions::InternalGenerateClassData_();

PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL
OneofOptions::GetClassData() const {
  ::google::protobuf::internal::PrefetchToLocalCache(&OneofOptions_class_data_);
  ::google::protobuf::internal::PrefetchToLocalCache(OneofOptions_class_data_.tc_table);
  return OneofOptions_class_data_.base();
}
constexpr ::_pbi::TcParseTable<2, 2, 2, 0, 7>
OneofOptions::_table_ = {
  {
    PROTOBUF_FIELD_OFFSET(OneofOptions, _impl_._has_bits_),
    PROTOBUF_FIELD_OFFSET(OneofOptions, _impl_._extensions_),
    999, 24,  // max_field_number, fast_idx_mask
    offsetof(decltype(_table_), field_lookup_table),
    4294967294,  // skipmap
    offsetof(decltype(_table_), field_entries),
    2,  // num_field_entries
    2,  // num_aux_entries
    offsetof(decltype(_table_), aux_entries),
    OneofOptions_class_data_.base(),
    nullptr,  // post_loop_handler
    ::_pbi::TcParser::GenericFallback,  // fallback
    #ifdef PROTOBUF_PREFETCH_PARSE_TABLE
    ::_pbi::TcParser::GetTable<::google::protobuf::OneofOptions>(),  // to_prefetch
    #endif  // PROTOBUF_PREFETCH_PARSE_TABLE
  }, {{
    {::_pbi::TcParser::MiniParse, {}},
    // optional .google.protobuf.FeatureSet features = 1;
    {::_pbi::TcParser::FastMtS1,
     {10, 1, 0,
      PROTOBUF_FIELD_OFFSET(OneofOptions, _impl_.features_)}},
    {::_pbi::TcParser::MiniParse, {}},
    // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
    {::_pbi::TcParser::FastMtR2,
     {16058, 0, 1,
      PROTOBUF_FIELD_OFFSET(OneofOptions, _impl_.uninterpreted_option_)}},
  }}, {{
    999, 0, 1,
    65534, 1,
    65535, 65535
  }}, {{
    // optional .google.protobuf.FeatureSet features = 1;
    {PROTOBUF_FIELD_OFFSET(OneofOptions, _impl_.features_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)},
    // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
    {PROTOBUF_FIELD_OFFSET(OneofOptions, _impl_.uninterpreted_option_), _Internal::kHasBitsOffset + 0, 1, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)},
  }},
  {{
      {::_pbi::TcParser::GetTable<::google::protobuf::FeatureSet>()},
      {::_pbi::TcParser::GetTable<::google::protobuf::UninterpretedOption>()},
  }},
  {{
  }},
};
PROTOBUF_NOINLINE void OneofOptions::Clear() {
// @@protoc_insertion_point(message_clear_start:google.protobuf.OneofOptions)
  ::google::protobuf::internal::TSanWrite(&_impl_);
  ::uint32_t cached_has_bits = 0;
  // Prevent compiler warnings about cached_has_bits being unused
  (void) cached_has_bits;

  _impl_._extensions_.Clear();
  cached_has_bits = _impl_._has_bits_[0];
  if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) {
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) {
      _impl_.uninterpreted_option_.Clear();
    }
    if (CheckHasBit(cached_has_bits, 0x00000002U)) {
      ABSL_DCHECK(_impl_.features_ != nullptr);
      _impl_.features_->Clear();
    }
  }
  _impl_._has_bits_.Clear();
  _internal_metadata_.Clear<::google::protobuf::UnknownFieldSet>();
}

#if defined(PROTOBUF_CUSTOM_VTABLE)
::uint8_t* PROTOBUF_NONNULL OneofOptions::_InternalSerialize(
    const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target,
    ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) {
  const OneofOptions& this_ = static_cast<const OneofOptions&>(base);
#else   // PROTOBUF_CUSTOM_VTABLE
::uint8_t* PROTOBUF_NONNULL OneofOptions::_InternalSerialize(
    ::uint8_t* PROTOBUF_NONNULL target,
    ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const {
  const OneofOptions& this_ = *this;
#endif  // PROTOBUF_CUSTOM_VTABLE
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    this_.CheckHasBitConsistency();
  }
  // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.OneofOptions)
  ::uint32_t cached_has_bits = 0;
  (void)cached_has_bits;

  cached_has_bits = this_._impl_._has_bits_[0];
  // optional .google.protobuf.FeatureSet features = 1;
  if (CheckHasBit(cached_has_bits, 0x00000002U)) {
    target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage(
        1, *this_._impl_.features_, this_._impl_.features_->GetCachedSize(), target,
        stream);
  }

  // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
  if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) {
    for (unsigned i = 0, n = static_cast<unsigned>(
                             this_._internal_uninterpreted_option_size());
         i < n; i++) {
      const auto& repfield = this_._internal_uninterpreted_option().Get(i);
      target =
          ::google::protobuf::internal::WireFormatLite::InternalWriteMessage(
              999, repfield, repfield.GetCachedSize(),
              target, stream);
    }
  }

  // All extensions.
  target = this_._impl_._extensions_._InternalSerializeAll(&default_instance(),
                                                    target, stream);
  if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) {
    target =
        ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray(
            this_._internal_metadata_.unknown_fields<::google::protobuf::UnknownFieldSet>(::google::protobuf::UnknownFieldSet::default_instance), target, stream);
  }
  // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.OneofOptions)
  return target;
}

#if defined(PROTOBUF_CUSTOM_VTABLE)
::size_t OneofOptions::ByteSizeLong(const MessageLite& base) {
  const OneofOptions& this_ = static_cast<const OneofOptions&>(base);
#else   // PROTOBUF_CUSTOM_VTABLE
::size_t OneofOptions::ByteSizeLong() const {
  const OneofOptions& this_ = *this;
#endif  // PROTOBUF_CUSTOM_VTABLE
  // @@protoc_insertion_point(message_byte_size_start:google.protobuf.OneofOptions)
  ::size_t total_size = 0;
  total_size += this_._impl_._extensions_.ByteSize();

  ::uint32_t cached_has_bits = 0;
  // Prevent compiler warnings about cached_has_bits being unused
  (void)cached_has_bits;

  ::_pbi::Prefetch5LinesFrom7Lines(&this_);
  cached_has_bits = this_._impl_._has_bits_[0];
  if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) {
    // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) {
      total_size += 2UL * this_._internal_uninterpreted_option_size();
      for (const auto& msg : this_._internal_uninterpreted_option()) {
        total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg);
      }
    }
    // optional .google.protobuf.FeatureSet features = 1;
    if (CheckHasBit(cached_has_bits, 0x00000002U)) {
      total_size += 1 +
                    ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.features_);
    }
  }
  return this_.MaybeComputeUnknownFieldsSize(total_size,
                                             &this_._impl_._cached_size_);
}

void OneofOptions::MergeImpl(::google::protobuf::MessageLite& to_msg,
                            const ::google::protobuf::MessageLite& from_msg) {
   auto* const _this =
      static_cast<OneofOptions*>(&to_msg);
  auto& from = static_cast<const OneofOptions&>(from_msg);
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    from.CheckHasBitConsistency();
  }
  ::google::protobuf::Arena* arena = _this->GetArena();
  // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.OneofOptions)
  ABSL_DCHECK_NE(&from, _this);
  ::uint32_t cached_has_bits = 0;
  (void)cached_has_bits;

  cached_has_bits = from._impl_._has_bits_[0];
  if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) {
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) {
      _this->_internal_mutable_uninterpreted_option()->InternalMergeFromWithArena(
          ::google::protobuf::MessageLite::internal_visibility(), arena,
          from._internal_uninterpreted_option());
    }
    if (CheckHasBit(cached_has_bits, 0x00000002U)) {
      ABSL_DCHECK(from._impl_.features_ != nullptr);
      if (_this->_impl_.features_ == nullptr) {
        _this->_impl_.features_ = ::google::protobuf::Message::CopyConstruct(arena, *from._impl_.features_);
      } else {
        _this->_impl_.features_->MergeFrom(*from._impl_.features_);
      }
    }
  }
  _this->_impl_._has_bits_[0] |= cached_has_bits;
  _this->_impl_._extensions_.MergeFrom(&default_instance(),
                                from._impl_._extensions_);
  _this->_internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(
      from._internal_metadata_);
}

void OneofOptions::CopyFrom(const OneofOptions& from) {
  // @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.OneofOptions)
  if (&from == this) return;
  Clear();
  MergeFrom(from);
}

PROTOBUF_NOINLINE bool OneofOptions::IsInitializedImpl(
    const MessageLite& msg) {
  auto& this_ = static_cast<const OneofOptions&>(msg);
  if (!this_._impl_._extensions_.IsInitialized(&default_instance())) {
    return false;
  }
  if (!::google::protobuf::internal::AllAreInitialized(this_._internal_uninterpreted_option()))
    return false;
  if (CheckHasBit(this_._impl_._has_bits_[0], 0x00000002U)) {
    if (!this_._impl_.features_->IsInitialized()) return false;
  }
  return true;
}

void OneofOptions::InternalSwap(OneofOptions* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) {
  using ::std::swap;
  _impl_._extensions_.InternalSwap(&other->_impl_._extensions_);
  _internal_metadata_.InternalSwap(&other->_internal_metadata_);
  swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]);
  _impl_.uninterpreted_option_.InternalSwap(&other->_impl_.uninterpreted_option_);
  swap(_impl_.features_, other->_impl_.features_);
}

::google::protobuf::Metadata OneofOptions::GetMetadata() const {
  return ::google::protobuf::Message::GetMetadataImpl(GetClassData()->full());
}
// ===================================================================

class EnumOptions::_Internal {
 public:
  using HasBits =
      decltype(::std::declval<EnumOptions>()._impl_._has_bits_);
  static constexpr ::int32_t kHasBitsOffset =
      8 * PROTOBUF_FIELD_OFFSET(EnumOptions, _impl_._has_bits_);
};

EnumOptions::EnumOptions(::google::protobuf::Arena* PROTOBUF_NULLABLE arena)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(arena, EnumOptions_class_data_.base()) {
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(arena) {
#endif  // PROTOBUF_CUSTOM_VTABLE
  SharedCtor(arena);
  // @@protoc_insertion_point(arena_constructor:google.protobuf.EnumOptions)
}
PROTOBUF_NDEBUG_INLINE EnumOptions::Impl_::Impl_(
    [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility,
    [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from,
    [[maybe_unused]] const ::google::protobuf::EnumOptions& from_msg)
      : _extensions_{visibility, arena},
        _has_bits_{from._has_bits_},
        _cached_size_{0},
        uninterpreted_option_{visibility, arena, from.uninterpreted_option_} {}

EnumOptions::EnumOptions(
    ::google::protobuf::Arena* PROTOBUF_NULLABLE arena,
    const EnumOptions& from)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(arena, EnumOptions_class_data_.base()) {
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(arena) {
#endif  // PROTOBUF_CUSTOM_VTABLE
  EnumOptions* const _this = this;
  (void)_this;
  _internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(
      from._internal_metadata_);
  new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from);
  _impl_._extensions_.MergeFrom(this, from._impl_._extensions_);
  ::uint32_t cached_has_bits = _impl_._has_bits_[0];
  _impl_.features_ = (CheckHasBit(cached_has_bits, 0x00000001U))
                ? ::google::protobuf::Message::CopyConstruct(arena, *from._impl_.features_)
                : nullptr;
  ::memcpy(reinterpret_cast<char*>(&_impl_) +
               offsetof(Impl_, allow_alias_),
           reinterpret_cast<const char*>(&from._impl_) +
               offsetof(Impl_, allow_alias_),
           offsetof(Impl_, deprecated_legacy_json_field_conflicts_) -
               offsetof(Impl_, allow_alias_) +
               sizeof(Impl_::deprecated_legacy_json_field_conflicts_));

  // @@protoc_insertion_point(copy_constructor:google.protobuf.EnumOptions)
}
PROTOBUF_NDEBUG_INLINE EnumOptions::Impl_::Impl_(
    [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility,
    [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena)
      : _extensions_{visibility, arena},
        _cached_size_{0},
        uninterpreted_option_{visibility, arena} {}

inline void EnumOptions::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) {
  new (&_impl_) Impl_(internal_visibility(), arena);
  ::memset(reinterpret_cast<char*>(&_impl_) +
               offsetof(Impl_, features_),
           0,
           offsetof(Impl_, deprecated_legacy_json_field_conflicts_) -
               offsetof(Impl_, features_) +
               sizeof(Impl_::deprecated_legacy_json_field_conflicts_));
}
EnumOptions::~EnumOptions() {
  // @@protoc_insertion_point(destructor:google.protobuf.EnumOptions)
  SharedDtor(*this);
}
inline void EnumOptions::SharedDtor(MessageLite& self) {
  EnumOptions& this_ = static_cast<EnumOptions&>(self);
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    this_.CheckHasBitConsistency();
  }
  this_._internal_metadata_.Delete<::google::protobuf::UnknownFieldSet>();
  ABSL_DCHECK(this_.GetArena() == nullptr);
  delete this_._impl_.features_;
  this_._impl_.~Impl_();
}

inline void* PROTOBUF_NONNULL EnumOptions::PlacementNew_(
    const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem,
    ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) {
  return ::new (mem) EnumOptions(arena);
}
constexpr auto EnumOptions::InternalNewImpl_() {
  constexpr auto arena_bits = ::google::protobuf::internal::EncodePlacementArenaOffsets({
      PROTOBUF_FIELD_OFFSET(EnumOptions, _impl_._extensions_) +
          decltype(EnumOptions::_impl_._extensions_)::InternalGetArenaOffset(
              ::google::protobuf::Message::internal_visibility()),
      PROTOBUF_FIELD_OFFSET(EnumOptions, _impl_.uninterpreted_option_) +
          decltype(EnumOptions::_impl_.uninterpreted_option_)::
              InternalGetArenaOffset(
                  ::google::protobuf::Message::internal_visibility()),
  });
  if (arena_bits.has_value()) {
    return ::google::protobuf::internal::MessageCreator::ZeroInit(
        sizeof(EnumOptions), alignof(EnumOptions), *arena_bits);
  } else {
    return ::google::protobuf::internal::MessageCreator(&EnumOptions::PlacementNew_,
                                 sizeof(EnumOptions),
                                 alignof(EnumOptions));
  }
}
constexpr auto EnumOptions::InternalGenerateClassData_() {
  return ::google::protobuf::internal::ClassDataFull{
      ::google::protobuf::internal::ClassData{
          &_EnumOptions_default_instance_._instance,
          &_table_.header,
          nullptr,  // OnDemandRegisterArenaDtor
          EnumOptions::IsInitializedImpl,
          &EnumOptions::MergeImpl,
          ::google::protobuf::Message::GetNewImpl<EnumOptions>(),
#if defined(PROTOBUF_CUSTOM_VTABLE)
          &EnumOptions::SharedDtor,
          ::google::protobuf::Message::GetClearImpl<EnumOptions>(), &EnumOptions::ByteSizeLong,
              &EnumOptions::_InternalSerialize,
#endif  // PROTOBUF_CUSTOM_VTABLE
          PROTOBUF_FIELD_OFFSET(EnumOptions, _impl_._cached_size_),
          false,
      },
      &EnumOptions::kDescriptorMethods,
      &descriptor_table_google_2fprotobuf_2fdescriptor_2eproto,
      nullptr,  // tracker
  };
}

PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 const
    ::google::protobuf::internal::ClassDataFull EnumOptions_class_data_ =
        EnumOptions::InternalGenerateClassData_();

PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL
EnumOptions::GetClassData() const {
  ::google::protobuf::internal::PrefetchToLocalCache(&EnumOptions_class_data_);
  ::google::protobuf::internal::PrefetchToLocalCache(EnumOptions_class_data_.tc_table);
  return EnumOptions_class_data_.base();
}
constexpr ::_pbi::TcParseTable<3, 5, 2, 0, 7>
EnumOptions::_table_ = {
  {
    PROTOBUF_FIELD_OFFSET(EnumOptions, _impl_._has_bits_),
    PROTOBUF_FIELD_OFFSET(EnumOptions, _impl_._extensions_),
    999, 56,  // max_field_number, fast_idx_mask
    offsetof(decltype(_table_), field_lookup_table),
    4294967193,  // skipmap
    offsetof(decltype(_table_), field_entries),
    5,  // num_field_entries
    2,  // num_aux_entries
    offsetof(decltype(_table_), aux_entries),
    EnumOptions_class_data_.base(),
    nullptr,  // post_loop_handler
    ::_pbi::TcParser::GenericFallback,  // fallback
    #ifdef PROTOBUF_PREFETCH_PARSE_TABLE
    ::_pbi::TcParser::GetTable<::google::protobuf::EnumOptions>(),  // to_prefetch
    #endif  // PROTOBUF_PREFETCH_PARSE_TABLE
  }, {{
    {::_pbi::TcParser::MiniParse, {}},
    {::_pbi::TcParser::MiniParse, {}},
    // optional bool allow_alias = 2;
    {::_pbi::TcParser::SingularVarintNoZag1<bool, offsetof(EnumOptions, _impl_.allow_alias_), 1>(),
     {16, 1, 0,
      PROTOBUF_FIELD_OFFSET(EnumOptions, _impl_.allow_alias_)}},
    // optional bool deprecated = 3 [default = false];
    {::_pbi::TcParser::SingularVarintNoZag1<bool, offsetof(EnumOptions, _impl_.deprecated_), 2>(),
     {24, 2, 0,
      PROTOBUF_FIELD_OFFSET(EnumOptions, _impl_.deprecated_)}},
    {::_pbi::TcParser::MiniParse, {}},
    {::_pbi::TcParser::MiniParse, {}},
    // optional bool deprecated_legacy_json_field_conflicts = 6 [deprecated = true];
    {::_pbi::TcParser::SingularVarintNoZag1<bool, offsetof(EnumOptions, _impl_.deprecated_legacy_json_field_conflicts_), 3>(),
     {48, 3, 0,
      PROTOBUF_FIELD_OFFSET(EnumOptions, _impl_.deprecated_legacy_json_field_conflicts_)}},
    // optional .google.protobuf.FeatureSet features = 7;
    {::_pbi::TcParser::FastMtS1,
     {58, 0, 0,
      PROTOBUF_FIELD_OFFSET(EnumOptions, _impl_.features_)}},
  }}, {{
    999, 0, 1,
    65534, 4,
    65535, 65535
  }}, {{
    // optional bool allow_alias = 2;
    {PROTOBUF_FIELD_OFFSET(EnumOptions, _impl_.allow_alias_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kBool)},
    // optional bool deprecated = 3 [default = false];
    {PROTOBUF_FIELD_OFFSET(EnumOptions, _impl_.deprecated_), _Internal::kHasBitsOffset + 2, 0, (0 | ::_fl::kFcOptional | ::_fl::kBool)},
    // optional bool deprecated_legacy_json_field_conflicts = 6 [deprecated = true];
    {PROTOBUF_FIELD_OFFSET(EnumOptions, _impl_.deprecated_legacy_json_field_conflicts_), _Internal::kHasBitsOffset + 3, 0, (0 | ::_fl::kFcOptional | ::_fl::kBool)},
    // optional .google.protobuf.FeatureSet features = 7;
    {PROTOBUF_FIELD_OFFSET(EnumOptions, _impl_.features_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)},
    // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
    {PROTOBUF_FIELD_OFFSET(EnumOptions, _impl_.uninterpreted_option_), _Internal::kHasBitsOffset + 4, 1, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)},
  }},
  {{
      {::_pbi::TcParser::GetTable<::google::protobuf::FeatureSet>()},
      {::_pbi::TcParser::GetTable<::google::protobuf::UninterpretedOption>()},
  }},
  {{
  }},
};
PROTOBUF_NOINLINE void EnumOptions::Clear() {
// @@protoc_insertion_point(message_clear_start:google.protobuf.EnumOptions)
  ::google::protobuf::internal::TSanWrite(&_impl_);
  ::uint32_t cached_has_bits = 0;
  // Prevent compiler warnings about cached_has_bits being unused
  (void) cached_has_bits;

  _impl_._extensions_.Clear();
  cached_has_bits = _impl_._has_bits_[0];
  if (CheckHasBit(cached_has_bits, 0x00000001U)) {
    ABSL_DCHECK(_impl_.features_ != nullptr);
    _impl_.features_->Clear();
  }
  ::memset(&_impl_.allow_alias_, 0, static_cast<::size_t>(
      reinterpret_cast<char*>(&_impl_.deprecated_legacy_json_field_conflicts_) -
      reinterpret_cast<char*>(&_impl_.allow_alias_)) + sizeof(_impl_.deprecated_legacy_json_field_conflicts_));
  if (CheckHasBitForRepeated(cached_has_bits, 0x00000010U)) {
    _impl_.uninterpreted_option_.Clear();
  }
  _impl_._has_bits_.Clear();
  _internal_metadata_.Clear<::google::protobuf::UnknownFieldSet>();
}

#if defined(PROTOBUF_CUSTOM_VTABLE)
::uint8_t* PROTOBUF_NONNULL EnumOptions::_InternalSerialize(
    const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target,
    ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) {
  const EnumOptions& this_ = static_cast<const EnumOptions&>(base);
#else   // PROTOBUF_CUSTOM_VTABLE
::uint8_t* PROTOBUF_NONNULL EnumOptions::_InternalSerialize(
    ::uint8_t* PROTOBUF_NONNULL target,
    ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const {
  const EnumOptions& this_ = *this;
#endif  // PROTOBUF_CUSTOM_VTABLE
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    this_.CheckHasBitConsistency();
  }
  // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.EnumOptions)
  ::uint32_t cached_has_bits = 0;
  (void)cached_has_bits;

  cached_has_bits = this_._impl_._has_bits_[0];
  // optional bool allow_alias = 2;
  if (CheckHasBit(cached_has_bits, 0x00000002U)) {
    target = stream->EnsureSpace(target);
    target = ::_pbi::WireFormatLite::WriteBoolToArray(
        2, this_._internal_allow_alias(), target);
  }

  // optional bool deprecated = 3 [default = false];
  if (CheckHasBit(cached_has_bits, 0x00000004U)) {
    target = stream->EnsureSpace(target);
    target = ::_pbi::WireFormatLite::WriteBoolToArray(
        3, this_._internal_deprecated(), target);
  }

  // optional bool deprecated_legacy_json_field_conflicts = 6 [deprecated = true];
  if (CheckHasBit(cached_has_bits, 0x00000008U)) {
    target = stream->EnsureSpace(target);
    target = ::_pbi::WireFormatLite::WriteBoolToArray(
        6, this_._internal_deprecated_legacy_json_field_conflicts(), target);
  }

  // optional .google.protobuf.FeatureSet features = 7;
  if (CheckHasBit(cached_has_bits, 0x00000001U)) {
    target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage(
        7, *this_._impl_.features_, this_._impl_.features_->GetCachedSize(), target,
        stream);
  }

  // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
  if (CheckHasBitForRepeated(cached_has_bits, 0x00000010U)) {
    for (unsigned i = 0, n = static_cast<unsigned>(
                             this_._internal_uninterpreted_option_size());
         i < n; i++) {
      const auto& repfield = this_._internal_uninterpreted_option().Get(i);
      target =
          ::google::protobuf::internal::WireFormatLite::InternalWriteMessage(
              999, repfield, repfield.GetCachedSize(),
              target, stream);
    }
  }

  // All extensions.
  target = this_._impl_._extensions_._InternalSerializeAll(&default_instance(),
                                                    target, stream);
  if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) {
    target =
        ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray(
            this_._internal_metadata_.unknown_fields<::google::protobuf::UnknownFieldSet>(::google::protobuf::UnknownFieldSet::default_instance), target, stream);
  }
  // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.EnumOptions)
  return target;
}

#if defined(PROTOBUF_CUSTOM_VTABLE)
::size_t EnumOptions::ByteSizeLong(const MessageLite& base) {
  const EnumOptions& this_ = static_cast<const EnumOptions&>(base);
#else   // PROTOBUF_CUSTOM_VTABLE
::size_t EnumOptions::ByteSizeLong() const {
  const EnumOptions& this_ = *this;
#endif  // PROTOBUF_CUSTOM_VTABLE
  // @@protoc_insertion_point(message_byte_size_start:google.protobuf.EnumOptions)
  ::size_t total_size = 0;
  total_size += this_._impl_._extensions_.ByteSize();

  ::uint32_t cached_has_bits = 0;
  // Prevent compiler warnings about cached_has_bits being unused
  (void)cached_has_bits;

  ::_pbi::Prefetch5LinesFrom7Lines(&this_);
  cached_has_bits = this_._impl_._has_bits_[0];
  total_size += ::absl::popcount(0x0000000eU & cached_has_bits) * 2;
  if (BatchCheckHasBit(cached_has_bits, 0x00000011U)) {
    // optional .google.protobuf.FeatureSet features = 7;
    if (CheckHasBit(cached_has_bits, 0x00000001U)) {
      total_size += 1 +
                    ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.features_);
    }
    // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000010U)) {
      total_size += 2UL * this_._internal_uninterpreted_option_size();
      for (const auto& msg : this_._internal_uninterpreted_option()) {
        total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg);
      }
    }
  }
  return this_.MaybeComputeUnknownFieldsSize(total_size,
                                             &this_._impl_._cached_size_);
}

void EnumOptions::MergeImpl(::google::protobuf::MessageLite& to_msg,
                            const ::google::protobuf::MessageLite& from_msg) {
   auto* const _this =
      static_cast<EnumOptions*>(&to_msg);
  auto& from = static_cast<const EnumOptions&>(from_msg);
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    from.CheckHasBitConsistency();
  }
  ::google::protobuf::Arena* arena = _this->GetArena();
  // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.EnumOptions)
  ABSL_DCHECK_NE(&from, _this);
  ::uint32_t cached_has_bits = 0;
  (void)cached_has_bits;

  cached_has_bits = from._impl_._has_bits_[0];
  if (BatchCheckHasBit(cached_has_bits, 0x0000001fU)) {
    if (CheckHasBit(cached_has_bits, 0x00000001U)) {
      ABSL_DCHECK(from._impl_.features_ != nullptr);
      if (_this->_impl_.features_ == nullptr) {
        _this->_impl_.features_ = ::google::protobuf::Message::CopyConstruct(arena, *from._impl_.features_);
      } else {
        _this->_impl_.features_->MergeFrom(*from._impl_.features_);
      }
    }
    if (CheckHasBit(cached_has_bits, 0x00000002U)) {
      _this->_impl_.allow_alias_ = from._impl_.allow_alias_;
    }
    if (CheckHasBit(cached_has_bits, 0x00000004U)) {
      _this->_impl_.deprecated_ = from._impl_.deprecated_;
    }
    if (CheckHasBit(cached_has_bits, 0x00000008U)) {
      _this->_impl_.deprecated_legacy_json_field_conflicts_ = from._impl_.deprecated_legacy_json_field_conflicts_;
    }
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000010U)) {
      _this->_internal_mutable_uninterpreted_option()->InternalMergeFromWithArena(
          ::google::protobuf::MessageLite::internal_visibility(), arena,
          from._internal_uninterpreted_option());
    }
  }
  _this->_impl_._has_bits_[0] |= cached_has_bits;
  _this->_impl_._extensions_.MergeFrom(&default_instance(),
                                from._impl_._extensions_);
  _this->_internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(
      from._internal_metadata_);
}

void EnumOptions::CopyFrom(const EnumOptions& from) {
  // @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.EnumOptions)
  if (&from == this) return;
  Clear();
  MergeFrom(from);
}

PROTOBUF_NOINLINE bool EnumOptions::IsInitializedImpl(
    const MessageLite& msg) {
  auto& this_ = static_cast<const EnumOptions&>(msg);
  if (!this_._impl_._extensions_.IsInitialized(&default_instance())) {
    return false;
  }
  if (CheckHasBit(this_._impl_._has_bits_[0], 0x00000001U)) {
    if (!this_._impl_.features_->IsInitialized()) return false;
  }
  if (!::google::protobuf::internal::AllAreInitialized(this_._internal_uninterpreted_option()))
    return false;
  return true;
}

void EnumOptions::InternalSwap(EnumOptions* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) {
  using ::std::swap;
  _impl_._extensions_.InternalSwap(&other->_impl_._extensions_);
  _internal_metadata_.InternalSwap(&other->_internal_metadata_);
  swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]);
  ::google::protobuf::internal::memswap<
      PROTOBUF_FIELD_OFFSET(EnumOptions, _impl_.deprecated_legacy_json_field_conflicts_)
      + sizeof(EnumOptions::_impl_.deprecated_legacy_json_field_conflicts_)
      - PROTOBUF_FIELD_OFFSET(EnumOptions, _impl_.features_)>(
          reinterpret_cast<char*>(&_impl_.features_),
          reinterpret_cast<char*>(&other->_impl_.features_));
  _impl_.uninterpreted_option_.InternalSwap(&other->_impl_.uninterpreted_option_);
}

::google::protobuf::Metadata EnumOptions::GetMetadata() const {
  return ::google::protobuf::Message::GetMetadataImpl(GetClassData()->full());
}
// ===================================================================

class EnumValueOptions::_Internal {
 public:
  using HasBits =
      decltype(::std::declval<EnumValueOptions>()._impl_._has_bits_);
  static constexpr ::int32_t kHasBitsOffset =
      8 * PROTOBUF_FIELD_OFFSET(EnumValueOptions, _impl_._has_bits_);
};

EnumValueOptions::EnumValueOptions(::google::protobuf::Arena* PROTOBUF_NULLABLE arena)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(arena, EnumValueOptions_class_data_.base()) {
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(arena) {
#endif  // PROTOBUF_CUSTOM_VTABLE
  SharedCtor(arena);
  // @@protoc_insertion_point(arena_constructor:google.protobuf.EnumValueOptions)
}
PROTOBUF_NDEBUG_INLINE EnumValueOptions::Impl_::Impl_(
    [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility,
    [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from,
    [[maybe_unused]] const ::google::protobuf::EnumValueOptions& from_msg)
      : _extensions_{visibility, arena},
        _has_bits_{from._has_bits_},
        _cached_size_{0},
        uninterpreted_option_{visibility, arena, from.uninterpreted_option_} {}

EnumValueOptions::EnumValueOptions(
    ::google::protobuf::Arena* PROTOBUF_NULLABLE arena,
    const EnumValueOptions& from)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(arena, EnumValueOptions_class_data_.base()) {
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(arena) {
#endif  // PROTOBUF_CUSTOM_VTABLE
  EnumValueOptions* const _this = this;
  (void)_this;
  _internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(
      from._internal_metadata_);
  new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from);
  _impl_._extensions_.MergeFrom(this, from._impl_._extensions_);
  ::uint32_t cached_has_bits = _impl_._has_bits_[0];
  _impl_.features_ = (CheckHasBit(cached_has_bits, 0x00000002U))
                ? ::google::protobuf::Message::CopyConstruct(arena, *from._impl_.features_)
                : nullptr;
  _impl_.feature_support_ = (CheckHasBit(cached_has_bits, 0x00000004U))
                ? ::google::protobuf::Message::CopyConstruct(arena, *from._impl_.feature_support_)
                : nullptr;
  ::memcpy(reinterpret_cast<char*>(&_impl_) +
               offsetof(Impl_, deprecated_),
           reinterpret_cast<const char*>(&from._impl_) +
               offsetof(Impl_, deprecated_),
           offsetof(Impl_, debug_redact_) -
               offsetof(Impl_, deprecated_) +
               sizeof(Impl_::debug_redact_));

  // @@protoc_insertion_point(copy_constructor:google.protobuf.EnumValueOptions)
}
PROTOBUF_NDEBUG_INLINE EnumValueOptions::Impl_::Impl_(
    [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility,
    [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena)
      : _extensions_{visibility, arena},
        _cached_size_{0},
        uninterpreted_option_{visibility, arena} {}

inline void EnumValueOptions::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) {
  new (&_impl_) Impl_(internal_visibility(), arena);
  ::memset(reinterpret_cast<char*>(&_impl_) +
               offsetof(Impl_, features_),
           0,
           offsetof(Impl_, debug_redact_) -
               offsetof(Impl_, features_) +
               sizeof(Impl_::debug_redact_));
}
EnumValueOptions::~EnumValueOptions() {
  // @@protoc_insertion_point(destructor:google.protobuf.EnumValueOptions)
  SharedDtor(*this);
}
inline void EnumValueOptions::SharedDtor(MessageLite& self) {
  EnumValueOptions& this_ = static_cast<EnumValueOptions&>(self);
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    this_.CheckHasBitConsistency();
  }
  this_._internal_metadata_.Delete<::google::protobuf::UnknownFieldSet>();
  ABSL_DCHECK(this_.GetArena() == nullptr);
  delete this_._impl_.features_;
  delete this_._impl_.feature_support_;
  this_._impl_.~Impl_();
}

inline void* PROTOBUF_NONNULL EnumValueOptions::PlacementNew_(
    const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem,
    ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) {
  return ::new (mem) EnumValueOptions(arena);
}
constexpr auto EnumValueOptions::InternalNewImpl_() {
  constexpr auto arena_bits = ::google::protobuf::internal::EncodePlacementArenaOffsets({
      PROTOBUF_FIELD_OFFSET(EnumValueOptions, _impl_._extensions_) +
          decltype(EnumValueOptions::_impl_._extensions_)::InternalGetArenaOffset(
              ::google::protobuf::Message::internal_visibility()),
      PROTOBUF_FIELD_OFFSET(EnumValueOptions, _impl_.uninterpreted_option_) +
          decltype(EnumValueOptions::_impl_.uninterpreted_option_)::
              InternalGetArenaOffset(
                  ::google::protobuf::Message::internal_visibility()),
  });
  if (arena_bits.has_value()) {
    return ::google::protobuf::internal::MessageCreator::ZeroInit(
        sizeof(EnumValueOptions), alignof(EnumValueOptions), *arena_bits);
  } else {
    return ::google::protobuf::internal::MessageCreator(&EnumValueOptions::PlacementNew_,
                                 sizeof(EnumValueOptions),
                                 alignof(EnumValueOptions));
  }
}
constexpr auto EnumValueOptions::InternalGenerateClassData_() {
  return ::google::protobuf::internal::ClassDataFull{
      ::google::protobuf::internal::ClassData{
          &_EnumValueOptions_default_instance_._instance,
          &_table_.header,
          nullptr,  // OnDemandRegisterArenaDtor
          EnumValueOptions::IsInitializedImpl,
          &EnumValueOptions::MergeImpl,
          ::google::protobuf::Message::GetNewImpl<EnumValueOptions>(),
#if defined(PROTOBUF_CUSTOM_VTABLE)
          &EnumValueOptions::SharedDtor,
          ::google::protobuf::Message::GetClearImpl<EnumValueOptions>(), &EnumValueOptions::ByteSizeLong,
              &EnumValueOptions::_InternalSerialize,
#endif  // PROTOBUF_CUSTOM_VTABLE
          PROTOBUF_FIELD_OFFSET(EnumValueOptions, _impl_._cached_size_),
          false,
      },
      &EnumValueOptions::kDescriptorMethods,
      &descriptor_table_google_2fprotobuf_2fdescriptor_2eproto,
      nullptr,  // tracker
  };
}

PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 const
    ::google::protobuf::internal::ClassDataFull EnumValueOptions_class_data_ =
        EnumValueOptions::InternalGenerateClassData_();

PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL
EnumValueOptions::GetClassData() const {
  ::google::protobuf::internal::PrefetchToLocalCache(&EnumValueOptions_class_data_);
  ::google::protobuf::internal::PrefetchToLocalCache(EnumValueOptions_class_data_.tc_table);
  return EnumValueOptions_class_data_.base();
}
constexpr ::_pbi::TcParseTable<3, 5, 3, 0, 7>
EnumValueOptions::_table_ = {
  {
    PROTOBUF_FIELD_OFFSET(EnumValueOptions, _impl_._has_bits_),
    PROTOBUF_FIELD_OFFSET(EnumValueOptions, _impl_._extensions_),
    999, 56,  // max_field_number, fast_idx_mask
    offsetof(decltype(_table_), field_lookup_table),
    4294967280,  // skipmap
    offsetof(decltype(_table_), field_entries),
    5,  // num_field_entries
    3,  // num_aux_entries
    offsetof(decltype(_table_), aux_entries),
    EnumValueOptions_class_data_.base(),
    nullptr,  // post_loop_handler
    ::_pbi::TcParser::GenericFallback,  // fallback
    #ifdef PROTOBUF_PREFETCH_PARSE_TABLE
    ::_pbi::TcParser::GetTable<::google::protobuf::EnumValueOptions>(),  // to_prefetch
    #endif  // PROTOBUF_PREFETCH_PARSE_TABLE
  }, {{
    {::_pbi::TcParser::MiniParse, {}},
    // optional bool deprecated = 1 [default = false];
    {::_pbi::TcParser::SingularVarintNoZag1<bool, offsetof(EnumValueOptions, _impl_.deprecated_), 3>(),
     {8, 3, 0,
      PROTOBUF_FIELD_OFFSET(EnumValueOptions, _impl_.deprecated_)}},
    // optional .google.protobuf.FeatureSet features = 2;
    {::_pbi::TcParser::FastMtS1,
     {18, 1, 0,
      PROTOBUF_FIELD_OFFSET(EnumValueOptions, _impl_.features_)}},
    // optional bool debug_redact = 3 [default = false];
    {::_pbi::TcParser::SingularVarintNoZag1<bool, offsetof(EnumValueOptions, _impl_.debug_redact_), 4>(),
     {24, 4, 0,
      PROTOBUF_FIELD_OFFSET(EnumValueOptions, _impl_.debug_redact_)}},
    // optional .google.protobuf.FieldOptions.FeatureSupport feature_support = 4;
    {::_pbi::TcParser::FastMtS1,
     {34, 2, 1,
      PROTOBUF_FIELD_OFFSET(EnumValueOptions, _impl_.feature_support_)}},
    {::_pbi::TcParser::MiniParse, {}},
    {::_pbi::TcParser::MiniParse, {}},
    // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
    {::_pbi::TcParser::FastMtR2,
     {16058, 0, 2,
      PROTOBUF_FIELD_OFFSET(EnumValueOptions, _impl_.uninterpreted_option_)}},
  }}, {{
    999, 0, 1,
    65534, 4,
    65535, 65535
  }}, {{
    // optional bool deprecated = 1 [default = false];
    {PROTOBUF_FIELD_OFFSET(EnumValueOptions, _impl_.deprecated_), _Internal::kHasBitsOffset + 3, 0, (0 | ::_fl::kFcOptional | ::_fl::kBool)},
    // optional .google.protobuf.FeatureSet features = 2;
    {PROTOBUF_FIELD_OFFSET(EnumValueOptions, _impl_.features_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)},
    // optional bool debug_redact = 3 [default = false];
    {PROTOBUF_FIELD_OFFSET(EnumValueOptions, _impl_.debug_redact_), _Internal::kHasBitsOffset + 4, 0, (0 | ::_fl::kFcOptional | ::_fl::kBool)},
    // optional .google.protobuf.FieldOptions.FeatureSupport feature_support = 4;
    {PROTOBUF_FIELD_OFFSET(EnumValueOptions, _impl_.feature_support_), _Internal::kHasBitsOffset + 2, 1, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)},
    // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
    {PROTOBUF_FIELD_OFFSET(EnumValueOptions, _impl_.uninterpreted_option_), _Internal::kHasBitsOffset + 0, 2, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)},
  }},
  {{
      {::_pbi::TcParser::GetTable<::google::protobuf::FeatureSet>()},
      {::_pbi::TcParser::GetTable<::google::protobuf::FieldOptions_FeatureSupport>()},
      {::_pbi::TcParser::GetTable<::google::protobuf::UninterpretedOption>()},
  }},
  {{
  }},
};
PROTOBUF_NOINLINE void EnumValueOptions::Clear() {
// @@protoc_insertion_point(message_clear_start:google.protobuf.EnumValueOptions)
  ::google::protobuf::internal::TSanWrite(&_impl_);
  ::uint32_t cached_has_bits = 0;
  // Prevent compiler warnings about cached_has_bits being unused
  (void) cached_has_bits;

  _impl_._extensions_.Clear();
  cached_has_bits = _impl_._has_bits_[0];
  if (BatchCheckHasBit(cached_has_bits, 0x00000007U)) {
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) {
      _impl_.uninterpreted_option_.Clear();
    }
    if (CheckHasBit(cached_has_bits, 0x00000002U)) {
      ABSL_DCHECK(_impl_.features_ != nullptr);
      _impl_.features_->Clear();
    }
    if (CheckHasBit(cached_has_bits, 0x00000004U)) {
      ABSL_DCHECK(_impl_.feature_support_ != nullptr);
      _impl_.feature_support_->Clear();
    }
  }
  ::memset(&_impl_.deprecated_, 0, static_cast<::size_t>(
      reinterpret_cast<char*>(&_impl_.debug_redact_) -
      reinterpret_cast<char*>(&_impl_.deprecated_)) + sizeof(_impl_.debug_redact_));
  _impl_._has_bits_.Clear();
  _internal_metadata_.Clear<::google::protobuf::UnknownFieldSet>();
}

#if defined(PROTOBUF_CUSTOM_VTABLE)
::uint8_t* PROTOBUF_NONNULL EnumValueOptions::_InternalSerialize(
    const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target,
    ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) {
  const EnumValueOptions& this_ = static_cast<const EnumValueOptions&>(base);
#else   // PROTOBUF_CUSTOM_VTABLE
::uint8_t* PROTOBUF_NONNULL EnumValueOptions::_InternalSerialize(
    ::uint8_t* PROTOBUF_NONNULL target,
    ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const {
  const EnumValueOptions& this_ = *this;
#endif  // PROTOBUF_CUSTOM_VTABLE
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    this_.CheckHasBitConsistency();
  }
  // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.EnumValueOptions)
  ::uint32_t cached_has_bits = 0;
  (void)cached_has_bits;

  cached_has_bits = this_._impl_._has_bits_[0];
  // optional bool deprecated = 1 [default = false];
  if (CheckHasBit(cached_has_bits, 0x00000008U)) {
    target = stream->EnsureSpace(target);
    target = ::_pbi::WireFormatLite::WriteBoolToArray(
        1, this_._internal_deprecated(), target);
  }

  // optional .google.protobuf.FeatureSet features = 2;
  if (CheckHasBit(cached_has_bits, 0x00000002U)) {
    target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage(
        2, *this_._impl_.features_, this_._impl_.features_->GetCachedSize(), target,
        stream);
  }

  // optional bool debug_redact = 3 [default = false];
  if (CheckHasBit(cached_has_bits, 0x00000010U)) {
    target = stream->EnsureSpace(target);
    target = ::_pbi::WireFormatLite::WriteBoolToArray(
        3, this_._internal_debug_redact(), target);
  }

  // optional .google.protobuf.FieldOptions.FeatureSupport feature_support = 4;
  if (CheckHasBit(cached_has_bits, 0x00000004U)) {
    target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage(
        4, *this_._impl_.feature_support_, this_._impl_.feature_support_->GetCachedSize(), target,
        stream);
  }

  // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
  if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) {
    for (unsigned i = 0, n = static_cast<unsigned>(
                             this_._internal_uninterpreted_option_size());
         i < n; i++) {
      const auto& repfield = this_._internal_uninterpreted_option().Get(i);
      target =
          ::google::protobuf::internal::WireFormatLite::InternalWriteMessage(
              999, repfield, repfield.GetCachedSize(),
              target, stream);
    }
  }

  // All extensions.
  target = this_._impl_._extensions_._InternalSerializeAll(&default_instance(),
                                                    target, stream);
  if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) {
    target =
        ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray(
            this_._internal_metadata_.unknown_fields<::google::protobuf::UnknownFieldSet>(::google::protobuf::UnknownFieldSet::default_instance), target, stream);
  }
  // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.EnumValueOptions)
  return target;
}

#if defined(PROTOBUF_CUSTOM_VTABLE)
::size_t EnumValueOptions::ByteSizeLong(const MessageLite& base) {
  const EnumValueOptions& this_ = static_cast<const EnumValueOptions&>(base);
#else   // PROTOBUF_CUSTOM_VTABLE
::size_t EnumValueOptions::ByteSizeLong() const {
  const EnumValueOptions& this_ = *this;
#endif  // PROTOBUF_CUSTOM_VTABLE
  // @@protoc_insertion_point(message_byte_size_start:google.protobuf.EnumValueOptions)
  ::size_t total_size = 0;
  total_size += this_._impl_._extensions_.ByteSize();

  ::uint32_t cached_has_bits = 0;
  // Prevent compiler warnings about cached_has_bits being unused
  (void)cached_has_bits;

  ::_pbi::Prefetch5LinesFrom7Lines(&this_);
  cached_has_bits = this_._impl_._has_bits_[0];
  total_size += ::absl::popcount(0x00000018U & cached_has_bits) * 2;
  if (BatchCheckHasBit(cached_has_bits, 0x00000007U)) {
    // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) {
      total_size += 2UL * this_._internal_uninterpreted_option_size();
      for (const auto& msg : this_._internal_uninterpreted_option()) {
        total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg);
      }
    }
    // optional .google.protobuf.FeatureSet features = 2;
    if (CheckHasBit(cached_has_bits, 0x00000002U)) {
      total_size += 1 +
                    ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.features_);
    }
    // optional .google.protobuf.FieldOptions.FeatureSupport feature_support = 4;
    if (CheckHasBit(cached_has_bits, 0x00000004U)) {
      total_size += 1 +
                    ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.feature_support_);
    }
  }
  return this_.MaybeComputeUnknownFieldsSize(total_size,
                                             &this_._impl_._cached_size_);
}

void EnumValueOptions::MergeImpl(::google::protobuf::MessageLite& to_msg,
                            const ::google::protobuf::MessageLite& from_msg) {
   auto* const _this =
      static_cast<EnumValueOptions*>(&to_msg);
  auto& from = static_cast<const EnumValueOptions&>(from_msg);
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    from.CheckHasBitConsistency();
  }
  ::google::protobuf::Arena* arena = _this->GetArena();
  // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.EnumValueOptions)
  ABSL_DCHECK_NE(&from, _this);
  ::uint32_t cached_has_bits = 0;
  (void)cached_has_bits;

  cached_has_bits = from._impl_._has_bits_[0];
  if (BatchCheckHasBit(cached_has_bits, 0x0000001fU)) {
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) {
      _this->_internal_mutable_uninterpreted_option()->InternalMergeFromWithArena(
          ::google::protobuf::MessageLite::internal_visibility(), arena,
          from._internal_uninterpreted_option());
    }
    if (CheckHasBit(cached_has_bits, 0x00000002U)) {
      ABSL_DCHECK(from._impl_.features_ != nullptr);
      if (_this->_impl_.features_ == nullptr) {
        _this->_impl_.features_ = ::google::protobuf::Message::CopyConstruct(arena, *from._impl_.features_);
      } else {
        _this->_impl_.features_->MergeFrom(*from._impl_.features_);
      }
    }
    if (CheckHasBit(cached_has_bits, 0x00000004U)) {
      ABSL_DCHECK(from._impl_.feature_support_ != nullptr);
      if (_this->_impl_.feature_support_ == nullptr) {
        _this->_impl_.feature_support_ = ::google::protobuf::Message::CopyConstruct(arena, *from._impl_.feature_support_);
      } else {
        _this->_impl_.feature_support_->MergeFrom(*from._impl_.feature_support_);
      }
    }
    if (CheckHasBit(cached_has_bits, 0x00000008U)) {
      _this->_impl_.deprecated_ = from._impl_.deprecated_;
    }
    if (CheckHasBit(cached_has_bits, 0x00000010U)) {
      _this->_impl_.debug_redact_ = from._impl_.debug_redact_;
    }
  }
  _this->_impl_._has_bits_[0] |= cached_has_bits;
  _this->_impl_._extensions_.MergeFrom(&default_instance(),
                                from._impl_._extensions_);
  _this->_internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(
      from._internal_metadata_);
}

void EnumValueOptions::CopyFrom(const EnumValueOptions& from) {
  // @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.EnumValueOptions)
  if (&from == this) return;
  Clear();
  MergeFrom(from);
}

PROTOBUF_NOINLINE bool EnumValueOptions::IsInitializedImpl(
    const MessageLite& msg) {
  auto& this_ = static_cast<const EnumValueOptions&>(msg);
  if (!this_._impl_._extensions_.IsInitialized(&default_instance())) {
    return false;
  }
  if (!::google::protobuf::internal::AllAreInitialized(this_._internal_uninterpreted_option()))
    return false;
  if (CheckHasBit(this_._impl_._has_bits_[0], 0x00000002U)) {
    if (!this_._impl_.features_->IsInitialized()) return false;
  }
  return true;
}

void EnumValueOptions::InternalSwap(EnumValueOptions* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) {
  using ::std::swap;
  _impl_._extensions_.InternalSwap(&other->_impl_._extensions_);
  _internal_metadata_.InternalSwap(&other->_internal_metadata_);
  swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]);
  _impl_.uninterpreted_option_.InternalSwap(&other->_impl_.uninterpreted_option_);
  ::google::protobuf::internal::memswap<
      PROTOBUF_FIELD_OFFSET(EnumValueOptions, _impl_.debug_redact_)
      + sizeof(EnumValueOptions::_impl_.debug_redact_)
      - PROTOBUF_FIELD_OFFSET(EnumValueOptions, _impl_.features_)>(
          reinterpret_cast<char*>(&_impl_.features_),
          reinterpret_cast<char*>(&other->_impl_.features_));
}

::google::protobuf::Metadata EnumValueOptions::GetMetadata() const {
  return ::google::protobuf::Message::GetMetadataImpl(GetClassData()->full());
}
// ===================================================================

class ServiceOptions::_Internal {
 public:
  using HasBits =
      decltype(::std::declval<ServiceOptions>()._impl_._has_bits_);
  static constexpr ::int32_t kHasBitsOffset =
      8 * PROTOBUF_FIELD_OFFSET(ServiceOptions, _impl_._has_bits_);
};

ServiceOptions::ServiceOptions(::google::protobuf::Arena* PROTOBUF_NULLABLE arena)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(arena, ServiceOptions_class_data_.base()) {
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(arena) {
#endif  // PROTOBUF_CUSTOM_VTABLE
  SharedCtor(arena);
  // @@protoc_insertion_point(arena_constructor:google.protobuf.ServiceOptions)
}
PROTOBUF_NDEBUG_INLINE ServiceOptions::Impl_::Impl_(
    [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility,
    [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from,
    [[maybe_unused]] const ::google::protobuf::ServiceOptions& from_msg)
      : _extensions_{visibility, arena},
        _has_bits_{from._has_bits_},
        _cached_size_{0},
        uninterpreted_option_{visibility, arena, from.uninterpreted_option_} {}

ServiceOptions::ServiceOptions(
    ::google::protobuf::Arena* PROTOBUF_NULLABLE arena,
    const ServiceOptions& from)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(arena, ServiceOptions_class_data_.base()) {
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(arena) {
#endif  // PROTOBUF_CUSTOM_VTABLE
  ServiceOptions* const _this = this;
  (void)_this;
  _internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(
      from._internal_metadata_);
  new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from);
  _impl_._extensions_.MergeFrom(this, from._impl_._extensions_);
  ::uint32_t cached_has_bits = _impl_._has_bits_[0];
  _impl_.features_ = (CheckHasBit(cached_has_bits, 0x00000002U))
                ? ::google::protobuf::Message::CopyConstruct(arena, *from._impl_.features_)
                : nullptr;
  _impl_.deprecated_ = from._impl_.deprecated_;

  // @@protoc_insertion_point(copy_constructor:google.protobuf.ServiceOptions)
}
PROTOBUF_NDEBUG_INLINE ServiceOptions::Impl_::Impl_(
    [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility,
    [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena)
      : _extensions_{visibility, arena},
        _cached_size_{0},
        uninterpreted_option_{visibility, arena} {}

inline void ServiceOptions::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) {
  new (&_impl_) Impl_(internal_visibility(), arena);
  ::memset(reinterpret_cast<char*>(&_impl_) +
               offsetof(Impl_, features_),
           0,
           offsetof(Impl_, deprecated_) -
               offsetof(Impl_, features_) +
               sizeof(Impl_::deprecated_));
}
ServiceOptions::~ServiceOptions() {
  // @@protoc_insertion_point(destructor:google.protobuf.ServiceOptions)
  SharedDtor(*this);
}
inline void ServiceOptions::SharedDtor(MessageLite& self) {
  ServiceOptions& this_ = static_cast<ServiceOptions&>(self);
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    this_.CheckHasBitConsistency();
  }
  this_._internal_metadata_.Delete<::google::protobuf::UnknownFieldSet>();
  ABSL_DCHECK(this_.GetArena() == nullptr);
  delete this_._impl_.features_;
  this_._impl_.~Impl_();
}

inline void* PROTOBUF_NONNULL ServiceOptions::PlacementNew_(
    const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem,
    ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) {
  return ::new (mem) ServiceOptions(arena);
}
constexpr auto ServiceOptions::InternalNewImpl_() {
  constexpr auto arena_bits = ::google::protobuf::internal::EncodePlacementArenaOffsets({
      PROTOBUF_FIELD_OFFSET(ServiceOptions, _impl_._extensions_) +
          decltype(ServiceOptions::_impl_._extensions_)::InternalGetArenaOffset(
              ::google::protobuf::Message::internal_visibility()),
      PROTOBUF_FIELD_OFFSET(ServiceOptions, _impl_.uninterpreted_option_) +
          decltype(ServiceOptions::_impl_.uninterpreted_option_)::
              InternalGetArenaOffset(
                  ::google::protobuf::Message::internal_visibility()),
  });
  if (arena_bits.has_value()) {
    return ::google::protobuf::internal::MessageCreator::ZeroInit(
        sizeof(ServiceOptions), alignof(ServiceOptions), *arena_bits);
  } else {
    return ::google::protobuf::internal::MessageCreator(&ServiceOptions::PlacementNew_,
                                 sizeof(ServiceOptions),
                                 alignof(ServiceOptions));
  }
}
constexpr auto ServiceOptions::InternalGenerateClassData_() {
  return ::google::protobuf::internal::ClassDataFull{
      ::google::protobuf::internal::ClassData{
          &_ServiceOptions_default_instance_._instance,
          &_table_.header,
          nullptr,  // OnDemandRegisterArenaDtor
          ServiceOptions::IsInitializedImpl,
          &ServiceOptions::MergeImpl,
          ::google::protobuf::Message::GetNewImpl<ServiceOptions>(),
#if defined(PROTOBUF_CUSTOM_VTABLE)
          &ServiceOptions::SharedDtor,
          ::google::protobuf::Message::GetClearImpl<ServiceOptions>(), &ServiceOptions::ByteSizeLong,
              &ServiceOptions::_InternalSerialize,
#endif  // PROTOBUF_CUSTOM_VTABLE
          PROTOBUF_FIELD_OFFSET(ServiceOptions, _impl_._cached_size_),
          false,
      },
      &ServiceOptions::kDescriptorMethods,
      &descriptor_table_google_2fprotobuf_2fdescriptor_2eproto,
      nullptr,  // tracker
  };
}

PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 const
    ::google::protobuf::internal::ClassDataFull ServiceOptions_class_data_ =
        ServiceOptions::InternalGenerateClassData_();

PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL
ServiceOptions::GetClassData() const {
  ::google::protobuf::internal::PrefetchToLocalCache(&ServiceOptions_class_data_);
  ::google::protobuf::internal::PrefetchToLocalCache(ServiceOptions_class_data_.tc_table);
  return ServiceOptions_class_data_.base();
}
constexpr ::_pbi::TcParseTable<2, 3, 2, 0, 12>
ServiceOptions::_table_ = {
  {
    PROTOBUF_FIELD_OFFSET(ServiceOptions, _impl_._has_bits_),
    PROTOBUF_FIELD_OFFSET(ServiceOptions, _impl_._extensions_),
    999, 24,  // max_field_number, fast_idx_mask
    offsetof(decltype(_table_), field_lookup_table),
    4294967295,  // skipmap
    offsetof(decltype(_table_), field_entries),
    3,  // num_field_entries
    2,  // num_aux_entries
    offsetof(decltype(_table_), aux_entries),
    ServiceOptions_class_data_.base(),
    nullptr,  // post_loop_handler
    ::_pbi::TcParser::GenericFallback,  // fallback
    #ifdef PROTOBUF_PREFETCH_PARSE_TABLE
    ::_pbi::TcParser::GetTable<::google::protobuf::ServiceOptions>(),  // to_prefetch
    #endif  // PROTOBUF_PREFETCH_PARSE_TABLE
  }, {{
    {::_pbi::TcParser::MiniParse, {}},
    // optional bool deprecated = 33 [default = false];
    {::_pbi::TcParser::FastV8S2,
     {648, 2, 0,
      PROTOBUF_FIELD_OFFSET(ServiceOptions, _impl_.deprecated_)}},
    // optional .google.protobuf.FeatureSet features = 34;
    {::_pbi::TcParser::FastMtS2,
     {658, 1, 0,
      PROTOBUF_FIELD_OFFSET(ServiceOptions, _impl_.features_)}},
    // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
    {::_pbi::TcParser::FastMtR2,
     {16058, 0, 1,
      PROTOBUF_FIELD_OFFSET(ServiceOptions, _impl_.uninterpreted_option_)}},
  }}, {{
    33, 0, 1,
    65532, 0,
    999, 0, 1,
    65534, 2,
    65535, 65535
  }}, {{
    // optional bool deprecated = 33 [default = false];
    {PROTOBUF_FIELD_OFFSET(ServiceOptions, _impl_.deprecated_), _Internal::kHasBitsOffset + 2, 0, (0 | ::_fl::kFcOptional | ::_fl::kBool)},
    // optional .google.protobuf.FeatureSet features = 34;
    {PROTOBUF_FIELD_OFFSET(ServiceOptions, _impl_.features_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)},
    // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
    {PROTOBUF_FIELD_OFFSET(ServiceOptions, _impl_.uninterpreted_option_), _Internal::kHasBitsOffset + 0, 1, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)},
  }},
  {{
      {::_pbi::TcParser::GetTable<::google::protobuf::FeatureSet>()},
      {::_pbi::TcParser::GetTable<::google::protobuf::UninterpretedOption>()},
  }},
  {{
  }},
};
PROTOBUF_NOINLINE void ServiceOptions::Clear() {
// @@protoc_insertion_point(message_clear_start:google.protobuf.ServiceOptions)
  ::google::protobuf::internal::TSanWrite(&_impl_);
  ::uint32_t cached_has_bits = 0;
  // Prevent compiler warnings about cached_has_bits being unused
  (void) cached_has_bits;

  _impl_._extensions_.Clear();
  cached_has_bits = _impl_._has_bits_[0];
  if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) {
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) {
      _impl_.uninterpreted_option_.Clear();
    }
    if (CheckHasBit(cached_has_bits, 0x00000002U)) {
      ABSL_DCHECK(_impl_.features_ != nullptr);
      _impl_.features_->Clear();
    }
  }
  _impl_.deprecated_ = false;
  _impl_._has_bits_.Clear();
  _internal_metadata_.Clear<::google::protobuf::UnknownFieldSet>();
}

#if defined(PROTOBUF_CUSTOM_VTABLE)
::uint8_t* PROTOBUF_NONNULL ServiceOptions::_InternalSerialize(
    const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target,
    ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) {
  const ServiceOptions& this_ = static_cast<const ServiceOptions&>(base);
#else   // PROTOBUF_CUSTOM_VTABLE
::uint8_t* PROTOBUF_NONNULL ServiceOptions::_InternalSerialize(
    ::uint8_t* PROTOBUF_NONNULL target,
    ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const {
  const ServiceOptions& this_ = *this;
#endif  // PROTOBUF_CUSTOM_VTABLE
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    this_.CheckHasBitConsistency();
  }
  // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.ServiceOptions)
  ::uint32_t cached_has_bits = 0;
  (void)cached_has_bits;

  cached_has_bits = this_._impl_._has_bits_[0];
  // optional bool deprecated = 33 [default = false];
  if (CheckHasBit(cached_has_bits, 0x00000004U)) {
    target = stream->EnsureSpace(target);
    target = ::_pbi::WireFormatLite::WriteBoolToArray(
        33, this_._internal_deprecated(), target);
  }

  // optional .google.protobuf.FeatureSet features = 34;
  if (CheckHasBit(cached_has_bits, 0x00000002U)) {
    target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage(
        34, *this_._impl_.features_, this_._impl_.features_->GetCachedSize(), target,
        stream);
  }

  // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
  if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) {
    for (unsigned i = 0, n = static_cast<unsigned>(
                             this_._internal_uninterpreted_option_size());
         i < n; i++) {
      const auto& repfield = this_._internal_uninterpreted_option().Get(i);
      target =
          ::google::protobuf::internal::WireFormatLite::InternalWriteMessage(
              999, repfield, repfield.GetCachedSize(),
              target, stream);
    }
  }

  // All extensions.
  target = this_._impl_._extensions_._InternalSerializeAll(&default_instance(),
                                                    target, stream);
  if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) {
    target =
        ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray(
            this_._internal_metadata_.unknown_fields<::google::protobuf::UnknownFieldSet>(::google::protobuf::UnknownFieldSet::default_instance), target, stream);
  }
  // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.ServiceOptions)
  return target;
}

#if defined(PROTOBUF_CUSTOM_VTABLE)
::size_t ServiceOptions::ByteSizeLong(const MessageLite& base) {
  const ServiceOptions& this_ = static_cast<const ServiceOptions&>(base);
#else   // PROTOBUF_CUSTOM_VTABLE
::size_t ServiceOptions::ByteSizeLong() const {
  const ServiceOptions& this_ = *this;
#endif  // PROTOBUF_CUSTOM_VTABLE
  // @@protoc_insertion_point(message_byte_size_start:google.protobuf.ServiceOptions)
  ::size_t total_size = 0;
  total_size += this_._impl_._extensions_.ByteSize();

  ::uint32_t cached_has_bits = 0;
  // Prevent compiler warnings about cached_has_bits being unused
  (void)cached_has_bits;

  ::_pbi::Prefetch5LinesFrom7Lines(&this_);
  cached_has_bits = this_._impl_._has_bits_[0];
  total_size += static_cast<bool>(0x00000004U & cached_has_bits) * 3;
  if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) {
    // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) {
      total_size += 2UL * this_._internal_uninterpreted_option_size();
      for (const auto& msg : this_._internal_uninterpreted_option()) {
        total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg);
      }
    }
    // optional .google.protobuf.FeatureSet features = 34;
    if (CheckHasBit(cached_has_bits, 0x00000002U)) {
      total_size += 2 +
                    ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.features_);
    }
  }
  return this_.MaybeComputeUnknownFieldsSize(total_size,
                                             &this_._impl_._cached_size_);
}

void ServiceOptions::MergeImpl(::google::protobuf::MessageLite& to_msg,
                            const ::google::protobuf::MessageLite& from_msg) {
   auto* const _this =
      static_cast<ServiceOptions*>(&to_msg);
  auto& from = static_cast<const ServiceOptions&>(from_msg);
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    from.CheckHasBitConsistency();
  }
  ::google::protobuf::Arena* arena = _this->GetArena();
  // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.ServiceOptions)
  ABSL_DCHECK_NE(&from, _this);
  ::uint32_t cached_has_bits = 0;
  (void)cached_has_bits;

  cached_has_bits = from._impl_._has_bits_[0];
  if (BatchCheckHasBit(cached_has_bits, 0x00000007U)) {
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) {
      _this->_internal_mutable_uninterpreted_option()->InternalMergeFromWithArena(
          ::google::protobuf::MessageLite::internal_visibility(), arena,
          from._internal_uninterpreted_option());
    }
    if (CheckHasBit(cached_has_bits, 0x00000002U)) {
      ABSL_DCHECK(from._impl_.features_ != nullptr);
      if (_this->_impl_.features_ == nullptr) {
        _this->_impl_.features_ = ::google::protobuf::Message::CopyConstruct(arena, *from._impl_.features_);
      } else {
        _this->_impl_.features_->MergeFrom(*from._impl_.features_);
      }
    }
    if (CheckHasBit(cached_has_bits, 0x00000004U)) {
      _this->_impl_.deprecated_ = from._impl_.deprecated_;
    }
  }
  _this->_impl_._has_bits_[0] |= cached_has_bits;
  _this->_impl_._extensions_.MergeFrom(&default_instance(),
                                from._impl_._extensions_);
  _this->_internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(
      from._internal_metadata_);
}

void ServiceOptions::CopyFrom(const ServiceOptions& from) {
  // @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.ServiceOptions)
  if (&from == this) return;
  Clear();
  MergeFrom(from);
}

PROTOBUF_NOINLINE bool ServiceOptions::IsInitializedImpl(
    const MessageLite& msg) {
  auto& this_ = static_cast<const ServiceOptions&>(msg);
  if (!this_._impl_._extensions_.IsInitialized(&default_instance())) {
    return false;
  }
  if (!::google::protobuf::internal::AllAreInitialized(this_._internal_uninterpreted_option()))
    return false;
  if (CheckHasBit(this_._impl_._has_bits_[0], 0x00000002U)) {
    if (!this_._impl_.features_->IsInitialized()) return false;
  }
  return true;
}

void ServiceOptions::InternalSwap(ServiceOptions* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) {
  using ::std::swap;
  _impl_._extensions_.InternalSwap(&other->_impl_._extensions_);
  _internal_metadata_.InternalSwap(&other->_internal_metadata_);
  swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]);
  _impl_.uninterpreted_option_.InternalSwap(&other->_impl_.uninterpreted_option_);
  ::google::protobuf::internal::memswap<
      PROTOBUF_FIELD_OFFSET(ServiceOptions, _impl_.deprecated_)
      + sizeof(ServiceOptions::_impl_.deprecated_)
      - PROTOBUF_FIELD_OFFSET(ServiceOptions, _impl_.features_)>(
          reinterpret_cast<char*>(&_impl_.features_),
          reinterpret_cast<char*>(&other->_impl_.features_));
}

::google::protobuf::Metadata ServiceOptions::GetMetadata() const {
  return ::google::protobuf::Message::GetMetadataImpl(GetClassData()->full());
}
// ===================================================================

class MethodOptions::_Internal {
 public:
  using HasBits =
      decltype(::std::declval<MethodOptions>()._impl_._has_bits_);
  static constexpr ::int32_t kHasBitsOffset =
      8 * PROTOBUF_FIELD_OFFSET(MethodOptions, _impl_._has_bits_);
};

MethodOptions::MethodOptions(::google::protobuf::Arena* PROTOBUF_NULLABLE arena)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(arena, MethodOptions_class_data_.base()) {
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(arena) {
#endif  // PROTOBUF_CUSTOM_VTABLE
  SharedCtor(arena);
  // @@protoc_insertion_point(arena_constructor:google.protobuf.MethodOptions)
}
PROTOBUF_NDEBUG_INLINE MethodOptions::Impl_::Impl_(
    [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility,
    [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from,
    [[maybe_unused]] const ::google::protobuf::MethodOptions& from_msg)
      : _extensions_{visibility, arena},
        _has_bits_{from._has_bits_},
        _cached_size_{0},
        uninterpreted_option_{visibility, arena, from.uninterpreted_option_} {}

MethodOptions::MethodOptions(
    ::google::protobuf::Arena* PROTOBUF_NULLABLE arena,
    const MethodOptions& from)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(arena, MethodOptions_class_data_.base()) {
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(arena) {
#endif  // PROTOBUF_CUSTOM_VTABLE
  MethodOptions* const _this = this;
  (void)_this;
  _internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(
      from._internal_metadata_);
  new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from);
  _impl_._extensions_.MergeFrom(this, from._impl_._extensions_);
  ::uint32_t cached_has_bits = _impl_._has_bits_[0];
  _impl_.features_ = (CheckHasBit(cached_has_bits, 0x00000002U))
                ? ::google::protobuf::Message::CopyConstruct(arena, *from._impl_.features_)
                : nullptr;
  ::memcpy(reinterpret_cast<char*>(&_impl_) +
               offsetof(Impl_, deprecated_),
           reinterpret_cast<const char*>(&from._impl_) +
               offsetof(Impl_, deprecated_),
           offsetof(Impl_, idempotency_level_) -
               offsetof(Impl_, deprecated_) +
               sizeof(Impl_::idempotency_level_));

  // @@protoc_insertion_point(copy_constructor:google.protobuf.MethodOptions)
}
PROTOBUF_NDEBUG_INLINE MethodOptions::Impl_::Impl_(
    [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility,
    [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena)
      : _extensions_{visibility, arena},
        _cached_size_{0},
        uninterpreted_option_{visibility, arena} {}

inline void MethodOptions::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) {
  new (&_impl_) Impl_(internal_visibility(), arena);
  ::memset(reinterpret_cast<char*>(&_impl_) +
               offsetof(Impl_, features_),
           0,
           offsetof(Impl_, idempotency_level_) -
               offsetof(Impl_, features_) +
               sizeof(Impl_::idempotency_level_));
}
MethodOptions::~MethodOptions() {
  // @@protoc_insertion_point(destructor:google.protobuf.MethodOptions)
  SharedDtor(*this);
}
inline void MethodOptions::SharedDtor(MessageLite& self) {
  MethodOptions& this_ = static_cast<MethodOptions&>(self);
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    this_.CheckHasBitConsistency();
  }
  this_._internal_metadata_.Delete<::google::protobuf::UnknownFieldSet>();
  ABSL_DCHECK(this_.GetArena() == nullptr);
  delete this_._impl_.features_;
  this_._impl_.~Impl_();
}

inline void* PROTOBUF_NONNULL MethodOptions::PlacementNew_(
    const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem,
    ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) {
  return ::new (mem) MethodOptions(arena);
}
constexpr auto MethodOptions::InternalNewImpl_() {
  constexpr auto arena_bits = ::google::protobuf::internal::EncodePlacementArenaOffsets({
      PROTOBUF_FIELD_OFFSET(MethodOptions, _impl_._extensions_) +
          decltype(MethodOptions::_impl_._extensions_)::InternalGetArenaOffset(
              ::google::protobuf::Message::internal_visibility()),
      PROTOBUF_FIELD_OFFSET(MethodOptions, _impl_.uninterpreted_option_) +
          decltype(MethodOptions::_impl_.uninterpreted_option_)::
              InternalGetArenaOffset(
                  ::google::protobuf::Message::internal_visibility()),
  });
  if (arena_bits.has_value()) {
    return ::google::protobuf::internal::MessageCreator::ZeroInit(
        sizeof(MethodOptions), alignof(MethodOptions), *arena_bits);
  } else {
    return ::google::protobuf::internal::MessageCreator(&MethodOptions::PlacementNew_,
                                 sizeof(MethodOptions),
                                 alignof(MethodOptions));
  }
}
constexpr auto MethodOptions::InternalGenerateClassData_() {
  return ::google::protobuf::internal::ClassDataFull{
      ::google::protobuf::internal::ClassData{
          &_MethodOptions_default_instance_._instance,
          &_table_.header,
          nullptr,  // OnDemandRegisterArenaDtor
          MethodOptions::IsInitializedImpl,
          &MethodOptions::MergeImpl,
          ::google::protobuf::Message::GetNewImpl<MethodOptions>(),
#if defined(PROTOBUF_CUSTOM_VTABLE)
          &MethodOptions::SharedDtor,
          ::google::protobuf::Message::GetClearImpl<MethodOptions>(), &MethodOptions::ByteSizeLong,
              &MethodOptions::_InternalSerialize,
#endif  // PROTOBUF_CUSTOM_VTABLE
          PROTOBUF_FIELD_OFFSET(MethodOptions, _impl_._cached_size_),
          false,
      },
      &MethodOptions::kDescriptorMethods,
      &descriptor_table_google_2fprotobuf_2fdescriptor_2eproto,
      nullptr,  // tracker
  };
}

PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 const
    ::google::protobuf::internal::ClassDataFull MethodOptions_class_data_ =
        MethodOptions::InternalGenerateClassData_();

PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL
MethodOptions::GetClassData() const {
  ::google::protobuf::internal::PrefetchToLocalCache(&MethodOptions_class_data_);
  ::google::protobuf::internal::PrefetchToLocalCache(MethodOptions_class_data_.tc_table);
  return MethodOptions_class_data_.base();
}
constexpr ::_pbi::TcParseTable<3, 4, 3, 0, 12>
MethodOptions::_table_ = {
  {
    PROTOBUF_FIELD_OFFSET(MethodOptions, _impl_._has_bits_),
    PROTOBUF_FIELD_OFFSET(MethodOptions, _impl_._extensions_),
    999, 56,  // max_field_number, fast_idx_mask
    offsetof(decltype(_table_), field_lookup_table),
    4294967295,  // skipmap
    offsetof(decltype(_table_), field_entries),
    4,  // num_field_entries
    3,  // num_aux_entries
    offsetof(decltype(_table_), aux_entries),
    MethodOptions_class_data_.base(),
    nullptr,  // post_loop_handler
    ::_pbi::TcParser::GenericFallback,  // fallback
    #ifdef PROTOBUF_PREFETCH_PARSE_TABLE
    ::_pbi::TcParser::GetTable<::google::protobuf::MethodOptions>(),  // to_prefetch
    #endif  // PROTOBUF_PREFETCH_PARSE_TABLE
  }, {{
    {::_pbi::TcParser::MiniParse, {}},
    // optional bool deprecated = 33 [default = false];
    {::_pbi::TcParser::FastV8S2,
     {648, 2, 0,
      PROTOBUF_FIELD_OFFSET(MethodOptions, _impl_.deprecated_)}},
    // optional .google.protobuf.MethodOptions.IdempotencyLevel idempotency_level = 34 [default = IDEMPOTENCY_UNKNOWN];
    {::_pbi::TcParser::FastEr0S2,
     {656, 3, 2,
      PROTOBUF_FIELD_OFFSET(MethodOptions, _impl_.idempotency_level_)}},
    // optional .google.protobuf.FeatureSet features = 35;
    {::_pbi::TcParser::FastMtS2,
     {666, 1, 0,
      PROTOBUF_FIELD_OFFSET(MethodOptions, _impl_.features_)}},
    {::_pbi::TcParser::MiniParse, {}},
    {::_pbi::TcParser::MiniParse, {}},
    {::_pbi::TcParser::MiniParse, {}},
    // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
    {::_pbi::TcParser::FastMtR2,
     {16058, 0, 1,
      PROTOBUF_FIELD_OFFSET(MethodOptions, _impl_.uninterpreted_option_)}},
  }}, {{
    33, 0, 1,
    65528, 0,
    999, 0, 1,
    65534, 3,
    65535, 65535
  }}, {{
    // optional bool deprecated = 33 [default = false];
    {PROTOBUF_FIELD_OFFSET(MethodOptions, _impl_.deprecated_), _Internal::kHasBitsOffset + 2, 0, (0 | ::_fl::kFcOptional | ::_fl::kBool)},
    // optional .google.protobuf.MethodOptions.IdempotencyLevel idempotency_level = 34 [default = IDEMPOTENCY_UNKNOWN];
    {PROTOBUF_FIELD_OFFSET(MethodOptions, _impl_.idempotency_level_), _Internal::kHasBitsOffset + 3, 2, (0 | ::_fl::kFcOptional | ::_fl::kEnumRange)},
    // optional .google.protobuf.FeatureSet features = 35;
    {PROTOBUF_FIELD_OFFSET(MethodOptions, _impl_.features_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)},
    // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
    {PROTOBUF_FIELD_OFFSET(MethodOptions, _impl_.uninterpreted_option_), _Internal::kHasBitsOffset + 0, 1, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)},
  }},
  {{
      {::_pbi::TcParser::GetTable<::google::protobuf::FeatureSet>()},
      {::_pbi::TcParser::GetTable<::google::protobuf::UninterpretedOption>()},
      {0, 2},
  }},
  {{
  }},
};
PROTOBUF_NOINLINE void MethodOptions::Clear() {
// @@protoc_insertion_point(message_clear_start:google.protobuf.MethodOptions)
  ::google::protobuf::internal::TSanWrite(&_impl_);
  ::uint32_t cached_has_bits = 0;
  // Prevent compiler warnings about cached_has_bits being unused
  (void) cached_has_bits;

  _impl_._extensions_.Clear();
  cached_has_bits = _impl_._has_bits_[0];
  if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) {
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) {
      _impl_.uninterpreted_option_.Clear();
    }
    if (CheckHasBit(cached_has_bits, 0x00000002U)) {
      ABSL_DCHECK(_impl_.features_ != nullptr);
      _impl_.features_->Clear();
    }
  }
  if (BatchCheckHasBit(cached_has_bits, 0x0000000cU)) {
    ::memset(&_impl_.deprecated_, 0, static_cast<::size_t>(
        reinterpret_cast<char*>(&_impl_.idempotency_level_) -
        reinterpret_cast<char*>(&_impl_.deprecated_)) + sizeof(_impl_.idempotency_level_));
  }
  _impl_._has_bits_.Clear();
  _internal_metadata_.Clear<::google::protobuf::UnknownFieldSet>();
}

#if defined(PROTOBUF_CUSTOM_VTABLE)
::uint8_t* PROTOBUF_NONNULL MethodOptions::_InternalSerialize(
    const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target,
    ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) {
  const MethodOptions& this_ = static_cast<const MethodOptions&>(base);
#else   // PROTOBUF_CUSTOM_VTABLE
::uint8_t* PROTOBUF_NONNULL MethodOptions::_InternalSerialize(
    ::uint8_t* PROTOBUF_NONNULL target,
    ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const {
  const MethodOptions& this_ = *this;
#endif  // PROTOBUF_CUSTOM_VTABLE
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    this_.CheckHasBitConsistency();
  }
  // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.MethodOptions)
  ::uint32_t cached_has_bits = 0;
  (void)cached_has_bits;

  cached_has_bits = this_._impl_._has_bits_[0];
  // optional bool deprecated = 33 [default = false];
  if (CheckHasBit(cached_has_bits, 0x00000004U)) {
    target = stream->EnsureSpace(target);
    target = ::_pbi::WireFormatLite::WriteBoolToArray(
        33, this_._internal_deprecated(), target);
  }

  // optional .google.protobuf.MethodOptions.IdempotencyLevel idempotency_level = 34 [default = IDEMPOTENCY_UNKNOWN];
  if (CheckHasBit(cached_has_bits, 0x00000008U)) {
    target = stream->EnsureSpace(target);
    target = ::_pbi::WireFormatLite::WriteEnumToArray(
        34, this_._internal_idempotency_level(), target);
  }

  // optional .google.protobuf.FeatureSet features = 35;
  if (CheckHasBit(cached_has_bits, 0x00000002U)) {
    target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage(
        35, *this_._impl_.features_, this_._impl_.features_->GetCachedSize(), target,
        stream);
  }

  // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
  if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) {
    for (unsigned i = 0, n = static_cast<unsigned>(
                             this_._internal_uninterpreted_option_size());
         i < n; i++) {
      const auto& repfield = this_._internal_uninterpreted_option().Get(i);
      target =
          ::google::protobuf::internal::WireFormatLite::InternalWriteMessage(
              999, repfield, repfield.GetCachedSize(),
              target, stream);
    }
  }

  // All extensions.
  target = this_._impl_._extensions_._InternalSerializeAll(&default_instance(),
                                                    target, stream);
  if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) {
    target =
        ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray(
            this_._internal_metadata_.unknown_fields<::google::protobuf::UnknownFieldSet>(::google::protobuf::UnknownFieldSet::default_instance), target, stream);
  }
  // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.MethodOptions)
  return target;
}

#if defined(PROTOBUF_CUSTOM_VTABLE)
::size_t MethodOptions::ByteSizeLong(const MessageLite& base) {
  const MethodOptions& this_ = static_cast<const MethodOptions&>(base);
#else   // PROTOBUF_CUSTOM_VTABLE
::size_t MethodOptions::ByteSizeLong() const {
  const MethodOptions& this_ = *this;
#endif  // PROTOBUF_CUSTOM_VTABLE
  // @@protoc_insertion_point(message_byte_size_start:google.protobuf.MethodOptions)
  ::size_t total_size = 0;
  total_size += this_._impl_._extensions_.ByteSize();

  ::uint32_t cached_has_bits = 0;
  // Prevent compiler warnings about cached_has_bits being unused
  (void)cached_has_bits;

  ::_pbi::Prefetch5LinesFrom7Lines(&this_);
  cached_has_bits = this_._impl_._has_bits_[0];
  total_size += static_cast<bool>(0x00000004U & cached_has_bits) * 3;
  if (BatchCheckHasBit(cached_has_bits, 0x0000000bU)) {
    // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) {
      total_size += 2UL * this_._internal_uninterpreted_option_size();
      for (const auto& msg : this_._internal_uninterpreted_option()) {
        total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg);
      }
    }
    // optional .google.protobuf.FeatureSet features = 35;
    if (CheckHasBit(cached_has_bits, 0x00000002U)) {
      total_size += 2 +
                    ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.features_);
    }
    // optional .google.protobuf.MethodOptions.IdempotencyLevel idempotency_level = 34 [default = IDEMPOTENCY_UNKNOWN];
    if (CheckHasBit(cached_has_bits, 0x00000008U)) {
      total_size += 2 +
                    ::_pbi::WireFormatLite::EnumSize(this_._internal_idempotency_level());
    }
  }
  return this_.MaybeComputeUnknownFieldsSize(total_size,
                                             &this_._impl_._cached_size_);
}

void MethodOptions::MergeImpl(::google::protobuf::MessageLite& to_msg,
                            const ::google::protobuf::MessageLite& from_msg) {
   auto* const _this =
      static_cast<MethodOptions*>(&to_msg);
  auto& from = static_cast<const MethodOptions&>(from_msg);
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    from.CheckHasBitConsistency();
  }
  ::google::protobuf::Arena* arena = _this->GetArena();
  // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.MethodOptions)
  ABSL_DCHECK_NE(&from, _this);
  ::uint32_t cached_has_bits = 0;
  (void)cached_has_bits;

  cached_has_bits = from._impl_._has_bits_[0];
  if (BatchCheckHasBit(cached_has_bits, 0x0000000fU)) {
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) {
      _this->_internal_mutable_uninterpreted_option()->InternalMergeFromWithArena(
          ::google::protobuf::MessageLite::internal_visibility(), arena,
          from._internal_uninterpreted_option());
    }
    if (CheckHasBit(cached_has_bits, 0x00000002U)) {
      ABSL_DCHECK(from._impl_.features_ != nullptr);
      if (_this->_impl_.features_ == nullptr) {
        _this->_impl_.features_ = ::google::protobuf::Message::CopyConstruct(arena, *from._impl_.features_);
      } else {
        _this->_impl_.features_->MergeFrom(*from._impl_.features_);
      }
    }
    if (CheckHasBit(cached_has_bits, 0x00000004U)) {
      _this->_impl_.deprecated_ = from._impl_.deprecated_;
    }
    if (CheckHasBit(cached_has_bits, 0x00000008U)) {
      _this->_impl_.idempotency_level_ = from._impl_.idempotency_level_;
    }
  }
  _this->_impl_._has_bits_[0] |= cached_has_bits;
  _this->_impl_._extensions_.MergeFrom(&default_instance(),
                                from._impl_._extensions_);
  _this->_internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(
      from._internal_metadata_);
}

void MethodOptions::CopyFrom(const MethodOptions& from) {
  // @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.MethodOptions)
  if (&from == this) return;
  Clear();
  MergeFrom(from);
}

PROTOBUF_NOINLINE bool MethodOptions::IsInitializedImpl(
    const MessageLite& msg) {
  auto& this_ = static_cast<const MethodOptions&>(msg);
  if (!this_._impl_._extensions_.IsInitialized(&default_instance())) {
    return false;
  }
  if (!::google::protobuf::internal::AllAreInitialized(this_._internal_uninterpreted_option()))
    return false;
  if (CheckHasBit(this_._impl_._has_bits_[0], 0x00000002U)) {
    if (!this_._impl_.features_->IsInitialized()) return false;
  }
  return true;
}

void MethodOptions::InternalSwap(MethodOptions* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) {
  using ::std::swap;
  _impl_._extensions_.InternalSwap(&other->_impl_._extensions_);
  _internal_metadata_.InternalSwap(&other->_internal_metadata_);
  swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]);
  _impl_.uninterpreted_option_.InternalSwap(&other->_impl_.uninterpreted_option_);
  ::google::protobuf::internal::memswap<
      PROTOBUF_FIELD_OFFSET(MethodOptions, _impl_.idempotency_level_)
      + sizeof(MethodOptions::_impl_.idempotency_level_)
      - PROTOBUF_FIELD_OFFSET(MethodOptions, _impl_.features_)>(
          reinterpret_cast<char*>(&_impl_.features_),
          reinterpret_cast<char*>(&other->_impl_.features_));
}

::google::protobuf::Metadata MethodOptions::GetMetadata() const {
  return ::google::protobuf::Message::GetMetadataImpl(GetClassData()->full());
}
// ===================================================================

class UninterpretedOption_NamePart::_Internal {
 public:
  using HasBits =
      decltype(::std::declval<UninterpretedOption_NamePart>()._impl_._has_bits_);
  static constexpr ::int32_t kHasBitsOffset =
      8 * PROTOBUF_FIELD_OFFSET(UninterpretedOption_NamePart, _impl_._has_bits_);
  static bool MissingRequiredFields(const HasBits& has_bits) {
    return ((has_bits[0] & 0x00000003) ^ 0x00000003) != 0;
  }
};

UninterpretedOption_NamePart::UninterpretedOption_NamePart(::google::protobuf::Arena* PROTOBUF_NULLABLE arena)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(arena, UninterpretedOption_NamePart_class_data_.base()) {
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(arena) {
#endif  // PROTOBUF_CUSTOM_VTABLE
  SharedCtor(arena);
  // @@protoc_insertion_point(arena_constructor:google.protobuf.UninterpretedOption.NamePart)
}
PROTOBUF_NDEBUG_INLINE UninterpretedOption_NamePart::Impl_::Impl_(
    [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility,
    [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from,
    [[maybe_unused]] const ::google::protobuf::UninterpretedOption_NamePart& from_msg)
      : _has_bits_{from._has_bits_},
        _cached_size_{0},
        name_part_(arena, from.name_part_) {}

UninterpretedOption_NamePart::UninterpretedOption_NamePart(
    ::google::protobuf::Arena* PROTOBUF_NULLABLE arena,
    const UninterpretedOption_NamePart& from)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(arena, UninterpretedOption_NamePart_class_data_.base()) {
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(arena) {
#endif  // PROTOBUF_CUSTOM_VTABLE
  UninterpretedOption_NamePart* const _this = this;
  (void)_this;
  _internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(
      from._internal_metadata_);
  new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from);
  _impl_.is_extension_ = from._impl_.is_extension_;

  // @@protoc_insertion_point(copy_constructor:google.protobuf.UninterpretedOption.NamePart)
}
PROTOBUF_NDEBUG_INLINE UninterpretedOption_NamePart::Impl_::Impl_(
    [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility,
    [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena)
      : _cached_size_{0},
        name_part_(arena) {}

inline void UninterpretedOption_NamePart::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) {
  new (&_impl_) Impl_(internal_visibility(), arena);
  _impl_.is_extension_ = {};
}
UninterpretedOption_NamePart::~UninterpretedOption_NamePart() {
  // @@protoc_insertion_point(destructor:google.protobuf.UninterpretedOption.NamePart)
  SharedDtor(*this);
}
inline void UninterpretedOption_NamePart::SharedDtor(MessageLite& self) {
  UninterpretedOption_NamePart& this_ = static_cast<UninterpretedOption_NamePart&>(self);
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    this_.CheckHasBitConsistency();
  }
  this_._internal_metadata_.Delete<::google::protobuf::UnknownFieldSet>();
  ABSL_DCHECK(this_.GetArena() == nullptr);
  this_._impl_.name_part_.Destroy();
  this_._impl_.~Impl_();
}

inline void* PROTOBUF_NONNULL UninterpretedOption_NamePart::PlacementNew_(
    const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem,
    ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) {
  return ::new (mem) UninterpretedOption_NamePart(arena);
}
constexpr auto UninterpretedOption_NamePart::InternalNewImpl_() {
  return ::google::protobuf::internal::MessageCreator::CopyInit(sizeof(UninterpretedOption_NamePart),
                                            alignof(UninterpretedOption_NamePart));
}
constexpr auto UninterpretedOption_NamePart::InternalGenerateClassData_() {
  return ::google::protobuf::internal::ClassDataFull{
      ::google::protobuf::internal::ClassData{
          &_UninterpretedOption_NamePart_default_instance_._instance,
          &_table_.header,
          nullptr,  // OnDemandRegisterArenaDtor
          UninterpretedOption_NamePart::IsInitializedImpl,
          &UninterpretedOption_NamePart::MergeImpl,
          ::google::protobuf::Message::GetNewImpl<UninterpretedOption_NamePart>(),
#if defined(PROTOBUF_CUSTOM_VTABLE)
          &UninterpretedOption_NamePart::SharedDtor,
          ::google::protobuf::Message::GetClearImpl<UninterpretedOption_NamePart>(), &UninterpretedOption_NamePart::ByteSizeLong,
              &UninterpretedOption_NamePart::_InternalSerialize,
#endif  // PROTOBUF_CUSTOM_VTABLE
          PROTOBUF_FIELD_OFFSET(UninterpretedOption_NamePart, _impl_._cached_size_),
          false,
      },
      &UninterpretedOption_NamePart::kDescriptorMethods,
      &descriptor_table_google_2fprotobuf_2fdescriptor_2eproto,
      nullptr,  // tracker
  };
}

PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 const
    ::google::protobuf::internal::ClassDataFull UninterpretedOption_NamePart_class_data_ =
        UninterpretedOption_NamePart::InternalGenerateClassData_();

PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL
UninterpretedOption_NamePart::GetClassData() const {
  ::google::protobuf::internal::PrefetchToLocalCache(&UninterpretedOption_NamePart_class_data_);
  ::google::protobuf::internal::PrefetchToLocalCache(UninterpretedOption_NamePart_class_data_.tc_table);
  return UninterpretedOption_NamePart_class_data_.base();
}
constexpr ::_pbi::TcParseTable<1, 2, 0, 0, 2>
UninterpretedOption_NamePart::_table_ = {
  {
    PROTOBUF_FIELD_OFFSET(UninterpretedOption_NamePart, _impl_._has_bits_),
    0, // no _extensions_
    2, 8,  // max_field_number, fast_idx_mask
    offsetof(decltype(_table_), field_lookup_table),
    4294967292,  // skipmap
    offsetof(decltype(_table_), field_entries),
    2,  // num_field_entries
    0,  // num_aux_entries
    offsetof(decltype(_table_), field_names),  // no aux_entries
    UninterpretedOption_NamePart_class_data_.base(),
    nullptr,  // post_loop_handler
    ::_pbi::TcParser::GenericFallback,  // fallback
    #ifdef PROTOBUF_PREFETCH_PARSE_TABLE
    ::_pbi::TcParser::GetTable<::google::protobuf::UninterpretedOption_NamePart>(),  // to_prefetch
    #endif  // PROTOBUF_PREFETCH_PARSE_TABLE
  }, {{
    // required bool is_extension = 2;
    {::_pbi::TcParser::SingularVarintNoZag1<bool, offsetof(UninterpretedOption_NamePart, _impl_.is_extension_), 1>(),
     {16, 1, 0,
      PROTOBUF_FIELD_OFFSET(UninterpretedOption_NamePart, _impl_.is_extension_)}},
    // required string name_part = 1;
    {::_pbi::TcParser::FastBS1,
     {10, 0, 0,
      PROTOBUF_FIELD_OFFSET(UninterpretedOption_NamePart, _impl_.name_part_)}},
  }}, {{
    65535, 65535
  }}, {{
    // required string name_part = 1;
    {PROTOBUF_FIELD_OFFSET(UninterpretedOption_NamePart, _impl_.name_part_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcOptional | ::_fl::kBytes | ::_fl::kRepAString)},
    // required bool is_extension = 2;
    {PROTOBUF_FIELD_OFFSET(UninterpretedOption_NamePart, _impl_.is_extension_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kBool)},
  }},
  // no aux_entries
  {{
  }},
};
PROTOBUF_NOINLINE void UninterpretedOption_NamePart::Clear() {
// @@protoc_insertion_point(message_clear_start:google.protobuf.UninterpretedOption.NamePart)
  ::google::protobuf::internal::TSanWrite(&_impl_);
  ::uint32_t cached_has_bits = 0;
  // Prevent compiler warnings about cached_has_bits being unused
  (void) cached_has_bits;

  cached_has_bits = _impl_._has_bits_[0];
  if (CheckHasBit(cached_has_bits, 0x00000001U)) {
    _impl_.name_part_.ClearNonDefaultToEmpty();
  }
  _impl_.is_extension_ = false;
  _impl_._has_bits_.Clear();
  _internal_metadata_.Clear<::google::protobuf::UnknownFieldSet>();
}

#if defined(PROTOBUF_CUSTOM_VTABLE)
::uint8_t* PROTOBUF_NONNULL UninterpretedOption_NamePart::_InternalSerialize(
    const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target,
    ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) {
  const UninterpretedOption_NamePart& this_ = static_cast<const UninterpretedOption_NamePart&>(base);
#else   // PROTOBUF_CUSTOM_VTABLE
::uint8_t* PROTOBUF_NONNULL UninterpretedOption_NamePart::_InternalSerialize(
    ::uint8_t* PROTOBUF_NONNULL target,
    ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const {
  const UninterpretedOption_NamePart& this_ = *this;
#endif  // PROTOBUF_CUSTOM_VTABLE
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    this_.CheckHasBitConsistency();
  }
  // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.UninterpretedOption.NamePart)
  ::uint32_t cached_has_bits = 0;
  (void)cached_has_bits;

  cached_has_bits = this_._impl_._has_bits_[0];
  // required string name_part = 1;
  if (CheckHasBit(cached_has_bits, 0x00000001U)) {
    const ::std::string& _s = this_._internal_name_part();
    target = stream->WriteStringMaybeAliased(1, _s, target);
  }

  // required bool is_extension = 2;
  if (CheckHasBit(cached_has_bits, 0x00000002U)) {
    target = stream->EnsureSpace(target);
    target = ::_pbi::WireFormatLite::WriteBoolToArray(
        2, this_._internal_is_extension(), target);
  }

  if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) {
    target =
        ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray(
            this_._internal_metadata_.unknown_fields<::google::protobuf::UnknownFieldSet>(::google::protobuf::UnknownFieldSet::default_instance), target, stream);
  }
  // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.UninterpretedOption.NamePart)
  return target;
}

#if defined(PROTOBUF_CUSTOM_VTABLE)
::size_t UninterpretedOption_NamePart::ByteSizeLong(const MessageLite& base) {
  const UninterpretedOption_NamePart& this_ = static_cast<const UninterpretedOption_NamePart&>(base);
#else   // PROTOBUF_CUSTOM_VTABLE
::size_t UninterpretedOption_NamePart::ByteSizeLong() const {
  const UninterpretedOption_NamePart& this_ = *this;
#endif  // PROTOBUF_CUSTOM_VTABLE
  // @@protoc_insertion_point(message_byte_size_start:google.protobuf.UninterpretedOption.NamePart)
  ::size_t total_size = 0;

  ::uint32_t cached_has_bits = 0;
  // Prevent compiler warnings about cached_has_bits being unused
  (void)cached_has_bits;

  ::_pbi::Prefetch5LinesFrom7Lines(&this_);
  cached_has_bits = this_._impl_._has_bits_[0];
  total_size += static_cast<bool>(0x00000002U & cached_has_bits) * 2;
   {
    // required string name_part = 1;
    if (CheckHasBit(cached_has_bits, 0x00000001U)) {
      total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize(
                                      this_._internal_name_part());
    }
  }
  return this_.MaybeComputeUnknownFieldsSize(total_size,
                                             &this_._impl_._cached_size_);
}

void UninterpretedOption_NamePart::MergeImpl(::google::protobuf::MessageLite& to_msg,
                            const ::google::protobuf::MessageLite& from_msg) {
   auto* const _this =
      static_cast<UninterpretedOption_NamePart*>(&to_msg);
  auto& from = static_cast<const UninterpretedOption_NamePart&>(from_msg);
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    from.CheckHasBitConsistency();
  }
  // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.UninterpretedOption.NamePart)
  ABSL_DCHECK_NE(&from, _this);
  ::uint32_t cached_has_bits = 0;
  (void)cached_has_bits;

  cached_has_bits = from._impl_._has_bits_[0];
  if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) {
    if (CheckHasBit(cached_has_bits, 0x00000001U)) {
      _this->_internal_set_name_part(from._internal_name_part());
    }
    if (CheckHasBit(cached_has_bits, 0x00000002U)) {
      _this->_impl_.is_extension_ = from._impl_.is_extension_;
    }
  }
  _this->_impl_._has_bits_[0] |= cached_has_bits;
  _this->_internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(
      from._internal_metadata_);
}

void UninterpretedOption_NamePart::CopyFrom(const UninterpretedOption_NamePart& from) {
  // @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.UninterpretedOption.NamePart)
  if (&from == this) return;
  Clear();
  MergeFrom(from);
}

PROTOBUF_NOINLINE bool UninterpretedOption_NamePart::IsInitializedImpl(
    const MessageLite& msg) {
  auto& this_ = static_cast<const UninterpretedOption_NamePart&>(msg);
  if (_Internal::MissingRequiredFields(this_._impl_._has_bits_)) {
    return false;
  }
  return true;
}

void UninterpretedOption_NamePart::InternalSwap(UninterpretedOption_NamePart* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) {
  using ::std::swap;
  auto* arena = GetArena();
  ABSL_DCHECK_EQ(arena, other->GetArena());
  _internal_metadata_.InternalSwap(&other->_internal_metadata_);
  swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]);
  ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.name_part_, &other->_impl_.name_part_, arena);
  swap(_impl_.is_extension_, other->_impl_.is_extension_);
}

::google::protobuf::Metadata UninterpretedOption_NamePart::GetMetadata() const {
  return ::google::protobuf::Message::GetMetadataImpl(GetClassData()->full());
}
// ===================================================================

class UninterpretedOption::_Internal {
 public:
  using HasBits =
      decltype(::std::declval<UninterpretedOption>()._impl_._has_bits_);
  static constexpr ::int32_t kHasBitsOffset =
      8 * PROTOBUF_FIELD_OFFSET(UninterpretedOption, _impl_._has_bits_);
};

UninterpretedOption::UninterpretedOption(::google::protobuf::Arena* PROTOBUF_NULLABLE arena)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(arena, UninterpretedOption_class_data_.base()) {
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(arena) {
#endif  // PROTOBUF_CUSTOM_VTABLE
  SharedCtor(arena);
  // @@protoc_insertion_point(arena_constructor:google.protobuf.UninterpretedOption)
}
PROTOBUF_NDEBUG_INLINE UninterpretedOption::Impl_::Impl_(
    [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility,
    [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from,
    [[maybe_unused]] const ::google::protobuf::UninterpretedOption& from_msg)
      : _has_bits_{from._has_bits_},
        _cached_size_{0},
        name_{visibility, arena, from.name_},
        identifier_value_(arena, from.identifier_value_),
        string_value_(arena, from.string_value_),
        aggregate_value_(arena, from.aggregate_value_) {}

UninterpretedOption::UninterpretedOption(
    ::google::protobuf::Arena* PROTOBUF_NULLABLE arena,
    const UninterpretedOption& from)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(arena, UninterpretedOption_class_data_.base()) {
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(arena) {
#endif  // PROTOBUF_CUSTOM_VTABLE
  UninterpretedOption* const _this = this;
  (void)_this;
  _internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(
      from._internal_metadata_);
  new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from);
  ::memcpy(reinterpret_cast<char*>(&_impl_) +
               offsetof(Impl_, positive_int_value_),
           reinterpret_cast<const char*>(&from._impl_) +
               offsetof(Impl_, positive_int_value_),
           offsetof(Impl_, double_value_) -
               offsetof(Impl_, positive_int_value_) +
               sizeof(Impl_::double_value_));

  // @@protoc_insertion_point(copy_constructor:google.protobuf.UninterpretedOption)
}
PROTOBUF_NDEBUG_INLINE UninterpretedOption::Impl_::Impl_(
    [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility,
    [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena)
      : _cached_size_{0},
        name_{visibility, arena},
        identifier_value_(arena),
        string_value_(arena),
        aggregate_value_(arena) {}

inline void UninterpretedOption::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) {
  new (&_impl_) Impl_(internal_visibility(), arena);
  ::memset(reinterpret_cast<char*>(&_impl_) +
               offsetof(Impl_, positive_int_value_),
           0,
           offsetof(Impl_, double_value_) -
               offsetof(Impl_, positive_int_value_) +
               sizeof(Impl_::double_value_));
}
UninterpretedOption::~UninterpretedOption() {
  // @@protoc_insertion_point(destructor:google.protobuf.UninterpretedOption)
  SharedDtor(*this);
}
inline void UninterpretedOption::SharedDtor(MessageLite& self) {
  UninterpretedOption& this_ = static_cast<UninterpretedOption&>(self);
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    this_.CheckHasBitConsistency();
  }
  this_._internal_metadata_.Delete<::google::protobuf::UnknownFieldSet>();
  ABSL_DCHECK(this_.GetArena() == nullptr);
  this_._impl_.identifier_value_.Destroy();
  this_._impl_.string_value_.Destroy();
  this_._impl_.aggregate_value_.Destroy();
  this_._impl_.~Impl_();
}

inline void* PROTOBUF_NONNULL UninterpretedOption::PlacementNew_(
    const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem,
    ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) {
  return ::new (mem) UninterpretedOption(arena);
}
constexpr auto UninterpretedOption::InternalNewImpl_() {
  constexpr auto arena_bits = ::google::protobuf::internal::EncodePlacementArenaOffsets({
      PROTOBUF_FIELD_OFFSET(UninterpretedOption, _impl_.name_) +
          decltype(UninterpretedOption::_impl_.name_)::
              InternalGetArenaOffset(
                  ::google::protobuf::Message::internal_visibility()),
  });
  if (arena_bits.has_value()) {
    return ::google::protobuf::internal::MessageCreator::CopyInit(
        sizeof(UninterpretedOption), alignof(UninterpretedOption), *arena_bits);
  } else {
    return ::google::protobuf::internal::MessageCreator(&UninterpretedOption::PlacementNew_,
                                 sizeof(UninterpretedOption),
                                 alignof(UninterpretedOption));
  }
}
constexpr auto UninterpretedOption::InternalGenerateClassData_() {
  return ::google::protobuf::internal::ClassDataFull{
      ::google::protobuf::internal::ClassData{
          &_UninterpretedOption_default_instance_._instance,
          &_table_.header,
          nullptr,  // OnDemandRegisterArenaDtor
          UninterpretedOption::IsInitializedImpl,
          &UninterpretedOption::MergeImpl,
          ::google::protobuf::Message::GetNewImpl<UninterpretedOption>(),
#if defined(PROTOBUF_CUSTOM_VTABLE)
          &UninterpretedOption::SharedDtor,
          ::google::protobuf::Message::GetClearImpl<UninterpretedOption>(), &UninterpretedOption::ByteSizeLong,
              &UninterpretedOption::_InternalSerialize,
#endif  // PROTOBUF_CUSTOM_VTABLE
          PROTOBUF_FIELD_OFFSET(UninterpretedOption, _impl_._cached_size_),
          false,
      },
      &UninterpretedOption::kDescriptorMethods,
      &descriptor_table_google_2fprotobuf_2fdescriptor_2eproto,
      nullptr,  // tracker
  };
}

PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 const
    ::google::protobuf::internal::ClassDataFull UninterpretedOption_class_data_ =
        UninterpretedOption::InternalGenerateClassData_();

PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL
UninterpretedOption::GetClassData() const {
  ::google::protobuf::internal::PrefetchToLocalCache(&UninterpretedOption_class_data_);
  ::google::protobuf::internal::PrefetchToLocalCache(UninterpretedOption_class_data_.tc_table);
  return UninterpretedOption_class_data_.base();
}
constexpr ::_pbi::TcParseTable<3, 7, 1, 0, 2>
UninterpretedOption::_table_ = {
  {
    PROTOBUF_FIELD_OFFSET(UninterpretedOption, _impl_._has_bits_),
    0, // no _extensions_
    8, 56,  // max_field_number, fast_idx_mask
    offsetof(decltype(_table_), field_lookup_table),
    4294967041,  // skipmap
    offsetof(decltype(_table_), field_entries),
    7,  // num_field_entries
    1,  // num_aux_entries
    offsetof(decltype(_table_), aux_entries),
    UninterpretedOption_class_data_.base(),
    nullptr,  // post_loop_handler
    ::_pbi::TcParser::GenericFallback,  // fallback
    #ifdef PROTOBUF_PREFETCH_PARSE_TABLE
    ::_pbi::TcParser::GetTable<::google::protobuf::UninterpretedOption>(),  // to_prefetch
    #endif  // PROTOBUF_PREFETCH_PARSE_TABLE
  }, {{
    // optional string aggregate_value = 8;
    {::_pbi::TcParser::FastBS1,
     {66, 3, 0,
      PROTOBUF_FIELD_OFFSET(UninterpretedOption, _impl_.aggregate_value_)}},
    {::_pbi::TcParser::MiniParse, {}},
    // repeated .google.protobuf.UninterpretedOption.NamePart name = 2;
    {::_pbi::TcParser::FastMtR1,
     {18, 0, 0,
      PROTOBUF_FIELD_OFFSET(UninterpretedOption, _impl_.name_)}},
    // optional string identifier_value = 3;
    {::_pbi::TcParser::FastBS1,
     {26, 1, 0,
      PROTOBUF_FIELD_OFFSET(UninterpretedOption, _impl_.identifier_value_)}},
    // optional uint64 positive_int_value = 4;
    {::_pbi::TcParser::SingularVarintNoZag1<::uint64_t, offsetof(UninterpretedOption, _impl_.positive_int_value_), 4>(),
     {32, 4, 0,
      PROTOBUF_FIELD_OFFSET(UninterpretedOption, _impl_.positive_int_value_)}},
    // optional int64 negative_int_value = 5;
    {::_pbi::TcParser::SingularVarintNoZag1<::uint64_t, offsetof(UninterpretedOption, _impl_.negative_int_value_), 5>(),
     {40, 5, 0,
      PROTOBUF_FIELD_OFFSET(UninterpretedOption, _impl_.negative_int_value_)}},
    // optional double double_value = 6;
    {::_pbi::TcParser::FastF64S1,
     {49, 6, 0,
      PROTOBUF_FIELD_OFFSET(UninterpretedOption, _impl_.double_value_)}},
    // optional bytes string_value = 7;
    {::_pbi::TcParser::FastBS1,
     {58, 2, 0,
      PROTOBUF_FIELD_OFFSET(UninterpretedOption, _impl_.string_value_)}},
  }}, {{
    65535, 65535
  }}, {{
    // repeated .google.protobuf.UninterpretedOption.NamePart name = 2;
    {PROTOBUF_FIELD_OFFSET(UninterpretedOption, _impl_.name_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)},
    // optional string identifier_value = 3;
    {PROTOBUF_FIELD_OFFSET(UninterpretedOption, _impl_.identifier_value_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kBytes | ::_fl::kRepAString)},
    // optional uint64 positive_int_value = 4;
    {PROTOBUF_FIELD_OFFSET(UninterpretedOption, _impl_.positive_int_value_), _Internal::kHasBitsOffset + 4, 0, (0 | ::_fl::kFcOptional | ::_fl::kUInt64)},
    // optional int64 negative_int_value = 5;
    {PROTOBUF_FIELD_OFFSET(UninterpretedOption, _impl_.negative_int_value_), _Internal::kHasBitsOffset + 5, 0, (0 | ::_fl::kFcOptional | ::_fl::kInt64)},
    // optional double double_value = 6;
    {PROTOBUF_FIELD_OFFSET(UninterpretedOption, _impl_.double_value_), _Internal::kHasBitsOffset + 6, 0, (0 | ::_fl::kFcOptional | ::_fl::kDouble)},
    // optional bytes string_value = 7;
    {PROTOBUF_FIELD_OFFSET(UninterpretedOption, _impl_.string_value_), _Internal::kHasBitsOffset + 2, 0, (0 | ::_fl::kFcOptional | ::_fl::kBytes | ::_fl::kRepAString)},
    // optional string aggregate_value = 8;
    {PROTOBUF_FIELD_OFFSET(UninterpretedOption, _impl_.aggregate_value_), _Internal::kHasBitsOffset + 3, 0, (0 | ::_fl::kFcOptional | ::_fl::kBytes | ::_fl::kRepAString)},
  }},
  {{
      {::_pbi::TcParser::GetTable<::google::protobuf::UninterpretedOption_NamePart>()},
  }},
  {{
  }},
};
PROTOBUF_NOINLINE void UninterpretedOption::Clear() {
// @@protoc_insertion_point(message_clear_start:google.protobuf.UninterpretedOption)
  ::google::protobuf::internal::TSanWrite(&_impl_);
  ::uint32_t cached_has_bits = 0;
  // Prevent compiler warnings about cached_has_bits being unused
  (void) cached_has_bits;

  cached_has_bits = _impl_._has_bits_[0];
  if (BatchCheckHasBit(cached_has_bits, 0x0000000fU)) {
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) {
      _impl_.name_.Clear();
    }
    if (CheckHasBit(cached_has_bits, 0x00000002U)) {
      _impl_.identifier_value_.ClearNonDefaultToEmpty();
    }
    if (CheckHasBit(cached_has_bits, 0x00000004U)) {
      _impl_.string_value_.ClearNonDefaultToEmpty();
    }
    if (CheckHasBit(cached_has_bits, 0x00000008U)) {
      _impl_.aggregate_value_.ClearNonDefaultToEmpty();
    }
  }
  if (BatchCheckHasBit(cached_has_bits, 0x00000070U)) {
    ::memset(&_impl_.positive_int_value_, 0, static_cast<::size_t>(
        reinterpret_cast<char*>(&_impl_.double_value_) -
        reinterpret_cast<char*>(&_impl_.positive_int_value_)) + sizeof(_impl_.double_value_));
  }
  _impl_._has_bits_.Clear();
  _internal_metadata_.Clear<::google::protobuf::UnknownFieldSet>();
}

#if defined(PROTOBUF_CUSTOM_VTABLE)
::uint8_t* PROTOBUF_NONNULL UninterpretedOption::_InternalSerialize(
    const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target,
    ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) {
  const UninterpretedOption& this_ = static_cast<const UninterpretedOption&>(base);
#else   // PROTOBUF_CUSTOM_VTABLE
::uint8_t* PROTOBUF_NONNULL UninterpretedOption::_InternalSerialize(
    ::uint8_t* PROTOBUF_NONNULL target,
    ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const {
  const UninterpretedOption& this_ = *this;
#endif  // PROTOBUF_CUSTOM_VTABLE
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    this_.CheckHasBitConsistency();
  }
  // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.UninterpretedOption)
  ::uint32_t cached_has_bits = 0;
  (void)cached_has_bits;

  cached_has_bits = this_._impl_._has_bits_[0];
  // repeated .google.protobuf.UninterpretedOption.NamePart name = 2;
  if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) {
    for (unsigned i = 0, n = static_cast<unsigned>(
                             this_._internal_name_size());
         i < n; i++) {
      const auto& repfield = this_._internal_name().Get(i);
      target =
          ::google::protobuf::internal::WireFormatLite::InternalWriteMessage(
              2, repfield, repfield.GetCachedSize(),
              target, stream);
    }
  }

  // optional string identifier_value = 3;
  if (CheckHasBit(cached_has_bits, 0x00000002U)) {
    const ::std::string& _s = this_._internal_identifier_value();
    target = stream->WriteStringMaybeAliased(3, _s, target);
  }

  // optional uint64 positive_int_value = 4;
  if (CheckHasBit(cached_has_bits, 0x00000010U)) {
    target = stream->EnsureSpace(target);
    target = ::_pbi::WireFormatLite::WriteUInt64ToArray(
        4, this_._internal_positive_int_value(), target);
  }

  // optional int64 negative_int_value = 5;
  if (CheckHasBit(cached_has_bits, 0x00000020U)) {
    target =
        ::google::protobuf::internal::WireFormatLite::WriteInt64ToArrayWithField<5>(
            stream, this_._internal_negative_int_value(), target);
  }

  // optional double double_value = 6;
  if (CheckHasBit(cached_has_bits, 0x00000040U)) {
    target = stream->EnsureSpace(target);
    target = ::_pbi::WireFormatLite::WriteDoubleToArray(
        6, this_._internal_double_value(), target);
  }

  // optional bytes string_value = 7;
  if (CheckHasBit(cached_has_bits, 0x00000004U)) {
    const ::std::string& _s = this_._internal_string_value();
    target = stream->WriteBytesMaybeAliased(7, _s, target);
  }

  // optional string aggregate_value = 8;
  if (CheckHasBit(cached_has_bits, 0x00000008U)) {
    const ::std::string& _s = this_._internal_aggregate_value();
    target = stream->WriteStringMaybeAliased(8, _s, target);
  }

  if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) {
    target =
        ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray(
            this_._internal_metadata_.unknown_fields<::google::protobuf::UnknownFieldSet>(::google::protobuf::UnknownFieldSet::default_instance), target, stream);
  }
  // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.UninterpretedOption)
  return target;
}

#if defined(PROTOBUF_CUSTOM_VTABLE)
::size_t UninterpretedOption::ByteSizeLong(const MessageLite& base) {
  const UninterpretedOption& this_ = static_cast<const UninterpretedOption&>(base);
#else   // PROTOBUF_CUSTOM_VTABLE
::size_t UninterpretedOption::ByteSizeLong() const {
  const UninterpretedOption& this_ = *this;
#endif  // PROTOBUF_CUSTOM_VTABLE
  // @@protoc_insertion_point(message_byte_size_start:google.protobuf.UninterpretedOption)
  ::size_t total_size = 0;

  ::uint32_t cached_has_bits = 0;
  // Prevent compiler warnings about cached_has_bits being unused
  (void)cached_has_bits;

  ::_pbi::Prefetch5LinesFrom7Lines(&this_);
  cached_has_bits = this_._impl_._has_bits_[0];
  total_size += static_cast<bool>(0x00000040U & cached_has_bits) * 9;
  if (BatchCheckHasBit(cached_has_bits, 0x0000003fU)) {
    // repeated .google.protobuf.UninterpretedOption.NamePart name = 2;
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) {
      total_size += 1UL * this_._internal_name_size();
      for (const auto& msg : this_._internal_name()) {
        total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg);
      }
    }
    // optional string identifier_value = 3;
    if (CheckHasBit(cached_has_bits, 0x00000002U)) {
      total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize(
                                      this_._internal_identifier_value());
    }
    // optional bytes string_value = 7;
    if (CheckHasBit(cached_has_bits, 0x00000004U)) {
      total_size += 1 + ::google::protobuf::internal::WireFormatLite::BytesSize(
                                      this_._internal_string_value());
    }
    // optional string aggregate_value = 8;
    if (CheckHasBit(cached_has_bits, 0x00000008U)) {
      total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize(
                                      this_._internal_aggregate_value());
    }
    // optional uint64 positive_int_value = 4;
    if (CheckHasBit(cached_has_bits, 0x00000010U)) {
      total_size += ::_pbi::WireFormatLite::UInt64SizePlusOne(
          this_._internal_positive_int_value());
    }
    // optional int64 negative_int_value = 5;
    if (CheckHasBit(cached_has_bits, 0x00000020U)) {
      total_size += ::_pbi::WireFormatLite::Int64SizePlusOne(
          this_._internal_negative_int_value());
    }
  }
  return this_.MaybeComputeUnknownFieldsSize(total_size,
                                             &this_._impl_._cached_size_);
}

void UninterpretedOption::MergeImpl(::google::protobuf::MessageLite& to_msg,
                            const ::google::protobuf::MessageLite& from_msg) {
   auto* const _this =
      static_cast<UninterpretedOption*>(&to_msg);
  auto& from = static_cast<const UninterpretedOption&>(from_msg);
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    from.CheckHasBitConsistency();
  }
  ::google::protobuf::Arena* arena = _this->GetArena();
  // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.UninterpretedOption)
  ABSL_DCHECK_NE(&from, _this);
  ::uint32_t cached_has_bits = 0;
  (void)cached_has_bits;

  cached_has_bits = from._impl_._has_bits_[0];
  if (BatchCheckHasBit(cached_has_bits, 0x0000007fU)) {
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) {
      _this->_internal_mutable_name()->InternalMergeFromWithArena(
          ::google::protobuf::MessageLite::internal_visibility(), arena,
          from._internal_name());
    }
    if (CheckHasBit(cached_has_bits, 0x00000002U)) {
      _this->_internal_set_identifier_value(from._internal_identifier_value());
    }
    if (CheckHasBit(cached_has_bits, 0x00000004U)) {
      _this->_internal_set_string_value(from._internal_string_value());
    }
    if (CheckHasBit(cached_has_bits, 0x00000008U)) {
      _this->_internal_set_aggregate_value(from._internal_aggregate_value());
    }
    if (CheckHasBit(cached_has_bits, 0x00000010U)) {
      _this->_impl_.positive_int_value_ = from._impl_.positive_int_value_;
    }
    if (CheckHasBit(cached_has_bits, 0x00000020U)) {
      _this->_impl_.negative_int_value_ = from._impl_.negative_int_value_;
    }
    if (CheckHasBit(cached_has_bits, 0x00000040U)) {
      _this->_impl_.double_value_ = from._impl_.double_value_;
    }
  }
  _this->_impl_._has_bits_[0] |= cached_has_bits;
  _this->_internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(
      from._internal_metadata_);
}

void UninterpretedOption::CopyFrom(const UninterpretedOption& from) {
  // @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.UninterpretedOption)
  if (&from == this) return;
  Clear();
  MergeFrom(from);
}

PROTOBUF_NOINLINE bool UninterpretedOption::IsInitializedImpl(
    const MessageLite& msg) {
  auto& this_ = static_cast<const UninterpretedOption&>(msg);
  if (!::google::protobuf::internal::AllAreInitialized(this_._internal_name()))
    return false;
  return true;
}

void UninterpretedOption::InternalSwap(UninterpretedOption* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) {
  using ::std::swap;
  auto* arena = GetArena();
  ABSL_DCHECK_EQ(arena, other->GetArena());
  _internal_metadata_.InternalSwap(&other->_internal_metadata_);
  swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]);
  _impl_.name_.InternalSwap(&other->_impl_.name_);
  ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.identifier_value_, &other->_impl_.identifier_value_, arena);
  ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.string_value_, &other->_impl_.string_value_, arena);
  ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.aggregate_value_, &other->_impl_.aggregate_value_, arena);
  ::google::protobuf::internal::memswap<
      PROTOBUF_FIELD_OFFSET(UninterpretedOption, _impl_.double_value_)
      + sizeof(UninterpretedOption::_impl_.double_value_)
      - PROTOBUF_FIELD_OFFSET(UninterpretedOption, _impl_.positive_int_value_)>(
          reinterpret_cast<char*>(&_impl_.positive_int_value_),
          reinterpret_cast<char*>(&other->_impl_.positive_int_value_));
}

::google::protobuf::Metadata UninterpretedOption::GetMetadata() const {
  return ::google::protobuf::Message::GetMetadataImpl(GetClassData()->full());
}
// ===================================================================

class FeatureSet_VisibilityFeature::_Internal {
 public:
};

FeatureSet_VisibilityFeature::FeatureSet_VisibilityFeature(::google::protobuf::Arena* PROTOBUF_NULLABLE arena)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::internal::ZeroFieldsBase(arena, FeatureSet_VisibilityFeature_class_data_.base()) {
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::internal::ZeroFieldsBase(arena) {
#endif  // PROTOBUF_CUSTOM_VTABLE
  // @@protoc_insertion_point(arena_constructor:google.protobuf.FeatureSet.VisibilityFeature)
}
FeatureSet_VisibilityFeature::FeatureSet_VisibilityFeature(
    ::google::protobuf::Arena* PROTOBUF_NULLABLE arena,
    const FeatureSet_VisibilityFeature& from)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::internal::ZeroFieldsBase(arena, FeatureSet_VisibilityFeature_class_data_.base()) {
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::internal::ZeroFieldsBase(arena) {
#endif  // PROTOBUF_CUSTOM_VTABLE
  FeatureSet_VisibilityFeature* const _this = this;
  (void)_this;
  _internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(
      from._internal_metadata_);

  // @@protoc_insertion_point(copy_constructor:google.protobuf.FeatureSet.VisibilityFeature)
}

inline void* PROTOBUF_NONNULL FeatureSet_VisibilityFeature::PlacementNew_(
    const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem,
    ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) {
  return ::new (mem) FeatureSet_VisibilityFeature(arena);
}
constexpr auto FeatureSet_VisibilityFeature::InternalNewImpl_() {
  return ::google::protobuf::internal::MessageCreator::ZeroInit(sizeof(FeatureSet_VisibilityFeature),
                                            alignof(FeatureSet_VisibilityFeature));
}
constexpr auto FeatureSet_VisibilityFeature::InternalGenerateClassData_() {
  return ::google::protobuf::internal::ClassDataFull{
      ::google::protobuf::internal::ClassData{
          &_FeatureSet_VisibilityFeature_default_instance_._instance,
          &_table_.header,
          nullptr,  // OnDemandRegisterArenaDtor
          nullptr,  // IsInitialized
          &FeatureSet_VisibilityFeature::MergeImpl,
          ::google::protobuf::internal::ZeroFieldsBase::GetNewImpl<FeatureSet_VisibilityFeature>(),
#if defined(PROTOBUF_CUSTOM_VTABLE)
          &FeatureSet_VisibilityFeature::SharedDtor,
          ::google::protobuf::internal::ZeroFieldsBase::GetClearImpl<FeatureSet_VisibilityFeature>(), &FeatureSet_VisibilityFeature::ByteSizeLong,
              &FeatureSet_VisibilityFeature::_InternalSerialize,
#endif  // PROTOBUF_CUSTOM_VTABLE
          PROTOBUF_FIELD_OFFSET(FeatureSet_VisibilityFeature, _impl_._cached_size_),
          false,
      },
      &FeatureSet_VisibilityFeature::kDescriptorMethods,
      &descriptor_table_google_2fprotobuf_2fdescriptor_2eproto,
      nullptr,  // tracker
  };
}

PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 const
    ::google::protobuf::internal::ClassDataFull FeatureSet_VisibilityFeature_class_data_ =
        FeatureSet_VisibilityFeature::InternalGenerateClassData_();

PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL
FeatureSet_VisibilityFeature::GetClassData() const {
  ::google::protobuf::internal::PrefetchToLocalCache(&FeatureSet_VisibilityFeature_class_data_);
  ::google::protobuf::internal::PrefetchToLocalCache(FeatureSet_VisibilityFeature_class_data_.tc_table);
  return FeatureSet_VisibilityFeature_class_data_.base();
}
constexpr ::_pbi::TcParseTable<0, 0, 0, 0, 2>
FeatureSet_VisibilityFeature::_table_ = {
  {
    0,  // no _has_bits_
    0, // no _extensions_
    0, 0,  // max_field_number, fast_idx_mask
    offsetof(decltype(_table_), field_lookup_table),
    4294967295,  // skipmap
    offsetof(decltype(_table_), field_names),  // no field_entries
    0,  // num_field_entries
    0,  // num_aux_entries
    offsetof(decltype(_table_), field_names),  // no aux_entries
    FeatureSet_VisibilityFeature_class_data_.base(),
    nullptr,  // post_loop_handler
    ::_pbi::TcParser::GenericFallback,  // fallback
    #ifdef PROTOBUF_PREFETCH_PARSE_TABLE
    ::_pbi::TcParser::GetTable<::google::protobuf::FeatureSet_VisibilityFeature>(),  // to_prefetch
    #endif  // PROTOBUF_PREFETCH_PARSE_TABLE
  }, {{
    {::_pbi::TcParser::MiniParse, {}},
  }}, {{
    65535, 65535
  }}, // no field_entries, or aux_entries
  {{
  }},
};







::google::protobuf::Metadata FeatureSet_VisibilityFeature::GetMetadata() const {
  return ::google::protobuf::internal::ZeroFieldsBase::GetMetadataImpl(GetClassData()->full());
}
// ===================================================================

class FeatureSet::_Internal {
 public:
  using HasBits =
      decltype(::std::declval<FeatureSet>()._impl_._has_bits_);
  static constexpr ::int32_t kHasBitsOffset =
      8 * PROTOBUF_FIELD_OFFSET(FeatureSet, _impl_._has_bits_);
};

FeatureSet::FeatureSet(::google::protobuf::Arena* PROTOBUF_NULLABLE arena)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(arena, FeatureSet_class_data_.base()) {
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(arena) {
#endif  // PROTOBUF_CUSTOM_VTABLE
  SharedCtor(arena);
  // @@protoc_insertion_point(arena_constructor:google.protobuf.FeatureSet)
}
PROTOBUF_NDEBUG_INLINE FeatureSet::Impl_::Impl_(
    [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility,
    [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from,
    [[maybe_unused]] const ::google::protobuf::FeatureSet& from_msg)
      : _extensions_{visibility, arena},
        _has_bits_{from._has_bits_},
        _cached_size_{0} {}

FeatureSet::FeatureSet(
    ::google::protobuf::Arena* PROTOBUF_NULLABLE arena,
    const FeatureSet& from)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(arena, FeatureSet_class_data_.base()) {
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(arena) {
#endif  // PROTOBUF_CUSTOM_VTABLE
  FeatureSet* const _this = this;
  (void)_this;
  _internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(
      from._internal_metadata_);
  new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from);
  _impl_._extensions_.MergeFrom(this, from._impl_._extensions_);
  ::memcpy(reinterpret_cast<char*>(&_impl_) +
               offsetof(Impl_, field_presence_),
           reinterpret_cast<const char*>(&from._impl_) +
               offsetof(Impl_, field_presence_),
           offsetof(Impl_, default_symbol_visibility_) -
               offsetof(Impl_, field_presence_) +
               sizeof(Impl_::default_symbol_visibility_));

  // @@protoc_insertion_point(copy_constructor:google.protobuf.FeatureSet)
}
PROTOBUF_NDEBUG_INLINE FeatureSet::Impl_::Impl_(
    [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility,
    [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena)
      : _extensions_{visibility, arena},
        _cached_size_{0} {}

inline void FeatureSet::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) {
  new (&_impl_) Impl_(internal_visibility(), arena);
  ::memset(reinterpret_cast<char*>(&_impl_) +
               offsetof(Impl_, field_presence_),
           0,
           offsetof(Impl_, default_symbol_visibility_) -
               offsetof(Impl_, field_presence_) +
               sizeof(Impl_::default_symbol_visibility_));
}
FeatureSet::~FeatureSet() {
  // @@protoc_insertion_point(destructor:google.protobuf.FeatureSet)
  SharedDtor(*this);
}
inline void FeatureSet::SharedDtor(MessageLite& self) {
  FeatureSet& this_ = static_cast<FeatureSet&>(self);
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    this_.CheckHasBitConsistency();
  }
  this_._internal_metadata_.Delete<::google::protobuf::UnknownFieldSet>();
  ABSL_DCHECK(this_.GetArena() == nullptr);
  this_._impl_.~Impl_();
}

inline void* PROTOBUF_NONNULL FeatureSet::PlacementNew_(
    const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem,
    ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) {
  return ::new (mem) FeatureSet(arena);
}
constexpr auto FeatureSet::InternalNewImpl_() {
  constexpr auto arena_bits = ::google::protobuf::internal::EncodePlacementArenaOffsets({
      PROTOBUF_FIELD_OFFSET(FeatureSet, _impl_._extensions_) +
          decltype(FeatureSet::_impl_._extensions_)::InternalGetArenaOffset(
              ::google::protobuf::Message::internal_visibility()),
  });
  if (arena_bits.has_value()) {
    return ::google::protobuf::internal::MessageCreator::ZeroInit(
        sizeof(FeatureSet), alignof(FeatureSet), *arena_bits);
  } else {
    return ::google::protobuf::internal::MessageCreator(&FeatureSet::PlacementNew_,
                                 sizeof(FeatureSet),
                                 alignof(FeatureSet));
  }
}
constexpr auto FeatureSet::InternalGenerateClassData_() {
  return ::google::protobuf::internal::ClassDataFull{
      ::google::protobuf::internal::ClassData{
          &_FeatureSet_default_instance_._instance,
          &_table_.header,
          nullptr,  // OnDemandRegisterArenaDtor
          FeatureSet::IsInitializedImpl,
          &FeatureSet::MergeImpl,
          ::google::protobuf::Message::GetNewImpl<FeatureSet>(),
#if defined(PROTOBUF_CUSTOM_VTABLE)
          &FeatureSet::SharedDtor,
          ::google::protobuf::Message::GetClearImpl<FeatureSet>(), &FeatureSet::ByteSizeLong,
              &FeatureSet::_InternalSerialize,
#endif  // PROTOBUF_CUSTOM_VTABLE
          PROTOBUF_FIELD_OFFSET(FeatureSet, _impl_._cached_size_),
          false,
      },
      &FeatureSet::kDescriptorMethods,
      &descriptor_table_google_2fprotobuf_2fdescriptor_2eproto,
      nullptr,  // tracker
  };
}

PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 const
    ::google::protobuf::internal::ClassDataFull FeatureSet_class_data_ =
        FeatureSet::InternalGenerateClassData_();

PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL
FeatureSet::GetClassData() const {
  ::google::protobuf::internal::PrefetchToLocalCache(&FeatureSet_class_data_);
  ::google::protobuf::internal::PrefetchToLocalCache(FeatureSet_class_data_.tc_table);
  return FeatureSet_class_data_.base();
}
constexpr ::_pbi::TcParseTable<3, 8, 8, 0, 2>
FeatureSet::_table_ = {
  {
    PROTOBUF_FIELD_OFFSET(FeatureSet, _impl_._has_bits_),
    PROTOBUF_FIELD_OFFSET(FeatureSet, _impl_._extensions_),
    8, 56,  // max_field_number, fast_idx_mask
    offsetof(decltype(_table_), field_lookup_table),
    4294967040,  // skipmap
    offsetof(decltype(_table_), field_entries),
    8,  // num_field_entries
    8,  // num_aux_entries
    offsetof(decltype(_table_), aux_entries),
    FeatureSet_class_data_.base(),
    nullptr,  // post_loop_handler
    ::_pbi::TcParser::GenericFallback,  // fallback
    #ifdef PROTOBUF_PREFETCH_PARSE_TABLE
    ::_pbi::TcParser::GetTable<::google::protobuf::FeatureSet>(),  // to_prefetch
    #endif  // PROTOBUF_PREFETCH_PARSE_TABLE
  }, {{
    // optional .google.protobuf.FeatureSet.VisibilityFeature.DefaultSymbolVisibility default_symbol_visibility = 8 [retention = RETENTION_SOURCE, targets = TARGET_TYPE_FILE, edition_defaults = {
    {::_pbi::TcParser::FastEr0S1,
     {64, 7, 4,
      PROTOBUF_FIELD_OFFSET(FeatureSet, _impl_.default_symbol_visibility_)}},
    // optional .google.protobuf.FeatureSet.FieldPresence field_presence = 1 [retention = RETENTION_RUNTIME, targets = TARGET_TYPE_FIELD, targets = TARGET_TYPE_FILE, edition_defaults = {
    {::_pbi::TcParser::FastEr0S1,
     {8, 0, 3,
      PROTOBUF_FIELD_OFFSET(FeatureSet, _impl_.field_presence_)}},
    // optional .google.protobuf.FeatureSet.EnumType enum_type = 2 [retention = RETENTION_RUNTIME, targets = TARGET_TYPE_ENUM, targets = TARGET_TYPE_FILE, edition_defaults = {
    {::_pbi::TcParser::FastEr0S1,
     {16, 1, 2,
      PROTOBUF_FIELD_OFFSET(FeatureSet, _impl_.enum_type_)}},
    // optional .google.protobuf.FeatureSet.RepeatedFieldEncoding repeated_field_encoding = 3 [retention = RETENTION_RUNTIME, targets = TARGET_TYPE_FIELD, targets = TARGET_TYPE_FILE, edition_defaults = {
    {::_pbi::TcParser::FastEr0S1,
     {24, 2, 2,
      PROTOBUF_FIELD_OFFSET(FeatureSet, _impl_.repeated_field_encoding_)}},
    // optional .google.protobuf.FeatureSet.Utf8Validation utf8_validation = 4 [retention = RETENTION_RUNTIME, targets = TARGET_TYPE_FIELD, targets = TARGET_TYPE_FILE, edition_defaults = {
    {::_pbi::TcParser::FastEvS1,
     {32, 3, 3,
      PROTOBUF_FIELD_OFFSET(FeatureSet, _impl_.utf8_validation_)}},
    // optional .google.protobuf.FeatureSet.MessageEncoding message_encoding = 5 [retention = RETENTION_RUNTIME, targets = TARGET_TYPE_FIELD, targets = TARGET_TYPE_FILE, edition_defaults = {
    {::_pbi::TcParser::FastEr0S1,
     {40, 4, 2,
      PROTOBUF_FIELD_OFFSET(FeatureSet, _impl_.message_encoding_)}},
    // optional .google.protobuf.FeatureSet.JsonFormat json_format = 6 [retention = RETENTION_RUNTIME, targets = TARGET_TYPE_MESSAGE, targets = TARGET_TYPE_ENUM, targets = TARGET_TYPE_FILE, edition_defaults = {
    {::_pbi::TcParser::FastEr0S1,
     {48, 5, 2,
      PROTOBUF_FIELD_OFFSET(FeatureSet, _impl_.json_format_)}},
    // optional .google.protobuf.FeatureSet.EnforceNamingStyle enforce_naming_style = 7 [retention = RETENTION_SOURCE, targets = TARGET_TYPE_FILE, targets = TARGET_TYPE_EXTENSION_RANGE, targets = TARGET_TYPE_MESSAGE, targets = TARGET_TYPE_FIELD, targets = TARGET_TYPE_ONEOF, targets = TARGET_TYPE_ENUM, targets = TARGET_TYPE_ENUM_ENTRY, targets = TARGET_TYPE_SERVICE, targets = TARGET_TYPE_METHOD, edition_defaults = {
    {::_pbi::TcParser::FastEr0S1,
     {56, 6, 2,
      PROTOBUF_FIELD_OFFSET(FeatureSet, _impl_.enforce_naming_style_)}},
  }}, {{
    65535, 65535
  }}, {{
    // optional .google.protobuf.FeatureSet.FieldPresence field_presence = 1 [retention = RETENTION_RUNTIME, targets = TARGET_TYPE_FIELD, targets = TARGET_TYPE_FILE, edition_defaults = {
    {PROTOBUF_FIELD_OFFSET(FeatureSet, _impl_.field_presence_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcOptional | ::_fl::kEnumRange)},
    // optional .google.protobuf.FeatureSet.EnumType enum_type = 2 [retention = RETENTION_RUNTIME, targets = TARGET_TYPE_ENUM, targets = TARGET_TYPE_FILE, edition_defaults = {
    {PROTOBUF_FIELD_OFFSET(FeatureSet, _impl_.enum_type_), _Internal::kHasBitsOffset + 1, 1, (0 | ::_fl::kFcOptional | ::_fl::kEnumRange)},
    // optional .google.protobuf.FeatureSet.RepeatedFieldEncoding repeated_field_encoding = 3 [retention = RETENTION_RUNTIME, targets = TARGET_TYPE_FIELD, targets = TARGET_TYPE_FILE, edition_defaults = {
    {PROTOBUF_FIELD_OFFSET(FeatureSet, _impl_.repeated_field_encoding_), _Internal::kHasBitsOffset + 2, 2, (0 | ::_fl::kFcOptional | ::_fl::kEnumRange)},
    // optional .google.protobuf.FeatureSet.Utf8Validation utf8_validation = 4 [retention = RETENTION_RUNTIME, targets = TARGET_TYPE_FIELD, targets = TARGET_TYPE_FILE, edition_defaults = {
    {PROTOBUF_FIELD_OFFSET(FeatureSet, _impl_.utf8_validation_), _Internal::kHasBitsOffset + 3, 3, (0 | ::_fl::kFcOptional | ::_fl::kEnum)},
    // optional .google.protobuf.FeatureSet.MessageEncoding message_encoding = 5 [retention = RETENTION_RUNTIME, targets = TARGET_TYPE_FIELD, targets = TARGET_TYPE_FILE, edition_defaults = {
    {PROTOBUF_FIELD_OFFSET(FeatureSet, _impl_.message_encoding_), _Internal::kHasBitsOffset + 4, 4, (0 | ::_fl::kFcOptional | ::_fl::kEnumRange)},
    // optional .google.protobuf.FeatureSet.JsonFormat json_format = 6 [retention = RETENTION_RUNTIME, targets = TARGET_TYPE_MESSAGE, targets = TARGET_TYPE_ENUM, targets = TARGET_TYPE_FILE, edition_defaults = {
    {PROTOBUF_FIELD_OFFSET(FeatureSet, _impl_.json_format_), _Internal::kHasBitsOffset + 5, 5, (0 | ::_fl::kFcOptional | ::_fl::kEnumRange)},
    // optional .google.protobuf.FeatureSet.EnforceNamingStyle enforce_naming_style = 7 [retention = RETENTION_SOURCE, targets = TARGET_TYPE_FILE, targets = TARGET_TYPE_EXTENSION_RANGE, targets = TARGET_TYPE_MESSAGE, targets = TARGET_TYPE_FIELD, targets = TARGET_TYPE_ONEOF, targets = TARGET_TYPE_ENUM, targets = TARGET_TYPE_ENUM_ENTRY, targets = TARGET_TYPE_SERVICE, targets = TARGET_TYPE_METHOD, edition_defaults = {
    {PROTOBUF_FIELD_OFFSET(FeatureSet, _impl_.enforce_naming_style_), _Internal::kHasBitsOffset + 6, 6, (0 | ::_fl::kFcOptional | ::_fl::kEnumRange)},
    // optional .google.protobuf.FeatureSet.VisibilityFeature.DefaultSymbolVisibility default_symbol_visibility = 8 [retention = RETENTION_SOURCE, targets = TARGET_TYPE_FILE, edition_defaults = {
    {PROTOBUF_FIELD_OFFSET(FeatureSet, _impl_.default_symbol_visibility_), _Internal::kHasBitsOffset + 7, 7, (0 | ::_fl::kFcOptional | ::_fl::kEnumRange)},
  }},
  {{
      {0, 3},
      {0, 2},
      {0, 2},
      {::_pbi::FieldAuxEnumData{}, ::google::protobuf::FeatureSet_Utf8Validation_internal_data_},
      {0, 2},
      {0, 2},
      {0, 2},
      {0, 4},
  }},
  {{
  }},
};
PROTOBUF_NOINLINE void FeatureSet::Clear() {
// @@protoc_insertion_point(message_clear_start:google.protobuf.FeatureSet)
  ::google::protobuf::internal::TSanWrite(&_impl_);
  ::uint32_t cached_has_bits = 0;
  // Prevent compiler warnings about cached_has_bits being unused
  (void) cached_has_bits;

  _impl_._extensions_.Clear();
  cached_has_bits = _impl_._has_bits_[0];
  if (BatchCheckHasBit(cached_has_bits, 0x000000ffU)) {
    ::memset(&_impl_.field_presence_, 0, static_cast<::size_t>(
        reinterpret_cast<char*>(&_impl_.default_symbol_visibility_) -
        reinterpret_cast<char*>(&_impl_.field_presence_)) + sizeof(_impl_.default_symbol_visibility_));
  }
  _impl_._has_bits_.Clear();
  _internal_metadata_.Clear<::google::protobuf::UnknownFieldSet>();
}

#if defined(PROTOBUF_CUSTOM_VTABLE)
::uint8_t* PROTOBUF_NONNULL FeatureSet::_InternalSerialize(
    const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target,
    ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) {
  const FeatureSet& this_ = static_cast<const FeatureSet&>(base);
#else   // PROTOBUF_CUSTOM_VTABLE
::uint8_t* PROTOBUF_NONNULL FeatureSet::_InternalSerialize(
    ::uint8_t* PROTOBUF_NONNULL target,
    ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const {
  const FeatureSet& this_ = *this;
#endif  // PROTOBUF_CUSTOM_VTABLE
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    this_.CheckHasBitConsistency();
  }
  // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.FeatureSet)
  ::uint32_t cached_has_bits = 0;
  (void)cached_has_bits;

  cached_has_bits = this_._impl_._has_bits_[0];
  // optional .google.protobuf.FeatureSet.FieldPresence field_presence = 1 [retention = RETENTION_RUNTIME, targets = TARGET_TYPE_FIELD, targets = TARGET_TYPE_FILE, edition_defaults = {
  if (CheckHasBit(cached_has_bits, 0x00000001U)) {
    target = stream->EnsureSpace(target);
    target = ::_pbi::WireFormatLite::WriteEnumToArray(
        1, this_._internal_field_presence(), target);
  }

  // optional .google.protobuf.FeatureSet.EnumType enum_type = 2 [retention = RETENTION_RUNTIME, targets = TARGET_TYPE_ENUM, targets = TARGET_TYPE_FILE, edition_defaults = {
  if (CheckHasBit(cached_has_bits, 0x00000002U)) {
    target = stream->EnsureSpace(target);
    target = ::_pbi::WireFormatLite::WriteEnumToArray(
        2, this_._internal_enum_type(), target);
  }

  // optional .google.protobuf.FeatureSet.RepeatedFieldEncoding repeated_field_encoding = 3 [retention = RETENTION_RUNTIME, targets = TARGET_TYPE_FIELD, targets = TARGET_TYPE_FILE, edition_defaults = {
  if (CheckHasBit(cached_has_bits, 0x00000004U)) {
    target = stream->EnsureSpace(target);
    target = ::_pbi::WireFormatLite::WriteEnumToArray(
        3, this_._internal_repeated_field_encoding(), target);
  }

  // optional .google.protobuf.FeatureSet.Utf8Validation utf8_validation = 4 [retention = RETENTION_RUNTIME, targets = TARGET_TYPE_FIELD, targets = TARGET_TYPE_FILE, edition_defaults = {
  if (CheckHasBit(cached_has_bits, 0x00000008U)) {
    target = stream->EnsureSpace(target);
    target = ::_pbi::WireFormatLite::WriteEnumToArray(
        4, this_._internal_utf8_validation(), target);
  }

  // optional .google.protobuf.FeatureSet.MessageEncoding message_encoding = 5 [retention = RETENTION_RUNTIME, targets = TARGET_TYPE_FIELD, targets = TARGET_TYPE_FILE, edition_defaults = {
  if (CheckHasBit(cached_has_bits, 0x00000010U)) {
    target = stream->EnsureSpace(target);
    target = ::_pbi::WireFormatLite::WriteEnumToArray(
        5, this_._internal_message_encoding(), target);
  }

  // optional .google.protobuf.FeatureSet.JsonFormat json_format = 6 [retention = RETENTION_RUNTIME, targets = TARGET_TYPE_MESSAGE, targets = TARGET_TYPE_ENUM, targets = TARGET_TYPE_FILE, edition_defaults = {
  if (CheckHasBit(cached_has_bits, 0x00000020U)) {
    target = stream->EnsureSpace(target);
    target = ::_pbi::WireFormatLite::WriteEnumToArray(
        6, this_._internal_json_format(), target);
  }

  // optional .google.protobuf.FeatureSet.EnforceNamingStyle enforce_naming_style = 7 [retention = RETENTION_SOURCE, targets = TARGET_TYPE_FILE, targets = TARGET_TYPE_EXTENSION_RANGE, targets = TARGET_TYPE_MESSAGE, targets = TARGET_TYPE_FIELD, targets = TARGET_TYPE_ONEOF, targets = TARGET_TYPE_ENUM, targets = TARGET_TYPE_ENUM_ENTRY, targets = TARGET_TYPE_SERVICE, targets = TARGET_TYPE_METHOD, edition_defaults = {
  if (CheckHasBit(cached_has_bits, 0x00000040U)) {
    target = stream->EnsureSpace(target);
    target = ::_pbi::WireFormatLite::WriteEnumToArray(
        7, this_._internal_enforce_naming_style(), target);
  }

  // optional .google.protobuf.FeatureSet.VisibilityFeature.DefaultSymbolVisibility default_symbol_visibility = 8 [retention = RETENTION_SOURCE, targets = TARGET_TYPE_FILE, edition_defaults = {
  if (CheckHasBit(cached_has_bits, 0x00000080U)) {
    target = stream->EnsureSpace(target);
    target = ::_pbi::WireFormatLite::WriteEnumToArray(
        8, this_._internal_default_symbol_visibility(), target);
  }

  // All extensions.
  target = this_._impl_._extensions_._InternalSerializeAll(&default_instance(),
                                                    target, stream);
  if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) {
    target =
        ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray(
            this_._internal_metadata_.unknown_fields<::google::protobuf::UnknownFieldSet>(::google::protobuf::UnknownFieldSet::default_instance), target, stream);
  }
  // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.FeatureSet)
  return target;
}

#if defined(PROTOBUF_CUSTOM_VTABLE)
::size_t FeatureSet::ByteSizeLong(const MessageLite& base) {
  const FeatureSet& this_ = static_cast<const FeatureSet&>(base);
#else   // PROTOBUF_CUSTOM_VTABLE
::size_t FeatureSet::ByteSizeLong() const {
  const FeatureSet& this_ = *this;
#endif  // PROTOBUF_CUSTOM_VTABLE
  // @@protoc_insertion_point(message_byte_size_start:google.protobuf.FeatureSet)
  ::size_t total_size = 0;
  total_size += this_._impl_._extensions_.ByteSize();

  ::uint32_t cached_has_bits = 0;
  // Prevent compiler warnings about cached_has_bits being unused
  (void)cached_has_bits;

  ::_pbi::Prefetch5LinesFrom7Lines(&this_);
  cached_has_bits = this_._impl_._has_bits_[0];
  if (BatchCheckHasBit(cached_has_bits, 0x000000ffU)) {
    // optional .google.protobuf.FeatureSet.FieldPresence field_presence = 1 [retention = RETENTION_RUNTIME, targets = TARGET_TYPE_FIELD, targets = TARGET_TYPE_FILE, edition_defaults = {
    if (CheckHasBit(cached_has_bits, 0x00000001U)) {
      total_size += 1 +
                    ::_pbi::WireFormatLite::EnumSize(this_._internal_field_presence());
    }
    // optional .google.protobuf.FeatureSet.EnumType enum_type = 2 [retention = RETENTION_RUNTIME, targets = TARGET_TYPE_ENUM, targets = TARGET_TYPE_FILE, edition_defaults = {
    if (CheckHasBit(cached_has_bits, 0x00000002U)) {
      total_size += 1 +
                    ::_pbi::WireFormatLite::EnumSize(this_._internal_enum_type());
    }
    // optional .google.protobuf.FeatureSet.RepeatedFieldEncoding repeated_field_encoding = 3 [retention = RETENTION_RUNTIME, targets = TARGET_TYPE_FIELD, targets = TARGET_TYPE_FILE, edition_defaults = {
    if (CheckHasBit(cached_has_bits, 0x00000004U)) {
      total_size += 1 +
                    ::_pbi::WireFormatLite::EnumSize(this_._internal_repeated_field_encoding());
    }
    // optional .google.protobuf.FeatureSet.Utf8Validation utf8_validation = 4 [retention = RETENTION_RUNTIME, targets = TARGET_TYPE_FIELD, targets = TARGET_TYPE_FILE, edition_defaults = {
    if (CheckHasBit(cached_has_bits, 0x00000008U)) {
      total_size += 1 +
                    ::_pbi::WireFormatLite::EnumSize(this_._internal_utf8_validation());
    }
    // optional .google.protobuf.FeatureSet.MessageEncoding message_encoding = 5 [retention = RETENTION_RUNTIME, targets = TARGET_TYPE_FIELD, targets = TARGET_TYPE_FILE, edition_defaults = {
    if (CheckHasBit(cached_has_bits, 0x00000010U)) {
      total_size += 1 +
                    ::_pbi::WireFormatLite::EnumSize(this_._internal_message_encoding());
    }
    // optional .google.protobuf.FeatureSet.JsonFormat json_format = 6 [retention = RETENTION_RUNTIME, targets = TARGET_TYPE_MESSAGE, targets = TARGET_TYPE_ENUM, targets = TARGET_TYPE_FILE, edition_defaults = {
    if (CheckHasBit(cached_has_bits, 0x00000020U)) {
      total_size += 1 +
                    ::_pbi::WireFormatLite::EnumSize(this_._internal_json_format());
    }
    // optional .google.protobuf.FeatureSet.EnforceNamingStyle enforce_naming_style = 7 [retention = RETENTION_SOURCE, targets = TARGET_TYPE_FILE, targets = TARGET_TYPE_EXTENSION_RANGE, targets = TARGET_TYPE_MESSAGE, targets = TARGET_TYPE_FIELD, targets = TARGET_TYPE_ONEOF, targets = TARGET_TYPE_ENUM, targets = TARGET_TYPE_ENUM_ENTRY, targets = TARGET_TYPE_SERVICE, targets = TARGET_TYPE_METHOD, edition_defaults = {
    if (CheckHasBit(cached_has_bits, 0x00000040U)) {
      total_size += 1 +
                    ::_pbi::WireFormatLite::EnumSize(this_._internal_enforce_naming_style());
    }
    // optional .google.protobuf.FeatureSet.VisibilityFeature.DefaultSymbolVisibility default_symbol_visibility = 8 [retention = RETENTION_SOURCE, targets = TARGET_TYPE_FILE, edition_defaults = {
    if (CheckHasBit(cached_has_bits, 0x00000080U)) {
      total_size += 1 +
                    ::_pbi::WireFormatLite::EnumSize(this_._internal_default_symbol_visibility());
    }
  }
  return this_.MaybeComputeUnknownFieldsSize(total_size,
                                             &this_._impl_._cached_size_);
}

void FeatureSet::MergeImpl(::google::protobuf::MessageLite& to_msg,
                            const ::google::protobuf::MessageLite& from_msg) {
   auto* const _this =
      static_cast<FeatureSet*>(&to_msg);
  auto& from = static_cast<const FeatureSet&>(from_msg);
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    from.CheckHasBitConsistency();
  }
  // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.FeatureSet)
  ABSL_DCHECK_NE(&from, _this);
  ::uint32_t cached_has_bits = 0;
  (void)cached_has_bits;

  cached_has_bits = from._impl_._has_bits_[0];
  if (BatchCheckHasBit(cached_has_bits, 0x000000ffU)) {
    if (CheckHasBit(cached_has_bits, 0x00000001U)) {
      _this->_impl_.field_presence_ = from._impl_.field_presence_;
    }
    if (CheckHasBit(cached_has_bits, 0x00000002U)) {
      _this->_impl_.enum_type_ = from._impl_.enum_type_;
    }
    if (CheckHasBit(cached_has_bits, 0x00000004U)) {
      _this->_impl_.repeated_field_encoding_ = from._impl_.repeated_field_encoding_;
    }
    if (CheckHasBit(cached_has_bits, 0x00000008U)) {
      _this->_impl_.utf8_validation_ = from._impl_.utf8_validation_;
    }
    if (CheckHasBit(cached_has_bits, 0x00000010U)) {
      _this->_impl_.message_encoding_ = from._impl_.message_encoding_;
    }
    if (CheckHasBit(cached_has_bits, 0x00000020U)) {
      _this->_impl_.json_format_ = from._impl_.json_format_;
    }
    if (CheckHasBit(cached_has_bits, 0x00000040U)) {
      _this->_impl_.enforce_naming_style_ = from._impl_.enforce_naming_style_;
    }
    if (CheckHasBit(cached_has_bits, 0x00000080U)) {
      _this->_impl_.default_symbol_visibility_ = from._impl_.default_symbol_visibility_;
    }
  }
  _this->_impl_._has_bits_[0] |= cached_has_bits;
  _this->_impl_._extensions_.MergeFrom(&default_instance(),
                                from._impl_._extensions_);
  _this->_internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(
      from._internal_metadata_);
}

void FeatureSet::CopyFrom(const FeatureSet& from) {
  // @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.FeatureSet)
  if (&from == this) return;
  Clear();
  MergeFrom(from);
}

PROTOBUF_NOINLINE bool FeatureSet::IsInitializedImpl(
    const MessageLite& msg) {
  auto& this_ = static_cast<const FeatureSet&>(msg);
  if (!this_._impl_._extensions_.IsInitialized(&default_instance())) {
    return false;
  }
  return true;
}

void FeatureSet::InternalSwap(FeatureSet* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) {
  using ::std::swap;
  _impl_._extensions_.InternalSwap(&other->_impl_._extensions_);
  _internal_metadata_.InternalSwap(&other->_internal_metadata_);
  swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]);
  ::google::protobuf::internal::memswap<
      PROTOBUF_FIELD_OFFSET(FeatureSet, _impl_.default_symbol_visibility_)
      + sizeof(FeatureSet::_impl_.default_symbol_visibility_)
      - PROTOBUF_FIELD_OFFSET(FeatureSet, _impl_.field_presence_)>(
          reinterpret_cast<char*>(&_impl_.field_presence_),
          reinterpret_cast<char*>(&other->_impl_.field_presence_));
}

::google::protobuf::Metadata FeatureSet::GetMetadata() const {
  return ::google::protobuf::Message::GetMetadataImpl(GetClassData()->full());
}
// ===================================================================

class FeatureSetDefaults_FeatureSetEditionDefault::_Internal {
 public:
  using HasBits =
      decltype(::std::declval<FeatureSetDefaults_FeatureSetEditionDefault>()._impl_._has_bits_);
  static constexpr ::int32_t kHasBitsOffset =
      8 * PROTOBUF_FIELD_OFFSET(FeatureSetDefaults_FeatureSetEditionDefault, _impl_._has_bits_);
};

FeatureSetDefaults_FeatureSetEditionDefault::FeatureSetDefaults_FeatureSetEditionDefault(::google::protobuf::Arena* PROTOBUF_NULLABLE arena)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(arena, FeatureSetDefaults_FeatureSetEditionDefault_class_data_.base()) {
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(arena) {
#endif  // PROTOBUF_CUSTOM_VTABLE
  SharedCtor(arena);
  // @@protoc_insertion_point(arena_constructor:google.protobuf.FeatureSetDefaults.FeatureSetEditionDefault)
}
PROTOBUF_NDEBUG_INLINE FeatureSetDefaults_FeatureSetEditionDefault::Impl_::Impl_(
    [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility,
    [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from,
    [[maybe_unused]] const ::google::protobuf::FeatureSetDefaults_FeatureSetEditionDefault& from_msg)
      : _has_bits_{from._has_bits_},
        _cached_size_{0} {}

FeatureSetDefaults_FeatureSetEditionDefault::FeatureSetDefaults_FeatureSetEditionDefault(
    ::google::protobuf::Arena* PROTOBUF_NULLABLE arena,
    const FeatureSetDefaults_FeatureSetEditionDefault& from)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(arena, FeatureSetDefaults_FeatureSetEditionDefault_class_data_.base()) {
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(arena) {
#endif  // PROTOBUF_CUSTOM_VTABLE
  FeatureSetDefaults_FeatureSetEditionDefault* const _this = this;
  (void)_this;
  _internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(
      from._internal_metadata_);
  new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from);
  ::uint32_t cached_has_bits = _impl_._has_bits_[0];
  _impl_.overridable_features_ = (CheckHasBit(cached_has_bits, 0x00000001U))
                ? ::google::protobuf::Message::CopyConstruct(arena, *from._impl_.overridable_features_)
                : nullptr;
  _impl_.fixed_features_ = (CheckHasBit(cached_has_bits, 0x00000002U))
                ? ::google::protobuf::Message::CopyConstruct(arena, *from._impl_.fixed_features_)
                : nullptr;
  _impl_.edition_ = from._impl_.edition_;

  // @@protoc_insertion_point(copy_constructor:google.protobuf.FeatureSetDefaults.FeatureSetEditionDefault)
}
PROTOBUF_NDEBUG_INLINE FeatureSetDefaults_FeatureSetEditionDefault::Impl_::Impl_(
    [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility,
    [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena)
      : _cached_size_{0} {}

inline void FeatureSetDefaults_FeatureSetEditionDefault::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) {
  new (&_impl_) Impl_(internal_visibility(), arena);
  ::memset(reinterpret_cast<char*>(&_impl_) +
               offsetof(Impl_, overridable_features_),
           0,
           offsetof(Impl_, edition_) -
               offsetof(Impl_, overridable_features_) +
               sizeof(Impl_::edition_));
}
FeatureSetDefaults_FeatureSetEditionDefault::~FeatureSetDefaults_FeatureSetEditionDefault() {
  // @@protoc_insertion_point(destructor:google.protobuf.FeatureSetDefaults.FeatureSetEditionDefault)
  SharedDtor(*this);
}
inline void FeatureSetDefaults_FeatureSetEditionDefault::SharedDtor(MessageLite& self) {
  FeatureSetDefaults_FeatureSetEditionDefault& this_ = static_cast<FeatureSetDefaults_FeatureSetEditionDefault&>(self);
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    this_.CheckHasBitConsistency();
  }
  this_._internal_metadata_.Delete<::google::protobuf::UnknownFieldSet>();
  ABSL_DCHECK(this_.GetArena() == nullptr);
  delete this_._impl_.overridable_features_;
  delete this_._impl_.fixed_features_;
  this_._impl_.~Impl_();
}

inline void* PROTOBUF_NONNULL FeatureSetDefaults_FeatureSetEditionDefault::PlacementNew_(
    const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem,
    ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) {
  return ::new (mem) FeatureSetDefaults_FeatureSetEditionDefault(arena);
}
constexpr auto FeatureSetDefaults_FeatureSetEditionDefault::InternalNewImpl_() {
  return ::google::protobuf::internal::MessageCreator::ZeroInit(sizeof(FeatureSetDefaults_FeatureSetEditionDefault),
                                            alignof(FeatureSetDefaults_FeatureSetEditionDefault));
}
constexpr auto FeatureSetDefaults_FeatureSetEditionDefault::InternalGenerateClassData_() {
  return ::google::protobuf::internal::ClassDataFull{
      ::google::protobuf::internal::ClassData{
          &_FeatureSetDefaults_FeatureSetEditionDefault_default_instance_._instance,
          &_table_.header,
          nullptr,  // OnDemandRegisterArenaDtor
          FeatureSetDefaults_FeatureSetEditionDefault::IsInitializedImpl,
          &FeatureSetDefaults_FeatureSetEditionDefault::MergeImpl,
          ::google::protobuf::Message::GetNewImpl<FeatureSetDefaults_FeatureSetEditionDefault>(),
#if defined(PROTOBUF_CUSTOM_VTABLE)
          &FeatureSetDefaults_FeatureSetEditionDefault::SharedDtor,
          ::google::protobuf::Message::GetClearImpl<FeatureSetDefaults_FeatureSetEditionDefault>(), &FeatureSetDefaults_FeatureSetEditionDefault::ByteSizeLong,
              &FeatureSetDefaults_FeatureSetEditionDefault::_InternalSerialize,
#endif  // PROTOBUF_CUSTOM_VTABLE
          PROTOBUF_FIELD_OFFSET(FeatureSetDefaults_FeatureSetEditionDefault, _impl_._cached_size_),
          false,
      },
      &FeatureSetDefaults_FeatureSetEditionDefault::kDescriptorMethods,
      &descriptor_table_google_2fprotobuf_2fdescriptor_2eproto,
      nullptr,  // tracker
  };
}

PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 const
    ::google::protobuf::internal::ClassDataFull FeatureSetDefaults_FeatureSetEditionDefault_class_data_ =
        FeatureSetDefaults_FeatureSetEditionDefault::InternalGenerateClassData_();

PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL
FeatureSetDefaults_FeatureSetEditionDefault::GetClassData() const {
  ::google::protobuf::internal::PrefetchToLocalCache(&FeatureSetDefaults_FeatureSetEditionDefault_class_data_);
  ::google::protobuf::internal::PrefetchToLocalCache(FeatureSetDefaults_FeatureSetEditionDefault_class_data_.tc_table);
  return FeatureSetDefaults_FeatureSetEditionDefault_class_data_.base();
}
constexpr ::_pbi::TcParseTable<2, 3, 3, 0, 2>
FeatureSetDefaults_FeatureSetEditionDefault::_table_ = {
  {
    PROTOBUF_FIELD_OFFSET(FeatureSetDefaults_FeatureSetEditionDefault, _impl_._has_bits_),
    0, // no _extensions_
    5, 24,  // max_field_number, fast_idx_mask
    offsetof(decltype(_table_), field_lookup_table),
    4294967267,  // skipmap
    offsetof(decltype(_table_), field_entries),
    3,  // num_field_entries
    3,  // num_aux_entries
    offsetof(decltype(_table_), aux_entries),
    FeatureSetDefaults_FeatureSetEditionDefault_class_data_.base(),
    nullptr,  // post_loop_handler
    ::_pbi::TcParser::GenericFallback,  // fallback
    #ifdef PROTOBUF_PREFETCH_PARSE_TABLE
    ::_pbi::TcParser::GetTable<::google::protobuf::FeatureSetDefaults_FeatureSetEditionDefault>(),  // to_prefetch
    #endif  // PROTOBUF_PREFETCH_PARSE_TABLE
  }, {{
    // optional .google.protobuf.FeatureSet overridable_features = 4;
    {::_pbi::TcParser::FastMtS1,
     {34, 0, 0,
      PROTOBUF_FIELD_OFFSET(FeatureSetDefaults_FeatureSetEditionDefault, _impl_.overridable_features_)}},
    // optional .google.protobuf.FeatureSet fixed_features = 5;
    {::_pbi::TcParser::FastMtS1,
     {42, 1, 1,
      PROTOBUF_FIELD_OFFSET(FeatureSetDefaults_FeatureSetEditionDefault, _impl_.fixed_features_)}},
    {::_pbi::TcParser::MiniParse, {}},
    // optional .google.protobuf.Edition edition = 3;
    {::_pbi::TcParser::FastEvS1,
     {24, 2, 2,
      PROTOBUF_FIELD_OFFSET(FeatureSetDefaults_FeatureSetEditionDefault, _impl_.edition_)}},
  }}, {{
    65535, 65535
  }}, {{
    // optional .google.protobuf.Edition edition = 3;
    {PROTOBUF_FIELD_OFFSET(FeatureSetDefaults_FeatureSetEditionDefault, _impl_.edition_), _Internal::kHasBitsOffset + 2, 2, (0 | ::_fl::kFcOptional | ::_fl::kEnum)},
    // optional .google.protobuf.FeatureSet overridable_features = 4;
    {PROTOBUF_FIELD_OFFSET(FeatureSetDefaults_FeatureSetEditionDefault, _impl_.overridable_features_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)},
    // optional .google.protobuf.FeatureSet fixed_features = 5;
    {PROTOBUF_FIELD_OFFSET(FeatureSetDefaults_FeatureSetEditionDefault, _impl_.fixed_features_), _Internal::kHasBitsOffset + 1, 1, (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)},
  }},
  {{
      {::_pbi::TcParser::GetTable<::google::protobuf::FeatureSet>()},
      {::_pbi::TcParser::GetTable<::google::protobuf::FeatureSet>()},
      {::_pbi::FieldAuxEnumData{}, ::google::protobuf::Edition_internal_data_},
  }},
  {{
  }},
};
PROTOBUF_NOINLINE void FeatureSetDefaults_FeatureSetEditionDefault::Clear() {
// @@protoc_insertion_point(message_clear_start:google.protobuf.FeatureSetDefaults.FeatureSetEditionDefault)
  ::google::protobuf::internal::TSanWrite(&_impl_);
  ::uint32_t cached_has_bits = 0;
  // Prevent compiler warnings about cached_has_bits being unused
  (void) cached_has_bits;

  cached_has_bits = _impl_._has_bits_[0];
  if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) {
    if (CheckHasBit(cached_has_bits, 0x00000001U)) {
      ABSL_DCHECK(_impl_.overridable_features_ != nullptr);
      _impl_.overridable_features_->Clear();
    }
    if (CheckHasBit(cached_has_bits, 0x00000002U)) {
      ABSL_DCHECK(_impl_.fixed_features_ != nullptr);
      _impl_.fixed_features_->Clear();
    }
  }
  _impl_.edition_ = 0;
  _impl_._has_bits_.Clear();
  _internal_metadata_.Clear<::google::protobuf::UnknownFieldSet>();
}

#if defined(PROTOBUF_CUSTOM_VTABLE)
::uint8_t* PROTOBUF_NONNULL FeatureSetDefaults_FeatureSetEditionDefault::_InternalSerialize(
    const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target,
    ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) {
  const FeatureSetDefaults_FeatureSetEditionDefault& this_ = static_cast<const FeatureSetDefaults_FeatureSetEditionDefault&>(base);
#else   // PROTOBUF_CUSTOM_VTABLE
::uint8_t* PROTOBUF_NONNULL FeatureSetDefaults_FeatureSetEditionDefault::_InternalSerialize(
    ::uint8_t* PROTOBUF_NONNULL target,
    ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const {
  const FeatureSetDefaults_FeatureSetEditionDefault& this_ = *this;
#endif  // PROTOBUF_CUSTOM_VTABLE
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    this_.CheckHasBitConsistency();
  }
  // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.FeatureSetDefaults.FeatureSetEditionDefault)
  ::uint32_t cached_has_bits = 0;
  (void)cached_has_bits;

  cached_has_bits = this_._impl_._has_bits_[0];
  // optional .google.protobuf.Edition edition = 3;
  if (CheckHasBit(cached_has_bits, 0x00000004U)) {
    target = stream->EnsureSpace(target);
    target = ::_pbi::WireFormatLite::WriteEnumToArray(
        3, this_._internal_edition(), target);
  }

  // optional .google.protobuf.FeatureSet overridable_features = 4;
  if (CheckHasBit(cached_has_bits, 0x00000001U)) {
    target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage(
        4, *this_._impl_.overridable_features_, this_._impl_.overridable_features_->GetCachedSize(), target,
        stream);
  }

  // optional .google.protobuf.FeatureSet fixed_features = 5;
  if (CheckHasBit(cached_has_bits, 0x00000002U)) {
    target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage(
        5, *this_._impl_.fixed_features_, this_._impl_.fixed_features_->GetCachedSize(), target,
        stream);
  }

  if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) {
    target =
        ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray(
            this_._internal_metadata_.unknown_fields<::google::protobuf::UnknownFieldSet>(::google::protobuf::UnknownFieldSet::default_instance), target, stream);
  }
  // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.FeatureSetDefaults.FeatureSetEditionDefault)
  return target;
}

#if defined(PROTOBUF_CUSTOM_VTABLE)
::size_t FeatureSetDefaults_FeatureSetEditionDefault::ByteSizeLong(const MessageLite& base) {
  const FeatureSetDefaults_FeatureSetEditionDefault& this_ = static_cast<const FeatureSetDefaults_FeatureSetEditionDefault&>(base);
#else   // PROTOBUF_CUSTOM_VTABLE
::size_t FeatureSetDefaults_FeatureSetEditionDefault::ByteSizeLong() const {
  const FeatureSetDefaults_FeatureSetEditionDefault& this_ = *this;
#endif  // PROTOBUF_CUSTOM_VTABLE
  // @@protoc_insertion_point(message_byte_size_start:google.protobuf.FeatureSetDefaults.FeatureSetEditionDefault)
  ::size_t total_size = 0;

  ::uint32_t cached_has_bits = 0;
  // Prevent compiler warnings about cached_has_bits being unused
  (void)cached_has_bits;

  ::_pbi::Prefetch5LinesFrom7Lines(&this_);
  cached_has_bits = this_._impl_._has_bits_[0];
  if (BatchCheckHasBit(cached_has_bits, 0x00000007U)) {
    // optional .google.protobuf.FeatureSet overridable_features = 4;
    if (CheckHasBit(cached_has_bits, 0x00000001U)) {
      total_size += 1 +
                    ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.overridable_features_);
    }
    // optional .google.protobuf.FeatureSet fixed_features = 5;
    if (CheckHasBit(cached_has_bits, 0x00000002U)) {
      total_size += 1 +
                    ::google::protobuf::internal::WireFormatLite::MessageSize(*this_._impl_.fixed_features_);
    }
    // optional .google.protobuf.Edition edition = 3;
    if (CheckHasBit(cached_has_bits, 0x00000004U)) {
      total_size += 1 +
                    ::_pbi::WireFormatLite::EnumSize(this_._internal_edition());
    }
  }
  return this_.MaybeComputeUnknownFieldsSize(total_size,
                                             &this_._impl_._cached_size_);
}

void FeatureSetDefaults_FeatureSetEditionDefault::MergeImpl(::google::protobuf::MessageLite& to_msg,
                            const ::google::protobuf::MessageLite& from_msg) {
   auto* const _this =
      static_cast<FeatureSetDefaults_FeatureSetEditionDefault*>(&to_msg);
  auto& from = static_cast<const FeatureSetDefaults_FeatureSetEditionDefault&>(from_msg);
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    from.CheckHasBitConsistency();
  }
  ::google::protobuf::Arena* arena = _this->GetArena();
  // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.FeatureSetDefaults.FeatureSetEditionDefault)
  ABSL_DCHECK_NE(&from, _this);
  ::uint32_t cached_has_bits = 0;
  (void)cached_has_bits;

  cached_has_bits = from._impl_._has_bits_[0];
  if (BatchCheckHasBit(cached_has_bits, 0x00000007U)) {
    if (CheckHasBit(cached_has_bits, 0x00000001U)) {
      ABSL_DCHECK(from._impl_.overridable_features_ != nullptr);
      if (_this->_impl_.overridable_features_ == nullptr) {
        _this->_impl_.overridable_features_ = ::google::protobuf::Message::CopyConstruct(arena, *from._impl_.overridable_features_);
      } else {
        _this->_impl_.overridable_features_->MergeFrom(*from._impl_.overridable_features_);
      }
    }
    if (CheckHasBit(cached_has_bits, 0x00000002U)) {
      ABSL_DCHECK(from._impl_.fixed_features_ != nullptr);
      if (_this->_impl_.fixed_features_ == nullptr) {
        _this->_impl_.fixed_features_ = ::google::protobuf::Message::CopyConstruct(arena, *from._impl_.fixed_features_);
      } else {
        _this->_impl_.fixed_features_->MergeFrom(*from._impl_.fixed_features_);
      }
    }
    if (CheckHasBit(cached_has_bits, 0x00000004U)) {
      _this->_impl_.edition_ = from._impl_.edition_;
    }
  }
  _this->_impl_._has_bits_[0] |= cached_has_bits;
  _this->_internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(
      from._internal_metadata_);
}

void FeatureSetDefaults_FeatureSetEditionDefault::CopyFrom(const FeatureSetDefaults_FeatureSetEditionDefault& from) {
  // @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.FeatureSetDefaults.FeatureSetEditionDefault)
  if (&from == this) return;
  Clear();
  MergeFrom(from);
}

PROTOBUF_NOINLINE bool FeatureSetDefaults_FeatureSetEditionDefault::IsInitializedImpl(
    const MessageLite& msg) {
  auto& this_ = static_cast<const FeatureSetDefaults_FeatureSetEditionDefault&>(msg);
  if (CheckHasBit(this_._impl_._has_bits_[0], 0x00000001U)) {
    if (!this_._impl_.overridable_features_->IsInitialized()) return false;
  }
  if (CheckHasBit(this_._impl_._has_bits_[0], 0x00000002U)) {
    if (!this_._impl_.fixed_features_->IsInitialized()) return false;
  }
  return true;
}

void FeatureSetDefaults_FeatureSetEditionDefault::InternalSwap(FeatureSetDefaults_FeatureSetEditionDefault* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) {
  using ::std::swap;
  _internal_metadata_.InternalSwap(&other->_internal_metadata_);
  swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]);
  ::google::protobuf::internal::memswap<
      PROTOBUF_FIELD_OFFSET(FeatureSetDefaults_FeatureSetEditionDefault, _impl_.edition_)
      + sizeof(FeatureSetDefaults_FeatureSetEditionDefault::_impl_.edition_)
      - PROTOBUF_FIELD_OFFSET(FeatureSetDefaults_FeatureSetEditionDefault, _impl_.overridable_features_)>(
          reinterpret_cast<char*>(&_impl_.overridable_features_),
          reinterpret_cast<char*>(&other->_impl_.overridable_features_));
}

::google::protobuf::Metadata FeatureSetDefaults_FeatureSetEditionDefault::GetMetadata() const {
  return ::google::protobuf::Message::GetMetadataImpl(GetClassData()->full());
}
// ===================================================================

class FeatureSetDefaults::_Internal {
 public:
  using HasBits =
      decltype(::std::declval<FeatureSetDefaults>()._impl_._has_bits_);
  static constexpr ::int32_t kHasBitsOffset =
      8 * PROTOBUF_FIELD_OFFSET(FeatureSetDefaults, _impl_._has_bits_);
};

FeatureSetDefaults::FeatureSetDefaults(::google::protobuf::Arena* PROTOBUF_NULLABLE arena)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(arena, FeatureSetDefaults_class_data_.base()) {
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(arena) {
#endif  // PROTOBUF_CUSTOM_VTABLE
  SharedCtor(arena);
  // @@protoc_insertion_point(arena_constructor:google.protobuf.FeatureSetDefaults)
}
PROTOBUF_NDEBUG_INLINE FeatureSetDefaults::Impl_::Impl_(
    [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility,
    [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from,
    [[maybe_unused]] const ::google::protobuf::FeatureSetDefaults& from_msg)
      : _has_bits_{from._has_bits_},
        _cached_size_{0},
        defaults_{visibility, arena, from.defaults_} {}

FeatureSetDefaults::FeatureSetDefaults(
    ::google::protobuf::Arena* PROTOBUF_NULLABLE arena,
    const FeatureSetDefaults& from)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(arena, FeatureSetDefaults_class_data_.base()) {
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(arena) {
#endif  // PROTOBUF_CUSTOM_VTABLE
  FeatureSetDefaults* const _this = this;
  (void)_this;
  _internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(
      from._internal_metadata_);
  new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from);
  ::memcpy(reinterpret_cast<char*>(&_impl_) +
               offsetof(Impl_, minimum_edition_),
           reinterpret_cast<const char*>(&from._impl_) +
               offsetof(Impl_, minimum_edition_),
           offsetof(Impl_, maximum_edition_) -
               offsetof(Impl_, minimum_edition_) +
               sizeof(Impl_::maximum_edition_));

  // @@protoc_insertion_point(copy_constructor:google.protobuf.FeatureSetDefaults)
}
PROTOBUF_NDEBUG_INLINE FeatureSetDefaults::Impl_::Impl_(
    [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility,
    [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena)
      : _cached_size_{0},
        defaults_{visibility, arena} {}

inline void FeatureSetDefaults::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) {
  new (&_impl_) Impl_(internal_visibility(), arena);
  ::memset(reinterpret_cast<char*>(&_impl_) +
               offsetof(Impl_, minimum_edition_),
           0,
           offsetof(Impl_, maximum_edition_) -
               offsetof(Impl_, minimum_edition_) +
               sizeof(Impl_::maximum_edition_));
}
FeatureSetDefaults::~FeatureSetDefaults() {
  // @@protoc_insertion_point(destructor:google.protobuf.FeatureSetDefaults)
  SharedDtor(*this);
}
inline void FeatureSetDefaults::SharedDtor(MessageLite& self) {
  FeatureSetDefaults& this_ = static_cast<FeatureSetDefaults&>(self);
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    this_.CheckHasBitConsistency();
  }
  this_._internal_metadata_.Delete<::google::protobuf::UnknownFieldSet>();
  ABSL_DCHECK(this_.GetArena() == nullptr);
  this_._impl_.~Impl_();
}

inline void* PROTOBUF_NONNULL FeatureSetDefaults::PlacementNew_(
    const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem,
    ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) {
  return ::new (mem) FeatureSetDefaults(arena);
}
constexpr auto FeatureSetDefaults::InternalNewImpl_() {
  constexpr auto arena_bits = ::google::protobuf::internal::EncodePlacementArenaOffsets({
      PROTOBUF_FIELD_OFFSET(FeatureSetDefaults, _impl_.defaults_) +
          decltype(FeatureSetDefaults::_impl_.defaults_)::
              InternalGetArenaOffset(
                  ::google::protobuf::Message::internal_visibility()),
  });
  if (arena_bits.has_value()) {
    return ::google::protobuf::internal::MessageCreator::ZeroInit(
        sizeof(FeatureSetDefaults), alignof(FeatureSetDefaults), *arena_bits);
  } else {
    return ::google::protobuf::internal::MessageCreator(&FeatureSetDefaults::PlacementNew_,
                                 sizeof(FeatureSetDefaults),
                                 alignof(FeatureSetDefaults));
  }
}
constexpr auto FeatureSetDefaults::InternalGenerateClassData_() {
  return ::google::protobuf::internal::ClassDataFull{
      ::google::protobuf::internal::ClassData{
          &_FeatureSetDefaults_default_instance_._instance,
          &_table_.header,
          nullptr,  // OnDemandRegisterArenaDtor
          FeatureSetDefaults::IsInitializedImpl,
          &FeatureSetDefaults::MergeImpl,
          ::google::protobuf::Message::GetNewImpl<FeatureSetDefaults>(),
#if defined(PROTOBUF_CUSTOM_VTABLE)
          &FeatureSetDefaults::SharedDtor,
          ::google::protobuf::Message::GetClearImpl<FeatureSetDefaults>(), &FeatureSetDefaults::ByteSizeLong,
              &FeatureSetDefaults::_InternalSerialize,
#endif  // PROTOBUF_CUSTOM_VTABLE
          PROTOBUF_FIELD_OFFSET(FeatureSetDefaults, _impl_._cached_size_),
          false,
      },
      &FeatureSetDefaults::kDescriptorMethods,
      &descriptor_table_google_2fprotobuf_2fdescriptor_2eproto,
      nullptr,  // tracker
  };
}

PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 const
    ::google::protobuf::internal::ClassDataFull FeatureSetDefaults_class_data_ =
        FeatureSetDefaults::InternalGenerateClassData_();

PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL
FeatureSetDefaults::GetClassData() const {
  ::google::protobuf::internal::PrefetchToLocalCache(&FeatureSetDefaults_class_data_);
  ::google::protobuf::internal::PrefetchToLocalCache(FeatureSetDefaults_class_data_.tc_table);
  return FeatureSetDefaults_class_data_.base();
}
constexpr ::_pbi::TcParseTable<1, 3, 3, 0, 2>
FeatureSetDefaults::_table_ = {
  {
    PROTOBUF_FIELD_OFFSET(FeatureSetDefaults, _impl_._has_bits_),
    0, // no _extensions_
    5, 8,  // max_field_number, fast_idx_mask
    offsetof(decltype(_table_), field_lookup_table),
    4294967270,  // skipmap
    offsetof(decltype(_table_), field_entries),
    3,  // num_field_entries
    3,  // num_aux_entries
    offsetof(decltype(_table_), aux_entries),
    FeatureSetDefaults_class_data_.base(),
    nullptr,  // post_loop_handler
    ::_pbi::TcParser::GenericFallback,  // fallback
    #ifdef PROTOBUF_PREFETCH_PARSE_TABLE
    ::_pbi::TcParser::GetTable<::google::protobuf::FeatureSetDefaults>(),  // to_prefetch
    #endif  // PROTOBUF_PREFETCH_PARSE_TABLE
  }, {{
    // optional .google.protobuf.Edition minimum_edition = 4;
    {::_pbi::TcParser::FastEvS1,
     {32, 1, 1,
      PROTOBUF_FIELD_OFFSET(FeatureSetDefaults, _impl_.minimum_edition_)}},
    // repeated .google.protobuf.FeatureSetDefaults.FeatureSetEditionDefault defaults = 1;
    {::_pbi::TcParser::FastMtR1,
     {10, 0, 0,
      PROTOBUF_FIELD_OFFSET(FeatureSetDefaults, _impl_.defaults_)}},
  }}, {{
    65535, 65535
  }}, {{
    // repeated .google.protobuf.FeatureSetDefaults.FeatureSetEditionDefault defaults = 1;
    {PROTOBUF_FIELD_OFFSET(FeatureSetDefaults, _impl_.defaults_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)},
    // optional .google.protobuf.Edition minimum_edition = 4;
    {PROTOBUF_FIELD_OFFSET(FeatureSetDefaults, _impl_.minimum_edition_), _Internal::kHasBitsOffset + 1, 1, (0 | ::_fl::kFcOptional | ::_fl::kEnum)},
    // optional .google.protobuf.Edition maximum_edition = 5;
    {PROTOBUF_FIELD_OFFSET(FeatureSetDefaults, _impl_.maximum_edition_), _Internal::kHasBitsOffset + 2, 2, (0 | ::_fl::kFcOptional | ::_fl::kEnum)},
  }},
  {{
      {::_pbi::TcParser::GetTable<::google::protobuf::FeatureSetDefaults_FeatureSetEditionDefault>()},
      {::_pbi::FieldAuxEnumData{}, ::google::protobuf::Edition_internal_data_},
      {::_pbi::FieldAuxEnumData{}, ::google::protobuf::Edition_internal_data_},
  }},
  {{
  }},
};
PROTOBUF_NOINLINE void FeatureSetDefaults::Clear() {
// @@protoc_insertion_point(message_clear_start:google.protobuf.FeatureSetDefaults)
  ::google::protobuf::internal::TSanWrite(&_impl_);
  ::uint32_t cached_has_bits = 0;
  // Prevent compiler warnings about cached_has_bits being unused
  (void) cached_has_bits;

  cached_has_bits = _impl_._has_bits_[0];
  if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) {
    _impl_.defaults_.Clear();
  }
  if (BatchCheckHasBit(cached_has_bits, 0x00000006U)) {
    ::memset(&_impl_.minimum_edition_, 0, static_cast<::size_t>(
        reinterpret_cast<char*>(&_impl_.maximum_edition_) -
        reinterpret_cast<char*>(&_impl_.minimum_edition_)) + sizeof(_impl_.maximum_edition_));
  }
  _impl_._has_bits_.Clear();
  _internal_metadata_.Clear<::google::protobuf::UnknownFieldSet>();
}

#if defined(PROTOBUF_CUSTOM_VTABLE)
::uint8_t* PROTOBUF_NONNULL FeatureSetDefaults::_InternalSerialize(
    const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target,
    ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) {
  const FeatureSetDefaults& this_ = static_cast<const FeatureSetDefaults&>(base);
#else   // PROTOBUF_CUSTOM_VTABLE
::uint8_t* PROTOBUF_NONNULL FeatureSetDefaults::_InternalSerialize(
    ::uint8_t* PROTOBUF_NONNULL target,
    ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const {
  const FeatureSetDefaults& this_ = *this;
#endif  // PROTOBUF_CUSTOM_VTABLE
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    this_.CheckHasBitConsistency();
  }
  // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.FeatureSetDefaults)
  ::uint32_t cached_has_bits = 0;
  (void)cached_has_bits;

  cached_has_bits = this_._impl_._has_bits_[0];
  // repeated .google.protobuf.FeatureSetDefaults.FeatureSetEditionDefault defaults = 1;
  if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) {
    for (unsigned i = 0, n = static_cast<unsigned>(
                             this_._internal_defaults_size());
         i < n; i++) {
      const auto& repfield = this_._internal_defaults().Get(i);
      target =
          ::google::protobuf::internal::WireFormatLite::InternalWriteMessage(
              1, repfield, repfield.GetCachedSize(),
              target, stream);
    }
  }

  // optional .google.protobuf.Edition minimum_edition = 4;
  if (CheckHasBit(cached_has_bits, 0x00000002U)) {
    target = stream->EnsureSpace(target);
    target = ::_pbi::WireFormatLite::WriteEnumToArray(
        4, this_._internal_minimum_edition(), target);
  }

  // optional .google.protobuf.Edition maximum_edition = 5;
  if (CheckHasBit(cached_has_bits, 0x00000004U)) {
    target = stream->EnsureSpace(target);
    target = ::_pbi::WireFormatLite::WriteEnumToArray(
        5, this_._internal_maximum_edition(), target);
  }

  if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) {
    target =
        ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray(
            this_._internal_metadata_.unknown_fields<::google::protobuf::UnknownFieldSet>(::google::protobuf::UnknownFieldSet::default_instance), target, stream);
  }
  // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.FeatureSetDefaults)
  return target;
}

#if defined(PROTOBUF_CUSTOM_VTABLE)
::size_t FeatureSetDefaults::ByteSizeLong(const MessageLite& base) {
  const FeatureSetDefaults& this_ = static_cast<const FeatureSetDefaults&>(base);
#else   // PROTOBUF_CUSTOM_VTABLE
::size_t FeatureSetDefaults::ByteSizeLong() const {
  const FeatureSetDefaults& this_ = *this;
#endif  // PROTOBUF_CUSTOM_VTABLE
  // @@protoc_insertion_point(message_byte_size_start:google.protobuf.FeatureSetDefaults)
  ::size_t total_size = 0;

  ::uint32_t cached_has_bits = 0;
  // Prevent compiler warnings about cached_has_bits being unused
  (void)cached_has_bits;

  ::_pbi::Prefetch5LinesFrom7Lines(&this_);
  cached_has_bits = this_._impl_._has_bits_[0];
  if (BatchCheckHasBit(cached_has_bits, 0x00000007U)) {
    // repeated .google.protobuf.FeatureSetDefaults.FeatureSetEditionDefault defaults = 1;
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) {
      total_size += 1UL * this_._internal_defaults_size();
      for (const auto& msg : this_._internal_defaults()) {
        total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg);
      }
    }
    // optional .google.protobuf.Edition minimum_edition = 4;
    if (CheckHasBit(cached_has_bits, 0x00000002U)) {
      total_size += 1 +
                    ::_pbi::WireFormatLite::EnumSize(this_._internal_minimum_edition());
    }
    // optional .google.protobuf.Edition maximum_edition = 5;
    if (CheckHasBit(cached_has_bits, 0x00000004U)) {
      total_size += 1 +
                    ::_pbi::WireFormatLite::EnumSize(this_._internal_maximum_edition());
    }
  }
  return this_.MaybeComputeUnknownFieldsSize(total_size,
                                             &this_._impl_._cached_size_);
}

void FeatureSetDefaults::MergeImpl(::google::protobuf::MessageLite& to_msg,
                            const ::google::protobuf::MessageLite& from_msg) {
   auto* const _this =
      static_cast<FeatureSetDefaults*>(&to_msg);
  auto& from = static_cast<const FeatureSetDefaults&>(from_msg);
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    from.CheckHasBitConsistency();
  }
  ::google::protobuf::Arena* arena = _this->GetArena();
  // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.FeatureSetDefaults)
  ABSL_DCHECK_NE(&from, _this);
  ::uint32_t cached_has_bits = 0;
  (void)cached_has_bits;

  cached_has_bits = from._impl_._has_bits_[0];
  if (BatchCheckHasBit(cached_has_bits, 0x00000007U)) {
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) {
      _this->_internal_mutable_defaults()->InternalMergeFromWithArena(
          ::google::protobuf::MessageLite::internal_visibility(), arena,
          from._internal_defaults());
    }
    if (CheckHasBit(cached_has_bits, 0x00000002U)) {
      _this->_impl_.minimum_edition_ = from._impl_.minimum_edition_;
    }
    if (CheckHasBit(cached_has_bits, 0x00000004U)) {
      _this->_impl_.maximum_edition_ = from._impl_.maximum_edition_;
    }
  }
  _this->_impl_._has_bits_[0] |= cached_has_bits;
  _this->_internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(
      from._internal_metadata_);
}

void FeatureSetDefaults::CopyFrom(const FeatureSetDefaults& from) {
  // @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.FeatureSetDefaults)
  if (&from == this) return;
  Clear();
  MergeFrom(from);
}

PROTOBUF_NOINLINE bool FeatureSetDefaults::IsInitializedImpl(
    const MessageLite& msg) {
  auto& this_ = static_cast<const FeatureSetDefaults&>(msg);
  if (!::google::protobuf::internal::AllAreInitialized(this_._internal_defaults()))
    return false;
  return true;
}

void FeatureSetDefaults::InternalSwap(FeatureSetDefaults* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) {
  using ::std::swap;
  _internal_metadata_.InternalSwap(&other->_internal_metadata_);
  swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]);
  _impl_.defaults_.InternalSwap(&other->_impl_.defaults_);
  ::google::protobuf::internal::memswap<
      PROTOBUF_FIELD_OFFSET(FeatureSetDefaults, _impl_.maximum_edition_)
      + sizeof(FeatureSetDefaults::_impl_.maximum_edition_)
      - PROTOBUF_FIELD_OFFSET(FeatureSetDefaults, _impl_.minimum_edition_)>(
          reinterpret_cast<char*>(&_impl_.minimum_edition_),
          reinterpret_cast<char*>(&other->_impl_.minimum_edition_));
}

::google::protobuf::Metadata FeatureSetDefaults::GetMetadata() const {
  return ::google::protobuf::Message::GetMetadataImpl(GetClassData()->full());
}
// ===================================================================

class SourceCodeInfo_Location::_Internal {
 public:
  using HasBits =
      decltype(::std::declval<SourceCodeInfo_Location>()._impl_._has_bits_);
  static constexpr ::int32_t kHasBitsOffset =
      8 * PROTOBUF_FIELD_OFFSET(SourceCodeInfo_Location, _impl_._has_bits_);
};

SourceCodeInfo_Location::SourceCodeInfo_Location(::google::protobuf::Arena* PROTOBUF_NULLABLE arena)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(arena, SourceCodeInfo_Location_class_data_.base()) {
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(arena) {
#endif  // PROTOBUF_CUSTOM_VTABLE
  SharedCtor(arena);
  // @@protoc_insertion_point(arena_constructor:google.protobuf.SourceCodeInfo.Location)
}
PROTOBUF_NDEBUG_INLINE SourceCodeInfo_Location::Impl_::Impl_(
    [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility,
    [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from,
    [[maybe_unused]] const ::google::protobuf::SourceCodeInfo_Location& from_msg)
      : _has_bits_{from._has_bits_},
        _cached_size_{0},
        path_{visibility, arena, from.path_},
        _path_cached_byte_size_{0},
        span_{visibility, arena, from.span_},
        _span_cached_byte_size_{0},
        leading_detached_comments_{visibility, arena, from.leading_detached_comments_},
        leading_comments_(arena, from.leading_comments_),
        trailing_comments_(arena, from.trailing_comments_) {}

SourceCodeInfo_Location::SourceCodeInfo_Location(
    ::google::protobuf::Arena* PROTOBUF_NULLABLE arena,
    const SourceCodeInfo_Location& from)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(arena, SourceCodeInfo_Location_class_data_.base()) {
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(arena) {
#endif  // PROTOBUF_CUSTOM_VTABLE
  SourceCodeInfo_Location* const _this = this;
  (void)_this;
  _internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(
      from._internal_metadata_);
  new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from);

  // @@protoc_insertion_point(copy_constructor:google.protobuf.SourceCodeInfo.Location)
}
PROTOBUF_NDEBUG_INLINE SourceCodeInfo_Location::Impl_::Impl_(
    [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility,
    [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena)
      : _cached_size_{0},
        path_{visibility, arena},
        _path_cached_byte_size_{0},
        span_{visibility, arena},
        _span_cached_byte_size_{0},
        leading_detached_comments_{visibility, arena},
        leading_comments_(arena),
        trailing_comments_(arena) {}

inline void SourceCodeInfo_Location::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) {
  new (&_impl_) Impl_(internal_visibility(), arena);
}
SourceCodeInfo_Location::~SourceCodeInfo_Location() {
  // @@protoc_insertion_point(destructor:google.protobuf.SourceCodeInfo.Location)
  SharedDtor(*this);
}
inline void SourceCodeInfo_Location::SharedDtor(MessageLite& self) {
  SourceCodeInfo_Location& this_ = static_cast<SourceCodeInfo_Location&>(self);
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    this_.CheckHasBitConsistency();
  }
  this_._internal_metadata_.Delete<::google::protobuf::UnknownFieldSet>();
  ABSL_DCHECK(this_.GetArena() == nullptr);
  this_._impl_.leading_comments_.Destroy();
  this_._impl_.trailing_comments_.Destroy();
  this_._impl_.~Impl_();
}

inline void* PROTOBUF_NONNULL SourceCodeInfo_Location::PlacementNew_(
    const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem,
    ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) {
  return ::new (mem) SourceCodeInfo_Location(arena);
}
constexpr auto SourceCodeInfo_Location::InternalNewImpl_() {
  constexpr auto arena_bits = ::google::protobuf::internal::EncodePlacementArenaOffsets({
      PROTOBUF_FIELD_OFFSET(SourceCodeInfo_Location, _impl_.path_) +
          decltype(SourceCodeInfo_Location::_impl_.path_)::
              InternalGetArenaOffset(
                  ::google::protobuf::Message::internal_visibility()),
      PROTOBUF_FIELD_OFFSET(SourceCodeInfo_Location, _impl_.span_) +
          decltype(SourceCodeInfo_Location::_impl_.span_)::
              InternalGetArenaOffset(
                  ::google::protobuf::Message::internal_visibility()),
      PROTOBUF_FIELD_OFFSET(SourceCodeInfo_Location, _impl_.leading_detached_comments_) +
          decltype(SourceCodeInfo_Location::_impl_.leading_detached_comments_)::
              InternalGetArenaOffset(
                  ::google::protobuf::Message::internal_visibility()),
  });
  if (arena_bits.has_value()) {
    return ::google::protobuf::internal::MessageCreator::CopyInit(
        sizeof(SourceCodeInfo_Location), alignof(SourceCodeInfo_Location), *arena_bits);
  } else {
    return ::google::protobuf::internal::MessageCreator(&SourceCodeInfo_Location::PlacementNew_,
                                 sizeof(SourceCodeInfo_Location),
                                 alignof(SourceCodeInfo_Location));
  }
}
constexpr auto SourceCodeInfo_Location::InternalGenerateClassData_() {
  return ::google::protobuf::internal::ClassDataFull{
      ::google::protobuf::internal::ClassData{
          &_SourceCodeInfo_Location_default_instance_._instance,
          &_table_.header,
          nullptr,  // OnDemandRegisterArenaDtor
          nullptr,  // IsInitialized
          &SourceCodeInfo_Location::MergeImpl,
          ::google::protobuf::Message::GetNewImpl<SourceCodeInfo_Location>(),
#if defined(PROTOBUF_CUSTOM_VTABLE)
          &SourceCodeInfo_Location::SharedDtor,
          ::google::protobuf::Message::GetClearImpl<SourceCodeInfo_Location>(), &SourceCodeInfo_Location::ByteSizeLong,
              &SourceCodeInfo_Location::_InternalSerialize,
#endif  // PROTOBUF_CUSTOM_VTABLE
          PROTOBUF_FIELD_OFFSET(SourceCodeInfo_Location, _impl_._cached_size_),
          false,
      },
      &SourceCodeInfo_Location::kDescriptorMethods,
      &descriptor_table_google_2fprotobuf_2fdescriptor_2eproto,
      nullptr,  // tracker
  };
}

PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 const
    ::google::protobuf::internal::ClassDataFull SourceCodeInfo_Location_class_data_ =
        SourceCodeInfo_Location::InternalGenerateClassData_();

PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL
SourceCodeInfo_Location::GetClassData() const {
  ::google::protobuf::internal::PrefetchToLocalCache(&SourceCodeInfo_Location_class_data_);
  ::google::protobuf::internal::PrefetchToLocalCache(SourceCodeInfo_Location_class_data_.tc_table);
  return SourceCodeInfo_Location_class_data_.base();
}
constexpr ::_pbi::TcParseTable<3, 5, 0, 0, 2>
SourceCodeInfo_Location::_table_ = {
  {
    PROTOBUF_FIELD_OFFSET(SourceCodeInfo_Location, _impl_._has_bits_),
    0, // no _extensions_
    6, 56,  // max_field_number, fast_idx_mask
    offsetof(decltype(_table_), field_lookup_table),
    4294967248,  // skipmap
    offsetof(decltype(_table_), field_entries),
    5,  // num_field_entries
    0,  // num_aux_entries
    offsetof(decltype(_table_), field_names),  // no aux_entries
    SourceCodeInfo_Location_class_data_.base(),
    nullptr,  // post_loop_handler
    ::_pbi::TcParser::GenericFallback,  // fallback
    #ifdef PROTOBUF_PREFETCH_PARSE_TABLE
    ::_pbi::TcParser::GetTable<::google::protobuf::SourceCodeInfo_Location>(),  // to_prefetch
    #endif  // PROTOBUF_PREFETCH_PARSE_TABLE
  }, {{
    {::_pbi::TcParser::MiniParse, {}},
    // repeated int32 path = 1 [packed = true];
    {::_pbi::TcParser::FastV32P1,
     {10, 0, 0,
      PROTOBUF_FIELD_OFFSET(SourceCodeInfo_Location, _impl_.path_)}},
    // repeated int32 span = 2 [packed = true];
    {::_pbi::TcParser::FastV32P1,
     {18, 1, 0,
      PROTOBUF_FIELD_OFFSET(SourceCodeInfo_Location, _impl_.span_)}},
    // optional string leading_comments = 3;
    {::_pbi::TcParser::FastBS1,
     {26, 3, 0,
      PROTOBUF_FIELD_OFFSET(SourceCodeInfo_Location, _impl_.leading_comments_)}},
    // optional string trailing_comments = 4;
    {::_pbi::TcParser::FastBS1,
     {34, 4, 0,
      PROTOBUF_FIELD_OFFSET(SourceCodeInfo_Location, _impl_.trailing_comments_)}},
    {::_pbi::TcParser::MiniParse, {}},
    // repeated string leading_detached_comments = 6;
    {::_pbi::TcParser::FastBR1,
     {50, 2, 0,
      PROTOBUF_FIELD_OFFSET(SourceCodeInfo_Location, _impl_.leading_detached_comments_)}},
    {::_pbi::TcParser::MiniParse, {}},
  }}, {{
    65535, 65535
  }}, {{
    // repeated int32 path = 1 [packed = true];
    {PROTOBUF_FIELD_OFFSET(SourceCodeInfo_Location, _impl_.path_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcRepeated | ::_fl::kPackedInt32)},
    // repeated int32 span = 2 [packed = true];
    {PROTOBUF_FIELD_OFFSET(SourceCodeInfo_Location, _impl_.span_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcRepeated | ::_fl::kPackedInt32)},
    // optional string leading_comments = 3;
    {PROTOBUF_FIELD_OFFSET(SourceCodeInfo_Location, _impl_.leading_comments_), _Internal::kHasBitsOffset + 3, 0, (0 | ::_fl::kFcOptional | ::_fl::kBytes | ::_fl::kRepAString)},
    // optional string trailing_comments = 4;
    {PROTOBUF_FIELD_OFFSET(SourceCodeInfo_Location, _impl_.trailing_comments_), _Internal::kHasBitsOffset + 4, 0, (0 | ::_fl::kFcOptional | ::_fl::kBytes | ::_fl::kRepAString)},
    // repeated string leading_detached_comments = 6;
    {PROTOBUF_FIELD_OFFSET(SourceCodeInfo_Location, _impl_.leading_detached_comments_), _Internal::kHasBitsOffset + 2, 0, (0 | ::_fl::kFcRepeated | ::_fl::kBytes | ::_fl::kRepSString)},
  }},
  // no aux_entries
  {{
  }},
};
PROTOBUF_NOINLINE void SourceCodeInfo_Location::Clear() {
// @@protoc_insertion_point(message_clear_start:google.protobuf.SourceCodeInfo.Location)
  ::google::protobuf::internal::TSanWrite(&_impl_);
  ::uint32_t cached_has_bits = 0;
  // Prevent compiler warnings about cached_has_bits being unused
  (void) cached_has_bits;

  cached_has_bits = _impl_._has_bits_[0];
  if (BatchCheckHasBit(cached_has_bits, 0x0000001fU)) {
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) {
      _impl_.path_.Clear();
    }
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000002U)) {
      _impl_.span_.Clear();
    }
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000004U)) {
      _impl_.leading_detached_comments_.Clear();
    }
    if (CheckHasBit(cached_has_bits, 0x00000008U)) {
      _impl_.leading_comments_.ClearNonDefaultToEmpty();
    }
    if (CheckHasBit(cached_has_bits, 0x00000010U)) {
      _impl_.trailing_comments_.ClearNonDefaultToEmpty();
    }
  }
  _impl_._has_bits_.Clear();
  _internal_metadata_.Clear<::google::protobuf::UnknownFieldSet>();
}

#if defined(PROTOBUF_CUSTOM_VTABLE)
::uint8_t* PROTOBUF_NONNULL SourceCodeInfo_Location::_InternalSerialize(
    const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target,
    ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) {
  const SourceCodeInfo_Location& this_ = static_cast<const SourceCodeInfo_Location&>(base);
#else   // PROTOBUF_CUSTOM_VTABLE
::uint8_t* PROTOBUF_NONNULL SourceCodeInfo_Location::_InternalSerialize(
    ::uint8_t* PROTOBUF_NONNULL target,
    ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const {
  const SourceCodeInfo_Location& this_ = *this;
#endif  // PROTOBUF_CUSTOM_VTABLE
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    this_.CheckHasBitConsistency();
  }
  // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.SourceCodeInfo.Location)
  ::uint32_t cached_has_bits = 0;
  (void)cached_has_bits;

  cached_has_bits = this_._impl_._has_bits_[0];
  // repeated int32 path = 1 [packed = true];
  if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) {
    {
      int byte_size = this_._impl_._path_cached_byte_size_.Get();
      if (byte_size > 0) {
        target = stream->WriteInt32Packed(
            1, this_._internal_path(), byte_size, target);
      }
    }
  }

  // repeated int32 span = 2 [packed = true];
  if (CheckHasBitForRepeated(cached_has_bits, 0x00000002U)) {
    {
      int byte_size = this_._impl_._span_cached_byte_size_.Get();
      if (byte_size > 0) {
        target = stream->WriteInt32Packed(
            2, this_._internal_span(), byte_size, target);
      }
    }
  }

  // optional string leading_comments = 3;
  if (CheckHasBit(cached_has_bits, 0x00000008U)) {
    const ::std::string& _s = this_._internal_leading_comments();
    target = stream->WriteStringMaybeAliased(3, _s, target);
  }

  // optional string trailing_comments = 4;
  if (CheckHasBit(cached_has_bits, 0x00000010U)) {
    const ::std::string& _s = this_._internal_trailing_comments();
    target = stream->WriteStringMaybeAliased(4, _s, target);
  }

  // repeated string leading_detached_comments = 6;
  if (CheckHasBitForRepeated(cached_has_bits, 0x00000004U)) {
    for (int i = 0, n = this_._internal_leading_detached_comments_size(); i < n; ++i) {
      const auto& s = this_._internal_leading_detached_comments().Get(i);
      target = stream->WriteString(6, s, target);
    }
  }

  if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) {
    target =
        ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray(
            this_._internal_metadata_.unknown_fields<::google::protobuf::UnknownFieldSet>(::google::protobuf::UnknownFieldSet::default_instance), target, stream);
  }
  // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.SourceCodeInfo.Location)
  return target;
}

#if defined(PROTOBUF_CUSTOM_VTABLE)
::size_t SourceCodeInfo_Location::ByteSizeLong(const MessageLite& base) {
  const SourceCodeInfo_Location& this_ = static_cast<const SourceCodeInfo_Location&>(base);
#else   // PROTOBUF_CUSTOM_VTABLE
::size_t SourceCodeInfo_Location::ByteSizeLong() const {
  const SourceCodeInfo_Location& this_ = *this;
#endif  // PROTOBUF_CUSTOM_VTABLE
  // @@protoc_insertion_point(message_byte_size_start:google.protobuf.SourceCodeInfo.Location)
  ::size_t total_size = 0;

  ::uint32_t cached_has_bits = 0;
  // Prevent compiler warnings about cached_has_bits being unused
  (void)cached_has_bits;

  ::_pbi::Prefetch5LinesFrom7Lines(&this_);
  cached_has_bits = this_._impl_._has_bits_[0];
  if (BatchCheckHasBit(cached_has_bits, 0x0000001fU)) {
    // repeated int32 path = 1 [packed = true];
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) {
      total_size +=
          ::_pbi::WireFormatLite::Int32SizeWithPackedTagSize(
              this_._internal_path(), 1,
              this_._impl_._path_cached_byte_size_);
    }
    // repeated int32 span = 2 [packed = true];
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000002U)) {
      total_size +=
          ::_pbi::WireFormatLite::Int32SizeWithPackedTagSize(
              this_._internal_span(), 1,
              this_._impl_._span_cached_byte_size_);
    }
    // repeated string leading_detached_comments = 6;
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000004U)) {
      total_size +=
          1 * ::google::protobuf::internal::FromIntSize(this_._internal_leading_detached_comments().size());
      for (int i = 0, n = this_._internal_leading_detached_comments().size(); i < n; ++i) {
        total_size += ::google::protobuf::internal::WireFormatLite::StringSize(
            this_._internal_leading_detached_comments().Get(i));
      }
    }
    // optional string leading_comments = 3;
    if (CheckHasBit(cached_has_bits, 0x00000008U)) {
      total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize(
                                      this_._internal_leading_comments());
    }
    // optional string trailing_comments = 4;
    if (CheckHasBit(cached_has_bits, 0x00000010U)) {
      total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize(
                                      this_._internal_trailing_comments());
    }
  }
  return this_.MaybeComputeUnknownFieldsSize(total_size,
                                             &this_._impl_._cached_size_);
}

void SourceCodeInfo_Location::MergeImpl(::google::protobuf::MessageLite& to_msg,
                            const ::google::protobuf::MessageLite& from_msg) {
   auto* const _this =
      static_cast<SourceCodeInfo_Location*>(&to_msg);
  auto& from = static_cast<const SourceCodeInfo_Location&>(from_msg);
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    from.CheckHasBitConsistency();
  }
  ::google::protobuf::Arena* arena = _this->GetArena();
  // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.SourceCodeInfo.Location)
  ABSL_DCHECK_NE(&from, _this);
  ::uint32_t cached_has_bits = 0;
  (void)cached_has_bits;

  cached_has_bits = from._impl_._has_bits_[0];
  if (BatchCheckHasBit(cached_has_bits, 0x0000001fU)) {
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) {
      _this->_internal_mutable_path()->MergeFrom(from._internal_path());
    }
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000002U)) {
      _this->_internal_mutable_span()->MergeFrom(from._internal_span());
    }
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000004U)) {
      _this->_internal_mutable_leading_detached_comments()->InternalMergeFromWithArena(
          ::google::protobuf::MessageLite::internal_visibility(), arena,
          from._internal_leading_detached_comments());
    }
    if (CheckHasBit(cached_has_bits, 0x00000008U)) {
      _this->_internal_set_leading_comments(from._internal_leading_comments());
    }
    if (CheckHasBit(cached_has_bits, 0x00000010U)) {
      _this->_internal_set_trailing_comments(from._internal_trailing_comments());
    }
  }
  _this->_impl_._has_bits_[0] |= cached_has_bits;
  _this->_internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(
      from._internal_metadata_);
}

void SourceCodeInfo_Location::CopyFrom(const SourceCodeInfo_Location& from) {
  // @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.SourceCodeInfo.Location)
  if (&from == this) return;
  Clear();
  MergeFrom(from);
}


void SourceCodeInfo_Location::InternalSwap(SourceCodeInfo_Location* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) {
  using ::std::swap;
  auto* arena = GetArena();
  ABSL_DCHECK_EQ(arena, other->GetArena());
  _internal_metadata_.InternalSwap(&other->_internal_metadata_);
  swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]);
  _impl_.path_.InternalSwap(&other->_impl_.path_);
  _impl_.span_.InternalSwap(&other->_impl_.span_);
  _impl_.leading_detached_comments_.InternalSwap(&other->_impl_.leading_detached_comments_);
  ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.leading_comments_, &other->_impl_.leading_comments_, arena);
  ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.trailing_comments_, &other->_impl_.trailing_comments_, arena);
}

::google::protobuf::Metadata SourceCodeInfo_Location::GetMetadata() const {
  return ::google::protobuf::Message::GetMetadataImpl(GetClassData()->full());
}
// ===================================================================

class SourceCodeInfo::_Internal {
 public:
  using HasBits =
      decltype(::std::declval<SourceCodeInfo>()._impl_._has_bits_);
  static constexpr ::int32_t kHasBitsOffset =
      8 * PROTOBUF_FIELD_OFFSET(SourceCodeInfo, _impl_._has_bits_);
};

SourceCodeInfo::SourceCodeInfo(::google::protobuf::Arena* PROTOBUF_NULLABLE arena)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(arena, SourceCodeInfo_class_data_.base()) {
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(arena) {
#endif  // PROTOBUF_CUSTOM_VTABLE
  SharedCtor(arena);
  // @@protoc_insertion_point(arena_constructor:google.protobuf.SourceCodeInfo)
}
PROTOBUF_NDEBUG_INLINE SourceCodeInfo::Impl_::Impl_(
    [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility,
    [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from,
    [[maybe_unused]] const ::google::protobuf::SourceCodeInfo& from_msg)
      : _extensions_{visibility, arena},
        _has_bits_{from._has_bits_},
        _cached_size_{0},
        location_{visibility, arena, from.location_} {}

SourceCodeInfo::SourceCodeInfo(
    ::google::protobuf::Arena* PROTOBUF_NULLABLE arena,
    const SourceCodeInfo& from)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(arena, SourceCodeInfo_class_data_.base()) {
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(arena) {
#endif  // PROTOBUF_CUSTOM_VTABLE
  SourceCodeInfo* const _this = this;
  (void)_this;
  _internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(
      from._internal_metadata_);
  new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from);
  _impl_._extensions_.MergeFrom(this, from._impl_._extensions_);

  // @@protoc_insertion_point(copy_constructor:google.protobuf.SourceCodeInfo)
}
PROTOBUF_NDEBUG_INLINE SourceCodeInfo::Impl_::Impl_(
    [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility,
    [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena)
      : _extensions_{visibility, arena},
        _cached_size_{0},
        location_{visibility, arena} {}

inline void SourceCodeInfo::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) {
  new (&_impl_) Impl_(internal_visibility(), arena);
}
SourceCodeInfo::~SourceCodeInfo() {
  // @@protoc_insertion_point(destructor:google.protobuf.SourceCodeInfo)
  SharedDtor(*this);
}
inline void SourceCodeInfo::SharedDtor(MessageLite& self) {
  SourceCodeInfo& this_ = static_cast<SourceCodeInfo&>(self);
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    this_.CheckHasBitConsistency();
  }
  this_._internal_metadata_.Delete<::google::protobuf::UnknownFieldSet>();
  ABSL_DCHECK(this_.GetArena() == nullptr);
  this_._impl_.~Impl_();
}

inline void* PROTOBUF_NONNULL SourceCodeInfo::PlacementNew_(
    const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem,
    ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) {
  return ::new (mem) SourceCodeInfo(arena);
}
constexpr auto SourceCodeInfo::InternalNewImpl_() {
  constexpr auto arena_bits = ::google::protobuf::internal::EncodePlacementArenaOffsets({
      PROTOBUF_FIELD_OFFSET(SourceCodeInfo, _impl_._extensions_) +
          decltype(SourceCodeInfo::_impl_._extensions_)::InternalGetArenaOffset(
              ::google::protobuf::Message::internal_visibility()),
      PROTOBUF_FIELD_OFFSET(SourceCodeInfo, _impl_.location_) +
          decltype(SourceCodeInfo::_impl_.location_)::
              InternalGetArenaOffset(
                  ::google::protobuf::Message::internal_visibility()),
  });
  if (arena_bits.has_value()) {
    return ::google::protobuf::internal::MessageCreator::ZeroInit(
        sizeof(SourceCodeInfo), alignof(SourceCodeInfo), *arena_bits);
  } else {
    return ::google::protobuf::internal::MessageCreator(&SourceCodeInfo::PlacementNew_,
                                 sizeof(SourceCodeInfo),
                                 alignof(SourceCodeInfo));
  }
}
constexpr auto SourceCodeInfo::InternalGenerateClassData_() {
  return ::google::protobuf::internal::ClassDataFull{
      ::google::protobuf::internal::ClassData{
          &_SourceCodeInfo_default_instance_._instance,
          &_table_.header,
          nullptr,  // OnDemandRegisterArenaDtor
          SourceCodeInfo::IsInitializedImpl,
          &SourceCodeInfo::MergeImpl,
          ::google::protobuf::Message::GetNewImpl<SourceCodeInfo>(),
#if defined(PROTOBUF_CUSTOM_VTABLE)
          &SourceCodeInfo::SharedDtor,
          ::google::protobuf::Message::GetClearImpl<SourceCodeInfo>(), &SourceCodeInfo::ByteSizeLong,
              &SourceCodeInfo::_InternalSerialize,
#endif  // PROTOBUF_CUSTOM_VTABLE
          PROTOBUF_FIELD_OFFSET(SourceCodeInfo, _impl_._cached_size_),
          false,
      },
      &SourceCodeInfo::kDescriptorMethods,
      &descriptor_table_google_2fprotobuf_2fdescriptor_2eproto,
      nullptr,  // tracker
  };
}

PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 const
    ::google::protobuf::internal::ClassDataFull SourceCodeInfo_class_data_ =
        SourceCodeInfo::InternalGenerateClassData_();

PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL
SourceCodeInfo::GetClassData() const {
  ::google::protobuf::internal::PrefetchToLocalCache(&SourceCodeInfo_class_data_);
  ::google::protobuf::internal::PrefetchToLocalCache(SourceCodeInfo_class_data_.tc_table);
  return SourceCodeInfo_class_data_.base();
}
constexpr ::_pbi::TcParseTable<0, 1, 1, 0, 2>
SourceCodeInfo::_table_ = {
  {
    PROTOBUF_FIELD_OFFSET(SourceCodeInfo, _impl_._has_bits_),
    PROTOBUF_FIELD_OFFSET(SourceCodeInfo, _impl_._extensions_),
    1, 0,  // max_field_number, fast_idx_mask
    offsetof(decltype(_table_), field_lookup_table),
    4294967294,  // skipmap
    offsetof(decltype(_table_), field_entries),
    1,  // num_field_entries
    1,  // num_aux_entries
    offsetof(decltype(_table_), aux_entries),
    SourceCodeInfo_class_data_.base(),
    nullptr,  // post_loop_handler
    ::_pbi::TcParser::GenericFallback,  // fallback
    #ifdef PROTOBUF_PREFETCH_PARSE_TABLE
    ::_pbi::TcParser::GetTable<::google::protobuf::SourceCodeInfo>(),  // to_prefetch
    #endif  // PROTOBUF_PREFETCH_PARSE_TABLE
  }, {{
    // repeated .google.protobuf.SourceCodeInfo.Location location = 1;
    {::_pbi::TcParser::FastMtR1,
     {10, 0, 0,
      PROTOBUF_FIELD_OFFSET(SourceCodeInfo, _impl_.location_)}},
  }}, {{
    65535, 65535
  }}, {{
    // repeated .google.protobuf.SourceCodeInfo.Location location = 1;
    {PROTOBUF_FIELD_OFFSET(SourceCodeInfo, _impl_.location_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)},
  }},
  {{
      {::_pbi::TcParser::GetTable<::google::protobuf::SourceCodeInfo_Location>()},
  }},
  {{
  }},
};
PROTOBUF_NOINLINE void SourceCodeInfo::Clear() {
// @@protoc_insertion_point(message_clear_start:google.protobuf.SourceCodeInfo)
  ::google::protobuf::internal::TSanWrite(&_impl_);
  ::uint32_t cached_has_bits = 0;
  // Prevent compiler warnings about cached_has_bits being unused
  (void) cached_has_bits;

  _impl_._extensions_.Clear();
  cached_has_bits = _impl_._has_bits_[0];
  if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) {
    _impl_.location_.Clear();
  }
  _impl_._has_bits_.Clear();
  _internal_metadata_.Clear<::google::protobuf::UnknownFieldSet>();
}

#if defined(PROTOBUF_CUSTOM_VTABLE)
::uint8_t* PROTOBUF_NONNULL SourceCodeInfo::_InternalSerialize(
    const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target,
    ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) {
  const SourceCodeInfo& this_ = static_cast<const SourceCodeInfo&>(base);
#else   // PROTOBUF_CUSTOM_VTABLE
::uint8_t* PROTOBUF_NONNULL SourceCodeInfo::_InternalSerialize(
    ::uint8_t* PROTOBUF_NONNULL target,
    ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const {
  const SourceCodeInfo& this_ = *this;
#endif  // PROTOBUF_CUSTOM_VTABLE
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    this_.CheckHasBitConsistency();
  }
  // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.SourceCodeInfo)
  ::uint32_t cached_has_bits = 0;
  (void)cached_has_bits;

  cached_has_bits = this_._impl_._has_bits_[0];
  // repeated .google.protobuf.SourceCodeInfo.Location location = 1;
  if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) {
    for (unsigned i = 0, n = static_cast<unsigned>(
                             this_._internal_location_size());
         i < n; i++) {
      const auto& repfield = this_._internal_location().Get(i);
      target =
          ::google::protobuf::internal::WireFormatLite::InternalWriteMessage(
              1, repfield, repfield.GetCachedSize(),
              target, stream);
    }
  }

  // All extensions.
  target = this_._impl_._extensions_._InternalSerializeAll(&default_instance(),
                                                    target, stream);
  if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) {
    target =
        ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray(
            this_._internal_metadata_.unknown_fields<::google::protobuf::UnknownFieldSet>(::google::protobuf::UnknownFieldSet::default_instance), target, stream);
  }
  // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.SourceCodeInfo)
  return target;
}

#if defined(PROTOBUF_CUSTOM_VTABLE)
::size_t SourceCodeInfo::ByteSizeLong(const MessageLite& base) {
  const SourceCodeInfo& this_ = static_cast<const SourceCodeInfo&>(base);
#else   // PROTOBUF_CUSTOM_VTABLE
::size_t SourceCodeInfo::ByteSizeLong() const {
  const SourceCodeInfo& this_ = *this;
#endif  // PROTOBUF_CUSTOM_VTABLE
  // @@protoc_insertion_point(message_byte_size_start:google.protobuf.SourceCodeInfo)
  ::size_t total_size = 0;
  total_size += this_._impl_._extensions_.ByteSize();

  ::uint32_t cached_has_bits = 0;
  // Prevent compiler warnings about cached_has_bits being unused
  (void)cached_has_bits;

  ::_pbi::Prefetch5LinesFrom7Lines(&this_);
   {
    // repeated .google.protobuf.SourceCodeInfo.Location location = 1;
    cached_has_bits = this_._impl_._has_bits_[0];
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) {
      total_size += 1UL * this_._internal_location_size();
      for (const auto& msg : this_._internal_location()) {
        total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg);
      }
    }
  }
  return this_.MaybeComputeUnknownFieldsSize(total_size,
                                             &this_._impl_._cached_size_);
}

void SourceCodeInfo::MergeImpl(::google::protobuf::MessageLite& to_msg,
                            const ::google::protobuf::MessageLite& from_msg) {
   auto* const _this =
      static_cast<SourceCodeInfo*>(&to_msg);
  auto& from = static_cast<const SourceCodeInfo&>(from_msg);
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    from.CheckHasBitConsistency();
  }
  ::google::protobuf::Arena* arena = _this->GetArena();
  // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.SourceCodeInfo)
  ABSL_DCHECK_NE(&from, _this);
  ::uint32_t cached_has_bits = 0;
  (void)cached_has_bits;

  cached_has_bits = from._impl_._has_bits_[0];
  if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) {
    _this->_internal_mutable_location()->InternalMergeFromWithArena(
        ::google::protobuf::MessageLite::internal_visibility(), arena,
        from._internal_location());
  }
  _this->_impl_._has_bits_[0] |= cached_has_bits;
  _this->_impl_._extensions_.MergeFrom(&default_instance(),
                                from._impl_._extensions_);
  _this->_internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(
      from._internal_metadata_);
}

void SourceCodeInfo::CopyFrom(const SourceCodeInfo& from) {
  // @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.SourceCodeInfo)
  if (&from == this) return;
  Clear();
  MergeFrom(from);
}

PROTOBUF_NOINLINE bool SourceCodeInfo::IsInitializedImpl(
    const MessageLite& msg) {
  auto& this_ = static_cast<const SourceCodeInfo&>(msg);
  if (!this_._impl_._extensions_.IsInitialized(&default_instance())) {
    return false;
  }
  return true;
}

void SourceCodeInfo::InternalSwap(SourceCodeInfo* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) {
  using ::std::swap;
  _impl_._extensions_.InternalSwap(&other->_impl_._extensions_);
  _internal_metadata_.InternalSwap(&other->_internal_metadata_);
  swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]);
  _impl_.location_.InternalSwap(&other->_impl_.location_);
}

::google::protobuf::Metadata SourceCodeInfo::GetMetadata() const {
  return ::google::protobuf::Message::GetMetadataImpl(GetClassData()->full());
}
// ===================================================================

class GeneratedCodeInfo_Annotation::_Internal {
 public:
  using HasBits =
      decltype(::std::declval<GeneratedCodeInfo_Annotation>()._impl_._has_bits_);
  static constexpr ::int32_t kHasBitsOffset =
      8 * PROTOBUF_FIELD_OFFSET(GeneratedCodeInfo_Annotation, _impl_._has_bits_);
};

GeneratedCodeInfo_Annotation::GeneratedCodeInfo_Annotation(::google::protobuf::Arena* PROTOBUF_NULLABLE arena)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(arena, GeneratedCodeInfo_Annotation_class_data_.base()) {
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(arena) {
#endif  // PROTOBUF_CUSTOM_VTABLE
  SharedCtor(arena);
  // @@protoc_insertion_point(arena_constructor:google.protobuf.GeneratedCodeInfo.Annotation)
}
PROTOBUF_NDEBUG_INLINE GeneratedCodeInfo_Annotation::Impl_::Impl_(
    [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility,
    [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from,
    [[maybe_unused]] const ::google::protobuf::GeneratedCodeInfo_Annotation& from_msg)
      : _has_bits_{from._has_bits_},
        _cached_size_{0},
        path_{visibility, arena, from.path_},
        _path_cached_byte_size_{0},
        source_file_(arena, from.source_file_) {}

GeneratedCodeInfo_Annotation::GeneratedCodeInfo_Annotation(
    ::google::protobuf::Arena* PROTOBUF_NULLABLE arena,
    const GeneratedCodeInfo_Annotation& from)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(arena, GeneratedCodeInfo_Annotation_class_data_.base()) {
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(arena) {
#endif  // PROTOBUF_CUSTOM_VTABLE
  GeneratedCodeInfo_Annotation* const _this = this;
  (void)_this;
  _internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(
      from._internal_metadata_);
  new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from);
  ::memcpy(reinterpret_cast<char*>(&_impl_) +
               offsetof(Impl_, begin_),
           reinterpret_cast<const char*>(&from._impl_) +
               offsetof(Impl_, begin_),
           offsetof(Impl_, semantic_) -
               offsetof(Impl_, begin_) +
               sizeof(Impl_::semantic_));

  // @@protoc_insertion_point(copy_constructor:google.protobuf.GeneratedCodeInfo.Annotation)
}
PROTOBUF_NDEBUG_INLINE GeneratedCodeInfo_Annotation::Impl_::Impl_(
    [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility,
    [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena)
      : _cached_size_{0},
        path_{visibility, arena},
        _path_cached_byte_size_{0},
        source_file_(arena) {}

inline void GeneratedCodeInfo_Annotation::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) {
  new (&_impl_) Impl_(internal_visibility(), arena);
  ::memset(reinterpret_cast<char*>(&_impl_) +
               offsetof(Impl_, begin_),
           0,
           offsetof(Impl_, semantic_) -
               offsetof(Impl_, begin_) +
               sizeof(Impl_::semantic_));
}
GeneratedCodeInfo_Annotation::~GeneratedCodeInfo_Annotation() {
  // @@protoc_insertion_point(destructor:google.protobuf.GeneratedCodeInfo.Annotation)
  SharedDtor(*this);
}
inline void GeneratedCodeInfo_Annotation::SharedDtor(MessageLite& self) {
  GeneratedCodeInfo_Annotation& this_ = static_cast<GeneratedCodeInfo_Annotation&>(self);
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    this_.CheckHasBitConsistency();
  }
  this_._internal_metadata_.Delete<::google::protobuf::UnknownFieldSet>();
  ABSL_DCHECK(this_.GetArena() == nullptr);
  this_._impl_.source_file_.Destroy();
  this_._impl_.~Impl_();
}

inline void* PROTOBUF_NONNULL GeneratedCodeInfo_Annotation::PlacementNew_(
    const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem,
    ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) {
  return ::new (mem) GeneratedCodeInfo_Annotation(arena);
}
constexpr auto GeneratedCodeInfo_Annotation::InternalNewImpl_() {
  constexpr auto arena_bits = ::google::protobuf::internal::EncodePlacementArenaOffsets({
      PROTOBUF_FIELD_OFFSET(GeneratedCodeInfo_Annotation, _impl_.path_) +
          decltype(GeneratedCodeInfo_Annotation::_impl_.path_)::
              InternalGetArenaOffset(
                  ::google::protobuf::Message::internal_visibility()),
  });
  if (arena_bits.has_value()) {
    return ::google::protobuf::internal::MessageCreator::CopyInit(
        sizeof(GeneratedCodeInfo_Annotation), alignof(GeneratedCodeInfo_Annotation), *arena_bits);
  } else {
    return ::google::protobuf::internal::MessageCreator(&GeneratedCodeInfo_Annotation::PlacementNew_,
                                 sizeof(GeneratedCodeInfo_Annotation),
                                 alignof(GeneratedCodeInfo_Annotation));
  }
}
constexpr auto GeneratedCodeInfo_Annotation::InternalGenerateClassData_() {
  return ::google::protobuf::internal::ClassDataFull{
      ::google::protobuf::internal::ClassData{
          &_GeneratedCodeInfo_Annotation_default_instance_._instance,
          &_table_.header,
          nullptr,  // OnDemandRegisterArenaDtor
          nullptr,  // IsInitialized
          &GeneratedCodeInfo_Annotation::MergeImpl,
          ::google::protobuf::Message::GetNewImpl<GeneratedCodeInfo_Annotation>(),
#if defined(PROTOBUF_CUSTOM_VTABLE)
          &GeneratedCodeInfo_Annotation::SharedDtor,
          ::google::protobuf::Message::GetClearImpl<GeneratedCodeInfo_Annotation>(), &GeneratedCodeInfo_Annotation::ByteSizeLong,
              &GeneratedCodeInfo_Annotation::_InternalSerialize,
#endif  // PROTOBUF_CUSTOM_VTABLE
          PROTOBUF_FIELD_OFFSET(GeneratedCodeInfo_Annotation, _impl_._cached_size_),
          false,
      },
      &GeneratedCodeInfo_Annotation::kDescriptorMethods,
      &descriptor_table_google_2fprotobuf_2fdescriptor_2eproto,
      nullptr,  // tracker
  };
}

PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 const
    ::google::protobuf::internal::ClassDataFull GeneratedCodeInfo_Annotation_class_data_ =
        GeneratedCodeInfo_Annotation::InternalGenerateClassData_();

PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL
GeneratedCodeInfo_Annotation::GetClassData() const {
  ::google::protobuf::internal::PrefetchToLocalCache(&GeneratedCodeInfo_Annotation_class_data_);
  ::google::protobuf::internal::PrefetchToLocalCache(GeneratedCodeInfo_Annotation_class_data_.tc_table);
  return GeneratedCodeInfo_Annotation_class_data_.base();
}
constexpr ::_pbi::TcParseTable<3, 5, 1, 0, 2>
GeneratedCodeInfo_Annotation::_table_ = {
  {
    PROTOBUF_FIELD_OFFSET(GeneratedCodeInfo_Annotation, _impl_._has_bits_),
    0, // no _extensions_
    5, 56,  // max_field_number, fast_idx_mask
    offsetof(decltype(_table_), field_lookup_table),
    4294967264,  // skipmap
    offsetof(decltype(_table_), field_entries),
    5,  // num_field_entries
    1,  // num_aux_entries
    offsetof(decltype(_table_), aux_entries),
    GeneratedCodeInfo_Annotation_class_data_.base(),
    nullptr,  // post_loop_handler
    ::_pbi::TcParser::GenericFallback,  // fallback
    #ifdef PROTOBUF_PREFETCH_PARSE_TABLE
    ::_pbi::TcParser::GetTable<::google::protobuf::GeneratedCodeInfo_Annotation>(),  // to_prefetch
    #endif  // PROTOBUF_PREFETCH_PARSE_TABLE
  }, {{
    {::_pbi::TcParser::MiniParse, {}},
    // repeated int32 path = 1 [packed = true];
    {::_pbi::TcParser::FastV32P1,
     {10, 0, 0,
      PROTOBUF_FIELD_OFFSET(GeneratedCodeInfo_Annotation, _impl_.path_)}},
    // optional string source_file = 2;
    {::_pbi::TcParser::FastBS1,
     {18, 1, 0,
      PROTOBUF_FIELD_OFFSET(GeneratedCodeInfo_Annotation, _impl_.source_file_)}},
    // optional int32 begin = 3;
    {::_pbi::TcParser::SingularVarintNoZag1<::uint32_t, offsetof(GeneratedCodeInfo_Annotation, _impl_.begin_), 2>(),
     {24, 2, 0,
      PROTOBUF_FIELD_OFFSET(GeneratedCodeInfo_Annotation, _impl_.begin_)}},
    // optional int32 end = 4;
    {::_pbi::TcParser::SingularVarintNoZag1<::uint32_t, offsetof(GeneratedCodeInfo_Annotation, _impl_.end_), 3>(),
     {32, 3, 0,
      PROTOBUF_FIELD_OFFSET(GeneratedCodeInfo_Annotation, _impl_.end_)}},
    // optional .google.protobuf.GeneratedCodeInfo.Annotation.Semantic semantic = 5;
    {::_pbi::TcParser::FastEr0S1,
     {40, 4, 2,
      PROTOBUF_FIELD_OFFSET(GeneratedCodeInfo_Annotation, _impl_.semantic_)}},
    {::_pbi::TcParser::MiniParse, {}},
    {::_pbi::TcParser::MiniParse, {}},
  }}, {{
    65535, 65535
  }}, {{
    // repeated int32 path = 1 [packed = true];
    {PROTOBUF_FIELD_OFFSET(GeneratedCodeInfo_Annotation, _impl_.path_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcRepeated | ::_fl::kPackedInt32)},
    // optional string source_file = 2;
    {PROTOBUF_FIELD_OFFSET(GeneratedCodeInfo_Annotation, _impl_.source_file_), _Internal::kHasBitsOffset + 1, 0, (0 | ::_fl::kFcOptional | ::_fl::kBytes | ::_fl::kRepAString)},
    // optional int32 begin = 3;
    {PROTOBUF_FIELD_OFFSET(GeneratedCodeInfo_Annotation, _impl_.begin_), _Internal::kHasBitsOffset + 2, 0, (0 | ::_fl::kFcOptional | ::_fl::kInt32)},
    // optional int32 end = 4;
    {PROTOBUF_FIELD_OFFSET(GeneratedCodeInfo_Annotation, _impl_.end_), _Internal::kHasBitsOffset + 3, 0, (0 | ::_fl::kFcOptional | ::_fl::kInt32)},
    // optional .google.protobuf.GeneratedCodeInfo.Annotation.Semantic semantic = 5;
    {PROTOBUF_FIELD_OFFSET(GeneratedCodeInfo_Annotation, _impl_.semantic_), _Internal::kHasBitsOffset + 4, 0, (0 | ::_fl::kFcOptional | ::_fl::kEnumRange)},
  }},
  {{
      {0, 2},
  }},
  {{
  }},
};
PROTOBUF_NOINLINE void GeneratedCodeInfo_Annotation::Clear() {
// @@protoc_insertion_point(message_clear_start:google.protobuf.GeneratedCodeInfo.Annotation)
  ::google::protobuf::internal::TSanWrite(&_impl_);
  ::uint32_t cached_has_bits = 0;
  // Prevent compiler warnings about cached_has_bits being unused
  (void) cached_has_bits;

  cached_has_bits = _impl_._has_bits_[0];
  if (BatchCheckHasBit(cached_has_bits, 0x00000003U)) {
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) {
      _impl_.path_.Clear();
    }
    if (CheckHasBit(cached_has_bits, 0x00000002U)) {
      _impl_.source_file_.ClearNonDefaultToEmpty();
    }
  }
  if (BatchCheckHasBit(cached_has_bits, 0x0000001cU)) {
    ::memset(&_impl_.begin_, 0, static_cast<::size_t>(
        reinterpret_cast<char*>(&_impl_.semantic_) -
        reinterpret_cast<char*>(&_impl_.begin_)) + sizeof(_impl_.semantic_));
  }
  _impl_._has_bits_.Clear();
  _internal_metadata_.Clear<::google::protobuf::UnknownFieldSet>();
}

#if defined(PROTOBUF_CUSTOM_VTABLE)
::uint8_t* PROTOBUF_NONNULL GeneratedCodeInfo_Annotation::_InternalSerialize(
    const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target,
    ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) {
  const GeneratedCodeInfo_Annotation& this_ = static_cast<const GeneratedCodeInfo_Annotation&>(base);
#else   // PROTOBUF_CUSTOM_VTABLE
::uint8_t* PROTOBUF_NONNULL GeneratedCodeInfo_Annotation::_InternalSerialize(
    ::uint8_t* PROTOBUF_NONNULL target,
    ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const {
  const GeneratedCodeInfo_Annotation& this_ = *this;
#endif  // PROTOBUF_CUSTOM_VTABLE
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    this_.CheckHasBitConsistency();
  }
  // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.GeneratedCodeInfo.Annotation)
  ::uint32_t cached_has_bits = 0;
  (void)cached_has_bits;

  cached_has_bits = this_._impl_._has_bits_[0];
  // repeated int32 path = 1 [packed = true];
  if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) {
    {
      int byte_size = this_._impl_._path_cached_byte_size_.Get();
      if (byte_size > 0) {
        target = stream->WriteInt32Packed(
            1, this_._internal_path(), byte_size, target);
      }
    }
  }

  // optional string source_file = 2;
  if (CheckHasBit(cached_has_bits, 0x00000002U)) {
    const ::std::string& _s = this_._internal_source_file();
    target = stream->WriteStringMaybeAliased(2, _s, target);
  }

  // optional int32 begin = 3;
  if (CheckHasBit(cached_has_bits, 0x00000004U)) {
    target =
        ::google::protobuf::internal::WireFormatLite::WriteInt32ToArrayWithField<3>(
            stream, this_._internal_begin(), target);
  }

  // optional int32 end = 4;
  if (CheckHasBit(cached_has_bits, 0x00000008U)) {
    target =
        ::google::protobuf::internal::WireFormatLite::WriteInt32ToArrayWithField<4>(
            stream, this_._internal_end(), target);
  }

  // optional .google.protobuf.GeneratedCodeInfo.Annotation.Semantic semantic = 5;
  if (CheckHasBit(cached_has_bits, 0x00000010U)) {
    target = stream->EnsureSpace(target);
    target = ::_pbi::WireFormatLite::WriteEnumToArray(
        5, this_._internal_semantic(), target);
  }

  if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) {
    target =
        ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray(
            this_._internal_metadata_.unknown_fields<::google::protobuf::UnknownFieldSet>(::google::protobuf::UnknownFieldSet::default_instance), target, stream);
  }
  // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.GeneratedCodeInfo.Annotation)
  return target;
}

#if defined(PROTOBUF_CUSTOM_VTABLE)
::size_t GeneratedCodeInfo_Annotation::ByteSizeLong(const MessageLite& base) {
  const GeneratedCodeInfo_Annotation& this_ = static_cast<const GeneratedCodeInfo_Annotation&>(base);
#else   // PROTOBUF_CUSTOM_VTABLE
::size_t GeneratedCodeInfo_Annotation::ByteSizeLong() const {
  const GeneratedCodeInfo_Annotation& this_ = *this;
#endif  // PROTOBUF_CUSTOM_VTABLE
  // @@protoc_insertion_point(message_byte_size_start:google.protobuf.GeneratedCodeInfo.Annotation)
  ::size_t total_size = 0;

  ::uint32_t cached_has_bits = 0;
  // Prevent compiler warnings about cached_has_bits being unused
  (void)cached_has_bits;

  ::_pbi::Prefetch5LinesFrom7Lines(&this_);
  cached_has_bits = this_._impl_._has_bits_[0];
  if (BatchCheckHasBit(cached_has_bits, 0x0000001fU)) {
    // repeated int32 path = 1 [packed = true];
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) {
      total_size +=
          ::_pbi::WireFormatLite::Int32SizeWithPackedTagSize(
              this_._internal_path(), 1,
              this_._impl_._path_cached_byte_size_);
    }
    // optional string source_file = 2;
    if (CheckHasBit(cached_has_bits, 0x00000002U)) {
      total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize(
                                      this_._internal_source_file());
    }
    // optional int32 begin = 3;
    if (CheckHasBit(cached_has_bits, 0x00000004U)) {
      total_size += ::_pbi::WireFormatLite::Int32SizePlusOne(
          this_._internal_begin());
    }
    // optional int32 end = 4;
    if (CheckHasBit(cached_has_bits, 0x00000008U)) {
      total_size += ::_pbi::WireFormatLite::Int32SizePlusOne(
          this_._internal_end());
    }
    // optional .google.protobuf.GeneratedCodeInfo.Annotation.Semantic semantic = 5;
    if (CheckHasBit(cached_has_bits, 0x00000010U)) {
      total_size += 1 +
                    ::_pbi::WireFormatLite::EnumSize(this_._internal_semantic());
    }
  }
  return this_.MaybeComputeUnknownFieldsSize(total_size,
                                             &this_._impl_._cached_size_);
}

void GeneratedCodeInfo_Annotation::MergeImpl(::google::protobuf::MessageLite& to_msg,
                            const ::google::protobuf::MessageLite& from_msg) {
   auto* const _this =
      static_cast<GeneratedCodeInfo_Annotation*>(&to_msg);
  auto& from = static_cast<const GeneratedCodeInfo_Annotation&>(from_msg);
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    from.CheckHasBitConsistency();
  }
  // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.GeneratedCodeInfo.Annotation)
  ABSL_DCHECK_NE(&from, _this);
  ::uint32_t cached_has_bits = 0;
  (void)cached_has_bits;

  cached_has_bits = from._impl_._has_bits_[0];
  if (BatchCheckHasBit(cached_has_bits, 0x0000001fU)) {
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) {
      _this->_internal_mutable_path()->MergeFrom(from._internal_path());
    }
    if (CheckHasBit(cached_has_bits, 0x00000002U)) {
      _this->_internal_set_source_file(from._internal_source_file());
    }
    if (CheckHasBit(cached_has_bits, 0x00000004U)) {
      _this->_impl_.begin_ = from._impl_.begin_;
    }
    if (CheckHasBit(cached_has_bits, 0x00000008U)) {
      _this->_impl_.end_ = from._impl_.end_;
    }
    if (CheckHasBit(cached_has_bits, 0x00000010U)) {
      _this->_impl_.semantic_ = from._impl_.semantic_;
    }
  }
  _this->_impl_._has_bits_[0] |= cached_has_bits;
  _this->_internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(
      from._internal_metadata_);
}

void GeneratedCodeInfo_Annotation::CopyFrom(const GeneratedCodeInfo_Annotation& from) {
  // @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.GeneratedCodeInfo.Annotation)
  if (&from == this) return;
  Clear();
  MergeFrom(from);
}


void GeneratedCodeInfo_Annotation::InternalSwap(GeneratedCodeInfo_Annotation* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) {
  using ::std::swap;
  auto* arena = GetArena();
  ABSL_DCHECK_EQ(arena, other->GetArena());
  _internal_metadata_.InternalSwap(&other->_internal_metadata_);
  swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]);
  _impl_.path_.InternalSwap(&other->_impl_.path_);
  ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.source_file_, &other->_impl_.source_file_, arena);
  ::google::protobuf::internal::memswap<
      PROTOBUF_FIELD_OFFSET(GeneratedCodeInfo_Annotation, _impl_.semantic_)
      + sizeof(GeneratedCodeInfo_Annotation::_impl_.semantic_)
      - PROTOBUF_FIELD_OFFSET(GeneratedCodeInfo_Annotation, _impl_.begin_)>(
          reinterpret_cast<char*>(&_impl_.begin_),
          reinterpret_cast<char*>(&other->_impl_.begin_));
}

::google::protobuf::Metadata GeneratedCodeInfo_Annotation::GetMetadata() const {
  return ::google::protobuf::Message::GetMetadataImpl(GetClassData()->full());
}
// ===================================================================

class GeneratedCodeInfo::_Internal {
 public:
  using HasBits =
      decltype(::std::declval<GeneratedCodeInfo>()._impl_._has_bits_);
  static constexpr ::int32_t kHasBitsOffset =
      8 * PROTOBUF_FIELD_OFFSET(GeneratedCodeInfo, _impl_._has_bits_);
};

GeneratedCodeInfo::GeneratedCodeInfo(::google::protobuf::Arena* PROTOBUF_NULLABLE arena)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(arena, GeneratedCodeInfo_class_data_.base()) {
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(arena) {
#endif  // PROTOBUF_CUSTOM_VTABLE
  SharedCtor(arena);
  // @@protoc_insertion_point(arena_constructor:google.protobuf.GeneratedCodeInfo)
}
PROTOBUF_NDEBUG_INLINE GeneratedCodeInfo::Impl_::Impl_(
    [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility,
    [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from,
    [[maybe_unused]] const ::google::protobuf::GeneratedCodeInfo& from_msg)
      : _has_bits_{from._has_bits_},
        _cached_size_{0},
        annotation_{visibility, arena, from.annotation_} {}

GeneratedCodeInfo::GeneratedCodeInfo(
    ::google::protobuf::Arena* PROTOBUF_NULLABLE arena,
    const GeneratedCodeInfo& from)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(arena, GeneratedCodeInfo_class_data_.base()) {
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(arena) {
#endif  // PROTOBUF_CUSTOM_VTABLE
  GeneratedCodeInfo* const _this = this;
  (void)_this;
  _internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(
      from._internal_metadata_);
  new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from);

  // @@protoc_insertion_point(copy_constructor:google.protobuf.GeneratedCodeInfo)
}
PROTOBUF_NDEBUG_INLINE GeneratedCodeInfo::Impl_::Impl_(
    [[maybe_unused]] ::google::protobuf::internal::InternalVisibility visibility,
    [[maybe_unused]] ::google::protobuf::Arena* PROTOBUF_NULLABLE arena)
      : _cached_size_{0},
        annotation_{visibility, arena} {}

inline void GeneratedCodeInfo::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) {
  new (&_impl_) Impl_(internal_visibility(), arena);
}
GeneratedCodeInfo::~GeneratedCodeInfo() {
  // @@protoc_insertion_point(destructor:google.protobuf.GeneratedCodeInfo)
  SharedDtor(*this);
}
inline void GeneratedCodeInfo::SharedDtor(MessageLite& self) {
  GeneratedCodeInfo& this_ = static_cast<GeneratedCodeInfo&>(self);
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    this_.CheckHasBitConsistency();
  }
  this_._internal_metadata_.Delete<::google::protobuf::UnknownFieldSet>();
  ABSL_DCHECK(this_.GetArena() == nullptr);
  this_._impl_.~Impl_();
}

inline void* PROTOBUF_NONNULL GeneratedCodeInfo::PlacementNew_(
    const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem,
    ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) {
  return ::new (mem) GeneratedCodeInfo(arena);
}
constexpr auto GeneratedCodeInfo::InternalNewImpl_() {
  constexpr auto arena_bits = ::google::protobuf::internal::EncodePlacementArenaOffsets({
      PROTOBUF_FIELD_OFFSET(GeneratedCodeInfo, _impl_.annotation_) +
          decltype(GeneratedCodeInfo::_impl_.annotation_)::
              InternalGetArenaOffset(
                  ::google::protobuf::Message::internal_visibility()),
  });
  if (arena_bits.has_value()) {
    return ::google::protobuf::internal::MessageCreator::ZeroInit(
        sizeof(GeneratedCodeInfo), alignof(GeneratedCodeInfo), *arena_bits);
  } else {
    return ::google::protobuf::internal::MessageCreator(&GeneratedCodeInfo::PlacementNew_,
                                 sizeof(GeneratedCodeInfo),
                                 alignof(GeneratedCodeInfo));
  }
}
constexpr auto GeneratedCodeInfo::InternalGenerateClassData_() {
  return ::google::protobuf::internal::ClassDataFull{
      ::google::protobuf::internal::ClassData{
          &_GeneratedCodeInfo_default_instance_._instance,
          &_table_.header,
          nullptr,  // OnDemandRegisterArenaDtor
          nullptr,  // IsInitialized
          &GeneratedCodeInfo::MergeImpl,
          ::google::protobuf::Message::GetNewImpl<GeneratedCodeInfo>(),
#if defined(PROTOBUF_CUSTOM_VTABLE)
          &GeneratedCodeInfo::SharedDtor,
          ::google::protobuf::Message::GetClearImpl<GeneratedCodeInfo>(), &GeneratedCodeInfo::ByteSizeLong,
              &GeneratedCodeInfo::_InternalSerialize,
#endif  // PROTOBUF_CUSTOM_VTABLE
          PROTOBUF_FIELD_OFFSET(GeneratedCodeInfo, _impl_._cached_size_),
          false,
      },
      &GeneratedCodeInfo::kDescriptorMethods,
      &descriptor_table_google_2fprotobuf_2fdescriptor_2eproto,
      nullptr,  // tracker
  };
}

PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 const
    ::google::protobuf::internal::ClassDataFull GeneratedCodeInfo_class_data_ =
        GeneratedCodeInfo::InternalGenerateClassData_();

PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL
GeneratedCodeInfo::GetClassData() const {
  ::google::protobuf::internal::PrefetchToLocalCache(&GeneratedCodeInfo_class_data_);
  ::google::protobuf::internal::PrefetchToLocalCache(GeneratedCodeInfo_class_data_.tc_table);
  return GeneratedCodeInfo_class_data_.base();
}
constexpr ::_pbi::TcParseTable<0, 1, 1, 0, 2>
GeneratedCodeInfo::_table_ = {
  {
    PROTOBUF_FIELD_OFFSET(GeneratedCodeInfo, _impl_._has_bits_),
    0, // no _extensions_
    1, 0,  // max_field_number, fast_idx_mask
    offsetof(decltype(_table_), field_lookup_table),
    4294967294,  // skipmap
    offsetof(decltype(_table_), field_entries),
    1,  // num_field_entries
    1,  // num_aux_entries
    offsetof(decltype(_table_), aux_entries),
    GeneratedCodeInfo_class_data_.base(),
    nullptr,  // post_loop_handler
    ::_pbi::TcParser::GenericFallback,  // fallback
    #ifdef PROTOBUF_PREFETCH_PARSE_TABLE
    ::_pbi::TcParser::GetTable<::google::protobuf::GeneratedCodeInfo>(),  // to_prefetch
    #endif  // PROTOBUF_PREFETCH_PARSE_TABLE
  }, {{
    // repeated .google.protobuf.GeneratedCodeInfo.Annotation annotation = 1;
    {::_pbi::TcParser::FastMtR1,
     {10, 0, 0,
      PROTOBUF_FIELD_OFFSET(GeneratedCodeInfo, _impl_.annotation_)}},
  }}, {{
    65535, 65535
  }}, {{
    // repeated .google.protobuf.GeneratedCodeInfo.Annotation annotation = 1;
    {PROTOBUF_FIELD_OFFSET(GeneratedCodeInfo, _impl_.annotation_), _Internal::kHasBitsOffset + 0, 0, (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)},
  }},
  {{
      {::_pbi::TcParser::GetTable<::google::protobuf::GeneratedCodeInfo_Annotation>()},
  }},
  {{
  }},
};
PROTOBUF_NOINLINE void GeneratedCodeInfo::Clear() {
// @@protoc_insertion_point(message_clear_start:google.protobuf.GeneratedCodeInfo)
  ::google::protobuf::internal::TSanWrite(&_impl_);
  ::uint32_t cached_has_bits = 0;
  // Prevent compiler warnings about cached_has_bits being unused
  (void) cached_has_bits;

  cached_has_bits = _impl_._has_bits_[0];
  if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) {
    _impl_.annotation_.Clear();
  }
  _impl_._has_bits_.Clear();
  _internal_metadata_.Clear<::google::protobuf::UnknownFieldSet>();
}

#if defined(PROTOBUF_CUSTOM_VTABLE)
::uint8_t* PROTOBUF_NONNULL GeneratedCodeInfo::_InternalSerialize(
    const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target,
    ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) {
  const GeneratedCodeInfo& this_ = static_cast<const GeneratedCodeInfo&>(base);
#else   // PROTOBUF_CUSTOM_VTABLE
::uint8_t* PROTOBUF_NONNULL GeneratedCodeInfo::_InternalSerialize(
    ::uint8_t* PROTOBUF_NONNULL target,
    ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const {
  const GeneratedCodeInfo& this_ = *this;
#endif  // PROTOBUF_CUSTOM_VTABLE
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    this_.CheckHasBitConsistency();
  }
  // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.GeneratedCodeInfo)
  ::uint32_t cached_has_bits = 0;
  (void)cached_has_bits;

  cached_has_bits = this_._impl_._has_bits_[0];
  // repeated .google.protobuf.GeneratedCodeInfo.Annotation annotation = 1;
  if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) {
    for (unsigned i = 0, n = static_cast<unsigned>(
                             this_._internal_annotation_size());
         i < n; i++) {
      const auto& repfield = this_._internal_annotation().Get(i);
      target =
          ::google::protobuf::internal::WireFormatLite::InternalWriteMessage(
              1, repfield, repfield.GetCachedSize(),
              target, stream);
    }
  }

  if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) {
    target =
        ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray(
            this_._internal_metadata_.unknown_fields<::google::protobuf::UnknownFieldSet>(::google::protobuf::UnknownFieldSet::default_instance), target, stream);
  }
  // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.GeneratedCodeInfo)
  return target;
}

#if defined(PROTOBUF_CUSTOM_VTABLE)
::size_t GeneratedCodeInfo::ByteSizeLong(const MessageLite& base) {
  const GeneratedCodeInfo& this_ = static_cast<const GeneratedCodeInfo&>(base);
#else   // PROTOBUF_CUSTOM_VTABLE
::size_t GeneratedCodeInfo::ByteSizeLong() const {
  const GeneratedCodeInfo& this_ = *this;
#endif  // PROTOBUF_CUSTOM_VTABLE
  // @@protoc_insertion_point(message_byte_size_start:google.protobuf.GeneratedCodeInfo)
  ::size_t total_size = 0;

  ::uint32_t cached_has_bits = 0;
  // Prevent compiler warnings about cached_has_bits being unused
  (void)cached_has_bits;

  ::_pbi::Prefetch5LinesFrom7Lines(&this_);
   {
    // repeated .google.protobuf.GeneratedCodeInfo.Annotation annotation = 1;
    cached_has_bits = this_._impl_._has_bits_[0];
    if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) {
      total_size += 1UL * this_._internal_annotation_size();
      for (const auto& msg : this_._internal_annotation()) {
        total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg);
      }
    }
  }
  return this_.MaybeComputeUnknownFieldsSize(total_size,
                                             &this_._impl_._cached_size_);
}

void GeneratedCodeInfo::MergeImpl(::google::protobuf::MessageLite& to_msg,
                            const ::google::protobuf::MessageLite& from_msg) {
   auto* const _this =
      static_cast<GeneratedCodeInfo*>(&to_msg);
  auto& from = static_cast<const GeneratedCodeInfo&>(from_msg);
  if constexpr (::_pbi::DebugHardenCheckHasBitConsistency()) {
    from.CheckHasBitConsistency();
  }
  ::google::protobuf::Arena* arena = _this->GetArena();
  // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.GeneratedCodeInfo)
  ABSL_DCHECK_NE(&from, _this);
  ::uint32_t cached_has_bits = 0;
  (void)cached_has_bits;

  cached_has_bits = from._impl_._has_bits_[0];
  if (CheckHasBitForRepeated(cached_has_bits, 0x00000001U)) {
    _this->_internal_mutable_annotation()->InternalMergeFromWithArena(
        ::google::protobuf::MessageLite::internal_visibility(), arena,
        from._internal_annotation());
  }
  _this->_impl_._has_bits_[0] |= cached_has_bits;
  _this->_internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(
      from._internal_metadata_);
}

void GeneratedCodeInfo::CopyFrom(const GeneratedCodeInfo& from) {
  // @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.GeneratedCodeInfo)
  if (&from == this) return;
  Clear();
  MergeFrom(from);
}


void GeneratedCodeInfo::InternalSwap(GeneratedCodeInfo* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) {
  using ::std::swap;
  _internal_metadata_.InternalSwap(&other->_internal_metadata_);
  swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]);
  _impl_.annotation_.InternalSwap(&other->_impl_.annotation_);
}

::google::protobuf::Metadata GeneratedCodeInfo::GetMetadata() const {
  return ::google::protobuf::Message::GetMetadataImpl(GetClassData()->full());
}
// @@protoc_insertion_point(namespace_scope)
}  // namespace protobuf
}  // namespace google
namespace google {
namespace protobuf {
}  // namespace protobuf
}  // namespace google
// @@protoc_insertion_point(global_scope)
#include "google/protobuf/port_undef.inc"
