import "steammessages.proto";
import "gcsdk_gcmessages.proto";
import "citadel_gcmessages_common.proto";

enum EGCCitadelClientMessages {
	k_EMsgClientToGCStartMatchmaking = 9010;
	k_EMsgClientToGCStartMatchmakingResponse = 9011;
	k_EMsgClientToGCStopMatchmaking = 9012;
	k_EMsgClientToGCStopMatchmakingResponse = 9013;
	k_EMsgGCToClientMatchmakingStopped = 9014;
	k_EMsgClientToGCLeaveLobby = 9015;
	k_EMsgClientToGCLeaveLobbyResponse = 9016;
	k_EMsgClientToGCIsInMatchmaking = 9017;
	k_EMsgClientToGCIsInMatchmakingResponse = 9018;
	k_EMsgGCToClientDevPlaytestStatus = 9019;
	k_EMsgClientToGCDevSetMMBias = 9023;
	k_EMsgClientToGCGetProfileCard = 9024;
	k_EMsgClientToGCGetProfileCardResponse = 9025;
	k_EMsgClientToGCUpdateRoster = 9026;
	k_EMsgClientToGCUpdateRosterResponse = 9027;
	k_EMsgGCToClientProfileCardUpdated = 9028;
	k_EMsgGCToClientDevAnnouncements = 9029;
	k_EMsgClientToGCModifyDevAnnouncements = 9030;
	k_EMsgClientToGCModifyDevAnnouncementsResponse = 9031;
	k_EMsgGCToClientSDRTicket = 9100;
	k_EMsgClientToGCReplacementSDRTicket = 9101;
	k_EMsgClientToGCReplacementSDRTicketResponse = 9102;
	k_EMsgClientToGCSetServerConVar = 9107;
	k_EMsgClientToGCSetServerConVarResponse = 9108;
	k_EMsgClientToGCSpectateLobby = 9109;
	k_EMsgClientToGCSpectateLobbyResponse = 9110;
	k_EMsgClientToGCPostMatchSurveyResponse = 9111;
	k_EMsgClientToGCGetMatchHistory = 9112;
	k_EMsgClientToGCGetMatchHistoryResponse = 9113;
	k_EMsgClientToGCSpectateUser = 9116;
	k_EMsgClientToGCSpectateUserResponse = 9117;
	k_EMsgClientToGCPartyCreate = 9123;
	k_EMsgClientToGCPartyCreateResponse = 9124;
	k_EMsgClientToGCPartyLeave = 9125;
	k_EMsgClientToGCPartyLeaveResponse = 9126;
	k_EMsgClientToGCPartyJoin = 9127;
	k_EMsgClientToGCPartyJoinResponse = 9128;
	k_EMsgClientToGCPartyAction = 9129;
	k_EMsgClientToGCPartyActionResponse = 9130;
	k_EMsgClientToGCPartyStartMatch = 9131;
	k_EMsgClientToGCPartyStartMatchResponse = 9132;
	k_EMsgClientToGCPartyInviteUser = 9133;
	k_EMsgClientToGCPartyInviteUserResponse = 9134;
	k_EMsgGCToClientPartyEvent = 9135;
	k_EMsgGCToClientCanRejoinParty = 9137;
	k_EMsgClientToGCPartyJoinViaCode = 9138;
	k_EMsgClientToGCPartyJoinViaCodeResponse = 9139;
	k_EMsgClientToGCPartySetReadyState = 9142;
	k_EMsgClientToGCPartySetReadyStateResponse = 9143;
	k_EMsgClientToGCGetAccountStats = 9164;
	k_EMsgClientToGCGetAccountStatsResponse = 9165;
	k_EMsgGCToClientAccountStatsUpdated = 9166;
	k_EMsgClientToGCGetMatchMetaData = 9167;
	k_EMsgClientToGCGetMatchMetaDataResponse = 9168;
	k_EMsgClientToGCDevAction = 9172;
	k_EMsgClientToGCDevActionResponse = 9173;
	k_EMsgClientToGCRecordClientEvents = 9174;
	k_EMsgClientToGCRecordClientEventsResponse = 9175;
	k_EMsgClientToGCSetNewPlayerProgress = 9176;
	k_EMsgClientToGCSetNewPlayerProgressResponse = 9177;
	k_EMsgClientToGCUpdateAccountSync = 9178;
	k_EMsgClientToGCUpdateAccountSyncResponse = 9179;
	k_EMsgClientToGCGetHeroChoice = 9180;
	k_EMsgClientToGCGetHeroChoiceResponse = 9181;
	k_EMsgClientToGCUnlockHero = 9182;
	k_EMsgClientToGCUnlockHeroResponse = 9183;
	k_EMsgClientToGCBookUnlock = 9184;
	k_EMsgClientToGCBookUnlockResponse = 9185;
	k_EMsgClientToGCGetBook = 9186;
	k_EMsgClientToGCGetBookResponse = 9187;
	k_EMsgGCToClientBookUpdated = 9188;
	k_EMsgClientToGCSubmitPlaytestUser = 9189;
	k_EMsgClientToGCSubmitPlaytestUserResponse = 9190;
	k_EMsgClientToGCUpdateHeroBuild = 9193;
	k_EMsgClientToGCUpdateHeroBuildResponse = 9194;
	k_EMsgClientToGCFindHeroBuilds = 9195;
	k_EMsgClientToGCFindHeroBuildsResponse = 9196;
	k_EMsgClientToGCReportPlayerFromMatch = 9197;
	k_EMsgClientToGCReportPlayerFromMatchResponse = 9198;
	k_EMsgClientToGCGetAccountMatchReports = 9199;
	k_EMsgClientToGCGetAccountMatchReportsResponse = 9200;
	k_EMsgClientToGCDeleteHeroBuild = 9201;
	k_EMsgClientToGCDeleteHeroBuildResponse = 9202;
	k_EMsgClientToGCGetActiveMatches = 9203;
	k_EMsgClientToGCGetActiveMatchesResponse = 9204;
	k_EMsgClientToGCGetDiscordLink = 9205;
	k_EMsgClientToGCGetDiscordLinkResponse = 9206;
	k_EMsgClientToGCPartySetMode = 9207;
	k_EMsgClientToGCPartySetModeResponse = 9208;
	k_EMsgClientToGCGrantForumAccess = 9209;
	k_EMsgClientToGCGrantForumAccessResponse = 9210;
	k_EMsgClientToGCModeratorRequest = 9211;
	k_EMsgClientToGCModeratorRequestResponse = 9212;
	k_EMsgClientToGCGetFriendGameStatus = 9213;
	k_EMsgClientToGCGetFriendGameStatusResponse = 9214;
	k_EMsgClientToGCUpdateHeroBuildPreference = 9215;
	k_EMsgClientToGCUpdateHeroBuildPreferenceResponse = 9216;
	k_EMsgClientToGCUpdateSpectatorStatus = 9219;
	k_EMsgClientToGCCommendPlayerFromMatch = 9223;
	k_EMsgClientToGCCommendPlayerFromMatchResponse = 9224;
	k_EMsgGCToClientCommendNotification = 9225;
	k_EMsgGCToClientHeroLabsSchedule = 9228;
	k_EMsgClientToGCDevRequestCheatReports = 9230;
	k_EMsgClientToGCDevRequestCheatReportsResponse = 9231;
	k_EMsgClientToGCDevBan = 9232;
	k_EMsgClientToGCDevBanResponse = 9233;
	k_EMsgClientToGCGetHeroMMRRankings = 9234;
	k_EMsgClientToGCGetHeroMMRRankingsResponse = 9235;
	k_EMsgClientToGCGetLeaderboard = 9236;
	k_EMsgClientToGCGetLeaderboardResponse = 9237;
	k_EMsgClientToGCGetAccountLeaderboards = 9238;
	k_EMsgClientToGCGetAccountLeaderboardsResponse = 9239;
	k_EMsgClientToGCTarotGetUserData = 9242;
	k_EMsgClientToGCTarotGetUserDataResponse = 9243;
	k_EMsgGCToClientTarotUserDataUpdated = 9244;
	k_EMsgClientToGCTarotPlaceTile = 9245;
	k_EMsgClientToGCTarotPlaceTileResponse = 9246;
	k_EMsgClientToGCTarotApplyRune = 9247;
	k_EMsgClientToGCTarotApplyRuneResponse = 9248;
	k_EMsgClientToGCTarotCompleteBoard = 9249;
	k_EMsgClientToGCTarotCompleteBoardResponse = 9250;
	k_EMsgClientToGCTarotDevCreateTile = 9251;
	k_EMsgClientToGCTarotDevCreateTileResponse = 9252;
	k_EMsgClientToGCTarotDevCreateBoard = 9253;
	k_EMsgClientToGCTarotDevCreateBoardResponse = 9254;
	k_EMsgClientToGCTarotDevGenerateTestTiles = 9255;
	k_EMsgClientToGCTarotDevGenerateTestTilesResponse = 9256;
	k_EMsgClientToGCTarotDevModifyEnergy = 9257;
	k_EMsgClientToGCTarotDevModifyEnergyResponse = 9258;
	k_EMsgClientToGCGenerateChallengeSet = 9259;
	k_EMsgClientToGCGenerateChallengeSetResponse = 9260;
	k_EMsgClientToGCChallengeActivate = 9261;
	k_EMsgClientToGCChallengeActivateResponse = 9262;
	k_EMsgClientToGCChallengeClaim = 9263;
	k_EMsgClientToGCChallengeClaimResponse = 9264;
	k_EMsgClientToGCChallengeCancel = 9265;
	k_EMsgClientToGCChallengeCancelResponse = 9266;
	k_EMsgClientToGCGetSurveyQuestion = 9267;
	k_EMsgClientToGCGetSurveyQuestionResponse = 9268;
	k_EMsgClientToGCSubmitSurvey = 9269;
	k_EMsgClientToGCSubmitSurveyResponse = 9270;
	k_EMsgClientToGCGetRankData = 9271;
	k_EMsgGCToClientGetRankDataResponse = 9272;
	k_EMsgGCToClientRankDataUpdate = 9273;
	k_EMsgClientToGCGetHideoutSDRTicket = 9274;
	k_EMsgClientToGCGetHideoutSDRTicketResponse = 9275;
	k_EMsgClientToGCSubmitHeroReleaseVote = 9276;
	k_EMsgClientToGCPartySendChatMsg = 9277;
	k_EMsgClientToGCPartySendChatMsgResponse = 9278;
	k_EMsgGCToClientPartyChatMsg = 9279;
	k_EMsgClientToGCRequestHeroReleaseVoteTally = 9280;
	k_EMsgGCToClientUpdateHeroReleaseVoteTally = 9281;
}

