import "steammessages.proto";
import "dota_shared_enums.proto";
import "dota_gcmessages_common.proto";
import "gcsdk_gcmessages.proto";
import "dota_gcmessages_common_match_management.proto";
import "base_gcmessages.proto";

option optimize_for = SPEED;
option cc_generic_services = false;

enum DOTA_WatchReplayType {
	DOTA_WATCH_REPLAY_NORMAL = 0;
	DOTA_WATCH_REPLAY_HIGHLIGHTS = 1;
}

enum EItemEditorReservationResult {
	k_EItemEditorReservationResult_OK = 1;
	k_EItemEditorReservationResult_AlreadyExists = 2;
	k_EItemEditorReservationResult_Reserved = 3;
	k_EItemEditorReservationResult_TimedOut = 4;
}

enum EFeaturedHeroTextField {
	k_EFeaturedHeroTextField_NewHero = 0;
	k_EFeaturedHeroTextField_NewItem = 1;
	k_EFeaturedHeroTextField_ItemSetDescription = 2;
	k_EFeaturedHeroTextField_ItemDescription = 3;
	k_EFeaturedHeroTextField_Hype = 4;
	k_EFeaturedHeroTextField_HeroWinLoss = 5;
	k_EFeaturedHeroTextField_FrequentlyPlayedHero = 6;
	k_EFeaturedHeroTextField_FeaturedItem = 7;
	k_EFeaturedHeroTextField_PopularItem = 8;
	k_EFeaturedHeroTextField_SaleItem = 9;
	k_EFeaturedHeroTextField_SaleDiscount = 10;
	k_EFeaturedHeroTextField_Container = 11;
}

enum EFeaturedHeroDataType {
	k_EFeaturedHeroDataType_HeroID = 0;
	k_EFeaturedHeroDataType_ItemDef = 1;
	k_EFeaturedHeroDataType_HypeString = 2;
	k_EFeaturedHeroDataType_StartTimestamp = 3;
	k_EFeaturedHeroDataType_ExpireTimestamp = 4;
	k_EFeaturedHeroDataType_HeroWins = 5;
	k_EFeaturedHeroDataType_HeroLosses = 6;
	k_EFeaturedHeroDataType_SaleDiscount = 7;
	k_EFeaturedHeroDataType_ContainerItemDef = 8;
}

enum EWeekendTourneyRichPresenceEvent {
	k_EWeekendTourneyRichPresenceEvent_None = 0;
	k_EWeekendTourneyRichPresenceEvent_StartedMatch = 1;
	k_EWeekendTourneyRichPresenceEvent_WonMatch = 2;
	k_EWeekendTourneyRichPresenceEvent_Eliminated = 3;
}

enum EDOTATriviaQuestionCategory {
	k_EDOTATriviaQuestionCategory_AbilityIcon = 0;
	k_EDOTATriviaQuestionCategory_AbilityCooldown = 1;
	k_EDOTATriviaQuestionCategory_HeroAttributes = 2;
	k_EDOTATriviaQuestionCategory_HeroMovementSpeed = 3;
	k_EDOTATriviaQuestionCategory_TalentTree = 4;
	k_EDOTATriviaQuestionCategory_HeroStats = 5;
	k_EDOTATriviaQuestionCategory_ItemPrice = 6;
	k_EDOTATriviaQuestionCategory_AbilitySound = 7;
	k_EDOTATriviaQuestionCategory_InvokerSpells = 8;
	k_EDOTATriviaQuestionCategory_AbilityManaCost = 9;
	k_EDOTATriviaQuestionCategory_HeroAttackSound = 10;
	k_EDOTATriviaQuestionCategory_AbilityName = 11;
	k_EDOTATriviaQuestionCategory_ItemComponents = 12;
	k_EDOTATriviaQuestionCategory_ItemLore = 13;
	k_EDOTATriviaQuestionCategory_ItemPassives = 14;
}

enum EDOTATriviaAnswerResult {
	k_EDOTATriviaAnswerResult_Success = 0;
	k_EDOTATriviaAnswerResult_InvalidQuestion = 1;
	k_EDOTATriviaAnswerResult_InvalidAnswer = 2;
	k_EDOTATriviaAnswerResult_QuestionLocked = 3;
	k_EDOTATriviaAnswerResult_AlreadyAnswered = 4;
	k_EDOTATriviaAnswerResult_TriviaDisabled = 5;
}

enum EPurchaseHeroRelicResult {
	k_EPurchaseHeroRelicResult_Success = 0;
	k_EPurchaseHeroRelicResult_FailedToSend = 1;
	k_EPurchaseHeroRelicResult_NotEnoughPoints = 2;
	k_EPurchaseHeroRelicResult_InternalServerError = 3;
	k_EPurchaseHeroRelicResult_PurchaseNotAllowed = 4;
	k_EPurchaseHeroRelicResult_InvalidRelic = 5;
	k_EPurchaseHeroRelicResult_AlreadyOwned = 6;
}

enum EDevEventRequestResult {
	k_EDevEventRequestResult_Success = 0;
	k_EDevEventRequestResult_NotAllowed = 1;
	k_EDevEventRequestResult_InvalidEvent = 2;
	k_EDevEventRequestResult_SqlFailure = 3;
	k_EDevEventRequestResult_Timeout = 4;
	k_EDevEventRequestResult_LockFailure = 5;
	k_EDevEventRequestResult_SDOLoadFailure = 6;
}

enum ESupportEventRequestResult {
	k_ESupportEventRequestResult_Success = 0;
	k_ESupportEventRequestResult_Timeout = 1;
	k_ESupportEventRequestResult_CantLockSOCache = 2;
	k_ESupportEventRequestResult_ItemNotInInventory = 3;
	k_ESupportEventRequestResult_InvalidItemDef = 4;
	k_ESupportEventRequestResult_InvalidEvent = 5;
	k_ESupportEventRequestResult_EventExpired = 6;
	k_ESupportEventRequestResult_InvalidSupportAccount = 7;
	k_ESupportEventRequestResult_InvalidSupportMessage = 8;
	k_ESupportEventRequestResult_InvalidEventPoints = 9;
	k_ESupportEventRequestResult_InvalidPremiumPoints = 10;
	k_ESupportEventRequestResult_InvalidActionID = 11;
	k_ESupportEventRequestResult_InvalidActionScore = 12;
	k_ESupportEventRequestResult_TransactionFailed = 13;
}

enum ECoachTeammateRating {
	k_ECoachTeammateRating_None = 0;
	k_ECoachTeammateRating_Positive = 1;
	k_ECoachTeammateRating_Negative = 2;
	k_ECoachTeammateRating_Abusive = 3;
}

enum EPlayerCoachMatchFlag {
	k_EPlayerCoachMatchFlag_EligibleForRewards = 1;
}

message CMsgClientSuspended {
	optional uint32 time_end = 1;
}

message CMsgBalancedShuffleLobby {
}

message CMsgInitialQuestionnaireResponse {
	optional uint32 initial_skill = 1;
}

message CMsgDOTAPlayerMatchHistory {
	repeated uint64 match_ids = 1;
}

message CMsgDOTAMatchHistoryFilter {
	repeated uint64 match_ids = 1;
	optional uint64 newest_match_id_at_last_query = 2;
	optional uint32 time_last_query = 3;
}

message CMsgDOTARequestMatches {
	enum SkillLevel {
		Any = 0;
		Normal = 1;
		High = 2;
		VeryHigh = 3;
	}

	optional uint32 hero_id = 2;
	optional uint32 game_mode = 3;
	optional fixed32 date_min = 6;
	optional fixed32 date_max = 7;
	optional uint32 matches_requested = 10;
	optional uint64 start_at_match_id = 11;
	optional fixed32 min_players = 12;
	optional uint32 request_id = 13;
	optional uint32 account_id = 15;
	optional uint32 league_id = 16;
	optional .CMsgDOTARequestMatches.SkillLevel skill = 17 [default = Any];
	optional uint32 team_id = 18;
	optional uint64 custom_game_id = 20;
}

message CMsgDOTARequestMatchesResponse {
	message Series {
		repeated .CMsgDOTAMatch matches = 1;
		optional uint32 series_id = 2;
		optional uint32 series_type = 3;
	}

	repeated .CMsgDOTAMatch matches = 1;
	repeated .CMsgDOTARequestMatchesResponse.Series series = 2;
	optional uint32 request_id = 3;
	optional uint32 total_results = 4;
	optional uint32 results_remaining = 5;
}

message CMsgDOTAGetDPCStandingsResponse {
	message TeamInfo {
		optional uint32 team_id = 1;
		optional string team_name = 2;
		optional uint32 dpc_points = 3;
		optional string team_logo_url = 4;
		optional .CMsgDOTAGetDPCStandingsResponse.EStatus status = 5 [default = DEFAULT];
	}

	enum EStatus {
		DEFAULT = 0;
		CLINCHED = 1;
		ELIMINATED = 2;
	}

	repeated .CMsgDOTAGetDPCStandingsResponse.TeamInfo standings = 1;
}

message CMsgDOTAPopup {
	enum PopupID {
		NONE = -1;
		KICKED_FROM_LOBBY = 0;
		KICKED_FROM_PARTY = 1;
		KICKED_FROM_TEAM = 2;
		TEAM_WAS_DISBANDED = 3;
		TEAM_MATCHMAKE_ALREADY_MATCH = 4;
		TEAM_MATCHMAKE_ALREADY_FINDING = 5;
		TEAM_MATCHMAKE_FULL = 6;
		TEAM_MATCHMAKE_FAIL_ADD = 7;
		TEAM_MATCHMAKE_FAIL_ADD_CURRENT = 8;
		TEAM_MATCHMAKE_FAILED_TEAM_MEMBER = 9;
		TEAM_MATCHMAKE_ALREADY_GAME = 10;
		TEAM_MATCHMAKE_FAIL_GET_PARTY = 11;
		MATCHMAKING_DISABLED = 12;
		INVITE_DENIED = 13;
		PARTY_FULL = 14;
		MADE_ADMIN = 15;
		NEED_TO_PURCHASE = 16;
		SIGNON_MESSAGE = 17;
		GUILD_KICKED = 18;
		MATCHMAKING_REGION_OFFLINE = 19;
		TOURNAMENT_GAME_NOT_FOUND = 21;
		TOURNAMENT_GAME_HAS_LOBBY_ID = 22;
		TOURNAMENT_GAME_HAS_MATCH_ID = 23;
		TOURNAMENT_GAME_HAS_NO_RADIANT_TEAM = 24;
		TOURNAMENT_GAME_HAS_NO_DIRE_TEAM = 25;
		TOURNAMENT_GAME_SQL_UPDATE_FAILED = 26;
		NOT_LEAGUE_ADMIN = 27;
		IN_ANOTHER_GAME = 29;
		PARTY_MEMBER_IN_ANOTHER_GAME = 30;
		PARTY_MEMBER_IN_LOW_PRIORITY = 31;
		CLIENT_OUT_OF_DATE = 32;
		SAVE_GAME_CORRUPT = 38;
		INSUFFICIENT_INGOTS = 39;
		COMPETITIVE_MM_NOT_ENOUGH_PLAY_TIME_PLAY_MORE_CASUAL = 42;
		PARTY_LEADER_JOINED_LOBBY = 44;
		WEEKEND_TOURNEY_UNMATCHED = 48;
		POST_MATCH_SURVEY = 49;
		TROPHY_AWARDED = 50;
		TROPHY_LEVEL_UP = 51;
		ALL_HERO_CHALLENGE_PROGRESS = 52;
		NEED_INITIAL_SKILL = 53;
		NEED_INITIAL_SKILL_IN_PARTY = 54;
		TARGET_ENGINE_MISMATCH = 55;
		VAC_NOT_VERIFIED = 56;
		KICKED_FROM_QUEUE_EVENT_STARTING = 57;
		KICKED_FROM_QUEUE_EVENT_ENDING = 58;
		LOBBY_FULL = 62;
		EVENT_POINTS_EARNED = 63;
		CUSTOM_GAME_INCORRECT_VERSION = 64;
		LIMITED_USER_CHAT = 66;
		EVENT_PREMIUM_POINTS_EARNED = 67;
		LOBBY_MVP_AWARDED = 68;
		LOW_BADGE_LEVEL_CHAT = 71;
		LOW_WINS_CHAT = 72;
		UNVERIFIED_USER_CHAT = 73;
		PARTY_STARTED_FINDING_EVENT_MATCH = 74;
		GENERIC_INFO = 69;
		GENERIC_ERROR = 70;
		RANK_TIER_UPDATED = 75;
		CUSTOM_GAME_COOLDOWN_RESTRICTED = 76;
		CREATE_LOBBY_FAILED_TOO_MUCH_PLAYTIME = 77;
	}

	optional .CMsgDOTAPopup.PopupID id = 1 [default = NONE];
	optional string custom_text = 2;
	optional sint32 int_data = 3;
	optional bytes popup_data = 4;
	optional string loc_token_header = 5;
	optional string loc_token_msg = 6;
	repeated string var_names = 7;
	repeated string var_values = 8;
	optional string debug_text = 9;
}

message CMsgDOTAReportsRemainingRequest {
}

message CMsgDOTAReportsRemainingResponse {
	optional uint32 num_positive_reports_remaining = 1;
	optional uint32 num_negative_reports_remaining = 2;
	optional uint32 num_positive_reports_total = 3;
	optional uint32 num_negative_reports_total = 4;
}

message CMsgDOTASubmitPlayerReport {
	optional uint32 target_account_id = 1;
	optional uint32 report_flags = 2;
	optional uint64 lobby_id = 4;
	optional string comment = 5;
}

