// automatically generated by the FlatBuffers compiler, do not modify


#ifndef FLATBUFFERS_GENERATED_NP2STRUCTS_H_
#define FLATBUFFERS_GENERATED_NP2STRUCTS_H_

#include "flatbuffers/flatbuffers.h"

struct BinAttr;

struct IntAttr;

struct MemberBinAttrInternal;

struct BinAttrInternal;

struct OptParam;

struct GroupConfig;

struct UserInfo2;

struct RoomMemberDataInternal;

struct RoomGroup;

struct RoomDataInternal;

struct RoomDataExternal;

struct IntSearchFilter;

struct BinSearchFilter;

struct PresenceOptionData;

struct RoomGroupPasswordConfig;

struct SearchRoomRequest;

struct SearchRoomResponse;

struct CreateJoinRoomRequest;

struct JoinRoomRequest;

struct LeaveRoomRequest;

struct SetRoomDataExternalRequest;

struct SetRoomDataInternalRequest;

struct GetRoomDataInternalRequest;

struct RoomMemberUpdateInfo;

struct RoomUpdateInfo;

struct GetPingInfoResponse;

struct SendRoomMessageRequest;

struct RoomMessageInfo;

struct BinAttr FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
    VT_ID = 4,
    VT_DATA = 6
  };
  u16 id() const {
    return GetField<u16>(VT_ID, 0);
  }
  const flatbuffers::Vector<u8> *data() const {
    return GetPointer<const flatbuffers::Vector<u8> *>(VT_DATA);
  }
  bool Verify(flatbuffers::Verifier &verifier) const {
    return VerifyTableStart(verifier) &&
           VerifyField<u16>(verifier, VT_ID) &&
           VerifyOffset(verifier, VT_DATA) &&
           verifier.VerifyVector(data()) &&
           verifier.EndTable();
  }
};

struct BinAttrBuilder {
  flatbuffers::FlatBufferBuilder &fbb_;
  flatbuffers::uoffset_t start_;
  void add_id(u16 id) {
    fbb_.AddElement<u16>(BinAttr::VT_ID, id, 0);
  }
  void add_data(flatbuffers::Offset<flatbuffers::Vector<u8>> data) {
    fbb_.AddOffset(BinAttr::VT_DATA, data);
  }
  explicit BinAttrBuilder(flatbuffers::FlatBufferBuilder &_fbb)
        : fbb_(_fbb) {
    start_ = fbb_.StartTable();
  }
  BinAttrBuilder &operator=(const BinAttrBuilder &);
  flatbuffers::Offset<BinAttr> Finish() {
    const auto end = fbb_.EndTable(start_);
    auto o = flatbuffers::Offset<BinAttr>(end);
    return o;
  }
};

inline flatbuffers::Offset<BinAttr> CreateBinAttr(
    flatbuffers::FlatBufferBuilder &_fbb,
    u16 id = 0,
    flatbuffers::Offset<flatbuffers::Vector<u8>> data = 0) {
  BinAttrBuilder builder_(_fbb);
  builder_.add_data(data);
  builder_.add_id(id);
  return builder_.Finish();
}

inline flatbuffers::Offset<BinAttr> CreateBinAttrDirect(
    flatbuffers::FlatBufferBuilder &_fbb,
    u16 id = 0,
    const std::vector<u8> *data = nullptr) {
  auto data__ = data ? _fbb.CreateVector<u8>(*data) : 0;
  return CreateBinAttr(
      _fbb,
      id,
      data__);
}

struct IntAttr FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
    VT_ID = 4,
    VT_NUM = 6
  };
  u16 id() const {
    return GetField<u16>(VT_ID, 0);
  }
  u32 num() const {
    return GetField<u32>(VT_NUM, 0);
  }
  bool Verify(flatbuffers::Verifier &verifier) const {
    return VerifyTableStart(verifier) &&
           VerifyField<u16>(verifier, VT_ID) &&
           VerifyField<u32>(verifier, VT_NUM) &&
           verifier.EndTable();
  }
};

struct IntAttrBuilder {
  flatbuffers::FlatBufferBuilder &fbb_;
  flatbuffers::uoffset_t start_;
  void add_id(u16 id) {
    fbb_.AddElement<u16>(IntAttr::VT_ID, id, 0);
  }
  void add_num(u32 num) {
    fbb_.AddElement<u32>(IntAttr::VT_NUM, num, 0);
  }
  explicit IntAttrBuilder(flatbuffers::FlatBufferBuilder &_fbb)
        : fbb_(_fbb) {
    start_ = fbb_.StartTable();
  }
  IntAttrBuilder &operator=(const IntAttrBuilder &);
  flatbuffers::Offset<IntAttr> Finish() {
    const auto end = fbb_.EndTable(start_);
    auto o = flatbuffers::Offset<IntAttr>(end);
    return o;
  }
};

inline flatbuffers::Offset<IntAttr> CreateIntAttr(
    flatbuffers::FlatBufferBuilder &_fbb,
    u16 id = 0,
    u32 num = 0) {
  IntAttrBuilder builder_(_fbb);
  builder_.add_num(num);
  builder_.add_id(id);
  return builder_.Finish();
}

struct MemberBinAttrInternal FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
    VT_UPDATEDATE = 4,
    VT_DATA = 6
  };
  u64 updateDate() const {
    return GetField<u64>(VT_UPDATEDATE, 0);
  }
  const BinAttr *data() const {
    return GetPointer<const BinAttr *>(VT_DATA);
  }
  bool Verify(flatbuffers::Verifier &verifier) const {
    return VerifyTableStart(verifier) &&
           VerifyField<u64>(verifier, VT_UPDATEDATE) &&
           VerifyOffset(verifier, VT_DATA) &&
           verifier.VerifyTable(data()) &&
           verifier.EndTable();
  }
};

struct MemberBinAttrInternalBuilder {
  flatbuffers::FlatBufferBuilder &fbb_;
  flatbuffers::uoffset_t start_;
  void add_updateDate(u64 updateDate) {
    fbb_.AddElement<u64>(MemberBinAttrInternal::VT_UPDATEDATE, updateDate, 0);
  }
  void add_data(flatbuffers::Offset<BinAttr> data) {
    fbb_.AddOffset(MemberBinAttrInternal::VT_DATA, data);
  }
  explicit MemberBinAttrInternalBuilder(flatbuffers::FlatBufferBuilder &_fbb)
        : fbb_(_fbb) {
    start_ = fbb_.StartTable();
  }
  MemberBinAttrInternalBuilder &operator=(const MemberBinAttrInternalBuilder &);
  flatbuffers::Offset<MemberBinAttrInternal> Finish() {
    const auto end = fbb_.EndTable(start_);
    auto o = flatbuffers::Offset<MemberBinAttrInternal>(end);
    return o;
  }
};

inline flatbuffers::Offset<MemberBinAttrInternal> CreateMemberBinAttrInternal(
    flatbuffers::FlatBufferBuilder &_fbb,
    u64 updateDate = 0,
    flatbuffers::Offset<BinAttr> data = 0) {
  MemberBinAttrInternalBuilder builder_(_fbb);
  builder_.add_updateDate(updateDate);
  builder_.add_data(data);
  return builder_.Finish();
}

struct BinAttrInternal FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
    VT_UPDATEDATE = 4,
    VT_UPDATEMEMBERID = 6,
    VT_DATA = 8
  };
  u64 updateDate() const {
    return GetField<u64>(VT_UPDATEDATE, 0);
  }
  u16 updateMemberId() const {
    return GetField<u16>(VT_UPDATEMEMBERID, 0);
  }
  const BinAttr *data() const {
    return GetPointer<const BinAttr *>(VT_DATA);
  }
  bool Verify(flatbuffers::Verifier &verifier) const {
    return VerifyTableStart(verifier) &&
           VerifyField<u64>(verifier, VT_UPDATEDATE) &&
           VerifyField<u16>(verifier, VT_UPDATEMEMBERID) &&
           VerifyOffset(verifier, VT_DATA) &&
           verifier.VerifyTable(data()) &&
           verifier.EndTable();
  }
};

struct BinAttrInternalBuilder {
  flatbuffers::FlatBufferBuilder &fbb_;
  flatbuffers::uoffset_t start_;
  void add_updateDate(u64 updateDate) {
    fbb_.AddElement<u64>(BinAttrInternal::VT_UPDATEDATE, updateDate, 0);
  }
  void add_updateMemberId(u16 updateMemberId) {
    fbb_.AddElement<u16>(BinAttrInternal::VT_UPDATEMEMBERID, updateMemberId, 0);
  }
  void add_data(flatbuffers::Offset<BinAttr> data) {
    fbb_.AddOffset(BinAttrInternal::VT_DATA, data);
  }
  explicit BinAttrInternalBuilder(flatbuffers::FlatBufferBuilder &_fbb)
        : fbb_(_fbb) {
    start_ = fbb_.StartTable();
  }
  BinAttrInternalBuilder &operator=(const BinAttrInternalBuilder &);
  flatbuffers::Offset<BinAttrInternal> Finish() {
    const auto end = fbb_.EndTable(start_);
    auto o = flatbuffers::Offset<BinAttrInternal>(end);
    return o;
  }
};

inline flatbuffers::Offset<BinAttrInternal> CreateBinAttrInternal(
    flatbuffers::FlatBufferBuilder &_fbb,
    u64 updateDate = 0,
    u16 updateMemberId = 0,
    flatbuffers::Offset<BinAttr> data = 0) {
  BinAttrInternalBuilder builder_(_fbb);
  builder_.add_updateDate(updateDate);
  builder_.add_data(data);
  builder_.add_updateMemberId(updateMemberId);
  return builder_.Finish();
}

struct OptParam FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
    VT_TYPE = 4,
    VT_FLAG = 6,
    VT_HUBMEMBERID = 8
  };
  u8 type() const {
    return GetField<u8>(VT_TYPE, 0);
  }
  u8 flag() const {
    return GetField<u8>(VT_FLAG, 0);
  }
  u16 hubMemberId() const {
    return GetField<u16>(VT_HUBMEMBERID, 0);
  }
  bool Verify(flatbuffers::Verifier &verifier) const {
    return VerifyTableStart(verifier) &&
           VerifyField<u8>(verifier, VT_TYPE) &&
           VerifyField<u8>(verifier, VT_FLAG) &&
           VerifyField<u16>(verifier, VT_HUBMEMBERID) &&
           verifier.EndTable();
  }
};

struct OptParamBuilder {
  flatbuffers::FlatBufferBuilder &fbb_;
  flatbuffers::uoffset_t start_;
  void add_type(u8 type) {
    fbb_.AddElement<u8>(OptParam::VT_TYPE, type, 0);
  }
  void add_flag(u8 flag) {
    fbb_.AddElement<u8>(OptParam::VT_FLAG, flag, 0);
  }
  void add_hubMemberId(u16 hubMemberId) {
    fbb_.AddElement<u16>(OptParam::VT_HUBMEMBERID, hubMemberId, 0);
  }
  explicit OptParamBuilder(flatbuffers::FlatBufferBuilder &_fbb)
        : fbb_(_fbb) {
    start_ = fbb_.StartTable();
  }
  OptParamBuilder &operator=(const OptParamBuilder &);
  flatbuffers::Offset<OptParam> Finish() {
    const auto end = fbb_.EndTable(start_);
    auto o = flatbuffers::Offset<OptParam>(end);
    return o;
  }
};

inline flatbuffers::Offset<OptParam> CreateOptParam(
    flatbuffers::FlatBufferBuilder &_fbb,
    u8 type = 0,
    u8 flag = 0,
    u16 hubMemberId = 0) {
  OptParamBuilder builder_(_fbb);
  builder_.add_hubMemberId(hubMemberId);
  builder_.add_flag(flag);
  builder_.add_type(type);
  return builder_.Finish();
}

struct GroupConfig FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
    VT_SLOTNUM = 4,
    VT_WITHLABEL = 6,
    VT_LABEL = 8,
    VT_WITHPASSWORD = 10
  };
  u32 slotNum() const {
    return GetField<u32>(VT_SLOTNUM, 0);
  }
  bool withLabel() const {
    return GetField<u8>(VT_WITHLABEL, 0) != 0;
  }
  const flatbuffers::Vector<u8> *label() const {
    return GetPointer<const flatbuffers::Vector<u8> *>(VT_LABEL);
  }
  bool withPassword() const {
    return GetField<u8>(VT_WITHPASSWORD, 0) != 0;
  }
  bool Verify(flatbuffers::Verifier &verifier) const {
    return VerifyTableStart(verifier) &&
           VerifyField<u32>(verifier, VT_SLOTNUM) &&
           VerifyField<u8>(verifier, VT_WITHLABEL) &&
           VerifyOffset(verifier, VT_LABEL) &&
           verifier.VerifyVector(label()) &&
           VerifyField<u8>(verifier, VT_WITHPASSWORD) &&
           verifier.EndTable();
  }
};

struct GroupConfigBuilder {
  flatbuffers::FlatBufferBuilder &fbb_;
  flatbuffers::uoffset_t start_;
  void add_slotNum(u32 slotNum) {
    fbb_.AddElement<u32>(GroupConfig::VT_SLOTNUM, slotNum, 0);
  }
  void add_withLabel(bool withLabel) {
    fbb_.AddElement<u8>(GroupConfig::VT_WITHLABEL, static_cast<u8>(withLabel), 0);
  }
  void add_label(flatbuffers::Offset<flatbuffers::Vector<u8>> label) {
    fbb_.AddOffset(GroupConfig::VT_LABEL, label);
  }
  void add_withPassword(bool withPassword) {
    fbb_.AddElement<u8>(GroupConfig::VT_WITHPASSWORD, static_cast<u8>(withPassword), 0);
  }
  explicit GroupConfigBuilder(flatbuffers::FlatBufferBuilder &_fbb)
        : fbb_(_fbb) {
    start_ = fbb_.StartTable();
  }
  GroupConfigBuilder &operator=(const GroupConfigBuilder &);
  flatbuffers::Offset<GroupConfig> Finish() {
    const auto end = fbb_.EndTable(start_);
    auto o = flatbuffers::Offset<GroupConfig>(end);
    return o;
  }
};

inline flatbuffers::Offset<GroupConfig> CreateGroupConfig(
    flatbuffers::FlatBufferBuilder &_fbb,
    u32 slotNum = 0,
    bool withLabel = false,
    flatbuffers::Offset<flatbuffers::Vector<u8>> label = 0,
    bool withPassword = false) {
  GroupConfigBuilder builder_(_fbb);
  builder_.add_label(label);
  builder_.add_slotNum(slotNum);
  builder_.add_withPassword(withPassword);
  builder_.add_withLabel(withLabel);
  return builder_.Finish();
}

inline flatbuffers::Offset<GroupConfig> CreateGroupConfigDirect(
    flatbuffers::FlatBufferBuilder &_fbb,
    u32 slotNum = 0,
    bool withLabel = false,
    const std::vector<u8> *label = nullptr,
    bool withPassword = false) {
  auto label__ = label ? _fbb.CreateVector<u8>(*label) : 0;
  return CreateGroupConfig(
      _fbb,
      slotNum,
      withLabel,
      label__,
      withPassword);
}

struct UserInfo2 FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
    VT_NPID = 4,
    VT_ONLINENAME = 6,
    VT_AVATARURL = 8
  };
  const flatbuffers::String *npId() const {
    return GetPointer<const flatbuffers::String *>(VT_NPID);
  }
  const flatbuffers::String *onlineName() const {
    return GetPointer<const flatbuffers::String *>(VT_ONLINENAME);
  }
  const flatbuffers::String *avatarUrl() const {
    return GetPointer<const flatbuffers::String *>(VT_AVATARURL);
  }
  bool Verify(flatbuffers::Verifier &verifier) const {
    return VerifyTableStart(verifier) &&
           VerifyOffset(verifier, VT_NPID) &&
           verifier.VerifyString(npId()) &&
           VerifyOffset(verifier, VT_ONLINENAME) &&
           verifier.VerifyString(onlineName()) &&
           VerifyOffset(verifier, VT_AVATARURL) &&
           verifier.VerifyString(avatarUrl()) &&
           verifier.EndTable();
  }
};