enum ECitadelAccountPermissionFlag {
	k_eAccountPermission_Ranked = 1;
}

enum ECitadelNewPlayerProgressFlag {
	k_eNewPlayerProgress_GettingStarted = 1;
	k_eNewPlayerProgress_HeroTraining = 2;
	k_eNewPlayerProgress_LaneTraining = 3;
	k_eNewPlayerProgress_CombinedTutorial2026 = 4;
}

enum EProfileCardSlotType {
	k_EProfileCardSlotType_Empty = 0;
	k_EProfileCardSlotType_Stat = 1;
	k_EProfileCardSlotType_Hero = 2;
}

enum EDevBanReason {
	k_eDevBanReason_Unspecified = 0;
	k_eDevBanReason_AimAssist = 1;
	k_eDevBanReason_VisionAssist = 2;
	k_eDevBanReason_MovementAssist = 3;
}

enum ECitadelClientAccountEvent {
	k_eLaunchedHeroTest = 1;
	k_eViewedProfile = 2;
	k_eViewedHeroes = 4;
	k_eViewedHeroDetails = 5;
	k_eViewedPatchNotes = 6;
	k_eViewedEvents = 7;
	k_eViewedGettingStarted = 8;
	k_eViewedGuidePage = 9;
	k_eLaunchedClient = 10;
	k_eEditRoster = 11;
	k_eViewedWatch = 12;
	k_eCreatedParty = 13;
	k_eCreatedPartyWithInvite = 14;
	k_eViewedSelfProfile = 15;
	k_eJoinedPartyCode = 16;
	k_eSentPartyInvite = 17;
	k_eAcceptPartyInvite = 18;
	k_eRejectPartyInvite = 19;
	k_eSpectateUser = 20;
	k_eSpectateMatch = 21;
	k_eEnteredMatchMaking = 22;
	k_eLeftMatchMaking = 23;
	k_eEnteredPartyMatchMaking = 24;
	k_eLeftPartyMatchMaking = 25;
	k_eDownloadedReplay = 26;
	k_eWatchedReplay = 27;
	k_eViewMatchDetails = 28;
	k_eMatchDetailsTab = 29;
	k_eDeleteReplay = 30;
	k_eBotMatch_Guided = 31;
	k_eBotMatch_Easy = 32;
	k_eBotMatch_Hard = 33;
	k_eLiveUpdatedRoster = 34;
	k_eMatchMakingIdle_Displayed = 35;
	k_eMatchMakingIdle_Stopped = 36;
	k_eConnectReacquireTicket = 37;
	k_eConnectAttemptReconnect = 38;
	k_eDisconnectPresentedPrompt = 39;
	k_eDisconnectConfirmed = 40;
	k_eViewedSettings_Options = 41;
	k_eViewedSettings_Video = 42;
	k_eViewedSettings_Audio = 43;
	k_eViewedSettings_HotKey = 44;
	k_eViewedSettings_ChatWheel = 45;
	k_eViewedSettings_About = 46;
	k_eOpenedSubmitFeedback = 47;
	k_eTutorialSkip_Pressed = 48;
	k_eTutorialSkip_Confirmed = 49;
	k_eViewedGuidePage_5s = 50;
	k_eViewedGuidePage_15s = 51;
	k_eViewedGuidePage_30s = 52;
	k_eViewedGuidePage_60s = 53;
	k_eOpenedBookTest = 54;
	k_eSandboxViaHeroPage = 55;
	k_eViewedSettings_SteamInput = 56;
	k_eViewedSettings_Social = 57;
	k_eCalibrationMatch = 58;
	k_eSandboxViaPlayMenu = 59;
	k_eBotMatch_Medium = 60;
	k_eSandboxViaHideoutTeleport = 61;
	k_eRosterSelectSingleHero = 62;
}

enum ECommendType {
	k_eInvalid = 0;
	k_eGeneric = 1;
	k_eFriendly = 2;
	k_eTeamwork = 3;
	k_eSkilled = 4;
}

message CSOGameAccountClient {
	enum EFlags {
		k_eDeveloper = 1;
		k_eExternalModerator = 2;
		k_eGotInitialHeroes = 4;
		k_eHideHolidayModels = 8;
		k_eClaimedDiscordLink = 16;
		k_eClaimedForum = 32;
		k_eAccountBanned = 64;
	}

	optional uint32 account_id = 1 [(key_field) = true];
	optional uint64 flags = 2;
	optional uint32 wins = 3;
	optional uint32 losses = 4;
	optional uint32 kills = 5;
	optional uint32 most_played_hero_id = 6;
	optional uint64 permissions = 7;
	optional uint64 new_player_progress = 8;
	optional uint32 hero_unlock_credits = 9;
	optional uint32 mm_ban_until = 10;
	optional uint32 comms_ban_until = 11;
	optional uint32 low_priority_games_remaining = 12;
	optional uint32 report_ban_until = 13;
	optional uint32 ranked_badge_level = 14;
	optional uint32 priority_tokens = 15;
	optional uint32 priority_token_progress = 16;
	optional uint32 priority_tokens_earned = 17;
	optional uint32 brawl_wins = 18;
	optional uint32 brawl_losses = 19;
	optional uint32 brawl_kills = 20;
	optional uint32 last_mm_match_time = 21;
}

message CSOAccountSyncStorage {
	optional uint32 account_id = 1;
	optional uint32 id = 2;
	optional uint32 value = 3;
}

message CSOAccountHeroInfo {
	enum EHeroStatus {
		k_eLocked = 0;
		k_eOwned = 1;
	}

	optional uint32 account_id = 1 [(key_field) = true];
	optional uint32 hero_id = 2;
	optional .CSOAccountHeroInfo.EHeroStatus status = 3 [default = k_eLocked];
	optional uint32 wins = 4;
	optional uint32 hero_xp = 6;
	optional uint32 brawl_wins = 7;
}

message CSOAccountChallenge {
	enum EChallengeStatus {
		k_eInvalid = 0;
		k_eRejected = 1;
		k_eActiveChoice = 2;
		k_eActive = 3;
		k_eCompleted = 4;
		k_eExpired = 5;
	}

	enum ERewardType {
		k_eReward_HeroXP = 0;
	}

	optional uint32 account_id = 1 [(key_field) = true];
	optional uint64 challenge_id = 2;
	optional .CSOAccountChallenge.EChallengeStatus status = 3 [default = k_eInvalid];
	optional uint32 progress = 4;
	optional uint32 max_progress = 5;
	optional uint32 choice_group = 6;
	optional .CSOAccountChallenge.ERewardType reward_type = 7 [default = k_eReward_HeroXP];
	optional uint32 reward_param = 8;
	optional uint32 reward_amount = 9;
}

message CMsgCitadelClientHello {
}