message CMsgDOTASubmitPlayerReportResponse {
	optional uint32 target_account_id = 1;
	optional uint32 report_flags = 2;
	optional uint32 result = 3;
	optional string debug_message = 4;
}

message CMsgDOTASubmitPlayerAvoidRequest {
	optional uint32 target_account_id = 1;
	optional uint64 lobby_id = 4;
}

message CMsgDOTASubmitPlayerAvoidRequestResponse {
	optional uint32 target_account_id = 1;
	optional uint32 result = 2;
	optional string debug_message = 3;
}

message CMsgDOTAReportCountsRequest {
	optional uint32 target_account_id = 1;
}

message CMsgDOTAReportCountsResponse {
	optional uint32 target_account_id = 1;
	optional uint32 leadership_count = 2;
	optional uint32 teaching_count = 3;
	optional uint32 friendly_count = 4;
	optional uint32 forgiving_count = 5;
}

message CMsgDOTASubmitLobbyMVPVote {
	optional uint32 target_account_id = 1;
}

message CMsgDOTASubmitLobbyMVPVoteResponse {
	optional uint32 target_account_id = 1;
	optional uint32 eresult = 2;
}

message CMsgDOTALobbyMVPNotifyRecipient {
	optional uint32 voter_account_id = 1;
	optional uint32 recipient_account_id = 2;
	optional uint32 num_votes = 3;
}

message CMsgDOTALobbyMVPAwarded {
	optional uint64 match_id = 1;
	repeated uint32 mvp_account_id = 2;
}

message CMsgDOTAKickedFromMatchmakingQueue {
	optional .MatchType match_type = 1 [default = MATCH_TYPE_CASUAL];
}

message CMsgDOTARequestSaveGames {
	optional uint32 server_region = 1;
}

message CMsgDOTARequestSaveGamesResponse {
	optional fixed64 steam_id = 1;
	repeated .CDOTASaveGame save_games = 2;
}

message CMsgGCMatchDetailsRequest {
	optional uint64 match_id = 1;
}

message CMsgGCMatchDetailsResponse {
	optional uint32 result = 1;
	optional .CMsgDOTAMatch match = 2;
	optional .DOTAMatchVote vote = 3 [default = DOTAMatchVote_INVALID];
}

message CMsgServerToGCMatchDetailsRequest {
	repeated uint64 match_ids = 1;
}

message CMsgGCToServerMatchDetailsResponse {
	repeated .CMsgDOTAMatch matches = 1;
}

message CMsgDOTAProfileTickets {
	message LeaguePass {
		optional uint32 league_id = 1;
		optional uint32 item_def = 2;
	}

	optional uint32 result = 1;
	optional uint32 account_id = 2;
	repeated .CMsgDOTAProfileTickets.LeaguePass league_passes = 3;
}

message CMsgClientToGCGetProfileTickets {
	optional uint32 account_id = 1;
}

message CMsgDOTAClearNotifySuccessfulReport {
}

message CMsgGCToClientPartySearchInvites {
	repeated .CMsgGCToClientPartySearchInvite invites = 1;
}

message CMsgDOTAWelcome {
	message CExtraMsg {
		optional uint32 id = 1;
		optional bytes contents = 2;
	}

	optional uint32 store_item_hash = 5;
	optional uint32 timeplayedconsecutively = 6;
	optional bool allow_3rd_party_match_history = 7;
	optional .PartnerAccountType partner_account_type = 8 [default = PARTNER_NONE];
	optional uint32 partner_account_state = 11;
	optional uint32 last_time_played = 12;
	optional uint32 last_ip_address = 13;
	optional uint32 shutdownlawterminateminutes = 15;
	optional uint32 banned_word_list_version = 16;
	optional bool profile_private = 17;
	optional uint32 currency = 18;
	optional uint32 pwrd_cyber_cafe_id = 19;
	optional bool should_request_player_origin = 20;
	optional uint32 gc_socache_file_version = 22;
	optional bool is_perfect_world_test_account = 24;
	repeated .CMsgDOTAWelcome.CExtraMsg extra_messages = 26;
	optional uint64 minimum_recent_item_id = 27;
	optional .EEvent active_event = 28 [default = EVENT_ID_NONE];
	optional uint32 additional_user_message = 29;
	optional uint32 custom_game_whitelist_version = 30;
	optional .CMsgGCToClientPartySearchInvites party_search_friend_invites = 31;
	optional int32 remaining_playtime = 32 [default = -1];
}

message CSODOTAGameHeroFavorites {
	optional uint32 account_id = 1 [(key_field) = true];
	optional uint32 hero_id = 2 [(key_field) = true];
}

message CMsgDOTAHeroFavoritesAdd {
	optional uint32 hero_id = 1;
}

message CMsgDOTAHeroFavoritesRemove {
	optional uint32 hero_id = 1;
}

message CMsgDOTAFeaturedItems {
	optional uint32 account_id = 1;
	repeated uint64 featured_item_id = 2;
	repeated bytes object_data = 3;
}

message CMsgDOTAMatchVotes {
	message PlayerVote {
		optional uint32 account_id = 1;
		optional uint32 vote = 2;
	}

	optional uint64 match_id = 1;
	repeated .CMsgDOTAMatchVotes.PlayerVote votes = 2;
}

message CMsgCastMatchVote {
	optional uint64 match_id = 1;
	optional .DOTAMatchVote vote = 2 [default = DOTAMatchVote_INVALID];
}

message CMsgRetrieveMatchVote {
	optional uint64 match_id = 1;
	optional uint32 incremental = 2;
}

message CMsgMatchVoteResponse {
	optional uint32 eresult = 1 [default = 2];
	optional .DOTAMatchVote vote = 2 [default = DOTAMatchVote_INVALID];
	optional uint32 positive_votes = 3;
	optional uint32 negative_votes = 4;
}

message CMsgDOTAHallOfFame {
	message FeaturedPlayer {
		optional uint32 account_id = 1;
		optional uint32 hero_id = 2;
		optional float average_scaled_metric = 3;
		optional uint32 num_games = 4;
	}

	message FeaturedFarmer {
		optional uint32 account_id = 1;
		optional uint32 hero_id = 2;
		optional uint32 gold_per_min = 3;
		optional uint64 match_id = 4;
	}

	optional uint32 week = 1;
	repeated .CMsgDOTAHallOfFame.FeaturedPlayer featured_players = 2;
	optional .CMsgDOTAHallOfFame.FeaturedFarmer featured_farmer = 3;
}

message CMsgDOTAHallOfFameRequest {
	optional uint32 week = 1;
}

message CMsgDOTAHallOfFameResponse {
	optional .CMsgDOTAHallOfFame hall_of_fame = 1;
	optional uint32 eresult = 2 [default = 2];
}

message CMsgDOTAHalloweenHighScoreRequest {
	optional int32 round = 1 [default = -1];
}

message CMsgDOTAHalloweenHighScoreResponse {
	optional uint32 score = 1;
	optional .CMsgDOTAMatch match = 2;
	optional uint32 eresult = 3;
	optional int32 round = 4;
}

message CMsgDOTAStorePromoPagesRequest {
	optional uint32 version_seen = 1;
}

message CMsgDOTAStorePromoPagesResponse {
	message PromoPage {
		optional uint32 promo_id = 1;
		optional string title = 2;
		optional string url = 3;
	}

	repeated .CMsgDOTAStorePromoPagesResponse.PromoPage pages = 1;
}

message CMsgMatchmakingMatchGroupInfo {
	optional uint32 players_searching = 1;
	optional sint32 auto_region_select_ping_penalty = 2;
	optional sint32 auto_region_select_ping_penalty_custom = 4;
	optional .EMatchGroupServerStatus status = 3 [default = k_EMatchGroupServerStatus_OK];
}

message CMsgDOTAMatchmakingStatsRequest {
}

message CMsgDOTAMatchmakingStatsResponse {
	optional uint32 matchgroups_version = 1;
	repeated uint32 legacy_searching_players_by_group_source2 = 7;
	repeated .CMsgMatchmakingMatchGroupInfo match_groups = 8;
}

message CMsgDOTAUpdateMatchmakingStats {
	optional .CMsgDOTAMatchmakingStatsResponse stats = 1;
}

message CMsgDOTAUpdateMatchManagementStats {
	optional .CMsgDOTAMatchmakingStatsResponse stats = 1;
}

message CMsgDOTASetMatchHistoryAccess {
	optional bool allow_3rd_party_match_history = 1;
}

message CMsgDOTASetMatchHistoryAccessResponse {
	optional uint32 eresult = 1 [default = 2];
}

message CMsgDOTANotifyAccountFlagsChange {
	optional uint32 accountid = 1;
	optional uint32 account_flags = 2;
}

message CMsgDOTASetProfilePrivacy {
	optional bool profile_private = 1;
}

message CMsgDOTASetProfilePrivacyResponse {
	optional uint32 eresult = 1;
}

message CMsgUpgradeLeagueItem {
	optional uint64 match_id = 1;
	optional uint32 league_id = 2;
}

message CMsgUpgradeLeagueItemResponse {
}

message CMsgGCWatchDownloadedReplay {
	optional uint64 match_id = 1;
	optional .DOTA_WatchReplayType watch_type = 2 [default = DOTA_WATCH_REPLAY_NORMAL];
}

message CMsgSetMapLocationState {
	optional int32 location_id = 1;
	optional bool completed = 2;
}

message CMsgSetMapLocationStateResponse {
	optional uint32 eresult = 1 [default = 2];
}

message CMsgResetMapLocations {
}

message CMsgResetMapLocationsResponse {
	optional uint32 eresult = 1 [default = 2];
}

message CMsgRefreshPartnerAccountLink {
	optional int32 partner_type = 1;
}

message CMsgClientsRejoinChatChannels {
}

message CMsgDOTASendFriendRecruits {
	repeated uint32 recruits = 1;
}

message CMsgDOTAFriendRecruitsRequest {
	repeated uint32 account_ids = 1;
}

message CMsgDOTAFriendRecruitsResponse {
	message FriendRecruitStatus {
		optional uint32 account_id = 1;
		optional uint32 status = 2;
		optional uint32 levels_earned = 3;
		optional bool bonus = 4;
	}

	enum EResult {
		SUCCESS = 0;
		ERROR_UNSPECIFIED = 1;
	}

	optional .CMsgDOTAFriendRecruitsResponse.EResult result = 1 [default = SUCCESS];
	repeated .CMsgDOTAFriendRecruitsResponse.FriendRecruitStatus recruits = 2;
	repeated .CMsgDOTAFriendRecruitsResponse.FriendRecruitStatus recruiters = 3;
}

message CMsgDOTAFriendRecruitInviteAcceptDecline {
	optional bool accepted = 1;
	optional uint32 account_id = 2;
}

message CMsgRequestLeaguePrizePool {
	optional uint32 league_id = 1;
}

message CMsgRequestLeaguePrizePoolResponse {
	optional uint32 league_id = 1;
	optional uint32 prize_pool = 2;
}

message CMsgGCGetHeroStandings {
}

message CMsgGCGetHeroStandingsResponse {
	message Hero {
		optional uint32 hero_id = 1;
		optional uint32 wins = 2;
		optional uint32 losses = 3;
		optional uint32 win_streak = 4;
		optional uint32 best_win_streak = 5;
		optional float avg_kills = 6;
		optional float avg_deaths = 7;
		optional float avg_assists = 8;
		optional float avg_gpm = 9;
		optional float avg_xpm = 10;
		optional uint32 best_kills = 11;
		optional uint32 best_assists = 12;
		optional uint32 best_gpm = 13;
		optional uint32 best_xpm = 14;
		optional float performance = 15;
		optional uint32 wins_with_ally = 16;
		optional uint32 losses_with_ally = 17;
		optional uint32 wins_against_enemy = 18;
		optional uint32 losses_against_enemy = 19;
		optional uint32 networth_peak = 20;
		optional uint32 lasthit_peak = 21;
		optional uint32 deny_peak = 22;
		optional uint32 damage_peak = 23;
		optional uint32 longest_game_peak = 24;
		optional uint32 healing_peak = 25;
		optional float avg_lasthits = 26;
		optional float avg_denies = 27;
	}

	repeated .CMsgGCGetHeroStandingsResponse.Hero standings = 1;
}

message CMsgGCGetHeroTimedStats {
	optional uint32 hero_id = 2;
}

message CMatchPlayerTimedStatAverages {
	optional float kills = 2;
	optional float deaths = 3;
	optional float assists = 4;
	optional float net_worth = 5;
	optional float last_hits = 6;
	optional float denies = 7;
}

message CMsgGCGetHeroTimedStatsResponse {
	message TimedStatsContainer {
		optional uint32 time = 1;
		optional .CMatchPlayerTimedStatAverages all_stats = 2;
		optional .CMatchPlayerTimedStatAverages winning_stats = 3;
		optional .CMatchPlayerTimedStatAverages losing_stats = 4;
	}

	message RankChunkedStats {
		optional uint32 rank_chunk = 1;
		repeated .CMsgGCGetHeroTimedStatsResponse.TimedStatsContainer timed_stats = 2;
	}

	optional uint32 hero_id = 1;
	repeated .CMsgGCGetHeroTimedStatsResponse.RankChunkedStats rank_chunked_stats = 2;
}

message CMsgGCItemEditorReservationsRequest {
}

message CMsgGCItemEditorReservation {
	optional uint32 def_index = 1;
	optional string name = 2;
}

message CMsgGCItemEditorReservationsResponse {
	repeated .CMsgGCItemEditorReservation reservations = 1;
}