struct UserInfo2Builder {
  flatbuffers::FlatBufferBuilder &fbb_;
  flatbuffers::uoffset_t start_;
  void add_npId(flatbuffers::Offset<flatbuffers::String> npId) {
    fbb_.AddOffset(UserInfo2::VT_NPID, npId);
  }
  void add_onlineName(flatbuffers::Offset<flatbuffers::String> onlineName) {
    fbb_.AddOffset(UserInfo2::VT_ONLINENAME, onlineName);
  }
  void add_avatarUrl(flatbuffers::Offset<flatbuffers::String> avatarUrl) {
    fbb_.AddOffset(UserInfo2::VT_AVATARURL, avatarUrl);
  }
  explicit UserInfo2Builder(flatbuffers::FlatBufferBuilder &_fbb)
        : fbb_(_fbb) {
    start_ = fbb_.StartTable();
  }
  UserInfo2Builder &operator=(const UserInfo2Builder &);
  flatbuffers::Offset<UserInfo2> Finish() {
    const auto end = fbb_.EndTable(start_);
    auto o = flatbuffers::Offset<UserInfo2>(end);
    return o;
  }
};

inline flatbuffers::Offset<UserInfo2> CreateUserInfo2(
    flatbuffers::FlatBufferBuilder &_fbb,
    flatbuffers::Offset<flatbuffers::String> npId = 0,
    flatbuffers::Offset<flatbuffers::String> onlineName = 0,
    flatbuffers::Offset<flatbuffers::String> avatarUrl = 0) {
  UserInfo2Builder builder_(_fbb);
  builder_.add_avatarUrl(avatarUrl);
  builder_.add_onlineName(onlineName);
  builder_.add_npId(npId);
  return builder_.Finish();
}

inline flatbuffers::Offset<UserInfo2> CreateUserInfo2Direct(
    flatbuffers::FlatBufferBuilder &_fbb,
    const char *npId = nullptr,
    const char *onlineName = nullptr,
    const char *avatarUrl = nullptr) {
  auto npId__ = npId ? _fbb.CreateString(npId) : 0;
  auto onlineName__ = onlineName ? _fbb.CreateString(onlineName) : 0;
  auto avatarUrl__ = avatarUrl ? _fbb.CreateString(avatarUrl) : 0;
  return CreateUserInfo2(
      _fbb,
      npId__,
      onlineName__,
      avatarUrl__);
}

struct RoomMemberDataInternal FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
    VT_USERINFO = 4,
    VT_JOINDATE = 6,
    VT_MEMBERID = 8,
    VT_TEAMID = 10,
    VT_ROOMGROUP = 12,
    VT_NATTYPE = 14,
    VT_FLAGATTR = 16,
    VT_ROOMMEMBERBINATTRINTERNAL = 18
  };
  const UserInfo2 *userInfo() const {
    return GetPointer<const UserInfo2 *>(VT_USERINFO);
  }
  u64 joinDate() const {
    return GetField<u64>(VT_JOINDATE, 0);
  }
  u16 memberId() const {
    return GetField<u16>(VT_MEMBERID, 0);
  }
  u8 teamId() const {
    return GetField<u8>(VT_TEAMID, 0);
  }
  u8 roomGroup() const {
    return GetField<u8>(VT_ROOMGROUP, 0);
  }
  u8 natType() const {
    return GetField<u8>(VT_NATTYPE, 0);
  }
  u32 flagAttr() const {
    return GetField<u32>(VT_FLAGATTR, 0);
  }
  const flatbuffers::Vector<flatbuffers::Offset<MemberBinAttrInternal>> *roomMemberBinAttrInternal() const {
    return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<MemberBinAttrInternal>> *>(VT_ROOMMEMBERBINATTRINTERNAL);
  }
  bool Verify(flatbuffers::Verifier &verifier) const {
    return VerifyTableStart(verifier) &&
           VerifyOffset(verifier, VT_USERINFO) &&
           verifier.VerifyTable(userInfo()) &&
           VerifyField<u64>(verifier, VT_JOINDATE) &&
           VerifyField<u16>(verifier, VT_MEMBERID) &&
           VerifyField<u8>(verifier, VT_TEAMID) &&
           VerifyField<u8>(verifier, VT_ROOMGROUP) &&
           VerifyField<u8>(verifier, VT_NATTYPE) &&
           VerifyField<u32>(verifier, VT_FLAGATTR) &&
           VerifyOffset(verifier, VT_ROOMMEMBERBINATTRINTERNAL) &&
           verifier.VerifyVector(roomMemberBinAttrInternal()) &&
           verifier.VerifyVectorOfTables(roomMemberBinAttrInternal()) &&
           verifier.EndTable();
  }
};

struct RoomMemberDataInternalBuilder {
  flatbuffers::FlatBufferBuilder &fbb_;
  flatbuffers::uoffset_t start_;
  void add_userInfo(flatbuffers::Offset<UserInfo2> userInfo) {
    fbb_.AddOffset(RoomMemberDataInternal::VT_USERINFO, userInfo);
  }
  void add_joinDate(u64 joinDate) {
    fbb_.AddElement<u64>(RoomMemberDataInternal::VT_JOINDATE, joinDate, 0);
  }
  void add_memberId(u16 memberId) {
    fbb_.AddElement<u16>(RoomMemberDataInternal::VT_MEMBERID, memberId, 0);
  }
  void add_teamId(u8 teamId) {
    fbb_.AddElement<u8>(RoomMemberDataInternal::VT_TEAMID, teamId, 0);
  }
  void add_roomGroup(u8 roomGroup) {
    fbb_.AddElement<u8>(RoomMemberDataInternal::VT_ROOMGROUP, roomGroup, 0);
  }
  void add_natType(u8 natType) {
    fbb_.AddElement<u8>(RoomMemberDataInternal::VT_NATTYPE, natType, 0);
  }
  void add_flagAttr(u32 flagAttr) {
    fbb_.AddElement<u32>(RoomMemberDataInternal::VT_FLAGATTR, flagAttr, 0);
  }
  void add_roomMemberBinAttrInternal(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<MemberBinAttrInternal>>> roomMemberBinAttrInternal) {
    fbb_.AddOffset(RoomMemberDataInternal::VT_ROOMMEMBERBINATTRINTERNAL, roomMemberBinAttrInternal);
  }
  explicit RoomMemberDataInternalBuilder(flatbuffers::FlatBufferBuilder &_fbb)
        : fbb_(_fbb) {
    start_ = fbb_.StartTable();
  }
  RoomMemberDataInternalBuilder &operator=(const RoomMemberDataInternalBuilder &);
  flatbuffers::Offset<RoomMemberDataInternal> Finish() {
    const auto end = fbb_.EndTable(start_);
    auto o = flatbuffers::Offset<RoomMemberDataInternal>(end);
    return o;
  }
};

inline flatbuffers::Offset<RoomMemberDataInternal> CreateRoomMemberDataInternal(
    flatbuffers::FlatBufferBuilder &_fbb,
    flatbuffers::Offset<UserInfo2> userInfo = 0,
    u64 joinDate = 0,
    u16 memberId = 0,
    u8 teamId = 0,
    u8 roomGroup = 0,
    u8 natType = 0,
    u32 flagAttr = 0,
    flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<MemberBinAttrInternal>>> roomMemberBinAttrInternal = 0) {
  RoomMemberDataInternalBuilder builder_(_fbb);
  builder_.add_joinDate(joinDate);
  builder_.add_roomMemberBinAttrInternal(roomMemberBinAttrInternal);
  builder_.add_flagAttr(flagAttr);
  builder_.add_userInfo(userInfo);
  builder_.add_memberId(memberId);
  builder_.add_natType(natType);
  builder_.add_roomGroup(roomGroup);
  builder_.add_teamId(teamId);
  return builder_.Finish();
}

inline flatbuffers::Offset<RoomMemberDataInternal> CreateRoomMemberDataInternalDirect(
    flatbuffers::FlatBufferBuilder &_fbb,
    flatbuffers::Offset<UserInfo2> userInfo = 0,
    u64 joinDate = 0,
    u16 memberId = 0,
    u8 teamId = 0,
    u8 roomGroup = 0,
    u8 natType = 0,
    u32 flagAttr = 0,
    const std::vector<flatbuffers::Offset<MemberBinAttrInternal>> *roomMemberBinAttrInternal = nullptr) {
  auto roomMemberBinAttrInternal__ = roomMemberBinAttrInternal ? _fbb.CreateVector<flatbuffers::Offset<MemberBinAttrInternal>>(*roomMemberBinAttrInternal) : 0;
  return CreateRoomMemberDataInternal(
      _fbb,
      userInfo,
      joinDate,
      memberId,
      teamId,
      roomGroup,
      natType,
      flagAttr,
      roomMemberBinAttrInternal__);
}

struct RoomGroup FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
    VT_GROUPID = 4,
    VT_WITHPASSWORD = 6,
    VT_WITHLABEL = 8,
    VT_LABEL = 10,
    VT_SLOTNUM = 12,
    VT_CURGROUPMEMBERNUM = 14
  };
  u8 groupId() const {
    return GetField<u8>(VT_GROUPID, 0);
  }
  bool withPassword() const {
    return GetField<u8>(VT_WITHPASSWORD, 0) != 0;
  }
  bool withLabel() const {
    return GetField<u8>(VT_WITHLABEL, 0) != 0;
  }
  const flatbuffers::Vector<u8> *label() const {
    return GetPointer<const flatbuffers::Vector<u8> *>(VT_LABEL);
  }
  u32 slotNum() const {
    return GetField<u32>(VT_SLOTNUM, 0);
  }
  u32 curGroupMemberNum() const {
    return GetField<u32>(VT_CURGROUPMEMBERNUM, 0);
  }
  bool Verify(flatbuffers::Verifier &verifier) const {
    return VerifyTableStart(verifier) &&
           VerifyField<u8>(verifier, VT_GROUPID) &&
           VerifyField<u8>(verifier, VT_WITHPASSWORD) &&
           VerifyField<u8>(verifier, VT_WITHLABEL) &&
           VerifyOffset(verifier, VT_LABEL) &&
           verifier.VerifyVector(label()) &&
           VerifyField<u32>(verifier, VT_SLOTNUM) &&
           VerifyField<u32>(verifier, VT_CURGROUPMEMBERNUM) &&
           verifier.EndTable();
  }
};

struct RoomGroupBuilder {
  flatbuffers::FlatBufferBuilder &fbb_;
  flatbuffers::uoffset_t start_;
  void add_groupId(u8 groupId) {
    fbb_.AddElement<u8>(RoomGroup::VT_GROUPID, groupId, 0);
  }
  void add_withPassword(bool withPassword) {
    fbb_.AddElement<u8>(RoomGroup::VT_WITHPASSWORD, static_cast<u8>(withPassword), 0);
  }
  void add_withLabel(bool withLabel) {
    fbb_.AddElement<u8>(RoomGroup::VT_WITHLABEL, static_cast<u8>(withLabel), 0);
  }
  void add_label(flatbuffers::Offset<flatbuffers::Vector<u8>> label) {
    fbb_.AddOffset(RoomGroup::VT_LABEL, label);
  }
  void add_slotNum(u32 slotNum) {
    fbb_.AddElement<u32>(RoomGroup::VT_SLOTNUM, slotNum, 0);
  }
  void add_curGroupMemberNum(u32 curGroupMemberNum) {
    fbb_.AddElement<u32>(RoomGroup::VT_CURGROUPMEMBERNUM, curGroupMemberNum, 0);
  }
  explicit RoomGroupBuilder(flatbuffers::FlatBufferBuilder &_fbb)
        : fbb_(_fbb) {
    start_ = fbb_.StartTable();
  }
  RoomGroupBuilder &operator=(const RoomGroupBuilder &);
  flatbuffers::Offset<RoomGroup> Finish() {
    const auto end = fbb_.EndTable(start_);
    auto o = flatbuffers::Offset<RoomGroup>(end);
    return o;
  }
};

inline flatbuffers::Offset<RoomGroup> CreateRoomGroup(
    flatbuffers::FlatBufferBuilder &_fbb,
    u8 groupId = 0,
    bool withPassword = false,
    bool withLabel = false,
    flatbuffers::Offset<flatbuffers::Vector<u8>> label = 0,
    u32 slotNum = 0,
    u32 curGroupMemberNum = 0) {
  RoomGroupBuilder builder_(_fbb);
  builder_.add_curGroupMemberNum(curGroupMemberNum);
  builder_.add_slotNum(slotNum);
  builder_.add_label(label);
  builder_.add_withLabel(withLabel);
  builder_.add_withPassword(withPassword);
  builder_.add_groupId(groupId);
  return builder_.Finish();
}

inline flatbuffers::Offset<RoomGroup> CreateRoomGroupDirect(
    flatbuffers::FlatBufferBuilder &_fbb,
    u8 groupId = 0,
    bool withPassword = false,
    bool withLabel = false,
    const std::vector<u8> *label = nullptr,
    u32 slotNum = 0,
    u32 curGroupMemberNum = 0) {
  auto label__ = label ? _fbb.CreateVector<u8>(*label) : 0;
  return CreateRoomGroup(
      _fbb,
      groupId,
      withPassword,
      withLabel,
      label__,
      slotNum,
      curGroupMemberNum);
}

struct RoomDataInternal FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
    VT_SERVERID = 4,
    VT_WORLDID = 6,
    VT_LOBBYID = 8,
    VT_ROOMID = 10,
    VT_PASSWORDSLOTMASK = 12,
    VT_MAXSLOT = 14,
    VT_MEMBERLIST = 16,
    VT_OWNERID = 18,
    VT_ROOMGROUP = 20,
    VT_FLAGATTR = 22,
    VT_ROOMBINATTRINTERNAL = 24
  };
  u16 serverId() const {
    return GetField<u16>(VT_SERVERID, 0);
  }
  u32 worldId() const {
    return GetField<u32>(VT_WORLDID, 0);
  }
  u64 lobbyId() const {
    return GetField<u64>(VT_LOBBYID, 0);
  }
  u64 roomId() const {
    return GetField<u64>(VT_ROOMID, 0);
  }
  u64 passwordSlotMask() const {
    return GetField<u64>(VT_PASSWORDSLOTMASK, 0);
  }
  u32 maxSlot() const {
    return GetField<u32>(VT_MAXSLOT, 0);
  }
  const flatbuffers::Vector<flatbuffers::Offset<RoomMemberDataInternal>> *memberList() const {
    return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<RoomMemberDataInternal>> *>(VT_MEMBERLIST);
  }
  u16 ownerId() const {
    return GetField<u16>(VT_OWNERID, 0);
  }
  const flatbuffers::Vector<flatbuffers::Offset<RoomGroup>> *roomGroup() const {
    return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<RoomGroup>> *>(VT_ROOMGROUP);
  }
  u32 flagAttr() const {
    return GetField<u32>(VT_FLAGATTR, 0);
  }
  const flatbuffers::Vector<flatbuffers::Offset<BinAttrInternal>> *roomBinAttrInternal() const {
    return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<BinAttrInternal>> *>(VT_ROOMBINATTRINTERNAL);
  }
  bool Verify(flatbuffers::Verifier &verifier) const {
    return VerifyTableStart(verifier) &&
           VerifyField<u16>(verifier, VT_SERVERID) &&
           VerifyField<u32>(verifier, VT_WORLDID) &&
           VerifyField<u64>(verifier, VT_LOBBYID) &&
           VerifyField<u64>(verifier, VT_ROOMID) &&
           VerifyField<u64>(verifier, VT_PASSWORDSLOTMASK) &&
           VerifyField<u32>(verifier, VT_MAXSLOT) &&
           VerifyOffset(verifier, VT_MEMBERLIST) &&
           verifier.VerifyVector(memberList()) &&
           verifier.VerifyVectorOfTables(memberList()) &&
           VerifyField<u16>(verifier, VT_OWNERID) &&
           VerifyOffset(verifier, VT_ROOMGROUP) &&
           verifier.VerifyVector(roomGroup()) &&
           verifier.VerifyVectorOfTables(roomGroup()) &&
           VerifyField<u32>(verifier, VT_FLAGATTR) &&
           VerifyOffset(verifier, VT_ROOMBINATTRINTERNAL) &&
           verifier.VerifyVector(roomBinAttrInternal()) &&
           verifier.VerifyVectorOfTables(roomBinAttrInternal()) &&
           verifier.EndTable();
  }
};