message CMsgClientToGCStartMatchmaking {
	optional uint32 client_version = 1;
	optional .EGCPlatform client_platform = 2 [default = k_eGCPlatform_None];
	optional .CMsgStartFindingMatchInfo match_info = 3;
	optional .CMsgRegionPingTimesClient ping_times = 4;
	optional .CMsgHeroSelectionMatchInfo heroes = 5;
}

message CMsgClientToGCStartMatchmakingResponse {
	enum EResultCode {
		k_EResult_OK = 0;
		k_EResult_AlreadyFindingMatch = 1;
		k_EResult_PartyMemberInLobby = 2;
		k_EResult_InvalidClientVersion = 3;
		k_EResult_MatchmakingDisabled = 4;
		k_EResult_MatchmakingTooBusy = 5;
		k_EResult_InternalError = 6;
		k_EResult_NoRegionPings = 7;
		k_EResult_InParty = 8;
		k_EResult_ModeLocked = 9;
		k_EResult_ModeBanned = 10;
		k_EResult_RegionInfoNotProvided = 11;
		k_EResult_DurationControlBlocked = 12;
		k_EResult_InvalidHeroSelection = 13;
		k_EResult_HeroesNotUnlocked = 14;
		k_EResult_PermanentBan = 15;
		k_EResult_RankedMMNotOpen = 16;
		k_EResult_RankedNotUnlocked = 17;
		k_EResult_NoRankedWhileInLowPri = 18;
		k_EResult_NoRankedWhileCommsBanned = 19;
		k_EResult_NoRankedWhileReportBanned = 20;
		k_EResult_HeroLabsMMNotOpen = 21;
		k_EResult_HeroLabsNotUnlocked = 22;
		k_EResult_NoHeroLabsWhileInLowPri = 23;
		k_EResult_AccountLocked = 24;
		k_EResult_TooManyLimitedHeroes = 25;
	}

	optional .CMsgClientToGCStartMatchmakingResponse.EResultCode result = 1 [default = k_EResult_OK];
	optional uint32 time_stamp = 2;
	optional string debug_message = 3;
}

message CMsgClientToGCStopMatchmaking {
}

message CMsgClientToGCStopMatchmakingResponse {
	optional bool success = 1;
}

message CMsgGCToClientMatchmakingStopped {
	enum EReason {
		k_EResult_Unspecified = 0;
		k_EResult_VersionUpdated = 1;
		k_EResult_RankedClosed = 2;
		k_EResult_HeroLabsClosed = 3;
	}

	optional .CMsgGCToClientMatchmakingStopped.EReason reason = 1 [default = k_EResult_Unspecified];
}

message CMsgClientToGCLeaveLobby {
	optional uint64 lobby_id = 1;
}

message CMsgClientToGCLeaveLobbyResponse {
}

message CMsgClientWelcomeCitadel {
	optional uint32 currency = 1;
	repeated .CExtraMsgBlock extra_messages = 2;
	optional uint32 compatibility_version = 3;
	optional .ECitadelRegionMode region_mode = 4 [default = k_ECitadelRegionMode_ROW];
}

message CMsgClientToGCIsInMatchmaking {
}

message CMsgClientToGCIsInMatchmakingResponse {
	optional bool in_matchmaking = 1;
}

message CMsgDevMatchInfo {
	message MatchPlayer {
		optional uint32 account_id = 1;
		optional .ECitadelLobbyTeam team = 2 [default = k_ECitadelLobbyTeam_Team0];
		optional bool abandoned = 3;
		optional uint32 hero_id = 4;
	}

	message Team {
		optional .ECitadelLobbyTeam team = 1 [default = k_ECitadelLobbyTeam_Team0];
		optional uint32 net_worth = 2;
		optional uint64 objectives_mask = 3;
		optional uint32 brawl_score = 4;
	}

	optional uint32 start_time = 1;
	optional .ECitadelLobbyTeam winning_team = 2 [default = k_ECitadelLobbyTeam_Team0];
	optional uint64 match_id = 3;
	repeated .CMsgDevMatchInfo.MatchPlayer players = 4;
	optional fixed64 lobby_id = 5;
	optional uint32 game_mode_version = 6;
	optional uint32 net_worth_team_0 = 9;
	optional uint32 net_worth_team_1 = 10;
	optional uint32 duration_s = 11;
	optional uint32 spectators = 12;
	optional uint32 open_spectator_slots = 13;
	optional uint64 objectives_mask_team0 = 14;
	optional uint64 objectives_mask_team1 = 15;
	optional .ECitadelMatchMode match_mode = 16 [default = k_ECitadelMatchMode_Invalid];
	optional .ECitadelGameMode game_mode = 17 [default = k_ECitadelGameMode_Invalid];
	optional uint32 match_score = 18;
	optional .ECitadelRegionMode region_mode = 19 [default = k_ECitadelRegionMode_ROW];
	optional uint32 compat_version = 20;
	repeated .CMsgDevMatchInfo.Team team_stats = 22;
}

message CMsgGCToClientDevPlaytestStatus {
	message HeroWhitelist {
		optional uint32 hero_id = 1;
		repeated uint32 account_ids = 2;
	}

	message DevQueueSize {
		optional .ECitadelMatchMode match_mode = 1 [default = k_ECitadelMatchMode_Invalid];
		optional uint32 queue_size = 2;
		optional .ECitadelGameMode game_mode = 3 [default = k_ECitadelGameMode_Invalid];
	}

	repeated .CMsgGCToClientDevPlaytestStatus.DevQueueSize dev_queue_size = 1;
	optional uint32 dev_available_servers = 2;
	optional uint32 coop_bot_max_wait_s = 3;
	optional bool is_mm_enabled = 4;
	optional bool locked_heroes = 8;
	optional bool party_shared_heroes = 9;
	repeated .CMsgGCToClientDevPlaytestStatus.HeroWhitelist hero_whitelists = 10;
	optional uint32 mm_pause_time = 14;
	repeated uint32 valid_client_versions = 15;
	optional uint32 active_match_count = 21;
	optional uint32 roster_non_limited_heroes = 22;
	optional uint32 matches_per_priority_token = 23;
}

message CMsgGCToClientSDRTicket {
	optional bytes ticket = 1;
}

message CMsgClientToGCReplacementSDRTicket {
	optional fixed64 lobby_id = 1;
}

message CMsgClientToGCReplacementSDRTicketResponse {
	optional bytes ticket = 1;
	optional string error_message = 2;
}

message CMsgClientToGCGetHideoutSDRTicket {
	optional fixed64 lobby_id = 1;
}

message CMsgClientToGCGetHideoutSDRTicketResponse {
	optional bytes ticket = 1;
	optional string error_message = 2;
}

message CMsgClientToGCSetServerConVar {
	optional string convar_name = 1;
	optional string convar_value = 2;
	optional fixed64 lobby_id = 3;
}

message CMsgClientToGCSetServerConVarResponse {
	optional string message = 1;
}

message CMsgClientToGCPostMatchSurveyResponse {
	message PostMatchSurvey {
		optional uint32 question_id = 1;
		optional uint32 response_value = 2;
		optional string response_freeform = 3;
	}

	repeated .CMsgClientToGCPostMatchSurveyResponse.PostMatchSurvey post_match_survey = 1;
	optional uint64 match_id = 2;
}

message CMsgPartyMMInfo {
	optional .EGCPlatform platform = 1 [default = k_eGCPlatform_None];
	optional .CMsgRegionPingTimesClient ping_times = 2;
	optional uint32 client_version = 3;
	optional .ECitadelRegionMode region_mode = 4 [default = k_ECitadelRegionMode_ROW];
}

message CMsgClientToGCPartyCreate {
	optional .CMsgPartyMMInfo party_mm_info = 1;
	optional uint32 invite_account_id = 3;
	optional bool disable_party_code = 4;
	optional bool is_private_lobby = 5;
	optional .ECitadelRegionMode region_mode = 6 [default = k_ECitadelRegionMode_ROW];
	optional string server_search_key = 7;
	optional .ECitadelMMPreference mm_preference = 8 [default = k_ECitadelMMPreference_Invalid];
	optional .CSOCitadelParty.PrivateLobbySettings private_lobby_settings = 9;
	optional .ECitadelBotDifficulty bot_difficulty = 10 [default = k_ECitadelBotDifficulty_None];
	optional string hideout_search_key = 11;
	optional bool dev_force_hideout = 12;
	optional .ECitadelGameMode game_mode = 13 [default = k_ECitadelGameMode_Invalid];
}