message CMsgGCItemEditorReserveItemDef {
	optional uint32 def_index = 1;
	optional string username = 2;
}

message CMsgGCItemEditorReserveItemDefResponse {
	optional uint32 def_index = 1;
	optional string username = 2;
	optional uint32 result = 3;
}

message CMsgGCItemEditorReleaseReservation {
	optional uint32 def_index = 1;
	optional string username = 2;
}

message CMsgGCItemEditorReleaseReservationResponse {
	optional uint32 def_index = 1;
	optional bool released = 2;
}

message CMsgDOTARewardTutorialPrizes {
	optional uint32 location_id = 1;
	optional bool tracking_only = 2;
}

message CMsgDOTALastHitChallengeHighScorePost {
	optional uint32 hero_id = 1;
	optional uint32 high_score = 2;
}

message CMsgDOTALastHitChallengeHighScoreRequest {
	optional uint32 hero_id = 1;
}

message CMsgDOTALastHitChallengeHighScoreResponse {
	optional uint32 score = 1;
	optional uint32 eresult = 2;
}

message CMsgFlipLobbyTeams {
}

message CMsgPresentedClientTerminateDlg {
}

message CMsgGCLobbyUpdateBroadcastChannelInfo {
	optional uint32 channel_id = 1;
	optional string country_code = 2;
	optional string description = 3;
	optional string language_code = 4;
}

message CMsgDOTAClaimEventActionData {
	message GrantItemGiftData {
		optional uint32 give_to_account_id = 1;
		optional string gift_message = 2;
	}

	optional .CMsgDOTAClaimEventActionData.GrantItemGiftData grant_item_gift_data = 4;
}

message CMsgDOTAClaimEventAction {
	optional uint32 event_id = 1;
	optional uint32 action_id = 2;
	optional uint32 quantity = 3;
	optional .CMsgDOTAClaimEventActionData data = 4;
}

message CMsgDOTAClaimEventActionResponse {
	message MysteryItemRewardData {
		optional uint32 item_def = 1;
		optional uint32 item_category = 2;
	}

	message LootListRewardData {
		repeated uint32 item_def = 1;
	}

	message GrantedRewardData {
		optional uint32 grant_index = 1;
		optional uint32 score_index = 2;
		optional uint32 reward_index = 3;
		optional bytes reward_data = 4;
	}

	enum ResultCode {
		Success = 0;
		InvalidEvent = 1;
		EventNotActive = 2;
		InvalidAction = 3;
		ServerError = 4;
		InsufficientPoints = 5;
		InsufficentLevel = 6;
		AlreadyClaimed = 7;
		SDOLockFailure = 8;
		SDOLoadFailure = 9;
		EventNotOwned = 10;
		Timeout = 11;
		RequiresPlusSubscription = 12;
		InvalidItem = 13;
		AsyncRewards = 14;
	}

	optional .CMsgDOTAClaimEventActionResponse.ResultCode result = 1 [default = Success];
	repeated .CMsgDOTAClaimEventActionResponse.GrantedRewardData reward_results = 2;
}

message CMsgClientToGCClaimEventActionUsingItem {
	optional uint32 event_id = 1;
	optional uint32 action_id = 2;
	optional uint64 item_id = 3;
	optional uint32 quantity = 4;
}

message CMsgClientToGCClaimEventActionUsingItemResponse {
	optional .CMsgDOTAClaimEventActionResponse action_results = 1;
}

message CMsgGCToClientClaimEventActionUsingItemCompleted {
	optional uint64 item_id = 1;
	optional .CMsgDOTAClaimEventActionResponse action_results = 2;
}

message CMsgDOTAGetEventPoints {
	optional uint32 event_id = 1;
	optional uint32 account_id = 2;
}

message CMsgDOTAGetEventPointsResponse {
	message Action {
		optional uint32 action_id = 1;
		optional uint32 times_completed = 2 [default = 1];
	}

	optional uint32 total_points = 1;
	optional uint32 total_premium_points = 2;
	optional uint32 event_id = 3;
	optional uint32 points = 4;
	optional uint32 premium_points = 5;
	repeated .CMsgDOTAGetEventPointsResponse.Action completed_actions = 6;
	optional uint32 account_id = 7;
	optional bool owned = 8;
	optional uint32 audit_action = 9;
}

message CMsgDOTAGetPeriodicResource {
	optional uint32 account_id = 1;
	optional uint32 periodic_resource_id = 2;
	optional uint32 timestamp = 3;
}

message CMsgDOTAGetPeriodicResourceResponse {
	optional uint32 periodic_resource_max = 1;
	optional uint32 periodic_resource_used = 2;
}

message CMsgDOTAPeriodicResourceUpdated {
	optional .CMsgDOTAGetPeriodicResource periodic_resource_key = 1;
	optional .CMsgDOTAGetPeriodicResourceResponse periodic_resource_value = 2;
}

message CMsgDOTALiveLeagueGameUpdate {
	optional uint32 live_league_games = 1;
}

message CMsgDOTACompendiumSelection {
	optional uint32 selection_index = 1;
	optional uint32 selection = 2;
	optional uint32 leagueid = 3;
}

message CMsgDOTACompendiumSelectionResponse {
	optional uint32 eresult = 1 [default = 2];
}

message CMsgDOTACompendiumData {
	repeated .CMsgDOTACompendiumSelection selections = 1;
}

message CMsgDOTACompendiumDataRequest {
	optional uint32 account_id = 1;
	optional uint32 leagueid = 2;
}

message CMsgDOTACompendiumDataResponse {
	optional uint32 account_id = 1;
	optional uint32 leagueid = 2;
	optional uint32 result = 3 [default = 2];
	optional .CMsgDOTACompendiumData compendium_data = 4;
}

message CMsgDOTAGetPlayerMatchHistory {
	optional uint32 account_id = 1;
	optional uint64 start_at_match_id = 2;
	optional uint32 matches_requested = 3;
	optional uint32 hero_id = 4;
	optional uint32 request_id = 5;
	optional bool include_practice_matches = 7;
	optional bool include_custom_games = 8;
	optional bool include_event_games = 9;
}

message CMsgDOTAGetPlayerMatchHistoryResponse {
	message Match {
		optional uint64 match_id = 1;
		optional uint32 start_time = 2;
		optional uint32 hero_id = 3;
		optional bool winner = 4;
		optional uint32 game_mode = 5;
		optional int32 rank_change = 6;
		optional uint32 previous_rank = 7;
		optional uint32 lobby_type = 8;
		optional bool solo_rank = 9;
		optional bool abandon = 10;
		optional uint32 duration = 11;
		optional uint32 engine = 12;
		optional bool active_plus_subscription = 13;
		optional bool seasonal_rank = 14;
		optional uint32 tourney_id = 15;
		optional uint32 tourney_round = 16;
		optional uint32 tourney_tier = 17;
		optional uint32 tourney_division = 18;
		optional uint32 team_id = 19;
		optional string team_name = 20;
		optional uint64 ugc_team_ui_logo = 21;
	}

	repeated .CMsgDOTAGetPlayerMatchHistoryResponse.Match matches = 1;
	optional uint32 request_id = 2;
}

message CMsgDOTAStartDailyHeroChallenge {
}

message CMsgGCNotificationsRequest {
}

message CMsgGCNotificationsResponse {
	message Notification {
		optional uint64 id = 1;
		optional uint32 type = 2;
		optional uint32 timestamp = 3;
		optional uint32 reference_a = 4;
		optional uint32 reference_b = 5;
		optional uint32 reference_c = 6;
		optional string message = 7;
		optional bool unread = 8;
	}

	enum EResult {
		SUCCESS = 0;
		ERROR_UNSPECIFIED = 1;
	}

	optional .CMsgGCNotificationsResponse.EResult result = 1 [default = SUCCESS];
	repeated .CMsgGCNotificationsResponse.Notification notifications = 2;
}

message CMsgGCNotificationsMarkReadRequest {
}

message CMsgClientToGCMarkNotificationListRead {
	repeated uint64 notification_ids = 1;
}

message CMsgGCPlayerInfoRequest {
	message PlayerInfo {
		optional uint32 account_id = 1;
		optional uint32 timestamp = 2;
	}

	repeated .CMsgGCPlayerInfoRequest.PlayerInfo player_infos = 1;
}

message CMsgGCPlayerInfoSubmit {
	optional string name = 1;
	optional string country_code = 2;
	optional uint32 fantasy_role = 3;
	optional uint32 team_id = 4;
	optional string sponsor = 5;
}

message CMsgGCPlayerInfoSubmitResponse {
	enum EResult {
		SUCCESS = 0;
		ERROR_UNSPECIFIED = 1;
		ERROR_INFO_LOCKED = 2;
		ERROR_NOT_MEMBER_OF_TEAM = 3;
	}

	optional .CMsgGCPlayerInfoSubmitResponse.EResult result = 1 [default = SUCCESS];
}

message CMsgClientProvideSurveyResult {
	message Response {
		optional uint32 question_id = 1;
		optional uint32 survey_value = 2;
	}

	repeated .CMsgClientProvideSurveyResult.Response responses = 1;
	optional uint64 survey_key = 2;
}

message CMsgDOTAEmoticonAccessSDO {
	optional uint32 account_id = 1;
	optional bytes unlocked_emoticons = 2;
}

message CMsgClientToGCEmoticonDataRequest {
}

message CMsgGCToClientEmoticonData {
	optional .CMsgDOTAEmoticonAccessSDO emoticon_access = 1;
}

message CMsgClientToGCTrackDialogResult {
	optional uint32 dialog_id = 1;
	optional uint32 value = 2;
}

message CMsgGCToClientTournamentItemDrop {
	optional uint32 item_def = 1;
	optional uint32 event_type = 2;
}

message CMsgClientToGCSetAdditionalEquips {
	repeated .CAdditionalEquipSlot equips = 1;
}

message CMsgClientToGCSetAdditionalEquipsResponse {
}

message CMsgClientToGCGetAdditionalEquips {
}

message CMsgClientToGCGetAdditionalEquipsResponse {
	repeated .CAdditionalEquipSlot equips = 1;
}

message CMsgClientToGCGetAllHeroOrder {
}

message CMsgClientToGCGetAllHeroOrderResponse {
	repeated uint32 hero_ids = 1;
}

message CMsgClientToGCGetAllHeroProgress {
	optional uint32 account_id = 1;
}

message CMsgClientToGCGetAllHeroProgressResponse {
	optional uint32 account_id = 1;
	optional uint32 curr_hero_id = 2;
	optional uint32 laps_completed = 3;
	optional uint32 curr_hero_games = 4;
	optional uint32 curr_lap_time_started = 5;
	optional uint32 curr_lap_games = 6;
	optional uint32 best_lap_games = 7;
	optional uint32 best_lap_time = 8;
	optional uint32 lap_heroes_completed = 9;
	optional uint32 lap_heroes_remaining = 10;
	optional uint32 next_hero_id = 11;
	optional uint32 prev_hero_id = 12;
	optional uint32 prev_hero_games = 13;
	optional float prev_avg_tries = 14;
	optional float curr_avg_tries = 15;
	optional float next_avg_tries = 16;
	optional float full_lap_avg_tries = 17;
	optional float curr_lap_avg_tries = 18;
	optional string profile_name = 19;
	optional uint32 start_hero_id = 20;
}

message CMsgClientToGCGetTrophyList {
	optional uint32 account_id = 1;
}

message CMsgClientToGCGetTrophyListResponse {
	message Trophy {
		optional uint32 trophy_id = 1;
		optional uint32 trophy_score = 2;
		optional uint32 last_updated = 3;
	}

	optional uint32 account_id = 1;
	repeated .CMsgClientToGCGetTrophyListResponse.Trophy trophies = 2;
	optional string profile_name = 3;
}

message CMsgGCToClientTrophyAwarded {
	optional uint32 trophy_id = 1;
	optional uint32 trophy_score = 2;
	optional uint32 trophy_old_score = 3;
	optional uint32 last_updated = 4;
}

message CMsgClientToGCGetProfileCard {
	optional uint32 account_id = 1;
}

message CMsgClientToGCSetProfileCardSlots {
	message CardSlot {
		optional uint32 slot_id = 1;
		optional .EProfileCardSlotType slot_type = 2 [default = k_EProfileCardSlotType_Empty];
		optional uint64 slot_value = 3;
	}

	repeated .CMsgClientToGCSetProfileCardSlots.CardSlot slots = 1;
}

message CMsgClientToGCGetProfileCardStats {
}

message CMsgClientToGCCreateHeroStatue {
	optional uint64 source_item = 1;
	optional uint32 hero_id = 3;
	optional string sequence_name = 4;
	optional float cycle = 5;
	repeated uint32 wearables = 6;
	optional string inscription = 7;
	repeated uint32 styles = 8;
	optional uint64 reforger_item = 9;
	optional bool tournament_drop = 10;
}

message CMsgGCToClientHeroStatueCreateResult {
	optional uint64 resulting_item = 1;
}

message CMsgGCToClientEventStatusChanged {
	optional .EEvent active_event = 2 [default = EVENT_ID_NONE];
}

message CMsgClientToGCPlayerStatsRequest {
	optional uint32 account_id = 1;
}