struct RoomDataInternalBuilder {
  flatbuffers::FlatBufferBuilder &fbb_;
  flatbuffers::uoffset_t start_;
  void add_serverId(u16 serverId) {
    fbb_.AddElement<u16>(RoomDataInternal::VT_SERVERID, serverId, 0);
  }
  void add_worldId(u32 worldId) {
    fbb_.AddElement<u32>(RoomDataInternal::VT_WORLDID, worldId, 0);
  }
  void add_lobbyId(u64 lobbyId) {
    fbb_.AddElement<u64>(RoomDataInternal::VT_LOBBYID, lobbyId, 0);
  }
  void add_roomId(u64 roomId) {
    fbb_.AddElement<u64>(RoomDataInternal::VT_ROOMID, roomId, 0);
  }
  void add_passwordSlotMask(u64 passwordSlotMask) {
    fbb_.AddElement<u64>(RoomDataInternal::VT_PASSWORDSLOTMASK, passwordSlotMask, 0);
  }
  void add_maxSlot(u32 maxSlot) {
    fbb_.AddElement<u32>(RoomDataInternal::VT_MAXSLOT, maxSlot, 0);
  }
  void add_memberList(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<RoomMemberDataInternal>>> memberList) {
    fbb_.AddOffset(RoomDataInternal::VT_MEMBERLIST, memberList);
  }
  void add_ownerId(u16 ownerId) {
    fbb_.AddElement<u16>(RoomDataInternal::VT_OWNERID, ownerId, 0);
  }
  void add_roomGroup(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<RoomGroup>>> roomGroup) {
    fbb_.AddOffset(RoomDataInternal::VT_ROOMGROUP, roomGroup);
  }
  void add_flagAttr(u32 flagAttr) {
    fbb_.AddElement<u32>(RoomDataInternal::VT_FLAGATTR, flagAttr, 0);
  }
  void add_roomBinAttrInternal(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<BinAttrInternal>>> roomBinAttrInternal) {
    fbb_.AddOffset(RoomDataInternal::VT_ROOMBINATTRINTERNAL, roomBinAttrInternal);
  }
  explicit RoomDataInternalBuilder(flatbuffers::FlatBufferBuilder &_fbb)
        : fbb_(_fbb) {
    start_ = fbb_.StartTable();
  }
  RoomDataInternalBuilder &operator=(const RoomDataInternalBuilder &);
  flatbuffers::Offset<RoomDataInternal> Finish() {
    const auto end = fbb_.EndTable(start_);
    auto o = flatbuffers::Offset<RoomDataInternal>(end);
    return o;
  }
};

inline flatbuffers::Offset<RoomDataInternal> CreateRoomDataInternal(
    flatbuffers::FlatBufferBuilder &_fbb,
    u16 serverId = 0,
    u32 worldId = 0,
    u64 lobbyId = 0,
    u64 roomId = 0,
    u64 passwordSlotMask = 0,
    u32 maxSlot = 0,
    flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<RoomMemberDataInternal>>> memberList = 0,
    u16 ownerId = 0,
    flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<RoomGroup>>> roomGroup = 0,
    u32 flagAttr = 0,
    flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<BinAttrInternal>>> roomBinAttrInternal = 0) {
  RoomDataInternalBuilder builder_(_fbb);
  builder_.add_passwordSlotMask(passwordSlotMask);
  builder_.add_roomId(roomId);
  builder_.add_lobbyId(lobbyId);
  builder_.add_roomBinAttrInternal(roomBinAttrInternal);
  builder_.add_flagAttr(flagAttr);
  builder_.add_roomGroup(roomGroup);
  builder_.add_memberList(memberList);
  builder_.add_maxSlot(maxSlot);
  builder_.add_worldId(worldId);
  builder_.add_ownerId(ownerId);
  builder_.add_serverId(serverId);
  return builder_.Finish();
}

inline flatbuffers::Offset<RoomDataInternal> CreateRoomDataInternalDirect(
    flatbuffers::FlatBufferBuilder &_fbb,
    u16 serverId = 0,
    u32 worldId = 0,
    u64 lobbyId = 0,
    u64 roomId = 0,
    u64 passwordSlotMask = 0,
    u32 maxSlot = 0,
    const std::vector<flatbuffers::Offset<RoomMemberDataInternal>> *memberList = nullptr,
    u16 ownerId = 0,
    const std::vector<flatbuffers::Offset<RoomGroup>> *roomGroup = nullptr,
    u32 flagAttr = 0,
    const std::vector<flatbuffers::Offset<BinAttrInternal>> *roomBinAttrInternal = nullptr) {
  auto memberList__ = memberList ? _fbb.CreateVector<flatbuffers::Offset<RoomMemberDataInternal>>(*memberList) : 0;
  auto roomGroup__ = roomGroup ? _fbb.CreateVector<flatbuffers::Offset<RoomGroup>>(*roomGroup) : 0;
  auto roomBinAttrInternal__ = roomBinAttrInternal ? _fbb.CreateVector<flatbuffers::Offset<BinAttrInternal>>(*roomBinAttrInternal) : 0;
  return CreateRoomDataInternal(
      _fbb,
      serverId,
      worldId,
      lobbyId,
      roomId,
      passwordSlotMask,
      maxSlot,
      memberList__,
      ownerId,
      roomGroup__,
      flagAttr,
      roomBinAttrInternal__);
}

struct RoomDataExternal FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
    VT_SERVERID = 4,
    VT_WORLDID = 6,
    VT_PUBLICSLOTNUM = 8,
    VT_PRIVATESLOTNUM = 10,
    VT_LOBBYID = 12,
    VT_ROOMID = 14,
    VT_OPENPUBLICSLOTNUM = 16,
    VT_MAXSLOT = 18,
    VT_OPENPRIVATESLOTNUM = 20,
    VT_CURMEMBERNUM = 22,
    VT_PASSWORDSLOTMASK = 24,
    VT_OWNER = 26,
    VT_ROOMGROUP = 28,
    VT_FLAGATTR = 30,
    VT_ROOMSEARCHABLEINTATTREXTERNAL = 32,
    VT_ROOMSEARCHABLEBINATTREXTERNAL = 34,
    VT_ROOMBINATTREXTERNAL = 36
  };
  u16 serverId() const {
    return GetField<u16>(VT_SERVERID, 0);
  }
  u32 worldId() const {
    return GetField<u32>(VT_WORLDID, 0);
  }
  u16 publicSlotNum() const {
    return GetField<u16>(VT_PUBLICSLOTNUM, 0);
  }
  u16 privateSlotNum() const {
    return GetField<u16>(VT_PRIVATESLOTNUM, 0);
  }
  u64 lobbyId() const {
    return GetField<u64>(VT_LOBBYID, 0);
  }
  u64 roomId() const {
    return GetField<u64>(VT_ROOMID, 0);
  }
  u16 openPublicSlotNum() const {
    return GetField<u16>(VT_OPENPUBLICSLOTNUM, 0);
  }
  u16 maxSlot() const {
    return GetField<u16>(VT_MAXSLOT, 0);
  }
  u16 openPrivateSlotNum() const {
    return GetField<u16>(VT_OPENPRIVATESLOTNUM, 0);
  }
  u16 curMemberNum() const {
    return GetField<u16>(VT_CURMEMBERNUM, 0);
  }
  u64 passwordSlotMask() const {
    return GetField<u64>(VT_PASSWORDSLOTMASK, 0);
  }
  const UserInfo2 *owner() const {
    return GetPointer<const UserInfo2 *>(VT_OWNER);
  }
  const flatbuffers::Vector<flatbuffers::Offset<RoomGroup>> *roomGroup() const {
    return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<RoomGroup>> *>(VT_ROOMGROUP);
  }
  u32 flagAttr() const {
    return GetField<u32>(VT_FLAGATTR, 0);
  }
  const flatbuffers::Vector<flatbuffers::Offset<IntAttr>> *roomSearchableIntAttrExternal() const {
    return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<IntAttr>> *>(VT_ROOMSEARCHABLEINTATTREXTERNAL);
  }
  const flatbuffers::Vector<flatbuffers::Offset<BinAttr>> *roomSearchableBinAttrExternal() const {
    return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<BinAttr>> *>(VT_ROOMSEARCHABLEBINATTREXTERNAL);
  }
  const flatbuffers::Vector<flatbuffers::Offset<BinAttr>> *roomBinAttrExternal() const {
    return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<BinAttr>> *>(VT_ROOMBINATTREXTERNAL);
  }
  bool Verify(flatbuffers::Verifier &verifier) const {
    return VerifyTableStart(verifier) &&
           VerifyField<u16>(verifier, VT_SERVERID) &&
           VerifyField<u32>(verifier, VT_WORLDID) &&
           VerifyField<u16>(verifier, VT_PUBLICSLOTNUM) &&
           VerifyField<u16>(verifier, VT_PRIVATESLOTNUM) &&
           VerifyField<u64>(verifier, VT_LOBBYID) &&
           VerifyField<u64>(verifier, VT_ROOMID) &&
           VerifyField<u16>(verifier, VT_OPENPUBLICSLOTNUM) &&
           VerifyField<u16>(verifier, VT_MAXSLOT) &&
           VerifyField<u16>(verifier, VT_OPENPRIVATESLOTNUM) &&
           VerifyField<u16>(verifier, VT_CURMEMBERNUM) &&
           VerifyField<u64>(verifier, VT_PASSWORDSLOTMASK) &&
           VerifyOffset(verifier, VT_OWNER) &&
           verifier.VerifyTable(owner()) &&
           VerifyOffset(verifier, VT_ROOMGROUP) &&
           verifier.VerifyVector(roomGroup()) &&
           verifier.VerifyVectorOfTables(roomGroup()) &&
           VerifyField<u32>(verifier, VT_FLAGATTR) &&
           VerifyOffset(verifier, VT_ROOMSEARCHABLEINTATTREXTERNAL) &&
           verifier.VerifyVector(roomSearchableIntAttrExternal()) &&
           verifier.VerifyVectorOfTables(roomSearchableIntAttrExternal()) &&
           VerifyOffset(verifier, VT_ROOMSEARCHABLEBINATTREXTERNAL) &&
           verifier.VerifyVector(roomSearchableBinAttrExternal()) &&
           verifier.VerifyVectorOfTables(roomSearchableBinAttrExternal()) &&
           VerifyOffset(verifier, VT_ROOMBINATTREXTERNAL) &&
           verifier.VerifyVector(roomBinAttrExternal()) &&
           verifier.VerifyVectorOfTables(roomBinAttrExternal()) &&
           verifier.EndTable();
  }
};

struct RoomDataExternalBuilder {
  flatbuffers::FlatBufferBuilder &fbb_;
  flatbuffers::uoffset_t start_;
  void add_serverId(u16 serverId) {
    fbb_.AddElement<u16>(RoomDataExternal::VT_SERVERID, serverId, 0);
  }
  void add_worldId(u32 worldId) {
    fbb_.AddElement<u32>(RoomDataExternal::VT_WORLDID, worldId, 0);
  }
  void add_publicSlotNum(u16 publicSlotNum) {
    fbb_.AddElement<u16>(RoomDataExternal::VT_PUBLICSLOTNUM, publicSlotNum, 0);
  }
  void add_privateSlotNum(u16 privateSlotNum) {
    fbb_.AddElement<u16>(RoomDataExternal::VT_PRIVATESLOTNUM, privateSlotNum, 0);
  }
  void add_lobbyId(u64 lobbyId) {
    fbb_.AddElement<u64>(RoomDataExternal::VT_LOBBYID, lobbyId, 0);
  }
  void add_roomId(u64 roomId) {
    fbb_.AddElement<u64>(RoomDataExternal::VT_ROOMID, roomId, 0);
  }
  void add_openPublicSlotNum(u16 openPublicSlotNum) {
    fbb_.AddElement<u16>(RoomDataExternal::VT_OPENPUBLICSLOTNUM, openPublicSlotNum, 0);
  }
  void add_maxSlot(u16 maxSlot) {
    fbb_.AddElement<u16>(RoomDataExternal::VT_MAXSLOT, maxSlot, 0);
  }
  void add_openPrivateSlotNum(u16 openPrivateSlotNum) {
    fbb_.AddElement<u16>(RoomDataExternal::VT_OPENPRIVATESLOTNUM, openPrivateSlotNum, 0);
  }
  void add_curMemberNum(u16 curMemberNum) {
    fbb_.AddElement<u16>(RoomDataExternal::VT_CURMEMBERNUM, curMemberNum, 0);
  }
  void add_passwordSlotMask(u64 passwordSlotMask) {
    fbb_.AddElement<u64>(RoomDataExternal::VT_PASSWORDSLOTMASK, passwordSlotMask, 0);
  }
  void add_owner(flatbuffers::Offset<UserInfo2> owner) {
    fbb_.AddOffset(RoomDataExternal::VT_OWNER, owner);
  }
  void add_roomGroup(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<RoomGroup>>> roomGroup) {
    fbb_.AddOffset(RoomDataExternal::VT_ROOMGROUP, roomGroup);
  }
  void add_flagAttr(u32 flagAttr) {
    fbb_.AddElement<u32>(RoomDataExternal::VT_FLAGATTR, flagAttr, 0);
  }
  void add_roomSearchableIntAttrExternal(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<IntAttr>>> roomSearchableIntAttrExternal) {
    fbb_.AddOffset(RoomDataExternal::VT_ROOMSEARCHABLEINTATTREXTERNAL, roomSearchableIntAttrExternal);
  }
  void add_roomSearchableBinAttrExternal(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<BinAttr>>> roomSearchableBinAttrExternal) {
    fbb_.AddOffset(RoomDataExternal::VT_ROOMSEARCHABLEBINATTREXTERNAL, roomSearchableBinAttrExternal);
  }
  void add_roomBinAttrExternal(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<BinAttr>>> roomBinAttrExternal) {
    fbb_.AddOffset(RoomDataExternal::VT_ROOMBINATTREXTERNAL, roomBinAttrExternal);
  }
  explicit RoomDataExternalBuilder(flatbuffers::FlatBufferBuilder &_fbb)
        : fbb_(_fbb) {
    start_ = fbb_.StartTable();
  }
  RoomDataExternalBuilder &operator=(const RoomDataExternalBuilder &);
  flatbuffers::Offset<RoomDataExternal> Finish() {
    const auto end = fbb_.EndTable(start_);
    auto o = flatbuffers::Offset<RoomDataExternal>(end);
    return o;
  }
};

inline flatbuffers::Offset<RoomDataExternal> CreateRoomDataExternal(
    flatbuffers::FlatBufferBuilder &_fbb,
    u16 serverId = 0,
    u32 worldId = 0,
    u16 publicSlotNum = 0,
    u16 privateSlotNum = 0,
    u64 lobbyId = 0,
    u64 roomId = 0,
    u16 openPublicSlotNum = 0,
    u16 maxSlot = 0,
    u16 openPrivateSlotNum = 0,
    u16 curMemberNum = 0,
    u64 passwordSlotMask = 0,
    flatbuffers::Offset<UserInfo2> owner = 0,
    flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<RoomGroup>>> roomGroup = 0,
    u32 flagAttr = 0,
    flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<IntAttr>>> roomSearchableIntAttrExternal = 0,
    flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<BinAttr>>> roomSearchableBinAttrExternal = 0,
    flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<BinAttr>>> roomBinAttrExternal = 0) {
  RoomDataExternalBuilder builder_(_fbb);
  builder_.add_passwordSlotMask(passwordSlotMask);
  builder_.add_roomId(roomId);
  builder_.add_lobbyId(lobbyId);
  builder_.add_roomBinAttrExternal(roomBinAttrExternal);
  builder_.add_roomSearchableBinAttrExternal(roomSearchableBinAttrExternal);
  builder_.add_roomSearchableIntAttrExternal(roomSearchableIntAttrExternal);
  builder_.add_flagAttr(flagAttr);
  builder_.add_roomGroup(roomGroup);
  builder_.add_owner(owner);
  builder_.add_worldId(worldId);
  builder_.add_curMemberNum(curMemberNum);
  builder_.add_openPrivateSlotNum(openPrivateSlotNum);
  builder_.add_maxSlot(maxSlot);
  builder_.add_openPublicSlotNum(openPublicSlotNum);
  builder_.add_privateSlotNum(privateSlotNum);
  builder_.add_publicSlotNum(publicSlotNum);
  builder_.add_serverId(serverId);
  return builder_.Finish();
}