message CMsgClientToGCPartyCreateResponse {
	enum EResponse {
		k_eInternalError = 0;
		k_eSuccess = 1;
		k_eAlreadyInParty = 2;
		k_eDisabled = 3;
		k_eInvalidVersion = 4;
		k_eNoRegionPings = 5;
		k_eTooBusy = 6;
		k_eRateLimited = 7;
		k_eNotFriends = 8;
		k_eRegionInfoNotProvided = 9;
		k_eDurationControlBlocked = 10;
		k_eInMatchmaking = 11;
		k_ePlayerDoesntHaveGame = 12;
	}

	optional .CMsgClientToGCPartyCreateResponse.EResponse result = 1 [default = k_eInternalError];
	optional fixed64 party_id = 2;
}

message CMsgClientToGCPartyLeave {
	optional fixed64 party_id = 1;
}

message CMsgClientToGCPartyLeaveResponse {
	enum EResponse {
		k_eInternalError = 0;
		k_eSuccess = 1;
		k_eNotInParty = 2;
		k_eInMatchMaking = 3;
	}

	optional .CMsgClientToGCPartyLeaveResponse.EResponse result = 1 [default = k_eInternalError];
}

message CMsgClientToGCPartyJoin {
	optional fixed64 party_id = 1;
	optional bool is_rejoin = 2;
	optional .CMsgPartyMMInfo party_mm_info = 3;
}

message CMsgClientToGCPartyJoinResponse {
	enum EResponse {
		k_eInternalError = 0;
		k_eSuccess = 1;
		k_eAlreadyInParty = 2;
		k_eDisabled = 3;
		k_eInvalidPartyID = 4;
		k_eInvalidPermissions = 5;
		k_eInvalidVersion = 6;
		k_eNoRegionPings = 7;
		k_eTooBusy = 8;
		k_eInvalidCode = 9;
		k_eRateLimited = 10;
		k_eRegionInfoNotProvided = 11;
		k_eDurationControlBlocked = 12;
		k_ePartyInMatchMaking = 13;
		k_eInMatchmaking = 14;
		k_ePartyFull = 15;
	}

	optional .CMsgClientToGCPartyJoinResponse.EResponse result = 1 [default = k_eInternalError];
}

message CMsgClientToGCPartyAction {
	enum EAction {
		k_eKickUser = 1;
		k_eCancelInvite = 2;
		k_eCancelFindMatch = 3;
		k_eSetPlayerType = 5;
		k_eEnablePartyCode = 7;
		k_eSetMemberTeam = 8;
		k_eSetChatMode = 9;
		k_eSetPlayerSlot = 10;
		k_eSetSearchKey = 12;
		k_eSetBotDifficulty = 13;
		k_eSetRandomizedLanes = 14;
		k_eSetServerRegion = 15;
		k_eSetPubliclyVisible = 16;
		k_eSetCheatsEnabled = 17;
		k_eSwapTeams = 18;
		k_eShuffleLobby = 19;
		k_eShuffleLanes = 20;
		k_eSetDuplicateHeroesEnabled = 21;
		k_eSetDesiresLaningTogether = 23;
		k_eSetMMPreference = 24;
		k_eSetPrivateLobbyGameMode = 25;
	}

	optional fixed64 party_id = 1;
	optional uint32 target_account_id = 2;
	optional .CMsgClientToGCPartyAction.EAction action_id = 3 [default = k_eKickUser];
	optional uint64 uint_value = 4;
	optional bool bool_value = 5;
	optional string str_value = 6;
}

message CMsgClientToGCPartyActionResponse {
	enum EResponse {
		k_eInternalError = 0;
		k_eSuccess = 1;
		k_eInvalidPartyID = 2;
		k_eInvalidPermissions = 3;
		k_eInvalidTarget = 4;
		k_eInvalidValue = 5;
		k_eInMatchMaking = 6;
		k_eInMatch = 7;
		k_eDisabled = 8;
		k_eTooBusy = 9;
		k_eRateLimited = 10;
		k_eCannotChangeWhileReady = 12;
		k_eSlotTaken = 13;
	}

	optional .CMsgClientToGCPartyActionResponse.EResponse result = 1 [default = k_eInternalError];
}

message CMsgClientToGCPartySetMode {
	optional fixed64 party_id = 1;
	optional .ECitadelMatchMode match_mode = 2 [default = k_ECitadelMatchMode_Invalid];
	optional .ECitadelGameMode game_mode = 3 [default = k_ECitadelGameMode_Invalid];
	optional .ECitadelBotDifficulty bot_difficulty = 4 [default = k_ECitadelBotDifficulty_None];
	optional string dev_server_command = 5;
	optional .ECitadelRegionMode region_mode = 6 [default = k_ECitadelRegionMode_ROW];
}

message CMsgClientToGCPartySetModeResponse {
	enum EResponse {
		k_eInternalError = 0;
		k_eSuccess = 1;
		k_eInvalidPartyID = 2;
		k_eInvalidPermissions = 3;
		k_ePlayerPermanentBanned = 4;
		k_eInvalidValue = 5;
		k_eInMatchMaking = 6;
		k_eInMatch = 7;
		k_eDisabled = 8;
		k_eTooBusy = 9;
		k_eRateLimited = 10;
		k_eAlreadyDrafting = 11;
		k_eCannotChangeWhileReady = 12;
		k_eTooFewPlayers = 13;
		k_eTooManyPlayers = 14;
		k_ePlayerBanned = 15;
		k_eTooManyHighMMR = 16;
		k_eFiveStacksNotAllowed = 18;
		k_eRankedMMNotOpen = 19;
		k_eRankedNotunlocked = 20;
		k_eHeroLabsMMNotOpen = 21;
		k_eHeroLabsNotUnlocked = 22;
		k_eNoHeroLabsWhileInLowPri = 23;
		k_eNoHighRangeFiveStack = 24;
		k_eAccountLocked = 25;
	}

	optional .CMsgClientToGCPartySetModeResponse.EResponse result = 1 [default = k_eInternalError];
	optional uint32 time_stamp = 2;
	optional uint32 account_id = 3;
}

message CMsgClientToGCPartyStartMatch {
	optional fixed64 party_id = 1;
}

message CMsgClientToGCPartyStartMatchResponse {
	enum EResponse {
		k_eInternalError = 0;
		k_eSuccess = 1;
		k_eDisabled = 2;
		k_eInvalidPartyID = 3;
		k_eInvalidPermissions = 4;
		k_eTooBusy = 5;
		k_eInMatchmaking = 6;
		k_eInMatch = 7;
		k_eInvalidVersion = 10;
		k_ePlayersNotReady = 11;
		k_eCannotSelectRegion = 12;
		k_eNotAllPlayersAvailable = 13;
		k_eTooManyPlayersForMM = 14;
		k_eTooManyPlayersForPrivate = 15;
		k_eTooManySpectatorsForMM = 16;
		k_eTooManySpectatorsForPrivate = 17;
		k_eTooFewPlayersForMM = 18;
		k_eTooFewPlayersForPrivate = 19;
		k_eMismatchedVersions = 20;
		k_eInvalidPartyMatchMode = 21;
		k_ePlayerBannedFromMode = 22;
		k_eTooManyPlayersOnTeam = 23;
		k_eInvalidTeam = 24;
		k_eInvalidHeroLineup = 25;
		k_eInvalidGroupHeroLineup = 26;
		k_eUnassignedPlayers = 27;
		k_eRankedMMNotOpen = 28;
		k_eHeroLabsMMNotOpen = 29;
		k_eHeroLabsNotUnlocked = 30;
		k_eNoHeroLabsWhileInLowPri = 31;
	}

	optional .CMsgClientToGCPartyStartMatchResponse.EResponse result = 1 [default = k_eInternalError];
	optional uint32 account_id = 2;
}

message CMsgClientToGCPartyInviteUser {
	optional fixed64 party_id = 1;
	optional uint32 invite_account_id = 2;
}

message CMsgClientToGCPartyInviteUserResponse {
	enum EResponse {
		k_eInternalError = 0;
		k_eSuccess = 1;
		k_eAlreadyInvited = 2;
		k_eInvalidPermissions = 3;
		k_eInvalidPartyID = 4;
		k_eDisabled = 5;
		k_eTooManyInvites = 6;
		k_eNotFriends = 7;
		k_eTooBusy = 8;
		k_eRateLimited = 9;
		k_eInvalidPartyMode = 10;
		k_ePlayerDoesntHaveGame = 11;
	}

	optional .CMsgClientToGCPartyInviteUserResponse.EResponse result = 1 [default = k_eInternalError];
	optional bool user_online = 2;
}