message CMsgGCToClientPlayerStatsResponse {
	optional uint32 account_id = 1;
	repeated float player_stats = 2;
	optional uint32 match_count = 3;
	optional float mean_gpm = 4;
	optional float mean_xppm = 5;
	optional float mean_lasthits = 6;
	optional uint32 rampages = 7;
	optional uint32 triple_kills = 8;
	optional uint32 first_blood_claimed = 9;
	optional uint32 first_blood_given = 10;
	optional uint32 couriers_killed = 11;
	optional uint32 aegises_snatched = 12;
	optional uint32 cheeses_eaten = 13;
	optional uint32 creeps_stacked = 14;
	optional float fight_score = 15;
	optional float farm_score = 16;
	optional float support_score = 17;
	optional float push_score = 18;
	optional float versatility_score = 19;
	optional float mean_networth = 20;
	optional float mean_damage = 21;
	optional float mean_heals = 22;
	optional uint32 rapiers_purchased = 23;
}

message CMsgClientToGCCustomGamePlayerCountRequest {
	optional uint64 custom_game_id = 1;
}

message CMsgGCToClientCustomGamePlayerCountResponse {
	optional uint64 custom_game_id = 1;
	optional uint64 player_count = 2;
	optional uint64 spectator_count = 3;
}

message CMsgClientToGCCustomGamesFriendsPlayedRequest {
}

message CMsgGCToClientCustomGamesFriendsPlayedResponse {
	message CustomGame {
		optional uint64 custom_game_id = 1;
		repeated uint32 account_ids = 2;
	}

	optional uint32 account_id = 1;
	repeated .CMsgGCToClientCustomGamesFriendsPlayedResponse.CustomGame games = 2;
}

message CMsgClientToGCSocialFeedPostCommentRequest {
	optional uint64 event_id = 1;
	optional string comment = 2;
}

message CMsgGCToClientSocialFeedPostCommentResponse {
	optional bool success = 1;
}

message CMsgClientToGCSocialFeedPostMessageRequest {
	optional string message = 1;
	optional uint64 match_id = 2;
	optional uint32 match_timestamp = 3;
}

message CMsgGCToClientSocialFeedPostMessageResponse {
	optional bool success = 1;
}

message CMsgClientToGCFriendsPlayedCustomGameRequest {
	optional uint64 custom_game_id = 1;
}

message CMsgGCToClientFriendsPlayedCustomGameResponse {
	optional uint64 custom_game_id = 1;
	repeated uint32 account_ids = 2;
}

message CMsgClientToGCSocialMatchPostCommentRequest {
	optional uint64 match_id = 1;
	optional string comment = 2;
}

message CMsgGCToClientSocialMatchPostCommentResponse {
	optional bool success = 1;
}

message CMsgClientToGCSocialMatchDetailsRequest {
	optional uint64 match_id = 1;
	optional uint32 pagination_timestamp = 2;
}

message CMsgGCToClientSocialMatchDetailsResponse {
	message Comment {
		optional uint32 account_id = 1;
		optional string persona_name = 2;
		optional uint32 timestamp = 3;
		optional string comment = 4;
	}

	optional bool success = 1;
	repeated .CMsgGCToClientSocialMatchDetailsResponse.Comment comments = 2;
}

message CMsgDOTAPartyRichPresence {
	message Member {
		optional fixed64 steam_id = 1;
		optional bool coach = 2;
	}

	message WeekendTourney {
		optional uint32 division = 1;
		optional uint32 skill_level = 2;
		optional uint32 round = 3;
		optional uint32 tournament_id = 4;
		optional uint32 state_seq_num = 5;
		optional .EWeekendTourneyRichPresenceEvent event = 6 [default = k_EWeekendTourneyRichPresenceEvent_None];
		optional uint32 event_round = 7;
	}

	optional fixed64 party_id = 1;
	optional .CSODOTAParty.State party_state = 2 [default = UI];
	optional bool open = 3;
	optional bool low_priority = 5;
	optional uint32 team_id = 7;
	optional string team_name = 8;
	optional uint64 ugc_team_ui_logo = 9;
	repeated .CMsgDOTAPartyRichPresence.Member members = 4;
	optional .CMsgDOTAPartyRichPresence.WeekendTourney weekend_tourney = 6;
}

message CMsgDOTALobbyRichPresence {
	optional fixed64 lobby_id = 1;
	optional .CSODOTALobby.State lobby_state = 2 [default = UI];
	optional bool password = 3;
	optional .DOTA_GameMode game_mode = 4 [default = DOTA_GAMEMODE_NONE];
	optional uint32 member_count = 5;
	optional uint32 max_member_count = 6;
	optional fixed64 custom_game_id = 7;
	optional string name = 8;
	optional uint32 lobby_type = 9;
}

message CMsgDOTACustomGameListenServerStartedLoading {
	optional fixed64 lobby_id = 1;
	optional uint64 custom_game_id = 2;
	repeated uint32 lobby_members = 3;
	optional uint32 start_time = 4;
}

message CMsgDOTACustomGameClientFinishedLoading {
	optional fixed64 lobby_id = 1;
	optional uint32 loading_duration = 2;
	optional sint32 result_code = 3;
	optional string result_string = 4;
	optional uint32 signon_states = 5;
	optional string comment = 6;
}

message CMsgClientToGCApplyGemCombiner {
	optional uint64 item_id_1 = 1;
	optional uint64 item_id_2 = 2;
}

message CMsgClientToGCH264Unsupported {
}

message CMsgClientToGCRequestH264Support {
}

message CMsgClientToGCGetQuestProgress {
	repeated uint32 quest_ids = 1;
}

message CMsgClientToGCGetQuestProgressResponse {
	message Challenge {
		optional uint32 challenge_id = 1;
		optional uint32 time_completed = 2;
		optional uint32 attempts = 3;
		optional uint32 hero_id = 4;
		optional uint32 template_id = 5;
		optional uint32 quest_rank = 6;
	}

	message Quest {
		optional uint32 quest_id = 1;
		repeated .CMsgClientToGCGetQuestProgressResponse.Challenge completed_challenges = 2;
	}

	optional bool success = 1;
	repeated .CMsgClientToGCGetQuestProgressResponse.Quest quests = 2;
}

message CMsgGCToClientMatchSignedOut {
	optional uint64 match_id = 1;
}

message CMsgGCGetHeroStatsHistory {
	optional uint32 hero_id = 1;
}

message CMsgGCGetHeroStatsHistoryResponse {
	optional uint32 hero_id = 1;
	repeated .CMsgDOTASDOHeroStatsHistory records = 2;
}

message CMsgPlayerConductScorecardRequest {
}

message CMsgPlayerConductScorecard {
	optional uint32 account_id = 1;
	optional uint64 match_id = 2;
	optional uint32 seq_num = 3;
	optional uint32 reasons = 4;
	optional uint32 matches_in_report = 5;
	optional uint32 matches_clean = 6;
	optional uint32 matches_reported = 7;
	optional uint32 matches_abandoned = 8;
	optional uint32 reports_count = 9;
	optional uint32 reports_parties = 10;
	optional uint32 commend_count = 11;
	optional uint32 date = 14;
	optional uint32 behavior_grade = 15;
	optional uint32 raw_behavior_score = 17;
	optional uint32 old_raw_behavior_score = 18;
	optional uint32 comms_reports = 19;
	optional uint32 comms_parties = 20;
}

message CMsgClientToGCWageringRequest {
	optional uint32 event_id = 1;
}

message CMsgGCToClientWageringResponse {
	optional uint32 coins_remaining = 1;
	optional uint32 total_points_won = 2;
	optional uint32 total_points_wagered = 3;
	optional uint32 total_points_tipped = 4;
	optional uint32 success_rate = 5;
	optional uint32 total_games_wagered = 6;
	optional uint32 coins_max = 7;
	optional uint32 rank_wagers_remaining = 8;
	optional uint32 rank_wagers_max = 9;
	optional uint32 prediction_tokens_remaining = 10;
	optional uint32 prediction_tokens_max = 11;
}

message CMsgGCToClientWageringUpdate {
	optional uint32 event_id = 1;
	optional .CMsgGCToClientWageringResponse wagering_info = 2;
}

message CMsgGCToClientArcanaVotesUpdate {
	optional uint32 event_id = 1;
	optional .CMsgClientToGCRequestArcanaVotesRemainingResponse arcana_votes = 2;
}

message CMsgClientToGCGetEventGoals {
	repeated .EEvent event_ids = 1;
}

message CMsgEventGoals {
	message EventGoal {
		optional .EEvent event_id = 1 [default = EVENT_ID_NONE];
		optional uint32 goal_id = 2;
		optional uint64 value = 3;
	}

	repeated .CMsgEventGoals.EventGoal event_goals = 1;
}

message CMsgGCToGCLeaguePredictions {
	optional uint32 league_id = 1;
}

message CMsgPredictionRankings {
	message PredictionLine {
		optional uint32 answer_id = 1;
		optional string answer_name = 2;
		optional uint64 answer_logo = 3;
		optional float answer_value = 4;
	}

	message Prediction {
		optional uint32 selection_id = 1;
		repeated .CMsgPredictionRankings.PredictionLine prediction_lines = 2;
	}

	repeated .CMsgPredictionRankings.Prediction predictions = 1;
}

message CMsgPredictionResults {
	message ResultBreakdown {
		optional uint32 answer_selection = 2;
		optional float answer_value = 3;
	}

	message Result {
		optional uint32 selection_id = 1;
		repeated .CMsgPredictionResults.ResultBreakdown result_breakdown = 2;
	}

	repeated .CMsgPredictionResults.Result results = 1;
}

message CMsgClientToGCSuspiciousActivity {
	optional uint64 app_data = 1;
}

message CMsgClientToGCHasPlayerVotedForMVP {
	optional uint64 match_id = 1;
}

message CMsgClientToGCHasPlayerVotedForMVPResponse {
	optional bool result = 1;
}

message CMsgClientToGCVoteForLeagueGameMVP {
	optional uint64 match_id = 1;
	optional uint32 account_id = 3;
}

message CMsgClientToGCVoteForMVP {
	optional uint64 match_id = 1;
	optional uint32 account_id = 3;
}

message CMsgClientToGCVoteForMVPResponse {
	optional bool result = 1;
}

message CMsgClientToGCMVPVoteTimeout {
	optional uint64 match_id = 1;
}

message CMsgClientToGCMVPVoteTimeoutResponse {
	optional bool result = 1;
}

message CMsgMVPVotesForMatch {
	message Player {
		optional uint32 account_id = 1;
		optional uint32 vote_count = 2;
	}

	repeated .CMsgMVPVotesForMatch.Player players = 1;
}

message CMsgClientToGCTeammateStatsRequest {
}

message CMsgClientToGCTeammateStatsResponse {
	message TeammateStat {
		optional uint32 account_id = 1;
		optional uint32 games = 2;
		optional uint32 wins = 3;
		optional uint32 most_recent_game_timestamp = 4;
		optional uint64 most_recent_game_match_id = 5;
		optional float performance = 100;
	}

	optional bool success = 1;
	repeated .CMsgClientToGCTeammateStatsResponse.TeammateStat teammate_stats = 2;
}

message CMsgClientToGCVoteForArcana {
	repeated .CMsgArcanaVoteMatchVotes matches = 1;
}

message CMsgClientToGCVoteForArcanaResponse {
	enum Result {
		SUCCEEDED = 0;
		VOTING_NOT_ENABLED_FOR_ROUND = 1;
		UNKNOWN_FAILURE = 2;
	}

	optional .CMsgClientToGCVoteForArcanaResponse.Result result = 1 [default = SUCCEEDED];
}

message CMsgArcanaVotes {
	message Match {
		optional uint32 match_id = 1;
		optional uint32 hero_id_0 = 2;
		optional uint32 hero_id_1 = 3;
		optional uint32 hero_seeding_0 = 4;
		optional uint32 hero_seeding_1 = 5;
		optional uint32 vote_count_0 = 6;
		optional uint32 vote_count_1 = 7;
		optional uint32 voting_state = 8;
		optional uint32 round_number = 9;
		optional bool is_votes_hidden = 10;
		optional uint32 calibration_time_remaining = 11;
	}

	enum VotingState {
		FINISHED = 0;
		IN_PROGRESS = 1;
		IN_FUTURE = 2;
	}

	repeated .CMsgArcanaVotes.Match matches = 1;
	optional uint32 round_time_remaining = 2;
	optional uint32 round_number = 3;
	optional uint32 voting_state = 4;
	optional bool is_current_round_calibrating = 5;
	optional uint32 closest_active_match_id = 6;
	optional uint32 event_id = 7;
	optional uint32 voting_start_time = 8;
}

message CMsgClientToGCRequestArcanaVotesRemaining {
}

message CMsgClientToGCRequestArcanaVotesRemainingResponse {
	optional bool result = 1;
	optional uint32 votes_remaining = 2;
	optional uint32 votes_total = 3;
	repeated .CMsgArcanaVoteMatchVotes matches_previously_voted_for = 4;
}

message CMsgClientToGCRequestEventPointLogV2 {
	optional uint32 event_id = 1;
}

message CMsgClientToGCRequestEventPointLogResponseV2 {
	message LogEntry {
		optional uint32 timestamp = 1;
		optional uint32 audit_action = 2;
		optional int32 event_points = 3;
		optional uint64 audit_data = 4;
	}

	optional bool result = 1;
	optional .EEvent event_id = 2 [default = EVENT_ID_NONE];
	repeated .CMsgClientToGCRequestEventPointLogResponseV2.LogEntry log_entries = 3;
}

message CMsgClientToGCPublishUserStat {
	optional uint32 user_stats_event = 1;
	optional uint64 reference_data = 2;
}

message CMsgClientToGCAddTI6TreeProgress {
	optional uint32 trees = 1;
}

message CMsgClientToGCRequestSlarkGameResult {
	optional .EEvent event_id = 1 [default = EVENT_ID_NONE];
	optional uint32 slot_chosen = 2;
	optional uint32 week = 3;
}