inline flatbuffers::Offset<RoomDataExternal> CreateRoomDataExternalDirect(
    flatbuffers::FlatBufferBuilder &_fbb,
    u16 serverId = 0,
    u32 worldId = 0,
    u16 publicSlotNum = 0,
    u16 privateSlotNum = 0,
    u64 lobbyId = 0,
    u64 roomId = 0,
    u16 openPublicSlotNum = 0,
    u16 maxSlot = 0,
    u16 openPrivateSlotNum = 0,
    u16 curMemberNum = 0,
    u64 passwordSlotMask = 0,
    flatbuffers::Offset<UserInfo2> owner = 0,
    const std::vector<flatbuffers::Offset<RoomGroup>> *roomGroup = nullptr,
    u32 flagAttr = 0,
    const std::vector<flatbuffers::Offset<IntAttr>> *roomSearchableIntAttrExternal = nullptr,
    const std::vector<flatbuffers::Offset<BinAttr>> *roomSearchableBinAttrExternal = nullptr,
    const std::vector<flatbuffers::Offset<BinAttr>> *roomBinAttrExternal = nullptr) {
  auto roomGroup__ = roomGroup ? _fbb.CreateVector<flatbuffers::Offset<RoomGroup>>(*roomGroup) : 0;
  auto roomSearchableIntAttrExternal__ = roomSearchableIntAttrExternal ? _fbb.CreateVector<flatbuffers::Offset<IntAttr>>(*roomSearchableIntAttrExternal) : 0;
  auto roomSearchableBinAttrExternal__ = roomSearchableBinAttrExternal ? _fbb.CreateVector<flatbuffers::Offset<BinAttr>>(*roomSearchableBinAttrExternal) : 0;
  auto roomBinAttrExternal__ = roomBinAttrExternal ? _fbb.CreateVector<flatbuffers::Offset<BinAttr>>(*roomBinAttrExternal) : 0;
  return CreateRoomDataExternal(
      _fbb,
      serverId,
      worldId,
      publicSlotNum,
      privateSlotNum,
      lobbyId,
      roomId,
      openPublicSlotNum,
      maxSlot,
      openPrivateSlotNum,
      curMemberNum,
      passwordSlotMask,
      owner,
      roomGroup__,
      flagAttr,
      roomSearchableIntAttrExternal__,
      roomSearchableBinAttrExternal__,
      roomBinAttrExternal__);
}

struct IntSearchFilter FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
    VT_SEARCHOPERATOR = 4,
    VT_ATTR = 6
  };
  u8 searchOperator() const {
    return GetField<u8>(VT_SEARCHOPERATOR, 0);
  }
  const IntAttr *attr() const {
    return GetPointer<const IntAttr *>(VT_ATTR);
  }
  bool Verify(flatbuffers::Verifier &verifier) const {
    return VerifyTableStart(verifier) &&
           VerifyField<u8>(verifier, VT_SEARCHOPERATOR) &&
           VerifyOffset(verifier, VT_ATTR) &&
           verifier.VerifyTable(attr()) &&
           verifier.EndTable();
  }
};

struct IntSearchFilterBuilder {
  flatbuffers::FlatBufferBuilder &fbb_;
  flatbuffers::uoffset_t start_;
  void add_searchOperator(u8 searchOperator) {
    fbb_.AddElement<u8>(IntSearchFilter::VT_SEARCHOPERATOR, searchOperator, 0);
  }
  void add_attr(flatbuffers::Offset<IntAttr> attr) {
    fbb_.AddOffset(IntSearchFilter::VT_ATTR, attr);
  }
  explicit IntSearchFilterBuilder(flatbuffers::FlatBufferBuilder &_fbb)
        : fbb_(_fbb) {
    start_ = fbb_.StartTable();
  }
  IntSearchFilterBuilder &operator=(const IntSearchFilterBuilder &);
  flatbuffers::Offset<IntSearchFilter> Finish() {
    const auto end = fbb_.EndTable(start_);
    auto o = flatbuffers::Offset<IntSearchFilter>(end);
    return o;
  }
};

inline flatbuffers::Offset<IntSearchFilter> CreateIntSearchFilter(
    flatbuffers::FlatBufferBuilder &_fbb,
    u8 searchOperator = 0,
    flatbuffers::Offset<IntAttr> attr = 0) {
  IntSearchFilterBuilder builder_(_fbb);
  builder_.add_attr(attr);
  builder_.add_searchOperator(searchOperator);
  return builder_.Finish();
}

struct BinSearchFilter FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
    VT_SEARCHOPERATOR = 4,
    VT_ATTR = 6
  };
  u8 searchOperator() const {
    return GetField<u8>(VT_SEARCHOPERATOR, 0);
  }
  const BinAttr *attr() const {
    return GetPointer<const BinAttr *>(VT_ATTR);
  }
  bool Verify(flatbuffers::Verifier &verifier) const {
    return VerifyTableStart(verifier) &&
           VerifyField<u8>(verifier, VT_SEARCHOPERATOR) &&
           VerifyOffset(verifier, VT_ATTR) &&
           verifier.VerifyTable(attr()) &&
           verifier.EndTable();
  }
};

struct BinSearchFilterBuilder {
  flatbuffers::FlatBufferBuilder &fbb_;
  flatbuffers::uoffset_t start_;
  void add_searchOperator(u8 searchOperator) {
    fbb_.AddElement<u8>(BinSearchFilter::VT_SEARCHOPERATOR, searchOperator, 0);
  }
  void add_attr(flatbuffers::Offset<BinAttr> attr) {
    fbb_.AddOffset(BinSearchFilter::VT_ATTR, attr);
  }
  explicit BinSearchFilterBuilder(flatbuffers::FlatBufferBuilder &_fbb)
        : fbb_(_fbb) {
    start_ = fbb_.StartTable();
  }
  BinSearchFilterBuilder &operator=(const BinSearchFilterBuilder &);
  flatbuffers::Offset<BinSearchFilter> Finish() {
    const auto end = fbb_.EndTable(start_);
    auto o = flatbuffers::Offset<BinSearchFilter>(end);
    return o;
  }
};

inline flatbuffers::Offset<BinSearchFilter> CreateBinSearchFilter(
    flatbuffers::FlatBufferBuilder &_fbb,
    u8 searchOperator = 0,
    flatbuffers::Offset<BinAttr> attr = 0) {
  BinSearchFilterBuilder builder_(_fbb);
  builder_.add_attr(attr);
  builder_.add_searchOperator(searchOperator);
  return builder_.Finish();
}

struct PresenceOptionData FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
    VT_DATA = 4,
    VT_LEN = 6
  };
  const flatbuffers::Vector<u8> *data() const {
    return GetPointer<const flatbuffers::Vector<u8> *>(VT_DATA);
  }
  u32 len() const {
    return GetField<u32>(VT_LEN, 0);
  }
  bool Verify(flatbuffers::Verifier &verifier) const {
    return VerifyTableStart(verifier) &&
           VerifyOffset(verifier, VT_DATA) &&
           verifier.VerifyVector(data()) &&
           VerifyField<u32>(verifier, VT_LEN) &&
           verifier.EndTable();
  }
};

struct PresenceOptionDataBuilder {
  flatbuffers::FlatBufferBuilder &fbb_;
  flatbuffers::uoffset_t start_;
  void add_data(flatbuffers::Offset<flatbuffers::Vector<u8>> data) {
    fbb_.AddOffset(PresenceOptionData::VT_DATA, data);
  }
  void add_len(u32 len) {
    fbb_.AddElement<u32>(PresenceOptionData::VT_LEN, len, 0);
  }
  explicit PresenceOptionDataBuilder(flatbuffers::FlatBufferBuilder &_fbb)
        : fbb_(_fbb) {
    start_ = fbb_.StartTable();
  }
  PresenceOptionDataBuilder &operator=(const PresenceOptionDataBuilder &);
  flatbuffers::Offset<PresenceOptionData> Finish() {
    const auto end = fbb_.EndTable(start_);
    auto o = flatbuffers::Offset<PresenceOptionData>(end);
    return o;
  }
};

inline flatbuffers::Offset<PresenceOptionData> CreatePresenceOptionData(
    flatbuffers::FlatBufferBuilder &_fbb,
    flatbuffers::Offset<flatbuffers::Vector<u8>> data = 0,
    u32 len = 0) {
  PresenceOptionDataBuilder builder_(_fbb);
  builder_.add_len(len);
  builder_.add_data(data);
  return builder_.Finish();
}

inline flatbuffers::Offset<PresenceOptionData> CreatePresenceOptionDataDirect(
    flatbuffers::FlatBufferBuilder &_fbb,
    const std::vector<u8> *data = nullptr,
    u32 len = 0) {
  auto data__ = data ? _fbb.CreateVector<u8>(*data) : 0;
  return CreatePresenceOptionData(
      _fbb,
      data__,
      len);
}

struct RoomGroupPasswordConfig FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
    VT_GROUPID = 4,
    VT_WITHPASSWORD = 6
  };
  const flatbuffers::Vector<u8> *groupId() const {
    return GetPointer<const flatbuffers::Vector<u8> *>(VT_GROUPID);
  }
  bool withPassword() const {
    return GetField<u8>(VT_WITHPASSWORD, 0) != 0;
  }
  bool Verify(flatbuffers::Verifier &verifier) const {
    return VerifyTableStart(verifier) &&
           VerifyOffset(verifier, VT_GROUPID) &&
           verifier.VerifyVector(groupId()) &&
           VerifyField<u8>(verifier, VT_WITHPASSWORD) &&
           verifier.EndTable();
  }
};

struct RoomGroupPasswordConfigBuilder {
  flatbuffers::FlatBufferBuilder &fbb_;
  flatbuffers::uoffset_t start_;
  void add_groupId(flatbuffers::Offset<flatbuffers::Vector<u8>> groupId) {
    fbb_.AddOffset(RoomGroupPasswordConfig::VT_GROUPID, groupId);
  }
  void add_withPassword(bool withPassword) {
    fbb_.AddElement<u8>(RoomGroupPasswordConfig::VT_WITHPASSWORD, static_cast<u8>(withPassword), 0);
  }
  explicit RoomGroupPasswordConfigBuilder(flatbuffers::FlatBufferBuilder &_fbb)
        : fbb_(_fbb) {
    start_ = fbb_.StartTable();
  }
  RoomGroupPasswordConfigBuilder &operator=(const RoomGroupPasswordConfigBuilder &);
  flatbuffers::Offset<RoomGroupPasswordConfig> Finish() {
    const auto end = fbb_.EndTable(start_);
    auto o = flatbuffers::Offset<RoomGroupPasswordConfig>(end);
    return o;
  }
};

inline flatbuffers::Offset<RoomGroupPasswordConfig> CreateRoomGroupPasswordConfig(
    flatbuffers::FlatBufferBuilder &_fbb,
    flatbuffers::Offset<flatbuffers::Vector<u8>> groupId = 0,
    bool withPassword = false) {
  RoomGroupPasswordConfigBuilder builder_(_fbb);
  builder_.add_groupId(groupId);
  builder_.add_withPassword(withPassword);
  return builder_.Finish();
}

inline flatbuffers::Offset<RoomGroupPasswordConfig> CreateRoomGroupPasswordConfigDirect(
    flatbuffers::FlatBufferBuilder &_fbb,
    const std::vector<u8> *groupId = nullptr,
    bool withPassword = false) {
  auto groupId__ = groupId ? _fbb.CreateVector<u8>(*groupId) : 0;
  return CreateRoomGroupPasswordConfig(
      _fbb,
      groupId__,
      withPassword);
}

struct SearchRoomRequest FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
    VT_OPTION = 4,
    VT_WORLDID = 6,
    VT_LOBBYID = 8,
    VT_RANGEFILTER_STARTINDEX = 10,
    VT_RANGEFILTER_MAX = 12,
    VT_FLAGFILTER = 14,
    VT_FLAGATTR = 16,
    VT_INTFILTER = 18,
    VT_BINFILTER = 20,
    VT_ATTRID = 22
  };
  s32 option() const {
    return GetField<s32>(VT_OPTION, 0);
  }
  u32 worldId() const {
    return GetField<u32>(VT_WORLDID, 0);
  }
  u64 lobbyId() const {
    return GetField<u64>(VT_LOBBYID, 0);
  }
  u32 rangeFilter_startIndex() const {
    return GetField<u32>(VT_RANGEFILTER_STARTINDEX, 0);
  }
  u32 rangeFilter_max() const {
    return GetField<u32>(VT_RANGEFILTER_MAX, 0);
  }
  u32 flagFilter() const {
    return GetField<u32>(VT_FLAGFILTER, 0);
  }
  u32 flagAttr() const {
    return GetField<u32>(VT_FLAGATTR, 0);
  }
  const flatbuffers::Vector<flatbuffers::Offset<IntSearchFilter>> *intFilter() const {
    return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<IntSearchFilter>> *>(VT_INTFILTER);
  }
  const flatbuffers::Vector<flatbuffers::Offset<BinSearchFilter>> *binFilter() const {
    return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<BinSearchFilter>> *>(VT_BINFILTER);
  }
  const flatbuffers::Vector<u16> *attrId() const {
    return GetPointer<const flatbuffers::Vector<u16> *>(VT_ATTRID);
  }
  bool Verify(flatbuffers::Verifier &verifier) const {
    return VerifyTableStart(verifier) &&
           VerifyField<s32>(verifier, VT_OPTION) &&
           VerifyField<u32>(verifier, VT_WORLDID) &&
           VerifyField<u64>(verifier, VT_LOBBYID) &&
           VerifyField<u32>(verifier, VT_RANGEFILTER_STARTINDEX) &&
           VerifyField<u32>(verifier, VT_RANGEFILTER_MAX) &&
           VerifyField<u32>(verifier, VT_FLAGFILTER) &&
           VerifyField<u32>(verifier, VT_FLAGATTR) &&
           VerifyOffset(verifier, VT_INTFILTER) &&
           verifier.VerifyVector(intFilter()) &&
           verifier.VerifyVectorOfTables(intFilter()) &&
           VerifyOffset(verifier, VT_BINFILTER) &&
           verifier.VerifyVector(binFilter()) &&
           verifier.VerifyVectorOfTables(binFilter()) &&
           VerifyOffset(verifier, VT_ATTRID) &&
           verifier.VerifyVector(attrId()) &&
           verifier.EndTable();
  }
};

struct SearchRoomRequestBuilder {
  flatbuffers::FlatBufferBuilder &fbb_;
  flatbuffers::uoffset_t start_;
  void add_option(s32 option) {
    fbb_.AddElement<s32>(SearchRoomRequest::VT_OPTION, option, 0);
  }
  void add_worldId(u32 worldId) {
    fbb_.AddElement<u32>(SearchRoomRequest::VT_WORLDID, worldId, 0);
  }
  void add_lobbyId(u64 lobbyId) {
    fbb_.AddElement<u64>(SearchRoomRequest::VT_LOBBYID, lobbyId, 0);
  }
  void add_rangeFilter_startIndex(u32 rangeFilter_startIndex) {
    fbb_.AddElement<u32>(SearchRoomRequest::VT_RANGEFILTER_STARTINDEX, rangeFilter_startIndex, 0);
  }
  void add_rangeFilter_max(u32 rangeFilter_max) {
    fbb_.AddElement<u32>(SearchRoomRequest::VT_RANGEFILTER_MAX, rangeFilter_max, 0);
  }
  void add_flagFilter(u32 flagFilter) {
    fbb_.AddElement<u32>(SearchRoomRequest::VT_FLAGFILTER, flagFilter, 0);
  }
  void add_flagAttr(u32 flagAttr) {
    fbb_.AddElement<u32>(SearchRoomRequest::VT_FLAGATTR, flagAttr, 0);
  }
  void add_intFilter(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<IntSearchFilter>>> intFilter) {
    fbb_.AddOffset(SearchRoomRequest::VT_INTFILTER, intFilter);
  }
  void add_binFilter(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<BinSearchFilter>>> binFilter) {
    fbb_.AddOffset(SearchRoomRequest::VT_BINFILTER, binFilter);
  }
  void add_attrId(flatbuffers::Offset<flatbuffers::Vector<u16>> attrId) {
    fbb_.AddOffset(SearchRoomRequest::VT_ATTRID, attrId);
  }
  explicit SearchRoomRequestBuilder(flatbuffers::FlatBufferBuilder &_fbb)
        : fbb_(_fbb) {
    start_ = fbb_.StartTable();
  }
  SearchRoomRequestBuilder &operator=(const SearchRoomRequestBuilder &);
  flatbuffers::Offset<SearchRoomRequest> Finish() {
    const auto end = fbb_.EndTable(start_);
    auto o = flatbuffers::Offset<SearchRoomRequest>(end);
    return o;
  }
};