message CMsgGCToClientPartyEvent {
	enum EEvent {
		k_ePlayerKicked = 1;
		k_eJoinedParty = 3;
		k_eMatchCompleted = 4;
		k_eMatchMakingStopped_User = 5;
		k_eMatchMakingStopped_Version = 6;
		k_eMatchMakingStopped_NoServerRegion = 7;
		k_eLeftParty = 8;
		k_eDeclinedInvite = 9;
		k_eMatchMakingStopped_FailedOther = 10;
		k_eDraftEnded_User = 11;
		k_eStartDraftMMFailed = 12;
		k_eMatchMakingStopped_Cancelled = 13;
	}

	optional fixed64 party_id = 1;
	optional .CMsgGCToClientPartyEvent.EEvent event = 2 [default = k_ePlayerKicked];
	optional uint32 initiator_account_id = 3;
	optional uint32 target_account_id = 4;
	optional bytes bytes_data = 5;
	optional string str_data = 6;
	optional uint64 uint_data = 7;
}

message CMsgGCToClientCanRejoinParty {
	optional fixed64 party_id = 1;
}

message CMsgClientToGCPartyJoinViaCode {
	optional uint64 join_code = 1;
	optional .CMsgPartyMMInfo party_mm_info = 2;
}

message CMsgClientToGCPartyJoinViaCodeResponse {
	optional .CMsgClientToGCPartyJoinResponse.EResponse result = 1 [default = k_eInternalError];
	optional fixed64 party_id = 2;
}

message CMsgClientToGCPartySetReadyState {
	optional fixed64 party_id = 1;
	optional bool ready_state = 2;
	optional .CMsgHeroSelectionMatchInfo hero_roster = 3;
}

message CMsgClientToGCPartySetReadyStateResponse {
	enum EResponse {
		k_eInternalError = 0;
		k_eSuccess = 1;
		k_eInvalidPermissions = 2;
		k_eDisabled = 3;
		k_eTooBusy = 4;
		k_eRateLimited = 5;
		k_eInvalidRoster = 6;
		k_eMatchForming = 7;
		k_eInvalidGroupRoster = 8;
		k_eInMatch = 9;
		k_eHeroesNotUnlocked = 10;
		k_eModeLocked = 11;
		k_eModeBanned = 12;
		k_eTooManyLimitedHeroes = 13;
	}

	optional .CMsgClientToGCPartySetReadyStateResponse.EResponse result = 1 [default = k_eInternalError];
}

message CMsgClientToGCDevSetMMBias {
	optional uint32 account_id = 1;
	optional uint32 value = 2;
}

message CMsgClientToGCGetMatchHistory {
	optional uint32 account_id = 1;
	optional uint64 continue_cursor = 2;
	optional .ECitadelGameMode game_mode = 4 [default = k_ECitadelGameMode_Invalid];
	optional .ECitadelMatchMode match_mode = 5 [default = k_ECitadelMatchMode_Invalid];
}

message CMsgClientToGCGetMatchHistoryResponse {
	message Match {
		optional uint64 match_id = 1;
		optional uint32 hero_id = 2;
		optional uint32 match_duration_s = 3;
		optional uint32 start_time = 4;
		optional uint32 match_result = 5;
		optional .ECitadelLobbyTeam player_team = 6 [default = k_ECitadelLobbyTeam_Team0];
		optional uint32 player_kills = 7;
		optional uint32 player_deaths = 8;
		optional uint32 player_assists = 9;
		optional uint32 last_hits = 11;
		optional uint32 denies = 12;
		optional uint32 hero_level = 13;
		optional uint32 net_worth = 14;
		optional uint64 objectives_mask_team0 = 15;
		optional uint64 objectives_mask_team1 = 16;
		optional bool team_abandoned = 17;
		optional uint32 abandoned_time_s = 18;
		optional .ECitadelMatchMode match_mode = 19 [default = k_ECitadelMatchMode_Invalid];
		optional .ECitadelGameMode game_mode = 20 [default = k_ECitadelGameMode_Invalid];
		optional bool not_scored = 21;
		optional uint32 game_mode_version = 22;
		optional uint32 brawl_score_team0 = 23;
		optional uint32 brawl_score_team1 = 24;
		optional uint32 brawl_avg_round_time_s = 25;
	}

	enum EResult {
		k_eResult_InternalError = 0;
		k_eResult_Success = 1;
		k_eResult_InvalidPermission = 2;
		k_eResult_TemporarilyDisabled = 3;
		k_eResult_TooBusy = 4;
		k_eResult_RateLimited = 5;
	}

	optional .CMsgClientToGCGetMatchHistoryResponse.EResult result = 1 [default = k_eResult_InternalError];
	optional uint64 continue_cursor = 2;
	repeated .CMsgClientToGCGetMatchHistoryResponse.Match matches = 3;
}

message CMsgClientToGCSpectateUser {
	optional uint32 spectate_account_id = 1;
	optional uint32 client_version = 3;
	optional .EGCPlatform client_platform = 4 [default = k_eGCPlatform_None];
}

message CMsgClientToGCSpectateUserResponse {
	enum EResponse {
		k_eInternalError = 0;
		k_eSuccess = 1;
		k_eDisabled = 2;
		k_eTooBusy = 3;
		k_eRateLimited = 4;
		k_eNotInGame = 5;
		k_eDisabledForGame = 6;
		k_eServerFull = 7;
		k_eNotFriends = 8;
		k_eRegionInfoNotProvided = 9;
		k_eDurationControlBlocked = 10;
		k_eInvalidClientVersion = 11;
		k_eInvalidRegion = 12;
	}

	optional .CMsgClientToGCSpectateUserResponse.EResponse result = 1 [default = k_eInternalError];
	optional fixed64 server_steam_id = 3;
	optional bytes sdr_key = 4;
	optional uint32 udp_connect_ip = 5;
	optional uint32 udp_connect_port = 6;
	optional fixed64 lobby_id = 7;
	optional string client_broadcast_url = 8;
}

message CMsgClientToGCSpectateLobby {
	optional uint64 lobby_id = 1;
	optional uint32 client_version = 3;
	optional .EGCPlatform client_platform = 4 [default = k_eGCPlatform_None];
	optional uint64 match_id = 5;
}

message CMsgClientToGCSpectateLobbyResponse {
	optional .CMsgClientToGCSpectateUserResponse result = 1;
}

message CMsgClientToGCGetProfileCard {
	optional uint32 account_id = 1;
	optional bool dev_access_hint = 2;
	optional bool friend_access_hint = 3;
}

message CMsgCitadelProfileCard {
	message Slot {
		message Stat {
			optional .CMsgCitadelProfileCard.EStatID stat_id = 1 [default = k_eStat_Invalid];
			optional uint32 stat_score = 2;
		}

		message Hero {
			optional uint32 hero_id = 1;
			optional uint32 hero_wins = 2;
			optional uint32 hero_kills = 3;
		}

		optional uint32 slot_id = 1;
		optional .CMsgCitadelProfileCard.Slot.Stat stat = 2;
		optional .CMsgCitadelProfileCard.Slot.Hero hero = 3;
	}

	enum EStatID {
		k_eStat_Invalid = 0;
		k_eStat_Wins = 1;
		k_eStat_Kills = 2;
		k_eStat_GamesPlayed = 3;
	}

	optional uint32 account_id = 1;
	repeated .CMsgCitadelProfileCard.Slot slots = 2;
	optional uint32 ranked_badge_level = 3;
}

message CMsgClientToGCUpdateRoster {
	optional .CMsgHeroSelectionMatchInfo heroes = 1;
	optional .ECitadelGameMode game_mode = 2 [default = k_ECitadelGameMode_Invalid];
	optional .ECitadelMatchMode match_mode = 3 [default = k_ECitadelMatchMode_Invalid];
}

message CMsgClientToGCUpdateRosterResponse {
	enum EResponse {
		k_eInternalError = 0;
		k_eSuccess = 1;
		k_eDisabled = 2;
		k_eTooBusy = 3;
		k_eRateLimited = 4;
		k_eMMBusy = 5;
		k_eInvalidHeroSelection = 6;
		k_eHeroesNotUnlocked = 7;
		k_eNotInMatchmaking = 8;
		k_eInvalidPartyRoster = 9;
	}

	optional .CMsgClientToGCUpdateRosterResponse.EResponse result = 1 [default = k_eInternalError];
}

message CMsgClientToGCGetAccountStats {
	optional uint32 account_id = 1;
	optional bool dev_access_hint = 2;
	optional bool friend_access_hint = 3;
}

message CMsgClientToGCGetAccountStatsResponse {
	enum EResult {
		k_eInternalError = 0;
		k_eSuccess = 1;
		k_eDisabled = 2;
		k_eTooBusy = 3;
		k_eRateLimited = 4;
		k_eInvalidPermissions = 5;
	}

	optional .CMsgClientToGCGetAccountStatsResponse.EResult result = 1 [default = k_eInternalError];
	optional .CMsgAccountStats stats = 2;
}