message CMsgClientToGCRequestSlarkGameResultResponse {
	optional uint32 points_won = 1;
	optional bool aura_won = 2;
}

message CMsgGCToClientQuestProgressUpdated {
	message Challenge {
		optional uint32 challenge_id = 1;
		optional uint32 time_completed = 2;
		optional uint32 attempts = 3;
		optional uint32 hero_id = 4;
		optional uint32 template_id = 5;
		optional uint32 quest_rank = 6;
		optional uint32 max_quest_rank = 7;
	}

	optional uint32 quest_id = 1;
	repeated .CMsgGCToClientQuestProgressUpdated.Challenge completed_challenges = 2;
}

message CMsgDOTARedeemItem {
	optional uint64 currency_id = 1;
	optional uint32 purchase_def = 2;
}

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

	optional .CMsgDOTARedeemItemResponse.EResultCode response = 1 [default = k_Succeeded];
}

message CMsgPerfectWorldUserLookupRequest {
	optional string user_name = 1;
}

message CMsgPerfectWorldUserLookupResponse {
	enum EResultCode {
		SUCCESS_ACCOUNT_FOUND = 0;
		ERROR_UNKNOWN = 1;
		ERROR_USER_NAME_WRONG_FORMAT = 2;
		ERROR_NO_PERFECT_WORLD_ACCOUNT_FOUND = 3;
		ERROR_NO_LINKED_STEAM_ACCOUNT_FOUND = 4;
	}

	optional .CMsgPerfectWorldUserLookupResponse.EResultCode result_code = 1 [default = SUCCESS_ACCOUNT_FOUND];
	optional uint32 account_id = 2;
}

message CMsgMakeOffering {
	optional uint64 item_id = 1;
}

message CMsgRequestOfferings {
}

message CMsgRequestOfferingsResponse {
	message NewYearsOffering {
		optional uint32 def_index = 1;
		optional uint64 item_id = 2;
	}

	repeated .CMsgRequestOfferingsResponse.NewYearsOffering offerings = 1;
	optional bool completed = 2;
}

message CMsgDOTAPCBangTimedReward {
	optional string persona = 1;
	optional uint32 itemdef = 2;
	optional string pcbangname = 3;
}

message CMsgDOTACompendiumInGamePredictionResults {
	message PredictionResult {
		optional uint32 prediction_id = 1;
		optional uint32 prediction_value = 2;
	}

	repeated .CMsgDOTACompendiumInGamePredictionResults.PredictionResult results = 1;
	optional uint32 league_id = 2;
	optional bool predictions_closed = 3;
}

message CMsgClientToGCSelectCompendiumInGamePrediction {
	message Prediction {
		optional uint32 prediction_id = 1;
		optional uint32 prediction_value = 2;
	}

	optional uint64 match_id = 1;
	repeated .CMsgClientToGCSelectCompendiumInGamePrediction.Prediction predictions = 2;
	optional uint32 league_id = 3;
}

message CMsgClientToGCSelectCompendiumInGamePredictionResponse {
	enum EResult {
		SUCCESS = 0;
		INVALID_MATCH = 1;
		PREDICTIONS_ARE_CLOSED = 2;
		OTHER_ERROR = 3;
	}

	optional .CMsgClientToGCSelectCompendiumInGamePredictionResponse.EResult result = 1 [default = SUCCESS];
}

message CMsgClientToGCOpenPlayerCardPack {
	optional uint64 player_card_pack_item_id = 1;
}

message CMsgClientToGCOpenPlayerCardPackResponse {
	enum Result {
		SUCCESS = 1;
		ERROR_INTERNAL = 2;
		ERROR_FAILED_TO_FIND_PACK = 3;
		ERROR_ITEM_NOT_CARD_PACK = 4;
		ERROR_FAILED_CARD_CREATE = 5;
	}

	optional .CMsgClientToGCOpenPlayerCardPackResponse.Result result = 1 [default = SUCCESS];
	repeated uint64 player_card_item_ids = 2;
}

message CMsgClientToGCRecyclePlayerCard {
	repeated uint64 player_card_item_ids = 3;
	optional uint32 event_id = 2;
}

message CMsgClientToGCRecyclePlayerCardResponse {
	enum Result {
		SUCCESS = 1;
		ERROR_INTERNAL = 2;
		ERROR_FAILED_TO_FIND_PLAYER_CARD = 3;
		ERROR_ITEM_NOT_PLAYER_CARD = 4;
		ERROR_FAILED_DUST_CARD_CREATE = 5;
		ERROR_CARD_LOCKED = 6;
	}

	optional .CMsgClientToGCRecyclePlayerCardResponse.Result result = 1 [default = SUCCESS];
	optional uint32 dust_amount = 2;
}

message CMsgClientToGCCreatePlayerCardPack {
	optional uint64 card_dust_item_id = 1;
	optional uint32 event_id = 2;
	optional bool premium_pack = 3;
}

message CMsgClientToGCCreatePlayerCardPackResponse {
	enum Result {
		SUCCESS = 1;
		ERROR_INTERNAL = 2;
		ERROR_INSUFFICIENT_DUST = 3;
		ERROR_ITEM_NOT_DUST_ITEM = 4;
		ERROR_FAILED_CARD_PACK_CREATE = 5;
	}

	optional .CMsgClientToGCCreatePlayerCardPackResponse.Result result = 1 [default = SUCCESS];
}

message CMsgGCToClientBattlePassRollup_International2016 {
	message Questlines {
		optional string name = 1;
		optional uint32 onestar = 2;
		optional uint32 twostar = 3;
		optional uint32 threestar = 4;
		optional uint32 total = 5;
	}

	message Wagering {
		optional uint32 total_wagered = 1;
		optional uint32 total_won = 2;
		optional uint32 average_won = 3;
		optional uint32 success_rate = 4;
		optional uint32 total_tips = 5;
	}

	message Achievements {
		optional uint32 completed = 1;
		optional uint32 total = 2;
		optional uint32 points = 3;
	}

	message BattleCup {
		optional uint32 wins = 1;
		optional uint32 score = 2;
	}

	message Predictions {
		optional uint32 correct = 1;
		optional uint32 total = 2;
		optional uint32 points = 3;
	}

	message Bracket {
		optional uint32 correct = 1;
		optional uint32 points = 2;
	}

	message PlayerCard {
		optional uint32 account_id = 1;
		optional uint32 quality = 2;
	}

	message FantasyChallenge {
		optional float total_score = 1;
		optional float percentile = 2;
	}

	optional uint32 battle_pass_level = 1;
	repeated .CMsgGCToClientBattlePassRollup_International2016.Questlines questlines = 2;
	optional .CMsgGCToClientBattlePassRollup_International2016.Wagering wagering = 3;
	optional .CMsgGCToClientBattlePassRollup_International2016.Achievements achievements = 4;
	optional .CMsgGCToClientBattlePassRollup_International2016.BattleCup battle_cup = 5;
	optional .CMsgGCToClientBattlePassRollup_International2016.Predictions predictions = 6;
	optional .CMsgGCToClientBattlePassRollup_International2016.Bracket bracket = 7;
	repeated .CMsgGCToClientBattlePassRollup_International2016.PlayerCard player_cards = 8;
	optional .CMsgGCToClientBattlePassRollup_International2016.FantasyChallenge fantasy_challenge = 9;
}

message CMsgGCToClientBattlePassRollup_Fall2016 {
	message Questlines {
		optional string name = 1;
		optional uint32 onestar = 2;
		optional uint32 twostar = 3;
		optional uint32 threestar = 4;
		optional uint32 total = 5;
	}

	message Wagering {
		optional uint32 total_wagered = 1;
		optional uint32 total_won = 2;
		optional uint32 average_won = 3;
		optional uint32 success_rate = 4;
		optional uint32 total_tips = 5;
	}

	message Achievements {
		optional uint32 completed = 1;
		optional uint32 total = 2;
		optional uint32 points = 3;
	}

	message BattleCup {
		optional uint32 wins = 1;
		optional uint32 score = 2;
	}

	message Predictions {
		optional uint32 correct = 1;
		optional uint32 total = 2;
		optional uint32 points = 3;
	}

	message Bracket {
		optional uint32 correct = 1;
		optional uint32 points = 2;
	}

	message PlayerCard {
		optional uint32 account_id = 1;
		optional uint32 quality = 2;
	}

	message FantasyChallenge {
		optional float total_score = 1;
		optional float percentile = 2;
	}

	optional uint32 battle_pass_level = 1;
	repeated .CMsgGCToClientBattlePassRollup_Fall2016.Questlines questlines = 2;
	optional .CMsgGCToClientBattlePassRollup_Fall2016.Wagering wagering = 3;
	optional .CMsgGCToClientBattlePassRollup_Fall2016.Achievements achievements = 4;
	optional .CMsgGCToClientBattlePassRollup_Fall2016.BattleCup battle_cup = 5;
	optional .CMsgGCToClientBattlePassRollup_Fall2016.Predictions predictions = 6;
	optional .CMsgGCToClientBattlePassRollup_Fall2016.Bracket bracket = 7;
	repeated .CMsgGCToClientBattlePassRollup_Fall2016.PlayerCard player_cards = 8;
	optional .CMsgGCToClientBattlePassRollup_Fall2016.FantasyChallenge fantasy_challenge = 9;
}

message CMsgGCToClientBattlePassRollup_Winter2017 {
	message Questlines {
		optional string name = 1;
		optional uint32 onestar = 2;
		optional uint32 twostar = 3;
		optional uint32 threestar = 4;
		optional uint32 total = 5;
	}

	message Wagering {
		optional uint32 total_wagered = 1;
		optional uint32 total_won = 2;
		optional uint32 average_won = 3;
		optional uint32 success_rate = 4;
		optional uint32 total_tips = 5;
	}

	message Achievements {
		optional uint32 completed = 1;
		optional uint32 total = 2;
		optional uint32 points = 3;
	}

	message BattleCup {
		optional uint32 wins = 1;
		optional uint32 score = 2;
	}

	message Predictions {
		optional uint32 correct = 1;
		optional uint32 total = 2;
		optional uint32 points = 3;
	}

	message Bracket {
		optional uint32 correct = 1;
		optional uint32 points = 2;
	}

	message PlayerCard {
		optional uint32 account_id = 1;
		optional uint32 quality = 2;
	}

	message FantasyChallenge {
		optional float total_score = 1;
		optional float percentile = 2;
	}

	optional uint32 battle_pass_level = 1;
	repeated .CMsgGCToClientBattlePassRollup_Winter2017.Questlines questlines = 2;
	optional .CMsgGCToClientBattlePassRollup_Winter2017.Wagering wagering = 3;
	optional .CMsgGCToClientBattlePassRollup_Winter2017.Achievements achievements = 4;
	optional .CMsgGCToClientBattlePassRollup_Winter2017.BattleCup battle_cup = 5;
	optional .CMsgGCToClientBattlePassRollup_Winter2017.Predictions predictions = 6;
	optional .CMsgGCToClientBattlePassRollup_Winter2017.Bracket bracket = 7;
	repeated .CMsgGCToClientBattlePassRollup_Winter2017.PlayerCard player_cards = 8;
	optional .CMsgGCToClientBattlePassRollup_Winter2017.FantasyChallenge fantasy_challenge = 9;
}

message CMsgGCToClientBattlePassRollup_TI7 {
	message Questlines {
		optional string name = 1;
		optional uint32 onestar = 2;
		optional uint32 twostar = 3;
		optional uint32 threestar = 4;
		optional uint32 total = 5;
	}

	message Wagering {
		optional uint32 total_wagered = 1;
		optional uint32 total_won = 2;
		optional uint32 average_won = 3;
		optional uint32 success_rate = 4;
		optional uint32 total_tips = 5;
	}

	message Achievements {
		optional uint32 completed = 1;
		optional uint32 total = 2;
		optional uint32 points = 3;
	}

	message BattleCup {
		optional uint32 wins = 1;
		optional uint32 score = 2;
	}

	message Predictions {
		optional uint32 correct = 1;
		optional uint32 total = 2;
		optional uint32 points = 3;
	}

	message Bracket {
		optional uint32 correct = 1;
		optional uint32 points = 2;
	}

	message PlayerCard {
		optional uint32 account_id = 1;
		optional uint32 quality = 2;
	}

	message FantasyChallenge {
		optional float total_score = 1;
		optional float percentile = 2;
	}

	optional uint32 battle_pass_level = 1;
	repeated .CMsgGCToClientBattlePassRollup_TI7.Questlines questlines = 2;
	optional .CMsgGCToClientBattlePassRollup_TI7.Wagering wagering = 3;
	optional .CMsgGCToClientBattlePassRollup_TI7.Achievements achievements = 4;
	optional .CMsgGCToClientBattlePassRollup_TI7.BattleCup battle_cup = 5;
	optional .CMsgGCToClientBattlePassRollup_TI7.Predictions predictions = 6;
	optional .CMsgGCToClientBattlePassRollup_TI7.Bracket bracket = 7;
	repeated .CMsgGCToClientBattlePassRollup_TI7.PlayerCard player_cards = 8;
	optional .CMsgGCToClientBattlePassRollup_TI7.FantasyChallenge fantasy_challenge = 9;
}