inline flatbuffers::Offset<SearchRoomRequest> CreateSearchRoomRequest(
    flatbuffers::FlatBufferBuilder &_fbb,
    s32 option = 0,
    u32 worldId = 0,
    u64 lobbyId = 0,
    u32 rangeFilter_startIndex = 0,
    u32 rangeFilter_max = 0,
    u32 flagFilter = 0,
    u32 flagAttr = 0,
    flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<IntSearchFilter>>> intFilter = 0,
    flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<BinSearchFilter>>> binFilter = 0,
    flatbuffers::Offset<flatbuffers::Vector<u16>> attrId = 0) {
  SearchRoomRequestBuilder builder_(_fbb);
  builder_.add_lobbyId(lobbyId);
  builder_.add_attrId(attrId);
  builder_.add_binFilter(binFilter);
  builder_.add_intFilter(intFilter);
  builder_.add_flagAttr(flagAttr);
  builder_.add_flagFilter(flagFilter);
  builder_.add_rangeFilter_max(rangeFilter_max);
  builder_.add_rangeFilter_startIndex(rangeFilter_startIndex);
  builder_.add_worldId(worldId);
  builder_.add_option(option);
  return builder_.Finish();
}

inline flatbuffers::Offset<SearchRoomRequest> CreateSearchRoomRequestDirect(
    flatbuffers::FlatBufferBuilder &_fbb,
    s32 option = 0,
    u32 worldId = 0,
    u64 lobbyId = 0,
    u32 rangeFilter_startIndex = 0,
    u32 rangeFilter_max = 0,
    u32 flagFilter = 0,
    u32 flagAttr = 0,
    const std::vector<flatbuffers::Offset<IntSearchFilter>> *intFilter = nullptr,
    const std::vector<flatbuffers::Offset<BinSearchFilter>> *binFilter = nullptr,
    const std::vector<u16> *attrId = nullptr) {
  auto intFilter__ = intFilter ? _fbb.CreateVector<flatbuffers::Offset<IntSearchFilter>>(*intFilter) : 0;
  auto binFilter__ = binFilter ? _fbb.CreateVector<flatbuffers::Offset<BinSearchFilter>>(*binFilter) : 0;
  auto attrId__ = attrId ? _fbb.CreateVector<u16>(*attrId) : 0;
  return CreateSearchRoomRequest(
      _fbb,
      option,
      worldId,
      lobbyId,
      rangeFilter_startIndex,
      rangeFilter_max,
      flagFilter,
      flagAttr,
      intFilter__,
      binFilter__,
      attrId__);
}

struct SearchRoomResponse FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
    VT_STARTINDEX = 4,
    VT_TOTAL = 6,
    VT_SIZE = 8,
    VT_ROOMS = 10
  };
  u32 startIndex() const {
    return GetField<u32>(VT_STARTINDEX, 0);
  }
  u32 total() const {
    return GetField<u32>(VT_TOTAL, 0);
  }
  u32 size() const {
    return GetField<u32>(VT_SIZE, 0);
  }
  const flatbuffers::Vector<flatbuffers::Offset<RoomDataExternal>> *rooms() const {
    return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<RoomDataExternal>> *>(VT_ROOMS);
  }
  bool Verify(flatbuffers::Verifier &verifier) const {
    return VerifyTableStart(verifier) &&
           VerifyField<u32>(verifier, VT_STARTINDEX) &&
           VerifyField<u32>(verifier, VT_TOTAL) &&
           VerifyField<u32>(verifier, VT_SIZE) &&
           VerifyOffset(verifier, VT_ROOMS) &&
           verifier.VerifyVector(rooms()) &&
           verifier.VerifyVectorOfTables(rooms()) &&
           verifier.EndTable();
  }
};

struct SearchRoomResponseBuilder {
  flatbuffers::FlatBufferBuilder &fbb_;
  flatbuffers::uoffset_t start_;
  void add_startIndex(u32 startIndex) {
    fbb_.AddElement<u32>(SearchRoomResponse::VT_STARTINDEX, startIndex, 0);
  }
  void add_total(u32 total) {
    fbb_.AddElement<u32>(SearchRoomResponse::VT_TOTAL, total, 0);
  }
  void add_size(u32 size) {
    fbb_.AddElement<u32>(SearchRoomResponse::VT_SIZE, size, 0);
  }
  void add_rooms(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<RoomDataExternal>>> rooms) {
    fbb_.AddOffset(SearchRoomResponse::VT_ROOMS, rooms);
  }
  explicit SearchRoomResponseBuilder(flatbuffers::FlatBufferBuilder &_fbb)
        : fbb_(_fbb) {
    start_ = fbb_.StartTable();
  }
  SearchRoomResponseBuilder &operator=(const SearchRoomResponseBuilder &);
  flatbuffers::Offset<SearchRoomResponse> Finish() {
    const auto end = fbb_.EndTable(start_);
    auto o = flatbuffers::Offset<SearchRoomResponse>(end);
    return o;
  }
};

inline flatbuffers::Offset<SearchRoomResponse> CreateSearchRoomResponse(
    flatbuffers::FlatBufferBuilder &_fbb,
    u32 startIndex = 0,
    u32 total = 0,
    u32 size = 0,
    flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<RoomDataExternal>>> rooms = 0) {
  SearchRoomResponseBuilder builder_(_fbb);
  builder_.add_rooms(rooms);
  builder_.add_size(size);
  builder_.add_total(total);
  builder_.add_startIndex(startIndex);
  return builder_.Finish();
}

inline flatbuffers::Offset<SearchRoomResponse> CreateSearchRoomResponseDirect(
    flatbuffers::FlatBufferBuilder &_fbb,
    u32 startIndex = 0,
    u32 total = 0,
    u32 size = 0,
    const std::vector<flatbuffers::Offset<RoomDataExternal>> *rooms = nullptr) {
  auto rooms__ = rooms ? _fbb.CreateVector<flatbuffers::Offset<RoomDataExternal>>(*rooms) : 0;
  return CreateSearchRoomResponse(
      _fbb,
      startIndex,
      total,
      size,
      rooms__);
}

struct CreateJoinRoomRequest FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
    VT_WORLDID = 4,
    VT_LOBBYID = 6,
    VT_MAXSLOT = 8,
    VT_FLAGATTR = 10,
    VT_ROOMBINATTRINTERNAL = 12,
    VT_ROOMSEARCHABLEINTATTREXTERNAL = 14,
    VT_ROOMSEARCHABLEBINATTREXTERNAL = 16,
    VT_ROOMBINATTREXTERNAL = 18,
    VT_ROOMPASSWORD = 20,
    VT_GROUPCONFIG = 22,
    VT_PASSWORDSLOTMASK = 24,
    VT_ALLOWEDUSER = 26,
    VT_BLOCKEDUSER = 28,
    VT_JOINROOMGROUPLABEL = 30,
    VT_ROOMMEMBERBINATTRINTERNAL = 32,
    VT_TEAMID = 34,
    VT_SIGOPTPARAM = 36
  };
  u32 worldId() const {
    return GetField<u32>(VT_WORLDID, 0);
  }
  u64 lobbyId() const {
    return GetField<u64>(VT_LOBBYID, 0);
  }
  u32 maxSlot() const {
    return GetField<u32>(VT_MAXSLOT, 0);
  }
  u32 flagAttr() const {
    return GetField<u32>(VT_FLAGATTR, 0);
  }
  const flatbuffers::Vector<flatbuffers::Offset<BinAttr>> *roomBinAttrInternal() const {
    return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<BinAttr>> *>(VT_ROOMBINATTRINTERNAL);
  }
  const flatbuffers::Vector<flatbuffers::Offset<IntAttr>> *roomSearchableIntAttrExternal() const {
    return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<IntAttr>> *>(VT_ROOMSEARCHABLEINTATTREXTERNAL);
  }
  const flatbuffers::Vector<flatbuffers::Offset<BinAttr>> *roomSearchableBinAttrExternal() const {
    return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<BinAttr>> *>(VT_ROOMSEARCHABLEBINATTREXTERNAL);
  }
  const flatbuffers::Vector<flatbuffers::Offset<BinAttr>> *roomBinAttrExternal() const {
    return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<BinAttr>> *>(VT_ROOMBINATTREXTERNAL);
  }
  const flatbuffers::Vector<u8> *roomPassword() const {
    return GetPointer<const flatbuffers::Vector<u8> *>(VT_ROOMPASSWORD);
  }
  const flatbuffers::Vector<flatbuffers::Offset<GroupConfig>> *groupConfig() const {
    return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<GroupConfig>> *>(VT_GROUPCONFIG);
  }
  u64 passwordSlotMask() const {
    return GetField<u64>(VT_PASSWORDSLOTMASK, 0);
  }
  const flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>> *allowedUser() const {
    return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>> *>(VT_ALLOWEDUSER);
  }
  const flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>> *blockedUser() const {
    return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>> *>(VT_BLOCKEDUSER);
  }
  const flatbuffers::Vector<u8> *joinRoomGroupLabel() const {
    return GetPointer<const flatbuffers::Vector<u8> *>(VT_JOINROOMGROUPLABEL);
  }
  const flatbuffers::Vector<flatbuffers::Offset<BinAttr>> *roomMemberBinAttrInternal() const {
    return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<BinAttr>> *>(VT_ROOMMEMBERBINATTRINTERNAL);
  }
  u8 teamId() const {
    return GetField<u8>(VT_TEAMID, 0);
  }
  const OptParam *sigOptParam() const {
    return GetPointer<const OptParam *>(VT_SIGOPTPARAM);
  }
  bool Verify(flatbuffers::Verifier &verifier) const {
    return VerifyTableStart(verifier) &&
           VerifyField<u32>(verifier, VT_WORLDID) &&
           VerifyField<u64>(verifier, VT_LOBBYID) &&
           VerifyField<u32>(verifier, VT_MAXSLOT) &&
           VerifyField<u32>(verifier, VT_FLAGATTR) &&
           VerifyOffset(verifier, VT_ROOMBINATTRINTERNAL) &&
           verifier.VerifyVector(roomBinAttrInternal()) &&
           verifier.VerifyVectorOfTables(roomBinAttrInternal()) &&
           VerifyOffset(verifier, VT_ROOMSEARCHABLEINTATTREXTERNAL) &&
           verifier.VerifyVector(roomSearchableIntAttrExternal()) &&
           verifier.VerifyVectorOfTables(roomSearchableIntAttrExternal()) &&
           VerifyOffset(verifier, VT_ROOMSEARCHABLEBINATTREXTERNAL) &&
           verifier.VerifyVector(roomSearchableBinAttrExternal()) &&
           verifier.VerifyVectorOfTables(roomSearchableBinAttrExternal()) &&
           VerifyOffset(verifier, VT_ROOMBINATTREXTERNAL) &&
           verifier.VerifyVector(roomBinAttrExternal()) &&
           verifier.VerifyVectorOfTables(roomBinAttrExternal()) &&
           VerifyOffset(verifier, VT_ROOMPASSWORD) &&
           verifier.VerifyVector(roomPassword()) &&
           VerifyOffset(verifier, VT_GROUPCONFIG) &&
           verifier.VerifyVector(groupConfig()) &&
           verifier.VerifyVectorOfTables(groupConfig()) &&
           VerifyField<u64>(verifier, VT_PASSWORDSLOTMASK) &&
           VerifyOffset(verifier, VT_ALLOWEDUSER) &&
           verifier.VerifyVector(allowedUser()) &&
           verifier.VerifyVectorOfStrings(allowedUser()) &&
           VerifyOffset(verifier, VT_BLOCKEDUSER) &&
           verifier.VerifyVector(blockedUser()) &&
           verifier.VerifyVectorOfStrings(blockedUser()) &&
           VerifyOffset(verifier, VT_JOINROOMGROUPLABEL) &&
           verifier.VerifyVector(joinRoomGroupLabel()) &&
           VerifyOffset(verifier, VT_ROOMMEMBERBINATTRINTERNAL) &&
           verifier.VerifyVector(roomMemberBinAttrInternal()) &&
           verifier.VerifyVectorOfTables(roomMemberBinAttrInternal()) &&
           VerifyField<u8>(verifier, VT_TEAMID) &&
           VerifyOffset(verifier, VT_SIGOPTPARAM) &&
           verifier.VerifyTable(sigOptParam()) &&
           verifier.EndTable();
  }
};

struct CreateJoinRoomRequestBuilder {
  flatbuffers::FlatBufferBuilder &fbb_;
  flatbuffers::uoffset_t start_;
  void add_worldId(u32 worldId) {
    fbb_.AddElement<u32>(CreateJoinRoomRequest::VT_WORLDID, worldId, 0);
  }
  void add_lobbyId(u64 lobbyId) {
    fbb_.AddElement<u64>(CreateJoinRoomRequest::VT_LOBBYID, lobbyId, 0);
  }
  void add_maxSlot(u32 maxSlot) {
    fbb_.AddElement<u32>(CreateJoinRoomRequest::VT_MAXSLOT, maxSlot, 0);
  }
  void add_flagAttr(u32 flagAttr) {
    fbb_.AddElement<u32>(CreateJoinRoomRequest::VT_FLAGATTR, flagAttr, 0);
  }
  void add_roomBinAttrInternal(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<BinAttr>>> roomBinAttrInternal) {
    fbb_.AddOffset(CreateJoinRoomRequest::VT_ROOMBINATTRINTERNAL, roomBinAttrInternal);
  }
  void add_roomSearchableIntAttrExternal(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<IntAttr>>> roomSearchableIntAttrExternal) {
    fbb_.AddOffset(CreateJoinRoomRequest::VT_ROOMSEARCHABLEINTATTREXTERNAL, roomSearchableIntAttrExternal);
  }
  void add_roomSearchableBinAttrExternal(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<BinAttr>>> roomSearchableBinAttrExternal) {
    fbb_.AddOffset(CreateJoinRoomRequest::VT_ROOMSEARCHABLEBINATTREXTERNAL, roomSearchableBinAttrExternal);
  }
  void add_roomBinAttrExternal(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<BinAttr>>> roomBinAttrExternal) {
    fbb_.AddOffset(CreateJoinRoomRequest::VT_ROOMBINATTREXTERNAL, roomBinAttrExternal);
  }
  void add_roomPassword(flatbuffers::Offset<flatbuffers::Vector<u8>> roomPassword) {
    fbb_.AddOffset(CreateJoinRoomRequest::VT_ROOMPASSWORD, roomPassword);
  }
  void add_groupConfig(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<GroupConfig>>> groupConfig) {
    fbb_.AddOffset(CreateJoinRoomRequest::VT_GROUPCONFIG, groupConfig);
  }
  void add_passwordSlotMask(u64 passwordSlotMask) {
    fbb_.AddElement<u64>(CreateJoinRoomRequest::VT_PASSWORDSLOTMASK, passwordSlotMask, 0);
  }
  void add_allowedUser(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>>> allowedUser) {
    fbb_.AddOffset(CreateJoinRoomRequest::VT_ALLOWEDUSER, allowedUser);
  }
  void add_blockedUser(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>>> blockedUser) {
    fbb_.AddOffset(CreateJoinRoomRequest::VT_BLOCKEDUSER, blockedUser);
  }
  void add_joinRoomGroupLabel(flatbuffers::Offset<flatbuffers::Vector<u8>> joinRoomGroupLabel) {
    fbb_.AddOffset(CreateJoinRoomRequest::VT_JOINROOMGROUPLABEL, joinRoomGroupLabel);
  }
  void add_roomMemberBinAttrInternal(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<BinAttr>>> roomMemberBinAttrInternal) {
    fbb_.AddOffset(CreateJoinRoomRequest::VT_ROOMMEMBERBINATTRINTERNAL, roomMemberBinAttrInternal);
  }
  void add_teamId(u8 teamId) {
    fbb_.AddElement<u8>(CreateJoinRoomRequest::VT_TEAMID, teamId, 0);
  }
  void add_sigOptParam(flatbuffers::Offset<OptParam> sigOptParam) {
    fbb_.AddOffset(CreateJoinRoomRequest::VT_SIGOPTPARAM, sigOptParam);
  }
  explicit CreateJoinRoomRequestBuilder(flatbuffers::FlatBufferBuilder &_fbb)
        : fbb_(_fbb) {
    start_ = fbb_.StartTable();
  }
  CreateJoinRoomRequestBuilder &operator=(const CreateJoinRoomRequestBuilder &);
  flatbuffers::Offset<CreateJoinRoomRequest> Finish() {
    const auto end = fbb_.EndTable(start_);
    auto o = flatbuffers::Offset<CreateJoinRoomRequest>(end);
    return o;
  }
};