message CMsgClientToGCGetMatchMetaData {
	optional uint64 match_id = 1;
	optional uint32 metadata_salt = 3;
	optional uint32 target_account_id = 4;
}

message CMsgClientToGCGetMatchMetaDataResponse {
	enum EResult {
		k_eResult_InternalError = 0;
		k_eResult_Success = 1;
		k_eResult_InvalidPermission = 2;
		k_eResult_TemporarilyDisabled = 3;
		k_eResult_TooBusy = 4;
		k_eResult_RateLimited = 5;
		k_eResult_InvalidMatch = 6;
		k_eResult_MatchInFlight = 7;
		k_eResult_Timeout = 8;
	}

	optional .CMsgClientToGCGetMatchMetaDataResponse.EResult result = 1 [default = k_eResult_InternalError];
	optional uint32 replay_salt = 2;
	optional uint32 metadata_salt = 3;
	optional uint32 replay_valid_through = 4;
	optional uint32 replay_group_id = 5;
	optional uint32 replay_processing_through = 6;
}

message CMsgGCToClientDevAnnouncements {
	message Announcement {
		optional uint32 priority = 1;
		optional string title = 2;
		optional string message = 3;
		optional string url = 4;
		optional uint32 unique_id = 5;
		optional uint32 posted_time = 6;
		optional string patch_version = 7;
	}

	repeated .CMsgGCToClientDevAnnouncements.Announcement announcements = 1;
}

message CMsgClientToGCModifyDevAnnouncements {
	enum EOperation {
		k_eCreate = 0;
		k_eUpdate = 1;
		k_eDelete = 2;
	}

	optional .CMsgClientToGCModifyDevAnnouncements.EOperation operation = 1 [default = k_eCreate];
	optional uint32 target_id = 2;
	optional uint32 priority = 3;
	optional string title = 4;
	optional string message = 5;
	optional string url = 6;
	optional string patch_version = 7;
}

message CMsgClientToGCModifyDevAnnouncementsResponse {
	enum EResult {
		k_eSuccess = 0;
		k_eInvalidPermission = 1;
		k_eInvalidTarget = 2;
		k_eInternalError = 3;
	}

	optional .CMsgClientToGCModifyDevAnnouncementsResponse.EResult result = 1 [default = k_eSuccess];
}

message CMsgClientToGCDevAction {
	enum EAction {
		k_eSetDeveloper = 1;
		k_eSetMMR = 2;
		k_eSetMMRUncertainty = 3;
		k_eSetHeroStatus = 4;
		k_eSetPermission = 5;
		k_eSetNewPlayerProgress = 6;
		k_eForceAccountStorage = 7;
		k_eBookReset = 9;
		k_eBookXPGrant = 10;
		k_eBanAccount = 11;
		k_eExonerateAccount = 12;
		k_eRequireAccountInMM = 13;
		k_eResetAccountSurvey = 14;
	}

	optional .CMsgClientToGCDevAction.EAction action = 1 [default = k_eSetDeveloper];
	optional uint32 account_id = 2;
	optional uint32 uint_value = 3;
	optional int32 int_value = 4;
	optional bool bool_value = 5;
	optional string str_value = 6;
	optional uint64 match_id = 7;
}

message CMsgClientToGCDevActionResponse {
	enum EResult {
		k_eSuccess = 0;
		k_eInvalidPermission = 1;
		k_eInvalidTarget = 2;
		k_eInternalError = 3;
	}

	optional .CMsgClientToGCDevActionResponse.EResult result = 1 [default = k_eSuccess];
}

message CMsgClientToGCRecordClientEvents {
	message Event {
		optional uint32 time_stamp = 1;
		optional .ECitadelClientAccountEvent event_id = 2 [default = k_eLaunchedHeroTest];
		optional uint64 event_data = 3;
		optional uint32 client_event_index = 4;
	}

	repeated .CMsgClientToGCRecordClientEvents.Event events = 1;
	optional uint32 client_run_token = 2;
}

message CMsgClientToGCRecordClientEventsResponse {
	optional bool success = 1;
}

message CMsgClientToGCSetNewPlayerProgress {
	optional .ECitadelNewPlayerProgressFlag flag = 1 [default = k_eNewPlayerProgress_GettingStarted];
}

message CMsgClientToGCSetNewPlayerProgressResponse {
	optional bool success = 1;
}

message CMsgClientToGCUpdateAccountSync {
	repeated uint32 ids = 1;
	repeated uint32 values = 2;
}

message CMsgClientToGCUpdateAccountSyncResponse {
	enum EResponse {
		k_eInternalError = 0;
		k_eSuccess = 1;
		k_eDisabled = 2;
		k_eTooBusy = 3;
		k_eInvalidMessage = 4;
	}

	optional .CMsgClientToGCUpdateAccountSyncResponse.EResponse result = 1 [default = k_eInternalError];
}

message CMsgClientToGCGetHeroChoice {
}

message CMsgClientToGCGetHeroChoiceResponse {
	message Hero {
		optional uint32 hero_id = 1;
	}

	enum EResult {
		k_eSuccess = 0;
		k_eNoChoices = 1;
		k_eInvalidTarget = 2;
		k_eInternalError = 3;
		k_eDisabled = 4;
		k_eTooBusy = 5;
		k_eChoiceClosed = 6;
	}

	optional .CMsgClientToGCGetHeroChoiceResponse.EResult result = 1 [default = k_eSuccess];
	repeated .CMsgClientToGCGetHeroChoiceResponse.Hero hero_selections = 2;
	optional uint32 hero_choice_id = 3;
	optional uint32 select_count = 4;
}

message CMsgClientToGCUnlockHero {
	repeated uint32 hero_ids = 1;
	optional uint32 hero_choice_id = 2;
}

message CMsgClientToGCUnlockHeroResponse {
	enum EResult {
		k_eSuccess = 0;
		k_eInternalError = 1;
		k_eInvalidHero = 2;
		k_eOutOfSync = 3;
		k_eDisabled = 4;
		k_eTooBusy = 5;
	}

	optional .CMsgClientToGCUnlockHeroResponse.EResult result = 1 [default = k_eSuccess];
}

message CMsgAccountBook {
	message Unlock {
		optional uint32 unlock_id = 1;
		optional uint32 flags = 2;
	}

	optional uint32 book_id = 1;
	optional uint32 book_xp = 2;
	optional uint32 spent_xp = 3;
	repeated .CMsgAccountBook.Unlock unlocks = 4;
}

message CMsgClientToGCBookUnlock {
	optional uint32 book_id = 1;
	optional uint32 unlock_id = 2;
	optional uint32 expected_cost = 3;
	optional uint32 client_version = 4;
}

message CMsgClientToGCBookUnlockResponse {
	enum EResult {
		k_eSuccess = 0;
		k_eInternalError = 1;
		k_eOutOfDateClient = 2;
		k_eInvalidFunds = 3;
		k_eDisabled = 4;
		k_eTooBusy = 5;
		k_eAlreadyUnlocked = 6;
	}

	optional .CMsgClientToGCBookUnlockResponse.EResult result = 1 [default = k_eSuccess];
	optional .CMsgAccountBook updated_book = 2;
}

message CMsgClientToGCGetBook {
	optional uint32 book_id = 1;
}

message CMsgClientToGCGetBookResponse {
	enum EResult {
		k_eSuccess = 0;
		k_eInternalError = 1;
		k_eInvalidBook = 2;
		k_eDisabled = 3;
		k_eTooBusy = 4;
	}

	optional .CMsgClientToGCGetBookResponse.EResult result = 1 [default = k_eSuccess];
	optional .CMsgAccountBook book = 2;
}

message CMsgGCToClientBookUpdated {
	optional .CMsgAccountBook book = 1;
}

message CMsgClientToGCSubmitPlaytestUser {
	optional string location = 3;
	optional uint32 target_account_id = 4;
}

message CMsgClientToGCSubmitPlaytestUserResponse {
	enum EResponse {
		eResponse_Success = 0;
		eResponse_InternalError = 1;
		eResponse_InvalidFriend = 3;
		eResponse_NotFriendsLongEnough = 4;
		eResponse_AlreadyHasGame = 5;
		eResponse_LimitedUser = 6;
		eResponse_InviteLimitReached = 7;
	}

	optional .CMsgClientToGCSubmitPlaytestUserResponse.EResponse response = 1 [default = eResponse_Success];
}

message CMsgClientToGCUpdateHeroBuild {
	optional .CMsgHeroBuild hero_build = 1;
}

message CMsgClientToGCUpdateHeroBuildResponse {
	enum EResponse {
		k_eInternalError = 0;
		k_eSuccess = 1;
	}

	optional .CMsgClientToGCUpdateHeroBuildResponse.EResponse response = 1 [default = k_eInternalError];
	optional uint32 hero_build_id = 2;
	optional uint32 version = 3;
}