message CMsgGCToClientBattlePassRollup_TI8 {
	message CavernCrawl {
		optional uint32 rooms_cleared = 1;
		optional bool carry_completed = 2;
		optional bool support_completed = 3;
		optional bool utility_completed = 4;
	}

	message Wagering {
		optional uint32 total_wagered = 1;
		optional uint32 total_won = 2;
		optional uint32 average_won = 3;
		optional uint32 success_rate = 4;
		optional uint32 total_tips = 5;
	}

	message Achievements {
		optional uint32 completed = 1;
		optional uint32 total = 2;
		optional uint32 points = 3;
	}

	message Predictions {
		optional uint32 correct = 1;
		optional uint32 total = 2;
		optional uint32 points = 3;
	}

	message Bracket {
		optional uint32 correct = 1;
		optional uint32 points = 2;
	}

	message PlayerCard {
		optional uint32 account_id = 1;
		optional uint32 quality = 2;
	}

	message FantasyChallenge {
		optional float total_score = 1;
		optional float percentile = 2;
	}

	optional uint32 battle_pass_level = 1;
	optional .CMsgGCToClientBattlePassRollup_TI8.CavernCrawl cavern_crawl = 2;
	optional .CMsgGCToClientBattlePassRollup_TI8.Wagering wagering = 3;
	optional .CMsgGCToClientBattlePassRollup_TI8.Achievements achievements = 4;
	optional .CMsgGCToClientBattlePassRollup_TI8.Predictions predictions = 6;
	optional .CMsgGCToClientBattlePassRollup_TI8.Bracket bracket = 7;
	repeated .CMsgGCToClientBattlePassRollup_TI8.PlayerCard player_cards = 8;
	optional .CMsgGCToClientBattlePassRollup_TI8.FantasyChallenge fantasy_challenge = 9;
}

message CMsgGCToClientBattlePassRollup_TI9 {
	optional uint32 battle_pass_level = 1;
}

message CMsgGCToClientBattlePassRollupRequest {
	optional uint32 event_id = 1;
	optional uint32 account_id = 2;
}

message CMsgGCToClientBattlePassRollupResponse {
	optional .CMsgGCToClientBattlePassRollup_International2016 event_ti6 = 1;
	optional .CMsgGCToClientBattlePassRollup_Fall2016 event_fall2016 = 2;
	optional .CMsgGCToClientBattlePassRollup_Winter2017 event_winter2017 = 3;
	optional .CMsgGCToClientBattlePassRollup_TI7 event_ti7 = 4;
	optional .CMsgGCToClientBattlePassRollup_TI8 event_ti8 = 5;
	optional .CMsgGCToClientBattlePassRollup_TI9 event_ti9 = 6;
}

message CMsgGCToClientBattlePassRollupListRequest {
	optional uint32 account_id = 1;
}

message CMsgGCToClientBattlePassRollupListResponse {
	message EventInfo {
		optional uint32 event_id = 1;
		optional uint32 level = 2;
	}

	repeated .CMsgGCToClientBattlePassRollupListResponse.EventInfo event_info = 1;
}

message CMsgClientToGCTransferSeasonalMMRRequest {
	optional bool is_party = 1;
}

message CMsgClientToGCTransferSeasonalMMRResponse {
	optional bool success = 1;
}

message CMsgGCToClientPlaytestStatus {
	optional bool active = 1;
}

message CMsgClientToGCJoinPlaytest {
	optional uint32 client_version = 1;
}

message CMsgClientToGCJoinPlaytestResponse {
	optional string error = 1;
}

message CMsgDOTASetFavoriteTeam {
	optional uint32 team_id = 1;
	optional uint32 event_id = 2;
}

message CMsgDOTATriviaQuestion {
	optional uint32 question_id = 1;
	optional .EDOTATriviaQuestionCategory category = 2 [default = k_EDOTATriviaQuestionCategory_AbilityIcon];
	optional uint32 timestamp = 3;
	optional string question_value = 4;
	repeated string answer_values = 5;
	optional uint32 correct_answer_index = 6;
}

message CMsgDOTATriviaCurrentQuestions {
	repeated .CMsgDOTATriviaQuestion questions = 1;
	optional bool trivia_enabled = 2;
}

message CMsgDOTATriviaQuestionAnswersSummary {
	optional bool summary_available = 1;
	repeated uint32 picked_count = 2;
}

message CMsgDOTASubmitTriviaQuestionAnswer {
	optional uint32 question_id = 1;
	optional uint32 answer_index = 2;
}

message CMsgDOTASubmitTriviaQuestionAnswerResponse {
	optional .EDOTATriviaAnswerResult result = 1 [default = k_EDOTATriviaAnswerResult_Success];
}

message CMsgDOTAStartTriviaSession {
}

message CMsgDOTAStartTriviaSessionResponse {
	optional bool trivia_enabled = 1;
	optional uint32 current_timestamp = 2;
}

message CMsgClientToGCGiveTip {
	optional uint32 recipient_account_id = 1;
	optional uint64 match_id = 2;
	optional uint32 event_id = 3;
}

message CMsgClientToGCGiveTipResponse {
	enum Result {
		SUCCESS = 0;
		ERROR_ALREADY_TIPPED = 1;
		ERROR_INVALID_MATCH_ID = 2;
		ERROR_INVALID_EVENT_ID = 3;
		ERROR_INVALID_MATCH_TIME = 4;
		ERROR_NOT_WINNER = 5;
		ERROR_UNOWNED_EVENT = 6;
		ERROR_INVALID_LOBBY_TYPE = 7;
		ERROR_UNKNOWN = 8;
	}

	optional .CMsgClientToGCGiveTipResponse.Result result = 1 [default = SUCCESS];
}

message CMsgDOTAAnchorPhoneNumberRequest {
}

message CMsgDOTAAnchorPhoneNumberResponse {
	enum Result {
		SUCCESS = 0;
		ERROR_UNKNOWN = 1;
		ERROR_NO_STEAM_PHONE = 2;
		ERROR_ALREADY_IN_USE = 3;
		ERROR_COOLDOWN_ACTIVE = 4;
		ERROR_GAC_ISSUE = 5;
	}

	optional .CMsgDOTAAnchorPhoneNumberResponse.Result result = 1 [default = SUCCESS];
}

message CMsgDOTAUnanchorPhoneNumberRequest {
}

message CMsgDOTAUnanchorPhoneNumberResponse {
	enum Result {
		SUCCESS = 0;
		ERROR_UNKNOWN = 1;
	}

	optional .CMsgDOTAUnanchorPhoneNumberResponse.Result result = 1 [default = SUCCESS];
}

message CMsgGCToClientTipNotification {
	optional uint32 tipper_account_id = 1;
	optional string tipper_name = 2;
	optional uint32 recipient_account_id = 3;
	optional string recipient_name = 4;
	optional uint32 event_id = 5;
}

message CMsgGCToClientCommendNotification {
	optional uint32 commender_account_id = 1;
	optional string commender_name = 2;
	optional uint32 flags = 3;
}

message CMsgGCToClientAllStarVotesRequest {
	optional uint32 event_id = 1;
}

message CMsgGCToClientAllStarVotesReply {
	repeated uint32 player_account_ids = 1;
}

message CMsgGCToClientAllStarVotesSubmit {
	optional uint32 event_id = 1;
	repeated uint32 player_account_ids = 2;
}

message CMsgGCToClientAllStarVotesSubmitReply {
	enum Result {
		SUCCESS = 1;
		ERROR_INTERNAL = 2;
		ERROR_INVALID_EVENT_ID = 3;
		ERROR_INVALID_ACCOUNT_ID = 4;
		ERROR_SELECTIONS_LOCKED = 5;
	}

	optional .CMsgGCToClientAllStarVotesSubmitReply.Result result = 1 [default = SUCCESS];
}

message CMsgDOTAClientToGCQuickStatsRequest {
	optional uint32 player_account_id = 1;
	optional uint32 hero_id = 2;
	optional uint32 item_id = 3;
	optional uint32 league_id = 4;
}

message CMsgDOTAClientToGCQuickStatsResponse {
	message SimpleStats {
		optional float win_percent = 1;
		optional float pick_percent = 2;
		optional uint32 win_count = 3;
		optional uint32 pick_count = 4;
	}

	optional .CMsgDOTAClientToGCQuickStatsRequest original_request = 1;
	optional .CMsgDOTAClientToGCQuickStatsResponse.SimpleStats hero_stats = 2;
	optional .CMsgDOTAClientToGCQuickStatsResponse.SimpleStats item_stats = 3;
	optional .CMsgDOTAClientToGCQuickStatsResponse.SimpleStats item_hero_stats = 4;
	optional .CMsgDOTAClientToGCQuickStatsResponse.SimpleStats item_player_stats = 5;
	optional .CMsgDOTAClientToGCQuickStatsResponse.SimpleStats hero_player_stats = 6;
	optional .CMsgDOTAClientToGCQuickStatsResponse.SimpleStats full_set_stats = 7;
}

message CMsgDOTASelectionPriorityChoiceRequest {
	optional .DOTASelectionPriorityChoice choice = 1 [default = k_DOTASelectionPriorityChoice_Invalid];
}

message CMsgDOTASelectionPriorityChoiceResponse {
	enum Result {
		SUCCESS = 0;
		ERROR_UNKNOWN = 1;
	}

	optional .CMsgDOTASelectionPriorityChoiceResponse.Result result = 1 [default = SUCCESS];
}

message CMsgDOTAGameAutographReward {
	optional string badge_id = 1;
}

message CMsgDOTAGameAutographRewardResponse {
	enum Result {
		SUCCESS = 0;
		ERROR_UNKNOWN = 1;
	}

	optional .CMsgDOTAGameAutographRewardResponse.Result result = 1 [default = SUCCESS];
}

message CMsgDOTADestroyLobbyRequest {
}

message CMsgDOTADestroyLobbyResponse {
	enum Result {
		SUCCESS = 0;
		ERROR_UNKNOWN = 1;
	}

	optional .CMsgDOTADestroyLobbyResponse.Result result = 1 [default = SUCCESS];
}

message CMsgDOTAGetRecentPlayTimeFriendsRequest {
}

message CMsgDOTAGetRecentPlayTimeFriendsResponse {
	repeated fixed32 account_ids = 1;
}

message CMsgPurchaseItemWithEventPoints {
	optional uint32 item_def = 1;
	optional uint32 quantity = 2;
	optional .EEvent event_id = 3 [default = EVENT_ID_NONE];
	optional bool use_premium_points = 4;
}

message CMsgPurchaseItemWithEventPointsResponse {
	enum Result {
		SUCCESS = 0;
		UNKNOWN_EVENT = 1;
		UNKNOWN_ITEM = 2;
		BAD_QUANTITY = 3;
		NOT_PURCHASEABLE = 4;
		SDO_LOAD_FAILED = 5;
		NOT_ENOUGH_POINTS = 6;
		SQL_ERROR = 7;
		FAILED_TO_SEND = 8;
		SERVER_ERROR = 9;
		NOT_ALLOWED = 10;
		CANCELLED = 11;
		CLIENT_ERROR = 12;
	}

	optional .CMsgPurchaseItemWithEventPointsResponse.Result result = 1 [default = SUCCESS];
}

message CMsgGCRequestItemRecommendations {
	optional uint32 mmr = 1;
	optional uint32 hero_id = 2;
	repeated uint32 allied_hero_ids = 3;
	repeated uint32 enemy_hero_ids = 4;
	repeated uint32 inventory_items = 5;
	optional int32 game_time = 6;
	optional uint32 gold = 7;
	optional uint32 net_worth = 8;
}

message CMsgGCRequestItemRecommendationsResponse {
	repeated uint32 recommended_item_ids = 1;
}

message CMsgGCRequestSkillUpRecommendations {
	optional uint32 mmr = 1;
	optional uint32 hero_id = 2;
	repeated uint32 allied_hero_ids = 3;
	repeated uint32 enemy_hero_ids = 4;
	repeated uint32 ability_ids = 5;
}

message CMsgGCRequestSkillUpRecommendationsResponse {
	message AbilitySelection {
		optional uint32 ability_id = 1;
		optional float weight = 2;
	}

	repeated .CMsgGCRequestSkillUpRecommendationsResponse.AbilitySelection abilities = 1;
}

message CMsgClientToGCRecycleHeroRelic {
	repeated uint64 item_ids = 1;
}

message CMsgClientToGCRecycleHeroRelicResponse {
	enum Result {
		SUCCESS = 1;
		ERROR_INTERNAL = 2;
		ERROR_FAILED_TO_FIND_HERO_RELIC = 3;
		ERROR_ITEM_NOT_HERO_RELIC = 4;
		ERROR_FAILED_EVENT_NOT_OWNED = 5;
	}

	optional .CMsgClientToGCRecycleHeroRelicResponse.Result result = 1 [default = SUCCESS];
	optional uint32 dust_amount = 2;
}

message CMsgPurchaseHeroRelic {
	optional uint32 hero_id = 1;
	optional uint32 kill_eater_type = 2;
}

message CMsgPurchaseHeroRelicResponse {
	optional .EPurchaseHeroRelicResult result = 1 [default = k_EPurchaseHeroRelicResult_Success];
}

message CMsgPurchaseHeroRandomRelic {
	optional uint32 hero_id = 1;
}

message CMsgPurchaseHeroRandomRelicResponse {
	optional .EPurchaseHeroRelicResult result = 1 [default = k_EPurchaseHeroRelicResult_Success];
	optional uint32 kill_eater_type = 2;
}

message CMsgClientToGCRequestPlusWeeklyChallengeResult {
	optional .EEvent event_id = 1 [default = EVENT_ID_NONE];
	optional uint32 week = 2;
}

message CMsgClientToGCRequestPlusWeeklyChallengeResultResponse {
}

message CMsgProfileRequest {
	optional uint32 account_id = 1;
}