inline flatbuffers::Offset<CreateJoinRoomRequest> CreateCreateJoinRoomRequest(
    flatbuffers::FlatBufferBuilder &_fbb,
    u32 worldId = 0,
    u64 lobbyId = 0,
    u32 maxSlot = 0,
    u32 flagAttr = 0,
    flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<BinAttr>>> roomBinAttrInternal = 0,
    flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<IntAttr>>> roomSearchableIntAttrExternal = 0,
    flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<BinAttr>>> roomSearchableBinAttrExternal = 0,
    flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<BinAttr>>> roomBinAttrExternal = 0,
    flatbuffers::Offset<flatbuffers::Vector<u8>> roomPassword = 0,
    flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<GroupConfig>>> groupConfig = 0,
    u64 passwordSlotMask = 0,
    flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>>> allowedUser = 0,
    flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>>> blockedUser = 0,
    flatbuffers::Offset<flatbuffers::Vector<u8>> joinRoomGroupLabel = 0,
    flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<BinAttr>>> roomMemberBinAttrInternal = 0,
    u8 teamId = 0,
    flatbuffers::Offset<OptParam> sigOptParam = 0) {
  CreateJoinRoomRequestBuilder builder_(_fbb);
  builder_.add_passwordSlotMask(passwordSlotMask);
  builder_.add_lobbyId(lobbyId);
  builder_.add_sigOptParam(sigOptParam);
  builder_.add_roomMemberBinAttrInternal(roomMemberBinAttrInternal);
  builder_.add_joinRoomGroupLabel(joinRoomGroupLabel);
  builder_.add_blockedUser(blockedUser);
  builder_.add_allowedUser(allowedUser);
  builder_.add_groupConfig(groupConfig);
  builder_.add_roomPassword(roomPassword);
  builder_.add_roomBinAttrExternal(roomBinAttrExternal);
  builder_.add_roomSearchableBinAttrExternal(roomSearchableBinAttrExternal);
  builder_.add_roomSearchableIntAttrExternal(roomSearchableIntAttrExternal);
  builder_.add_roomBinAttrInternal(roomBinAttrInternal);
  builder_.add_flagAttr(flagAttr);
  builder_.add_maxSlot(maxSlot);
  builder_.add_worldId(worldId);
  builder_.add_teamId(teamId);
  return builder_.Finish();
}

inline flatbuffers::Offset<CreateJoinRoomRequest> CreateCreateJoinRoomRequestDirect(
    flatbuffers::FlatBufferBuilder &_fbb,
    u32 worldId = 0,
    u64 lobbyId = 0,
    u32 maxSlot = 0,
    u32 flagAttr = 0,
    const std::vector<flatbuffers::Offset<BinAttr>> *roomBinAttrInternal = nullptr,
    const std::vector<flatbuffers::Offset<IntAttr>> *roomSearchableIntAttrExternal = nullptr,
    const std::vector<flatbuffers::Offset<BinAttr>> *roomSearchableBinAttrExternal = nullptr,
    const std::vector<flatbuffers::Offset<BinAttr>> *roomBinAttrExternal = nullptr,
    const std::vector<u8> *roomPassword = nullptr,
    const std::vector<flatbuffers::Offset<GroupConfig>> *groupConfig = nullptr,
    u64 passwordSlotMask = 0,
    const std::vector<flatbuffers::Offset<flatbuffers::String>> *allowedUser = nullptr,
    const std::vector<flatbuffers::Offset<flatbuffers::String>> *blockedUser = nullptr,
    const std::vector<u8> *joinRoomGroupLabel = nullptr,
    const std::vector<flatbuffers::Offset<BinAttr>> *roomMemberBinAttrInternal = nullptr,
    u8 teamId = 0,
    flatbuffers::Offset<OptParam> sigOptParam = 0) {
  auto roomBinAttrInternal__ = roomBinAttrInternal ? _fbb.CreateVector<flatbuffers::Offset<BinAttr>>(*roomBinAttrInternal) : 0;
  auto roomSearchableIntAttrExternal__ = roomSearchableIntAttrExternal ? _fbb.CreateVector<flatbuffers::Offset<IntAttr>>(*roomSearchableIntAttrExternal) : 0;
  auto roomSearchableBinAttrExternal__ = roomSearchableBinAttrExternal ? _fbb.CreateVector<flatbuffers::Offset<BinAttr>>(*roomSearchableBinAttrExternal) : 0;
  auto roomBinAttrExternal__ = roomBinAttrExternal ? _fbb.CreateVector<flatbuffers::Offset<BinAttr>>(*roomBinAttrExternal) : 0;
  auto roomPassword__ = roomPassword ? _fbb.CreateVector<u8>(*roomPassword) : 0;
  auto groupConfig__ = groupConfig ? _fbb.CreateVector<flatbuffers::Offset<GroupConfig>>(*groupConfig) : 0;
  auto allowedUser__ = allowedUser ? _fbb.CreateVector<flatbuffers::Offset<flatbuffers::String>>(*allowedUser) : 0;
  auto blockedUser__ = blockedUser ? _fbb.CreateVector<flatbuffers::Offset<flatbuffers::String>>(*blockedUser) : 0;
  auto joinRoomGroupLabel__ = joinRoomGroupLabel ? _fbb.CreateVector<u8>(*joinRoomGroupLabel) : 0;
  auto roomMemberBinAttrInternal__ = roomMemberBinAttrInternal ? _fbb.CreateVector<flatbuffers::Offset<BinAttr>>(*roomMemberBinAttrInternal) : 0;
  return CreateCreateJoinRoomRequest(
      _fbb,
      worldId,
      lobbyId,
      maxSlot,
      flagAttr,
      roomBinAttrInternal__,
      roomSearchableIntAttrExternal__,
      roomSearchableBinAttrExternal__,
      roomBinAttrExternal__,
      roomPassword__,
      groupConfig__,
      passwordSlotMask,
      allowedUser__,
      blockedUser__,
      joinRoomGroupLabel__,
      roomMemberBinAttrInternal__,
      teamId,
      sigOptParam);
}

struct JoinRoomRequest FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
    VT_ROOMID = 4,
    VT_ROOMPASSWORD = 6,
    VT_JOINROOMGROUPLABEL = 8,
    VT_ROOMMEMBERBINATTRINTERNAL = 10,
    VT_OPTDATA = 12,
    VT_TEAMID = 14
  };
  u64 roomId() const {
    return GetField<u64>(VT_ROOMID, 0);
  }
  const flatbuffers::Vector<u8> *roomPassword() const {
    return GetPointer<const flatbuffers::Vector<u8> *>(VT_ROOMPASSWORD);
  }
  const flatbuffers::Vector<u8> *joinRoomGroupLabel() const {
    return GetPointer<const flatbuffers::Vector<u8> *>(VT_JOINROOMGROUPLABEL);
  }
  const flatbuffers::Vector<flatbuffers::Offset<BinAttr>> *roomMemberBinAttrInternal() const {
    return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<BinAttr>> *>(VT_ROOMMEMBERBINATTRINTERNAL);
  }
  const PresenceOptionData *optData() const {
    return GetPointer<const PresenceOptionData *>(VT_OPTDATA);
  }
  u8 teamId() const {
    return GetField<u8>(VT_TEAMID, 0);
  }
  bool Verify(flatbuffers::Verifier &verifier) const {
    return VerifyTableStart(verifier) &&
           VerifyField<u64>(verifier, VT_ROOMID) &&
           VerifyOffset(verifier, VT_ROOMPASSWORD) &&
           verifier.VerifyVector(roomPassword()) &&
           VerifyOffset(verifier, VT_JOINROOMGROUPLABEL) &&
           verifier.VerifyVector(joinRoomGroupLabel()) &&
           VerifyOffset(verifier, VT_ROOMMEMBERBINATTRINTERNAL) &&
           verifier.VerifyVector(roomMemberBinAttrInternal()) &&
           verifier.VerifyVectorOfTables(roomMemberBinAttrInternal()) &&
           VerifyOffset(verifier, VT_OPTDATA) &&
           verifier.VerifyTable(optData()) &&
           VerifyField<u8>(verifier, VT_TEAMID) &&
           verifier.EndTable();
  }
};

struct JoinRoomRequestBuilder {
  flatbuffers::FlatBufferBuilder &fbb_;
  flatbuffers::uoffset_t start_;
  void add_roomId(u64 roomId) {
    fbb_.AddElement<u64>(JoinRoomRequest::VT_ROOMID, roomId, 0);
  }
  void add_roomPassword(flatbuffers::Offset<flatbuffers::Vector<u8>> roomPassword) {
    fbb_.AddOffset(JoinRoomRequest::VT_ROOMPASSWORD, roomPassword);
  }
  void add_joinRoomGroupLabel(flatbuffers::Offset<flatbuffers::Vector<u8>> joinRoomGroupLabel) {
    fbb_.AddOffset(JoinRoomRequest::VT_JOINROOMGROUPLABEL, joinRoomGroupLabel);
  }
  void add_roomMemberBinAttrInternal(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<BinAttr>>> roomMemberBinAttrInternal) {
    fbb_.AddOffset(JoinRoomRequest::VT_ROOMMEMBERBINATTRINTERNAL, roomMemberBinAttrInternal);
  }
  void add_optData(flatbuffers::Offset<PresenceOptionData> optData) {
    fbb_.AddOffset(JoinRoomRequest::VT_OPTDATA, optData);
  }
  void add_teamId(u8 teamId) {
    fbb_.AddElement<u8>(JoinRoomRequest::VT_TEAMID, teamId, 0);
  }
  explicit JoinRoomRequestBuilder(flatbuffers::FlatBufferBuilder &_fbb)
        : fbb_(_fbb) {
    start_ = fbb_.StartTable();
  }
  JoinRoomRequestBuilder &operator=(const JoinRoomRequestBuilder &);
  flatbuffers::Offset<JoinRoomRequest> Finish() {
    const auto end = fbb_.EndTable(start_);
    auto o = flatbuffers::Offset<JoinRoomRequest>(end);
    return o;
  }
};

inline flatbuffers::Offset<JoinRoomRequest> CreateJoinRoomRequest(
    flatbuffers::FlatBufferBuilder &_fbb,
    u64 roomId = 0,
    flatbuffers::Offset<flatbuffers::Vector<u8>> roomPassword = 0,
    flatbuffers::Offset<flatbuffers::Vector<u8>> joinRoomGroupLabel = 0,
    flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<BinAttr>>> roomMemberBinAttrInternal = 0,
    flatbuffers::Offset<PresenceOptionData> optData = 0,
    u8 teamId = 0) {
  JoinRoomRequestBuilder builder_(_fbb);
  builder_.add_roomId(roomId);
  builder_.add_optData(optData);
  builder_.add_roomMemberBinAttrInternal(roomMemberBinAttrInternal);
  builder_.add_joinRoomGroupLabel(joinRoomGroupLabel);
  builder_.add_roomPassword(roomPassword);
  builder_.add_teamId(teamId);
  return builder_.Finish();
}

inline flatbuffers::Offset<JoinRoomRequest> CreateJoinRoomRequestDirect(
    flatbuffers::FlatBufferBuilder &_fbb,
    u64 roomId = 0,
    const std::vector<u8> *roomPassword = nullptr,
    const std::vector<u8> *joinRoomGroupLabel = nullptr,
    const std::vector<flatbuffers::Offset<BinAttr>> *roomMemberBinAttrInternal = nullptr,
    flatbuffers::Offset<PresenceOptionData> optData = 0,
    u8 teamId = 0) {
  auto roomPassword__ = roomPassword ? _fbb.CreateVector<u8>(*roomPassword) : 0;
  auto joinRoomGroupLabel__ = joinRoomGroupLabel ? _fbb.CreateVector<u8>(*joinRoomGroupLabel) : 0;
  auto roomMemberBinAttrInternal__ = roomMemberBinAttrInternal ? _fbb.CreateVector<flatbuffers::Offset<BinAttr>>(*roomMemberBinAttrInternal) : 0;
  return CreateJoinRoomRequest(
      _fbb,
      roomId,
      roomPassword__,
      joinRoomGroupLabel__,
      roomMemberBinAttrInternal__,
      optData,
      teamId);
}

struct LeaveRoomRequest FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
    VT_ROOMID = 4,
    VT_OPTDATA = 6
  };
  u64 roomId() const {
    return GetField<u64>(VT_ROOMID, 0);
  }
  const PresenceOptionData *optData() const {
    return GetPointer<const PresenceOptionData *>(VT_OPTDATA);
  }
  bool Verify(flatbuffers::Verifier &verifier) const {
    return VerifyTableStart(verifier) &&
           VerifyField<u64>(verifier, VT_ROOMID) &&
           VerifyOffset(verifier, VT_OPTDATA) &&
           verifier.VerifyTable(optData()) &&
           verifier.EndTable();
  }
};

struct LeaveRoomRequestBuilder {
  flatbuffers::FlatBufferBuilder &fbb_;
  flatbuffers::uoffset_t start_;
  void add_roomId(u64 roomId) {
    fbb_.AddElement<u64>(LeaveRoomRequest::VT_ROOMID, roomId, 0);
  }
  void add_optData(flatbuffers::Offset<PresenceOptionData> optData) {
    fbb_.AddOffset(LeaveRoomRequest::VT_OPTDATA, optData);
  }
  explicit LeaveRoomRequestBuilder(flatbuffers::FlatBufferBuilder &_fbb)
        : fbb_(_fbb) {
    start_ = fbb_.StartTable();
  }
  LeaveRoomRequestBuilder &operator=(const LeaveRoomRequestBuilder &);
  flatbuffers::Offset<LeaveRoomRequest> Finish() {
    const auto end = fbb_.EndTable(start_);
    auto o = flatbuffers::Offset<LeaveRoomRequest>(end);
    return o;
  }
};

inline flatbuffers::Offset<LeaveRoomRequest> CreateLeaveRoomRequest(
    flatbuffers::FlatBufferBuilder &_fbb,
    u64 roomId = 0,
    flatbuffers::Offset<PresenceOptionData> optData = 0) {
  LeaveRoomRequestBuilder builder_(_fbb);
  builder_.add_roomId(roomId);
  builder_.add_optData(optData);
  return builder_.Finish();
}