message CMsgClientToGCFindHeroBuilds {
	optional uint32 author_account_id = 1;
	optional uint32 hero_id = 2;
	repeated int32 language = 3;
	optional string search_text = 4;
	optional uint32 hero_build_id = 5;
	repeated uint32 tags = 6;
}

message CMsgClientToGCFindHeroBuildsResponse {
	message HeroBuildResult {
		optional .CMsgHeroBuild hero_build = 1;
		optional .CMsgHeroBuildPreference preference = 2;
		optional uint32 num_favorites = 3;
		optional uint32 num_ignores = 4;
		optional uint32 num_reports = 5;
		optional uint32 num_weekly_favorites = 6;
		optional uint32 num_daily_favorites = 7;
		optional uint32 rollup_category = 8;
	}

	enum EResponse {
		k_eInternalError = 0;
		k_eSuccess = 1;
		k_eTooBusy = 2;
	}

	optional .CMsgClientToGCFindHeroBuildsResponse.EResponse response = 1 [default = k_eInternalError];
	repeated .CMsgClientToGCFindHeroBuildsResponse.HeroBuildResult results = 2;
	optional uint32 build_window_start_time_override = 3;
}

message CMsgClientToGCUpdateHeroBuildPreference {
	optional uint32 hero_build_id = 1;
	optional .CMsgHeroBuildPreference preference = 2;
}

message CMsgClientToGCUpdateHeroBuildPreferenceResponse {
	enum EResponse {
		k_eInternalError = 0;
		k_eSuccess = 1;
	}

	optional .CMsgClientToGCUpdateHeroBuildPreferenceResponse.EResponse response = 1 [default = k_eInternalError];
}

message CMsgClientToGCReportPlayerFromMatch {
	enum EReportType {
		k_eReport_None = 0;
		k_eReport_VoiceChat = 1;
		k_eReport_Griefing = 2;
		k_eReport_LeftMatch = 3;
		k_eReport_Matchmaking = 4;
		k_eReport_Cheating = 5;
		k_eReport_Smurfing = 6;
	}

	optional uint64 match_id = 1;
	optional uint32 target_account_id = 2;
	optional .CMsgClientToGCReportPlayerFromMatch.EReportType report_type = 3 [default = k_eReport_None];
	optional string report_text = 4;
}

message CMsgClientToGCReportPlayerFromMatchResponse {
	enum EResponse {
		k_eInternalError = 0;
		k_eSuccess = 1;
		k_eRateLimited = 2;
		k_eAlreadyReported = 3;
		k_eDisabled = 4;
		k_eInvalidPermissions = 5;
		k_eReportingWindowExpired = 6;
		k_eTooBusy = 7;
		k_eBannedFromReporting = 8;
		k_eTimeout = 9;
	}

	optional .CMsgClientToGCReportPlayerFromMatchResponse.EResponse response = 1 [default = k_eInternalError];
}

message CMsgClientToGCGetAccountMatchReports {
	optional uint64 match_id = 1;
}

message CMsgClientToGCGetAccountMatchReportsResponse {
	message Report {
		optional uint32 account_id = 1;
	}

	message Commend {
		optional uint32 account_id = 1;
	}

	enum EResponse {
		k_eInternalError = 0;
		k_eSuccess = 1;
		k_eDisabled = 4;
		k_eTooBusy = 7;
	}

	optional .CMsgClientToGCGetAccountMatchReportsResponse.EResponse response = 1 [default = k_eInternalError];
	repeated .CMsgClientToGCGetAccountMatchReportsResponse.Report reports = 2;
	repeated .CMsgClientToGCGetAccountMatchReportsResponse.Commend commends = 3;
}

message CMsgClientToGCDeleteHeroBuild {
	optional uint32 author_account_id = 1;
	optional uint32 hero_build_id = 2;
}

message CMsgClientToGCDeleteHeroBuildResponse {
	enum EResponse {
		k_eInternalError = 0;
		k_eSuccess = 1;
	}

	optional .CMsgClientToGCDeleteHeroBuildResponse.EResponse response = 1 [default = k_eInternalError];
	optional uint32 builds_deleted = 2;
}

message CMsgClientToGCGetActiveMatches {
}

message CMsgClientToGCGetActiveMatchesResponse {
	repeated .CMsgDevMatchInfo active_matches = 1;
}

message CMsgClientToGCGetDiscordLink {
}

message CMsgClientToGCGetDiscordLinkResponse {
	enum EResponse {
		k_eInternalError = 0;
		k_eSuccess = 1;
		k_eDiscordTooBusy = 2;
		k_eAlreadyClaimed = 3;
		k_eDisabled = 4;
	}

	optional .CMsgClientToGCGetDiscordLinkResponse.EResponse response = 1 [default = k_eInternalError];
	optional string discord_link = 2;
	optional uint32 valid_hours = 3;
}

message CMsgClientToGCGrantForumAccess {
	optional string email = 1;
}

message CMsgClientToGCGrantForumAccessResponse {
	enum EResponse {
		k_eInternalError = 0;
		k_eSuccess = 1;
		k_eAlreadyClaimed = 2;
		k_eDisabled = 3;
		k_eEmailUsed = 4;
	}

	optional .CMsgClientToGCGrantForumAccessResponse.EResponse response = 1 [default = k_eInternalError];
	optional string email = 2;
	optional string username = 3;
	optional string forum_password = 4;
}

message CMsgClientToGCModeratorRequest {
	optional uint32 account_id = 1;
}

message CMsgClientToGCModeratorRequestResponse {
	optional bool success = 1;
	repeated string response_text = 2;
}

message CMsgClientToGCGetFriendGameStatus {
	optional bool include_invited = 1;
}

message CMsgClientToGCGetFriendGameStatusResponse {
	enum EResponse {
		k_eInternalError = 0;
		k_eSuccess = 1;
		k_eTooBusy = 2;
		k_eDisabled = 3;
	}

	optional .CMsgClientToGCGetFriendGameStatusResponse.EResponse response = 1 [default = k_eInternalError];
	repeated uint32 friends_played_game = 2 [packed = true];
	repeated uint32 friends_invited = 3 [packed = true];
	repeated uint32 friends_invites_sent = 4 [packed = true];
}

message CMsgClientToGCUpdateSpectatorStatus {
	optional fixed64 spectating_lobby_id = 1;
	optional bool stopped_spectating = 2;
}

message CMsgClientToGCCommendPlayerFromMatch {
	optional uint64 match_id = 1;
	optional uint32 target_account_id = 2;
	optional .ECommendType commend_type = 3 [default = k_eInvalid];
	optional uint32 fake_commend_hero_id = 4;
}

message CMsgClientToGCCommendPlayerFromMatchResponse {
	enum EResponse {
		k_eInternalError = 0;
		k_eSuccess = 1;
		k_eDisabled = 2;
		k_eTooBusy = 3;
		k_eRateLimited = 4;
		k_eTimeout = 5;
	}

	optional .CMsgClientToGCCommendPlayerFromMatchResponse.EResponse result = 1 [default = k_eInternalError];
}

message CMsgGCToClientCommendNotification {
	optional uint32 commender_account_id = 1;
	optional string commender_name = 2;
	optional uint32 commender_hero_id = 4;
	optional .ECommendType commend_type = 5 [default = k_eInvalid];
	optional uint64 match_id = 6;
	optional bool enemy_commend = 7;
}

message CMsgClientToGCRequestCheatReports {
}

message CMsgClientToGCRequestCheatReportsResponse {
	message RecentCheatReport {
		optional uint32 account_id = 1;
		optional uint64 match_id = 2;
		optional uint32 hero_id = 3;
	}

	enum EResult {
		k_eSuccess = 0;
		k_eInvalidPermission = 1;
		k_eInternalError = 2;
	}

	optional .CMsgClientToGCRequestCheatReportsResponse.EResult result = 1 [default = k_eSuccess];
	repeated .CMsgClientToGCRequestCheatReportsResponse.RecentCheatReport cheat_reports = 2;
}

message CMsgClientToGCGetHeroMMRRankings {
	optional uint32 target_account_id = 1;
}

message CMsgClientToGCGetHeroMMRRankingsResponse {
	message Hero {
		optional uint32 hero_id = 1;
		optional int32 relative_mmr = 2;
	}

	enum EResult {
		k_eSuccess = 0;
		k_eInvalidPermission = 1;
		k_eInternalError = 2;
		k_eTooBusy = 3;
	}

	optional .CMsgClientToGCGetHeroMMRRankingsResponse.EResult result = 1 [default = k_eSuccess];
	repeated .CMsgClientToGCGetHeroMMRRankingsResponse.Hero heroes = 2;
}