message CMsgProfileResponse {
	message FeaturedHero {
		optional uint32 hero_id = 1;
		repeated .CSOEconItem equipped_econ_items = 2;
		optional bool manually_set = 3;
		optional uint32 plus_hero_xp = 4;
		optional .CSOEconItem plus_hero_relics_item = 5;
	}

	message MatchInfo {
		optional uint64 match_id = 1;
		optional uint32 match_timestamp = 2;
		optional sint32 performance_rating = 3;
		optional uint32 hero_id = 4;
		optional bool won_match = 5;
	}

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

	optional .CSOEconItem background_item = 1;
	repeated .CMsgProfileResponse.FeaturedHero featured_heroes = 2;
	repeated .CMsgProfileResponse.MatchInfo recent_matches = 3;
	repeated .CMsgSuccessfulHero successful_heroes = 4;
	optional .CMsgRecentMatchInfo recent_match_details = 5;
	optional .CMsgProfileResponse.EResponse result = 6 [default = k_eInternalError];
}

message CMsgProfileUpdate {
	optional uint64 background_item_id = 1;
	repeated uint32 featured_hero_ids = 2;
}

message CMsgProfileUpdateResponse {
	enum Result {
		SUCCESS = 0;
		FAILURE = 1;
	}

	optional .CMsgProfileUpdateResponse.Result result = 1 [default = SUCCESS];
}

message CMsgTalentWinRates {
	optional uint32 last_run = 1;
	optional uint32 ability_id = 2;
	optional uint32 game_count = 3;
	optional uint32 win_count = 4;
}

message CMsgGlobalHeroAverages {
	optional uint32 last_run = 1;
	optional uint32 avg_gold_per_min = 3;
	optional uint32 avg_xp_per_min = 4;
	optional uint32 avg_kills = 5;
	optional uint32 avg_deaths = 6;
	optional uint32 avg_assists = 7;
	optional uint32 avg_last_hits = 8;
	optional uint32 avg_denies = 9;
	optional uint32 avg_net_worth = 10;
}

message CMsgHeroGlobalDataRequest {
	optional uint32 hero_id = 1;
}

message CMsgHeroGlobalDataResponse {
	message GraphData {
		optional uint32 day = 1;
		optional float win_percent = 2;
		optional float pick_percent = 3;
		optional float ban_percent = 4;
	}

	message WeekData {
		optional uint32 week = 1;
		optional float win_percent = 2;
		optional float pick_percent = 3;
		optional float ban_percent = 4;
	}

	message HeroDataPerRankChunk {
		optional uint32 rank_chunk = 1;
		repeated .CMsgTalentWinRates talent_win_rates = 2;
		optional .CMsgGlobalHeroAverages hero_averages = 3;
		repeated .CMsgHeroGlobalDataResponse.GraphData graph_data = 4;
		repeated .CMsgHeroGlobalDataResponse.WeekData week_data = 5;
	}

	optional uint32 hero_id = 1;
	repeated .CMsgHeroGlobalDataResponse.HeroDataPerRankChunk hero_data_per_chunk = 2;
}

message CMsgHeroGlobalDataAllHeroes {
	repeated .CMsgHeroGlobalDataResponse heroes = 1;
}

message CMsgHeroGlobalDataHeroesAlliesAndEnemies {
	message HeroData {
		optional uint32 hero_id = 1;
		optional uint32 win_rate = 2;
		optional uint32 first_other_hero_id = 3;
		repeated uint32 ally_win_rate = 5;
		repeated uint32 enemy_win_rate = 6;
	}

	message RankedHeroData {
		optional uint32 rank = 1;
		repeated .CMsgHeroGlobalDataHeroesAlliesAndEnemies.HeroData hero_data = 2;
	}

	repeated .CMsgHeroGlobalDataHeroesAlliesAndEnemies.RankedHeroData ranked_hero_data = 1;
}

message CMsgPrivateMetadataKeyRequest {
	optional uint64 match_id = 1;
}

message CMsgPrivateMetadataKeyResponse {
	optional uint32 private_key = 1;
}

message CMsgActivatePlusFreeTrialRequest {
}

message CMsgActivatePlusFreeTrialResponse {
	enum Result {
		SUCCESS = 0;
		ERROR_GENERIC = 1;
		ERROR_ALREADY_IN_FREE_TRIAL = 2;
		ERROR_ALREADY_USED_FREE_TRIAL = 3;
		ERROR_OFFER_NOT_VALID = 4;
	}

	optional .CMsgActivatePlusFreeTrialResponse.Result result = 1 [default = SUCCESS];
}

message CMsgGCToClientCavernCrawlMapPathCompleted {
	message CompletedPathInfo {
		optional uint32 path_id_completed = 1;
		optional bool received_ultra_rare_reward = 2;
		optional bool half_completed = 3;
	}

	optional uint32 event_id = 1;
	optional uint32 hero_id_completed = 2;
	repeated .CMsgGCToClientCavernCrawlMapPathCompleted.CompletedPathInfo completed_paths = 3;
	optional uint32 map_variant = 4;
}

message CMsgGCToClientCavernCrawlMapUpdated {
	optional uint32 event_id = 1;
}

message CMsgClientToGCCavernCrawlClaimRoom {
	optional uint32 event_id = 1;
	optional uint32 room_id = 2;
	optional uint32 map_variant = 3;
}

message CMsgClientToGCCavernCrawlClaimRoomResponse {
	enum Result {
		SUCCESS = 0;
		ERROR_UNKNOWN = 1;
		RECEIVED_ULTRA_RARE_REWARD = 2;
	}

	optional .CMsgClientToGCCavernCrawlClaimRoomResponse.Result result = 1 [default = SUCCESS];
}

message CMsgClientToGCCavernCrawlUseItemOnRoom {
	optional uint32 event_id = 1;
	optional uint32 room_id = 2;
	optional uint32 item_type = 3;
	optional uint32 map_variant = 4;
}

message CMsgClientToGCCavernCrawlUseItemOnRoomResponse {
	enum Result {
		SUCCESS = 0;
		ERROR_UNKNOWN = 1;
		RECEIVED_ULTRA_RARE_REWARD = 2;
	}

	optional .CMsgClientToGCCavernCrawlUseItemOnRoomResponse.Result result = 1 [default = SUCCESS];
}

message CMsgClientToGCCavernCrawlUseItemOnPath {
	optional uint32 event_id = 1;
	optional uint32 path_id = 2;
	optional uint32 item_type = 3;
	optional uint32 map_variant = 4;
}

message CMsgClientToGCCavernCrawlUseItemOnPathResponse {
	enum Result {
		SUCCESS = 0;
		ERROR_UNKNOWN = 1;
		RECEIVED_ULTRA_RARE_REWARD = 2;
	}

	optional .CMsgClientToGCCavernCrawlUseItemOnPathResponse.Result result = 1 [default = SUCCESS];
}

message CMsgClientToGCCavernCrawlRequestMapState {
	optional uint32 event_id = 1;
}

message CMsgClientToGCCavernCrawlRequestMapStateResponse {
	message SwappedChallenge {
		optional uint32 path_id_1 = 1;
		optional uint32 path_id_2 = 2;
	}

	message InventoryItem {
		optional uint32 item_type = 1;
		optional uint32 count = 2;
	}

	message TreasureMap {
		optional uint32 map_room_id = 1;
		optional uint32 revealed_room_id = 2;
	}

	message MapVariant {
		optional uint32 map_variant = 1;
		optional fixed64 claimed_rooms_1 = 2;
		optional fixed64 claimed_rooms_2 = 3;
		optional fixed64 revealed_rooms_1 = 4;
		optional fixed64 revealed_rooms_2 = 5;
		optional fixed64 completed_paths_1 = 6;
		optional fixed64 completed_paths_2 = 7;
		optional fixed64 completed_paths_3 = 8;
		optional fixed64 completed_paths_4 = 9;
		optional fixed64 half_completed_paths_1 = 10;
		optional fixed64 half_completed_paths_2 = 11;
		optional fixed64 half_completed_paths_3 = 12;
		optional fixed64 half_completed_paths_4 = 13;
		repeated .CMsgClientToGCCavernCrawlRequestMapStateResponse.SwappedChallenge swapped_challenge = 14;
		optional uint32 ultra_rare_reward_room_number = 15;
		repeated .CMsgClientToGCCavernCrawlRequestMapStateResponse.TreasureMap treasure_map = 16;
	}

	enum Result {
		SUCCESS = 0;
		ERROR_UNKNOWN = 1;
		EVENT_NOT_OWNED = 2;
	}

	optional .CMsgClientToGCCavernCrawlRequestMapStateResponse.Result result = 1 [default = SUCCESS];
	optional uint32 available_map_variants_mask = 2;
	repeated .CMsgClientToGCCavernCrawlRequestMapStateResponse.InventoryItem inventory_item = 3;
	repeated .CMsgClientToGCCavernCrawlRequestMapStateResponse.MapVariant map_variants = 4;
}

message CMsgClientToGCCavernCrawlGetClaimedRoomCount {
	optional uint32 event_id = 1;
}

message CMsgClientToGCCavernCrawlGetClaimedRoomCountResponse {
	message MapVariant {
		optional uint32 map_variant = 1;
		optional uint32 count = 2;
	}

	enum Result {
		SUCCESS = 0;
		ERROR_UNKNOWN = 1;
		EVENT_NOT_OWNED = 2;
	}

	optional .CMsgClientToGCCavernCrawlGetClaimedRoomCountResponse.Result result = 1 [default = SUCCESS];
	repeated .CMsgClientToGCCavernCrawlGetClaimedRoomCountResponse.MapVariant map_variants = 2;
}

message CMsgDOTAMutationList {
	message Mutation {
		optional uint32 id = 1;
		optional string name = 2;
		optional string description = 3;
	}

	repeated .CMsgDOTAMutationList.Mutation mutations = 1;
}

message CMsgEventTipsSummaryRequest {
	optional .EEvent event_id = 1 [default = EVENT_ID_NONE];
	optional uint32 account_id = 2;
}

message CMsgEventTipsSummaryResponse {
	message Tipper {
		optional uint32 tipper_account_id = 1;
		optional uint32 tip_count = 2 [default = 1];
	}

	optional bool result = 1;
	repeated .CMsgEventTipsSummaryResponse.Tipper tips_received = 2;
}

message CMsgSocialFeedRequest {
	optional uint32 account_id = 1;
	optional bool self_only = 2;
}

message CMsgSocialFeedResponse {
	message FeedEvent {
		optional uint64 feed_event_id = 1;
		optional uint32 account_id = 2;
		optional uint32 timestamp = 3;
		optional uint32 comment_count = 4;
		optional uint32 event_type = 5;
		optional uint32 event_sub_type = 6;
		optional uint64 param_big_int_1 = 7;
		optional uint32 param_int_1 = 8;
		optional uint32 param_int_2 = 9;
		optional uint32 param_int_3 = 10;
		optional string param_string = 11;
	}

	enum Result {
		SUCCESS = 0;
		FAILED_TO_LOAD_FRIENDS = 1;
		FAILED_TO_LOAD_FEED_DATA = 2;
		FAILED_TO_LOAD_FEED_ENTRY = 3;
		FAILED_TO_LOAD_COMMENTS = 4;
		FAILED_TOO_MANY_REQUESTS = 5;
	}

	optional .CMsgSocialFeedResponse.Result result = 1 [default = SUCCESS];
	repeated .CMsgSocialFeedResponse.FeedEvent feed_events = 2;
}

message CMsgSocialFeedCommentsRequest {
	optional uint64 feed_event_id = 1;
}

message CMsgSocialFeedCommentsResponse {
	message FeedComment {
		optional uint32 commenter_account_id = 1;
		optional uint32 timestamp = 2;
		optional string comment_text = 3;
	}

	enum Result {
		SUCCESS = 0;
		FAILED_TOO_MANY_REQUESTS = 1;
		FAILED_TO_LOAD_COMMENTS = 2;
	}

	optional .CMsgSocialFeedCommentsResponse.Result result = 1 [default = SUCCESS];
	repeated .CMsgSocialFeedCommentsResponse.FeedComment feed_comments = 3;
}

message CMsgClientToGCPlayerCardSpecificPurchaseRequest {
	optional uint32 player_account_id = 1;
	optional uint32 event_id = 2;
	optional uint64 card_dust_item_id = 3;
}

message CMsgClientToGCPlayerCardSpecificPurchaseResponse {
	enum Result {
		SUCCESS = 1;
		ERROR_INTERNAL = 2;
		ERROR_INSUFFICIENT_DUST = 3;
		ERROR_ITEM_NOT_DUST_ITEM = 4;
		ERROR_FAILED_CARD_PACK_CREATE = 5;
	}

	optional .CMsgClientToGCPlayerCardSpecificPurchaseResponse.Result result = 1 [default = SUCCESS];
	optional uint64 item_id = 2;
}

message CMsgClientToGCRequestContestVotes {
	optional uint32 contest_id = 1;
}

message CMsgClientToGCRequestContestVotesResponse {
	message ItemVote {
		optional uint64 contest_item_id = 1;
		optional int32 vote = 2;
	}

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

	optional .CMsgClientToGCRequestContestVotesResponse.EResponse result = 1 [default = k_eInternalError];
	repeated .CMsgClientToGCRequestContestVotesResponse.ItemVote votes = 2;
}

message CMsgClientToGCRecordContestVote {
	optional uint32 contest_id = 1;
	optional uint64 contest_item_id = 2;
	optional int32 vote = 3;
}

message CMsgGCToClientRecordContestVoteResponse {
	enum EResult {
		SUCCESS = 0;
		FAILED_EVENT_NOT_OWNED = 1;
		FAILED_SQL_INSERT_FAILED = 2;
		FAILED_INVALID_CONTEST = 3;
		FAILED_CONTEST_NOT_ACTIVE = 4;
		FAILED_TIMEOUT = 5;
	}

	optional .CMsgGCToClientRecordContestVoteResponse.EResult eresult = 1 [default = SUCCESS];
}