struct SetRoomDataExternalRequest FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
    VT_ROOMID = 4,
    VT_ROOMSEARCHABLEINTATTREXTERNAL = 6,
    VT_ROOMSEARCHABLEBINATTREXTERNAL = 8,
    VT_ROOMBINATTREXTERNAL = 10
  };
  u64 roomId() const {
    return GetField<u64>(VT_ROOMID, 0);
  }
  const flatbuffers::Vector<flatbuffers::Offset<IntAttr>> *roomSearchableIntAttrExternal() const {
    return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<IntAttr>> *>(VT_ROOMSEARCHABLEINTATTREXTERNAL);
  }
  const flatbuffers::Vector<flatbuffers::Offset<BinAttr>> *roomSearchableBinAttrExternal() const {
    return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<BinAttr>> *>(VT_ROOMSEARCHABLEBINATTREXTERNAL);
  }
  const flatbuffers::Vector<flatbuffers::Offset<BinAttr>> *roomBinAttrExternal() const {
    return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<BinAttr>> *>(VT_ROOMBINATTREXTERNAL);
  }
  bool Verify(flatbuffers::Verifier &verifier) const {
    return VerifyTableStart(verifier) &&
           VerifyField<u64>(verifier, VT_ROOMID) &&
           VerifyOffset(verifier, VT_ROOMSEARCHABLEINTATTREXTERNAL) &&
           verifier.VerifyVector(roomSearchableIntAttrExternal()) &&
           verifier.VerifyVectorOfTables(roomSearchableIntAttrExternal()) &&
           VerifyOffset(verifier, VT_ROOMSEARCHABLEBINATTREXTERNAL) &&
           verifier.VerifyVector(roomSearchableBinAttrExternal()) &&
           verifier.VerifyVectorOfTables(roomSearchableBinAttrExternal()) &&
           VerifyOffset(verifier, VT_ROOMBINATTREXTERNAL) &&
           verifier.VerifyVector(roomBinAttrExternal()) &&
           verifier.VerifyVectorOfTables(roomBinAttrExternal()) &&
           verifier.EndTable();
  }
};

struct SetRoomDataExternalRequestBuilder {
  flatbuffers::FlatBufferBuilder &fbb_;
  flatbuffers::uoffset_t start_;
  void add_roomId(u64 roomId) {
    fbb_.AddElement<u64>(SetRoomDataExternalRequest::VT_ROOMID, roomId, 0);
  }
  void add_roomSearchableIntAttrExternal(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<IntAttr>>> roomSearchableIntAttrExternal) {
    fbb_.AddOffset(SetRoomDataExternalRequest::VT_ROOMSEARCHABLEINTATTREXTERNAL, roomSearchableIntAttrExternal);
  }
  void add_roomSearchableBinAttrExternal(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<BinAttr>>> roomSearchableBinAttrExternal) {
    fbb_.AddOffset(SetRoomDataExternalRequest::VT_ROOMSEARCHABLEBINATTREXTERNAL, roomSearchableBinAttrExternal);
  }
  void add_roomBinAttrExternal(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<BinAttr>>> roomBinAttrExternal) {
    fbb_.AddOffset(SetRoomDataExternalRequest::VT_ROOMBINATTREXTERNAL, roomBinAttrExternal);
  }
  explicit SetRoomDataExternalRequestBuilder(flatbuffers::FlatBufferBuilder &_fbb)
        : fbb_(_fbb) {
    start_ = fbb_.StartTable();
  }
  SetRoomDataExternalRequestBuilder &operator=(const SetRoomDataExternalRequestBuilder &);
  flatbuffers::Offset<SetRoomDataExternalRequest> Finish() {
    const auto end = fbb_.EndTable(start_);
    auto o = flatbuffers::Offset<SetRoomDataExternalRequest>(end);
    return o;
  }
};

inline flatbuffers::Offset<SetRoomDataExternalRequest> CreateSetRoomDataExternalRequest(
    flatbuffers::FlatBufferBuilder &_fbb,
    u64 roomId = 0,
    flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<IntAttr>>> roomSearchableIntAttrExternal = 0,
    flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<BinAttr>>> roomSearchableBinAttrExternal = 0,
    flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<BinAttr>>> roomBinAttrExternal = 0) {
  SetRoomDataExternalRequestBuilder builder_(_fbb);
  builder_.add_roomId(roomId);
  builder_.add_roomBinAttrExternal(roomBinAttrExternal);
  builder_.add_roomSearchableBinAttrExternal(roomSearchableBinAttrExternal);
  builder_.add_roomSearchableIntAttrExternal(roomSearchableIntAttrExternal);
  return builder_.Finish();
}

inline flatbuffers::Offset<SetRoomDataExternalRequest> CreateSetRoomDataExternalRequestDirect(
    flatbuffers::FlatBufferBuilder &_fbb,
    u64 roomId = 0,
    const std::vector<flatbuffers::Offset<IntAttr>> *roomSearchableIntAttrExternal = nullptr,
    const std::vector<flatbuffers::Offset<BinAttr>> *roomSearchableBinAttrExternal = nullptr,
    const std::vector<flatbuffers::Offset<BinAttr>> *roomBinAttrExternal = nullptr) {
  auto roomSearchableIntAttrExternal__ = roomSearchableIntAttrExternal ? _fbb.CreateVector<flatbuffers::Offset<IntAttr>>(*roomSearchableIntAttrExternal) : 0;
  auto roomSearchableBinAttrExternal__ = roomSearchableBinAttrExternal ? _fbb.CreateVector<flatbuffers::Offset<BinAttr>>(*roomSearchableBinAttrExternal) : 0;
  auto roomBinAttrExternal__ = roomBinAttrExternal ? _fbb.CreateVector<flatbuffers::Offset<BinAttr>>(*roomBinAttrExternal) : 0;
  return CreateSetRoomDataExternalRequest(
      _fbb,
      roomId,
      roomSearchableIntAttrExternal__,
      roomSearchableBinAttrExternal__,
      roomBinAttrExternal__);
}

struct SetRoomDataInternalRequest FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
    VT_ROOMID = 4,
    VT_FLAGFILTER = 6,
    VT_FLAGATTR = 8,
    VT_ROOMBINATTRINTERNAL = 10,
    VT_PASSWORDCONFIG = 12,
    VT_PASSWORDSLOTMASK = 14,
    VT_OWNERPRIVILEGERANK = 16
  };
  u64 roomId() const {
    return GetField<u64>(VT_ROOMID, 0);
  }
  u32 flagFilter() const {
    return GetField<u32>(VT_FLAGFILTER, 0);
  }
  u32 flagAttr() const {
    return GetField<u32>(VT_FLAGATTR, 0);
  }
  const flatbuffers::Vector<flatbuffers::Offset<BinAttr>> *roomBinAttrInternal() const {
    return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<BinAttr>> *>(VT_ROOMBINATTRINTERNAL);
  }
  const flatbuffers::Vector<flatbuffers::Offset<RoomGroupPasswordConfig>> *passwordConfig() const {
    return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<RoomGroupPasswordConfig>> *>(VT_PASSWORDCONFIG);
  }
  u64 passwordSlotMask() const {
    return GetField<u64>(VT_PASSWORDSLOTMASK, 0);
  }
  const flatbuffers::Vector<u16> *ownerPrivilegeRank() const {
    return GetPointer<const flatbuffers::Vector<u16> *>(VT_OWNERPRIVILEGERANK);
  }
  bool Verify(flatbuffers::Verifier &verifier) const {
    return VerifyTableStart(verifier) &&
           VerifyField<u64>(verifier, VT_ROOMID) &&
           VerifyField<u32>(verifier, VT_FLAGFILTER) &&
           VerifyField<u32>(verifier, VT_FLAGATTR) &&
           VerifyOffset(verifier, VT_ROOMBINATTRINTERNAL) &&
           verifier.VerifyVector(roomBinAttrInternal()) &&
           verifier.VerifyVectorOfTables(roomBinAttrInternal()) &&
           VerifyOffset(verifier, VT_PASSWORDCONFIG) &&
           verifier.VerifyVector(passwordConfig()) &&
           verifier.VerifyVectorOfTables(passwordConfig()) &&
           VerifyField<u64>(verifier, VT_PASSWORDSLOTMASK) &&
           VerifyOffset(verifier, VT_OWNERPRIVILEGERANK) &&
           verifier.VerifyVector(ownerPrivilegeRank()) &&
           verifier.EndTable();
  }
};

struct SetRoomDataInternalRequestBuilder {
  flatbuffers::FlatBufferBuilder &fbb_;
  flatbuffers::uoffset_t start_;
  void add_roomId(u64 roomId) {
    fbb_.AddElement<u64>(SetRoomDataInternalRequest::VT_ROOMID, roomId, 0);
  }
  void add_flagFilter(u32 flagFilter) {
    fbb_.AddElement<u32>(SetRoomDataInternalRequest::VT_FLAGFILTER, flagFilter, 0);
  }
  void add_flagAttr(u32 flagAttr) {
    fbb_.AddElement<u32>(SetRoomDataInternalRequest::VT_FLAGATTR, flagAttr, 0);
  }
  void add_roomBinAttrInternal(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<BinAttr>>> roomBinAttrInternal) {
    fbb_.AddOffset(SetRoomDataInternalRequest::VT_ROOMBINATTRINTERNAL, roomBinAttrInternal);
  }
  void add_passwordConfig(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<RoomGroupPasswordConfig>>> passwordConfig) {
    fbb_.AddOffset(SetRoomDataInternalRequest::VT_PASSWORDCONFIG, passwordConfig);
  }
  void add_passwordSlotMask(u64 passwordSlotMask) {
    fbb_.AddElement<u64>(SetRoomDataInternalRequest::VT_PASSWORDSLOTMASK, passwordSlotMask, 0);
  }
  void add_ownerPrivilegeRank(flatbuffers::Offset<flatbuffers::Vector<u16>> ownerPrivilegeRank) {
    fbb_.AddOffset(SetRoomDataInternalRequest::VT_OWNERPRIVILEGERANK, ownerPrivilegeRank);
  }
  explicit SetRoomDataInternalRequestBuilder(flatbuffers::FlatBufferBuilder &_fbb)
        : fbb_(_fbb) {
    start_ = fbb_.StartTable();
  }
  SetRoomDataInternalRequestBuilder &operator=(const SetRoomDataInternalRequestBuilder &);
  flatbuffers::Offset<SetRoomDataInternalRequest> Finish() {
    const auto end = fbb_.EndTable(start_);
    auto o = flatbuffers::Offset<SetRoomDataInternalRequest>(end);
    return o;
  }
};

inline flatbuffers::Offset<SetRoomDataInternalRequest> CreateSetRoomDataInternalRequest(
    flatbuffers::FlatBufferBuilder &_fbb,
    u64 roomId = 0,
    u32 flagFilter = 0,
    u32 flagAttr = 0,
    flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<BinAttr>>> roomBinAttrInternal = 0,
    flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<RoomGroupPasswordConfig>>> passwordConfig = 0,
    u64 passwordSlotMask = 0,
    flatbuffers::Offset<flatbuffers::Vector<u16>> ownerPrivilegeRank = 0) {
  SetRoomDataInternalRequestBuilder builder_(_fbb);
  builder_.add_passwordSlotMask(passwordSlotMask);
  builder_.add_roomId(roomId);
  builder_.add_ownerPrivilegeRank(ownerPrivilegeRank);
  builder_.add_passwordConfig(passwordConfig);
  builder_.add_roomBinAttrInternal(roomBinAttrInternal);
  builder_.add_flagAttr(flagAttr);
  builder_.add_flagFilter(flagFilter);
  return builder_.Finish();
}

inline flatbuffers::Offset<SetRoomDataInternalRequest> CreateSetRoomDataInternalRequestDirect(
    flatbuffers::FlatBufferBuilder &_fbb,
    u64 roomId = 0,
    u32 flagFilter = 0,
    u32 flagAttr = 0,
    const std::vector<flatbuffers::Offset<BinAttr>> *roomBinAttrInternal = nullptr,
    const std::vector<flatbuffers::Offset<RoomGroupPasswordConfig>> *passwordConfig = nullptr,
    u64 passwordSlotMask = 0,
    const std::vector<u16> *ownerPrivilegeRank = nullptr) {
  auto roomBinAttrInternal__ = roomBinAttrInternal ? _fbb.CreateVector<flatbuffers::Offset<BinAttr>>(*roomBinAttrInternal) : 0;
  auto passwordConfig__ = passwordConfig ? _fbb.CreateVector<flatbuffers::Offset<RoomGroupPasswordConfig>>(*passwordConfig) : 0;
  auto ownerPrivilegeRank__ = ownerPrivilegeRank ? _fbb.CreateVector<u16>(*ownerPrivilegeRank) : 0;
  return CreateSetRoomDataInternalRequest(
      _fbb,
      roomId,
      flagFilter,
      flagAttr,
      roomBinAttrInternal__,
      passwordConfig__,
      passwordSlotMask,
      ownerPrivilegeRank__);
}

struct GetRoomDataInternalRequest FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
    VT_ROOMID = 4,
    VT_ATTRID = 6
  };
  u64 roomId() const {
    return GetField<u64>(VT_ROOMID, 0);
  }
  const flatbuffers::Vector<u16> *attrId() const {
    return GetPointer<const flatbuffers::Vector<u16> *>(VT_ATTRID);
  }
  bool Verify(flatbuffers::Verifier &verifier) const {
    return VerifyTableStart(verifier) &&
           VerifyField<u64>(verifier, VT_ROOMID) &&
           VerifyOffset(verifier, VT_ATTRID) &&
           verifier.VerifyVector(attrId()) &&
           verifier.EndTable();
  }
};

struct GetRoomDataInternalRequestBuilder {
  flatbuffers::FlatBufferBuilder &fbb_;
  flatbuffers::uoffset_t start_;
  void add_roomId(u64 roomId) {
    fbb_.AddElement<u64>(GetRoomDataInternalRequest::VT_ROOMID, roomId, 0);
  }
  void add_attrId(flatbuffers::Offset<flatbuffers::Vector<u16>> attrId) {
    fbb_.AddOffset(GetRoomDataInternalRequest::VT_ATTRID, attrId);
  }
  explicit GetRoomDataInternalRequestBuilder(flatbuffers::FlatBufferBuilder &_fbb)
        : fbb_(_fbb) {
    start_ = fbb_.StartTable();
  }
  GetRoomDataInternalRequestBuilder &operator=(const GetRoomDataInternalRequestBuilder &);
  flatbuffers::Offset<GetRoomDataInternalRequest> Finish() {
    const auto end = fbb_.EndTable(start_);
    auto o = flatbuffers::Offset<GetRoomDataInternalRequest>(end);
    return o;
  }
};

inline flatbuffers::Offset<GetRoomDataInternalRequest> CreateGetRoomDataInternalRequest(
    flatbuffers::FlatBufferBuilder &_fbb,
    u64 roomId = 0,
    flatbuffers::Offset<flatbuffers::Vector<u16>> attrId = 0) {
  GetRoomDataInternalRequestBuilder builder_(_fbb);
  builder_.add_roomId(roomId);
  builder_.add_attrId(attrId);
  return builder_.Finish();
}

inline flatbuffers::Offset<GetRoomDataInternalRequest> CreateGetRoomDataInternalRequestDirect(
    flatbuffers::FlatBufferBuilder &_fbb,
    u64 roomId = 0,
    const std::vector<u16> *attrId = nullptr) {
  auto attrId__ = attrId ? _fbb.CreateVector<u16>(*attrId) : 0;
  return CreateGetRoomDataInternalRequest(
      _fbb,
      roomId,
      attrId__);
}

struct RoomMemberUpdateInfo FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
    VT_ROOMMEMBERDATAINTERNAL = 4,
    VT_EVENTCAUSE = 6,
    VT_OPTDATA = 8
  };
  const RoomMemberDataInternal *roomMemberDataInternal() const {
    return GetPointer<const RoomMemberDataInternal *>(VT_ROOMMEMBERDATAINTERNAL);
  }
  u8 eventCause() const {
    return GetField<u8>(VT_EVENTCAUSE, 0);
  }
  const PresenceOptionData *optData() const {
    return GetPointer<const PresenceOptionData *>(VT_OPTDATA);
  }
  bool Verify(flatbuffers::Verifier &verifier) const {
    return VerifyTableStart(verifier) &&
           VerifyOffset(verifier, VT_ROOMMEMBERDATAINTERNAL) &&
           verifier.VerifyTable(roomMemberDataInternal()) &&
           VerifyField<u8>(verifier, VT_EVENTCAUSE) &&
           VerifyOffset(verifier, VT_OPTDATA) &&
           verifier.VerifyTable(optData()) &&
           verifier.EndTable();
  }
};