message CMsgClientToGCGetLeaderboard {
	optional .ECitadelLeaderboardRegion leaderboard_region = 1 [default = k_ECitadelLeaderboardRegion_None];
	optional uint32 hero_id = 2;
}

message CMsgClientToGCGetLeaderboardResponse {
	message LeaderboardEntry {
		optional string account_name = 1;
		optional uint32 rank = 2;
		repeated uint32 top_hero_ids = 3;
		optional uint32 badge_level = 4;
	}

	enum EResult {
		k_eSuccess = 0;
		k_eInvalidArguments = 1;
		k_eInternalError = 2;
		k_eTooBusy = 3;
	}

	optional .CMsgClientToGCGetLeaderboardResponse.EResult result = 1 [default = k_eSuccess];
	repeated .CMsgClientToGCGetLeaderboardResponse.LeaderboardEntry entries = 2;
	optional int32 local_player_index = 3 [default = -1];
}

message CMsgClientToGCGetAccountLeaderboards {
	optional uint32 account_id = 1;
}

message CMsgClientToGCGetAccountLeaderboardsResponse {
	message LeaderboardEntry {
		optional .ECitadelLeaderboardRegion region = 1 [default = k_ECitadelLeaderboardRegion_None];
		optional uint32 hero_id = 2;
		optional uint32 rank = 3;
	}

	enum EResult {
		k_eSuccess = 0;
		k_eInvalidPermission = 1;
		k_eInternalError = 2;
		k_eTooBusy = 3;
	}

	optional .CMsgClientToGCGetAccountLeaderboardsResponse.EResult result = 1 [default = k_eSuccess];
	optional string account_name = 2;
	repeated .CMsgClientToGCGetAccountLeaderboardsResponse.LeaderboardEntry entries = 3;
}

message CMsgClientToGCGenerateChallengeSet {
}

message CMsgClientToGCGenerateChallengeSetResponse {
	enum EResult {
		k_eSuccess = 0;
		k_eInternalError = 1;
		k_eChallengeActive = 2;
		k_eChallengeChoiceExists = 3;
	}

	optional .CMsgClientToGCGenerateChallengeSetResponse.EResult result = 1 [default = k_eSuccess];
}

message CMsgClientToGCChallengeActivate {
	optional uint64 challenge_id = 1;
}

message CMsgClientToGCChallengeActivateResponse {
	enum EResult {
		k_eSuccess = 0;
		k_eInternalError = 1;
		k_eInvalidChallenge = 2;
	}

	optional .CMsgClientToGCChallengeActivateResponse.EResult result = 1 [default = k_eSuccess];
}

message CMsgClientToGCChallengeClaim {
	optional uint64 challenge_id = 1;
}

message CMsgClientToGCChallengeClaimResponse {
	enum EResult {
		k_eSuccess = 0;
		k_eInternalError = 1;
		k_eInvalidChallenge = 2;
		k_eChallengeIncomplete = 3;
	}

	optional .CMsgClientToGCChallengeClaimResponse.EResult result = 1 [default = k_eSuccess];
}

message CMsgClientToGCChallengeCancel {
	optional uint64 challenge_id = 1;
}

message CMsgClientToGCChallengeCancelResponse {
	enum EResult {
		k_eSuccess = 0;
		k_eInternalError = 1;
		k_eInvalidChallenge = 2;
		k_eChallengeComplete = 3;
	}

	optional .CMsgClientToGCChallengeCancelResponse.EResult result = 1 [default = k_eSuccess];
}

message CMsgSurveyQuestion {
	enum EQuestionType {
		k_eInvalid = 0;
		k_eItemPower = 1;
		k_eItemDesign = 2;
		k_eHeroPlayAgainst = 3;
		k_eMoreFunHero = 4;
		k_eHeroPower = 5;
		k_eHeroPlayAs = 6;
	}

	optional uint32 question_id = 1;
	optional .CMsgSurveyQuestion.EQuestionType question_type = 2 [default = k_eInvalid];
	repeated uint32 question_params = 3;
	optional uint32 remaining_questions = 4;
	optional uint32 answered_questions = 5;
}

message CMsgClientToGCGetSurveyQuestion {
	optional .CMsgSurveyQuestion.EQuestionType dev_force_new_question_type = 1 [default = k_eInvalid];
}

message CMsgClientToGCGetSurveyQuestionResponse {
	enum EResult {
		k_eSuccess = 0;
		k_eInternalError = 1;
		k_eTooBusy = 2;
	}

	optional .CMsgClientToGCGetSurveyQuestionResponse.EResult result = 1 [default = k_eSuccess];
	optional .CMsgSurveyQuestion question = 2;
}

message CMsgClientToGCSubmitSurvey {
	optional uint32 question_id = 1;
	optional bool is_skip = 2;
	optional uint32 response_value = 3;
	optional .CMsgSurveyQuestion.EQuestionType dev_force_new_question_type = 4 [default = k_eInvalid];
}

message CMsgClientToGCSubmitSurveyResponse {
	enum EResult {
		k_eSuccess = 0;
		k_eInternalError = 1;
		k_eTooBusy = 2;
	}

	optional .CMsgClientToGCSubmitSurveyResponse.EResult result = 1 [default = k_eSuccess];
	optional .CMsgSurveyQuestion question = 2;
}

message CMsgClientToGCGetRankData {
}

message CMsgGCToClientGetRankDataResponse {
	enum EResultCode {
		k_Succeeded = 0;
		k_Failed = 1;
	}

	optional .CMsgGCToClientGetRankDataResponse.EResultCode result = 1 [default = k_Succeeded];
	optional int32 current_rank_confidence = 2;
	optional int32 calibrated_rank_confidence = 3;
	optional bool requires_calibration = 4;
}

message CMsgGCToClientRankDataUpdate {
	optional .CMsgGCToClientGetRankDataResponse rank_info = 2;
}

message CMsgClientToGCRequestHeroReleaseVoteTally {
	repeated uint32 vote_rounds = 1 [packed = true];
}

message CMsgGCToClientUpdateHeroReleaseVoteTally {
	message VoteRoundToTallyEntry {
		optional uint32 key = 1;
		optional .CMsgHeroReleaseVoteTally value = 2;
	}

	repeated .CMsgGCToClientUpdateHeroReleaseVoteTally.VoteRoundToTallyEntry vote_round_to_tally = 1;
}

message CMsgClientToGCSubmitHeroReleaseVote {
	optional uint32 vote_round = 1;
	optional uint32 vote_option = 2;
}

message CMsgClientToGCPartySendChatMsg {
	optional fixed64 party_id = 1;
	optional string chat_msg = 2;
}

message CMsgClientToGCPartySendChatMsgResponse {
	enum EResultCode {
		k_eSuccess = 0;
		k_eInternalError = 1;
		k_eInvalidPermission = 2;
		k_eDisabled = 3;
		k_eRateLimited = 4;
		k_eInvalidMsg = 5;
	}

	optional .CMsgClientToGCPartySendChatMsgResponse.EResultCode result = 1 [default = k_eSuccess];
}

message CMsgGCToClientPartyChatMsg {
	message ChatLine {
		optional uint32 account_id = 1;
		optional string chat_msg = 2;
		optional uint32 time_stamp = 3;
	}

	optional fixed64 party_id = 1;
	repeated .CMsgGCToClientPartyChatMsg.ChatLine chat_lines = 2;
}

message CMsgPostGameProgressData {
	message PlayerAccolade {
		optional uint32 accolade_id = 1;
		optional string accolade_name = 2;
		optional string accolade_desc = 3;
		optional uint32 accolade_stars_achieved = 4;
		optional int32 accolade_stat_value = 5;
	}

	message PlayerAward {
		optional uint32 award_column = 1;
		optional uint32 award_id = 2;
		optional int32 award_value = 3;
		optional uint32 award_rank = 4;
		optional string award_desc = 5;
		optional string award_class = 6;
	}

	message PlayerData {
		optional uint32 player_slot = 1;
		optional uint32 account_id = 2;
		optional uint32 hero_id = 3;
		optional .ECitadelLobbyTeam team = 4 [default = k_ECitadelLobbyTeam_Team0];
		optional uint32 mvp_rank = 5;
		repeated .CMsgPostGameProgressData.PlayerAccolade accolades = 6;
		repeated .CMsgPostGameProgressData.PlayerAward awards = 7;
	}

	optional uint64 match_id = 1;
	optional .ECitadelLobbyTeam winning_team = 2 [default = k_ECitadelLobbyTeam_Team0];
	optional .CMsgPostGameProgressData.PlayerData local_player = 3;
	repeated .CMsgPostGameProgressData.PlayerData mvp_players = 4;
}