message CMsgDOTADPCFeed {
	message Element {
		optional .CMsgDOTADPCFeed.EFeedElementType type = 1 [default = FEED_SERIES_RESULT];
		optional uint32 timestamp = 2;
		optional uint32 series_id = 3;
		optional uint64 match_id = 4;
		optional uint32 team_id = 5;
		optional uint32 account_id = 6;
		optional uint32 league_id = 7;
		optional uint32 node_id = 8;
		optional uint64 server_steam_id = 13;
		optional uint32 data_1 = 9;
		optional uint32 data_2 = 10;
		optional uint32 data_3 = 11;
		optional uint32 data_4 = 12;
	}

	enum EFeedElementType {
		FEED_SERIES_RESULT = 1;
		FEED_MATCH_POPULAR = 2;
		FEED_TEAM_UPCOMING_MATCH = 3;
		FEED_TEAM_LEAGUE_RESULT = 4;
		FEED_TEAM_ADD_PLAYER = 5;
		FEED_TEAM_REMOVE_PLAYER = 6;
		FEED_TEAM_DISBAND = 7;
		FEED_LEAGUE_UPCOMING = 8;
		FEED_LEAGUE_CONCLUDED = 9;
		FEED_DPC_STANDINGS = 10;
		FEED_ALERT_PREDICTIONS = 11;
		FEED_ALERT_FANTASY = 12;
		FEED_LEAGUE_LIVE_MATCH = 13;
		FEED_LEAGUE_INPROGRESS_SERIES = 14;
	}

	repeated .CMsgDOTADPCFeed.Element elements = 1;
}

message CMsgDOTADPCUserInfo {
	optional bool is_plus_subscriber = 1;
}

message CMsgDevGrantEventPoints {
	optional .EEvent event_id = 1 [default = EVENT_ID_NONE];
	optional uint32 event_points = 2;
	optional uint32 premium_points = 3;
}

message CMsgDevGrantEventPointsResponse {
	optional .EDevEventRequestResult result = 1 [default = k_EDevEventRequestResult_Success];
}

message CMsgDevGrantEventAction {
	optional .EEvent event_id = 1 [default = EVENT_ID_NONE];
	optional uint32 action_id = 2;
	optional uint32 action_score = 3;
}

message CMsgDevGrantEventActionResponse {
	optional .EDevEventRequestResult result = 1 [default = k_EDevEventRequestResult_Success];
}

message CMsgDevResetEventState {
	optional .EEvent event_id = 1 [default = EVENT_ID_NONE];
	optional bool remove_audit = 2;
}

message CMsgDevResetEventStateResponse {
	optional .EDevEventRequestResult result = 1 [default = k_EDevEventRequestResult_Success];
}

message CMsgConsumeEventSupportGrantItem {
	optional uint64 item_id = 1;
}

message CMsgConsumeEventSupportGrantItemResponse {
	optional .ESupportEventRequestResult result = 1 [default = k_ESupportEventRequestResult_Success];
}

message CMsgClientToGCGetFilteredPlayers {
}

message CMsgGCToClientGetFilteredPlayersResponse {
	message CFilterEntry {
		optional fixed32 account_id = 1;
		optional fixed32 time_added = 2;
		optional fixed32 time_expires = 3;
	}

	enum Result {
		SUCCESS = 0;
		FAILURE = 1;
	}

	optional .CMsgGCToClientGetFilteredPlayersResponse.Result result = 1 [default = SUCCESS];
	repeated .CMsgGCToClientGetFilteredPlayersResponse.CFilterEntry filtered_players = 2;
}

message CMsgClientToGCRemoveFilteredPlayer {
	optional fixed32 account_id_to_remove = 1;
}

message CMsgGCToClientRemoveFilteredPlayerResponse {
	enum Result {
		SUCCESS = 0;
		FAILURE = 1;
	}

	optional .CMsgGCToClientRemoveFilteredPlayerResponse.Result result = 1 [default = SUCCESS];
}

message CMsgPartySearchPlayer {
	optional fixed32 account_id = 1;
	optional fixed64 match_id = 2;
	optional fixed32 creation_time = 3;
}

message CMsgGCToClientPlayerBeaconState {
	repeated int32 num_active_beacons = 1;
}

message CMsgGCToClientPartyBeaconUpdate {
	optional bool beacon_added = 1;
	optional int32 beacon_type = 2;
	optional fixed32 account_id = 3;
}

message CMsgClientToGCUpdatePartyBeacon {
	enum Action {
		ON = 0;
		OFF = 1;
	}

	optional .CMsgClientToGCUpdatePartyBeacon.Action action = 1 [default = ON];
}

message CMsgClientToGCRequestActiveBeaconParties {
}

message CMsgGCToClientRequestActiveBeaconPartiesResponse {
	enum EResponse {
		SUCCESS = 0;
		FAILURE = 1;
		BUSY = 2;
	}

	optional .CMsgGCToClientRequestActiveBeaconPartiesResponse.EResponse response = 1 [default = SUCCESS];
	repeated .CPartySearchClientParty active_parties = 2;
}

message CMsgClientToGCJoinPartyFromBeacon {
	optional fixed64 party_id = 1;
	optional fixed32 account_id = 2;
	optional int32 beacon_type = 3;
}

message CMsgGCToClientJoinPartyFromBeaconResponse {
	enum EResponse {
		SUCCESS = 0;
		FAILURE = 1;
		BUSY = 2;
		NOT_LEADER = 3;
	}

	optional .CMsgGCToClientJoinPartyFromBeaconResponse.EResponse response = 1 [default = SUCCESS];
}

message CMsgClientToGCManageFavorites {
	enum Action {
		ADD = 0;
		REMOVE = 1;
	}

	optional .CMsgClientToGCManageFavorites.Action action = 1 [default = ADD];
	optional fixed32 account_id = 2;
	optional string favorite_name = 3;
	optional bool invite_response = 4;
	optional bool from_friendlist = 5;
	optional fixed64 lobby_id = 6;
}

message CMsgGCToClientManageFavoritesResponse {
	enum EResponse {
		SUCCESS = 0;
		FAILURE = 1;
		NO_INVITE_PRESENT = 2;
		INVITE_SENT = 3;
		EXPIRED = 4;
		BUSY = 5;
	}

	optional .CMsgGCToClientManageFavoritesResponse.EResponse response = 1 [default = SUCCESS];
	optional string debug_message = 2;
	optional .CMsgPartySearchPlayer player = 3;
}

message CMsgClientToGCGetFavoritePlayers {
	optional uint64 pagination_key = 1;
	optional int32 pagination_count = 2;
}

message CMsgGCToClientGetFavoritePlayersResponse {
	enum EResponse {
		SUCCESS = 0;
		FAILURE = 1;
	}

	optional .CMsgGCToClientGetFavoritePlayersResponse.EResponse response = 1 [default = SUCCESS];
	repeated .CMsgPartySearchPlayer players = 2;
	optional uint64 next_pagination_key = 3;
}

message CMsgGCToClientPartySearchInvite {
	optional fixed32 account_id = 1;
}

message CMsgClientToGCVerifyFavoritePlayers {
	repeated fixed32 account_ids = 1;
}

message CMsgGCToClientVerifyFavoritePlayersResponse {
	message Result {
		optional .CMsgPartySearchPlayer player = 1;
		optional bool is_favorite = 2;
	}

	repeated .CMsgGCToClientVerifyFavoritePlayersResponse.Result results = 1;
}

message CMsgClientToGCRequestPlayerRecentAccomplishments {
	optional uint32 account_id = 1;
}

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

	optional .CMsgClientToGCRequestPlayerRecentAccomplishmentsResponse.EResponse result = 1 [default = k_eInternalError];
	optional .CMsgPlayerRecentAccomplishments player_accomplishments = 2;
}

message CMsgClientToGCRequestPlayerHeroRecentAccomplishments {
	optional uint32 account_id = 1;
	optional uint32 hero_id = 2;
}

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

	optional .CMsgClientToGCRequestPlayerHeroRecentAccomplishmentsResponse.EResponse result = 1 [default = k_eInternalError];
	optional .CMsgPlayerHeroRecentAccomplishments hero_accomplishments = 2;
}

message CMsgPlayerCoachMatch {
	optional uint64 match_id = 1;
	optional .EMatchOutcome match_outcome = 2 [default = k_EMatchOutcome_Unknown];
	optional uint32 coached_team = 3;
	optional fixed32 start_time = 4;
	optional uint32 duration = 5;
	repeated .ECoachTeammateRating teammate_ratings = 6;
	optional uint32 coach_flags = 7;
}

message CMsgClientToGCRequestPlayerCoachMatches {
}

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

	optional .CMsgClientToGCRequestPlayerCoachMatchesResponse.EResponse result = 1 [default = k_eInternalError];
	repeated .CMsgPlayerCoachMatch coach_matches = 2;
}

message CMsgClientToGCRequestPlayerCoachMatch {
	optional uint64 match_id = 1;
}

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

	optional .CMsgClientToGCRequestPlayerCoachMatchResponse.EResponse result = 1 [default = k_eInternalError];
	optional .CMsgPlayerCoachMatch coach_match = 2;
}

message CMsgClientToGCSubmitCoachTeammateRating {
	optional uint64 match_id = 1;
	optional uint32 coach_account_id = 2;
	optional .ECoachTeammateRating rating = 3 [default = k_ECoachTeammateRating_None];
	optional string reason = 4;
}

message CMsgClientToGCSubmitCoachTeammateRatingResponse {
	enum EResponse {
		k_eInternalError = 0;
		k_eSuccess = 1;
		k_eTooBusy = 2;
		k_eDisabled = 3;
		k_eInvalidInput = 4;
		k_eAlreadySubmitted = 5;
		k_eVotingFinished = 6;
		k_ePlayerNotInMatch = 7;
		k_eCoachNotInMatch = 8;
		k_ePlayerNotOnCoachTeam = 9;
		k_ePlayerInSamePartyAsCoach = 10;
		k_eMatchNotEligible = 11;
	}

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

message CMsgGCToClientCoachTeammateRatingsChanged {
	optional .CMsgPlayerCoachMatch coach_match = 1;
}

message CMsgClientToGCSubmitPlayerMatchSurvey {
	optional uint64 match_id = 1;
	optional sint32 rating = 3;
	optional uint32 flags = 4;
}

message CMsgClientToGCSubmitPlayerMatchSurveyResponse {
	enum EResponse {
		k_eInternalError = 0;
		k_eSuccess = 1;
		k_eTooBusy = 2;
		k_eDisabled = 3;
		k_eAlreadySubmitted = 4;
		k_ePlayerNotValid = 5;
	}

	optional .CMsgClientToGCSubmitPlayerMatchSurveyResponse.EResponse eresult = 1 [default = k_eInternalError];
	optional uint32 account_id = 2;
}

message CMsgClientToGCGetTicketCodesRequest {
	repeated uint32 ticket_pool_ids = 1;
}

message CMsgClientToGCGetTicketCodesResponse {
	message Code {
		optional uint32 ticket_pool_id = 1;
		optional string code = 2;
		optional bool account_disallowed = 3;
	}

	repeated .CMsgClientToGCGetTicketCodesResponse.Code codes = 1;
}

message CMsgClientToGCSetFavoriteAllStarPlayer {
	optional uint32 player_id = 1;
	optional uint32 event_id = 2;
}

message CMsgClientToGCSetFavoriteAllStarPlayerResponse {
	enum EResponse {
		k_eInternalError = 0;
		k_eSuccess = 1;
		k_eTooBusy = 2;
		k_eDisabled = 3;
		k_eAlreadySubmitted = 4;
		k_ePlayerNotValid = 5;
		k_eDoesntOwnEvent = 6;
		k_eEventNotValid = 7;
	}

	optional .CMsgClientToGCSetFavoriteAllStarPlayerResponse.EResponse result = 1 [default = k_eInternalError];
	optional uint32 player_id = 2;
}

message CMsgClientToGCGetFavoriteAllStarPlayerRequest {
}

message CMsgClientToGCGetFavoriteAllStarPlayerResponse {
	enum EResponse {
		k_eSuccess = 0;
		k_eNoPick = 1;
		k_eInternalError = 2;
	}

	optional .CMsgClientToGCGetFavoriteAllStarPlayerResponse.EResponse result = 1 [default = k_eSuccess];
	optional uint32 player_id = 2;
	optional uint32 picking_allowed_until = 3;
	optional uint32 earned_battle_points = 4;
}

message CMsgClientToGCVerifyIntegrity {
	optional uint32 currency = 1;
	optional uint32 additional_user_message = 2;
	optional bytes acked = 3;
}

message CMsgGCToClientVACReminder {
}

message CMsgClientToGCPullTabsRequest {
	optional uint32 event_id = 1;
}

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

	optional .CMsgGCToClientPullTabsResponse.EResponse result = 1 [default = k_eInternalError];
	optional .CMsgPullTabsData data = 2;
}

message CMsgClientToGCPullTabsRedeem {
	optional uint32 event_id = 1;
	optional uint32 board_id = 2;
	optional uint32 hero_id = 3;
}

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

	optional .CMsgGCToClientPullTabsRedeemResponse.EResponse result = 1 [default = k_eInternalError];
	optional uint32 event_id = 2;
	optional uint32 board_id = 3;
	optional uint32 hero_id = 4;
	optional uint32 action_id = 5;
}