struct RoomMemberUpdateInfoBuilder {
  flatbuffers::FlatBufferBuilder &fbb_;
  flatbuffers::uoffset_t start_;
  void add_roomMemberDataInternal(flatbuffers::Offset<RoomMemberDataInternal> roomMemberDataInternal) {
    fbb_.AddOffset(RoomMemberUpdateInfo::VT_ROOMMEMBERDATAINTERNAL, roomMemberDataInternal);
  }
  void add_eventCause(u8 eventCause) {
    fbb_.AddElement<u8>(RoomMemberUpdateInfo::VT_EVENTCAUSE, eventCause, 0);
  }
  void add_optData(flatbuffers::Offset<PresenceOptionData> optData) {
    fbb_.AddOffset(RoomMemberUpdateInfo::VT_OPTDATA, optData);
  }
  explicit RoomMemberUpdateInfoBuilder(flatbuffers::FlatBufferBuilder &_fbb)
        : fbb_(_fbb) {
    start_ = fbb_.StartTable();
  }
  RoomMemberUpdateInfoBuilder &operator=(const RoomMemberUpdateInfoBuilder &);
  flatbuffers::Offset<RoomMemberUpdateInfo> Finish() {
    const auto end = fbb_.EndTable(start_);
    auto o = flatbuffers::Offset<RoomMemberUpdateInfo>(end);
    return o;
  }
};

inline flatbuffers::Offset<RoomMemberUpdateInfo> CreateRoomMemberUpdateInfo(
    flatbuffers::FlatBufferBuilder &_fbb,
    flatbuffers::Offset<RoomMemberDataInternal> roomMemberDataInternal = 0,
    u8 eventCause = 0,
    flatbuffers::Offset<PresenceOptionData> optData = 0) {
  RoomMemberUpdateInfoBuilder builder_(_fbb);
  builder_.add_optData(optData);
  builder_.add_roomMemberDataInternal(roomMemberDataInternal);
  builder_.add_eventCause(eventCause);
  return builder_.Finish();
}

struct RoomUpdateInfo FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
    VT_EVENTCAUSE = 4,
    VT_ERRORCODE = 6,
    VT_OPTDATA = 8
  };
  u8 eventCause() const {
    return GetField<u8>(VT_EVENTCAUSE, 0);
  }
  s32 errorCode() const {
    return GetField<s32>(VT_ERRORCODE, 0);
  }
  const PresenceOptionData *optData() const {
    return GetPointer<const PresenceOptionData *>(VT_OPTDATA);
  }
  bool Verify(flatbuffers::Verifier &verifier) const {
    return VerifyTableStart(verifier) &&
           VerifyField<u8>(verifier, VT_EVENTCAUSE) &&
           VerifyField<s32>(verifier, VT_ERRORCODE) &&
           VerifyOffset(verifier, VT_OPTDATA) &&
           verifier.VerifyTable(optData()) &&
           verifier.EndTable();
  }
};

struct RoomUpdateInfoBuilder {
  flatbuffers::FlatBufferBuilder &fbb_;
  flatbuffers::uoffset_t start_;
  void add_eventCause(u8 eventCause) {
    fbb_.AddElement<u8>(RoomUpdateInfo::VT_EVENTCAUSE, eventCause, 0);
  }
  void add_errorCode(s32 errorCode) {
    fbb_.AddElement<s32>(RoomUpdateInfo::VT_ERRORCODE, errorCode, 0);
  }
  void add_optData(flatbuffers::Offset<PresenceOptionData> optData) {
    fbb_.AddOffset(RoomUpdateInfo::VT_OPTDATA, optData);
  }
  explicit RoomUpdateInfoBuilder(flatbuffers::FlatBufferBuilder &_fbb)
        : fbb_(_fbb) {
    start_ = fbb_.StartTable();
  }
  RoomUpdateInfoBuilder &operator=(const RoomUpdateInfoBuilder &);
  flatbuffers::Offset<RoomUpdateInfo> Finish() {
    const auto end = fbb_.EndTable(start_);
    auto o = flatbuffers::Offset<RoomUpdateInfo>(end);
    return o;
  }
};

inline flatbuffers::Offset<RoomUpdateInfo> CreateRoomUpdateInfo(
    flatbuffers::FlatBufferBuilder &_fbb,
    u8 eventCause = 0,
    s32 errorCode = 0,
    flatbuffers::Offset<PresenceOptionData> optData = 0) {
  RoomUpdateInfoBuilder builder_(_fbb);
  builder_.add_optData(optData);
  builder_.add_errorCode(errorCode);
  builder_.add_eventCause(eventCause);
  return builder_.Finish();
}

struct GetPingInfoResponse FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
    VT_SERVERID = 4,
    VT_WORLDID = 6,
    VT_ROOMID = 8,
    VT_RTT = 10
  };
  u16 serverId() const {
    return GetField<u16>(VT_SERVERID, 0);
  }
  u32 worldId() const {
    return GetField<u32>(VT_WORLDID, 0);
  }
  u64 roomId() const {
    return GetField<u64>(VT_ROOMID, 0);
  }
  u32 rtt() const {
    return GetField<u32>(VT_RTT, 0);
  }
  bool Verify(flatbuffers::Verifier &verifier) const {
    return VerifyTableStart(verifier) &&
           VerifyField<u16>(verifier, VT_SERVERID) &&
           VerifyField<u32>(verifier, VT_WORLDID) &&
           VerifyField<u64>(verifier, VT_ROOMID) &&
           VerifyField<u32>(verifier, VT_RTT) &&
           verifier.EndTable();
  }
};

struct GetPingInfoResponseBuilder {
  flatbuffers::FlatBufferBuilder &fbb_;
  flatbuffers::uoffset_t start_;
  void add_serverId(u16 serverId) {
    fbb_.AddElement<u16>(GetPingInfoResponse::VT_SERVERID, serverId, 0);
  }
  void add_worldId(u32 worldId) {
    fbb_.AddElement<u32>(GetPingInfoResponse::VT_WORLDID, worldId, 0);
  }
  void add_roomId(u64 roomId) {
    fbb_.AddElement<u64>(GetPingInfoResponse::VT_ROOMID, roomId, 0);
  }
  void add_rtt(u32 rtt) {
    fbb_.AddElement<u32>(GetPingInfoResponse::VT_RTT, rtt, 0);
  }
  explicit GetPingInfoResponseBuilder(flatbuffers::FlatBufferBuilder &_fbb)
        : fbb_(_fbb) {
    start_ = fbb_.StartTable();
  }
  GetPingInfoResponseBuilder &operator=(const GetPingInfoResponseBuilder &);
  flatbuffers::Offset<GetPingInfoResponse> Finish() {
    const auto end = fbb_.EndTable(start_);
    auto o = flatbuffers::Offset<GetPingInfoResponse>(end);
    return o;
  }
};

inline flatbuffers::Offset<GetPingInfoResponse> CreateGetPingInfoResponse(
    flatbuffers::FlatBufferBuilder &_fbb,
    u16 serverId = 0,
    u32 worldId = 0,
    u64 roomId = 0,
    u32 rtt = 0) {
  GetPingInfoResponseBuilder builder_(_fbb);
  builder_.add_roomId(roomId);
  builder_.add_rtt(rtt);
  builder_.add_worldId(worldId);
  builder_.add_serverId(serverId);
  return builder_.Finish();
}

struct SendRoomMessageRequest FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
    VT_ROOMID = 4,
    VT_CASTTYPE = 6,
    VT_DST = 8,
    VT_MSG = 10,
    VT_OPTION = 12
  };
  u64 roomId() const {
    return GetField<u64>(VT_ROOMID, 0);
  }
  u8 castType() const {
    return GetField<u8>(VT_CASTTYPE, 0);
  }
  const flatbuffers::Vector<u16> *dst() const {
    return GetPointer<const flatbuffers::Vector<u16> *>(VT_DST);
  }
  const flatbuffers::Vector<u8> *msg() const {
    return GetPointer<const flatbuffers::Vector<u8> *>(VT_MSG);
  }
  u8 option() const {
    return GetField<u8>(VT_OPTION, 0);
  }
  bool Verify(flatbuffers::Verifier &verifier) const {
    return VerifyTableStart(verifier) &&
           VerifyField<u64>(verifier, VT_ROOMID) &&
           VerifyField<u8>(verifier, VT_CASTTYPE) &&
           VerifyOffset(verifier, VT_DST) &&
           verifier.VerifyVector(dst()) &&
           VerifyOffset(verifier, VT_MSG) &&
           verifier.VerifyVector(msg()) &&
           VerifyField<u8>(verifier, VT_OPTION) &&
           verifier.EndTable();
  }
};

struct SendRoomMessageRequestBuilder {
  flatbuffers::FlatBufferBuilder &fbb_;
  flatbuffers::uoffset_t start_;
  void add_roomId(u64 roomId) {
    fbb_.AddElement<u64>(SendRoomMessageRequest::VT_ROOMID, roomId, 0);
  }
  void add_castType(u8 castType) {
    fbb_.AddElement<u8>(SendRoomMessageRequest::VT_CASTTYPE, castType, 0);
  }
  void add_dst(flatbuffers::Offset<flatbuffers::Vector<u16>> dst) {
    fbb_.AddOffset(SendRoomMessageRequest::VT_DST, dst);
  }
  void add_msg(flatbuffers::Offset<flatbuffers::Vector<u8>> msg) {
    fbb_.AddOffset(SendRoomMessageRequest::VT_MSG, msg);
  }
  void add_option(u8 option) {
    fbb_.AddElement<u8>(SendRoomMessageRequest::VT_OPTION, option, 0);
  }
  explicit SendRoomMessageRequestBuilder(flatbuffers::FlatBufferBuilder &_fbb)
        : fbb_(_fbb) {
    start_ = fbb_.StartTable();
  }
  SendRoomMessageRequestBuilder &operator=(const SendRoomMessageRequestBuilder &);
  flatbuffers::Offset<SendRoomMessageRequest> Finish() {
    const auto end = fbb_.EndTable(start_);
    auto o = flatbuffers::Offset<SendRoomMessageRequest>(end);
    return o;
  }
};

inline flatbuffers::Offset<SendRoomMessageRequest> CreateSendRoomMessageRequest(
    flatbuffers::FlatBufferBuilder &_fbb,
    u64 roomId = 0,
    u8 castType = 0,
    flatbuffers::Offset<flatbuffers::Vector<u16>> dst = 0,
    flatbuffers::Offset<flatbuffers::Vector<u8>> msg = 0,
    u8 option = 0) {
  SendRoomMessageRequestBuilder builder_(_fbb);
  builder_.add_roomId(roomId);
  builder_.add_msg(msg);
  builder_.add_dst(dst);
  builder_.add_option(option);
  builder_.add_castType(castType);
  return builder_.Finish();
}

inline flatbuffers::Offset<SendRoomMessageRequest> CreateSendRoomMessageRequestDirect(
    flatbuffers::FlatBufferBuilder &_fbb,
    u64 roomId = 0,
    u8 castType = 0,
    const std::vector<u16> *dst = nullptr,
    const std::vector<u8> *msg = nullptr,
    u8 option = 0) {
  auto dst__ = dst ? _fbb.CreateVector<u16>(*dst) : 0;
  auto msg__ = msg ? _fbb.CreateVector<u8>(*msg) : 0;
  return CreateSendRoomMessageRequest(
      _fbb,
      roomId,
      castType,
      dst__,
      msg__,
      option);
}

struct RoomMessageInfo FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
    VT_FILTERED = 4,
    VT_CASTTYPE = 6,
    VT_DST = 8,
    VT_SRCMEMBER = 10,
    VT_MSG = 12
  };
  bool filtered() const {
    return GetField<u8>(VT_FILTERED, 0) != 0;
  }
  u8 castType() const {
    return GetField<u8>(VT_CASTTYPE, 0);
  }
  const flatbuffers::Vector<u16> *dst() const {
    return GetPointer<const flatbuffers::Vector<u16> *>(VT_DST);
  }
  const UserInfo2 *srcMember() const {
    return GetPointer<const UserInfo2 *>(VT_SRCMEMBER);
  }
  const flatbuffers::Vector<u8> *msg() const {
    return GetPointer<const flatbuffers::Vector<u8> *>(VT_MSG);
  }
  bool Verify(flatbuffers::Verifier &verifier) const {
    return VerifyTableStart(verifier) &&
           VerifyField<u8>(verifier, VT_FILTERED) &&
           VerifyField<u8>(verifier, VT_CASTTYPE) &&
           VerifyOffset(verifier, VT_DST) &&
           verifier.VerifyVector(dst()) &&
           VerifyOffset(verifier, VT_SRCMEMBER) &&
           verifier.VerifyTable(srcMember()) &&
           VerifyOffset(verifier, VT_MSG) &&
           verifier.VerifyVector(msg()) &&
           verifier.EndTable();
  }
};

struct RoomMessageInfoBuilder {
  flatbuffers::FlatBufferBuilder &fbb_;
  flatbuffers::uoffset_t start_;
  void add_filtered(bool filtered) {
    fbb_.AddElement<u8>(RoomMessageInfo::VT_FILTERED, static_cast<u8>(filtered), 0);
  }
  void add_castType(u8 castType) {
    fbb_.AddElement<u8>(RoomMessageInfo::VT_CASTTYPE, castType, 0);
  }
  void add_dst(flatbuffers::Offset<flatbuffers::Vector<u16>> dst) {
    fbb_.AddOffset(RoomMessageInfo::VT_DST, dst);
  }
  void add_srcMember(flatbuffers::Offset<UserInfo2> srcMember) {
    fbb_.AddOffset(RoomMessageInfo::VT_SRCMEMBER, srcMember);
  }
  void add_msg(flatbuffers::Offset<flatbuffers::Vector<u8>> msg) {
    fbb_.AddOffset(RoomMessageInfo::VT_MSG, msg);
  }
  explicit RoomMessageInfoBuilder(flatbuffers::FlatBufferBuilder &_fbb)
        : fbb_(_fbb) {
    start_ = fbb_.StartTable();
  }
  RoomMessageInfoBuilder &operator=(const RoomMessageInfoBuilder &);
  flatbuffers::Offset<RoomMessageInfo> Finish() {
    const auto end = fbb_.EndTable(start_);
    auto o = flatbuffers::Offset<RoomMessageInfo>(end);
    return o;
  }
};

inline flatbuffers::Offset<RoomMessageInfo> CreateRoomMessageInfo(
    flatbuffers::FlatBufferBuilder &_fbb,
    bool filtered = false,
    u8 castType = 0,
    flatbuffers::Offset<flatbuffers::Vector<u16>> dst = 0,
    flatbuffers::Offset<UserInfo2> srcMember = 0,
    flatbuffers::Offset<flatbuffers::Vector<u8>> msg = 0) {
  RoomMessageInfoBuilder builder_(_fbb);
  builder_.add_msg(msg);
  builder_.add_srcMember(srcMember);
  builder_.add_dst(dst);
  builder_.add_castType(castType);
  builder_.add_filtered(filtered);
  return builder_.Finish();
}

inline flatbuffers::Offset<RoomMessageInfo> CreateRoomMessageInfoDirect(
    flatbuffers::FlatBufferBuilder &_fbb,
    bool filtered = false,
    u8 castType = 0,
    const std::vector<u16> *dst = nullptr,
    flatbuffers::Offset<UserInfo2> srcMember = 0,
    const std::vector<u8> *msg = nullptr) {
  auto dst__ = dst ? _fbb.CreateVector<u16>(*dst) : 0;
  auto msg__ = msg ? _fbb.CreateVector<u8>(*msg) : 0;
  return CreateRoomMessageInfo(
      _fbb,
      filtered,
      castType,
      dst__,
      srcMember,
      msg__);
}

#endif  // FLATBUFFERS_GENERATED_NP2STRUCTS_H_
