From 40ab40eef2e45fd7c9cc0793246852c80ae18c95 Mon Sep 17 00:00:00 2001 From: Ali Sharoz Date: Tue, 10 Dec 2024 16:35:04 +0500 Subject: [PATCH] UI Update --- Assets/LeaderBoard.meta | 8 + Assets/LeaderBoard/Blue Badge.meta | 8 + Assets/LeaderBoard/Blue Badge/2nd Badge.png | Bin 0 -> 21244 bytes .../LeaderBoard/Blue Badge/2nd Badge.png.meta | 140 + Assets/LeaderBoard/Blue Badge/2nd.png | Bin 0 -> 9494 bytes Assets/LeaderBoard/Blue Badge/2nd.png.meta | 140 + .../LeaderBoard/Blue Badge/Player Icon BG.png | Bin 0 -> 5929 bytes .../Blue Badge/Player Icon BG.png.meta | 140 + Assets/LeaderBoard/Blue Badge/Player Icon.png | Bin 0 -> 16619 bytes .../Blue Badge/Player Icon.png.meta | 140 + Assets/LeaderBoard/Blue Badge/Score BG.png | Bin 0 -> 2359 bytes .../LeaderBoard/Blue Badge/Score BG.png.meta | 140 + Assets/LeaderBoard/Blue Badge/silver.png | Bin 0 -> 12476 bytes Assets/LeaderBoard/Blue Badge/silver.png.meta | 140 + Assets/LeaderBoard/Game Stats Btn.png | Bin 0 -> 19124 bytes Assets/LeaderBoard/Game Stats Btn.png.meta | 140 + Assets/LeaderBoard/Greeen Badge.meta | 8 + Assets/LeaderBoard/Greeen Badge/3rd Badge.png | Bin 0 -> 23325 bytes .../Greeen Badge/3rd Badge.png.meta | 140 + Assets/LeaderBoard/Greeen Badge/3rd.png | Bin 0 -> 10669 bytes Assets/LeaderBoard/Greeen Badge/3rd.png.meta | 140 + .../Greeen Badge/Player Icon BG.png | Bin 0 -> 5893 bytes .../Greeen Badge/Player Icon BG.png.meta | 140 + .../LeaderBoard/Greeen Badge/Player Icon.png | Bin 0 -> 16619 bytes .../Greeen Badge/Player Icon.png.meta | 140 + Assets/LeaderBoard/Greeen Badge/Score BG.png | Bin 0 -> 2409 bytes .../Greeen Badge/Score BG.png.meta | 140 + Assets/LeaderBoard/Greeen Badge/bronze.png | Bin 0 -> 13350 bytes .../LeaderBoard/Greeen Badge/bronze.png.meta | 140 + Assets/LeaderBoard/LB.png | Bin 0 -> 479701 bytes Assets/LeaderBoard/LB.png.meta | 140 + Assets/LeaderBoard/LBEntryItem.cs | 14 + Assets/LeaderBoard/LBEntryItem.cs.meta | 11 + Assets/LeaderBoard/LBEntryItem.prefab | 938 ++ Assets/LeaderBoard/LBEntryItem.prefab.meta | 7 + Assets/LeaderBoard/LBEntrySelfItem.prefab | 258 + .../LeaderBoard/LBEntrySelfItem.prefab.meta | 7 + Assets/LeaderBoard/LBPedestalItem.cs | 14 + Assets/LeaderBoard/LBPedestalItem.cs.meta | 11 + Assets/LeaderBoard/Leaderboard icon.png | Bin 0 -> 4333 bytes Assets/LeaderBoard/Leaderboard icon.png.meta | 140 + Assets/LeaderBoard/LeaderboardUIScreen.cs | 91 + .../LeaderBoard/LeaderboardUIScreen.cs.meta | 11 + Assets/LeaderBoard/LeaderboardsPopup.prefab | 3244 +++++ .../LeaderBoard/LeaderboardsPopup.prefab.meta | 7 + Assets/LeaderBoard/Main.meta | 8 + Assets/LeaderBoard/Main/Blue BG.png | Bin 0 -> 4465 bytes Assets/LeaderBoard/Main/Blue BG.png.meta | 140 + Assets/LeaderBoard/Main/Player Icon 2.png | Bin 0 -> 16447 bytes .../LeaderBoard/Main/Player Icon 2.png.meta | 140 + Assets/LeaderBoard/Main/Player Icon 3.png | Bin 0 -> 11051 bytes .../LeaderBoard/Main/Player Icon 3.png.meta | 140 + Assets/LeaderBoard/Main/Player Icon BG.png | Bin 0 -> 5929 bytes .../LeaderBoard/Main/Player Icon BG.png.meta | 140 + Assets/LeaderBoard/Main/Player Icon.png | Bin 0 -> 16619 bytes Assets/LeaderBoard/Main/Player Icon.png.meta | 140 + .../Main/Player current position Boder.png | Bin 0 -> 2195 bytes .../Player current position Boder.png.meta | 140 + .../Main/Player current position Icon BG.png | Bin 0 -> 6008 bytes .../Player current position Icon BG.png.meta | 140 + .../Main/Player current position.png | Bin 0 -> 4202 bytes .../Main/Player current position.png.meta | 140 + Assets/LeaderBoard/Main/Rank No BG.png | Bin 0 -> 2133 bytes Assets/LeaderBoard/Main/Rank No BG.png.meta | 140 + Assets/LeaderBoard/Main/Trophy.png | Bin 0 -> 4113 bytes Assets/LeaderBoard/Main/Trophy.png.meta | 140 + Assets/LeaderBoard/Main/footer.png | Bin 0 -> 1745 bytes Assets/LeaderBoard/Main/footer.png.meta | 140 + Assets/LeaderBoard/Main/popup_bg.png | Bin 0 -> 12667 bytes Assets/LeaderBoard/Main/popup_bg.png.meta | 140 + Assets/LeaderBoard/Main/text bg 1.png | Bin 0 -> 5936 bytes Assets/LeaderBoard/Main/text bg 1.png.meta | 140 + Assets/LeaderBoard/RankClose.anim | 394 + Assets/LeaderBoard/RankClose.anim.meta | 9 + Assets/LeaderBoard/RankOpen.anim | 394 + Assets/LeaderBoard/RankOpen.anim.meta | 9 + Assets/LeaderBoard/Red Badge.meta | 8 + Assets/LeaderBoard/Red Badge/1st Badge.png | Bin 0 -> 25152 bytes .../LeaderBoard/Red Badge/1st Badge.png.meta | 140 + Assets/LeaderBoard/Red Badge/1st.png | Bin 0 -> 12475 bytes Assets/LeaderBoard/Red Badge/1st.png.meta | 140 + .../LeaderBoard/Red Badge/Player Icon BG.png | Bin 0 -> 5950 bytes .../Red Badge/Player Icon BG.png.meta | 140 + Assets/LeaderBoard/Red Badge/Player Icon.png | Bin 0 -> 16619 bytes .../Red Badge/Player Icon.png.meta | 140 + Assets/LeaderBoard/Red Badge/Score BG.png | Bin 0 -> 2359 bytes .../LeaderBoard/Red Badge/Score BG.png.meta | 140 + Assets/LeaderBoard/Red Badge/gold.png | Bin 0 -> 12423 bytes Assets/LeaderBoard/Red Badge/gold.png.meta | 140 + Assets/LeaderBoard/StarPopup.controller | 130 + Assets/LeaderBoard/StarPopup.controller.meta | 9 + Assets/LeaderBoard/back btn.png | Bin 0 -> 5651 bytes Assets/LeaderBoard/back btn.png.meta | 140 + ...eaderBoardPlayfabDoTween.unitypackage.meta | 7 + Assets/PlayFabSDK.meta | 8 + Assets/PlayFabSDK/Addon.meta | 8 + Assets/PlayFabSDK/Addon/PlayFabAddonAPI.cs | 390 + .../PlayFabSDK/Addon/PlayFabAddonAPI.cs.meta | 11 + .../Addon/PlayFabAddonInstanceAPI.cs | 354 + .../Addon/PlayFabAddonInstanceAPI.cs.meta | 11 + Assets/PlayFabSDK/Addon/PlayFabAddonModels.cs | 793 ++ .../Addon/PlayFabAddonModels.cs.meta | 11 + Assets/PlayFabSDK/Addon/PlayFabEvents.cs | 64 + Assets/PlayFabSDK/Addon/PlayFabEvents.cs.meta | 11 + Assets/PlayFabSDK/Admin.meta | 8 + Assets/PlayFabSDK/Admin/PlayFabAdminAPI.cs | 1551 ++ .../PlayFabSDK/Admin/PlayFabAdminAPI.cs.meta | 12 + .../Admin/PlayFabAdminInstanceAPI.cs | 1346 ++ .../Admin/PlayFabAdminInstanceAPI.cs.meta | 11 + Assets/PlayFabSDK/Admin/PlayFabAdminModels.cs | 7799 +++++++++++ .../Admin/PlayFabAdminModels.cs.meta | 12 + Assets/PlayFabSDK/Admin/PlayFabEvents.cs | 236 + Assets/PlayFabSDK/Admin/PlayFabEvents.cs.meta | 11 + Assets/PlayFabSDK/Authentication.meta | 8 + .../PlayFabAuthenticationAPI.cs | 104 + .../PlayFabAuthenticationAPI.cs.meta | 11 + .../PlayFabAuthenticationInstanceAPI.cs | 121 + .../PlayFabAuthenticationInstanceAPI.cs.meta | 11 + .../PlayFabAuthenticationModels.cs | 242 + .../PlayFabAuthenticationModels.cs.meta | 11 + .../Authentication/PlayFabEvents.cs | 18 + .../Authentication/PlayFabEvents.cs.meta | 11 + Assets/PlayFabSDK/Client.meta | 8 + Assets/PlayFabSDK/Client/PlayFabClientAPI.cs | 2311 +++ .../Client/PlayFabClientAPI.cs.meta | 12 + .../Client/PlayFabClientInstanceAPI.cs | 2008 +++ .../Client/PlayFabClientInstanceAPI.cs.meta | 11 + .../PlayFabSDK/Client/PlayFabClientModels.cs | 7535 ++++++++++ .../Client/PlayFabClientModels.cs.meta | 12 + Assets/PlayFabSDK/Client/PlayFabDeviceUtil.cs | 109 + .../Client/PlayFabDeviceUtil.cs.meta | 12 + Assets/PlayFabSDK/Client/PlayFabEvents.cs | 321 + .../PlayFabSDK/Client/PlayFabEvents.cs.meta | 11 + Assets/PlayFabSDK/CloudScript.meta | 8 + .../CloudScript/PlayFabCloudScriptAPI.cs | 244 + .../CloudScript/PlayFabCloudScriptAPI.cs.meta | 11 + .../PlayFabCloudScriptInstanceAPI.cs | 224 + .../PlayFabCloudScriptInstanceAPI.cs.meta | 11 + .../CloudScript/PlayFabCloudScriptModels.cs | 1186 ++ .../PlayFabCloudScriptModels.cs.meta | 11 + .../PlayFabSDK/CloudScript/PlayFabEvents.cs | 40 + .../CloudScript/PlayFabEvents.cs.meta | 11 + Assets/PlayFabSDK/Data.meta | 8 + Assets/PlayFabSDK/Data/PlayFabDataAPI.cs | 133 + Assets/PlayFabSDK/Data/PlayFabDataAPI.cs.meta | 11 + .../PlayFabSDK/Data/PlayFabDataInstanceAPI.cs | 137 + .../Data/PlayFabDataInstanceAPI.cs.meta | 11 + Assets/PlayFabSDK/Data/PlayFabDataModels.cs | 404 + .../PlayFabSDK/Data/PlayFabDataModels.cs.meta | 11 + Assets/PlayFabSDK/Data/PlayFabEvents.cs | 24 + Assets/PlayFabSDK/Data/PlayFabEvents.cs.meta | 11 + Assets/PlayFabSDK/Economy.meta | 8 + .../PlayFabSDK/Economy/PlayFabEconomyAPI.cs | 685 + .../Economy/PlayFabEconomyAPI.cs.meta | 11 + .../Economy/PlayFabEconomyInstanceAPI.cs | 611 + .../Economy/PlayFabEconomyInstanceAPI.cs.meta | 11 + .../Economy/PlayFabEconomyModels.cs | 3301 +++++ .../Economy/PlayFabEconomyModels.cs.meta | 11 + Assets/PlayFabSDK/Economy/PlayFabEvents.cs | 102 + .../PlayFabSDK/Economy/PlayFabEvents.cs.meta | 11 + Assets/PlayFabSDK/Entity.meta | 8 + Assets/PlayFabSDK/Entity/ScreenTimeTracker.cs | 255 + .../Entity/ScreenTimeTracker.cs.meta | 11 + Assets/PlayFabSDK/Events.meta | 8 + Assets/PlayFabSDK/Events/PlayFabEvents.cs | 24 + .../PlayFabSDK/Events/PlayFabEvents.cs.meta | 11 + Assets/PlayFabSDK/Events/PlayFabEventsAPI.cs | 144 + .../Events/PlayFabEventsAPI.cs.meta | 11 + .../Events/PlayFabEventsInstanceAPI.cs | 148 + .../Events/PlayFabEventsInstanceAPI.cs.meta | 11 + .../PlayFabSDK/Events/PlayFabEventsModels.cs | 248 + .../Events/PlayFabEventsModels.cs.meta | 11 + Assets/PlayFabSDK/Experimentation.meta | 8 + .../Experimentation/PlayFabEvents.cs | 36 + .../Experimentation/PlayFabEvents.cs.meta | 11 + .../PlayFabExperimentationAPI.cs | 208 + .../PlayFabExperimentationAPI.cs.meta | 11 + .../PlayFabExperimentationInstanceAPI.cs | 200 + .../PlayFabExperimentationInstanceAPI.cs.meta | 11 + .../PlayFabExperimentationModels.cs | 670 + .../PlayFabExperimentationModels.cs.meta | 11 + Assets/PlayFabSDK/Groups.meta | 8 + Assets/PlayFabSDK/Groups/PlayFabEvents.cs | 60 + .../PlayFabSDK/Groups/PlayFabEvents.cs.meta | 11 + Assets/PlayFabSDK/Groups/PlayFabGroupsAPI.cs | 366 + .../Groups/PlayFabGroupsAPI.cs.meta | 11 + .../Groups/PlayFabGroupsInstanceAPI.cs | 334 + .../Groups/PlayFabGroupsInstanceAPI.cs.meta | 11 + .../PlayFabSDK/Groups/PlayFabGroupsModels.cs | 985 ++ .../Groups/PlayFabGroupsModels.cs.meta | 11 + Assets/PlayFabSDK/Insights.meta | 8 + Assets/PlayFabSDK/Insights/PlayFabEvents.cs | 22 + .../PlayFabSDK/Insights/PlayFabEvents.cs.meta | 11 + .../PlayFabSDK/Insights/PlayFabInsightsAPI.cs | 119 + .../Insights/PlayFabInsightsAPI.cs.meta | 11 + .../Insights/PlayFabInsightsInstanceAPI.cs | 125 + .../PlayFabInsightsInstanceAPI.cs.meta | 11 + .../Insights/PlayFabInsightsModels.cs | 235 + .../Insights/PlayFabInsightsModels.cs.meta | 11 + Assets/PlayFabSDK/Localization.meta | 8 + .../PlayFabSDK/Localization/PlayFabEvents.cs | 12 + .../Localization/PlayFabEvents.cs.meta | 11 + .../Localization/PlayFabLocalizationAPI.cs | 52 + .../PlayFabLocalizationAPI.cs.meta | 11 + .../PlayFabLocalizationInstanceAPI.cs | 68 + .../PlayFabLocalizationInstanceAPI.cs.meta | 11 + .../Localization/PlayFabLocalizationModels.cs | 26 + .../PlayFabLocalizationModels.cs.meta | 11 + Assets/PlayFabSDK/Matchmaker.meta | 8 + Assets/PlayFabSDK/Matchmaker/PlayFabEvents.cs | 18 + .../Matchmaker/PlayFabEvents.cs.meta | 11 + .../Matchmaker/PlayFabMatchmakerAPI.cs | 88 + .../Matchmaker/PlayFabMatchmakerAPI.cs.meta | 12 + .../PlayFabMatchmakerInstanceAPI.cs | 98 + .../PlayFabMatchmakerInstanceAPI.cs.meta | 11 + .../Matchmaker/PlayFabMatchmakerModels.cs | 229 + .../PlayFabMatchmakerModels.cs.meta | 12 + Assets/PlayFabSDK/Multiplayer.meta | 8 + .../PlayFabSDK/Multiplayer/PlayFabEvents.cs | 184 + .../Multiplayer/PlayFabEvents.cs.meta | 11 + .../Multiplayer/PlayFabMultiplayerAPI.cs | 1183 ++ .../Multiplayer/PlayFabMultiplayerAPI.cs.meta | 11 + .../PlayFabMultiplayerInstanceAPI.cs | 1027 ++ .../PlayFabMultiplayerInstanceAPI.cs.meta | 11 + .../Multiplayer/PlayFabMultiplayerModels.cs | 5357 +++++++ .../PlayFabMultiplayerModels.cs.meta | 11 + Assets/PlayFabSDK/Profiles.meta | 8 + Assets/PlayFabSDK/Profiles/PlayFabEvents.cs | 28 + .../PlayFabSDK/Profiles/PlayFabEvents.cs.meta | 11 + .../PlayFabSDK/Profiles/PlayFabProfilesAPI.cs | 158 + .../Profiles/PlayFabProfilesAPI.cs.meta | 11 + .../Profiles/PlayFabProfilesInstanceAPI.cs | 158 + .../PlayFabProfilesInstanceAPI.cs.meta | 11 + .../Profiles/PlayFabProfilesModels.cs | 508 + .../Profiles/PlayFabProfilesModels.cs.meta | 11 + Assets/PlayFabSDK/Progression.meta | 8 + .../PlayFabSDK/Progression/PlayFabEvents.cs | 52 + .../Progression/PlayFabEvents.cs.meta | 11 + .../Progression/PlayFabProgressionAPI.cs | 313 + .../Progression/PlayFabProgressionAPI.cs.meta | 11 + .../PlayFabProgressionInstanceAPI.cs | 289 + .../PlayFabProgressionInstanceAPI.cs.meta | 11 + .../Progression/PlayFabProgressionModels.cs | 897 ++ .../PlayFabProgressionModels.cs.meta | 11 + Assets/PlayFabSDK/Server.meta | 8 + Assets/PlayFabSDK/Server/PlayFabEvents.cs | 284 + .../PlayFabSDK/Server/PlayFabEvents.cs.meta | 11 + Assets/PlayFabSDK/Server/PlayFabServerAPI.cs | 1921 +++ .../Server/PlayFabServerAPI.cs.meta | 12 + .../Server/PlayFabServerInstanceAPI.cs | 1668 +++ .../Server/PlayFabServerInstanceAPI.cs.meta | 11 + .../PlayFabSDK/Server/PlayFabServerModels.cs | 7374 ++++++++++ .../Server/PlayFabServerModels.cs.meta | 12 + Assets/PlayFabSDK/Shared.meta | 8 + Assets/PlayFabSDK/Shared/Editor.meta | 8 + .../Shared/Editor/MakeSharedSettingsObj.cs | 21 + .../Editor/MakeSharedSettingsObj.cs.meta | 11 + .../PlayFabSDK/Shared/Editor/PlayFabHelp.cs | 38 + .../Shared/Editor/PlayFabHelp.cs.meta | 8 + Assets/PlayFabSDK/Shared/Internal.meta | 8 + .../PlayFabSDK/Shared/Internal/ISerializer.cs | 108 + .../Shared/Internal/ISerializer.cs.meta | 12 + Assets/PlayFabSDK/Shared/Internal/Log.cs | 44 + Assets/PlayFabSDK/Shared/Internal/Log.cs.meta | 12 + .../Shared/Internal/PlayFabErrors.cs | 948 ++ .../Shared/Internal/PlayFabErrors.cs.meta | 12 + .../Shared/Internal/PlayFabHttp.meta | 8 + .../PlayFabHttp/GzipDownloadHandler.cs | 57 + .../PlayFabHttp/GzipDownloadHandler.cs.meta | 11 + .../Internal/PlayFabHttp/IPlayFabHttp.cs | 61 + .../Internal/PlayFabHttp/IPlayFabHttp.cs.meta | 12 + .../Internal/PlayFabHttp/PlayFabHTTP.cs | 504 + .../Internal/PlayFabHttp/PlayFabHTTP.cs.meta | 12 + .../Internal/PlayFabHttp/PlayFabUnityHttp.cs | 273 + .../PlayFabHttp/PlayFabUnityHttp.cs.meta | 13 + .../Shared/Internal/PlayFabHttp/PlayFabWWW.cs | 219 + .../Internal/PlayFabHttp/PlayFabWWW.cs.meta | 12 + .../Internal/PlayFabHttp/PlayFabWebRequest.cs | 544 + .../PlayFabHttp/PlayFabWebRequest.cs.meta | 12 + .../PlayFabSDK/Shared/Internal/SimpleJson.cs | 2081 +++ .../Shared/Internal/SimpleJson.cs.meta | 12 + .../Shared/Internal/SingletonMonoBehaviour.cs | 58 + .../Internal/SingletonMonoBehaviour.cs.meta | 12 + Assets/PlayFabSDK/Shared/Internal/Util.cs | 157 + .../PlayFabSDK/Shared/Internal/Util.cs.meta | 12 + .../Internal/wsaReflectionExtensions.cs | 66 + .../Internal/wsaReflectionExtensions.cs.meta | 12 + Assets/PlayFabSDK/Shared/Models.meta | 8 + .../Shared/Models/PlayFabSharedSettings.cs | 36 + .../Models/PlayFabSharedSettings.cs.meta | 12 + .../PlayFabSDK/Shared/Models/SharedModels.cs | 44 + .../Shared/Models/SharedModels.cs.meta | 12 + Assets/PlayFabSDK/Shared/Public.meta | 8 + .../Shared/Public/IPlayFabPlugin.cs | 9 + .../Shared/Public/IPlayFabPlugin.cs.meta | 11 + .../Shared/Public/ISerializerPlugin.cs | 15 + .../Shared/Public/ISerializerPlugin.cs.meta | 11 + .../Shared/Public/ITransportPlugin.cs | 27 + .../Shared/Public/ITransportPlugin.cs.meta | 11 + .../Shared/Public/PlayFabApiSettings.cs | 102 + .../Shared/Public/PlayFabApiSettings.cs.meta | 11 + .../Public/PlayFabAuthenticationContext.cs | 87 + .../PlayFabAuthenticationContext.cs.meta | 11 + .../Shared/Public/PlayFabDataGatherer.cs | 138 + .../Shared/Public/PlayFabDataGatherer.cs.meta | 12 + .../PlayFabSDK/Shared/Public/PlayFabEvents.cs | 3554 +++++ .../Shared/Public/PlayFabEvents.cs.meta | 11 + .../PlayFabSDK/Shared/Public/PlayFabLogger.cs | 270 + .../Shared/Public/PlayFabLogger.cs.meta | 12 + .../Shared/Public/PlayFabSettings.cs | 250 + .../Shared/Public/PlayFabSettings.cs.meta | 12 + .../Shared/Public/PluginContract.cs | 8 + .../Shared/Public/PluginContract.cs.meta | 11 + .../Shared/Public/PluginContractKey.cs | 23 + .../Shared/Public/PluginContractKey.cs.meta | 11 + .../PlayFabSDK/Shared/Public/PluginManager.cs | 110 + .../Shared/Public/PluginManager.cs.meta | 11 + Assets/Plugins.meta | 8 + Assets/Plugins/AssetUsageDetector.meta | 9 + Assets/Plugins/AssetUsageDetector/Editor.meta | 9 + .../Editor/AssetUsageDetector.Editor.asmdef | 29 + .../AssetUsageDetector.Editor.asmdef.meta | 7 + .../Editor/AssetUsageDetector.cs | 1398 ++ .../Editor/AssetUsageDetector.cs.meta | 12 + .../Editor/AssetUsageDetectorCache.cs | 207 + .../Editor/AssetUsageDetectorCache.cs.meta | 11 + .../AssetUsageDetectorSearchFunctions.cs | 1962 +++ .../AssetUsageDetectorSearchFunctions.cs.meta | 11 + .../Editor/AssetUsageDetectorSettings.cs | 298 + .../Editor/AssetUsageDetectorSettings.cs.meta | 12 + .../Editor/AssetUsageDetectorWindow.cs | 812 ++ .../Editor/AssetUsageDetectorWindow.cs.meta | 12 + .../AssetUsageDetector/Editor/Enumerators.cs | 130 + .../Editor/Enumerators.cs.meta | 12 + .../AssetUsageDetector/Editor/ListDrawer.cs | 252 + .../Editor/ListDrawer.cs.meta | 12 + .../Editor/ObjectToSearch.cs | 120 + .../Editor/ObjectToSearch.cs.meta | 11 + .../Editor/SearchRefactoring.cs | 382 + .../Editor/SearchRefactoring.cs.meta | 12 + .../AssetUsageDetector/Editor/SearchResult.cs | 1395 ++ .../Editor/SearchResult.cs.meta | 11 + .../Editor/SearchResultTooltip.cs | 91 + .../Editor/SearchResultTooltip.cs.meta | 12 + .../Editor/SearchResultTreeView.cs | 1353 ++ .../Editor/SearchResultTreeView.cs.meta | 12 + .../AssetUsageDetector/Editor/Utilities.cs | 565 + .../Editor/Utilities.cs.meta | 11 + .../Editor/VariableGetter.cs | 83 + .../Editor/VariableGetter.cs.meta | 11 + Assets/Plugins/AssetUsageDetector/README.txt | 4 + .../AssetUsageDetector/README.txt.meta | 8 + Assets/Plugins/Demigiant.meta | 8 + Assets/Plugins/Demigiant/DOTween.meta | 21 + Assets/Plugins/Demigiant/DOTween/DOTween.XML | 2963 ++++ .../Demigiant/DOTween/DOTween.XML.meta | 4 + Assets/Plugins/Demigiant/DOTween/DOTween.dll | Bin 0 -> 172032 bytes .../Demigiant/DOTween/DOTween.dll.meta | 22 + Assets/Plugins/Demigiant/DOTween/Editor.meta | 5 + .../DOTween/Editor/DOTweenEditor.XML | 110 + .../DOTween/Editor/DOTweenEditor.XML.meta | 4 + .../DOTween/Editor/DOTweenEditor.dll | Bin 0 -> 66048 bytes .../DOTween/Editor/DOTweenEditor.dll.meta | 22 + .../Demigiant/DOTween/Editor/Imgs.meta | 5 + .../DOTween/Editor/Imgs/DOTweenIcon.png | Bin 0 -> 1565 bytes .../DOTween/Editor/Imgs/DOTweenIcon.png.meta | 47 + .../DOTween/Editor/Imgs/DOTweenMiniIcon.png | Bin 0 -> 319 bytes .../Editor/Imgs/DOTweenMiniIcon.png.meta | 68 + .../Demigiant/DOTween/Editor/Imgs/Footer.png | Bin 0 -> 4409 bytes .../DOTween/Editor/Imgs/Footer.png.meta | 47 + .../DOTween/Editor/Imgs/Footer_dark.png | Bin 0 -> 4429 bytes .../DOTween/Editor/Imgs/Footer_dark.png.meta | 47 + .../Demigiant/DOTween/Editor/Imgs/Header.jpg | Bin 0 -> 22787 bytes .../DOTween/Editor/Imgs/Header.jpg.meta | 47 + Assets/Plugins/Demigiant/DOTween/Modules.meta | 5 + .../DOTween/Modules/DOTweenModuleAudio.cs | 202 + .../Modules/DOTweenModuleAudio.cs.meta | 8 + .../Modules/DOTweenModuleEPOOutline.cs | 142 + .../Modules/DOTweenModuleEPOOutline.cs.meta | 12 + .../DOTween/Modules/DOTweenModulePhysics.cs | 216 + .../Modules/DOTweenModulePhysics.cs.meta | 8 + .../DOTween/Modules/DOTweenModulePhysics2D.cs | 193 + .../Modules/DOTweenModulePhysics2D.cs.meta | 8 + .../DOTween/Modules/DOTweenModuleSprite.cs | 93 + .../Modules/DOTweenModuleSprite.cs.meta | 8 + .../DOTween/Modules/DOTweenModuleUI.cs | 660 + .../DOTween/Modules/DOTweenModuleUI.cs.meta | 8 + .../Modules/DOTweenModuleUnityVersion.cs | 403 + .../Modules/DOTweenModuleUnityVersion.cs.meta | 8 + .../DOTween/Modules/DOTweenModuleUtils.cs | 167 + .../Modules/DOTweenModuleUtils.cs.meta | 8 + Assets/Plugins/Demigiant/DOTween/readme.txt | 29 + .../Plugins/Demigiant/DOTween/readme.txt.meta | 4 + Assets/Plugins/Demigiant/DOTweenPro.meta | 8 + .../Demigiant/DOTweenPro/DOTweenAnimation.cs | 884 ++ .../DOTweenPro/DOTweenAnimation.cs.meta | 8 + .../Demigiant/DOTweenPro/DOTweenDeAudio.cs | 9 + .../DOTweenPro/DOTweenDeAudio.cs.meta | 12 + .../DOTweenPro/DOTweenDeUnityExtended.cs | 9 + .../DOTweenPro/DOTweenDeUnityExtended.cs.meta | 12 + .../Demigiant/DOTweenPro/DOTweenPro.dll | Bin 0 -> 15872 bytes .../Demigiant/DOTweenPro/DOTweenPro.dll.meta | 22 + .../DOTweenPro/DOTweenProShortcuts.cs | 90 + .../DOTweenPro/DOTweenProShortcuts.cs.meta | 8 + .../DOTweenPro/DOTweenTextMeshPro.cs | 1037 ++ .../DOTweenPro/DOTweenTextMeshPro.cs.meta | 8 + .../Demigiant/DOTweenPro/DOTweenTk2d.cs | 247 + .../Demigiant/DOTweenPro/DOTweenTk2d.cs.meta | 8 + .../Plugins/Demigiant/DOTweenPro/Editor.meta | 8 + .../Editor/DOTweenAnimationInspector.cs | 750 + .../Editor/DOTweenAnimationInspector.cs.meta | 8 + .../Editor/DOTweenPreviewManager.cs | 263 + .../Editor/DOTweenPreviewManager.cs.meta | 8 + .../DOTweenPro/Editor/DOTweenProEditor.dll | Bin 0 -> 35840 bytes .../Editor/DOTweenProEditor.dll.meta | 22 + Assets/Plugins/Demigiant/DemiLib.meta | 8 + Assets/Plugins/Demigiant/DemiLib/Core.meta | 8 + .../Demigiant/DemiLib/Core/DemiLib.dll | Bin 0 -> 13312 bytes .../Demigiant/DemiLib/Core/DemiLib.dll.meta | 22 + .../Demigiant/DemiLib/Core/Editor.meta | 8 + .../DemiLib/Core/Editor/DemiEditor.dll | Bin 0 -> 187392 bytes .../DemiLib/Core/Editor/DemiEditor.dll.meta | 22 + Assets/Scenes/MainMenu.unity | 11665 +++++++++++++--- Assets/Scripts/GameConstants.cs | 22 + Assets/Scripts/GameConstants.cs.meta | 11 + .../{ => Scripts}/HingeJointBreakReceiver.cs | 0 .../HingeJointBreakReceiver.cs.meta | 0 Assets/{ => Scripts}/LoadingManager.cs | 0 Assets/{ => Scripts}/LoadingManager.cs.meta | 0 .../{ => Scripts}/ObstacleColliderSetter.cs | 0 .../ObstacleColliderSetter.cs.meta | 0 Assets/{ => Scripts}/ObstacleInstantiator.cs | 0 .../ObstacleInstantiator.cs.meta | 0 Assets/Scripts/PlayFab.meta | 8 + Assets/Scripts/PlayFab/PlayFabInit.cs | 109 + Assets/Scripts/PlayFab/PlayFabInit.cs.meta | 11 + Assets/Scripts/PlayFab/PlayFabLeaderboards.cs | 100 + .../PlayFab/PlayFabLeaderboards.cs.meta | 11 + Assets/Scripts/PlayFab/PlayFabManager.cs | 48 + Assets/Scripts/PlayFab/PlayFabManager.cs.meta | 11 + Assets/Scripts/PlayFab/PlayFabUserData.cs | 52 + .../Scripts/PlayFab/PlayFabUserData.cs.meta | 11 + Assets/Scripts/Popup.cs | 115 + Assets/Scripts/Popup.cs.meta | 12 + .../LiberationSans SDF.asset | 324 +- Assets/UI/Mockups/LeaderBoard_Atlas.png | Bin 0 -> 428902 bytes Assets/UI/Mockups/LeaderBoard_Atlas.png.meta | 386 + Assets/UI/Mockups/LeaderBoard_Screen_2.png | Bin 626460 -> 0 bytes Assets/UI/Mockups/Leaderboard.png | Bin 0 -> 657684 bytes ...Screen_2.png.meta => Leaderboard.png.meta} | 2 +- 450 files changed, 109560 insertions(+), 1947 deletions(-) create mode 100644 Assets/LeaderBoard.meta create mode 100644 Assets/LeaderBoard/Blue Badge.meta create mode 100644 Assets/LeaderBoard/Blue Badge/2nd Badge.png create mode 100644 Assets/LeaderBoard/Blue Badge/2nd Badge.png.meta create mode 100644 Assets/LeaderBoard/Blue Badge/2nd.png create mode 100644 Assets/LeaderBoard/Blue Badge/2nd.png.meta create mode 100644 Assets/LeaderBoard/Blue Badge/Player Icon BG.png create mode 100644 Assets/LeaderBoard/Blue Badge/Player Icon BG.png.meta create mode 100644 Assets/LeaderBoard/Blue Badge/Player Icon.png create mode 100644 Assets/LeaderBoard/Blue Badge/Player Icon.png.meta create mode 100644 Assets/LeaderBoard/Blue Badge/Score BG.png create mode 100644 Assets/LeaderBoard/Blue Badge/Score BG.png.meta create mode 100644 Assets/LeaderBoard/Blue Badge/silver.png create mode 100644 Assets/LeaderBoard/Blue Badge/silver.png.meta create mode 100644 Assets/LeaderBoard/Game Stats Btn.png create mode 100644 Assets/LeaderBoard/Game Stats Btn.png.meta create mode 100644 Assets/LeaderBoard/Greeen Badge.meta create mode 100644 Assets/LeaderBoard/Greeen Badge/3rd Badge.png create mode 100644 Assets/LeaderBoard/Greeen Badge/3rd Badge.png.meta create mode 100644 Assets/LeaderBoard/Greeen Badge/3rd.png create mode 100644 Assets/LeaderBoard/Greeen Badge/3rd.png.meta create mode 100644 Assets/LeaderBoard/Greeen Badge/Player Icon BG.png create mode 100644 Assets/LeaderBoard/Greeen Badge/Player Icon BG.png.meta create mode 100644 Assets/LeaderBoard/Greeen Badge/Player Icon.png create mode 100644 Assets/LeaderBoard/Greeen Badge/Player Icon.png.meta create mode 100644 Assets/LeaderBoard/Greeen Badge/Score BG.png create mode 100644 Assets/LeaderBoard/Greeen Badge/Score BG.png.meta create mode 100644 Assets/LeaderBoard/Greeen Badge/bronze.png create mode 100644 Assets/LeaderBoard/Greeen Badge/bronze.png.meta create mode 100644 Assets/LeaderBoard/LB.png create mode 100644 Assets/LeaderBoard/LB.png.meta create mode 100644 Assets/LeaderBoard/LBEntryItem.cs create mode 100644 Assets/LeaderBoard/LBEntryItem.cs.meta create mode 100644 Assets/LeaderBoard/LBEntryItem.prefab create mode 100644 Assets/LeaderBoard/LBEntryItem.prefab.meta create mode 100644 Assets/LeaderBoard/LBEntrySelfItem.prefab create mode 100644 Assets/LeaderBoard/LBEntrySelfItem.prefab.meta create mode 100644 Assets/LeaderBoard/LBPedestalItem.cs create mode 100644 Assets/LeaderBoard/LBPedestalItem.cs.meta create mode 100644 Assets/LeaderBoard/Leaderboard icon.png create mode 100644 Assets/LeaderBoard/Leaderboard icon.png.meta create mode 100644 Assets/LeaderBoard/LeaderboardUIScreen.cs create mode 100644 Assets/LeaderBoard/LeaderboardUIScreen.cs.meta create mode 100644 Assets/LeaderBoard/LeaderboardsPopup.prefab create mode 100644 Assets/LeaderBoard/LeaderboardsPopup.prefab.meta create mode 100644 Assets/LeaderBoard/Main.meta create mode 100644 Assets/LeaderBoard/Main/Blue BG.png create mode 100644 Assets/LeaderBoard/Main/Blue BG.png.meta create mode 100644 Assets/LeaderBoard/Main/Player Icon 2.png create mode 100644 Assets/LeaderBoard/Main/Player Icon 2.png.meta create mode 100644 Assets/LeaderBoard/Main/Player Icon 3.png create mode 100644 Assets/LeaderBoard/Main/Player Icon 3.png.meta create mode 100644 Assets/LeaderBoard/Main/Player Icon BG.png create mode 100644 Assets/LeaderBoard/Main/Player Icon BG.png.meta create mode 100644 Assets/LeaderBoard/Main/Player Icon.png create mode 100644 Assets/LeaderBoard/Main/Player Icon.png.meta create mode 100644 Assets/LeaderBoard/Main/Player current position Boder.png create mode 100644 Assets/LeaderBoard/Main/Player current position Boder.png.meta create mode 100644 Assets/LeaderBoard/Main/Player current position Icon BG.png create mode 100644 Assets/LeaderBoard/Main/Player current position Icon BG.png.meta create mode 100644 Assets/LeaderBoard/Main/Player current position.png create mode 100644 Assets/LeaderBoard/Main/Player current position.png.meta create mode 100644 Assets/LeaderBoard/Main/Rank No BG.png create mode 100644 Assets/LeaderBoard/Main/Rank No BG.png.meta create mode 100644 Assets/LeaderBoard/Main/Trophy.png create mode 100644 Assets/LeaderBoard/Main/Trophy.png.meta create mode 100644 Assets/LeaderBoard/Main/footer.png create mode 100644 Assets/LeaderBoard/Main/footer.png.meta create mode 100644 Assets/LeaderBoard/Main/popup_bg.png create mode 100644 Assets/LeaderBoard/Main/popup_bg.png.meta create mode 100644 Assets/LeaderBoard/Main/text bg 1.png create mode 100644 Assets/LeaderBoard/Main/text bg 1.png.meta create mode 100644 Assets/LeaderBoard/RankClose.anim create mode 100644 Assets/LeaderBoard/RankClose.anim.meta create mode 100644 Assets/LeaderBoard/RankOpen.anim create mode 100644 Assets/LeaderBoard/RankOpen.anim.meta create mode 100644 Assets/LeaderBoard/Red Badge.meta create mode 100644 Assets/LeaderBoard/Red Badge/1st Badge.png create mode 100644 Assets/LeaderBoard/Red Badge/1st Badge.png.meta create mode 100644 Assets/LeaderBoard/Red Badge/1st.png create mode 100644 Assets/LeaderBoard/Red Badge/1st.png.meta create mode 100644 Assets/LeaderBoard/Red Badge/Player Icon BG.png create mode 100644 Assets/LeaderBoard/Red Badge/Player Icon BG.png.meta create mode 100644 Assets/LeaderBoard/Red Badge/Player Icon.png create mode 100644 Assets/LeaderBoard/Red Badge/Player Icon.png.meta create mode 100644 Assets/LeaderBoard/Red Badge/Score BG.png create mode 100644 Assets/LeaderBoard/Red Badge/Score BG.png.meta create mode 100644 Assets/LeaderBoard/Red Badge/gold.png create mode 100644 Assets/LeaderBoard/Red Badge/gold.png.meta create mode 100644 Assets/LeaderBoard/StarPopup.controller create mode 100644 Assets/LeaderBoard/StarPopup.controller.meta create mode 100644 Assets/LeaderBoard/back btn.png create mode 100644 Assets/LeaderBoard/back btn.png.meta create mode 100644 Assets/LeaderBoardPlayfabDoTween.unitypackage.meta create mode 100644 Assets/PlayFabSDK.meta create mode 100644 Assets/PlayFabSDK/Addon.meta create mode 100644 Assets/PlayFabSDK/Addon/PlayFabAddonAPI.cs create mode 100644 Assets/PlayFabSDK/Addon/PlayFabAddonAPI.cs.meta create mode 100644 Assets/PlayFabSDK/Addon/PlayFabAddonInstanceAPI.cs create mode 100644 Assets/PlayFabSDK/Addon/PlayFabAddonInstanceAPI.cs.meta create mode 100644 Assets/PlayFabSDK/Addon/PlayFabAddonModels.cs create mode 100644 Assets/PlayFabSDK/Addon/PlayFabAddonModels.cs.meta create mode 100644 Assets/PlayFabSDK/Addon/PlayFabEvents.cs create mode 100644 Assets/PlayFabSDK/Addon/PlayFabEvents.cs.meta create mode 100644 Assets/PlayFabSDK/Admin.meta create mode 100644 Assets/PlayFabSDK/Admin/PlayFabAdminAPI.cs create mode 100644 Assets/PlayFabSDK/Admin/PlayFabAdminAPI.cs.meta create mode 100644 Assets/PlayFabSDK/Admin/PlayFabAdminInstanceAPI.cs create mode 100644 Assets/PlayFabSDK/Admin/PlayFabAdminInstanceAPI.cs.meta create mode 100644 Assets/PlayFabSDK/Admin/PlayFabAdminModels.cs create mode 100644 Assets/PlayFabSDK/Admin/PlayFabAdminModels.cs.meta create mode 100644 Assets/PlayFabSDK/Admin/PlayFabEvents.cs create mode 100644 Assets/PlayFabSDK/Admin/PlayFabEvents.cs.meta create mode 100644 Assets/PlayFabSDK/Authentication.meta create mode 100644 Assets/PlayFabSDK/Authentication/PlayFabAuthenticationAPI.cs create mode 100644 Assets/PlayFabSDK/Authentication/PlayFabAuthenticationAPI.cs.meta create mode 100644 Assets/PlayFabSDK/Authentication/PlayFabAuthenticationInstanceAPI.cs create mode 100644 Assets/PlayFabSDK/Authentication/PlayFabAuthenticationInstanceAPI.cs.meta create mode 100644 Assets/PlayFabSDK/Authentication/PlayFabAuthenticationModels.cs create mode 100644 Assets/PlayFabSDK/Authentication/PlayFabAuthenticationModels.cs.meta create mode 100644 Assets/PlayFabSDK/Authentication/PlayFabEvents.cs create mode 100644 Assets/PlayFabSDK/Authentication/PlayFabEvents.cs.meta create mode 100644 Assets/PlayFabSDK/Client.meta create mode 100644 Assets/PlayFabSDK/Client/PlayFabClientAPI.cs create mode 100644 Assets/PlayFabSDK/Client/PlayFabClientAPI.cs.meta create mode 100644 Assets/PlayFabSDK/Client/PlayFabClientInstanceAPI.cs create mode 100644 Assets/PlayFabSDK/Client/PlayFabClientInstanceAPI.cs.meta create mode 100644 Assets/PlayFabSDK/Client/PlayFabClientModels.cs create mode 100644 Assets/PlayFabSDK/Client/PlayFabClientModels.cs.meta create mode 100644 Assets/PlayFabSDK/Client/PlayFabDeviceUtil.cs create mode 100644 Assets/PlayFabSDK/Client/PlayFabDeviceUtil.cs.meta create mode 100644 Assets/PlayFabSDK/Client/PlayFabEvents.cs create mode 100644 Assets/PlayFabSDK/Client/PlayFabEvents.cs.meta create mode 100644 Assets/PlayFabSDK/CloudScript.meta create mode 100644 Assets/PlayFabSDK/CloudScript/PlayFabCloudScriptAPI.cs create mode 100644 Assets/PlayFabSDK/CloudScript/PlayFabCloudScriptAPI.cs.meta create mode 100644 Assets/PlayFabSDK/CloudScript/PlayFabCloudScriptInstanceAPI.cs create mode 100644 Assets/PlayFabSDK/CloudScript/PlayFabCloudScriptInstanceAPI.cs.meta create mode 100644 Assets/PlayFabSDK/CloudScript/PlayFabCloudScriptModels.cs create mode 100644 Assets/PlayFabSDK/CloudScript/PlayFabCloudScriptModels.cs.meta create mode 100644 Assets/PlayFabSDK/CloudScript/PlayFabEvents.cs create mode 100644 Assets/PlayFabSDK/CloudScript/PlayFabEvents.cs.meta create mode 100644 Assets/PlayFabSDK/Data.meta create mode 100644 Assets/PlayFabSDK/Data/PlayFabDataAPI.cs create mode 100644 Assets/PlayFabSDK/Data/PlayFabDataAPI.cs.meta create mode 100644 Assets/PlayFabSDK/Data/PlayFabDataInstanceAPI.cs create mode 100644 Assets/PlayFabSDK/Data/PlayFabDataInstanceAPI.cs.meta create mode 100644 Assets/PlayFabSDK/Data/PlayFabDataModels.cs create mode 100644 Assets/PlayFabSDK/Data/PlayFabDataModels.cs.meta create mode 100644 Assets/PlayFabSDK/Data/PlayFabEvents.cs create mode 100644 Assets/PlayFabSDK/Data/PlayFabEvents.cs.meta create mode 100644 Assets/PlayFabSDK/Economy.meta create mode 100644 Assets/PlayFabSDK/Economy/PlayFabEconomyAPI.cs create mode 100644 Assets/PlayFabSDK/Economy/PlayFabEconomyAPI.cs.meta create mode 100644 Assets/PlayFabSDK/Economy/PlayFabEconomyInstanceAPI.cs create mode 100644 Assets/PlayFabSDK/Economy/PlayFabEconomyInstanceAPI.cs.meta create mode 100644 Assets/PlayFabSDK/Economy/PlayFabEconomyModels.cs create mode 100644 Assets/PlayFabSDK/Economy/PlayFabEconomyModels.cs.meta create mode 100644 Assets/PlayFabSDK/Economy/PlayFabEvents.cs create mode 100644 Assets/PlayFabSDK/Economy/PlayFabEvents.cs.meta create mode 100644 Assets/PlayFabSDK/Entity.meta create mode 100644 Assets/PlayFabSDK/Entity/ScreenTimeTracker.cs create mode 100644 Assets/PlayFabSDK/Entity/ScreenTimeTracker.cs.meta create mode 100644 Assets/PlayFabSDK/Events.meta create mode 100644 Assets/PlayFabSDK/Events/PlayFabEvents.cs create mode 100644 Assets/PlayFabSDK/Events/PlayFabEvents.cs.meta create mode 100644 Assets/PlayFabSDK/Events/PlayFabEventsAPI.cs create mode 100644 Assets/PlayFabSDK/Events/PlayFabEventsAPI.cs.meta create mode 100644 Assets/PlayFabSDK/Events/PlayFabEventsInstanceAPI.cs create mode 100644 Assets/PlayFabSDK/Events/PlayFabEventsInstanceAPI.cs.meta create mode 100644 Assets/PlayFabSDK/Events/PlayFabEventsModels.cs create mode 100644 Assets/PlayFabSDK/Events/PlayFabEventsModels.cs.meta create mode 100644 Assets/PlayFabSDK/Experimentation.meta create mode 100644 Assets/PlayFabSDK/Experimentation/PlayFabEvents.cs create mode 100644 Assets/PlayFabSDK/Experimentation/PlayFabEvents.cs.meta create mode 100644 Assets/PlayFabSDK/Experimentation/PlayFabExperimentationAPI.cs create mode 100644 Assets/PlayFabSDK/Experimentation/PlayFabExperimentationAPI.cs.meta create mode 100644 Assets/PlayFabSDK/Experimentation/PlayFabExperimentationInstanceAPI.cs create mode 100644 Assets/PlayFabSDK/Experimentation/PlayFabExperimentationInstanceAPI.cs.meta create mode 100644 Assets/PlayFabSDK/Experimentation/PlayFabExperimentationModels.cs create mode 100644 Assets/PlayFabSDK/Experimentation/PlayFabExperimentationModels.cs.meta create mode 100644 Assets/PlayFabSDK/Groups.meta create mode 100644 Assets/PlayFabSDK/Groups/PlayFabEvents.cs create mode 100644 Assets/PlayFabSDK/Groups/PlayFabEvents.cs.meta create mode 100644 Assets/PlayFabSDK/Groups/PlayFabGroupsAPI.cs create mode 100644 Assets/PlayFabSDK/Groups/PlayFabGroupsAPI.cs.meta create mode 100644 Assets/PlayFabSDK/Groups/PlayFabGroupsInstanceAPI.cs create mode 100644 Assets/PlayFabSDK/Groups/PlayFabGroupsInstanceAPI.cs.meta create mode 100644 Assets/PlayFabSDK/Groups/PlayFabGroupsModels.cs create mode 100644 Assets/PlayFabSDK/Groups/PlayFabGroupsModels.cs.meta create mode 100644 Assets/PlayFabSDK/Insights.meta create mode 100644 Assets/PlayFabSDK/Insights/PlayFabEvents.cs create mode 100644 Assets/PlayFabSDK/Insights/PlayFabEvents.cs.meta create mode 100644 Assets/PlayFabSDK/Insights/PlayFabInsightsAPI.cs create mode 100644 Assets/PlayFabSDK/Insights/PlayFabInsightsAPI.cs.meta create mode 100644 Assets/PlayFabSDK/Insights/PlayFabInsightsInstanceAPI.cs create mode 100644 Assets/PlayFabSDK/Insights/PlayFabInsightsInstanceAPI.cs.meta create mode 100644 Assets/PlayFabSDK/Insights/PlayFabInsightsModels.cs create mode 100644 Assets/PlayFabSDK/Insights/PlayFabInsightsModels.cs.meta create mode 100644 Assets/PlayFabSDK/Localization.meta create mode 100644 Assets/PlayFabSDK/Localization/PlayFabEvents.cs create mode 100644 Assets/PlayFabSDK/Localization/PlayFabEvents.cs.meta create mode 100644 Assets/PlayFabSDK/Localization/PlayFabLocalizationAPI.cs create mode 100644 Assets/PlayFabSDK/Localization/PlayFabLocalizationAPI.cs.meta create mode 100644 Assets/PlayFabSDK/Localization/PlayFabLocalizationInstanceAPI.cs create mode 100644 Assets/PlayFabSDK/Localization/PlayFabLocalizationInstanceAPI.cs.meta create mode 100644 Assets/PlayFabSDK/Localization/PlayFabLocalizationModels.cs create mode 100644 Assets/PlayFabSDK/Localization/PlayFabLocalizationModels.cs.meta create mode 100644 Assets/PlayFabSDK/Matchmaker.meta create mode 100644 Assets/PlayFabSDK/Matchmaker/PlayFabEvents.cs create mode 100644 Assets/PlayFabSDK/Matchmaker/PlayFabEvents.cs.meta create mode 100644 Assets/PlayFabSDK/Matchmaker/PlayFabMatchmakerAPI.cs create mode 100644 Assets/PlayFabSDK/Matchmaker/PlayFabMatchmakerAPI.cs.meta create mode 100644 Assets/PlayFabSDK/Matchmaker/PlayFabMatchmakerInstanceAPI.cs create mode 100644 Assets/PlayFabSDK/Matchmaker/PlayFabMatchmakerInstanceAPI.cs.meta create mode 100644 Assets/PlayFabSDK/Matchmaker/PlayFabMatchmakerModels.cs create mode 100644 Assets/PlayFabSDK/Matchmaker/PlayFabMatchmakerModels.cs.meta create mode 100644 Assets/PlayFabSDK/Multiplayer.meta create mode 100644 Assets/PlayFabSDK/Multiplayer/PlayFabEvents.cs create mode 100644 Assets/PlayFabSDK/Multiplayer/PlayFabEvents.cs.meta create mode 100644 Assets/PlayFabSDK/Multiplayer/PlayFabMultiplayerAPI.cs create mode 100644 Assets/PlayFabSDK/Multiplayer/PlayFabMultiplayerAPI.cs.meta create mode 100644 Assets/PlayFabSDK/Multiplayer/PlayFabMultiplayerInstanceAPI.cs create mode 100644 Assets/PlayFabSDK/Multiplayer/PlayFabMultiplayerInstanceAPI.cs.meta create mode 100644 Assets/PlayFabSDK/Multiplayer/PlayFabMultiplayerModels.cs create mode 100644 Assets/PlayFabSDK/Multiplayer/PlayFabMultiplayerModels.cs.meta create mode 100644 Assets/PlayFabSDK/Profiles.meta create mode 100644 Assets/PlayFabSDK/Profiles/PlayFabEvents.cs create mode 100644 Assets/PlayFabSDK/Profiles/PlayFabEvents.cs.meta create mode 100644 Assets/PlayFabSDK/Profiles/PlayFabProfilesAPI.cs create mode 100644 Assets/PlayFabSDK/Profiles/PlayFabProfilesAPI.cs.meta create mode 100644 Assets/PlayFabSDK/Profiles/PlayFabProfilesInstanceAPI.cs create mode 100644 Assets/PlayFabSDK/Profiles/PlayFabProfilesInstanceAPI.cs.meta create mode 100644 Assets/PlayFabSDK/Profiles/PlayFabProfilesModels.cs create mode 100644 Assets/PlayFabSDK/Profiles/PlayFabProfilesModels.cs.meta create mode 100644 Assets/PlayFabSDK/Progression.meta create mode 100644 Assets/PlayFabSDK/Progression/PlayFabEvents.cs create mode 100644 Assets/PlayFabSDK/Progression/PlayFabEvents.cs.meta create mode 100644 Assets/PlayFabSDK/Progression/PlayFabProgressionAPI.cs create mode 100644 Assets/PlayFabSDK/Progression/PlayFabProgressionAPI.cs.meta create mode 100644 Assets/PlayFabSDK/Progression/PlayFabProgressionInstanceAPI.cs create mode 100644 Assets/PlayFabSDK/Progression/PlayFabProgressionInstanceAPI.cs.meta create mode 100644 Assets/PlayFabSDK/Progression/PlayFabProgressionModels.cs create mode 100644 Assets/PlayFabSDK/Progression/PlayFabProgressionModels.cs.meta create mode 100644 Assets/PlayFabSDK/Server.meta create mode 100644 Assets/PlayFabSDK/Server/PlayFabEvents.cs create mode 100644 Assets/PlayFabSDK/Server/PlayFabEvents.cs.meta create mode 100644 Assets/PlayFabSDK/Server/PlayFabServerAPI.cs create mode 100644 Assets/PlayFabSDK/Server/PlayFabServerAPI.cs.meta create mode 100644 Assets/PlayFabSDK/Server/PlayFabServerInstanceAPI.cs create mode 100644 Assets/PlayFabSDK/Server/PlayFabServerInstanceAPI.cs.meta create mode 100644 Assets/PlayFabSDK/Server/PlayFabServerModels.cs create mode 100644 Assets/PlayFabSDK/Server/PlayFabServerModels.cs.meta create mode 100644 Assets/PlayFabSDK/Shared.meta create mode 100644 Assets/PlayFabSDK/Shared/Editor.meta create mode 100644 Assets/PlayFabSDK/Shared/Editor/MakeSharedSettingsObj.cs create mode 100644 Assets/PlayFabSDK/Shared/Editor/MakeSharedSettingsObj.cs.meta create mode 100644 Assets/PlayFabSDK/Shared/Editor/PlayFabHelp.cs create mode 100644 Assets/PlayFabSDK/Shared/Editor/PlayFabHelp.cs.meta create mode 100644 Assets/PlayFabSDK/Shared/Internal.meta create mode 100644 Assets/PlayFabSDK/Shared/Internal/ISerializer.cs create mode 100644 Assets/PlayFabSDK/Shared/Internal/ISerializer.cs.meta create mode 100644 Assets/PlayFabSDK/Shared/Internal/Log.cs create mode 100644 Assets/PlayFabSDK/Shared/Internal/Log.cs.meta create mode 100644 Assets/PlayFabSDK/Shared/Internal/PlayFabErrors.cs create mode 100644 Assets/PlayFabSDK/Shared/Internal/PlayFabErrors.cs.meta create mode 100644 Assets/PlayFabSDK/Shared/Internal/PlayFabHttp.meta create mode 100644 Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/GzipDownloadHandler.cs create mode 100644 Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/GzipDownloadHandler.cs.meta create mode 100644 Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/IPlayFabHttp.cs create mode 100644 Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/IPlayFabHttp.cs.meta create mode 100644 Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/PlayFabHTTP.cs create mode 100644 Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/PlayFabHTTP.cs.meta create mode 100644 Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/PlayFabUnityHttp.cs create mode 100644 Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/PlayFabUnityHttp.cs.meta create mode 100644 Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/PlayFabWWW.cs create mode 100644 Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/PlayFabWWW.cs.meta create mode 100644 Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/PlayFabWebRequest.cs create mode 100644 Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/PlayFabWebRequest.cs.meta create mode 100644 Assets/PlayFabSDK/Shared/Internal/SimpleJson.cs create mode 100644 Assets/PlayFabSDK/Shared/Internal/SimpleJson.cs.meta create mode 100644 Assets/PlayFabSDK/Shared/Internal/SingletonMonoBehaviour.cs create mode 100644 Assets/PlayFabSDK/Shared/Internal/SingletonMonoBehaviour.cs.meta create mode 100644 Assets/PlayFabSDK/Shared/Internal/Util.cs create mode 100644 Assets/PlayFabSDK/Shared/Internal/Util.cs.meta create mode 100644 Assets/PlayFabSDK/Shared/Internal/wsaReflectionExtensions.cs create mode 100644 Assets/PlayFabSDK/Shared/Internal/wsaReflectionExtensions.cs.meta create mode 100644 Assets/PlayFabSDK/Shared/Models.meta create mode 100644 Assets/PlayFabSDK/Shared/Models/PlayFabSharedSettings.cs create mode 100644 Assets/PlayFabSDK/Shared/Models/PlayFabSharedSettings.cs.meta create mode 100644 Assets/PlayFabSDK/Shared/Models/SharedModels.cs create mode 100644 Assets/PlayFabSDK/Shared/Models/SharedModels.cs.meta create mode 100644 Assets/PlayFabSDK/Shared/Public.meta create mode 100644 Assets/PlayFabSDK/Shared/Public/IPlayFabPlugin.cs create mode 100644 Assets/PlayFabSDK/Shared/Public/IPlayFabPlugin.cs.meta create mode 100644 Assets/PlayFabSDK/Shared/Public/ISerializerPlugin.cs create mode 100644 Assets/PlayFabSDK/Shared/Public/ISerializerPlugin.cs.meta create mode 100644 Assets/PlayFabSDK/Shared/Public/ITransportPlugin.cs create mode 100644 Assets/PlayFabSDK/Shared/Public/ITransportPlugin.cs.meta create mode 100644 Assets/PlayFabSDK/Shared/Public/PlayFabApiSettings.cs create mode 100644 Assets/PlayFabSDK/Shared/Public/PlayFabApiSettings.cs.meta create mode 100644 Assets/PlayFabSDK/Shared/Public/PlayFabAuthenticationContext.cs create mode 100644 Assets/PlayFabSDK/Shared/Public/PlayFabAuthenticationContext.cs.meta create mode 100644 Assets/PlayFabSDK/Shared/Public/PlayFabDataGatherer.cs create mode 100644 Assets/PlayFabSDK/Shared/Public/PlayFabDataGatherer.cs.meta create mode 100644 Assets/PlayFabSDK/Shared/Public/PlayFabEvents.cs create mode 100644 Assets/PlayFabSDK/Shared/Public/PlayFabEvents.cs.meta create mode 100644 Assets/PlayFabSDK/Shared/Public/PlayFabLogger.cs create mode 100644 Assets/PlayFabSDK/Shared/Public/PlayFabLogger.cs.meta create mode 100644 Assets/PlayFabSDK/Shared/Public/PlayFabSettings.cs create mode 100644 Assets/PlayFabSDK/Shared/Public/PlayFabSettings.cs.meta create mode 100644 Assets/PlayFabSDK/Shared/Public/PluginContract.cs create mode 100644 Assets/PlayFabSDK/Shared/Public/PluginContract.cs.meta create mode 100644 Assets/PlayFabSDK/Shared/Public/PluginContractKey.cs create mode 100644 Assets/PlayFabSDK/Shared/Public/PluginContractKey.cs.meta create mode 100644 Assets/PlayFabSDK/Shared/Public/PluginManager.cs create mode 100644 Assets/PlayFabSDK/Shared/Public/PluginManager.cs.meta create mode 100644 Assets/Plugins.meta create mode 100644 Assets/Plugins/AssetUsageDetector.meta create mode 100644 Assets/Plugins/AssetUsageDetector/Editor.meta create mode 100644 Assets/Plugins/AssetUsageDetector/Editor/AssetUsageDetector.Editor.asmdef create mode 100644 Assets/Plugins/AssetUsageDetector/Editor/AssetUsageDetector.Editor.asmdef.meta create mode 100644 Assets/Plugins/AssetUsageDetector/Editor/AssetUsageDetector.cs create mode 100644 Assets/Plugins/AssetUsageDetector/Editor/AssetUsageDetector.cs.meta create mode 100644 Assets/Plugins/AssetUsageDetector/Editor/AssetUsageDetectorCache.cs create mode 100644 Assets/Plugins/AssetUsageDetector/Editor/AssetUsageDetectorCache.cs.meta create mode 100644 Assets/Plugins/AssetUsageDetector/Editor/AssetUsageDetectorSearchFunctions.cs create mode 100644 Assets/Plugins/AssetUsageDetector/Editor/AssetUsageDetectorSearchFunctions.cs.meta create mode 100644 Assets/Plugins/AssetUsageDetector/Editor/AssetUsageDetectorSettings.cs create mode 100644 Assets/Plugins/AssetUsageDetector/Editor/AssetUsageDetectorSettings.cs.meta create mode 100644 Assets/Plugins/AssetUsageDetector/Editor/AssetUsageDetectorWindow.cs create mode 100644 Assets/Plugins/AssetUsageDetector/Editor/AssetUsageDetectorWindow.cs.meta create mode 100644 Assets/Plugins/AssetUsageDetector/Editor/Enumerators.cs create mode 100644 Assets/Plugins/AssetUsageDetector/Editor/Enumerators.cs.meta create mode 100644 Assets/Plugins/AssetUsageDetector/Editor/ListDrawer.cs create mode 100644 Assets/Plugins/AssetUsageDetector/Editor/ListDrawer.cs.meta create mode 100644 Assets/Plugins/AssetUsageDetector/Editor/ObjectToSearch.cs create mode 100644 Assets/Plugins/AssetUsageDetector/Editor/ObjectToSearch.cs.meta create mode 100644 Assets/Plugins/AssetUsageDetector/Editor/SearchRefactoring.cs create mode 100644 Assets/Plugins/AssetUsageDetector/Editor/SearchRefactoring.cs.meta create mode 100644 Assets/Plugins/AssetUsageDetector/Editor/SearchResult.cs create mode 100644 Assets/Plugins/AssetUsageDetector/Editor/SearchResult.cs.meta create mode 100644 Assets/Plugins/AssetUsageDetector/Editor/SearchResultTooltip.cs create mode 100644 Assets/Plugins/AssetUsageDetector/Editor/SearchResultTooltip.cs.meta create mode 100644 Assets/Plugins/AssetUsageDetector/Editor/SearchResultTreeView.cs create mode 100644 Assets/Plugins/AssetUsageDetector/Editor/SearchResultTreeView.cs.meta create mode 100644 Assets/Plugins/AssetUsageDetector/Editor/Utilities.cs create mode 100644 Assets/Plugins/AssetUsageDetector/Editor/Utilities.cs.meta create mode 100644 Assets/Plugins/AssetUsageDetector/Editor/VariableGetter.cs create mode 100644 Assets/Plugins/AssetUsageDetector/Editor/VariableGetter.cs.meta create mode 100644 Assets/Plugins/AssetUsageDetector/README.txt create mode 100644 Assets/Plugins/AssetUsageDetector/README.txt.meta create mode 100644 Assets/Plugins/Demigiant.meta create mode 100644 Assets/Plugins/Demigiant/DOTween.meta create mode 100644 Assets/Plugins/Demigiant/DOTween/DOTween.XML create mode 100644 Assets/Plugins/Demigiant/DOTween/DOTween.XML.meta create mode 100644 Assets/Plugins/Demigiant/DOTween/DOTween.dll create mode 100644 Assets/Plugins/Demigiant/DOTween/DOTween.dll.meta create mode 100644 Assets/Plugins/Demigiant/DOTween/Editor.meta create mode 100644 Assets/Plugins/Demigiant/DOTween/Editor/DOTweenEditor.XML create mode 100644 Assets/Plugins/Demigiant/DOTween/Editor/DOTweenEditor.XML.meta create mode 100644 Assets/Plugins/Demigiant/DOTween/Editor/DOTweenEditor.dll create mode 100644 Assets/Plugins/Demigiant/DOTween/Editor/DOTweenEditor.dll.meta create mode 100644 Assets/Plugins/Demigiant/DOTween/Editor/Imgs.meta create mode 100644 Assets/Plugins/Demigiant/DOTween/Editor/Imgs/DOTweenIcon.png create mode 100644 Assets/Plugins/Demigiant/DOTween/Editor/Imgs/DOTweenIcon.png.meta create mode 100644 Assets/Plugins/Demigiant/DOTween/Editor/Imgs/DOTweenMiniIcon.png create mode 100644 Assets/Plugins/Demigiant/DOTween/Editor/Imgs/DOTweenMiniIcon.png.meta create mode 100644 Assets/Plugins/Demigiant/DOTween/Editor/Imgs/Footer.png create mode 100644 Assets/Plugins/Demigiant/DOTween/Editor/Imgs/Footer.png.meta create mode 100644 Assets/Plugins/Demigiant/DOTween/Editor/Imgs/Footer_dark.png create mode 100644 Assets/Plugins/Demigiant/DOTween/Editor/Imgs/Footer_dark.png.meta create mode 100644 Assets/Plugins/Demigiant/DOTween/Editor/Imgs/Header.jpg create mode 100644 Assets/Plugins/Demigiant/DOTween/Editor/Imgs/Header.jpg.meta create mode 100644 Assets/Plugins/Demigiant/DOTween/Modules.meta create mode 100644 Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleAudio.cs create mode 100644 Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleAudio.cs.meta create mode 100644 Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleEPOOutline.cs create mode 100644 Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleEPOOutline.cs.meta create mode 100644 Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModulePhysics.cs create mode 100644 Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModulePhysics.cs.meta create mode 100644 Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModulePhysics2D.cs create mode 100644 Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModulePhysics2D.cs.meta create mode 100644 Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleSprite.cs create mode 100644 Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleSprite.cs.meta create mode 100644 Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleUI.cs create mode 100644 Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleUI.cs.meta create mode 100644 Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleUnityVersion.cs create mode 100644 Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleUnityVersion.cs.meta create mode 100644 Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleUtils.cs create mode 100644 Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleUtils.cs.meta create mode 100644 Assets/Plugins/Demigiant/DOTween/readme.txt create mode 100644 Assets/Plugins/Demigiant/DOTween/readme.txt.meta create mode 100644 Assets/Plugins/Demigiant/DOTweenPro.meta create mode 100644 Assets/Plugins/Demigiant/DOTweenPro/DOTweenAnimation.cs create mode 100644 Assets/Plugins/Demigiant/DOTweenPro/DOTweenAnimation.cs.meta create mode 100644 Assets/Plugins/Demigiant/DOTweenPro/DOTweenDeAudio.cs create mode 100644 Assets/Plugins/Demigiant/DOTweenPro/DOTweenDeAudio.cs.meta create mode 100644 Assets/Plugins/Demigiant/DOTweenPro/DOTweenDeUnityExtended.cs create mode 100644 Assets/Plugins/Demigiant/DOTweenPro/DOTweenDeUnityExtended.cs.meta create mode 100644 Assets/Plugins/Demigiant/DOTweenPro/DOTweenPro.dll create mode 100644 Assets/Plugins/Demigiant/DOTweenPro/DOTweenPro.dll.meta create mode 100644 Assets/Plugins/Demigiant/DOTweenPro/DOTweenProShortcuts.cs create mode 100644 Assets/Plugins/Demigiant/DOTweenPro/DOTweenProShortcuts.cs.meta create mode 100644 Assets/Plugins/Demigiant/DOTweenPro/DOTweenTextMeshPro.cs create mode 100644 Assets/Plugins/Demigiant/DOTweenPro/DOTweenTextMeshPro.cs.meta create mode 100644 Assets/Plugins/Demigiant/DOTweenPro/DOTweenTk2d.cs create mode 100644 Assets/Plugins/Demigiant/DOTweenPro/DOTweenTk2d.cs.meta create mode 100644 Assets/Plugins/Demigiant/DOTweenPro/Editor.meta create mode 100644 Assets/Plugins/Demigiant/DOTweenPro/Editor/DOTweenAnimationInspector.cs create mode 100644 Assets/Plugins/Demigiant/DOTweenPro/Editor/DOTweenAnimationInspector.cs.meta create mode 100644 Assets/Plugins/Demigiant/DOTweenPro/Editor/DOTweenPreviewManager.cs create mode 100644 Assets/Plugins/Demigiant/DOTweenPro/Editor/DOTweenPreviewManager.cs.meta create mode 100644 Assets/Plugins/Demigiant/DOTweenPro/Editor/DOTweenProEditor.dll create mode 100644 Assets/Plugins/Demigiant/DOTweenPro/Editor/DOTweenProEditor.dll.meta create mode 100644 Assets/Plugins/Demigiant/DemiLib.meta create mode 100644 Assets/Plugins/Demigiant/DemiLib/Core.meta create mode 100644 Assets/Plugins/Demigiant/DemiLib/Core/DemiLib.dll create mode 100644 Assets/Plugins/Demigiant/DemiLib/Core/DemiLib.dll.meta create mode 100644 Assets/Plugins/Demigiant/DemiLib/Core/Editor.meta create mode 100644 Assets/Plugins/Demigiant/DemiLib/Core/Editor/DemiEditor.dll create mode 100644 Assets/Plugins/Demigiant/DemiLib/Core/Editor/DemiEditor.dll.meta create mode 100644 Assets/Scripts/GameConstants.cs create mode 100644 Assets/Scripts/GameConstants.cs.meta rename Assets/{ => Scripts}/HingeJointBreakReceiver.cs (100%) rename Assets/{ => Scripts}/HingeJointBreakReceiver.cs.meta (100%) rename Assets/{ => Scripts}/LoadingManager.cs (100%) rename Assets/{ => Scripts}/LoadingManager.cs.meta (100%) rename Assets/{ => Scripts}/ObstacleColliderSetter.cs (100%) rename Assets/{ => Scripts}/ObstacleColliderSetter.cs.meta (100%) rename Assets/{ => Scripts}/ObstacleInstantiator.cs (100%) rename Assets/{ => Scripts}/ObstacleInstantiator.cs.meta (100%) create mode 100644 Assets/Scripts/PlayFab.meta create mode 100644 Assets/Scripts/PlayFab/PlayFabInit.cs create mode 100644 Assets/Scripts/PlayFab/PlayFabInit.cs.meta create mode 100644 Assets/Scripts/PlayFab/PlayFabLeaderboards.cs create mode 100644 Assets/Scripts/PlayFab/PlayFabLeaderboards.cs.meta create mode 100644 Assets/Scripts/PlayFab/PlayFabManager.cs create mode 100644 Assets/Scripts/PlayFab/PlayFabManager.cs.meta create mode 100644 Assets/Scripts/PlayFab/PlayFabUserData.cs create mode 100644 Assets/Scripts/PlayFab/PlayFabUserData.cs.meta create mode 100644 Assets/Scripts/Popup.cs create mode 100644 Assets/Scripts/Popup.cs.meta create mode 100644 Assets/UI/Mockups/LeaderBoard_Atlas.png create mode 100644 Assets/UI/Mockups/LeaderBoard_Atlas.png.meta delete mode 100644 Assets/UI/Mockups/LeaderBoard_Screen_2.png create mode 100644 Assets/UI/Mockups/Leaderboard.png rename Assets/UI/Mockups/{LeaderBoard_Screen_2.png.meta => Leaderboard.png.meta} (98%) diff --git a/Assets/LeaderBoard.meta b/Assets/LeaderBoard.meta new file mode 100644 index 00000000..734c56bf --- /dev/null +++ b/Assets/LeaderBoard.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 79b06a32530eb6a47b2c89f88015eadc +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LeaderBoard/Blue Badge.meta b/Assets/LeaderBoard/Blue Badge.meta new file mode 100644 index 00000000..7a83cc28 --- /dev/null +++ b/Assets/LeaderBoard/Blue Badge.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 46775c866c2dc6a44b8e8da1f3e2fcd6 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LeaderBoard/Blue Badge/2nd Badge.png b/Assets/LeaderBoard/Blue Badge/2nd Badge.png new file mode 100644 index 0000000000000000000000000000000000000000..4eafa0526338a5b817f6fe7702efd87351562f5c GIT binary patch literal 21244 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 literal 0 HcmV?d00001 diff --git a/Assets/LeaderBoard/Blue Badge/2nd.png.meta b/Assets/LeaderBoard/Blue Badge/2nd.png.meta new file mode 100644 index 00000000..2d784952 --- /dev/null +++ b/Assets/LeaderBoard/Blue Badge/2nd.png.meta @@ -0,0 +1,140 @@ +fileFormatVersion: 2 +guid: a9dd269235deb3742b16aea44796fdd7 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Server + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LeaderBoard/Blue Badge/Player Icon BG.png b/Assets/LeaderBoard/Blue Badge/Player Icon BG.png new file mode 100644 index 0000000000000000000000000000000000000000..ba3983873537f08e015e6fc66f7978d4d44b8176 GIT binary patch literal 5929 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 literal 0 HcmV?d00001 diff --git a/Assets/LeaderBoard/Blue Badge/Player Icon.png.meta b/Assets/LeaderBoard/Blue Badge/Player Icon.png.meta new file mode 100644 index 00000000..3f08edba --- /dev/null +++ b/Assets/LeaderBoard/Blue Badge/Player Icon.png.meta @@ -0,0 +1,140 @@ +fileFormatVersion: 2 +guid: bc1aac194d734db4caa4d32d1e841d6d +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Server + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LeaderBoard/Blue Badge/Score BG.png b/Assets/LeaderBoard/Blue Badge/Score BG.png new file mode 100644 index 0000000000000000000000000000000000000000..2bcc95d91c430ee5bf428ff8df6b980e3b0c90ba GIT binary patch literal 2359 zcmV-73CQ+|P)s7Oi6X zZX!+7eq&1849639FCYf3lcp)q-9Lh~uAirdt;Fkak(ZcFG#A!YE301L>&J>pnstTD zU`-D-dv3ilNhZ;@12EnLOxPlkG#w(V%{n$nfSZYr(QzC?n5h423%>BJee#lT(iJ~~ zi@b!IbsQk>B0f%xI&I5>exT|Oh60TPoMu1yZNRs4N>`fZ@t5g*C&`fCDwJ#yWjl^a z*QyE~*xa!0PAFt;hADP4#-5?Uk{*xmVqv7TNmbPZT-;XB92gV{4RNn(N_ zL}5uroSVXn{ z6l=Lpj;hKBqofQj79K*djA-8NkD2S^6q5Xo7V6fjlw(kZE!XS{X}&gituVsERE>w^ zAAPoHXj0?j5Ci>l)Q$oaSu% zdjeg3Vq(%)P!js%C%lM~R$^4eFdw%F9|H?%w2+%c`iy`|=h?({Inhhw28wBna*Xk) zb+4~)R`Ec!BN}>^!4ZKgayS8X}u-HUf zVzLNAg6znk3rurz6vmun7IT9v(Lt++TtjWN6NkR6;Ug=kYf{ajK*~``j3MV@QMoMaLOa47kV(WLG3IXSk8l zQQOe0N4f@0R1_=l=q9|f+K$qt1$G!>1+-zw*`#P__U+J>a6adXG`R0EOLXR?28^c+ zw8trzI+VuO_9qY8h?fW^U__p{}_DYtE0PJX<$u2uRyWlB4*1 zH@gb$b~06k(9=1FDTB)G`{{-XUOI3B`jSk)nUP&aya=>(acepL%F{=F^R*4S($_j%AeRFiK!$NU}E} zCsuN7G0o&Qf`(Gp;7Z?S?0EW@ICJru5eh_(g+fJ_;3EG)PBWMNoU6nZ3R4^Zbi#fKP9LrspW#OJ?*8FH zDyNSYMN3b^#p1yXyB)R zPT`feOmqy&?ko|Bl)N4eM%}G}MFv@N&sQ{?6pq6?Hfx@}+ZB|_y(oiay-ePVQLbLFK~^>DGMFx@&$u2@?bVxBK<52E}*KdsHk7t4j6F30Id zEI#dCluF6*&TRtq=S=*qRbOtuxXj$`fkgzNAUR*r6snqnKzR{uF9a!V5t!JTCPxvS z*X{kNX`sn38q z#R5PG){{&PwB@oAH+}z^M8VjsQZU`E$3+JdVoWVSqx{0$e4VDLyDy!5`uQ%;CqEjv z`HXyRVr+EA#l5b6fyPrhXpgBwRn#P0iTLopcT@n4tZbe^B_7YzUa002ovPDHLkV1hxYU?Knj literal 0 HcmV?d00001 diff --git a/Assets/LeaderBoard/Blue Badge/Score BG.png.meta b/Assets/LeaderBoard/Blue Badge/Score BG.png.meta new file mode 100644 index 00000000..95f503bb --- /dev/null +++ b/Assets/LeaderBoard/Blue Badge/Score BG.png.meta @@ -0,0 +1,140 @@ +fileFormatVersion: 2 +guid: 04703626bdf991e4b96167af282c4631 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Server + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LeaderBoard/Blue Badge/silver.png b/Assets/LeaderBoard/Blue Badge/silver.png new file mode 100644 index 0000000000000000000000000000000000000000..8d93ce2e2377cf098418926fedf9958fd9f0ff46 GIT binary patch literal 12476 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 DRW@N* literal 0 HcmV?d00001 diff --git a/Assets/LeaderBoard/Game Stats Btn.png.meta b/Assets/LeaderBoard/Game Stats Btn.png.meta new file mode 100644 index 00000000..d918e5fb --- /dev/null +++ b/Assets/LeaderBoard/Game Stats Btn.png.meta @@ -0,0 +1,140 @@ +fileFormatVersion: 2 +guid: b88c20372c68cb84ba2124152955fbc5 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Server + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LeaderBoard/Greeen Badge.meta b/Assets/LeaderBoard/Greeen Badge.meta new file mode 100644 index 00000000..8cf3b5e0 --- /dev/null +++ b/Assets/LeaderBoard/Greeen Badge.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a1619e2e4b9824a44a829ca98910074e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LeaderBoard/Greeen Badge/3rd Badge.png b/Assets/LeaderBoard/Greeen Badge/3rd Badge.png new file mode 100644 index 0000000000000000000000000000000000000000..0ea4f9e92b99b3667641891706e9b367a2c3b350 GIT binary patch literal 23325 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 YA56oX98(nx-v9sr07*qoM6N<$g1k2N^#A|> literal 0 HcmV?d00001 diff --git a/Assets/LeaderBoard/Greeen Badge/3rd Badge.png.meta b/Assets/LeaderBoard/Greeen Badge/3rd Badge.png.meta new file mode 100644 index 00000000..b49b2a25 --- /dev/null +++ b/Assets/LeaderBoard/Greeen Badge/3rd Badge.png.meta @@ -0,0 +1,140 @@ +fileFormatVersion: 2 +guid: 54db0eccb9c5a42498a066622a1878f4 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Server + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LeaderBoard/Greeen Badge/3rd.png b/Assets/LeaderBoard/Greeen Badge/3rd.png new file mode 100644 index 0000000000000000000000000000000000000000..2802b5a506f5f96d5799d7b139e411bbc3b68e3d GIT binary patch literal 10669 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 S*iU~~qNpfn$~SboS&5s3 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 bN!I@ZYQ}w!g4sv<00000NkvXXu0mjfq>Xop literal 0 HcmV?d00001 diff --git a/Assets/LeaderBoard/Greeen Badge/Player Icon BG.png.meta b/Assets/LeaderBoard/Greeen Badge/Player Icon BG.png.meta new file mode 100644 index 00000000..a4feb9af --- /dev/null +++ b/Assets/LeaderBoard/Greeen Badge/Player Icon BG.png.meta @@ -0,0 +1,140 @@ +fileFormatVersion: 2 +guid: 6491ca13a9741c6429b67b710c0ddc83 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Server + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LeaderBoard/Greeen Badge/Player Icon.png b/Assets/LeaderBoard/Greeen Badge/Player Icon.png new file mode 100644 index 0000000000000000000000000000000000000000..b7da6b9011d6790059ab271ce671ad43d9313458 GIT binary patch literal 16619 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 literal 0 HcmV?d00001 diff --git a/Assets/LeaderBoard/Greeen Badge/Player Icon.png.meta b/Assets/LeaderBoard/Greeen Badge/Player Icon.png.meta new file mode 100644 index 00000000..a87d0b38 --- /dev/null +++ b/Assets/LeaderBoard/Greeen Badge/Player Icon.png.meta @@ -0,0 +1,140 @@ +fileFormatVersion: 2 +guid: 15141c0f5e2bff2469cab6603105f486 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Server + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LeaderBoard/Greeen Badge/Score BG.png b/Assets/LeaderBoard/Greeen Badge/Score BG.png new file mode 100644 index 0000000000000000000000000000000000000000..1a037e71cbb79f9d817862e0f7b9a2549c0b9172 GIT binary patch literal 2409 zcmV-v36}PWP)wY#K~#7F?ObbY z99I?o?mTv8c5UyjAM3<@nPHo?5+vtCOOVSij6+YbvZh_2jIATFMZuY%pgEXVk*(p5*t7B2{o~2mjPXK zfauM@;{9}5dH>z%2H@0s5|&O1z?ewf9FaShKQBb4kv61{(iaQ1ZR3GQ>+#EHU$N=L zZNxVbpd?W^`&Gmr5;qb<@SP^UY!O36gtW!Pt&QX+kI~f)KBSLvAf!pI9{ zQqhPv(7lRhVF;-*Zn$zW81r8AH~O^6-%??tq9GQIA7@N<5a6HI8T zN8J3iPpk67-!>o%j}eB^WM#&}+<3rFyu!7G*itL(6o}>j0vbZP-FqR?G_f<<}?6^mRM81@)CL+^FEGLnbT|k-eC7 z^>La#5(cZTA(?3yFC3cHDn6~O5tRCu41n+KffK}V|lJk35MhN0?E^LW|jvt%8eK`L2atp*#rJ5 zDodNB%e|C{Z+j$7xs23b8JqX2C=(z+NkA?*ZieVn5AYlRddvOq2_q3<|R!F_ai{bz~Q`pvKbbe zX6__zBCaJa-@H~;_U#P&noww^R1qDY3{y*h5A^$?YdXRq(J_8&gnMl zs4AVIkk(>oWoHc|(k{!givT4BA)3hwW};>N=N!dy>Mw`hvNpc<9~-w{M?*y6#I*e0 zQ9f%Ht|Q#Xoz6UyTS*Bpbq)5^A4cP;Rz$)TuUA#hdlNzmMUdKtd?lP7WZe9uTc zUc1-O!+i))@(_vebVVa%ag1m-ce>Z?f5VPMBMh}Mjxx;^yY1lHk6Z9L5yFvdTu9!8 zNA{NCJ3oC2tzG>Cv1mdI4Lo;v5x)Oe51x79pN?ts_Go$hmGbg<69UW`Tx`ibU0h8R zIfzn6OY*yKkn!MWRaDhdP7@}jgd~3zl_BAzU9@+&c=$jT`x-eqhD81>4OUmx{Xy5l zJqR$TAXZPsI87eHKekdGXTz?oAw2O_6`QHm5Ec<>h=kHdtE%^iy_DMwy51k6RFIZ7 zt&(y7t+LmiI(){}CC2&;qwG8a%qa+`naLg%DhFeAZ6(8&dt!(tR4Tb}ztvz8lUbh^ zSqFtFeEsOl3UO~eQ*P^xRdVpQn!S^~L9M_q8< z)j8>4m8>RAP06I`sE*@M{Z6(KV6Gr*n&_VCZa6Bf z1(!%InKYSLX42x`f6qDS8|El4*IR?oRPu0X8k1CsYvMe0u&wQMTAZ9|h^Qm(gx?Xb zE^;h&HKqD^yzW=gXxT6Vlq{$;;!+NiY;Qjyb{dREhW{t85dRIyO8Bd(VjzTaikL=# bIf?%Pxok~TZFkP}00000NkvXXu0mjfZOeCu literal 0 HcmV?d00001 diff --git a/Assets/LeaderBoard/Greeen Badge/Score BG.png.meta b/Assets/LeaderBoard/Greeen Badge/Score BG.png.meta new file mode 100644 index 00000000..bff7749c --- /dev/null +++ b/Assets/LeaderBoard/Greeen Badge/Score BG.png.meta @@ -0,0 +1,140 @@ +fileFormatVersion: 2 +guid: d1a254d145eb8a14ca793fd3035c8b0c +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Server + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LeaderBoard/Greeen Badge/bronze.png b/Assets/LeaderBoard/Greeen Badge/bronze.png new file mode 100644 index 0000000000000000000000000000000000000000..91703077bc5e6dde68d08c3d12542020eb6f8885 GIT binary patch literal 13350 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

P-7a@1gMv+Xy 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 z≷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 b%L{)4bN73uQbSFi00000NkvXXu0mjftU+lg literal 0 HcmV?d00001 diff --git a/Assets/LeaderBoard/Leaderboard icon.png.meta b/Assets/LeaderBoard/Leaderboard icon.png.meta new file mode 100644 index 00000000..b2b798a8 --- /dev/null +++ b/Assets/LeaderBoard/Leaderboard icon.png.meta @@ -0,0 +1,140 @@ +fileFormatVersion: 2 +guid: 51493f452804e0149a3098e5000e5c3e +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Server + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LeaderBoard/LeaderboardUIScreen.cs b/Assets/LeaderBoard/LeaderboardUIScreen.cs new file mode 100644 index 00000000..c1803af2 --- /dev/null +++ b/Assets/LeaderBoard/LeaderboardUIScreen.cs @@ -0,0 +1,91 @@ +using System.Collections; +using System.Collections.Generic; +using DG.Tweening; +using PlayFab; +using PlayFab.ClientModels; +using UnityEngine; + +public class LeaderboardUIScreen : MonoBehaviour +{ + [SerializeField] private GameObject lbItemPrefab; + [SerializeField] private GameObject lbItemSelfPrefab; + [SerializeField] private Transform content; + [SerializeField] private List _lbPedestalItems; + + + public void Init() + { + PlayFabManager.Instance.playFabLeaderboards.GetLeaderboard(OnLeaderboardFetchSuccess, OnLeaderboardFetchFailure); + } + + public void OnClose() + { + // GameObject[] temp = content.transform.GetComponentsInChildren(); + // for (int i = 0; i < temp.Length; i++) + // { + // Destroy(temp[i]); + // } + } + private void OnLeaderboardFetchSuccess(List leaderboard) + { + foreach (Transform child in content.transform) + { + Destroy(child.gameObject); + } + PopulateLeaderboard(leaderboard); + } + + private void PopulateLeaderboard(List leaderboard) + { + foreach (PlayerLeaderboardEntry lbEntry in leaderboard) + { + PopulateLbItem(lbEntry); + if (lbEntry.Position <= 2) + { + PopulatePedestalItem(lbEntry); + } + } + + content.GetComponent().DOAnchorPosX(0f,1f).SetEase(Ease.OutElastic); + } + + private void PopulateLbItem(PlayerLeaderboardEntry lbEntry) + { + bool isSelf = lbEntry.Profile.PlayerId == PlayFabManager.Instance.playFabUserDataManager.myProfile.PlayerId; + LBEntryItem lbItem = Instantiate(isSelf ? lbItemSelfPrefab : lbItemPrefab, content).GetComponent(); + lbItem.nameText.text = lbEntry.DisplayName; + lbItem.rankText.text = (lbEntry.Position + 1).ToString(); + lbItem.scoreText.text = lbEntry.StatValue.ToString(); + PlayFabManager.Instance.playFabUserDataManager.GetPlayerAvatarImage(lbEntry.PlayFabId, (sprite) => + { + lbItem.profilePic.sprite = sprite; + }, + (s) => + { + Debug.Log("Couldnt get pic"); + }); + } + + private void PopulatePedestalItem(PlayerLeaderboardEntry lbEntry) + { + LBPedestalItem pedestalItem = _lbPedestalItems[lbEntry.Position]; + pedestalItem.nameText.text = lbEntry.DisplayName??lbEntry.PlayFabId; + pedestalItem.scoreText.text = lbEntry.StatValue.ToString(); + PlayFabManager.Instance.playFabUserDataManager.GetPlayerAvatarImage(lbEntry.PlayFabId, (sprite) => + { + pedestalItem.profilePic.sprite = sprite; + }, + (s) => + { + Debug.Log("Could'nt get pic"); + }); + } + + private void OnLeaderboardFetchFailure(PlayFabError obj) + { + Debug.Log("Couldn't Load Leaderboards"); + throw new System.NotImplementedException(); + } + + +} \ No newline at end of file diff --git a/Assets/LeaderBoard/LeaderboardUIScreen.cs.meta b/Assets/LeaderBoard/LeaderboardUIScreen.cs.meta new file mode 100644 index 00000000..9d4a2bca --- /dev/null +++ b/Assets/LeaderBoard/LeaderboardUIScreen.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 55aae5a6257107a44b1b3e7aaa35a195 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LeaderBoard/LeaderboardsPopup.prefab b/Assets/LeaderBoard/LeaderboardsPopup.prefab new file mode 100644 index 00000000..a0a4050e --- /dev/null +++ b/Assets/LeaderBoard/LeaderboardsPopup.prefab @@ -0,0 +1,3244 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &557147154123014621 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8419866730315268015} + - component: {fileID: 1181891632044987989} + - component: {fileID: 6083117393018200431} + m_Layer: 5 + m_Name: Image + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &8419866730315268015 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 557147154123014621} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 6173620582364838532} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: -2.5} + m_SizeDelta: {x: 100, y: 100} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &1181891632044987989 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 557147154123014621} + m_CullTransparentMesh: 1 +--- !u!114 &6083117393018200431 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 557147154123014621} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 7e150c4afc786904f84fc3b2e4c11350, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &637605459286238928 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5349940134371925265} + - component: {fileID: 4581989794700682229} + - component: {fileID: 2443837336851898533} + - component: {fileID: 1406664460626900625} + m_Layer: 5 + m_Name: Scrollbar Vertical + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5349940134371925265 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 637605459286238928} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 3958252575314362444} + m_Father: {fileID: 7908368764155878626} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 20, y: -17} + m_Pivot: {x: 1, y: 1} +--- !u!222 &4581989794700682229 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 637605459286238928} + m_CullTransparentMesh: 1 +--- !u!114 &2443837336851898533 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 637605459286238928} + m_Enabled: 0 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &1406664460626900625 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 637605459286238928} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2a4db7a114972834c8e4117be1d82ba3, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 6895122972546768773} + m_HandleRect: {fileID: 7590745601293574830} + m_Direction: 2 + m_Value: 0 + m_Size: 1 + m_NumberOfSteps: 0 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!1 &680034626746863993 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1747626111088941446} + - component: {fileID: 4107686923468033214} + - component: {fileID: 5733033280246237306} + m_Layer: 5 + m_Name: Content + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1747626111088941446 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 680034626746863993} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 5610676133267508060} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: -748, y: -0.000015258789} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 1} +--- !u!114 &4107686923468033214 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 680034626746863993} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 26 + m_Bottom: 0 + m_ChildAlignment: 4 + m_Spacing: 21.49 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 1 + m_ChildControlWidth: 0 + m_ChildControlHeight: 0 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!114 &5733033280246237306 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 680034626746863993} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalFit: 0 + m_VerticalFit: 1 +--- !u!1 &798348269427432346 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5791384925163365661} + - component: {fileID: 7798862639691759510} + - component: {fileID: 260420654435351703} + m_Layer: 5 + m_Name: Title + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5791384925163365661 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 798348269427432346} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 4735665652752827894} + - {fileID: 5903304236167724968} + m_Father: {fileID: 3188961330950474097} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 627} + m_SizeDelta: {x: 1080, y: 143} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &7798862639691759510 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 798348269427432346} + m_CullTransparentMesh: 1 +--- !u!114 &260420654435351703 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 798348269427432346} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 06dffca9e3f00254ca057e54eeaf4db6, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &997826620294071120 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 528626936020999711} + m_Layer: 5 + m_Name: Bottom + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &528626936020999711 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 997826620294071120} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1145879704583983232} + - {fileID: 8120531800328111538} + m_Father: {fileID: 3188961330950474097} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0.000044823, y: -190.29999} + m_SizeDelta: {x: 1080, y: 1491.5898} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &1071540396518864600 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1145879704583983232} + m_Layer: 5 + m_Name: Pedestals + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1145879704583983232 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1071540396518864600} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 3872224434289621884} + - {fileID: 6149721199726190709} + - {fileID: 8946041518128319346} + m_Father: {fileID: 528626936020999711} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 1} + m_AnchorMax: {x: 0.5, y: 1} + m_AnchoredPosition: {x: -0.000030518, y: -211.26001} + m_SizeDelta: {x: 1080, y: 422.51} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &1097430708833912393 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5610676133267508060} + - component: {fileID: 2924084758062903309} + - component: {fileID: 8431159125301722522} + - component: {fileID: 7999982977908214420} + m_Layer: 5 + m_Name: Viewport + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5610676133267508060 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1097430708833912393} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1747626111088941446} + m_Father: {fileID: 7908368764155878626} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -17, y: 0} + m_Pivot: {x: 0, y: 1} +--- !u!222 &2924084758062903309 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1097430708833912393} + m_CullTransparentMesh: 1 +--- !u!114 &8431159125301722522 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1097430708833912393} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10917, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &7999982977908214420 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1097430708833912393} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ShowMaskGraphic: 0 +--- !u!1 &1146114322331457230 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1721820768241144808} + - component: {fileID: 591885642959245493} + - component: {fileID: 463992416660821392} + m_Layer: 5 + m_Name: Image + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1721820768241144808 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1146114322331457230} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 6405750164602226961} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: -2.5} + m_SizeDelta: {x: 100, y: 100} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &591885642959245493 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1146114322331457230} + m_CullTransparentMesh: 1 +--- !u!114 &463992416660821392 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1146114322331457230} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 7e150c4afc786904f84fc3b2e4c11350, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &1442121232043085476 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6149721199726190709} + - component: {fileID: 3917684457119669760} + - component: {fileID: 6698527436560297237} + - component: {fileID: 5995147595232219457} + m_Layer: 5 + m_Name: 2nd + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &6149721199726190709 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1442121232043085476} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 6405750164602226961} + - {fileID: 7786521502248466313} + - {fileID: 3848434021611269837} + m_Father: {fileID: 1145879704583983232} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -335, y: 14} + m_SizeDelta: {x: 282, y: 318} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &3917684457119669760 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1442121232043085476} + m_CullTransparentMesh: 1 +--- !u!114 &6698527436560297237 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1442121232043085476} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 9f9140f20bb0f1341b19f2fb79482701, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &5995147595232219457 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1442121232043085476} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe7a6c08caa987c438eef91a7a0fc0d3, type: 3} + m_Name: + m_EditorClassIdentifier: + pedestalNumber: 2 + scoreText: {fileID: 436060366358511923} + profilePic: {fileID: 463992416660821392} + nameText: {fileID: 2846011980314604040} +--- !u!1 &1604885169809551255 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6405750164602226961} + - component: {fileID: 5939701949750862969} + - component: {fileID: 7229894356953497478} + m_Layer: 5 + m_Name: AvatarPicture + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &6405750164602226961 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1604885169809551255} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1.00032, y: 1.00032, z: 1.00032} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1721820768241144808} + m_Father: {fileID: 6149721199726190709} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 1} + m_AnchorMax: {x: 0.5, y: 1} + m_AnchoredPosition: {x: 0, y: -63} + m_SizeDelta: {x: 110, y: 110} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &5939701949750862969 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1604885169809551255} + m_CullTransparentMesh: 1 +--- !u!114 &7229894356953497478 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1604885169809551255} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 9c963c49b2bf6c2408edcacbaae98200, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &1628212734907332929 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7908368764155878626} + - component: {fileID: 5625572055148134984} + - component: {fileID: 7570351247015322326} + - component: {fileID: 6438779806148728639} + m_Layer: 5 + m_Name: Scroll View + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &7908368764155878626 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1628212734907332929} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 5610676133267508060} + - {fileID: 5349940134371925265} + m_Father: {fileID: 8120531800328111538} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 11.378, y: -19.962} + m_SizeDelta: {x: 1057.2, y: 793.97} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &5625572055148134984 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1628212734907332929} + m_CullTransparentMesh: 1 +--- !u!114 &7570351247015322326 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1628212734907332929} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &6438779806148728639 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1628212734907332929} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Content: {fileID: 1747626111088941446} + m_Horizontal: 0 + m_Vertical: 1 + m_MovementType: 1 + m_Elasticity: 0.1 + m_Inertia: 1 + m_DecelerationRate: 0.135 + m_ScrollSensitivity: 1 + m_Viewport: {fileID: 5610676133267508060} + m_HorizontalScrollbar: {fileID: 0} + m_VerticalScrollbar: {fileID: 1406664460626900625} + m_HorizontalScrollbarVisibility: 2 + m_VerticalScrollbarVisibility: 0 + m_HorizontalScrollbarSpacing: -3 + m_VerticalScrollbarSpacing: -3 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!1 &1748742743882202489 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3188961330950474097} + - component: {fileID: 8933557624151551328} + - component: {fileID: 7481815994550998155} + - component: {fileID: 2280375977384003943} + - component: {fileID: 6330872946456230171} + - component: {fileID: 3467639517487986001} + - component: {fileID: 6418597962137773390} + m_Layer: 5 + m_Name: LeaderboardsPopup + m_TagString: + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &3188961330950474097 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1748742743882202489} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 7795106250517606859} + - {fileID: 5791384925163365661} + - {fileID: 528626936020999711} + - {fileID: 2391405157991017669} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &8933557624151551328 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1748742743882202489} + m_CullTransparentMesh: 0 +--- !u!114 &7481815994550998155 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1748742743882202489} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 7fee049f2ce6b13489377767baad0bbe, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &2280375977384003943 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1748742743882202489} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: df3ac59bdfef626ba9cf312eb790f208, type: 3} + m_Name: + m_EditorClassIdentifier: + animator: {fileID: 3467639517487986001} + openClip: {fileID: 7400000, guid: 9d7af72f6b764e78a819c8a855ccf8d4, type: 2} + closeClip: {fileID: 7400000, guid: 772dcd83a8024cf287b4687b015f93ce, type: 2} + isOpen: 0 + closeOnEsc: 0 + onClose: + m_PersistentCalls: + m_Calls: [] + onOpen: + m_PersistentCalls: + m_Calls: [] + ChooseModePanel: {fileID: 0} +--- !u!225 &6330872946456230171 +CanvasGroup: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1748742743882202489} + m_Enabled: 1 + m_Alpha: 0 + m_Interactable: 1 + m_BlocksRaycasts: 0 + m_IgnoreParentGroups: 0 +--- !u!95 &3467639517487986001 +Animator: + serializedVersion: 5 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1748742743882202489} + m_Enabled: 1 + m_Avatar: {fileID: 0} + m_Controller: {fileID: 9100000, guid: 3daaf3704a3b4865b42d6050afc0a129, type: 2} + m_CullingMode: 0 + m_UpdateMode: 0 + m_ApplyRootMotion: 0 + m_LinearVelocityBlending: 0 + m_StabilizeFeet: 0 + m_WarningMessage: + m_HasTransformHierarchy: 1 + m_AllowConstantClipSamplingOptimization: 1 + m_KeepAnimatorStateOnDisable: 0 + m_WriteDefaultValuesOnDisable: 0 +--- !u!114 &6418597962137773390 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1748742743882202489} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 55aae5a6257107a44b1b3e7aaa35a195, type: 3} + m_Name: + m_EditorClassIdentifier: + lbItemPrefab: {fileID: 5850781625971850372, guid: 88afb99e58a715640befe7148c6e92c6, + type: 3} + lbItemSelfPrefab: {fileID: 3156808416426534223, guid: 67cb11c0d1417534e985eb7be1f6edf5, + type: 3} + content: {fileID: 1747626111088941446} + _lbPedestalItems: + - {fileID: 2568540576917603135} + - {fileID: 5995147595232219457} + - {fileID: 2127333615051366362} +--- !u!1 &2470003454632191007 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4735665652752827894} + - component: {fileID: 1494487353863378112} + - component: {fileID: 746451839711248182} + m_Layer: 5 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &4735665652752827894 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2470003454632191007} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 5791384925163365661} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 44.15, y: -5.69} + m_SizeDelta: {x: 483.26, y: 91.98} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &1494487353863378112 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2470003454632191007} + m_CullTransparentMesh: 1 +--- !u!114 &746451839711248182 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2470003454632191007} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Leaderboard + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 2d1fdd99a68e87f46a9fdd01c22fa4c1, type: 2} + m_sharedMaterial: {fileID: 2742155659043687715, guid: 2d1fdd99a68e87f46a9fdd01c22fa4c1, + type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 65 + m_fontSizeBase: 65 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: -6 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!1 &2579048446216861191 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8120531800328111538} + m_Layer: 5 + m_Name: Leaderboard + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &8120531800328111538 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2579048446216861191} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 7908368764155878626} + m_Father: {fileID: 528626936020999711} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -0.0025167, y: -72.84} + m_SizeDelta: {x: 1080, y: 833.9} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &2622107513219700042 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1610181444242235534} + - component: {fileID: 4028466761449640734} + - component: {fileID: 6034158461557851727} + m_Layer: 5 + m_Name: Image + m_TagString: + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1610181444242235534 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2622107513219700042} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 8301229672940623885} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 100, y: 100} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &4028466761449640734 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2622107513219700042} + m_CullTransparentMesh: 0 +--- !u!114 &6034158461557851727 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2622107513219700042} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &3290230294266418972 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7795106250517606859} + - component: {fileID: 5526517940327419444} + - component: {fileID: 3754722599804949038} + m_Layer: 5 + m_Name: Top + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &7795106250517606859 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3290230294266418972} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 8301229672940623885} + m_Father: {fileID: 3188961330950474097} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 1.2497559, y: 0} + m_SizeDelta: {x: 2.5, y: 200} + m_Pivot: {x: 0.5, y: 1} +--- !u!222 &5526517940327419444 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3290230294266418972} + m_CullTransparentMesh: 1 +--- !u!114 &3754722599804949038 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3290230294266418972} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 95e4e9236a73b474bba55d4c96a69409, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &3384776165138785929 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3401715981148703993} + - component: {fileID: 874380762983180680} + - component: {fileID: 6749075302176805874} + m_Layer: 5 + m_Name: NameText + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &3401715981148703993 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3384776165138785929} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 3872224434289621884} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 17.500008} + m_SizeDelta: {x: 200, y: 50} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &874380762983180680 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3384776165138785929} + m_CullTransparentMesh: 1 +--- !u!114 &6749075302176805874 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3384776165138785929} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Player_B + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 9a2157e1f9c4c4d38841fbb92558f587, type: 2} + m_sharedMaterial: {fileID: -6360588970910393389, guid: 9a2157e1f9c4c4d38841fbb92558f587, + type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 20.2 + m_fontSizeBase: 20.2 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 1 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!1 &3694136961716263543 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2000930028036651019} + - component: {fileID: 5147716083833936058} + - component: {fileID: 1971496899274556348} + m_Layer: 5 + m_Name: ScoreBG + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2000930028036651019 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3694136961716263543} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 8920417141182831174} + m_Father: {fileID: 3872224434289621884} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0} + m_AnchorMax: {x: 0.5, y: 0} + m_AnchoredPosition: {x: 4, y: 154.9} + m_SizeDelta: {x: 141, y: 32} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &5147716083833936058 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3694136961716263543} + m_CullTransparentMesh: 1 +--- !u!114 &1971496899274556348 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3694136961716263543} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: d1a254d145eb8a14ca793fd3035c8b0c, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &3768516470805202590 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5903304236167724968} + - component: {fileID: 3089592200887117064} + - component: {fileID: 8509113259539622072} + m_Layer: 5 + m_Name: Icon + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5903304236167724968 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3768516470805202590} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 5791384925163365661} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -270, y: -2.2} + m_SizeDelta: {x: 107, y: 85} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &3089592200887117064 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3768516470805202590} + m_CullTransparentMesh: 1 +--- !u!114 &8509113259539622072 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3768516470805202590} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 51493f452804e0149a3098e5000e5c3e, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &3910370869869630003 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3958252575314362444} + m_Layer: 5 + m_Name: Sliding Area + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &3958252575314362444 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3910370869869630003} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 7590745601293574830} + m_Father: {fileID: 5349940134371925265} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -20, y: -20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &4279917105292183247 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7786521502248466313} + - component: {fileID: 2309847880210737624} + - component: {fileID: 2846011980314604040} + m_Layer: 5 + m_Name: NameText + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &7786521502248466313 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4279917105292183247} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1.00032, y: 1.00032, z: 1.00032} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 6149721199726190709} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 23.8} + m_SizeDelta: {x: 200, y: 50} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &2309847880210737624 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4279917105292183247} + m_CullTransparentMesh: 1 +--- !u!114 &2846011980314604040 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4279917105292183247} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Player_A + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 9a2157e1f9c4c4d38841fbb92558f587, type: 2} + m_sharedMaterial: {fileID: -6360588970910393389, guid: 9a2157e1f9c4c4d38841fbb92558f587, + type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 20.2 + m_fontSizeBase: 20.2 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 1 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!1 &4637163661367077425 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8920417141182831174} + - component: {fileID: 3518025843940199956} + - component: {fileID: 315217694452062773} + m_Layer: 5 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &8920417141182831174 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4637163661367077425} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 2000930028036651019} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0.5} + m_AnchorMax: {x: 1, y: 0.5} + m_AnchoredPosition: {x: -50.5, y: -0.7949896} + m_SizeDelta: {x: 75.97, y: 30.41} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &3518025843940199956 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4637163661367077425} + m_CullTransparentMesh: 1 +--- !u!114 &315217694452062773 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4637163661367077425} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: 12334 + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: f9650ff3b67d45e42aa51501d10136f4, type: 2} + m_sharedMaterial: {fileID: 2039440194532944411, guid: f9650ff3b67d45e42aa51501d10136f4, + type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 16.2 + m_fontSizeBase: 36 + m_fontWeight: 400 + m_enableAutoSizing: 1 + m_fontSizeMin: 14.5 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!1 &5530420961872123586 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8498960608888183952} + - component: {fileID: 4096312045254636229} + - component: {fileID: 9071939938260215743} + m_Layer: 5 + m_Name: NameText + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &8498960608888183952 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5530420961872123586} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1.00032, y: 1.00032, z: 1.00032} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 8946041518128319346} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 24.1} + m_SizeDelta: {x: 200, y: 50} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &4096312045254636229 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5530420961872123586} + m_CullTransparentMesh: 1 +--- !u!114 &9071939938260215743 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5530420961872123586} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Player_C + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 9a2157e1f9c4c4d38841fbb92558f587, type: 2} + m_sharedMaterial: {fileID: -6360588970910393389, guid: 9a2157e1f9c4c4d38841fbb92558f587, + type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 20.2 + m_fontSizeBase: 20.2 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 1 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!1 &5719200283397349705 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7590745601293574830} + - component: {fileID: 1432212494931475121} + - component: {fileID: 6895122972546768773} + m_Layer: 5 + m_Name: Handle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &7590745601293574830 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5719200283397349705} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 3958252575314362444} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &1432212494931475121 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5719200283397349705} + m_CullTransparentMesh: 1 +--- !u!114 &6895122972546768773 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5719200283397349705} + m_Enabled: 0 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &5920942481708289914 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3872224434289621884} + - component: {fileID: 7027640998771504340} + - component: {fileID: 5687352434375555613} + - component: {fileID: 2568540576917603135} + m_Layer: 5 + m_Name: 1st + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &3872224434289621884 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5920942481708289914} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 6173620582364838532} + - {fileID: 3401715981148703993} + - {fileID: 2000930028036651019} + m_Father: {fileID: 1145879704583983232} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: -7} + m_SizeDelta: {x: 342, y: 363} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &7027640998771504340 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5920942481708289914} + m_CullTransparentMesh: 1 +--- !u!114 &5687352434375555613 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5920942481708289914} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: eac67fa473e6abb4c9370e93e68f950a, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &2568540576917603135 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5920942481708289914} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe7a6c08caa987c438eef91a7a0fc0d3, type: 3} + m_Name: + m_EditorClassIdentifier: + pedestalNumber: 1 + scoreText: {fileID: 315217694452062773} + profilePic: {fileID: 6083117393018200431} + nameText: {fileID: 6749075302176805874} +--- !u!1 &6329351692557841965 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2391405157991017669} + - component: {fileID: 5321775284499801444} + - component: {fileID: 86669822633827353} + m_Layer: 5 + m_Name: BG + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &2391405157991017669 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6329351692557841965} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 3188961330950474097} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 1081, y: 1920} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &5321775284499801444 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6329351692557841965} + m_CullTransparentMesh: 1 +--- !u!114 &86669822633827353 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6329351692557841965} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0.44705883} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: ff7a408f0a445984f8901ce781a8d735, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &7228771786426541990 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6173620582364838532} + - component: {fileID: 3986781068956817881} + - component: {fileID: 6459730671968641592} + m_Layer: 5 + m_Name: AvatarPicture + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &6173620582364838532 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7228771786426541990} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1.00032, y: 1.00032, z: 1.00032} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 8419866730315268015} + m_Father: {fileID: 3872224434289621884} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 1} + m_AnchorMax: {x: 0.5, y: 1} + m_AnchoredPosition: {x: 0, y: -84} + m_SizeDelta: {x: 110, y: 110} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &3986781068956817881 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7228771786426541990} + m_CullTransparentMesh: 1 +--- !u!114 &6459730671968641592 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7228771786426541990} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 4771bc627bfed1f4e8e630650fc1b215, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &7504354048922750538 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3848434021611269837} + - component: {fileID: 131018001447619075} + - component: {fileID: 7888988808064996961} + m_Layer: 5 + m_Name: ScoreBG + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &3848434021611269837 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7504354048922750538} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1.00032, y: 1.00032, z: 1.00032} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 8026882825882188021} + m_Father: {fileID: 6149721199726190709} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0} + m_AnchorMax: {x: 0.5, y: 0} + m_AnchoredPosition: {x: 4, y: 138.5} + m_SizeDelta: {x: 141, y: 32} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &131018001447619075 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7504354048922750538} + m_CullTransparentMesh: 1 +--- !u!114 &7888988808064996961 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7504354048922750538} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: d1a254d145eb8a14ca793fd3035c8b0c, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &8337526333047669999 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6297160935192172493} + - component: {fileID: 7978439346278440852} + - component: {fileID: 3416664225675977437} + m_Layer: 5 + m_Name: ScoreBG + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &6297160935192172493 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8337526333047669999} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1.00032, y: 1.00032, z: 1.00032} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 4218099632659618690} + m_Father: {fileID: 8946041518128319346} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0} + m_AnchorMax: {x: 0.5, y: 0} + m_AnchoredPosition: {x: 4, y: 138.8} + m_SizeDelta: {x: 141, y: 32} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &7978439346278440852 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8337526333047669999} + m_CullTransparentMesh: 1 +--- !u!114 &3416664225675977437 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8337526333047669999} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: d1a254d145eb8a14ca793fd3035c8b0c, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &8524890884749119477 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4218099632659618690} + - component: {fileID: 8273856533913849190} + - component: {fileID: 4404033344474101012} + m_Layer: 5 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &4218099632659618690 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8524890884749119477} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 6297160935192172493} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0.5} + m_AnchorMax: {x: 1, y: 0.5} + m_AnchoredPosition: {x: -50.5, y: -0.7949896} + m_SizeDelta: {x: 75.97, y: 30.41} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &8273856533913849190 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8524890884749119477} + m_CullTransparentMesh: 1 +--- !u!114 &4404033344474101012 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8524890884749119477} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: 12334 + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: f9650ff3b67d45e42aa51501d10136f4, type: 2} + m_sharedMaterial: {fileID: 2039440194532944411, guid: f9650ff3b67d45e42aa51501d10136f4, + type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 16.2 + m_fontSizeBase: 36 + m_fontWeight: 400 + m_enableAutoSizing: 1 + m_fontSizeMin: 14.5 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!1 &8753920186610451567 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4056225212123778826} + - component: {fileID: 7609703664331444874} + - component: {fileID: 4794763746623151165} + m_Layer: 5 + m_Name: AvatarPicture + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &4056225212123778826 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8753920186610451567} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1.00032, y: 1.00032, z: 1.00032} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 8324889242244177361} + m_Father: {fileID: 8946041518128319346} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 1} + m_AnchorMax: {x: 0.5, y: 1} + m_AnchoredPosition: {x: 2.1, y: -62.99997} + m_SizeDelta: {x: 110, y: 110} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &7609703664331444874 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8753920186610451567} + m_CullTransparentMesh: 1 +--- !u!114 &4794763746623151165 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8753920186610451567} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 6491ca13a9741c6429b67b710c0ddc83, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &8793223515407753594 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8324889242244177361} + - component: {fileID: 6511473271045913136} + - component: {fileID: 1872020315498846133} + m_Layer: 5 + m_Name: Image + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &8324889242244177361 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8793223515407753594} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 4056225212123778826} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: -2.5} + m_SizeDelta: {x: 100, y: 100} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &6511473271045913136 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8793223515407753594} + m_CullTransparentMesh: 1 +--- !u!114 &1872020315498846133 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8793223515407753594} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 7e150c4afc786904f84fc3b2e4c11350, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &8824953542908658344 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8301229672940623885} + - component: {fileID: 6956822005547923066} + - component: {fileID: 4229214336303225315} + - component: {fileID: 3361381836640078704} + m_Layer: 5 + m_Name: BackBtn + m_TagString: + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &8301229672940623885 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8824953542908658344} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1610181444242235534} + m_Father: {fileID: 7795106250517606859} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: 0, y: 70} + m_SizeDelta: {x: 179, y: 140} + m_Pivot: {x: 0, y: 1} +--- !u!222 &6956822005547923066 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8824953542908658344} + m_CullTransparentMesh: 0 +--- !u!114 &4229214336303225315 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8824953542908658344} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: dee9445eca1072d479f52ea7f8867812, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &3361381836640078704 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8824953542908658344} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.7843137, g: 0.7843137, b: 0.7843137, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.7843137, g: 0.7843137, b: 0.7843137, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Highlighted + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 4229214336303225315} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 2280375977384003943} + m_TargetAssemblyTypeName: + m_MethodName: Close + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 + - m_Target: {fileID: 0} + m_TargetAssemblyTypeName: + m_MethodName: Play + m_Mode: 3 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 + - m_Target: {fileID: 0} + m_TargetAssemblyTypeName: + m_MethodName: PlayBackButton + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 + - m_Target: {fileID: 6418597962137773390} + m_TargetAssemblyTypeName: LeaderboardUIScreen, Assembly-CSharp + m_MethodName: OnClose + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!1 &8950198484935419963 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8946041518128319346} + - component: {fileID: 503623585478925167} + - component: {fileID: 6440002836032915703} + - component: {fileID: 2127333615051366362} + m_Layer: 5 + m_Name: 3rd + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &8946041518128319346 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8950198484935419963} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 4056225212123778826} + - {fileID: 8498960608888183952} + - {fileID: 6297160935192172493} + m_Father: {fileID: 1145879704583983232} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 335, y: 14} + m_SizeDelta: {x: 283, y: 318} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &503623585478925167 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8950198484935419963} + m_CullTransparentMesh: 1 +--- !u!114 &6440002836032915703 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8950198484935419963} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 54db0eccb9c5a42498a066622a1878f4, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &2127333615051366362 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8950198484935419963} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe7a6c08caa987c438eef91a7a0fc0d3, type: 3} + m_Name: + m_EditorClassIdentifier: + pedestalNumber: 3 + scoreText: {fileID: 4404033344474101012} + profilePic: {fileID: 1872020315498846133} + nameText: {fileID: 9071939938260215743} +--- !u!1 &9197767623019176590 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8026882825882188021} + - component: {fileID: 3842016895680508916} + - component: {fileID: 436060366358511923} + m_Layer: 5 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &8026882825882188021 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9197767623019176590} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 3848434021611269837} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0.5} + m_AnchorMax: {x: 1, y: 0.5} + m_AnchoredPosition: {x: -50.5, y: -0.7949896} + m_SizeDelta: {x: 75.97, y: 30.41} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &3842016895680508916 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9197767623019176590} + m_CullTransparentMesh: 1 +--- !u!114 &436060366358511923 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9197767623019176590} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: 12334 + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: f9650ff3b67d45e42aa51501d10136f4, type: 2} + m_sharedMaterial: {fileID: 2039440194532944411, guid: f9650ff3b67d45e42aa51501d10136f4, + type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 16.2 + m_fontSizeBase: 36 + m_fontWeight: 400 + m_enableAutoSizing: 1 + m_fontSizeMin: 14.5 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} diff --git a/Assets/LeaderBoard/LeaderboardsPopup.prefab.meta b/Assets/LeaderBoard/LeaderboardsPopup.prefab.meta new file mode 100644 index 00000000..6e27bd50 --- /dev/null +++ b/Assets/LeaderBoard/LeaderboardsPopup.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: f6670d8117a961048b4a0ff4bbf6d59e +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LeaderBoard/Main.meta b/Assets/LeaderBoard/Main.meta new file mode 100644 index 00000000..4b4c4e33 --- /dev/null +++ b/Assets/LeaderBoard/Main.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 966737545c54a0247b661f43673d2849 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LeaderBoard/Main/Blue BG.png b/Assets/LeaderBoard/Main/Blue BG.png new file mode 100644 index 0000000000000000000000000000000000000000..ebe2b84c05a326239a5dc0022a2591906e7de670 GIT binary patch literal 4465 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 b{~y5lZs{u+(Bl9A008rJ^>bP0l+XkKY4sDi literal 0 HcmV?d00001 diff --git a/Assets/LeaderBoard/Main/Player Icon 2.png.meta b/Assets/LeaderBoard/Main/Player Icon 2.png.meta new file mode 100644 index 00000000..e8d69d53 --- /dev/null +++ b/Assets/LeaderBoard/Main/Player Icon 2.png.meta @@ -0,0 +1,140 @@ +fileFormatVersion: 2 +guid: 6cc21907c7f2ce34da0273f979c6234c +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Server + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LeaderBoard/Main/Player Icon 3.png b/Assets/LeaderBoard/Main/Player Icon 3.png new file mode 100644 index 0000000000000000000000000000000000000000..1940e0a3679e7ba280182bd9322aac47bb52f705 GIT binary patch literal 11051 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 literal 0 HcmV?d00001 diff --git a/Assets/LeaderBoard/Main/Player Icon 3.png.meta b/Assets/LeaderBoard/Main/Player Icon 3.png.meta new file mode 100644 index 00000000..66b6e876 --- /dev/null +++ b/Assets/LeaderBoard/Main/Player Icon 3.png.meta @@ -0,0 +1,140 @@ +fileFormatVersion: 2 +guid: ef55a95bb466f794bbe08a15b4ff6889 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Server + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LeaderBoard/Main/Player Icon BG.png b/Assets/LeaderBoard/Main/Player Icon BG.png new file mode 100644 index 0000000000000000000000000000000000000000..ba3983873537f08e015e6fc66f7978d4d44b8176 GIT binary patch literal 5929 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 literal 0 HcmV?d00001 diff --git a/Assets/LeaderBoard/Main/Player Icon.png.meta b/Assets/LeaderBoard/Main/Player Icon.png.meta new file mode 100644 index 00000000..1d399f85 --- /dev/null +++ b/Assets/LeaderBoard/Main/Player Icon.png.meta @@ -0,0 +1,140 @@ +fileFormatVersion: 2 +guid: ee28bbad1fc381c498feeb51bd32915a +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Server + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LeaderBoard/Main/Player current position Boder.png b/Assets/LeaderBoard/Main/Player current position Boder.png new file mode 100644 index 0000000000000000000000000000000000000000..eb799967f38b42a17f9d463739079d83a6ed3b87 GIT binary patch literal 2195 zcmeHI`#+Rv6o08zF~)w_GP$fDT4^JOtY%SGO@YTQGEVoWnK<(A9#F>BVi z#U$*M8JCJ`qGp(|ZaX2ynB*2_OqfaT`@Z@!wjbW-eV+3@=XuU^&i9-r_mX`vfV1+csT;b2Y-8F9DQQ}Kurt!lmL1Wq@fh+jyVa`bnDH4i=83% zF7^OWo2#~t{RRMbA96z5dnPDJMJ`vhymgYtWchgZxcnE6a?##~`jm8~Z(UW?jd%On zb5)VXfLC(8^6PtHT%bOs(Ytq6zp5vUO*tTDqsTWQ z%(=eX{9qFhYq6krg*FC6Ni?Rj>ADCw?G)7r8x39-@bMQ6!SV<=|4X4KRwT_{^9@(V zaOr9w!XCLVG?aIk#V1LpD$|HO6I07B3MdCqVYY?s?4_|uj~ip6x^x=kTFh`&HcU)x z^n1@~K?-|o!^U3?xn?Hp#VuOSUNUOq^jI5%2>?E85zRL?0*;ki2`V(irt2edXH$VhF0asuS>J0i2kJNik}JO8ySoY;?zr0Wfy?7R1)@cROM^zw!&~^JDRorFGdy zVc*IW-rEmUNuEST0C|n#pJU>;y5*(UoPP-CyWWXs`jM9`A-KZrg)j+Wcy$Us`=_r* z=_v~qt@5O*BJbNc@Pn#xm9dau0018g9*z?+S44cIe45>HfIP5T3QDz=VE0v z>+tdcQ4VeWI8-=>UN4Ht=#4YkmQy-`2#``x4ImY$6uJ3UZF4y zBAQ2`wiTF2bo)Lor#j7L42gU|Z0g_C@49}MSNxQ7*aC!GG^@;pRnCnE^V!&@%}=@e zVf8r8M<+5(DIN-I*1AANHQb5AUxy9QTql`Qz;9KnW#HZpo*L?`ykMQk@?Zy zg`4gyDs#<-A8?ivmvnjVjG3)vcxjPC>UO`JZY30|SOt~!!;G>zH}KF{a-ka-Q3?;jIg?+Znw*d!G6uK!(#I zW);qe-rnu|>eZbdRhSXH4S0h& Vxhdj^h90zq(`i?9&B?%&{{YGG@9+Qs literal 0 HcmV?d00001 diff --git a/Assets/LeaderBoard/Main/Player current position Boder.png.meta b/Assets/LeaderBoard/Main/Player current position Boder.png.meta new file mode 100644 index 00000000..6f17dace --- /dev/null +++ b/Assets/LeaderBoard/Main/Player current position Boder.png.meta @@ -0,0 +1,140 @@ +fileFormatVersion: 2 +guid: cddaa5bd9bbcc9047ac8d3d2e29c98c6 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Server + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LeaderBoard/Main/Player current position Icon BG.png b/Assets/LeaderBoard/Main/Player current position Icon BG.png new file mode 100644 index 0000000000000000000000000000000000000000..d1e2bc319c765ad2f882b348b6e39bda7887529d GIT binary patch literal 6008 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 literal 0 HcmV?d00001 diff --git a/Assets/LeaderBoard/Main/Player current position.png.meta b/Assets/LeaderBoard/Main/Player current position.png.meta new file mode 100644 index 00000000..b62949d2 --- /dev/null +++ b/Assets/LeaderBoard/Main/Player current position.png.meta @@ -0,0 +1,140 @@ +fileFormatVersion: 2 +guid: 5adca890ca3c8014a92de4971852b0ac +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Server + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LeaderBoard/Main/Rank No BG.png b/Assets/LeaderBoard/Main/Rank No BG.png new file mode 100644 index 0000000000000000000000000000000000000000..2a16ff397ca74bffe1e576230f0ac861995c0015 GIT binary patch literal 2133 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 QS3re?r>mdKI;Vst0G3Hr#{d8T literal 0 HcmV?d00001 diff --git a/Assets/LeaderBoard/Main/footer.png.meta b/Assets/LeaderBoard/Main/footer.png.meta new file mode 100644 index 00000000..d82b63b6 --- /dev/null +++ b/Assets/LeaderBoard/Main/footer.png.meta @@ -0,0 +1,140 @@ +fileFormatVersion: 2 +guid: 95e4e9236a73b474bba55d4c96a69409 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Server + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LeaderBoard/Main/popup_bg.png b/Assets/LeaderBoard/Main/popup_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..28806539674abce4983b194074202bee83ae229e GIT binary patch literal 12667 zcmeAS@N?(olHy`uVBq!ia0y~yV6k9eU~k}H1Bz%TJ_ku~7I;J!Gca%qgD@k*tT_@u zLB`@BcPEB*=VV?2IV|apzK#qG8~eHcB(gFv7z%j0IEGX(zParv*c>3ja?t&g?h&V) z1kU3z7Z_j6Sd}Lky!-YU8)l$Rfp3yPvcaMe#5o}hw40&92EvKH{oWqPWk`L!TOK4E z@N5wikb1%?10)^h9blv)=iaXMKp!$NoYFyd0g7`*IcV`imjGd7Xt2VPHt1qEdV(Ca zbRbf|Xe?kBjiV`XG$jISE7baOG*OHO$Y`P%Z7jgr&!gqRXn8PN9*mX;qvZi&OkuQ4 z94!+^%f!(#akNYvEfYsadPm0(M#oS_2N$8!O`}c2(Wc>O({QwDIJBFF)wj1N3o|U# z;ArwU*u?ld|DucG&s)b1@x%yos}}&1H$x>8JCK|(${7uV(R47H7e>p2(K2zgUKp(o zN1Ftr&7#q!;b`+1SR0Nu2}Z+Uv`H}9Bp9eB!S?mfrGPoGVN>nBYEW@>DkcQP9c06_ sdvg1Vd4cY7xbe;Z0gz_6gxi_F8TK5JT7SEA?mUn}Pgg&ebxsLQ00`kCJpcdz literal 0 HcmV?d00001 diff --git a/Assets/LeaderBoard/Main/popup_bg.png.meta b/Assets/LeaderBoard/Main/popup_bg.png.meta new file mode 100644 index 00000000..e4436f3e --- /dev/null +++ b/Assets/LeaderBoard/Main/popup_bg.png.meta @@ -0,0 +1,140 @@ +fileFormatVersion: 2 +guid: 7fee049f2ce6b13489377767baad0bbe +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 32 + resizeAlgorithm: 0 + textureFormat: 34 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 1 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Server + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LeaderBoard/Main/text bg 1.png b/Assets/LeaderBoard/Main/text bg 1.png new file mode 100644 index 0000000000000000000000000000000000000000..c1d83083ac0fbf9bb8c88005fddb86ede232d48a GIT binary patch literal 5936 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 RxCeb!QCC+&bja7 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 %x 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 literal 0 HcmV?d00001 diff --git a/Assets/LeaderBoard/Red Badge/1st.png.meta b/Assets/LeaderBoard/Red Badge/1st.png.meta new file mode 100644 index 00000000..e8b54a3d --- /dev/null +++ b/Assets/LeaderBoard/Red Badge/1st.png.meta @@ -0,0 +1,140 @@ +fileFormatVersion: 2 +guid: 300005d21774e5b4aaa7f76cc71260a1 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Server + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LeaderBoard/Red Badge/Player Icon BG.png b/Assets/LeaderBoard/Red Badge/Player Icon BG.png new file mode 100644 index 0000000000000000000000000000000000000000..48b4ef47e5650a9042c86d27fdd7619c77517da3 GIT binary patch literal 5950 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 literal 0 HcmV?d00001 diff --git a/Assets/LeaderBoard/Red Badge/Player Icon BG.png.meta b/Assets/LeaderBoard/Red Badge/Player Icon BG.png.meta new file mode 100644 index 00000000..d9da0ccb --- /dev/null +++ b/Assets/LeaderBoard/Red Badge/Player Icon BG.png.meta @@ -0,0 +1,140 @@ +fileFormatVersion: 2 +guid: 4771bc627bfed1f4e8e630650fc1b215 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Server + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LeaderBoard/Red Badge/Player Icon.png b/Assets/LeaderBoard/Red Badge/Player Icon.png new file mode 100644 index 0000000000000000000000000000000000000000..b7da6b9011d6790059ab271ce671ad43d9313458 GIT binary patch literal 16619 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 literal 0 HcmV?d00001 diff --git a/Assets/LeaderBoard/Red Badge/Player Icon.png.meta b/Assets/LeaderBoard/Red Badge/Player Icon.png.meta new file mode 100644 index 00000000..5dce4a9a --- /dev/null +++ b/Assets/LeaderBoard/Red Badge/Player Icon.png.meta @@ -0,0 +1,140 @@ +fileFormatVersion: 2 +guid: 7e150c4afc786904f84fc3b2e4c11350 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Server + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LeaderBoard/Red Badge/Score BG.png b/Assets/LeaderBoard/Red Badge/Score BG.png new file mode 100644 index 0000000000000000000000000000000000000000..2bcc95d91c430ee5bf428ff8df6b980e3b0c90ba GIT binary patch literal 2359 zcmV-73CQ+|P)s7Oi6X zZX!+7eq&1849639FCYf3lcp)q-9Lh~uAirdt;Fkak(ZcFG#A!YE301L>&J>pnstTD zU`-D-dv3ilNhZ;@12EnLOxPlkG#w(V%{n$nfSZYr(QzC?n5h423%>BJee#lT(iJ~~ zi@b!IbsQk>B0f%xI&I5>exT|Oh60TPoMu1yZNRs4N>`fZ@t5g*C&`fCDwJ#yWjl^a z*QyE~*xa!0PAFt;hADP4#-5?Uk{*xmVqv7TNmbPZT-;XB92gV{4RNn(N_ zL}5uroSVXn{ z6l=Lpj;hKBqofQj79K*djA-8NkD2S^6q5Xo7V6fjlw(kZE!XS{X}&gituVsERE>w^ zAAPoHXj0?j5Ci>l)Q$oaSu% zdjeg3Vq(%)P!js%C%lM~R$^4eFdw%F9|H?%w2+%c`iy`|=h?({Inhhw28wBna*Xk) zb+4~)R`Ec!BN}>^!4ZKgayS8X}u-HUf zVzLNAg6znk3rurz6vmun7IT9v(Lt++TtjWN6NkR6;Ug=kYf{ajK*~``j3MV@QMoMaLOa47kV(WLG3IXSk8l zQQOe0N4f@0R1_=l=q9|f+K$qt1$G!>1+-zw*`#P__U+J>a6adXG`R0EOLXR?28^c+ zw8trzI+VuO_9qY8h?fW^U__p{}_DYtE0PJX<$u2uRyWlB4*1 zH@gb$b~06k(9=1FDTB)G`{{-XUOI3B`jSk)nUP&aya=>(acepL%F{=F^R*4S($_j%AeRFiK!$NU}E} zCsuN7G0o&Qf`(Gp;7Z?S?0EW@ICJru5eh_(g+fJ_;3EG)PBWMNoU6nZ3R4^Zbi#fKP9LrspW#OJ?*8FH zDyNSYMN3b^#p1yXyB)R zPT`feOmqy&?ko|Bl)N4eM%}G}MFv@N&sQ{?6pq6?Hfx@}+ZB|_y(oiay-ePVQLbLFK~^>DGMFx@&$u2@?bVxBK<52E}*KdsHk7t4j6F30Id zEI#dCluF6*&TRtq=S=*qRbOtuxXj$`fkgzNAUR*r6snqnKzR{uF9a!V5t!JTCPxvS z*X{kNX`sn38q z#R5PG){{&PwB@oAH+}z^M8VjsQZU`E$3+JdVoWVSqx{0$e4VDLyDy!5`uQ%;CqEjv z`HXyRVr+EA#l5b6fyPrhXpgBwRn#P0iTLopcT@n4tZbe^B_7YzUa002ovPDHLkV1hxYU?Knj literal 0 HcmV?d00001 diff --git a/Assets/LeaderBoard/Red Badge/Score BG.png.meta b/Assets/LeaderBoard/Red Badge/Score BG.png.meta new file mode 100644 index 00000000..3ddf1bf1 --- /dev/null +++ b/Assets/LeaderBoard/Red Badge/Score BG.png.meta @@ -0,0 +1,140 @@ +fileFormatVersion: 2 +guid: 6e9686097c9b8244da8742075c9ba177 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Server + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LeaderBoard/Red Badge/gold.png b/Assets/LeaderBoard/Red Badge/gold.png new file mode 100644 index 0000000000000000000000000000000000000000..367a00369711db9de06403c228168838b2e7a4ff GIT binary patch literal 12423 zcmV;2FnG_2P)V0pmEwmbA1lY!40y_c&4u+V3VTK2f2}exK1AZ9Kj9=zq!VwcO z4#zl{@iJgz1}uRs$zXwy5L(cNTHWeJs;;iCs;+&%OWh^!&CL1!b29HzOV{nLTaA3+ zsH<+}&E-4)`Tq5sH1OVSCi@Wk0rmm*PIimkVP9omWFKRnWv}8r*bKb4ngDnw`y=dk zu=la|_@5`B!FAb->}%}H?33(ou)o88o;}a*;XTmaE8rexzn}f%?8p7zMQWohe7DR# z!#>S^k^Kesm)Xbh3zq0#B)DPrhuD9G{Q+oDPq3$P>rEtjihY#*Y4)@1uR}}oZEwFQ za0OJ6QUUffG^a)y4=_y=gM))Oc<>J$zgI)tvS4p?S}DlAJ-3+!2{suHxm zGGQ1gJ!?iC9!zLFl#f-92x zA@<+!f9`7he#Vkic>%O(T^%B5VOiO<_YKpJ^iZ}w8A1ivBb$ej<8doCDsxHF2LB$SOeQ$>yTUN~!Z7zlV8r=-!=o`l zkljXc)|~BCPm;r_U(Iez&pT9nRs8)wzKHL9=W(pAZop8yJ2Bn8a- z<`!X2%)nS6xHbnR=VER0AkPz{LUeuUCCI4|tV1zaccft)=HI$QdVq=ovdnCYpx#9u zKgR2rT9Q2%rj^3vd<;K*WdeWm&F|sWSKmV$7naT<%F5^O9=k$@^vw48-` zbpqzKc^H`t0WE1|B{48leGN`Aj8{cber$IN;(kEl@IwHvpf^!QT&QVgIfm42-_rIiWT2p{O zhU8R_4`^m{Fa*?*SxRbFaVmsIE&q;uvsGCFW*BZHLFrGSl-tX|O+=m7tMY&nAH2ka zE4~#W;7V79f*t@PL`$QOX5T~i!F=d_FgrTol{quSO7KBeP0k5T2dfzq?_Bfn*MIvg zo_O*H$Y!&Rc!-A=(1b+XwlvvpB)OvbKkWni>(EL|$0&1X|a6(B`V|!6a z>_a8KAJqge-_7%NM`89v*hvq)?44n)*yMX6WVWNFvL?yoR}P>zMrxX!SJG?r&;(EN z@zf0Pg-=PcHv3}HDh>?AD8iY$dsZiYTow zK-;c06YJw2|2Tg4cYjxTS`r7a=v}#`XUT=Ha>`En#(T{7s^nH;{M>;#wE&CKYEDw3 z*C@GeRY!CiC6%+G8tp|j(g!D!h8s#zUxjMtGEArW&VxxwDfYxV$kDD{D8XB`HEoCm zBDS!ALd7WeVWg9=P9CQe-v{f&adly@SkgcTQp^*39CUHhXBMhBcR7!*{pAnv!i%r1 zk5!DZe}nzcpxx)DwwdI{ePI6``}_Rg5e|nHsK5XFzprdpp#iwG1d4y>)4(F1H{?qz zTZFc1EUL^Z>+NBL-W-8BJqM$>Mu~DYu<${plsnNLlv9ULNgm|Sy#zL)>4dhc;fdMi z){KPOU_O#VL@?Mzw(u@D1Lq5 zfd_a&mw-M+V85&ESK%rxty*DuiG;dQYh*%Gz?JJT=?EBxqd^rxl;@yCR$_ZN_4gCh z0|d1Xo)y&(=Q#>cqm@`n0JMBBVrY;%=~yH!Esce$23ZCn999zPahkj1*WnRpL#RT8 z#kaF-Tr3Jt;uO5^{$3MzogBcx&=I^tO3USH)`VD568#ekLh^X!t-uwf^#{;t7X|Fe zlPB@juYMJu{p@E|@H!HjCAU7t{(VlJ8Fh*pw<>9kDX%JY?p=i58l~+@^Qv0bpa$th z!8Xzbn^Ib#v^udKN@`q#BedeVxTO|Iv_uu6mf~ZB9E}(+EG}}v(SsVc6vzUkJG%f^ zq?i(I4D5l~+2wQbMk!`^8K;hRz66Dlf2=)wn+nJC3Zh~ zw2~NrojwXD-cL!5HA$*|pdI!AXlbI@x+ujR5iN~kMU?&PghQGt7>;yDuTc<|DD^2? z7qm1j%a3I=m~EVL(WuZwk};E`_}Ochk;$wD`1SZh`wFyO+yt&z1Y*Y?g0K`%_{V?z z$N1EzK7~Dd_7Ko#Q7wFvCeS;6STF8#BBxk90fRSay+vs~dllv!rPV3x@QsO@1yD&0 zqTF#D4*zw-3H3)Usf{t(cJ)R{<|mY1L-?3LD+^(*s{ge#Rj7gIeY;milvijT+NUjw z$~v0hGh3F21A|G*Qy6ca8^v0o7W|Q*6-^RcX14=yWnTXW_7C_HtRh)o{_>Y`^eA0U z`%P4fe??n!Tmf2BT2vC^Wto{Atk*9hbZHD`KC2a0AgvsHmzv*BAA(H^a3dYGT|>$< z($jyZv7;7RpajL)NQ5-VRDhn)MA1>VV35)z%I4+C#noZ8FGb zi9sw*f&yC{gM03|2OS+9q=N6Nn5(B0mmj9JB!5L~V3^jx8=OYVbOt0S62w$QT4_qz z9Y;`&@6{H7Je1f+HRXRBBzChV*ROh7imB`@amB< z@B9{wyH3^>UCkag@W6dXaq`3vM#mQ^y-JTsb&$|QDDd9JXRc)qKJt-|sGzo_U6jYA zVy=M=#TKQ9G_wlpWdb|Btbvt3`zBG9=9S%bno_%;z$Vm(Mi2-v-XmQiYQnkn?#zRX zqTSuYfDdPM#nVzOCR-v-9$rM{dr!f;I;Nv{R;p{zeY=Ei%rs5#+;F5xtJiV9^ zD%TZ{$8pCUcPOcK?KgM>vl>+29D(@X75*G%jPww*IX#>*70Y)3Bb3&oDEHi{X+Zdy z*#NDu-Ycj!boDr%5(=ZAG2wfG}jn`c9KTEv^m1@18^Ta3h&4%m}9h^C$FF)7D4); zHm`hc{TI<3KNlCH4mrsQ91YR-&G-^b9!?VA%foQrxxz5!-CDu9byxi0fj$}*O_D1X zS5m+giLE8BQmK>zmM#qGU=@Lv;@<_7Vd3;bjl5{rq2qA-4v`8N6PTM;Q7mN%1PLu; z=iC~S2b7@tI%iEz?Q(ioD{Uw{2&9U)(z|%4Es8^h~F2X!@OouKTPW+Eq>x*0k$41Eh7V`PmoPoHf-*I^X*M4tpY;x;aq`R%EJ~c`1_td8o4CqMc$)i@ z8emGVA#sO1Q~yh}j0OjEddhc^W26(yYPvbGbw$3h9}OWzDbk3l^b6w#UIEwuuT}q@ zgWxXFH_xoBtz)-a1U8BSHjBH&6ctfuNja-}lHbLAuzZ1KJN1?;kp zm73cBzGcbbxgv267Ws2#Y#G-s%wm3G1rt9!a5vTcqZsOTQ(j(+Hmz*|z zZ5boyr?E7fBiB}yv|3gx`BS6$=XOc1vW9d43XHmRdUmB5T&AOpwGD-mHOWn*p{%oR ziWSfVX6-xc9@r;!qb5SFHJQ?4UaiirVRB@F;4UGzqHAwMlC5p&Twd+kx;MmEcH9hI zE){Ngez|~1ucW9v;t)7?UC?XNoUQxym2wrSo+OUmJBV;Zc(>VAmS-s!Z5~(I ze&A}-dvo`&Z5OH$2gR?2@DZX(#xU&kvv5}~X^JqL&UlFsI?K>T7h8j zYz&=xc9vA|Jb`6mHUM@DI^0mQE#R7xrLC=xGwMJ#{l4yrZZ?J>x`8%rjNE(r!2?M5 zB$Q2C%#~CW?I1zF_cIUS#G|Kaj%msEHlSiFb1E+=%j+6U&K8Jq3yOn(-$i5DgTK`x`tsv{_EzLt|{BPbjdV#Ocfix-U>8++W@Ys9$1E?)j+pV zm)cez#MLI8RJxc^DY=gmNCG6~`Xb5pX1TU4o~S{gT0D;_!K6YFZjlkJppx-crFgSv zS~qcT)HVfovj|jk+ZeSrS_N0^L~#~kNtgnLgz}^?L;glky?_E5IQ)iZRmTN3H+h-- zYo${>cT5577DyFRd*Ig{vqIon(|Rz-IZ-RzvB5D-H8?@4Mbo$h(Q-k!Ia!sKMDOnP# zAjqC5!d3v@?EY>N+@>cJa9ve(Y1O2rSz9&^BmAjmY&69r97%4Khp-s0Fe$AfO*J>M z@uqJ?CoQp4qgG#Uu4&FS6QrRSQ&K_`QpjAX(C{&C46;hn`PcCp270>%oqpQ@uGF5Y zI$-{3qtWj9{I>ok&_Mp4q5!q#ff)tGtFfpyUxIVA8oFu<*0%HoY)T+OTtEhzQ9qB= z1orIuX8P8X>(y_;Y+ZCWfGcaU9M|##z`%x>!g?#BG1Tan`xpdMI8|ss z6ih8_)>LrU&ek{pThWvMABl9y{RvG`ki4~mq71Q8HkfWI#OQ+?+rD^0+yl@7}X zQv2^X{LzXu-c>_$n;%5d>%k#nT1iwbnNVg{?U+VS?q*u67D$taxXr8x6qKZhWc8s~ zD>U6aWmQy^8Cs_bqoD}TQB}h3zECOxs6njR7KlviKg3{czG2)lfbp1%0xXsq*zzR{LS~6)MtL(swG>bq|&Mkvo`%2?bTatMvHuVGm^W$ z1;x#rX%?TsjK<((vvfepdH|~a#5VlMMpF#&#!bML+)9l|GntI8H4SQTgPRS)Z_=v% zXS}!oYse}@p@CiH)$Q6%N^WBd1cCr6r>3h5jx6SOXqKw94(e7yr1kU5;gX50W!Gfq zBehIkzzw)k{x8+zg)Gdu>3U#9E%1o?cI!=80WCM9#bX-#4w}qVsp6qs9O~>OyM=X` ze~p3-6)X4FO^~gwDyYaZ%UXegERPp()xI%G%S-i1L`B@qv)5o&87zMAL1x&)y3nqX z{C6Xs+7iA-!?8QR2jygl^N~pD#e=SvY87RSZgz#uuNi<_3*O37Otos;Na-OGkBVT2 zetrqo`B`8{16?b1Far|W#fnDX0`%6;3}4cA<&uF?4mP`>*Qy>l9ymeuV~Y%nI-5Mc zfGauS+KLHf=PJWG4lf}k{tW${8-{gZ97a(zDOp68K1F@n2!hqBs=CdR%LkNLZn;=y zFCkP3H(jEXw^1!sQCG3IpwKpJ${Y{@VwA38GV?G`g-2mab<}H<8ZMK`S5@|UeG_n( zunD*b^}<+lV4lAS>k@gkQdAXXMuCUt7JziGN_9Y7S^>K1pQ4S_;4(QGO~!HTkrOCp z3#w40u~nEk?i}nv$S`X8xAqLMtF{oZ27Vo}k39;z|0k%PeTmOnWOy`%^@F&$TBU${ z>rS9+lVr_mZPlMR5kd<_wF{v)=U`qK>JK6f5)=kyG6(>TJnw#r{HCa$DVr>Dmx_4^R>lfjk z`V|<-ZV?~t;}aw}Q^wrXW>*E}8giKzW+HaVYsBykMeUn{m#i$S@&G{Km7wEBLP z{JNiXkbt%K2+XcHrT1IJW!ev)*2ATZ{F`>ijdPOgzp3r5qX?XVKJr1;ug`EeIQwHaHQ|o_XdOOwTSbG}r0V^13GJ z`n6?PKYJ3!@Xtsa{2-#&@FK>LUMFuXE|!MpOEGpGqFd`y9iCH7 z?Ob!+Mi_EmVoYaeVZHnmd1x8#-5;Xq)70F$%KMH<@E z!;aAhuh6ncqItzDm*K`AnT zGlNwmos3?Mz8N0Ak~8uvFy=@%)snUx#8eC1Q{m-MgA{u%S`I1hqzP!At$-Dv%+x8E z{lBg_)`$)1dM`FNKMZ^F+ps6T!Jn_{uUc`nLVZ0I%q>?av5R=>rB%!>Z&)`X%bNa@ z{b~TNm=3ZXz)>`0ge9LgGPR1yH4`V}1#~Cqv4ysH2)`Ir(ZuXD%=v4SUfy{3pxT*E zZH^|cvM4?QS*^Ww>Jr>`7Lap_d6ieCS*A|`X7?|V4vte=JA7%i$*oVIeC^L^6+B0G zcU4t08vb@L>)WNVBL4K-bNI&>Rxq_-H*XuM+l$b&FdKj?8cUW;2{j}ekCferMrKQR zd&a>~r;DL3wTsE-t$`*CDmi2JI*byH@~%Db(tR37&(Ty7_NhXo*!A}XQy{m2SJm=; zSr{TQ5K=(T2iWQKr0=99u&2hKBCX|#ucLBZoP%LqxfqIXN&^bDb9wx)$LH{aS2LJd ztZW9XG}$KhC+xXKn8Y@deQyt7-NFaE;$VE$#rYXZGjTXZOC=e`*2>>PUD?ggz*r{8 z5_nGc&=&5hD>p?I5oJjj!F~pH3%ipVKU0cdj@$F}p@PEI*h!+U(N_NZTu&+W>!WHP{=CvkV zA&Yu9NH6qlV~$qUMMfP*7lBi}y|BmVmQ1qUcI< z>*msWex!gudu$GmKewWOUMp@HS`~lcf3W`;nr1ib&LnRMIS$Ren_ex)nRbQXULZ~} z9&xD0U*x(~^TP~=Q=$aZqL`V`i!)+;;6z&So8sdDWVJO_!}q;<4yzv6b$umORBJbs z#EAuvJ_D;)Y*tEY{GbjK`p$rxy-0=i7!}svpt|}dFPT$S;p)4aEKU?_;Q6yTeC;3R z@z1YhaedB)bK~{fvIXJaK<~X9klcoLH~XJJ+rC@AzD1&c$7x%9@-E;@j{qn8Z@|St z6P#rGT6yTM0l0_nfOq^Ma`IkEp6ugL_W9D&0r{%9rMCWCu((AyTcu#7fRCAiNWZdI zjVR9%VVE@1jm9mx-P}8<%>M|^;!Bj&QDus$eR|9&wn}JTxn9CwKed3@FBfp>S`oRz zwyWZ0!?yp-{u~9z*>2mj`)M3!w3%c z4#7R~Fx&(8kc>KY36w~7;5NJd-UgK%ZTv$7@hE|btHpIt|5EFRyZKqHi9+1c6e-{Z zRA!!rlR2-0{F3vtg3aYNf+}9t4`0pVvFDcX)378IWSQ}!QW-Ijw}fh$8V zTeEx>dUxj(wrO_^0KZ8e@6!(e?>ppYL$(|60Axy=H*^TzzEg}7p8$IHX(_j5ZI=ew ztE^B^e~EVL2MCbAE^!k+79br?duR0x_P59$E4nO8xvv|imKin_)~{b!!_zNi@ROfs z@%CsD`R%1u+V`P%BYhrvchaV|)kKyv%bLqe`YF_Yg*TMoMb5TMRCaIBnLFJX!@eFD zR@@J;Z#DXU^@`$SNu^9*r+qxipioxrql0*d*5b-^DpOETP;w8cnu_M4KL<|s0;)4l zl2gAA*L)gBF_WL^f zYtY*f%4-XfTODkfx*B_WCV`ce81@bnaNuB$-f)GMmZ!t=n*r_T1l?2w_COzvL;^H> zP6ty=y)9rhJjN+3)MhBKJzL(}BSmyY)fG?IT-Km@>UwgTaKcoz$N6a+a~Dfke20n8 zi~~F8>V)=6#(!>U4;1>TC`sG2gZ}}iLDeTd^sk&-QzH-^Z z#CRH+)hLDzFQ2fb@)di?{*YDigy8KSa~ipgv?g2He&hTnA1)my@eGdXk( z(%>)qAQMBE8Dx8C2$imGJ$Kb=9N*PzJb92SYayx@=`fVUW@lVnecr+9l`ShA=wm-Kg&)cGb1rvzL3V^xGq~sbyX2clSHVzN(1{)>F(7VSGvv?u=%lv8${FO zPcr?(34^|hhtU@tyz!kX-u|(R5;F$LjtV_)LrJWxag%*?COF9F7fQ%in)qrAdUyT5 zf__<@WEXB~8>pL=+@Q(m$zHLtoitr8WfKpohvQ8T-O-1=Q3IK&tXh#CiCPRJ7)rsp zc?)Bg(wLu(W9(QChwdz3-}_TY4E4|nv1sU5>WSQ&XlmbyxT%=J&Q&mb*~JwaNK+S? z_GXUDAc(O;oJ}!PEiANoU-6D8I`^i~8!sX>lGA%S>Lz;TzeB$WX&g5pt&Qzg!3~Ob8c#-i?WoB<`fYey~_X z_mKz^{p3$El5LM+VGnM_gSUkORGSS+)gkFe!V5)4s+LDeSe+BUiJ3uYt9NDn_57MKNHZ^Kb%@z9@rd29i`n z;e;ibqI$83@`B~18y=^zNxhit+sZ6+uX!&KXxZ06h{@#Nty(QA1Y%oU&gg>{215% z>E|d`XtOff6N{Kg4#g2ohNuKRSnOH~5wBE~_9^~jdl27$8}Cl?FBp~5l{Ws2#*y?5i_zxoIVF-dv|>vvF4 zd78trH>IeN_P&~O7r+(QU8F%5h=@qbTHe&LIQHE&2J@|}Sj=$hmMXA0Rn3sCZo`V0 zI@4V)p}JH;c8L-_K_wW{-js4v{e>$I0ha9mg)$s@bqu?NAHr!$x$ImgTM#lP;ZhpI zp%7_-+*&a)cw_)w_uNAlIz;I%t6i6rZj>?r>sEC8ja&P{mF85{;tjon5w)_cNvr6} z^JF|sT8N;F(=<;2oW78*2NnlIOfLc#OZdS>ky6`J@AM3czXL_5Sb~yl3FuK%0bQlt zTFTjKAUcLp=-bl?cf5!cfip9%x*d-uqEmI$5-HXEeR|qoxV>B8HZ?y~D3V0+a$HYU zE2b%7y@N?a&vaphfr(}2>XxU9qy)wg{202>fb{K}6zNqc$stl_JWVt3a0m7r??E&i zLdIF3TU=BH;&Pnl`EU4Z0&{n2d~XA|%}oo6t9UTnEeeL(dMH5!(~0pHXW`A-lw?Ou zYrEq5C1AnAZTPDQbkVb39LWF-t$<|2qOy$P@aetiy`xia-NF%)Ym{czbQR=nZnqs= zX|nO884bhgiBOWYCzoVkc(6Bt)ZrvbWgBaZ03c~qV$JpILA2y z5~P`g?9E`Ch*d3GAbQ(E**#QV#Nku*ZEwF2aOJ@xJz<1Pi-swIu1pRQo)J65(A@ zR;{$#4sMWM4|j(VO6f9uD@?zCGK~4R=>kjnnkVm|q$GM;A=Wnu5(_}MfTmc8)Df1& zc(SLL#32}UV?HfL`y@`gH@3%A3r9j-5oJX@{=*-<~sCoDhs0(Sv@B17kT(iFFy1m@qVa56`IUc5kH+pd{FOuD|;?johh9@ z3i+=QlY}U4!Ng9X6G_lC4ss$Sn4wSUya?O(}3BdR8qNC@t%8mW_Z+ODcP+ zsvB0&DWzt$)=hbRm*E2|1K~<^D}>@o0-4dI3Wf`S;iQy@b~Cno8U-57UU6CPnjeYX zLT$v&wcP_(#Zt+2vA9|YXwZLOn~Gpz?hg9P{Rnp$YI>Vty0JO>{EIx+lKAS@Q@7++ z*C{qnchl8_!od)VS(~&_Uez^T^3sp!UW?y7iR`;f>zw~7+|hIJ@>!kAk0x}P)h@K% zIjg(^K-RB`Gm%+_yG#>nbrj|CDwRzd;m#c0*{Tv8E9#*%7e;wOs?p_xI(S8bx$G7& z#mw)O$}(qs9{pAVrz3qB3a7EhWE{e5-m%n-kdK!w6z4;T_D~Vh0gU&Ohx_F>qcDHtb z+dSmrfla)_$#@MOK@~UH5POq`zEcS^JK!L>Pj7x{N-8L0Av+ern7xYO>JmoQ7BR`d z&aAVB1!ix{UbRWbS7>hKq$<23k;XZ^!JOHiLJ~)qo<9}tRef)<8zs&JFLR1#{ zKNiBlff(*5z<0!YaXj6p+-|QSe=f0(x3A}sFE?dyq%NU?9kzCW+ce7Z!w=3aB1LKW z)qDEXzbkng6Dvi$a;1pt%LU9|&SNphw03oOjCz~AySnKhEqMds8R&skZ_mTdn=Dd0 z>tAa}tzDxo>2-PGy}X+}iCb&3?}LCTpuWv6>y^g+&l|OkY`!t&|12d|^5Uk${`K#I z23kJ5)i~oT*g>sAV{50+Cof|DZ_w`zZnXsZb?B;W0df*rLgm3kTi+~UO9iHYdI zgz`4MUt&Lr*6B*<;6Fht=p9RLJHeG%Ad6LkO31AWrUS_oDV6u*3ZOy*Qry;tx5lX^ zWd9cHG(>t&piG%I24$E7L`4geIiiatwM2 zkx1!v=&3DrXS*H27NCWXk3fSh_je3><&r2ZF}H-*MQKXC?T#fjXuB2A6xU3OrDdAR z!%4M;aHrab0Kd226q3Wa$P0=`N{VmhSG5M!GwsK~lO)kZ<4b$K08@ z_sluZol`R>N?lbR8-oG^0RaJ9Q30q4?;GGP77Z2t6cUESz&mtj1p_w(1WdyJ8X`hQ zCK>!CqMN3?EJF1p)gSl-*;YnH1_7Zi0rMGzf`C9=stA;T zLzJZpLKvmNQXm7qxz5zk7-A#JF)Ax9U_Cq58q)h>_c&E?zs8yqpO&U}VBnbICn8)u z+!ZQFFWs9)Tz~&v)r%mlbu$F}V56&L&Tn(|<*#-YMDqSU+106A;6Y0k5re2A7NJpF z>b9m_75^Q(WgPz^yCrFu3`QM<{MuY=P|5n)gnUyYu@*w!pjjOo$huP#)D<)^4xxt7 z3eB)3_w&3&g2pGlTA%0+PWZ1wT(7^s?xsSc*oG2l3oM6xNA_G3`(~6TR6ORVouz#o z&X22Jt72K=xa%S0bJO$MpHka}*n2n5&zn8mzck&^H+k;|A4GzbrFC`Rt3cF&1=lR< zeyjLb-p0Ny#O#)d`~mZ(<}fH9b!)5TVg1;vtXAHl0O(JhlufUIfIyE%Ht0Pq}=(0vg&IVe%<+iZsm@vsO4s)ghIX z6lwYT23~g3B(qF0M|8&Bovr70hQ@6L&Nu}Tn?j)wx2s)6>rC}Ex1rMZc9^J1);!3b zrM*v1LPDbL9BOhUKRQBQ=4F?3Pe}r>r116g8`*A5o^T|TP5-mRlR63WYTZ~ZX4{$i zO=Cfp9P|wX`Sk9G&NZVP(e$sneZH6Vs;Qu^&#Z#!DlDR+}Ku5o534zahlW-4Rv0P^X5nRoZyFX^&G6XqeHgShy<>~ z80V|TRz3k1z4LGeI4JU3{`(tuEjhWgjlDcLx#o{`N2O24HC}9S1LOM9rUP&NpC4S- z?ctwXg{i6AuKyb}dNm$RHbBV7W@ZAko!VeTA!ARBFb+})Q#ts~ z)rzg?k9UJwn$)%CK;;#ypE@OI7MfC00D{oXxg3Vwio`9lwnhsVi{}IaDaKUTL%waM}`TKT#8p1)cIV_2Z?Q z68q}b@OUZ_SKsR9=I;YkmQoxU;@$7wkM7T^lewDN=qmUX) zn+3iI-X44H=Zr1RFi|}ypE!$pFa{n5`XOyH#X%^KDn74gOqDhjnF>mMo~HBtd)i_* z5KS!b^})ICehLbR*q_pCK{-1VR)Vkm6H(XV+pUPfcfQ_`H0t%jo)I%V4&nRotN&9v zH}>HaRM0-{s7Y({U<8PG;&5TL07|`wg_2xH5f0h?U8L;~R~h^M?$hVFVik)9QdX^E zWsOcxk2@bQA|d@rv+g#-!nV86KwAH;Vdy{ zLMrYYG>|C8zV7pMJy<+F>?FK6UOidB(f1Yv<)VMXewz?3W9!8n?B3=s6i9p(6Iu@) z^QxXDz6!yWRN&C7#`-i&Cn1q_bv3Ujzy5^J#vJ@G21+wy3Wd~ZI<7uR2nuLd?Ek$# z=UH>CO`4l!xW=Opa?Ctx8d_IWcE3#TL5s?D&Mc`B8+5aE{AWz?#!0ccyQw* zVH8XSIDW{}l8QB{%BtP%<_@NdJhE#&ZC*XBYS|!Yc5VFj$l!K!NRN?1zs#7T^116u zhVo-y%4=~^5#gLrH8*VI2K6*_uiv-|Lj3m5No(S#;N6*dhGHN#zVk9;o^lB*XHP2K9kH_?Ar?W4<7jWK zHbA+vMdssHqfoB-!7>8Hbj1mHiHN{EPCaU=sp zklTrU8z?ia`5MEaWrJ+qlGQd0$8gt+<^@Um?8^A+aHMIUaX%>+f?VkNK0 zWVXKS4$FA1m970U?)>ameX%&IeZ>{Uxfma#WvQ~(R$aje)-|t9|AXZ3cJJb8B$Up( zUnM&q_hIf27oc@Nxws7JIolL=$`vdnUEP`|ZJ+!{;H#v@AU2$b96|#1abEodhkq#6 z=H*J0Jr|c1Lf~z(nxx{w!otml-}%gZnU?=qP>I!P#?;sG3M=|VDjRaGXmWp!W~Y}V zL!$*9`hkIgM#pv0oD)HgH#s+OU9u}Rs|N~$fAKEd(!660c|js5{T?Un3b9sZv0*yv zky{Ke(Wt*UuIY}>p93Q2cinIJmDSgOC*d;Ob)!btP9;8Og`zP<7z}D#$jwepQcH2j zI%-dtxeO5ByxecjP3J|OH}?i?jq!9Brke#ASp6BvWiaMBf|eqG@8h(j;A8BzSgO{U z-|z$q;qaAFtIhPh=`;=Sm^)dktEKgF=aK3u6A zpLu4=QaZDyFT{KM0srfg;l2iK6#CX(_?B$98 zKO~z;!B_~aOCZE|jQ-g5_lyvqj~j2{VD=MFQAtjKp`e~#I}3dXJ8IRB=YP2__<;I; zLxH4Dd0PJzQ@>L|5?5OB>v2H-hcaacm3QwbP({XJ&z&sX7K@I?TLFHT1EdDShzNk4 zEUyg>huFIN9;77JhY^tJ-nl;?DPWCDwJh~@>u1QHvXbol;$mhCq&I@`ydzc=6a+)_ zXv`4?%=;FOOYW1#Kb-R-PeiD2W?mty{ivv5+rpo|GFiqG+Zam7jeczC-GX2ENE@1k zHO@Bo-9-(i5rf0uuPi(&>>w&3XFf$-WS;ebfmC3dCX*8fk3AF}3eLkG@2#M>+7k}b zOtVP{4xZRgyiUi*|Dl>(NM7z-6+*-ab_9d1WbP69(Llu`0zwOksh7!p&!5cB<60qZ z;bpMWXL!t;UpukCXgB7z)|%@HJ_|8&Z2fp^czo4J@pGSdtlxN?b)Jf$YSOXA2yAn6 zw5^U{Xl8b98O>`eeFpGV^$UWjo+EQr;DK=(l#QRqQBaa~YLeV>?=!P=={+l_~8#HInetbIv zR7a(W_d9Ei5T`K%pxdA!JIqtFlCyDgYC9mUpQ(OwL~8OmB@kmn_-$&3bUs+=#-qt# zcr;7r{v4DG;;|3%dIOVvD6qt)35(PY7rl6m#bwCmPP&@i$|QEc?Z~D%zKz3q2X|ef z&i$u*T7?E1GoV;=nGx33_!p+*0zL*+&D5Y$Jbf9#hGrzj40A&EoIGmo$gQ7@NvWyt zaI(`A1aMH9z$2e=FB*~Zc6rAj#iC*o{sB{OV zn=WwWVe4i|YpWlK)+I zd#v1kSpr*#zEj7g-1;ulx34(fqWR>;QPxZZ9D>=RXk_nvk>}NLu4ORrv~u1Ew_DN2 z%>pql$3D7ZGT%X2oJD6&y&nTI{eo9PcXa5tH2S~5MprujAb3;6T3+<}l1$9s3@ zJdWt`@ljh-li`YEI(}?30+&)2VuFA?T45}z-l%NfL+|K#Ro{sr!~l{Xm%IPmlCXOE zL!9B+g7fw=TevK=SXHY;%p&<_l%r-Elc&S{^HgsFB^wNo!7VNB(Dm>ev+Zh>@W%Hc=;*6c=@=t@GHUmHGO7I{4|^+)PprB0CjM1m3j14Dzz4J6fK%zJq1 zn~LHy;%P{982BF$ewQ_X`cQpu7xW4|LtQ)2S>O&+-;PFwAkw}|;4)f<^>zC2IF>F3 zzqal}nQ0LDxBF4L8YZf6EOJ%bEQy#&p3Z2S$)|!drEZrUxotD~Qn8tyj->Hg9F5Dvew7r$S9=SnJn#Hg`LoT9wsw=b9yAq%Xr07 z7SENbRD}62>q;(8Z(_%;9=yz7m$#5Vv7?|^H(0Z1vlh*9xbK6$Q<+(YtcNkAqBrr= zB&=uDGC{)T2hte5W#9%58hMhi!;|e`&oHWWM=rs^+H!j2f+6bu9HE+c9)Hr^>FNRD z@1;8yJ`U9v-uIeJA=NKRR8#G}H~E?w{I}vcKJz4Z)^4(;3MW5(mR3^NjOgQisvvcU zvCOpvbyA5zkD(23r2d`&X7JrdzQ1F4!KD_R<>&Y>Wm{4PGc#k#tN7tmZh~}B=}-|_uY&)X;LgONiAOrZ217*^xnbl#s@g{itE}fi~kJQ zu$j*7xngJdS!OuWg?kfPhO$&d90`Qy6WM6;+-B#=wK0FNs(5@lj~RC`zG04w8I@?^ zS!o88xZRZt?0%4aZ)@!)ta2|Ju<_?3DVo+8`!9yXKF(zCKYA4AZZ_7~I^*$G3ey(Bhw9MS<^ncC;gUAeKN&tUd%R=tE1!&^VW6lUdQjg^ z9!e_5VQH(y00wQ~b+f~2|7ev*;P#ZIY~PNHJpAm(yjL%^4o$&Mq@*af3)F#*`X8V` zJ>W;pd{3sxz&vgKm5J1miR?~C6%mpm2yl!@zrPn(FdFR=xDOSNH{JU#U75r#yv8V7#L_c!Gy4+9z2i@T;PcjBugaNz`0i=eI zn3z=0)nK=ghBZCD;k02cr<=8H$w4>D5q4Q)jd+yDAS3}03es5_MTkO&|9r*|UZmgU zZ6>|5;nhGa4(nj>t6RqUwDevRQVW4bBGsS(Ptw3vJcqxnT8^_>!`4=66L2m00QhhG zKb}PYoj7#PZC<1(K#kheLN@0EfI{$^=Ir#8G1Ipt@VxEq<7W17S&`tJ5@pP+1y+On z!SkPoKDo^W6okCT~XdiR6=_kpd>zf1uV|la3x93UZ~t=T*b1_G_aK{P)n{q{`+1oI-%go zD&;ejR2b*PC7KSt1?<8n6WV5aXXk0JI^i)4XfeLpGrL!#}WdqjDk zb7!8oe7GF+jBJ_~1&S{YRf3}`i^0yf14P#P3zA zY?zI=CZ+Ev!8?x8jBudZ(~WyZ*5WeE@RBC-8yuK%MeJ( + /// APIs for managing addons. + /// + public static class PlayFabAddonAPI + { + static PlayFabAddonAPI() {} + + + ///

+ /// Verify entity login. + /// + public static bool IsEntityLoggedIn() + { + return PlayFabSettings.staticPlayer.IsEntityLoggedIn(); + } + + /// + /// Clear the Client SessionToken which allows this Client to call API calls requiring login. + /// A new/fresh login will be required after calling this. + /// + public static void ForgetAllCredentials() + { + PlayFabSettings.staticPlayer.ForgetAllCredentials(); + } + + /// + /// Creates the Apple addon on a title, or updates it if it already exists. + /// + public static void CreateOrUpdateApple(CreateOrUpdateAppleRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Addon/CreateOrUpdateApple", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Creates the Facebook addon on a title, or updates it if it already exists. + /// + public static void CreateOrUpdateFacebook(CreateOrUpdateFacebookRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Addon/CreateOrUpdateFacebook", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Creates the Facebook Instant Games addon on a title, or updates it if it already exists. + /// + public static void CreateOrUpdateFacebookInstantGames(CreateOrUpdateFacebookInstantGamesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Addon/CreateOrUpdateFacebookInstantGames", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Creates the Google addon on a title, or updates it if it already exists. + /// + public static void CreateOrUpdateGoogle(CreateOrUpdateGoogleRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Addon/CreateOrUpdateGoogle", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Creates the Kongregate addon on a title, or updates it if it already exists. + /// + public static void CreateOrUpdateKongregate(CreateOrUpdateKongregateRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Addon/CreateOrUpdateKongregate", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Creates the Nintendo addon on a title, or updates it if it already exists. + /// + public static void CreateOrUpdateNintendo(CreateOrUpdateNintendoRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Addon/CreateOrUpdateNintendo", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Creates the PSN addon on a title, or updates it if it already exists. + /// + public static void CreateOrUpdatePSN(CreateOrUpdatePSNRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Addon/CreateOrUpdatePSN", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Creates the Steam addon on a title, or updates it if it already exists. + /// + public static void CreateOrUpdateSteam(CreateOrUpdateSteamRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Addon/CreateOrUpdateSteam", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Creates the Twitch addon on a title, or updates it if it already exists. + /// + public static void CreateOrUpdateTwitch(CreateOrUpdateTwitchRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Addon/CreateOrUpdateTwitch", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Deletes the Apple addon on a title. + /// + public static void DeleteApple(DeleteAppleRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Addon/DeleteApple", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Deletes the Facebook addon on a title. + /// + public static void DeleteFacebook(DeleteFacebookRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Addon/DeleteFacebook", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Deletes the Facebook addon on a title. + /// + public static void DeleteFacebookInstantGames(DeleteFacebookInstantGamesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Addon/DeleteFacebookInstantGames", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Deletes the Google addon on a title. + /// + public static void DeleteGoogle(DeleteGoogleRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Addon/DeleteGoogle", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Deletes the Kongregate addon on a title. + /// + public static void DeleteKongregate(DeleteKongregateRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Addon/DeleteKongregate", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Deletes the Nintendo addon on a title. + /// + public static void DeleteNintendo(DeleteNintendoRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Addon/DeleteNintendo", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Deletes the PSN addon on a title. + /// + public static void DeletePSN(DeletePSNRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Addon/DeletePSN", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Deletes the Steam addon on a title. + /// + public static void DeleteSteam(DeleteSteamRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Addon/DeleteSteam", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Deletes the Twitch addon on a title. + /// + public static void DeleteTwitch(DeleteTwitchRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Addon/DeleteTwitch", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets information of the Apple addon on a title, omits secrets. + /// + public static void GetApple(GetAppleRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Addon/GetApple", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets information of the Facebook addon on a title, omits secrets. + /// + public static void GetFacebook(GetFacebookRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Addon/GetFacebook", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets information of the Facebook Instant Games addon on a title, omits secrets. + /// + public static void GetFacebookInstantGames(GetFacebookInstantGamesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Addon/GetFacebookInstantGames", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets information of the Google addon on a title, omits secrets. + /// + public static void GetGoogle(GetGoogleRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Addon/GetGoogle", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets information of the Kongregate addon on a title, omits secrets. + /// + public static void GetKongregate(GetKongregateRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Addon/GetKongregate", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets information of the Nintendo addon on a title, omits secrets. + /// + public static void GetNintendo(GetNintendoRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Addon/GetNintendo", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets information of the PSN addon on a title, omits secrets. + /// + public static void GetPSN(GetPSNRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Addon/GetPSN", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets information of the Steam addon on a title, omits secrets. + /// + public static void GetSteam(GetSteamRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Addon/GetSteam", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets information of the Twitch addon on a title, omits secrets. + /// + public static void GetTwitch(GetTwitchRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Addon/GetTwitch", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + + } +} + +#endif diff --git a/Assets/PlayFabSDK/Addon/PlayFabAddonAPI.cs.meta b/Assets/PlayFabSDK/Addon/PlayFabAddonAPI.cs.meta new file mode 100644 index 00000000..39ef2ec7 --- /dev/null +++ b/Assets/PlayFabSDK/Addon/PlayFabAddonAPI.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 16e6981cbc311934bab9111885dbfc1a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Addon/PlayFabAddonInstanceAPI.cs b/Assets/PlayFabSDK/Addon/PlayFabAddonInstanceAPI.cs new file mode 100644 index 00000000..acba30cf --- /dev/null +++ b/Assets/PlayFabSDK/Addon/PlayFabAddonInstanceAPI.cs @@ -0,0 +1,354 @@ +#if !DISABLE_PLAYFABENTITY_API + +using System; +using System.Collections.Generic; +using PlayFab.AddonModels; +using PlayFab.Internal; +using PlayFab.SharedModels; + +namespace PlayFab +{ + /// + /// APIs for managing addons. + /// + public class PlayFabAddonInstanceAPI : IPlayFabInstanceApi + { + public readonly PlayFabApiSettings apiSettings = null; + public readonly PlayFabAuthenticationContext authenticationContext = null; + + public PlayFabAddonInstanceAPI(PlayFabAuthenticationContext context) + { + if (context == null) + throw new PlayFabException(PlayFabExceptionCode.AuthContextRequired, "Context cannot be null, create a PlayFabAuthenticationContext for each player in advance, or call .GetAuthenticationContext()"); + authenticationContext = context; + } + + public PlayFabAddonInstanceAPI(PlayFabApiSettings settings, PlayFabAuthenticationContext context) + { + if (context == null) + throw new PlayFabException(PlayFabExceptionCode.AuthContextRequired, "Context cannot be null, create a PlayFabAuthenticationContext for each player in advance, or call .GetAuthenticationContext()"); + apiSettings = settings; + authenticationContext = context; + } + + /// + /// Verify entity login. + /// + public bool IsEntityLoggedIn() + { + return authenticationContext == null ? false : authenticationContext.IsEntityLoggedIn(); + } + + /// + /// Clear the Client SessionToken which allows this Client to call API calls requiring login. + /// A new/fresh login will be required after calling this. + /// + public void ForgetAllCredentials() + { + if (authenticationContext != null) + { + authenticationContext.ForgetAllCredentials(); + } + } + + /// + /// Creates the Apple addon on a title, or updates it if it already exists. + /// + public void CreateOrUpdateApple(CreateOrUpdateAppleRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Addon/CreateOrUpdateApple", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Creates the Facebook addon on a title, or updates it if it already exists. + /// + public void CreateOrUpdateFacebook(CreateOrUpdateFacebookRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Addon/CreateOrUpdateFacebook", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Creates the Facebook Instant Games addon on a title, or updates it if it already exists. + /// + public void CreateOrUpdateFacebookInstantGames(CreateOrUpdateFacebookInstantGamesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Addon/CreateOrUpdateFacebookInstantGames", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Creates the Google addon on a title, or updates it if it already exists. + /// + public void CreateOrUpdateGoogle(CreateOrUpdateGoogleRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Addon/CreateOrUpdateGoogle", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Creates the Kongregate addon on a title, or updates it if it already exists. + /// + public void CreateOrUpdateKongregate(CreateOrUpdateKongregateRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Addon/CreateOrUpdateKongregate", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Creates the Nintendo addon on a title, or updates it if it already exists. + /// + public void CreateOrUpdateNintendo(CreateOrUpdateNintendoRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Addon/CreateOrUpdateNintendo", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Creates the PSN addon on a title, or updates it if it already exists. + /// + public void CreateOrUpdatePSN(CreateOrUpdatePSNRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Addon/CreateOrUpdatePSN", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Creates the Steam addon on a title, or updates it if it already exists. + /// + public void CreateOrUpdateSteam(CreateOrUpdateSteamRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Addon/CreateOrUpdateSteam", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Creates the Twitch addon on a title, or updates it if it already exists. + /// + public void CreateOrUpdateTwitch(CreateOrUpdateTwitchRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Addon/CreateOrUpdateTwitch", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Deletes the Apple addon on a title. + /// + public void DeleteApple(DeleteAppleRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Addon/DeleteApple", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Deletes the Facebook addon on a title. + /// + public void DeleteFacebook(DeleteFacebookRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Addon/DeleteFacebook", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Deletes the Facebook addon on a title. + /// + public void DeleteFacebookInstantGames(DeleteFacebookInstantGamesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Addon/DeleteFacebookInstantGames", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Deletes the Google addon on a title. + /// + public void DeleteGoogle(DeleteGoogleRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Addon/DeleteGoogle", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Deletes the Kongregate addon on a title. + /// + public void DeleteKongregate(DeleteKongregateRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Addon/DeleteKongregate", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Deletes the Nintendo addon on a title. + /// + public void DeleteNintendo(DeleteNintendoRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Addon/DeleteNintendo", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Deletes the PSN addon on a title. + /// + public void DeletePSN(DeletePSNRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Addon/DeletePSN", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Deletes the Steam addon on a title. + /// + public void DeleteSteam(DeleteSteamRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Addon/DeleteSteam", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Deletes the Twitch addon on a title. + /// + public void DeleteTwitch(DeleteTwitchRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Addon/DeleteTwitch", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets information of the Apple addon on a title, omits secrets. + /// + public void GetApple(GetAppleRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Addon/GetApple", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets information of the Facebook addon on a title, omits secrets. + /// + public void GetFacebook(GetFacebookRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Addon/GetFacebook", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets information of the Facebook Instant Games addon on a title, omits secrets. + /// + public void GetFacebookInstantGames(GetFacebookInstantGamesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Addon/GetFacebookInstantGames", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets information of the Google addon on a title, omits secrets. + /// + public void GetGoogle(GetGoogleRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Addon/GetGoogle", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets information of the Kongregate addon on a title, omits secrets. + /// + public void GetKongregate(GetKongregateRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Addon/GetKongregate", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets information of the Nintendo addon on a title, omits secrets. + /// + public void GetNintendo(GetNintendoRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Addon/GetNintendo", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets information of the PSN addon on a title, omits secrets. + /// + public void GetPSN(GetPSNRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Addon/GetPSN", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets information of the Steam addon on a title, omits secrets. + /// + public void GetSteam(GetSteamRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Addon/GetSteam", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets information of the Twitch addon on a title, omits secrets. + /// + public void GetTwitch(GetTwitchRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Addon/GetTwitch", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + } +} + +#endif diff --git a/Assets/PlayFabSDK/Addon/PlayFabAddonInstanceAPI.cs.meta b/Assets/PlayFabSDK/Addon/PlayFabAddonInstanceAPI.cs.meta new file mode 100644 index 00000000..4d4074e8 --- /dev/null +++ b/Assets/PlayFabSDK/Addon/PlayFabAddonInstanceAPI.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: cb16ee30d77a0bd4095b94a53a375676 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Addon/PlayFabAddonModels.cs b/Assets/PlayFabSDK/Addon/PlayFabAddonModels.cs new file mode 100644 index 00000000..24946cf7 --- /dev/null +++ b/Assets/PlayFabSDK/Addon/PlayFabAddonModels.cs @@ -0,0 +1,793 @@ +#if !DISABLE_PLAYFABENTITY_API +using System; +using System.Collections.Generic; +using PlayFab.SharedModels; + +namespace PlayFab.AddonModels +{ + [Serializable] + public class CreateOrUpdateAppleRequest : PlayFabRequestCommon + { + /// + /// iOS App Bundle ID obtained after setting up your app in the App Store. + /// + public string AppBundleId; + /// + /// iOS App Shared Secret obtained after setting up your app in the App Store. + /// + public string AppSharedSecret; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The optional entity to perform this action on. Defaults to the currently logged in entity. + /// + public EntityKey Entity; + /// + /// If an error should be returned if the addon already exists. + /// + public bool? ErrorIfExists; + /// + /// Ignore expiration date for identity tokens. Be aware that when set to true this can invalidate expired tokens in the + /// case where Apple rotates their signing keys. + /// + public bool? IgnoreExpirationDate; + /// + /// Require secure authentication only for this app. + /// + public bool? RequireSecureAuthentication; + } + + [Serializable] + public class CreateOrUpdateAppleResponse : PlayFabResultCommon + { + } + + [Serializable] + public class CreateOrUpdateFacebookInstantGamesRequest : PlayFabRequestCommon + { + /// + /// Facebook App ID obtained after setting up your app in Facebook Instant Games. + /// + public string AppID; + /// + /// Facebook App Secret obtained after setting up your app in Facebook Instant Games. + /// + public string AppSecret; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The optional entity to perform this action on. Defaults to the currently logged in entity. + /// + public EntityKey Entity; + /// + /// If an error should be returned if the addon already exists. + /// + public bool? ErrorIfExists; + } + + [Serializable] + public class CreateOrUpdateFacebookInstantGamesResponse : PlayFabResultCommon + { + } + + [Serializable] + public class CreateOrUpdateFacebookRequest : PlayFabRequestCommon + { + /// + /// Facebook App ID obtained after setting up your app in Facebook. + /// + public string AppID; + /// + /// Facebook App Secret obtained after setting up your app in Facebook. + /// + public string AppSecret; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The optional entity to perform this action on. Defaults to the currently logged in entity. + /// + public EntityKey Entity; + /// + /// If an error should be returned if the addon already exists. + /// + public bool? ErrorIfExists; + /// + /// Email address for purchase dispute notifications. + /// + public string NotificationEmail; + } + + [Serializable] + public class CreateOrUpdateFacebookResponse : PlayFabResultCommon + { + } + + [Serializable] + public class CreateOrUpdateGoogleRequest : PlayFabRequestCommon + { + /// + /// Google App License Key obtained after setting up your app in the Google Play developer portal. Required if using Google + /// receipt validation. + /// + public string AppLicenseKey; + /// + /// Google App Package ID obtained after setting up your app in the Google Play developer portal. Required if using Google + /// receipt validation. + /// + public string AppPackageID; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The optional entity to perform this action on. Defaults to the currently logged in entity. + /// + public EntityKey Entity; + /// + /// If an error should be returned if the addon already exists. + /// + public bool? ErrorIfExists; + /// + /// Google OAuth Client ID obtained through the Google Developer Console by creating a new set of "OAuth Client ID". + /// Required if using Google Authentication. + /// + public string OAuthClientID; + /// + /// Google OAuth Client Secret obtained through the Google Developer Console by creating a new set of "OAuth Client ID". + /// Required if using Google Authentication. + /// + public string OAuthClientSecret; + /// + /// Authorized Redirect Uri obtained through the Google Developer Console. This currently defaults to + /// https://oauth.playfab.com/oauth2/google. If you are authenticating players via browser, please update this to your own + /// domain. + /// + public string OAuthCustomRedirectUri; + /// + /// Needed to enable pending purchase handling and subscription processing. + /// + public string ServiceAccountKey; + } + + [Serializable] + public class CreateOrUpdateGoogleResponse : PlayFabResultCommon + { + } + + [Serializable] + public class CreateOrUpdateKongregateRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The optional entity to perform this action on. Defaults to the currently logged in entity. + /// + public EntityKey Entity; + /// + /// If an error should be returned if the addon already exists. + /// + public bool? ErrorIfExists; + /// + /// Kongregate Secret API Key obtained after setting up your game in your Kongregate developer account. + /// + public string SecretAPIKey; + } + + [Serializable] + public class CreateOrUpdateKongregateResponse : PlayFabResultCommon + { + } + + [Serializable] + public class CreateOrUpdateNintendoRequest : PlayFabRequestCommon + { + /// + /// Nintendo Switch Application ID, without the "0x" prefix. + /// + public string ApplicationID; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The optional entity to perform this action on. Defaults to the currently logged in entity. + /// + public EntityKey Entity; + /// + /// List of Nintendo Environments, currently supporting up to 4. Needs Catalog enabled. + /// + public List Environments; + /// + /// If an error should be returned if the addon already exists. + /// + public bool? ErrorIfExists; + } + + [Serializable] + public class CreateOrUpdateNintendoResponse : PlayFabResultCommon + { + } + + [Serializable] + public class CreateOrUpdatePSNRequest : PlayFabRequestCommon + { + /// + /// Client ID obtained after setting up your game with Sony. This one is associated with the existing PS4 marketplace. + /// + public string ClientID; + /// + /// Client secret obtained after setting up your game with Sony. This one is associated with the existing PS4 marketplace. + /// + public string ClientSecret; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The optional entity to perform this action on. Defaults to the currently logged in entity. + /// + public EntityKey Entity; + /// + /// If an error should be returned if the addon already exists. + /// + public bool? ErrorIfExists; + /// + /// Client ID obtained after setting up your game with Sony. This one is associated with the modern marketplace, which + /// includes PS5, cross-generation for PS4, and unified entitlements. + /// + public string NextGenClientID; + /// + /// Client secret obtained after setting up your game with Sony. This one is associated with the modern marketplace, which + /// includes PS5, cross-generation for PS4, and unified entitlements. + /// + public string NextGenClientSecret; + } + + [Serializable] + public class CreateOrUpdatePSNResponse : PlayFabResultCommon + { + } + + [Serializable] + public class CreateOrUpdateSteamRequest : PlayFabRequestCommon + { + /// + /// Application ID obtained after setting up your app in Valve's developer portal. + /// + public string ApplicationId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Enforce usage of AzurePlayFab identity in user authentication tickets. + /// + public bool? EnforceServiceSpecificTickets; + /// + /// The optional entity to perform this action on. Defaults to the currently logged in entity. + /// + public EntityKey Entity; + /// + /// If an error should be returned if the addon already exists. + /// + public bool? ErrorIfExists; + /// + /// Sercet Key obtained after setting up your app in Valve's developer portal. + /// + public string SecretKey; + /// + /// Use Steam Payments sandbox endpoint for test transactions. + /// + public bool? UseSandbox; + } + + [Serializable] + public class CreateOrUpdateSteamResponse : PlayFabResultCommon + { + } + + [Serializable] + public class CreateOrUpdateTwitchRequest : PlayFabRequestCommon + { + /// + /// Client ID obtained after creating your Twitch developer account. + /// + public string ClientID; + /// + /// Client Secret obtained after creating your Twitch developer account. + /// + public string ClientSecret; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The optional entity to perform this action on. Defaults to the currently logged in entity. + /// + public EntityKey Entity; + /// + /// If an error should be returned if the addon already exists. + /// + public bool? ErrorIfExists; + } + + [Serializable] + public class CreateOrUpdateTwitchResponse : PlayFabResultCommon + { + } + + [Serializable] + public class DeleteAppleRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The optional entity to perform this action on. Defaults to the currently logged in entity. + /// + public EntityKey Entity; + } + + [Serializable] + public class DeleteAppleResponse : PlayFabResultCommon + { + } + + [Serializable] + public class DeleteFacebookInstantGamesRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The optional entity to perform this action on. Defaults to the currently logged in entity. + /// + public EntityKey Entity; + } + + [Serializable] + public class DeleteFacebookInstantGamesResponse : PlayFabResultCommon + { + } + + [Serializable] + public class DeleteFacebookRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The optional entity to perform this action on. Defaults to the currently logged in entity. + /// + public EntityKey Entity; + } + + [Serializable] + public class DeleteFacebookResponse : PlayFabResultCommon + { + } + + [Serializable] + public class DeleteGoogleRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The optional entity to perform this action on. Defaults to the currently logged in entity. + /// + public EntityKey Entity; + } + + [Serializable] + public class DeleteGoogleResponse : PlayFabResultCommon + { + } + + [Serializable] + public class DeleteKongregateRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The optional entity to perform this action on. Defaults to the currently logged in entity. + /// + public EntityKey Entity; + } + + [Serializable] + public class DeleteKongregateResponse : PlayFabResultCommon + { + } + + [Serializable] + public class DeleteNintendoRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The optional entity to perform this action on. Defaults to the currently logged in entity. + /// + public EntityKey Entity; + } + + [Serializable] + public class DeleteNintendoResponse : PlayFabResultCommon + { + } + + [Serializable] + public class DeletePSNRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The optional entity to perform this action on. Defaults to the currently logged in entity. + /// + public EntityKey Entity; + } + + [Serializable] + public class DeletePSNResponse : PlayFabResultCommon + { + } + + [Serializable] + public class DeleteSteamRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The optional entity to perform this action on. Defaults to the currently logged in entity. + /// + public EntityKey Entity; + } + + [Serializable] + public class DeleteSteamResponse : PlayFabResultCommon + { + } + + [Serializable] + public class DeleteTwitchRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The optional entity to perform this action on. Defaults to the currently logged in entity. + /// + public EntityKey Entity; + } + + [Serializable] + public class DeleteTwitchResponse : PlayFabResultCommon + { + } + + /// + /// Combined entity type and ID structure which uniquely identifies a single entity. + /// + [Serializable] + public class EntityKey : PlayFabBaseModel + { + /// + /// Unique ID of the entity. + /// + public string Id; + /// + /// Entity type. See https://docs.microsoft.com/gaming/playfab/features/data/entities/available-built-in-entity-types + /// + public string Type; + } + + [Serializable] + public class GetAppleRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The optional entity to perform this action on. Defaults to the currently logged in entity. + /// + public EntityKey Entity; + } + + [Serializable] + public class GetAppleResponse : PlayFabResultCommon + { + /// + /// iOS App Bundle ID obtained after setting up your app in the App Store. + /// + public string AppBundleId; + /// + /// Addon status. + /// + public bool Created; + /// + /// Ignore expiration date for identity tokens. + /// + public bool? IgnoreExpirationDate; + /// + /// Require secure authentication only for this app. + /// + public bool? RequireSecureAuthentication; + } + + [Serializable] + public class GetFacebookInstantGamesRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The optional entity to perform this action on. Defaults to the currently logged in entity. + /// + public EntityKey Entity; + } + + [Serializable] + public class GetFacebookInstantGamesResponse : PlayFabResultCommon + { + /// + /// Facebook App ID obtained after setting up your app in Facebook Instant Games. + /// + public string AppID; + /// + /// Addon status. + /// + public bool Created; + } + + [Serializable] + public class GetFacebookRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The optional entity to perform this action on. Defaults to the currently logged in entity. + /// + public EntityKey Entity; + } + + [Serializable] + public class GetFacebookResponse : PlayFabResultCommon + { + /// + /// Facebook App ID obtained after setting up your app in Facebook. + /// + public string AppID; + /// + /// Addon status. + /// + public bool Created; + /// + /// Email address for purchase dispute notifications. + /// + public string NotificationEmail; + } + + [Serializable] + public class GetGoogleRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The optional entity to perform this action on. Defaults to the currently logged in entity. + /// + public EntityKey Entity; + } + + [Serializable] + public class GetGoogleResponse : PlayFabResultCommon + { + /// + /// Google App Package ID obtained after setting up your app in the Google Play developer portal. Required if using Google + /// receipt validation. + /// + public string AppPackageID; + /// + /// Addon status. + /// + public bool Created; + /// + /// Google OAuth Client ID obtained through the Google Developer Console by creating a new set of "OAuth Client ID". + /// Required if using Google Authentication. + /// + public string OAuthClientID; + /// + /// Authorized Redirect Uri obtained through the Google Developer Console. This currently defaults to + /// https://oauth.playfab.com/oauth2/google. If you are authenticating players via browser, please update this to your own + /// domain. + /// + public string OauthCustomRedirectUri; + } + + [Serializable] + public class GetKongregateRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The optional entity to perform this action on. Defaults to the currently logged in entity. + /// + public EntityKey Entity; + } + + [Serializable] + public class GetKongregateResponse : PlayFabResultCommon + { + /// + /// Addon status. + /// + public bool Created; + } + + [Serializable] + public class GetNintendoRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The optional entity to perform this action on. Defaults to the currently logged in entity. + /// + public EntityKey Entity; + } + + [Serializable] + public class GetNintendoResponse : PlayFabResultCommon + { + /// + /// Nintendo Switch Application ID, without the "0x" prefix. + /// + public string ApplicationID; + /// + /// Addon status. + /// + public bool Created; + /// + /// List of Nintendo Environments, currently supporting up to 4. + /// + public List Environments; + } + + [Serializable] + public class GetPSNRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The optional entity to perform this action on. Defaults to the currently logged in entity. + /// + public EntityKey Entity; + } + + [Serializable] + public class GetPSNResponse : PlayFabResultCommon + { + /// + /// Client ID obtained after setting up your game with Sony. This one is associated with the existing PS4 marketplace. + /// + public string ClientID; + /// + /// Addon status. + /// + public bool Created; + /// + /// Client ID obtained after setting up your game with Sony. This one is associated with the modern marketplace, which + /// includes PS5, cross-generation for PS4, and unified entitlements. + /// + public string NextGenClientID; + } + + [Serializable] + public class GetSteamRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The optional entity to perform this action on. Defaults to the currently logged in entity. + /// + public EntityKey Entity; + } + + [Serializable] + public class GetSteamResponse : PlayFabResultCommon + { + /// + /// Application ID obtained after setting up your game in Valve's developer portal. + /// + public string ApplicationId; + /// + /// Addon status. + /// + public bool Created; + /// + /// Enforce usage of AzurePlayFab identity in user authentication tickets. + /// + public bool? EnforceServiceSpecificTickets; + /// + /// Use Steam Payments sandbox endpoint for test transactions. + /// + public bool? UseSandbox; + } + + [Serializable] + public class GetTwitchRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The optional entity to perform this action on. Defaults to the currently logged in entity. + /// + public EntityKey Entity; + } + + [Serializable] + public class GetTwitchResponse : PlayFabResultCommon + { + /// + /// Client ID obtained after creating your Twitch developer account. + /// + public string ClientID; + /// + /// Addon status. + /// + public bool Created; + } + + [Serializable] + public class NintendoEnvironment : PlayFabBaseModel + { + /// + /// Client ID for the Nintendo Environment. + /// + public string ClientID; + /// + /// Client Secret for the Nintendo Environment. + /// + public string ClientSecret; + /// + /// ID for the Nintendo Environment. + /// + public string ID; + } +} +#endif diff --git a/Assets/PlayFabSDK/Addon/PlayFabAddonModels.cs.meta b/Assets/PlayFabSDK/Addon/PlayFabAddonModels.cs.meta new file mode 100644 index 00000000..573052f2 --- /dev/null +++ b/Assets/PlayFabSDK/Addon/PlayFabAddonModels.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 87ffcc7751ee8d54a9effc1467d73c87 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Addon/PlayFabEvents.cs b/Assets/PlayFabSDK/Addon/PlayFabEvents.cs new file mode 100644 index 00000000..544f4f35 --- /dev/null +++ b/Assets/PlayFabSDK/Addon/PlayFabEvents.cs @@ -0,0 +1,64 @@ +#if !DISABLE_PLAYFABENTITY_API +using PlayFab.AddonModels; + +namespace PlayFab.Events +{ + public partial class PlayFabEvents + { + public event PlayFabRequestEvent OnAddonCreateOrUpdateAppleRequestEvent; + public event PlayFabResultEvent OnAddonCreateOrUpdateAppleResultEvent; + public event PlayFabRequestEvent OnAddonCreateOrUpdateFacebookRequestEvent; + public event PlayFabResultEvent OnAddonCreateOrUpdateFacebookResultEvent; + public event PlayFabRequestEvent OnAddonCreateOrUpdateFacebookInstantGamesRequestEvent; + public event PlayFabResultEvent OnAddonCreateOrUpdateFacebookInstantGamesResultEvent; + public event PlayFabRequestEvent OnAddonCreateOrUpdateGoogleRequestEvent; + public event PlayFabResultEvent OnAddonCreateOrUpdateGoogleResultEvent; + public event PlayFabRequestEvent OnAddonCreateOrUpdateKongregateRequestEvent; + public event PlayFabResultEvent OnAddonCreateOrUpdateKongregateResultEvent; + public event PlayFabRequestEvent OnAddonCreateOrUpdateNintendoRequestEvent; + public event PlayFabResultEvent OnAddonCreateOrUpdateNintendoResultEvent; + public event PlayFabRequestEvent OnAddonCreateOrUpdatePSNRequestEvent; + public event PlayFabResultEvent OnAddonCreateOrUpdatePSNResultEvent; + public event PlayFabRequestEvent OnAddonCreateOrUpdateSteamRequestEvent; + public event PlayFabResultEvent OnAddonCreateOrUpdateSteamResultEvent; + public event PlayFabRequestEvent OnAddonCreateOrUpdateTwitchRequestEvent; + public event PlayFabResultEvent OnAddonCreateOrUpdateTwitchResultEvent; + public event PlayFabRequestEvent OnAddonDeleteAppleRequestEvent; + public event PlayFabResultEvent OnAddonDeleteAppleResultEvent; + public event PlayFabRequestEvent OnAddonDeleteFacebookRequestEvent; + public event PlayFabResultEvent OnAddonDeleteFacebookResultEvent; + public event PlayFabRequestEvent OnAddonDeleteFacebookInstantGamesRequestEvent; + public event PlayFabResultEvent OnAddonDeleteFacebookInstantGamesResultEvent; + public event PlayFabRequestEvent OnAddonDeleteGoogleRequestEvent; + public event PlayFabResultEvent OnAddonDeleteGoogleResultEvent; + public event PlayFabRequestEvent OnAddonDeleteKongregateRequestEvent; + public event PlayFabResultEvent OnAddonDeleteKongregateResultEvent; + public event PlayFabRequestEvent OnAddonDeleteNintendoRequestEvent; + public event PlayFabResultEvent OnAddonDeleteNintendoResultEvent; + public event PlayFabRequestEvent OnAddonDeletePSNRequestEvent; + public event PlayFabResultEvent OnAddonDeletePSNResultEvent; + public event PlayFabRequestEvent OnAddonDeleteSteamRequestEvent; + public event PlayFabResultEvent OnAddonDeleteSteamResultEvent; + public event PlayFabRequestEvent OnAddonDeleteTwitchRequestEvent; + public event PlayFabResultEvent OnAddonDeleteTwitchResultEvent; + public event PlayFabRequestEvent OnAddonGetAppleRequestEvent; + public event PlayFabResultEvent OnAddonGetAppleResultEvent; + public event PlayFabRequestEvent OnAddonGetFacebookRequestEvent; + public event PlayFabResultEvent OnAddonGetFacebookResultEvent; + public event PlayFabRequestEvent OnAddonGetFacebookInstantGamesRequestEvent; + public event PlayFabResultEvent OnAddonGetFacebookInstantGamesResultEvent; + public event PlayFabRequestEvent OnAddonGetGoogleRequestEvent; + public event PlayFabResultEvent OnAddonGetGoogleResultEvent; + public event PlayFabRequestEvent OnAddonGetKongregateRequestEvent; + public event PlayFabResultEvent OnAddonGetKongregateResultEvent; + public event PlayFabRequestEvent OnAddonGetNintendoRequestEvent; + public event PlayFabResultEvent OnAddonGetNintendoResultEvent; + public event PlayFabRequestEvent OnAddonGetPSNRequestEvent; + public event PlayFabResultEvent OnAddonGetPSNResultEvent; + public event PlayFabRequestEvent OnAddonGetSteamRequestEvent; + public event PlayFabResultEvent OnAddonGetSteamResultEvent; + public event PlayFabRequestEvent OnAddonGetTwitchRequestEvent; + public event PlayFabResultEvent OnAddonGetTwitchResultEvent; + } +} +#endif diff --git a/Assets/PlayFabSDK/Addon/PlayFabEvents.cs.meta b/Assets/PlayFabSDK/Addon/PlayFabEvents.cs.meta new file mode 100644 index 00000000..9673c4a7 --- /dev/null +++ b/Assets/PlayFabSDK/Addon/PlayFabEvents.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d196246361876214999b16fe616a0f32 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Admin.meta b/Assets/PlayFabSDK/Admin.meta new file mode 100644 index 00000000..f8f81a65 --- /dev/null +++ b/Assets/PlayFabSDK/Admin.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c76a110e4c6e58c439aae9bb7eb005db +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Admin/PlayFabAdminAPI.cs b/Assets/PlayFabSDK/Admin/PlayFabAdminAPI.cs new file mode 100644 index 00000000..3d2d5a3d --- /dev/null +++ b/Assets/PlayFabSDK/Admin/PlayFabAdminAPI.cs @@ -0,0 +1,1551 @@ +#if ENABLE_PLAYFABADMIN_API && !DISABLE_PLAYFAB_STATIC_API + +using System; +using System.Collections.Generic; +using PlayFab.AdminModels; +using PlayFab.Internal; + +namespace PlayFab +{ + /// + /// APIs for managing title configurations, uploaded Game Server code executables, and user data + /// + public static class PlayFabAdminAPI + { + static PlayFabAdminAPI() {} + + + /// + /// Clear the Client SessionToken which allows this Client to call API calls requiring login. + /// A new/fresh login will be required after calling this. + /// + public static void ForgetAllCredentials() + { + PlayFabSettings.staticPlayer.ForgetAllCredentials(); + } + + /// + /// Abort an ongoing task instance. + /// + public static void AbortTaskInstance(AbortTaskInstanceRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/AbortTaskInstance", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Update news item to include localized version + /// + public static void AddLocalizedNews(AddLocalizedNewsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/AddLocalizedNews", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Adds a new news item to the title's news feed + /// + public static void AddNews(AddNewsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/AddNews", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Adds a given tag to a player profile. The tag's namespace is automatically generated based on the source of the tag. + /// + public static void AddPlayerTag(AddPlayerTagRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/AddPlayerTag", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Increments the specified virtual currency by the stated amount + /// + public static void AddUserVirtualCurrency(AddUserVirtualCurrencyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/AddUserVirtualCurrency", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Adds one or more virtual currencies to the set defined for the title. Virtual Currencies have a maximum + /// value of 2,147,483,647 when granted to a player. Any value over that will be discarded. + /// + public static void AddVirtualCurrencyTypes(AddVirtualCurrencyTypesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/AddVirtualCurrencyTypes", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Bans users by PlayFab ID with optional IP address, or MAC address for the provided game. + /// + public static void BanUsers(BanUsersRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/BanUsers", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Checks the global count for the limited edition item. + /// + public static void CheckLimitedEditionItemAvailability(CheckLimitedEditionItemAvailabilityRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/CheckLimitedEditionItemAvailability", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Create an ActionsOnPlayersInSegment task, which iterates through all players in a segment to execute action. + /// + public static void CreateActionsOnPlayersInSegmentTask(CreateActionsOnPlayerSegmentTaskRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/CreateActionsOnPlayersInSegmentTask", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Create a CloudScript task, which can run a CloudScript on a schedule. + /// + public static void CreateCloudScriptTask(CreateCloudScriptTaskRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/CreateCloudScriptTask", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Create a Insights Scheduled Scaling task, which can scale Insights Performance Units on a schedule + /// + public static void CreateInsightsScheduledScalingTask(CreateInsightsScheduledScalingTaskRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/CreateInsightsScheduledScalingTask", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Registers a relationship between a title and an Open ID Connect provider. + /// + public static void CreateOpenIdConnection(CreateOpenIdConnectionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/CreateOpenIdConnection", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Creates a new Player Shared Secret Key. It may take up to 5 minutes for this key to become generally available after + /// this API returns. + /// + public static void CreatePlayerSharedSecret(CreatePlayerSharedSecretRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/CreatePlayerSharedSecret", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Adds a new player statistic configuration to the title, optionally allowing the developer to specify a reset interval + /// and an aggregation method. + /// + public static void CreatePlayerStatisticDefinition(CreatePlayerStatisticDefinitionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/CreatePlayerStatisticDefinition", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Creates a new player segment by defining the conditions on player properties. Also, create actions to target the player + /// segments for a title. + /// + public static void CreateSegment(CreateSegmentRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/CreateSegment", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Delete a content file from the title. When deleting a file that does not exist, it returns success. + /// + public static void DeleteContent(DeleteContentRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/DeleteContent", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Removes a master player account entirely from all titles and deletes all associated data + /// + public static void DeleteMasterPlayerAccount(DeleteMasterPlayerAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/DeleteMasterPlayerAccount", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Deletes PlayStream and telemetry event data associated with the master player account from PlayFab storage + /// + public static void DeleteMasterPlayerEventData(DeleteMasterPlayerEventDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/DeleteMasterPlayerEventData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Deletes a player's subscription + /// + public static void DeleteMembershipSubscription(DeleteMembershipSubscriptionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/DeleteMembershipSubscription", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Removes a relationship between a title and an OpenID Connect provider. + /// + public static void DeleteOpenIdConnection(DeleteOpenIdConnectionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/DeleteOpenIdConnection", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Removes a user's player account from a title and deletes all associated data + /// + public static void DeletePlayer(DeletePlayerRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/DeletePlayer", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Deletes an existing Player Shared Secret Key. It may take up to 5 minutes for this delete to be reflected after this API + /// returns. + /// + public static void DeletePlayerSharedSecret(DeletePlayerSharedSecretRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/DeletePlayerSharedSecret", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Deletes an existing player segment and its associated action(s) for a title. + /// + public static void DeleteSegment(DeleteSegmentRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/DeleteSegment", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Deletes an existing virtual item store + /// + public static void DeleteStore(DeleteStoreRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/DeleteStore", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Delete a task. + /// + public static void DeleteTask(DeleteTaskRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/DeleteTask", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Permanently deletes a title and all associated configuration + /// + public static void DeleteTitle(DeleteTitleRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/DeleteTitle", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Deletes a specified set of title data overrides. + /// + public static void DeleteTitleDataOverride(DeleteTitleDataOverrideRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/DeleteTitleDataOverride", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Exports all associated data of a master player account + /// + public static void ExportMasterPlayerData(ExportMasterPlayerDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/ExportMasterPlayerData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Starts an export for the player profiles in a segment. This API creates a snapshot of all the player profiles which + /// match the segment definition at the time of the API call. Profiles which change while an export is in progress will not + /// be reflected in the results. + /// + public static void ExportPlayersInSegment(ExportPlayersInSegmentRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/ExportPlayersInSegment", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Get information about a ActionsOnPlayersInSegment task instance. + /// + public static void GetActionsOnPlayersInSegmentTaskInstance(GetTaskInstanceRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/GetActionsOnPlayersInSegmentTaskInstance", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves an array of player segment definitions. Results from this can be used in subsequent API calls such as + /// GetPlayersInSegment which requires a Segment ID. While segment names can change the ID for that segment will not change. + /// + public static void GetAllSegments(GetAllSegmentsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/GetAllSegments", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Retrieves the specified version of the title's catalog of virtual goods, including all defined properties + /// + public static void GetCatalogItems(GetCatalogItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/GetCatalogItems", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets the contents and information of a specific Cloud Script revision. + /// + public static void GetCloudScriptRevision(GetCloudScriptRevisionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/GetCloudScriptRevision", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Get detail information about a CloudScript task instance. + /// + public static void GetCloudScriptTaskInstance(GetTaskInstanceRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/GetCloudScriptTaskInstance", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Lists all the current cloud script versions. For each version, information about the current published and latest + /// revisions is also listed. + /// + public static void GetCloudScriptVersions(GetCloudScriptVersionsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/GetCloudScriptVersions", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// List all contents of the title and get statistics such as size + /// + public static void GetContentList(GetContentListRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/GetContentList", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the pre-signed URL for uploading a content file. A subsequent HTTP PUT to the returned URL uploads the + /// content. Also, please be aware that the Content service is specifically PlayFab's CDN offering, for which standard CDN + /// rates apply. + /// + public static void GetContentUploadUrl(GetContentUploadUrlRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/GetContentUploadUrl", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves a download URL for the requested report + /// + public static void GetDataReport(GetDataReportRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/GetDataReport", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Get the list of titles that the player has played + /// + public static void GetPlayedTitleList(GetPlayedTitleListRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/GetPlayedTitleList", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets a player's ID from an auth token. + /// + public static void GetPlayerIdFromAuthToken(GetPlayerIdFromAuthTokenRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/GetPlayerIdFromAuthToken", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the player's profile + /// + public static void GetPlayerProfile(GetPlayerProfileRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/GetPlayerProfile", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// List all segments that a player currently belongs to at this moment in time. + /// + public static void GetPlayerSegments(GetPlayersSegmentsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/GetPlayerSegments", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Returns all Player Shared Secret Keys including disabled and expired. + /// + public static void GetPlayerSharedSecrets(GetPlayerSharedSecretsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/GetPlayerSharedSecrets", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Allows for paging through all players in a given segment. This API creates a snapshot of all player profiles that match + /// the segment definition at the time of its creation and lives through the Total Seconds to Live, refreshing its life span + /// on each subsequent use of the Continuation Token. Profiles that change during the course of paging will not be reflected + /// in the results. AB Test segments are currently not supported by this operation. NOTE: This API is limited to being + /// called 30 times in one minute. You will be returned an error if you exceed this threshold. + /// + public static void GetPlayersInSegment(GetPlayersInSegmentRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/GetPlayersInSegment", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the configuration information for all player statistics defined in the title, regardless of whether they have + /// a reset interval. + /// + public static void GetPlayerStatisticDefinitions(GetPlayerStatisticDefinitionsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/GetPlayerStatisticDefinitions", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the information on the available versions of the specified statistic. + /// + public static void GetPlayerStatisticVersions(GetPlayerStatisticVersionsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/GetPlayerStatisticVersions", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Get all tags with a given Namespace (optional) from a player profile. + /// + public static void GetPlayerTags(GetPlayerTagsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/GetPlayerTags", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets the requested policy. + /// + public static void GetPolicy(GetPolicyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/GetPolicy", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the key-value store of custom publisher settings + /// + public static void GetPublisherData(GetPublisherDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/GetPublisherData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Retrieves the random drop table configuration for the title + /// + public static void GetRandomResultTables(GetRandomResultTablesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/GetRandomResultTables", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the result of an export started by ExportPlayersInSegment API. If the ExportPlayersInSegment is successful and + /// complete, this API returns the IndexUrl from which the index file can be downloaded. The index file has a list of urls + /// from which the files containing the player profile data can be downloaded. Otherwise, it returns the current 'State' of + /// the export + /// + public static void GetSegmentExport(GetPlayersInSegmentExportRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/GetSegmentExport", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Get detail information of a segment and its associated definition(s) and action(s) for a title. + /// + public static void GetSegments(GetSegmentsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/GetSegments", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Retrieves the set of items defined for the specified store, including all prices defined + /// + public static void GetStoreItems(GetStoreItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/GetStoreItems", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Query for task instances by task, status, or time range. + /// + public static void GetTaskInstances(GetTaskInstancesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/GetTaskInstances", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Get definition information on a specified task or all tasks within a title. + /// + public static void GetTasks(GetTasksRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/GetTasks", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the key-value store of custom title settings which can be read by the client + /// + public static void GetTitleData(GetTitleDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/GetTitleData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the key-value store of custom title settings which cannot be read by the client + /// + public static void GetTitleInternalData(GetTitleDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/GetTitleInternalData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the relevant details for a specified user, based upon a match against a supplied unique identifier + /// + public static void GetUserAccountInfo(LookupUserAccountInfoRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/GetUserAccountInfo", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets all bans for a user. + /// + public static void GetUserBans(GetUserBansRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/GetUserBans", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the title-specific custom data for the user which is readable and writable by the client + /// + public static void GetUserData(GetUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/GetUserData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the title-specific custom data for the user which cannot be accessed by the client + /// + public static void GetUserInternalData(GetUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/GetUserInternalData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Retrieves the specified user's current inventory of virtual goods + /// + public static void GetUserInventory(GetUserInventoryRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/GetUserInventory", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the publisher-specific custom data for the user which is readable and writable by the client + /// + public static void GetUserPublisherData(GetUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/GetUserPublisherData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the publisher-specific custom data for the user which cannot be accessed by the client + /// + public static void GetUserPublisherInternalData(GetUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/GetUserPublisherInternalData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the publisher-specific custom data for the user which can only be read by the client + /// + public static void GetUserPublisherReadOnlyData(GetUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/GetUserPublisherReadOnlyData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the title-specific custom data for the user which can only be read by the client + /// + public static void GetUserReadOnlyData(GetUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/GetUserReadOnlyData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Adds the specified items to the specified user inventories + /// + public static void GrantItemsToUsers(GrantItemsToUsersRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/GrantItemsToUsers", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Increases the global count for the given scarce resource. + /// + public static void IncrementLimitedEditionItemAvailability(IncrementLimitedEditionItemAvailabilityRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/IncrementLimitedEditionItemAvailability", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Resets the indicated statistic, removing all player entries for it and backing up the old values. + /// + public static void IncrementPlayerStatisticVersion(IncrementPlayerStatisticVersionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/IncrementPlayerStatisticVersion", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves a list of all Open ID Connect providers registered to a title. + /// + public static void ListOpenIdConnection(ListOpenIdConnectionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/ListOpenIdConnection", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Retuns the list of all defined virtual currencies for the title + /// + public static void ListVirtualCurrencyTypes(ListVirtualCurrencyTypesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/ListVirtualCurrencyTypes", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Attempts to process an order refund through the original real money payment provider. + /// + public static void RefundPurchase(RefundPurchaseRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/RefundPurchase", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Remove a given tag from a player profile. The tag's namespace is automatically generated based on the source of the tag. + /// + public static void RemovePlayerTag(RemovePlayerTagRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/RemovePlayerTag", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Removes one or more virtual currencies from the set defined for the title. + /// + public static void RemoveVirtualCurrencyTypes(RemoveVirtualCurrencyTypesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/RemoveVirtualCurrencyTypes", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Completely removes all statistics for the specified character, for the current game + /// + public static void ResetCharacterStatistics(ResetCharacterStatisticsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/ResetCharacterStatistics", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Reset a player's password for a given title. + /// + public static void ResetPassword(ResetPasswordRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/ResetPassword", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Completely removes all statistics for the specified user, for the current game + /// + public static void ResetUserStatistics(ResetUserStatisticsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/ResetUserStatistics", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Attempts to resolve a dispute with the original order's payment provider. + /// + public static void ResolvePurchaseDispute(ResolvePurchaseDisputeRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/ResolvePurchaseDispute", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Revoke all active bans for a user. + /// + public static void RevokeAllBansForUser(RevokeAllBansForUserRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/RevokeAllBansForUser", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Revoke all active bans specified with BanId. + /// + public static void RevokeBans(RevokeBansRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/RevokeBans", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Revokes access to an item in a user's inventory + /// + public static void RevokeInventoryItem(RevokeInventoryItemRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/RevokeInventoryItem", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Revokes access for up to 25 items across multiple users and characters. + /// + public static void RevokeInventoryItems(RevokeInventoryItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/RevokeInventoryItems", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Run a task immediately regardless of its schedule. + /// + public static void RunTask(RunTaskRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/RunTask", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Forces an email to be sent to the registered email address for the user's account, with a link allowing the user to + /// change the password.If an account recovery email template ID is provided, an email using the custom email template will + /// be used. + /// + public static void SendAccountRecoveryEmail(SendAccountRecoveryEmailRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/SendAccountRecoveryEmail", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Creates the catalog configuration of all virtual goods for the specified catalog version + /// + public static void SetCatalogItems(UpdateCatalogItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/SetCatalogItems", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Sets the override expiration for a membership subscription + /// + public static void SetMembershipOverride(SetMembershipOverrideRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/SetMembershipOverride", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Sets or resets the player's secret. Player secrets are used to sign API requests. + /// + public static void SetPlayerSecret(SetPlayerSecretRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/SetPlayerSecret", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Sets the currently published revision of a title Cloud Script + /// + public static void SetPublishedRevision(SetPublishedRevisionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/SetPublishedRevision", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates the key-value store of custom publisher settings + /// + public static void SetPublisherData(SetPublisherDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/SetPublisherData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Sets all the items in one virtual store + /// + public static void SetStoreItems(UpdateStoreItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/SetStoreItems", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Creates and updates the key-value store of custom title settings which can be read by the client. For example, a + /// developer could choose to store values which modify the user experience, such as enemy spawn rates, weapon strengths, + /// movement speeds, etc. This allows a developer to update the title without the need to create, test, and ship a new + /// build. + /// + public static void SetTitleData(SetTitleDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/SetTitleData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Set and delete key-value pairs in a title data override instance. + /// + public static void SetTitleDataAndOverrides(SetTitleDataAndOverridesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/SetTitleDataAndOverrides", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates the key-value store of custom title settings which cannot be read by the client. These values can be used to + /// tweak settings used by game servers and Cloud Scripts without the need to update and re-deploy. + /// + public static void SetTitleInternalData(SetTitleDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/SetTitleInternalData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Sets the Amazon Resource Name (ARN) for iOS and Android push notifications. Documentation on the exact restrictions can + /// be found at: http://docs.aws.amazon.com/sns/latest/api/API_CreatePlatformApplication.html. Currently, Amazon device + /// Messaging is not supported. + /// + public static void SetupPushNotification(SetupPushNotificationRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/SetupPushNotification", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Decrements the specified virtual currency by the stated amount + /// + public static void SubtractUserVirtualCurrency(SubtractUserVirtualCurrencyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/SubtractUserVirtualCurrency", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates information of a list of existing bans specified with Ban Ids. + /// + public static void UpdateBans(UpdateBansRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/UpdateBans", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Updates the catalog configuration for virtual goods in the specified catalog version + /// + public static void UpdateCatalogItems(UpdateCatalogItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/UpdateCatalogItems", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Creates a new Cloud Script revision and uploads source code to it. Note that at this time, only one file should be + /// submitted in the revision. + /// + public static void UpdateCloudScript(UpdateCloudScriptRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/UpdateCloudScript", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Modifies data and credentials for an existing relationship between a title and an Open ID Connect provider + /// + public static void UpdateOpenIdConnection(UpdateOpenIdConnectionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/UpdateOpenIdConnection", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates a existing Player Shared Secret Key. It may take up to 5 minutes for this update to become generally available + /// after this API returns. + /// + public static void UpdatePlayerSharedSecret(UpdatePlayerSharedSecretRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/UpdatePlayerSharedSecret", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates a player statistic configuration for the title, optionally allowing the developer to specify a reset interval. + /// + public static void UpdatePlayerStatisticDefinition(UpdatePlayerStatisticDefinitionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/UpdatePlayerStatisticDefinition", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Changes a policy for a title + /// + public static void UpdatePolicy(UpdatePolicyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/UpdatePolicy", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Updates the random drop table configuration for the title + /// + public static void UpdateRandomResultTables(UpdateRandomResultTablesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/UpdateRandomResultTables", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates an existing player segment and its associated definition(s) and action(s) for a title. + /// + public static void UpdateSegment(UpdateSegmentRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/UpdateSegment", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Updates an existing virtual item store with new or modified items + /// + public static void UpdateStoreItems(UpdateStoreItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/UpdateStoreItems", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Update an existing task. + /// + public static void UpdateTask(UpdateTaskRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/UpdateTask", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates the title-specific custom data for the user which is readable and writable by the client + /// + public static void UpdateUserData(UpdateUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/UpdateUserData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates the title-specific custom data for the user which cannot be accessed by the client + /// + public static void UpdateUserInternalData(UpdateUserInternalDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/UpdateUserInternalData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates the publisher-specific custom data for the user which is readable and writable by the client + /// + public static void UpdateUserPublisherData(UpdateUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/UpdateUserPublisherData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates the publisher-specific custom data for the user which cannot be accessed by the client + /// + public static void UpdateUserPublisherInternalData(UpdateUserInternalDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/UpdateUserPublisherInternalData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates the publisher-specific custom data for the user which can only be read by the client + /// + public static void UpdateUserPublisherReadOnlyData(UpdateUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/UpdateUserPublisherReadOnlyData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates the title-specific custom data for the user which can only be read by the client + /// + public static void UpdateUserReadOnlyData(UpdateUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/UpdateUserReadOnlyData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates the title specific display name for a user + /// + public static void UpdateUserTitleDisplayName(UpdateUserTitleDisplayNameRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/UpdateUserTitleDisplayName", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + + } +} + +#endif diff --git a/Assets/PlayFabSDK/Admin/PlayFabAdminAPI.cs.meta b/Assets/PlayFabSDK/Admin/PlayFabAdminAPI.cs.meta new file mode 100644 index 00000000..ec37b6e1 --- /dev/null +++ b/Assets/PlayFabSDK/Admin/PlayFabAdminAPI.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 98aa7d0b4d53fe24392fc8cc52120845 +timeCreated: 1468524876 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Admin/PlayFabAdminInstanceAPI.cs b/Assets/PlayFabSDK/Admin/PlayFabAdminInstanceAPI.cs new file mode 100644 index 00000000..c793da38 --- /dev/null +++ b/Assets/PlayFabSDK/Admin/PlayFabAdminInstanceAPI.cs @@ -0,0 +1,1346 @@ +#if ENABLE_PLAYFABADMIN_API + +using System; +using System.Collections.Generic; +using PlayFab.AdminModels; +using PlayFab.Internal; +using PlayFab.SharedModels; + +namespace PlayFab +{ + /// + /// APIs for managing title configurations, uploaded Game Server code executables, and user data + /// + public class PlayFabAdminInstanceAPI : IPlayFabInstanceApi + { + public readonly PlayFabApiSettings apiSettings = null; + public readonly PlayFabAuthenticationContext authenticationContext = null; + + public PlayFabAdminInstanceAPI() { } + + public PlayFabAdminInstanceAPI(PlayFabApiSettings settings) + { + apiSettings = settings; + } + + public PlayFabAdminInstanceAPI(PlayFabAuthenticationContext context) + { + authenticationContext = context; + } + + public PlayFabAdminInstanceAPI(PlayFabApiSettings settings, PlayFabAuthenticationContext context) + { + apiSettings = settings; + authenticationContext = context; + } + + /// + /// Clear the Client SessionToken which allows this Client to call API calls requiring login. + /// A new/fresh login will be required after calling this. + /// + public void ForgetAllCredentials() + { + if (authenticationContext != null) + { + authenticationContext.ForgetAllCredentials(); + } + } + + /// + /// Abort an ongoing task instance. + /// + public void AbortTaskInstance(AbortTaskInstanceRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/AbortTaskInstance", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Update news item to include localized version + /// + public void AddLocalizedNews(AddLocalizedNewsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/AddLocalizedNews", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Adds a new news item to the title's news feed + /// + public void AddNews(AddNewsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/AddNews", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Adds a given tag to a player profile. The tag's namespace is automatically generated based on the source of the tag. + /// + public void AddPlayerTag(AddPlayerTagRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/AddPlayerTag", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Increments the specified virtual currency by the stated amount + /// + public void AddUserVirtualCurrency(AddUserVirtualCurrencyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/AddUserVirtualCurrency", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Adds one or more virtual currencies to the set defined for the title. Virtual Currencies have a maximum + /// value of 2,147,483,647 when granted to a player. Any value over that will be discarded. + /// + public void AddVirtualCurrencyTypes(AddVirtualCurrencyTypesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/AddVirtualCurrencyTypes", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Bans users by PlayFab ID with optional IP address, or MAC address for the provided game. + /// + public void BanUsers(BanUsersRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/BanUsers", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Checks the global count for the limited edition item. + /// + public void CheckLimitedEditionItemAvailability(CheckLimitedEditionItemAvailabilityRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/CheckLimitedEditionItemAvailability", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Create an ActionsOnPlayersInSegment task, which iterates through all players in a segment to execute action. + /// + public void CreateActionsOnPlayersInSegmentTask(CreateActionsOnPlayerSegmentTaskRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/CreateActionsOnPlayersInSegmentTask", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Create a CloudScript task, which can run a CloudScript on a schedule. + /// + public void CreateCloudScriptTask(CreateCloudScriptTaskRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/CreateCloudScriptTask", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Create a Insights Scheduled Scaling task, which can scale Insights Performance Units on a schedule + /// + public void CreateInsightsScheduledScalingTask(CreateInsightsScheduledScalingTaskRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/CreateInsightsScheduledScalingTask", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Registers a relationship between a title and an Open ID Connect provider. + /// + public void CreateOpenIdConnection(CreateOpenIdConnectionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/CreateOpenIdConnection", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Creates a new Player Shared Secret Key. It may take up to 5 minutes for this key to become generally available after + /// this API returns. + /// + public void CreatePlayerSharedSecret(CreatePlayerSharedSecretRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/CreatePlayerSharedSecret", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Adds a new player statistic configuration to the title, optionally allowing the developer to specify a reset interval + /// and an aggregation method. + /// + public void CreatePlayerStatisticDefinition(CreatePlayerStatisticDefinitionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/CreatePlayerStatisticDefinition", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Creates a new player segment by defining the conditions on player properties. Also, create actions to target the player + /// segments for a title. + /// + public void CreateSegment(CreateSegmentRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/CreateSegment", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Delete a content file from the title. When deleting a file that does not exist, it returns success. + /// + public void DeleteContent(DeleteContentRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/DeleteContent", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Removes a master player account entirely from all titles and deletes all associated data + /// + public void DeleteMasterPlayerAccount(DeleteMasterPlayerAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/DeleteMasterPlayerAccount", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Deletes PlayStream and telemetry event data associated with the master player account from PlayFab storage + /// + public void DeleteMasterPlayerEventData(DeleteMasterPlayerEventDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/DeleteMasterPlayerEventData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Deletes a player's subscription + /// + public void DeleteMembershipSubscription(DeleteMembershipSubscriptionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/DeleteMembershipSubscription", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Removes a relationship between a title and an OpenID Connect provider. + /// + public void DeleteOpenIdConnection(DeleteOpenIdConnectionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/DeleteOpenIdConnection", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Removes a user's player account from a title and deletes all associated data + /// + public void DeletePlayer(DeletePlayerRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/DeletePlayer", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Deletes an existing Player Shared Secret Key. It may take up to 5 minutes for this delete to be reflected after this API + /// returns. + /// + public void DeletePlayerSharedSecret(DeletePlayerSharedSecretRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/DeletePlayerSharedSecret", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Deletes an existing player segment and its associated action(s) for a title. + /// + public void DeleteSegment(DeleteSegmentRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/DeleteSegment", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Deletes an existing virtual item store + /// + public void DeleteStore(DeleteStoreRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/DeleteStore", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Delete a task. + /// + public void DeleteTask(DeleteTaskRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/DeleteTask", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Permanently deletes a title and all associated configuration + /// + public void DeleteTitle(DeleteTitleRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/DeleteTitle", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Deletes a specified set of title data overrides. + /// + public void DeleteTitleDataOverride(DeleteTitleDataOverrideRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/DeleteTitleDataOverride", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Exports all associated data of a master player account + /// + public void ExportMasterPlayerData(ExportMasterPlayerDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/ExportMasterPlayerData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Starts an export for the player profiles in a segment. This API creates a snapshot of all the player profiles which + /// match the segment definition at the time of the API call. Profiles which change while an export is in progress will not + /// be reflected in the results. + /// + public void ExportPlayersInSegment(ExportPlayersInSegmentRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/ExportPlayersInSegment", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Get information about a ActionsOnPlayersInSegment task instance. + /// + public void GetActionsOnPlayersInSegmentTaskInstance(GetTaskInstanceRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/GetActionsOnPlayersInSegmentTaskInstance", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves an array of player segment definitions. Results from this can be used in subsequent API calls such as + /// GetPlayersInSegment which requires a Segment ID. While segment names can change the ID for that segment will not change. + /// + public void GetAllSegments(GetAllSegmentsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/GetAllSegments", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Retrieves the specified version of the title's catalog of virtual goods, including all defined properties + /// + public void GetCatalogItems(GetCatalogItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/GetCatalogItems", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets the contents and information of a specific Cloud Script revision. + /// + public void GetCloudScriptRevision(GetCloudScriptRevisionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/GetCloudScriptRevision", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Get detail information about a CloudScript task instance. + /// + public void GetCloudScriptTaskInstance(GetTaskInstanceRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/GetCloudScriptTaskInstance", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Lists all the current cloud script versions. For each version, information about the current published and latest + /// revisions is also listed. + /// + public void GetCloudScriptVersions(GetCloudScriptVersionsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/GetCloudScriptVersions", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// List all contents of the title and get statistics such as size + /// + public void GetContentList(GetContentListRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/GetContentList", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the pre-signed URL for uploading a content file. A subsequent HTTP PUT to the returned URL uploads the + /// content. Also, please be aware that the Content service is specifically PlayFab's CDN offering, for which standard CDN + /// rates apply. + /// + public void GetContentUploadUrl(GetContentUploadUrlRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/GetContentUploadUrl", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves a download URL for the requested report + /// + public void GetDataReport(GetDataReportRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/GetDataReport", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Get the list of titles that the player has played + /// + public void GetPlayedTitleList(GetPlayedTitleListRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/GetPlayedTitleList", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets a player's ID from an auth token. + /// + public void GetPlayerIdFromAuthToken(GetPlayerIdFromAuthTokenRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/GetPlayerIdFromAuthToken", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the player's profile + /// + public void GetPlayerProfile(GetPlayerProfileRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/GetPlayerProfile", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// List all segments that a player currently belongs to at this moment in time. + /// + public void GetPlayerSegments(GetPlayersSegmentsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/GetPlayerSegments", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Returns all Player Shared Secret Keys including disabled and expired. + /// + public void GetPlayerSharedSecrets(GetPlayerSharedSecretsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/GetPlayerSharedSecrets", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Allows for paging through all players in a given segment. This API creates a snapshot of all player profiles that match + /// the segment definition at the time of its creation and lives through the Total Seconds to Live, refreshing its life span + /// on each subsequent use of the Continuation Token. Profiles that change during the course of paging will not be reflected + /// in the results. AB Test segments are currently not supported by this operation. NOTE: This API is limited to being + /// called 30 times in one minute. You will be returned an error if you exceed this threshold. + /// + public void GetPlayersInSegment(GetPlayersInSegmentRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/GetPlayersInSegment", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the configuration information for all player statistics defined in the title, regardless of whether they have + /// a reset interval. + /// + public void GetPlayerStatisticDefinitions(GetPlayerStatisticDefinitionsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/GetPlayerStatisticDefinitions", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the information on the available versions of the specified statistic. + /// + public void GetPlayerStatisticVersions(GetPlayerStatisticVersionsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/GetPlayerStatisticVersions", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Get all tags with a given Namespace (optional) from a player profile. + /// + public void GetPlayerTags(GetPlayerTagsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/GetPlayerTags", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets the requested policy. + /// + public void GetPolicy(GetPolicyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/GetPolicy", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the key-value store of custom publisher settings + /// + public void GetPublisherData(GetPublisherDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/GetPublisherData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Retrieves the random drop table configuration for the title + /// + public void GetRandomResultTables(GetRandomResultTablesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/GetRandomResultTables", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the result of an export started by ExportPlayersInSegment API. If the ExportPlayersInSegment is successful and + /// complete, this API returns the IndexUrl from which the index file can be downloaded. The index file has a list of urls + /// from which the files containing the player profile data can be downloaded. Otherwise, it returns the current 'State' of + /// the export + /// + public void GetSegmentExport(GetPlayersInSegmentExportRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/GetSegmentExport", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Get detail information of a segment and its associated definition(s) and action(s) for a title. + /// + public void GetSegments(GetSegmentsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/GetSegments", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Retrieves the set of items defined for the specified store, including all prices defined + /// + public void GetStoreItems(GetStoreItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/GetStoreItems", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Query for task instances by task, status, or time range. + /// + public void GetTaskInstances(GetTaskInstancesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/GetTaskInstances", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Get definition information on a specified task or all tasks within a title. + /// + public void GetTasks(GetTasksRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/GetTasks", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the key-value store of custom title settings which can be read by the client + /// + public void GetTitleData(GetTitleDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/GetTitleData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the key-value store of custom title settings which cannot be read by the client + /// + public void GetTitleInternalData(GetTitleDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/GetTitleInternalData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the relevant details for a specified user, based upon a match against a supplied unique identifier + /// + public void GetUserAccountInfo(LookupUserAccountInfoRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/GetUserAccountInfo", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets all bans for a user. + /// + public void GetUserBans(GetUserBansRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/GetUserBans", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the title-specific custom data for the user which is readable and writable by the client + /// + public void GetUserData(GetUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/GetUserData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the title-specific custom data for the user which cannot be accessed by the client + /// + public void GetUserInternalData(GetUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/GetUserInternalData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Retrieves the specified user's current inventory of virtual goods + /// + public void GetUserInventory(GetUserInventoryRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/GetUserInventory", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the publisher-specific custom data for the user which is readable and writable by the client + /// + public void GetUserPublisherData(GetUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/GetUserPublisherData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the publisher-specific custom data for the user which cannot be accessed by the client + /// + public void GetUserPublisherInternalData(GetUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/GetUserPublisherInternalData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the publisher-specific custom data for the user which can only be read by the client + /// + public void GetUserPublisherReadOnlyData(GetUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/GetUserPublisherReadOnlyData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the title-specific custom data for the user which can only be read by the client + /// + public void GetUserReadOnlyData(GetUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/GetUserReadOnlyData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Adds the specified items to the specified user inventories + /// + public void GrantItemsToUsers(GrantItemsToUsersRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/GrantItemsToUsers", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Increases the global count for the given scarce resource. + /// + public void IncrementLimitedEditionItemAvailability(IncrementLimitedEditionItemAvailabilityRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/IncrementLimitedEditionItemAvailability", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Resets the indicated statistic, removing all player entries for it and backing up the old values. + /// + public void IncrementPlayerStatisticVersion(IncrementPlayerStatisticVersionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/IncrementPlayerStatisticVersion", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves a list of all Open ID Connect providers registered to a title. + /// + public void ListOpenIdConnection(ListOpenIdConnectionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/ListOpenIdConnection", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Retuns the list of all defined virtual currencies for the title + /// + public void ListVirtualCurrencyTypes(ListVirtualCurrencyTypesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/ListVirtualCurrencyTypes", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Attempts to process an order refund through the original real money payment provider. + /// + public void RefundPurchase(RefundPurchaseRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/RefundPurchase", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Remove a given tag from a player profile. The tag's namespace is automatically generated based on the source of the tag. + /// + public void RemovePlayerTag(RemovePlayerTagRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/RemovePlayerTag", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Removes one or more virtual currencies from the set defined for the title. + /// + public void RemoveVirtualCurrencyTypes(RemoveVirtualCurrencyTypesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/RemoveVirtualCurrencyTypes", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Completely removes all statistics for the specified character, for the current game + /// + public void ResetCharacterStatistics(ResetCharacterStatisticsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/ResetCharacterStatistics", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Reset a player's password for a given title. + /// + public void ResetPassword(ResetPasswordRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/ResetPassword", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Completely removes all statistics for the specified user, for the current game + /// + public void ResetUserStatistics(ResetUserStatisticsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/ResetUserStatistics", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Attempts to resolve a dispute with the original order's payment provider. + /// + public void ResolvePurchaseDispute(ResolvePurchaseDisputeRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/ResolvePurchaseDispute", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Revoke all active bans for a user. + /// + public void RevokeAllBansForUser(RevokeAllBansForUserRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/RevokeAllBansForUser", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Revoke all active bans specified with BanId. + /// + public void RevokeBans(RevokeBansRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/RevokeBans", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Revokes access to an item in a user's inventory + /// + public void RevokeInventoryItem(RevokeInventoryItemRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/RevokeInventoryItem", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Revokes access for up to 25 items across multiple users and characters. + /// + public void RevokeInventoryItems(RevokeInventoryItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/RevokeInventoryItems", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Run a task immediately regardless of its schedule. + /// + public void RunTask(RunTaskRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/RunTask", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Forces an email to be sent to the registered email address for the user's account, with a link allowing the user to + /// change the password.If an account recovery email template ID is provided, an email using the custom email template will + /// be used. + /// + public void SendAccountRecoveryEmail(SendAccountRecoveryEmailRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/SendAccountRecoveryEmail", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Creates the catalog configuration of all virtual goods for the specified catalog version + /// + public void SetCatalogItems(UpdateCatalogItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/SetCatalogItems", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Sets the override expiration for a membership subscription + /// + public void SetMembershipOverride(SetMembershipOverrideRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/SetMembershipOverride", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Sets or resets the player's secret. Player secrets are used to sign API requests. + /// + public void SetPlayerSecret(SetPlayerSecretRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/SetPlayerSecret", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Sets the currently published revision of a title Cloud Script + /// + public void SetPublishedRevision(SetPublishedRevisionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/SetPublishedRevision", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates the key-value store of custom publisher settings + /// + public void SetPublisherData(SetPublisherDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/SetPublisherData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Sets all the items in one virtual store + /// + public void SetStoreItems(UpdateStoreItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/SetStoreItems", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Creates and updates the key-value store of custom title settings which can be read by the client. For example, a + /// developer could choose to store values which modify the user experience, such as enemy spawn rates, weapon strengths, + /// movement speeds, etc. This allows a developer to update the title without the need to create, test, and ship a new + /// build. + /// + public void SetTitleData(SetTitleDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/SetTitleData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Set and delete key-value pairs in a title data override instance. + /// + public void SetTitleDataAndOverrides(SetTitleDataAndOverridesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/SetTitleDataAndOverrides", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates the key-value store of custom title settings which cannot be read by the client. These values can be used to + /// tweak settings used by game servers and Cloud Scripts without the need to update and re-deploy. + /// + public void SetTitleInternalData(SetTitleDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/SetTitleInternalData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Sets the Amazon Resource Name (ARN) for iOS and Android push notifications. Documentation on the exact restrictions can + /// be found at: http://docs.aws.amazon.com/sns/latest/api/API_CreatePlatformApplication.html. Currently, Amazon device + /// Messaging is not supported. + /// + public void SetupPushNotification(SetupPushNotificationRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/SetupPushNotification", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Decrements the specified virtual currency by the stated amount + /// + public void SubtractUserVirtualCurrency(SubtractUserVirtualCurrencyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/SubtractUserVirtualCurrency", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates information of a list of existing bans specified with Ban Ids. + /// + public void UpdateBans(UpdateBansRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/UpdateBans", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Updates the catalog configuration for virtual goods in the specified catalog version + /// + public void UpdateCatalogItems(UpdateCatalogItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/UpdateCatalogItems", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Creates a new Cloud Script revision and uploads source code to it. Note that at this time, only one file should be + /// submitted in the revision. + /// + public void UpdateCloudScript(UpdateCloudScriptRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/UpdateCloudScript", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Modifies data and credentials for an existing relationship between a title and an Open ID Connect provider + /// + public void UpdateOpenIdConnection(UpdateOpenIdConnectionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/UpdateOpenIdConnection", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates a existing Player Shared Secret Key. It may take up to 5 minutes for this update to become generally available + /// after this API returns. + /// + public void UpdatePlayerSharedSecret(UpdatePlayerSharedSecretRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/UpdatePlayerSharedSecret", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates a player statistic configuration for the title, optionally allowing the developer to specify a reset interval. + /// + public void UpdatePlayerStatisticDefinition(UpdatePlayerStatisticDefinitionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/UpdatePlayerStatisticDefinition", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Changes a policy for a title + /// + public void UpdatePolicy(UpdatePolicyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/UpdatePolicy", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Updates the random drop table configuration for the title + /// + public void UpdateRandomResultTables(UpdateRandomResultTablesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/UpdateRandomResultTables", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates an existing player segment and its associated definition(s) and action(s) for a title. + /// + public void UpdateSegment(UpdateSegmentRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/UpdateSegment", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Updates an existing virtual item store with new or modified items + /// + public void UpdateStoreItems(UpdateStoreItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/UpdateStoreItems", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Update an existing task. + /// + public void UpdateTask(UpdateTaskRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/UpdateTask", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates the title-specific custom data for the user which is readable and writable by the client + /// + public void UpdateUserData(UpdateUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/UpdateUserData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates the title-specific custom data for the user which cannot be accessed by the client + /// + public void UpdateUserInternalData(UpdateUserInternalDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/UpdateUserInternalData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates the publisher-specific custom data for the user which is readable and writable by the client + /// + public void UpdateUserPublisherData(UpdateUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/UpdateUserPublisherData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates the publisher-specific custom data for the user which cannot be accessed by the client + /// + public void UpdateUserPublisherInternalData(UpdateUserInternalDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/UpdateUserPublisherInternalData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates the publisher-specific custom data for the user which can only be read by the client + /// + public void UpdateUserPublisherReadOnlyData(UpdateUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/UpdateUserPublisherReadOnlyData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates the title-specific custom data for the user which can only be read by the client + /// + public void UpdateUserReadOnlyData(UpdateUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/UpdateUserReadOnlyData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates the title specific display name for a user + /// + public void UpdateUserTitleDisplayName(UpdateUserTitleDisplayNameRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/UpdateUserTitleDisplayName", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + } +} + +#endif diff --git a/Assets/PlayFabSDK/Admin/PlayFabAdminInstanceAPI.cs.meta b/Assets/PlayFabSDK/Admin/PlayFabAdminInstanceAPI.cs.meta new file mode 100644 index 00000000..dfaa93b4 --- /dev/null +++ b/Assets/PlayFabSDK/Admin/PlayFabAdminInstanceAPI.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 942c3c5d808dfed49b4c4369cc282d49 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Admin/PlayFabAdminModels.cs b/Assets/PlayFabSDK/Admin/PlayFabAdminModels.cs new file mode 100644 index 00000000..5befa540 --- /dev/null +++ b/Assets/PlayFabSDK/Admin/PlayFabAdminModels.cs @@ -0,0 +1,7799 @@ +#if ENABLE_PLAYFABADMIN_API +using System; +using System.Collections.Generic; +using PlayFab.SharedModels; + +namespace PlayFab.AdminModels +{ + /// + /// If the task instance has already completed, there will be no-op. + /// + [Serializable] + public class AbortTaskInstanceRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// ID of a task instance that is being aborted. + /// + public string TaskInstanceId; + } + + /// + /// The work to be performed on each entity which can only be of one type. + /// + [Serializable] + public class Action : PlayFabBaseModel + { + /// + /// Action content to add inventory item v2 + /// + public AddInventoryItemV2Content AddInventoryItemV2Content; + /// + /// Action content to ban player + /// + public BanPlayerContent BanPlayerContent; + /// + /// Action content to delete inventory item v2 + /// + public DeleteInventoryItemV2Content DeleteInventoryItemV2Content; + /// + /// Action content to delete player + /// + public DeletePlayerContent DeletePlayerContent; + /// + /// Action content to execute cloud script + /// + public ExecuteCloudScriptContent ExecuteCloudScriptContent; + /// + /// Action content to execute azure function + /// + public ExecuteFunctionContent ExecuteFunctionContent; + /// + /// Action content to grant item + /// + public GrantItemContent GrantItemContent; + /// + /// Action content to grant virtual currency + /// + public GrantVirtualCurrencyContent GrantVirtualCurrencyContent; + /// + /// Action content to increment player statistic + /// + public IncrementPlayerStatisticContent IncrementPlayerStatisticContent; + /// + /// Action content to send push notification + /// + public PushNotificationContent PushNotificationContent; + /// + /// Action content to send email + /// + public SendEmailContent SendEmailContent; + /// + /// Action content to subtract inventory item v2 + /// + public SubtractInventoryItemV2Content SubtractInventoryItemV2Content; + } + + [Serializable] + public class ActionsOnPlayersInSegmentTaskParameter : PlayFabBaseModel + { + /// + /// List of actions to perform on each player in a segment. Each action object can contain only one action type. + /// + public List Actions; + /// + /// ID of the segment to perform actions on. + /// + public string SegmentId; + } + + [Serializable] + public class ActionsOnPlayersInSegmentTaskSummary : PlayFabBaseModel + { + /// + /// UTC timestamp when the task completed. + /// + public DateTime? CompletedAt; + /// + /// Error message for last processing attempt, if an error occured. + /// + public string ErrorMessage; + /// + /// Flag indicating if the error was fatal, if false job will be retried. + /// + public bool? ErrorWasFatal; + /// + /// Estimated time remaining in seconds. + /// + public double? EstimatedSecondsRemaining; + /// + /// Progress represented as percentage. + /// + public double? PercentComplete; + /// + /// If manually scheduled, ID of user who scheduled the task. + /// + public string ScheduledByUserId; + /// + /// UTC timestamp when the task started. + /// + public DateTime StartedAt; + /// + /// Current status of the task instance. + /// + public TaskInstanceStatus? Status; + /// + /// Identifier of the task this instance belongs to. + /// + public NameIdentifier TaskIdentifier; + /// + /// ID of the task instance. + /// + public string TaskInstanceId; + /// + /// Total players in segment when task was started. + /// + public int? TotalPlayersInSegment; + /// + /// Total number of players that have had the actions applied to. + /// + public int? TotalPlayersProcessed; + } + + [Serializable] + public class AdCampaignAttribution : PlayFabBaseModel + { + /// + /// UTC time stamp of attribution + /// + public DateTime AttributedAt; + /// + /// Attribution campaign identifier + /// + public string CampaignId; + /// + /// Attribution network name + /// + public string Platform; + } + + [Serializable] + public class AdCampaignAttributionModel : PlayFabBaseModel + { + /// + /// UTC time stamp of attribution + /// + public DateTime AttributedAt; + /// + /// Attribution campaign identifier + /// + public string CampaignId; + /// + /// Attribution network name + /// + public string Platform; + } + + [Serializable] + public class AdCampaignSegmentFilter : PlayFabBaseModel + { + /// + /// Campaign id. + /// + public string CampaignId; + /// + /// Campaign source. + /// + public string CampaignSource; + /// + /// Campaign comparison. + /// + public SegmentFilterComparison? Comparison; + } + + [Serializable] + public class AddInventoryItemsV2SegmentAction : PlayFabBaseModel + { + /// + /// Amount of the item to be granted to a player + /// + public int? Amount; + /// + /// The collection id for where the item will be granted in the player inventory + /// + public string CollectionId; + /// + /// The duration in seconds of the subscription to be granted to a player + /// + public int? DurationInSeconds; + /// + /// The id of item to be granted to the player + /// + public string ItemId; + /// + /// The stack id for where the item will be granted in the player inventory + /// + public string StackId; + } + + [Serializable] + public class AddInventoryItemV2Content : PlayFabBaseModel + { + /// + /// Amount of the item to be granted to a player + /// + public int? Amount; + /// + /// The collection id for where the item will be granted in the player inventory + /// + public string CollectionId; + /// + /// The duration in seconds of the subscription to be granted to a player + /// + public int? DurationInSeconds; + /// + /// The id of item to be granted to the player + /// + public string ItemId; + /// + /// The stack id for where the item will be granted in the player inventory + /// + public string StackId; + } + + [Serializable] + public class AddLocalizedNewsRequest : PlayFabRequestCommon + { + /// + /// Localized body text of the news. + /// + public string Body; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Language of the news item. + /// + public string Language; + /// + /// Unique id of the updated news item. + /// + public string NewsId; + /// + /// Localized title (headline) of the news item. + /// + public string Title; + } + + [Serializable] + public class AddLocalizedNewsResult : PlayFabResultCommon + { + } + + [Serializable] + public class AddNewsRequest : PlayFabRequestCommon + { + /// + /// Default body text of the news. + /// + public string Body; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Time this news was published. If not set, defaults to now. + /// + public DateTime? Timestamp; + /// + /// Default title (headline) of the news item. + /// + public string Title; + } + + [Serializable] + public class AddNewsResult : PlayFabResultCommon + { + /// + /// Unique id of the new news item + /// + public string NewsId; + } + + /// + /// This API will trigger a player_tag_added event and add a tag with the given TagName and PlayFabID to the corresponding + /// player profile. TagName can be used for segmentation and it is limited to 256 characters. Also there is a limit on the + /// number of tags a title can have. + /// + [Serializable] + public class AddPlayerTagRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + /// + /// Unique tag for player profile. + /// + public string TagName; + } + + [Serializable] + public class AddPlayerTagResult : PlayFabResultCommon + { + } + + [Serializable] + public class AddUserVirtualCurrencyRequest : PlayFabRequestCommon + { + /// + /// Amount to be added to the user balance of the specified virtual currency. Maximum VC balance is Int32 (2,147,483,647). + /// Any increase over this value will be discarded. + /// + public int Amount; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// PlayFab unique identifier of the user whose virtual currency balance is to be increased. + /// + public string PlayFabId; + /// + /// Name of the virtual currency which is to be incremented. + /// + public string VirtualCurrency; + } + + /// + /// This operation is additive. Any new currencies defined in the array will be added to the set of those available for the + /// title, while any CurrencyCode identifiers matching existing ones in the game will be overwritten with the new values. + /// + [Serializable] + public class AddVirtualCurrencyTypesRequest : PlayFabRequestCommon + { + /// + /// List of virtual currencies and their initial deposits (the amount a user is granted when signing in for the first time) + /// to the title + /// + public List VirtualCurrencies; + } + + [Serializable] + public class AllPlayersSegmentFilter : PlayFabBaseModel + { + } + + [Serializable] + public class ApiCondition : PlayFabBaseModel + { + /// + /// Require that API calls contain an RSA encrypted payload or signed headers. + /// + public Conditionals? HasSignatureOrEncryption; + } + + public enum AuthTokenType + { + Email + } + + /// + /// Contains information for a ban. + /// + [Serializable] + public class BanInfo : PlayFabBaseModel + { + /// + /// The active state of this ban. Expired bans may still have this value set to true but they will have no effect. + /// + public bool Active; + /// + /// The unique Ban Id associated with this ban. + /// + public string BanId; + /// + /// The time when this ban was applied. + /// + public DateTime? Created; + /// + /// The time when this ban expires. Permanent bans do not have expiration date. + /// + public DateTime? Expires; + /// + /// The IP address on which the ban was applied. May affect multiple players. + /// + public string IPAddress; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + /// + /// The reason why this ban was applied. + /// + public string Reason; + /// + /// The family type of the suer that is included in the ban. + /// + public string UserFamilyType; + } + + [Serializable] + public class BanPlayerContent : PlayFabBaseModel + { + /// + /// Duration(in hours) to ban a player. If not provided, the player will be banned permanently. + /// + public int? BanDurationHours; + /// + /// Reason to ban a player + /// + public string BanReason; + } + + [Serializable] + public class BanPlayerSegmentAction : PlayFabBaseModel + { + /// + /// Ban hours duration. + /// + public uint? BanHours; + /// + /// Reason for ban. + /// + public string ReasonForBan; + } + + /// + /// Represents a single ban request. + /// + [Serializable] + public class BanRequest : PlayFabBaseModel + { + /// + /// The duration in hours for the ban. Leave this blank for a permanent ban. + /// + public uint? DurationInHours; + /// + /// IP address to be banned. May affect multiple players. + /// + public string IPAddress; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + /// + /// The reason for this ban. Maximum 140 characters. + /// + public string Reason; + /// + /// The family type of the user that should be included in the ban if applicable. May affect multiple players. + /// + public UserFamilyType? UserFamilyType; + } + + /// + /// The existence of each user will not be verified. When banning by IP or MAC address, multiple players may be affected, so + /// use this feature with caution. Returns information about the new bans. + /// + [Serializable] + public class BanUsersRequest : PlayFabRequestCommon + { + /// + /// List of ban requests to be applied. Maximum 100. + /// + public List Bans; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + [Serializable] + public class BanUsersResult : PlayFabResultCommon + { + /// + /// Information on the bans that were applied + /// + public List BanData; + } + + [Serializable] + public class BlankResult : PlayFabResultCommon + { + } + + /// + /// A purchasable item from the item catalog + /// + [Serializable] + public class CatalogItem : PlayFabBaseModel + { + /// + /// defines the bundle properties for the item - bundles are items which contain other items, including random drop tables + /// and virtual currencies + /// + public CatalogItemBundleInfo Bundle; + /// + /// if true, then an item instance of this type can be used to grant a character to a user. + /// + public bool CanBecomeCharacter; + /// + /// catalog version for this item + /// + public string CatalogVersion; + /// + /// defines the consumable properties (number of uses, timeout) for the item + /// + public CatalogItemConsumableInfo Consumable; + /// + /// defines the container properties for the item - what items it contains, including random drop tables and virtual + /// currencies, and what item (if any) is required to open it via the UnlockContainerItem API + /// + public CatalogItemContainerInfo Container; + /// + /// game specific custom data + /// + public string CustomData; + /// + /// text description of item, to show in-game + /// + public string Description; + /// + /// text name for the item, to show in-game + /// + public string DisplayName; + /// + /// If the item has IsLImitedEdition set to true, and this is the first time this ItemId has been defined as a limited + /// edition item, this value determines the total number of instances to allocate for the title. Once this limit has been + /// reached, no more instances of this ItemId can be created, and attempts to purchase or grant it will return a Result of + /// false for that ItemId. If the item has already been defined to have a limited edition count, or if this value is less + /// than zero, it will be ignored. + /// + public int InitialLimitedEditionCount; + /// + /// BETA: If true, then only a fixed number can ever be granted. + /// + public bool IsLimitedEdition; + /// + /// if true, then only one item instance of this type will exist and its remaininguses will be incremented instead. + /// RemainingUses will cap out at Int32.Max (2,147,483,647). All subsequent increases will be discarded + /// + public bool IsStackable; + /// + /// if true, then an item instance of this type can be traded between players using the trading APIs + /// + public bool IsTradable; + /// + /// class to which the item belongs + /// + public string ItemClass; + /// + /// unique identifier for this item + /// + public string ItemId; + /// + /// URL to the item image. For Facebook purchase to display the image on the item purchase page, this must be set to an HTTP + /// URL. + /// + public string ItemImageUrl; + /// + /// override prices for this item for specific currencies + /// + public Dictionary RealCurrencyPrices; + /// + /// list of item tags + /// + public List Tags; + /// + /// price of this item in virtual currencies and "RM" (the base Real Money purchase price, in USD pennies) + /// + public Dictionary VirtualCurrencyPrices; + } + + [Serializable] + public class CatalogItemBundleInfo : PlayFabBaseModel + { + /// + /// unique ItemId values for all items which will be added to the player inventory when the bundle is added + /// + public List BundledItems; + /// + /// unique TableId values for all RandomResultTable objects which are part of the bundle (random tables will be resolved and + /// add the relevant items to the player inventory when the bundle is added) + /// + public List BundledResultTables; + /// + /// virtual currency types and balances which will be added to the player inventory when the bundle is added + /// + public Dictionary BundledVirtualCurrencies; + } + + [Serializable] + public class CatalogItemConsumableInfo : PlayFabBaseModel + { + /// + /// number of times this object can be used, after which it will be removed from the player inventory + /// + public uint? UsageCount; + /// + /// duration in seconds for how long the item will remain in the player inventory - once elapsed, the item will be removed + /// (recommended minimum value is 5 seconds, as lower values can cause the item to expire before operations depending on + /// this item's details have completed) + /// + public uint? UsagePeriod; + /// + /// all inventory item instances in the player inventory sharing a non-null UsagePeriodGroup have their UsagePeriod values + /// added together, and share the result - when that period has elapsed, all the items in the group will be removed + /// + public string UsagePeriodGroup; + } + + /// + /// Containers are inventory items that can hold other items defined in the catalog, as well as virtual currency, which is + /// added to the player inventory when the container is unlocked, using the UnlockContainerItem API. The items can be + /// anything defined in the catalog, as well as RandomResultTable objects which will be resolved when the container is + /// unlocked. Containers and their keys should be defined as Consumable (having a limited number of uses) in their catalog + /// defintiions, unless the intent is for the player to be able to re-use them infinitely. + /// + [Serializable] + public class CatalogItemContainerInfo : PlayFabBaseModel + { + /// + /// unique ItemId values for all items which will be added to the player inventory, once the container has been unlocked + /// + public List ItemContents; + /// + /// ItemId for the catalog item used to unlock the container, if any (if not specified, a call to UnlockContainerItem will + /// open the container, adding the contents to the player inventory and currency balances) + /// + public string KeyItemId; + /// + /// unique TableId values for all RandomResultTable objects which are part of the container (once unlocked, random tables + /// will be resolved and add the relevant items to the player inventory) + /// + public List ResultTableContents; + /// + /// virtual currency types and balances which will be added to the player inventory when the container is unlocked + /// + public Dictionary VirtualCurrencyContents; + } + + /// + /// This returns the total number of these items available. + /// + [Serializable] + public class CheckLimitedEditionItemAvailabilityRequest : PlayFabRequestCommon + { + /// + /// Which catalog is being updated. If null, uses the default catalog. + /// + public string CatalogVersion; + /// + /// The item to check for. + /// + public string ItemId; + } + + [Serializable] + public class CheckLimitedEditionItemAvailabilityResult : PlayFabResultCommon + { + /// + /// The amount of the specified resource remaining. + /// + public int Amount; + } + + [Serializable] + public class ChurnPredictionSegmentFilter : PlayFabBaseModel + { + /// + /// Comparison + /// + public SegmentFilterComparison? Comparison; + /// + /// RiskLevel + /// + public ChurnRiskLevel? RiskLevel; + } + + public enum ChurnRiskLevel + { + NoData, + LowRisk, + MediumRisk, + HighRisk + } + + [Serializable] + public class CloudScriptFile : PlayFabBaseModel + { + /// + /// Contents of the Cloud Script javascript. Must be string-escaped javascript. + /// + public string FileContents; + /// + /// Name of the javascript file. These names are not used internally by the server, they are only for developer + /// organizational purposes. + /// + public string Filename; + } + + [Serializable] + public class CloudScriptTaskParameter : PlayFabBaseModel + { + /// + /// Argument to pass to the CloudScript function. + /// + public object Argument; + /// + /// Name of the CloudScript function to execute. + /// + public string FunctionName; + } + + [Serializable] + public class CloudScriptTaskSummary : PlayFabBaseModel + { + /// + /// UTC timestamp when the task completed. + /// + public DateTime? CompletedAt; + /// + /// Estimated time remaining in seconds. + /// + public double? EstimatedSecondsRemaining; + /// + /// Progress represented as percentage. + /// + public double? PercentComplete; + /// + /// Result of CloudScript execution + /// + public ExecuteCloudScriptResult Result; + /// + /// If manually scheduled, ID of user who scheduled the task. + /// + public string ScheduledByUserId; + /// + /// UTC timestamp when the task started. + /// + public DateTime StartedAt; + /// + /// Current status of the task instance. + /// + public TaskInstanceStatus? Status; + /// + /// Identifier of the task this instance belongs to. + /// + public NameIdentifier TaskIdentifier; + /// + /// ID of the task instance. + /// + public string TaskInstanceId; + } + + [Serializable] + public class CloudScriptVersionStatus : PlayFabBaseModel + { + /// + /// Most recent revision for this Cloud Script version + /// + public int LatestRevision; + /// + /// Published code revision for this Cloud Script version + /// + public int PublishedRevision; + /// + /// Version number + /// + public int Version; + } + + public enum Conditionals + { + Any, + True, + False + } + + [Serializable] + public class ContactEmailInfo : PlayFabBaseModel + { + /// + /// The email address + /// + public string EmailAddress; + /// + /// The name of the email info data + /// + public string Name; + /// + /// The verification status of the email + /// + public EmailVerificationStatus? VerificationStatus; + } + + [Serializable] + public class ContactEmailInfoModel : PlayFabBaseModel + { + /// + /// The email address + /// + public string EmailAddress; + /// + /// The name of the email info data + /// + public string Name; + /// + /// The verification status of the email + /// + public EmailVerificationStatus? VerificationStatus; + } + + [Serializable] + public class ContentInfo : PlayFabBaseModel + { + /// + /// Key of the content + /// + public string Key; + /// + /// Last modified time + /// + public DateTime LastModified; + /// + /// Size of the content in bytes + /// + public double Size; + } + + public enum ContinentCode + { + AF, + AN, + AS, + EU, + NA, + OC, + SA, + Unknown + } + + public enum CountryCode + { + AF, + AX, + AL, + DZ, + AS, + AD, + AO, + AI, + AQ, + AG, + AR, + AM, + AW, + AU, + AT, + AZ, + BS, + BH, + BD, + BB, + BY, + BE, + BZ, + BJ, + BM, + BT, + BO, + BQ, + BA, + BW, + BV, + BR, + IO, + BN, + BG, + BF, + BI, + KH, + CM, + CA, + CV, + KY, + CF, + TD, + CL, + CN, + CX, + CC, + CO, + KM, + CG, + CD, + CK, + CR, + CI, + HR, + CU, + CW, + CY, + CZ, + DK, + DJ, + DM, + DO, + EC, + EG, + SV, + GQ, + ER, + EE, + ET, + FK, + FO, + FJ, + FI, + FR, + GF, + PF, + TF, + GA, + GM, + GE, + DE, + GH, + GI, + GR, + GL, + GD, + GP, + GU, + GT, + GG, + GN, + GW, + GY, + HT, + HM, + VA, + HN, + HK, + HU, + IS, + IN, + ID, + IR, + IQ, + IE, + IM, + IL, + IT, + JM, + JP, + JE, + JO, + KZ, + KE, + KI, + KP, + KR, + KW, + KG, + LA, + LV, + LB, + LS, + LR, + LY, + LI, + LT, + LU, + MO, + MK, + MG, + MW, + MY, + MV, + ML, + MT, + MH, + MQ, + MR, + MU, + YT, + MX, + FM, + MD, + MC, + MN, + ME, + MS, + MA, + MZ, + MM, + NA, + NR, + NP, + NL, + NC, + NZ, + NI, + NE, + NG, + NU, + NF, + MP, + NO, + OM, + PK, + PW, + PS, + PA, + PG, + PY, + PE, + PH, + PN, + PL, + PT, + PR, + QA, + RE, + RO, + RU, + RW, + BL, + SH, + KN, + LC, + MF, + PM, + VC, + WS, + SM, + ST, + SA, + SN, + RS, + SC, + SL, + SG, + SX, + SK, + SI, + SB, + SO, + ZA, + GS, + SS, + ES, + LK, + SD, + SR, + SJ, + SZ, + SE, + CH, + SY, + TW, + TJ, + TZ, + TH, + TL, + TG, + TK, + TO, + TT, + TN, + TR, + TM, + TC, + TV, + UG, + UA, + AE, + GB, + US, + UM, + UY, + UZ, + VU, + VE, + VN, + VG, + VI, + WF, + EH, + YE, + ZM, + ZW, + Unknown + } + + /// + /// Task name is unique within a title. Using a task name that's already taken will cause a name conflict error. Too many + /// create-task requests within a short time will cause a create conflict error. + /// + [Serializable] + public class CreateActionsOnPlayerSegmentTaskRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Description the task + /// + public string Description; + /// + /// Whether the schedule is active. Inactive schedule will not trigger task execution. + /// + public bool IsActive; + /// + /// Name of the task. This is a unique identifier for tasks in the title. + /// + public string Name; + /// + /// Task details related to segment and action + /// + public ActionsOnPlayersInSegmentTaskParameter Parameter; + /// + /// Cron expression for the run schedule of the task. The expression should be in UTC. + /// + public string Schedule; + } + + /// + /// Task name is unique within a title. Using a task name that's already taken will cause a name conflict error. Too many + /// create-task requests within a short time will cause a create conflict error. + /// + [Serializable] + public class CreateCloudScriptTaskRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Description the task + /// + public string Description; + /// + /// Whether the schedule is active. Inactive schedule will not trigger task execution. + /// + public bool IsActive; + /// + /// Name of the task. This is a unique identifier for tasks in the title. + /// + public string Name; + /// + /// Task details related to CloudScript + /// + public CloudScriptTaskParameter Parameter; + /// + /// Cron expression for the run schedule of the task. The expression should be in UTC. + /// + public string Schedule; + } + + /// + /// Task name is unique within a title. Using a task name that's already taken will cause a name conflict error. Too many + /// create-task requests within a short time will cause a create conflict error. + /// + [Serializable] + public class CreateInsightsScheduledScalingTaskRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Description the task + /// + public string Description; + /// + /// Whether the schedule is active. Inactive schedule will not trigger task execution. + /// + public bool IsActive; + /// + /// Name of the task. This is a unique identifier for tasks in the title. + /// + public string Name; + /// + /// Task details related to Insights Scaling + /// + public InsightsScalingTaskParameter Parameter; + /// + /// Cron expression for the run schedule of the task. The expression should be in UTC. + /// + public string Schedule; + } + + [Serializable] + public class CreateOpenIdConnectionRequest : PlayFabRequestCommon + { + /// + /// The client ID given by the ID provider. + /// + public string ClientId; + /// + /// The client secret given by the ID provider. + /// + public string ClientSecret; + /// + /// A name for the connection that identifies it within the title. + /// + public string ConnectionId; + /// + /// Ignore 'nonce' claim in identity tokens. + /// + public bool? IgnoreNonce; + /// + /// The discovery document URL to read issuer information from. This must be the absolute URL to the JSON OpenId + /// Configuration document and must be accessible from the internet. If you don't know it, try your issuer URL followed by + /// "/.well-known/openid-configuration". For example, if the issuer is https://example.com, try + /// https://example.com/.well-known/openid-configuration + /// + public string IssuerDiscoveryUrl; + /// + /// Manually specified information for an OpenID Connect issuer. + /// + public OpenIdIssuerInformation IssuerInformation; + /// + /// Override the issuer name for user indexing and lookup. + /// + public string IssuerOverride; + } + + /// + /// Player Shared Secret Keys are used for the call to Client/GetTitlePublicKey, which exchanges the shared secret for an + /// RSA CSP blob to be used to encrypt the payload of account creation requests when that API requires a signature header. + /// + [Serializable] + public class CreatePlayerSharedSecretRequest : PlayFabRequestCommon + { + /// + /// Friendly name for this key + /// + public string FriendlyName; + } + + [Serializable] + public class CreatePlayerSharedSecretResult : PlayFabResultCommon + { + /// + /// The player shared secret to use when calling Client/GetTitlePublicKey + /// + public string SecretKey; + } + + /// + /// Statistics are numeric values, with each statistic in the title also generating a leaderboard. The ResetInterval enables + /// automatically resetting leaderboards on a specified interval. Upon reset, the statistic updates to a new version with no + /// values (effectively removing all players from the leaderboard). The previous version's statistic values are also + /// archived for retrieval, if needed (see GetPlayerStatisticVersions). Statistics not created via a call to + /// CreatePlayerStatisticDefinition by default have a VersionChangeInterval of Never, meaning they do not reset on a + /// schedule, but they can be set to do so via a call to UpdatePlayerStatisticDefinition. Once a statistic has been reset + /// (sometimes referred to as versioned or incremented), the now-previous version can still be written to for up a short, + /// pre-defined period (currently 10 seconds), to prevent issues with levels completing around the time of the reset. Also, + /// once reset, the historical statistics for players in the title may be retrieved using the URL specified in the version + /// information (GetPlayerStatisticVersions). The AggregationMethod determines what action is taken when a new statistic + /// value is submitted - always update with the new value (Last), use the highest of the old and new values (Max), use the + /// smallest (Min), or add them together (Sum). + /// + [Serializable] + public class CreatePlayerStatisticDefinitionRequest : PlayFabRequestCommon + { + /// + /// the aggregation method to use in updating the statistic (defaults to last) + /// + public StatisticAggregationMethod? AggregationMethod; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// unique name of the statistic + /// + public string StatisticName; + /// + /// interval at which the values of the statistic for all players are reset (resets begin at the next interval boundary) + /// + public StatisticResetIntervalOption? VersionChangeInterval; + } + + [Serializable] + public class CreatePlayerStatisticDefinitionResult : PlayFabResultCommon + { + /// + /// created statistic definition + /// + public PlayerStatisticDefinition Statistic; + } + + /// + /// Send all the segment details part of CreateSegmentRequest + /// + [Serializable] + public class CreateSegmentRequest : PlayFabRequestCommon + { + /// + /// Segment model with all of the segment properties data. + /// + public SegmentModel SegmentModel; + } + + [Serializable] + public class CreateSegmentResponse : PlayFabResultCommon + { + /// + /// Error message. + /// + public string ErrorMessage; + /// + /// Segment id. + /// + public string SegmentId; + } + + [Serializable] + public class CreateTaskResult : PlayFabResultCommon + { + /// + /// ID of the task + /// + public string TaskId; + } + + public enum Currency + { + AED, + AFN, + ALL, + AMD, + ANG, + AOA, + ARS, + AUD, + AWG, + AZN, + BAM, + BBD, + BDT, + BGN, + BHD, + BIF, + BMD, + BND, + BOB, + BRL, + BSD, + BTN, + BWP, + BYR, + BZD, + CAD, + CDF, + CHF, + CLP, + CNY, + COP, + CRC, + CUC, + CUP, + CVE, + CZK, + DJF, + DKK, + DOP, + DZD, + EGP, + ERN, + ETB, + EUR, + FJD, + FKP, + GBP, + GEL, + GGP, + GHS, + GIP, + GMD, + GNF, + GTQ, + GYD, + HKD, + HNL, + HRK, + HTG, + HUF, + IDR, + ILS, + IMP, + INR, + IQD, + IRR, + ISK, + JEP, + JMD, + JOD, + JPY, + KES, + KGS, + KHR, + KMF, + KPW, + KRW, + KWD, + KYD, + KZT, + LAK, + LBP, + LKR, + LRD, + LSL, + LYD, + MAD, + MDL, + MGA, + MKD, + MMK, + MNT, + MOP, + MRO, + MUR, + MVR, + MWK, + MXN, + MYR, + MZN, + NAD, + NGN, + NIO, + NOK, + NPR, + NZD, + OMR, + PAB, + PEN, + PGK, + PHP, + PKR, + PLN, + PYG, + QAR, + RON, + RSD, + RUB, + RWF, + SAR, + SBD, + SCR, + SDG, + SEK, + SGD, + SHP, + SLL, + SOS, + SPL, + SRD, + STD, + SVC, + SYP, + SZL, + THB, + TJS, + TMT, + TND, + TOP, + TRY, + TTD, + TVD, + TWD, + TZS, + UAH, + UGX, + USD, + UYU, + UZS, + VEF, + VND, + VUV, + WST, + XAF, + XCD, + XDR, + XOF, + XPF, + YER, + ZAR, + ZMW, + ZWD + } + + [Serializable] + public class DeleteContentRequest : PlayFabRequestCommon + { + /// + /// Key of the content item to be deleted + /// + public string Key; + } + + [Serializable] + public class DeleteInventoryItemsV2SegmentAction : PlayFabBaseModel + { + /// + /// The collection id for where the item will be removed from the player inventory + /// + public string CollectionId; + /// + /// The id of item to be removed from the player + /// + public string ItemId; + /// + /// The stack id for where the item will be removed from the player inventory + /// + public string StackId; + } + + [Serializable] + public class DeleteInventoryItemV2Content : PlayFabBaseModel + { + /// + /// The collection id for where the item will be removed from the player inventory + /// + public string CollectionId; + /// + /// The id of item to be removed from the player + /// + public string ItemId; + /// + /// The stack id for where the item will be removed from the player inventory + /// + public string StackId; + } + + /// + /// Deletes all data associated with the master player account, including data from all titles the player has played, such + /// as statistics, custom data, inventory, purchases, virtual currency balances, characters, group memberships, publisher + /// data, credential data, account linkages, friends list, PlayStream event data, and telemetry event data. Removes the + /// player from all leaderboards and player search indexes. Note, this API queues the player for deletion and returns a + /// receipt immediately. Record the receipt ID for future reference. It may take some time before all player data is fully + /// deleted. Upon completion of the deletion, an email will be sent to the notification email address configured for the + /// title confirming the deletion. Until the player data is fully deleted, attempts to recreate the player with the same + /// user account in the same title will fail with the 'AccountDeleted' error. It is highly recommended to know the impact of + /// the deletion by calling GetPlayedTitleList, before calling this API. + /// + [Serializable] + public class DeleteMasterPlayerAccountRequest : PlayFabRequestCommon + { + /// + /// Developer created string to identify a user without PlayFab ID + /// + public string MetaData; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class DeleteMasterPlayerAccountResult : PlayFabResultCommon + { + /// + /// A notification email with this job receipt Id will be sent to the title notification email address when deletion is + /// complete. + /// + public string JobReceiptId; + /// + /// List of titles from which the player's data will be deleted. + /// + public List TitleIds; + } + + /// + /// Deletes any PlayStream or telemetry event associated with the player from PlayFab. Note, this API queues the data for + /// asynchronous deletion. It may take some time before the data is deleted. + /// + [Serializable] + public class DeleteMasterPlayerEventDataRequest : PlayFabRequestCommon + { + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class DeleteMasterPlayerEventDataResult : PlayFabResultCommon + { + } + + /// + /// This API lets developers delete a membership subscription. + /// + [Serializable] + public class DeleteMembershipSubscriptionRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Id of the membership to apply the override expiration date to. + /// + public string MembershipId; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + /// + /// Id of the subscription that should be deleted from the membership. + /// + public string SubscriptionId; + } + + [Serializable] + public class DeleteMembershipSubscriptionResult : PlayFabResultCommon + { + } + + [Serializable] + public class DeleteOpenIdConnectionRequest : PlayFabRequestCommon + { + /// + /// unique name of the connection + /// + public string ConnectionId; + } + + [Serializable] + public class DeletePlayerContent : PlayFabBaseModel + { + } + + /// + /// Deletes all data associated with the player, including statistics, custom data, inventory, purchases, virtual currency + /// balances, characters and shared group memberships. Removes the player from all leaderboards and player search indexes. + /// Does not delete PlayStream event history associated with the player. Does not delete the publisher user account that + /// created the player in the title nor associated data such as username, password, email address, account linkages, or + /// friends list. Note, this API queues the player for deletion and returns immediately. It may take several minutes or more + /// before all player data is fully deleted. Until the player data is fully deleted, attempts to recreate the player with + /// the same user account in the same title will fail with the 'AccountDeleted' error. + /// + [Serializable] + public class DeletePlayerRequest : PlayFabRequestCommon + { + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class DeletePlayerResult : PlayFabResultCommon + { + } + + [Serializable] + public class DeletePlayerSegmentAction : PlayFabBaseModel + { + } + + /// + /// Player Shared Secret Keys are used for the call to Client/GetTitlePublicKey, which exchanges the shared secret for an + /// RSA CSP blob to be used to encrypt the payload of account creation requests when that API requires a signature header. + /// + [Serializable] + public class DeletePlayerSharedSecretRequest : PlayFabRequestCommon + { + /// + /// The shared secret key to delete + /// + public string SecretKey; + } + + [Serializable] + public class DeletePlayerSharedSecretResult : PlayFabResultCommon + { + } + + [Serializable] + public class DeletePlayerStatisticSegmentAction : PlayFabBaseModel + { + /// + /// Statistic name. + /// + public string StatisticName; + } + + /// + /// Send segment id planning to delete part of DeleteSegmentRequest object + /// + [Serializable] + public class DeleteSegmentRequest : PlayFabRequestCommon + { + /// + /// Segment id. + /// + public string SegmentId; + } + + [Serializable] + public class DeleteSegmentsResponse : PlayFabResultCommon + { + /// + /// Error message. + /// + public string ErrorMessage; + } + + /// + /// This non-reversible operation will permanently delete the requested store. + /// + [Serializable] + public class DeleteStoreRequest : PlayFabRequestCommon + { + /// + /// catalog version of the store to delete. If null, uses the default catalog. + /// + public string CatalogVersion; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// unqiue identifier for the store which is to be deleted + /// + public string StoreId; + } + + [Serializable] + public class DeleteStoreResult : PlayFabResultCommon + { + } + + /// + /// After a task is deleted, for tracking purposes, the task instances belonging to this task will still remain. They will + /// become orphaned and does not belongs to any task. Executions of any in-progress task instances will continue. If the + /// task specified does not exist, the deletion is considered a success. + /// + [Serializable] + public class DeleteTaskRequest : PlayFabRequestCommon + { + /// + /// Specify either the task ID or the name of task to be deleted. + /// + public NameIdentifier Identifier; + } + + /// + /// Will delete all the title data associated with the given override label. + /// + [Serializable] + public class DeleteTitleDataOverrideRequest : PlayFabRequestCommon + { + /// + /// Name of the override. + /// + public string OverrideLabel; + } + + [Serializable] + public class DeleteTitleDataOverrideResult : PlayFabResultCommon + { + } + + /// + /// Deletes all data associated with the title, including catalog, virtual currencies, leaderboard statistics, Cloud Script + /// revisions, segment definitions, event rules, tasks, add-ons, secret keys, data encryption keys, and permission policies. + /// Removes the title from its studio and removes all associated developer roles and permissions. Does not delete PlayStream + /// event history associated with the title. Note, this API queues the title for deletion and returns immediately. It may + /// take several hours or more before all title data is fully deleted. All player accounts in the title must be deleted + /// before deleting the title. If any player accounts exist, the API will return a 'TitleContainsUserAccounts' error. Until + /// the title data is fully deleted, attempts to call APIs with the title will fail with the 'TitleDeleted' error. + /// + [Serializable] + public class DeleteTitleRequest : PlayFabRequestCommon + { + } + + [Serializable] + public class DeleteTitleResult : PlayFabResultCommon + { + } + + public enum EffectType + { + Allow, + Deny + } + + [Serializable] + public class EmailNotificationSegmentAction : PlayFabBaseModel + { + /// + /// Email template id. + /// + public string EmailTemplateId; + /// + /// Email template name. + /// + public string EmailTemplateName; + } + + public enum EmailVerificationStatus + { + Unverified, + Pending, + Confirmed + } + + [Serializable] + public class EmptyResponse : PlayFabResultCommon + { + } + + /// + /// Combined entity type and ID structure which uniquely identifies a single entity. + /// + [Serializable] + public class EntityKey : PlayFabBaseModel + { + /// + /// Unique ID of the entity. + /// + public string Id; + /// + /// Entity type. See https://docs.microsoft.com/gaming/playfab/features/data/entities/available-built-in-entity-types + /// + public string Type; + } + + [Serializable] + public class ExecuteAzureFunctionSegmentAction : PlayFabBaseModel + { + /// + /// Azure function. + /// + public string AzureFunction; + /// + /// Azure function parameter. + /// + public object FunctionParameter; + /// + /// Generate play stream event. + /// + public bool GenerateFunctionExecutedEvents; + } + + [Serializable] + public class ExecuteCloudScriptContent : PlayFabBaseModel + { + /// + /// Arguments(JSON) to be passed into the cloudscript method + /// + public string CloudScriptMethodArguments; + /// + /// Cloudscript method name + /// + public string CloudScriptMethodName; + /// + /// Publish cloudscript results as playstream event + /// + public bool PublishResultsToPlayStream; + } + + [Serializable] + public class ExecuteCloudScriptResult : PlayFabBaseModel + { + /// + /// Number of PlayFab API requests issued by the CloudScript function + /// + public int APIRequestsIssued; + /// + /// Information about the error, if any, that occurred during execution + /// + public ScriptExecutionError Error; + public double ExecutionTimeSeconds; + /// + /// The name of the function that executed + /// + public string FunctionName; + /// + /// The object returned from the CloudScript function, if any + /// + public object FunctionResult; + /// + /// Flag indicating if the FunctionResult was too large and was subsequently dropped from this event. This only occurs if + /// the total event size is larger than 350KB. + /// + public bool? FunctionResultTooLarge; + /// + /// Number of external HTTP requests issued by the CloudScript function + /// + public int HttpRequestsIssued; + /// + /// Entries logged during the function execution. These include both entries logged in the function code using log.info() + /// and log.error() and error entries for API and HTTP request failures. + /// + public List Logs; + /// + /// Flag indicating if the logs were too large and were subsequently dropped from this event. This only occurs if the total + /// event size is larger than 350KB after the FunctionResult was removed. + /// + public bool? LogsTooLarge; + public uint MemoryConsumedBytes; + /// + /// Processor time consumed while executing the function. This does not include time spent waiting on API calls or HTTP + /// requests. + /// + public double ProcessorTimeSeconds; + /// + /// The revision of the CloudScript that executed + /// + public int Revision; + } + + [Serializable] + public class ExecuteCloudScriptSegmentAction : PlayFabBaseModel + { + /// + /// Cloud script function. + /// + public string CloudScriptFunction; + /// + /// Generate play stream event. + /// + public bool CloudScriptPublishResultsToPlayStream; + /// + /// Cloud script function parameter. + /// + public object FunctionParameter; + /// + /// Cloud script function parameter json text. + /// + public string FunctionParameterJson; + } + + [Serializable] + public class ExecuteFunctionContent : PlayFabBaseModel + { + /// + /// Arguments(JSON) to be passed into the cloudscript azure function + /// + public string CloudScriptFunctionArguments; + /// + /// Cloudscript azure function name + /// + public string CloudScriptFunctionName; + /// + /// Publish results from executing the azure function as playstream event + /// + public bool PublishResultsToPlayStream; + } + + /// + /// Exports all data associated with the master player account, including data from all titles the player has played, such + /// as statistics, custom data, inventory, purchases, virtual currency balances, characters, group memberships, publisher + /// data, credential data, account linkages, friends list, PlayStream event data, and telemetry event data. Note, this API + /// queues the player for export and returns a receipt immediately. Record the receipt ID for future reference. It may take + /// some time before the export is available for download. Upon completion of the export, an email containing the URL to + /// download the export dump will be sent to the notification email address configured for the title. + /// + [Serializable] + public class ExportMasterPlayerDataRequest : PlayFabRequestCommon + { + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class ExportMasterPlayerDataResult : PlayFabResultCommon + { + /// + /// An email with this job receipt Id containing the export download link will be sent to the title notification email + /// address when the export is complete. + /// + public string JobReceiptId; + } + + /// + /// Request must contain the Segment ID + /// + [Serializable] + public class ExportPlayersInSegmentRequest : PlayFabRequestCommon + { + /// + /// Unique identifier of the requested segment. + /// + public string SegmentId; + } + + [Serializable] + public class ExportPlayersInSegmentResult : PlayFabResultCommon + { + /// + /// Unique identifier of the export for the requested Segment. + /// + public string ExportId; + /// + /// Unique identifier of the requested Segment. + /// + public string SegmentId; + } + + [Serializable] + public class FirstLoginDateSegmentFilter : PlayFabBaseModel + { + /// + /// First player login date comparison. + /// + public SegmentFilterComparison? Comparison; + /// + /// First player login date. + /// + public DateTime LogInDate; + } + + [Serializable] + public class FirstLoginTimespanSegmentFilter : PlayFabBaseModel + { + /// + /// First player login duration comparison. + /// + public SegmentFilterComparison? Comparison; + /// + /// First player login duration. + /// + public double DurationInMinutes; + } + + public enum GenericErrorCodes + { + Success, + UnkownError, + InvalidParams, + AccountNotFound, + AccountBanned, + InvalidUsernameOrPassword, + InvalidTitleId, + InvalidEmailAddress, + EmailAddressNotAvailable, + InvalidUsername, + InvalidPassword, + UsernameNotAvailable, + InvalidSteamTicket, + AccountAlreadyLinked, + LinkedAccountAlreadyClaimed, + InvalidFacebookToken, + AccountNotLinked, + FailedByPaymentProvider, + CouponCodeNotFound, + InvalidContainerItem, + ContainerNotOwned, + KeyNotOwned, + InvalidItemIdInTable, + InvalidReceipt, + ReceiptAlreadyUsed, + ReceiptCancelled, + GameNotFound, + GameModeNotFound, + InvalidGoogleToken, + UserIsNotPartOfDeveloper, + InvalidTitleForDeveloper, + TitleNameConflicts, + UserisNotValid, + ValueAlreadyExists, + BuildNotFound, + PlayerNotInGame, + InvalidTicket, + InvalidDeveloper, + InvalidOrderInfo, + RegistrationIncomplete, + InvalidPlatform, + UnknownError, + SteamApplicationNotOwned, + WrongSteamAccount, + TitleNotActivated, + RegistrationSessionNotFound, + NoSuchMod, + FileNotFound, + DuplicateEmail, + ItemNotFound, + ItemNotOwned, + ItemNotRecycleable, + ItemNotAffordable, + InvalidVirtualCurrency, + WrongVirtualCurrency, + WrongPrice, + NonPositiveValue, + InvalidRegion, + RegionAtCapacity, + ServerFailedToStart, + NameNotAvailable, + InsufficientFunds, + InvalidDeviceID, + InvalidPushNotificationToken, + NoRemainingUses, + InvalidPaymentProvider, + PurchaseInitializationFailure, + DuplicateUsername, + InvalidBuyerInfo, + NoGameModeParamsSet, + BodyTooLarge, + ReservedWordInBody, + InvalidTypeInBody, + InvalidRequest, + ReservedEventName, + InvalidUserStatistics, + NotAuthenticated, + StreamAlreadyExists, + ErrorCreatingStream, + StreamNotFound, + InvalidAccount, + PurchaseDoesNotExist, + InvalidPurchaseTransactionStatus, + APINotEnabledForGameClientAccess, + NoPushNotificationARNForTitle, + BuildAlreadyExists, + BuildPackageDoesNotExist, + CustomAnalyticsEventsNotEnabledForTitle, + InvalidSharedGroupId, + NotAuthorized, + MissingTitleGoogleProperties, + InvalidItemProperties, + InvalidPSNAuthCode, + InvalidItemId, + PushNotEnabledForAccount, + PushServiceError, + ReceiptDoesNotContainInAppItems, + ReceiptContainsMultipleInAppItems, + InvalidBundleID, + JavascriptException, + InvalidSessionTicket, + UnableToConnectToDatabase, + InternalServerError, + InvalidReportDate, + ReportNotAvailable, + DatabaseThroughputExceeded, + InvalidGameTicket, + ExpiredGameTicket, + GameTicketDoesNotMatchLobby, + LinkedDeviceAlreadyClaimed, + DeviceAlreadyLinked, + DeviceNotLinked, + PartialFailure, + PublisherNotSet, + ServiceUnavailable, + VersionNotFound, + RevisionNotFound, + InvalidPublisherId, + DownstreamServiceUnavailable, + APINotIncludedInTitleUsageTier, + DAULimitExceeded, + APIRequestLimitExceeded, + InvalidAPIEndpoint, + BuildNotAvailable, + ConcurrentEditError, + ContentNotFound, + CharacterNotFound, + CloudScriptNotFound, + ContentQuotaExceeded, + InvalidCharacterStatistics, + PhotonNotEnabledForTitle, + PhotonApplicationNotFound, + PhotonApplicationNotAssociatedWithTitle, + InvalidEmailOrPassword, + FacebookAPIError, + InvalidContentType, + KeyLengthExceeded, + DataLengthExceeded, + TooManyKeys, + FreeTierCannotHaveVirtualCurrency, + MissingAmazonSharedKey, + AmazonValidationError, + InvalidPSNIssuerId, + PSNInaccessible, + ExpiredAuthToken, + FailedToGetEntitlements, + FailedToConsumeEntitlement, + TradeAcceptingUserNotAllowed, + TradeInventoryItemIsAssignedToCharacter, + TradeInventoryItemIsBundle, + TradeStatusNotValidForCancelling, + TradeStatusNotValidForAccepting, + TradeDoesNotExist, + TradeCancelled, + TradeAlreadyFilled, + TradeWaitForStatusTimeout, + TradeInventoryItemExpired, + TradeMissingOfferedAndAcceptedItems, + TradeAcceptedItemIsBundle, + TradeAcceptedItemIsStackable, + TradeInventoryItemInvalidStatus, + TradeAcceptedCatalogItemInvalid, + TradeAllowedUsersInvalid, + TradeInventoryItemDoesNotExist, + TradeInventoryItemIsConsumed, + TradeInventoryItemIsStackable, + TradeAcceptedItemsMismatch, + InvalidKongregateToken, + FeatureNotConfiguredForTitle, + NoMatchingCatalogItemForReceipt, + InvalidCurrencyCode, + NoRealMoneyPriceForCatalogItem, + TradeInventoryItemIsNotTradable, + TradeAcceptedCatalogItemIsNotTradable, + UsersAlreadyFriends, + LinkedIdentifierAlreadyClaimed, + CustomIdNotLinked, + TotalDataSizeExceeded, + DeleteKeyConflict, + InvalidXboxLiveToken, + ExpiredXboxLiveToken, + ResettableStatisticVersionRequired, + NotAuthorizedByTitle, + NoPartnerEnabled, + InvalidPartnerResponse, + APINotEnabledForGameServerAccess, + StatisticNotFound, + StatisticNameConflict, + StatisticVersionClosedForWrites, + StatisticVersionInvalid, + APIClientRequestRateLimitExceeded, + InvalidJSONContent, + InvalidDropTable, + StatisticVersionAlreadyIncrementedForScheduledInterval, + StatisticCountLimitExceeded, + StatisticVersionIncrementRateExceeded, + ContainerKeyInvalid, + CloudScriptExecutionTimeLimitExceeded, + NoWritePermissionsForEvent, + CloudScriptFunctionArgumentSizeExceeded, + CloudScriptAPIRequestCountExceeded, + CloudScriptAPIRequestError, + CloudScriptHTTPRequestError, + InsufficientGuildRole, + GuildNotFound, + OverLimit, + EventNotFound, + InvalidEventField, + InvalidEventName, + CatalogNotConfigured, + OperationNotSupportedForPlatform, + SegmentNotFound, + StoreNotFound, + InvalidStatisticName, + TitleNotQualifiedForLimit, + InvalidServiceLimitLevel, + ServiceLimitLevelInTransition, + CouponAlreadyRedeemed, + GameServerBuildSizeLimitExceeded, + GameServerBuildCountLimitExceeded, + VirtualCurrencyCountLimitExceeded, + VirtualCurrencyCodeExists, + TitleNewsItemCountLimitExceeded, + InvalidTwitchToken, + TwitchResponseError, + ProfaneDisplayName, + UserAlreadyAdded, + InvalidVirtualCurrencyCode, + VirtualCurrencyCannotBeDeleted, + IdentifierAlreadyClaimed, + IdentifierNotLinked, + InvalidContinuationToken, + ExpiredContinuationToken, + InvalidSegment, + InvalidSessionId, + SessionLogNotFound, + InvalidSearchTerm, + TwoFactorAuthenticationTokenRequired, + GameServerHostCountLimitExceeded, + PlayerTagCountLimitExceeded, + RequestAlreadyRunning, + ActionGroupNotFound, + MaximumSegmentBulkActionJobsRunning, + NoActionsOnPlayersInSegmentJob, + DuplicateStatisticName, + ScheduledTaskNameConflict, + ScheduledTaskCreateConflict, + InvalidScheduledTaskName, + InvalidTaskSchedule, + SteamNotEnabledForTitle, + LimitNotAnUpgradeOption, + NoSecretKeyEnabledForCloudScript, + TaskNotFound, + TaskInstanceNotFound, + InvalidIdentityProviderId, + MisconfiguredIdentityProvider, + InvalidScheduledTaskType, + BillingInformationRequired, + LimitedEditionItemUnavailable, + InvalidAdPlacementAndReward, + AllAdPlacementViewsAlreadyConsumed, + GoogleOAuthNotConfiguredForTitle, + GoogleOAuthError, + UserNotFriend, + InvalidSignature, + InvalidPublicKey, + GoogleOAuthNoIdTokenIncludedInResponse, + StatisticUpdateInProgress, + LeaderboardVersionNotAvailable, + StatisticAlreadyHasPrizeTable, + PrizeTableHasOverlappingRanks, + PrizeTableHasMissingRanks, + PrizeTableRankStartsAtZero, + InvalidStatistic, + ExpressionParseFailure, + ExpressionInvokeFailure, + ExpressionTooLong, + DataUpdateRateExceeded, + RestrictedEmailDomain, + EncryptionKeyDisabled, + EncryptionKeyMissing, + EncryptionKeyBroken, + NoSharedSecretKeyConfigured, + SecretKeyNotFound, + PlayerSecretAlreadyConfigured, + APIRequestsDisabledForTitle, + InvalidSharedSecretKey, + PrizeTableHasNoRanks, + ProfileDoesNotExist, + ContentS3OriginBucketNotConfigured, + InvalidEnvironmentForReceipt, + EncryptedRequestNotAllowed, + SignedRequestNotAllowed, + RequestViewConstraintParamsNotAllowed, + BadPartnerConfiguration, + XboxBPCertificateFailure, + XboxXASSExchangeFailure, + InvalidEntityId, + StatisticValueAggregationOverflow, + EmailMessageFromAddressIsMissing, + EmailMessageToAddressIsMissing, + SmtpServerAuthenticationError, + SmtpServerLimitExceeded, + SmtpServerInsufficientStorage, + SmtpServerCommunicationError, + SmtpServerGeneralFailure, + EmailClientTimeout, + EmailClientCanceledTask, + EmailTemplateMissing, + InvalidHostForTitleId, + EmailConfirmationTokenDoesNotExist, + EmailConfirmationTokenExpired, + AccountDeleted, + PlayerSecretNotConfigured, + InvalidSignatureTime, + NoContactEmailAddressFound, + InvalidAuthToken, + AuthTokenDoesNotExist, + AuthTokenExpired, + AuthTokenAlreadyUsedToResetPassword, + MembershipNameTooLong, + MembershipNotFound, + GoogleServiceAccountInvalid, + GoogleServiceAccountParseFailure, + EntityTokenMissing, + EntityTokenInvalid, + EntityTokenExpired, + EntityTokenRevoked, + InvalidProductForSubscription, + XboxInaccessible, + SubscriptionAlreadyTaken, + SmtpAddonNotEnabled, + APIConcurrentRequestLimitExceeded, + XboxRejectedXSTSExchangeRequest, + VariableNotDefined, + TemplateVersionNotDefined, + FileTooLarge, + TitleDeleted, + TitleContainsUserAccounts, + TitleDeletionPlayerCleanupFailure, + EntityFileOperationPending, + NoEntityFileOperationPending, + EntityProfileVersionMismatch, + TemplateVersionTooOld, + MembershipDefinitionInUse, + PaymentPageNotConfigured, + FailedLoginAttemptRateLimitExceeded, + EntityBlockedByGroup, + RoleDoesNotExist, + EntityIsAlreadyMember, + DuplicateRoleId, + GroupInvitationNotFound, + GroupApplicationNotFound, + OutstandingInvitationAcceptedInstead, + OutstandingApplicationAcceptedInstead, + RoleIsGroupDefaultMember, + RoleIsGroupAdmin, + RoleNameNotAvailable, + GroupNameNotAvailable, + EmailReportAlreadySent, + EmailReportRecipientBlacklisted, + EventNamespaceNotAllowed, + EventEntityNotAllowed, + InvalidEntityType, + NullTokenResultFromAad, + InvalidTokenResultFromAad, + NoValidCertificateForAad, + InvalidCertificateForAad, + DuplicateDropTableId, + MultiplayerServerError, + MultiplayerServerTooManyRequests, + MultiplayerServerNoContent, + MultiplayerServerBadRequest, + MultiplayerServerUnauthorized, + MultiplayerServerForbidden, + MultiplayerServerNotFound, + MultiplayerServerConflict, + MultiplayerServerInternalServerError, + MultiplayerServerUnavailable, + ExplicitContentDetected, + PIIContentDetected, + InvalidScheduledTaskParameter, + PerEntityEventRateLimitExceeded, + TitleDefaultLanguageNotSet, + EmailTemplateMissingDefaultVersion, + FacebookInstantGamesIdNotLinked, + InvalidFacebookInstantGamesSignature, + FacebookInstantGamesAuthNotConfiguredForTitle, + EntityProfileConstraintValidationFailed, + TelemetryIngestionKeyPending, + TelemetryIngestionKeyNotFound, + StatisticChildNameInvalid, + DataIntegrityError, + VirtualCurrencyCannotBeSetToOlderVersion, + VirtualCurrencyMustBeWithinIntegerRange, + EmailTemplateInvalidSyntax, + EmailTemplateMissingCallback, + PushNotificationTemplateInvalidPayload, + InvalidLocalizedPushNotificationLanguage, + MissingLocalizedPushNotificationMessage, + PushNotificationTemplateMissingPlatformPayload, + PushNotificationTemplatePayloadContainsInvalidJson, + PushNotificationTemplateContainsInvalidIosPayload, + PushNotificationTemplateContainsInvalidAndroidPayload, + PushNotificationTemplateIosPayloadMissingNotificationBody, + PushNotificationTemplateAndroidPayloadMissingNotificationBody, + PushNotificationTemplateNotFound, + PushNotificationTemplateMissingDefaultVersion, + PushNotificationTemplateInvalidSyntax, + PushNotificationTemplateNoCustomPayloadForV1, + NoLeaderboardForStatistic, + TitleNewsMissingDefaultLanguage, + TitleNewsNotFound, + TitleNewsDuplicateLanguage, + TitleNewsMissingTitleOrBody, + TitleNewsInvalidLanguage, + EmailRecipientBlacklisted, + InvalidGameCenterAuthRequest, + GameCenterAuthenticationFailed, + CannotEnablePartiesForTitle, + PartyError, + PartyRequests, + PartyNoContent, + PartyBadRequest, + PartyUnauthorized, + PartyForbidden, + PartyNotFound, + PartyConflict, + PartyInternalServerError, + PartyUnavailable, + PartyTooManyRequests, + PushNotificationTemplateMissingName, + CannotEnableMultiplayerServersForTitle, + WriteAttemptedDuringExport, + MultiplayerServerTitleQuotaCoresExceeded, + AutomationRuleNotFound, + EntityAPIKeyLimitExceeded, + EntityAPIKeyNotFound, + EntityAPIKeyOrSecretInvalid, + EconomyServiceUnavailable, + EconomyServiceInternalError, + QueryRateLimitExceeded, + EntityAPIKeyCreationDisabledForEntity, + ForbiddenByEntityPolicy, + UpdateInventoryRateLimitExceeded, + StudioCreationRateLimited, + StudioCreationInProgress, + DuplicateStudioName, + StudioNotFound, + StudioDeleted, + StudioDeactivated, + StudioActivated, + TitleCreationRateLimited, + TitleCreationInProgress, + DuplicateTitleName, + TitleActivationRateLimited, + TitleActivationInProgress, + TitleDeactivated, + TitleActivated, + CloudScriptAzureFunctionsExecutionTimeLimitExceeded, + CloudScriptAzureFunctionsArgumentSizeExceeded, + CloudScriptAzureFunctionsReturnSizeExceeded, + CloudScriptAzureFunctionsHTTPRequestError, + VirtualCurrencyBetaGetError, + VirtualCurrencyBetaCreateError, + VirtualCurrencyBetaInitialDepositSaveError, + VirtualCurrencyBetaSaveError, + VirtualCurrencyBetaDeleteError, + VirtualCurrencyBetaRestoreError, + VirtualCurrencyBetaSaveConflict, + VirtualCurrencyBetaUpdateError, + InsightsManagementDatabaseNotFound, + InsightsManagementOperationNotFound, + InsightsManagementErrorPendingOperationExists, + InsightsManagementSetPerformanceLevelInvalidParameter, + InsightsManagementSetStorageRetentionInvalidParameter, + InsightsManagementGetStorageUsageInvalidParameter, + InsightsManagementGetOperationStatusInvalidParameter, + DuplicatePurchaseTransactionId, + EvaluationModePlayerCountExceeded, + GetPlayersInSegmentRateLimitExceeded, + CloudScriptFunctionNameSizeExceeded, + PaidInsightsFeaturesNotEnabled, + CloudScriptAzureFunctionsQueueRequestError, + EvaluationModeTitleCountExceeded, + InsightsManagementTitleNotInFlight, + LimitNotFound, + LimitNotAvailableViaAPI, + InsightsManagementSetStorageRetentionBelowMinimum, + InsightsManagementSetStorageRetentionAboveMaximum, + AppleNotEnabledForTitle, + InsightsManagementNewActiveEventExportLimitInvalid, + InsightsManagementSetPerformanceRateLimited, + PartyRequestsThrottledFromRateLimiter, + XboxServiceTooManyRequests, + NintendoSwitchNotEnabledForTitle, + RequestMultiplayerServersThrottledFromRateLimiter, + TitleDataOverrideNotFound, + DuplicateKeys, + WasNotCreatedWithCloudRoot, + LegacyMultiplayerServersDeprecated, + VirtualCurrencyCurrentlyUnavailable, + SteamUserNotFound, + ElasticSearchOperationFailed, + NotImplemented, + PublisherNotFound, + PublisherDeleted, + ApiDisabledForMigration, + ResourceNameUpdateNotAllowed, + ApiNotEnabledForTitle, + DuplicateTitleNameForPublisher, + AzureTitleCreationInProgress, + TitleConstraintsPublisherDeletion, + InvalidPlayerAccountPoolId, + PlayerAccountPoolNotFound, + PlayerAccountPoolDeleted, + TitleCleanupInProgress, + AzureResourceConcurrentOperationInProgress, + TitlePublisherUpdateNotAllowed, + AzureResourceManagerNotSupportedInStamp, + ApiNotIncludedInAzurePlayFabFeatureSet, + GoogleServiceAccountFailedAuth, + GoogleAPIServiceUnavailable, + GoogleAPIServiceUnknownError, + NoValidIdentityForAad, + PlayerIdentityLinkNotFound, + PhotonApplicationIdAlreadyInUse, + CloudScriptUnableToDeleteProductionRevision, + CustomIdNotFound, + AutomationInvalidInput, + AutomationInvalidRuleName, + AutomationRuleAlreadyExists, + AutomationRuleLimitExceeded, + InvalidGooglePlayGamesServerAuthCode, + PlayStreamConnectionFailed, + InvalidEventContents, + InsightsV1Deprecated, + AnalysisSubscriptionNotFound, + AnalysisSubscriptionFailed, + AnalysisSubscriptionFoundAlready, + AnalysisSubscriptionManagementInvalidInput, + InvalidGameCenterId, + InvalidNintendoSwitchAccountId, + EntityAPIKeysNotSupported, + IpAddressBanned, + EntityLineageBanned, + NamespaceMismatch, + InvalidServiceConfiguration, + InvalidNamespaceMismatch, + LeaderboardColumnLengthMismatch, + InvalidStatisticScore, + LeaderboardColumnsNotSpecified, + LeaderboardMaxSizeTooLarge, + InvalidAttributeStatisticsSpecified, + LeaderboardNotFound, + TokenSigningKeyNotFound, + LeaderboardNameConflict, + LinkedStatisticColumnMismatch, + NoLinkedStatisticToLeaderboard, + StatDefinitionAlreadyLinkedToLeaderboard, + LinkingStatsNotAllowedForEntityType, + LeaderboardCountLimitExceeded, + LeaderboardSizeLimitExceeded, + LeaderboardDefinitionModificationNotAllowedWhileLinked, + StatisticDefinitionModificationNotAllowedWhileLinked, + LeaderboardUpdateNotAllowedWhileLinked, + CloudScriptAzureFunctionsEventHubRequestError, + ExternalEntityNotAllowedForTier, + InvalidBaseTimeForInterval, + EntityTypeMismatchWithStatDefinition, + SpecifiedVersionLeaderboardNotFound, + LeaderboardColumnLengthMismatchWithStatDefinition, + DuplicateColumnNameFound, + LinkedStatisticColumnNotFound, + LinkedStatisticColumnRequired, + MultipleLinkedStatisticsNotAllowed, + DuplicateLinkedStatisticColumnNameFound, + AggregationTypeNotAllowedForMultiColumnStatistic, + MaxQueryableVersionsValueNotAllowedForTier, + StatisticDefinitionHasNullOrEmptyVersionConfiguration, + StatisticColumnLengthMismatch, + MatchmakingEntityInvalid, + MatchmakingPlayerAttributesInvalid, + MatchmakingQueueNotFound, + MatchmakingMatchNotFound, + MatchmakingTicketNotFound, + MatchmakingAlreadyJoinedTicket, + MatchmakingTicketAlreadyCompleted, + MatchmakingQueueConfigInvalid, + MatchmakingMemberProfileInvalid, + NintendoSwitchDeviceIdNotLinked, + MatchmakingNotEnabled, + MatchmakingPlayerAttributesTooLarge, + MatchmakingNumberOfPlayersInTicketTooLarge, + MatchmakingAttributeInvalid, + MatchmakingPlayerHasNotJoinedTicket, + MatchmakingRateLimitExceeded, + MatchmakingTicketMembershipLimitExceeded, + MatchmakingUnauthorized, + MatchmakingQueueLimitExceeded, + MatchmakingRequestTypeMismatch, + MatchmakingBadRequest, + PubSubFeatureNotEnabledForTitle, + PubSubTooManyRequests, + PubSubConnectionNotFoundForEntity, + PubSubConnectionHandleInvalid, + PubSubSubscriptionLimitExceeded, + TitleConfigNotFound, + TitleConfigUpdateConflict, + TitleConfigSerializationError, + CatalogApiNotImplemented, + CatalogEntityInvalid, + CatalogTitleIdMissing, + CatalogPlayerIdMissing, + CatalogClientIdentityInvalid, + CatalogOneOrMoreFilesInvalid, + CatalogItemMetadataInvalid, + CatalogItemIdInvalid, + CatalogSearchParameterInvalid, + CatalogFeatureDisabled, + CatalogConfigInvalid, + CatalogItemTypeInvalid, + CatalogBadRequest, + CatalogTooManyRequests, + InvalidCatalogItemConfiguration, + ExportInvalidStatusUpdate, + ExportInvalidPrefix, + ExportBlobContainerDoesNotExist, + ExportNotFound, + ExportCouldNotUpdate, + ExportInvalidStorageType, + ExportAmazonBucketDoesNotExist, + ExportInvalidBlobStorage, + ExportKustoException, + ExportKustoConnectionFailed, + ExportUnknownError, + ExportCantEditPendingExport, + ExportLimitExports, + ExportLimitEvents, + ExportInvalidPartitionStatusModification, + ExportCouldNotCreate, + ExportNoBackingDatabaseFound, + ExportCouldNotDelete, + ExportCannotDetermineEventQuery, + ExportInvalidQuerySchemaModification, + ExportQuerySchemaMissingRequiredColumns, + ExportCannotParseQuery, + ExportControlCommandsNotAllowed, + ExportQueryMissingTableReference, + ExportInsightsV1Deprecated, + ExplorerBasicInvalidQueryName, + ExplorerBasicInvalidQueryDescription, + ExplorerBasicInvalidQueryConditions, + ExplorerBasicInvalidQueryStartDate, + ExplorerBasicInvalidQueryEndDate, + ExplorerBasicInvalidQueryGroupBy, + ExplorerBasicInvalidQueryAggregateType, + ExplorerBasicInvalidQueryAggregateProperty, + ExplorerBasicLoadQueriesError, + ExplorerBasicLoadQueryError, + ExplorerBasicCreateQueryError, + ExplorerBasicDeleteQueryError, + ExplorerBasicUpdateQueryError, + ExplorerBasicSavedQueriesLimit, + ExplorerBasicSavedQueryNotFound, + TenantShardMapperShardNotFound, + TitleNotEnabledForParty, + PartyVersionNotFound, + MultiplayerServerBuildReferencedByMatchmakingQueue, + MultiplayerServerBuildReferencedByBuildAlias, + MultiplayerServerBuildAliasReferencedByMatchmakingQueue, + PartySerializationError, + ExperimentationExperimentStopped, + ExperimentationExperimentRunning, + ExperimentationExperimentNotFound, + ExperimentationExperimentNeverStarted, + ExperimentationExperimentDeleted, + ExperimentationClientTimeout, + ExperimentationInvalidVariantConfiguration, + ExperimentationInvalidVariableConfiguration, + ExperimentInvalidId, + ExperimentationNoScorecard, + ExperimentationTreatmentAssignmentFailed, + ExperimentationTreatmentAssignmentDisabled, + ExperimentationInvalidDuration, + ExperimentationMaxExperimentsReached, + ExperimentationExperimentSchedulingInProgress, + ExperimentationInvalidEndDate, + ExperimentationInvalidStartDate, + ExperimentationMaxDurationExceeded, + ExperimentationExclusionGroupNotFound, + ExperimentationExclusionGroupInsufficientCapacity, + ExperimentationExclusionGroupCannotDelete, + ExperimentationExclusionGroupInvalidTrafficAllocation, + ExperimentationExclusionGroupInvalidName, + MaxActionDepthExceeded, + TitleNotOnUpdatedPricingPlan, + SegmentManagementTitleNotInFlight, + SegmentManagementNoExpressionTree, + SegmentManagementTriggerActionCountOverLimit, + SegmentManagementSegmentCountOverLimit, + SegmentManagementInvalidSegmentId, + SegmentManagementInvalidInput, + SegmentManagementInvalidSegmentName, + DeleteSegmentRateLimitExceeded, + CreateSegmentRateLimitExceeded, + UpdateSegmentRateLimitExceeded, + GetSegmentsRateLimitExceeded, + AsyncExportNotInFlight, + AsyncExportNotFound, + AsyncExportRateLimitExceeded, + AnalyticsSegmentCountOverLimit, + SnapshotNotFound, + InventoryApiNotImplemented, + LobbyDoesNotExist, + LobbyRateLimitExceeded, + LobbyPlayerAlreadyJoined, + LobbyNotJoinable, + LobbyMemberCannotRejoin, + LobbyCurrentPlayersMoreThanMaxPlayers, + LobbyPlayerNotPresent, + LobbyBadRequest, + LobbyPlayerMaxLobbyLimitExceeded, + LobbyNewOwnerMustBeConnected, + LobbyCurrentOwnerStillConnected, + LobbyMemberIsNotOwner, + LobbyServerMismatch, + LobbyServerNotFound, + LobbyDifferentServerAlreadyJoined, + LobbyServerAlreadyJoined, + LobbyIsNotClientOwned, + LobbyDoesNotUseConnections, + EventSamplingInvalidRatio, + EventSamplingInvalidEventNamespace, + EventSamplingInvalidEventName, + EventSamplingRatioNotFound, + TelemetryKeyNotFound, + TelemetryKeyInvalidName, + TelemetryKeyAlreadyExists, + TelemetryKeyInvalid, + TelemetryKeyCountOverLimit, + TelemetryKeyDeactivated, + TelemetryKeyLongInsightsRetentionNotAllowed, + EventSinkConnectionInvalid, + EventSinkConnectionUnauthorized, + EventSinkRegionInvalid, + EventSinkLimitExceeded, + EventSinkSasTokenInvalid, + EventSinkNotFound, + EventSinkNameInvalid, + EventSinkSasTokenPermissionInvalid, + EventSinkSecretInvalid, + EventSinkTenantNotFound, + EventSinkAadNotFound, + EventSinkDatabaseNotFound, + EventSinkTitleUnauthorized, + EventSinkInsufficientRoleAssignment, + EventSinkContainerNotFound, + EventSinkTenantIdInvalid, + OperationCanceled, + InvalidDisplayNameRandomSuffixLength, + AllowNonUniquePlayerDisplayNamesDisableNotAllowed, + PartitionedEventInvalid, + PartitionedEventCountOverLimit, + ManageEventNamespaceInvalid, + ManageEventNameInvalid, + ManagedEventNotFound, + ManageEventsInvalidRatio, + ManagedEventInvalid, + PlayerCustomPropertiesPropertyNameTooLong, + PlayerCustomPropertiesPropertyNameIsInvalid, + PlayerCustomPropertiesStringPropertyValueTooLong, + PlayerCustomPropertiesValueIsInvalidType, + PlayerCustomPropertiesVersionMismatch, + PlayerCustomPropertiesPropertyCountTooHigh, + PlayerCustomPropertiesDuplicatePropertyName, + PlayerCustomPropertiesPropertyDoesNotExist, + AddonAlreadyExists, + AddonDoesntExist, + CopilotDisabled, + CopilotInvalidRequest, + TrueSkillUnauthorized, + TrueSkillInvalidTitleId, + TrueSkillInvalidScenarioId, + TrueSkillInvalidModelId, + TrueSkillInvalidModelName, + TrueSkillInvalidPlayerIds, + TrueSkillInvalidEntityKey, + TrueSkillInvalidConditionKey, + TrueSkillInvalidConditionValue, + TrueSkillInvalidConditionAffinityWeight, + TrueSkillInvalidEventName, + TrueSkillMatchResultCreated, + TrueSkillMatchResultAlreadySubmitted, + TrueSkillBadPlayerIdInMatchResult, + TrueSkillInvalidBotIdInMatchResult, + TrueSkillDuplicatePlayerInMatchResult, + TrueSkillNoPlayerInMatchResultTeam, + TrueSkillPlayersInMatchResultExceedingLimit, + TrueSkillInvalidPreMatchPartyInMatchResult, + TrueSkillInvalidTimestampInMatchResult, + TrueSkillStartTimeMissingInMatchResult, + TrueSkillEndTimeMissingInMatchResult, + TrueSkillInvalidPlayerSecondsPlayedInMatchResult, + TrueSkillNoTeamInMatchResult, + TrueSkillNotEnoughTeamsInMatchResult, + TrueSkillInvalidRanksInMatchResult, + TrueSkillNoWinnerInMatchResult, + TrueSkillMissingRequiredCondition, + TrueSkillMissingRequiredEvent, + TrueSkillUnknownEventName, + TrueSkillInvalidEventCount, + TrueSkillUnknownConditionKey, + TrueSkillUnknownConditionValue, + TrueSkillScenarioConfigDoesNotExist, + TrueSkillUnknownModelId, + TrueSkillNoModelInScenario, + TrueSkillNotSupportedForTitle, + TrueSkillModelIsNotActive, + TrueSkillUnauthorizedToQueryOtherPlayerSkills, + TrueSkillInvalidMaxIterations, + TrueSkillEndTimeBeforeStartTime, + TrueSkillInvalidJobId, + TrueSkillInvalidMetadataId, + TrueSkillMissingBuildVerison, + TrueSkillJobAlreadyExists, + TrueSkillJobNotFound, + TrueSkillOperationCanceled, + TrueSkillActiveModelLimitExceeded, + TrueSkillTotalModelLimitExceeded, + TrueSkillUnknownInitialModelId, + TrueSkillUnauthorizedForJob, + TrueSkillInvalidScenarioName, + TrueSkillConditionStateIsRequired, + TrueSkillEventStateIsRequired, + TrueSkillDuplicateEvent, + TrueSkillDuplicateCondition, + TrueSkillInvalidAnomalyThreshold, + TrueSkillConditionKeyLimitExceeded, + TrueSkillConditionValuePerKeyLimitExceeded, + TrueSkillInvalidTimestamp, + TrueSkillEventLimitExceeded, + TrueSkillInvalidPlayers, + TrueSkillTrueSkillPlayerNull, + TrueSkillInvalidPlayerId, + TrueSkillInvalidSquadSize, + TrueSkillConditionSetNotInModel, + TrueSkillModelStateInvalidForOperation, + TrueSkillScenarioContainsActiveModel, + GameSaveManifestNotFound, + GameSaveManifestVersionAlreadyExists, + GameSaveConflictUpdatingManifest, + GameSaveManifestUpdatesNotAllowed, + GameSaveFileAlreadyExists, + GameSaveManifestVersionNotFinalized, + GameSaveUnknownFileInManifest, + GameSaveFileExceededReportedSize, + GameSaveFileNotUploaded, + GameSaveBadRequest, + GameSaveOperationNotAllowed, + StateShareForbidden, + StateShareTitleNotInFlight, + StateShareStateNotFound, + StateShareLinkNotFound, + StateShareStateRedemptionLimitExceeded, + StateShareStateRedemptionLimitNotUpdated, + StateShareCreatedStatesLimitExceeded, + StateShareIdMissingOrMalformed + } + + [Serializable] + public class GetActionsOnPlayersInSegmentTaskInstanceResult : PlayFabResultCommon + { + /// + /// Parameter of this task instance + /// + public ActionsOnPlayersInSegmentTaskParameter Parameter; + /// + /// Status summary of the actions-on-players-in-segment task instance + /// + public ActionsOnPlayersInSegmentTaskSummary Summary; + } + + /// + /// Request has no paramaters. + /// + [Serializable] + public class GetAllSegmentsRequest : PlayFabRequestCommon + { + } + + [Serializable] + public class GetAllSegmentsResult : PlayFabResultCommon + { + /// + /// Array of segments for this title. + /// + public List Segments; + } + + [Serializable] + public class GetCatalogItemsRequest : PlayFabRequestCommon + { + /// + /// Which catalog is being requested. If null, uses the default catalog. + /// + public string CatalogVersion; + } + + [Serializable] + public class GetCatalogItemsResult : PlayFabResultCommon + { + /// + /// Array of items which can be purchased. + /// + public List Catalog; + } + + [Serializable] + public class GetCloudScriptRevisionRequest : PlayFabRequestCommon + { + /// + /// Revision number. If left null, defaults to the latest revision + /// + public int? Revision; + /// + /// Version number. If left null, defaults to the latest version + /// + public int? Version; + } + + [Serializable] + public class GetCloudScriptRevisionResult : PlayFabResultCommon + { + /// + /// Time this revision was created + /// + public DateTime CreatedAt; + /// + /// List of Cloud Script files in this revision. + /// + public List Files; + /// + /// True if this is the currently published revision + /// + public bool IsPublished; + /// + /// Revision number. + /// + public int Revision; + /// + /// Version number. + /// + public int Version; + } + + [Serializable] + public class GetCloudScriptTaskInstanceResult : PlayFabResultCommon + { + /// + /// Parameter of this task instance + /// + public CloudScriptTaskParameter Parameter; + /// + /// Status summary of the CloudScript task instance + /// + public CloudScriptTaskSummary Summary; + } + + [Serializable] + public class GetCloudScriptVersionsRequest : PlayFabRequestCommon + { + } + + [Serializable] + public class GetCloudScriptVersionsResult : PlayFabResultCommon + { + /// + /// List of versions + /// + public List Versions; + } + + [Serializable] + public class GetContentListRequest : PlayFabRequestCommon + { + /// + /// Limits the response to keys that begin with the specified prefix. You can use prefixes to list contents under a folder, + /// or for a specified version, etc. + /// + public string Prefix; + } + + [Serializable] + public class GetContentListResult : PlayFabResultCommon + { + /// + /// List of content items. + /// + public List Contents; + /// + /// Number of content items returned. We currently have a maximum of 1000 items limit. + /// + public int ItemCount; + /// + /// The total size of listed contents in bytes. + /// + public uint TotalSize; + } + + [Serializable] + public class GetContentUploadUrlRequest : PlayFabRequestCommon + { + /// + /// A standard MIME type describing the format of the contents. The same MIME type has to be set in the header when + /// uploading the content. If not specified, the MIME type is 'binary/octet-stream' by default. + /// + public string ContentType; + /// + /// Key of the content item to upload, usually formatted as a path, e.g. images/a.png + /// + public string Key; + } + + [Serializable] + public class GetContentUploadUrlResult : PlayFabResultCommon + { + /// + /// URL for uploading content via HTTP PUT method. The URL requires the 'x-ms-blob-type' header to have the value + /// 'BlockBlob'. The URL will expire in approximately one hour. + /// + public string URL; + } + + /// + /// Gets the download URL for the requested report data (in CSV form). The reports available through this API call are those + /// available in the Game Manager, in the Analytics->Reports tab. + /// + [Serializable] + public class GetDataReportRequest : PlayFabRequestCommon + { + /// + /// Reporting year (UTC) + /// + public int Day; + /// + /// Reporting month (UTC) + /// + public int Month; + /// + /// Report name + /// + public string ReportName; + /// + /// Reporting year (UTC) + /// + public int Year; + } + + [Serializable] + public class GetDataReportResult : PlayFabResultCommon + { + /// + /// The URL where the requested report can be downloaded. This can be any PlayFab generated reports. The full list of + /// reports can be found at: https://docs.microsoft.com/en-us/gaming/playfab/features/analytics/reports/quickstart. + /// + public string DownloadUrl; + } + + /// + /// Useful for identifying titles of which the player's data will be deleted by DeleteMasterPlayer. + /// + [Serializable] + public class GetPlayedTitleListRequest : PlayFabRequestCommon + { + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class GetPlayedTitleListResult : PlayFabResultCommon + { + /// + /// List of titles the player has played + /// + public List TitleIds; + } + + /// + /// Gets a player ID from an auth token. The token expires after 30 minutes and cannot be used to look up a player when + /// expired. + /// + [Serializable] + public class GetPlayerIdFromAuthTokenRequest : PlayFabRequestCommon + { + /// + /// The auth token of the player requesting the password reset. + /// + public string Token; + /// + /// The type of auth token of the player requesting the password reset. + /// + public AuthTokenType TokenType; + } + + [Serializable] + public class GetPlayerIdFromAuthTokenResult : PlayFabResultCommon + { + /// + /// The player ID from the token passed in + /// + public string PlayFabId; + } + + /// + /// This API allows for access to details regarding a user in the PlayFab service, usually for purposes of customer support. + /// Note that data returned may be Personally Identifying Information (PII), such as email address, and so care should be + /// taken in how this data is stored and managed. Since this call will always return the relevant information for users who + /// have accessed the title, the recommendation is to not store this data locally. + /// + [Serializable] + public class GetPlayerProfileRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + /// + /// If non-null, this determines which properties of the resulting player profiles to return. For API calls from the client, + /// only the allowed client profile properties for the title may be requested. These allowed properties are configured in + /// the Game Manager "Client Profile Options" tab in the "Settings" section. + /// + public PlayerProfileViewConstraints ProfileConstraints; + } + + [Serializable] + public class GetPlayerProfileResult : PlayFabResultCommon + { + /// + /// The profile of the player. This profile is not guaranteed to be up-to-date. For a new player, this profile will not + /// exist. + /// + public PlayerProfileModel PlayerProfile; + } + + [Serializable] + public class GetPlayerSegmentsResult : PlayFabResultCommon + { + /// + /// Array of segments the requested player currently belongs to. + /// + public List Segments; + } + + /// + /// Player Shared Secret Keys are used for the call to Client/GetTitlePublicKey, which exchanges the shared secret for an + /// RSA CSP blob to be used to encrypt the payload of account creation requests when that API requires a signature header. + /// + [Serializable] + public class GetPlayerSharedSecretsRequest : PlayFabRequestCommon + { + } + + [Serializable] + public class GetPlayerSharedSecretsResult : PlayFabResultCommon + { + /// + /// The player shared secret to use when calling Client/GetTitlePublicKey + /// + public List SharedSecrets; + } + + /// + /// Request must contain the ExportId + /// + [Serializable] + public class GetPlayersInSegmentExportRequest : PlayFabRequestCommon + { + /// + /// Unique identifier of the export for the requested Segment. + /// + public string ExportId; + } + + [Serializable] + public class GetPlayersInSegmentExportResponse : PlayFabResultCommon + { + /// + /// Url from which the index file can be downloaded. + /// + public string IndexUrl; + /// + /// Shows the current status of the export + /// + public string State; + } + + /// + /// Initial request must contain at least a Segment ID. Subsequent requests must contain the Segment ID as well as the + /// Continuation Token. Failure to send the Continuation Token will result in a new player segment list being generated. + /// Each time the Continuation Token is passed in the length of the Total Seconds to Live is refreshed. If too much time + /// passes between requests to the point that a subsequent request is past the Total Seconds to Live an error will be + /// returned and paging will be terminated. This API is resource intensive and should not be used in scenarios which might + /// generate high request volumes. Only one request to this API at a time should be made per title. Concurrent requests to + /// the API may be rejected with the APIConcurrentRequestLimitExceeded error. + /// + [Serializable] + public class GetPlayersInSegmentRequest : PlayFabRequestCommon + { + /// + /// Continuation token if retrieving subsequent pages of results. + /// + public string ContinuationToken; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// If set to true, the profiles are loaded asynchronously and the response will include a continuation token and + /// approximate profile count until the first batch of profiles is loaded. Use this parameter to help avoid network + /// timeouts. + /// + public bool? GetProfilesAsync; + /// + /// Maximum is 10,000. The value 0 will prevent loading any profiles and return only the count of profiles matching this + /// segment. + /// + public uint? MaxBatchSize; + /// + /// Number of seconds to keep the continuation token active. After token expiration it is not possible to continue paging + /// results. Default is 300 (5 minutes). Maximum is 5,400 (90 minutes). + /// + public uint? SecondsToLive; + /// + /// Unique identifier for this segment. + /// + public string SegmentId; + } + + [Serializable] + public class GetPlayersInSegmentResult : PlayFabResultCommon + { + /// + /// Continuation token to use to retrieve subsequent pages of results. If token returns null there are no more results. + /// + public string ContinuationToken; + /// + /// Array of player profiles in this segment. + /// + public List PlayerProfiles; + /// + /// Count of profiles matching this segment. + /// + public int ProfilesInSegment; + } + + [Serializable] + public class GetPlayersSegmentsRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class GetPlayerStatisticDefinitionsRequest : PlayFabRequestCommon + { + } + + /// + /// Statistics are numeric values, with each statistic in the title also generating a leaderboard. The ResetInterval defines + /// the period of time at which the leaderboard for the statistic will automatically reset. Upon reset, the statistic + /// updates to a new version with no values (effectively removing all players from the leaderboard). The previous version's + /// statistic values are also archived for retrieval, if needed (see GetPlayerStatisticVersions). Statistics not created via + /// a call to CreatePlayerStatisticDefinition by default have a VersionChangeInterval of Never, meaning they do not reset on + /// a schedule, but they can be set to do so via a call to UpdatePlayerStatisticDefinition. Once a statistic has been reset + /// (sometimes referred to as versioned or incremented), the previous version can still be written to for up a short, + /// pre-defined period (currently 10 seconds), to prevent issues with levels completing around the time of the reset. Also, + /// once reset, the historical statistics for players in the title may be retrieved using the URL specified in the version + /// information (GetPlayerStatisticVersions). The AggregationMethod defines what action is taken when a new statistic value + /// is submitted - always update with the new value (Last), use the highest of the old and new values (Max), use the + /// smallest (Min), or add them together (Sum). + /// + [Serializable] + public class GetPlayerStatisticDefinitionsResult : PlayFabResultCommon + { + /// + /// the player statistic definitions for the title + /// + public List Statistics; + } + + [Serializable] + public class GetPlayerStatisticVersionsRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// unique name of the statistic + /// + public string StatisticName; + } + + /// + /// Statistics are numeric values, with each statistic in the title also generating a leaderboard. The information returned + /// in the results defines the state of a specific version of a statistic, including when it was or will become the + /// currently active version, when it will (or did) become a previous version, and its archival state if it is no longer the + /// active version. For a statistic which has been reset, once the archival status is Complete, the full set of statistics + /// for all players in the leaderboard for that version may be retrieved via the ArchiveDownloadUrl. Statistics which have + /// not been reset (incremented/versioned) will only have a single version which is not scheduled to reset. + /// + [Serializable] + public class GetPlayerStatisticVersionsResult : PlayFabResultCommon + { + /// + /// version change history of the statistic + /// + public List StatisticVersions; + } + + /// + /// This API will return a list of canonical tags which includes both namespace and tag's name. If namespace is not + /// provided, the result is a list of all canonical tags. TagName can be used for segmentation and Namespace is limited to + /// 128 characters. + /// + [Serializable] + public class GetPlayerTagsRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Optional namespace to filter results by + /// + public string Namespace; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class GetPlayerTagsResult : PlayFabResultCommon + { + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + /// + /// Canonical tags (including namespace and tag's name) for the requested user + /// + public List Tags; + } + + /// + /// Views the requested policy. Today, the only supported policy is 'ApiPolicy'. + /// + [Serializable] + public class GetPolicyRequest : PlayFabRequestCommon + { + /// + /// The name of the policy to read. Only supported name is 'ApiPolicy'. + /// + public string PolicyName; + } + + [Serializable] + public class GetPolicyResponse : PlayFabResultCommon + { + /// + /// The name of the policy read. + /// + public string PolicyName; + /// + /// Policy version. + /// + public int PolicyVersion; + /// + /// The statements in the requested policy. + /// + public List Statements; + } + + /// + /// This API is designed to return publisher-specific values which can be read, but not written to, by the client. This data + /// is shared across all titles assigned to a particular publisher, and can be used for cross-game coordination. Only titles + /// assigned to a publisher can use this API. For more information email helloplayfab@microsoft.com. This AdminAPI call for + /// getting title data guarantees no delay in between update and retrieval of newly set data. + /// + [Serializable] + public class GetPublisherDataRequest : PlayFabRequestCommon + { + /// + /// array of keys to get back data from the Publisher data blob, set by the admin tools + /// + public List Keys; + } + + [Serializable] + public class GetPublisherDataResult : PlayFabResultCommon + { + /// + /// a dictionary object of key / value pairs + /// + public Dictionary Data; + } + + [Serializable] + public class GetRandomResultTablesRequest : PlayFabRequestCommon + { + /// + /// catalog version to fetch tables from. Use default catalog version if null + /// + public string CatalogVersion; + } + + [Serializable] + public class GetRandomResultTablesResult : PlayFabResultCommon + { + /// + /// array of random result tables currently available + /// + public Dictionary Tables; + } + + [Serializable] + public class GetSegmentResult : PlayFabBaseModel + { + /// + /// Identifier of the segments AB Test, if it is attached to one. + /// + public string ABTestParent; + /// + /// Unique identifier for this segment. + /// + public string Id; + /// + /// Segment name. + /// + public string Name; + } + + /// + /// Given input segment ids, return list of segments. + /// + [Serializable] + public class GetSegmentsRequest : PlayFabRequestCommon + { + /// + /// Segment ids to filter title segments. + /// + public List SegmentIds; + } + + [Serializable] + public class GetSegmentsResponse : PlayFabResultCommon + { + /// + /// Error message. + /// + public string ErrorMessage; + /// + /// List of title segments. + /// + public List Segments; + } + + /// + /// A store contains an array of references to items defined in the catalog, along with the prices for the item, in both + /// real world and virtual currencies. These prices act as an override to any prices defined in the catalog. In this way, + /// the base definitions of the items may be defined in the catalog, with all associated properties, while the pricing can + /// be set for each store, as needed. This allows for subsets of goods to be defined for different purposes (in order to + /// simplify showing some, but not all catalog items to users, based upon different characteristics), along with unique + /// prices. Note that all prices defined in the catalog and store definitions for the item are considered valid, and that a + /// compromised client can be made to send a request for an item based upon any of these definitions. If no price is + /// specified in the store for an item, the price set in the catalog should be displayed to the user. + /// + [Serializable] + public class GetStoreItemsRequest : PlayFabRequestCommon + { + /// + /// Catalog version to store items from. Use default catalog version if null + /// + public string CatalogVersion; + /// + /// Unqiue identifier for the store which is being requested. + /// + public string StoreId; + } + + [Serializable] + public class GetStoreItemsResult : PlayFabResultCommon + { + /// + /// The base catalog that this store is a part of. + /// + public string CatalogVersion; + /// + /// Additional data about the store. + /// + public StoreMarketingModel MarketingData; + /// + /// How the store was last updated (Admin or a third party). + /// + public SourceType? Source; + /// + /// Array of items which can be purchased from this store. + /// + public List Store; + /// + /// The ID of this store. + /// + public string StoreId; + } + + /// + /// The result includes detail information that's specific to a CloudScript task. Only CloudScript tasks configured as "Run + /// Cloud Script function once" will be retrieved. To get a list of task instances by task, status, or time range, use + /// GetTaskInstances. + /// + [Serializable] + public class GetTaskInstanceRequest : PlayFabRequestCommon + { + /// + /// ID of the requested task instance. + /// + public string TaskInstanceId; + } + + /// + /// Only the most recent 100 task instances are returned, ordered by start time descending. The results are generic basic + /// information for task instances. To get detail information specific to each task type, use Get*TaskInstance based on its + /// corresponding task type. + /// + [Serializable] + public class GetTaskInstancesRequest : PlayFabRequestCommon + { + /// + /// Optional range-from filter for task instances' StartedAt timestamp. + /// + public DateTime? StartedAtRangeFrom; + /// + /// Optional range-to filter for task instances' StartedAt timestamp. + /// + public DateTime? StartedAtRangeTo; + /// + /// Optional filter for task instances that are of a specific status. + /// + public TaskInstanceStatus? StatusFilter; + /// + /// Name or ID of the task whose instances are being queried. If not specified, return all task instances that satisfy + /// conditions set by other filters. + /// + public NameIdentifier TaskIdentifier; + } + + [Serializable] + public class GetTaskInstancesResult : PlayFabResultCommon + { + /// + /// Basic status summaries of the queried task instances. Empty If no task instances meets the filter criteria. To get + /// detailed status summary, use Get*TaskInstance API according to task type (e.g. + /// GetActionsOnPlayersInSegmentTaskInstance). + /// + public List Summaries; + } + + [Serializable] + public class GetTasksRequest : PlayFabRequestCommon + { + /// + /// Provide either the task ID or the task name to get a specific task. If not specified, return all defined tasks. + /// + public NameIdentifier Identifier; + } + + [Serializable] + public class GetTasksResult : PlayFabResultCommon + { + /// + /// Result tasks. Empty if there is no task found. + /// + public List Tasks; + } + + /// + /// This API method is designed to return title specific values which can be read by the client. For example, a developer + /// could choose to store values which modify the user experience, such as enemy spawn rates, weapon strengths, movement + /// speeds, etc. This allows a developer to update the title without the need to create, test, and ship a new build. If an + /// override label is specified in the request, the overrides are applied automatically and returned with the title data. + /// Note that due to caching, there may up to a minute delay in between updating title data and a query returning the newest + /// value. + /// + [Serializable] + public class GetTitleDataRequest : PlayFabRequestCommon + { + /// + /// Specific keys to search for in the title data (leave null to get all keys) + /// + public List Keys; + /// + /// Optional field that specifies the name of an override. This value is ignored when used by the game client; otherwise, + /// the overrides are applied automatically to the title data. + /// + public string OverrideLabel; + } + + [Serializable] + public class GetTitleDataResult : PlayFabResultCommon + { + /// + /// a dictionary object of key / value pairs + /// + public Dictionary Data; + } + + /// + /// Get all bans for a user, including inactive and expired bans. + /// + [Serializable] + public class GetUserBansRequest : PlayFabRequestCommon + { + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class GetUserBansResult : PlayFabResultCommon + { + /// + /// Information about the bans + /// + public List BanData; + } + + /// + /// Data is stored as JSON key-value pairs. If the Keys parameter is provided, the data object returned will only contain + /// the data specific to the indicated Keys. Otherwise, the full set of custom user data will be returned. + /// + [Serializable] + public class GetUserDataRequest : PlayFabRequestCommon + { + /// + /// The version that currently exists according to the caller. The call will return the data for all of the keys if the + /// version in the system is greater than this. + /// + public uint? IfChangedFromDataVersion; + /// + /// Specific keys to search for in the custom user data. + /// + public List Keys; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class GetUserDataResult : PlayFabResultCommon + { + /// + /// User specific data for this title. + /// + public Dictionary Data; + /// + /// Indicates the current version of the data that has been set. This is incremented with every set call for that type of + /// data (read-only, internal, etc). This version can be provided in Get calls to find updated data. + /// + public uint DataVersion; + /// + /// PlayFab unique identifier of the user whose custom data is being returned. + /// + public string PlayFabId; + } + + /// + /// All items currently in the user inventory will be returned, irrespective of how they were acquired (via purchasing, + /// grants, coupons, etc.). Items that are expired, fully consumed, or are no longer valid are not considered to be in the + /// user's current inventory, and so will not be not included. There can be a delay of up to a half a second for inventory + /// changes to be reflected in the GetUserInventory API response. + /// + [Serializable] + public class GetUserInventoryRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class GetUserInventoryResult : PlayFabResultCommon + { + /// + /// Array of inventory items belonging to the user. + /// + public List Inventory; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + /// + /// Array of virtual currency balance(s) belonging to the user. + /// + public Dictionary VirtualCurrency; + /// + /// Array of remaining times and timestamps for virtual currencies. + /// + public Dictionary VirtualCurrencyRechargeTimes; + } + + /// + /// Result of granting an item to a user. Note, to retrieve additional information for an item such as Tags, Description + /// that are the same across all instances of the item, a call to GetCatalogItems is required. The ItemID of can be matched + /// to a catalog entry, which contains the additional information. Also note that Custom Data is only set when the User's + /// specific instance has updated the CustomData via a call to UpdateUserInventoryItemCustomData. Other fields such as + /// UnitPrice and UnitCurrency are only set when the item was granted via a purchase. + /// + [Serializable] + public class GrantedItemInstance : PlayFabBaseModel + { + /// + /// Game specific comment associated with this instance when it was added to the user inventory. + /// + public string Annotation; + /// + /// Array of unique items that were awarded when this catalog item was purchased. + /// + public List BundleContents; + /// + /// Unique identifier for the parent inventory item, as defined in the catalog, for object which were added from a bundle or + /// container. + /// + public string BundleParent; + /// + /// Catalog version for the inventory item, when this instance was created. + /// + public string CatalogVersion; + /// + /// Unique PlayFab assigned ID for a specific character owned by a user + /// + public string CharacterId; + /// + /// A set of custom key-value pairs on the instance of the inventory item, which is not to be confused with the catalog + /// item's custom data. + /// + public Dictionary CustomData; + /// + /// CatalogItem.DisplayName at the time this item was purchased. + /// + public string DisplayName; + /// + /// Timestamp for when this instance will expire. + /// + public DateTime? Expiration; + /// + /// Class name for the inventory item, as defined in the catalog. + /// + public string ItemClass; + /// + /// Unique identifier for the inventory item, as defined in the catalog. + /// + public string ItemId; + /// + /// Unique item identifier for this specific instance of the item. + /// + public string ItemInstanceId; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + /// + /// Timestamp for when this instance was purchased. + /// + public DateTime? PurchaseDate; + /// + /// Total number of remaining uses, if this is a consumable item. + /// + public int? RemainingUses; + /// + /// Result of this operation. + /// + public bool Result; + /// + /// Currency type for the cost of the catalog item. Not available when granting items. + /// + public string UnitCurrency; + /// + /// Cost of the catalog item in the given currency. Not available when granting items. + /// + public uint UnitPrice; + /// + /// The number of uses that were added or removed to this item in this call. + /// + public int? UsesIncrementedBy; + } + + [Serializable] + public class GrantItemContent : PlayFabBaseModel + { + /// + /// The catalog version of the item to be granted to the player + /// + public string CatalogVersion; + /// + /// The id of item to be granted to the player + /// + public string ItemId; + /// + /// Quantity of the item to be granted to a player + /// + public int ItemQuantity; + } + + [Serializable] + public class GrantItemSegmentAction : PlayFabBaseModel + { + /// + /// Item catalog id. + /// + public string CatelogId; + /// + /// Item id. + /// + public string ItemId; + /// + /// Item quantity. + /// + public uint Quantity; + } + + /// + /// This function directly adds inventory items to user inventories. As a result of this operations, the user will not be + /// charged any transaction fee, regardless of the inventory item catalog definition. Please note that the processing time + /// for inventory grants and purchases increases fractionally the more items are in the inventory, and the more items are in + /// the grant/purchase operation. + /// + [Serializable] + public class GrantItemsToUsersRequest : PlayFabRequestCommon + { + /// + /// Catalog version from which items are to be granted. + /// + public string CatalogVersion; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Array of items to grant and the users to whom the items are to be granted. + /// + public List ItemGrants; + } + + /// + /// Please note that the order of the items in the response may not match the order of items in the request. + /// + [Serializable] + public class GrantItemsToUsersResult : PlayFabResultCommon + { + /// + /// Array of items granted to users. + /// + public List ItemGrantResults; + } + + [Serializable] + public class GrantVirtualCurrencyContent : PlayFabBaseModel + { + /// + /// Amount of currency to be granted to a player + /// + public int CurrencyAmount; + /// + /// Code of the currency to be granted to a player + /// + public string CurrencyCode; + } + + [Serializable] + public class GrantVirtualCurrencySegmentAction : PlayFabBaseModel + { + /// + /// Virtual currency amount. + /// + public int Amount; + /// + /// Virtual currency code. + /// + public string CurrencyCode; + } + + /// + /// This operation will increment the global counter for the number of these items available. This number cannot be + /// decremented, except by actual grants. + /// + [Serializable] + public class IncrementLimitedEditionItemAvailabilityRequest : PlayFabRequestCommon + { + /// + /// Amount to increase availability by. + /// + public int Amount; + /// + /// Which catalog is being updated. If null, uses the default catalog. + /// + public string CatalogVersion; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The item which needs more availability. + /// + public string ItemId; + } + + [Serializable] + public class IncrementLimitedEditionItemAvailabilityResult : PlayFabResultCommon + { + } + + [Serializable] + public class IncrementPlayerStatisticContent : PlayFabBaseModel + { + /// + /// Amount(in whole number) to increase the player statistic by + /// + public int StatisticChangeBy; + /// + /// Name of the player statistic to be incremented + /// + public string StatisticName; + } + + [Serializable] + public class IncrementPlayerStatisticSegmentAction : PlayFabBaseModel + { + /// + /// Increment value. + /// + public int IncrementValue; + /// + /// Statistic name. + /// + public string StatisticName; + } + + /// + /// Statistics are numeric values, with each statistic in the title also generating a leaderboard. When this call is made on + /// a given statistic, this forces a reset of that statistic. Upon reset, the statistic updates to a new version with no + /// values (effectively removing all players from the leaderboard). The previous version's statistic values are also + /// archived for retrieval, if needed (see GetPlayerStatisticVersions). Statistics not created via a call to + /// CreatePlayerStatisticDefinition by default have a VersionChangeInterval of Never, meaning they do not reset on a + /// schedule, but they can be set to do so via a call to UpdatePlayerStatisticDefinition. Once a statistic has been reset + /// (sometimes referred to as versioned or incremented), the now-previous version can still be written to for up a short, + /// pre-defined period (currently 10 seconds), to prevent issues with levels completing around the time of the reset. Also, + /// once reset, the historical statistics for players in the title may be retrieved using the URL specified in the version + /// information (GetPlayerStatisticVersions). + /// + [Serializable] + public class IncrementPlayerStatisticVersionRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// unique name of the statistic + /// + public string StatisticName; + } + + [Serializable] + public class IncrementPlayerStatisticVersionResult : PlayFabResultCommon + { + /// + /// version change history of the statistic + /// + public PlayerStatisticVersion StatisticVersion; + } + + [Serializable] + public class InsightsScalingTaskParameter : PlayFabBaseModel + { + /// + /// Insights Performance Level to scale to. + /// + public int Level; + } + + [Serializable] + public class ItemGrant : PlayFabBaseModel + { + /// + /// String detailing any additional information concerning this operation. + /// + public string Annotation; + /// + /// Unique PlayFab assigned ID for a specific character owned by a user + /// + public string CharacterId; + /// + /// Key-value pairs to be written to the custom data. Note that keys are trimmed of whitespace, are limited in size, and may + /// not begin with a '!' character or be null. + /// + public Dictionary Data; + /// + /// Unique identifier of the catalog item to be granted to the user. + /// + public string ItemId; + /// + /// Optional list of Data-keys to remove from UserData. Some SDKs cannot insert null-values into Data due to language + /// constraints. Use this to delete the keys directly. + /// + public List KeysToRemove; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + /// + /// A unique instance of an item in a user's inventory. Note, to retrieve additional information for an item such as Tags, + /// Description that are the same across all instances of the item, a call to GetCatalogItems is required. The ItemID of can + /// be matched to a catalog entry, which contains the additional information. Also note that Custom Data is only set when + /// the User's specific instance has updated the CustomData via a call to UpdateUserInventoryItemCustomData. Other fields + /// such as UnitPrice and UnitCurrency are only set when the item was granted via a purchase. + /// + [Serializable] + public class ItemInstance : PlayFabBaseModel + { + /// + /// Game specific comment associated with this instance when it was added to the user inventory. + /// + public string Annotation; + /// + /// Array of unique items that were awarded when this catalog item was purchased. + /// + public List BundleContents; + /// + /// Unique identifier for the parent inventory item, as defined in the catalog, for object which were added from a bundle or + /// container. + /// + public string BundleParent; + /// + /// Catalog version for the inventory item, when this instance was created. + /// + public string CatalogVersion; + /// + /// A set of custom key-value pairs on the instance of the inventory item, which is not to be confused with the catalog + /// item's custom data. + /// + public Dictionary CustomData; + /// + /// CatalogItem.DisplayName at the time this item was purchased. + /// + public string DisplayName; + /// + /// Timestamp for when this instance will expire. + /// + public DateTime? Expiration; + /// + /// Class name for the inventory item, as defined in the catalog. + /// + public string ItemClass; + /// + /// Unique identifier for the inventory item, as defined in the catalog. + /// + public string ItemId; + /// + /// Unique item identifier for this specific instance of the item. + /// + public string ItemInstanceId; + /// + /// Timestamp for when this instance was purchased. + /// + public DateTime? PurchaseDate; + /// + /// Total number of remaining uses, if this is a consumable item. + /// + public int? RemainingUses; + /// + /// Currency type for the cost of the catalog item. Not available when granting items. + /// + public string UnitCurrency; + /// + /// Cost of the catalog item in the given currency. Not available when granting items. + /// + public uint UnitPrice; + /// + /// The number of uses that were added or removed to this item in this call. + /// + public int? UsesIncrementedBy; + } + + [Serializable] + public class LastLoginDateSegmentFilter : PlayFabBaseModel + { + /// + /// Last player login date comparison. + /// + public SegmentFilterComparison? Comparison; + /// + /// Last player login date. + /// + public DateTime LogInDate; + } + + [Serializable] + public class LastLoginTimespanSegmentFilter : PlayFabBaseModel + { + /// + /// Last player login duration comparison. + /// + public SegmentFilterComparison? Comparison; + /// + /// Last player login duration. + /// + public double DurationInMinutes; + } + + [Serializable] + public class LinkedPlatformAccountModel : PlayFabBaseModel + { + /// + /// Linked account email of the user on the platform, if available + /// + public string Email; + /// + /// Authentication platform + /// + public LoginIdentityProvider? Platform; + /// + /// Unique account identifier of the user on the platform + /// + public string PlatformUserId; + /// + /// Linked account username of the user on the platform, if available + /// + public string Username; + } + + [Serializable] + public class LinkedUserAccountHasEmailSegmentFilter : PlayFabBaseModel + { + /// + /// Login provider comparison. + /// + public SegmentFilterComparison? Comparison; + /// + /// Login provider. + /// + public SegmentLoginIdentityProvider? LoginProvider; + } + + [Serializable] + public class LinkedUserAccountSegmentFilter : PlayFabBaseModel + { + /// + /// Login provider. + /// + public SegmentLoginIdentityProvider? LoginProvider; + } + + [Serializable] + public class ListOpenIdConnectionRequest : PlayFabRequestCommon + { + } + + [Serializable] + public class ListOpenIdConnectionResponse : PlayFabResultCommon + { + /// + /// The list of Open ID Connections + /// + public List Connections; + } + + [Serializable] + public class ListVirtualCurrencyTypesRequest : PlayFabRequestCommon + { + } + + [Serializable] + public class ListVirtualCurrencyTypesResult : PlayFabResultCommon + { + /// + /// List of virtual currency names defined for this title + /// + public List VirtualCurrencies; + } + + [Serializable] + public class LocationModel : PlayFabBaseModel + { + /// + /// City name. + /// + public string City; + /// + /// The two-character continent code for this location + /// + public ContinentCode? ContinentCode; + /// + /// The two-character ISO 3166-1 country code for the country associated with the location + /// + public CountryCode? CountryCode; + /// + /// Latitude coordinate of the geographic location. + /// + public double? Latitude; + /// + /// Longitude coordinate of the geographic location. + /// + public double? Longitude; + } + + [Serializable] + public class LocationSegmentFilter : PlayFabBaseModel + { + /// + /// Segment country code. + /// + public SegmentCountryCode? CountryCode; + } + + public enum LoginIdentityProvider + { + Unknown, + PlayFab, + Custom, + GameCenter, + GooglePlay, + Steam, + XBoxLive, + PSN, + Kongregate, + Facebook, + IOSDevice, + AndroidDevice, + Twitch, + WindowsHello, + GameServer, + CustomServer, + NintendoSwitch, + FacebookInstantGames, + OpenIdConnect, + Apple, + NintendoSwitchAccount, + GooglePlayGames, + XboxMobileStore, + King + } + + [Serializable] + public class LogStatement : PlayFabBaseModel + { + /// + /// Optional object accompanying the message as contextual information + /// + public object Data; + /// + /// 'Debug', 'Info', or 'Error' + /// + public string Level; + public string Message; + } + + /// + /// This API allows for access to details regarding a user in the PlayFab service, usually for purposes of customer support. + /// Note that data returned may be Personally Identifying Information (PII), such as email address, and so care should be + /// taken in how this data is stored and managed. Since this call will always return the relevant information for users who + /// have accessed the title, the recommendation is to not store this data locally. + /// + [Serializable] + public class LookupUserAccountInfoRequest : PlayFabRequestCommon + { + /// + /// User email address attached to their account + /// + public string Email; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + /// + /// Title specific username to match against existing user accounts + /// + public string TitleDisplayName; + /// + /// PlayFab username for the account (3-20 characters) + /// + public string Username; + } + + [Serializable] + public class LookupUserAccountInfoResult : PlayFabResultCommon + { + /// + /// User info for the user matching the request + /// + public UserAccountInfo UserInfo; + } + + [Serializable] + public class MembershipModel : PlayFabBaseModel + { + /// + /// Whether this membership is active. That is, whether the MembershipExpiration time has been reached. + /// + public bool IsActive; + /// + /// The time this membership expires + /// + public DateTime MembershipExpiration; + /// + /// The id of the membership + /// + public string MembershipId; + /// + /// Membership expirations can be explicitly overridden (via game manager or the admin api). If this membership has been + /// overridden, this will be the new expiration time. + /// + public DateTime? OverrideExpiration; + /// + /// The list of subscriptions that this player has for this membership + /// + public List Subscriptions; + } + + [Serializable] + public class ModifyUserVirtualCurrencyResult : PlayFabResultCommon + { + /// + /// Balance of the virtual currency after modification. + /// + public int Balance; + /// + /// Amount added or subtracted from the user's virtual currency. Maximum VC balance is Int32 (2,147,483,647). Any increase + /// over this value will be discarded. + /// + public int BalanceChange; + /// + /// User currency was subtracted from. + /// + public string PlayFabId; + /// + /// Name of the virtual currency which was modified. + /// + public string VirtualCurrency; + } + + /// + /// Identifier by either name or ID. Note that a name may change due to renaming, or reused after being deleted. ID is + /// immutable and unique. + /// + [Serializable] + public class NameIdentifier : PlayFabBaseModel + { + /// + /// Id Identifier, if present + /// + public string Id; + /// + /// Name Identifier, if present + /// + public string Name; + } + + [Serializable] + public class OpenIdConnection : PlayFabBaseModel + { + /// + /// The client ID given by the ID provider. + /// + public string ClientId; + /// + /// The client secret given by the ID provider. + /// + public string ClientSecret; + /// + /// A name for the connection to identify it within the title. + /// + public string ConnectionId; + /// + /// Shows if data about the connection will be loaded from the issuer's discovery document + /// + public bool DiscoverConfiguration; + /// + /// Ignore 'nonce' claim in identity tokens. + /// + public bool? IgnoreNonce; + /// + /// Information for an OpenID Connect provider. + /// + public OpenIdIssuerInformation IssuerInformation; + /// + /// Override the issuer name for user indexing and lookup. + /// + public string IssuerOverride; + } + + [Serializable] + public class OpenIdIssuerInformation : PlayFabBaseModel + { + /// + /// Authorization endpoint URL to direct users to for signin. + /// + public string AuthorizationUrl; + /// + /// The URL of the issuer of the tokens. This must match the exact URL of the issuer field in tokens. + /// + public string Issuer; + /// + /// JSON Web Key Set for validating the signature of tokens. + /// + public object JsonWebKeySet; + /// + /// Token endpoint URL for code verification. + /// + public string TokenUrl; + } + + [Serializable] + public class PermissionStatement : PlayFabBaseModel + { + /// + /// The action this statement effects. The only supported action is 'Execute'. + /// + public string Action; + /// + /// Additional conditions to be applied for API Resources. + /// + public ApiCondition ApiConditions; + /// + /// A comment about the statement. Intended solely for bookkeeping and debugging. + /// + public string Comment; + /// + /// The effect this statement will have. It could be either Allow or Deny + /// + public EffectType Effect; + /// + /// The principal this statement will effect. The only supported principal is '*'. + /// + public string Principal; + /// + /// The resource this statements effects. The only supported resources look like 'pfrn:api--*' for all apis, or + /// 'pfrn:api--/Client/ConfirmPurchase' for specific apis. + /// + public string Resource; + } + + [Serializable] + public class PlayerChurnPredictionSegmentFilter : PlayFabBaseModel + { + /// + /// Comparison + /// + public SegmentFilterComparison? Comparison; + /// + /// RiskLevel + /// + public ChurnRiskLevel? RiskLevel; + } + + [Serializable] + public class PlayerChurnPredictionTimeSegmentFilter : PlayFabBaseModel + { + /// + /// Comparison + /// + public SegmentFilterComparison? Comparison; + /// + /// DurationInDays + /// + public double DurationInDays; + } + + [Serializable] + public class PlayerChurnPreviousPredictionSegmentFilter : PlayFabBaseModel + { + /// + /// Comparison + /// + public SegmentFilterComparison? Comparison; + /// + /// RiskLevel + /// + public ChurnRiskLevel? RiskLevel; + } + + [Serializable] + public class PlayerLinkedAccount : PlayFabBaseModel + { + /// + /// Linked account's email + /// + public string Email; + /// + /// Authentication platform + /// + public LoginIdentityProvider? Platform; + /// + /// Platform user identifier + /// + public string PlatformUserId; + /// + /// Linked account's username + /// + public string Username; + } + + [Serializable] + public class PlayerLocation : PlayFabBaseModel + { + /// + /// City of the player's geographic location. + /// + public string City; + /// + /// The two-character continent code for this location + /// + public ContinentCode ContinentCode; + /// + /// The two-character ISO 3166-1 country code for the country associated with the location + /// + public CountryCode CountryCode; + /// + /// Latitude coordinate of the player's geographic location. + /// + public double? Latitude; + /// + /// Longitude coordinate of the player's geographic location. + /// + public double? Longitude; + } + + [Serializable] + public class PlayerProfile : PlayFabBaseModel + { + /// + /// Array of ad campaigns player has been attributed to + /// + public List AdCampaignAttributions; + /// + /// Image URL of the player's avatar. + /// + public string AvatarUrl; + /// + /// Banned until UTC Date. If permanent ban this is set for 20 years after the original ban date. + /// + public DateTime? BannedUntil; + /// + /// The prediction of the player to churn within the next seven days. + /// + public ChurnRiskLevel? ChurnPrediction; + /// + /// Array of contact email addresses associated with the player + /// + public List ContactEmailAddresses; + /// + /// Player record created + /// + public DateTime? Created; + /// + /// Player Display Name + /// + public string DisplayName; + /// + /// Last login + /// + public DateTime? LastLogin; + /// + /// Array of third party accounts linked to this player + /// + public List LinkedAccounts; + /// + /// Dictionary of player's locations by type. + /// + public Dictionary Locations; + /// + /// Player account origination + /// + public LoginIdentityProvider? Origination; + /// + /// List of player variants for experimentation + /// + public List PlayerExperimentVariants; + /// + /// PlayFab Player ID + /// + public string PlayerId; + /// + /// Array of player statistics + /// + public List PlayerStatistics; + /// + /// Publisher this player belongs to + /// + public string PublisherId; + /// + /// Array of configured push notification end points + /// + public List PushNotificationRegistrations; + /// + /// Dictionary of player's statistics using only the latest version's value + /// + public Dictionary Statistics; + /// + /// List of player's tags for segmentation. + /// + public List Tags; + /// + /// Title ID this profile applies to + /// + public string TitleId; + /// + /// A sum of player's total purchases in USD across all currencies. + /// + public uint? TotalValueToDateInUSD; + /// + /// Dictionary of player's total purchases by currency. + /// + public Dictionary ValuesToDate; + /// + /// Dictionary of player's virtual currency balances + /// + public Dictionary VirtualCurrencyBalances; + } + + [Serializable] + public class PlayerProfileModel : PlayFabBaseModel + { + /// + /// List of advertising campaigns the player has been attributed to + /// + public List AdCampaignAttributions; + /// + /// URL of the player's avatar image + /// + public string AvatarUrl; + /// + /// If the player is currently banned, the UTC Date when the ban expires + /// + public DateTime? BannedUntil; + /// + /// List of all contact email info associated with the player account + /// + public List ContactEmailAddresses; + /// + /// Player record created + /// + public DateTime? Created; + /// + /// Player display name + /// + public string DisplayName; + /// + /// List of experiment variants for the player. Note that these variants are not guaranteed to be up-to-date when returned + /// during login because the player profile is updated only after login. Instead, use the LoginResult.TreatmentAssignment + /// property during login to get the correct variants and variables. + /// + public List ExperimentVariants; + /// + /// UTC time when the player most recently logged in to the title + /// + public DateTime? LastLogin; + /// + /// List of all authentication systems linked to this player account + /// + public List LinkedAccounts; + /// + /// List of geographic locations from which the player has logged in to the title + /// + public List Locations; + /// + /// List of memberships for the player, along with whether are expired. + /// + public List Memberships; + /// + /// Player account origination + /// + public LoginIdentityProvider? Origination; + /// + /// PlayFab player account unique identifier + /// + public string PlayerId; + /// + /// Publisher this player belongs to + /// + public string PublisherId; + /// + /// List of configured end points registered for sending the player push notifications + /// + public List PushNotificationRegistrations; + /// + /// List of leaderboard statistic values for the player + /// + public List Statistics; + /// + /// List of player's tags for segmentation + /// + public List Tags; + /// + /// Title ID this player profile applies to + /// + public string TitleId; + /// + /// Sum of the player's purchases made with real-money currencies, converted to US dollars equivalent and represented as a + /// whole number of cents (1/100 USD). For example, 999 indicates nine dollars and ninety-nine cents. + /// + public uint? TotalValueToDateInUSD; + /// + /// List of the player's lifetime purchase totals, summed by real-money currency + /// + public List ValuesToDate; + } + + [Serializable] + public class PlayerProfileViewConstraints : PlayFabBaseModel + { + /// + /// Whether to show player's avatar URL. Defaults to false + /// + public bool ShowAvatarUrl; + /// + /// Whether to show the banned until time. Defaults to false + /// + public bool ShowBannedUntil; + /// + /// Whether to show campaign attributions. Defaults to false + /// + public bool ShowCampaignAttributions; + /// + /// Whether to show contact email addresses. Defaults to false + /// + public bool ShowContactEmailAddresses; + /// + /// Whether to show the created date. Defaults to false + /// + public bool ShowCreated; + /// + /// Whether to show the display name. Defaults to false + /// + public bool ShowDisplayName; + /// + /// Whether to show player's experiment variants. Defaults to false + /// + public bool ShowExperimentVariants; + /// + /// Whether to show the last login time. Defaults to false + /// + public bool ShowLastLogin; + /// + /// Whether to show the linked accounts. Defaults to false + /// + public bool ShowLinkedAccounts; + /// + /// Whether to show player's locations. Defaults to false + /// + public bool ShowLocations; + /// + /// Whether to show player's membership information. Defaults to false + /// + public bool ShowMemberships; + /// + /// Whether to show origination. Defaults to false + /// + public bool ShowOrigination; + /// + /// Whether to show push notification registrations. Defaults to false + /// + public bool ShowPushNotificationRegistrations; + /// + /// Reserved for future development + /// + public bool ShowStatistics; + /// + /// Whether to show tags. Defaults to false + /// + public bool ShowTags; + /// + /// Whether to show the total value to date in usd. Defaults to false + /// + public bool ShowTotalValueToDateInUsd; + /// + /// Whether to show the values to date. Defaults to false + /// + public bool ShowValuesToDate; + } + + [Serializable] + public class PlayerStatistic : PlayFabBaseModel + { + /// + /// Statistic ID + /// + public string Id; + /// + /// Statistic name + /// + public string Name; + /// + /// Current statistic value + /// + public int StatisticValue; + /// + /// Statistic version (0 if not a versioned statistic) + /// + public int StatisticVersion; + } + + [Serializable] + public class PlayerStatisticDefinition : PlayFabBaseModel + { + /// + /// the aggregation method to use in updating the statistic (defaults to last) + /// + public StatisticAggregationMethod? AggregationMethod; + /// + /// current active version of the statistic, incremented each time the statistic resets + /// + public uint CurrentVersion; + /// + /// unique name of the statistic + /// + public string StatisticName; + /// + /// interval at which the values of the statistic for all players are reset automatically + /// + public StatisticResetIntervalOption? VersionChangeInterval; + } + + [Serializable] + public class PlayerStatisticVersion : PlayFabBaseModel + { + /// + /// time when the statistic version became active + /// + public DateTime ActivationTime; + /// + /// URL for the downloadable archive of player statistic values, if available + /// + public string ArchiveDownloadUrl; + /// + /// time when the statistic version became inactive due to statistic version incrementing + /// + public DateTime? DeactivationTime; + /// + /// time at which the statistic version was scheduled to become active, based on the configured ResetInterval + /// + public DateTime? ScheduledActivationTime; + /// + /// time at which the statistic version was scheduled to become inactive, based on the configured ResetInterval + /// + public DateTime? ScheduledDeactivationTime; + /// + /// name of the statistic when the version became active + /// + public string StatisticName; + /// + /// status of the statistic version + /// + public StatisticVersionStatus? Status; + /// + /// version of the statistic + /// + public uint Version; + } + + [Serializable] + public class PushNotificationContent : PlayFabBaseModel + { + /// + /// Text of message to send. + /// + public string Message; + /// + /// Id of the push notification template. + /// + public string PushNotificationTemplateId; + /// + /// Subject of message to send (may not be displayed in all platforms) + /// + public string Subject; + } + + public enum PushNotificationPlatform + { + ApplePushNotificationService, + GoogleCloudMessaging + } + + [Serializable] + public class PushNotificationRegistration : PlayFabBaseModel + { + /// + /// Notification configured endpoint + /// + public string NotificationEndpointARN; + /// + /// Push notification platform + /// + public PushNotificationPlatform? Platform; + } + + [Serializable] + public class PushNotificationRegistrationModel : PlayFabBaseModel + { + /// + /// Notification configured endpoint + /// + public string NotificationEndpointARN; + /// + /// Push notification platform + /// + public PushNotificationPlatform? Platform; + } + + [Serializable] + public class PushNotificationSegmentAction : PlayFabBaseModel + { + /// + /// Push notification template id. + /// + public string PushNotificationTemplateId; + } + + [Serializable] + public class PushNotificationSegmentFilter : PlayFabBaseModel + { + /// + /// Push notification device platform. + /// + public SegmentPushNotificationDevicePlatform? PushNotificationDevicePlatform; + } + + public enum PushSetupPlatform + { + GCM, + APNS, + APNS_SANDBOX + } + + [Serializable] + public class RandomResultTable : PlayFabBaseModel + { + /// + /// Child nodes that indicate what kind of drop table item this actually is. + /// + public List Nodes; + /// + /// Unique name for this drop table + /// + public string TableId; + } + + [Serializable] + public class RandomResultTableListing : PlayFabBaseModel + { + /// + /// Catalog version this table is associated with + /// + public string CatalogVersion; + /// + /// Child nodes that indicate what kind of drop table item this actually is. + /// + public List Nodes; + /// + /// Unique name for this drop table + /// + public string TableId; + } + + [Serializable] + public class RefundPurchaseRequest : PlayFabRequestCommon + { + /// + /// Unique order ID for the purchase in question. + /// + public string OrderId; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + /// + /// The Reason parameter should correspond with the payment providers reason field, if they require one such as Facebook. In + /// the case of Facebook this must match one of their refund or dispute resolution enums (See: + /// https://developers.facebook.com/docs/payments/implementation-guide/handling-disputes-refunds) + /// + public string Reason; + } + + [Serializable] + public class RefundPurchaseResponse : PlayFabResultCommon + { + /// + /// The order's updated purchase status. + /// + public string PurchaseStatus; + } + + /// + /// This API will trigger a player_tag_removed event and remove a tag with the given TagName and PlayFabID from the + /// corresponding player profile. TagName can be used for segmentation and it is limited to 256 characters + /// + [Serializable] + public class RemovePlayerTagRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + /// + /// Unique tag for player profile. + /// + public string TagName; + } + + [Serializable] + public class RemovePlayerTagResult : PlayFabResultCommon + { + } + + /// + /// Virtual currencies to be removed cannot have entries in any catalog nor store for the title. Note that this operation + /// will not remove player balances for the removed currencies; if a deleted currency is recreated at any point, user + /// balances will be in an undefined state. + /// + [Serializable] + public class RemoveVirtualCurrencyTypesRequest : PlayFabRequestCommon + { + /// + /// List of virtual currencies to delete + /// + public List VirtualCurrencies; + } + + /// + /// Note that this action cannot be un-done. All statistics for this character will be deleted, removing the user from all + /// leaderboards for the game. + /// + [Serializable] + public class ResetCharacterStatisticsRequest : PlayFabRequestCommon + { + /// + /// Unique PlayFab assigned ID for a specific character owned by a user + /// + public string CharacterId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class ResetCharacterStatisticsResult : PlayFabResultCommon + { + } + + /// + /// Resets a player's password taking in a new password based and validating the user based off of a token sent to the + /// playerto their email. The token expires after 30 minutes. + /// + [Serializable] + public class ResetPasswordRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The new password for the player. + /// + public string Password; + /// + /// The token of the player requesting the password reset. + /// + public string Token; + } + + [Serializable] + public class ResetPasswordResult : PlayFabResultCommon + { + } + + /// + /// Note that this action cannot be un-done. All statistics for this user will be deleted, removing the user from all + /// leaderboards for the game. + /// + [Serializable] + public class ResetUserStatisticsRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class ResetUserStatisticsResult : PlayFabResultCommon + { + } + + public enum ResolutionOutcome + { + Revoke, + Reinstate, + Manual + } + + [Serializable] + public class ResolvePurchaseDisputeRequest : PlayFabRequestCommon + { + /// + /// Unique order ID for the purchase in question. + /// + public string OrderId; + /// + /// Enum for the desired purchase result state after notifying the payment provider. Valid values are Revoke, Reinstate and + /// Manual. Manual will cause no change to the order state. + /// + public ResolutionOutcome Outcome; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + /// + /// The Reason parameter should correspond with the payment providers reason field, if they require one such as Facebook. In + /// the case of Facebook this must match one of their refund or dispute resolution enums (See: + /// https://developers.facebook.com/docs/payments/implementation-guide/handling-disputes-refunds) + /// + public string Reason; + } + + [Serializable] + public class ResolvePurchaseDisputeResponse : PlayFabResultCommon + { + /// + /// The order's updated purchase status. + /// + public string PurchaseStatus; + } + + [Serializable] + public class ResultTableNode : PlayFabBaseModel + { + /// + /// Either an ItemId, or the TableId of another random result table + /// + public string ResultItem; + /// + /// Whether this entry in the table is an item or a link to another table + /// + public ResultTableNodeType ResultItemType; + /// + /// How likely this is to be rolled - larger numbers add more weight + /// + public int Weight; + } + + public enum ResultTableNodeType + { + ItemId, + TableId + } + + /// + /// Setting the active state of all non-expired bans for a user to Inactive. Expired bans with an Active state will be + /// ignored, however. Returns information about applied updates only. + /// + [Serializable] + public class RevokeAllBansForUserRequest : PlayFabRequestCommon + { + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class RevokeAllBansForUserResult : PlayFabResultCommon + { + /// + /// Information on the bans that were revoked. + /// + public List BanData; + } + + /// + /// Setting the active state of all bans requested to Inactive regardless of whether that ban has already expired. BanIds + /// that do not exist will be skipped. Returns information about applied updates only. + /// + [Serializable] + public class RevokeBansRequest : PlayFabRequestCommon + { + /// + /// Ids of the bans to be revoked. Maximum 100. + /// + public List BanIds; + } + + [Serializable] + public class RevokeBansResult : PlayFabResultCommon + { + /// + /// Information on the bans that were revoked + /// + public List BanData; + } + + [Serializable] + public class RevokeInventoryItem : PlayFabBaseModel + { + /// + /// Unique PlayFab assigned ID for a specific character owned by a user + /// + public string CharacterId; + /// + /// Unique PlayFab assigned instance identifier of the item + /// + public string ItemInstanceId; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + /// + /// In cases where the inventory item in question is a "crate", and the items it contained have already been dispensed, this + /// will not revoke access or otherwise remove the items which were dispensed. + /// + [Serializable] + public class RevokeInventoryItemRequest : PlayFabRequestCommon + { + /// + /// Unique PlayFab assigned ID for a specific character owned by a user + /// + public string CharacterId; + /// + /// Unique PlayFab assigned instance identifier of the item + /// + public string ItemInstanceId; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + /// + /// In cases where the inventory item in question is a "crate", and the items it contained have already been dispensed, this + /// will not revoke access or otherwise remove the items which were dispensed. + /// + [Serializable] + public class RevokeInventoryItemsRequest : PlayFabRequestCommon + { + /// + /// Array of player items to revoke, between 1 and 25 items. + /// + public List Items; + } + + [Serializable] + public class RevokeInventoryItemsResult : PlayFabResultCommon + { + /// + /// Collection of any errors that occurred during processing. + /// + public List Errors; + } + + [Serializable] + public class RevokeInventoryResult : PlayFabResultCommon + { + } + + [Serializable] + public class RevokeItemError : PlayFabBaseModel + { + /// + /// Specific error that was encountered. + /// + public GenericErrorCodes? Error; + /// + /// Item information that failed to be revoked. + /// + public RevokeInventoryItem Item; + } + + /// + /// The returned task instance ID can be used to query for task execution status. + /// + [Serializable] + public class RunTaskRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Provide either the task ID or the task name to run a task. + /// + public NameIdentifier Identifier; + } + + [Serializable] + public class RunTaskResult : PlayFabResultCommon + { + /// + /// ID of the task instance that is started. This can be used in Get*TaskInstance (e.g. GetCloudScriptTaskInstance) API call + /// to retrieve status for the task instance. + /// + public string TaskInstanceId; + } + + [Serializable] + public class ScheduledTask : PlayFabBaseModel + { + /// + /// Description the task + /// + public string Description; + /// + /// Whether the schedule is active. Inactive schedule will not trigger task execution. + /// + public bool IsActive; + /// + /// UTC time of last run + /// + public DateTime? LastRunTime; + /// + /// Name of the task. This is a unique identifier for tasks in the title. + /// + public string Name; + /// + /// UTC time of next run + /// + public DateTime? NextRunTime; + /// + /// Task parameter. Different types of task have different parameter structure. See each task type's create API + /// documentation for the details. + /// + public object Parameter; + /// + /// Cron expression for the run schedule of the task. The expression should be in UTC. + /// + public string Schedule; + /// + /// ID of the task + /// + public string TaskId; + /// + /// Task type. + /// + public ScheduledTaskType? Type; + } + + public enum ScheduledTaskType + { + CloudScript, + ActionsOnPlayerSegment, + CloudScriptAzureFunctions, + InsightsScheduledScaling + } + + [Serializable] + public class ScriptExecutionError : PlayFabBaseModel + { + /// + /// Error code, such as CloudScriptNotFound, JavascriptException, CloudScriptFunctionArgumentSizeExceeded, + /// CloudScriptAPIRequestCountExceeded, CloudScriptAPIRequestError, or CloudScriptHTTPRequestError + /// + public string Error; + /// + /// Details about the error + /// + public string Message; + /// + /// Point during the execution of the script at which the error occurred, if any + /// + public string StackTrace; + } + + [Serializable] + public class SegmentAndDefinition : PlayFabBaseModel + { + /// + /// Filter property for ad campaign filter. + /// + public AdCampaignSegmentFilter AdCampaignFilter; + /// + /// property for all player filter. + /// + public AllPlayersSegmentFilter AllPlayersFilter; + /// + /// Filter property for player churn risk level. + /// + public ChurnPredictionSegmentFilter ChurnPredictionFilter; + /// + /// Filter property for first login date. + /// + public FirstLoginDateSegmentFilter FirstLoginDateFilter; + /// + /// Filter property for first login timespan. + /// + public FirstLoginTimespanSegmentFilter FirstLoginFilter; + /// + /// Filter property for last login date. + /// + public LastLoginDateSegmentFilter LastLoginDateFilter; + /// + /// Filter property for last login timespan. + /// + public LastLoginTimespanSegmentFilter LastLoginFilter; + /// + /// Filter property for linked in user account. + /// + public LinkedUserAccountSegmentFilter LinkedUserAccountFilter; + /// + /// Filter property for linked in user account has email. + /// + public LinkedUserAccountHasEmailSegmentFilter LinkedUserAccountHasEmailFilter; + /// + /// Filter property for location. + /// + public LocationSegmentFilter LocationFilter; + /// + /// Filter property for current player churn value. + /// + public PlayerChurnPredictionSegmentFilter PlayerChurnPredictionFilter; + /// + /// Filter property for player churn timespan. + /// + public PlayerChurnPredictionTimeSegmentFilter PlayerChurnPredictionTimeFilter; + /// + /// Filter property for previous player churn value. + /// + public PlayerChurnPreviousPredictionSegmentFilter PlayerChurnPreviousPredictionFilter; + /// + /// Filter property for push notification. + /// + public PushNotificationSegmentFilter PushNotificationFilter; + /// + /// Filter property for statistics. + /// + public StatisticSegmentFilter StatisticFilter; + /// + /// Filter property for tags. + /// + public TagSegmentFilter TagFilter; + /// + /// Filter property for total value to date in USD. + /// + public TotalValueToDateInUSDSegmentFilter TotalValueToDateInUSDFilter; + /// + /// Filter property for user origination. + /// + public UserOriginationSegmentFilter UserOriginationFilter; + /// + /// Filter property for value to date. + /// + public ValueToDateSegmentFilter ValueToDateFilter; + /// + /// Filter property for virtual currency. + /// + public VirtualCurrencyBalanceSegmentFilter VirtualCurrencyBalanceFilter; + } + + public enum SegmentCountryCode + { + AF, + AX, + AL, + DZ, + AS, + AD, + AO, + AI, + AQ, + AG, + AR, + AM, + AW, + AU, + AT, + AZ, + BS, + BH, + BD, + BB, + BY, + BE, + BZ, + BJ, + BM, + BT, + BO, + BQ, + BA, + BW, + BV, + BR, + IO, + BN, + BG, + BF, + BI, + KH, + CM, + CA, + CV, + KY, + CF, + TD, + CL, + CN, + CX, + CC, + CO, + KM, + CG, + CD, + CK, + CR, + CI, + HR, + CU, + CW, + CY, + CZ, + DK, + DJ, + DM, + DO, + EC, + EG, + SV, + GQ, + ER, + EE, + ET, + FK, + FO, + FJ, + FI, + FR, + GF, + PF, + TF, + GA, + GM, + GE, + DE, + GH, + GI, + GR, + GL, + GD, + GP, + GU, + GT, + GG, + GN, + GW, + GY, + HT, + HM, + VA, + HN, + HK, + HU, + IS, + IN, + ID, + IR, + IQ, + IE, + IM, + IL, + IT, + JM, + JP, + JE, + JO, + KZ, + KE, + KI, + KP, + KR, + KW, + KG, + LA, + LV, + LB, + LS, + LR, + LY, + LI, + LT, + LU, + MO, + MK, + MG, + MW, + MY, + MV, + ML, + MT, + MH, + MQ, + MR, + MU, + YT, + MX, + FM, + MD, + MC, + MN, + ME, + MS, + MA, + MZ, + MM, + NA, + NR, + NP, + NL, + NC, + NZ, + NI, + NE, + NG, + NU, + NF, + MP, + NO, + OM, + PK, + PW, + PS, + PA, + PG, + PY, + PE, + PH, + PN, + PL, + PT, + PR, + QA, + RE, + RO, + RU, + RW, + BL, + SH, + KN, + LC, + MF, + PM, + VC, + WS, + SM, + ST, + SA, + SN, + RS, + SC, + SL, + SG, + SX, + SK, + SI, + SB, + SO, + ZA, + GS, + SS, + ES, + LK, + SD, + SR, + SJ, + SZ, + SE, + CH, + SY, + TW, + TJ, + TZ, + TH, + TL, + TG, + TK, + TO, + TT, + TN, + TR, + TM, + TC, + TV, + UG, + UA, + AE, + GB, + US, + UM, + UY, + UZ, + VU, + VE, + VN, + VG, + VI, + WF, + EH, + YE, + ZM, + ZW + } + + public enum SegmentCurrency + { + AED, + AFN, + ALL, + AMD, + ANG, + AOA, + ARS, + AUD, + AWG, + AZN, + BAM, + BBD, + BDT, + BGN, + BHD, + BIF, + BMD, + BND, + BOB, + BRL, + BSD, + BTN, + BWP, + BYR, + BZD, + CAD, + CDF, + CHF, + CLP, + CNY, + COP, + CRC, + CUC, + CUP, + CVE, + CZK, + DJF, + DKK, + DOP, + DZD, + EGP, + ERN, + ETB, + EUR, + FJD, + FKP, + GBP, + GEL, + GGP, + GHS, + GIP, + GMD, + GNF, + GTQ, + GYD, + HKD, + HNL, + HRK, + HTG, + HUF, + IDR, + ILS, + IMP, + INR, + IQD, + IRR, + ISK, + JEP, + JMD, + JOD, + JPY, + KES, + KGS, + KHR, + KMF, + KPW, + KRW, + KWD, + KYD, + KZT, + LAK, + LBP, + LKR, + LRD, + LSL, + LYD, + MAD, + MDL, + MGA, + MKD, + MMK, + MNT, + MOP, + MRO, + MUR, + MVR, + MWK, + MXN, + MYR, + MZN, + NAD, + NGN, + NIO, + NOK, + NPR, + NZD, + OMR, + PAB, + PEN, + PGK, + PHP, + PKR, + PLN, + PYG, + QAR, + RON, + RSD, + RUB, + RWF, + SAR, + SBD, + SCR, + SDG, + SEK, + SGD, + SHP, + SLL, + SOS, + SPL, + SRD, + STD, + SVC, + SYP, + SZL, + THB, + TJS, + TMT, + TND, + TOP, + TRY, + TTD, + TVD, + TWD, + TZS, + UAH, + UGX, + USD, + UYU, + UZS, + VEF, + VND, + VUV, + WST, + XAF, + XCD, + XDR, + XOF, + XPF, + YER, + ZAR, + ZMW, + ZWD + } + + public enum SegmentFilterComparison + { + GreaterThan, + LessThan, + EqualTo, + NotEqualTo, + GreaterThanOrEqual, + LessThanOrEqual, + Exists, + Contains, + NotContains + } + + public enum SegmentLoginIdentityProvider + { + Unknown, + PlayFab, + Custom, + GameCenter, + GooglePlay, + Steam, + XBoxLive, + PSN, + Kongregate, + Facebook, + IOSDevice, + AndroidDevice, + Twitch, + WindowsHello, + GameServer, + CustomServer, + NintendoSwitch, + FacebookInstantGames, + OpenIdConnect, + Apple, + NintendoSwitchAccount, + GooglePlayGames + } + + [Serializable] + public class SegmentModel : PlayFabBaseModel + { + /// + /// Segment description. + /// + public string Description; + /// + /// Segment actions for current entered segment players. + /// + public List EnteredSegmentActions; + /// + /// Segment last updated date time. + /// + public DateTime LastUpdateTime; + /// + /// Segment actions for current left segment players. + /// + public List LeftSegmentActions; + /// + /// Segment name. + /// + public string Name; + /// + /// Segment id in hex. + /// + public string SegmentId; + /// + /// Segment or definitions. This includes segment and definitions and filters. + /// + public List SegmentOrDefinitions; + } + + [Serializable] + public class SegmentOrDefinition : PlayFabBaseModel + { + /// + /// List of segment and definitions. + /// + public List SegmentAndDefinitions; + } + + public enum SegmentPushNotificationDevicePlatform + { + ApplePushNotificationService, + GoogleCloudMessaging + } + + [Serializable] + public class SegmentTrigger : PlayFabBaseModel + { + /// + /// Add inventory item v2 segment trigger action. + /// + public AddInventoryItemsV2SegmentAction AddInventoryItemsV2Action; + /// + /// Ban player segment trigger action. + /// + public BanPlayerSegmentAction BanPlayerAction; + /// + /// Delete inventory item v2 segment trigger action. + /// + public DeleteInventoryItemsV2SegmentAction DeleteInventoryItemsV2Action; + /// + /// Delete player segment trigger action. + /// + public DeletePlayerSegmentAction DeletePlayerAction; + /// + /// Delete player statistic segment trigger action. + /// + public DeletePlayerStatisticSegmentAction DeletePlayerStatisticAction; + /// + /// Email notification segment trigger action. + /// + public EmailNotificationSegmentAction EmailNotificationAction; + /// + /// Execute azure function segment trigger action. + /// + public ExecuteAzureFunctionSegmentAction ExecuteAzureFunctionAction; + /// + /// Execute cloud script segment trigger action. + /// + public ExecuteCloudScriptSegmentAction ExecuteCloudScriptAction; + /// + /// Grant item segment trigger action. + /// + public GrantItemSegmentAction GrantItemAction; + /// + /// Grant virtual currency segment trigger action. + /// + public GrantVirtualCurrencySegmentAction GrantVirtualCurrencyAction; + /// + /// Increment player statistic segment trigger action. + /// + public IncrementPlayerStatisticSegmentAction IncrementPlayerStatisticAction; + /// + /// Push notification segment trigger action. + /// + public PushNotificationSegmentAction PushNotificationAction; + /// + /// Subtract inventory item v2 segment trigger action. + /// + public SubtractInventoryItemsV2SegmentAction SubtractInventoryItemsV2Action; + } + + /// + /// If the account in question is a "temporary" account (for example, one that was created via a call to + /// LoginFromIOSDeviceID), thisfunction will have no effect. Only PlayFab accounts which have valid email addresses will be + /// able to receive a password reset email using this API. + /// + [Serializable] + public class SendAccountRecoveryEmailRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// User email address attached to their account + /// + public string Email; + /// + /// The email template id of the account recovery email template to send. + /// + public string EmailTemplateId; + } + + [Serializable] + public class SendAccountRecoveryEmailResult : PlayFabResultCommon + { + } + + [Serializable] + public class SendEmailContent : PlayFabBaseModel + { + /// + /// The email template id of the email template to send. + /// + public string EmailTemplateId; + } + + /// + /// This API lets developers set overrides for membership expirations, independent of any subscriptions setting it. + /// + [Serializable] + public class SetMembershipOverrideRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Expiration time for the membership in DateTime format, will override any subscription expirations. + /// + public DateTime ExpirationTime; + /// + /// Id of the membership to apply the override expiration date to. + /// + public string MembershipId; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class SetMembershipOverrideResult : PlayFabResultCommon + { + } + + /// + /// APIs that require signatures require that the player have a configured Player Secret Key that is used to sign all + /// requests. Players that don't have a secret will be blocked from making API calls until it is configured. To create a + /// signature header add a SHA256 hashed string containing UTF8 encoded JSON body as it will be sent to the server, the + /// current time in UTC formatted to ISO 8601, and the players secret formatted as 'body.date.secret'. Place the resulting + /// hash into the header X-PlayFab-Signature, along with a header X-PlayFab-Timestamp of the same UTC timestamp used in the + /// signature. + /// + [Serializable] + public class SetPlayerSecretRequest : PlayFabRequestCommon + { + /// + /// Player secret that is used to verify API request signatures (Enterprise Only). + /// + public string PlayerSecret; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class SetPlayerSecretResult : PlayFabResultCommon + { + } + + [Serializable] + public class SetPublishedRevisionRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Revision to make the current published revision + /// + public int Revision; + /// + /// Version number + /// + public int Version; + } + + [Serializable] + public class SetPublishedRevisionResult : PlayFabResultCommon + { + } + + /// + /// This API is designed to store publisher-specific values which can be read, but not written to, by the client. This data + /// is shared across all titles assigned to a particular publisher, and can be used for cross-game coordination. Only titles + /// assigned to a publisher can use this API. This operation is additive. If a Key does not exist in the current dataset, it + /// will be added with the specified Value. If it already exists, the Value for that key will be overwritten with the new + /// Value. For more information email helloplayfab@microsoft.com + /// + [Serializable] + public class SetPublisherDataRequest : PlayFabRequestCommon + { + /// + /// key we want to set a value on (note, this is additive - will only replace an existing key's value if they are the same + /// name.) Keys are trimmed of whitespace. Keys may not begin with the '!' character. + /// + public string Key; + /// + /// new value to set. Set to null to remove a value + /// + public string Value; + } + + [Serializable] + public class SetPublisherDataResult : PlayFabResultCommon + { + } + + /// + /// Will set the given key values in the specified override or the primary title data based on whether the label is provided + /// or not. + /// + [Serializable] + public class SetTitleDataAndOverridesRequest : PlayFabRequestCommon + { + /// + /// List of titleData key-value pairs to set/delete. Use an empty value to delete an existing key; use a non-empty value to + /// create/update a key. + /// + public List KeyValues; + /// + /// Name of the override. + /// + public string OverrideLabel; + } + + [Serializable] + public class SetTitleDataAndOverridesResult : PlayFabResultCommon + { + } + + /// + /// This operation is additive. If a Key does not exist in the current dataset, it will be added with the specified Value. + /// If it already exists, the Value for that key will be overwritten with the new Value. + /// + [Serializable] + public class SetTitleDataRequest : PlayFabRequestCommon + { + /// + /// key we want to set a value on (note, this is additive - will only replace an existing key's value if they are the same + /// name.) Keys are trimmed of whitespace. Keys may not begin with the '!' character. + /// + public string Key; + /// + /// new value to set. Set to null to remove a value + /// + public string Value; + } + + [Serializable] + public class SetTitleDataResult : PlayFabResultCommon + { + } + + /// + /// When using the Apple Push Notification service (APNS) or the development version (APNS_SANDBOX), the APNS Private Key + /// should be used as the Credential in this call. With Google Cloud Messaging (GCM), the Android API Key should be used. + /// The current ARN (if one exists) can be overwritten by setting the OverwriteOldARN boolean to true. + /// + [Serializable] + public class SetupPushNotificationRequest : PlayFabRequestCommon + { + /// + /// Credential is the Private Key for APNS/APNS_SANDBOX, and the API Key for GCM + /// + public string Credential; + /// + /// for APNS, this is the PlatformPrincipal (SSL Certificate) + /// + public string Key; + /// + /// This field is deprecated and any usage of this will cause the API to fail. + /// + public string Name; + /// + /// replace any existing ARN with the newly generated one. If this is set to false, an error will be returned if + /// notifications have already setup for this platform. + /// + public bool OverwriteOldARN; + /// + /// supported notification platforms are Apple Push Notification Service (APNS and APNS_SANDBOX) for iOS and Google Cloud + /// Messaging (GCM) for Android + /// + public PushSetupPlatform Platform; + } + + [Serializable] + public class SetupPushNotificationResult : PlayFabResultCommon + { + /// + /// Amazon Resource Name for the created notification topic. + /// + public string ARN; + } + + [Serializable] + public class SharedSecret : PlayFabBaseModel + { + /// + /// Flag to indicate if this key is disabled + /// + public bool Disabled; + /// + /// Friendly name for this key + /// + public string FriendlyName; + /// + /// The player shared secret to use when calling Client/GetTitlePublicKey + /// + public string SecretKey; + } + + public enum SourceType + { + Admin, + BackEnd, + GameClient, + GameServer, + Partner, + Custom, + API + } + + public enum StatisticAggregationMethod + { + Last, + Min, + Max, + Sum + } + + [Serializable] + public class StatisticModel : PlayFabBaseModel + { + /// + /// Statistic name + /// + public string Name; + /// + /// Statistic value + /// + public int Value; + /// + /// Statistic version (0 if not a versioned statistic) + /// + public int Version; + } + + public enum StatisticResetIntervalOption + { + Never, + Hour, + Day, + Week, + Month + } + + [Serializable] + public class StatisticSegmentFilter : PlayFabBaseModel + { + /// + /// Statistic filter comparison. + /// + public SegmentFilterComparison? Comparison; + /// + /// Statistic filter value. + /// + public string FilterValue; + /// + /// Statistic name. + /// + public string Name; + /// + /// Use current version of statistic? + /// + public bool? UseCurrentVersion; + /// + /// Statistic version. + /// + public int? Version; + } + + public enum StatisticVersionArchivalStatus + { + NotScheduled, + Scheduled, + Queued, + InProgress, + Complete + } + + public enum StatisticVersionStatus + { + Active, + SnapshotPending, + Snapshot, + ArchivalPending, + Archived + } + + /// + /// A store entry that list a catalog item at a particular price + /// + [Serializable] + public class StoreItem : PlayFabBaseModel + { + /// + /// Store specific custom data. The data only exists as part of this store; it is not transferred to item instances + /// + public object CustomData; + /// + /// Intended display position for this item. Note that 0 is the first position + /// + public uint? DisplayPosition; + /// + /// Unique identifier of the item as it exists in the catalog - note that this must exactly match the ItemId from the + /// catalog + /// + public string ItemId; + /// + /// Override prices for this item for specific currencies + /// + public Dictionary RealCurrencyPrices; + /// + /// Override prices for this item in virtual currencies and "RM" (the base Real Money purchase price, in USD pennies) + /// + public Dictionary VirtualCurrencyPrices; + } + + /// + /// Marketing data about a specific store + /// + [Serializable] + public class StoreMarketingModel : PlayFabBaseModel + { + /// + /// Tagline for a store. + /// + public string Description; + /// + /// Display name of a store as it will appear to users. + /// + public string DisplayName; + /// + /// Custom data about a store. + /// + public object Metadata; + } + + [Serializable] + public class SubscriptionModel : PlayFabBaseModel + { + /// + /// When this subscription expires. + /// + public DateTime Expiration; + /// + /// The time the subscription was orignially purchased + /// + public DateTime InitialSubscriptionTime; + /// + /// Whether this subscription is currently active. That is, if Expiration > now. + /// + public bool IsActive; + /// + /// The status of this subscription, according to the subscription provider. + /// + public SubscriptionProviderStatus? Status; + /// + /// The id for this subscription + /// + public string SubscriptionId; + /// + /// The item id for this subscription from the primary catalog + /// + public string SubscriptionItemId; + /// + /// The provider for this subscription. Apple or Google Play are supported today. + /// + public string SubscriptionProvider; + } + + public enum SubscriptionProviderStatus + { + NoError, + Cancelled, + UnknownError, + BillingError, + ProductUnavailable, + CustomerDidNotAcceptPriceChange, + FreeTrial, + PaymentPending + } + + [Serializable] + public class SubtractInventoryItemsV2SegmentAction : PlayFabBaseModel + { + /// + /// Amount of the item to removed from the player + /// + public int? Amount; + /// + /// The collection id for where the item will be removed from the player inventory + /// + public string CollectionId; + /// + /// The duration in seconds to be removed from the subscription in the players inventory + /// + public int? DurationInSeconds; + /// + /// The id of item to be removed from the player + /// + public string ItemId; + /// + /// The stack id for where the item will be removed from the player inventory + /// + public string StackId; + } + + [Serializable] + public class SubtractInventoryItemV2Content : PlayFabBaseModel + { + /// + /// Amount of the item to removed from the player + /// + public int? Amount; + /// + /// The collection id for where the item will be removed from the player inventory + /// + public string CollectionId; + /// + /// The duration in seconds to be removed from the subscription in the players inventory + /// + public int? DurationInSeconds; + /// + /// The id of item to be removed from the player + /// + public string ItemId; + /// + /// The stack id for where the item will be removed from the player inventory + /// + public string StackId; + } + + [Serializable] + public class SubtractUserVirtualCurrencyRequest : PlayFabRequestCommon + { + /// + /// Amount to be subtracted from the user balance of the specified virtual currency. + /// + public int Amount; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// PlayFab unique identifier of the user whose virtual currency balance is to be decreased. + /// + public string PlayFabId; + /// + /// Name of the virtual currency which is to be decremented. + /// + public string VirtualCurrency; + } + + [Serializable] + public class TagModel : PlayFabBaseModel + { + /// + /// Full value of the tag, including namespace + /// + public string TagValue; + } + + [Serializable] + public class TagSegmentFilter : PlayFabBaseModel + { + /// + /// Tag comparison. + /// + public SegmentFilterComparison? Comparison; + /// + /// Tag value. + /// + public string TagValue; + } + + [Serializable] + public class TaskInstanceBasicSummary : PlayFabBaseModel + { + /// + /// UTC timestamp when the task completed. + /// + public DateTime? CompletedAt; + /// + /// Error message for last processing attempt, if an error occured. + /// + public string ErrorMessage; + /// + /// Estimated time remaining in seconds. + /// + public double? EstimatedSecondsRemaining; + /// + /// Progress represented as percentage. + /// + public double? PercentComplete; + /// + /// If manually scheduled, ID of user who scheduled the task. + /// + public string ScheduledByUserId; + /// + /// UTC timestamp when the task started. + /// + public DateTime StartedAt; + /// + /// Current status of the task instance. + /// + public TaskInstanceStatus? Status; + /// + /// Identifier of the task this instance belongs to. + /// + public NameIdentifier TaskIdentifier; + /// + /// ID of the task instance. + /// + public string TaskInstanceId; + /// + /// Type of the task. + /// + public ScheduledTaskType? Type; + } + + public enum TaskInstanceStatus + { + Succeeded, + Starting, + InProgress, + Failed, + Aborted, + Stalled + } + + public enum TitleActivationStatus + { + None, + ActivatedTitleKey, + PendingSteam, + ActivatedSteam, + RevokedSteam + } + + [Serializable] + public class TitleDataKeyValue : PlayFabBaseModel + { + /// + /// Key we want to set a value on (note, this is additive - will only replace an existing key's value if they are the same + /// name.) Keys are trimmed of whitespace. Keys may not begin with the '!' character. + /// + public string Key; + /// + /// New value to set. Set to null to remove a value + /// + public string Value; + } + + [Serializable] + public class TotalValueToDateInUSDSegmentFilter : PlayFabBaseModel + { + /// + /// Total value to date USD amount. + /// + public string Amount; + /// + /// Total value to date USD comparison. + /// + public SegmentFilterComparison? Comparison; + } + + /// + /// Represents a single update ban request. + /// + [Serializable] + public class UpdateBanRequest : PlayFabBaseModel + { + /// + /// The updated active state for the ban. Null for no change. + /// + public bool? Active; + /// + /// The id of the ban to be updated. + /// + public string BanId; + /// + /// The updated expiration date for the ban. Null for no change. + /// + public DateTime? Expires; + /// + /// The updated IP address for the ban. Null for no change. + /// + public string IPAddress; + /// + /// Whether to make this ban permanent. Set to true to make this ban permanent. This will not modify Active state. + /// + public bool? Permanent; + /// + /// The updated reason for the ban to be updated. Maximum 140 characters. Null for no change. + /// + public string Reason; + /// + /// The updated family type of the user that should be included in the ban. Null for no change. + /// + public UserFamilyType? UserFamilyType; + } + + /// + /// For each ban, only updates the values that are set. Leave any value to null for no change. If a ban could not be found, + /// the rest are still applied. Returns information about applied updates only. + /// + [Serializable] + public class UpdateBansRequest : PlayFabRequestCommon + { + /// + /// List of bans to be updated. Maximum 100. + /// + public List Bans; + } + + [Serializable] + public class UpdateBansResult : PlayFabResultCommon + { + /// + /// Information on the bans that were updated + /// + public List BanData; + } + + /// + /// When used for SetCatalogItems, this operation is not additive. Using it will cause the indicated catalog version to be + /// created from scratch. If there is an existing catalog with the version number in question, it will be deleted and + /// replaced with only the items specified in this call. When used for UpdateCatalogItems, this operation is additive. Items + /// with ItemId values not currently in the catalog will be added, while those with ItemId values matching items currently + /// in the catalog will overwrite those items with the given values. + /// + [Serializable] + public class UpdateCatalogItemsRequest : PlayFabRequestCommon + { + /// + /// Array of catalog items to be submitted. Note that while CatalogItem has a parameter for CatalogVersion, it is not + /// required and ignored in this call. + /// + public List Catalog; + /// + /// Which catalog is being updated. If null, uses the default catalog. + /// + public string CatalogVersion; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Should this catalog be set as the default catalog. Defaults to true. If there is currently no default catalog, this will + /// always set it. + /// + public bool? SetAsDefaultCatalog; + } + + [Serializable] + public class UpdateCatalogItemsResult : PlayFabResultCommon + { + } + + [Serializable] + public class UpdateCloudScriptRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// PlayFab user ID of the developer initiating the request. + /// + public string DeveloperPlayFabId; + /// + /// List of Cloud Script files to upload to create the new revision. Must have at least one file. + /// + public List Files; + /// + /// Immediately publish the new revision + /// + public bool Publish; + } + + [Serializable] + public class UpdateCloudScriptResult : PlayFabResultCommon + { + /// + /// New revision number created + /// + public int Revision; + /// + /// Cloud Script version updated + /// + public int Version; + } + + [Serializable] + public class UpdateOpenIdConnectionRequest : PlayFabRequestCommon + { + /// + /// The client ID given by the ID provider. + /// + public string ClientId; + /// + /// The client secret given by the ID provider. + /// + public string ClientSecret; + /// + /// A name for the connection that identifies it within the title. + /// + public string ConnectionId; + /// + /// Ignore 'nonce' claim in identity tokens. + /// + public bool? IgnoreNonce; + /// + /// The issuer URL or discovery document URL to read issuer information from + /// + public string IssuerDiscoveryUrl; + /// + /// Manually specified information for an OpenID Connect issuer. + /// + public OpenIdIssuerInformation IssuerInformation; + /// + /// Override the issuer name for user indexing and lookup. + /// + public string IssuerOverride; + } + + /// + /// Player Shared Secret Keys are used for the call to Client/GetTitlePublicKey, which exchanges the shared secret for an + /// RSA CSP blob to be used to encrypt the payload of account creation requests when that API requires a signature header. + /// + [Serializable] + public class UpdatePlayerSharedSecretRequest : PlayFabRequestCommon + { + /// + /// Disable or Enable this key + /// + public bool Disabled; + /// + /// Friendly name for this key + /// + public string FriendlyName; + /// + /// The shared secret key to update + /// + public string SecretKey; + } + + [Serializable] + public class UpdatePlayerSharedSecretResult : PlayFabResultCommon + { + } + + /// + /// Statistics are numeric values, with each statistic in the title also generating a leaderboard. The ResetInterval enables + /// automatically resetting leaderboards on a specified interval. Upon reset, the statistic updates to a new version with no + /// values (effectively removing all players from the leaderboard). The previous version's statistic values are also + /// archived for retrieval, if needed (see GetPlayerStatisticVersions). Statistics not created via a call to + /// CreatePlayerStatisticDefinition by default have a VersionChangeInterval of Never, meaning they do not reset on a + /// schedule, but they can be set to do so via a call to UpdatePlayerStatisticDefinition. Once a statistic has been reset + /// (sometimes referred to as versioned or incremented), the now-previous version can still be written to for up a short, + /// pre-defined period (currently 10 seconds), to prevent issues with levels completing around the time of the reset. Also, + /// once reset, the historical statistics for players in the title may be retrieved using the URL specified in the version + /// information (GetPlayerStatisticVersions). The AggregationMethod determines what action is taken when a new statistic + /// value is submitted - always update with the new value (Last), use the highest of the old and new values (Max), use the + /// smallest (Min), or add them together (Sum). + /// + [Serializable] + public class UpdatePlayerStatisticDefinitionRequest : PlayFabRequestCommon + { + /// + /// the aggregation method to use in updating the statistic (defaults to last) + /// + public StatisticAggregationMethod? AggregationMethod; + /// + /// unique name of the statistic + /// + public string StatisticName; + /// + /// interval at which the values of the statistic for all players are reset (changes are effective at the next occurance of + /// the new interval boundary) + /// + public StatisticResetIntervalOption? VersionChangeInterval; + } + + [Serializable] + public class UpdatePlayerStatisticDefinitionResult : PlayFabResultCommon + { + /// + /// updated statistic definition + /// + public PlayerStatisticDefinition Statistic; + } + + /// + /// Updates permissions for your title. Policies affect what is allowed to happen on your title. Your policy is a collection + /// of statements that, together, govern particular area for your title. Today, the only allowed policy is called + /// 'ApiPolicy' and it governs what API calls are allowed. To verify that you have the latest version always download the + /// current policy from GetPolicy before uploading a new policy. PlayFab updates the base policy periodically and will + /// automatically apply it to the uploaded policy. Overwriting the combined policy blindly may result in unexpected API + /// errors. + /// + [Serializable] + public class UpdatePolicyRequest : PlayFabRequestCommon + { + /// + /// Whether to overwrite or append to the existing policy. + /// + public bool OverwritePolicy; + /// + /// The name of the policy being updated. Only supported name is 'ApiPolicy' + /// + public string PolicyName; + /// + /// Version of the policy to update. Must be the latest (as returned by GetPolicy). + /// + public int PolicyVersion; + /// + /// The new statements to include in the policy. + /// + public List Statements; + } + + [Serializable] + public class UpdatePolicyResponse : PlayFabResultCommon + { + /// + /// The name of the policy that was updated. + /// + public string PolicyName; + /// + /// The statements included in the new version of the policy. + /// + public List Statements; + } + + /// + /// This operation is additive. Tables with TableId values not currently defined will be added, while those with TableId + /// values matching Tables currently in the catalog will be overwritten with the given values. + /// + [Serializable] + public class UpdateRandomResultTablesRequest : PlayFabRequestCommon + { + /// + /// which catalog is being updated. If null, update the current default catalog version + /// + public string CatalogVersion; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// array of random result tables to make available (Note: specifying an existing TableId will result in overwriting that + /// table, while any others will be added to the available set) + /// + public List Tables; + } + + [Serializable] + public class UpdateRandomResultTablesResult : PlayFabResultCommon + { + } + + /// + /// Update segment properties data which are planning to update + /// + [Serializable] + public class UpdateSegmentRequest : PlayFabRequestCommon + { + /// + /// Segment model with all of the segment properties data. + /// + public SegmentModel SegmentModel; + } + + [Serializable] + public class UpdateSegmentResponse : PlayFabResultCommon + { + /// + /// Error message. + /// + public string ErrorMessage; + /// + /// Segment id. + /// + public string SegmentId; + } + + /// + /// When used for SetStoreItems, this operation is not additive. Using it will cause the indicated virtual store to be + /// created from scratch. If there is an existing store with the same storeId, it will be deleted and replaced with only the + /// items specified in this call. When used for UpdateStoreItems, this operation is additive. Items with ItemId values not + /// currently in the store will be added, while those with ItemId values matching items currently in the catalog will + /// overwrite those items with the given values. In both cases, a store contains an array of references to items defined in + /// the catalog, along with the prices for the item, in both real world and virtual currencies. These prices act as an + /// override to any prices defined in the catalog. In this way, the base definitions of the items may be defined in the + /// catalog, with all associated properties, while the pricing can be set for each store, as needed. This allows for subsets + /// of goods to be defined for different purposes (in order to simplify showing some, but not all catalog items to users, + /// based upon different characteristics), along with unique prices. Note that all prices defined in the catalog and store + /// definitions for the item are considered valid, and that a compromised client can be made to send a request for an item + /// based upon any of these definitions. If no price is specified in the store for an item, the price set in the catalog + /// should be displayed to the user. + /// + [Serializable] + public class UpdateStoreItemsRequest : PlayFabRequestCommon + { + /// + /// Catalog version of the store to update. If null, uses the default catalog. + /// + public string CatalogVersion; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Additional data about the store + /// + public StoreMarketingModel MarketingData; + /// + /// Array of store items - references to catalog items, with specific pricing - to be added + /// + public List Store; + /// + /// Unique identifier for the store which is to be updated + /// + public string StoreId; + } + + [Serializable] + public class UpdateStoreItemsResult : PlayFabResultCommon + { + } + + /// + /// Note that when calling this API, all properties of the task have to be provided, including properties that you do not + /// want to change. Parameters not specified would be set to default value. If the task name in the update request is new, a + /// task rename operation will be executed before updating other fields of the task. WARNING: Renaming of a task may break + /// logics where the task name is used as an identifier. + /// + [Serializable] + public class UpdateTaskRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Description the task + /// + public string Description; + /// + /// Specify either the task ID or the name of the task to be updated. + /// + public NameIdentifier Identifier; + /// + /// Whether the schedule is active. Inactive schedule will not trigger task execution. + /// + public bool IsActive; + /// + /// Name of the task. This is a unique identifier for tasks in the title. + /// + public string Name; + /// + /// Parameter object specific to the task type. See each task type's create API documentation for details. + /// + public object Parameter; + /// + /// Cron expression for the run schedule of the task. The expression should be in UTC. + /// + public string Schedule; + /// + /// Task type. + /// + public ScheduledTaskType Type; + } + + /// + /// This function performs an additive update of the arbitrary JSON object containing the custom data for the user. In + /// updating the custom data object, keys which already exist in the object will have their values overwritten, while keys + /// with null values will be removed. No other key-value pairs will be changed apart from those specified in the call. + /// + [Serializable] + public class UpdateUserDataRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Key-value pairs to be written to the custom data. Note that keys are trimmed of whitespace, are limited in size, and may + /// not begin with a '!' character or be null. + /// + public Dictionary Data; + /// + /// Optional list of Data-keys to remove from UserData. Some SDKs cannot insert null-values into Data due to language + /// constraints. Use this to delete the keys directly. + /// + public List KeysToRemove; + /// + /// Permission to be applied to all user data keys written in this request. Defaults to "private" if not set. + /// + public UserDataPermission? Permission; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class UpdateUserDataResult : PlayFabResultCommon + { + /// + /// Indicates the current version of the data that has been set. This is incremented with every set call for that type of + /// data (read-only, internal, etc). This version can be provided in Get calls to find updated data. + /// + public uint DataVersion; + } + + /// + /// This function performs an additive update of the arbitrary JSON object containing the custom data for the user. In + /// updating the custom data object, keys which already exist in the object will have their values overwritten, keys with + /// null values will be removed. No other key-value pairs will be changed apart from those specified in the call. + /// + [Serializable] + public class UpdateUserInternalDataRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Key-value pairs to be written to the custom data. Note that keys are trimmed of whitespace, are limited in size, and may + /// not begin with a '!' character or be null. + /// + public Dictionary Data; + /// + /// Optional list of Data-keys to remove from UserData. Some SDKs cannot insert null-values into Data due to language + /// constraints. Use this to delete the keys directly. + /// + public List KeysToRemove; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + /// + /// In addition to the PlayFab username, titles can make use of a DisplayName which is also a unique identifier, but + /// specific to the title. This allows for unique names which more closely match the theme or genre of a title, for example. + /// This API enables changing that name, whether due to a customer request, an offensive name choice, etc. + /// + [Serializable] + public class UpdateUserTitleDisplayNameRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// New title display name for the user - must be between 3 and 25 characters + /// + public string DisplayName; + /// + /// PlayFab unique identifier of the user whose title specific display name is to be changed + /// + public string PlayFabId; + } + + [Serializable] + public class UpdateUserTitleDisplayNameResult : PlayFabResultCommon + { + /// + /// current title display name for the user (this will be the original display name if the rename attempt failed) + /// + public string DisplayName; + } + + [Serializable] + public class UserAccountInfo : PlayFabBaseModel + { + /// + /// User Android device information, if an Android device has been linked + /// + public UserAndroidDeviceInfo AndroidDeviceInfo; + /// + /// Sign in with Apple account information, if an Apple account has been linked + /// + public UserAppleIdInfo AppleAccountInfo; + /// + /// Timestamp indicating when the user account was created + /// + public DateTime Created; + /// + /// Custom ID information, if a custom ID has been assigned + /// + public UserCustomIdInfo CustomIdInfo; + /// + /// User Facebook information, if a Facebook account has been linked + /// + public UserFacebookInfo FacebookInfo; + /// + /// Facebook Instant Games account information, if a Facebook Instant Games account has been linked + /// + public UserFacebookInstantGamesIdInfo FacebookInstantGamesIdInfo; + /// + /// User Gamecenter information, if a Gamecenter account has been linked + /// + public UserGameCenterInfo GameCenterInfo; + /// + /// User Google account information, if a Google account has been linked + /// + public UserGoogleInfo GoogleInfo; + /// + /// User Google Play Games account information, if a Google Play Games account has been linked + /// + public UserGooglePlayGamesInfo GooglePlayGamesInfo; + /// + /// User iOS device information, if an iOS device has been linked + /// + public UserIosDeviceInfo IosDeviceInfo; + /// + /// User Kongregate account information, if a Kongregate account has been linked + /// + public UserKongregateInfo KongregateInfo; + /// + /// Nintendo Switch account information, if a Nintendo Switch account has been linked + /// + public UserNintendoSwitchAccountIdInfo NintendoSwitchAccountInfo; + /// + /// Nintendo Switch device information, if a Nintendo Switch device has been linked + /// + public UserNintendoSwitchDeviceIdInfo NintendoSwitchDeviceIdInfo; + /// + /// OpenID Connect information, if any OpenID Connect accounts have been linked + /// + public List OpenIdInfo; + /// + /// Unique identifier for the user account + /// + public string PlayFabId; + /// + /// Personal information for the user which is considered more sensitive + /// + public UserPrivateAccountInfo PrivateInfo; + /// + /// User PlayStation :tm: Network account information, if a PlayStation :tm: Network account has been linked + /// + public UserPsnInfo PsnInfo; + /// + /// Server Custom ID information, if a server custom ID has been assigned + /// + public UserServerCustomIdInfo ServerCustomIdInfo; + /// + /// User Steam information, if a Steam account has been linked + /// + public UserSteamInfo SteamInfo; + /// + /// Title-specific information for the user account + /// + public UserTitleInfo TitleInfo; + /// + /// User Twitch account information, if a Twitch account has been linked + /// + public UserTwitchInfo TwitchInfo; + /// + /// User account name in the PlayFab service + /// + public string Username; + /// + /// User XBox account information, if a XBox account has been linked + /// + public UserXboxInfo XboxInfo; + } + + [Serializable] + public class UserAndroidDeviceInfo : PlayFabBaseModel + { + /// + /// Android device ID + /// + public string AndroidDeviceId; + } + + [Serializable] + public class UserAppleIdInfo : PlayFabBaseModel + { + /// + /// Apple subject ID + /// + public string AppleSubjectId; + } + + [Serializable] + public class UserCustomIdInfo : PlayFabBaseModel + { + /// + /// Custom ID + /// + public string CustomId; + } + + /// + /// Indicates whether a given data key is private (readable only by the player) or public (readable by all players). When a + /// player makes a GetUserData request about another player, only keys marked Public will be returned. + /// + public enum UserDataPermission + { + Private, + Public + } + + [Serializable] + public class UserDataRecord : PlayFabBaseModel + { + /// + /// Timestamp for when this data was last updated. + /// + public DateTime LastUpdated; + /// + /// Indicates whether this data can be read by all users (public) or only the user (private). This is used for GetUserData + /// requests being made by one player about another player. + /// + public UserDataPermission? Permission; + /// + /// Data stored for the specified user data key. + /// + public string Value; + } + + [Serializable] + public class UserFacebookInfo : PlayFabBaseModel + { + /// + /// Facebook identifier + /// + public string FacebookId; + /// + /// Facebook full name + /// + public string FullName; + } + + [Serializable] + public class UserFacebookInstantGamesIdInfo : PlayFabBaseModel + { + /// + /// Facebook Instant Games ID + /// + public string FacebookInstantGamesId; + } + + public enum UserFamilyType + { + None, + Xbox, + Steam + } + + [Serializable] + public class UserGameCenterInfo : PlayFabBaseModel + { + /// + /// Gamecenter identifier + /// + public string GameCenterId; + } + + [Serializable] + public class UserGoogleInfo : PlayFabBaseModel + { + /// + /// Email address of the Google account + /// + public string GoogleEmail; + /// + /// Gender information of the Google account + /// + public string GoogleGender; + /// + /// Google ID + /// + public string GoogleId; + /// + /// Locale of the Google account + /// + public string GoogleLocale; + /// + /// Name of the Google account user + /// + public string GoogleName; + } + + [Serializable] + public class UserGooglePlayGamesInfo : PlayFabBaseModel + { + /// + /// Avatar image url of the Google Play Games player + /// + public string GooglePlayGamesPlayerAvatarImageUrl; + /// + /// Display name of the Google Play Games player + /// + public string GooglePlayGamesPlayerDisplayName; + /// + /// Google Play Games player ID + /// + public string GooglePlayGamesPlayerId; + } + + [Serializable] + public class UserIosDeviceInfo : PlayFabBaseModel + { + /// + /// iOS device ID + /// + public string IosDeviceId; + } + + [Serializable] + public class UserKongregateInfo : PlayFabBaseModel + { + /// + /// Kongregate ID + /// + public string KongregateId; + /// + /// Kongregate Username + /// + public string KongregateName; + } + + [Serializable] + public class UserNintendoSwitchAccountIdInfo : PlayFabBaseModel + { + /// + /// Nintendo Switch account subject ID + /// + public string NintendoSwitchAccountSubjectId; + } + + [Serializable] + public class UserNintendoSwitchDeviceIdInfo : PlayFabBaseModel + { + /// + /// Nintendo Switch Device ID + /// + public string NintendoSwitchDeviceId; + } + + [Serializable] + public class UserOpenIdInfo : PlayFabBaseModel + { + /// + /// OpenID Connection ID + /// + public string ConnectionId; + /// + /// OpenID Issuer + /// + public string Issuer; + /// + /// OpenID Subject + /// + public string Subject; + } + + public enum UserOrigination + { + Organic, + Steam, + Google, + Amazon, + Facebook, + Kongregate, + GamersFirst, + Unknown, + IOS, + LoadTest, + Android, + PSN, + GameCenter, + CustomId, + XboxLive, + Parse, + Twitch, + ServerCustomId, + NintendoSwitchDeviceId, + FacebookInstantGamesId, + OpenIdConnect, + Apple, + NintendoSwitchAccount, + GooglePlayGames, + XboxMobileStore, + King + } + + [Serializable] + public class UserOriginationSegmentFilter : PlayFabBaseModel + { + /// + /// User login provider. + /// + public SegmentLoginIdentityProvider? LoginProvider; + } + + [Serializable] + public class UserPrivateAccountInfo : PlayFabBaseModel + { + /// + /// user email address + /// + public string Email; + } + + [Serializable] + public class UserPsnInfo : PlayFabBaseModel + { + /// + /// PlayStation :tm: Network account ID + /// + public string PsnAccountId; + /// + /// PlayStation :tm: Network online ID + /// + public string PsnOnlineId; + } + + [Serializable] + public class UserServerCustomIdInfo : PlayFabBaseModel + { + /// + /// Custom ID + /// + public string CustomId; + } + + [Serializable] + public class UserSteamInfo : PlayFabBaseModel + { + /// + /// what stage of game ownership the user is listed as being in, from Steam + /// + public TitleActivationStatus? SteamActivationStatus; + /// + /// the country in which the player resides, from Steam data + /// + public string SteamCountry; + /// + /// currency type set in the user Steam account + /// + public Currency? SteamCurrency; + /// + /// Steam identifier + /// + public string SteamId; + /// + /// Steam display name + /// + public string SteamName; + } + + [Serializable] + public class UserTitleInfo : PlayFabBaseModel + { + /// + /// URL to the player's avatar. + /// + public string AvatarUrl; + /// + /// timestamp indicating when the user was first associated with this game (this can differ significantly from when the user + /// first registered with PlayFab) + /// + public DateTime Created; + /// + /// name of the user, as it is displayed in-game + /// + public string DisplayName; + /// + /// timestamp indicating when the user first signed into this game (this can differ from the Created timestamp, as other + /// events, such as issuing a beta key to the user, can associate the title to the user) + /// + public DateTime? FirstLogin; + /// + /// boolean indicating whether or not the user is currently banned for a title + /// + public bool? isBanned; + /// + /// timestamp for the last user login for this title + /// + public DateTime? LastLogin; + /// + /// source by which the user first joined the game, if known + /// + public UserOrigination? Origination; + /// + /// Title player account entity for this user + /// + public EntityKey TitlePlayerAccount; + } + + [Serializable] + public class UserTwitchInfo : PlayFabBaseModel + { + /// + /// Twitch ID + /// + public string TwitchId; + /// + /// Twitch Username + /// + public string TwitchUserName; + } + + [Serializable] + public class UserXboxInfo : PlayFabBaseModel + { + /// + /// XBox user ID + /// + public string XboxUserId; + /// + /// XBox user sandbox + /// + public string XboxUserSandbox; + } + + [Serializable] + public class ValueToDateModel : PlayFabBaseModel + { + /// + /// ISO 4217 code of the currency used in the purchases + /// + public string Currency; + /// + /// Total value of the purchases in a whole number of 1/100 monetary units. For example, 999 indicates nine dollars and + /// ninety-nine cents when Currency is 'USD') + /// + public uint TotalValue; + /// + /// Total value of the purchases in a string representation of decimal monetary units. For example, '9.99' indicates nine + /// dollars and ninety-nine cents when Currency is 'USD'. + /// + public string TotalValueAsDecimal; + } + + [Serializable] + public class ValueToDateSegmentFilter : PlayFabBaseModel + { + /// + /// Value to date amount. + /// + public string Amount; + /// + /// Value to date comparison. + /// + public SegmentFilterComparison? Comparison; + /// + /// Currency using for filter. + /// + public SegmentCurrency? Currency; + } + + [Serializable] + public class VirtualCurrencyBalanceSegmentFilter : PlayFabBaseModel + { + /// + /// Total amount. + /// + public int Amount; + /// + /// Amount comparison. + /// + public SegmentFilterComparison? Comparison; + /// + /// Currency code. + /// + public string CurrencyCode; + } + + [Serializable] + public class VirtualCurrencyData : PlayFabBaseModel + { + /// + /// unique two-character identifier for this currency type (e.g.: "CC") + /// + public string CurrencyCode; + /// + /// friendly name to show in the developer portal, reports, etc. + /// + public string DisplayName; + /// + /// amount to automatically grant users upon first login to the title + /// + public int? InitialDeposit; + /// + /// maximum amount to which the currency will recharge (cannot exceed MaxAmount, but can be less) + /// + public int? RechargeMax; + /// + /// rate at which the currency automatically be added to over time, in units per day (24 hours) + /// + public int? RechargeRate; + } + + [Serializable] + public class VirtualCurrencyRechargeTime : PlayFabBaseModel + { + /// + /// Maximum value to which the regenerating currency will automatically increment. Note that it can exceed this value + /// through use of the AddUserVirtualCurrency API call. However, it will not regenerate automatically until it has fallen + /// below this value. + /// + public int RechargeMax; + /// + /// Server timestamp in UTC indicating the next time the virtual currency will be incremented. + /// + public DateTime RechargeTime; + /// + /// Time remaining (in seconds) before the next recharge increment of the virtual currency. + /// + public int SecondsToRecharge; + } +} +#endif diff --git a/Assets/PlayFabSDK/Admin/PlayFabAdminModels.cs.meta b/Assets/PlayFabSDK/Admin/PlayFabAdminModels.cs.meta new file mode 100644 index 00000000..98594459 --- /dev/null +++ b/Assets/PlayFabSDK/Admin/PlayFabAdminModels.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 5d7a769446de4b7459591c36c05197ed +timeCreated: 1468524875 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Admin/PlayFabEvents.cs b/Assets/PlayFabSDK/Admin/PlayFabEvents.cs new file mode 100644 index 00000000..15f45128 --- /dev/null +++ b/Assets/PlayFabSDK/Admin/PlayFabEvents.cs @@ -0,0 +1,236 @@ +#if ENABLE_PLAYFABADMIN_API +using PlayFab.AdminModels; + +namespace PlayFab.Events +{ + public partial class PlayFabEvents + { + public event PlayFabRequestEvent OnAdminAbortTaskInstanceRequestEvent; + public event PlayFabResultEvent OnAdminAbortTaskInstanceResultEvent; + public event PlayFabRequestEvent OnAdminAddLocalizedNewsRequestEvent; + public event PlayFabResultEvent OnAdminAddLocalizedNewsResultEvent; + public event PlayFabRequestEvent OnAdminAddNewsRequestEvent; + public event PlayFabResultEvent OnAdminAddNewsResultEvent; + public event PlayFabRequestEvent OnAdminAddPlayerTagRequestEvent; + public event PlayFabResultEvent OnAdminAddPlayerTagResultEvent; + public event PlayFabRequestEvent OnAdminAddUserVirtualCurrencyRequestEvent; + public event PlayFabResultEvent OnAdminAddUserVirtualCurrencyResultEvent; + public event PlayFabRequestEvent OnAdminAddVirtualCurrencyTypesRequestEvent; + public event PlayFabResultEvent OnAdminAddVirtualCurrencyTypesResultEvent; + public event PlayFabRequestEvent OnAdminBanUsersRequestEvent; + public event PlayFabResultEvent OnAdminBanUsersResultEvent; + public event PlayFabRequestEvent OnAdminCheckLimitedEditionItemAvailabilityRequestEvent; + public event PlayFabResultEvent OnAdminCheckLimitedEditionItemAvailabilityResultEvent; + public event PlayFabRequestEvent OnAdminCreateActionsOnPlayersInSegmentTaskRequestEvent; + public event PlayFabResultEvent OnAdminCreateActionsOnPlayersInSegmentTaskResultEvent; + public event PlayFabRequestEvent OnAdminCreateCloudScriptTaskRequestEvent; + public event PlayFabResultEvent OnAdminCreateCloudScriptTaskResultEvent; + public event PlayFabRequestEvent OnAdminCreateInsightsScheduledScalingTaskRequestEvent; + public event PlayFabResultEvent OnAdminCreateInsightsScheduledScalingTaskResultEvent; + public event PlayFabRequestEvent OnAdminCreateOpenIdConnectionRequestEvent; + public event PlayFabResultEvent OnAdminCreateOpenIdConnectionResultEvent; + public event PlayFabRequestEvent OnAdminCreatePlayerSharedSecretRequestEvent; + public event PlayFabResultEvent OnAdminCreatePlayerSharedSecretResultEvent; + public event PlayFabRequestEvent OnAdminCreatePlayerStatisticDefinitionRequestEvent; + public event PlayFabResultEvent OnAdminCreatePlayerStatisticDefinitionResultEvent; + public event PlayFabRequestEvent OnAdminCreateSegmentRequestEvent; + public event PlayFabResultEvent OnAdminCreateSegmentResultEvent; + public event PlayFabRequestEvent OnAdminDeleteContentRequestEvent; + public event PlayFabResultEvent OnAdminDeleteContentResultEvent; + public event PlayFabRequestEvent OnAdminDeleteMasterPlayerAccountRequestEvent; + public event PlayFabResultEvent OnAdminDeleteMasterPlayerAccountResultEvent; + public event PlayFabRequestEvent OnAdminDeleteMasterPlayerEventDataRequestEvent; + public event PlayFabResultEvent OnAdminDeleteMasterPlayerEventDataResultEvent; + public event PlayFabRequestEvent OnAdminDeleteMembershipSubscriptionRequestEvent; + public event PlayFabResultEvent OnAdminDeleteMembershipSubscriptionResultEvent; + public event PlayFabRequestEvent OnAdminDeleteOpenIdConnectionRequestEvent; + public event PlayFabResultEvent OnAdminDeleteOpenIdConnectionResultEvent; + public event PlayFabRequestEvent OnAdminDeletePlayerRequestEvent; + public event PlayFabResultEvent OnAdminDeletePlayerResultEvent; + public event PlayFabRequestEvent OnAdminDeletePlayerSharedSecretRequestEvent; + public event PlayFabResultEvent OnAdminDeletePlayerSharedSecretResultEvent; + public event PlayFabRequestEvent OnAdminDeleteSegmentRequestEvent; + public event PlayFabResultEvent OnAdminDeleteSegmentResultEvent; + public event PlayFabRequestEvent OnAdminDeleteStoreRequestEvent; + public event PlayFabResultEvent OnAdminDeleteStoreResultEvent; + public event PlayFabRequestEvent OnAdminDeleteTaskRequestEvent; + public event PlayFabResultEvent OnAdminDeleteTaskResultEvent; + public event PlayFabRequestEvent OnAdminDeleteTitleRequestEvent; + public event PlayFabResultEvent OnAdminDeleteTitleResultEvent; + public event PlayFabRequestEvent OnAdminDeleteTitleDataOverrideRequestEvent; + public event PlayFabResultEvent OnAdminDeleteTitleDataOverrideResultEvent; + public event PlayFabRequestEvent OnAdminExportMasterPlayerDataRequestEvent; + public event PlayFabResultEvent OnAdminExportMasterPlayerDataResultEvent; + public event PlayFabRequestEvent OnAdminExportPlayersInSegmentRequestEvent; + public event PlayFabResultEvent OnAdminExportPlayersInSegmentResultEvent; + public event PlayFabRequestEvent OnAdminGetActionsOnPlayersInSegmentTaskInstanceRequestEvent; + public event PlayFabResultEvent OnAdminGetActionsOnPlayersInSegmentTaskInstanceResultEvent; + public event PlayFabRequestEvent OnAdminGetAllSegmentsRequestEvent; + public event PlayFabResultEvent OnAdminGetAllSegmentsResultEvent; + public event PlayFabRequestEvent OnAdminGetCatalogItemsRequestEvent; + public event PlayFabResultEvent OnAdminGetCatalogItemsResultEvent; + public event PlayFabRequestEvent OnAdminGetCloudScriptRevisionRequestEvent; + public event PlayFabResultEvent OnAdminGetCloudScriptRevisionResultEvent; + public event PlayFabRequestEvent OnAdminGetCloudScriptTaskInstanceRequestEvent; + public event PlayFabResultEvent OnAdminGetCloudScriptTaskInstanceResultEvent; + public event PlayFabRequestEvent OnAdminGetCloudScriptVersionsRequestEvent; + public event PlayFabResultEvent OnAdminGetCloudScriptVersionsResultEvent; + public event PlayFabRequestEvent OnAdminGetContentListRequestEvent; + public event PlayFabResultEvent OnAdminGetContentListResultEvent; + public event PlayFabRequestEvent OnAdminGetContentUploadUrlRequestEvent; + public event PlayFabResultEvent OnAdminGetContentUploadUrlResultEvent; + public event PlayFabRequestEvent OnAdminGetDataReportRequestEvent; + public event PlayFabResultEvent OnAdminGetDataReportResultEvent; + public event PlayFabRequestEvent OnAdminGetPlayedTitleListRequestEvent; + public event PlayFabResultEvent OnAdminGetPlayedTitleListResultEvent; + public event PlayFabRequestEvent OnAdminGetPlayerIdFromAuthTokenRequestEvent; + public event PlayFabResultEvent OnAdminGetPlayerIdFromAuthTokenResultEvent; + public event PlayFabRequestEvent OnAdminGetPlayerProfileRequestEvent; + public event PlayFabResultEvent OnAdminGetPlayerProfileResultEvent; + public event PlayFabRequestEvent OnAdminGetPlayerSegmentsRequestEvent; + public event PlayFabResultEvent OnAdminGetPlayerSegmentsResultEvent; + public event PlayFabRequestEvent OnAdminGetPlayerSharedSecretsRequestEvent; + public event PlayFabResultEvent OnAdminGetPlayerSharedSecretsResultEvent; + public event PlayFabRequestEvent OnAdminGetPlayersInSegmentRequestEvent; + public event PlayFabResultEvent OnAdminGetPlayersInSegmentResultEvent; + public event PlayFabRequestEvent OnAdminGetPlayerStatisticDefinitionsRequestEvent; + public event PlayFabResultEvent OnAdminGetPlayerStatisticDefinitionsResultEvent; + public event PlayFabRequestEvent OnAdminGetPlayerStatisticVersionsRequestEvent; + public event PlayFabResultEvent OnAdminGetPlayerStatisticVersionsResultEvent; + public event PlayFabRequestEvent OnAdminGetPlayerTagsRequestEvent; + public event PlayFabResultEvent OnAdminGetPlayerTagsResultEvent; + public event PlayFabRequestEvent OnAdminGetPolicyRequestEvent; + public event PlayFabResultEvent OnAdminGetPolicyResultEvent; + public event PlayFabRequestEvent OnAdminGetPublisherDataRequestEvent; + public event PlayFabResultEvent OnAdminGetPublisherDataResultEvent; + public event PlayFabRequestEvent OnAdminGetRandomResultTablesRequestEvent; + public event PlayFabResultEvent OnAdminGetRandomResultTablesResultEvent; + public event PlayFabRequestEvent OnAdminGetSegmentExportRequestEvent; + public event PlayFabResultEvent OnAdminGetSegmentExportResultEvent; + public event PlayFabRequestEvent OnAdminGetSegmentsRequestEvent; + public event PlayFabResultEvent OnAdminGetSegmentsResultEvent; + public event PlayFabRequestEvent OnAdminGetStoreItemsRequestEvent; + public event PlayFabResultEvent OnAdminGetStoreItemsResultEvent; + public event PlayFabRequestEvent OnAdminGetTaskInstancesRequestEvent; + public event PlayFabResultEvent OnAdminGetTaskInstancesResultEvent; + public event PlayFabRequestEvent OnAdminGetTasksRequestEvent; + public event PlayFabResultEvent OnAdminGetTasksResultEvent; + public event PlayFabRequestEvent OnAdminGetTitleDataRequestEvent; + public event PlayFabResultEvent OnAdminGetTitleDataResultEvent; + public event PlayFabRequestEvent OnAdminGetTitleInternalDataRequestEvent; + public event PlayFabResultEvent OnAdminGetTitleInternalDataResultEvent; + public event PlayFabRequestEvent OnAdminGetUserAccountInfoRequestEvent; + public event PlayFabResultEvent OnAdminGetUserAccountInfoResultEvent; + public event PlayFabRequestEvent OnAdminGetUserBansRequestEvent; + public event PlayFabResultEvent OnAdminGetUserBansResultEvent; + public event PlayFabRequestEvent OnAdminGetUserDataRequestEvent; + public event PlayFabResultEvent OnAdminGetUserDataResultEvent; + public event PlayFabRequestEvent OnAdminGetUserInternalDataRequestEvent; + public event PlayFabResultEvent OnAdminGetUserInternalDataResultEvent; + public event PlayFabRequestEvent OnAdminGetUserInventoryRequestEvent; + public event PlayFabResultEvent OnAdminGetUserInventoryResultEvent; + public event PlayFabRequestEvent OnAdminGetUserPublisherDataRequestEvent; + public event PlayFabResultEvent OnAdminGetUserPublisherDataResultEvent; + public event PlayFabRequestEvent OnAdminGetUserPublisherInternalDataRequestEvent; + public event PlayFabResultEvent OnAdminGetUserPublisherInternalDataResultEvent; + public event PlayFabRequestEvent OnAdminGetUserPublisherReadOnlyDataRequestEvent; + public event PlayFabResultEvent OnAdminGetUserPublisherReadOnlyDataResultEvent; + public event PlayFabRequestEvent OnAdminGetUserReadOnlyDataRequestEvent; + public event PlayFabResultEvent OnAdminGetUserReadOnlyDataResultEvent; + public event PlayFabRequestEvent OnAdminGrantItemsToUsersRequestEvent; + public event PlayFabResultEvent OnAdminGrantItemsToUsersResultEvent; + public event PlayFabRequestEvent OnAdminIncrementLimitedEditionItemAvailabilityRequestEvent; + public event PlayFabResultEvent OnAdminIncrementLimitedEditionItemAvailabilityResultEvent; + public event PlayFabRequestEvent OnAdminIncrementPlayerStatisticVersionRequestEvent; + public event PlayFabResultEvent OnAdminIncrementPlayerStatisticVersionResultEvent; + public event PlayFabRequestEvent OnAdminListOpenIdConnectionRequestEvent; + public event PlayFabResultEvent OnAdminListOpenIdConnectionResultEvent; + public event PlayFabRequestEvent OnAdminListVirtualCurrencyTypesRequestEvent; + public event PlayFabResultEvent OnAdminListVirtualCurrencyTypesResultEvent; + public event PlayFabRequestEvent OnAdminRefundPurchaseRequestEvent; + public event PlayFabResultEvent OnAdminRefundPurchaseResultEvent; + public event PlayFabRequestEvent OnAdminRemovePlayerTagRequestEvent; + public event PlayFabResultEvent OnAdminRemovePlayerTagResultEvent; + public event PlayFabRequestEvent OnAdminRemoveVirtualCurrencyTypesRequestEvent; + public event PlayFabResultEvent OnAdminRemoveVirtualCurrencyTypesResultEvent; + public event PlayFabRequestEvent OnAdminResetCharacterStatisticsRequestEvent; + public event PlayFabResultEvent OnAdminResetCharacterStatisticsResultEvent; + public event PlayFabRequestEvent OnAdminResetPasswordRequestEvent; + public event PlayFabResultEvent OnAdminResetPasswordResultEvent; + public event PlayFabRequestEvent OnAdminResetUserStatisticsRequestEvent; + public event PlayFabResultEvent OnAdminResetUserStatisticsResultEvent; + public event PlayFabRequestEvent OnAdminResolvePurchaseDisputeRequestEvent; + public event PlayFabResultEvent OnAdminResolvePurchaseDisputeResultEvent; + public event PlayFabRequestEvent OnAdminRevokeAllBansForUserRequestEvent; + public event PlayFabResultEvent OnAdminRevokeAllBansForUserResultEvent; + public event PlayFabRequestEvent OnAdminRevokeBansRequestEvent; + public event PlayFabResultEvent OnAdminRevokeBansResultEvent; + public event PlayFabRequestEvent OnAdminRevokeInventoryItemRequestEvent; + public event PlayFabResultEvent OnAdminRevokeInventoryItemResultEvent; + public event PlayFabRequestEvent OnAdminRevokeInventoryItemsRequestEvent; + public event PlayFabResultEvent OnAdminRevokeInventoryItemsResultEvent; + public event PlayFabRequestEvent OnAdminRunTaskRequestEvent; + public event PlayFabResultEvent OnAdminRunTaskResultEvent; + public event PlayFabRequestEvent OnAdminSendAccountRecoveryEmailRequestEvent; + public event PlayFabResultEvent OnAdminSendAccountRecoveryEmailResultEvent; + public event PlayFabRequestEvent OnAdminSetCatalogItemsRequestEvent; + public event PlayFabResultEvent OnAdminSetCatalogItemsResultEvent; + public event PlayFabRequestEvent OnAdminSetMembershipOverrideRequestEvent; + public event PlayFabResultEvent OnAdminSetMembershipOverrideResultEvent; + public event PlayFabRequestEvent OnAdminSetPlayerSecretRequestEvent; + public event PlayFabResultEvent OnAdminSetPlayerSecretResultEvent; + public event PlayFabRequestEvent OnAdminSetPublishedRevisionRequestEvent; + public event PlayFabResultEvent OnAdminSetPublishedRevisionResultEvent; + public event PlayFabRequestEvent OnAdminSetPublisherDataRequestEvent; + public event PlayFabResultEvent OnAdminSetPublisherDataResultEvent; + public event PlayFabRequestEvent OnAdminSetStoreItemsRequestEvent; + public event PlayFabResultEvent OnAdminSetStoreItemsResultEvent; + public event PlayFabRequestEvent OnAdminSetTitleDataRequestEvent; + public event PlayFabResultEvent OnAdminSetTitleDataResultEvent; + public event PlayFabRequestEvent OnAdminSetTitleDataAndOverridesRequestEvent; + public event PlayFabResultEvent OnAdminSetTitleDataAndOverridesResultEvent; + public event PlayFabRequestEvent OnAdminSetTitleInternalDataRequestEvent; + public event PlayFabResultEvent OnAdminSetTitleInternalDataResultEvent; + public event PlayFabRequestEvent OnAdminSetupPushNotificationRequestEvent; + public event PlayFabResultEvent OnAdminSetupPushNotificationResultEvent; + public event PlayFabRequestEvent OnAdminSubtractUserVirtualCurrencyRequestEvent; + public event PlayFabResultEvent OnAdminSubtractUserVirtualCurrencyResultEvent; + public event PlayFabRequestEvent OnAdminUpdateBansRequestEvent; + public event PlayFabResultEvent OnAdminUpdateBansResultEvent; + public event PlayFabRequestEvent OnAdminUpdateCatalogItemsRequestEvent; + public event PlayFabResultEvent OnAdminUpdateCatalogItemsResultEvent; + public event PlayFabRequestEvent OnAdminUpdateCloudScriptRequestEvent; + public event PlayFabResultEvent OnAdminUpdateCloudScriptResultEvent; + public event PlayFabRequestEvent OnAdminUpdateOpenIdConnectionRequestEvent; + public event PlayFabResultEvent OnAdminUpdateOpenIdConnectionResultEvent; + public event PlayFabRequestEvent OnAdminUpdatePlayerSharedSecretRequestEvent; + public event PlayFabResultEvent OnAdminUpdatePlayerSharedSecretResultEvent; + public event PlayFabRequestEvent OnAdminUpdatePlayerStatisticDefinitionRequestEvent; + public event PlayFabResultEvent OnAdminUpdatePlayerStatisticDefinitionResultEvent; + public event PlayFabRequestEvent OnAdminUpdatePolicyRequestEvent; + public event PlayFabResultEvent OnAdminUpdatePolicyResultEvent; + public event PlayFabRequestEvent OnAdminUpdateRandomResultTablesRequestEvent; + public event PlayFabResultEvent OnAdminUpdateRandomResultTablesResultEvent; + public event PlayFabRequestEvent OnAdminUpdateSegmentRequestEvent; + public event PlayFabResultEvent OnAdminUpdateSegmentResultEvent; + public event PlayFabRequestEvent OnAdminUpdateStoreItemsRequestEvent; + public event PlayFabResultEvent OnAdminUpdateStoreItemsResultEvent; + public event PlayFabRequestEvent OnAdminUpdateTaskRequestEvent; + public event PlayFabResultEvent OnAdminUpdateTaskResultEvent; + public event PlayFabRequestEvent OnAdminUpdateUserDataRequestEvent; + public event PlayFabResultEvent OnAdminUpdateUserDataResultEvent; + public event PlayFabRequestEvent OnAdminUpdateUserInternalDataRequestEvent; + public event PlayFabResultEvent OnAdminUpdateUserInternalDataResultEvent; + public event PlayFabRequestEvent OnAdminUpdateUserPublisherDataRequestEvent; + public event PlayFabResultEvent OnAdminUpdateUserPublisherDataResultEvent; + public event PlayFabRequestEvent OnAdminUpdateUserPublisherInternalDataRequestEvent; + public event PlayFabResultEvent OnAdminUpdateUserPublisherInternalDataResultEvent; + public event PlayFabRequestEvent OnAdminUpdateUserPublisherReadOnlyDataRequestEvent; + public event PlayFabResultEvent OnAdminUpdateUserPublisherReadOnlyDataResultEvent; + public event PlayFabRequestEvent OnAdminUpdateUserReadOnlyDataRequestEvent; + public event PlayFabResultEvent OnAdminUpdateUserReadOnlyDataResultEvent; + public event PlayFabRequestEvent OnAdminUpdateUserTitleDisplayNameRequestEvent; + public event PlayFabResultEvent OnAdminUpdateUserTitleDisplayNameResultEvent; + } +} +#endif diff --git a/Assets/PlayFabSDK/Admin/PlayFabEvents.cs.meta b/Assets/PlayFabSDK/Admin/PlayFabEvents.cs.meta new file mode 100644 index 00000000..6cca88a7 --- /dev/null +++ b/Assets/PlayFabSDK/Admin/PlayFabEvents.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 17d913d4a2b01d044a0f70f2679f2fca +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Authentication.meta b/Assets/PlayFabSDK/Authentication.meta new file mode 100644 index 00000000..041e2bc3 --- /dev/null +++ b/Assets/PlayFabSDK/Authentication.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6053e56f02766e840981de07cdd1ad34 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Authentication/PlayFabAuthenticationAPI.cs b/Assets/PlayFabSDK/Authentication/PlayFabAuthenticationAPI.cs new file mode 100644 index 00000000..6006b8dd --- /dev/null +++ b/Assets/PlayFabSDK/Authentication/PlayFabAuthenticationAPI.cs @@ -0,0 +1,104 @@ +#if !DISABLE_PLAYFABENTITY_API && !DISABLE_PLAYFAB_STATIC_API + +using System; +using System.Collections.Generic; +using PlayFab.AuthenticationModels; +using PlayFab.Internal; + +namespace PlayFab +{ + /// + /// The Authentication APIs provide a convenient way to convert classic authentication responses into entity authentication + /// models. These APIs will provide you with the entity authentication token needed for subsequent Entity API calls. The + /// game_server API is designed to create uniquely identifiable game_server entities. The game_server Entity token can be + /// used to call Matchmaking Lobby and Pubsub for server scenarios. + /// + public static class PlayFabAuthenticationAPI + { + static PlayFabAuthenticationAPI() {} + + + /// + /// Verify entity login. + /// + public static bool IsEntityLoggedIn() + { + return PlayFabSettings.staticPlayer.IsEntityLoggedIn(); + } + + /// + /// Clear the Client SessionToken which allows this Client to call API calls requiring login. + /// A new/fresh login will be required after calling this. + /// + public static void ForgetAllCredentials() + { + PlayFabSettings.staticPlayer.ForgetAllCredentials(); + } + + /// + /// Create a game_server entity token and return a new or existing game_server entity. + /// + public static void AuthenticateGameServerWithCustomId(AuthenticateCustomIdRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/GameServerIdentity/AuthenticateGameServerWithCustomId", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Delete a game_server entity. + /// + public static void Delete(DeleteRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/GameServerIdentity/Delete", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Method to exchange a legacy AuthenticationTicket or title SecretKey for an Entity Token or to refresh a still valid + /// Entity Token. + /// + public static void GetEntityToken(GetEntityTokenRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + AuthType authType = AuthType.None; +#if !DISABLE_PLAYFABCLIENT_API + if (context.IsClientLoggedIn()) { authType = AuthType.LoginSession; } +#endif +#if ENABLE_PLAYFABSERVER_API || ENABLE_PLAYFABADMIN_API || ENABLE_PLAYFAB_SECRETKEY + if (callSettings.DeveloperSecretKey != null) { authType = AuthType.DevSecretKey; } +#endif +#if !DISABLE_PLAYFABENTITY_API + if (context.IsEntityLoggedIn()) { authType = AuthType.EntityToken; } +#endif + + + PlayFabHttp.MakeApiCall("/Authentication/GetEntityToken", request, authType, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Method for a server to validate a client provided EntityToken. Only callable by the title entity. + /// + public static void ValidateEntityToken(ValidateEntityTokenRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Authentication/ValidateEntityToken", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + + } +} + +#endif diff --git a/Assets/PlayFabSDK/Authentication/PlayFabAuthenticationAPI.cs.meta b/Assets/PlayFabSDK/Authentication/PlayFabAuthenticationAPI.cs.meta new file mode 100644 index 00000000..d24442f1 --- /dev/null +++ b/Assets/PlayFabSDK/Authentication/PlayFabAuthenticationAPI.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: cf5e0beea20361a45aee9c2329eafd01 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Authentication/PlayFabAuthenticationInstanceAPI.cs b/Assets/PlayFabSDK/Authentication/PlayFabAuthenticationInstanceAPI.cs new file mode 100644 index 00000000..c3ed1d43 --- /dev/null +++ b/Assets/PlayFabSDK/Authentication/PlayFabAuthenticationInstanceAPI.cs @@ -0,0 +1,121 @@ +#if !DISABLE_PLAYFABENTITY_API + +using System; +using System.Collections.Generic; +using PlayFab.AuthenticationModels; +using PlayFab.Internal; +using PlayFab.SharedModels; + +namespace PlayFab +{ + /// + /// The Authentication APIs provide a convenient way to convert classic authentication responses into entity authentication + /// models. These APIs will provide you with the entity authentication token needed for subsequent Entity API calls. The + /// game_server API is designed to create uniquely identifiable game_server entities. The game_server Entity token can be + /// used to call Matchmaking Lobby and Pubsub for server scenarios. + /// + public class PlayFabAuthenticationInstanceAPI : IPlayFabInstanceApi + { + public readonly PlayFabApiSettings apiSettings = null; + public readonly PlayFabAuthenticationContext authenticationContext = null; + + public PlayFabAuthenticationInstanceAPI() + { + authenticationContext = new PlayFabAuthenticationContext(); + } + + public PlayFabAuthenticationInstanceAPI(PlayFabApiSettings settings) + { + apiSettings = settings; + authenticationContext = new PlayFabAuthenticationContext(); + } + + public PlayFabAuthenticationInstanceAPI(PlayFabAuthenticationContext context) + { + authenticationContext = context ?? new PlayFabAuthenticationContext(); + } + + public PlayFabAuthenticationInstanceAPI(PlayFabApiSettings settings, PlayFabAuthenticationContext context) + { + apiSettings = settings; + authenticationContext = context ?? new PlayFabAuthenticationContext(); + } + + /// + /// Verify entity login. + /// + public bool IsEntityLoggedIn() + { + return authenticationContext == null ? false : authenticationContext.IsEntityLoggedIn(); + } + + /// + /// Clear the Client SessionToken which allows this Client to call API calls requiring login. + /// A new/fresh login will be required after calling this. + /// + public void ForgetAllCredentials() + { + if (authenticationContext != null) + { + authenticationContext.ForgetAllCredentials(); + } + } + + /// + /// Create a game_server entity token and return a new or existing game_server entity. + /// + public void AuthenticateGameServerWithCustomId(AuthenticateCustomIdRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/GameServerIdentity/AuthenticateGameServerWithCustomId", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Delete a game_server entity. + /// + public void Delete(DeleteRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/GameServerIdentity/Delete", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Method to exchange a legacy AuthenticationTicket or title SecretKey for an Entity Token or to refresh a still valid + /// Entity Token. + /// + public void GetEntityToken(GetEntityTokenRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + AuthType authType = AuthType.None; +#if !DISABLE_PLAYFABCLIENT_API + if (context.IsClientLoggedIn()) { authType = AuthType.LoginSession; } +#endif +#if ENABLE_PLAYFABSERVER_API || ENABLE_PLAYFABADMIN_API || ENABLE_PLAYFAB_SECRETKEY + if (callSettings.DeveloperSecretKey != null) { authType = AuthType.DevSecretKey; } +#endif +#if !DISABLE_PLAYFABENTITY_API + if (context.IsEntityLoggedIn()) { authType = AuthType.EntityToken; } +#endif + PlayFabHttp.MakeApiCall("/Authentication/GetEntityToken", request, authType, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Method for a server to validate a client provided EntityToken. Only callable by the title entity. + /// + public void ValidateEntityToken(ValidateEntityTokenRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Authentication/ValidateEntityToken", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + } +} + +#endif diff --git a/Assets/PlayFabSDK/Authentication/PlayFabAuthenticationInstanceAPI.cs.meta b/Assets/PlayFabSDK/Authentication/PlayFabAuthenticationInstanceAPI.cs.meta new file mode 100644 index 00000000..a10fd8d6 --- /dev/null +++ b/Assets/PlayFabSDK/Authentication/PlayFabAuthenticationInstanceAPI.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ecff04cca276a454aad3baf64c4a2ab4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Authentication/PlayFabAuthenticationModels.cs b/Assets/PlayFabSDK/Authentication/PlayFabAuthenticationModels.cs new file mode 100644 index 00000000..091e27b3 --- /dev/null +++ b/Assets/PlayFabSDK/Authentication/PlayFabAuthenticationModels.cs @@ -0,0 +1,242 @@ +#if !DISABLE_PLAYFABENTITY_API +using System; +using System.Collections.Generic; +using PlayFab.SharedModels; + +namespace PlayFab.AuthenticationModels +{ + /// + /// Create or return a game_server entity token. Caller must be a title entity. + /// + [Serializable] + public class AuthenticateCustomIdRequest : PlayFabRequestCommon + { + /// + /// The customId used to create and retrieve game_server entity tokens. This is unique at the title level. CustomId must be + /// between 32 and 100 characters. + /// + public string CustomId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + [Serializable] + public class AuthenticateCustomIdResult : PlayFabResultCommon + { + /// + /// The token generated used to set X-EntityToken for game_server calls. + /// + public EntityTokenResponse EntityToken; + /// + /// True if the account was newly created on this authentication. + /// + public bool NewlyCreated; + } + + /// + /// Delete a game_server entity. The caller can be the game_server entity attempting to delete itself. Or a title entity + /// attempting to delete game_server entities for this title. + /// + [Serializable] + public class DeleteRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The game_server entity to be removed. + /// + public EntityKey Entity; + } + + [Serializable] + public class EmptyResponse : PlayFabResultCommon + { + } + + /// + /// Combined entity type and ID structure which uniquely identifies a single entity. + /// + [Serializable] + public class EntityKey : PlayFabBaseModel + { + /// + /// Unique ID of the entity. + /// + public string Id; + /// + /// Entity type. See https://docs.microsoft.com/gaming/playfab/features/data/entities/available-built-in-entity-types + /// + public string Type; + } + + [Serializable] + public class EntityLineage : PlayFabBaseModel + { + /// + /// The Character Id of the associated entity. + /// + public string CharacterId; + /// + /// The Group Id of the associated entity. + /// + public string GroupId; + /// + /// The Master Player Account Id of the associated entity. + /// + public string MasterPlayerAccountId; + /// + /// The Namespace Id of the associated entity. + /// + public string NamespaceId; + /// + /// The Title Id of the associated entity. + /// + public string TitleId; + /// + /// The Title Player Account Id of the associated entity. + /// + public string TitlePlayerAccountId; + } + + [Serializable] + public class EntityTokenResponse : PlayFabBaseModel + { + /// + /// The entity id and type. + /// + public EntityKey Entity; + /// + /// The token used to set X-EntityToken for all entity based API calls. + /// + public string EntityToken; + /// + /// The time the token will expire, if it is an expiring token, in UTC. + /// + public DateTime? TokenExpiration; + } + + /// + /// This API must be called with X-SecretKey, X-Authentication or X-EntityToken headers. An optional EntityKey may be + /// included to attempt to set the resulting EntityToken to a specific entity, however the entity must be a relation of the + /// caller, such as the master_player_account of a character. If sending X-EntityToken the account will be marked as freshly + /// logged in and will issue a new token. If using X-Authentication or X-EntityToken the header must still be valid and + /// cannot be expired or revoked. + /// + [Serializable] + public class GetEntityTokenRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The optional entity to perform this action on. Defaults to the currently logged in entity. + /// + public EntityKey Entity; + } + + [Serializable] + public class GetEntityTokenResponse : PlayFabResultCommon + { + /// + /// The entity id and type. + /// + public EntityKey Entity; + /// + /// The token used to set X-EntityToken for all entity based API calls. + /// + public string EntityToken; + /// + /// The time the token will expire, if it is an expiring token, in UTC. + /// + public DateTime? TokenExpiration; + } + + public enum IdentifiedDeviceType + { + Unknown, + XboxOne, + Scarlett, + WindowsOneCore, + WindowsOneCoreMobile, + Win32, + android, + iOS, + PlayStation, + Nintendo + } + + public enum LoginIdentityProvider + { + Unknown, + PlayFab, + Custom, + GameCenter, + GooglePlay, + Steam, + XBoxLive, + PSN, + Kongregate, + Facebook, + IOSDevice, + AndroidDevice, + Twitch, + WindowsHello, + GameServer, + CustomServer, + NintendoSwitch, + FacebookInstantGames, + OpenIdConnect, + Apple, + NintendoSwitchAccount, + GooglePlayGames, + XboxMobileStore, + King + } + + /// + /// Given an entity token, validates that it hasn't expired or been revoked and will return details of the owner. + /// + [Serializable] + public class ValidateEntityTokenRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Client EntityToken + /// + public string EntityToken; + } + + [Serializable] + public class ValidateEntityTokenResponse : PlayFabResultCommon + { + /// + /// The entity id and type. + /// + public EntityKey Entity; + /// + /// The authenticated device for this entity, for the given login + /// + public IdentifiedDeviceType? IdentifiedDeviceType; + /// + /// The identity provider for this entity, for the given login + /// + public LoginIdentityProvider? IdentityProvider; + /// + /// The ID issued by the identity provider, e.g. a XUID on Xbox Live + /// + public string IdentityProviderIssuedId; + /// + /// The lineage of this profile. + /// + public EntityLineage Lineage; + } +} +#endif diff --git a/Assets/PlayFabSDK/Authentication/PlayFabAuthenticationModels.cs.meta b/Assets/PlayFabSDK/Authentication/PlayFabAuthenticationModels.cs.meta new file mode 100644 index 00000000..defcd58c --- /dev/null +++ b/Assets/PlayFabSDK/Authentication/PlayFabAuthenticationModels.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ec656500f922b0b4db8e13c80770e0d5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Authentication/PlayFabEvents.cs b/Assets/PlayFabSDK/Authentication/PlayFabEvents.cs new file mode 100644 index 00000000..0525cc11 --- /dev/null +++ b/Assets/PlayFabSDK/Authentication/PlayFabEvents.cs @@ -0,0 +1,18 @@ +#if !DISABLE_PLAYFABENTITY_API +using PlayFab.AuthenticationModels; + +namespace PlayFab.Events +{ + public partial class PlayFabEvents + { + public event PlayFabRequestEvent OnAuthenticationAuthenticateGameServerWithCustomIdRequestEvent; + public event PlayFabResultEvent OnAuthenticationAuthenticateGameServerWithCustomIdResultEvent; + public event PlayFabRequestEvent OnAuthenticationDeleteRequestEvent; + public event PlayFabResultEvent OnAuthenticationDeleteResultEvent; + public event PlayFabRequestEvent OnAuthenticationGetEntityTokenRequestEvent; + public event PlayFabResultEvent OnAuthenticationGetEntityTokenResultEvent; + public event PlayFabRequestEvent OnAuthenticationValidateEntityTokenRequestEvent; + public event PlayFabResultEvent OnAuthenticationValidateEntityTokenResultEvent; + } +} +#endif diff --git a/Assets/PlayFabSDK/Authentication/PlayFabEvents.cs.meta b/Assets/PlayFabSDK/Authentication/PlayFabEvents.cs.meta new file mode 100644 index 00000000..8ba2d25f --- /dev/null +++ b/Assets/PlayFabSDK/Authentication/PlayFabEvents.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5c3701fef92515c438633c5d41bf87c8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Client.meta b/Assets/PlayFabSDK/Client.meta new file mode 100644 index 00000000..abcee165 --- /dev/null +++ b/Assets/PlayFabSDK/Client.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e60b45ce48f777341b2e084faa9949b3 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Client/PlayFabClientAPI.cs b/Assets/PlayFabSDK/Client/PlayFabClientAPI.cs new file mode 100644 index 00000000..d7ec5245 --- /dev/null +++ b/Assets/PlayFabSDK/Client/PlayFabClientAPI.cs @@ -0,0 +1,2311 @@ +#if !DISABLE_PLAYFABCLIENT_API && !DISABLE_PLAYFAB_STATIC_API + +using System; +using System.Collections.Generic; +using PlayFab.ClientModels; +using PlayFab.Internal; + +namespace PlayFab +{ + /// + /// APIs which provide the full range of PlayFab features available to the client - authentication, account and data + /// management, inventory, friends, matchmaking, reporting, and platform-specific functionality + /// + public static class PlayFabClientAPI + { + static PlayFabClientAPI() {} + + /// + /// Verify client login. + /// + public static bool IsClientLoggedIn() + { + return PlayFabSettings.staticPlayer.IsClientLoggedIn(); + } + + + /// + /// Clear the Client SessionToken which allows this Client to call API calls requiring login. + /// A new/fresh login will be required after calling this. + /// + public static void ForgetAllCredentials() + { + PlayFabSettings.staticPlayer.ForgetAllCredentials(); + } + + /// + /// Accepts an open trade (one that has not yet been accepted or cancelled), if the locally signed-in player is in the + /// allowed player list for the trade, or it is open to all players. If the call is successful, the offered and accepted + /// items will be swapped between the two players' inventories. + /// + public static void AcceptTrade(AcceptTradeRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/AcceptTrade", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Adds the PlayFab user, based upon a match against a supplied unique identifier, to the friend list of the local user. At + /// least one of FriendPlayFabId,FriendUsername,FriendEmail, or FriendTitleDisplayName should be initialized. + /// + public static void AddFriend(AddFriendRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/AddFriend", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Adds the specified generic service identifier to the player's PlayFab account. This is designed to allow for a PlayFab + /// ID lookup of any arbitrary service identifier a title wants to add. This identifier should never be used as + /// authentication credentials, as the intent is that it is easily accessible by other players. + /// + public static void AddGenericID(AddGenericIDRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/AddGenericID", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Adds or updates a contact email to the player's profile. + /// + public static void AddOrUpdateContactEmail(AddOrUpdateContactEmailRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/AddOrUpdateContactEmail", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Adds users to the set of those able to update both the shared data, as well as the set of users in the group. Only users + /// in the group can add new members. Shared Groups are designed for sharing data between a very small number of players, + /// please see our guide: https://docs.microsoft.com/gaming/playfab/features/social/groups/using-shared-group-data + /// + public static void AddSharedGroupMembers(AddSharedGroupMembersRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/AddSharedGroupMembers", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Adds playfab username/password auth to an existing account created via an anonymous auth method, e.g. automatic device + /// ID login. + /// + public static void AddUsernamePassword(AddUsernamePasswordRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/AddUsernamePassword", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Increments the user's balance of the specified virtual currency by the stated amount + /// + public static void AddUserVirtualCurrency(AddUserVirtualCurrencyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/AddUserVirtualCurrency", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Registers the Android device to receive push notifications + /// + public static void AndroidDevicePushNotificationRegistration(AndroidDevicePushNotificationRegistrationRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/AndroidDevicePushNotificationRegistration", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Attributes an install for advertisment. + /// + public static void AttributeInstall(AttributeInstallRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/AttributeInstall", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Cancels an open trade (one that has not yet been accepted or cancelled). Note that only the player who created the trade + /// can cancel it via this API call, to prevent griefing of the trade system (cancelling trades in order to prevent other + /// players from accepting them, for trades that can be claimed by more than one player). + /// + public static void CancelTrade(CancelTradeRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/CancelTrade", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Confirms with the payment provider that the purchase was approved (if applicable) and adjusts inventory and + /// virtual currency balances as appropriate + /// + public static void ConfirmPurchase(ConfirmPurchaseRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/ConfirmPurchase", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Consume uses of a consumable item. When all uses are consumed, it will be removed from the player's + /// inventory. + /// + public static void ConsumeItem(ConsumeItemRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/ConsumeItem", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Grants the player's current entitlements from Microsoft Store's Collection API + /// + public static void ConsumeMicrosoftStoreEntitlements(ConsumeMicrosoftStoreEntitlementsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/ConsumeMicrosoftStoreEntitlements", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Checks for any new consumable entitlements. If any are found, they are consumed (if they're consumables) and added as + /// PlayFab items + /// + public static void ConsumePS5Entitlements(ConsumePS5EntitlementsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/ConsumePS5Entitlements", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Checks for any new consumable entitlements. If any are found, they are consumed and added as PlayFab items + /// + public static void ConsumePSNEntitlements(ConsumePSNEntitlementsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/ConsumePSNEntitlements", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Grants the player's current entitlements from Xbox Live, consuming all availble items in Xbox and granting them to the + /// player's PlayFab inventory. This call is idempotent and will not grant previously granted items to the player. + /// + public static void ConsumeXboxEntitlements(ConsumeXboxEntitlementsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/ConsumeXboxEntitlements", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Requests the creation of a shared group object, containing key/value pairs which may be updated by all members of the + /// group. Upon creation, the current user will be the only member of the group. Shared Groups are designed for sharing data + /// between a very small number of players, please see our guide: + /// https://docs.microsoft.com/gaming/playfab/features/social/groups/using-shared-group-data + /// + public static void CreateSharedGroup(CreateSharedGroupRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/CreateSharedGroup", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Executes a CloudScript function, with the 'currentPlayerId' set to the PlayFab ID of the authenticated player. The + /// PlayFab ID is the entity ID of the player's master_player_account entity. + /// + public static void ExecuteCloudScript(ExecuteCloudScriptRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/ExecuteCloudScript", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + public static void ExecuteCloudScript(ExecuteCloudScriptRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn, "Must be logged in to call this method"); + Action wrappedResultCallback = (wrappedResult) => + { + var serializer = PluginManager.GetPlugin(PluginContract.PlayFab_Serializer); + var wrappedJson = serializer.SerializeObject(wrappedResult.FunctionResult); + try { + wrappedResult.FunctionResult = serializer.DeserializeObject(wrappedJson); + } catch (Exception) { + wrappedResult.FunctionResult = wrappedJson; + wrappedResult.Logs.Add(new LogStatement { Level = "Warning", Data = wrappedJson, Message = "Sdk Message: Could not deserialize result as: " + typeof(TOut).Name }); + } + resultCallback(wrappedResult); + }; + PlayFabHttp.MakeApiCall("/Client/ExecuteCloudScript", request, AuthType.LoginSession, wrappedResultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the user's PlayFab account details + /// + public static void GetAccountInfo(GetAccountInfoRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetAccountInfo", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Returns a list of ad placements and a reward for each + /// + public static void GetAdPlacements(GetAdPlacementsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetAdPlacements", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Lists all of the characters that belong to a specific user. CharacterIds are not globally unique; characterId must be + /// evaluated with the parent PlayFabId to guarantee uniqueness. + /// + public static void GetAllUsersCharacters(ListUsersCharactersRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetAllUsersCharacters", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Retrieves the specified version of the title's catalog of virtual goods, including all defined properties + /// + public static void GetCatalogItems(GetCatalogItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetCatalogItems", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the title-specific custom data for the character which is readable and writable by the client + /// + public static void GetCharacterData(GetCharacterDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetCharacterData", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Retrieves the specified character's current inventory of virtual goods + /// + public static void GetCharacterInventory(GetCharacterInventoryRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetCharacterInventory", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves a list of ranked characters for the given statistic, starting from the indicated point in the leaderboard + /// + public static void GetCharacterLeaderboard(GetCharacterLeaderboardRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetCharacterLeaderboard", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the title-specific custom data for the character which can only be read by the client + /// + public static void GetCharacterReadOnlyData(GetCharacterDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetCharacterReadOnlyData", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the details of all title-specific statistics for the user + /// + public static void GetCharacterStatistics(GetCharacterStatisticsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetCharacterStatistics", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// This API retrieves a pre-signed URL for accessing a content file for the title. A subsequent HTTP GET to the returned + /// URL will attempt to download the content. A HEAD query to the returned URL will attempt to retrieve the metadata of the + /// content. Note that a successful result does not guarantee the existence of this content - if it has not been uploaded, + /// the query to retrieve the data will fail. See this post for more information: + /// https://community.playfab.com/hc/community/posts/205469488-How-to-upload-files-to-PlayFab-s-Content-Service. Also, + /// please be aware that the Content service is specifically PlayFab's CDN offering, for which standard CDN rates apply. + /// + public static void GetContentDownloadUrl(GetContentDownloadUrlRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetContentDownloadUrl", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves a list of ranked friends of the current player for the given statistic, starting from the indicated point in + /// the leaderboard + /// + public static void GetFriendLeaderboard(GetFriendLeaderboardRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetFriendLeaderboard", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves a list of ranked friends of the current player for the given statistic, centered on the requested PlayFab + /// user. If PlayFabId is empty or null will return currently logged in user. + /// + public static void GetFriendLeaderboardAroundPlayer(GetFriendLeaderboardAroundPlayerRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetFriendLeaderboardAroundPlayer", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the current friend list for the local user, constrained to users who have PlayFab accounts. Friends from + /// linked accounts (Facebook, Steam) are also included. You may optionally exclude some linked services' friends. + /// + public static void GetFriendsList(GetFriendsListRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetFriendsList", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves a list of ranked users for the given statistic, starting from the indicated point in the leaderboard + /// + public static void GetLeaderboard(GetLeaderboardRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetLeaderboard", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves a list of ranked characters for the given statistic, centered on the requested Character ID + /// + public static void GetLeaderboardAroundCharacter(GetLeaderboardAroundCharacterRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetLeaderboardAroundCharacter", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves a list of ranked users for the given statistic, centered on the requested player. If PlayFabId is empty or + /// null will return currently logged in user. + /// + public static void GetLeaderboardAroundPlayer(GetLeaderboardAroundPlayerRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetLeaderboardAroundPlayer", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves a list of all of the user's characters for the given statistic. + /// + public static void GetLeaderboardForUserCharacters(GetLeaderboardForUsersCharactersRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetLeaderboardForUserCharacters", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ For payments flows where the provider requires playfab (the fulfiller) to initiate the transaction, but the + /// client completes the rest of the flow. In the Xsolla case, the token returned here will be passed to Xsolla by the + /// client to create a cart. Poll GetPurchase using the returned OrderId once you've completed the payment. + /// + public static void GetPaymentToken(GetPaymentTokenRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetPaymentToken", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets a Photon custom authentication token that can be used to securely join the player into a Photon room. See + /// https://docs.microsoft.com/gaming/playfab/features/multiplayer/photon/quickstart for more details. + /// + public static void GetPhotonAuthenticationToken(GetPhotonAuthenticationTokenRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetPhotonAuthenticationToken", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves all of the user's different kinds of info. + /// + public static void GetPlayerCombinedInfo(GetPlayerCombinedInfoRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetPlayerCombinedInfo", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the player's profile + /// + public static void GetPlayerProfile(GetPlayerProfileRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetPlayerProfile", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// List all segments that a player currently belongs to at this moment in time. + /// + public static void GetPlayerSegments(GetPlayerSegmentsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetPlayerSegments", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the indicated statistics (current version and values for all statistics, if none are specified), for the local + /// player. + /// + public static void GetPlayerStatistics(GetPlayerStatisticsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetPlayerStatistics", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the information on the available versions of the specified statistic. + /// + public static void GetPlayerStatisticVersions(GetPlayerStatisticVersionsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetPlayerStatisticVersions", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Get all tags with a given Namespace (optional) from a player profile. + /// + public static void GetPlayerTags(GetPlayerTagsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetPlayerTags", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets all trades the player has either opened or accepted, optionally filtered by trade status. + /// + public static void GetPlayerTrades(GetPlayerTradesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetPlayerTrades", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of Facebook identifiers. + /// + public static void GetPlayFabIDsFromFacebookIDs(GetPlayFabIDsFromFacebookIDsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetPlayFabIDsFromFacebookIDs", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of Facebook Instant Game identifiers. + /// + public static void GetPlayFabIDsFromFacebookInstantGamesIds(GetPlayFabIDsFromFacebookInstantGamesIdsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetPlayFabIDsFromFacebookInstantGamesIds", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of Game Center identifiers (referenced in the Game Center + /// Programming Guide as the Player Identifier). + /// + public static void GetPlayFabIDsFromGameCenterIDs(GetPlayFabIDsFromGameCenterIDsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetPlayFabIDsFromGameCenterIDs", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of generic service identifiers. A generic identifier is the + /// service name plus the service-specific ID for the player, as specified by the title when the generic identifier was + /// added to the player account. + /// + public static void GetPlayFabIDsFromGenericIDs(GetPlayFabIDsFromGenericIDsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetPlayFabIDsFromGenericIDs", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of Google identifiers. The Google identifiers are the IDs for + /// the user accounts, available as "id" in the Google+ People API calls. + /// + public static void GetPlayFabIDsFromGoogleIDs(GetPlayFabIDsFromGoogleIDsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetPlayFabIDsFromGoogleIDs", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of Google Play Games identifiers. The Google Play Games + /// identifiers are the IDs for the user accounts, available as "playerId" in the Google Play Games Services - Players API + /// calls. + /// + public static void GetPlayFabIDsFromGooglePlayGamesPlayerIDs(GetPlayFabIDsFromGooglePlayGamesPlayerIDsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetPlayFabIDsFromGooglePlayGamesPlayerIDs", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of Kongregate identifiers. The Kongregate identifiers are the + /// IDs for the user accounts, available as "user_id" from the Kongregate API methods(ex: + /// http://developers.kongregate.com/docs/client/getUserId). + /// + public static void GetPlayFabIDsFromKongregateIDs(GetPlayFabIDsFromKongregateIDsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetPlayFabIDsFromKongregateIDs", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of Nintendo Service Account identifiers. + /// + public static void GetPlayFabIDsFromNintendoServiceAccountIds(GetPlayFabIDsFromNintendoServiceAccountIdsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetPlayFabIDsFromNintendoServiceAccountIds", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of Nintendo Switch Device identifiers. + /// + public static void GetPlayFabIDsFromNintendoSwitchDeviceIds(GetPlayFabIDsFromNintendoSwitchDeviceIdsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetPlayFabIDsFromNintendoSwitchDeviceIds", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of PlayStation :tm: Network identifiers. + /// + public static void GetPlayFabIDsFromPSNAccountIDs(GetPlayFabIDsFromPSNAccountIDsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetPlayFabIDsFromPSNAccountIDs", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of PlayStation :tm: Network identifiers. + /// + public static void GetPlayFabIDsFromPSNOnlineIDs(GetPlayFabIDsFromPSNOnlineIDsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetPlayFabIDsFromPSNOnlineIDs", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of Steam identifiers. The Steam identifiers are the profile + /// IDs for the user accounts, available as SteamId in the Steamworks Community API calls. + /// + public static void GetPlayFabIDsFromSteamIDs(GetPlayFabIDsFromSteamIDsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetPlayFabIDsFromSteamIDs", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of Twitch identifiers. The Twitch identifiers are the IDs for + /// the user accounts, available as "_id" from the Twitch API methods (ex: + /// https://github.com/justintv/Twitch-API/blob/master/v3_resources/users.md#get-usersuser). + /// + public static void GetPlayFabIDsFromTwitchIDs(GetPlayFabIDsFromTwitchIDsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetPlayFabIDsFromTwitchIDs", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of XboxLive identifiers. + /// + public static void GetPlayFabIDsFromXboxLiveIDs(GetPlayFabIDsFromXboxLiveIDsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetPlayFabIDsFromXboxLiveIDs", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the key-value store of custom publisher settings + /// + public static void GetPublisherData(GetPublisherDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetPublisherData", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Retrieves a purchase along with its current PlayFab status. Returns inventory items from the purchase that + /// are still active. + /// + public static void GetPurchase(GetPurchaseRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetPurchase", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves data stored in a shared group object, as well as the list of members in the group. Non-members of the group + /// may use this to retrieve group data, including membership, but they will not receive data for keys marked as private. + /// Shared Groups are designed for sharing data between a very small number of players, please see our guide: + /// https://docs.microsoft.com/gaming/playfab/features/social/groups/using-shared-group-data + /// + public static void GetSharedGroupData(GetSharedGroupDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetSharedGroupData", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Retrieves the set of items defined for the specified store, including all prices defined + /// + public static void GetStoreItems(GetStoreItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetStoreItems", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the current server time + /// + public static void GetTime(GetTimeRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetTime", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the key-value store of custom title settings + /// + public static void GetTitleData(GetTitleDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetTitleData", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the title news feed, as configured in the developer portal + /// + public static void GetTitleNews(GetTitleNewsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetTitleNews", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Returns the title's base 64 encoded RSA CSP blob. + /// + public static void GetTitlePublicKey(GetTitlePublicKeyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + + + PlayFabHttp.MakeApiCall("/Client/GetTitlePublicKey", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets the current status of an existing trade. + /// + public static void GetTradeStatus(GetTradeStatusRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetTradeStatus", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the title-specific custom data for the user which is readable and writable by the client + /// + public static void GetUserData(GetUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetUserData", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Retrieves the user's current inventory of virtual goods + /// + public static void GetUserInventory(GetUserInventoryRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetUserInventory", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the publisher-specific custom data for the user which is readable and writable by the client + /// + public static void GetUserPublisherData(GetUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetUserPublisherData", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the publisher-specific custom data for the user which can only be read by the client + /// + public static void GetUserPublisherReadOnlyData(GetUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetUserPublisherReadOnlyData", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the title-specific custom data for the user which can only be read by the client + /// + public static void GetUserReadOnlyData(GetUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetUserReadOnlyData", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Grants the specified character type to the user. CharacterIds are not globally unique; characterId must be evaluated + /// with the parent PlayFabId to guarantee uniqueness. + /// + public static void GrantCharacterToUser(GrantCharacterToUserRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GrantCharacterToUser", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Links the Android device identifier to the user's PlayFab account + /// + public static void LinkAndroidDeviceID(LinkAndroidDeviceIDRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/LinkAndroidDeviceID", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Links the Apple account associated with the token to the user's PlayFab account. + /// + public static void LinkApple(LinkAppleRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/LinkApple", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Links the custom identifier, generated by the title, to the user's PlayFab account + /// + public static void LinkCustomID(LinkCustomIDRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/LinkCustomID", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Links the Facebook account associated with the provided Facebook access token to the user's PlayFab account + /// + public static void LinkFacebookAccount(LinkFacebookAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/LinkFacebookAccount", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Links the Facebook Instant Games Id to the user's PlayFab account + /// + public static void LinkFacebookInstantGamesId(LinkFacebookInstantGamesIdRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/LinkFacebookInstantGamesId", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Links the Game Center account associated with the provided Game Center ID to the user's PlayFab account. Logging in with + /// a Game Center ID is insecure if you do not include the optional PublicKeyUrl, Salt, Signature, and Timestamp parameters + /// in this request. It is recommended you require these parameters on all Game Center calls by going to the Apple Add-ons + /// page in the PlayFab Game Manager and enabling the 'Require secure authentication only for this app' option. + /// + public static void LinkGameCenterAccount(LinkGameCenterAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/LinkGameCenterAccount", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Links the currently signed-in user account to their Google account, using their Google account credentials + /// + public static void LinkGoogleAccount(LinkGoogleAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/LinkGoogleAccount", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Links the currently signed-in user account to their Google Play Games account, using their Google Play Games account + /// credentials + /// + public static void LinkGooglePlayGamesServicesAccount(LinkGooglePlayGamesServicesAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/LinkGooglePlayGamesServicesAccount", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Links the vendor-specific iOS device identifier to the user's PlayFab account + /// + public static void LinkIOSDeviceID(LinkIOSDeviceIDRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/LinkIOSDeviceID", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Links the Kongregate identifier to the user's PlayFab account + /// + public static void LinkKongregate(LinkKongregateAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/LinkKongregate", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Links the Nintendo account associated with the token to the user's PlayFab account. + /// + public static void LinkNintendoServiceAccount(LinkNintendoServiceAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/LinkNintendoServiceAccount", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Links the NintendoSwitchDeviceId to the user's PlayFab account + /// + public static void LinkNintendoSwitchDeviceId(LinkNintendoSwitchDeviceIdRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/LinkNintendoSwitchDeviceId", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Links an OpenID Connect account to a user's PlayFab account, based on an existing relationship between a title and an + /// Open ID Connect provider and the OpenId Connect JWT from that provider. + /// + public static void LinkOpenIdConnect(LinkOpenIdConnectRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/LinkOpenIdConnect", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Links the PlayStation :tm: Network account associated with the provided access code to the user's PlayFab account + /// + public static void LinkPSNAccount(LinkPSNAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/LinkPSNAccount", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Links the Steam account associated with the provided Steam authentication ticket to the user's PlayFab account + /// + public static void LinkSteamAccount(LinkSteamAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/LinkSteamAccount", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Links the Twitch account associated with the token to the user's PlayFab account. + /// + public static void LinkTwitch(LinkTwitchAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/LinkTwitch", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Links the Xbox Live account associated with the provided access code to the user's PlayFab account + /// + public static void LinkXboxAccount(LinkXboxAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/LinkXboxAccount", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Signs the user in using the Android device identifier, returning a session identifier that can subsequently be used for + /// API calls which require an authenticated user + /// + public static void LoginWithAndroidDeviceID(LoginWithAndroidDeviceIDRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + + + PlayFabHttp.MakeApiCall("/Client/LoginWithAndroidDeviceID", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Signs in the user with a Sign in with Apple identity token. + /// + public static void LoginWithApple(LoginWithAppleRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + + + PlayFabHttp.MakeApiCall("/Client/LoginWithApple", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Signs the user in using a custom unique identifier generated by the title, returning a session identifier that can + /// subsequently be used for API calls which require an authenticated user + /// + public static void LoginWithCustomID(LoginWithCustomIDRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + + + PlayFabHttp.MakeApiCall("/Client/LoginWithCustomID", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Signs the user into the PlayFab account, returning a session identifier that can subsequently be used for API calls + /// which require an authenticated user. Unlike most other login API calls, LoginWithEmailAddress does not permit the + /// creation of new accounts via the CreateAccountFlag. Email addresses may be used to create accounts via + /// RegisterPlayFabUser. + /// + public static void LoginWithEmailAddress(LoginWithEmailAddressRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + + + PlayFabHttp.MakeApiCall("/Client/LoginWithEmailAddress", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Signs the user in using a Facebook access token, returning a session identifier that can subsequently be used for API + /// calls which require an authenticated user + /// + public static void LoginWithFacebook(LoginWithFacebookRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + + + PlayFabHttp.MakeApiCall("/Client/LoginWithFacebook", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Signs the user in using a Facebook Instant Games ID, returning a session identifier that can subsequently be used for + /// API calls which require an authenticated user. Requires Facebook Instant Games to be configured. + /// + public static void LoginWithFacebookInstantGamesId(LoginWithFacebookInstantGamesIdRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + + + PlayFabHttp.MakeApiCall("/Client/LoginWithFacebookInstantGamesId", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Signs the user in using an iOS Game Center player identifier, returning a session identifier that can subsequently be + /// used for API calls which require an authenticated user. Logging in with a Game Center ID is insecure if you do not + /// include the optional PublicKeyUrl, Salt, Signature, and Timestamp parameters in this request. It is recommended you + /// require these parameters on all Game Center calls by going to the Apple Add-ons page in the PlayFab Game Manager and + /// enabling the 'Require secure authentication only for this app' option. + /// + public static void LoginWithGameCenter(LoginWithGameCenterRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + + + PlayFabHttp.MakeApiCall("/Client/LoginWithGameCenter", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Signs the user in using their Google account credentials + /// + public static void LoginWithGoogleAccount(LoginWithGoogleAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + + + PlayFabHttp.MakeApiCall("/Client/LoginWithGoogleAccount", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Signs the user in using their Google Play Games account credentials + /// + public static void LoginWithGooglePlayGamesServices(LoginWithGooglePlayGamesServicesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + + + PlayFabHttp.MakeApiCall("/Client/LoginWithGooglePlayGamesServices", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Signs the user in using the vendor-specific iOS device identifier, returning a session identifier that can subsequently + /// be used for API calls which require an authenticated user + /// + public static void LoginWithIOSDeviceID(LoginWithIOSDeviceIDRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + + + PlayFabHttp.MakeApiCall("/Client/LoginWithIOSDeviceID", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Signs the user in using a Kongregate player account. + /// + public static void LoginWithKongregate(LoginWithKongregateRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + + + PlayFabHttp.MakeApiCall("/Client/LoginWithKongregate", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Signs in the user with a Nintendo service account token. + /// + public static void LoginWithNintendoServiceAccount(LoginWithNintendoServiceAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + + + PlayFabHttp.MakeApiCall("/Client/LoginWithNintendoServiceAccount", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Signs the user in using a Nintendo Switch Device ID, returning a session identifier that can subsequently be used for + /// API calls which require an authenticated user + /// + public static void LoginWithNintendoSwitchDeviceId(LoginWithNintendoSwitchDeviceIdRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + + + PlayFabHttp.MakeApiCall("/Client/LoginWithNintendoSwitchDeviceId", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Logs in a user with an Open ID Connect JWT created by an existing relationship between a title and an Open ID Connect + /// provider. + /// + public static void LoginWithOpenIdConnect(LoginWithOpenIdConnectRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + + + PlayFabHttp.MakeApiCall("/Client/LoginWithOpenIdConnect", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Signs the user into the PlayFab account, returning a session identifier that can subsequently be used for API calls + /// which require an authenticated user. Unlike most other login API calls, LoginWithPlayFab does not permit the creation of + /// new accounts via the CreateAccountFlag. Username/Password credentials may be used to create accounts via + /// RegisterPlayFabUser, or added to existing accounts using AddUsernamePassword. + /// + public static void LoginWithPlayFab(LoginWithPlayFabRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + + + PlayFabHttp.MakeApiCall("/Client/LoginWithPlayFab", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Signs the user in using a PlayStation :tm: Network authentication code, returning a session identifier that can + /// subsequently be used for API calls which require an authenticated user + /// + public static void LoginWithPSN(LoginWithPSNRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + + + PlayFabHttp.MakeApiCall("/Client/LoginWithPSN", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Signs the user in using a Steam authentication ticket, returning a session identifier that can subsequently be used for + /// API calls which require an authenticated user + /// + public static void LoginWithSteam(LoginWithSteamRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + + + PlayFabHttp.MakeApiCall("/Client/LoginWithSteam", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Signs the user in using a Twitch access token. + /// + public static void LoginWithTwitch(LoginWithTwitchRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + + + PlayFabHttp.MakeApiCall("/Client/LoginWithTwitch", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Signs the user in using a Xbox Live Token, returning a session identifier that can subsequently be used for API calls + /// which require an authenticated user + /// + public static void LoginWithXbox(LoginWithXboxRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + + + PlayFabHttp.MakeApiCall("/Client/LoginWithXbox", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Opens a new outstanding trade. Note that a given item instance may only be in one open trade at a time. + /// + public static void OpenTrade(OpenTradeRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/OpenTrade", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Selects a payment option for purchase order created via StartPurchase + /// + public static void PayForPurchase(PayForPurchaseRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/PayForPurchase", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Buys a single item with virtual currency. You must specify both the virtual currency to use to purchase, as + /// well as what the client believes the price to be. This lets the server fail the purchase if the price has changed. + /// + public static void PurchaseItem(PurchaseItemRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/PurchaseItem", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Adds the virtual goods associated with the coupon to the user's inventory. Coupons can be generated via the + /// Economy->Catalogs tab in the PlayFab Game Manager. + /// + public static void RedeemCoupon(RedeemCouponRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/RedeemCoupon", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Uses the supplied OAuth code to refresh the internally cached player PlayStation :tm: Network auth token + /// + public static void RefreshPSNAuthToken(RefreshPSNAuthTokenRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/RefreshPSNAuthToken", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Registers the iOS device to receive push notifications + /// + public static void RegisterForIOSPushNotification(RegisterForIOSPushNotificationRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/RegisterForIOSPushNotification", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Registers a new Playfab user account, returning a session identifier that can subsequently be used for API calls which + /// require an authenticated user. You must supply a username and an email address. + /// + public static void RegisterPlayFabUser(RegisterPlayFabUserRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + + + PlayFabHttp.MakeApiCall("/Client/RegisterPlayFabUser", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Removes a contact email from the player's profile. + /// + public static void RemoveContactEmail(RemoveContactEmailRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/RemoveContactEmail", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Removes a specified user from the friend list of the local user + /// + public static void RemoveFriend(RemoveFriendRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/RemoveFriend", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Removes the specified generic service identifier from the player's PlayFab account. + /// + public static void RemoveGenericID(RemoveGenericIDRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/RemoveGenericID", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Removes users from the set of those able to update the shared data and the set of users in the group. Only users in the + /// group can remove members. If as a result of the call, zero users remain with access, the group and its associated data + /// will be deleted. Shared Groups are designed for sharing data between a very small number of players, please see our + /// guide: https://docs.microsoft.com/gaming/playfab/features/social/groups/using-shared-group-data + /// + public static void RemoveSharedGroupMembers(RemoveSharedGroupMembersRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/RemoveSharedGroupMembers", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Report player's ad activity + /// + public static void ReportAdActivity(ReportAdActivityRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/ReportAdActivity", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Write a PlayStream event to describe the provided player device information. This API method is not designed to be + /// called directly by developers. Each PlayFab client SDK will eventually report this information automatically. + /// + public static void ReportDeviceInfo(DeviceInfoRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/ReportDeviceInfo", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Submit a report for another player (due to bad bahavior, etc.), so that customer service representatives for the title + /// can take action concerning potentially toxic players. + /// + public static void ReportPlayer(ReportPlayerClientRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/ReportPlayer", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Restores all in-app purchases based on the given restore receipt + /// + public static void RestoreIOSPurchases(RestoreIOSPurchasesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/RestoreIOSPurchases", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Reward player's ad activity + /// + public static void RewardAdActivity(RewardAdActivityRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/RewardAdActivity", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Forces an email to be sent to the registered email address for the user's account, with a link allowing the user to + /// change the password.If an account recovery email template ID is provided, an email using the custom email template will + /// be used. + /// + public static void SendAccountRecoveryEmail(SendAccountRecoveryEmailRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + + + PlayFabHttp.MakeApiCall("/Client/SendAccountRecoveryEmail", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates the tag list for a specified user in the friend list of the local user + /// + public static void SetFriendTags(SetFriendTagsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/SetFriendTags", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Sets the player's secret if it is not already set. Player secrets are used to sign API requests. To reset a player's + /// secret use the Admin or Server API method SetPlayerSecret. + /// + public static void SetPlayerSecret(SetPlayerSecretRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/SetPlayerSecret", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Creates an order for a list of items from the title catalog + /// + public static void StartPurchase(StartPurchaseRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/StartPurchase", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Decrements the user's balance of the specified virtual currency by the stated amount. It is possible to make + /// a VC balance negative with this API. + /// + public static void SubtractUserVirtualCurrency(SubtractUserVirtualCurrencyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/SubtractUserVirtualCurrency", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Unlinks the related Android device identifier from the user's PlayFab account + /// + public static void UnlinkAndroidDeviceID(UnlinkAndroidDeviceIDRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/UnlinkAndroidDeviceID", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Unlinks the related Apple account from the user's PlayFab account. + /// + public static void UnlinkApple(UnlinkAppleRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/UnlinkApple", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Unlinks the related custom identifier from the user's PlayFab account + /// + public static void UnlinkCustomID(UnlinkCustomIDRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/UnlinkCustomID", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Unlinks the related Facebook account from the user's PlayFab account + /// + public static void UnlinkFacebookAccount(UnlinkFacebookAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/UnlinkFacebookAccount", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Unlinks the related Facebook Instant Game Ids from the user's PlayFab account + /// + public static void UnlinkFacebookInstantGamesId(UnlinkFacebookInstantGamesIdRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/UnlinkFacebookInstantGamesId", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Unlinks the related Game Center account from the user's PlayFab account + /// + public static void UnlinkGameCenterAccount(UnlinkGameCenterAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/UnlinkGameCenterAccount", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Unlinks the related Google account from the user's PlayFab account + /// (https://developers.google.com/android/reference/com/google/android/gms/auth/GoogleAuthUtil#public-methods). + /// + public static void UnlinkGoogleAccount(UnlinkGoogleAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/UnlinkGoogleAccount", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Unlinks the related Google Play Games account from the user's PlayFab account. + /// + public static void UnlinkGooglePlayGamesServicesAccount(UnlinkGooglePlayGamesServicesAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/UnlinkGooglePlayGamesServicesAccount", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Unlinks the related iOS device identifier from the user's PlayFab account + /// + public static void UnlinkIOSDeviceID(UnlinkIOSDeviceIDRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/UnlinkIOSDeviceID", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Unlinks the related Kongregate identifier from the user's PlayFab account + /// + public static void UnlinkKongregate(UnlinkKongregateAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/UnlinkKongregate", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Unlinks the related Nintendo account from the user's PlayFab account. + /// + public static void UnlinkNintendoServiceAccount(UnlinkNintendoServiceAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/UnlinkNintendoServiceAccount", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Unlinks the related NintendoSwitchDeviceId from the user's PlayFab account + /// + public static void UnlinkNintendoSwitchDeviceId(UnlinkNintendoSwitchDeviceIdRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/UnlinkNintendoSwitchDeviceId", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Unlinks an OpenID Connect account from a user's PlayFab account, based on the connection ID of an existing relationship + /// between a title and an Open ID Connect provider. + /// + public static void UnlinkOpenIdConnect(UnlinkOpenIdConnectRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/UnlinkOpenIdConnect", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Unlinks the related PlayStation :tm: Network account from the user's PlayFab account + /// + public static void UnlinkPSNAccount(UnlinkPSNAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/UnlinkPSNAccount", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Unlinks the related Steam account from the user's PlayFab account + /// + public static void UnlinkSteamAccount(UnlinkSteamAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/UnlinkSteamAccount", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Unlinks the related Twitch account from the user's PlayFab account. + /// + public static void UnlinkTwitch(UnlinkTwitchAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/UnlinkTwitch", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Unlinks the related Xbox Live account from the user's PlayFab account + /// + public static void UnlinkXboxAccount(UnlinkXboxAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/UnlinkXboxAccount", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Opens the specified container, with the specified key (when required), and returns the contents of the + /// opened container. If the container (and key when relevant) are consumable (RemainingUses > 0), their RemainingUses will + /// be decremented, consistent with the operation of ConsumeItem. + /// + public static void UnlockContainerInstance(UnlockContainerInstanceRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/UnlockContainerInstance", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Searches target inventory for an ItemInstance matching the given CatalogItemId, if necessary unlocks it + /// using an appropriate key, and returns the contents of the opened container. If the container (and key when relevant) are + /// consumable (RemainingUses > 0), their RemainingUses will be decremented, consistent with the operation of ConsumeItem. + /// + public static void UnlockContainerItem(UnlockContainerItemRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/UnlockContainerItem", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Update the avatar URL of the player + /// + public static void UpdateAvatarUrl(UpdateAvatarUrlRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/UpdateAvatarUrl", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Creates and updates the title-specific custom data for the user's character which is readable and writable by the client + /// + public static void UpdateCharacterData(UpdateCharacterDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/UpdateCharacterData", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates the values of the specified title-specific statistics for the specific character. By default, clients are not + /// permitted to update statistics. Developers may override this setting in the Game Manager > Settings > API Features. + /// + public static void UpdateCharacterStatistics(UpdateCharacterStatisticsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/UpdateCharacterStatistics", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates the values of the specified title-specific statistics for the user. By default, clients are not permitted to + /// update statistics. Developers may override this setting in the Game Manager > Settings > API Features. + /// + public static void UpdatePlayerStatistics(UpdatePlayerStatisticsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/UpdatePlayerStatistics", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Adds, updates, and removes data keys for a shared group object. If the permission is set to Public, all fields updated + /// or added in this call will be readable by users not in the group. By default, data permissions are set to Private. + /// Regardless of the permission setting, only members of the group can update the data. Shared Groups are designed for + /// sharing data between a very small number of players, please see our guide: + /// https://docs.microsoft.com/gaming/playfab/features/social/groups/using-shared-group-data + /// + public static void UpdateSharedGroupData(UpdateSharedGroupDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/UpdateSharedGroupData", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Creates and updates the title-specific custom data for the user which is readable and writable by the client + /// + public static void UpdateUserData(UpdateUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/UpdateUserData", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Creates and updates the publisher-specific custom data for the user which is readable and writable by the client + /// + public static void UpdateUserPublisherData(UpdateUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/UpdateUserPublisherData", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates the title specific display name for the user + /// + public static void UpdateUserTitleDisplayName(UpdateUserTitleDisplayNameRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/UpdateUserTitleDisplayName", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Validates with Amazon that the receipt for an Amazon App Store in-app purchase is valid and that it matches + /// the purchased catalog item + /// + public static void ValidateAmazonIAPReceipt(ValidateAmazonReceiptRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/ValidateAmazonIAPReceipt", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Validates a Google Play purchase and gives the corresponding item to the player. + /// + public static void ValidateGooglePlayPurchase(ValidateGooglePlayPurchaseRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/ValidateGooglePlayPurchase", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Validates with the Apple store that the receipt for an iOS in-app purchase is valid and that it matches the + /// purchased catalog item + /// + public static void ValidateIOSReceipt(ValidateIOSReceiptRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/ValidateIOSReceipt", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Validates with Windows that the receipt for an Windows App Store in-app purchase is valid and that it + /// matches the purchased catalog item + /// + public static void ValidateWindowsStoreReceipt(ValidateWindowsReceiptRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/ValidateWindowsStoreReceipt", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Writes a character-based event into PlayStream. + /// + public static void WriteCharacterEvent(WriteClientCharacterEventRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/WriteCharacterEvent", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Writes a player-based event into PlayStream. + /// + public static void WritePlayerEvent(WriteClientPlayerEventRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/WritePlayerEvent", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Writes a title-based event into PlayStream. + /// + public static void WriteTitleEvent(WriteTitleEventRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/WriteTitleEvent", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + + } +} + +#endif diff --git a/Assets/PlayFabSDK/Client/PlayFabClientAPI.cs.meta b/Assets/PlayFabSDK/Client/PlayFabClientAPI.cs.meta new file mode 100644 index 00000000..2050daf5 --- /dev/null +++ b/Assets/PlayFabSDK/Client/PlayFabClientAPI.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 90390500e82fe784caf147e8a6dee649 +timeCreated: 1468524876 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Client/PlayFabClientInstanceAPI.cs b/Assets/PlayFabSDK/Client/PlayFabClientInstanceAPI.cs new file mode 100644 index 00000000..321b6418 --- /dev/null +++ b/Assets/PlayFabSDK/Client/PlayFabClientInstanceAPI.cs @@ -0,0 +1,2008 @@ +#if !DISABLE_PLAYFABCLIENT_API + +using System; +using System.Collections.Generic; +using PlayFab.ClientModels; +using PlayFab.Internal; +using PlayFab.SharedModels; + +namespace PlayFab +{ + /// + /// APIs which provide the full range of PlayFab features available to the client - authentication, account and data + /// management, inventory, friends, matchmaking, reporting, and platform-specific functionality + /// + public class PlayFabClientInstanceAPI : IPlayFabInstanceApi + { + public readonly PlayFabApiSettings apiSettings = null; + public readonly PlayFabAuthenticationContext authenticationContext = null; + + public PlayFabClientInstanceAPI() + { + authenticationContext = new PlayFabAuthenticationContext(); + } + + public PlayFabClientInstanceAPI(PlayFabApiSettings settings) + { + apiSettings = settings; + authenticationContext = new PlayFabAuthenticationContext(); + } + + public PlayFabClientInstanceAPI(PlayFabAuthenticationContext context) + { + authenticationContext = context ?? new PlayFabAuthenticationContext(); + } + + public PlayFabClientInstanceAPI(PlayFabApiSettings settings, PlayFabAuthenticationContext context) + { + apiSettings = settings; + authenticationContext = context ?? new PlayFabAuthenticationContext(); + } + + /// + /// Verify client login. + /// + public bool IsClientLoggedIn() + { + return authenticationContext == null ? false : authenticationContext.IsClientLoggedIn(); + } + + /// + /// Clear the Client SessionToken which allows this Client to call API calls requiring login. + /// A new/fresh login will be required after calling this. + /// + public void ForgetAllCredentials() + { + if (authenticationContext != null) + { + authenticationContext.ForgetAllCredentials(); + } + } + + /// + /// Accepts an open trade (one that has not yet been accepted or cancelled), if the locally signed-in player is in the + /// allowed player list for the trade, or it is open to all players. If the call is successful, the offered and accepted + /// items will be swapped between the two players' inventories. + /// + public void AcceptTrade(AcceptTradeRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/AcceptTrade", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Adds the PlayFab user, based upon a match against a supplied unique identifier, to the friend list of the local user. At + /// least one of FriendPlayFabId,FriendUsername,FriendEmail, or FriendTitleDisplayName should be initialized. + /// + public void AddFriend(AddFriendRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/AddFriend", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Adds the specified generic service identifier to the player's PlayFab account. This is designed to allow for a PlayFab + /// ID lookup of any arbitrary service identifier a title wants to add. This identifier should never be used as + /// authentication credentials, as the intent is that it is easily accessible by other players. + /// + public void AddGenericID(AddGenericIDRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/AddGenericID", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Adds or updates a contact email to the player's profile. + /// + public void AddOrUpdateContactEmail(AddOrUpdateContactEmailRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/AddOrUpdateContactEmail", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Adds users to the set of those able to update both the shared data, as well as the set of users in the group. Only users + /// in the group can add new members. Shared Groups are designed for sharing data between a very small number of players, + /// please see our guide: https://docs.microsoft.com/gaming/playfab/features/social/groups/using-shared-group-data + /// + public void AddSharedGroupMembers(AddSharedGroupMembersRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/AddSharedGroupMembers", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Adds playfab username/password auth to an existing account created via an anonymous auth method, e.g. automatic device + /// ID login. + /// + public void AddUsernamePassword(AddUsernamePasswordRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/AddUsernamePassword", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Increments the user's balance of the specified virtual currency by the stated amount + /// + public void AddUserVirtualCurrency(AddUserVirtualCurrencyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/AddUserVirtualCurrency", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Registers the Android device to receive push notifications + /// + public void AndroidDevicePushNotificationRegistration(AndroidDevicePushNotificationRegistrationRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/AndroidDevicePushNotificationRegistration", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Attributes an install for advertisment. + /// + public void AttributeInstall(AttributeInstallRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/AttributeInstall", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Cancels an open trade (one that has not yet been accepted or cancelled). Note that only the player who created the trade + /// can cancel it via this API call, to prevent griefing of the trade system (cancelling trades in order to prevent other + /// players from accepting them, for trades that can be claimed by more than one player). + /// + public void CancelTrade(CancelTradeRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/CancelTrade", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Confirms with the payment provider that the purchase was approved (if applicable) and adjusts inventory and + /// virtual currency balances as appropriate + /// + public void ConfirmPurchase(ConfirmPurchaseRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/ConfirmPurchase", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Consume uses of a consumable item. When all uses are consumed, it will be removed from the player's + /// inventory. + /// + public void ConsumeItem(ConsumeItemRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/ConsumeItem", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Grants the player's current entitlements from Microsoft Store's Collection API + /// + public void ConsumeMicrosoftStoreEntitlements(ConsumeMicrosoftStoreEntitlementsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/ConsumeMicrosoftStoreEntitlements", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Checks for any new consumable entitlements. If any are found, they are consumed (if they're consumables) and added as + /// PlayFab items + /// + public void ConsumePS5Entitlements(ConsumePS5EntitlementsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/ConsumePS5Entitlements", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Checks for any new consumable entitlements. If any are found, they are consumed and added as PlayFab items + /// + public void ConsumePSNEntitlements(ConsumePSNEntitlementsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/ConsumePSNEntitlements", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Grants the player's current entitlements from Xbox Live, consuming all availble items in Xbox and granting them to the + /// player's PlayFab inventory. This call is idempotent and will not grant previously granted items to the player. + /// + public void ConsumeXboxEntitlements(ConsumeXboxEntitlementsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/ConsumeXboxEntitlements", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Requests the creation of a shared group object, containing key/value pairs which may be updated by all members of the + /// group. Upon creation, the current user will be the only member of the group. Shared Groups are designed for sharing data + /// between a very small number of players, please see our guide: + /// https://docs.microsoft.com/gaming/playfab/features/social/groups/using-shared-group-data + /// + public void CreateSharedGroup(CreateSharedGroupRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/CreateSharedGroup", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Executes a CloudScript function, with the 'currentPlayerId' set to the PlayFab ID of the authenticated player. The + /// PlayFab ID is the entity ID of the player's master_player_account entity. + /// + public void ExecuteCloudScript(ExecuteCloudScriptRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/ExecuteCloudScript", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + public void ExecuteCloudScript(ExecuteCloudScriptRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn, "Must be logged in to call this method"); + Action wrappedResultCallback = (wrappedResult) => + { + var serializer = PluginManager.GetPlugin(PluginContract.PlayFab_Serializer); + var wrappedJson = serializer.SerializeObject(wrappedResult.FunctionResult); + try { + wrappedResult.FunctionResult = serializer.DeserializeObject(wrappedJson); + } catch (Exception) { + wrappedResult.FunctionResult = wrappedJson; + wrappedResult.Logs.Add(new LogStatement { Level = "Warning", Data = wrappedJson, Message = "Sdk Message: Could not deserialize result as: " + typeof(TOut).Name }); + } + resultCallback(wrappedResult); + }; + PlayFabHttp.MakeApiCall("/Client/ExecuteCloudScript", request, AuthType.LoginSession, wrappedResultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the user's PlayFab account details + /// + public void GetAccountInfo(GetAccountInfoRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetAccountInfo", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Returns a list of ad placements and a reward for each + /// + public void GetAdPlacements(GetAdPlacementsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetAdPlacements", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Lists all of the characters that belong to a specific user. CharacterIds are not globally unique; characterId must be + /// evaluated with the parent PlayFabId to guarantee uniqueness. + /// + public void GetAllUsersCharacters(ListUsersCharactersRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetAllUsersCharacters", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Retrieves the specified version of the title's catalog of virtual goods, including all defined properties + /// + public void GetCatalogItems(GetCatalogItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetCatalogItems", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the title-specific custom data for the character which is readable and writable by the client + /// + public void GetCharacterData(GetCharacterDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetCharacterData", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Retrieves the specified character's current inventory of virtual goods + /// + public void GetCharacterInventory(GetCharacterInventoryRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetCharacterInventory", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves a list of ranked characters for the given statistic, starting from the indicated point in the leaderboard + /// + public void GetCharacterLeaderboard(GetCharacterLeaderboardRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetCharacterLeaderboard", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the title-specific custom data for the character which can only be read by the client + /// + public void GetCharacterReadOnlyData(GetCharacterDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetCharacterReadOnlyData", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the details of all title-specific statistics for the user + /// + public void GetCharacterStatistics(GetCharacterStatisticsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetCharacterStatistics", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// This API retrieves a pre-signed URL for accessing a content file for the title. A subsequent HTTP GET to the returned + /// URL will attempt to download the content. A HEAD query to the returned URL will attempt to retrieve the metadata of the + /// content. Note that a successful result does not guarantee the existence of this content - if it has not been uploaded, + /// the query to retrieve the data will fail. See this post for more information: + /// https://community.playfab.com/hc/community/posts/205469488-How-to-upload-files-to-PlayFab-s-Content-Service. Also, + /// please be aware that the Content service is specifically PlayFab's CDN offering, for which standard CDN rates apply. + /// + public void GetContentDownloadUrl(GetContentDownloadUrlRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetContentDownloadUrl", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves a list of ranked friends of the current player for the given statistic, starting from the indicated point in + /// the leaderboard + /// + public void GetFriendLeaderboard(GetFriendLeaderboardRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetFriendLeaderboard", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves a list of ranked friends of the current player for the given statistic, centered on the requested PlayFab + /// user. If PlayFabId is empty or null will return currently logged in user. + /// + public void GetFriendLeaderboardAroundPlayer(GetFriendLeaderboardAroundPlayerRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetFriendLeaderboardAroundPlayer", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the current friend list for the local user, constrained to users who have PlayFab accounts. Friends from + /// linked accounts (Facebook, Steam) are also included. You may optionally exclude some linked services' friends. + /// + public void GetFriendsList(GetFriendsListRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetFriendsList", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves a list of ranked users for the given statistic, starting from the indicated point in the leaderboard + /// + public void GetLeaderboard(GetLeaderboardRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetLeaderboard", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves a list of ranked characters for the given statistic, centered on the requested Character ID + /// + public void GetLeaderboardAroundCharacter(GetLeaderboardAroundCharacterRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetLeaderboardAroundCharacter", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves a list of ranked users for the given statistic, centered on the requested player. If PlayFabId is empty or + /// null will return currently logged in user. + /// + public void GetLeaderboardAroundPlayer(GetLeaderboardAroundPlayerRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetLeaderboardAroundPlayer", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves a list of all of the user's characters for the given statistic. + /// + public void GetLeaderboardForUserCharacters(GetLeaderboardForUsersCharactersRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetLeaderboardForUserCharacters", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ For payments flows where the provider requires playfab (the fulfiller) to initiate the transaction, but the + /// client completes the rest of the flow. In the Xsolla case, the token returned here will be passed to Xsolla by the + /// client to create a cart. Poll GetPurchase using the returned OrderId once you've completed the payment. + /// + public void GetPaymentToken(GetPaymentTokenRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetPaymentToken", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets a Photon custom authentication token that can be used to securely join the player into a Photon room. See + /// https://docs.microsoft.com/gaming/playfab/features/multiplayer/photon/quickstart for more details. + /// + public void GetPhotonAuthenticationToken(GetPhotonAuthenticationTokenRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetPhotonAuthenticationToken", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves all of the user's different kinds of info. + /// + public void GetPlayerCombinedInfo(GetPlayerCombinedInfoRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetPlayerCombinedInfo", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the player's profile + /// + public void GetPlayerProfile(GetPlayerProfileRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetPlayerProfile", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// List all segments that a player currently belongs to at this moment in time. + /// + public void GetPlayerSegments(GetPlayerSegmentsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetPlayerSegments", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the indicated statistics (current version and values for all statistics, if none are specified), for the local + /// player. + /// + public void GetPlayerStatistics(GetPlayerStatisticsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetPlayerStatistics", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the information on the available versions of the specified statistic. + /// + public void GetPlayerStatisticVersions(GetPlayerStatisticVersionsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetPlayerStatisticVersions", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Get all tags with a given Namespace (optional) from a player profile. + /// + public void GetPlayerTags(GetPlayerTagsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetPlayerTags", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets all trades the player has either opened or accepted, optionally filtered by trade status. + /// + public void GetPlayerTrades(GetPlayerTradesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetPlayerTrades", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of Facebook identifiers. + /// + public void GetPlayFabIDsFromFacebookIDs(GetPlayFabIDsFromFacebookIDsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetPlayFabIDsFromFacebookIDs", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of Facebook Instant Game identifiers. + /// + public void GetPlayFabIDsFromFacebookInstantGamesIds(GetPlayFabIDsFromFacebookInstantGamesIdsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetPlayFabIDsFromFacebookInstantGamesIds", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of Game Center identifiers (referenced in the Game Center + /// Programming Guide as the Player Identifier). + /// + public void GetPlayFabIDsFromGameCenterIDs(GetPlayFabIDsFromGameCenterIDsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetPlayFabIDsFromGameCenterIDs", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of generic service identifiers. A generic identifier is the + /// service name plus the service-specific ID for the player, as specified by the title when the generic identifier was + /// added to the player account. + /// + public void GetPlayFabIDsFromGenericIDs(GetPlayFabIDsFromGenericIDsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetPlayFabIDsFromGenericIDs", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of Google identifiers. The Google identifiers are the IDs for + /// the user accounts, available as "id" in the Google+ People API calls. + /// + public void GetPlayFabIDsFromGoogleIDs(GetPlayFabIDsFromGoogleIDsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetPlayFabIDsFromGoogleIDs", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of Google Play Games identifiers. The Google Play Games + /// identifiers are the IDs for the user accounts, available as "playerId" in the Google Play Games Services - Players API + /// calls. + /// + public void GetPlayFabIDsFromGooglePlayGamesPlayerIDs(GetPlayFabIDsFromGooglePlayGamesPlayerIDsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetPlayFabIDsFromGooglePlayGamesPlayerIDs", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of Kongregate identifiers. The Kongregate identifiers are the + /// IDs for the user accounts, available as "user_id" from the Kongregate API methods(ex: + /// http://developers.kongregate.com/docs/client/getUserId). + /// + public void GetPlayFabIDsFromKongregateIDs(GetPlayFabIDsFromKongregateIDsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetPlayFabIDsFromKongregateIDs", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of Nintendo Service Account identifiers. + /// + public void GetPlayFabIDsFromNintendoServiceAccountIds(GetPlayFabIDsFromNintendoServiceAccountIdsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetPlayFabIDsFromNintendoServiceAccountIds", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of Nintendo Switch Device identifiers. + /// + public void GetPlayFabIDsFromNintendoSwitchDeviceIds(GetPlayFabIDsFromNintendoSwitchDeviceIdsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetPlayFabIDsFromNintendoSwitchDeviceIds", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of PlayStation :tm: Network identifiers. + /// + public void GetPlayFabIDsFromPSNAccountIDs(GetPlayFabIDsFromPSNAccountIDsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetPlayFabIDsFromPSNAccountIDs", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of PlayStation :tm: Network identifiers. + /// + public void GetPlayFabIDsFromPSNOnlineIDs(GetPlayFabIDsFromPSNOnlineIDsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetPlayFabIDsFromPSNOnlineIDs", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of Steam identifiers. The Steam identifiers are the profile + /// IDs for the user accounts, available as SteamId in the Steamworks Community API calls. + /// + public void GetPlayFabIDsFromSteamIDs(GetPlayFabIDsFromSteamIDsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetPlayFabIDsFromSteamIDs", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of Twitch identifiers. The Twitch identifiers are the IDs for + /// the user accounts, available as "_id" from the Twitch API methods (ex: + /// https://github.com/justintv/Twitch-API/blob/master/v3_resources/users.md#get-usersuser). + /// + public void GetPlayFabIDsFromTwitchIDs(GetPlayFabIDsFromTwitchIDsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetPlayFabIDsFromTwitchIDs", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of XboxLive identifiers. + /// + public void GetPlayFabIDsFromXboxLiveIDs(GetPlayFabIDsFromXboxLiveIDsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetPlayFabIDsFromXboxLiveIDs", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the key-value store of custom publisher settings + /// + public void GetPublisherData(GetPublisherDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetPublisherData", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Retrieves a purchase along with its current PlayFab status. Returns inventory items from the purchase that + /// are still active. + /// + public void GetPurchase(GetPurchaseRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetPurchase", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves data stored in a shared group object, as well as the list of members in the group. Non-members of the group + /// may use this to retrieve group data, including membership, but they will not receive data for keys marked as private. + /// Shared Groups are designed for sharing data between a very small number of players, please see our guide: + /// https://docs.microsoft.com/gaming/playfab/features/social/groups/using-shared-group-data + /// + public void GetSharedGroupData(GetSharedGroupDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetSharedGroupData", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Retrieves the set of items defined for the specified store, including all prices defined + /// + public void GetStoreItems(GetStoreItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetStoreItems", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the current server time + /// + public void GetTime(GetTimeRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetTime", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the key-value store of custom title settings + /// + public void GetTitleData(GetTitleDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetTitleData", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the title news feed, as configured in the developer portal + /// + public void GetTitleNews(GetTitleNewsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetTitleNews", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Returns the title's base 64 encoded RSA CSP blob. + /// + public void GetTitlePublicKey(GetTitlePublicKeyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + PlayFabHttp.MakeApiCall("/Client/GetTitlePublicKey", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets the current status of an existing trade. + /// + public void GetTradeStatus(GetTradeStatusRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetTradeStatus", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the title-specific custom data for the user which is readable and writable by the client + /// + public void GetUserData(GetUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetUserData", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Retrieves the user's current inventory of virtual goods + /// + public void GetUserInventory(GetUserInventoryRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetUserInventory", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the publisher-specific custom data for the user which is readable and writable by the client + /// + public void GetUserPublisherData(GetUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetUserPublisherData", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the publisher-specific custom data for the user which can only be read by the client + /// + public void GetUserPublisherReadOnlyData(GetUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetUserPublisherReadOnlyData", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the title-specific custom data for the user which can only be read by the client + /// + public void GetUserReadOnlyData(GetUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetUserReadOnlyData", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Grants the specified character type to the user. CharacterIds are not globally unique; characterId must be evaluated + /// with the parent PlayFabId to guarantee uniqueness. + /// + public void GrantCharacterToUser(GrantCharacterToUserRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GrantCharacterToUser", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Links the Android device identifier to the user's PlayFab account + /// + public void LinkAndroidDeviceID(LinkAndroidDeviceIDRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/LinkAndroidDeviceID", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Links the Apple account associated with the token to the user's PlayFab account. + /// + public void LinkApple(LinkAppleRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/LinkApple", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Links the custom identifier, generated by the title, to the user's PlayFab account + /// + public void LinkCustomID(LinkCustomIDRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/LinkCustomID", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Links the Facebook account associated with the provided Facebook access token to the user's PlayFab account + /// + public void LinkFacebookAccount(LinkFacebookAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/LinkFacebookAccount", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Links the Facebook Instant Games Id to the user's PlayFab account + /// + public void LinkFacebookInstantGamesId(LinkFacebookInstantGamesIdRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/LinkFacebookInstantGamesId", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Links the Game Center account associated with the provided Game Center ID to the user's PlayFab account. Logging in with + /// a Game Center ID is insecure if you do not include the optional PublicKeyUrl, Salt, Signature, and Timestamp parameters + /// in this request. It is recommended you require these parameters on all Game Center calls by going to the Apple Add-ons + /// page in the PlayFab Game Manager and enabling the 'Require secure authentication only for this app' option. + /// + public void LinkGameCenterAccount(LinkGameCenterAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/LinkGameCenterAccount", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Links the currently signed-in user account to their Google account, using their Google account credentials + /// + public void LinkGoogleAccount(LinkGoogleAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/LinkGoogleAccount", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Links the currently signed-in user account to their Google Play Games account, using their Google Play Games account + /// credentials + /// + public void LinkGooglePlayGamesServicesAccount(LinkGooglePlayGamesServicesAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/LinkGooglePlayGamesServicesAccount", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Links the vendor-specific iOS device identifier to the user's PlayFab account + /// + public void LinkIOSDeviceID(LinkIOSDeviceIDRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/LinkIOSDeviceID", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Links the Kongregate identifier to the user's PlayFab account + /// + public void LinkKongregate(LinkKongregateAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/LinkKongregate", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Links the Nintendo account associated with the token to the user's PlayFab account. + /// + public void LinkNintendoServiceAccount(LinkNintendoServiceAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/LinkNintendoServiceAccount", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Links the NintendoSwitchDeviceId to the user's PlayFab account + /// + public void LinkNintendoSwitchDeviceId(LinkNintendoSwitchDeviceIdRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/LinkNintendoSwitchDeviceId", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Links an OpenID Connect account to a user's PlayFab account, based on an existing relationship between a title and an + /// Open ID Connect provider and the OpenId Connect JWT from that provider. + /// + public void LinkOpenIdConnect(LinkOpenIdConnectRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/LinkOpenIdConnect", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Links the PlayStation :tm: Network account associated with the provided access code to the user's PlayFab account + /// + public void LinkPSNAccount(LinkPSNAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/LinkPSNAccount", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Links the Steam account associated with the provided Steam authentication ticket to the user's PlayFab account + /// + public void LinkSteamAccount(LinkSteamAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/LinkSteamAccount", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Links the Twitch account associated with the token to the user's PlayFab account. + /// + public void LinkTwitch(LinkTwitchAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/LinkTwitch", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Links the Xbox Live account associated with the provided access code to the user's PlayFab account + /// + public void LinkXboxAccount(LinkXboxAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/LinkXboxAccount", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Signs the user in using the Android device identifier, returning a session identifier that can subsequently be used for + /// API calls which require an authenticated user + /// + public void LoginWithAndroidDeviceID(LoginWithAndroidDeviceIDRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + PlayFabHttp.MakeApiCall("/Client/LoginWithAndroidDeviceID", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Signs in the user with a Sign in with Apple identity token. + /// + public void LoginWithApple(LoginWithAppleRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + PlayFabHttp.MakeApiCall("/Client/LoginWithApple", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Signs the user in using a custom unique identifier generated by the title, returning a session identifier that can + /// subsequently be used for API calls which require an authenticated user + /// + public void LoginWithCustomID(LoginWithCustomIDRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + PlayFabHttp.MakeApiCall("/Client/LoginWithCustomID", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Signs the user into the PlayFab account, returning a session identifier that can subsequently be used for API calls + /// which require an authenticated user. Unlike most other login API calls, LoginWithEmailAddress does not permit the + /// creation of new accounts via the CreateAccountFlag. Email addresses may be used to create accounts via + /// RegisterPlayFabUser. + /// + public void LoginWithEmailAddress(LoginWithEmailAddressRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + PlayFabHttp.MakeApiCall("/Client/LoginWithEmailAddress", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Signs the user in using a Facebook access token, returning a session identifier that can subsequently be used for API + /// calls which require an authenticated user + /// + public void LoginWithFacebook(LoginWithFacebookRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + PlayFabHttp.MakeApiCall("/Client/LoginWithFacebook", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Signs the user in using a Facebook Instant Games ID, returning a session identifier that can subsequently be used for + /// API calls which require an authenticated user. Requires Facebook Instant Games to be configured. + /// + public void LoginWithFacebookInstantGamesId(LoginWithFacebookInstantGamesIdRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + PlayFabHttp.MakeApiCall("/Client/LoginWithFacebookInstantGamesId", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Signs the user in using an iOS Game Center player identifier, returning a session identifier that can subsequently be + /// used for API calls which require an authenticated user. Logging in with a Game Center ID is insecure if you do not + /// include the optional PublicKeyUrl, Salt, Signature, and Timestamp parameters in this request. It is recommended you + /// require these parameters on all Game Center calls by going to the Apple Add-ons page in the PlayFab Game Manager and + /// enabling the 'Require secure authentication only for this app' option. + /// + public void LoginWithGameCenter(LoginWithGameCenterRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + PlayFabHttp.MakeApiCall("/Client/LoginWithGameCenter", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Signs the user in using their Google account credentials + /// + public void LoginWithGoogleAccount(LoginWithGoogleAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + PlayFabHttp.MakeApiCall("/Client/LoginWithGoogleAccount", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Signs the user in using their Google Play Games account credentials + /// + public void LoginWithGooglePlayGamesServices(LoginWithGooglePlayGamesServicesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + PlayFabHttp.MakeApiCall("/Client/LoginWithGooglePlayGamesServices", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Signs the user in using the vendor-specific iOS device identifier, returning a session identifier that can subsequently + /// be used for API calls which require an authenticated user + /// + public void LoginWithIOSDeviceID(LoginWithIOSDeviceIDRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + PlayFabHttp.MakeApiCall("/Client/LoginWithIOSDeviceID", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Signs the user in using a Kongregate player account. + /// + public void LoginWithKongregate(LoginWithKongregateRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + PlayFabHttp.MakeApiCall("/Client/LoginWithKongregate", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Signs in the user with a Nintendo service account token. + /// + public void LoginWithNintendoServiceAccount(LoginWithNintendoServiceAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + PlayFabHttp.MakeApiCall("/Client/LoginWithNintendoServiceAccount", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Signs the user in using a Nintendo Switch Device ID, returning a session identifier that can subsequently be used for + /// API calls which require an authenticated user + /// + public void LoginWithNintendoSwitchDeviceId(LoginWithNintendoSwitchDeviceIdRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + PlayFabHttp.MakeApiCall("/Client/LoginWithNintendoSwitchDeviceId", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Logs in a user with an Open ID Connect JWT created by an existing relationship between a title and an Open ID Connect + /// provider. + /// + public void LoginWithOpenIdConnect(LoginWithOpenIdConnectRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + PlayFabHttp.MakeApiCall("/Client/LoginWithOpenIdConnect", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Signs the user into the PlayFab account, returning a session identifier that can subsequently be used for API calls + /// which require an authenticated user. Unlike most other login API calls, LoginWithPlayFab does not permit the creation of + /// new accounts via the CreateAccountFlag. Username/Password credentials may be used to create accounts via + /// RegisterPlayFabUser, or added to existing accounts using AddUsernamePassword. + /// + public void LoginWithPlayFab(LoginWithPlayFabRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + PlayFabHttp.MakeApiCall("/Client/LoginWithPlayFab", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Signs the user in using a PlayStation :tm: Network authentication code, returning a session identifier that can + /// subsequently be used for API calls which require an authenticated user + /// + public void LoginWithPSN(LoginWithPSNRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + PlayFabHttp.MakeApiCall("/Client/LoginWithPSN", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Signs the user in using a Steam authentication ticket, returning a session identifier that can subsequently be used for + /// API calls which require an authenticated user + /// + public void LoginWithSteam(LoginWithSteamRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + PlayFabHttp.MakeApiCall("/Client/LoginWithSteam", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Signs the user in using a Twitch access token. + /// + public void LoginWithTwitch(LoginWithTwitchRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + PlayFabHttp.MakeApiCall("/Client/LoginWithTwitch", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Signs the user in using a Xbox Live Token, returning a session identifier that can subsequently be used for API calls + /// which require an authenticated user + /// + public void LoginWithXbox(LoginWithXboxRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + PlayFabHttp.MakeApiCall("/Client/LoginWithXbox", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Opens a new outstanding trade. Note that a given item instance may only be in one open trade at a time. + /// + public void OpenTrade(OpenTradeRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/OpenTrade", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Selects a payment option for purchase order created via StartPurchase + /// + public void PayForPurchase(PayForPurchaseRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/PayForPurchase", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Buys a single item with virtual currency. You must specify both the virtual currency to use to purchase, as + /// well as what the client believes the price to be. This lets the server fail the purchase if the price has changed. + /// + public void PurchaseItem(PurchaseItemRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/PurchaseItem", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Adds the virtual goods associated with the coupon to the user's inventory. Coupons can be generated via the + /// Economy->Catalogs tab in the PlayFab Game Manager. + /// + public void RedeemCoupon(RedeemCouponRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/RedeemCoupon", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Uses the supplied OAuth code to refresh the internally cached player PlayStation :tm: Network auth token + /// + public void RefreshPSNAuthToken(RefreshPSNAuthTokenRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/RefreshPSNAuthToken", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Registers the iOS device to receive push notifications + /// + public void RegisterForIOSPushNotification(RegisterForIOSPushNotificationRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/RegisterForIOSPushNotification", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Registers a new Playfab user account, returning a session identifier that can subsequently be used for API calls which + /// require an authenticated user. You must supply a username and an email address. + /// + public void RegisterPlayFabUser(RegisterPlayFabUserRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + PlayFabHttp.MakeApiCall("/Client/RegisterPlayFabUser", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Removes a contact email from the player's profile. + /// + public void RemoveContactEmail(RemoveContactEmailRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/RemoveContactEmail", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Removes a specified user from the friend list of the local user + /// + public void RemoveFriend(RemoveFriendRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/RemoveFriend", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Removes the specified generic service identifier from the player's PlayFab account. + /// + public void RemoveGenericID(RemoveGenericIDRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/RemoveGenericID", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Removes users from the set of those able to update the shared data and the set of users in the group. Only users in the + /// group can remove members. If as a result of the call, zero users remain with access, the group and its associated data + /// will be deleted. Shared Groups are designed for sharing data between a very small number of players, please see our + /// guide: https://docs.microsoft.com/gaming/playfab/features/social/groups/using-shared-group-data + /// + public void RemoveSharedGroupMembers(RemoveSharedGroupMembersRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/RemoveSharedGroupMembers", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Report player's ad activity + /// + public void ReportAdActivity(ReportAdActivityRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/ReportAdActivity", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Write a PlayStream event to describe the provided player device information. This API method is not designed to be + /// called directly by developers. Each PlayFab client SDK will eventually report this information automatically. + /// + public void ReportDeviceInfo(DeviceInfoRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/ReportDeviceInfo", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Submit a report for another player (due to bad bahavior, etc.), so that customer service representatives for the title + /// can take action concerning potentially toxic players. + /// + public void ReportPlayer(ReportPlayerClientRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/ReportPlayer", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Restores all in-app purchases based on the given restore receipt + /// + public void RestoreIOSPurchases(RestoreIOSPurchasesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/RestoreIOSPurchases", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Reward player's ad activity + /// + public void RewardAdActivity(RewardAdActivityRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/RewardAdActivity", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Forces an email to be sent to the registered email address for the user's account, with a link allowing the user to + /// change the password.If an account recovery email template ID is provided, an email using the custom email template will + /// be used. + /// + public void SendAccountRecoveryEmail(SendAccountRecoveryEmailRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + PlayFabHttp.MakeApiCall("/Client/SendAccountRecoveryEmail", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates the tag list for a specified user in the friend list of the local user + /// + public void SetFriendTags(SetFriendTagsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/SetFriendTags", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Sets the player's secret if it is not already set. Player secrets are used to sign API requests. To reset a player's + /// secret use the Admin or Server API method SetPlayerSecret. + /// + public void SetPlayerSecret(SetPlayerSecretRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/SetPlayerSecret", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Creates an order for a list of items from the title catalog + /// + public void StartPurchase(StartPurchaseRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/StartPurchase", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Decrements the user's balance of the specified virtual currency by the stated amount. It is possible to make + /// a VC balance negative with this API. + /// + public void SubtractUserVirtualCurrency(SubtractUserVirtualCurrencyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/SubtractUserVirtualCurrency", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Unlinks the related Android device identifier from the user's PlayFab account + /// + public void UnlinkAndroidDeviceID(UnlinkAndroidDeviceIDRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/UnlinkAndroidDeviceID", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Unlinks the related Apple account from the user's PlayFab account. + /// + public void UnlinkApple(UnlinkAppleRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/UnlinkApple", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Unlinks the related custom identifier from the user's PlayFab account + /// + public void UnlinkCustomID(UnlinkCustomIDRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/UnlinkCustomID", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Unlinks the related Facebook account from the user's PlayFab account + /// + public void UnlinkFacebookAccount(UnlinkFacebookAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/UnlinkFacebookAccount", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Unlinks the related Facebook Instant Game Ids from the user's PlayFab account + /// + public void UnlinkFacebookInstantGamesId(UnlinkFacebookInstantGamesIdRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/UnlinkFacebookInstantGamesId", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Unlinks the related Game Center account from the user's PlayFab account + /// + public void UnlinkGameCenterAccount(UnlinkGameCenterAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/UnlinkGameCenterAccount", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Unlinks the related Google account from the user's PlayFab account + /// (https://developers.google.com/android/reference/com/google/android/gms/auth/GoogleAuthUtil#public-methods). + /// + public void UnlinkGoogleAccount(UnlinkGoogleAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/UnlinkGoogleAccount", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Unlinks the related Google Play Games account from the user's PlayFab account. + /// + public void UnlinkGooglePlayGamesServicesAccount(UnlinkGooglePlayGamesServicesAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/UnlinkGooglePlayGamesServicesAccount", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Unlinks the related iOS device identifier from the user's PlayFab account + /// + public void UnlinkIOSDeviceID(UnlinkIOSDeviceIDRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/UnlinkIOSDeviceID", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Unlinks the related Kongregate identifier from the user's PlayFab account + /// + public void UnlinkKongregate(UnlinkKongregateAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/UnlinkKongregate", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Unlinks the related Nintendo account from the user's PlayFab account. + /// + public void UnlinkNintendoServiceAccount(UnlinkNintendoServiceAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/UnlinkNintendoServiceAccount", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Unlinks the related NintendoSwitchDeviceId from the user's PlayFab account + /// + public void UnlinkNintendoSwitchDeviceId(UnlinkNintendoSwitchDeviceIdRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/UnlinkNintendoSwitchDeviceId", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Unlinks an OpenID Connect account from a user's PlayFab account, based on the connection ID of an existing relationship + /// between a title and an Open ID Connect provider. + /// + public void UnlinkOpenIdConnect(UnlinkOpenIdConnectRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/UnlinkOpenIdConnect", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Unlinks the related PlayStation :tm: Network account from the user's PlayFab account + /// + public void UnlinkPSNAccount(UnlinkPSNAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/UnlinkPSNAccount", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Unlinks the related Steam account from the user's PlayFab account + /// + public void UnlinkSteamAccount(UnlinkSteamAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/UnlinkSteamAccount", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Unlinks the related Twitch account from the user's PlayFab account. + /// + public void UnlinkTwitch(UnlinkTwitchAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/UnlinkTwitch", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Unlinks the related Xbox Live account from the user's PlayFab account + /// + public void UnlinkXboxAccount(UnlinkXboxAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/UnlinkXboxAccount", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Opens the specified container, with the specified key (when required), and returns the contents of the + /// opened container. If the container (and key when relevant) are consumable (RemainingUses > 0), their RemainingUses will + /// be decremented, consistent with the operation of ConsumeItem. + /// + public void UnlockContainerInstance(UnlockContainerInstanceRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/UnlockContainerInstance", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Searches target inventory for an ItemInstance matching the given CatalogItemId, if necessary unlocks it + /// using an appropriate key, and returns the contents of the opened container. If the container (and key when relevant) are + /// consumable (RemainingUses > 0), their RemainingUses will be decremented, consistent with the operation of ConsumeItem. + /// + public void UnlockContainerItem(UnlockContainerItemRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/UnlockContainerItem", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Update the avatar URL of the player + /// + public void UpdateAvatarUrl(UpdateAvatarUrlRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/UpdateAvatarUrl", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Creates and updates the title-specific custom data for the user's character which is readable and writable by the client + /// + public void UpdateCharacterData(UpdateCharacterDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/UpdateCharacterData", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates the values of the specified title-specific statistics for the specific character. By default, clients are not + /// permitted to update statistics. Developers may override this setting in the Game Manager > Settings > API Features. + /// + public void UpdateCharacterStatistics(UpdateCharacterStatisticsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/UpdateCharacterStatistics", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates the values of the specified title-specific statistics for the user. By default, clients are not permitted to + /// update statistics. Developers may override this setting in the Game Manager > Settings > API Features. + /// + public void UpdatePlayerStatistics(UpdatePlayerStatisticsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/UpdatePlayerStatistics", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Adds, updates, and removes data keys for a shared group object. If the permission is set to Public, all fields updated + /// or added in this call will be readable by users not in the group. By default, data permissions are set to Private. + /// Regardless of the permission setting, only members of the group can update the data. Shared Groups are designed for + /// sharing data between a very small number of players, please see our guide: + /// https://docs.microsoft.com/gaming/playfab/features/social/groups/using-shared-group-data + /// + public void UpdateSharedGroupData(UpdateSharedGroupDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/UpdateSharedGroupData", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Creates and updates the title-specific custom data for the user which is readable and writable by the client + /// + public void UpdateUserData(UpdateUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/UpdateUserData", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Creates and updates the publisher-specific custom data for the user which is readable and writable by the client + /// + public void UpdateUserPublisherData(UpdateUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/UpdateUserPublisherData", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates the title specific display name for the user + /// + public void UpdateUserTitleDisplayName(UpdateUserTitleDisplayNameRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/UpdateUserTitleDisplayName", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Validates with Amazon that the receipt for an Amazon App Store in-app purchase is valid and that it matches + /// the purchased catalog item + /// + public void ValidateAmazonIAPReceipt(ValidateAmazonReceiptRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/ValidateAmazonIAPReceipt", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Validates a Google Play purchase and gives the corresponding item to the player. + /// + public void ValidateGooglePlayPurchase(ValidateGooglePlayPurchaseRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/ValidateGooglePlayPurchase", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Validates with the Apple store that the receipt for an iOS in-app purchase is valid and that it matches the + /// purchased catalog item + /// + public void ValidateIOSReceipt(ValidateIOSReceiptRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/ValidateIOSReceipt", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Validates with Windows that the receipt for an Windows App Store in-app purchase is valid and that it + /// matches the purchased catalog item + /// + public void ValidateWindowsStoreReceipt(ValidateWindowsReceiptRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/ValidateWindowsStoreReceipt", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Writes a character-based event into PlayStream. + /// + public void WriteCharacterEvent(WriteClientCharacterEventRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/WriteCharacterEvent", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Writes a player-based event into PlayStream. + /// + public void WritePlayerEvent(WriteClientPlayerEventRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/WritePlayerEvent", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Writes a title-based event into PlayStream. + /// + public void WriteTitleEvent(WriteTitleEventRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/WriteTitleEvent", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + } +} + +#endif diff --git a/Assets/PlayFabSDK/Client/PlayFabClientInstanceAPI.cs.meta b/Assets/PlayFabSDK/Client/PlayFabClientInstanceAPI.cs.meta new file mode 100644 index 00000000..b7573e77 --- /dev/null +++ b/Assets/PlayFabSDK/Client/PlayFabClientInstanceAPI.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ddd185cc4cdc40643a08607da563ddc4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Client/PlayFabClientModels.cs b/Assets/PlayFabSDK/Client/PlayFabClientModels.cs new file mode 100644 index 00000000..a8e51aae --- /dev/null +++ b/Assets/PlayFabSDK/Client/PlayFabClientModels.cs @@ -0,0 +1,7535 @@ +#if !DISABLE_PLAYFABCLIENT_API +using System; +using System.Collections.Generic; +using PlayFab.SharedModels; + +namespace PlayFab.ClientModels +{ + [Serializable] + public class AcceptTradeRequest : PlayFabRequestCommon + { + /// + /// Items from the accepting player's inventory in exchange for the offered items in the trade. In the case of a gift, this + /// will be null. + /// + public List AcceptedInventoryInstanceIds; + /// + /// Player who opened the trade. + /// + public string OfferingPlayerId; + /// + /// Trade identifier. + /// + public string TradeId; + } + + [Serializable] + public class AcceptTradeResponse : PlayFabResultCommon + { + /// + /// Details about trade which was just accepted. + /// + public TradeInfo Trade; + } + + public enum AdActivity + { + Opened, + Closed, + Start, + End + } + + [Serializable] + public class AdCampaignAttributionModel : PlayFabBaseModel + { + /// + /// UTC time stamp of attribution + /// + public DateTime AttributedAt; + /// + /// Attribution campaign identifier + /// + public string CampaignId; + /// + /// Attribution network name + /// + public string Platform; + } + + [Serializable] + public class AddFriendRequest : PlayFabRequestCommon + { + /// + /// Email address of the user to attempt to add to the local user's friend list. + /// + public string FriendEmail; + /// + /// PlayFab identifier of the user to attempt to add to the local user's friend list. + /// + public string FriendPlayFabId; + /// + /// Title-specific display name of the user to attempt to add to the local user's friend list. + /// + public string FriendTitleDisplayName; + /// + /// PlayFab username of the user to attempt to add to the local user's friend list. + /// + public string FriendUsername; + } + + [Serializable] + public class AddFriendResult : PlayFabResultCommon + { + /// + /// True if the friend request was processed successfully. + /// + public bool Created; + } + + [Serializable] + public class AddGenericIDRequest : PlayFabRequestCommon + { + /// + /// Generic service identifier to add to the player account. + /// + public GenericServiceId GenericId; + } + + [Serializable] + public class AddGenericIDResult : PlayFabResultCommon + { + } + + /// + /// This API adds a contact email to the player's profile. If the player's profile already contains a contact email, it will + /// update the contact email to the email address specified. + /// + [Serializable] + public class AddOrUpdateContactEmailRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The new contact email to associate with the player. + /// + public string EmailAddress; + } + + [Serializable] + public class AddOrUpdateContactEmailResult : PlayFabResultCommon + { + } + + [Serializable] + public class AddSharedGroupMembersRequest : PlayFabRequestCommon + { + /// + /// An array of unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public List PlayFabIds; + /// + /// Unique identifier for the shared group. + /// + public string SharedGroupId; + } + + [Serializable] + public class AddSharedGroupMembersResult : PlayFabResultCommon + { + } + + [Serializable] + public class AddUsernamePasswordRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// User email address attached to their account + /// + public string Email; + /// + /// Password for the PlayFab account (6-100 characters) + /// + public string Password; + /// + /// PlayFab username for the account (3-20 characters) + /// + public string Username; + } + + /// + /// Each account must have a unique username and email address in the PlayFab service. Once created, the account may be + /// associated with additional accounts (Steam, Facebook, Game Center, etc.), allowing for added social network lists and + /// achievements systems. This can also be used to provide a recovery method if the user loses their original means of + /// access. + /// + [Serializable] + public class AddUsernamePasswordResult : PlayFabResultCommon + { + /// + /// PlayFab unique user name. + /// + public string Username; + } + + /// + /// This API must be enabled for use as an option in the game manager website. It is disabled by default. + /// + [Serializable] + public class AddUserVirtualCurrencyRequest : PlayFabRequestCommon + { + /// + /// Amount to be added to the user balance of the specified virtual currency. + /// + public int Amount; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Name of the virtual currency which is to be incremented. + /// + public string VirtualCurrency; + } + + /// + /// A single ad placement details including placement and reward information + /// + [Serializable] + public class AdPlacementDetails : PlayFabBaseModel + { + /// + /// Placement unique ID + /// + public string PlacementId; + /// + /// Placement name + /// + public string PlacementName; + /// + /// If placement has viewing limits indicates how many views are left + /// + public int? PlacementViewsRemaining; + /// + /// If placement has viewing limits indicates when they will next reset + /// + public double? PlacementViewsResetMinutes; + /// + /// Optional URL to a reward asset + /// + public string RewardAssetUrl; + /// + /// Reward description + /// + public string RewardDescription; + /// + /// Reward unique ID + /// + public string RewardId; + /// + /// Reward name + /// + public string RewardName; + } + + /// + /// Details for each item granted + /// + [Serializable] + public class AdRewardItemGranted : PlayFabBaseModel + { + /// + /// Catalog ID + /// + public string CatalogId; + /// + /// Catalog item display name + /// + public string DisplayName; + /// + /// Inventory instance ID + /// + public string InstanceId; + /// + /// Item ID + /// + public string ItemId; + } + + /// + /// Details on what was granted to the player + /// + [Serializable] + public class AdRewardResults : PlayFabBaseModel + { + /// + /// Array of the items granted to the player + /// + public List GrantedItems; + /// + /// Dictionary of virtual currencies that were granted to the player + /// + public Dictionary GrantedVirtualCurrencies; + /// + /// Dictionary of statistics that were modified for the player + /// + public Dictionary IncrementedStatistics; + } + + /// + /// More information can be found on configuring your game for the Google Cloud Messaging service in the Google developer + /// documentation, here: http://developer.android.com/google/gcm/client.html. The steps to configure and send Push + /// Notifications is described in the PlayFab tutorials, here: + /// https://docs.microsoft.com/gaming/playfab/features/engagement/push-notifications/quickstart. + /// + [Serializable] + public class AndroidDevicePushNotificationRegistrationRequest : PlayFabRequestCommon + { + /// + /// Message to display when confirming push notification. + /// + public string ConfirmationMessage; + /// + /// Registration ID provided by the Google Cloud Messaging service when the title registered to receive push notifications + /// (see the GCM documentation, here: http://developer.android.com/google/gcm/client.html). + /// + public string DeviceToken; + /// + /// If true, send a test push message immediately after sucessful registration. Defaults to false. + /// + public bool? SendPushNotificationConfirmation; + } + + [Serializable] + public class AndroidDevicePushNotificationRegistrationResult : PlayFabResultCommon + { + } + + /// + /// If you have an ad attribution partner enabled, this will post an install to their service to track the device. It uses + /// the given device id to match based on clicks on ads. + /// + [Serializable] + public class AttributeInstallRequest : PlayFabRequestCommon + { + /// + /// The adid for this device. + /// + public string Adid; + /// + /// The IdentifierForAdvertisers for iOS Devices. + /// + public string Idfa; + } + + [Serializable] + public class AttributeInstallResult : PlayFabResultCommon + { + } + + [Serializable] + public class CancelTradeRequest : PlayFabRequestCommon + { + /// + /// Trade identifier. + /// + public string TradeId; + } + + [Serializable] + public class CancelTradeResponse : PlayFabResultCommon + { + /// + /// Details about trade which was just canceled. + /// + public TradeInfo Trade; + } + + [Serializable] + public class CartItem : PlayFabBaseModel + { + /// + /// Description of the catalog item. + /// + public string Description; + /// + /// Display name for the catalog item. + /// + public string DisplayName; + /// + /// Class name to which catalog item belongs. + /// + public string ItemClass; + /// + /// Unique identifier for the catalog item. + /// + public string ItemId; + /// + /// Unique instance identifier for this catalog item. + /// + public string ItemInstanceId; + /// + /// Cost of the catalog item for each applicable real world currency. + /// + public Dictionary RealCurrencyPrices; + /// + /// Amount of each applicable virtual currency which will be received as a result of purchasing this catalog item. + /// + public Dictionary VCAmount; + /// + /// Cost of the catalog item for each applicable virtual currency. + /// + public Dictionary VirtualCurrencyPrices; + } + + /// + /// A purchasable item from the item catalog + /// + [Serializable] + public class CatalogItem : PlayFabBaseModel + { + /// + /// defines the bundle properties for the item - bundles are items which contain other items, including random drop tables + /// and virtual currencies + /// + public CatalogItemBundleInfo Bundle; + /// + /// if true, then an item instance of this type can be used to grant a character to a user. + /// + public bool CanBecomeCharacter; + /// + /// catalog version for this item + /// + public string CatalogVersion; + /// + /// defines the consumable properties (number of uses, timeout) for the item + /// + public CatalogItemConsumableInfo Consumable; + /// + /// defines the container properties for the item - what items it contains, including random drop tables and virtual + /// currencies, and what item (if any) is required to open it via the UnlockContainerItem API + /// + public CatalogItemContainerInfo Container; + /// + /// game specific custom data + /// + public string CustomData; + /// + /// text description of item, to show in-game + /// + public string Description; + /// + /// text name for the item, to show in-game + /// + public string DisplayName; + /// + /// If the item has IsLImitedEdition set to true, and this is the first time this ItemId has been defined as a limited + /// edition item, this value determines the total number of instances to allocate for the title. Once this limit has been + /// reached, no more instances of this ItemId can be created, and attempts to purchase or grant it will return a Result of + /// false for that ItemId. If the item has already been defined to have a limited edition count, or if this value is less + /// than zero, it will be ignored. + /// + public int InitialLimitedEditionCount; + /// + /// BETA: If true, then only a fixed number can ever be granted. + /// + public bool IsLimitedEdition; + /// + /// if true, then only one item instance of this type will exist and its remaininguses will be incremented instead. + /// RemainingUses will cap out at Int32.Max (2,147,483,647). All subsequent increases will be discarded + /// + public bool IsStackable; + /// + /// if true, then an item instance of this type can be traded between players using the trading APIs + /// + public bool IsTradable; + /// + /// class to which the item belongs + /// + public string ItemClass; + /// + /// unique identifier for this item + /// + public string ItemId; + /// + /// URL to the item image. For Facebook purchase to display the image on the item purchase page, this must be set to an HTTP + /// URL. + /// + public string ItemImageUrl; + /// + /// override prices for this item for specific currencies + /// + public Dictionary RealCurrencyPrices; + /// + /// list of item tags + /// + public List Tags; + /// + /// price of this item in virtual currencies and "RM" (the base Real Money purchase price, in USD pennies) + /// + public Dictionary VirtualCurrencyPrices; + } + + [Serializable] + public class CatalogItemBundleInfo : PlayFabBaseModel + { + /// + /// unique ItemId values for all items which will be added to the player inventory when the bundle is added + /// + public List BundledItems; + /// + /// unique TableId values for all RandomResultTable objects which are part of the bundle (random tables will be resolved and + /// add the relevant items to the player inventory when the bundle is added) + /// + public List BundledResultTables; + /// + /// virtual currency types and balances which will be added to the player inventory when the bundle is added + /// + public Dictionary BundledVirtualCurrencies; + } + + [Serializable] + public class CatalogItemConsumableInfo : PlayFabBaseModel + { + /// + /// number of times this object can be used, after which it will be removed from the player inventory + /// + public uint? UsageCount; + /// + /// duration in seconds for how long the item will remain in the player inventory - once elapsed, the item will be removed + /// (recommended minimum value is 5 seconds, as lower values can cause the item to expire before operations depending on + /// this item's details have completed) + /// + public uint? UsagePeriod; + /// + /// all inventory item instances in the player inventory sharing a non-null UsagePeriodGroup have their UsagePeriod values + /// added together, and share the result - when that period has elapsed, all the items in the group will be removed + /// + public string UsagePeriodGroup; + } + + /// + /// Containers are inventory items that can hold other items defined in the catalog, as well as virtual currency, which is + /// added to the player inventory when the container is unlocked, using the UnlockContainerItem API. The items can be + /// anything defined in the catalog, as well as RandomResultTable objects which will be resolved when the container is + /// unlocked. Containers and their keys should be defined as Consumable (having a limited number of uses) in their catalog + /// defintiions, unless the intent is for the player to be able to re-use them infinitely. + /// + [Serializable] + public class CatalogItemContainerInfo : PlayFabBaseModel + { + /// + /// unique ItemId values for all items which will be added to the player inventory, once the container has been unlocked + /// + public List ItemContents; + /// + /// ItemId for the catalog item used to unlock the container, if any (if not specified, a call to UnlockContainerItem will + /// open the container, adding the contents to the player inventory and currency balances) + /// + public string KeyItemId; + /// + /// unique TableId values for all RandomResultTable objects which are part of the container (once unlocked, random tables + /// will be resolved and add the relevant items to the player inventory) + /// + public List ResultTableContents; + /// + /// virtual currency types and balances which will be added to the player inventory when the container is unlocked + /// + public Dictionary VirtualCurrencyContents; + } + + [Serializable] + public class CharacterInventory : PlayFabBaseModel + { + /// + /// The id of this character. + /// + public string CharacterId; + /// + /// The inventory of this character. + /// + public List Inventory; + } + + [Serializable] + public class CharacterLeaderboardEntry : PlayFabBaseModel + { + /// + /// PlayFab unique identifier of the character that belongs to the user for this leaderboard entry. + /// + public string CharacterId; + /// + /// Title-specific display name of the character for this leaderboard entry. + /// + public string CharacterName; + /// + /// Name of the character class for this entry. + /// + public string CharacterType; + /// + /// Title-specific display name of the user for this leaderboard entry. + /// + public string DisplayName; + /// + /// PlayFab unique identifier of the user for this leaderboard entry. + /// + public string PlayFabId; + /// + /// User's overall position in the leaderboard. + /// + public int Position; + /// + /// Specific value of the user's statistic. + /// + public int StatValue; + } + + [Serializable] + public class CharacterResult : PlayFabBaseModel + { + /// + /// The id for this character on this player. + /// + public string CharacterId; + /// + /// The name of this character. + /// + public string CharacterName; + /// + /// The type-string that was given to this character on creation. + /// + public string CharacterType; + } + + public enum CloudScriptRevisionOption + { + Live, + Latest, + Specific + } + + /// + /// The final step in the purchasing process, this API finalizes the purchase with the payment provider, where applicable, + /// adding virtual goods to the player inventory (including random drop table resolution and recursive addition of bundled + /// items) and adjusting virtual currency balances for funds used or added. Note that this is a pull operation, and should + /// be polled regularly when a purchase is in progress. Please note that the processing time for inventory grants and + /// purchases increases fractionally the more items are in the inventory, and the more items are in the grant/purchase + /// operation. + /// + [Serializable] + public class ConfirmPurchaseRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Purchase order identifier returned from StartPurchase. + /// + public string OrderId; + } + + /// + /// When the FailedByPaymentProvider error is returned, it's important to check the ProviderErrorCode, ProviderErrorMessage, + /// and ProviderErrorDetails to understand the specific reason the payment was rejected, as in some rare cases, this may + /// mean that the provider hasn't completed some operation required to finalize the purchase. + /// + [Serializable] + public class ConfirmPurchaseResult : PlayFabResultCommon + { + /// + /// Array of items purchased. + /// + public List Items; + /// + /// Purchase order identifier. + /// + public string OrderId; + /// + /// Date and time of the purchase. + /// + public DateTime PurchaseDate; + } + + [Serializable] + public class ConsumeItemRequest : PlayFabRequestCommon + { + /// + /// Unique PlayFab assigned ID for a specific character owned by a user + /// + public string CharacterId; + /// + /// Number of uses to consume from the item. + /// + public int ConsumeCount; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Unique instance identifier of the item to be consumed. + /// + public string ItemInstanceId; + } + + [Serializable] + public class ConsumeItemResult : PlayFabResultCommon + { + /// + /// Unique instance identifier of the item with uses consumed. + /// + public string ItemInstanceId; + /// + /// Number of uses remaining on the item. + /// + public int RemainingUses; + } + + [Serializable] + public class ConsumeMicrosoftStoreEntitlementsRequest : PlayFabRequestCommon + { + /// + /// Catalog version to use + /// + public string CatalogVersion; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Marketplace specific payload containing details to fetch in app purchase transactions + /// + public MicrosoftStorePayload MarketplaceSpecificData; + } + + [Serializable] + public class ConsumeMicrosoftStoreEntitlementsResponse : PlayFabResultCommon + { + /// + /// Details for the items purchased. + /// + public List Items; + } + + [Serializable] + public class ConsumePS5EntitlementsRequest : PlayFabRequestCommon + { + /// + /// Catalog version to use + /// + public string CatalogVersion; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Marketplace specific payload containing details to fetch in app purchase transactions + /// + public PlayStation5Payload MarketplaceSpecificData; + } + + [Serializable] + public class ConsumePS5EntitlementsResult : PlayFabResultCommon + { + /// + /// Details for the items purchased. + /// + public List Items; + } + + [Serializable] + public class ConsumePSNEntitlementsRequest : PlayFabRequestCommon + { + /// + /// Which catalog to match granted entitlements against. If null, defaults to title default catalog + /// + public string CatalogVersion; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Id of the PlayStation :tm: Network service label to consume entitlements from + /// + public int ServiceLabel; + } + + [Serializable] + public class ConsumePSNEntitlementsResult : PlayFabResultCommon + { + /// + /// Array of items granted to the player as a result of consuming entitlements. + /// + public List ItemsGranted; + } + + [Serializable] + public class ConsumeXboxEntitlementsRequest : PlayFabRequestCommon + { + /// + /// Catalog version to use + /// + public string CatalogVersion; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Token provided by the Xbox Live SDK/XDK method GetTokenAndSignatureAsync("POST", "https://playfabapi.com/", ""). + /// + public string XboxToken; + } + + [Serializable] + public class ConsumeXboxEntitlementsResult : PlayFabResultCommon + { + /// + /// Details for the items purchased. + /// + public List Items; + } + + [Serializable] + public class ContactEmailInfoModel : PlayFabBaseModel + { + /// + /// The email address + /// + public string EmailAddress; + /// + /// The name of the email info data + /// + public string Name; + /// + /// The verification status of the email + /// + public EmailVerificationStatus? VerificationStatus; + } + + public enum ContinentCode + { + AF, + AN, + AS, + EU, + NA, + OC, + SA, + Unknown + } + + public enum CountryCode + { + AF, + AX, + AL, + DZ, + AS, + AD, + AO, + AI, + AQ, + AG, + AR, + AM, + AW, + AU, + AT, + AZ, + BS, + BH, + BD, + BB, + BY, + BE, + BZ, + BJ, + BM, + BT, + BO, + BQ, + BA, + BW, + BV, + BR, + IO, + BN, + BG, + BF, + BI, + KH, + CM, + CA, + CV, + KY, + CF, + TD, + CL, + CN, + CX, + CC, + CO, + KM, + CG, + CD, + CK, + CR, + CI, + HR, + CU, + CW, + CY, + CZ, + DK, + DJ, + DM, + DO, + EC, + EG, + SV, + GQ, + ER, + EE, + ET, + FK, + FO, + FJ, + FI, + FR, + GF, + PF, + TF, + GA, + GM, + GE, + DE, + GH, + GI, + GR, + GL, + GD, + GP, + GU, + GT, + GG, + GN, + GW, + GY, + HT, + HM, + VA, + HN, + HK, + HU, + IS, + IN, + ID, + IR, + IQ, + IE, + IM, + IL, + IT, + JM, + JP, + JE, + JO, + KZ, + KE, + KI, + KP, + KR, + KW, + KG, + LA, + LV, + LB, + LS, + LR, + LY, + LI, + LT, + LU, + MO, + MK, + MG, + MW, + MY, + MV, + ML, + MT, + MH, + MQ, + MR, + MU, + YT, + MX, + FM, + MD, + MC, + MN, + ME, + MS, + MA, + MZ, + MM, + NA, + NR, + NP, + NL, + NC, + NZ, + NI, + NE, + NG, + NU, + NF, + MP, + NO, + OM, + PK, + PW, + PS, + PA, + PG, + PY, + PE, + PH, + PN, + PL, + PT, + PR, + QA, + RE, + RO, + RU, + RW, + BL, + SH, + KN, + LC, + MF, + PM, + VC, + WS, + SM, + ST, + SA, + SN, + RS, + SC, + SL, + SG, + SX, + SK, + SI, + SB, + SO, + ZA, + GS, + SS, + ES, + LK, + SD, + SR, + SJ, + SZ, + SE, + CH, + SY, + TW, + TJ, + TZ, + TH, + TL, + TG, + TK, + TO, + TT, + TN, + TR, + TM, + TC, + TV, + UG, + UA, + AE, + GB, + US, + UM, + UY, + UZ, + VU, + VE, + VN, + VG, + VI, + WF, + EH, + YE, + ZM, + ZW, + Unknown + } + + /// + /// If SharedGroupId is specified, the service will attempt to create a group with that identifier, and will return an error + /// if it is already in use. If no SharedGroupId is specified, a random identifier will be assigned. + /// + [Serializable] + public class CreateSharedGroupRequest : PlayFabRequestCommon + { + /// + /// Unique identifier for the shared group (a random identifier will be assigned, if one is not specified). + /// + public string SharedGroupId; + } + + [Serializable] + public class CreateSharedGroupResult : PlayFabResultCommon + { + /// + /// Unique identifier for the shared group. + /// + public string SharedGroupId; + } + + public enum Currency + { + AED, + AFN, + ALL, + AMD, + ANG, + AOA, + ARS, + AUD, + AWG, + AZN, + BAM, + BBD, + BDT, + BGN, + BHD, + BIF, + BMD, + BND, + BOB, + BRL, + BSD, + BTN, + BWP, + BYR, + BZD, + CAD, + CDF, + CHF, + CLP, + CNY, + COP, + CRC, + CUC, + CUP, + CVE, + CZK, + DJF, + DKK, + DOP, + DZD, + EGP, + ERN, + ETB, + EUR, + FJD, + FKP, + GBP, + GEL, + GGP, + GHS, + GIP, + GMD, + GNF, + GTQ, + GYD, + HKD, + HNL, + HRK, + HTG, + HUF, + IDR, + ILS, + IMP, + INR, + IQD, + IRR, + ISK, + JEP, + JMD, + JOD, + JPY, + KES, + KGS, + KHR, + KMF, + KPW, + KRW, + KWD, + KYD, + KZT, + LAK, + LBP, + LKR, + LRD, + LSL, + LYD, + MAD, + MDL, + MGA, + MKD, + MMK, + MNT, + MOP, + MRO, + MUR, + MVR, + MWK, + MXN, + MYR, + MZN, + NAD, + NGN, + NIO, + NOK, + NPR, + NZD, + OMR, + PAB, + PEN, + PGK, + PHP, + PKR, + PLN, + PYG, + QAR, + RON, + RSD, + RUB, + RWF, + SAR, + SBD, + SCR, + SDG, + SEK, + SGD, + SHP, + SLL, + SOS, + SPL, + SRD, + STD, + SVC, + SYP, + SZL, + THB, + TJS, + TMT, + TND, + TOP, + TRY, + TTD, + TVD, + TWD, + TZS, + UAH, + UGX, + USD, + UYU, + UZS, + VEF, + VND, + VUV, + WST, + XAF, + XCD, + XDR, + XOF, + XPF, + YER, + ZAR, + ZMW, + ZWD + } + + /// + /// Any arbitrary information collected by the device + /// + [Serializable] + public class DeviceInfoRequest : PlayFabRequestCommon + { + /// + /// Information posted to the PlayStream Event. Currently arbitrary, and specific to the environment sending it. + /// + public Dictionary Info; + } + + public enum EmailVerificationStatus + { + Unverified, + Pending, + Confirmed + } + + [Serializable] + public class EmptyResponse : PlayFabResultCommon + { + } + + [Serializable] + public class EmptyResult : PlayFabResultCommon + { + } + + /// + /// Combined entity type and ID structure which uniquely identifies a single entity. + /// + [Serializable] + public class EntityKey : PlayFabBaseModel + { + /// + /// Unique ID of the entity. + /// + public string Id; + /// + /// Entity type. See https://docs.microsoft.com/gaming/playfab/features/data/entities/available-built-in-entity-types + /// + public string Type; + } + + [Serializable] + public class EntityTokenResponse : PlayFabBaseModel + { + /// + /// The entity id and type. + /// + public EntityKey Entity; + /// + /// The token used to set X-EntityToken for all entity based API calls. + /// + public string EntityToken; + /// + /// The time the token will expire, if it is an expiring token, in UTC. + /// + public DateTime? TokenExpiration; + } + + [Serializable] + public class ExecuteCloudScriptRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The name of the CloudScript function to execute + /// + public string FunctionName; + /// + /// Object that is passed in to the function as the first argument + /// + public object FunctionParameter; + /// + /// Generate a 'player_executed_cloudscript' PlayStream event containing the results of the function execution and other + /// contextual information. This event will show up in the PlayStream debugger console for the player in Game Manager. + /// + public bool? GeneratePlayStreamEvent; + /// + /// Option for which revision of the CloudScript to execute. 'Latest' executes the most recently created revision, 'Live' + /// executes the current live, published revision, and 'Specific' executes the specified revision. The default value is + /// 'Specific', if the SpeificRevision parameter is specified, otherwise it is 'Live'. + /// + public CloudScriptRevisionOption? RevisionSelection; + /// + /// The specivic revision to execute, when RevisionSelection is set to 'Specific' + /// + public int? SpecificRevision; + } + + [Serializable] + public class ExecuteCloudScriptResult : PlayFabResultCommon + { + /// + /// Number of PlayFab API requests issued by the CloudScript function + /// + public int APIRequestsIssued; + /// + /// Information about the error, if any, that occurred during execution + /// + public ScriptExecutionError Error; + public double ExecutionTimeSeconds; + /// + /// The name of the function that executed + /// + public string FunctionName; + /// + /// The object returned from the CloudScript function, if any + /// + public object FunctionResult; + /// + /// Flag indicating if the FunctionResult was too large and was subsequently dropped from this event. This only occurs if + /// the total event size is larger than 350KB. + /// + public bool? FunctionResultTooLarge; + /// + /// Number of external HTTP requests issued by the CloudScript function + /// + public int HttpRequestsIssued; + /// + /// Entries logged during the function execution. These include both entries logged in the function code using log.info() + /// and log.error() and error entries for API and HTTP request failures. + /// + public List Logs; + /// + /// Flag indicating if the logs were too large and were subsequently dropped from this event. This only occurs if the total + /// event size is larger than 350KB after the FunctionResult was removed. + /// + public bool? LogsTooLarge; + public uint MemoryConsumedBytes; + /// + /// Processor time consumed while executing the function. This does not include time spent waiting on API calls or HTTP + /// requests. + /// + public double ProcessorTimeSeconds; + /// + /// The revision of the CloudScript that executed + /// + public int Revision; + } + + public enum ExternalFriendSources + { + None, + Steam, + Facebook, + Xbox, + Psn, + All + } + + [Serializable] + public class FacebookInstantGamesPlayFabIdPair : PlayFabBaseModel + { + /// + /// Unique Facebook Instant Games identifier for a user. + /// + public string FacebookInstantGamesId; + /// + /// Unique PlayFab identifier for a user, or null if no PlayFab account is linked to the Facebook Instant Games identifier. + /// + public string PlayFabId; + } + + [Serializable] + public class FacebookPlayFabIdPair : PlayFabBaseModel + { + /// + /// Unique Facebook identifier for a user. + /// + public string FacebookId; + /// + /// Unique PlayFab identifier for a user, or null if no PlayFab account is linked to the Facebook identifier. + /// + public string PlayFabId; + } + + [Serializable] + public class FriendInfo : PlayFabBaseModel + { + /// + /// Available Facebook information (if the user and connected Facebook friend both have PlayFab Accounts in the same title). + /// + public UserFacebookInfo FacebookInfo; + /// + /// PlayFab unique identifier for this friend. + /// + public string FriendPlayFabId; + /// + /// Available Game Center information (if the user and connected Game Center friend both have PlayFab Accounts in the same + /// title). + /// + public UserGameCenterInfo GameCenterInfo; + /// + /// The profile of the user, if requested. + /// + public PlayerProfileModel Profile; + /// + /// Available PlayStation :tm: Network information, if the user connected PlayStation :tm Network friend both have PlayFab + /// Accounts in the same title. + /// + public UserPsnInfo PSNInfo; + /// + /// Available Steam information (if the user and connected Steam friend both have PlayFab Accounts in the same title). + /// + public UserSteamInfo SteamInfo; + /// + /// Tags which have been associated with this friend. + /// + public List Tags; + /// + /// Title-specific display name for this friend. + /// + public string TitleDisplayName; + /// + /// PlayFab unique username for this friend. + /// + public string Username; + /// + /// Available Xbox information, (if the user and connected Xbox Live friend both have PlayFab Accounts in the same title). + /// + public UserXboxInfo XboxInfo; + } + + [Serializable] + public class GameCenterPlayFabIdPair : PlayFabBaseModel + { + /// + /// Unique Game Center identifier for a user. + /// + public string GameCenterId; + /// + /// Unique PlayFab identifier for a user, or null if no PlayFab account is linked to the Game Center identifier. + /// + public string PlayFabId; + } + + [Serializable] + public class GenericPlayFabIdPair : PlayFabBaseModel + { + /// + /// Unique generic service identifier for a user. + /// + public GenericServiceId GenericId; + /// + /// Unique PlayFab identifier for a user, or null if no PlayFab account is linked to the given generic identifier. + /// + public string PlayFabId; + } + + [Serializable] + public class GenericServiceId : PlayFabBaseModel + { + /// + /// Name of the service for which the player has a unique identifier. + /// + public string ServiceName; + /// + /// Unique identifier of the player in that service. + /// + public string UserId; + } + + [Serializable] + public class GetAccountInfoRequest : PlayFabRequestCommon + { + /// + /// User email address for the account to find (if no Username is specified). + /// + public string Email; + /// + /// Unique PlayFab identifier of the user whose info is being requested. Optional, defaults to the authenticated user if no + /// other lookup identifier set. + /// + public string PlayFabId; + /// + /// Title-specific username for the account to find (if no Email is set). Note that if the non-unique Title Display Names + /// option is enabled for the title, attempts to look up users by Title Display Name will always return AccountNotFound. + /// + public string TitleDisplayName; + /// + /// PlayFab Username for the account to find (if no PlayFabId is specified). + /// + public string Username; + } + + /// + /// This API retrieves details regarding the player in the PlayFab service. Note that when this call is used to retrieve + /// data about another player (not the one signed into the local client), some data, such as Personally Identifying + /// Information (PII), will be omitted for privacy reasons or to comply with the requirements of the platform belongs to. + /// The user account returned will be based on the identifier provided in priority order: PlayFabId, Username, Email, then + /// TitleDisplayName. If no identifier is specified, the currently signed in user's information will be returned. + /// + [Serializable] + public class GetAccountInfoResult : PlayFabResultCommon + { + /// + /// Account information for the local user. + /// + public UserAccountInfo AccountInfo; + } + + /// + /// Using an AppId to return a list of valid ad placements for a player. + /// + [Serializable] + public class GetAdPlacementsRequest : PlayFabRequestCommon + { + /// + /// The current AppId to use + /// + public string AppId; + /// + /// Using the name or unique identifier, filter the result for get a specific placement. + /// + public NameIdentifier Identifier; + } + + /// + /// Array of AdPlacementDetails + /// + [Serializable] + public class GetAdPlacementsResult : PlayFabResultCommon + { + /// + /// Array of results + /// + public List AdPlacements; + } + + [Serializable] + public class GetCatalogItemsRequest : PlayFabRequestCommon + { + /// + /// Which catalog is being requested. If null, uses the default catalog. + /// + public string CatalogVersion; + } + + /// + /// If CatalogVersion is not specified, only inventory items associated with the most recent version of the catalog will be + /// returned. + /// + [Serializable] + public class GetCatalogItemsResult : PlayFabResultCommon + { + /// + /// Array of items which can be purchased. + /// + public List Catalog; + } + + /// + /// Data is stored as JSON key-value pairs. If the Keys parameter is provided, the data object returned will only contain + /// the data specific to the indicated Keys. Otherwise, the full set of custom character data will be returned. + /// + [Serializable] + public class GetCharacterDataRequest : PlayFabRequestCommon + { + /// + /// Unique PlayFab assigned ID for a specific character owned by a user + /// + public string CharacterId; + /// + /// The version that currently exists according to the caller. The call will return the data for all of the keys if the + /// version in the system is greater than this. + /// + public uint? IfChangedFromDataVersion; + /// + /// Specific keys to search for in the custom user data. + /// + public List Keys; + /// + /// Unique PlayFab identifier of the user to load data for. Optional, defaults to yourself if not set. + /// + public string PlayFabId; + } + + [Serializable] + public class GetCharacterDataResult : PlayFabResultCommon + { + /// + /// Unique PlayFab assigned ID for a specific character owned by a user + /// + public string CharacterId; + /// + /// User specific data for this title. + /// + public Dictionary Data; + /// + /// Indicates the current version of the data that has been set. This is incremented with every set call for that type of + /// data (read-only, internal, etc). This version can be provided in Get calls to find updated data. + /// + public uint DataVersion; + } + + /// + /// All items currently in the character inventory will be returned, irrespective of how they were acquired (via purchasing, + /// grants, coupons, etc.). Items that are expired, fully consumed, or are no longer valid are not considered to be in the + /// user's current inventory, and so will not be not included. Also returns their virtual currency balances. + /// + [Serializable] + public class GetCharacterInventoryRequest : PlayFabRequestCommon + { + /// + /// Used to limit results to only those from a specific catalog version. + /// + public string CatalogVersion; + /// + /// Unique PlayFab assigned ID for a specific character owned by a user + /// + public string CharacterId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + [Serializable] + public class GetCharacterInventoryResult : PlayFabResultCommon + { + /// + /// Unique identifier of the character for this inventory. + /// + public string CharacterId; + /// + /// Array of inventory items belonging to the character. + /// + public List Inventory; + /// + /// Array of virtual currency balance(s) belonging to the character. + /// + public Dictionary VirtualCurrency; + /// + /// Array of remaining times and timestamps for virtual currencies. + /// + public Dictionary VirtualCurrencyRechargeTimes; + } + + [Serializable] + public class GetCharacterLeaderboardRequest : PlayFabRequestCommon + { + /// + /// Maximum number of entries to retrieve. Default 10, maximum 100. + /// + public int? MaxResultsCount; + /// + /// First entry in the leaderboard to be retrieved. + /// + public int StartPosition; + /// + /// Unique identifier for the title-specific statistic for the leaderboard. + /// + public string StatisticName; + } + + /// + /// Note that the Position of the character in the results is for the overall leaderboard. + /// + [Serializable] + public class GetCharacterLeaderboardResult : PlayFabResultCommon + { + /// + /// Ordered list of leaderboard entries. + /// + public List Leaderboard; + } + + [Serializable] + public class GetCharacterStatisticsRequest : PlayFabRequestCommon + { + /// + /// Unique PlayFab assigned ID for a specific character owned by a user + /// + public string CharacterId; + } + + /// + /// In addition to being available for use by the title, the statistics are used for all leaderboard operations in PlayFab. + /// + [Serializable] + public class GetCharacterStatisticsResult : PlayFabResultCommon + { + /// + /// The requested character statistics. + /// + public Dictionary CharacterStatistics; + } + + [Serializable] + public class GetContentDownloadUrlRequest : PlayFabRequestCommon + { + /// + /// HTTP method to fetch item - GET or HEAD. Use HEAD when only fetching metadata. Default is GET. + /// + public string HttpMethod; + /// + /// Key of the content item to fetch, usually formatted as a path, e.g. images/a.png + /// + public string Key; + /// + /// True to download through CDN. CDN provides higher download bandwidth and lower latency. However, if you want the latest, + /// non-cached version of the content during development, set this to false. Default is true. + /// + public bool? ThruCDN; + } + + [Serializable] + public class GetContentDownloadUrlResult : PlayFabResultCommon + { + /// + /// URL for downloading content via HTTP GET or HEAD method. The URL will expire in approximately one hour. + /// + public string URL; + } + + [Serializable] + public class GetFriendLeaderboardAroundPlayerRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Indicates which other platforms' friends should be included in the response. In HTTP, it is represented as a + /// comma-separated list of platforms. + /// + public ExternalFriendSources? ExternalPlatformFriends; + /// + /// Maximum number of entries to retrieve. Default 10, maximum 100. + /// + public int? MaxResultsCount; + /// + /// PlayFab unique identifier of the user to center the leaderboard around. If null will center on the logged in user. + /// + public string PlayFabId; + /// + /// If non-null, this determines which properties of the resulting player profiles to return. For API calls from the client, + /// only the allowed client profile properties for the title may be requested. These allowed properties are configured in + /// the Game Manager "Client Profile Options" tab in the "Settings" section. + /// + public PlayerProfileViewConstraints ProfileConstraints; + /// + /// Statistic used to rank players for this leaderboard. + /// + public string StatisticName; + /// + /// The version of the leaderboard to get. + /// + public int? Version; + /// + /// Xbox token if Xbox friends should be included. Requires Xbox be configured on PlayFab. + /// + public string XboxToken; + } + + /// + /// Note: When calling 'GetLeaderboardAround...' APIs, the position of the user defaults to 0 when the user does not have + /// the corresponding statistic.If Facebook friends are included, make sure the access token from previous LoginWithFacebook + /// call is still valid and not expired. If Xbox Live friends are included, make sure the access token from the previous + /// LoginWithXbox call is still valid and not expired. + /// + [Serializable] + public class GetFriendLeaderboardAroundPlayerResult : PlayFabResultCommon + { + /// + /// Ordered listing of users and their positions in the requested leaderboard. + /// + public List Leaderboard; + /// + /// The time the next scheduled reset will occur. Null if the leaderboard does not reset on a schedule. + /// + public DateTime? NextReset; + /// + /// The version of the leaderboard returned. + /// + public int Version; + } + + [Serializable] + public class GetFriendLeaderboardRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Indicates which other platforms' friends should be included in the response. In HTTP, it is represented as a + /// comma-separated list of platforms. + /// + public ExternalFriendSources? ExternalPlatformFriends; + /// + /// Maximum number of entries to retrieve. Default 10, maximum 100. + /// + public int? MaxResultsCount; + /// + /// If non-null, this determines which properties of the resulting player profiles to return. For API calls from the client, + /// only the allowed client profile properties for the title may be requested. These allowed properties are configured in + /// the Game Manager "Client Profile Options" tab in the "Settings" section. + /// + public PlayerProfileViewConstraints ProfileConstraints; + /// + /// Position in the leaderboard to start this listing (defaults to the first entry). + /// + public int StartPosition; + /// + /// Statistic used to rank friends for this leaderboard. + /// + public string StatisticName; + /// + /// The version of the leaderboard to get. + /// + public int? Version; + /// + /// Xbox token if Xbox friends should be included. Requires Xbox be configured on PlayFab. + /// + public string XboxToken; + } + + [Serializable] + public class GetFriendsListRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Indicates which other platforms' friends should be included in the response. In HTTP, it is represented as a + /// comma-separated list of platforms. + /// + public ExternalFriendSources? ExternalPlatformFriends; + /// + /// If non-null, this determines which properties of the resulting player profiles to return. For API calls from the client, + /// only the allowed client profile properties for the title may be requested. These allowed properties are configured in + /// the Game Manager "Client Profile Options" tab in the "Settings" section. + /// + public PlayerProfileViewConstraints ProfileConstraints; + /// + /// Xbox token if Xbox friends should be included. Requires Xbox be configured on PlayFab. + /// + public string XboxToken; + } + + /// + /// If any additional services are queried for the user's friends, those friends who also have a PlayFab account registered + /// for the title will be returned in the results. For Facebook, user has to have logged into the title's Facebook app + /// recently, and only friends who also plays this game will be included. Note: If the user authenticated with + /// AuthenticationToken when calling LoginWithFacebook, instead of AcessToken, an empty list will be returned. For Xbox + /// Live, user has to have logged into the Xbox Live recently, and only friends who also play this game will be included. + /// + [Serializable] + public class GetFriendsListResult : PlayFabResultCommon + { + /// + /// Array of friends found. + /// + public List Friends; + } + + [Serializable] + public class GetLeaderboardAroundCharacterRequest : PlayFabRequestCommon + { + /// + /// Unique PlayFab assigned ID for a specific character on which to center the leaderboard. + /// + public string CharacterId; + /// + /// Maximum number of entries to retrieve. Default 10, maximum 100. + /// + public int? MaxResultsCount; + /// + /// Unique identifier for the title-specific statistic for the leaderboard. + /// + public string StatisticName; + } + + /// + /// Note: When calling 'GetLeaderboardAround...' APIs, the position of the character defaults to 0 when the character does + /// not have the corresponding statistic. + /// + [Serializable] + public class GetLeaderboardAroundCharacterResult : PlayFabResultCommon + { + /// + /// Ordered list of leaderboard entries. + /// + public List Leaderboard; + } + + [Serializable] + public class GetLeaderboardAroundPlayerRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Maximum number of entries to retrieve. Default 10, maximum 100. + /// + public int? MaxResultsCount; + /// + /// PlayFab unique identifier of the user to center the leaderboard around. If null will center on the logged in user. + /// + public string PlayFabId; + /// + /// If non-null, this determines which properties of the resulting player profiles to return. For API calls from the client, + /// only the allowed client profile properties for the title may be requested. These allowed properties are configured in + /// the Game Manager "Client Profile Options" tab in the "Settings" section. + /// + public PlayerProfileViewConstraints ProfileConstraints; + /// + /// Statistic used to rank players for this leaderboard. + /// + public string StatisticName; + /// + /// The version of the leaderboard to get. + /// + public int? Version; + } + + /// + /// Note: When calling 'GetLeaderboardAround...' APIs, the position of the user defaults to 0 when the user does not have + /// the corresponding statistic. + /// + [Serializable] + public class GetLeaderboardAroundPlayerResult : PlayFabResultCommon + { + /// + /// Ordered listing of users and their positions in the requested leaderboard. + /// + public List Leaderboard; + /// + /// The time the next scheduled reset will occur. Null if the leaderboard does not reset on a schedule. + /// + public DateTime? NextReset; + /// + /// The version of the leaderboard returned. + /// + public int Version; + } + + [Serializable] + public class GetLeaderboardForUsersCharactersRequest : PlayFabRequestCommon + { + /// + /// Unique identifier for the title-specific statistic for the leaderboard. + /// + public string StatisticName; + } + + /// + /// NOTE: The position of the character in the results is relative to the other characters for that specific user. This mean + /// the values will always be between 0 and one less than the number of characters returned regardless of the size of the + /// actual leaderboard. + /// + [Serializable] + public class GetLeaderboardForUsersCharactersResult : PlayFabResultCommon + { + /// + /// Ordered list of leaderboard entries. + /// + public List Leaderboard; + } + + [Serializable] + public class GetLeaderboardRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Maximum number of entries to retrieve. Default 10, maximum 100. + /// + public int? MaxResultsCount; + /// + /// If non-null, this determines which properties of the resulting player profiles to return. For API calls from the client, + /// only the allowed client profile properties for the title may be requested. These allowed properties are configured in + /// the Game Manager "Client Profile Options" tab in the "Settings" section. + /// + public PlayerProfileViewConstraints ProfileConstraints; + /// + /// Position in the leaderboard to start this listing (defaults to the first entry). + /// + public int StartPosition; + /// + /// Statistic used to rank players for this leaderboard. + /// + public string StatisticName; + /// + /// The version of the leaderboard to get. + /// + public int? Version; + } + + /// + /// Note: the user's Position is relative to the overall leaderboard. + /// + [Serializable] + public class GetLeaderboardResult : PlayFabResultCommon + { + /// + /// Ordered listing of users and their positions in the requested leaderboard. + /// + public List Leaderboard; + /// + /// The time the next scheduled reset will occur. Null if the leaderboard does not reset on a schedule. + /// + public DateTime? NextReset; + /// + /// The version of the leaderboard returned. + /// + public int Version; + } + + [Serializable] + public class GetPaymentTokenRequest : PlayFabRequestCommon + { + /// + /// The name of service to provide the payment token. Allowed Values are: xsolla + /// + public string TokenProvider; + } + + [Serializable] + public class GetPaymentTokenResult : PlayFabResultCommon + { + /// + /// PlayFab's purchase order identifier. + /// + public string OrderId; + /// + /// The token from provider. + /// + public string ProviderToken; + } + + [Serializable] + public class GetPhotonAuthenticationTokenRequest : PlayFabRequestCommon + { + /// + /// The Photon applicationId for the game you wish to log into. + /// + public string PhotonApplicationId; + } + + [Serializable] + public class GetPhotonAuthenticationTokenResult : PlayFabResultCommon + { + /// + /// The Photon authentication token for this game-session. + /// + public string PhotonCustomAuthenticationToken; + } + + [Serializable] + public class GetPlayerCombinedInfoRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Flags for which pieces of info to return for the user. + /// + public GetPlayerCombinedInfoRequestParams InfoRequestParameters; + /// + /// PlayFabId of the user whose data will be returned. If not filled included, we return the data for the calling player. + /// + public string PlayFabId; + } + + [Serializable] + public class GetPlayerCombinedInfoRequestParams : PlayFabBaseModel + { + /// + /// Whether to get character inventories. Defaults to false. + /// + public bool GetCharacterInventories; + /// + /// Whether to get the list of characters. Defaults to false. + /// + public bool GetCharacterList; + /// + /// Whether to get player profile. Defaults to false. Has no effect for a new player. + /// + public bool GetPlayerProfile; + /// + /// Whether to get player statistics. Defaults to false. + /// + public bool GetPlayerStatistics; + /// + /// Whether to get title data. Defaults to false. + /// + public bool GetTitleData; + /// + /// Whether to get the player's account Info. Defaults to false + /// + public bool GetUserAccountInfo; + /// + /// Whether to get the player's custom data. Defaults to false + /// + public bool GetUserData; + /// + /// Whether to get the player's inventory. Defaults to false + /// + public bool GetUserInventory; + /// + /// Whether to get the player's read only data. Defaults to false + /// + public bool GetUserReadOnlyData; + /// + /// Whether to get the player's virtual currency balances. Defaults to false + /// + public bool GetUserVirtualCurrency; + /// + /// Specific statistics to retrieve. Leave null to get all keys. Has no effect if GetPlayerStatistics is false + /// + public List PlayerStatisticNames; + /// + /// Specifies the properties to return from the player profile. Defaults to returning the player's display name. + /// + public PlayerProfileViewConstraints ProfileConstraints; + /// + /// Specific keys to search for in the custom data. Leave null to get all keys. Has no effect if GetTitleData is false + /// + public List TitleDataKeys; + /// + /// Specific keys to search for in the custom data. Leave null to get all keys. Has no effect if GetUserData is false + /// + public List UserDataKeys; + /// + /// Specific keys to search for in the custom data. Leave null to get all keys. Has no effect if GetUserReadOnlyData is + /// false + /// + public List UserReadOnlyDataKeys; + } + + /// + /// Returns whatever info is requested in the response for the user. If no user is explicitly requested this defaults to the + /// authenticated user. If the user is the same as the requester, PII (like email address, facebook id) is returned if + /// available. Otherwise, only public information is returned. All parameters default to false. + /// + [Serializable] + public class GetPlayerCombinedInfoResult : PlayFabResultCommon + { + /// + /// Results for requested info. + /// + public GetPlayerCombinedInfoResultPayload InfoResultPayload; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class GetPlayerCombinedInfoResultPayload : PlayFabBaseModel + { + /// + /// Account information for the user. This is always retrieved. + /// + public UserAccountInfo AccountInfo; + /// + /// Inventories for each character for the user. + /// + public List CharacterInventories; + /// + /// List of characters for the user. + /// + public List CharacterList; + /// + /// The profile of the players. This profile is not guaranteed to be up-to-date. For a new player, this profile will not + /// exist. + /// + public PlayerProfileModel PlayerProfile; + /// + /// List of statistics for this player. + /// + public List PlayerStatistics; + /// + /// Title data for this title. + /// + public Dictionary TitleData; + /// + /// User specific custom data. + /// + public Dictionary UserData; + /// + /// The version of the UserData that was returned. + /// + public uint UserDataVersion; + /// + /// Array of inventory items in the user's current inventory. + /// + public List UserInventory; + /// + /// User specific read-only data. + /// + public Dictionary UserReadOnlyData; + /// + /// The version of the Read-Only UserData that was returned. + /// + public uint UserReadOnlyDataVersion; + /// + /// Dictionary of virtual currency balance(s) belonging to the user. + /// + public Dictionary UserVirtualCurrency; + /// + /// Dictionary of remaining times and timestamps for virtual currencies. + /// + public Dictionary UserVirtualCurrencyRechargeTimes; + } + + /// + /// This API allows for access to details regarding a user in the PlayFab service, usually for purposes of customer support. + /// Note that data returned may be Personally Identifying Information (PII), such as email address, and so care should be + /// taken in how this data is stored and managed. Since this call will always return the relevant information for users who + /// have accessed the title, the recommendation is to not store this data locally. + /// + [Serializable] + public class GetPlayerProfileRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + /// + /// If non-null, this determines which properties of the resulting player profiles to return. For API calls from the client, + /// only the allowed client profile properties for the title may be requested. These allowed properties are configured in + /// the Game Manager "Client Profile Options" tab in the "Settings" section. + /// + public PlayerProfileViewConstraints ProfileConstraints; + } + + [Serializable] + public class GetPlayerProfileResult : PlayFabResultCommon + { + /// + /// The profile of the player. This profile is not guaranteed to be up-to-date. For a new player, this profile will not + /// exist. + /// + public PlayerProfileModel PlayerProfile; + } + + [Serializable] + public class GetPlayerSegmentsRequest : PlayFabRequestCommon + { + } + + [Serializable] + public class GetPlayerSegmentsResult : PlayFabResultCommon + { + /// + /// Array of segments the requested player currently belongs to. + /// + public List Segments; + } + + [Serializable] + public class GetPlayerStatisticsRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// statistics to return (current version will be returned for each) + /// + public List StatisticNames; + /// + /// statistics to return, if StatisticNames is not set (only statistics which have a version matching that provided will be + /// returned) + /// + public List StatisticNameVersions; + } + + /// + /// In addition to being available for use by the title, the statistics are used for all leaderboard operations in PlayFab. + /// + [Serializable] + public class GetPlayerStatisticsResult : PlayFabResultCommon + { + /// + /// User statistics for the requested user. + /// + public List Statistics; + } + + [Serializable] + public class GetPlayerStatisticVersionsRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// unique name of the statistic + /// + public string StatisticName; + } + + [Serializable] + public class GetPlayerStatisticVersionsResult : PlayFabResultCommon + { + /// + /// version change history of the statistic + /// + public List StatisticVersions; + } + + /// + /// This API will return a list of canonical tags which includes both namespace and tag's name. If namespace is not + /// provided, the result is a list of all canonical tags. TagName can be used for segmentation and Namespace is limited to + /// 128 characters. + /// + [Serializable] + public class GetPlayerTagsRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Optional namespace to filter results by + /// + public string Namespace; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class GetPlayerTagsResult : PlayFabResultCommon + { + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + /// + /// Canonical tags (including namespace and tag's name) for the requested user + /// + public List Tags; + } + + [Serializable] + public class GetPlayerTradesRequest : PlayFabRequestCommon + { + /// + /// Returns only trades with the given status. If null, returns all trades. + /// + public TradeStatus? StatusFilter; + } + + [Serializable] + public class GetPlayerTradesResponse : PlayFabResultCommon + { + /// + /// History of trades which this player has accepted. + /// + public List AcceptedTrades; + /// + /// The trades for this player which are currently available to be accepted. + /// + public List OpenedTrades; + } + + [Serializable] + public class GetPlayFabIDsFromFacebookIDsRequest : PlayFabRequestCommon + { + /// + /// Array of unique Facebook identifiers for which the title needs to get PlayFab identifiers. The array cannot exceed 2,000 + /// in length. + /// + public List FacebookIDs; + } + + /// + /// For Facebook identifiers which have not been linked to PlayFab accounts, null will be returned. + /// + [Serializable] + public class GetPlayFabIDsFromFacebookIDsResult : PlayFabResultCommon + { + /// + /// Mapping of Facebook identifiers to PlayFab identifiers. + /// + public List Data; + } + + [Serializable] + public class GetPlayFabIDsFromFacebookInstantGamesIdsRequest : PlayFabRequestCommon + { + /// + /// Array of unique Facebook Instant Games identifiers for which the title needs to get PlayFab identifiers. The array + /// cannot exceed 25 in length. + /// + public List FacebookInstantGamesIds; + } + + /// + /// For Facebook Instant Game identifiers which have not been linked to PlayFab accounts, null will be returned. + /// + [Serializable] + public class GetPlayFabIDsFromFacebookInstantGamesIdsResult : PlayFabResultCommon + { + /// + /// Mapping of Facebook Instant Games identifiers to PlayFab identifiers. + /// + public List Data; + } + + [Serializable] + public class GetPlayFabIDsFromGameCenterIDsRequest : PlayFabRequestCommon + { + /// + /// Array of unique Game Center identifiers (the Player Identifier) for which the title needs to get PlayFab identifiers. + /// The array cannot exceed 2,000 in length. + /// + public List GameCenterIDs; + } + + /// + /// For Game Center identifiers which have not been linked to PlayFab accounts, null will be returned. + /// + [Serializable] + public class GetPlayFabIDsFromGameCenterIDsResult : PlayFabResultCommon + { + /// + /// Mapping of Game Center identifiers to PlayFab identifiers. + /// + public List Data; + } + + [Serializable] + public class GetPlayFabIDsFromGenericIDsRequest : PlayFabRequestCommon + { + /// + /// Array of unique generic service identifiers for which the title needs to get PlayFab identifiers. Currently limited to a + /// maximum of 10 in a single request. + /// + public List GenericIDs; + } + + /// + /// For generic service identifiers which have not been linked to PlayFab accounts, null will be returned. + /// + [Serializable] + public class GetPlayFabIDsFromGenericIDsResult : PlayFabResultCommon + { + /// + /// Mapping of generic service identifiers to PlayFab identifiers. + /// + public List Data; + } + + [Serializable] + public class GetPlayFabIDsFromGoogleIDsRequest : PlayFabRequestCommon + { + /// + /// Array of unique Google identifiers (Google+ user IDs) for which the title needs to get PlayFab identifiers. The array + /// cannot exceed 2,000 in length. + /// + public List GoogleIDs; + } + + /// + /// For Google identifiers which have not been linked to PlayFab accounts, null will be returned. + /// + [Serializable] + public class GetPlayFabIDsFromGoogleIDsResult : PlayFabResultCommon + { + /// + /// Mapping of Google identifiers to PlayFab identifiers. + /// + public List Data; + } + + [Serializable] + public class GetPlayFabIDsFromGooglePlayGamesPlayerIDsRequest : PlayFabRequestCommon + { + /// + /// Array of unique Google Play Games identifiers (Google+ user IDs) for which the title needs to get PlayFab identifiers. + /// The array cannot exceed 2,000 in length. + /// + public List GooglePlayGamesPlayerIDs; + } + + /// + /// For Google Play Games identifiers which have not been linked to PlayFab accounts, null will be returned. + /// + [Serializable] + public class GetPlayFabIDsFromGooglePlayGamesPlayerIDsResult : PlayFabResultCommon + { + /// + /// Mapping of Google Play Games identifiers to PlayFab identifiers. + /// + public List Data; + } + + [Serializable] + public class GetPlayFabIDsFromKongregateIDsRequest : PlayFabRequestCommon + { + /// + /// Array of unique Kongregate identifiers (Kongregate's user_id) for which the title needs to get PlayFab identifiers. The + /// array cannot exceed 2,000 in length. + /// + public List KongregateIDs; + } + + /// + /// For Kongregate identifiers which have not been linked to PlayFab accounts, null will be returned. + /// + [Serializable] + public class GetPlayFabIDsFromKongregateIDsResult : PlayFabResultCommon + { + /// + /// Mapping of Kongregate identifiers to PlayFab identifiers. + /// + public List Data; + } + + [Serializable] + public class GetPlayFabIDsFromNintendoServiceAccountIdsRequest : PlayFabRequestCommon + { + /// + /// Array of unique Nintendo Switch Account identifiers for which the title needs to get PlayFab identifiers. The array + /// cannot exceed 2,000 in length. + /// + public List NintendoAccountIds; + } + + /// + /// For Nintendo Service Account identifiers which have not been linked to PlayFab accounts, null will be returned. + /// + [Serializable] + public class GetPlayFabIDsFromNintendoServiceAccountIdsResult : PlayFabResultCommon + { + /// + /// Mapping of Nintendo Switch Service Account identifiers to PlayFab identifiers. + /// + public List Data; + } + + [Serializable] + public class GetPlayFabIDsFromNintendoSwitchDeviceIdsRequest : PlayFabRequestCommon + { + /// + /// Array of unique Nintendo Switch Device identifiers for which the title needs to get PlayFab identifiers. The array + /// cannot exceed 2,000 in length. + /// + public List NintendoSwitchDeviceIds; + } + + /// + /// For Nintendo Switch identifiers which have not been linked to PlayFab accounts, null will be returned. + /// + [Serializable] + public class GetPlayFabIDsFromNintendoSwitchDeviceIdsResult : PlayFabResultCommon + { + /// + /// Mapping of Nintendo Switch Device identifiers to PlayFab identifiers. + /// + public List Data; + } + + [Serializable] + public class GetPlayFabIDsFromPSNAccountIDsRequest : PlayFabRequestCommon + { + /// + /// Id of the PlayStation :tm: Network issuer environment. If null, defaults to production environment. + /// + public int? IssuerId; + /// + /// Array of unique PlayStation :tm: Network identifiers for which the title needs to get PlayFab identifiers. The array + /// cannot exceed 2,000 in length. + /// + public List PSNAccountIDs; + } + + /// + /// For PlayStation :tm: Network identifiers which have not been linked to PlayFab accounts, null will be returned. + /// + [Serializable] + public class GetPlayFabIDsFromPSNAccountIDsResult : PlayFabResultCommon + { + /// + /// Mapping of PlayStation :tm: Network identifiers to PlayFab identifiers. + /// + public List Data; + } + + [Serializable] + public class GetPlayFabIDsFromPSNOnlineIDsRequest : PlayFabRequestCommon + { + /// + /// Id of the PlayStation :tm: Network issuer environment. If null, defaults to production environment. + /// + public int? IssuerId; + /// + /// Array of unique PlayStation :tm: Network identifiers for which the title needs to get PlayFab identifiers. The array + /// cannot exceed 2,000 in length. + /// + public List PSNOnlineIDs; + } + + /// + /// For PlayStation :tm: Network identifiers which have not been linked to PlayFab accounts, null will be returned. + /// + [Serializable] + public class GetPlayFabIDsFromPSNOnlineIDsResult : PlayFabResultCommon + { + /// + /// Mapping of PlayStation :tm: Network identifiers to PlayFab identifiers. + /// + public List Data; + } + + [Serializable] + public class GetPlayFabIDsFromSteamIDsRequest : PlayFabRequestCommon + { + /// + /// Array of unique Steam identifiers (Steam profile IDs) for which the title needs to get PlayFab identifiers. The array + /// cannot exceed 2,000 in length. + /// + public List SteamStringIDs; + } + + /// + /// For Steam identifiers which have not been linked to PlayFab accounts, null will be returned. + /// + [Serializable] + public class GetPlayFabIDsFromSteamIDsResult : PlayFabResultCommon + { + /// + /// Mapping of Steam identifiers to PlayFab identifiers. + /// + public List Data; + } + + [Serializable] + public class GetPlayFabIDsFromTwitchIDsRequest : PlayFabRequestCommon + { + /// + /// Array of unique Twitch identifiers (Twitch's _id) for which the title needs to get PlayFab identifiers. The array cannot + /// exceed 2,000 in length. + /// + public List TwitchIds; + } + + /// + /// For Twitch identifiers which have not been linked to PlayFab accounts, null will be returned. + /// + [Serializable] + public class GetPlayFabIDsFromTwitchIDsResult : PlayFabResultCommon + { + /// + /// Mapping of Twitch identifiers to PlayFab identifiers. + /// + public List Data; + } + + [Serializable] + public class GetPlayFabIDsFromXboxLiveIDsRequest : PlayFabRequestCommon + { + /// + /// The ID of Xbox Live sandbox. + /// + public string Sandbox; + /// + /// Array of unique Xbox Live account identifiers for which the title needs to get PlayFab identifiers. The array cannot + /// exceed 2,000 in length. + /// + public List XboxLiveAccountIDs; + } + + /// + /// For XboxLive identifiers which have not been linked to PlayFab accounts, null will be returned. + /// + [Serializable] + public class GetPlayFabIDsFromXboxLiveIDsResult : PlayFabResultCommon + { + /// + /// Mapping of Xbox Live identifiers to PlayFab identifiers. + /// + public List Data; + } + + /// + /// This API is designed to return publisher-specific values which can be read, but not written to, by the client. This data + /// is shared across all titles assigned to a particular publisher, and can be used for cross-game coordination. Only titles + /// assigned to a publisher can use this API. For more information email helloplayfab@microsoft.com. Note that there may up + /// to a minute delay in between updating title data and this API call returning the newest value. + /// + [Serializable] + public class GetPublisherDataRequest : PlayFabRequestCommon + { + /// + /// array of keys to get back data from the Publisher data blob, set by the admin tools + /// + public List Keys; + } + + [Serializable] + public class GetPublisherDataResult : PlayFabResultCommon + { + /// + /// a dictionary object of key / value pairs + /// + public Dictionary Data; + } + + [Serializable] + public class GetPurchaseRequest : PlayFabRequestCommon + { + /// + /// Purchase order identifier. + /// + public string OrderId; + } + + [Serializable] + public class GetPurchaseResult : PlayFabResultCommon + { + /// + /// Purchase order identifier. + /// + public string OrderId; + /// + /// Payment provider used for transaction (If not VC) + /// + public string PaymentProvider; + /// + /// Date and time of the purchase. + /// + public DateTime PurchaseDate; + /// + /// Provider transaction ID (If not VC) + /// + public string TransactionId; + /// + /// PlayFab transaction status + /// + public string TransactionStatus; + } + + [Serializable] + public class GetSegmentResult : PlayFabBaseModel + { + /// + /// Identifier of the segments AB Test, if it is attached to one. + /// + public string ABTestParent; + /// + /// Unique identifier for this segment. + /// + public string Id; + /// + /// Segment name. + /// + public string Name; + } + + [Serializable] + public class GetSharedGroupDataRequest : PlayFabRequestCommon + { + /// + /// If true, return the list of all members of the shared group. + /// + public bool? GetMembers; + /// + /// Specific keys to retrieve from the shared group (if not specified, all keys will be returned, while an empty array + /// indicates that no keys should be returned). + /// + public List Keys; + /// + /// Unique identifier for the shared group. + /// + public string SharedGroupId; + } + + [Serializable] + public class GetSharedGroupDataResult : PlayFabResultCommon + { + /// + /// Data for the requested keys. + /// + public Dictionary Data; + /// + /// List of PlayFabId identifiers for the members of this group, if requested. + /// + public List Members; + } + + /// + /// A store contains an array of references to items defined in one or more catalog versions of the game, along with the + /// prices for the item, in both real world and virtual currencies. These prices act as an override to any prices defined in + /// the catalog. In this way, the base definitions of the items may be defined in the catalog, with all associated + /// properties, while the pricing can be set for each store, as needed. This allows for subsets of goods to be defined for + /// different purposes (in order to simplify showing some, but not all catalog items to users, based upon different + /// characteristics), along with unique prices. Note that all prices defined in the catalog and store definitions for the + /// item are considered valid, and that a compromised client can be made to send a request for an item based upon any of + /// these definitions. If no price is specified in the store for an item, the price set in the catalog should be displayed + /// to the user. + /// + [Serializable] + public class GetStoreItemsRequest : PlayFabRequestCommon + { + /// + /// Catalog version to store items from. Use default catalog version if null + /// + public string CatalogVersion; + /// + /// Unqiue identifier for the store which is being requested. + /// + public string StoreId; + } + + [Serializable] + public class GetStoreItemsResult : PlayFabResultCommon + { + /// + /// The base catalog that this store is a part of. + /// + public string CatalogVersion; + /// + /// Additional data about the store. + /// + public StoreMarketingModel MarketingData; + /// + /// How the store was last updated (Admin or a third party). + /// + public SourceType? Source; + /// + /// Array of items which can be purchased from this store. + /// + public List Store; + /// + /// The ID of this store. + /// + public string StoreId; + } + + /// + /// This query retrieves the current time from one of the servers in PlayFab. Please note that due to clock drift between + /// servers, there is a potential variance of up to 5 seconds. + /// + [Serializable] + public class GetTimeRequest : PlayFabRequestCommon + { + } + + /// + /// Time is always returned as Coordinated Universal Time (UTC). + /// + [Serializable] + public class GetTimeResult : PlayFabResultCommon + { + /// + /// Current server time when the request was received, in UTC + /// + public DateTime Time; + } + + /// + /// This API is designed to return title specific values which can be read, but not written to, by the client. For example, + /// a developer could choose to store values which modify the user experience, such as enemy spawn rates, weapon strengths, + /// movement speeds, etc. This allows a developer to update the title without the need to create, test, and ship a new + /// build. If the player belongs to an experiment variant that uses title data overrides, the overrides are applied + /// automatically and returned with the title data. Note that there may up to a minute delay in between updating title data + /// and this API call returning the newest value. + /// + [Serializable] + public class GetTitleDataRequest : PlayFabRequestCommon + { + /// + /// Specific keys to search for in the title data (leave null to get all keys) + /// + public List Keys; + /// + /// Optional field that specifies the name of an override. This value is ignored when used by the game client; otherwise, + /// the overrides are applied automatically to the title data. + /// + public string OverrideLabel; + } + + [Serializable] + public class GetTitleDataResult : PlayFabResultCommon + { + /// + /// a dictionary object of key / value pairs + /// + public Dictionary Data; + } + + [Serializable] + public class GetTitleNewsRequest : PlayFabRequestCommon + { + /// + /// Limits the results to the last n entries. Defaults to 10 if not set. + /// + public int? Count; + } + + [Serializable] + public class GetTitleNewsResult : PlayFabResultCommon + { + /// + /// Array of news items. + /// + public List News; + } + + /// + /// An RSA CSP blob to be used to encrypt the payload of account creation requests when that API requires a signature + /// header. For example if Client/LoginWithCustomId requires signature headers but the player does not have an account yet + /// follow these steps: 1) Call Client/GetTitlePublicKey with one of the title's shared secrets. 2) Convert the Base64 + /// encoded CSP blob to a byte array and create an RSA signing object. 3) Encrypt the UTF8 encoded JSON body of the + /// registration request and place the Base64 encoded result into the EncryptedRequest and with the TitleId field, all other + /// fields can be left empty when performing the API request. 4) Client receives authentication token as normal. Future + /// requests to LoginWithCustomId will require the X-PlayFab-Signature header. + /// + [Serializable] + public class GetTitlePublicKeyRequest : PlayFabRequestCommon + { + /// + /// Unique identifier for the title, found in the Settings > Game Properties section of the PlayFab developer site when a + /// title has been selected. + /// + public string TitleId; + /// + /// The shared secret key for this title + /// + public string TitleSharedSecret; + } + + [Serializable] + public class GetTitlePublicKeyResult : PlayFabResultCommon + { + /// + /// Base64 encoded RSA CSP byte array blob containing the title's public RSA key + /// + public string RSAPublicKey; + } + + [Serializable] + public class GetTradeStatusRequest : PlayFabRequestCommon + { + /// + /// Player who opened trade. + /// + public string OfferingPlayerId; + /// + /// Trade identifier as returned by OpenTradeOffer. + /// + public string TradeId; + } + + [Serializable] + public class GetTradeStatusResponse : PlayFabResultCommon + { + /// + /// Information about the requested trade. + /// + public TradeInfo Trade; + } + + /// + /// Data is stored as JSON key-value pairs. Every time the data is updated via any source, the version counter is + /// incremented. If the Version parameter is provided, then this call will only return data if the current version on the + /// system is greater than the value provided. If the Keys parameter is provided, the data object returned will only contain + /// the data specific to the indicated Keys. Otherwise, the full set of custom user data will be returned. + /// + [Serializable] + public class GetUserDataRequest : PlayFabRequestCommon + { + /// + /// The version that currently exists according to the caller. The call will return the data for all of the keys if the + /// version in the system is greater than this. + /// + public uint? IfChangedFromDataVersion; + /// + /// List of unique keys to load from. + /// + public List Keys; + /// + /// Unique PlayFab identifier of the user to load data for. Optional, defaults to yourself if not set. When specified to a + /// PlayFab id of another player, then this will only return public keys for that account. + /// + public string PlayFabId; + } + + [Serializable] + public class GetUserDataResult : PlayFabResultCommon + { + /// + /// User specific data for this title. + /// + public Dictionary Data; + /// + /// Indicates the current version of the data that has been set. This is incremented with every set call for that type of + /// data (read-only, internal, etc). This version can be provided in Get calls to find updated data. + /// + public uint DataVersion; + } + + [Serializable] + public class GetUserInventoryRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + /// + /// All items currently in the user inventory will be returned, irrespective of how they were acquired (via purchasing, + /// grants, coupons, etc.). Items that are expired, fully consumed, or are no longer valid are not considered to be in the + /// user's current inventory, and so will not be not included. + /// + [Serializable] + public class GetUserInventoryResult : PlayFabResultCommon + { + /// + /// Array of inventory items belonging to the user. + /// + public List Inventory; + /// + /// Array of virtual currency balance(s) belonging to the user. + /// + public Dictionary VirtualCurrency; + /// + /// Array of remaining times and timestamps for virtual currencies. + /// + public Dictionary VirtualCurrencyRechargeTimes; + } + + [Serializable] + public class GooglePlayFabIdPair : PlayFabBaseModel + { + /// + /// Unique Google identifier for a user. + /// + public string GoogleId; + /// + /// Unique PlayFab identifier for a user, or null if no PlayFab account is linked to the Google identifier. + /// + public string PlayFabId; + } + + [Serializable] + public class GooglePlayGamesPlayFabIdPair : PlayFabBaseModel + { + /// + /// Unique Google Play Games identifier for a user. + /// + public string GooglePlayGamesPlayerId; + /// + /// Unique PlayFab identifier for a user, or null if no PlayFab account is linked to the Google Play Games identifier. + /// + public string PlayFabId; + } + + /// + /// Grants a character to the user of the type specified by the item ID. The user must already have an instance of this item + /// in their inventory in order to allow character creation. This item can come from a purchase or grant, which must be done + /// before calling to create the character. + /// + [Serializable] + public class GrantCharacterToUserRequest : PlayFabRequestCommon + { + /// + /// Catalog version from which items are to be granted. + /// + public string CatalogVersion; + /// + /// Non-unique display name of the character being granted (1-40 characters in length). + /// + public string CharacterName; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Catalog item identifier of the item in the user's inventory that corresponds to the character in the catalog to be + /// created. + /// + public string ItemId; + } + + [Serializable] + public class GrantCharacterToUserResult : PlayFabResultCommon + { + /// + /// Unique identifier tagged to this character. + /// + public string CharacterId; + /// + /// Type of character that was created. + /// + public string CharacterType; + /// + /// Indicates whether this character was created successfully. + /// + public bool Result; + } + + /// + /// A unique instance of an item in a user's inventory. Note, to retrieve additional information for an item such as Tags, + /// Description that are the same across all instances of the item, a call to GetCatalogItems is required. The ItemID of can + /// be matched to a catalog entry, which contains the additional information. Also note that Custom Data is only set when + /// the User's specific instance has updated the CustomData via a call to UpdateUserInventoryItemCustomData. Other fields + /// such as UnitPrice and UnitCurrency are only set when the item was granted via a purchase. + /// + [Serializable] + public class ItemInstance : PlayFabBaseModel + { + /// + /// Game specific comment associated with this instance when it was added to the user inventory. + /// + public string Annotation; + /// + /// Array of unique items that were awarded when this catalog item was purchased. + /// + public List BundleContents; + /// + /// Unique identifier for the parent inventory item, as defined in the catalog, for object which were added from a bundle or + /// container. + /// + public string BundleParent; + /// + /// Catalog version for the inventory item, when this instance was created. + /// + public string CatalogVersion; + /// + /// A set of custom key-value pairs on the instance of the inventory item, which is not to be confused with the catalog + /// item's custom data. + /// + public Dictionary CustomData; + /// + /// CatalogItem.DisplayName at the time this item was purchased. + /// + public string DisplayName; + /// + /// Timestamp for when this instance will expire. + /// + public DateTime? Expiration; + /// + /// Class name for the inventory item, as defined in the catalog. + /// + public string ItemClass; + /// + /// Unique identifier for the inventory item, as defined in the catalog. + /// + public string ItemId; + /// + /// Unique item identifier for this specific instance of the item. + /// + public string ItemInstanceId; + /// + /// Timestamp for when this instance was purchased. + /// + public DateTime? PurchaseDate; + /// + /// Total number of remaining uses, if this is a consumable item. + /// + public int? RemainingUses; + /// + /// Currency type for the cost of the catalog item. Not available when granting items. + /// + public string UnitCurrency; + /// + /// Cost of the catalog item in the given currency. Not available when granting items. + /// + public uint UnitPrice; + /// + /// The number of uses that were added or removed to this item in this call. + /// + public int? UsesIncrementedBy; + } + + [Serializable] + public class ItemPurchaseRequest : PlayFabBaseModel + { + /// + /// Title-specific text concerning this purchase. + /// + public string Annotation; + /// + /// Unique ItemId of the item to purchase. + /// + public string ItemId; + /// + /// How many of this item to purchase. Min 1, maximum 25. + /// + public uint Quantity; + /// + /// Items to be upgraded as a result of this purchase (upgraded items are hidden, as they are "replaced" by the new items). + /// + public List UpgradeFromItems; + } + + [Serializable] + public class KongregatePlayFabIdPair : PlayFabBaseModel + { + /// + /// Unique Kongregate identifier for a user. + /// + public string KongregateId; + /// + /// Unique PlayFab identifier for a user, or null if no PlayFab account is linked to the Kongregate identifier. + /// + public string PlayFabId; + } + + [Serializable] + public class LinkAndroidDeviceIDRequest : PlayFabRequestCommon + { + /// + /// Specific model of the user's device. + /// + public string AndroidDevice; + /// + /// Android device identifier for the user's device. + /// + public string AndroidDeviceId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// If another user is already linked to the device, unlink the other user and re-link. + /// + public bool? ForceLink; + /// + /// Specific Operating System version for the user's device. + /// + public string OS; + } + + [Serializable] + public class LinkAndroidDeviceIDResult : PlayFabResultCommon + { + } + + [Serializable] + public class LinkAppleRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// If another user is already linked to a specific Apple account, unlink the other user and re-link. + /// + public bool? ForceLink; + /// + /// The JSON Web token (JWT) returned by Apple after login. Represented as the identityToken field in the authorization + /// credential payload. Used to validate the request and find the user ID (Apple subject) to link with. + /// + public string IdentityToken; + } + + [Serializable] + public class LinkCustomIDRequest : PlayFabRequestCommon + { + /// + /// Custom unique identifier for the user, generated by the title. + /// + public string CustomId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// If another user is already linked to the custom ID, unlink the other user and re-link. + /// + public bool? ForceLink; + } + + [Serializable] + public class LinkCustomIDResult : PlayFabResultCommon + { + } + + [Serializable] + public class LinkedPlatformAccountModel : PlayFabBaseModel + { + /// + /// Linked account email of the user on the platform, if available + /// + public string Email; + /// + /// Authentication platform + /// + public LoginIdentityProvider? Platform; + /// + /// Unique account identifier of the user on the platform + /// + public string PlatformUserId; + /// + /// Linked account username of the user on the platform, if available + /// + public string Username; + } + + /// + /// Facebook sign-in is accomplished using the Facebook User Access Token. More information on the Token can be found in the + /// Facebook developer documentation (https://developers.facebook.com/docs/facebook-login/access-tokens/). In Unity, for + /// example, the Token is available as AccessToken in the Facebook SDK ScriptableObject FB. Note that titles should never + /// re-use the same Facebook applications between PlayFab Title IDs, as Facebook provides unique user IDs per application + /// and doing so can result in issues with the Facebook ID for the user in their PlayFab account information. If you must + /// re-use an application in a new PlayFab Title ID, please be sure to first unlink all accounts from Facebook, or delete + /// all users in the first Title ID. + /// + [Serializable] + public class LinkFacebookAccountRequest : PlayFabRequestCommon + { + /// + /// Unique identifier from Facebook for the user. + /// + public string AccessToken; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// If another user is already linked to the account, unlink the other user and re-link. + /// + public bool? ForceLink; + } + + [Serializable] + public class LinkFacebookAccountResult : PlayFabResultCommon + { + } + + [Serializable] + public class LinkFacebookInstantGamesIdRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Facebook Instant Games signature for the user. + /// + public string FacebookInstantGamesSignature; + /// + /// If another user is already linked to the Facebook Instant Games ID, unlink the other user and re-link. + /// + public bool? ForceLink; + } + + [Serializable] + public class LinkFacebookInstantGamesIdResult : PlayFabResultCommon + { + } + + [Serializable] + public class LinkGameCenterAccountRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// If another user is already linked to the account, unlink the other user and re-link. If the current user is already + /// linked, link both accounts + /// + public bool? ForceLink; + /// + /// Game Center identifier for the player account to be linked. + /// + public string GameCenterId; + /// + /// The URL for the public encryption key that will be used to verify the signature. + /// + public string PublicKeyUrl; + /// + /// A random value used to compute the hash and keep it randomized. + /// + public string Salt; + /// + /// The verification signature of the authentication payload. + /// + public string Signature; + /// + /// The integer representation of date and time that the signature was created on. PlayFab will reject authentication + /// signatures not within 10 minutes of the server's current time. + /// + public string Timestamp; + } + + [Serializable] + public class LinkGameCenterAccountResult : PlayFabResultCommon + { + } + + /// + /// Google sign-in is accomplished by obtaining a Google OAuth 2.0 credential using the Google sign-in for Android APIs on + /// the device and passing it to this API. + /// + [Serializable] + public class LinkGoogleAccountRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// If another user is already linked to the account, unlink the other user and re-link. If the current user is already + /// linked, link both accounts + /// + public bool? ForceLink; + /// + /// Server authentication code obtained on the client by calling getServerAuthCode() + /// (https://developers.google.com/identity/sign-in/android/offline-access) from Google Play for the user. + /// + public string ServerAuthCode; + } + + [Serializable] + public class LinkGoogleAccountResult : PlayFabResultCommon + { + } + + /// + /// Google Play Games sign-in is accomplished by obtaining a Google OAuth 2.0 credential using the Google Play Games sign-in + /// for Android APIs on the device and passing it to this API. + /// + [Serializable] + public class LinkGooglePlayGamesServicesAccountRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// If another user is already linked to the account, unlink the other user and re-link. If the current user is already + /// linked, link both accounts + /// + public bool? ForceLink; + /// + /// OAuth 2.0 server authentication code obtained on the client by calling the requestServerSideAccess() + /// (https://developers.google.com/games/services/android/signin) Google Play Games client API. + /// + public string ServerAuthCode; + } + + [Serializable] + public class LinkGooglePlayGamesServicesAccountResult : PlayFabResultCommon + { + } + + [Serializable] + public class LinkIOSDeviceIDRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Vendor-specific iOS identifier for the user's device. + /// + public string DeviceId; + /// + /// Specific model of the user's device. + /// + public string DeviceModel; + /// + /// If another user is already linked to the device, unlink the other user and re-link. + /// + public bool? ForceLink; + /// + /// Specific Operating System version for the user's device. + /// + public string OS; + } + + [Serializable] + public class LinkIOSDeviceIDResult : PlayFabResultCommon + { + } + + [Serializable] + public class LinkKongregateAccountRequest : PlayFabRequestCommon + { + /// + /// Valid session auth ticket issued by Kongregate + /// + public string AuthTicket; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// If another user is already linked to the account, unlink the other user and re-link. + /// + public bool? ForceLink; + /// + /// Numeric user ID assigned by Kongregate + /// + public string KongregateId; + } + + [Serializable] + public class LinkKongregateAccountResult : PlayFabResultCommon + { + } + + [Serializable] + public class LinkNintendoServiceAccountRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// If another user is already linked to a specific Nintendo Switch account, unlink the other user and re-link. + /// + public bool? ForceLink; + /// + /// The JSON Web token (JWT) returned by Nintendo after login. Used to validate the request and find the user ID (Nintendo + /// Switch subject) to link with. + /// + public string IdentityToken; + } + + [Serializable] + public class LinkNintendoSwitchDeviceIdRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// If another user is already linked to the Nintendo Switch Device ID, unlink the other user and re-link. + /// + public bool? ForceLink; + /// + /// Nintendo Switch unique identifier for the user's device. + /// + public string NintendoSwitchDeviceId; + } + + [Serializable] + public class LinkNintendoSwitchDeviceIdResult : PlayFabResultCommon + { + } + + [Serializable] + public class LinkOpenIdConnectRequest : PlayFabRequestCommon + { + /// + /// A name that identifies which configured OpenID Connect provider relationship to use. Maximum 100 characters. + /// + public string ConnectionId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// If another user is already linked to a specific OpenId Connect user, unlink the other user and re-link. + /// + public bool? ForceLink; + /// + /// The JSON Web token (JWT) returned by the identity provider after login. Represented as the id_token field in the + /// identity provider's response. Used to validate the request and find the user ID (OpenID Connect subject) to link with. + /// + public string IdToken; + } + + [Serializable] + public class LinkPSNAccountRequest : PlayFabRequestCommon + { + /// + /// Authentication code provided by the PlayStation :tm: Network. + /// + public string AuthCode; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// If another user is already linked to the account, unlink the other user and re-link. + /// + public bool? ForceLink; + /// + /// Id of the PlayStation :tm: Network issuer environment. If null, defaults to production environment. + /// + public int? IssuerId; + /// + /// Redirect URI supplied to PlayStation :tm: Network when requesting an auth code + /// + public string RedirectUri; + } + + [Serializable] + public class LinkPSNAccountResult : PlayFabResultCommon + { + } + + /// + /// Steam authentication is accomplished with the Steam Session Ticket. More information on the Ticket can be found in the + /// Steamworks SDK, here: https://partner.steamgames.com/documentation/auth (requires sign-in). NOTE: For Steam + /// authentication to work, the title must be configured with the Steam Application ID and Publisher Key in the PlayFab Game + /// Manager (under Properties). Information on creating a Publisher Key (referred to as the Secret Key in PlayFab) for your + /// title can be found here: https://partner.steamgames.com/documentation/webapi#publisherkey. + /// + [Serializable] + public class LinkSteamAccountRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// If another user is already linked to the account, unlink the other user and re-link. + /// + public bool? ForceLink; + /// + /// Authentication token for the user, returned as a byte array from Steam, and converted to a string (for example, the byte + /// 0x08 should become "08"). + /// + public string SteamTicket; + /// + /// True if ticket was generated using ISteamUser::GetAuthTicketForWebAPI() using "AzurePlayFab" as the identity string. + /// False if the ticket was generated with ISteamUser::GetAuthSessionTicket(). + /// + public bool? TicketIsServiceSpecific; + } + + [Serializable] + public class LinkSteamAccountResult : PlayFabResultCommon + { + } + + [Serializable] + public class LinkTwitchAccountRequest : PlayFabRequestCommon + { + /// + /// Valid token issued by Twitch + /// + public string AccessToken; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// If another user is already linked to the account, unlink the other user and re-link. + /// + public bool? ForceLink; + } + + [Serializable] + public class LinkTwitchAccountResult : PlayFabResultCommon + { + } + + [Serializable] + public class LinkXboxAccountRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// If another user is already linked to the account, unlink the other user and re-link. + /// + public bool? ForceLink; + /// + /// Token provided by the Xbox Live SDK/XDK method GetTokenAndSignatureAsync("POST", "https://playfabapi.com/", ""). + /// + public string XboxToken; + } + + [Serializable] + public class LinkXboxAccountResult : PlayFabResultCommon + { + } + + /// + /// Returns a list of every character that currently belongs to a user. + /// + [Serializable] + public class ListUsersCharactersRequest : PlayFabRequestCommon + { + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class ListUsersCharactersResult : PlayFabResultCommon + { + /// + /// The requested list of characters. + /// + public List Characters; + } + + [Serializable] + public class LocationModel : PlayFabBaseModel + { + /// + /// City name. + /// + public string City; + /// + /// The two-character continent code for this location + /// + public ContinentCode? ContinentCode; + /// + /// The two-character ISO 3166-1 country code for the country associated with the location + /// + public CountryCode? CountryCode; + /// + /// Latitude coordinate of the geographic location. + /// + public double? Latitude; + /// + /// Longitude coordinate of the geographic location. + /// + public double? Longitude; + } + + public enum LoginIdentityProvider + { + Unknown, + PlayFab, + Custom, + GameCenter, + GooglePlay, + Steam, + XBoxLive, + PSN, + Kongregate, + Facebook, + IOSDevice, + AndroidDevice, + Twitch, + WindowsHello, + GameServer, + CustomServer, + NintendoSwitch, + FacebookInstantGames, + OpenIdConnect, + Apple, + NintendoSwitchAccount, + GooglePlayGames, + XboxMobileStore, + King + } + + [Serializable] + public class LoginResult : PlayFabLoginResultCommon + { + /// + /// If LoginTitlePlayerAccountEntity flag is set on the login request the title_player_account will also be logged in and + /// returned. + /// + public EntityTokenResponse EntityToken; + /// + /// Results for requested info. + /// + public GetPlayerCombinedInfoResultPayload InfoResultPayload; + /// + /// The time of this user's previous login. If there was no previous login, then it's DateTime.MinValue + /// + public DateTime? LastLoginTime; + /// + /// True if the account was newly created on this login. + /// + public bool NewlyCreated; + /// + /// Player's unique PlayFabId. + /// + public string PlayFabId; + /// + /// Unique token authorizing the user and game at the server level, for the current session. + /// + public string SessionTicket; + /// + /// Settings specific to this user. + /// + public UserSettings SettingsForUser; + /// + /// The experimentation treatments for this user at the time of login. + /// + public TreatmentAssignment TreatmentAssignment; + } + + /// + /// On Android devices, the recommendation is to use the Settings.Secure.ANDROID_ID as the AndroidDeviceId, as described in + /// this blog post (http://android-developers.blogspot.com/2011/03/identifying-app-installations.html). More information on + /// this identifier can be found in the Android documentation + /// (http://developer.android.com/reference/android/provider/Settings.Secure.html). If this is the first time a user has + /// signed in with the Android device and CreateAccount is set to true, a new PlayFab account will be created and linked to + /// the Android device ID. In this case, no email or username will be associated with the PlayFab account. Otherwise, if no + /// PlayFab account is linked to the Android device, an error indicating this will be returned, so that the title can guide + /// the user through creation of a PlayFab account. Please note that while multiple devices of this type can be linked to a + /// single user account, only the one most recently used to login (or most recently linked) will be reflected in the user's + /// account information. We will be updating to show all linked devices in a future release. + /// + [Serializable] + public class LoginWithAndroidDeviceIDRequest : PlayFabRequestCommon + { + /// + /// Specific model of the user's device. + /// + public string AndroidDevice; + /// + /// Android device identifier for the user's device. + /// + public string AndroidDeviceId; + /// + /// Automatically create a PlayFab account if one is not currently linked to this ID. + /// + public bool? CreateAccount; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Base64 encoded body that is encrypted with the Title's public RSA key (Enterprise Only). + /// + public string EncryptedRequest; + /// + /// Flags for which pieces of info to return for the user. + /// + public GetPlayerCombinedInfoRequestParams InfoRequestParameters; + /// + /// Specific Operating System version for the user's device. + /// + public string OS; + /// + /// Player secret that is used to verify API request signatures (Enterprise Only). + /// + public string PlayerSecret; + /// + /// Unique identifier for the title, found in the Settings > Game Properties section of the PlayFab developer site when a + /// title has been selected. + /// + public string TitleId; + } + + [Serializable] + public class LoginWithAppleRequest : PlayFabRequestCommon + { + /// + /// Automatically create a PlayFab account if one is not currently linked to this ID. + /// + public bool? CreateAccount; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Base64 encoded body that is encrypted with the Title's public RSA key (Enterprise Only). + /// + public string EncryptedRequest; + /// + /// The JSON Web token (JWT) returned by Apple after login. Represented as the identityToken field in the authorization + /// credential payload. If you choose to ignore the expiration date for identity tokens, you will receive an NotAuthorized + /// error if Apple rotates the signing key. In this case, users have to login to provide a fresh identity token. + /// + public string IdentityToken; + /// + /// Flags for which pieces of info to return for the user. + /// + public GetPlayerCombinedInfoRequestParams InfoRequestParameters; + /// + /// Player secret that is used to verify API request signatures (Enterprise Only). + /// + public string PlayerSecret; + /// + /// Unique identifier for the title, found in the Settings > Game Properties section of the PlayFab developer site when a + /// title has been selected. + /// + public string TitleId; + } + + /// + /// It is highly recommended that developers ensure that it is extremely unlikely that a customer could generate an ID which + /// is already in use by another customer. If this is the first time a user has signed in with the Custom ID and + /// CreateAccount is set to true, a new PlayFab account will be created and linked to the Custom ID. In this case, no email + /// or username will be associated with the PlayFab account. Otherwise, if no PlayFab account is linked to the Custom ID, an + /// error indicating this will be returned, so that the title can guide the user through creation of a PlayFab account. + /// + [Serializable] + public class LoginWithCustomIDRequest : PlayFabRequestCommon + { + /// + /// Automatically create a PlayFab account if one is not currently linked to this ID. + /// + public bool? CreateAccount; + /// + /// Custom unique identifier for the user, generated by the title. + /// + public string CustomId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Base64 encoded body that is encrypted with the Title's public RSA key (Enterprise Only). + /// + public string EncryptedRequest; + /// + /// Flags for which pieces of info to return for the user. + /// + public GetPlayerCombinedInfoRequestParams InfoRequestParameters; + /// + /// Player secret that is used to verify API request signatures (Enterprise Only). + /// + public string PlayerSecret; + /// + /// Unique identifier for the title, found in the Settings > Game Properties section of the PlayFab developer site when a + /// title has been selected. + /// + public string TitleId; + } + + /// + /// Email address and password lengths are provided for information purposes. The server will validate that data passed in + /// conforms to the field definition and report errors appropriately. It is recommended that developers not perform this + /// validation locally, so that future updates do not require client updates. + /// + [Serializable] + public class LoginWithEmailAddressRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Email address for the account. + /// + public string Email; + /// + /// Flags for which pieces of info to return for the user. + /// + public GetPlayerCombinedInfoRequestParams InfoRequestParameters; + /// + /// Password for the PlayFab account (6-100 characters) + /// + public string Password; + /// + /// Unique identifier for the title, found in the Settings > Game Properties section of the PlayFab developer site when a + /// title has been selected. + /// + public string TitleId; + } + + [Serializable] + public class LoginWithFacebookInstantGamesIdRequest : PlayFabRequestCommon + { + /// + /// Automatically create a PlayFab account if one is not currently linked to this ID. + /// + public bool? CreateAccount; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Base64 encoded body that is encrypted with the Title's public RSA key (Enterprise Only). + /// + public string EncryptedRequest; + /// + /// Facebook Instant Games signature for the user. + /// + public string FacebookInstantGamesSignature; + /// + /// Flags for which pieces of info to return for the user. + /// + public GetPlayerCombinedInfoRequestParams InfoRequestParameters; + /// + /// Player secret that is used to verify API request signatures (Enterprise Only). + /// + public string PlayerSecret; + /// + /// Unique identifier for the title, found in the Settings > Game Properties section of the PlayFab developer site when a + /// title has been selected. + /// + public string TitleId; + } + + /// + /// Facebook sign-in is accomplished using the Facebook User Access Token. More information on the Token can be found in the + /// Facebook developer documentation (https://developers.facebook.com/docs/facebook-login/access-tokens/). In Unity, for + /// example, the Token is available as AccessToken in the Facebook SDK ScriptableObject FB. If this is the first time a user + /// has signed in with the Facebook account and CreateAccount is set to true, a new PlayFab account will be created and + /// linked to the provided account's Facebook ID. In this case, no email or username will be associated with the PlayFab + /// account. Otherwise, if no PlayFab account is linked to the Facebook account, an error indicating this will be returned, + /// so that the title can guide the user through creation of a PlayFab account. Note that titles should never re-use the + /// same Facebook applications between PlayFab Title IDs, as Facebook provides unique user IDs per application and doing so + /// can result in issues with the Facebook ID for the user in their PlayFab account information. If you must re-use an + /// application in a new PlayFab Title ID, please be sure to first unlink all accounts from Facebook, or delete all users in + /// the first Title ID. Note: If the user is authenticated with AuthenticationToken, instead of AccessToken, the + /// GetFriendsList API will return an empty list. + /// + [Serializable] + public class LoginWithFacebookRequest : PlayFabRequestCommon + { + /// + /// Unique identifier from Facebook for the user. + /// + public string AccessToken; + /// + /// Token used for limited login authentication. + /// + public string AuthenticationToken; + /// + /// Automatically create a PlayFab account if one is not currently linked to this ID. + /// + public bool? CreateAccount; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Base64 encoded body that is encrypted with the Title's public RSA key (Enterprise Only). + /// + public string EncryptedRequest; + /// + /// Flags for which pieces of info to return for the user. + /// + public GetPlayerCombinedInfoRequestParams InfoRequestParameters; + /// + /// Player secret that is used to verify API request signatures (Enterprise Only). + /// + public string PlayerSecret; + /// + /// Unique identifier for the title, found in the Settings > Game Properties section of the PlayFab developer site when a + /// title has been selected. + /// + public string TitleId; + } + + /// + /// The Game Center player identifier + /// (https://developer.apple.com/library/ios/documentation/Accounts/Reference/ACAccountClassRef/index.html#//apple_ref/occ/instp/ACAccount/identifier) + /// is a generated string which is stored on the local device. As with device identifiers, care must be taken to never + /// expose a player's Game Center identifier to end users, as that could result in a user's account being compromised. If + /// this is the first time a user has signed in with Game Center and CreateAccount is set to true, a new PlayFab account + /// will be created and linked to the Game Center identifier. In this case, no email or username will be associated with the + /// PlayFab account. Otherwise, if no PlayFab account is linked to the Game Center account, an error indicating this will be + /// returned, so that the title can guide the user through creation of a PlayFab account. If an invalid iOS Game Center + /// player identifier is used, an error indicating this will be returned. + /// + [Serializable] + public class LoginWithGameCenterRequest : PlayFabRequestCommon + { + /// + /// Automatically create a PlayFab account if one is not currently linked to this ID. + /// + public bool? CreateAccount; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Base64 encoded body that is encrypted with the Title's public RSA key (Enterprise Only). + /// + public string EncryptedRequest; + /// + /// Flags for which pieces of info to return for the user. + /// + public GetPlayerCombinedInfoRequestParams InfoRequestParameters; + /// + /// Unique Game Center player id. + /// + public string PlayerId; + /// + /// Player secret that is used to verify API request signatures (Enterprise Only). + /// + public string PlayerSecret; + /// + /// The URL for the public encryption key that will be used to verify the signature. + /// + public string PublicKeyUrl; + /// + /// A random value used to compute the hash and keep it randomized. + /// + public string Salt; + /// + /// The verification signature of the authentication payload. + /// + public string Signature; + /// + /// The integer representation of date and time that the signature was created on. PlayFab will reject authentication + /// signatures not within 10 minutes of the server's current time. + /// + public string Timestamp; + /// + /// Unique identifier for the title, found in the Settings > Game Properties section of the PlayFab developer site when a + /// title has been selected. + /// + public string TitleId; + } + + /// + /// Google sign-in is accomplished by obtaining a Google OAuth 2.0 credential using the Google sign-in for Android APIs on + /// the device and passing it to this API. If this is the first time a user has signed in with the Google account and + /// CreateAccount is set to true, a new PlayFab account will be created and linked to the Google account. Otherwise, if no + /// PlayFab account is linked to the Google account, an error indicating this will be returned, so that the title can guide + /// the user through creation of a PlayFab account. The current (recommended) method for obtaining a Google account + /// credential in an Android application is to call GoogleSignInAccount.getServerAuthCode() and send the auth code as the + /// ServerAuthCode parameter of this API. Before doing this, you must create an OAuth 2.0 web application client ID in the + /// Google API Console and configure its client ID and secret in the PlayFab Game Manager Google Add-on for your title. This + /// method does not require prompting of the user for additional Google account permissions, resulting in a user experience + /// with the least possible friction. For more information about obtaining the server auth code, see + /// https://developers.google.com/identity/sign-in/android/offline-access. The previous (deprecated) method was to obtain an + /// OAuth access token by calling GetAccessToken() on the client and passing it as the AccessToken parameter to this API. + /// for the with the Google OAuth 2.0 Access Token. More information on this change can be found in the Google developer + /// documentation (https://android-developers.googleblog.com/2016/01/play-games-permissions-are-changing-in.html). + /// + [Serializable] + public class LoginWithGoogleAccountRequest : PlayFabRequestCommon + { + /// + /// Automatically create a PlayFab account if one is not currently linked to this ID. + /// + public bool? CreateAccount; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Base64 encoded body that is encrypted with the Title's public RSA key (Enterprise Only). + /// + public string EncryptedRequest; + /// + /// Flags for which pieces of info to return for the user. + /// + public GetPlayerCombinedInfoRequestParams InfoRequestParameters; + /// + /// Player secret that is used to verify API request signatures (Enterprise Only). + /// + public string PlayerSecret; + /// + /// OAuth 2.0 server authentication code obtained on the client by calling the getServerAuthCode() + /// (https://developers.google.com/identity/sign-in/android/offline-access) Google client API. + /// + public string ServerAuthCode; + /// + /// Optional boolean to opt out of setting the MPA email when creating a Google account, defaults to true. + /// + public bool? SetEmail; + /// + /// Unique identifier for the title, found in the Settings > Game Properties section of the PlayFab developer site when a + /// title has been selected. + /// + public string TitleId; + } + + /// + /// Google Play Games sign-in is accomplished by obtaining a Google OAuth 2.0 credential using the Google Play Games sign-in + /// for Android APIs on the device and passing it to this API. If this is the first time a user has signed in with the + /// Google Play Games account and CreateAccount is set to true, a new PlayFab account will be created and linked to the + /// Google Play Games account. Otherwise, if no PlayFab account is linked to the Google Play Games account, an error + /// indicating this will be returned, so that the title can guide the user through creation of a PlayFab account. The + /// current (recommended) method for obtaining a Google Play Games account credential in an Android application is to call + /// GamesSignInClient.requestServerSideAccess() and send the auth code as the ServerAuthCode parameter of this API. Before + /// doing this, you must create an OAuth 2.0 web application client ID in the Google API Console and configure its client ID + /// and secret in the PlayFab Game Manager Google Add-on for your title. This method does not require prompting of the user + /// for additional Google account permissions, resulting in a user experience with the least possible friction. For more + /// information about obtaining the server auth code, see https://developers.google.com/games/services/android/signin. + /// + [Serializable] + public class LoginWithGooglePlayGamesServicesRequest : PlayFabRequestCommon + { + /// + /// Automatically create a PlayFab account if one is not currently linked to this ID. + /// + public bool? CreateAccount; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Base64 encoded body that is encrypted with the Title's public RSA key (Enterprise Only). + /// + public string EncryptedRequest; + /// + /// Flags for which pieces of info to return for the user. + /// + public GetPlayerCombinedInfoRequestParams InfoRequestParameters; + /// + /// Player secret that is used to verify API request signatures (Enterprise Only). + /// + public string PlayerSecret; + /// + /// OAuth 2.0 server authentication code obtained on the client by calling the requestServerSideAccess() + /// (https://developers.google.com/games/services/android/signin) Google Play Games client API. + /// + public string ServerAuthCode; + /// + /// Unique identifier for the title, found in the Settings > Game Properties section of the PlayFab developer site when a + /// title has been selected. + /// + public string TitleId; + } + + /// + /// On iOS devices, the identifierForVendor + /// (https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIDevice_Class/index.html#//apple_ref/occ/instp/UIDevice/identifierForVendor) + /// must be used as the DeviceId, as the UIDevice uniqueIdentifier has been deprecated as of iOS 5, and use of the + /// advertisingIdentifier for this purpose will result in failure of Apple's certification process. If this is the first + /// time a user has signed in with the iOS device and CreateAccount is set to true, a new PlayFab account will be created + /// and linked to the vendor-specific iOS device ID. In this case, no email or username will be associated with the PlayFab + /// account. Otherwise, if no PlayFab account is linked to the iOS device, an error indicating this will be returned, so + /// that the title can guide the user through creation of a PlayFab account. Please note that while multiple devices of this + /// type can be linked to a single user account, only the one most recently used to login (or most recently linked) will be + /// reflected in the user's account information. We will be updating to show all linked devices in a future release. + /// + [Serializable] + public class LoginWithIOSDeviceIDRequest : PlayFabRequestCommon + { + /// + /// Automatically create a PlayFab account if one is not currently linked to this ID. + /// + public bool? CreateAccount; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Vendor-specific iOS identifier for the user's device. + /// + public string DeviceId; + /// + /// Specific model of the user's device. + /// + public string DeviceModel; + /// + /// Base64 encoded body that is encrypted with the Title's public RSA key (Enterprise Only). + /// + public string EncryptedRequest; + /// + /// Flags for which pieces of info to return for the user. + /// + public GetPlayerCombinedInfoRequestParams InfoRequestParameters; + /// + /// Specific Operating System version for the user's device. + /// + public string OS; + /// + /// Player secret that is used to verify API request signatures (Enterprise Only). + /// + public string PlayerSecret; + /// + /// Unique identifier for the title, found in the Settings > Game Properties section of the PlayFab developer site when a + /// title has been selected. + /// + public string TitleId; + } + + /// + /// More details regarding Kongregate and their game authentication system can be found at + /// http://developers.kongregate.com/docs/virtual-goods/authentication. Developers must provide the Kongregate user ID and + /// auth token that are generated using the Kongregate client library. PlayFab will combine these identifiers with the + /// title's unique Kongregate app ID to log the player into the Kongregate system. If CreateAccount is set to true and there + /// is not already a user matched to this Kongregate ID, then PlayFab will create a new account for this user and link the + /// ID. In this case, no email or username will be associated with the PlayFab account. If there is already a different + /// PlayFab user linked with this account, then an error will be returned. + /// + [Serializable] + public class LoginWithKongregateRequest : PlayFabRequestCommon + { + /// + /// Token issued by Kongregate's client API for the user. + /// + public string AuthTicket; + /// + /// Automatically create a PlayFab account if one is not currently linked to this ID. + /// + public bool? CreateAccount; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Base64 encoded body that is encrypted with the Title's public RSA key (Enterprise Only). + /// + public string EncryptedRequest; + /// + /// Flags for which pieces of info to return for the user. + /// + public GetPlayerCombinedInfoRequestParams InfoRequestParameters; + /// + /// Numeric user ID assigned by Kongregate + /// + public string KongregateId; + /// + /// Player secret that is used to verify API request signatures (Enterprise Only). + /// + public string PlayerSecret; + /// + /// Unique identifier for the title, found in the Settings > Game Properties section of the PlayFab developer site when a + /// title has been selected. + /// + public string TitleId; + } + + [Serializable] + public class LoginWithNintendoServiceAccountRequest : PlayFabRequestCommon + { + /// + /// Automatically create a PlayFab account if one is not currently linked to this ID. + /// + public bool? CreateAccount; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Base64 encoded body that is encrypted with the Title's public RSA key (Enterprise Only). + /// + public string EncryptedRequest; + /// + /// The JSON Web token (JWT) returned by Nintendo after login. + /// + public string IdentityToken; + /// + /// Flags for which pieces of info to return for the user. + /// + public GetPlayerCombinedInfoRequestParams InfoRequestParameters; + /// + /// Player secret that is used to verify API request signatures (Enterprise Only). + /// + public string PlayerSecret; + /// + /// Unique identifier for the title, found in the Settings > Game Properties section of the PlayFab developer site when a + /// title has been selected. + /// + public string TitleId; + } + + [Serializable] + public class LoginWithNintendoSwitchDeviceIdRequest : PlayFabRequestCommon + { + /// + /// Automatically create a PlayFab account if one is not currently linked to this ID. + /// + public bool? CreateAccount; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Base64 encoded body that is encrypted with the Title's public RSA key (Enterprise Only). + /// + public string EncryptedRequest; + /// + /// Flags for which pieces of info to return for the user. + /// + public GetPlayerCombinedInfoRequestParams InfoRequestParameters; + /// + /// Nintendo Switch unique identifier for the user's device. + /// + public string NintendoSwitchDeviceId; + /// + /// Player secret that is used to verify API request signatures (Enterprise Only). + /// + public string PlayerSecret; + /// + /// Unique identifier for the title, found in the Settings > Game Properties section of the PlayFab developer site when a + /// title has been selected. + /// + public string TitleId; + } + + [Serializable] + public class LoginWithOpenIdConnectRequest : PlayFabRequestCommon + { + /// + /// A name that identifies which configured OpenID Connect provider relationship to use. Maximum 100 characters. + /// + public string ConnectionId; + /// + /// Automatically create a PlayFab account if one is not currently linked to this ID. + /// + public bool? CreateAccount; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Base64 encoded body that is encrypted with the Title's public RSA key (Enterprise Only). + /// + public string EncryptedRequest; + /// + /// The JSON Web token (JWT) returned by the identity provider after login. Represented as the id_token field in the + /// identity provider's response. + /// + public string IdToken; + /// + /// Flags for which pieces of info to return for the user. + /// + public GetPlayerCombinedInfoRequestParams InfoRequestParameters; + /// + /// Player secret that is used to verify API request signatures (Enterprise Only). + /// + public string PlayerSecret; + /// + /// Unique identifier for the title, found in the Settings > Game Properties section of the PlayFab developer site when a + /// title has been selected. + /// + public string TitleId; + } + + /// + /// Username and password lengths are provided for information purposes. The server will validate that data passed in + /// conforms to the field definition and report errors appropriately. It is recommended that developers not perform this + /// validation locally, so that future updates to the username or password do not require client updates. + /// + [Serializable] + public class LoginWithPlayFabRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Flags for which pieces of info to return for the user. + /// + public GetPlayerCombinedInfoRequestParams InfoRequestParameters; + /// + /// Password for the PlayFab account (6-100 characters) + /// + public string Password; + /// + /// Unique identifier for the title, found in the Settings > Game Properties section of the PlayFab developer site when a + /// title has been selected. + /// + public string TitleId; + /// + /// PlayFab username for the account. + /// + public string Username; + } + + /// + /// If this is the first time a user has signed in with the PlayStation :tm: Network account and CreateAccount is set to + /// true, a new PlayFab account will be created and linked to the PlayStation :tm: Network account. In this case, no email + /// or username will be associated with the PlayFab account. Otherwise, if no PlayFab account is linked to the PlayStation + /// :tm: Network account, an error indicating this will be returned, so that the title can guide the user through creation + /// of a PlayFab account. + /// + [Serializable] + public class LoginWithPSNRequest : PlayFabRequestCommon + { + /// + /// Auth code provided by the PlayStation :tm: Network OAuth provider. + /// + public string AuthCode; + /// + /// Automatically create a PlayFab account if one is not currently linked to this ID. + /// + public bool? CreateAccount; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Base64 encoded body that is encrypted with the Title's public RSA key (Enterprise Only). + /// + public string EncryptedRequest; + /// + /// Flags for which pieces of info to return for the user. + /// + public GetPlayerCombinedInfoRequestParams InfoRequestParameters; + /// + /// Id of the PlayStation :tm: Network issuer environment. If null, defaults to production environment. + /// + public int? IssuerId; + /// + /// Player secret that is used to verify API request signatures (Enterprise Only). + /// + public string PlayerSecret; + /// + /// Redirect URI supplied to PlayStation :tm: Network when requesting an auth code + /// + public string RedirectUri; + /// + /// Unique identifier for the title, found in the Settings > Game Properties section of the PlayFab developer site when a + /// title has been selected. + /// + public string TitleId; + } + + /// + /// Steam sign-in is accomplished with the Steam Session Ticket. More information on the Ticket can be found in the + /// Steamworks SDK, here: https://partner.steamgames.com/documentation/auth. NOTE: For Steam authentication to work, the + /// title must be configured with the Steam Application ID and Web API Key in the PlayFab Game Manager (under Steam in the + /// Add-ons Marketplace). You can obtain a Web API Key from the Permissions page of any Group associated with your App ID in + /// the Steamworks site. If this is the first time a user has signed in with the Steam account and CreateAccount is set to + /// true, a new PlayFab account will be created and linked to the provided account's Steam ID. In this case, no email or + /// username will be associated with the PlayFab account. Otherwise, if no PlayFab account is linked to the Steam account, + /// an error indicating this will be returned, so that the title can guide the user through creation of a PlayFab account. + /// + [Serializable] + public class LoginWithSteamRequest : PlayFabRequestCommon + { + /// + /// Automatically create a PlayFab account if one is not currently linked to this ID. + /// + public bool? CreateAccount; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Base64 encoded body that is encrypted with the Title's public RSA key (Enterprise Only). + /// + public string EncryptedRequest; + /// + /// Flags for which pieces of info to return for the user. + /// + public GetPlayerCombinedInfoRequestParams InfoRequestParameters; + /// + /// Player secret that is used to verify API request signatures (Enterprise Only). + /// + public string PlayerSecret; + /// + /// Authentication token for the user, returned as a byte array from Steam, and converted to a string (for example, the byte + /// 0x08 should become "08"). + /// + public string SteamTicket; + /// + /// True if ticket was generated using ISteamUser::GetAuthTicketForWebAPI() using "AzurePlayFab" as the identity string. + /// False if the ticket was generated with ISteamUser::GetAuthSessionTicket(). + /// + public bool? TicketIsServiceSpecific; + /// + /// Unique identifier for the title, found in the Settings > Game Properties section of the PlayFab developer site when a + /// title has been selected. + /// + public string TitleId; + } + + /// + /// More details regarding Twitch and their authentication system can be found at + /// https://github.com/justintv/Twitch-API/blob/master/authentication.md. Developers must provide the Twitch access token + /// that is generated using one of the Twitch authentication flows. PlayFab will use the title's unique Twitch Client ID to + /// authenticate the token and log in to the PlayFab system. If CreateAccount is set to true and there is not already a user + /// matched to the Twitch username that generated the token, then PlayFab will create a new account for this user and link + /// the ID. In this case, no email or username will be associated with the PlayFab account. If there is already a different + /// PlayFab user linked with this account, then an error will be returned. + /// + [Serializable] + public class LoginWithTwitchRequest : PlayFabRequestCommon + { + /// + /// Token issued by Twitch's API for the user. + /// + public string AccessToken; + /// + /// Automatically create a PlayFab account if one is not currently linked to this ID. + /// + public bool? CreateAccount; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Base64 encoded body that is encrypted with the Title's public RSA key (Enterprise Only). + /// + public string EncryptedRequest; + /// + /// Flags for which pieces of info to return for the user. + /// + public GetPlayerCombinedInfoRequestParams InfoRequestParameters; + /// + /// Player secret that is used to verify API request signatures (Enterprise Only). + /// + public string PlayerSecret; + /// + /// Unique identifier for the title, found in the Settings > Game Properties section of the PlayFab developer site when a + /// title has been selected. + /// + public string TitleId; + } + + /// + /// If this is the first time a user has signed in with the Xbox Live account and CreateAccount is set to true, a new + /// PlayFab account will be created and linked to the Xbox Live account. In this case, no email or username will be + /// associated with the PlayFab account. Otherwise, if no PlayFab account is linked to the Xbox Live account, an error + /// indicating this will be returned, so that the title can guide the user through creation of a PlayFab account. + /// + [Serializable] + public class LoginWithXboxRequest : PlayFabRequestCommon + { + /// + /// Automatically create a PlayFab account if one is not currently linked to this ID. + /// + public bool? CreateAccount; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Base64 encoded body that is encrypted with the Title's public RSA key (Enterprise Only). + /// + public string EncryptedRequest; + /// + /// Flags for which pieces of info to return for the user. + /// + public GetPlayerCombinedInfoRequestParams InfoRequestParameters; + /// + /// Player secret that is used to verify API request signatures (Enterprise Only). + /// + public string PlayerSecret; + /// + /// Unique identifier for the title, found in the Settings > Game Properties section of the PlayFab developer site when a + /// title has been selected. + /// + public string TitleId; + /// + /// Token provided by the Xbox Live SDK/XDK method GetTokenAndSignatureAsync("POST", "https://playfabapi.com/", ""). + /// + public string XboxToken; + } + + [Serializable] + public class LogStatement : PlayFabBaseModel + { + /// + /// Optional object accompanying the message as contextual information + /// + public object Data; + /// + /// 'Debug', 'Info', or 'Error' + /// + public string Level; + public string Message; + } + + [Serializable] + public class MembershipModel : PlayFabBaseModel + { + /// + /// Whether this membership is active. That is, whether the MembershipExpiration time has been reached. + /// + public bool IsActive; + /// + /// The time this membership expires + /// + public DateTime MembershipExpiration; + /// + /// The id of the membership + /// + public string MembershipId; + /// + /// Membership expirations can be explicitly overridden (via game manager or the admin api). If this membership has been + /// overridden, this will be the new expiration time. + /// + public DateTime? OverrideExpiration; + /// + /// The list of subscriptions that this player has for this membership + /// + public List Subscriptions; + } + + [Serializable] + public class MicrosoftStorePayload : PlayFabBaseModel + { + /// + /// Microsoft store ID key. This is optional. Alternatively you can use XboxToken + /// + public string CollectionsMsIdKey; + /// + /// If collectionsMsIdKey is provided, this will verify the user id in the collectionsMsIdKey is the same. + /// + public string UserId; + /// + /// Token provided by the Xbox Live SDK/XDK method GetTokenAndSignatureAsync("POST", "https://playfabapi.com/", ""). This is + /// optional. Alternatively can use CollectionsMsIdKey + /// + public string XboxToken; + } + + [Serializable] + public class ModifyUserVirtualCurrencyResult : PlayFabResultCommon + { + /// + /// Balance of the virtual currency after modification. + /// + public int Balance; + /// + /// Amount added or subtracted from the user's virtual currency. Maximum VC balance is Int32 (2,147,483,647). Any increase + /// over this value will be discarded. + /// + public int BalanceChange; + /// + /// User currency was subtracted from. + /// + public string PlayFabId; + /// + /// Name of the virtual currency which was modified. + /// + public string VirtualCurrency; + } + + /// + /// Identifier by either name or ID. Note that a name may change due to renaming, or reused after being deleted. ID is + /// immutable and unique. + /// + [Serializable] + public class NameIdentifier : PlayFabBaseModel + { + /// + /// Id Identifier, if present + /// + public string Id; + /// + /// Name Identifier, if present + /// + public string Name; + } + + [Serializable] + public class NintendoServiceAccountPlayFabIdPair : PlayFabBaseModel + { + /// + /// Unique Nintendo Switch Service Account identifier for a user. + /// + public string NintendoServiceAccountId; + /// + /// Unique PlayFab identifier for a user, or null if no PlayFab account is linked to the Nintendo Switch Service Account + /// identifier. + /// + public string PlayFabId; + } + + [Serializable] + public class NintendoSwitchPlayFabIdPair : PlayFabBaseModel + { + /// + /// Unique Nintendo Switch Device identifier for a user. + /// + public string NintendoSwitchDeviceId; + /// + /// Unique PlayFab identifier for a user, or null if no PlayFab account is linked to the Nintendo Switch Device identifier. + /// + public string PlayFabId; + } + + [Serializable] + public class OpenTradeRequest : PlayFabRequestCommon + { + /// + /// Players who are allowed to accept the trade. If null, the trade may be accepted by any player. If empty, the trade may + /// not be accepted by any player. + /// + public List AllowedPlayerIds; + /// + /// Player inventory items offered for trade. If not set, the trade is effectively a gift request + /// + public List OfferedInventoryInstanceIds; + /// + /// Catalog items accepted for the trade. If not set, the trade is effectively a gift. + /// + public List RequestedCatalogItemIds; + } + + [Serializable] + public class OpenTradeResponse : PlayFabResultCommon + { + /// + /// The information about the trade that was just opened. + /// + public TradeInfo Trade; + } + + /// + /// This is the second step in the purchasing process, initiating the purchase transaction with the payment provider (if + /// applicable). For payment provider scenarios, the title should next present the user with the payment provider'sinterface + /// for payment. Once the player has completed the payment with the provider, the title should call ConfirmPurchase + /// tofinalize the process and add the appropriate items to the player inventory. + /// + [Serializable] + public class PayForPurchaseRequest : PlayFabRequestCommon + { + /// + /// Currency to use to fund the purchase. + /// + public string Currency; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Purchase order identifier returned from StartPurchase. + /// + public string OrderId; + /// + /// Payment provider to use to fund the purchase. + /// + public string ProviderName; + /// + /// Payment provider transaction identifier. Required for Facebook Payments. + /// + public string ProviderTransactionId; + } + + /// + /// For web-based payment providers, this operation returns the URL to which the user should be directed inorder to approve + /// the purchase. Items added to the user inventory as a result of this operation will be marked as unconfirmed. + /// + [Serializable] + public class PayForPurchaseResult : PlayFabResultCommon + { + /// + /// Local credit applied to the transaction (provider specific). + /// + public uint CreditApplied; + /// + /// Purchase order identifier. + /// + public string OrderId; + /// + /// Provider used for the transaction. + /// + public string ProviderData; + /// + /// A token generated by the provider to authenticate the request (provider-specific). + /// + public string ProviderToken; + /// + /// URL to the purchase provider page that details the purchase. + /// + public string PurchaseConfirmationPageURL; + /// + /// Currency for the transaction, may be a virtual currency or real money. + /// + public string PurchaseCurrency; + /// + /// Cost of the transaction. + /// + public uint PurchasePrice; + /// + /// Status of the transaction. + /// + public TransactionStatus? Status; + /// + /// Virtual currencies granted by the transaction, if any. + /// + public Dictionary VCAmount; + /// + /// Current virtual currency balances for the user. + /// + public Dictionary VirtualCurrency; + } + + [Serializable] + public class PaymentOption : PlayFabBaseModel + { + /// + /// Specific currency to use to fund the purchase. + /// + public string Currency; + /// + /// Amount of the specified currency needed for the purchase. + /// + public uint Price; + /// + /// Name of the purchase provider for this option. + /// + public string ProviderName; + /// + /// Amount of existing credit the user has with the provider. + /// + public uint StoreCredit; + } + + [Serializable] + public class PlayerLeaderboardEntry : PlayFabBaseModel + { + /// + /// Title-specific display name of the user for this leaderboard entry. + /// + public string DisplayName; + /// + /// PlayFab unique identifier of the user for this leaderboard entry. + /// + public string PlayFabId; + /// + /// User's overall position in the leaderboard. + /// + public int Position; + /// + /// The profile of the user, if requested. + /// + public PlayerProfileModel Profile; + /// + /// Specific value of the user's statistic. + /// + public int StatValue; + } + + [Serializable] + public class PlayerProfileModel : PlayFabBaseModel + { + /// + /// List of advertising campaigns the player has been attributed to + /// + public List AdCampaignAttributions; + /// + /// URL of the player's avatar image + /// + public string AvatarUrl; + /// + /// If the player is currently banned, the UTC Date when the ban expires + /// + public DateTime? BannedUntil; + /// + /// List of all contact email info associated with the player account + /// + public List ContactEmailAddresses; + /// + /// Player record created + /// + public DateTime? Created; + /// + /// Player display name + /// + public string DisplayName; + /// + /// List of experiment variants for the player. Note that these variants are not guaranteed to be up-to-date when returned + /// during login because the player profile is updated only after login. Instead, use the LoginResult.TreatmentAssignment + /// property during login to get the correct variants and variables. + /// + public List ExperimentVariants; + /// + /// UTC time when the player most recently logged in to the title + /// + public DateTime? LastLogin; + /// + /// List of all authentication systems linked to this player account + /// + public List LinkedAccounts; + /// + /// List of geographic locations from which the player has logged in to the title + /// + public List Locations; + /// + /// List of memberships for the player, along with whether are expired. + /// + public List Memberships; + /// + /// Player account origination + /// + public LoginIdentityProvider? Origination; + /// + /// PlayFab player account unique identifier + /// + public string PlayerId; + /// + /// Publisher this player belongs to + /// + public string PublisherId; + /// + /// List of configured end points registered for sending the player push notifications + /// + public List PushNotificationRegistrations; + /// + /// List of leaderboard statistic values for the player + /// + public List Statistics; + /// + /// List of player's tags for segmentation + /// + public List Tags; + /// + /// Title ID this player profile applies to + /// + public string TitleId; + /// + /// Sum of the player's purchases made with real-money currencies, converted to US dollars equivalent and represented as a + /// whole number of cents (1/100 USD). For example, 999 indicates nine dollars and ninety-nine cents. + /// + public uint? TotalValueToDateInUSD; + /// + /// List of the player's lifetime purchase totals, summed by real-money currency + /// + public List ValuesToDate; + } + + [Serializable] + public class PlayerProfileViewConstraints : PlayFabBaseModel + { + /// + /// Whether to show player's avatar URL. Defaults to false + /// + public bool ShowAvatarUrl; + /// + /// Whether to show the banned until time. Defaults to false + /// + public bool ShowBannedUntil; + /// + /// Whether to show campaign attributions. Defaults to false + /// + public bool ShowCampaignAttributions; + /// + /// Whether to show contact email addresses. Defaults to false + /// + public bool ShowContactEmailAddresses; + /// + /// Whether to show the created date. Defaults to false + /// + public bool ShowCreated; + /// + /// Whether to show the display name. Defaults to false + /// + public bool ShowDisplayName; + /// + /// Whether to show player's experiment variants. Defaults to false + /// + public bool ShowExperimentVariants; + /// + /// Whether to show the last login time. Defaults to false + /// + public bool ShowLastLogin; + /// + /// Whether to show the linked accounts. Defaults to false + /// + public bool ShowLinkedAccounts; + /// + /// Whether to show player's locations. Defaults to false + /// + public bool ShowLocations; + /// + /// Whether to show player's membership information. Defaults to false + /// + public bool ShowMemberships; + /// + /// Whether to show origination. Defaults to false + /// + public bool ShowOrigination; + /// + /// Whether to show push notification registrations. Defaults to false + /// + public bool ShowPushNotificationRegistrations; + /// + /// Reserved for future development + /// + public bool ShowStatistics; + /// + /// Whether to show tags. Defaults to false + /// + public bool ShowTags; + /// + /// Whether to show the total value to date in usd. Defaults to false + /// + public bool ShowTotalValueToDateInUsd; + /// + /// Whether to show the values to date. Defaults to false + /// + public bool ShowValuesToDate; + } + + [Serializable] + public class PlayerStatisticVersion : PlayFabBaseModel + { + /// + /// time when the statistic version became active + /// + public DateTime ActivationTime; + /// + /// time when the statistic version became inactive due to statistic version incrementing + /// + public DateTime? DeactivationTime; + /// + /// time at which the statistic version was scheduled to become active, based on the configured ResetInterval + /// + public DateTime? ScheduledActivationTime; + /// + /// time at which the statistic version was scheduled to become inactive, based on the configured ResetInterval + /// + public DateTime? ScheduledDeactivationTime; + /// + /// name of the statistic when the version became active + /// + public string StatisticName; + /// + /// version of the statistic + /// + public uint Version; + } + + [Serializable] + public class PlayStation5Payload : PlayFabBaseModel + { + /// + /// An optional list of entitlement ids to query against PlayStation :tm: Network + /// + public List Ids; + /// + /// Id of the PlayStation :tm: Network service label to consume entitlements from + /// + public string ServiceLabel; + } + + [Serializable] + public class PSNAccountPlayFabIdPair : PlayFabBaseModel + { + /// + /// Unique PlayFab identifier for a user, or null if no PlayFab account is linked to the PlayStation :tm: Network + /// identifier. + /// + public string PlayFabId; + /// + /// Unique PlayStation :tm: Network identifier for a user. + /// + public string PSNAccountId; + } + + [Serializable] + public class PSNOnlinePlayFabIdPair : PlayFabBaseModel + { + /// + /// Unique PlayFab identifier for a user, or null if no PlayFab account is linked to the PlayStation :tm: Network + /// identifier. + /// + public string PlayFabId; + /// + /// Unique PlayStation :tm: Network identifier for a user. + /// + public string PSNOnlineId; + } + + /// + /// Please note that the processing time for inventory grants and purchases increases fractionally the more items are in the + /// inventory, and the more items are in the grant/purchase operation (with each item in a bundle being a distinct add). + /// + [Serializable] + public class PurchaseItemRequest : PlayFabRequestCommon + { + /// + /// Catalog version for the items to be purchased (defaults to most recent version. + /// + public string CatalogVersion; + /// + /// Unique PlayFab assigned ID for a specific character owned by a user + /// + public string CharacterId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Unique identifier of the item to purchase. + /// + public string ItemId; + /// + /// Price the client expects to pay for the item (in case a new catalog or store was uploaded, with new prices). + /// + public int Price; + /// + /// Store to buy this item through. If not set, prices default to those in the catalog. + /// + public string StoreId; + /// + /// Virtual currency to use to purchase the item. + /// + public string VirtualCurrency; + } + + [Serializable] + public class PurchaseItemResult : PlayFabResultCommon + { + /// + /// Details for the items purchased. + /// + public List Items; + } + + [Serializable] + public class PurchaseReceiptFulfillment : PlayFabBaseModel + { + /// + /// Items granted to the player in fulfillment of the validated receipt. + /// + public List FulfilledItems; + /// + /// Source of the payment price information for the recorded purchase transaction. A value of 'Request' indicates that the + /// price specified in the request was used, whereas a value of 'Catalog' indicates that the real-money price of the catalog + /// item matching the product ID in the validated receipt transaction and the currency specified in the request (defaulting + /// to USD) was used. + /// + public string RecordedPriceSource; + /// + /// Currency used to purchase the items (ISO 4217 currency code). + /// + public string RecordedTransactionCurrency; + /// + /// Amount of the stated currency paid for the items, in centesimal units + /// + public uint? RecordedTransactionTotal; + } + + public enum PushNotificationPlatform + { + ApplePushNotificationService, + GoogleCloudMessaging + } + + [Serializable] + public class PushNotificationRegistrationModel : PlayFabBaseModel + { + /// + /// Notification configured endpoint + /// + public string NotificationEndpointARN; + /// + /// Push notification platform + /// + public PushNotificationPlatform? Platform; + } + + /// + /// Coupon codes can be created for any item, or set of items, in the catalog for the title. This operation causes the + /// coupon to be consumed, and the specific items to be awarded to the user. Attempting to re-use an already consumed code, + /// or a code which has not yet been created in the service, will result in an error. + /// + [Serializable] + public class RedeemCouponRequest : PlayFabRequestCommon + { + /// + /// Catalog version of the coupon. If null, uses the default catalog + /// + public string CatalogVersion; + /// + /// Optional identifier for the Character that should receive the item. If null, item is added to the player + /// + public string CharacterId; + /// + /// Generated coupon code to redeem. + /// + public string CouponCode; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + [Serializable] + public class RedeemCouponResult : PlayFabResultCommon + { + /// + /// Items granted to the player as a result of redeeming the coupon. + /// + public List GrantedItems; + } + + [Serializable] + public class RefreshPSNAuthTokenRequest : PlayFabRequestCommon + { + /// + /// Auth code returned by PlayStation :tm: Network OAuth system. + /// + public string AuthCode; + /// + /// Id of the PlayStation :tm: Network issuer environment. If null, defaults to production environment. + /// + public int? IssuerId; + /// + /// Redirect URI supplied to PlayStation :tm: Network when requesting an auth code + /// + public string RedirectUri; + } + + /// + /// The steps to configure and send Push Notifications is described in the PlayFab tutorials, here: + /// https://docs.microsoft.com/gaming/playfab/features/engagement/push-notifications/quickstart + /// + [Serializable] + public class RegisterForIOSPushNotificationRequest : PlayFabRequestCommon + { + /// + /// Message to display when confirming push notification. + /// + public string ConfirmationMessage; + /// + /// Unique token generated by the Apple Push Notification service when the title registered to receive push notifications. + /// + public string DeviceToken; + /// + /// If true, send a test push message immediately after sucessful registration. Defaults to false. + /// + public bool? SendPushNotificationConfirmation; + } + + [Serializable] + public class RegisterForIOSPushNotificationResult : PlayFabResultCommon + { + } + + [Serializable] + public class RegisterPlayFabUserRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// An optional parameter for setting the display name for this title (3-25 characters). + /// + public string DisplayName; + /// + /// User email address attached to their account + /// + public string Email; + /// + /// Base64 encoded body that is encrypted with the Title's public RSA key (Enterprise Only). + /// + public string EncryptedRequest; + /// + /// Flags for which pieces of info to return for the user. + /// + public GetPlayerCombinedInfoRequestParams InfoRequestParameters; + /// + /// Password for the PlayFab account (6-100 characters) + /// + public string Password; + /// + /// Player secret that is used to verify API request signatures (Enterprise Only). + /// + public string PlayerSecret; + /// + /// An optional parameter that specifies whether both the username and email parameters are required. If true, both + /// parameters are required; if false, the user must supply either the username or email parameter. The default value is + /// true. + /// + public bool? RequireBothUsernameAndEmail; + /// + /// Unique identifier for the title, found in the Settings > Game Properties section of the PlayFab developer site when a + /// title has been selected. + /// + public string TitleId; + /// + /// PlayFab username for the account (3-20 characters) + /// + public string Username; + } + + /// + /// Each account must have a unique email address in the PlayFab service. Once created, the account may be associated with + /// additional accounts (Steam, Facebook, Game Center, etc.), allowing for added social network lists and achievements + /// systems. + /// + [Serializable] + public class RegisterPlayFabUserResult : PlayFabLoginResultCommon + { + /// + /// If LoginTitlePlayerAccountEntity flag is set on the login request the title_player_account will also be logged in and + /// returned. + /// + public EntityTokenResponse EntityToken; + /// + /// PlayFab unique identifier for this newly created account. + /// + public string PlayFabId; + /// + /// Unique token identifying the user and game at the server level, for the current session. + /// + public string SessionTicket; + /// + /// Settings specific to this user. + /// + public UserSettings SettingsForUser; + /// + /// PlayFab unique user name. + /// + public string Username; + } + + /// + /// This API removes an existing contact email from the player's profile. + /// + [Serializable] + public class RemoveContactEmailRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + [Serializable] + public class RemoveContactEmailResult : PlayFabResultCommon + { + } + + [Serializable] + public class RemoveFriendRequest : PlayFabRequestCommon + { + /// + /// PlayFab identifier of the friend account which is to be removed. + /// + public string FriendPlayFabId; + } + + [Serializable] + public class RemoveFriendResult : PlayFabResultCommon + { + } + + [Serializable] + public class RemoveGenericIDRequest : PlayFabRequestCommon + { + /// + /// Generic service identifier to be removed from the player. + /// + public GenericServiceId GenericId; + } + + [Serializable] + public class RemoveGenericIDResult : PlayFabResultCommon + { + } + + [Serializable] + public class RemoveSharedGroupMembersRequest : PlayFabRequestCommon + { + /// + /// An array of unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public List PlayFabIds; + /// + /// Unique identifier for the shared group. + /// + public string SharedGroupId; + } + + [Serializable] + public class RemoveSharedGroupMembersResult : PlayFabResultCommon + { + } + + /// + /// Report ad activity + /// + [Serializable] + public class ReportAdActivityRequest : PlayFabRequestCommon + { + /// + /// Type of activity, may be Opened, Closed, Start or End + /// + public AdActivity Activity; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Unique ID of the placement to report for + /// + public string PlacementId; + /// + /// Unique ID of the reward the player was offered + /// + public string RewardId; + } + + /// + /// Report ad activity response has no body + /// + [Serializable] + public class ReportAdActivityResult : PlayFabResultCommon + { + } + + [Serializable] + public class ReportPlayerClientRequest : PlayFabRequestCommon + { + /// + /// Optional additional comment by reporting player. + /// + public string Comment; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Unique PlayFab identifier of the reported player. + /// + public string ReporteeId; + } + + /// + /// Players are currently limited to five reports per day. Attempts by a single user account to submit reports beyond five + /// will result in Updated being returned as false. + /// + [Serializable] + public class ReportPlayerClientResult : PlayFabResultCommon + { + /// + /// The number of remaining reports which may be filed today. + /// + public int SubmissionsRemaining; + } + + /// + /// The title should obtain a refresh receipt via restoreCompletedTransactions in the SKPaymentQueue of the Apple StoreKit + /// and pass that in to this call. The resultant receipt contains new receipt instances for all non-consumable goods + /// previously purchased by the user. This API call iterates through every purchase in the receipt and restores the items if + /// they still exist in the catalog and can be validated. + /// + [Serializable] + public class RestoreIOSPurchasesRequest : PlayFabRequestCommon + { + /// + /// Catalog version of the restored items. If null, defaults to primary catalog. + /// + public string CatalogVersion; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Base64 encoded receipt data, passed back by the App Store as a result of a successful purchase. + /// + public string ReceiptData; + } + + /// + /// Once verified, the valid items will be restored into the user's inventory. This result should be used for immediate + /// updates to the local client game state as opposed to the GetUserInventory API which can have an up to half second delay. + /// + [Serializable] + public class RestoreIOSPurchasesResult : PlayFabResultCommon + { + /// + /// Fulfilled inventory items and recorded purchases in fulfillment of the validated receipt transactions. + /// + public List Fulfillments; + } + + /// + /// Details on which placement and reward to perform a grant on + /// + [Serializable] + public class RewardAdActivityRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Placement unique ID + /// + public string PlacementId; + /// + /// Reward unique ID + /// + public string RewardId; + } + + /// + /// Result for rewarding an ad activity + /// + [Serializable] + public class RewardAdActivityResult : PlayFabResultCommon + { + /// + /// PlayStream Event ID that was generated by this reward (all subsequent events are associated with this event identifier) + /// + public string AdActivityEventId; + /// + /// Debug results from the grants + /// + public List DebugResults; + /// + /// Id of the placement the reward was for + /// + public string PlacementId; + /// + /// Name of the placement the reward was for + /// + public string PlacementName; + /// + /// If placement has viewing limits indicates how many views are left + /// + public int? PlacementViewsRemaining; + /// + /// If placement has viewing limits indicates when they will next reset + /// + public double? PlacementViewsResetMinutes; + /// + /// Reward results + /// + public AdRewardResults RewardResults; + } + + [Serializable] + public class ScriptExecutionError : PlayFabBaseModel + { + /// + /// Error code, such as CloudScriptNotFound, JavascriptException, CloudScriptFunctionArgumentSizeExceeded, + /// CloudScriptAPIRequestCountExceeded, CloudScriptAPIRequestError, or CloudScriptHTTPRequestError + /// + public string Error; + /// + /// Details about the error + /// + public string Message; + /// + /// Point during the execution of the script at which the error occurred, if any + /// + public string StackTrace; + } + + /// + /// If the account in question is a "temporary" account (for example, one that was created via a call to + /// LoginFromIOSDeviceID), thisfunction will have no effect. Only PlayFab accounts which have valid email addresses will be + /// able to receive a password reset email using this API. + /// + [Serializable] + public class SendAccountRecoveryEmailRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// User email address attached to their account + /// + public string Email; + /// + /// The email template id of the account recovery email template to send. + /// + public string EmailTemplateId; + /// + /// Unique identifier for the title, found in the Settings > Game Properties section of the PlayFab developer site when a + /// title has been selected. + /// + public string TitleId; + } + + [Serializable] + public class SendAccountRecoveryEmailResult : PlayFabResultCommon + { + } + + /// + /// This operation is not additive. It will completely replace the tag list for the specified user. Please note that only + /// users in the PlayFab friends list can be assigned tags. Attempting to set a tag on a friend only included in the friends + /// list from a social site integration (such as Facebook or Steam) will return the AccountNotFound error. + /// + [Serializable] + public class SetFriendTagsRequest : PlayFabRequestCommon + { + /// + /// PlayFab identifier of the friend account to which the tag(s) should be applied. + /// + public string FriendPlayFabId; + /// + /// Array of tags to set on the friend account. + /// + public List Tags; + } + + [Serializable] + public class SetFriendTagsResult : PlayFabResultCommon + { + } + + /// + /// APIs that require signatures require that the player have a configured Player Secret Key that is used to sign all + /// requests. Players that don't have a secret will be blocked from making API calls until it is configured. To create a + /// signature header add a SHA256 hashed string containing UTF8 encoded JSON body as it will be sent to the server, the + /// current time in UTC formatted to ISO 8601, and the players secret formatted as 'body.date.secret'. Place the resulting + /// hash into the header X-PlayFab-Signature, along with a header X-PlayFab-Timestamp of the same UTC timestamp used in the + /// signature. + /// + [Serializable] + public class SetPlayerSecretRequest : PlayFabRequestCommon + { + /// + /// Base64 encoded body that is encrypted with the Title's public RSA key (Enterprise Only). + /// + public string EncryptedRequest; + /// + /// Player secret that is used to verify API request signatures (Enterprise Only). + /// + public string PlayerSecret; + } + + [Serializable] + public class SetPlayerSecretResult : PlayFabResultCommon + { + } + + [Serializable] + public class SharedGroupDataRecord : PlayFabBaseModel + { + /// + /// Timestamp for when this data was last updated. + /// + public DateTime LastUpdated; + /// + /// Unique PlayFab identifier of the user to last update this value. + /// + public string LastUpdatedBy; + /// + /// Indicates whether this data can be read by all users (public) or only members of the group (private). + /// + public UserDataPermission? Permission; + /// + /// Data stored for the specified group data key. + /// + public string Value; + } + + public enum SourceType + { + Admin, + BackEnd, + GameClient, + GameServer, + Partner, + Custom, + API + } + + /// + /// This is the first step in the purchasing process. For security purposes, once the order (or "cart") has been created, + /// additional inventory objects may no longer be added. In addition, inventory objects will be locked to the current + /// prices, regardless of any subsequent changes at the catalog level which may occur during the next two steps. + /// + [Serializable] + public class StartPurchaseRequest : PlayFabRequestCommon + { + /// + /// Catalog version for the items to be purchased. Defaults to most recent catalog. + /// + public string CatalogVersion; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Array of items to purchase. + /// + public List Items; + /// + /// Store through which to purchase items. If not set, prices will be pulled from the catalog itself. + /// + public string StoreId; + } + + [Serializable] + public class StartPurchaseResult : PlayFabResultCommon + { + /// + /// Cart items to be purchased. + /// + public List Contents; + /// + /// Purchase order identifier. + /// + public string OrderId; + /// + /// Available methods by which the user can pay. + /// + public List PaymentOptions; + /// + /// Current virtual currency totals for the user. + /// + public Dictionary VirtualCurrencyBalances; + } + + [Serializable] + public class StatisticModel : PlayFabBaseModel + { + /// + /// Statistic name + /// + public string Name; + /// + /// Statistic value + /// + public int Value; + /// + /// Statistic version (0 if not a versioned statistic) + /// + public int Version; + } + + [Serializable] + public class StatisticNameVersion : PlayFabBaseModel + { + /// + /// unique name of the statistic + /// + public string StatisticName; + /// + /// the version of the statistic to be returned + /// + public uint Version; + } + + [Serializable] + public class StatisticUpdate : PlayFabBaseModel + { + /// + /// unique name of the statistic + /// + public string StatisticName; + /// + /// statistic value for the player + /// + public int Value; + /// + /// for updates to an existing statistic value for a player, the version of the statistic when it was loaded. Null when + /// setting the statistic value for the first time. + /// + public uint? Version; + } + + [Serializable] + public class StatisticValue : PlayFabBaseModel + { + /// + /// unique name of the statistic + /// + public string StatisticName; + /// + /// statistic value for the player + /// + public int Value; + /// + /// for updates to an existing statistic value for a player, the version of the statistic when it was loaded + /// + public uint Version; + } + + [Serializable] + public class SteamPlayFabIdPair : PlayFabBaseModel + { + /// + /// Unique PlayFab identifier for a user, or null if no PlayFab account is linked to the Steam identifier. + /// + public string PlayFabId; + /// + /// Unique Steam identifier for a user. + /// + public string SteamStringId; + } + + /// + /// A store entry that list a catalog item at a particular price + /// + [Serializable] + public class StoreItem : PlayFabBaseModel + { + /// + /// Store specific custom data. The data only exists as part of this store; it is not transferred to item instances + /// + public object CustomData; + /// + /// Intended display position for this item. Note that 0 is the first position + /// + public uint? DisplayPosition; + /// + /// Unique identifier of the item as it exists in the catalog - note that this must exactly match the ItemId from the + /// catalog + /// + public string ItemId; + /// + /// Override prices for this item for specific currencies + /// + public Dictionary RealCurrencyPrices; + /// + /// Override prices for this item in virtual currencies and "RM" (the base Real Money purchase price, in USD pennies) + /// + public Dictionary VirtualCurrencyPrices; + } + + /// + /// Marketing data about a specific store + /// + [Serializable] + public class StoreMarketingModel : PlayFabBaseModel + { + /// + /// Tagline for a store. + /// + public string Description; + /// + /// Display name of a store as it will appear to users. + /// + public string DisplayName; + /// + /// Custom data about a store. + /// + public object Metadata; + } + + [Serializable] + public class SubscriptionModel : PlayFabBaseModel + { + /// + /// When this subscription expires. + /// + public DateTime Expiration; + /// + /// The time the subscription was orignially purchased + /// + public DateTime InitialSubscriptionTime; + /// + /// Whether this subscription is currently active. That is, if Expiration > now. + /// + public bool IsActive; + /// + /// The status of this subscription, according to the subscription provider. + /// + public SubscriptionProviderStatus? Status; + /// + /// The id for this subscription + /// + public string SubscriptionId; + /// + /// The item id for this subscription from the primary catalog + /// + public string SubscriptionItemId; + /// + /// The provider for this subscription. Apple or Google Play are supported today. + /// + public string SubscriptionProvider; + } + + public enum SubscriptionProviderStatus + { + NoError, + Cancelled, + UnknownError, + BillingError, + ProductUnavailable, + CustomerDidNotAcceptPriceChange, + FreeTrial, + PaymentPending + } + + /// + /// This API must be enabled for use as an option in the game manager website. It is disabled by default. + /// + [Serializable] + public class SubtractUserVirtualCurrencyRequest : PlayFabRequestCommon + { + /// + /// Amount to be subtracted from the user balance of the specified virtual currency. + /// + public int Amount; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Name of the virtual currency which is to be decremented. + /// + public string VirtualCurrency; + } + + [Serializable] + public class TagModel : PlayFabBaseModel + { + /// + /// Full value of the tag, including namespace + /// + public string TagValue; + } + + public enum TitleActivationStatus + { + None, + ActivatedTitleKey, + PendingSteam, + ActivatedSteam, + RevokedSteam + } + + [Serializable] + public class TitleNewsItem : PlayFabBaseModel + { + /// + /// News item text. + /// + public string Body; + /// + /// Unique identifier of news item. + /// + public string NewsId; + /// + /// Date and time when the news item was posted. + /// + public DateTime Timestamp; + /// + /// Title of the news item. + /// + public string Title; + } + + [Serializable] + public class TradeInfo : PlayFabBaseModel + { + /// + /// Item instances from the accepting player that are used to fulfill the trade. If null, no one has accepted the trade. + /// + public List AcceptedInventoryInstanceIds; + /// + /// The PlayFab ID of the player who accepted the trade. If null, no one has accepted the trade. + /// + public string AcceptedPlayerId; + /// + /// An optional list of players allowed to complete this trade. If null, anybody can complete the trade. + /// + public List AllowedPlayerIds; + /// + /// If set, The UTC time when this trade was canceled. + /// + public DateTime? CancelledAt; + /// + /// If set, The UTC time when this trade was fulfilled. + /// + public DateTime? FilledAt; + /// + /// If set, The UTC time when this trade was made invalid. + /// + public DateTime? InvalidatedAt; + /// + /// The catalogItem Ids of the item instances being offered. + /// + public List OfferedCatalogItemIds; + /// + /// The itemInstance Ids that are being offered. + /// + public List OfferedInventoryInstanceIds; + /// + /// The PlayFabId for the offering player. + /// + public string OfferingPlayerId; + /// + /// The UTC time when this trade was created. + /// + public DateTime? OpenedAt; + /// + /// The catalogItem Ids requested in exchange. + /// + public List RequestedCatalogItemIds; + /// + /// Describes the current state of this trade. + /// + public TradeStatus? Status; + /// + /// The identifier for this trade. + /// + public string TradeId; + } + + public enum TradeStatus + { + Invalid, + Opening, + Open, + Accepting, + Accepted, + Filled, + Cancelled + } + + public enum TransactionStatus + { + CreateCart, + Init, + Approved, + Succeeded, + FailedByProvider, + DisputePending, + RefundPending, + Refunded, + RefundFailed, + ChargedBack, + FailedByUber, + FailedByPlayFab, + Revoked, + TradePending, + Traded, + Upgraded, + StackPending, + Stacked, + Other, + Failed + } + + [Serializable] + public class TreatmentAssignment : PlayFabBaseModel + { + /// + /// List of the experiment variables. + /// + public List Variables; + /// + /// List of the experiment variants. + /// + public List Variants; + } + + [Serializable] + public class TwitchPlayFabIdPair : PlayFabBaseModel + { + /// + /// Unique PlayFab identifier for a user, or null if no PlayFab account is linked to the Twitch identifier. + /// + public string PlayFabId; + /// + /// Unique Twitch identifier for a user. + /// + public string TwitchId; + } + + [Serializable] + public class UnlinkAndroidDeviceIDRequest : PlayFabRequestCommon + { + /// + /// Android device identifier for the user's device. If not specified, the most recently signed in Android Device ID will be + /// used. + /// + public string AndroidDeviceId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + [Serializable] + public class UnlinkAndroidDeviceIDResult : PlayFabResultCommon + { + } + + [Serializable] + public class UnlinkAppleRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + [Serializable] + public class UnlinkCustomIDRequest : PlayFabRequestCommon + { + /// + /// Custom unique identifier for the user, generated by the title. If not specified, the most recently signed in Custom ID + /// will be used. + /// + public string CustomId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + [Serializable] + public class UnlinkCustomIDResult : PlayFabResultCommon + { + } + + [Serializable] + public class UnlinkFacebookAccountRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + [Serializable] + public class UnlinkFacebookAccountResult : PlayFabResultCommon + { + } + + [Serializable] + public class UnlinkFacebookInstantGamesIdRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Facebook Instant Games identifier for the user. If not specified, the most recently signed in ID will be used. + /// + public string FacebookInstantGamesId; + } + + [Serializable] + public class UnlinkFacebookInstantGamesIdResult : PlayFabResultCommon + { + } + + [Serializable] + public class UnlinkGameCenterAccountRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + [Serializable] + public class UnlinkGameCenterAccountResult : PlayFabResultCommon + { + } + + [Serializable] + public class UnlinkGoogleAccountRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + [Serializable] + public class UnlinkGoogleAccountResult : PlayFabResultCommon + { + } + + [Serializable] + public class UnlinkGooglePlayGamesServicesAccountRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + [Serializable] + public class UnlinkGooglePlayGamesServicesAccountResult : PlayFabResultCommon + { + } + + [Serializable] + public class UnlinkIOSDeviceIDRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Vendor-specific iOS identifier for the user's device. If not specified, the most recently signed in iOS Device ID will + /// be used. + /// + public string DeviceId; + } + + [Serializable] + public class UnlinkIOSDeviceIDResult : PlayFabResultCommon + { + } + + [Serializable] + public class UnlinkKongregateAccountRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + [Serializable] + public class UnlinkKongregateAccountResult : PlayFabResultCommon + { + } + + [Serializable] + public class UnlinkNintendoServiceAccountRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + [Serializable] + public class UnlinkNintendoSwitchDeviceIdRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Nintendo Switch Device identifier for the user. If not specified, the most recently signed in device ID will be used. + /// + public string NintendoSwitchDeviceId; + } + + [Serializable] + public class UnlinkNintendoSwitchDeviceIdResult : PlayFabResultCommon + { + } + + [Serializable] + public class UnlinkOpenIdConnectRequest : PlayFabRequestCommon + { + /// + /// A name that identifies which configured OpenID Connect provider relationship to use. Maximum 100 characters. + /// + public string ConnectionId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + [Serializable] + public class UnlinkPSNAccountRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + [Serializable] + public class UnlinkPSNAccountResult : PlayFabResultCommon + { + } + + [Serializable] + public class UnlinkSteamAccountRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + [Serializable] + public class UnlinkSteamAccountResult : PlayFabResultCommon + { + } + + [Serializable] + public class UnlinkTwitchAccountRequest : PlayFabRequestCommon + { + /// + /// Valid token issued by Twitch. Used to specify which twitch account to unlink from the profile. By default it uses the + /// one that is present on the profile. + /// + public string AccessToken; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + [Serializable] + public class UnlinkTwitchAccountResult : PlayFabResultCommon + { + } + + [Serializable] + public class UnlinkXboxAccountRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + [Serializable] + public class UnlinkXboxAccountResult : PlayFabResultCommon + { + } + + /// + /// Specify the container and optionally the catalogVersion for the container to open + /// + [Serializable] + public class UnlockContainerInstanceRequest : PlayFabRequestCommon + { + /// + /// Specifies the catalog version that should be used to determine container contents. If unspecified, uses catalog + /// associated with the item instance. + /// + public string CatalogVersion; + /// + /// Unique PlayFab assigned ID for a specific character owned by a user + /// + public string CharacterId; + /// + /// ItemInstanceId of the container to unlock. + /// + public string ContainerItemInstanceId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// ItemInstanceId of the key that will be consumed by unlocking this container. If the container requires a key, this + /// parameter is required. + /// + public string KeyItemInstanceId; + } + + /// + /// Specify the type of container to open and optionally the catalogVersion for the container to open + /// + [Serializable] + public class UnlockContainerItemRequest : PlayFabRequestCommon + { + /// + /// Specifies the catalog version that should be used to determine container contents. If unspecified, uses default/primary + /// catalog. + /// + public string CatalogVersion; + /// + /// Unique PlayFab assigned ID for a specific character owned by a user + /// + public string CharacterId; + /// + /// Catalog ItemId of the container type to unlock. + /// + public string ContainerItemId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + /// + /// The items and vc found within the container. These will be added and stacked in the appropriate inventory. + /// + [Serializable] + public class UnlockContainerItemResult : PlayFabResultCommon + { + /// + /// Items granted to the player as a result of unlocking the container. + /// + public List GrantedItems; + /// + /// Unique instance identifier of the container unlocked. + /// + public string UnlockedItemInstanceId; + /// + /// Unique instance identifier of the key used to unlock the container, if applicable. + /// + public string UnlockedWithItemInstanceId; + /// + /// Virtual currency granted to the player as a result of unlocking the container. + /// + public Dictionary VirtualCurrency; + } + + [Serializable] + public class UpdateAvatarUrlRequest : PlayFabRequestCommon + { + /// + /// URL of the avatar image. If empty, it removes the existing avatar URL. + /// + public string ImageUrl; + } + + /// + /// This function performs an additive update of the arbitrary strings containing the custom data for the character. In + /// updating the custom data object, keys which already exist in the object will have their values overwritten, while keys + /// with null values will be removed. New keys will be added, with the given values. No other key-value pairs will be + /// changed apart from those specified in the call. + /// + [Serializable] + public class UpdateCharacterDataRequest : PlayFabRequestCommon + { + /// + /// Unique PlayFab assigned ID for a specific character owned by a user + /// + public string CharacterId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Key-value pairs to be written to the custom data. Note that keys are trimmed of whitespace, are limited in size, and may + /// not begin with a '!' character or be null. + /// + public Dictionary Data; + /// + /// Optional list of Data-keys to remove from UserData. Some SDKs cannot insert null-values into Data due to language + /// constraints. Use this to delete the keys directly. + /// + public List KeysToRemove; + /// + /// Permission to be applied to all user data keys written in this request. Defaults to "private" if not set. + /// + public UserDataPermission? Permission; + } + + [Serializable] + public class UpdateCharacterDataResult : PlayFabResultCommon + { + /// + /// Indicates the current version of the data that has been set. This is incremented with every set call for that type of + /// data (read-only, internal, etc). This version can be provided in Get calls to find updated data. + /// + public uint DataVersion; + } + + /// + /// Enable this option with the 'Allow Client to Post Player Statistics' option in PlayFab GameManager for your title. + /// However, this is not best practice, as this data will no longer be safely controlled by the server. This operation is + /// additive. Character Statistics not currently defined will be added, while those already defined will be updated with the + /// given values. All other user statistics will remain unchanged. Character statistics are used by the + /// character-leaderboard apis, and accessible for custom game-logic. + /// + [Serializable] + public class UpdateCharacterStatisticsRequest : PlayFabRequestCommon + { + /// + /// Unique PlayFab assigned ID for a specific character owned by a user + /// + public string CharacterId; + /// + /// Statistics to be updated with the provided values, in the Key(string), Value(int) pattern. + /// + public Dictionary CharacterStatistics; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + [Serializable] + public class UpdateCharacterStatisticsResult : PlayFabResultCommon + { + } + + /// + /// Enable this option with the 'Allow Client to Post Player Statistics' option in PlayFab GameManager for your title. + /// However, this is not best practice, as this data will no longer be safely controlled by the server. This operation is + /// additive. Statistics not currently defined will be added, while those already defined will be updated with the given + /// values. All other user statistics will remain unchanged. Note that if the statistic is intended to have a reset period, + /// the UpdatePlayerStatisticDefinition API call can be used to define that reset period. Once a statistic has been + /// versioned (reset), the now-previous version can still be written to for up a short, pre-defined period (currently 10 + /// seconds), using the Version parameter in this call. + /// + [Serializable] + public class UpdatePlayerStatisticsRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Statistics to be updated with the provided values + /// + public List Statistics; + } + + [Serializable] + public class UpdatePlayerStatisticsResult : PlayFabResultCommon + { + } + + /// + /// Note that in the case of multiple calls to write to the same shared group data keys, the last write received by the + /// PlayFab service will determine the value available to subsequent read operations. For scenarios requiring coordination + /// of data updates, it is recommended that titles make use of user data with read permission set to public, or a + /// combination of user data and shared group data. + /// + [Serializable] + public class UpdateSharedGroupDataRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Key-value pairs to be written to the custom data. Note that keys are trimmed of whitespace, are limited in size, and may + /// not begin with a '!' character or be null. + /// + public Dictionary Data; + /// + /// Optional list of Data-keys to remove from UserData. Some SDKs cannot insert null-values into Data due to language + /// constraints. Use this to delete the keys directly. + /// + public List KeysToRemove; + /// + /// Permission to be applied to all user data keys in this request. + /// + public UserDataPermission? Permission; + /// + /// Unique identifier for the shared group. + /// + public string SharedGroupId; + } + + [Serializable] + public class UpdateSharedGroupDataResult : PlayFabResultCommon + { + } + + /// + /// This function performs an additive update of the arbitrary strings containing the custom data for the user. In updating + /// the custom data object, keys which already exist in the object will have their values overwritten, while keys with null + /// values will be removed. New keys will be added, with the given values. No other key-value pairs will be changed apart + /// from those specified in the call. + /// + [Serializable] + public class UpdateUserDataRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Key-value pairs to be written to the custom data. Note that keys are trimmed of whitespace, are limited in size, and may + /// not begin with a '!' character or be null. + /// + public Dictionary Data; + /// + /// Optional list of Data-keys to remove from UserData. Some SDKs cannot insert null-values into Data due to language + /// constraints. Use this to delete the keys directly. + /// + public List KeysToRemove; + /// + /// Permission to be applied to all user data keys written in this request. Defaults to "private" if not set. This is used + /// for requests by one player for information about another player; those requests will only return Public keys. + /// + public UserDataPermission? Permission; + } + + [Serializable] + public class UpdateUserDataResult : PlayFabResultCommon + { + /// + /// Indicates the current version of the data that has been set. This is incremented with every set call for that type of + /// data (read-only, internal, etc). This version can be provided in Get calls to find updated data. + /// + public uint DataVersion; + } + + /// + /// In addition to the PlayFab username, titles can make use of a DisplayName which is also a unique identifier, but + /// specific to the title. This allows for unique names which more closely match the theme or genre of a title, for example. + /// + [Serializable] + public class UpdateUserTitleDisplayNameRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// New title display name for the user - must be between 3 and 25 characters. + /// + public string DisplayName; + } + + [Serializable] + public class UpdateUserTitleDisplayNameResult : PlayFabResultCommon + { + /// + /// Current title display name for the user (this will be the original display name if the rename attempt failed). + /// + public string DisplayName; + } + + [Serializable] + public class UserAccountInfo : PlayFabBaseModel + { + /// + /// User Android device information, if an Android device has been linked + /// + public UserAndroidDeviceInfo AndroidDeviceInfo; + /// + /// Sign in with Apple account information, if an Apple account has been linked + /// + public UserAppleIdInfo AppleAccountInfo; + /// + /// Timestamp indicating when the user account was created + /// + public DateTime Created; + /// + /// Custom ID information, if a custom ID has been assigned + /// + public UserCustomIdInfo CustomIdInfo; + /// + /// User Facebook information, if a Facebook account has been linked + /// + public UserFacebookInfo FacebookInfo; + /// + /// Facebook Instant Games account information, if a Facebook Instant Games account has been linked + /// + public UserFacebookInstantGamesIdInfo FacebookInstantGamesIdInfo; + /// + /// User Gamecenter information, if a Gamecenter account has been linked + /// + public UserGameCenterInfo GameCenterInfo; + /// + /// User Google account information, if a Google account has been linked + /// + public UserGoogleInfo GoogleInfo; + /// + /// User Google Play Games account information, if a Google Play Games account has been linked + /// + public UserGooglePlayGamesInfo GooglePlayGamesInfo; + /// + /// User iOS device information, if an iOS device has been linked + /// + public UserIosDeviceInfo IosDeviceInfo; + /// + /// User Kongregate account information, if a Kongregate account has been linked + /// + public UserKongregateInfo KongregateInfo; + /// + /// Nintendo Switch account information, if a Nintendo Switch account has been linked + /// + public UserNintendoSwitchAccountIdInfo NintendoSwitchAccountInfo; + /// + /// Nintendo Switch device information, if a Nintendo Switch device has been linked + /// + public UserNintendoSwitchDeviceIdInfo NintendoSwitchDeviceIdInfo; + /// + /// OpenID Connect information, if any OpenID Connect accounts have been linked + /// + public List OpenIdInfo; + /// + /// Unique identifier for the user account + /// + public string PlayFabId; + /// + /// Personal information for the user which is considered more sensitive + /// + public UserPrivateAccountInfo PrivateInfo; + /// + /// User PlayStation :tm: Network account information, if a PlayStation :tm: Network account has been linked + /// + public UserPsnInfo PsnInfo; + /// + /// Server Custom ID information, if a server custom ID has been assigned + /// + public UserServerCustomIdInfo ServerCustomIdInfo; + /// + /// User Steam information, if a Steam account has been linked + /// + public UserSteamInfo SteamInfo; + /// + /// Title-specific information for the user account + /// + public UserTitleInfo TitleInfo; + /// + /// User Twitch account information, if a Twitch account has been linked + /// + public UserTwitchInfo TwitchInfo; + /// + /// User account name in the PlayFab service + /// + public string Username; + /// + /// User XBox account information, if a XBox account has been linked + /// + public UserXboxInfo XboxInfo; + } + + [Serializable] + public class UserAndroidDeviceInfo : PlayFabBaseModel + { + /// + /// Android device ID + /// + public string AndroidDeviceId; + } + + [Serializable] + public class UserAppleIdInfo : PlayFabBaseModel + { + /// + /// Apple subject ID + /// + public string AppleSubjectId; + } + + [Serializable] + public class UserCustomIdInfo : PlayFabBaseModel + { + /// + /// Custom ID + /// + public string CustomId; + } + + /// + /// Indicates whether a given data key is private (readable only by the player) or public (readable by all players). When a + /// player makes a GetUserData request about another player, only keys marked Public will be returned. + /// + public enum UserDataPermission + { + Private, + Public + } + + [Serializable] + public class UserDataRecord : PlayFabBaseModel + { + /// + /// Timestamp for when this data was last updated. + /// + public DateTime LastUpdated; + /// + /// Indicates whether this data can be read by all users (public) or only the user (private). This is used for GetUserData + /// requests being made by one player about another player. + /// + public UserDataPermission? Permission; + /// + /// Data stored for the specified user data key. + /// + public string Value; + } + + [Serializable] + public class UserFacebookInfo : PlayFabBaseModel + { + /// + /// Facebook identifier + /// + public string FacebookId; + /// + /// Facebook full name + /// + public string FullName; + } + + [Serializable] + public class UserFacebookInstantGamesIdInfo : PlayFabBaseModel + { + /// + /// Facebook Instant Games ID + /// + public string FacebookInstantGamesId; + } + + [Serializable] + public class UserGameCenterInfo : PlayFabBaseModel + { + /// + /// Gamecenter identifier + /// + public string GameCenterId; + } + + [Serializable] + public class UserGoogleInfo : PlayFabBaseModel + { + /// + /// Email address of the Google account + /// + public string GoogleEmail; + /// + /// Gender information of the Google account + /// + public string GoogleGender; + /// + /// Google ID + /// + public string GoogleId; + /// + /// Locale of the Google account + /// + public string GoogleLocale; + /// + /// Name of the Google account user + /// + public string GoogleName; + } + + [Serializable] + public class UserGooglePlayGamesInfo : PlayFabBaseModel + { + /// + /// Avatar image url of the Google Play Games player + /// + public string GooglePlayGamesPlayerAvatarImageUrl; + /// + /// Display name of the Google Play Games player + /// + public string GooglePlayGamesPlayerDisplayName; + /// + /// Google Play Games player ID + /// + public string GooglePlayGamesPlayerId; + } + + [Serializable] + public class UserIosDeviceInfo : PlayFabBaseModel + { + /// + /// iOS device ID + /// + public string IosDeviceId; + } + + [Serializable] + public class UserKongregateInfo : PlayFabBaseModel + { + /// + /// Kongregate ID + /// + public string KongregateId; + /// + /// Kongregate Username + /// + public string KongregateName; + } + + [Serializable] + public class UserNintendoSwitchAccountIdInfo : PlayFabBaseModel + { + /// + /// Nintendo Switch account subject ID + /// + public string NintendoSwitchAccountSubjectId; + } + + [Serializable] + public class UserNintendoSwitchDeviceIdInfo : PlayFabBaseModel + { + /// + /// Nintendo Switch Device ID + /// + public string NintendoSwitchDeviceId; + } + + [Serializable] + public class UserOpenIdInfo : PlayFabBaseModel + { + /// + /// OpenID Connection ID + /// + public string ConnectionId; + /// + /// OpenID Issuer + /// + public string Issuer; + /// + /// OpenID Subject + /// + public string Subject; + } + + public enum UserOrigination + { + Organic, + Steam, + Google, + Amazon, + Facebook, + Kongregate, + GamersFirst, + Unknown, + IOS, + LoadTest, + Android, + PSN, + GameCenter, + CustomId, + XboxLive, + Parse, + Twitch, + ServerCustomId, + NintendoSwitchDeviceId, + FacebookInstantGamesId, + OpenIdConnect, + Apple, + NintendoSwitchAccount, + GooglePlayGames, + XboxMobileStore, + King + } + + [Serializable] + public class UserPrivateAccountInfo : PlayFabBaseModel + { + /// + /// user email address + /// + public string Email; + } + + [Serializable] + public class UserPsnInfo : PlayFabBaseModel + { + /// + /// PlayStation :tm: Network account ID + /// + public string PsnAccountId; + /// + /// PlayStation :tm: Network online ID + /// + public string PsnOnlineId; + } + + [Serializable] + public class UserServerCustomIdInfo : PlayFabBaseModel + { + /// + /// Custom ID + /// + public string CustomId; + } + + [Serializable] + public class UserSettings : PlayFabBaseModel + { + /// + /// Boolean for whether this player is eligible for gathering device info. + /// + public bool GatherDeviceInfo; + /// + /// Boolean for whether this player should report OnFocus play-time tracking. + /// + public bool GatherFocusInfo; + /// + /// Boolean for whether this player is eligible for ad tracking. + /// + public bool NeedsAttribution; + } + + [Serializable] + public class UserSteamInfo : PlayFabBaseModel + { + /// + /// what stage of game ownership the user is listed as being in, from Steam + /// + public TitleActivationStatus? SteamActivationStatus; + /// + /// the country in which the player resides, from Steam data + /// + public string SteamCountry; + /// + /// currency type set in the user Steam account + /// + public Currency? SteamCurrency; + /// + /// Steam identifier + /// + public string SteamId; + /// + /// Steam display name + /// + public string SteamName; + } + + [Serializable] + public class UserTitleInfo : PlayFabBaseModel + { + /// + /// URL to the player's avatar. + /// + public string AvatarUrl; + /// + /// timestamp indicating when the user was first associated with this game (this can differ significantly from when the user + /// first registered with PlayFab) + /// + public DateTime Created; + /// + /// name of the user, as it is displayed in-game + /// + public string DisplayName; + /// + /// timestamp indicating when the user first signed into this game (this can differ from the Created timestamp, as other + /// events, such as issuing a beta key to the user, can associate the title to the user) + /// + public DateTime? FirstLogin; + /// + /// boolean indicating whether or not the user is currently banned for a title + /// + public bool? isBanned; + /// + /// timestamp for the last user login for this title + /// + public DateTime? LastLogin; + /// + /// source by which the user first joined the game, if known + /// + public UserOrigination? Origination; + /// + /// Title player account entity for this user + /// + public EntityKey TitlePlayerAccount; + } + + [Serializable] + public class UserTwitchInfo : PlayFabBaseModel + { + /// + /// Twitch ID + /// + public string TwitchId; + /// + /// Twitch Username + /// + public string TwitchUserName; + } + + [Serializable] + public class UserXboxInfo : PlayFabBaseModel + { + /// + /// XBox user ID + /// + public string XboxUserId; + /// + /// XBox user sandbox + /// + public string XboxUserSandbox; + } + + [Serializable] + public class ValidateAmazonReceiptRequest : PlayFabRequestCommon + { + /// + /// Catalog version of the fulfilled items. If null, defaults to the primary catalog. + /// + public string CatalogVersion; + /// + /// Currency used to pay for the purchase (ISO 4217 currency code). + /// + public string CurrencyCode; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Amount of the stated currency paid, in centesimal units. + /// + public int PurchasePrice; + /// + /// ReceiptId returned by the Amazon App Store in-app purchase API + /// + public string ReceiptId; + /// + /// AmazonId of the user making the purchase as returned by the Amazon App Store in-app purchase API + /// + public string UserId; + } + + /// + /// Once verified, the catalog item matching the Amazon item name will be added to the user's inventory. This result should + /// be used for immediate updates to the local client game state as opposed to the GetUserInventory API which can have an up + /// to half second delay. + /// + [Serializable] + public class ValidateAmazonReceiptResult : PlayFabResultCommon + { + /// + /// Fulfilled inventory items and recorded purchases in fulfillment of the validated receipt transactions. + /// + public List Fulfillments; + } + + /// + /// The packageName and productId are defined in the GooglePlay store. The productId must match the ItemId of the inventory + /// item in the PlayFab catalog for the title. This enables the PlayFab service to securely validate that the purchase is + /// for the correct item, in order to prevent uses from passing valid receipts as being for more expensive items (passing a + /// receipt for a 99-cent purchase as being for a $19.99 purchase, for example). Each receipt may be validated only once to + /// avoid granting the same item over and over from a single purchase. + /// + [Serializable] + public class ValidateGooglePlayPurchaseRequest : PlayFabRequestCommon + { + /// + /// Catalog version of the fulfilled items. If null, defaults to the primary catalog. + /// + public string CatalogVersion; + /// + /// Currency used to pay for the purchase (ISO 4217 currency code). + /// + public string CurrencyCode; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Amount of the stated currency paid, in centesimal units. + /// + public uint? PurchasePrice; + /// + /// Original JSON string returned by the Google Play IAB API. + /// + public string ReceiptJson; + /// + /// Signature returned by the Google Play IAB API. + /// + public string Signature; + } + + /// + /// Once verified, the catalog item (ItemId) matching the GooglePlay store item (productId) will be added to the user's + /// inventory. This result should be used for immediate updates to the local client game state as opposed to the + /// GetUserInventory API which can have an up to half second delay. + /// + [Serializable] + public class ValidateGooglePlayPurchaseResult : PlayFabResultCommon + { + /// + /// Fulfilled inventory items and recorded purchases in fulfillment of the validated receipt transactions. + /// + public List Fulfillments; + } + + /// + /// The CurrencyCode and PurchasePrice must match the price which was set up for the item in the Apple store. In addition, + /// The ItemId of the inventory in the PlayFab Catalog must match the Product ID as it was set up in the Apple store. This + /// enables the PlayFab service to securely validate that the purchase is for the correct item, in order to prevent uses + /// from passing valid receipts as being for more expensive items (passing a receipt for a 99-cent purchase as being for a + /// $19.99 purchase, for example). + /// + [Serializable] + public class ValidateIOSReceiptRequest : PlayFabRequestCommon + { + /// + /// Catalog version of the fulfilled items. If null, defaults to the primary catalog. + /// + public string CatalogVersion; + /// + /// Currency used to pay for the purchase (ISO 4217 currency code). + /// + public string CurrencyCode; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Amount of the stated currency paid, in centesimal units. + /// + public int PurchasePrice; + /// + /// Base64 encoded receipt data, passed back by the App Store as a result of a successful purchase. + /// + public string ReceiptData; + } + + /// + /// Once verified, the catalog item matching the iTunes item name will be added to the user's inventory. This result should + /// be used for immediate updates to the local client game state as opposed to the GetUserInventory API which can have an up + /// to half second delay. + /// + [Serializable] + public class ValidateIOSReceiptResult : PlayFabResultCommon + { + /// + /// Fulfilled inventory items and recorded purchases in fulfillment of the validated receipt transactions. + /// + public List Fulfillments; + } + + [Serializable] + public class ValidateWindowsReceiptRequest : PlayFabRequestCommon + { + /// + /// Catalog version of the fulfilled items. If null, defaults to the primary catalog. + /// + public string CatalogVersion; + /// + /// Currency used to pay for the purchase (ISO 4217 currency code). + /// + public string CurrencyCode; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Amount of the stated currency paid, in centesimal units. + /// + public uint PurchasePrice; + /// + /// XML Receipt returned by the Windows App Store in-app purchase API + /// + public string Receipt; + } + + /// + /// Once verified, the catalog item matching the Product name will be added to the user's inventory. This result should be + /// used for immediate updates to the local client game state as opposed to the GetUserInventory API which can have an up to + /// half second delay. + /// + [Serializable] + public class ValidateWindowsReceiptResult : PlayFabResultCommon + { + /// + /// Fulfilled inventory items and recorded purchases in fulfillment of the validated receipt transactions. + /// + public List Fulfillments; + } + + [Serializable] + public class ValueToDateModel : PlayFabBaseModel + { + /// + /// ISO 4217 code of the currency used in the purchases + /// + public string Currency; + /// + /// Total value of the purchases in a whole number of 1/100 monetary units. For example, 999 indicates nine dollars and + /// ninety-nine cents when Currency is 'USD') + /// + public uint TotalValue; + /// + /// Total value of the purchases in a string representation of decimal monetary units. For example, '9.99' indicates nine + /// dollars and ninety-nine cents when Currency is 'USD'. + /// + public string TotalValueAsDecimal; + } + + [Serializable] + public class Variable : PlayFabBaseModel + { + /// + /// Name of the variable. + /// + public string Name; + /// + /// Value of the variable. + /// + public string Value; + } + + [Serializable] + public class VirtualCurrencyRechargeTime : PlayFabBaseModel + { + /// + /// Maximum value to which the regenerating currency will automatically increment. Note that it can exceed this value + /// through use of the AddUserVirtualCurrency API call. However, it will not regenerate automatically until it has fallen + /// below this value. + /// + public int RechargeMax; + /// + /// Server timestamp in UTC indicating the next time the virtual currency will be incremented. + /// + public DateTime RechargeTime; + /// + /// Time remaining (in seconds) before the next recharge increment of the virtual currency. + /// + public int SecondsToRecharge; + } + + /// + /// This API is designed to write a multitude of different client-defined events into PlayStream. It supports a flexible + /// JSON schema, which allowsfor arbitrary key-value pairs to describe any character-based event. The created event will be + /// locked to the authenticated title and player. + /// + [Serializable] + public class WriteClientCharacterEventRequest : PlayFabRequestCommon + { + /// + /// Custom event properties. Each property consists of a name (string) and a value (JSON object). + /// + public Dictionary Body; + /// + /// Unique PlayFab assigned ID for a specific character owned by a user + /// + public string CharacterId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The name of the event, within the namespace scoped to the title. The naming convention is up to the caller, but it + /// commonly follows the subject_verb_object pattern (e.g. player_logged_in). + /// + public string EventName; + /// + /// The time (in UTC) associated with this event. The value defaults to the current time. + /// + public DateTime? Timestamp; + } + + /// + /// This API is designed to write a multitude of different event types into PlayStream. It supports a flexible JSON schema, + /// which allowsfor arbitrary key-value pairs to describe any player-based event. The created event will be locked to the + /// authenticated title and player. + /// + [Serializable] + public class WriteClientPlayerEventRequest : PlayFabRequestCommon + { + /// + /// Custom data properties associated with the event. Each property consists of a name (string) and a value (JSON object). + /// + public Dictionary Body; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The name of the event, within the namespace scoped to the title. The naming convention is up to the caller, but it + /// commonly follows the subject_verb_object pattern (e.g. player_logged_in). + /// + public string EventName; + /// + /// The time (in UTC) associated with this event. The value defaults to the current time. + /// + public DateTime? Timestamp; + } + + [Serializable] + public class WriteEventResponse : PlayFabResultCommon + { + /// + /// The unique identifier of the event. The values of this identifier consist of ASCII characters and are not constrained to + /// any particular format. + /// + public string EventId; + } + + /// + /// This API is designed to write a multitude of different client-defined events into PlayStream. It supports a flexible + /// JSON schema, which allowsfor arbitrary key-value pairs to describe any title-based event. The created event will be + /// locked to the authenticated title. + /// + [Serializable] + public class WriteTitleEventRequest : PlayFabRequestCommon + { + /// + /// Custom event properties. Each property consists of a name (string) and a value (JSON object). + /// + public Dictionary Body; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The name of the event, within the namespace scoped to the title. The naming convention is up to the caller, but it + /// commonly follows the subject_verb_object pattern (e.g. player_logged_in). + /// + public string EventName; + /// + /// The time (in UTC) associated with this event. The value defaults to the current time. + /// + public DateTime? Timestamp; + } + + [Serializable] + public class XboxLiveAccountPlayFabIdPair : PlayFabBaseModel + { + /// + /// Unique PlayFab identifier for a user, or null if no PlayFab account is linked to the Xbox Live identifier. + /// + public string PlayFabId; + /// + /// Unique Xbox Live identifier for a user. + /// + public string XboxLiveAccountId; + } +} +#endif diff --git a/Assets/PlayFabSDK/Client/PlayFabClientModels.cs.meta b/Assets/PlayFabSDK/Client/PlayFabClientModels.cs.meta new file mode 100644 index 00000000..e89f150a --- /dev/null +++ b/Assets/PlayFabSDK/Client/PlayFabClientModels.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 3a0a4ef9b600e6540b14561880293235 +timeCreated: 1468524875 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Client/PlayFabDeviceUtil.cs b/Assets/PlayFabSDK/Client/PlayFabDeviceUtil.cs new file mode 100644 index 00000000..0c073966 --- /dev/null +++ b/Assets/PlayFabSDK/Client/PlayFabDeviceUtil.cs @@ -0,0 +1,109 @@ +#if !DISABLE_PLAYFABCLIENT_API +using System.Collections.Generic; +using PlayFab.SharedModels; +using UnityEngine; + +namespace PlayFab.Internal +{ + public static class PlayFabDeviceUtil + { + private static bool _needsAttribution, _gatherDeviceInfo, _gatherScreenTime; + + #region Scrape Device Info + private static void SendDeviceInfoToPlayFab(PlayFabApiSettings settings, IPlayFabInstanceApi instanceApi) + { + if (settings.DisableDeviceInfo || !_gatherDeviceInfo) return; + + var serializer = PluginManager.GetPlugin(PluginContract.PlayFab_Serializer); + var request = new ClientModels.DeviceInfoRequest + { + Info = serializer.DeserializeObject>(serializer.SerializeObject(new PlayFabDataGatherer())) + }; + var clientInstanceApi = instanceApi as PlayFabClientInstanceAPI; + if (clientInstanceApi != null) + clientInstanceApi.ReportDeviceInfo(request, null, OnGatherFail, settings); +#if !DISABLE_PLAYFAB_STATIC_API + else + PlayFabClientAPI.ReportDeviceInfo(request, null, OnGatherFail, settings); +#endif + } + private static void OnGatherFail(PlayFabError error) + { + Debug.Log("OnGatherFail: " + error.GenerateErrorReport()); + } + #endregion + + /// + /// When a PlayFab login occurs, check the result information, and + /// relay it to _OnPlayFabLogin where the information is used + /// + /// + public static void OnPlayFabLogin(PlayFabResultCommon result, PlayFabApiSettings settings, IPlayFabInstanceApi instanceApi) + { + var loginResult = result as ClientModels.LoginResult; + var registerResult = result as ClientModels.RegisterPlayFabUserResult; + if (loginResult == null && registerResult == null) + return; + + // Gather things common to the result types + ClientModels.UserSettings settingsForUser = null; + string playFabId = null; + string entityId = null; + string entityType = null; + + if (loginResult != null) + { + settingsForUser = loginResult.SettingsForUser; + playFabId = loginResult.PlayFabId; + if (loginResult.EntityToken != null) + { + entityId = loginResult.EntityToken.Entity.Id; + entityType = loginResult.EntityToken.Entity.Type; + } + } + else if (registerResult != null) + { + settingsForUser = registerResult.SettingsForUser; + playFabId = registerResult.PlayFabId; + if (registerResult.EntityToken != null) + { + entityId = registerResult.EntityToken.Entity.Id; + entityType = registerResult.EntityToken.Entity.Type; + } + } + + _OnPlayFabLogin(settingsForUser, playFabId, entityId, entityType, settings, instanceApi); + } + + /// + /// Separated from OnPlayFabLogin, to explicitly lose the refs to loginResult and registerResult, because + /// only one will be defined, but both usually have all the information we REALLY need here. + /// But the result signatures are different and clunky, so do the separation above, and processing here + /// + private static void _OnPlayFabLogin(ClientModels.UserSettings settingsForUser, string playFabId, string entityId, string entityType, PlayFabApiSettings settings, IPlayFabInstanceApi instanceApi) + { + _needsAttribution = _gatherDeviceInfo = _gatherScreenTime = false; + if (settingsForUser != null) + { + _needsAttribution = settingsForUser.NeedsAttribution; + _gatherDeviceInfo = settingsForUser.GatherDeviceInfo; + _gatherScreenTime = settingsForUser.GatherFocusInfo; + } + + // Device information gathering + SendDeviceInfoToPlayFab(settings, instanceApi); + +#if !DISABLE_PLAYFABENTITY_API + if (!string.IsNullOrEmpty(entityId) && !string.IsNullOrEmpty(entityType) && _gatherScreenTime) + { + PlayFabHttp.InitializeScreenTimeTracker(entityId, entityType, playFabId); + } + else + { + settings.DisableFocusTimeCollection = true; + } +#endif + } + } +} +#endif diff --git a/Assets/PlayFabSDK/Client/PlayFabDeviceUtil.cs.meta b/Assets/PlayFabSDK/Client/PlayFabDeviceUtil.cs.meta new file mode 100644 index 00000000..c17526e9 --- /dev/null +++ b/Assets/PlayFabSDK/Client/PlayFabDeviceUtil.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: dd4190ddf909a304eb43068a0caea903 +timeCreated: 1494526811 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Client/PlayFabEvents.cs b/Assets/PlayFabSDK/Client/PlayFabEvents.cs new file mode 100644 index 00000000..49048a3c --- /dev/null +++ b/Assets/PlayFabSDK/Client/PlayFabEvents.cs @@ -0,0 +1,321 @@ +#if !DISABLE_PLAYFABCLIENT_API +using PlayFab.ClientModels; + +namespace PlayFab.Events +{ + public partial class PlayFabEvents + { + public event PlayFabResultEvent OnLoginResultEvent; + + public event PlayFabRequestEvent OnAcceptTradeRequestEvent; + public event PlayFabResultEvent OnAcceptTradeResultEvent; + public event PlayFabRequestEvent OnAddFriendRequestEvent; + public event PlayFabResultEvent OnAddFriendResultEvent; + public event PlayFabRequestEvent OnAddGenericIDRequestEvent; + public event PlayFabResultEvent OnAddGenericIDResultEvent; + public event PlayFabRequestEvent OnAddOrUpdateContactEmailRequestEvent; + public event PlayFabResultEvent OnAddOrUpdateContactEmailResultEvent; + public event PlayFabRequestEvent OnAddSharedGroupMembersRequestEvent; + public event PlayFabResultEvent OnAddSharedGroupMembersResultEvent; + public event PlayFabRequestEvent OnAddUsernamePasswordRequestEvent; + public event PlayFabResultEvent OnAddUsernamePasswordResultEvent; + public event PlayFabRequestEvent OnAddUserVirtualCurrencyRequestEvent; + public event PlayFabResultEvent OnAddUserVirtualCurrencyResultEvent; + public event PlayFabRequestEvent OnAndroidDevicePushNotificationRegistrationRequestEvent; + public event PlayFabResultEvent OnAndroidDevicePushNotificationRegistrationResultEvent; + public event PlayFabRequestEvent OnAttributeInstallRequestEvent; + public event PlayFabResultEvent OnAttributeInstallResultEvent; + public event PlayFabRequestEvent OnCancelTradeRequestEvent; + public event PlayFabResultEvent OnCancelTradeResultEvent; + public event PlayFabRequestEvent OnConfirmPurchaseRequestEvent; + public event PlayFabResultEvent OnConfirmPurchaseResultEvent; + public event PlayFabRequestEvent OnConsumeItemRequestEvent; + public event PlayFabResultEvent OnConsumeItemResultEvent; + public event PlayFabRequestEvent OnConsumeMicrosoftStoreEntitlementsRequestEvent; + public event PlayFabResultEvent OnConsumeMicrosoftStoreEntitlementsResultEvent; + public event PlayFabRequestEvent OnConsumePS5EntitlementsRequestEvent; + public event PlayFabResultEvent OnConsumePS5EntitlementsResultEvent; + public event PlayFabRequestEvent OnConsumePSNEntitlementsRequestEvent; + public event PlayFabResultEvent OnConsumePSNEntitlementsResultEvent; + public event PlayFabRequestEvent OnConsumeXboxEntitlementsRequestEvent; + public event PlayFabResultEvent OnConsumeXboxEntitlementsResultEvent; + public event PlayFabRequestEvent OnCreateSharedGroupRequestEvent; + public event PlayFabResultEvent OnCreateSharedGroupResultEvent; + public event PlayFabRequestEvent OnExecuteCloudScriptRequestEvent; + public event PlayFabResultEvent OnExecuteCloudScriptResultEvent; + public event PlayFabRequestEvent OnGetAccountInfoRequestEvent; + public event PlayFabResultEvent OnGetAccountInfoResultEvent; + public event PlayFabRequestEvent OnGetAdPlacementsRequestEvent; + public event PlayFabResultEvent OnGetAdPlacementsResultEvent; + public event PlayFabRequestEvent OnGetAllUsersCharactersRequestEvent; + public event PlayFabResultEvent OnGetAllUsersCharactersResultEvent; + public event PlayFabRequestEvent OnGetCatalogItemsRequestEvent; + public event PlayFabResultEvent OnGetCatalogItemsResultEvent; + public event PlayFabRequestEvent OnGetCharacterDataRequestEvent; + public event PlayFabResultEvent OnGetCharacterDataResultEvent; + public event PlayFabRequestEvent OnGetCharacterInventoryRequestEvent; + public event PlayFabResultEvent OnGetCharacterInventoryResultEvent; + public event PlayFabRequestEvent OnGetCharacterLeaderboardRequestEvent; + public event PlayFabResultEvent OnGetCharacterLeaderboardResultEvent; + public event PlayFabRequestEvent OnGetCharacterReadOnlyDataRequestEvent; + public event PlayFabResultEvent OnGetCharacterReadOnlyDataResultEvent; + public event PlayFabRequestEvent OnGetCharacterStatisticsRequestEvent; + public event PlayFabResultEvent OnGetCharacterStatisticsResultEvent; + public event PlayFabRequestEvent OnGetContentDownloadUrlRequestEvent; + public event PlayFabResultEvent OnGetContentDownloadUrlResultEvent; + public event PlayFabRequestEvent OnGetFriendLeaderboardRequestEvent; + public event PlayFabResultEvent OnGetFriendLeaderboardResultEvent; + public event PlayFabRequestEvent OnGetFriendLeaderboardAroundPlayerRequestEvent; + public event PlayFabResultEvent OnGetFriendLeaderboardAroundPlayerResultEvent; + public event PlayFabRequestEvent OnGetFriendsListRequestEvent; + public event PlayFabResultEvent OnGetFriendsListResultEvent; + public event PlayFabRequestEvent OnGetLeaderboardRequestEvent; + public event PlayFabResultEvent OnGetLeaderboardResultEvent; + public event PlayFabRequestEvent OnGetLeaderboardAroundCharacterRequestEvent; + public event PlayFabResultEvent OnGetLeaderboardAroundCharacterResultEvent; + public event PlayFabRequestEvent OnGetLeaderboardAroundPlayerRequestEvent; + public event PlayFabResultEvent OnGetLeaderboardAroundPlayerResultEvent; + public event PlayFabRequestEvent OnGetLeaderboardForUserCharactersRequestEvent; + public event PlayFabResultEvent OnGetLeaderboardForUserCharactersResultEvent; + public event PlayFabRequestEvent OnGetPaymentTokenRequestEvent; + public event PlayFabResultEvent OnGetPaymentTokenResultEvent; + public event PlayFabRequestEvent OnGetPhotonAuthenticationTokenRequestEvent; + public event PlayFabResultEvent OnGetPhotonAuthenticationTokenResultEvent; + public event PlayFabRequestEvent OnGetPlayerCombinedInfoRequestEvent; + public event PlayFabResultEvent OnGetPlayerCombinedInfoResultEvent; + public event PlayFabRequestEvent OnGetPlayerProfileRequestEvent; + public event PlayFabResultEvent OnGetPlayerProfileResultEvent; + public event PlayFabRequestEvent OnGetPlayerSegmentsRequestEvent; + public event PlayFabResultEvent OnGetPlayerSegmentsResultEvent; + public event PlayFabRequestEvent OnGetPlayerStatisticsRequestEvent; + public event PlayFabResultEvent OnGetPlayerStatisticsResultEvent; + public event PlayFabRequestEvent OnGetPlayerStatisticVersionsRequestEvent; + public event PlayFabResultEvent OnGetPlayerStatisticVersionsResultEvent; + public event PlayFabRequestEvent OnGetPlayerTagsRequestEvent; + public event PlayFabResultEvent OnGetPlayerTagsResultEvent; + public event PlayFabRequestEvent OnGetPlayerTradesRequestEvent; + public event PlayFabResultEvent OnGetPlayerTradesResultEvent; + public event PlayFabRequestEvent OnGetPlayFabIDsFromFacebookIDsRequestEvent; + public event PlayFabResultEvent OnGetPlayFabIDsFromFacebookIDsResultEvent; + public event PlayFabRequestEvent OnGetPlayFabIDsFromFacebookInstantGamesIdsRequestEvent; + public event PlayFabResultEvent OnGetPlayFabIDsFromFacebookInstantGamesIdsResultEvent; + public event PlayFabRequestEvent OnGetPlayFabIDsFromGameCenterIDsRequestEvent; + public event PlayFabResultEvent OnGetPlayFabIDsFromGameCenterIDsResultEvent; + public event PlayFabRequestEvent OnGetPlayFabIDsFromGenericIDsRequestEvent; + public event PlayFabResultEvent OnGetPlayFabIDsFromGenericIDsResultEvent; + public event PlayFabRequestEvent OnGetPlayFabIDsFromGoogleIDsRequestEvent; + public event PlayFabResultEvent OnGetPlayFabIDsFromGoogleIDsResultEvent; + public event PlayFabRequestEvent OnGetPlayFabIDsFromGooglePlayGamesPlayerIDsRequestEvent; + public event PlayFabResultEvent OnGetPlayFabIDsFromGooglePlayGamesPlayerIDsResultEvent; + public event PlayFabRequestEvent OnGetPlayFabIDsFromKongregateIDsRequestEvent; + public event PlayFabResultEvent OnGetPlayFabIDsFromKongregateIDsResultEvent; + public event PlayFabRequestEvent OnGetPlayFabIDsFromNintendoServiceAccountIdsRequestEvent; + public event PlayFabResultEvent OnGetPlayFabIDsFromNintendoServiceAccountIdsResultEvent; + public event PlayFabRequestEvent OnGetPlayFabIDsFromNintendoSwitchDeviceIdsRequestEvent; + public event PlayFabResultEvent OnGetPlayFabIDsFromNintendoSwitchDeviceIdsResultEvent; + public event PlayFabRequestEvent OnGetPlayFabIDsFromPSNAccountIDsRequestEvent; + public event PlayFabResultEvent OnGetPlayFabIDsFromPSNAccountIDsResultEvent; + public event PlayFabRequestEvent OnGetPlayFabIDsFromPSNOnlineIDsRequestEvent; + public event PlayFabResultEvent OnGetPlayFabIDsFromPSNOnlineIDsResultEvent; + public event PlayFabRequestEvent OnGetPlayFabIDsFromSteamIDsRequestEvent; + public event PlayFabResultEvent OnGetPlayFabIDsFromSteamIDsResultEvent; + public event PlayFabRequestEvent OnGetPlayFabIDsFromTwitchIDsRequestEvent; + public event PlayFabResultEvent OnGetPlayFabIDsFromTwitchIDsResultEvent; + public event PlayFabRequestEvent OnGetPlayFabIDsFromXboxLiveIDsRequestEvent; + public event PlayFabResultEvent OnGetPlayFabIDsFromXboxLiveIDsResultEvent; + public event PlayFabRequestEvent OnGetPublisherDataRequestEvent; + public event PlayFabResultEvent OnGetPublisherDataResultEvent; + public event PlayFabRequestEvent OnGetPurchaseRequestEvent; + public event PlayFabResultEvent OnGetPurchaseResultEvent; + public event PlayFabRequestEvent OnGetSharedGroupDataRequestEvent; + public event PlayFabResultEvent OnGetSharedGroupDataResultEvent; + public event PlayFabRequestEvent OnGetStoreItemsRequestEvent; + public event PlayFabResultEvent OnGetStoreItemsResultEvent; + public event PlayFabRequestEvent OnGetTimeRequestEvent; + public event PlayFabResultEvent OnGetTimeResultEvent; + public event PlayFabRequestEvent OnGetTitleDataRequestEvent; + public event PlayFabResultEvent OnGetTitleDataResultEvent; + public event PlayFabRequestEvent OnGetTitleNewsRequestEvent; + public event PlayFabResultEvent OnGetTitleNewsResultEvent; + public event PlayFabRequestEvent OnGetTitlePublicKeyRequestEvent; + public event PlayFabResultEvent OnGetTitlePublicKeyResultEvent; + public event PlayFabRequestEvent OnGetTradeStatusRequestEvent; + public event PlayFabResultEvent OnGetTradeStatusResultEvent; + public event PlayFabRequestEvent OnGetUserDataRequestEvent; + public event PlayFabResultEvent OnGetUserDataResultEvent; + public event PlayFabRequestEvent OnGetUserInventoryRequestEvent; + public event PlayFabResultEvent OnGetUserInventoryResultEvent; + public event PlayFabRequestEvent OnGetUserPublisherDataRequestEvent; + public event PlayFabResultEvent OnGetUserPublisherDataResultEvent; + public event PlayFabRequestEvent OnGetUserPublisherReadOnlyDataRequestEvent; + public event PlayFabResultEvent OnGetUserPublisherReadOnlyDataResultEvent; + public event PlayFabRequestEvent OnGetUserReadOnlyDataRequestEvent; + public event PlayFabResultEvent OnGetUserReadOnlyDataResultEvent; + public event PlayFabRequestEvent OnGrantCharacterToUserRequestEvent; + public event PlayFabResultEvent OnGrantCharacterToUserResultEvent; + public event PlayFabRequestEvent OnLinkAndroidDeviceIDRequestEvent; + public event PlayFabResultEvent OnLinkAndroidDeviceIDResultEvent; + public event PlayFabRequestEvent OnLinkAppleRequestEvent; + public event PlayFabResultEvent OnLinkAppleResultEvent; + public event PlayFabRequestEvent OnLinkCustomIDRequestEvent; + public event PlayFabResultEvent OnLinkCustomIDResultEvent; + public event PlayFabRequestEvent OnLinkFacebookAccountRequestEvent; + public event PlayFabResultEvent OnLinkFacebookAccountResultEvent; + public event PlayFabRequestEvent OnLinkFacebookInstantGamesIdRequestEvent; + public event PlayFabResultEvent OnLinkFacebookInstantGamesIdResultEvent; + public event PlayFabRequestEvent OnLinkGameCenterAccountRequestEvent; + public event PlayFabResultEvent OnLinkGameCenterAccountResultEvent; + public event PlayFabRequestEvent OnLinkGoogleAccountRequestEvent; + public event PlayFabResultEvent OnLinkGoogleAccountResultEvent; + public event PlayFabRequestEvent OnLinkGooglePlayGamesServicesAccountRequestEvent; + public event PlayFabResultEvent OnLinkGooglePlayGamesServicesAccountResultEvent; + public event PlayFabRequestEvent OnLinkIOSDeviceIDRequestEvent; + public event PlayFabResultEvent OnLinkIOSDeviceIDResultEvent; + public event PlayFabRequestEvent OnLinkKongregateRequestEvent; + public event PlayFabResultEvent OnLinkKongregateResultEvent; + public event PlayFabRequestEvent OnLinkNintendoServiceAccountRequestEvent; + public event PlayFabResultEvent OnLinkNintendoServiceAccountResultEvent; + public event PlayFabRequestEvent OnLinkNintendoSwitchDeviceIdRequestEvent; + public event PlayFabResultEvent OnLinkNintendoSwitchDeviceIdResultEvent; + public event PlayFabRequestEvent OnLinkOpenIdConnectRequestEvent; + public event PlayFabResultEvent OnLinkOpenIdConnectResultEvent; + public event PlayFabRequestEvent OnLinkPSNAccountRequestEvent; + public event PlayFabResultEvent OnLinkPSNAccountResultEvent; + public event PlayFabRequestEvent OnLinkSteamAccountRequestEvent; + public event PlayFabResultEvent OnLinkSteamAccountResultEvent; + public event PlayFabRequestEvent OnLinkTwitchRequestEvent; + public event PlayFabResultEvent OnLinkTwitchResultEvent; + public event PlayFabRequestEvent OnLinkXboxAccountRequestEvent; + public event PlayFabResultEvent OnLinkXboxAccountResultEvent; + public event PlayFabRequestEvent OnLoginWithAndroidDeviceIDRequestEvent; + public event PlayFabRequestEvent OnLoginWithAppleRequestEvent; + public event PlayFabRequestEvent OnLoginWithCustomIDRequestEvent; + public event PlayFabRequestEvent OnLoginWithEmailAddressRequestEvent; + public event PlayFabRequestEvent OnLoginWithFacebookRequestEvent; + public event PlayFabRequestEvent OnLoginWithFacebookInstantGamesIdRequestEvent; + public event PlayFabRequestEvent OnLoginWithGameCenterRequestEvent; + public event PlayFabRequestEvent OnLoginWithGoogleAccountRequestEvent; + public event PlayFabRequestEvent OnLoginWithGooglePlayGamesServicesRequestEvent; + public event PlayFabRequestEvent OnLoginWithIOSDeviceIDRequestEvent; + public event PlayFabRequestEvent OnLoginWithKongregateRequestEvent; + public event PlayFabRequestEvent OnLoginWithNintendoServiceAccountRequestEvent; + public event PlayFabRequestEvent OnLoginWithNintendoSwitchDeviceIdRequestEvent; + public event PlayFabRequestEvent OnLoginWithOpenIdConnectRequestEvent; + public event PlayFabRequestEvent OnLoginWithPlayFabRequestEvent; + public event PlayFabRequestEvent OnLoginWithPSNRequestEvent; + public event PlayFabRequestEvent OnLoginWithSteamRequestEvent; + public event PlayFabRequestEvent OnLoginWithTwitchRequestEvent; + public event PlayFabRequestEvent OnLoginWithXboxRequestEvent; + public event PlayFabRequestEvent OnOpenTradeRequestEvent; + public event PlayFabResultEvent OnOpenTradeResultEvent; + public event PlayFabRequestEvent OnPayForPurchaseRequestEvent; + public event PlayFabResultEvent OnPayForPurchaseResultEvent; + public event PlayFabRequestEvent OnPurchaseItemRequestEvent; + public event PlayFabResultEvent OnPurchaseItemResultEvent; + public event PlayFabRequestEvent OnRedeemCouponRequestEvent; + public event PlayFabResultEvent OnRedeemCouponResultEvent; + public event PlayFabRequestEvent OnRefreshPSNAuthTokenRequestEvent; + public event PlayFabResultEvent OnRefreshPSNAuthTokenResultEvent; + public event PlayFabRequestEvent OnRegisterForIOSPushNotificationRequestEvent; + public event PlayFabResultEvent OnRegisterForIOSPushNotificationResultEvent; + public event PlayFabRequestEvent OnRegisterPlayFabUserRequestEvent; + public event PlayFabResultEvent OnRegisterPlayFabUserResultEvent; + public event PlayFabRequestEvent OnRemoveContactEmailRequestEvent; + public event PlayFabResultEvent OnRemoveContactEmailResultEvent; + public event PlayFabRequestEvent OnRemoveFriendRequestEvent; + public event PlayFabResultEvent OnRemoveFriendResultEvent; + public event PlayFabRequestEvent OnRemoveGenericIDRequestEvent; + public event PlayFabResultEvent OnRemoveGenericIDResultEvent; + public event PlayFabRequestEvent OnRemoveSharedGroupMembersRequestEvent; + public event PlayFabResultEvent OnRemoveSharedGroupMembersResultEvent; + public event PlayFabRequestEvent OnReportAdActivityRequestEvent; + public event PlayFabResultEvent OnReportAdActivityResultEvent; + public event PlayFabRequestEvent OnReportDeviceInfoRequestEvent; + public event PlayFabResultEvent OnReportDeviceInfoResultEvent; + public event PlayFabRequestEvent OnReportPlayerRequestEvent; + public event PlayFabResultEvent OnReportPlayerResultEvent; + public event PlayFabRequestEvent OnRestoreIOSPurchasesRequestEvent; + public event PlayFabResultEvent OnRestoreIOSPurchasesResultEvent; + public event PlayFabRequestEvent OnRewardAdActivityRequestEvent; + public event PlayFabResultEvent OnRewardAdActivityResultEvent; + public event PlayFabRequestEvent OnSendAccountRecoveryEmailRequestEvent; + public event PlayFabResultEvent OnSendAccountRecoveryEmailResultEvent; + public event PlayFabRequestEvent OnSetFriendTagsRequestEvent; + public event PlayFabResultEvent OnSetFriendTagsResultEvent; + public event PlayFabRequestEvent OnSetPlayerSecretRequestEvent; + public event PlayFabResultEvent OnSetPlayerSecretResultEvent; + public event PlayFabRequestEvent OnStartPurchaseRequestEvent; + public event PlayFabResultEvent OnStartPurchaseResultEvent; + public event PlayFabRequestEvent OnSubtractUserVirtualCurrencyRequestEvent; + public event PlayFabResultEvent OnSubtractUserVirtualCurrencyResultEvent; + public event PlayFabRequestEvent OnUnlinkAndroidDeviceIDRequestEvent; + public event PlayFabResultEvent OnUnlinkAndroidDeviceIDResultEvent; + public event PlayFabRequestEvent OnUnlinkAppleRequestEvent; + public event PlayFabResultEvent OnUnlinkAppleResultEvent; + public event PlayFabRequestEvent OnUnlinkCustomIDRequestEvent; + public event PlayFabResultEvent OnUnlinkCustomIDResultEvent; + public event PlayFabRequestEvent OnUnlinkFacebookAccountRequestEvent; + public event PlayFabResultEvent OnUnlinkFacebookAccountResultEvent; + public event PlayFabRequestEvent OnUnlinkFacebookInstantGamesIdRequestEvent; + public event PlayFabResultEvent OnUnlinkFacebookInstantGamesIdResultEvent; + public event PlayFabRequestEvent OnUnlinkGameCenterAccountRequestEvent; + public event PlayFabResultEvent OnUnlinkGameCenterAccountResultEvent; + public event PlayFabRequestEvent OnUnlinkGoogleAccountRequestEvent; + public event PlayFabResultEvent OnUnlinkGoogleAccountResultEvent; + public event PlayFabRequestEvent OnUnlinkGooglePlayGamesServicesAccountRequestEvent; + public event PlayFabResultEvent OnUnlinkGooglePlayGamesServicesAccountResultEvent; + public event PlayFabRequestEvent OnUnlinkIOSDeviceIDRequestEvent; + public event PlayFabResultEvent OnUnlinkIOSDeviceIDResultEvent; + public event PlayFabRequestEvent OnUnlinkKongregateRequestEvent; + public event PlayFabResultEvent OnUnlinkKongregateResultEvent; + public event PlayFabRequestEvent OnUnlinkNintendoServiceAccountRequestEvent; + public event PlayFabResultEvent OnUnlinkNintendoServiceAccountResultEvent; + public event PlayFabRequestEvent OnUnlinkNintendoSwitchDeviceIdRequestEvent; + public event PlayFabResultEvent OnUnlinkNintendoSwitchDeviceIdResultEvent; + public event PlayFabRequestEvent OnUnlinkOpenIdConnectRequestEvent; + public event PlayFabResultEvent OnUnlinkOpenIdConnectResultEvent; + public event PlayFabRequestEvent OnUnlinkPSNAccountRequestEvent; + public event PlayFabResultEvent OnUnlinkPSNAccountResultEvent; + public event PlayFabRequestEvent OnUnlinkSteamAccountRequestEvent; + public event PlayFabResultEvent OnUnlinkSteamAccountResultEvent; + public event PlayFabRequestEvent OnUnlinkTwitchRequestEvent; + public event PlayFabResultEvent OnUnlinkTwitchResultEvent; + public event PlayFabRequestEvent OnUnlinkXboxAccountRequestEvent; + public event PlayFabResultEvent OnUnlinkXboxAccountResultEvent; + public event PlayFabRequestEvent OnUnlockContainerInstanceRequestEvent; + public event PlayFabResultEvent OnUnlockContainerInstanceResultEvent; + public event PlayFabRequestEvent OnUnlockContainerItemRequestEvent; + public event PlayFabResultEvent OnUnlockContainerItemResultEvent; + public event PlayFabRequestEvent OnUpdateAvatarUrlRequestEvent; + public event PlayFabResultEvent OnUpdateAvatarUrlResultEvent; + public event PlayFabRequestEvent OnUpdateCharacterDataRequestEvent; + public event PlayFabResultEvent OnUpdateCharacterDataResultEvent; + public event PlayFabRequestEvent OnUpdateCharacterStatisticsRequestEvent; + public event PlayFabResultEvent OnUpdateCharacterStatisticsResultEvent; + public event PlayFabRequestEvent OnUpdatePlayerStatisticsRequestEvent; + public event PlayFabResultEvent OnUpdatePlayerStatisticsResultEvent; + public event PlayFabRequestEvent OnUpdateSharedGroupDataRequestEvent; + public event PlayFabResultEvent OnUpdateSharedGroupDataResultEvent; + public event PlayFabRequestEvent OnUpdateUserDataRequestEvent; + public event PlayFabResultEvent OnUpdateUserDataResultEvent; + public event PlayFabRequestEvent OnUpdateUserPublisherDataRequestEvent; + public event PlayFabResultEvent OnUpdateUserPublisherDataResultEvent; + public event PlayFabRequestEvent OnUpdateUserTitleDisplayNameRequestEvent; + public event PlayFabResultEvent OnUpdateUserTitleDisplayNameResultEvent; + public event PlayFabRequestEvent OnValidateAmazonIAPReceiptRequestEvent; + public event PlayFabResultEvent OnValidateAmazonIAPReceiptResultEvent; + public event PlayFabRequestEvent OnValidateGooglePlayPurchaseRequestEvent; + public event PlayFabResultEvent OnValidateGooglePlayPurchaseResultEvent; + public event PlayFabRequestEvent OnValidateIOSReceiptRequestEvent; + public event PlayFabResultEvent OnValidateIOSReceiptResultEvent; + public event PlayFabRequestEvent OnValidateWindowsStoreReceiptRequestEvent; + public event PlayFabResultEvent OnValidateWindowsStoreReceiptResultEvent; + public event PlayFabRequestEvent OnWriteCharacterEventRequestEvent; + public event PlayFabResultEvent OnWriteCharacterEventResultEvent; + public event PlayFabRequestEvent OnWritePlayerEventRequestEvent; + public event PlayFabResultEvent OnWritePlayerEventResultEvent; + public event PlayFabRequestEvent OnWriteTitleEventRequestEvent; + public event PlayFabResultEvent OnWriteTitleEventResultEvent; + } +} +#endif diff --git a/Assets/PlayFabSDK/Client/PlayFabEvents.cs.meta b/Assets/PlayFabSDK/Client/PlayFabEvents.cs.meta new file mode 100644 index 00000000..e06d2d97 --- /dev/null +++ b/Assets/PlayFabSDK/Client/PlayFabEvents.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: da33df462ae2fa04cb401398dc2b8a5d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/CloudScript.meta b/Assets/PlayFabSDK/CloudScript.meta new file mode 100644 index 00000000..2771afe9 --- /dev/null +++ b/Assets/PlayFabSDK/CloudScript.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: dfbd6b5349ba24e4aa6a1ebc5bdfd11d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/CloudScript/PlayFabCloudScriptAPI.cs b/Assets/PlayFabSDK/CloudScript/PlayFabCloudScriptAPI.cs new file mode 100644 index 00000000..d5c2bd35 --- /dev/null +++ b/Assets/PlayFabSDK/CloudScript/PlayFabCloudScriptAPI.cs @@ -0,0 +1,244 @@ +#if !DISABLE_PLAYFABENTITY_API && !DISABLE_PLAYFAB_STATIC_API + +using System; +using System.Collections.Generic; +using PlayFab.CloudScriptModels; +using PlayFab.Internal; + +namespace PlayFab +{ + /// + /// API methods for executing CloudScript using an Entity Profile + /// + public static class PlayFabCloudScriptAPI + { + static PlayFabCloudScriptAPI() {} + + + /// + /// Verify entity login. + /// + public static bool IsEntityLoggedIn() + { + return PlayFabSettings.staticPlayer.IsEntityLoggedIn(); + } + + /// + /// Clear the Client SessionToken which allows this Client to call API calls requiring login. + /// A new/fresh login will be required after calling this. + /// + public static void ForgetAllCredentials() + { + PlayFabSettings.staticPlayer.ForgetAllCredentials(); + } + + /// + /// Cloud Script is one of PlayFab's most versatile features. It allows client code to request execution of any kind of + /// custom server-side functionality you can implement, and it can be used in conjunction with virtually anything. + /// + public static void ExecuteEntityCloudScript(ExecuteEntityCloudScriptRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/CloudScript/ExecuteEntityCloudScript", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Cloud Script is one of PlayFab's most versatile features. It allows client code to request execution of any kind of + /// custom server-side functionality you can implement, and it can be used in conjunction with virtually anything. + /// + public static void ExecuteFunction(ExecuteFunctionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + var localApiServerString = PlayFabSettings.LocalApiServer; + if (!string.IsNullOrEmpty(localApiServerString)) + { + var baseUri = new Uri(localApiServerString); + var fullUri = new Uri(baseUri, "/CloudScript/ExecuteFunction".TrimStart('/')); + PlayFabHttp.MakeApiCallWithFullUri(fullUri.AbsoluteUri, request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + return; + } + + PlayFabHttp.MakeApiCall("/CloudScript/ExecuteFunction", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets registered Azure Functions for a given title id and function name. + /// + public static void GetFunction(GetFunctionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/CloudScript/GetFunction", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Lists all currently registered Event Hub triggered Azure Functions for a given title. + /// + public static void ListEventHubFunctions(ListFunctionsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/CloudScript/ListEventHubFunctions", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Lists all currently registered Azure Functions for a given title. + /// + public static void ListFunctions(ListFunctionsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/CloudScript/ListFunctions", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Lists all currently registered HTTP triggered Azure Functions for a given title. + /// + public static void ListHttpFunctions(ListFunctionsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/CloudScript/ListHttpFunctions", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Lists all currently registered Queue triggered Azure Functions for a given title. + /// + public static void ListQueuedFunctions(ListFunctionsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/CloudScript/ListQueuedFunctions", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Generate an entity PlayStream event for the provided function result. + /// + public static void PostFunctionResultForEntityTriggeredAction(PostFunctionResultForEntityTriggeredActionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/CloudScript/PostFunctionResultForEntityTriggeredAction", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Generate an entity PlayStream event for the provided function result. + /// + public static void PostFunctionResultForFunctionExecution(PostFunctionResultForFunctionExecutionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/CloudScript/PostFunctionResultForFunctionExecution", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Generate a player PlayStream event for the provided function result. + /// + public static void PostFunctionResultForPlayerTriggeredAction(PostFunctionResultForPlayerTriggeredActionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/CloudScript/PostFunctionResultForPlayerTriggeredAction", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Generate a PlayStream event for the provided function result. + /// + public static void PostFunctionResultForScheduledTask(PostFunctionResultForScheduledTaskRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/CloudScript/PostFunctionResultForScheduledTask", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Registers an event hub triggered Azure Function with a title. + /// + public static void RegisterEventHubFunction(RegisterEventHubFunctionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/CloudScript/RegisterEventHubFunction", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Registers an HTTP triggered Azure function with a title. + /// + public static void RegisterHttpFunction(RegisterHttpFunctionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/CloudScript/RegisterHttpFunction", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Registers a queue triggered Azure Function with a title. + /// + public static void RegisterQueuedFunction(RegisterQueuedFunctionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/CloudScript/RegisterQueuedFunction", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Unregisters an Azure Function with a title. + /// + public static void UnregisterFunction(UnregisterFunctionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/CloudScript/UnregisterFunction", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + + } +} + +#endif diff --git a/Assets/PlayFabSDK/CloudScript/PlayFabCloudScriptAPI.cs.meta b/Assets/PlayFabSDK/CloudScript/PlayFabCloudScriptAPI.cs.meta new file mode 100644 index 00000000..833b2998 --- /dev/null +++ b/Assets/PlayFabSDK/CloudScript/PlayFabCloudScriptAPI.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e9b8ec61c6ab7d2438b7b65a4dd9ef59 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/CloudScript/PlayFabCloudScriptInstanceAPI.cs b/Assets/PlayFabSDK/CloudScript/PlayFabCloudScriptInstanceAPI.cs new file mode 100644 index 00000000..5025b801 --- /dev/null +++ b/Assets/PlayFabSDK/CloudScript/PlayFabCloudScriptInstanceAPI.cs @@ -0,0 +1,224 @@ +#if !DISABLE_PLAYFABENTITY_API + +using System; +using System.Collections.Generic; +using PlayFab.CloudScriptModels; +using PlayFab.Internal; +using PlayFab.SharedModels; + +namespace PlayFab +{ + /// + /// API methods for executing CloudScript using an Entity Profile + /// + public class PlayFabCloudScriptInstanceAPI : IPlayFabInstanceApi + { + public readonly PlayFabApiSettings apiSettings = null; + public readonly PlayFabAuthenticationContext authenticationContext = null; + + public PlayFabCloudScriptInstanceAPI(PlayFabAuthenticationContext context) + { + if (context == null) + throw new PlayFabException(PlayFabExceptionCode.AuthContextRequired, "Context cannot be null, create a PlayFabAuthenticationContext for each player in advance, or call .GetAuthenticationContext()"); + authenticationContext = context; + } + + public PlayFabCloudScriptInstanceAPI(PlayFabApiSettings settings, PlayFabAuthenticationContext context) + { + if (context == null) + throw new PlayFabException(PlayFabExceptionCode.AuthContextRequired, "Context cannot be null, create a PlayFabAuthenticationContext for each player in advance, or call .GetAuthenticationContext()"); + apiSettings = settings; + authenticationContext = context; + } + + /// + /// Verify entity login. + /// + public bool IsEntityLoggedIn() + { + return authenticationContext == null ? false : authenticationContext.IsEntityLoggedIn(); + } + + /// + /// Clear the Client SessionToken which allows this Client to call API calls requiring login. + /// A new/fresh login will be required after calling this. + /// + public void ForgetAllCredentials() + { + if (authenticationContext != null) + { + authenticationContext.ForgetAllCredentials(); + } + } + + /// + /// Cloud Script is one of PlayFab's most versatile features. It allows client code to request execution of any kind of + /// custom server-side functionality you can implement, and it can be used in conjunction with virtually anything. + /// + public void ExecuteEntityCloudScript(ExecuteEntityCloudScriptRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/CloudScript/ExecuteEntityCloudScript", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Cloud Script is one of PlayFab's most versatile features. It allows client code to request execution of any kind of + /// custom server-side functionality you can implement, and it can be used in conjunction with virtually anything. + /// + public void ExecuteFunction(ExecuteFunctionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/CloudScript/ExecuteFunction", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets registered Azure Functions for a given title id and function name. + /// + public void GetFunction(GetFunctionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/CloudScript/GetFunction", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Lists all currently registered Event Hub triggered Azure Functions for a given title. + /// + public void ListEventHubFunctions(ListFunctionsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/CloudScript/ListEventHubFunctions", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Lists all currently registered Azure Functions for a given title. + /// + public void ListFunctions(ListFunctionsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/CloudScript/ListFunctions", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Lists all currently registered HTTP triggered Azure Functions for a given title. + /// + public void ListHttpFunctions(ListFunctionsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/CloudScript/ListHttpFunctions", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Lists all currently registered Queue triggered Azure Functions for a given title. + /// + public void ListQueuedFunctions(ListFunctionsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/CloudScript/ListQueuedFunctions", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Generate an entity PlayStream event for the provided function result. + /// + public void PostFunctionResultForEntityTriggeredAction(PostFunctionResultForEntityTriggeredActionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/CloudScript/PostFunctionResultForEntityTriggeredAction", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Generate an entity PlayStream event for the provided function result. + /// + public void PostFunctionResultForFunctionExecution(PostFunctionResultForFunctionExecutionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/CloudScript/PostFunctionResultForFunctionExecution", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Generate a player PlayStream event for the provided function result. + /// + public void PostFunctionResultForPlayerTriggeredAction(PostFunctionResultForPlayerTriggeredActionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/CloudScript/PostFunctionResultForPlayerTriggeredAction", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Generate a PlayStream event for the provided function result. + /// + public void PostFunctionResultForScheduledTask(PostFunctionResultForScheduledTaskRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/CloudScript/PostFunctionResultForScheduledTask", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Registers an event hub triggered Azure Function with a title. + /// + public void RegisterEventHubFunction(RegisterEventHubFunctionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/CloudScript/RegisterEventHubFunction", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Registers an HTTP triggered Azure function with a title. + /// + public void RegisterHttpFunction(RegisterHttpFunctionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/CloudScript/RegisterHttpFunction", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Registers a queue triggered Azure Function with a title. + /// + public void RegisterQueuedFunction(RegisterQueuedFunctionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/CloudScript/RegisterQueuedFunction", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Unregisters an Azure Function with a title. + /// + public void UnregisterFunction(UnregisterFunctionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/CloudScript/UnregisterFunction", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + } +} + +#endif diff --git a/Assets/PlayFabSDK/CloudScript/PlayFabCloudScriptInstanceAPI.cs.meta b/Assets/PlayFabSDK/CloudScript/PlayFabCloudScriptInstanceAPI.cs.meta new file mode 100644 index 00000000..e8e15c2f --- /dev/null +++ b/Assets/PlayFabSDK/CloudScript/PlayFabCloudScriptInstanceAPI.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ac313c777a2b7054e9632c96829e1f7d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/CloudScript/PlayFabCloudScriptModels.cs b/Assets/PlayFabSDK/CloudScript/PlayFabCloudScriptModels.cs new file mode 100644 index 00000000..1eab23cc --- /dev/null +++ b/Assets/PlayFabSDK/CloudScript/PlayFabCloudScriptModels.cs @@ -0,0 +1,1186 @@ +#if !DISABLE_PLAYFABENTITY_API +using System; +using System.Collections.Generic; +using PlayFab.SharedModels; + +namespace PlayFab.CloudScriptModels +{ + [Serializable] + public class AdCampaignAttributionModel : PlayFabBaseModel + { + /// + /// UTC time stamp of attribution + /// + public DateTime AttributedAt; + /// + /// Attribution campaign identifier + /// + public string CampaignId; + /// + /// Attribution network name + /// + public string Platform; + } + + public enum CloudScriptRevisionOption + { + Live, + Latest, + Specific + } + + [Serializable] + public class ContactEmailInfoModel : PlayFabBaseModel + { + /// + /// The email address + /// + public string EmailAddress; + /// + /// The name of the email info data + /// + public string Name; + /// + /// The verification status of the email + /// + public EmailVerificationStatus? VerificationStatus; + } + + public enum ContinentCode + { + AF, + AN, + AS, + EU, + NA, + OC, + SA, + Unknown + } + + public enum CountryCode + { + AF, + AX, + AL, + DZ, + AS, + AD, + AO, + AI, + AQ, + AG, + AR, + AM, + AW, + AU, + AT, + AZ, + BS, + BH, + BD, + BB, + BY, + BE, + BZ, + BJ, + BM, + BT, + BO, + BQ, + BA, + BW, + BV, + BR, + IO, + BN, + BG, + BF, + BI, + KH, + CM, + CA, + CV, + KY, + CF, + TD, + CL, + CN, + CX, + CC, + CO, + KM, + CG, + CD, + CK, + CR, + CI, + HR, + CU, + CW, + CY, + CZ, + DK, + DJ, + DM, + DO, + EC, + EG, + SV, + GQ, + ER, + EE, + ET, + FK, + FO, + FJ, + FI, + FR, + GF, + PF, + TF, + GA, + GM, + GE, + DE, + GH, + GI, + GR, + GL, + GD, + GP, + GU, + GT, + GG, + GN, + GW, + GY, + HT, + HM, + VA, + HN, + HK, + HU, + IS, + IN, + ID, + IR, + IQ, + IE, + IM, + IL, + IT, + JM, + JP, + JE, + JO, + KZ, + KE, + KI, + KP, + KR, + KW, + KG, + LA, + LV, + LB, + LS, + LR, + LY, + LI, + LT, + LU, + MO, + MK, + MG, + MW, + MY, + MV, + ML, + MT, + MH, + MQ, + MR, + MU, + YT, + MX, + FM, + MD, + MC, + MN, + ME, + MS, + MA, + MZ, + MM, + NA, + NR, + NP, + NL, + NC, + NZ, + NI, + NE, + NG, + NU, + NF, + MP, + NO, + OM, + PK, + PW, + PS, + PA, + PG, + PY, + PE, + PH, + PN, + PL, + PT, + PR, + QA, + RE, + RO, + RU, + RW, + BL, + SH, + KN, + LC, + MF, + PM, + VC, + WS, + SM, + ST, + SA, + SN, + RS, + SC, + SL, + SG, + SX, + SK, + SI, + SB, + SO, + ZA, + GS, + SS, + ES, + LK, + SD, + SR, + SJ, + SZ, + SE, + CH, + SY, + TW, + TJ, + TZ, + TH, + TL, + TG, + TK, + TO, + TT, + TN, + TR, + TM, + TC, + TV, + UG, + UA, + AE, + GB, + US, + UM, + UY, + UZ, + VU, + VE, + VN, + VG, + VI, + WF, + EH, + YE, + ZM, + ZW, + Unknown + } + + public enum EmailVerificationStatus + { + Unverified, + Pending, + Confirmed + } + + [Serializable] + public class EmptyResult : PlayFabResultCommon + { + } + + /// + /// Combined entity type and ID structure which uniquely identifies a single entity. + /// + [Serializable] + public class EntityKey : PlayFabBaseModel + { + /// + /// Unique ID of the entity. + /// + public string Id; + /// + /// Entity type. See https://docs.microsoft.com/gaming/playfab/features/data/entities/available-built-in-entity-types + /// + public string Type; + } + + [Serializable] + public class EventHubFunctionModel : PlayFabBaseModel + { + /// + /// The connection string for the event hub. + /// + public string ConnectionString; + /// + /// The name of the event hub that triggers the Azure Function. + /// + public string EventHubName; + /// + /// The name the function was registered under. + /// + public string FunctionName; + } + + [Serializable] + public class ExecuteCloudScriptResult : PlayFabResultCommon + { + /// + /// Number of PlayFab API requests issued by the CloudScript function + /// + public int APIRequestsIssued; + /// + /// Information about the error, if any, that occurred during execution + /// + public ScriptExecutionError Error; + public double ExecutionTimeSeconds; + /// + /// The name of the function that executed + /// + public string FunctionName; + /// + /// The object returned from the CloudScript function, if any + /// + public object FunctionResult; + /// + /// Flag indicating if the FunctionResult was too large and was subsequently dropped from this event. This only occurs if + /// the total event size is larger than 350KB. + /// + public bool? FunctionResultTooLarge; + /// + /// Number of external HTTP requests issued by the CloudScript function + /// + public int HttpRequestsIssued; + /// + /// Entries logged during the function execution. These include both entries logged in the function code using log.info() + /// and log.error() and error entries for API and HTTP request failures. + /// + public List Logs; + /// + /// Flag indicating if the logs were too large and were subsequently dropped from this event. This only occurs if the total + /// event size is larger than 350KB after the FunctionResult was removed. + /// + public bool? LogsTooLarge; + public uint MemoryConsumedBytes; + /// + /// Processor time consumed while executing the function. This does not include time spent waiting on API calls or HTTP + /// requests. + /// + public double ProcessorTimeSeconds; + /// + /// The revision of the CloudScript that executed + /// + public int Revision; + } + + /// + /// Executes CloudScript with the entity profile that is defined in the request. + /// + [Serializable] + public class ExecuteEntityCloudScriptRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The optional entity to perform this action on. Defaults to the currently logged in entity. + /// + public EntityKey Entity; + /// + /// The name of the CloudScript function to execute + /// + public string FunctionName; + /// + /// Object that is passed in to the function as the first argument + /// + public object FunctionParameter; + /// + /// Generate a 'entity_executed_cloudscript' PlayStream event containing the results of the function execution and other + /// contextual information. This event will show up in the PlayStream debugger console for the player in Game Manager. + /// + public bool? GeneratePlayStreamEvent; + /// + /// Option for which revision of the CloudScript to execute. 'Latest' executes the most recently created revision, 'Live' + /// executes the current live, published revision, and 'Specific' executes the specified revision. The default value is + /// 'Specific', if the SpecificRevision parameter is specified, otherwise it is 'Live'. + /// + public CloudScriptRevisionOption? RevisionSelection; + /// + /// The specific revision to execute, when RevisionSelection is set to 'Specific' + /// + public int? SpecificRevision; + } + + /// + /// Executes an Azure Function with the profile of the entity that is defined in the request. + /// + [Serializable] + public class ExecuteFunctionRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The optional entity to perform this action on. Defaults to the currently logged in entity. + /// + public EntityKey Entity; + /// + /// The name of the CloudScript function to execute + /// + public string FunctionName; + /// + /// Object that is passed in to the function as the FunctionArgument field of the FunctionExecutionContext data structure + /// + public object FunctionParameter; + /// + /// Generate a 'entity_executed_cloudscript_function' PlayStream event containing the results of the function execution and + /// other contextual information. This event will show up in the PlayStream debugger console for the player in Game Manager. + /// + public bool? GeneratePlayStreamEvent; + } + + [Serializable] + public class ExecuteFunctionResult : PlayFabResultCommon + { + /// + /// Error from the CloudScript Azure Function. + /// + public FunctionExecutionError Error; + /// + /// The amount of time the function took to execute + /// + public int ExecutionTimeMilliseconds; + /// + /// The name of the function that executed + /// + public string FunctionName; + /// + /// The object returned from the function, if any + /// + public object FunctionResult; + /// + /// Flag indicating if the FunctionResult was too large and was subsequently dropped from this event. + /// + public bool? FunctionResultTooLarge; + } + + [Serializable] + public class FunctionExecutionError : PlayFabBaseModel + { + /// + /// Error code, such as CloudScriptAzureFunctionsExecutionTimeLimitExceeded, CloudScriptAzureFunctionsArgumentSizeExceeded, + /// CloudScriptAzureFunctionsReturnSizeExceeded or CloudScriptAzureFunctionsHTTPRequestError + /// + public string Error; + /// + /// Details about the error + /// + public string Message; + /// + /// Point during the execution of the function at which the error occurred, if any + /// + public string StackTrace; + } + + [Serializable] + public class FunctionModel : PlayFabBaseModel + { + /// + /// The address of the function. + /// + public string FunctionAddress; + /// + /// The name the function was registered under. + /// + public string FunctionName; + /// + /// The trigger type for the function. + /// + public string TriggerType; + } + + [Serializable] + public class GetFunctionRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The name of the function to register + /// + public string FunctionName; + } + + [Serializable] + public class GetFunctionResult : PlayFabResultCommon + { + /// + /// The connection string for the storage account containing the queue for a queue trigger Azure Function. + /// + public string ConnectionString; + /// + /// The URL to be invoked to execute an HTTP triggered function. + /// + public string FunctionUrl; + /// + /// The name of the queue for a queue trigger Azure Function. + /// + public string QueueName; + /// + /// The trigger type for the function. + /// + public string TriggerType; + } + + [Serializable] + public class HttpFunctionModel : PlayFabBaseModel + { + /// + /// The name the function was registered under. + /// + public string FunctionName; + /// + /// The URL of the function. + /// + public string FunctionUrl; + } + + [Serializable] + public class LinkedPlatformAccountModel : PlayFabBaseModel + { + /// + /// Linked account email of the user on the platform, if available + /// + public string Email; + /// + /// Authentication platform + /// + public LoginIdentityProvider? Platform; + /// + /// Unique account identifier of the user on the platform + /// + public string PlatformUserId; + /// + /// Linked account username of the user on the platform, if available + /// + public string Username; + } + + [Serializable] + public class ListEventHubFunctionsResult : PlayFabResultCommon + { + /// + /// The list of EventHub triggered functions that are currently registered for the title. + /// + public List Functions; + } + + /// + /// A title can have many functions, ListHttpFunctions will return a list of all the currently registered HTTP triggered + /// functions for a given title. + /// + [Serializable] + public class ListFunctionsRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + [Serializable] + public class ListFunctionsResult : PlayFabResultCommon + { + /// + /// The list of functions that are currently registered for the title. + /// + public List Functions; + } + + [Serializable] + public class ListHttpFunctionsResult : PlayFabResultCommon + { + /// + /// The list of HTTP triggered functions that are currently registered for the title. + /// + public List Functions; + } + + [Serializable] + public class ListQueuedFunctionsResult : PlayFabResultCommon + { + /// + /// The list of Queue triggered functions that are currently registered for the title. + /// + public List Functions; + } + + [Serializable] + public class LocationModel : PlayFabBaseModel + { + /// + /// City name. + /// + public string City; + /// + /// The two-character continent code for this location + /// + public ContinentCode? ContinentCode; + /// + /// The two-character ISO 3166-1 country code for the country associated with the location + /// + public CountryCode? CountryCode; + /// + /// Latitude coordinate of the geographic location. + /// + public double? Latitude; + /// + /// Longitude coordinate of the geographic location. + /// + public double? Longitude; + } + + public enum LoginIdentityProvider + { + Unknown, + PlayFab, + Custom, + GameCenter, + GooglePlay, + Steam, + XBoxLive, + PSN, + Kongregate, + Facebook, + IOSDevice, + AndroidDevice, + Twitch, + WindowsHello, + GameServer, + CustomServer, + NintendoSwitch, + FacebookInstantGames, + OpenIdConnect, + Apple, + NintendoSwitchAccount, + GooglePlayGames, + XboxMobileStore, + King + } + + [Serializable] + public class LogStatement : PlayFabBaseModel + { + /// + /// Optional object accompanying the message as contextual information + /// + public object Data; + /// + /// 'Debug', 'Info', or 'Error' + /// + public string Level; + public string Message; + } + + [Serializable] + public class MembershipModel : PlayFabBaseModel + { + /// + /// Whether this membership is active. That is, whether the MembershipExpiration time has been reached. + /// + public bool IsActive; + /// + /// The time this membership expires + /// + public DateTime MembershipExpiration; + /// + /// The id of the membership + /// + public string MembershipId; + /// + /// Membership expirations can be explicitly overridden (via game manager or the admin api). If this membership has been + /// overridden, this will be the new expiration time. + /// + public DateTime? OverrideExpiration; + /// + /// The list of subscriptions that this player has for this membership + /// + public List Subscriptions; + } + + /// + /// Identifier by either name or ID. Note that a name may change due to renaming, or reused after being deleted. ID is + /// immutable and unique. + /// + [Serializable] + public class NameIdentifier : PlayFabBaseModel + { + /// + /// Id Identifier, if present + /// + public string Id; + /// + /// Name Identifier, if present + /// + public string Name; + } + + [Serializable] + public class PlayerProfileModel : PlayFabBaseModel + { + /// + /// List of advertising campaigns the player has been attributed to + /// + public List AdCampaignAttributions; + /// + /// URL of the player's avatar image + /// + public string AvatarUrl; + /// + /// If the player is currently banned, the UTC Date when the ban expires + /// + public DateTime? BannedUntil; + /// + /// List of all contact email info associated with the player account + /// + public List ContactEmailAddresses; + /// + /// Player record created + /// + public DateTime? Created; + /// + /// Player display name + /// + public string DisplayName; + /// + /// List of experiment variants for the player. Note that these variants are not guaranteed to be up-to-date when returned + /// during login because the player profile is updated only after login. Instead, use the LoginResult.TreatmentAssignment + /// property during login to get the correct variants and variables. + /// + public List ExperimentVariants; + /// + /// UTC time when the player most recently logged in to the title + /// + public DateTime? LastLogin; + /// + /// List of all authentication systems linked to this player account + /// + public List LinkedAccounts; + /// + /// List of geographic locations from which the player has logged in to the title + /// + public List Locations; + /// + /// List of memberships for the player, along with whether are expired. + /// + public List Memberships; + /// + /// Player account origination + /// + public LoginIdentityProvider? Origination; + /// + /// PlayFab player account unique identifier + /// + public string PlayerId; + /// + /// Publisher this player belongs to + /// + public string PublisherId; + /// + /// List of configured end points registered for sending the player push notifications + /// + public List PushNotificationRegistrations; + /// + /// List of leaderboard statistic values for the player + /// + public List Statistics; + /// + /// List of player's tags for segmentation + /// + public List Tags; + /// + /// Title ID this player profile applies to + /// + public string TitleId; + /// + /// Sum of the player's purchases made with real-money currencies, converted to US dollars equivalent and represented as a + /// whole number of cents (1/100 USD). For example, 999 indicates nine dollars and ninety-nine cents. + /// + public uint? TotalValueToDateInUSD; + /// + /// List of the player's lifetime purchase totals, summed by real-money currency + /// + public List ValuesToDate; + } + + [Serializable] + public class PlayStreamEventEnvelopeModel : PlayFabBaseModel + { + /// + /// The ID of the entity the event is about. + /// + public string EntityId; + /// + /// The type of the entity the event is about. + /// + public string EntityType; + /// + /// Data specific to this event. + /// + public string EventData; + /// + /// The name of the event. + /// + public string EventName; + /// + /// The namespace of the event. + /// + public string EventNamespace; + /// + /// Settings for the event. + /// + public string EventSettings; + } + + [Serializable] + public class PostFunctionResultForEntityTriggeredActionRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// The result of the function execution. + /// + public ExecuteFunctionResult FunctionResult; + } + + [Serializable] + public class PostFunctionResultForFunctionExecutionRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// The result of the function execution. + /// + public ExecuteFunctionResult FunctionResult; + } + + [Serializable] + public class PostFunctionResultForPlayerTriggeredActionRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The result of the function execution. + /// + public ExecuteFunctionResult FunctionResult; + /// + /// The player profile the function was invoked with. + /// + public PlayerProfileModel PlayerProfile; + /// + /// The triggering PlayStream event, if any, that caused the function to be invoked. + /// + public PlayStreamEventEnvelopeModel PlayStreamEventEnvelope; + } + + [Serializable] + public class PostFunctionResultForScheduledTaskRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The result of the function execution + /// + public ExecuteFunctionResult FunctionResult; + /// + /// The id of the scheduled task that invoked the function. + /// + public NameIdentifier ScheduledTaskId; + } + + public enum PushNotificationPlatform + { + ApplePushNotificationService, + GoogleCloudMessaging + } + + [Serializable] + public class PushNotificationRegistrationModel : PlayFabBaseModel + { + /// + /// Notification configured endpoint + /// + public string NotificationEndpointARN; + /// + /// Push notification platform + /// + public PushNotificationPlatform? Platform; + } + + [Serializable] + public class QueuedFunctionModel : PlayFabBaseModel + { + /// + /// The connection string for the Azure Storage Account that hosts the queue. + /// + public string ConnectionString; + /// + /// The name the function was registered under. + /// + public string FunctionName; + /// + /// The name of the queue that triggers the Azure Function. + /// + public string QueueName; + } + + /// + /// A title can have many functions, RegisterEventHubFunction associates a function name with an event hub name and + /// connection string. + /// + [Serializable] + public class RegisterEventHubFunctionRequest : PlayFabRequestCommon + { + /// + /// A connection string for the namespace of the event hub for the Azure Function. + /// + public string ConnectionString; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The name of the event hub for the Azure Function. + /// + public string EventHubName; + /// + /// The name of the function to register + /// + public string FunctionName; + } + + [Serializable] + public class RegisterHttpFunctionRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The name of the function to register + /// + public string FunctionName; + /// + /// Full URL for Azure Function that implements the function. + /// + public string FunctionUrl; + } + + /// + /// A title can have many functions, RegisterQueuedFunction associates a function name with a queue name and connection + /// string. + /// + [Serializable] + public class RegisterQueuedFunctionRequest : PlayFabRequestCommon + { + /// + /// A connection string for the storage account that hosts the queue for the Azure Function. + /// + public string ConnectionString; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The name of the function to register + /// + public string FunctionName; + /// + /// The name of the queue for the Azure Function. + /// + public string QueueName; + } + + [Serializable] + public class ScriptExecutionError : PlayFabBaseModel + { + /// + /// Error code, such as CloudScriptNotFound, JavascriptException, CloudScriptFunctionArgumentSizeExceeded, + /// CloudScriptAPIRequestCountExceeded, CloudScriptAPIRequestError, or CloudScriptHTTPRequestError + /// + public string Error; + /// + /// Details about the error + /// + public string Message; + /// + /// Point during the execution of the script at which the error occurred, if any + /// + public string StackTrace; + } + + [Serializable] + public class StatisticModel : PlayFabBaseModel + { + /// + /// Statistic name + /// + public string Name; + /// + /// Statistic value + /// + public int Value; + /// + /// Statistic version (0 if not a versioned statistic) + /// + public int Version; + } + + [Serializable] + public class SubscriptionModel : PlayFabBaseModel + { + /// + /// When this subscription expires. + /// + public DateTime Expiration; + /// + /// The time the subscription was orignially purchased + /// + public DateTime InitialSubscriptionTime; + /// + /// Whether this subscription is currently active. That is, if Expiration > now. + /// + public bool IsActive; + /// + /// The status of this subscription, according to the subscription provider. + /// + public SubscriptionProviderStatus? Status; + /// + /// The id for this subscription + /// + public string SubscriptionId; + /// + /// The item id for this subscription from the primary catalog + /// + public string SubscriptionItemId; + /// + /// The provider for this subscription. Apple or Google Play are supported today. + /// + public string SubscriptionProvider; + } + + public enum SubscriptionProviderStatus + { + NoError, + Cancelled, + UnknownError, + BillingError, + ProductUnavailable, + CustomerDidNotAcceptPriceChange, + FreeTrial, + PaymentPending + } + + [Serializable] + public class TagModel : PlayFabBaseModel + { + /// + /// Full value of the tag, including namespace + /// + public string TagValue; + } + + public enum TriggerType + { + HTTP, + Queue, + EventHub + } + + [Serializable] + public class UnregisterFunctionRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The name of the function to register + /// + public string FunctionName; + } + + [Serializable] + public class ValueToDateModel : PlayFabBaseModel + { + /// + /// ISO 4217 code of the currency used in the purchases + /// + public string Currency; + /// + /// Total value of the purchases in a whole number of 1/100 monetary units. For example, 999 indicates nine dollars and + /// ninety-nine cents when Currency is 'USD') + /// + public uint TotalValue; + /// + /// Total value of the purchases in a string representation of decimal monetary units. For example, '9.99' indicates nine + /// dollars and ninety-nine cents when Currency is 'USD'. + /// + public string TotalValueAsDecimal; + } +} +#endif diff --git a/Assets/PlayFabSDK/CloudScript/PlayFabCloudScriptModels.cs.meta b/Assets/PlayFabSDK/CloudScript/PlayFabCloudScriptModels.cs.meta new file mode 100644 index 00000000..d4e812ca --- /dev/null +++ b/Assets/PlayFabSDK/CloudScript/PlayFabCloudScriptModels.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e51e70743e2edab4f88b8de52466db7d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/CloudScript/PlayFabEvents.cs b/Assets/PlayFabSDK/CloudScript/PlayFabEvents.cs new file mode 100644 index 00000000..bec3ba15 --- /dev/null +++ b/Assets/PlayFabSDK/CloudScript/PlayFabEvents.cs @@ -0,0 +1,40 @@ +#if !DISABLE_PLAYFABENTITY_API +using PlayFab.CloudScriptModels; + +namespace PlayFab.Events +{ + public partial class PlayFabEvents + { + public event PlayFabRequestEvent OnCloudScriptExecuteEntityCloudScriptRequestEvent; + public event PlayFabResultEvent OnCloudScriptExecuteEntityCloudScriptResultEvent; + public event PlayFabRequestEvent OnCloudScriptExecuteFunctionRequestEvent; + public event PlayFabResultEvent OnCloudScriptExecuteFunctionResultEvent; + public event PlayFabRequestEvent OnCloudScriptGetFunctionRequestEvent; + public event PlayFabResultEvent OnCloudScriptGetFunctionResultEvent; + public event PlayFabRequestEvent OnCloudScriptListEventHubFunctionsRequestEvent; + public event PlayFabResultEvent OnCloudScriptListEventHubFunctionsResultEvent; + public event PlayFabRequestEvent OnCloudScriptListFunctionsRequestEvent; + public event PlayFabResultEvent OnCloudScriptListFunctionsResultEvent; + public event PlayFabRequestEvent OnCloudScriptListHttpFunctionsRequestEvent; + public event PlayFabResultEvent OnCloudScriptListHttpFunctionsResultEvent; + public event PlayFabRequestEvent OnCloudScriptListQueuedFunctionsRequestEvent; + public event PlayFabResultEvent OnCloudScriptListQueuedFunctionsResultEvent; + public event PlayFabRequestEvent OnCloudScriptPostFunctionResultForEntityTriggeredActionRequestEvent; + public event PlayFabResultEvent OnCloudScriptPostFunctionResultForEntityTriggeredActionResultEvent; + public event PlayFabRequestEvent OnCloudScriptPostFunctionResultForFunctionExecutionRequestEvent; + public event PlayFabResultEvent OnCloudScriptPostFunctionResultForFunctionExecutionResultEvent; + public event PlayFabRequestEvent OnCloudScriptPostFunctionResultForPlayerTriggeredActionRequestEvent; + public event PlayFabResultEvent OnCloudScriptPostFunctionResultForPlayerTriggeredActionResultEvent; + public event PlayFabRequestEvent OnCloudScriptPostFunctionResultForScheduledTaskRequestEvent; + public event PlayFabResultEvent OnCloudScriptPostFunctionResultForScheduledTaskResultEvent; + public event PlayFabRequestEvent OnCloudScriptRegisterEventHubFunctionRequestEvent; + public event PlayFabResultEvent OnCloudScriptRegisterEventHubFunctionResultEvent; + public event PlayFabRequestEvent OnCloudScriptRegisterHttpFunctionRequestEvent; + public event PlayFabResultEvent OnCloudScriptRegisterHttpFunctionResultEvent; + public event PlayFabRequestEvent OnCloudScriptRegisterQueuedFunctionRequestEvent; + public event PlayFabResultEvent OnCloudScriptRegisterQueuedFunctionResultEvent; + public event PlayFabRequestEvent OnCloudScriptUnregisterFunctionRequestEvent; + public event PlayFabResultEvent OnCloudScriptUnregisterFunctionResultEvent; + } +} +#endif diff --git a/Assets/PlayFabSDK/CloudScript/PlayFabEvents.cs.meta b/Assets/PlayFabSDK/CloudScript/PlayFabEvents.cs.meta new file mode 100644 index 00000000..d80817e0 --- /dev/null +++ b/Assets/PlayFabSDK/CloudScript/PlayFabEvents.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ea444771567a8e747be86eb07cdef93a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Data.meta b/Assets/PlayFabSDK/Data.meta new file mode 100644 index 00000000..a7473e16 --- /dev/null +++ b/Assets/PlayFabSDK/Data.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: bd3db19093b9a66449695f45672bb794 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Data/PlayFabDataAPI.cs b/Assets/PlayFabSDK/Data/PlayFabDataAPI.cs new file mode 100644 index 00000000..8ef399bb --- /dev/null +++ b/Assets/PlayFabSDK/Data/PlayFabDataAPI.cs @@ -0,0 +1,133 @@ +#if !DISABLE_PLAYFABENTITY_API && !DISABLE_PLAYFAB_STATIC_API + +using System; +using System.Collections.Generic; +using PlayFab.DataModels; +using PlayFab.Internal; + +namespace PlayFab +{ + /// + /// Store arbitrary data associated with an entity. Objects are small (~1KB) JSON-compatible objects which are stored + /// directly on the entity profile. Objects are made available for use in other PlayFab contexts, such as PlayStream events + /// and CloudScript functions. Files can efficiently store data of any size or format. Both objects and files support a + /// flexible permissions system to control read and write access by other entities. + /// + public static class PlayFabDataAPI + { + static PlayFabDataAPI() {} + + + /// + /// Verify entity login. + /// + public static bool IsEntityLoggedIn() + { + return PlayFabSettings.staticPlayer.IsEntityLoggedIn(); + } + + /// + /// Clear the Client SessionToken which allows this Client to call API calls requiring login. + /// A new/fresh login will be required after calling this. + /// + public static void ForgetAllCredentials() + { + PlayFabSettings.staticPlayer.ForgetAllCredentials(); + } + + /// + /// Abort pending file uploads to an entity's profile. + /// + public static void AbortFileUploads(AbortFileUploadsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/File/AbortFileUploads", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Delete files on an entity's profile. + /// + public static void DeleteFiles(DeleteFilesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/File/DeleteFiles", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Finalize file uploads to an entity's profile. + /// + public static void FinalizeFileUploads(FinalizeFileUploadsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/File/FinalizeFileUploads", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves file metadata from an entity's profile. + /// + public static void GetFiles(GetFilesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/File/GetFiles", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves objects from an entity's profile. + /// + public static void GetObjects(GetObjectsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Object/GetObjects", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Initiates file uploads to an entity's profile. + /// + public static void InitiateFileUploads(InitiateFileUploadsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/File/InitiateFileUploads", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Sets objects on an entity's profile. + /// + public static void SetObjects(SetObjectsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Object/SetObjects", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + + } +} + +#endif diff --git a/Assets/PlayFabSDK/Data/PlayFabDataAPI.cs.meta b/Assets/PlayFabSDK/Data/PlayFabDataAPI.cs.meta new file mode 100644 index 00000000..df22d502 --- /dev/null +++ b/Assets/PlayFabSDK/Data/PlayFabDataAPI.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1cb3cb06f2399ca44ad3395fed658494 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Data/PlayFabDataInstanceAPI.cs b/Assets/PlayFabSDK/Data/PlayFabDataInstanceAPI.cs new file mode 100644 index 00000000..f13c4535 --- /dev/null +++ b/Assets/PlayFabSDK/Data/PlayFabDataInstanceAPI.cs @@ -0,0 +1,137 @@ +#if !DISABLE_PLAYFABENTITY_API + +using System; +using System.Collections.Generic; +using PlayFab.DataModels; +using PlayFab.Internal; +using PlayFab.SharedModels; + +namespace PlayFab +{ + /// + /// Store arbitrary data associated with an entity. Objects are small (~1KB) JSON-compatible objects which are stored + /// directly on the entity profile. Objects are made available for use in other PlayFab contexts, such as PlayStream events + /// and CloudScript functions. Files can efficiently store data of any size or format. Both objects and files support a + /// flexible permissions system to control read and write access by other entities. + /// + public class PlayFabDataInstanceAPI : IPlayFabInstanceApi + { + public readonly PlayFabApiSettings apiSettings = null; + public readonly PlayFabAuthenticationContext authenticationContext = null; + + public PlayFabDataInstanceAPI(PlayFabAuthenticationContext context) + { + if (context == null) + throw new PlayFabException(PlayFabExceptionCode.AuthContextRequired, "Context cannot be null, create a PlayFabAuthenticationContext for each player in advance, or call .GetAuthenticationContext()"); + authenticationContext = context; + } + + public PlayFabDataInstanceAPI(PlayFabApiSettings settings, PlayFabAuthenticationContext context) + { + if (context == null) + throw new PlayFabException(PlayFabExceptionCode.AuthContextRequired, "Context cannot be null, create a PlayFabAuthenticationContext for each player in advance, or call .GetAuthenticationContext()"); + apiSettings = settings; + authenticationContext = context; + } + + /// + /// Verify entity login. + /// + public bool IsEntityLoggedIn() + { + return authenticationContext == null ? false : authenticationContext.IsEntityLoggedIn(); + } + + /// + /// Clear the Client SessionToken which allows this Client to call API calls requiring login. + /// A new/fresh login will be required after calling this. + /// + public void ForgetAllCredentials() + { + if (authenticationContext != null) + { + authenticationContext.ForgetAllCredentials(); + } + } + + /// + /// Abort pending file uploads to an entity's profile. + /// + public void AbortFileUploads(AbortFileUploadsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/File/AbortFileUploads", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Delete files on an entity's profile. + /// + public void DeleteFiles(DeleteFilesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/File/DeleteFiles", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Finalize file uploads to an entity's profile. + /// + public void FinalizeFileUploads(FinalizeFileUploadsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/File/FinalizeFileUploads", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves file metadata from an entity's profile. + /// + public void GetFiles(GetFilesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/File/GetFiles", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves objects from an entity's profile. + /// + public void GetObjects(GetObjectsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Object/GetObjects", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Initiates file uploads to an entity's profile. + /// + public void InitiateFileUploads(InitiateFileUploadsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/File/InitiateFileUploads", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Sets objects on an entity's profile. + /// + public void SetObjects(SetObjectsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Object/SetObjects", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + } +} + +#endif diff --git a/Assets/PlayFabSDK/Data/PlayFabDataInstanceAPI.cs.meta b/Assets/PlayFabSDK/Data/PlayFabDataInstanceAPI.cs.meta new file mode 100644 index 00000000..f843ea55 --- /dev/null +++ b/Assets/PlayFabSDK/Data/PlayFabDataInstanceAPI.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6c754c6db47f4d943954121319b071d6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Data/PlayFabDataModels.cs b/Assets/PlayFabSDK/Data/PlayFabDataModels.cs new file mode 100644 index 00000000..f4b3ac2f --- /dev/null +++ b/Assets/PlayFabSDK/Data/PlayFabDataModels.cs @@ -0,0 +1,404 @@ +#if !DISABLE_PLAYFABENTITY_API +using System; +using System.Collections.Generic; +using PlayFab.SharedModels; + +namespace PlayFab.DataModels +{ + /// + /// Aborts the pending upload of the requested files. + /// + [Serializable] + public class AbortFileUploadsRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// Names of the files to have their pending uploads aborted. + /// + public List FileNames; + /// + /// The expected version of the profile, if set and doesn't match the current version of the profile the operation will not + /// be performed. + /// + public int? ProfileVersion; + } + + [Serializable] + public class AbortFileUploadsResponse : PlayFabResultCommon + { + /// + /// The entity id and type. + /// + public EntityKey Entity; + /// + /// The current version of the profile, can be used for concurrency control during updates. + /// + public int ProfileVersion; + } + + /// + /// Deletes the requested files from the entity's profile. + /// + [Serializable] + public class DeleteFilesRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// Names of the files to be deleted. + /// + public List FileNames; + /// + /// The expected version of the profile, if set and doesn't match the current version of the profile the operation will not + /// be performed. + /// + public int? ProfileVersion; + } + + [Serializable] + public class DeleteFilesResponse : PlayFabResultCommon + { + /// + /// The entity id and type. + /// + public EntityKey Entity; + /// + /// The current version of the profile, can be used for concurrency control during updates. + /// + public int ProfileVersion; + } + + /// + /// Combined entity type and ID structure which uniquely identifies a single entity. + /// + [Serializable] + public class EntityKey : PlayFabBaseModel + { + /// + /// Unique ID of the entity. + /// + public string Id; + /// + /// Entity type. See https://docs.microsoft.com/gaming/playfab/features/data/entities/available-built-in-entity-types + /// + public string Type; + } + + /// + /// Finalizes the upload of the requested files. Verifies that the files have been successfully uploaded and moves the file + /// pointers from pending to live. + /// + [Serializable] + public class FinalizeFileUploadsRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// Names of the files to be finalized. Restricted to a-Z, 0-9, '(', ')', '_', '-' and '.' + /// + public List FileNames; + /// + /// The current version of the profile, can be used for concurrency control during updates. + /// + public int ProfileVersion; + } + + [Serializable] + public class FinalizeFileUploadsResponse : PlayFabResultCommon + { + /// + /// The entity id and type. + /// + public EntityKey Entity; + /// + /// Collection of metadata for the entity's files + /// + public Dictionary Metadata; + /// + /// The current version of the profile, can be used for concurrency control during updates. + /// + public int ProfileVersion; + } + + [Serializable] + public class GetFileMetadata : PlayFabBaseModel + { + /// + /// Checksum value for the file, can be used to check if the file on the server has changed. + /// + public string Checksum; + /// + /// Download URL where the file can be retrieved + /// + public string DownloadUrl; + /// + /// Name of the file + /// + public string FileName; + /// + /// Last UTC time the file was modified + /// + public DateTime LastModified; + /// + /// Storage service's reported byte count + /// + public int Size; + } + + /// + /// Returns URLs that may be used to download the files for a profile for a limited length of time. Only returns files that + /// have been successfully uploaded, files that are still pending will either return the old value, if it exists, or + /// nothing. + /// + [Serializable] + public class GetFilesRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + } + + [Serializable] + public class GetFilesResponse : PlayFabResultCommon + { + /// + /// The entity id and type. + /// + public EntityKey Entity; + /// + /// Collection of metadata for the entity's files + /// + public Dictionary Metadata; + /// + /// The current version of the profile, can be used for concurrency control during updates. + /// + public int ProfileVersion; + } + + /// + /// Gets JSON objects from an entity profile and returns it. + /// + [Serializable] + public class GetObjectsRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// Determines whether the object will be returned as an escaped JSON string or as a un-escaped JSON object. Default is JSON + /// object. + /// + public bool? EscapeObject; + } + + [Serializable] + public class GetObjectsResponse : PlayFabResultCommon + { + /// + /// The entity id and type. + /// + public EntityKey Entity; + /// + /// Requested objects that the calling entity has access to + /// + public Dictionary Objects; + /// + /// The current version of the profile, can be used for concurrency control during updates. + /// + public int ProfileVersion; + } + + [Serializable] + public class InitiateFileUploadMetadata : PlayFabBaseModel + { + /// + /// Name of the file. + /// + public string FileName; + /// + /// Location the data should be sent to via an HTTP PUT operation. + /// + public string UploadUrl; + } + + /// + /// Returns URLs that may be used to upload the files for a profile 5 minutes. After using the upload calls + /// FinalizeFileUploads must be called to move the file status from pending to live. + /// + [Serializable] + public class InitiateFileUploadsRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// Names of the files to be set. Restricted to a-Z, 0-9, '(', ')', '_', '-' and '.' + /// + public List FileNames; + /// + /// The expected version of the profile, if set and doesn't match the current version of the profile the operation will not + /// be performed. + /// + public int? ProfileVersion; + } + + [Serializable] + public class InitiateFileUploadsResponse : PlayFabResultCommon + { + /// + /// The entity id and type. + /// + public EntityKey Entity; + /// + /// The current version of the profile, can be used for concurrency control during updates. + /// + public int ProfileVersion; + /// + /// Collection of file names and upload urls + /// + public List UploadDetails; + } + + [Serializable] + public class ObjectResult : PlayFabBaseModel + { + /// + /// Un-escaped JSON object, if EscapeObject false or default. + /// + public object DataObject; + /// + /// Escaped string JSON body of the object, if EscapeObject is true. + /// + public string EscapedDataObject; + /// + /// Name of the object. Restricted to a-Z, 0-9, '(', ')', '_', '-' and '.' + /// + public string ObjectName; + } + + public enum OperationTypes + { + Created, + Updated, + Deleted, + None + } + + [Serializable] + public class SetObject : PlayFabBaseModel + { + /// + /// Body of the object to be saved. If empty and DeleteObject is true object will be deleted if it exists, or no operation + /// will occur if it does not exist. Only one of Object or EscapedDataObject fields may be used. + /// + public object DataObject; + /// + /// Flag to indicate that this object should be deleted. Both DataObject and EscapedDataObject must not be set as well. + /// + public bool? DeleteObject; + /// + /// Body of the object to be saved as an escaped JSON string. If empty and DeleteObject is true object will be deleted if it + /// exists, or no operation will occur if it does not exist. Only one of DataObject or EscapedDataObject fields may be used. + /// + public string EscapedDataObject; + /// + /// Name of object. Restricted to a-Z, 0-9, '(', ')', '_', '-' and '.'. + /// + public string ObjectName; + } + + [Serializable] + public class SetObjectInfo : PlayFabBaseModel + { + /// + /// Name of the object + /// + public string ObjectName; + /// + /// Optional reason to explain why the operation was the result that it was. + /// + public string OperationReason; + /// + /// Indicates which operation was completed, either Created, Updated, Deleted or None. + /// + public OperationTypes? SetResult; + } + + /// + /// Sets JSON objects on the requested entity profile. May include a version number to be used to perform optimistic + /// concurrency operations during update. If the current version differs from the version in the request the request will be + /// ignored. If no version is set on the request then the value will always be updated if the values differ. Using the + /// version value does not guarantee a write though, ConcurrentEditError may still occur if multiple clients are attempting + /// to update the same profile. + /// + [Serializable] + public class SetObjectsRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// Optional field used for concurrency control. By specifying the previously returned value of ProfileVersion from + /// GetProfile API, you can ensure that the object set will only be performed if the profile has not been updated by any + /// other clients since the version you last loaded. + /// + public int? ExpectedProfileVersion; + /// + /// Collection of objects to set on the profile. + /// + public List Objects; + } + + [Serializable] + public class SetObjectsResponse : PlayFabResultCommon + { + /// + /// New version of the entity profile. + /// + public int ProfileVersion; + /// + /// New version of the entity profile. + /// + public List SetResults; + } +} +#endif diff --git a/Assets/PlayFabSDK/Data/PlayFabDataModels.cs.meta b/Assets/PlayFabSDK/Data/PlayFabDataModels.cs.meta new file mode 100644 index 00000000..a4423ea5 --- /dev/null +++ b/Assets/PlayFabSDK/Data/PlayFabDataModels.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3ab3048b1bd63d747b28b2fe0b181743 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Data/PlayFabEvents.cs b/Assets/PlayFabSDK/Data/PlayFabEvents.cs new file mode 100644 index 00000000..39393df7 --- /dev/null +++ b/Assets/PlayFabSDK/Data/PlayFabEvents.cs @@ -0,0 +1,24 @@ +#if !DISABLE_PLAYFABENTITY_API +using PlayFab.DataModels; + +namespace PlayFab.Events +{ + public partial class PlayFabEvents + { + public event PlayFabRequestEvent OnDataAbortFileUploadsRequestEvent; + public event PlayFabResultEvent OnDataAbortFileUploadsResultEvent; + public event PlayFabRequestEvent OnDataDeleteFilesRequestEvent; + public event PlayFabResultEvent OnDataDeleteFilesResultEvent; + public event PlayFabRequestEvent OnDataFinalizeFileUploadsRequestEvent; + public event PlayFabResultEvent OnDataFinalizeFileUploadsResultEvent; + public event PlayFabRequestEvent OnDataGetFilesRequestEvent; + public event PlayFabResultEvent OnDataGetFilesResultEvent; + public event PlayFabRequestEvent OnDataGetObjectsRequestEvent; + public event PlayFabResultEvent OnDataGetObjectsResultEvent; + public event PlayFabRequestEvent OnDataInitiateFileUploadsRequestEvent; + public event PlayFabResultEvent OnDataInitiateFileUploadsResultEvent; + public event PlayFabRequestEvent OnDataSetObjectsRequestEvent; + public event PlayFabResultEvent OnDataSetObjectsResultEvent; + } +} +#endif diff --git a/Assets/PlayFabSDK/Data/PlayFabEvents.cs.meta b/Assets/PlayFabSDK/Data/PlayFabEvents.cs.meta new file mode 100644 index 00000000..f8e51ea5 --- /dev/null +++ b/Assets/PlayFabSDK/Data/PlayFabEvents.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: deeaf7c863e34d24591edc6c7cf96650 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Economy.meta b/Assets/PlayFabSDK/Economy.meta new file mode 100644 index 00000000..bb4d4db6 --- /dev/null +++ b/Assets/PlayFabSDK/Economy.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b2f4743df5b210f48af02afac879569e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Economy/PlayFabEconomyAPI.cs b/Assets/PlayFabSDK/Economy/PlayFabEconomyAPI.cs new file mode 100644 index 00000000..6f57f151 --- /dev/null +++ b/Assets/PlayFabSDK/Economy/PlayFabEconomyAPI.cs @@ -0,0 +1,685 @@ +#if !DISABLE_PLAYFABENTITY_API && !DISABLE_PLAYFAB_STATIC_API + +using System; +using System.Collections.Generic; +using PlayFab.EconomyModels; +using PlayFab.Internal; + +namespace PlayFab +{ + /// + /// API methods for managing the catalog. Inventory manages in-game assets for any given entity. + /// + public static class PlayFabEconomyAPI + { + static PlayFabEconomyAPI() {} + + + /// + /// Verify entity login. + /// + public static bool IsEntityLoggedIn() + { + return PlayFabSettings.staticPlayer.IsEntityLoggedIn(); + } + + /// + /// Clear the Client SessionToken which allows this Client to call API calls requiring login. + /// A new/fresh login will be required after calling this. + /// + public static void ForgetAllCredentials() + { + PlayFabSettings.staticPlayer.ForgetAllCredentials(); + } + + /// + /// Add inventory items. Up to 10,000 stacks of items can be added to a single inventory collection. Stack size is uncapped. + /// + public static void AddInventoryItems(AddInventoryItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Inventory/AddInventoryItems", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Creates a new item in the working catalog using provided metadata. + /// + public static void CreateDraftItem(CreateDraftItemRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Catalog/CreateDraftItem", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Creates one or more upload URLs which can be used by the client to upload raw file data. Content URls and uploaded + /// content will be garbage collected after 24 hours if not attached to a draft or published item. Detailed pricing info + /// around uploading content can be found here: + /// https://learn.microsoft.com/en-us/gaming/playfab/features/pricing/meters/catalog-meters + /// + public static void CreateUploadUrls(CreateUploadUrlsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Catalog/CreateUploadUrls", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Deletes all reviews, helpfulness votes, and ratings submitted by the entity specified. + /// + public static void DeleteEntityItemReviews(DeleteEntityItemReviewsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Catalog/DeleteEntityItemReviews", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Delete an Inventory Collection. More information about Inventory Collections can be found here: + /// https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/inventory/collections + /// + public static void DeleteInventoryCollection(DeleteInventoryCollectionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Inventory/DeleteInventoryCollection", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Delete inventory items + /// + public static void DeleteInventoryItems(DeleteInventoryItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Inventory/DeleteInventoryItems", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Removes an item from working catalog and all published versions from the public catalog. + /// + public static void DeleteItem(DeleteItemRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Catalog/DeleteItem", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Execute a list of Inventory Operations. A maximum list of 50 operations can be performed by a single request. There is + /// also a limit to 300 items that can be modified/added in a single request. For example, adding a bundle with 50 items + /// counts as 50 items modified. All operations must be done within a single inventory collection. This API has a reduced + /// RPS compared to an individual inventory operation with Player Entities limited to 60 requests in 90 seconds. + /// + public static void ExecuteInventoryOperations(ExecuteInventoryOperationsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Inventory/ExecuteInventoryOperations", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Transfer a list of inventory items. A maximum list of 50 operations can be performed by a single request. When the + /// response code is 202, one or more operations did not complete within the timeframe of the request. You can identify the + /// pending operations by looking for OperationStatus = 'InProgress'. You can check on the operation status at anytime + /// within 1 day of the request by passing the TransactionToken to the GetInventoryOperationStatus API. + /// + public static void ExecuteTransferOperations(ExecuteTransferOperationsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Inventory/ExecuteTransferOperations", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets the configuration for the catalog. Only Title Entities can call this API. There is a limit of 100 requests in 10 + /// seconds for this API. More information about the Catalog Config can be found here: + /// https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/settings + /// + public static void GetCatalogConfig(GetCatalogConfigRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Catalog/GetCatalogConfig", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves an item from the working catalog. This item represents the current working state of the item. GetDraftItem + /// does not work off a cache of the Catalog and should be used when trying to get recent item updates. However, please note + /// that item references data is cached and may take a few moments for changes to propagate. + /// + public static void GetDraftItem(GetDraftItemRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Catalog/GetDraftItem", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves a paginated list of the items from the draft catalog. Up to 50 IDs can be retrieved in a single request. + /// GetDraftItems does not work off a cache of the Catalog and should be used when trying to get recent item updates. + /// + public static void GetDraftItems(GetDraftItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Catalog/GetDraftItems", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves a paginated list of the items from the draft catalog created by the Entity. Up to 50 items can be returned at + /// once. You can use continuation tokens to paginate through results that return greater than the limit. + /// GetEntityDraftItems does not work off a cache of the Catalog and should be used when trying to get recent item updates. + /// + public static void GetEntityDraftItems(GetEntityDraftItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Catalog/GetEntityDraftItems", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets the submitted review for the specified item by the authenticated entity. Individual ratings and reviews data update + /// in near real time with delays within a few seconds. + /// + public static void GetEntityItemReview(GetEntityItemReviewRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Catalog/GetEntityItemReview", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Get Inventory Collection Ids. Up to 50 Ids can be returned at once (or 250 with response compression enabled). You can + /// use continuation tokens to paginate through results that return greater than the limit. It can take a few seconds for + /// new collection Ids to show up. + /// + public static void GetInventoryCollectionIds(GetInventoryCollectionIdsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Inventory/GetInventoryCollectionIds", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Get current inventory items. + /// + public static void GetInventoryItems(GetInventoryItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Inventory/GetInventoryItems", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Get the status of an inventory operation using an OperationToken. You can check on the operation status at anytime + /// within 1 day of the request by passing the TransactionToken to the this API. + /// + public static void GetInventoryOperationStatus(GetInventoryOperationStatusRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Inventory/GetInventoryOperationStatus", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves an item from the public catalog. GetItem does not work off a cache of the Catalog and should be used when + /// trying to get recent item updates. However, please note that item references data is cached and may take a few moments + /// for changes to propagate. + /// + public static void GetItem(GetItemRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Catalog/GetItem", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Search for a given item and return a set of bundles and stores containing the item. Up to 50 items can be returned at + /// once. You can use continuation tokens to paginate through results that return greater than the limit. This API is + /// intended for tooling/automation scenarios and has a reduced RPS with Player Entities limited to 30 requests in 300 + /// seconds and Title Entities limited to 100 requests in 10 seconds. + /// + public static void GetItemContainers(GetItemContainersRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Catalog/GetItemContainers", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets the moderation state for an item, including the concern category and string reason. More information about + /// moderation states can be found here: https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/ugc/moderation + /// + public static void GetItemModerationState(GetItemModerationStateRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Catalog/GetItemModerationState", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets the status of a publish of an item. + /// + public static void GetItemPublishStatus(GetItemPublishStatusRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Catalog/GetItemPublishStatus", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Get a paginated set of reviews associated with the specified item. Individual ratings and reviews data update in near + /// real time with delays within a few seconds. + /// + public static void GetItemReviews(GetItemReviewsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Catalog/GetItemReviews", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Get a summary of all ratings and reviews associated with the specified item. Summary ratings data is cached with update + /// data coming within 15 minutes. + /// + public static void GetItemReviewSummary(GetItemReviewSummaryRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Catalog/GetItemReviewSummary", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves items from the public catalog. Up to 50 items can be returned at once. GetItems does not work off a cache of + /// the Catalog and should be used when trying to get recent item updates. However, please note that item references data is + /// cached and may take a few moments for changes to propagate. + /// + public static void GetItems(GetItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Catalog/GetItems", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets the access tokens. + /// + public static void GetMicrosoftStoreAccessTokens(GetMicrosoftStoreAccessTokensRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Inventory/GetMicrosoftStoreAccessTokens", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Get transaction history for a player. Up to 250 Events can be returned at once. You can use continuation tokens to + /// paginate through results that return greater than the limit. Getting transaction history has a lower RPS limit than + /// getting a Player's inventory with Player Entities having a limit of 30 requests in 300 seconds. + /// + public static void GetTransactionHistory(GetTransactionHistoryRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Inventory/GetTransactionHistory", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Initiates a publish of an item from the working catalog to the public catalog. You can use the GetItemPublishStatus API + /// to track the state of the item publish. + /// + public static void PublishDraftItem(PublishDraftItemRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Catalog/PublishDraftItem", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Purchase an item or bundle. Up to 10,000 stacks of items can be added to a single inventory collection. Stack size is + /// uncapped. + /// + public static void PurchaseInventoryItems(PurchaseInventoryItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Inventory/PurchaseInventoryItems", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Redeem items. + /// + public static void RedeemAppleAppStoreInventoryItems(RedeemAppleAppStoreInventoryItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Inventory/RedeemAppleAppStoreInventoryItems", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Redeem items. + /// + public static void RedeemGooglePlayInventoryItems(RedeemGooglePlayInventoryItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Inventory/RedeemGooglePlayInventoryItems", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Redeem items. + /// + public static void RedeemMicrosoftStoreInventoryItems(RedeemMicrosoftStoreInventoryItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Inventory/RedeemMicrosoftStoreInventoryItems", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Redeem items. + /// + public static void RedeemNintendoEShopInventoryItems(RedeemNintendoEShopInventoryItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Inventory/RedeemNintendoEShopInventoryItems", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Redeem items. + /// + public static void RedeemPlayStationStoreInventoryItems(RedeemPlayStationStoreInventoryItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Inventory/RedeemPlayStationStoreInventoryItems", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Redeem items. + /// + public static void RedeemSteamInventoryItems(RedeemSteamInventoryItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Inventory/RedeemSteamInventoryItems", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Submit a report for an item, indicating in what way the item is inappropriate. + /// + public static void ReportItem(ReportItemRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Catalog/ReportItem", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Submit a report for a review + /// + public static void ReportItemReview(ReportItemReviewRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Catalog/ReportItemReview", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Creates or updates a review for the specified item. More information around the caching surrounding item ratings and + /// reviews can be found here: + /// https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/catalog/ratings#ratings-design-and-caching + /// + public static void ReviewItem(ReviewItemRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Catalog/ReviewItem", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Executes a search against the public catalog using the provided search parameters and returns a set of paginated + /// results. SearchItems uses a cache of the catalog with item updates taking up to a few minutes to propagate. You should + /// use the GetItem API for when trying to immediately get recent item updates. More information about the Search API can be + /// found here: https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/catalog/search + /// + public static void SearchItems(SearchItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Catalog/SearchItems", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Sets the moderation state for an item, including the concern category and string reason. More information about + /// moderation states can be found here: https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/ugc/moderation + /// + public static void SetItemModerationState(SetItemModerationStateRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Catalog/SetItemModerationState", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Submit a vote for a review, indicating whether the review was helpful or unhelpful. + /// + public static void SubmitItemReviewVote(SubmitItemReviewVoteRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Catalog/SubmitItemReviewVote", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Subtract inventory items. + /// + public static void SubtractInventoryItems(SubtractInventoryItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Inventory/SubtractInventoryItems", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Submit a request to takedown one or more reviews. + /// + public static void TakedownItemReviews(TakedownItemReviewsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Catalog/TakedownItemReviews", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Transfer inventory items. When transferring across collections, a 202 response indicates that the transfer did not + /// complete within the timeframe of the request. You can identify the pending operations by looking for OperationStatus = + /// 'InProgress'. You can check on the operation status at anytime within 1 day of the request by passing the + /// TransactionToken to the GetInventoryOperationStatus API. More information about item transfer scenarios can be found + /// here: + /// https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/inventory/?tabs=inventory-game-manager#transfer-inventory-items + /// + public static void TransferInventoryItems(TransferInventoryItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Inventory/TransferInventoryItems", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates the configuration for the catalog. Only Title Entities can call this API. There is a limit of 10 requests in 10 + /// seconds for this API. More information about the Catalog Config can be found here: + /// https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/settings + /// + public static void UpdateCatalogConfig(UpdateCatalogConfigRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Catalog/UpdateCatalogConfig", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Update the metadata for an item in the working catalog. + /// + public static void UpdateDraftItem(UpdateDraftItemRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Catalog/UpdateDraftItem", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Update inventory items + /// + public static void UpdateInventoryItems(UpdateInventoryItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Inventory/UpdateInventoryItems", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + + } +} + +#endif diff --git a/Assets/PlayFabSDK/Economy/PlayFabEconomyAPI.cs.meta b/Assets/PlayFabSDK/Economy/PlayFabEconomyAPI.cs.meta new file mode 100644 index 00000000..29018c9e --- /dev/null +++ b/Assets/PlayFabSDK/Economy/PlayFabEconomyAPI.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 56036e5215ab72544b38afa65f5684e0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Economy/PlayFabEconomyInstanceAPI.cs b/Assets/PlayFabSDK/Economy/PlayFabEconomyInstanceAPI.cs new file mode 100644 index 00000000..ec404901 --- /dev/null +++ b/Assets/PlayFabSDK/Economy/PlayFabEconomyInstanceAPI.cs @@ -0,0 +1,611 @@ +#if !DISABLE_PLAYFABENTITY_API + +using System; +using System.Collections.Generic; +using PlayFab.EconomyModels; +using PlayFab.Internal; +using PlayFab.SharedModels; + +namespace PlayFab +{ + /// + /// API methods for managing the catalog. Inventory manages in-game assets for any given entity. + /// + public class PlayFabEconomyInstanceAPI : IPlayFabInstanceApi + { + public readonly PlayFabApiSettings apiSettings = null; + public readonly PlayFabAuthenticationContext authenticationContext = null; + + public PlayFabEconomyInstanceAPI(PlayFabAuthenticationContext context) + { + if (context == null) + throw new PlayFabException(PlayFabExceptionCode.AuthContextRequired, "Context cannot be null, create a PlayFabAuthenticationContext for each player in advance, or call .GetAuthenticationContext()"); + authenticationContext = context; + } + + public PlayFabEconomyInstanceAPI(PlayFabApiSettings settings, PlayFabAuthenticationContext context) + { + if (context == null) + throw new PlayFabException(PlayFabExceptionCode.AuthContextRequired, "Context cannot be null, create a PlayFabAuthenticationContext for each player in advance, or call .GetAuthenticationContext()"); + apiSettings = settings; + authenticationContext = context; + } + + /// + /// Verify entity login. + /// + public bool IsEntityLoggedIn() + { + return authenticationContext == null ? false : authenticationContext.IsEntityLoggedIn(); + } + + /// + /// Clear the Client SessionToken which allows this Client to call API calls requiring login. + /// A new/fresh login will be required after calling this. + /// + public void ForgetAllCredentials() + { + if (authenticationContext != null) + { + authenticationContext.ForgetAllCredentials(); + } + } + + /// + /// Add inventory items. Up to 10,000 stacks of items can be added to a single inventory collection. Stack size is uncapped. + /// + public void AddInventoryItems(AddInventoryItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Inventory/AddInventoryItems", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Creates a new item in the working catalog using provided metadata. + /// + public void CreateDraftItem(CreateDraftItemRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Catalog/CreateDraftItem", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Creates one or more upload URLs which can be used by the client to upload raw file data. Content URls and uploaded + /// content will be garbage collected after 24 hours if not attached to a draft or published item. Detailed pricing info + /// around uploading content can be found here: + /// https://learn.microsoft.com/en-us/gaming/playfab/features/pricing/meters/catalog-meters + /// + public void CreateUploadUrls(CreateUploadUrlsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Catalog/CreateUploadUrls", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Deletes all reviews, helpfulness votes, and ratings submitted by the entity specified. + /// + public void DeleteEntityItemReviews(DeleteEntityItemReviewsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Catalog/DeleteEntityItemReviews", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Delete an Inventory Collection. More information about Inventory Collections can be found here: + /// https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/inventory/collections + /// + public void DeleteInventoryCollection(DeleteInventoryCollectionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Inventory/DeleteInventoryCollection", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Delete inventory items + /// + public void DeleteInventoryItems(DeleteInventoryItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Inventory/DeleteInventoryItems", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Removes an item from working catalog and all published versions from the public catalog. + /// + public void DeleteItem(DeleteItemRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Catalog/DeleteItem", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Execute a list of Inventory Operations. A maximum list of 50 operations can be performed by a single request. There is + /// also a limit to 300 items that can be modified/added in a single request. For example, adding a bundle with 50 items + /// counts as 50 items modified. All operations must be done within a single inventory collection. This API has a reduced + /// RPS compared to an individual inventory operation with Player Entities limited to 60 requests in 90 seconds. + /// + public void ExecuteInventoryOperations(ExecuteInventoryOperationsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Inventory/ExecuteInventoryOperations", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Transfer a list of inventory items. A maximum list of 50 operations can be performed by a single request. When the + /// response code is 202, one or more operations did not complete within the timeframe of the request. You can identify the + /// pending operations by looking for OperationStatus = 'InProgress'. You can check on the operation status at anytime + /// within 1 day of the request by passing the TransactionToken to the GetInventoryOperationStatus API. + /// + public void ExecuteTransferOperations(ExecuteTransferOperationsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Inventory/ExecuteTransferOperations", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets the configuration for the catalog. Only Title Entities can call this API. There is a limit of 100 requests in 10 + /// seconds for this API. More information about the Catalog Config can be found here: + /// https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/settings + /// + public void GetCatalogConfig(GetCatalogConfigRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Catalog/GetCatalogConfig", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves an item from the working catalog. This item represents the current working state of the item. GetDraftItem + /// does not work off a cache of the Catalog and should be used when trying to get recent item updates. However, please note + /// that item references data is cached and may take a few moments for changes to propagate. + /// + public void GetDraftItem(GetDraftItemRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Catalog/GetDraftItem", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves a paginated list of the items from the draft catalog. Up to 50 IDs can be retrieved in a single request. + /// GetDraftItems does not work off a cache of the Catalog and should be used when trying to get recent item updates. + /// + public void GetDraftItems(GetDraftItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Catalog/GetDraftItems", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves a paginated list of the items from the draft catalog created by the Entity. Up to 50 items can be returned at + /// once. You can use continuation tokens to paginate through results that return greater than the limit. + /// GetEntityDraftItems does not work off a cache of the Catalog and should be used when trying to get recent item updates. + /// + public void GetEntityDraftItems(GetEntityDraftItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Catalog/GetEntityDraftItems", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets the submitted review for the specified item by the authenticated entity. Individual ratings and reviews data update + /// in near real time with delays within a few seconds. + /// + public void GetEntityItemReview(GetEntityItemReviewRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Catalog/GetEntityItemReview", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Get Inventory Collection Ids. Up to 50 Ids can be returned at once (or 250 with response compression enabled). You can + /// use continuation tokens to paginate through results that return greater than the limit. It can take a few seconds for + /// new collection Ids to show up. + /// + public void GetInventoryCollectionIds(GetInventoryCollectionIdsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Inventory/GetInventoryCollectionIds", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Get current inventory items. + /// + public void GetInventoryItems(GetInventoryItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Inventory/GetInventoryItems", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Get the status of an inventory operation using an OperationToken. You can check on the operation status at anytime + /// within 1 day of the request by passing the TransactionToken to the this API. + /// + public void GetInventoryOperationStatus(GetInventoryOperationStatusRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Inventory/GetInventoryOperationStatus", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves an item from the public catalog. GetItem does not work off a cache of the Catalog and should be used when + /// trying to get recent item updates. However, please note that item references data is cached and may take a few moments + /// for changes to propagate. + /// + public void GetItem(GetItemRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Catalog/GetItem", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Search for a given item and return a set of bundles and stores containing the item. Up to 50 items can be returned at + /// once. You can use continuation tokens to paginate through results that return greater than the limit. This API is + /// intended for tooling/automation scenarios and has a reduced RPS with Player Entities limited to 30 requests in 300 + /// seconds and Title Entities limited to 100 requests in 10 seconds. + /// + public void GetItemContainers(GetItemContainersRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Catalog/GetItemContainers", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets the moderation state for an item, including the concern category and string reason. More information about + /// moderation states can be found here: https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/ugc/moderation + /// + public void GetItemModerationState(GetItemModerationStateRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Catalog/GetItemModerationState", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets the status of a publish of an item. + /// + public void GetItemPublishStatus(GetItemPublishStatusRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Catalog/GetItemPublishStatus", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Get a paginated set of reviews associated with the specified item. Individual ratings and reviews data update in near + /// real time with delays within a few seconds. + /// + public void GetItemReviews(GetItemReviewsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Catalog/GetItemReviews", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Get a summary of all ratings and reviews associated with the specified item. Summary ratings data is cached with update + /// data coming within 15 minutes. + /// + public void GetItemReviewSummary(GetItemReviewSummaryRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Catalog/GetItemReviewSummary", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves items from the public catalog. Up to 50 items can be returned at once. GetItems does not work off a cache of + /// the Catalog and should be used when trying to get recent item updates. However, please note that item references data is + /// cached and may take a few moments for changes to propagate. + /// + public void GetItems(GetItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Catalog/GetItems", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets the access tokens. + /// + public void GetMicrosoftStoreAccessTokens(GetMicrosoftStoreAccessTokensRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Inventory/GetMicrosoftStoreAccessTokens", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Get transaction history for a player. Up to 250 Events can be returned at once. You can use continuation tokens to + /// paginate through results that return greater than the limit. Getting transaction history has a lower RPS limit than + /// getting a Player's inventory with Player Entities having a limit of 30 requests in 300 seconds. + /// + public void GetTransactionHistory(GetTransactionHistoryRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Inventory/GetTransactionHistory", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Initiates a publish of an item from the working catalog to the public catalog. You can use the GetItemPublishStatus API + /// to track the state of the item publish. + /// + public void PublishDraftItem(PublishDraftItemRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Catalog/PublishDraftItem", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Purchase an item or bundle. Up to 10,000 stacks of items can be added to a single inventory collection. Stack size is + /// uncapped. + /// + public void PurchaseInventoryItems(PurchaseInventoryItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Inventory/PurchaseInventoryItems", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Redeem items. + /// + public void RedeemAppleAppStoreInventoryItems(RedeemAppleAppStoreInventoryItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Inventory/RedeemAppleAppStoreInventoryItems", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Redeem items. + /// + public void RedeemGooglePlayInventoryItems(RedeemGooglePlayInventoryItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Inventory/RedeemGooglePlayInventoryItems", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Redeem items. + /// + public void RedeemMicrosoftStoreInventoryItems(RedeemMicrosoftStoreInventoryItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Inventory/RedeemMicrosoftStoreInventoryItems", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Redeem items. + /// + public void RedeemNintendoEShopInventoryItems(RedeemNintendoEShopInventoryItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Inventory/RedeemNintendoEShopInventoryItems", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Redeem items. + /// + public void RedeemPlayStationStoreInventoryItems(RedeemPlayStationStoreInventoryItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Inventory/RedeemPlayStationStoreInventoryItems", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Redeem items. + /// + public void RedeemSteamInventoryItems(RedeemSteamInventoryItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Inventory/RedeemSteamInventoryItems", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Submit a report for an item, indicating in what way the item is inappropriate. + /// + public void ReportItem(ReportItemRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Catalog/ReportItem", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Submit a report for a review + /// + public void ReportItemReview(ReportItemReviewRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Catalog/ReportItemReview", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Creates or updates a review for the specified item. More information around the caching surrounding item ratings and + /// reviews can be found here: + /// https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/catalog/ratings#ratings-design-and-caching + /// + public void ReviewItem(ReviewItemRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Catalog/ReviewItem", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Executes a search against the public catalog using the provided search parameters and returns a set of paginated + /// results. SearchItems uses a cache of the catalog with item updates taking up to a few minutes to propagate. You should + /// use the GetItem API for when trying to immediately get recent item updates. More information about the Search API can be + /// found here: https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/catalog/search + /// + public void SearchItems(SearchItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Catalog/SearchItems", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Sets the moderation state for an item, including the concern category and string reason. More information about + /// moderation states can be found here: https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/ugc/moderation + /// + public void SetItemModerationState(SetItemModerationStateRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Catalog/SetItemModerationState", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Submit a vote for a review, indicating whether the review was helpful or unhelpful. + /// + public void SubmitItemReviewVote(SubmitItemReviewVoteRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Catalog/SubmitItemReviewVote", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Subtract inventory items. + /// + public void SubtractInventoryItems(SubtractInventoryItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Inventory/SubtractInventoryItems", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Submit a request to takedown one or more reviews. + /// + public void TakedownItemReviews(TakedownItemReviewsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Catalog/TakedownItemReviews", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Transfer inventory items. When transferring across collections, a 202 response indicates that the transfer did not + /// complete within the timeframe of the request. You can identify the pending operations by looking for OperationStatus = + /// 'InProgress'. You can check on the operation status at anytime within 1 day of the request by passing the + /// TransactionToken to the GetInventoryOperationStatus API. More information about item transfer scenarios can be found + /// here: + /// https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/inventory/?tabs=inventory-game-manager#transfer-inventory-items + /// + public void TransferInventoryItems(TransferInventoryItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Inventory/TransferInventoryItems", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates the configuration for the catalog. Only Title Entities can call this API. There is a limit of 10 requests in 10 + /// seconds for this API. More information about the Catalog Config can be found here: + /// https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/settings + /// + public void UpdateCatalogConfig(UpdateCatalogConfigRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Catalog/UpdateCatalogConfig", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Update the metadata for an item in the working catalog. + /// + public void UpdateDraftItem(UpdateDraftItemRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Catalog/UpdateDraftItem", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Update inventory items + /// + public void UpdateInventoryItems(UpdateInventoryItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Inventory/UpdateInventoryItems", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + } +} + +#endif diff --git a/Assets/PlayFabSDK/Economy/PlayFabEconomyInstanceAPI.cs.meta b/Assets/PlayFabSDK/Economy/PlayFabEconomyInstanceAPI.cs.meta new file mode 100644 index 00000000..448fa564 --- /dev/null +++ b/Assets/PlayFabSDK/Economy/PlayFabEconomyInstanceAPI.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 57229903c0965c74b90bc2ef8ccbc31c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Economy/PlayFabEconomyModels.cs b/Assets/PlayFabSDK/Economy/PlayFabEconomyModels.cs new file mode 100644 index 00000000..6c73d349 --- /dev/null +++ b/Assets/PlayFabSDK/Economy/PlayFabEconomyModels.cs @@ -0,0 +1,3301 @@ +#if !DISABLE_PLAYFABENTITY_API +using System; +using System.Collections.Generic; +using PlayFab.SharedModels; + +namespace PlayFab.EconomyModels +{ + [Serializable] + public class AddInventoryItemsOperation : PlayFabBaseModel + { + /// + /// The amount to add to the current item amount. + /// + public int? Amount; + /// + /// The duration to add to the current item expiration date. + /// + public double? DurationInSeconds; + /// + /// The inventory item the operation applies to. + /// + public InventoryItemReference Item; + /// + /// The values to apply to a stack newly created by this operation. + /// + public InitialValues NewStackValues; + } + + /// + /// Given an entity type, entity identifier and container details, will add the specified inventory items. + /// + [Serializable] + public class AddInventoryItemsRequest : PlayFabRequestCommon + { + /// + /// The amount to add for the current item. + /// + public int? Amount; + /// + /// The id of the entity's collection to perform this action on. (Default="default"). The number of inventory collections is + /// unlimited. + /// + public string CollectionId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The duration to add to the current item expiration date. + /// + public double? DurationInSeconds; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// ETags are used for concurrency checking when updating resources. More information about using ETags can be found here: + /// https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/catalog/etags + /// + public string ETag; + /// + /// The Idempotency ID for this request. Idempotency IDs can be used to prevent operation replay in the medium term but will + /// be garbage collected eventually. + /// + public string IdempotencyId; + /// + /// The inventory item the request applies to. + /// + public InventoryItemReference Item; + /// + /// The values to apply to a stack newly created by this request. + /// + public InitialValues NewStackValues; + } + + [Serializable] + public class AddInventoryItemsResponse : PlayFabResultCommon + { + /// + /// ETags are used for concurrency checking when updating resources. More information about using ETags can be found here: + /// https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/catalog/etags + /// + public string ETag; + /// + /// The idempotency id used in the request. + /// + public string IdempotencyId; + /// + /// The ids of transactions that occurred as a result of the request. + /// + public List TransactionIds; + } + + [Serializable] + public class AlternateId : PlayFabBaseModel + { + /// + /// Type of the alternate ID. + /// + public string Type; + /// + /// Value of the alternate ID. + /// + public string Value; + } + + [Serializable] + public class CatalogAlternateId : PlayFabBaseModel + { + /// + /// Type of the alternate ID. + /// + public string Type; + /// + /// Value of the alternate ID. + /// + public string Value; + } + + [Serializable] + public class CatalogConfig : PlayFabBaseModel + { + /// + /// A list of player entity keys that will have admin permissions. There is a maximum of 64 entities that can be added. + /// + public List AdminEntities; + /// + /// The set of configuration that only applies to catalog items. + /// + public CatalogSpecificConfig Catalog; + /// + /// A list of deep link formats. Up to 10 can be added. + /// + public List DeepLinkFormats; + /// + /// A list of display properties to index. Up to 5 mappings can be added per Display Property Type. More info on display + /// properties can be found here: + /// https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/catalog/content-types-tags-and-properties#displayproperties + /// + public List DisplayPropertyIndexInfos; + /// + /// The set of configuration that only applies to Files. + /// + public FileConfig File; + /// + /// The set of configuration that only applies to Images. + /// + public ImageConfig Image; + /// + /// Flag defining whether catalog is enabled. + /// + public bool IsCatalogEnabled; + /// + /// A list of Platforms that can be applied to catalog items. Each platform can have a maximum character length of 40 and up + /// to 128 platforms can be listed. + /// + public List Platforms; + /// + /// The set of configuration that only applies to Ratings and Reviews. + /// + public ReviewConfig Review; + /// + /// A set of player entity keys that are allowed to review content. There is a maximum of 128 entities that can be added. + /// + public List ReviewerEntities; + /// + /// The set of configuration that only applies to user generated contents. + /// + public UserGeneratedContentSpecificConfig UserGeneratedContent; + } + + [Serializable] + public class CatalogItem : PlayFabBaseModel + { + /// + /// The alternate IDs associated with this item. An alternate ID can be set to 'FriendlyId' or any of the supported + /// marketplace names. + /// + public List AlternateIds; + /// + /// The set of content/files associated with this item. Up to 100 files can be added to an item. + /// + public List Contents; + /// + /// The client-defined type of the item. + /// + public string ContentType; + /// + /// The date and time when this item was created. + /// + public DateTime? CreationDate; + /// + /// The ID of the creator of this catalog item. + /// + public EntityKey CreatorEntity; + /// + /// The set of platform specific deep links for this item. + /// + public List DeepLinks; + /// + /// The Stack Id that will be used as default for this item in Inventory when an explicit one is not provided. This + /// DefaultStackId can be a static stack id or '{guid}', which will generate a unique stack id for the item. If null, + /// Inventory's default stack id will be used. + /// + public string DefaultStackId; + /// + /// A dictionary of localized descriptions. Key is language code and localized string is the value. The NEUTRAL locale is + /// required. Descriptions have a 10000 character limit per country code. + /// + public Dictionary Description; + /// + /// Game specific properties for display purposes. This is an arbitrary JSON blob. The Display Properties field has a 10000 + /// byte limit per item. + /// + public object DisplayProperties; + /// + /// The user provided version of the item for display purposes. Maximum character length of 50. + /// + public string DisplayVersion; + /// + /// The date of when the item will cease to be available. If not provided then the product will be available indefinitely. + /// + public DateTime? EndDate; + /// + /// The current ETag value that can be used for optimistic concurrency in the If-None-Match header. + /// + public string ETag; + /// + /// The unique ID of the item. + /// + public string Id; + /// + /// The images associated with this item. Images can be thumbnails or screenshots. Up to 100 images can be added to an item. + /// Only .png, .jpg, .gif, and .bmp file types can be uploaded + /// + public List Images; + /// + /// Indicates if the item is hidden. + /// + public bool? IsHidden; + /// + /// The item references associated with this item. For example, the items in a Bundle/Store/Subscription. Every item can + /// have up to 50 item references. + /// + public List ItemReferences; + /// + /// A dictionary of localized keywords. Key is language code and localized list of keywords is the value. Keywords have a 50 + /// character limit per keyword and up to 32 keywords can be added per country code. + /// + public Dictionary Keywords; + /// + /// The date and time this item was last updated. + /// + public DateTime? LastModifiedDate; + /// + /// The moderation state for this item. + /// + public ModerationState Moderation; + /// + /// The platforms supported by this item. + /// + public List Platforms; + /// + /// The prices the item can be purchased for. + /// + public CatalogPriceOptions PriceOptions; + /// + /// Rating summary for this item. + /// + public Rating Rating; + /// + /// The date of when the item will be available. If not provided then the product will appear immediately. + /// + public DateTime? StartDate; + /// + /// Optional details for stores items. + /// + public StoreDetails StoreDetails; + /// + /// The list of tags that are associated with this item. Up to 32 tags can be added to an item. + /// + public List Tags; + /// + /// A dictionary of localized titles. Key is language code and localized string is the value. The NEUTRAL locale is + /// required. Titles have a 512 character limit per country code. + /// + public Dictionary Title; + /// + /// The high-level type of the item. The following item types are supported: bundle, catalogItem, currency, store, ugc, + /// subscription. + /// + public string Type; + } + + [Serializable] + public class CatalogItemReference : PlayFabBaseModel + { + /// + /// The amount of the catalog item. + /// + public int? Amount; + /// + /// The unique ID of the catalog item. + /// + public string Id; + /// + /// The prices the catalog item can be purchased for. + /// + public CatalogPriceOptions PriceOptions; + } + + [Serializable] + public class CatalogPrice : PlayFabBaseModel + { + /// + /// The amounts of the catalog item price. Each price can have up to 15 item amounts. + /// + public List Amounts; + /// + /// The per-unit amount this price can be used to purchase. + /// + public int? UnitAmount; + /// + /// The per-unit duration this price can be used to purchase. The maximum duration is 100 years. + /// + public double? UnitDurationInSeconds; + } + + [Serializable] + public class CatalogPriceAmount : PlayFabBaseModel + { + /// + /// The amount of the price. + /// + public int Amount; + /// + /// The Item Id of the price. + /// + public string ItemId; + } + + [Serializable] + public class CatalogPriceAmountOverride : PlayFabBaseModel + { + /// + /// The exact value that should be utilized in the override. + /// + public int? FixedValue; + /// + /// The id of the item this override should utilize. + /// + public string ItemId; + /// + /// The multiplier that will be applied to the base Catalog value to determine what value should be utilized in the + /// override. + /// + public double? Multiplier; + } + + [Serializable] + public class CatalogPriceOptions : PlayFabBaseModel + { + /// + /// Prices of the catalog item. An item can have up to 15 prices + /// + public List Prices; + } + + [Serializable] + public class CatalogPriceOptionsOverride : PlayFabBaseModel + { + /// + /// The prices utilized in the override. + /// + public List Prices; + } + + [Serializable] + public class CatalogPriceOverride : PlayFabBaseModel + { + /// + /// The currency amounts utilized in the override for a singular price. + /// + public List Amounts; + } + + [Serializable] + public class CatalogSpecificConfig : PlayFabBaseModel + { + /// + /// The set of content types that will be used for validation. Each content type can have a maximum character length of 40 + /// and up to 128 types can be listed. + /// + public List ContentTypes; + /// + /// The set of tags that will be used for validation. Each tag can have a maximum character length of 32 and up to 1024 tags + /// can be listed. + /// + public List Tags; + } + + [Serializable] + public class CategoryRatingConfig : PlayFabBaseModel + { + /// + /// Name of the category. + /// + public string Name; + } + + public enum ConcernCategory + { + None, + OffensiveContent, + ChildExploitation, + MalwareOrVirus, + PrivacyConcerns, + MisleadingApp, + PoorPerformance, + ReviewResponse, + SpamAdvertising, + Profanity + } + + [Serializable] + public class Content : PlayFabBaseModel + { + /// + /// The content unique ID. + /// + public string Id; + /// + /// The maximum client version that this content is compatible with. Client Versions can be up to 3 segments separated by + /// periods(.) and each segment can have a maximum value of 65535. + /// + public string MaxClientVersion; + /// + /// The minimum client version that this content is compatible with. Client Versions can be up to 3 segments separated by + /// periods(.) and each segment can have a maximum value of 65535. + /// + public string MinClientVersion; + /// + /// The list of tags that are associated with this content. Tags must be defined in the Catalog Config before being used in + /// content. + /// + public List Tags; + /// + /// The client-defined type of the content. Content Types must be defined in the Catalog Config before being used. + /// + public string Type; + /// + /// The Azure CDN URL for retrieval of the catalog item binary content. + /// + public string Url; + } + + [Serializable] + public class ContentFeed : PlayFabBaseModel + { + } + + public enum CountryCode + { + AF, + AX, + AL, + DZ, + AS, + AD, + AO, + AI, + AQ, + AG, + AR, + AM, + AW, + AU, + AT, + AZ, + BS, + BH, + BD, + BB, + BY, + BE, + BZ, + BJ, + BM, + BT, + BO, + BQ, + BA, + BW, + BV, + BR, + IO, + BN, + BG, + BF, + BI, + KH, + CM, + CA, + CV, + KY, + CF, + TD, + CL, + CN, + CX, + CC, + CO, + KM, + CG, + CD, + CK, + CR, + CI, + HR, + CU, + CW, + CY, + CZ, + DK, + DJ, + DM, + DO, + EC, + EG, + SV, + GQ, + ER, + EE, + ET, + FK, + FO, + FJ, + FI, + FR, + GF, + PF, + TF, + GA, + GM, + GE, + DE, + GH, + GI, + GR, + GL, + GD, + GP, + GU, + GT, + GG, + GN, + GW, + GY, + HT, + HM, + VA, + HN, + HK, + HU, + IS, + IN, + ID, + IR, + IQ, + IE, + IM, + IL, + IT, + JM, + JP, + JE, + JO, + KZ, + KE, + KI, + KP, + KR, + KW, + KG, + LA, + LV, + LB, + LS, + LR, + LY, + LI, + LT, + LU, + MO, + MK, + MG, + MW, + MY, + MV, + ML, + MT, + MH, + MQ, + MR, + MU, + YT, + MX, + FM, + MD, + MC, + MN, + ME, + MS, + MA, + MZ, + MM, + NA, + NR, + NP, + NL, + NC, + NZ, + NI, + NE, + NG, + NU, + NF, + MP, + NO, + OM, + PK, + PW, + PS, + PA, + PG, + PY, + PE, + PH, + PN, + PL, + PT, + PR, + QA, + RE, + RO, + RU, + RW, + BL, + SH, + KN, + LC, + MF, + PM, + VC, + WS, + SM, + ST, + SA, + SN, + RS, + SC, + SL, + SG, + SX, + SK, + SI, + SB, + SO, + ZA, + GS, + SS, + ES, + LK, + SD, + SR, + SJ, + SZ, + SE, + CH, + SY, + TW, + TJ, + TZ, + TH, + TL, + TG, + TK, + TO, + TT, + TN, + TR, + TM, + TC, + TV, + UG, + UA, + AE, + GB, + US, + UM, + UY, + UZ, + VU, + VE, + VN, + VG, + VI, + WF, + EH, + YE, + ZM, + ZW, + Unknown + } + + /// + /// The item will not be published to the public catalog until the PublishItem API is called for the item. + /// + [Serializable] + public class CreateDraftItemRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Metadata describing the new catalog item to be created. + /// + public CatalogItem Item; + /// + /// Whether the item should be published immediately. This value is optional, defaults to false. + /// + public bool Publish; + } + + [Serializable] + public class CreateDraftItemResponse : PlayFabResultCommon + { + /// + /// Updated metadata describing the catalog item just created. + /// + public CatalogItem Item; + } + + /// + /// Upload URLs point to Azure Blobs; clients must follow the Microsoft Azure Storage Blob Service REST API pattern for + /// uploading content. The response contains upload URLs and IDs for each file. The IDs and URLs returned must be added to + /// the item metadata and committed using the CreateDraftItem or UpdateDraftItem Item APIs. + /// + [Serializable] + public class CreateUploadUrlsRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Description of the files to be uploaded by the client. + /// + public List Files; + } + + [Serializable] + public class CreateUploadUrlsResponse : PlayFabResultCommon + { + /// + /// List of URLs metadata for the files to be uploaded by the client. + /// + public List UploadUrls; + } + + [Serializable] + public class DeepLink : PlayFabBaseModel + { + /// + /// Target platform for this deep link. + /// + public string Platform; + /// + /// The deep link for this platform. + /// + public string Url; + } + + [Serializable] + public class DeepLinkFormat : PlayFabBaseModel + { + /// + /// The format of the deep link to return. The format should contain '{id}' to represent where the item ID should be placed. + /// + public string Format; + /// + /// The target platform for the deep link. + /// + public string Platform; + } + + [Serializable] + public class DeleteEntityItemReviewsRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + } + + [Serializable] + public class DeleteEntityItemReviewsResponse : PlayFabResultCommon + { + } + + /// + /// Delete an Inventory Collection by the specified Id for an Entity + /// + [Serializable] + public class DeleteInventoryCollectionRequest : PlayFabRequestCommon + { + /// + /// The inventory collection id the request applies to. + /// + public string CollectionId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity the request is about. Set to the caller by default. + /// + public EntityKey Entity; + /// + /// ETags are used for concurrency checking when updating resources. More information about using ETags can be found here: + /// https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/catalog/etags + /// + public string ETag; + } + + [Serializable] + public class DeleteInventoryCollectionResponse : PlayFabResultCommon + { + } + + [Serializable] + public class DeleteInventoryItemsOperation : PlayFabBaseModel + { + /// + /// The inventory item the operation applies to. + /// + public InventoryItemReference Item; + } + + /// + /// Given an entity type, entity identifier and container details, will delete the entity's inventory items + /// + [Serializable] + public class DeleteInventoryItemsRequest : PlayFabRequestCommon + { + /// + /// The id of the entity's collection to perform this action on. (Default="default"). The number of inventory collections is + /// unlimited. + /// + public string CollectionId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// ETags are used for concurrency checking when updating resources. More information about using ETags can be found here: + /// https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/catalog/etags + /// + public string ETag; + /// + /// The Idempotency ID for this request. Idempotency IDs can be used to prevent operation replay in the medium term but will + /// be garbage collected eventually. + /// + public string IdempotencyId; + /// + /// The inventory item the request applies to. + /// + public InventoryItemReference Item; + } + + [Serializable] + public class DeleteInventoryItemsResponse : PlayFabResultCommon + { + /// + /// ETags are used for concurrency checking when updating resources. + /// + public string ETag; + /// + /// The idempotency id used in the request. + /// + public string IdempotencyId; + /// + /// The ids of transactions that occurred as a result of the request. + /// + public List TransactionIds; + } + + [Serializable] + public class DeleteItemRequest : PlayFabRequestCommon + { + /// + /// An alternate ID associated with this item. + /// + public CatalogAlternateId AlternateId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// The unique ID of the item. + /// + public string Id; + } + + [Serializable] + public class DeleteItemResponse : PlayFabResultCommon + { + } + + [Serializable] + public class DisplayPropertyIndexInfo : PlayFabBaseModel + { + /// + /// The property name in the 'DisplayProperties' property to be indexed. + /// + public string Name; + /// + /// The type of the property to be indexed. + /// + public DisplayPropertyType? Type; + } + + public enum DisplayPropertyType + { + None, + QueryDateTime, + QueryDouble, + QueryString, + SearchString + } + + /// + /// Combined entity type and ID structure which uniquely identifies a single entity. + /// + [Serializable] + public class EntityKey : PlayFabBaseModel + { + /// + /// Unique ID of the entity. + /// + public string Id; + /// + /// Entity type. See https://docs.microsoft.com/gaming/playfab/features/data/entities/available-built-in-entity-types + /// + public string Type; + } + + /// + /// Execute a list of Inventory Operations for an Entity + /// + [Serializable] + public class ExecuteInventoryOperationsRequest : PlayFabRequestCommon + { + /// + /// The id of the entity's collection to perform this action on. (Default="default"). The number of inventory collections is + /// unlimited. + /// + public string CollectionId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// ETags are used for concurrency checking when updating resources. More information about using ETags can be found here: + /// https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/catalog/etags + /// + public string ETag; + /// + /// The Idempotency ID for this request. Idempotency IDs can be used to prevent operation replay in the medium term but will + /// be garbage collected eventually. + /// + public string IdempotencyId; + /// + /// The operations to run transactionally. The operations will be executed in-order sequentially and will succeed or fail as + /// a batch. Up to 50 operations can be added. + /// + public List Operations; + } + + [Serializable] + public class ExecuteInventoryOperationsResponse : PlayFabResultCommon + { + /// + /// ETags are used for concurrency checking when updating resources. More information about using ETags can be found here: + /// https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/catalog/etags + /// + public string ETag; + /// + /// The idempotency id used in the request. + /// + public string IdempotencyId; + /// + /// The ids of the transactions that occurred as a result of the request. + /// + public List TransactionIds; + } + + /// + /// Transfer the specified list of inventory items of an entity's container Id to another entity's container Id. + /// + [Serializable] + public class ExecuteTransferOperationsRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The inventory collection id the request is transferring from. (Default="default") + /// + public string GivingCollectionId; + /// + /// The entity the request is transferring from. Set to the caller by default. + /// + public EntityKey GivingEntity; + /// + /// ETags are used for concurrency checking when updating resources. More information about using ETags can be found here: + /// https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/catalog/etags + /// + public string GivingETag; + /// + /// The idempotency id for the request. + /// + public string IdempotencyId; + /// + /// The transfer operations to run transactionally. The operations will be executed in-order sequentially and will succeed + /// or fail as a batch. Up to 50 operations can be added. + /// + public List Operations; + /// + /// The inventory collection id the request is transferring to. (Default="default") + /// + public string ReceivingCollectionId; + /// + /// The entity the request is transferring to. Set to the caller by default. + /// + public EntityKey ReceivingEntity; + } + + [Serializable] + public class ExecuteTransferOperationsResponse : PlayFabResultCommon + { + /// + /// ETags are used for concurrency checking when updating resources (before transferring from). This value will be empty if + /// the operation has not completed yet. More information about using ETags can be found here: + /// https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/catalog/etags + /// + public string GivingETag; + /// + /// The ids of transactions that occurred as a result of the request's giving action. + /// + public List GivingTransactionIds; + /// + /// The Idempotency ID for this request. + /// + public string IdempotencyId; + /// + /// The transfer operation status. Possible values are 'InProgress' or 'Completed'. If the operation has completed, the + /// response code will be 200. Otherwise, it will be 202. + /// + public string OperationStatus; + /// + /// The token that can be used to get the status of the transfer operation. This will only have a value if OperationStatus + /// is 'InProgress'. + /// + public string OperationToken; + /// + /// ETags are used for concurrency checking when updating resources (before transferring to). This value will be empty if + /// the operation has not completed yet. + /// + public string ReceivingETag; + /// + /// The ids of transactions that occurred as a result of the request's receiving action. + /// + public List ReceivingTransactionIds; + } + + [Serializable] + public class FileConfig : PlayFabBaseModel + { + /// + /// The set of content types that will be used for validation. Each content type can have a maximum character length of 40 + /// and up to 128 types can be listed. + /// + public List ContentTypes; + /// + /// The set of tags that will be used for validation. Each tag can have a maximum character length of 32 and up to 1024 tags + /// can be listed. + /// + public List Tags; + } + + [Serializable] + public class FilterOptions : PlayFabBaseModel + { + /// + /// The OData filter utilized. Mutually exclusive with 'IncludeAllItems'. More info about Filter Complexity limits can be + /// found here: https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/catalog/search#limits + /// + public string Filter; + /// + /// The flag that overrides the filter and allows for returning all catalog items. Mutually exclusive with 'Filter'. + /// + public bool? IncludeAllItems; + } + + [Serializable] + public class GetCatalogConfigRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + [Serializable] + public class GetCatalogConfigResponse : PlayFabResultCommon + { + /// + /// The catalog configuration. + /// + public CatalogConfig Config; + } + + [Serializable] + public class GetDraftItemRequest : PlayFabRequestCommon + { + /// + /// An alternate ID associated with this item. + /// + public CatalogAlternateId AlternateId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// The unique ID of the item. + /// + public string Id; + } + + [Serializable] + public class GetDraftItemResponse : PlayFabResultCommon + { + /// + /// Full metadata of the catalog item requested. + /// + public CatalogItem Item; + } + + [Serializable] + public class GetDraftItemsRequest : PlayFabRequestCommon + { + /// + /// List of item alternate IDs. + /// + public List AlternateIds; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// List of Item Ids. + /// + public List Ids; + } + + [Serializable] + public class GetDraftItemsResponse : PlayFabResultCommon + { + /// + /// An opaque token used to retrieve the next page of items, if any are available. + /// + public string ContinuationToken; + /// + /// A set of items created by the entity. + /// + public List Items; + } + + [Serializable] + public class GetEntityDraftItemsRequest : PlayFabRequestCommon + { + /// + /// An opaque token used to retrieve the next page of items created by the caller, if any are available. Should be null on + /// initial request. + /// + public string ContinuationToken; + /// + /// Number of items to retrieve. This value is optional. Default value is 10. + /// + public int Count; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// OData Filter to refine the items returned. CatalogItem properties 'type' can be used in the filter. For example: "type + /// eq 'ugc'" + /// + public string Filter; + } + + [Serializable] + public class GetEntityDraftItemsResponse : PlayFabResultCommon + { + /// + /// An opaque token used to retrieve the next page of items, if any are available. + /// + public string ContinuationToken; + /// + /// A set of items created by the entity. + /// + public List Items; + } + + [Serializable] + public class GetEntityItemReviewRequest : PlayFabRequestCommon + { + /// + /// An alternate ID associated with this item. + /// + public CatalogAlternateId AlternateId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// The unique ID of the item. + /// + public string Id; + } + + [Serializable] + public class GetEntityItemReviewResponse : PlayFabResultCommon + { + /// + /// The review the entity submitted for the requested item. + /// + public Review Review; + } + + /// + /// Get a list of Inventory Collection Ids for the specified Entity + /// + [Serializable] + public class GetInventoryCollectionIdsRequest : PlayFabRequestCommon + { + /// + /// An opaque token used to retrieve the next page of collection ids, if any are available. + /// + public string ContinuationToken; + /// + /// Number of items to retrieve. This value is optional. The default value is 10 + /// + public int Count; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity the request is about. Set to the caller by default. + /// + public EntityKey Entity; + } + + [Serializable] + public class GetInventoryCollectionIdsResponse : PlayFabResultCommon + { + /// + /// The requested inventory collection ids. + /// + public List CollectionIds; + /// + /// An opaque token used to retrieve the next page of collection ids, if any are available. + /// + public string ContinuationToken; + } + + /// + /// Given an entity type, entity identifier and container details, will get the entity's inventory items. + /// + [Serializable] + public class GetInventoryItemsRequest : PlayFabRequestCommon + { + /// + /// The id of the entity's collection to perform this action on. (Default="default") + /// + public string CollectionId; + /// + /// An opaque token used to retrieve the next page of items in the inventory, if any are available. Should be null on + /// initial request. + /// + public string ContinuationToken; + /// + /// Number of items to retrieve. This value is optional. Maximum page size is 50. The default value is 10 + /// + public int Count; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// OData Filter to refine the items returned. InventoryItem properties 'type', 'id', and 'stackId' can be used in the + /// filter. For example: "type eq 'currency'" + /// + public string Filter; + } + + [Serializable] + public class GetInventoryItemsResponse : PlayFabResultCommon + { + /// + /// An opaque token used to retrieve the next page of items, if any are available. + /// + public string ContinuationToken; + /// + /// ETags are used for concurrency checking when updating resources. More information about using ETags can be found here: + /// https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/catalog/etags + /// + public string ETag; + /// + /// The requested inventory items. + /// + public List Items; + } + + /// + /// Get the status of an Inventory Operation using an OperationToken. + /// + [Serializable] + public class GetInventoryOperationStatusRequest : PlayFabRequestCommon + { + /// + /// The id of the entity's collection to perform this action on. (Default="default") + /// + public string CollectionId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + } + + [Serializable] + public class GetInventoryOperationStatusResponse : PlayFabResultCommon + { + /// + /// The inventory operation status. + /// + public string OperationStatus; + } + + /// + /// Given an item, return a set of bundles and stores containing the item. + /// + [Serializable] + public class GetItemContainersRequest : PlayFabRequestCommon + { + /// + /// An alternate ID associated with this item. + /// + public CatalogAlternateId AlternateId; + /// + /// An opaque token used to retrieve the next page of items in the inventory, if any are available. Should be null on + /// initial request. + /// + public string ContinuationToken; + /// + /// Number of items to retrieve. This value is optional. Default value is 10. + /// + public int Count; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// The unique ID of the item. + /// + public string Id; + } + + [Serializable] + public class GetItemContainersResponse : PlayFabResultCommon + { + /// + /// List of Bundles and Stores containing the requested items. + /// + public List Containers; + /// + /// An opaque token used to retrieve the next page of items, if any are available. + /// + public string ContinuationToken; + } + + [Serializable] + public class GetItemModerationStateRequest : PlayFabRequestCommon + { + /// + /// An alternate ID associated with this item. + /// + public CatalogAlternateId AlternateId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The unique ID of the item. + /// + public string Id; + } + + [Serializable] + public class GetItemModerationStateResponse : PlayFabResultCommon + { + /// + /// The current moderation state for the requested item. + /// + public ModerationState State; + } + + [Serializable] + public class GetItemPublishStatusRequest : PlayFabRequestCommon + { + /// + /// An alternate ID associated with this item. + /// + public CatalogAlternateId AlternateId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// The unique ID of the item. + /// + public string Id; + } + + [Serializable] + public class GetItemPublishStatusResponse : PlayFabResultCommon + { + /// + /// High level status of the published item. + /// + public PublishResult? Result; + /// + /// Descriptive message about the current status of the publish. + /// + public string StatusMessage; + } + + [Serializable] + public class GetItemRequest : PlayFabRequestCommon + { + /// + /// An alternate ID associated with this item. + /// + public CatalogAlternateId AlternateId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// The unique ID of the item. + /// + public string Id; + } + + /// + /// Get item result. + /// + [Serializable] + public class GetItemResponse : PlayFabResultCommon + { + /// + /// The item result. + /// + public CatalogItem Item; + } + + [Serializable] + public class GetItemReviewsRequest : PlayFabRequestCommon + { + /// + /// An alternate ID associated with this item. + /// + public CatalogAlternateId AlternateId; + /// + /// An opaque token used to retrieve the next page of items, if any are available. + /// + public string ContinuationToken; + /// + /// Number of items to retrieve. This value is optional. Default value is 10. + /// + public int Count; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The unique ID of the item. + /// + public string Id; + /// + /// An OData orderBy used to order the results of the query. Possible values are Helpfulness, Rating, and Submitted (For + /// example: "Submitted desc") + /// + public string OrderBy; + } + + [Serializable] + public class GetItemReviewsResponse : PlayFabResultCommon + { + /// + /// An opaque token used to retrieve the next page of items, if any are available. + /// + public string ContinuationToken; + /// + /// The paginated set of results. + /// + public List Reviews; + } + + [Serializable] + public class GetItemReviewSummaryRequest : PlayFabRequestCommon + { + /// + /// An alternate ID associated with this item. + /// + public CatalogAlternateId AlternateId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The unique ID of the item. + /// + public string Id; + } + + [Serializable] + public class GetItemReviewSummaryResponse : PlayFabResultCommon + { + /// + /// The least favorable review for this item. + /// + public Review LeastFavorableReview; + /// + /// The most favorable review for this item. + /// + public Review MostFavorableReview; + /// + /// The summary of ratings associated with this item. + /// + public Rating Rating; + /// + /// The total number of reviews associated with this item. + /// + public int ReviewsCount; + } + + [Serializable] + public class GetItemsRequest : PlayFabRequestCommon + { + /// + /// List of item alternate IDs. + /// + public List AlternateIds; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// List of Item Ids. + /// + public List Ids; + } + + [Serializable] + public class GetItemsResponse : PlayFabResultCommon + { + /// + /// Metadata of set of items. + /// + public List Items; + } + + /// + /// Gets the access tokens for Microsoft Store authentication. + /// + [Serializable] + public class GetMicrosoftStoreAccessTokensRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + [Serializable] + public class GetMicrosoftStoreAccessTokensResponse : PlayFabResultCommon + { + /// + /// The collections access token for calling https://onestore.microsoft.com/b2b/keys/create/collections to obtain a + /// CollectionsIdKey for the user + /// + public string CollectionsAccessToken; + /// + /// The date the collections access token expires + /// + public DateTime CollectionsAccessTokenExpirationDate; + } + + /// + /// Get transaction history for specified entity and collection. + /// + [Serializable] + public class GetTransactionHistoryRequest : PlayFabRequestCommon + { + /// + /// The id of the entity's collection to perform this action on. (Default="default") + /// + public string CollectionId; + /// + /// An opaque token used to retrieve the next page of items, if any are available. Should be null on initial request. + /// + public string ContinuationToken; + /// + /// Number of items to retrieve. This value is optional. The default value is 10 + /// + public int Count; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// An OData filter used to refine the TransactionHistory. Transaction properties 'timestamp', 'transactionid', 'apiname' + /// and 'operationtype' can be used in the filter. Properties 'transactionid', 'apiname', and 'operationtype' cannot be used + /// together in a single request. The 'timestamp' property can be combined with 'apiname' or 'operationtype' in a single + /// request. For example: "timestamp ge 2023-06-20T23:30Z" or "transactionid eq '10'" or "(timestamp ge 2023-06-20T23:30Z) + /// and (apiname eq 'AddInventoryItems')". By default, a 6 month timespan from the current date is used. + /// + public string Filter; + /// + /// An OData orderby to order TransactionHistory results. The only supported values are 'timestamp asc' or 'timestamp desc'. + /// Default orderby is 'timestamp asc' + /// + public string OrderBy; + } + + [Serializable] + public class GetTransactionHistoryResponse : PlayFabResultCommon + { + /// + /// An opaque token used to retrieve the next page of items, if any are available. Should be null on initial request. + /// + public string ContinuationToken; + /// + /// The requested inventory transactions. + /// + public List Transactions; + } + + [Serializable] + public class GooglePlayProductPurchase : PlayFabBaseModel + { + /// + /// The Product ID (SKU) of the InApp product purchased from the Google Play store. + /// + public string ProductId; + /// + /// The token provided to the player's device when the product was purchased + /// + public string Token; + } + + public enum HelpfulnessVote + { + None, + UnHelpful, + Helpful + } + + [Serializable] + public class Image : PlayFabBaseModel + { + /// + /// The image unique ID. + /// + public string Id; + /// + /// The client-defined tag associated with this image. Tags must be defined in the Catalog Config before being used in + /// images + /// + public string Tag; + /// + /// Images can be defined as either a "thumbnail" or "screenshot". There can only be one "thumbnail" image per item. + /// + public string Type; + /// + /// The URL for retrieval of the image. + /// + public string Url; + } + + [Serializable] + public class ImageConfig : PlayFabBaseModel + { + /// + /// The set of tags that will be used for validation. Each tag can have a maximum character length of 32 and up to 1024 tags + /// can be listed. + /// + public List Tags; + } + + [Serializable] + public class InitialValues : PlayFabBaseModel + { + /// + /// Game specific properties for display purposes. The Display Properties field has a 1000 byte limit. + /// + public object DisplayProperties; + } + + [Serializable] + public class InventoryItem : PlayFabBaseModel + { + /// + /// The amount of the item. + /// + public int? Amount; + /// + /// Game specific properties for display purposes. This is an arbitrary JSON blob. The Display Properties field has a 1000 + /// byte limit. + /// + public object DisplayProperties; + /// + /// Only used for subscriptions. The date of when the item will expire in UTC. + /// + public DateTime? ExpirationDate; + /// + /// The id of the item. This should correspond to the item id in the catalog. + /// + public string Id; + /// + /// The stack id of the item. + /// + public string StackId; + /// + /// The type of the item. This should correspond to the item type in the catalog. + /// + public string Type; + } + + [Serializable] + public class InventoryItemReference : PlayFabBaseModel + { + /// + /// The inventory item alternate id the request applies to. + /// + public AlternateId AlternateId; + /// + /// The inventory item id the request applies to. + /// + public string Id; + /// + /// The inventory stack id the request should redeem to. (Default="default") + /// + public string StackId; + } + + [Serializable] + public class InventoryOperation : PlayFabBaseModel + { + /// + /// The add operation. + /// + public AddInventoryItemsOperation Add; + /// + /// The delete operation. + /// + public DeleteInventoryItemsOperation Delete; + /// + /// The purchase operation. + /// + public PurchaseInventoryItemsOperation Purchase; + /// + /// The subtract operation. + /// + public SubtractInventoryItemsOperation Subtract; + /// + /// The transfer operation. + /// + public TransferInventoryItemsOperation Transfer; + /// + /// The update operation. + /// + public UpdateInventoryItemsOperation Update; + } + + [Serializable] + public class KeywordSet : PlayFabBaseModel + { + /// + /// A list of localized keywords. + /// + public List Values; + } + + [Serializable] + public class ModerationState : PlayFabBaseModel + { + /// + /// The date and time this moderation state was last updated. + /// + public DateTime? LastModifiedDate; + /// + /// The current stated reason for the associated item being moderated. + /// + public string Reason; + /// + /// The current moderation status for the associated item. + /// + public ModerationStatus? Status; + } + + public enum ModerationStatus + { + Unknown, + AwaitingModeration, + Approved, + Rejected + } + + [Serializable] + public class PayoutDetails : PlayFabBaseModel + { + } + + [Serializable] + public class Permissions : PlayFabBaseModel + { + /// + /// The list of ids of Segments that the a player can be in to purchase from the store. When a value is provided, the player + /// must be in at least one of the segments listed for the purchase to be allowed. + /// + public List SegmentIds; + } + + /// + /// The call kicks off a workflow to publish the item to the public catalog. The Publish Status API should be used to + /// monitor the publish job. + /// + [Serializable] + public class PublishDraftItemRequest : PlayFabRequestCommon + { + /// + /// An alternate ID associated with this item. + /// + public CatalogAlternateId AlternateId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// ETag of the catalog item to published from the working catalog to the public catalog. Used for optimistic concurrency. + /// If the provided ETag does not match the ETag in the current working catalog, the request will be rejected. If not + /// provided, the current version of the document in the working catalog will be published. + /// + public string ETag; + /// + /// The unique ID of the item. + /// + public string Id; + } + + [Serializable] + public class PublishDraftItemResponse : PlayFabResultCommon + { + } + + public enum PublishResult + { + Unknown, + Pending, + Succeeded, + Failed, + Canceled + } + + [Serializable] + public class PurchaseInventoryItemsOperation : PlayFabBaseModel + { + /// + /// The amount to purchase. + /// + public int? Amount; + /// + /// Indicates whether stacks reduced to an amount of 0 during the operation should be deleted from the inventory. (Default = + /// false) + /// + public bool DeleteEmptyStacks; + /// + /// The duration to purchase. + /// + public double? DurationInSeconds; + /// + /// The inventory item the operation applies to. + /// + public InventoryItemReference Item; + /// + /// The values to apply to a stack newly created by this operation. + /// + public InitialValues NewStackValues; + /// + /// The per-item price the item is expected to be purchased at. This must match a value configured in the Catalog or + /// specified Store. + /// + public List PriceAmounts; + /// + /// The id of the Store to purchase the item from. + /// + public string StoreId; + } + + /// + /// Purchase a single item or bundle, paying the associated price. + /// + [Serializable] + public class PurchaseInventoryItemsRequest : PlayFabRequestCommon + { + /// + /// The amount to purchase. + /// + public int? Amount; + /// + /// The id of the entity's collection to perform this action on. (Default="default"). The number of inventory collections is + /// unlimited. + /// + public string CollectionId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Indicates whether stacks reduced to an amount of 0 during the request should be deleted from the inventory. + /// (Default=false) + /// + public bool DeleteEmptyStacks; + /// + /// The duration to purchase. + /// + public double? DurationInSeconds; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// ETags are used for concurrency checking when updating resources. More information about using ETags can be found here: + /// https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/catalog/etags + /// + public string ETag; + /// + /// The Idempotency ID for this request. Idempotency IDs can be used to prevent operation replay in the medium term but will + /// be garbage collected eventually. + /// + public string IdempotencyId; + /// + /// The inventory item the request applies to. + /// + public InventoryItemReference Item; + /// + /// The values to apply to a stack newly created by this request. + /// + public InitialValues NewStackValues; + /// + /// The per-item price the item is expected to be purchased at. This must match a value configured in the Catalog or + /// specified Store. + /// + public List PriceAmounts; + /// + /// The id of the Store to purchase the item from. + /// + public string StoreId; + } + + [Serializable] + public class PurchaseInventoryItemsResponse : PlayFabResultCommon + { + /// + /// ETags are used for concurrency checking when updating resources. More information about using ETags can be found here: + /// https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/catalog/etags + /// + public string ETag; + /// + /// The idempotency id used in the request. + /// + public string IdempotencyId; + /// + /// The ids of transactions that occurred as a result of the request. + /// + public List TransactionIds; + } + + [Serializable] + public class PurchaseOverride : PlayFabBaseModel + { + } + + [Serializable] + public class PurchaseOverridesInfo : PlayFabBaseModel + { + } + + [Serializable] + public class PurchasePriceAmount : PlayFabBaseModel + { + /// + /// The amount of the inventory item to use in the purchase . + /// + public int Amount; + /// + /// The inventory item id to use in the purchase . + /// + public string ItemId; + /// + /// The inventory stack id the to use in the purchase. Set to "default" by default + /// + public string StackId; + } + + [Serializable] + public class Rating : PlayFabBaseModel + { + /// + /// The average rating for this item. + /// + public float? Average; + /// + /// The total count of 1 star ratings for this item. + /// + public int? Count1Star; + /// + /// The total count of 2 star ratings for this item. + /// + public int? Count2Star; + /// + /// The total count of 3 star ratings for this item. + /// + public int? Count3Star; + /// + /// The total count of 4 star ratings for this item. + /// + public int? Count4Star; + /// + /// The total count of 5 star ratings for this item. + /// + public int? Count5Star; + /// + /// The total count of ratings for this item. + /// + public int? TotalCount; + } + + [Serializable] + public class RealMoneyPriceDetails : PlayFabBaseModel + { + } + + /// + /// Redeem items from the Apple App Store. + /// + [Serializable] + public class RedeemAppleAppStoreInventoryItemsRequest : PlayFabRequestCommon + { + /// + /// The id of the entity's collection to perform this action on. (Default="default") + /// + public string CollectionId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// The receipt provided by the Apple marketplace upon successful purchase. + /// + public string Receipt; + } + + [Serializable] + public class RedeemAppleAppStoreInventoryItemsResponse : PlayFabResultCommon + { + /// + /// The list of failed redemptions from the external marketplace. + /// + public List Failed; + /// + /// The list of successful redemptions from the external marketplace. + /// + public List Succeeded; + /// + /// The Transaction IDs associated with the inventory modifications + /// + public List TransactionIds; + } + + /// + /// Redeem items from the Google Play Store. + /// + [Serializable] + public class RedeemGooglePlayInventoryItemsRequest : PlayFabRequestCommon + { + /// + /// The id of the entity's collection to perform this action on. (Default="default") + /// + public string CollectionId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// The list of purchases to redeem + /// + public List Purchases; + } + + [Serializable] + public class RedeemGooglePlayInventoryItemsResponse : PlayFabResultCommon + { + /// + /// The list of failed redemptions from the external marketplace. + /// + public List Failed; + /// + /// The list of successful redemptions from the external marketplace. + /// + public List Succeeded; + /// + /// The Transaction IDs associated with the inventory modifications + /// + public List TransactionIds; + } + + /// + /// Redeem items from the Microsoft Store. + /// + [Serializable] + public class RedeemMicrosoftStoreInventoryItemsRequest : PlayFabRequestCommon + { + /// + /// The id of the entity's collection to perform this action on. (Default="default") + /// + public string CollectionId; + /// + /// The OneStore Collections Id Key used for AAD authentication. + /// + public string CollectionsIdKey; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// Xbox Token used for delegated business partner authentication. Token provided by the Xbox Live SDK method + /// GetTokenAndSignatureAsync("POST", "https://playfabapi.com/", ""). + /// + public string XboxToken; + } + + [Serializable] + public class RedeemMicrosoftStoreInventoryItemsResponse : PlayFabResultCommon + { + /// + /// The list of failed redemptions from the external marketplace. + /// + public List Failed; + /// + /// The list of successful redemptions from the external marketplace. + /// + public List Succeeded; + /// + /// The Transaction IDs associated with the inventory modifications + /// + public List TransactionIds; + } + + /// + /// Redeem items from the Nintendo EShop. + /// + [Serializable] + public class RedeemNintendoEShopInventoryItemsRequest : PlayFabRequestCommon + { + /// + /// The id of the entity's collection to perform this action on. (Default="default") + /// + public string CollectionId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// The Nintendo provided token authorizing redemption + /// + public string NintendoServiceAccountIdToken; + } + + [Serializable] + public class RedeemNintendoEShopInventoryItemsResponse : PlayFabResultCommon + { + /// + /// The list of failed redemptions from the external marketplace. + /// + public List Failed; + /// + /// The list of successful redemptions from the external marketplace. + /// + public List Succeeded; + /// + /// The Transaction IDs associated with the inventory modifications + /// + public List TransactionIds; + } + + /// + /// Redeem items from the PlayStation Store. + /// + [Serializable] + public class RedeemPlayStationStoreInventoryItemsRequest : PlayFabRequestCommon + { + /// + /// Auth code returned by PlayStation :tm: Network OAuth system. + /// + public string AuthorizationCode; + /// + /// The id of the entity's collection to perform this action on. (Default="default") + /// + public string CollectionId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// Redirect URI supplied to PlayStation :tm: Network when requesting an auth code. + /// + public string RedirectUri; + /// + /// Optional Service Label to pass into the request. + /// + public string ServiceLabel; + } + + [Serializable] + public class RedeemPlayStationStoreInventoryItemsResponse : PlayFabResultCommon + { + /// + /// The list of failed redemptions from the external marketplace. + /// + public List Failed; + /// + /// The list of successful redemptions from the external marketplace. + /// + public List Succeeded; + /// + /// The Transaction IDs associated with the inventory modifications + /// + public List TransactionIds; + } + + /// + /// Redeem inventory items from Steam. + /// + [Serializable] + public class RedeemSteamInventoryItemsRequest : PlayFabRequestCommon + { + /// + /// The id of the entity's collection to perform this action on. (Default="default") + /// + public string CollectionId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + } + + [Serializable] + public class RedeemSteamInventoryItemsResponse : PlayFabResultCommon + { + /// + /// The list of failed redemptions from the external marketplace. + /// + public List Failed; + /// + /// The list of successful redemptions from the external marketplace. + /// + public List Succeeded; + /// + /// The Transaction IDs associated with the inventory modifications + /// + public List TransactionIds; + } + + [Serializable] + public class RedemptionFailure : PlayFabBaseModel + { + /// + /// The marketplace failure code. + /// + public string FailureCode; + /// + /// The marketplace error details explaining why the offer failed to redeem. + /// + public string FailureDetails; + /// + /// The Marketplace Alternate ID being redeemed. + /// + public string MarketplaceAlternateId; + /// + /// The transaction id in the external marketplace. + /// + public string MarketplaceTransactionId; + } + + [Serializable] + public class RedemptionSuccess : PlayFabBaseModel + { + /// + /// The Marketplace Alternate ID being redeemed. + /// + public string MarketplaceAlternateId; + /// + /// The transaction id in the external marketplace. + /// + public string MarketplaceTransactionId; + /// + /// The timestamp for when the redeem was completed. + /// + public DateTime SuccessTimestamp; + } + + [Serializable] + public class ReportItemRequest : PlayFabRequestCommon + { + /// + /// An alternate ID associated with this item. + /// + public CatalogAlternateId AlternateId; + /// + /// Category of concern for this report. + /// + public ConcernCategory? ConcernCategory; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// The unique ID of the item. + /// + public string Id; + /// + /// The string reason for this report. + /// + public string Reason; + } + + [Serializable] + public class ReportItemResponse : PlayFabResultCommon + { + } + + /// + /// Submit a report for an inappropriate review, allowing the submitting user to specify their concern. + /// + [Serializable] + public class ReportItemReviewRequest : PlayFabRequestCommon + { + /// + /// An alternate ID of the item associated with the review. + /// + public CatalogAlternateId AlternateId; + /// + /// The reason this review is being reported. + /// + public ConcernCategory? ConcernCategory; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// The string ID of the item associated with the review. + /// + public string ItemId; + /// + /// The string reason for this report. + /// + public string Reason; + /// + /// The ID of the review to submit a report for. + /// + public string ReviewId; + } + + [Serializable] + public class ReportItemReviewResponse : PlayFabResultCommon + { + } + + [Serializable] + public class Review : PlayFabBaseModel + { + /// + /// The star rating associated with each selected category in this review. + /// + public Dictionary CategoryRatings; + /// + /// The number of negative helpfulness votes for this review. + /// + public int HelpfulNegative; + /// + /// The number of positive helpfulness votes for this review. + /// + public int HelpfulPositive; + /// + /// Indicates whether the review author has the item installed. + /// + public bool IsInstalled; + /// + /// The ID of the item being reviewed. + /// + public string ItemId; + /// + /// The version of the item being reviewed. + /// + public string ItemVersion; + /// + /// The locale for which this review was submitted in. + /// + public string Locale; + /// + /// Star rating associated with this review. + /// + public int Rating; + /// + /// The ID of the author of the review. + /// + public EntityKey ReviewerEntity; + /// + /// Deprecated. Use ReviewerEntity instead. This property will be removed in a future release. + /// + public string ReviewerId; + /// + /// The ID of the review. + /// + public string ReviewId; + /// + /// The full text of this review. + /// + public string ReviewText; + /// + /// The date and time this review was last submitted. + /// + public DateTime Submitted; + /// + /// The title of this review. + /// + public string Title; + } + + [Serializable] + public class ReviewConfig : PlayFabBaseModel + { + /// + /// A set of categories that can be applied toward ratings and reviews. + /// + public List CategoryRatings; + } + + [Serializable] + public class ReviewItemRequest : PlayFabRequestCommon + { + /// + /// An alternate ID associated with this item. + /// + public CatalogAlternateId AlternateId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// The unique ID of the item. + /// + public string Id; + /// + /// The review to submit. + /// + public Review Review; + } + + [Serializable] + public class ReviewItemResponse : PlayFabResultCommon + { + } + + [Serializable] + public class ReviewTakedown : PlayFabBaseModel + { + /// + /// An alternate ID associated with this item. + /// + public CatalogAlternateId AlternateId; + /// + /// The ID of the item associated with the review to take down. + /// + public string ItemId; + /// + /// The ID of the review to take down. + /// + public string ReviewId; + } + + [Serializable] + public class ScanResult : PlayFabBaseModel + { + /// + /// The URL of the item which failed the scan. + /// + public string Url; + } + + [Serializable] + public class SearchItemsRequest : PlayFabRequestCommon + { + /// + /// An opaque token used to retrieve the next page of items, if any are available. + /// + public string ContinuationToken; + /// + /// Number of items to retrieve. This value is optional. Maximum page size is 50. Default value is 10. + /// + public int Count; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// An OData filter used to refine the search query (For example: "type eq 'ugc'"). More info about Filter Complexity limits + /// can be found here: https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/catalog/search#limits + /// + public string Filter; + /// + /// The locale to be returned in the result. + /// + public string Language; + /// + /// An OData orderBy used to order the results of the search query. For example: "rating/average asc" + /// + public string OrderBy; + /// + /// The text to search for. + /// + public string Search; + /// + /// An OData select query option used to augment the search results. If not defined, the default search result metadata will + /// be returned. + /// + public string Select; + /// + /// The store to restrict the search request to. + /// + public StoreReference Store; + } + + [Serializable] + public class SearchItemsResponse : PlayFabResultCommon + { + /// + /// An opaque token used to retrieve the next page of items, if any are available. + /// + public string ContinuationToken; + /// + /// The paginated set of results for the search query. + /// + public List Items; + } + + [Serializable] + public class SetItemModerationStateRequest : PlayFabRequestCommon + { + /// + /// An alternate ID associated with this item. + /// + public CatalogAlternateId AlternateId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The unique ID of the item. + /// + public string Id; + /// + /// The reason for the moderation state change for the associated item. + /// + public string Reason; + /// + /// The status to set for the associated item. + /// + public ModerationStatus? Status; + } + + [Serializable] + public class SetItemModerationStateResponse : PlayFabResultCommon + { + } + + [Serializable] + public class StoreDetails : PlayFabBaseModel + { + /// + /// The options for the filter in filter-based stores. These options are mutually exclusive with item references. + /// + public FilterOptions FilterOptions; + /// + /// The permissions that control which players can purchase from the store. + /// + public Permissions Permissions; + /// + /// The global prices utilized in the store. These options are mutually exclusive with price options in item references. + /// + public CatalogPriceOptionsOverride PriceOptionsOverride; + } + + [Serializable] + public class StoreReference : PlayFabBaseModel + { + /// + /// An alternate ID of the store. + /// + public CatalogAlternateId AlternateId; + /// + /// The unique ID of the store. + /// + public string Id; + } + + [Serializable] + public class SubmitItemReviewVoteRequest : PlayFabRequestCommon + { + /// + /// An alternate ID of the item associated with the review. + /// + public CatalogAlternateId AlternateId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// The string ID of the item associated with the review. + /// + public string ItemId; + /// + /// The ID of the review to submit a helpfulness vote for. + /// + public string ReviewId; + /// + /// The helpfulness vote of the review. + /// + public HelpfulnessVote? Vote; + } + + [Serializable] + public class SubmitItemReviewVoteResponse : PlayFabResultCommon + { + } + + [Serializable] + public class SubscriptionDetails : PlayFabBaseModel + { + /// + /// The length of time that the subscription will last in seconds. + /// + public double DurationInSeconds; + } + + [Serializable] + public class SubtractInventoryItemsOperation : PlayFabBaseModel + { + /// + /// The amount to subtract from the current item amount. + /// + public int? Amount; + /// + /// Indicates whether stacks reduced to an amount of 0 during the request should be deleted from the inventory. (Default = + /// false). + /// + public bool DeleteEmptyStacks; + /// + /// The duration to subtract from the current item expiration date. + /// + public double? DurationInSeconds; + /// + /// The inventory item the operation applies to. + /// + public InventoryItemReference Item; + } + + /// + /// Given an entity type, entity identifier and container details, will subtract the specified inventory items. + /// + [Serializable] + public class SubtractInventoryItemsRequest : PlayFabRequestCommon + { + /// + /// The amount to subtract for the current item. + /// + public int? Amount; + /// + /// The id of the entity's collection to perform this action on. (Default="default"). The number of inventory collections is + /// unlimited. + /// + public string CollectionId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Indicates whether stacks reduced to an amount of 0 during the request should be deleted from the inventory. + /// (Default=false) + /// + public bool DeleteEmptyStacks; + /// + /// The duration to subtract from the current item expiration date. + /// + public double? DurationInSeconds; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// ETags are used for concurrency checking when updating resources. More information about using ETags can be found here: + /// https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/catalog/etags + /// + public string ETag; + /// + /// The Idempotency ID for this request. Idempotency IDs can be used to prevent operation replay in the medium term but will + /// be garbage collected eventually. + /// + public string IdempotencyId; + /// + /// The inventory item the request applies to. + /// + public InventoryItemReference Item; + } + + [Serializable] + public class SubtractInventoryItemsResponse : PlayFabResultCommon + { + /// + /// ETags are used for concurrency checking when updating resources. More information about using ETags can be found here: + /// https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/catalog/etags + /// + public string ETag; + /// + /// The idempotency id used in the request. + /// + public string IdempotencyId; + /// + /// The ids of transactions that occurred as a result of the request. + /// + public List TransactionIds; + } + + /// + /// Submit a request to takedown one or more reviews, removing them from public view. Authors will still be able to see + /// their reviews after being taken down. + /// + [Serializable] + public class TakedownItemReviewsRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The set of reviews to take down. + /// + public List Reviews; + } + + [Serializable] + public class TakedownItemReviewsResponse : PlayFabResultCommon + { + } + + [Serializable] + public class Transaction : PlayFabBaseModel + { + /// + /// The API call that caused this transaction. + /// + public string ApiName; + /// + /// The type of item that the the operation occurred on. + /// + public string ItemType; + /// + /// The operations that occurred. + /// + public List Operations; + /// + /// The type of operation that was run. + /// + public string OperationType; + /// + /// Additional details about the transaction. Null if it was not a purchase operation. + /// + public TransactionPurchaseDetails PurchaseDetails; + /// + /// Additional details about the transaction. Null if it was not a redeem operation. + /// + public TransactionRedeemDetails RedeemDetails; + /// + /// The time this transaction occurred in UTC. + /// + public DateTime Timestamp; + /// + /// The id of the transaction. This should be treated like an opaque token. + /// + public string TransactionId; + /// + /// Additional details about the transaction. Null if it was not a transfer operation. + /// + public TransactionTransferDetails TransferDetails; + } + + [Serializable] + public class TransactionOperation : PlayFabBaseModel + { + /// + /// The amount of items in this transaction. + /// + public int? Amount; + /// + /// The duration modified in this transaction. + /// + public double? DurationInSeconds; + /// + /// The friendly id of the items in this transaction. + /// + public string ItemFriendlyId; + /// + /// The item id of the items in this transaction. + /// + public string ItemId; + /// + /// The type of item that the operation occurred on. + /// + public string ItemType; + /// + /// The stack id of the items in this transaction. + /// + public string StackId; + /// + /// The type of the operation that occurred. + /// + public string Type; + } + + [Serializable] + public class TransactionPurchaseDetails : PlayFabBaseModel + { + /// + /// The friendly id of the Store the item was purchased from or null. + /// + public string StoreFriendlyId; + /// + /// The id of the Store the item was purchased from or null. + /// + public string StoreId; + } + + [Serializable] + public class TransactionRedeemDetails : PlayFabBaseModel + { + /// + /// The marketplace that the offer is being redeemed from. + /// + public string Marketplace; + /// + /// The transaction Id returned from the marketplace. + /// + public string MarketplaceTransactionId; + /// + /// The offer Id of the item being redeemed. + /// + public string OfferId; + } + + [Serializable] + public class TransactionTransferDetails : PlayFabBaseModel + { + /// + /// The collection id the items were transferred from or null if it was the current collection. + /// + public string GivingCollectionId; + /// + /// The entity the items were transferred from or null if it was the current entity. + /// + public EntityKey GivingEntity; + /// + /// The collection id the items were transferred to or null if it was the current collection. + /// + public string ReceivingCollectionId; + /// + /// The entity the items were transferred to or null if it was the current entity. + /// + public EntityKey ReceivingEntity; + /// + /// The id of the transfer that occurred. + /// + public string TransferId; + } + + [Serializable] + public class TransferInventoryItemsOperation : PlayFabBaseModel + { + /// + /// The amount to transfer. + /// + public int? Amount; + /// + /// Indicates whether stacks reduced to an amount of 0 during the operation should be deleted from the inventory. (Default = + /// false) + /// + public bool DeleteEmptyStacks; + /// + /// The inventory item the operation is transferring from. + /// + public InventoryItemReference GivingItem; + /// + /// The values to apply to a stack newly created by this operation. + /// + public InitialValues NewStackValues; + /// + /// The inventory item the operation is transferring to. + /// + public InventoryItemReference ReceivingItem; + } + + /// + /// Transfer the specified inventory items of an entity's container Id to another entity's container Id. + /// + [Serializable] + public class TransferInventoryItemsRequest : PlayFabRequestCommon + { + /// + /// The amount to transfer . + /// + public int? Amount; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Indicates whether stacks reduced to an amount of 0 during the request should be deleted from the inventory. (Default = + /// false) + /// + public bool DeleteEmptyStacks; + /// + /// The inventory collection id the request is transferring from. (Default="default") + /// + public string GivingCollectionId; + /// + /// The entity the request is transferring from. Set to the caller by default. + /// + public EntityKey GivingEntity; + /// + /// ETags are used for concurrency checking when updating resources (before transferring from). More information about using + /// ETags can be found here: https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/catalog/etags + /// + public string GivingETag; + /// + /// The inventory item the request is transferring from. + /// + public InventoryItemReference GivingItem; + /// + /// The idempotency id for the request. + /// + public string IdempotencyId; + /// + /// The values to apply to a stack newly created by this request. + /// + public InitialValues NewStackValues; + /// + /// The inventory collection id the request is transferring to. (Default="default") + /// + public string ReceivingCollectionId; + /// + /// The entity the request is transferring to. Set to the caller by default. + /// + public EntityKey ReceivingEntity; + /// + /// The inventory item the request is transferring to. + /// + public InventoryItemReference ReceivingItem; + } + + [Serializable] + public class TransferInventoryItemsResponse : PlayFabResultCommon + { + /// + /// ETags are used for concurrency checking when updating resources (after transferring from). More information about using + /// ETags can be found here: https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/catalog/etags + /// + public string GivingETag; + /// + /// The ids of transactions that occurred as a result of the request's giving action. + /// + public List GivingTransactionIds; + /// + /// The idempotency id for the request. + /// + public string IdempotencyId; + /// + /// The transfer operation status. Possible values are 'InProgress' or 'Completed'. If the operation has completed, the + /// response code will be 200. Otherwise, it will be 202. + /// + public string OperationStatus; + /// + /// The token that can be used to get the status of the transfer operation. This will only have a value if OperationStatus + /// is 'InProgress'. + /// + public string OperationToken; + /// + /// The ids of transactions that occurred as a result of the request's receiving action. + /// + public List ReceivingTransactionIds; + } + + [Serializable] + public class UpdateCatalogConfigRequest : PlayFabRequestCommon + { + /// + /// The updated catalog configuration. + /// + public CatalogConfig Config; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + [Serializable] + public class UpdateCatalogConfigResponse : PlayFabResultCommon + { + } + + [Serializable] + public class UpdateDraftItemRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Updated metadata describing the catalog item to be updated. + /// + public CatalogItem Item; + /// + /// Whether the item should be published immediately. This value is optional, defaults to false. + /// + public bool Publish; + } + + [Serializable] + public class UpdateDraftItemResponse : PlayFabResultCommon + { + /// + /// Updated metadata describing the catalog item just updated. + /// + public CatalogItem Item; + } + + [Serializable] + public class UpdateInventoryItemsOperation : PlayFabBaseModel + { + /// + /// The inventory item to update with the specified values. + /// + public InventoryItem Item; + } + + /// + /// Given an entity type, entity identifier and container details, will update the entity's inventory items + /// + [Serializable] + public class UpdateInventoryItemsRequest : PlayFabRequestCommon + { + /// + /// The id of the entity's collection to perform this action on. (Default="default"). The number of inventory collections is + /// unlimited. + /// + public string CollectionId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// ETags are used for concurrency checking when updating resources. More information about using ETags can be found here: + /// https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/catalog/etags + /// + public string ETag; + /// + /// The Idempotency ID for this request. Idempotency IDs can be used to prevent operation replay in the medium term but will + /// be garbage collected eventually. + /// + public string IdempotencyId; + /// + /// The inventory item to update with the specified values. + /// + public InventoryItem Item; + } + + [Serializable] + public class UpdateInventoryItemsResponse : PlayFabResultCommon + { + /// + /// ETags are used for concurrency checking when updating resources. More information about using ETags can be found here: + /// https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/catalog/etags + /// + public string ETag; + /// + /// The idempotency id used in the request. + /// + public string IdempotencyId; + /// + /// The ids of transactions that occurred as a result of the request. + /// + public List TransactionIds; + } + + [Serializable] + public class UploadInfo : PlayFabBaseModel + { + /// + /// Name of the file to be uploaded. + /// + public string FileName; + } + + [Serializable] + public class UploadUrlMetadata : PlayFabBaseModel + { + /// + /// Name of the file for which this upload URL was requested. + /// + public string FileName; + /// + /// Unique ID for the binary content to be uploaded to the target URL. + /// + public string Id; + /// + /// URL for the binary content to be uploaded to. + /// + public string Url; + } + + [Serializable] + public class UserGeneratedContentSpecificConfig : PlayFabBaseModel + { + /// + /// The set of content types that will be used for validation. + /// + public List ContentTypes; + /// + /// The set of tags that will be used for validation. + /// + public List Tags; + } +} +#endif diff --git a/Assets/PlayFabSDK/Economy/PlayFabEconomyModels.cs.meta b/Assets/PlayFabSDK/Economy/PlayFabEconomyModels.cs.meta new file mode 100644 index 00000000..72068f41 --- /dev/null +++ b/Assets/PlayFabSDK/Economy/PlayFabEconomyModels.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9e420d6be63cf50498180c2df1199abc +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Economy/PlayFabEvents.cs b/Assets/PlayFabSDK/Economy/PlayFabEvents.cs new file mode 100644 index 00000000..f9570519 --- /dev/null +++ b/Assets/PlayFabSDK/Economy/PlayFabEvents.cs @@ -0,0 +1,102 @@ +#if !DISABLE_PLAYFABENTITY_API +using PlayFab.EconomyModels; + +namespace PlayFab.Events +{ + public partial class PlayFabEvents + { + public event PlayFabRequestEvent OnEconomyAddInventoryItemsRequestEvent; + public event PlayFabResultEvent OnEconomyAddInventoryItemsResultEvent; + public event PlayFabRequestEvent OnEconomyCreateDraftItemRequestEvent; + public event PlayFabResultEvent OnEconomyCreateDraftItemResultEvent; + public event PlayFabRequestEvent OnEconomyCreateUploadUrlsRequestEvent; + public event PlayFabResultEvent OnEconomyCreateUploadUrlsResultEvent; + public event PlayFabRequestEvent OnEconomyDeleteEntityItemReviewsRequestEvent; + public event PlayFabResultEvent OnEconomyDeleteEntityItemReviewsResultEvent; + public event PlayFabRequestEvent OnEconomyDeleteInventoryCollectionRequestEvent; + public event PlayFabResultEvent OnEconomyDeleteInventoryCollectionResultEvent; + public event PlayFabRequestEvent OnEconomyDeleteInventoryItemsRequestEvent; + public event PlayFabResultEvent OnEconomyDeleteInventoryItemsResultEvent; + public event PlayFabRequestEvent OnEconomyDeleteItemRequestEvent; + public event PlayFabResultEvent OnEconomyDeleteItemResultEvent; + public event PlayFabRequestEvent OnEconomyExecuteInventoryOperationsRequestEvent; + public event PlayFabResultEvent OnEconomyExecuteInventoryOperationsResultEvent; + public event PlayFabRequestEvent OnEconomyExecuteTransferOperationsRequestEvent; + public event PlayFabResultEvent OnEconomyExecuteTransferOperationsResultEvent; + public event PlayFabRequestEvent OnEconomyGetCatalogConfigRequestEvent; + public event PlayFabResultEvent OnEconomyGetCatalogConfigResultEvent; + public event PlayFabRequestEvent OnEconomyGetDraftItemRequestEvent; + public event PlayFabResultEvent OnEconomyGetDraftItemResultEvent; + public event PlayFabRequestEvent OnEconomyGetDraftItemsRequestEvent; + public event PlayFabResultEvent OnEconomyGetDraftItemsResultEvent; + public event PlayFabRequestEvent OnEconomyGetEntityDraftItemsRequestEvent; + public event PlayFabResultEvent OnEconomyGetEntityDraftItemsResultEvent; + public event PlayFabRequestEvent OnEconomyGetEntityItemReviewRequestEvent; + public event PlayFabResultEvent OnEconomyGetEntityItemReviewResultEvent; + public event PlayFabRequestEvent OnEconomyGetInventoryCollectionIdsRequestEvent; + public event PlayFabResultEvent OnEconomyGetInventoryCollectionIdsResultEvent; + public event PlayFabRequestEvent OnEconomyGetInventoryItemsRequestEvent; + public event PlayFabResultEvent OnEconomyGetInventoryItemsResultEvent; + public event PlayFabRequestEvent OnEconomyGetInventoryOperationStatusRequestEvent; + public event PlayFabResultEvent OnEconomyGetInventoryOperationStatusResultEvent; + public event PlayFabRequestEvent OnEconomyGetItemRequestEvent; + public event PlayFabResultEvent OnEconomyGetItemResultEvent; + public event PlayFabRequestEvent OnEconomyGetItemContainersRequestEvent; + public event PlayFabResultEvent OnEconomyGetItemContainersResultEvent; + public event PlayFabRequestEvent OnEconomyGetItemModerationStateRequestEvent; + public event PlayFabResultEvent OnEconomyGetItemModerationStateResultEvent; + public event PlayFabRequestEvent OnEconomyGetItemPublishStatusRequestEvent; + public event PlayFabResultEvent OnEconomyGetItemPublishStatusResultEvent; + public event PlayFabRequestEvent OnEconomyGetItemReviewsRequestEvent; + public event PlayFabResultEvent OnEconomyGetItemReviewsResultEvent; + public event PlayFabRequestEvent OnEconomyGetItemReviewSummaryRequestEvent; + public event PlayFabResultEvent OnEconomyGetItemReviewSummaryResultEvent; + public event PlayFabRequestEvent OnEconomyGetItemsRequestEvent; + public event PlayFabResultEvent OnEconomyGetItemsResultEvent; + public event PlayFabRequestEvent OnEconomyGetMicrosoftStoreAccessTokensRequestEvent; + public event PlayFabResultEvent OnEconomyGetMicrosoftStoreAccessTokensResultEvent; + public event PlayFabRequestEvent OnEconomyGetTransactionHistoryRequestEvent; + public event PlayFabResultEvent OnEconomyGetTransactionHistoryResultEvent; + public event PlayFabRequestEvent OnEconomyPublishDraftItemRequestEvent; + public event PlayFabResultEvent OnEconomyPublishDraftItemResultEvent; + public event PlayFabRequestEvent OnEconomyPurchaseInventoryItemsRequestEvent; + public event PlayFabResultEvent OnEconomyPurchaseInventoryItemsResultEvent; + public event PlayFabRequestEvent OnEconomyRedeemAppleAppStoreInventoryItemsRequestEvent; + public event PlayFabResultEvent OnEconomyRedeemAppleAppStoreInventoryItemsResultEvent; + public event PlayFabRequestEvent OnEconomyRedeemGooglePlayInventoryItemsRequestEvent; + public event PlayFabResultEvent OnEconomyRedeemGooglePlayInventoryItemsResultEvent; + public event PlayFabRequestEvent OnEconomyRedeemMicrosoftStoreInventoryItemsRequestEvent; + public event PlayFabResultEvent OnEconomyRedeemMicrosoftStoreInventoryItemsResultEvent; + public event PlayFabRequestEvent OnEconomyRedeemNintendoEShopInventoryItemsRequestEvent; + public event PlayFabResultEvent OnEconomyRedeemNintendoEShopInventoryItemsResultEvent; + public event PlayFabRequestEvent OnEconomyRedeemPlayStationStoreInventoryItemsRequestEvent; + public event PlayFabResultEvent OnEconomyRedeemPlayStationStoreInventoryItemsResultEvent; + public event PlayFabRequestEvent OnEconomyRedeemSteamInventoryItemsRequestEvent; + public event PlayFabResultEvent OnEconomyRedeemSteamInventoryItemsResultEvent; + public event PlayFabRequestEvent OnEconomyReportItemRequestEvent; + public event PlayFabResultEvent OnEconomyReportItemResultEvent; + public event PlayFabRequestEvent OnEconomyReportItemReviewRequestEvent; + public event PlayFabResultEvent OnEconomyReportItemReviewResultEvent; + public event PlayFabRequestEvent OnEconomyReviewItemRequestEvent; + public event PlayFabResultEvent OnEconomyReviewItemResultEvent; + public event PlayFabRequestEvent OnEconomySearchItemsRequestEvent; + public event PlayFabResultEvent OnEconomySearchItemsResultEvent; + public event PlayFabRequestEvent OnEconomySetItemModerationStateRequestEvent; + public event PlayFabResultEvent OnEconomySetItemModerationStateResultEvent; + public event PlayFabRequestEvent OnEconomySubmitItemReviewVoteRequestEvent; + public event PlayFabResultEvent OnEconomySubmitItemReviewVoteResultEvent; + public event PlayFabRequestEvent OnEconomySubtractInventoryItemsRequestEvent; + public event PlayFabResultEvent OnEconomySubtractInventoryItemsResultEvent; + public event PlayFabRequestEvent OnEconomyTakedownItemReviewsRequestEvent; + public event PlayFabResultEvent OnEconomyTakedownItemReviewsResultEvent; + public event PlayFabRequestEvent OnEconomyTransferInventoryItemsRequestEvent; + public event PlayFabResultEvent OnEconomyTransferInventoryItemsResultEvent; + public event PlayFabRequestEvent OnEconomyUpdateCatalogConfigRequestEvent; + public event PlayFabResultEvent OnEconomyUpdateCatalogConfigResultEvent; + public event PlayFabRequestEvent OnEconomyUpdateDraftItemRequestEvent; + public event PlayFabResultEvent OnEconomyUpdateDraftItemResultEvent; + public event PlayFabRequestEvent OnEconomyUpdateInventoryItemsRequestEvent; + public event PlayFabResultEvent OnEconomyUpdateInventoryItemsResultEvent; + } +} +#endif diff --git a/Assets/PlayFabSDK/Economy/PlayFabEvents.cs.meta b/Assets/PlayFabSDK/Economy/PlayFabEvents.cs.meta new file mode 100644 index 00000000..db4b7ba1 --- /dev/null +++ b/Assets/PlayFabSDK/Economy/PlayFabEvents.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a2679e440c4893c4f9b6e5d5314c0465 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Entity.meta b/Assets/PlayFabSDK/Entity.meta new file mode 100644 index 00000000..a0fe5c37 --- /dev/null +++ b/Assets/PlayFabSDK/Entity.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0cc9862b1ce280447a524f5d4bcb3c30 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Entity/ScreenTimeTracker.cs b/Assets/PlayFabSDK/Entity/ScreenTimeTracker.cs new file mode 100644 index 00000000..3ed9f1a8 --- /dev/null +++ b/Assets/PlayFabSDK/Entity/ScreenTimeTracker.cs @@ -0,0 +1,255 @@ +#if !DISABLE_PLAYFABENTITY_API && !DISABLE_PLAYFABCLIENT_API +using System; +using System.Collections.Generic; +using UnityEngine; + +namespace PlayFab.Public +{ + /// + /// Interface which can be used to implement class responsible for gathering and sending information about session. + /// + public interface IScreenTimeTracker + { + // Unity MonoBehaviour callbacks + void OnEnable(); + void OnDisable(); + void OnDestroy(); + void OnApplicationQuit(); + void OnApplicationFocus(bool isFocused); + + // Class specific methods + void ClientSessionStart(string entityId, string entityType, string playFabUserId); + void Send(); + } + + /// + /// Class responsible for gathering and sending information about session, for example: focus duration, device info, etc. + /// + public class ScreenTimeTracker : IScreenTimeTracker + { + private Guid focusId; + private Guid gameSessionID = Guid.NewGuid(); + private bool initialFocus = true; + private bool isSending = false; + private DateTime focusOffDateTime = DateTime.UtcNow; + private DateTime focusOnDateTime = DateTime.UtcNow; + + private Queue eventsRequests = new Queue(); + + private EventsModels.EntityKey entityKey = new EventsModels.EntityKey(); + private const string eventNamespace = "com.playfab.events.sessions"; + private const int maxBatchSizeInEvents = 10; + + private PlayFabEventsInstanceAPI eventApi; + + public ScreenTimeTracker() + { + eventApi = new PlayFabEventsInstanceAPI(PlayFabSettings.staticPlayer); + } + + private void EnsureSingleGameSessionId() + { + if (gameSessionID == Guid.Empty) + { + gameSessionID = Guid.NewGuid(); + } + } + + /// + /// Start session, the function responsible for creating SessionID and gathering information about user and device + /// + /// Result of the user's login, represent user ID + public void ClientSessionStart(string entityId, string entityType, string playFabUserId) + { + EnsureSingleGameSessionId(); + + entityKey.Id = entityId; + entityKey.Type = entityType; + + EventsModels.EventContents eventInfo = new EventsModels.EventContents(); + + eventInfo.Name = "client_session_start"; + eventInfo.EventNamespace = eventNamespace; + eventInfo.Entity = entityKey; + eventInfo.OriginalTimestamp = DateTime.UtcNow; + + var payload = new Dictionary + { + { "UserID", playFabUserId}, + { "DeviceType", SystemInfo.deviceType}, + { "DeviceModel", SystemInfo.deviceModel}, + { "OS", SystemInfo.operatingSystem }, + { "ClientSessionID", gameSessionID }, + }; + + eventInfo.Payload = payload; + eventsRequests.Enqueue(eventInfo); + + // Fake a focus-on event at the time of the first login: + OnApplicationFocus(true); + } + + /// + /// Gather information about user's focus. Calculates interaction durations. + /// Name mimics MonoBehaviour method, for ease of integration. + /// + /// State of focus + public void OnApplicationFocus(bool isFocused) + { + EnsureSingleGameSessionId(); + EventsModels.EventContents eventInfo = new EventsModels.EventContents(); + DateTime currentUtcDateTime = DateTime.UtcNow; + + eventInfo.Name = "client_focus_change"; + eventInfo.EventNamespace = eventNamespace; + eventInfo.Entity = entityKey; + + double focusStateDuration = 0.0; + + if (initialFocus) + { + focusId = Guid.NewGuid(); + } + + if (isFocused) + { + // start counting focus-on time + focusOnDateTime = currentUtcDateTime; + + // new id per focus + focusId = Guid.NewGuid(); + + if (!initialFocus) + { + focusStateDuration = (currentUtcDateTime - focusOffDateTime).TotalSeconds; + + // this check safeguards from manual time changes while app is running + if (focusStateDuration < 0) + { + focusStateDuration = 0; + } + } + } + else + { + focusStateDuration = (currentUtcDateTime - focusOnDateTime).TotalSeconds; + + // this check safeguards from manual time changes while app is running + if (focusStateDuration < 0) + { + focusStateDuration = 0; + } + + // start counting focus-off time + focusOffDateTime = currentUtcDateTime; + } + + var payload = new Dictionary { + { "FocusID", focusId }, + { "FocusState", isFocused }, + { "FocusStateDuration", focusStateDuration }, + { "EventTimestamp", currentUtcDateTime }, + { "ClientSessionID", gameSessionID }, + }; + + eventInfo.OriginalTimestamp = currentUtcDateTime; + eventInfo.Payload = payload; + eventsRequests.Enqueue(eventInfo); + + initialFocus = false; + + if (!isFocused) + { + // Force the eventsRequests queue to empty. + // If we are losing focus we should make an attempt to push out a focus lost event ASAP + Send(); + } + + } + + /// + /// Sends events to server. + /// + public void Send() + { + if (PlayFabSettings.staticPlayer.IsClientLoggedIn() && (isSending == false)) + { + isSending = true; + + EventsModels.WriteEventsRequest request = new EventsModels.WriteEventsRequest(); + request.Events = new List(); + + while ((eventsRequests.Count > 0) && (request.Events.Count < maxBatchSizeInEvents)) + { + EventsModels.EventContents eventInfo = eventsRequests.Dequeue(); + request.Events.Add(eventInfo); + } + + if (request.Events.Count > 0) + { + eventApi.WriteEvents(request, EventSentSuccessfulCallback, EventSentErrorCallback); + } + + isSending = false; + } + } + + /// + /// Callback to handle successful server interaction. + /// + /// Server response + private void EventSentSuccessfulCallback(EventsModels.WriteEventsResponse response) + { + // add code to work with successful callback + } + + /// + /// Callback to handle unsuccessful server interaction. + /// + /// Server response + private void EventSentErrorCallback(PlayFabError response) + { + Debug.LogWarning("Failed to send session data. Error: " + response.GenerateErrorReport()); + } + + #region Unused MonoBehaviour compatibility methods + /// + /// Unused + /// Name mimics MonoBehaviour method, for ease of integration. + /// + public void OnEnable() + { + // add code sending events on enable + } + + /// + /// Unused + /// Name mimics MonoBehaviour method, for ease of integration. + /// + public void OnDisable() + { + // add code sending events on disable + } + + /// + /// Unused + /// Name mimics MonoBehaviour method, for ease of integration. + /// + public void OnDestroy() + { + // add code sending events on destroy + } + #endregion + + /// + /// Trying to send event during game exit. Note: works only on certain platforms. + /// Name mimics MonoBehaviour method, for ease of integration. + /// + public void OnApplicationQuit() + { + // trying to send events during game exit + Send(); + } + } +} +#endif diff --git a/Assets/PlayFabSDK/Entity/ScreenTimeTracker.cs.meta b/Assets/PlayFabSDK/Entity/ScreenTimeTracker.cs.meta new file mode 100644 index 00000000..d44c5305 --- /dev/null +++ b/Assets/PlayFabSDK/Entity/ScreenTimeTracker.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: bb87bdc3f40216e419c8f1b76c4517d6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Events.meta b/Assets/PlayFabSDK/Events.meta new file mode 100644 index 00000000..bdd04680 --- /dev/null +++ b/Assets/PlayFabSDK/Events.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 752b9560d5da7b9439605b88f6e1cf82 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Events/PlayFabEvents.cs b/Assets/PlayFabSDK/Events/PlayFabEvents.cs new file mode 100644 index 00000000..ced12796 --- /dev/null +++ b/Assets/PlayFabSDK/Events/PlayFabEvents.cs @@ -0,0 +1,24 @@ +#if !DISABLE_PLAYFABENTITY_API +using PlayFab.EventsModels; + +namespace PlayFab.Events +{ + public partial class PlayFabEvents + { + public event PlayFabRequestEvent OnEventsCreateTelemetryKeyRequestEvent; + public event PlayFabResultEvent OnEventsCreateTelemetryKeyResultEvent; + public event PlayFabRequestEvent OnEventsDeleteTelemetryKeyRequestEvent; + public event PlayFabResultEvent OnEventsDeleteTelemetryKeyResultEvent; + public event PlayFabRequestEvent OnEventsGetTelemetryKeyRequestEvent; + public event PlayFabResultEvent OnEventsGetTelemetryKeyResultEvent; + public event PlayFabRequestEvent OnEventsListTelemetryKeysRequestEvent; + public event PlayFabResultEvent OnEventsListTelemetryKeysResultEvent; + public event PlayFabRequestEvent OnEventsSetTelemetryKeyActiveRequestEvent; + public event PlayFabResultEvent OnEventsSetTelemetryKeyActiveResultEvent; + public event PlayFabRequestEvent OnEventsWriteEventsRequestEvent; + public event PlayFabResultEvent OnEventsWriteEventsResultEvent; + public event PlayFabRequestEvent OnEventsWriteTelemetryEventsRequestEvent; + public event PlayFabResultEvent OnEventsWriteTelemetryEventsResultEvent; + } +} +#endif diff --git a/Assets/PlayFabSDK/Events/PlayFabEvents.cs.meta b/Assets/PlayFabSDK/Events/PlayFabEvents.cs.meta new file mode 100644 index 00000000..b3fa18a3 --- /dev/null +++ b/Assets/PlayFabSDK/Events/PlayFabEvents.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 816bf581b4b09c04bbf42adfea99a423 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Events/PlayFabEventsAPI.cs b/Assets/PlayFabSDK/Events/PlayFabEventsAPI.cs new file mode 100644 index 00000000..46ecbc6d --- /dev/null +++ b/Assets/PlayFabSDK/Events/PlayFabEventsAPI.cs @@ -0,0 +1,144 @@ +#if !DISABLE_PLAYFABENTITY_API && !DISABLE_PLAYFAB_STATIC_API + +using System; +using System.Collections.Generic; +using PlayFab.EventsModels; +using PlayFab.Internal; + +namespace PlayFab +{ + /// + /// Write custom PlayStream and Telemetry events for any PlayFab entity. Telemetry events can be used for analytic, + /// reporting, or debugging. PlayStream events can do all of that and also trigger custom actions in near real-time. + /// + public static class PlayFabEventsAPI + { + static PlayFabEventsAPI() {} + + + /// + /// Verify entity login. + /// + public static bool IsEntityLoggedIn() + { + return PlayFabSettings.staticPlayer.IsEntityLoggedIn(); + } + + /// + /// Clear the Client SessionToken which allows this Client to call API calls requiring login. + /// A new/fresh login will be required after calling this. + /// + public static void ForgetAllCredentials() + { + PlayFabSettings.staticPlayer.ForgetAllCredentials(); + } + + /// + /// Creates a new telemetry key for the title. + /// + public static void CreateTelemetryKey(CreateTelemetryKeyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Event/CreateTelemetryKey", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Deletes a telemetry key configured for the title. + /// + public static void DeleteTelemetryKey(DeleteTelemetryKeyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Event/DeleteTelemetryKey", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets information about a telemetry key configured for the title. + /// + public static void GetTelemetryKey(GetTelemetryKeyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Event/GetTelemetryKey", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Lists all telemetry keys configured for the title. + /// + public static void ListTelemetryKeys(ListTelemetryKeysRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Event/ListTelemetryKeys", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Sets a telemetry key to the active or deactivated state. + /// + public static void SetTelemetryKeyActive(SetTelemetryKeyActiveRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Event/SetTelemetryKeyActive", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Write batches of entity based events to PlayStream. The namespace of the Event must be 'custom' or start with 'custom.'. + /// + public static void WriteEvents(WriteEventsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Event/WriteEvents", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Write batches of entity based events to as Telemetry events (bypass PlayStream). The namespace must be 'custom' or start + /// with 'custom.' + /// + public static void WriteTelemetryEvents(WriteEventsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Event/WriteTelemetryEvents", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Write batches of entity based events to as Telemetry events (bypass PlayStream) using a Telemetry Key. The namespace must be 'custom' or start + /// with 'custom.' + /// + public static void WriteTelemetryEventsWithTelemetryKey(WriteEventsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsTelemetryKeyProvided()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must provide a telemetry key to call this method"); + + PlayFabHttp.MakeApiCall("/Event/WriteTelemetryEvents", request, AuthType.TelemetryKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + } +} + +#endif diff --git a/Assets/PlayFabSDK/Events/PlayFabEventsAPI.cs.meta b/Assets/PlayFabSDK/Events/PlayFabEventsAPI.cs.meta new file mode 100644 index 00000000..f41b3427 --- /dev/null +++ b/Assets/PlayFabSDK/Events/PlayFabEventsAPI.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6209aee5722aa2c46ba625e1944d6fa8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Events/PlayFabEventsInstanceAPI.cs b/Assets/PlayFabSDK/Events/PlayFabEventsInstanceAPI.cs new file mode 100644 index 00000000..63d0e104 --- /dev/null +++ b/Assets/PlayFabSDK/Events/PlayFabEventsInstanceAPI.cs @@ -0,0 +1,148 @@ +#if !DISABLE_PLAYFABENTITY_API + +using System; +using System.Collections.Generic; +using PlayFab.EventsModels; +using PlayFab.Internal; +using PlayFab.SharedModels; + +namespace PlayFab +{ + /// + /// Write custom PlayStream and Telemetry events for any PlayFab entity. Telemetry events can be used for analytic, + /// reporting, or debugging. PlayStream events can do all of that and also trigger custom actions in near real-time. + /// + public class PlayFabEventsInstanceAPI : IPlayFabInstanceApi + { + public readonly PlayFabApiSettings apiSettings = null; + public readonly PlayFabAuthenticationContext authenticationContext = null; + + public PlayFabEventsInstanceAPI(PlayFabAuthenticationContext context) + { + if (context == null) + throw new PlayFabException(PlayFabExceptionCode.AuthContextRequired, "Context cannot be null, create a PlayFabAuthenticationContext for each player in advance, or call .GetAuthenticationContext()"); + authenticationContext = context; + } + + public PlayFabEventsInstanceAPI(PlayFabApiSettings settings, PlayFabAuthenticationContext context) + { + if (context == null) + throw new PlayFabException(PlayFabExceptionCode.AuthContextRequired, "Context cannot be null, create a PlayFabAuthenticationContext for each player in advance, or call .GetAuthenticationContext()"); + apiSettings = settings; + authenticationContext = context; + } + + /// + /// Verify entity login. + /// + public bool IsEntityLoggedIn() + { + return authenticationContext == null ? false : authenticationContext.IsEntityLoggedIn(); + } + + /// + /// Clear the Client SessionToken which allows this Client to call API calls requiring login. + /// A new/fresh login will be required after calling this. + /// + public void ForgetAllCredentials() + { + if (authenticationContext != null) + { + authenticationContext.ForgetAllCredentials(); + } + } + + /// + /// Creates a new telemetry key for the title. + /// + public void CreateTelemetryKey(CreateTelemetryKeyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Event/CreateTelemetryKey", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Deletes a telemetry key configured for the title. + /// + public void DeleteTelemetryKey(DeleteTelemetryKeyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Event/DeleteTelemetryKey", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets information about a telemetry key configured for the title. + /// + public void GetTelemetryKey(GetTelemetryKeyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Event/GetTelemetryKey", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Lists all telemetry keys configured for the title. + /// + public void ListTelemetryKeys(ListTelemetryKeysRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Event/ListTelemetryKeys", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Sets a telemetry key to the active or deactivated state. + /// + public void SetTelemetryKeyActive(SetTelemetryKeyActiveRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Event/SetTelemetryKeyActive", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Write batches of entity based events to PlayStream. The namespace of the Event must be 'custom' or start with 'custom.'. + /// + public void WriteEvents(WriteEventsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Event/WriteEvents", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Write batches of entity based events to as Telemetry events (bypass PlayStream). The namespace must be 'custom' or start + /// with 'custom.' + /// + public void WriteTelemetryEvents(WriteEventsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Event/WriteTelemetryEvents", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + /// + /// Write batches of entity based events to as Telemetry events (bypass PlayStream) using a Telemetry Key. The namespace must be 'custom' or start + /// with 'custom.' + /// + public void WriteTelemetryEventsWithTelemetryKey(WriteEventsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsTelemetryKeyProvided()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must provide a telemetry key to call this method"); + + PlayFabHttp.MakeApiCall("/Event/WriteTelemetryEvents", request, AuthType.TelemetryKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + } +} + +#endif diff --git a/Assets/PlayFabSDK/Events/PlayFabEventsInstanceAPI.cs.meta b/Assets/PlayFabSDK/Events/PlayFabEventsInstanceAPI.cs.meta new file mode 100644 index 00000000..38d0c3b7 --- /dev/null +++ b/Assets/PlayFabSDK/Events/PlayFabEventsInstanceAPI.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: efc8181560ecd0748a12a6df7137998e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Events/PlayFabEventsModels.cs b/Assets/PlayFabSDK/Events/PlayFabEventsModels.cs new file mode 100644 index 00000000..4375615e --- /dev/null +++ b/Assets/PlayFabSDK/Events/PlayFabEventsModels.cs @@ -0,0 +1,248 @@ +#if !DISABLE_PLAYFABENTITY_API +using System; +using System.Collections.Generic; +using PlayFab.SharedModels; + +namespace PlayFab.EventsModels +{ + [Serializable] + public class CreateTelemetryKeyRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The optional entity to perform this action on. Defaults to the currently logged in entity. + /// + public EntityKey Entity; + /// + /// The name of the new key. Telemetry key names must be unique within the scope of the title. + /// + public string KeyName; + } + + [Serializable] + public class CreateTelemetryKeyResponse : PlayFabResultCommon + { + /// + /// Details about the newly created telemetry key. + /// + public TelemetryKeyDetails NewKeyDetails; + } + + [Serializable] + public class DeleteTelemetryKeyRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The optional entity to perform this action on. Defaults to the currently logged in entity. + /// + public EntityKey Entity; + /// + /// The name of the key to delete. + /// + public string KeyName; + } + + [Serializable] + public class DeleteTelemetryKeyResponse : PlayFabResultCommon + { + /// + /// Indicates whether or not the key was deleted. If false, no key with that name existed. + /// + public bool WasKeyDeleted; + } + + /// + /// Combined entity type and ID structure which uniquely identifies a single entity. + /// + [Serializable] + public class EntityKey : PlayFabBaseModel + { + /// + /// Unique ID of the entity. + /// + public string Id; + /// + /// Entity type. See https://docs.microsoft.com/gaming/playfab/features/data/entities/available-built-in-entity-types + /// + public string Type; + } + + [Serializable] + public class EventContents : PlayFabBaseModel + { + /// + /// The optional custom tags associated with the event (e.g. build number, external trace identifiers, etc.). Before an + /// event is written, this collection and the base request custom tags will be merged, but not overriden. This enables the + /// caller to specify static tags and per event tags. + /// + public Dictionary CustomTags; + /// + /// Entity associated with the event. If null, the event will apply to the calling entity. + /// + public EntityKey Entity; + /// + /// The namespace in which the event is defined. Allowed namespaces can vary by API. + /// + public string EventNamespace; + /// + /// The name of this event. + /// + public string Name; + /// + /// The original unique identifier associated with this event before it was posted to PlayFab. The value might differ from + /// the EventId value, which is assigned when the event is received by the server. + /// + public string OriginalId; + /// + /// The time (in UTC) associated with this event when it occurred. If specified, this value is stored in the + /// OriginalTimestamp property of the PlayStream event. + /// + public DateTime? OriginalTimestamp; + /// + /// Arbitrary data associated with the event. Only one of Payload or PayloadJSON is allowed. + /// + public object Payload; + /// + /// Arbitrary data associated with the event, represented as a JSON serialized string. Only one of Payload or PayloadJSON is + /// allowed. + /// + public string PayloadJSON; + } + + [Serializable] + public class GetTelemetryKeyRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The optional entity to perform this action on. Defaults to the currently logged in entity. + /// + public EntityKey Entity; + /// + /// The name of the key to retrieve. + /// + public string KeyName; + } + + [Serializable] + public class GetTelemetryKeyResponse : PlayFabResultCommon + { + /// + /// Details about the requested telemetry key. + /// + public TelemetryKeyDetails KeyDetails; + } + + [Serializable] + public class ListTelemetryKeysRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The optional entity to perform this action on. Defaults to the currently logged in entity. + /// + public EntityKey Entity; + } + + [Serializable] + public class ListTelemetryKeysResponse : PlayFabResultCommon + { + /// + /// The telemetry keys configured for the title. + /// + public List KeyDetails; + } + + [Serializable] + public class SetTelemetryKeyActiveRequest : PlayFabRequestCommon + { + /// + /// Whether to set the key to active (true) or deactivated (false). + /// + public bool Active; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The optional entity to perform this action on. Defaults to the currently logged in entity. + /// + public EntityKey Entity; + /// + /// The name of the key to update. + /// + public string KeyName; + } + + [Serializable] + public class SetTelemetryKeyActiveResponse : PlayFabResultCommon + { + /// + /// The most current details about the telemetry key that was to be updated. + /// + public TelemetryKeyDetails KeyDetails; + /// + /// Indicates whether or not the key was updated. If false, the key was already in the desired state. + /// + public bool WasKeyUpdated; + } + + [Serializable] + public class TelemetryKeyDetails : PlayFabBaseModel + { + /// + /// When the key was created. + /// + public DateTime CreateTime; + /// + /// Whether or not the key is currently active. Deactivated keys cannot be used for telemetry ingestion. + /// + public bool IsActive; + /// + /// The key that can be distributed to clients for use during telemetry ingestion. + /// + public string KeyValue; + /// + /// When the key was last updated. + /// + public DateTime LastUpdateTime; + /// + /// The name of the key. Telemetry key names are unique within the scope of the title. + /// + public string Name; + } + + [Serializable] + public class WriteEventsRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The collection of events to write. Up to 200 events can be written per request. + /// + public List Events; + } + + [Serializable] + public class WriteEventsResponse : PlayFabResultCommon + { + /// + /// The unique identifiers assigned by the server to the events, in the same order as the events in the request. Only + /// returned if FlushToPlayStream option is true. + /// + public List AssignedEventIds; + } +} +#endif diff --git a/Assets/PlayFabSDK/Events/PlayFabEventsModels.cs.meta b/Assets/PlayFabSDK/Events/PlayFabEventsModels.cs.meta new file mode 100644 index 00000000..4e6f8cc4 --- /dev/null +++ b/Assets/PlayFabSDK/Events/PlayFabEventsModels.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9ee524faa41ee444ca207259e58e70a1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Experimentation.meta b/Assets/PlayFabSDK/Experimentation.meta new file mode 100644 index 00000000..b0c6ff9f --- /dev/null +++ b/Assets/PlayFabSDK/Experimentation.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: aaeb8bc2d6b1b3b47b1697d7043d654b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Experimentation/PlayFabEvents.cs b/Assets/PlayFabSDK/Experimentation/PlayFabEvents.cs new file mode 100644 index 00000000..816314ab --- /dev/null +++ b/Assets/PlayFabSDK/Experimentation/PlayFabEvents.cs @@ -0,0 +1,36 @@ +#if !DISABLE_PLAYFABENTITY_API +using PlayFab.ExperimentationModels; + +namespace PlayFab.Events +{ + public partial class PlayFabEvents + { + public event PlayFabRequestEvent OnExperimentationCreateExclusionGroupRequestEvent; + public event PlayFabResultEvent OnExperimentationCreateExclusionGroupResultEvent; + public event PlayFabRequestEvent OnExperimentationCreateExperimentRequestEvent; + public event PlayFabResultEvent OnExperimentationCreateExperimentResultEvent; + public event PlayFabRequestEvent OnExperimentationDeleteExclusionGroupRequestEvent; + public event PlayFabResultEvent OnExperimentationDeleteExclusionGroupResultEvent; + public event PlayFabRequestEvent OnExperimentationDeleteExperimentRequestEvent; + public event PlayFabResultEvent OnExperimentationDeleteExperimentResultEvent; + public event PlayFabRequestEvent OnExperimentationGetExclusionGroupsRequestEvent; + public event PlayFabResultEvent OnExperimentationGetExclusionGroupsResultEvent; + public event PlayFabRequestEvent OnExperimentationGetExclusionGroupTrafficRequestEvent; + public event PlayFabResultEvent OnExperimentationGetExclusionGroupTrafficResultEvent; + public event PlayFabRequestEvent OnExperimentationGetExperimentsRequestEvent; + public event PlayFabResultEvent OnExperimentationGetExperimentsResultEvent; + public event PlayFabRequestEvent OnExperimentationGetLatestScorecardRequestEvent; + public event PlayFabResultEvent OnExperimentationGetLatestScorecardResultEvent; + public event PlayFabRequestEvent OnExperimentationGetTreatmentAssignmentRequestEvent; + public event PlayFabResultEvent OnExperimentationGetTreatmentAssignmentResultEvent; + public event PlayFabRequestEvent OnExperimentationStartExperimentRequestEvent; + public event PlayFabResultEvent OnExperimentationStartExperimentResultEvent; + public event PlayFabRequestEvent OnExperimentationStopExperimentRequestEvent; + public event PlayFabResultEvent OnExperimentationStopExperimentResultEvent; + public event PlayFabRequestEvent OnExperimentationUpdateExclusionGroupRequestEvent; + public event PlayFabResultEvent OnExperimentationUpdateExclusionGroupResultEvent; + public event PlayFabRequestEvent OnExperimentationUpdateExperimentRequestEvent; + public event PlayFabResultEvent OnExperimentationUpdateExperimentResultEvent; + } +} +#endif diff --git a/Assets/PlayFabSDK/Experimentation/PlayFabEvents.cs.meta b/Assets/PlayFabSDK/Experimentation/PlayFabEvents.cs.meta new file mode 100644 index 00000000..c97ee632 --- /dev/null +++ b/Assets/PlayFabSDK/Experimentation/PlayFabEvents.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ad18b9280bb1a7f4c926eba4c1086b6e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Experimentation/PlayFabExperimentationAPI.cs b/Assets/PlayFabSDK/Experimentation/PlayFabExperimentationAPI.cs new file mode 100644 index 00000000..22e41945 --- /dev/null +++ b/Assets/PlayFabSDK/Experimentation/PlayFabExperimentationAPI.cs @@ -0,0 +1,208 @@ +#if !DISABLE_PLAYFABENTITY_API && !DISABLE_PLAYFAB_STATIC_API + +using System; +using System.Collections.Generic; +using PlayFab.ExperimentationModels; +using PlayFab.Internal; + +namespace PlayFab +{ + /// + /// APIs for managing experiments. + /// + public static class PlayFabExperimentationAPI + { + static PlayFabExperimentationAPI() {} + + + /// + /// Verify entity login. + /// + public static bool IsEntityLoggedIn() + { + return PlayFabSettings.staticPlayer.IsEntityLoggedIn(); + } + + /// + /// Clear the Client SessionToken which allows this Client to call API calls requiring login. + /// A new/fresh login will be required after calling this. + /// + public static void ForgetAllCredentials() + { + PlayFabSettings.staticPlayer.ForgetAllCredentials(); + } + + /// + /// Creates a new experiment exclusion group for a title. + /// + public static void CreateExclusionGroup(CreateExclusionGroupRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Experimentation/CreateExclusionGroup", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Creates a new experiment for a title. + /// + public static void CreateExperiment(CreateExperimentRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Experimentation/CreateExperiment", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Deletes an existing exclusion group for a title. + /// + public static void DeleteExclusionGroup(DeleteExclusionGroupRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Experimentation/DeleteExclusionGroup", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Deletes an existing experiment for a title. + /// + public static void DeleteExperiment(DeleteExperimentRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Experimentation/DeleteExperiment", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets the details of all exclusion groups for a title. + /// + public static void GetExclusionGroups(GetExclusionGroupsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Experimentation/GetExclusionGroups", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets the details of all exclusion groups for a title. + /// + public static void GetExclusionGroupTraffic(GetExclusionGroupTrafficRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Experimentation/GetExclusionGroupTraffic", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets the details of all experiments for a title. + /// + public static void GetExperiments(GetExperimentsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Experimentation/GetExperiments", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets the latest scorecard of the experiment for the title. + /// + public static void GetLatestScorecard(GetLatestScorecardRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Experimentation/GetLatestScorecard", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets the treatment assignments for a player for every running experiment in the title. + /// + public static void GetTreatmentAssignment(GetTreatmentAssignmentRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Experimentation/GetTreatmentAssignment", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Starts an existing experiment for a title. + /// + public static void StartExperiment(StartExperimentRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Experimentation/StartExperiment", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Stops an existing experiment for a title. + /// + public static void StopExperiment(StopExperimentRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Experimentation/StopExperiment", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates an existing exclusion group for a title. + /// + public static void UpdateExclusionGroup(UpdateExclusionGroupRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Experimentation/UpdateExclusionGroup", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates an existing experiment for a title. + /// + public static void UpdateExperiment(UpdateExperimentRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Experimentation/UpdateExperiment", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + + } +} + +#endif diff --git a/Assets/PlayFabSDK/Experimentation/PlayFabExperimentationAPI.cs.meta b/Assets/PlayFabSDK/Experimentation/PlayFabExperimentationAPI.cs.meta new file mode 100644 index 00000000..c19eab74 --- /dev/null +++ b/Assets/PlayFabSDK/Experimentation/PlayFabExperimentationAPI.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9dbcafaa60e9f2a41930b9907fb0c133 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Experimentation/PlayFabExperimentationInstanceAPI.cs b/Assets/PlayFabSDK/Experimentation/PlayFabExperimentationInstanceAPI.cs new file mode 100644 index 00000000..eab7baed --- /dev/null +++ b/Assets/PlayFabSDK/Experimentation/PlayFabExperimentationInstanceAPI.cs @@ -0,0 +1,200 @@ +#if !DISABLE_PLAYFABENTITY_API + +using System; +using System.Collections.Generic; +using PlayFab.ExperimentationModels; +using PlayFab.Internal; +using PlayFab.SharedModels; + +namespace PlayFab +{ + /// + /// APIs for managing experiments. + /// + public class PlayFabExperimentationInstanceAPI : IPlayFabInstanceApi + { + public readonly PlayFabApiSettings apiSettings = null; + public readonly PlayFabAuthenticationContext authenticationContext = null; + + public PlayFabExperimentationInstanceAPI(PlayFabAuthenticationContext context) + { + if (context == null) + throw new PlayFabException(PlayFabExceptionCode.AuthContextRequired, "Context cannot be null, create a PlayFabAuthenticationContext for each player in advance, or call .GetAuthenticationContext()"); + authenticationContext = context; + } + + public PlayFabExperimentationInstanceAPI(PlayFabApiSettings settings, PlayFabAuthenticationContext context) + { + if (context == null) + throw new PlayFabException(PlayFabExceptionCode.AuthContextRequired, "Context cannot be null, create a PlayFabAuthenticationContext for each player in advance, or call .GetAuthenticationContext()"); + apiSettings = settings; + authenticationContext = context; + } + + /// + /// Verify entity login. + /// + public bool IsEntityLoggedIn() + { + return authenticationContext == null ? false : authenticationContext.IsEntityLoggedIn(); + } + + /// + /// Clear the Client SessionToken which allows this Client to call API calls requiring login. + /// A new/fresh login will be required after calling this. + /// + public void ForgetAllCredentials() + { + if (authenticationContext != null) + { + authenticationContext.ForgetAllCredentials(); + } + } + + /// + /// Creates a new experiment exclusion group for a title. + /// + public void CreateExclusionGroup(CreateExclusionGroupRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Experimentation/CreateExclusionGroup", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Creates a new experiment for a title. + /// + public void CreateExperiment(CreateExperimentRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Experimentation/CreateExperiment", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Deletes an existing exclusion group for a title. + /// + public void DeleteExclusionGroup(DeleteExclusionGroupRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Experimentation/DeleteExclusionGroup", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Deletes an existing experiment for a title. + /// + public void DeleteExperiment(DeleteExperimentRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Experimentation/DeleteExperiment", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets the details of all exclusion groups for a title. + /// + public void GetExclusionGroups(GetExclusionGroupsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Experimentation/GetExclusionGroups", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets the details of all exclusion groups for a title. + /// + public void GetExclusionGroupTraffic(GetExclusionGroupTrafficRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Experimentation/GetExclusionGroupTraffic", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets the details of all experiments for a title. + /// + public void GetExperiments(GetExperimentsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Experimentation/GetExperiments", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets the latest scorecard of the experiment for the title. + /// + public void GetLatestScorecard(GetLatestScorecardRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Experimentation/GetLatestScorecard", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets the treatment assignments for a player for every running experiment in the title. + /// + public void GetTreatmentAssignment(GetTreatmentAssignmentRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Experimentation/GetTreatmentAssignment", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Starts an existing experiment for a title. + /// + public void StartExperiment(StartExperimentRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Experimentation/StartExperiment", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Stops an existing experiment for a title. + /// + public void StopExperiment(StopExperimentRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Experimentation/StopExperiment", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates an existing exclusion group for a title. + /// + public void UpdateExclusionGroup(UpdateExclusionGroupRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Experimentation/UpdateExclusionGroup", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates an existing experiment for a title. + /// + public void UpdateExperiment(UpdateExperimentRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Experimentation/UpdateExperiment", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + } +} + +#endif diff --git a/Assets/PlayFabSDK/Experimentation/PlayFabExperimentationInstanceAPI.cs.meta b/Assets/PlayFabSDK/Experimentation/PlayFabExperimentationInstanceAPI.cs.meta new file mode 100644 index 00000000..26f07683 --- /dev/null +++ b/Assets/PlayFabSDK/Experimentation/PlayFabExperimentationInstanceAPI.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ecc5b8d11fae41b4daaaf638349fdc78 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Experimentation/PlayFabExperimentationModels.cs b/Assets/PlayFabSDK/Experimentation/PlayFabExperimentationModels.cs new file mode 100644 index 00000000..84087e99 --- /dev/null +++ b/Assets/PlayFabSDK/Experimentation/PlayFabExperimentationModels.cs @@ -0,0 +1,670 @@ +#if !DISABLE_PLAYFABENTITY_API +using System; +using System.Collections.Generic; +using PlayFab.SharedModels; + +namespace PlayFab.ExperimentationModels +{ + public enum AnalysisTaskState + { + Waiting, + ReadyForSubmission, + SubmittingToPipeline, + Running, + Completed, + Failed, + Canceled + } + + /// + /// Given a title entity token and exclusion group details, will create a new exclusion group for the title. + /// + [Serializable] + public class CreateExclusionGroupRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Description of the exclusion group. + /// + public string Description; + /// + /// Friendly name of the exclusion group. + /// + public string Name; + } + + [Serializable] + public class CreateExclusionGroupResult : PlayFabResultCommon + { + /// + /// Identifier of the exclusion group. + /// + public string ExclusionGroupId; + } + + /// + /// Given a title entity token and experiment details, will create a new experiment for the title. + /// + [Serializable] + public class CreateExperimentRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Description of the experiment. + /// + public string Description; + /// + /// When experiment should end. + /// + public DateTime? EndDate; + /// + /// Id of the exclusion group. + /// + public string ExclusionGroupId; + /// + /// Percentage of exclusion group traffic that will see this experiment. + /// + public uint? ExclusionGroupTrafficAllocation; + /// + /// Type of experiment. + /// + public ExperimentType? ExperimentType; + /// + /// Friendly name of the experiment. + /// + public string Name; + /// + /// Id of the segment to which this experiment applies. Defaults to the 'All Players' segment. + /// + public string SegmentId; + /// + /// When experiment should start. + /// + public DateTime StartDate; + /// + /// List of title player account IDs that automatically receive treatments in the experiment, but are not included when + /// calculating experiment metrics. + /// + public List TitlePlayerAccountTestIds; + /// + /// List of variants for the experiment. + /// + public List Variants; + } + + [Serializable] + public class CreateExperimentResult : PlayFabResultCommon + { + /// + /// The ID of the new experiment. + /// + public string ExperimentId; + } + + /// + /// Given an entity token and an exclusion group ID this API deletes the exclusion group. + /// + [Serializable] + public class DeleteExclusionGroupRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The ID of the exclusion group to delete. + /// + public string ExclusionGroupId; + } + + /// + /// Given an entity token and an experiment ID this API deletes the experiment. A running experiment must be stopped before + /// it can be deleted. + /// + [Serializable] + public class DeleteExperimentRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The ID of the experiment to delete. + /// + public string ExperimentId; + } + + [Serializable] + public class EmptyResponse : PlayFabResultCommon + { + } + + /// + /// Combined entity type and ID structure which uniquely identifies a single entity. + /// + [Serializable] + public class EntityKey : PlayFabBaseModel + { + /// + /// Unique ID of the entity. + /// + public string Id; + /// + /// Entity type. See https://docs.microsoft.com/gaming/playfab/features/data/entities/available-built-in-entity-types + /// + public string Type; + } + + [Serializable] + public class ExclusionGroupTrafficAllocation : PlayFabBaseModel + { + /// + /// Id of the experiment. + /// + public string ExperimentId; + /// + /// Percentage of exclusion group traffic that will see this experiment. + /// + public uint TrafficAllocation; + } + + [Serializable] + public class Experiment : PlayFabBaseModel + { + /// + /// Description of the experiment. + /// + public string Description; + /// + /// When experiment should end/was ended. + /// + public DateTime? EndDate; + /// + /// Id of the exclusion group for this experiment. + /// + public string ExclusionGroupId; + /// + /// Percentage of exclusion group traffic that will see this experiment. + /// + public uint? ExclusionGroupTrafficAllocation; + /// + /// Type of experiment. + /// + public ExperimentType? ExperimentType; + /// + /// Id of the experiment. + /// + public string Id; + /// + /// Friendly name of the experiment. + /// + public string Name; + /// + /// Id of the segment to which this experiment applies. Defaults to the 'All Players' segment. + /// + public string SegmentId; + /// + /// When experiment should start/was started. + /// + public DateTime StartDate; + /// + /// State experiment is currently in. + /// + public ExperimentState? State; + /// + /// List of title player account IDs that automatically receive treatments in the experiment, but are not included when + /// calculating experiment metrics. + /// + public List TitlePlayerAccountTestIds; + /// + /// List of variants for the experiment. + /// + public List Variants; + } + + [Serializable] + public class ExperimentExclusionGroup : PlayFabBaseModel + { + /// + /// Description of the exclusion group. + /// + public string Description; + /// + /// Id of the exclusion group. + /// + public string ExclusionGroupId; + /// + /// Friendly name of the exclusion group. + /// + public string Name; + } + + public enum ExperimentState + { + New, + Started, + Stopped, + Deleted + } + + public enum ExperimentType + { + Active, + Snapshot + } + + /// + /// Given a title entity token will return the list of all exclusion groups for a title. + /// + [Serializable] + public class GetExclusionGroupsRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + [Serializable] + public class GetExclusionGroupsResult : PlayFabResultCommon + { + /// + /// List of exclusion groups for the title. + /// + public List ExclusionGroups; + } + + /// + /// Given a title entity token and an exclusion group ID, will return the list of traffic allocations for the exclusion + /// group. + /// + [Serializable] + public class GetExclusionGroupTrafficRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The ID of the exclusion group. + /// + public string ExclusionGroupId; + } + + [Serializable] + public class GetExclusionGroupTrafficResult : PlayFabResultCommon + { + /// + /// List of traffic allocations for the exclusion group. + /// + public List TrafficAllocations; + } + + /// + /// Given a title entity token will return the list of all experiments for a title, including scheduled, started, stopped or + /// completed experiments. + /// + [Serializable] + public class GetExperimentsRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + [Serializable] + public class GetExperimentsResult : PlayFabResultCommon + { + /// + /// List of experiments for the title. + /// + public List Experiments; + } + + /// + /// Given a title entity token and experiment details, will return the latest available scorecard. + /// + [Serializable] + public class GetLatestScorecardRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The ID of the experiment. + /// + public string ExperimentId; + } + + [Serializable] + public class GetLatestScorecardResult : PlayFabResultCommon + { + /// + /// Scorecard for the experiment of the title. + /// + public Scorecard Scorecard; + } + + /// + /// Given a title player or a title entity token, returns the treatment variants and variables assigned to the entity across + /// all running experiments + /// + [Serializable] + public class GetTreatmentAssignmentRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The optional entity to perform this action on. Defaults to the currently logged in entity. + /// + public EntityKey Entity; + } + + [Serializable] + public class GetTreatmentAssignmentResult : PlayFabResultCommon + { + /// + /// Treatment assignment for the entity. + /// + public TreatmentAssignment TreatmentAssignment; + } + + [Serializable] + public class MetricData : PlayFabBaseModel + { + /// + /// The upper bound of the confidence interval for the relative delta (Delta.RelativeValue). + /// + public double ConfidenceIntervalEnd; + /// + /// The lower bound of the confidence interval for the relative delta (Delta.RelativeValue). + /// + public double ConfidenceIntervalStart; + /// + /// The absolute delta between TreatmentStats.Average and ControlStats.Average. + /// + public float DeltaAbsoluteChange; + /// + /// The relative delta ratio between TreatmentStats.Average and ControlStats.Average. + /// + public float DeltaRelativeChange; + /// + /// The machine name of the metric. + /// + public string InternalName; + /// + /// Indicates if a movement was detected on that metric. + /// + public string Movement; + /// + /// The readable name of the metric. + /// + public string Name; + /// + /// The expectation that a movement is real + /// + public float PMove; + /// + /// The p-value resulting from the statistical test run for this metric + /// + public float PValue; + /// + /// The threshold for observing sample ratio mismatch. + /// + public float PValueThreshold; + /// + /// Indicates if the movement is statistically significant. + /// + public string StatSigLevel; + /// + /// Observed standard deviation value of the metric. + /// + public float StdDev; + /// + /// Observed average value of the metric. + /// + public float Value; + } + + [Serializable] + public class Scorecard : PlayFabBaseModel + { + /// + /// Represents the date the scorecard was generated. + /// + public string DateGenerated; + /// + /// Represents the duration of scorecard analysis. + /// + public string Duration; + /// + /// Represents the number of events processed for the generation of this scorecard + /// + public double EventsProcessed; + /// + /// Id of the experiment. + /// + public string ExperimentId; + /// + /// Friendly name of the experiment. + /// + public string ExperimentName; + /// + /// Represents the latest compute job status. + /// + public AnalysisTaskState? LatestJobStatus; + /// + /// Represents the presence of a sample ratio mismatch in the scorecard data. + /// + public bool SampleRatioMismatch; + /// + /// Scorecard containing list of analysis. + /// + public List ScorecardDataRows; + } + + [Serializable] + public class ScorecardDataRow : PlayFabBaseModel + { + /// + /// Represents whether the variant is control or not. + /// + public bool IsControl; + /// + /// Data of the analysis with the internal name of the metric as the key and an object of metric data as value. + /// + public Dictionary MetricDataRows; + /// + /// Represents the player count in the variant. + /// + public uint PlayerCount; + /// + /// Name of the variant of analysis. + /// + public string VariantName; + } + + /// + /// Given a title entity token and an experiment ID, this API starts the experiment. + /// + [Serializable] + public class StartExperimentRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The ID of the experiment to start. + /// + public string ExperimentId; + } + + /// + /// Given a title entity token and an experiment ID, this API stops the experiment if it is running. + /// + [Serializable] + public class StopExperimentRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The ID of the experiment to stop. + /// + public string ExperimentId; + } + + [Serializable] + public class TreatmentAssignment : PlayFabBaseModel + { + /// + /// List of the experiment variables. + /// + public List Variables; + /// + /// List of the experiment variants. + /// + public List Variants; + } + + /// + /// Given an entity token and exclusion group details this API updates the exclusion group. + /// + [Serializable] + public class UpdateExclusionGroupRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Description of the exclusion group. + /// + public string Description; + /// + /// The ID of the exclusion group to update. + /// + public string ExclusionGroupId; + /// + /// Friendly name of the exclusion group. + /// + public string Name; + } + + /// + /// Given a title entity token and experiment details, this API updates the experiment. If an experiment is already running, + /// only the description and duration properties can be updated. + /// + [Serializable] + public class UpdateExperimentRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Description of the experiment. + /// + public string Description; + /// + /// When experiment should end. + /// + public DateTime? EndDate; + /// + /// Id of the exclusion group. + /// + public string ExclusionGroupId; + /// + /// Percentage of exclusion group traffic that will see this experiment. + /// + public uint? ExclusionGroupTrafficAllocation; + /// + /// Type of experiment. + /// + public ExperimentType? ExperimentType; + /// + /// Id of the experiment. + /// + public string Id; + /// + /// Friendly name of the experiment. + /// + public string Name; + /// + /// Id of the segment to which this experiment applies. Defaults to the 'All Players' segment. + /// + public string SegmentId; + /// + /// When experiment should start. + /// + public DateTime StartDate; + /// + /// List of title player account IDs that automatically receive treatments in the experiment, but are not included when + /// calculating experiment metrics. + /// + public List TitlePlayerAccountTestIds; + /// + /// List of variants for the experiment. + /// + public List Variants; + } + + [Serializable] + public class Variable : PlayFabBaseModel + { + /// + /// Name of the variable. + /// + public string Name; + /// + /// Value of the variable. + /// + public string Value; + } + + [Serializable] + public class Variant : PlayFabBaseModel + { + /// + /// Description of the variant. + /// + public string Description; + /// + /// Id of the variant. + /// + public string Id; + /// + /// Specifies if variant is control for experiment. + /// + public bool IsControl; + /// + /// Name of the variant. + /// + public string Name; + /// + /// Id of the TitleDataOverride to use with this variant. + /// + public string TitleDataOverrideLabel; + /// + /// Percentage of target audience traffic that will see this variant. + /// + public uint TrafficPercentage; + /// + /// Variables returned by this variant. + /// + public List Variables; + } +} +#endif diff --git a/Assets/PlayFabSDK/Experimentation/PlayFabExperimentationModels.cs.meta b/Assets/PlayFabSDK/Experimentation/PlayFabExperimentationModels.cs.meta new file mode 100644 index 00000000..45da40ec --- /dev/null +++ b/Assets/PlayFabSDK/Experimentation/PlayFabExperimentationModels.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0804132d8066c1440a5cfdd0e56bf63c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Groups.meta b/Assets/PlayFabSDK/Groups.meta new file mode 100644 index 00000000..0556954b --- /dev/null +++ b/Assets/PlayFabSDK/Groups.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4153a99f721a071478a755f86f7b44ac +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Groups/PlayFabEvents.cs b/Assets/PlayFabSDK/Groups/PlayFabEvents.cs new file mode 100644 index 00000000..90a7937c --- /dev/null +++ b/Assets/PlayFabSDK/Groups/PlayFabEvents.cs @@ -0,0 +1,60 @@ +#if !DISABLE_PLAYFABENTITY_API +using PlayFab.GroupsModels; + +namespace PlayFab.Events +{ + public partial class PlayFabEvents + { + public event PlayFabRequestEvent OnGroupsAcceptGroupApplicationRequestEvent; + public event PlayFabResultEvent OnGroupsAcceptGroupApplicationResultEvent; + public event PlayFabRequestEvent OnGroupsAcceptGroupInvitationRequestEvent; + public event PlayFabResultEvent OnGroupsAcceptGroupInvitationResultEvent; + public event PlayFabRequestEvent OnGroupsAddMembersRequestEvent; + public event PlayFabResultEvent OnGroupsAddMembersResultEvent; + public event PlayFabRequestEvent OnGroupsApplyToGroupRequestEvent; + public event PlayFabResultEvent OnGroupsApplyToGroupResultEvent; + public event PlayFabRequestEvent OnGroupsBlockEntityRequestEvent; + public event PlayFabResultEvent OnGroupsBlockEntityResultEvent; + public event PlayFabRequestEvent OnGroupsChangeMemberRoleRequestEvent; + public event PlayFabResultEvent OnGroupsChangeMemberRoleResultEvent; + public event PlayFabRequestEvent OnGroupsCreateGroupRequestEvent; + public event PlayFabResultEvent OnGroupsCreateGroupResultEvent; + public event PlayFabRequestEvent OnGroupsCreateRoleRequestEvent; + public event PlayFabResultEvent OnGroupsCreateRoleResultEvent; + public event PlayFabRequestEvent OnGroupsDeleteGroupRequestEvent; + public event PlayFabResultEvent OnGroupsDeleteGroupResultEvent; + public event PlayFabRequestEvent OnGroupsDeleteRoleRequestEvent; + public event PlayFabResultEvent OnGroupsDeleteRoleResultEvent; + public event PlayFabRequestEvent OnGroupsGetGroupRequestEvent; + public event PlayFabResultEvent OnGroupsGetGroupResultEvent; + public event PlayFabRequestEvent OnGroupsInviteToGroupRequestEvent; + public event PlayFabResultEvent OnGroupsInviteToGroupResultEvent; + public event PlayFabRequestEvent OnGroupsIsMemberRequestEvent; + public event PlayFabResultEvent OnGroupsIsMemberResultEvent; + public event PlayFabRequestEvent OnGroupsListGroupApplicationsRequestEvent; + public event PlayFabResultEvent OnGroupsListGroupApplicationsResultEvent; + public event PlayFabRequestEvent OnGroupsListGroupBlocksRequestEvent; + public event PlayFabResultEvent OnGroupsListGroupBlocksResultEvent; + public event PlayFabRequestEvent OnGroupsListGroupInvitationsRequestEvent; + public event PlayFabResultEvent OnGroupsListGroupInvitationsResultEvent; + public event PlayFabRequestEvent OnGroupsListGroupMembersRequestEvent; + public event PlayFabResultEvent OnGroupsListGroupMembersResultEvent; + public event PlayFabRequestEvent OnGroupsListMembershipRequestEvent; + public event PlayFabResultEvent OnGroupsListMembershipResultEvent; + public event PlayFabRequestEvent OnGroupsListMembershipOpportunitiesRequestEvent; + public event PlayFabResultEvent OnGroupsListMembershipOpportunitiesResultEvent; + public event PlayFabRequestEvent OnGroupsRemoveGroupApplicationRequestEvent; + public event PlayFabResultEvent OnGroupsRemoveGroupApplicationResultEvent; + public event PlayFabRequestEvent OnGroupsRemoveGroupInvitationRequestEvent; + public event PlayFabResultEvent OnGroupsRemoveGroupInvitationResultEvent; + public event PlayFabRequestEvent OnGroupsRemoveMembersRequestEvent; + public event PlayFabResultEvent OnGroupsRemoveMembersResultEvent; + public event PlayFabRequestEvent OnGroupsUnblockEntityRequestEvent; + public event PlayFabResultEvent OnGroupsUnblockEntityResultEvent; + public event PlayFabRequestEvent OnGroupsUpdateGroupRequestEvent; + public event PlayFabResultEvent OnGroupsUpdateGroupResultEvent; + public event PlayFabRequestEvent OnGroupsUpdateRoleRequestEvent; + public event PlayFabResultEvent OnGroupsUpdateRoleResultEvent; + } +} +#endif diff --git a/Assets/PlayFabSDK/Groups/PlayFabEvents.cs.meta b/Assets/PlayFabSDK/Groups/PlayFabEvents.cs.meta new file mode 100644 index 00000000..5d2b754c --- /dev/null +++ b/Assets/PlayFabSDK/Groups/PlayFabEvents.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 89aad6173ff54ed4092f14bd118f0652 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Groups/PlayFabGroupsAPI.cs b/Assets/PlayFabSDK/Groups/PlayFabGroupsAPI.cs new file mode 100644 index 00000000..82465f0d --- /dev/null +++ b/Assets/PlayFabSDK/Groups/PlayFabGroupsAPI.cs @@ -0,0 +1,366 @@ +#if !DISABLE_PLAYFABENTITY_API && !DISABLE_PLAYFAB_STATIC_API + +using System; +using System.Collections.Generic; +using PlayFab.GroupsModels; +using PlayFab.Internal; + +namespace PlayFab +{ + /// + /// The Groups API is designed for any permanent or semi-permanent collections of Entities (players, or non-players). If you + /// want to make Guilds/Clans/Corporations/etc., then you should use groups. Groups can also be used to make chatrooms, + /// parties, or any other persistent collection of entities. + /// + public static class PlayFabGroupsAPI + { + static PlayFabGroupsAPI() {} + + + /// + /// Verify entity login. + /// + public static bool IsEntityLoggedIn() + { + return PlayFabSettings.staticPlayer.IsEntityLoggedIn(); + } + + /// + /// Clear the Client SessionToken which allows this Client to call API calls requiring login. + /// A new/fresh login will be required after calling this. + /// + public static void ForgetAllCredentials() + { + PlayFabSettings.staticPlayer.ForgetAllCredentials(); + } + + /// + /// Accepts an outstanding invitation to to join a group + /// + public static void AcceptGroupApplication(AcceptGroupApplicationRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Group/AcceptGroupApplication", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Accepts an invitation to join a group + /// + public static void AcceptGroupInvitation(AcceptGroupInvitationRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Group/AcceptGroupInvitation", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Adds members to a group or role. + /// + public static void AddMembers(AddMembersRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Group/AddMembers", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Applies to join a group + /// + public static void ApplyToGroup(ApplyToGroupRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Group/ApplyToGroup", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Blocks a list of entities from joining a group. + /// + public static void BlockEntity(BlockEntityRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Group/BlockEntity", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Changes the role membership of a list of entities from one role to another. + /// + public static void ChangeMemberRole(ChangeMemberRoleRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Group/ChangeMemberRole", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Creates a new group. + /// + public static void CreateGroup(CreateGroupRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Group/CreateGroup", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Creates a new group role. + /// + public static void CreateRole(CreateGroupRoleRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Group/CreateRole", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Deletes a group and all roles, invitations, join requests, and blocks associated with it. + /// + public static void DeleteGroup(DeleteGroupRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Group/DeleteGroup", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Deletes an existing role in a group. + /// + public static void DeleteRole(DeleteRoleRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Group/DeleteRole", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets information about a group and its roles + /// + public static void GetGroup(GetGroupRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Group/GetGroup", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Invites a player to join a group + /// + public static void InviteToGroup(InviteToGroupRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Group/InviteToGroup", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Checks to see if an entity is a member of a group or role within the group + /// + public static void IsMember(IsMemberRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Group/IsMember", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Lists all outstanding requests to join a group + /// + public static void ListGroupApplications(ListGroupApplicationsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Group/ListGroupApplications", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Lists all entities blocked from joining a group + /// + public static void ListGroupBlocks(ListGroupBlocksRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Group/ListGroupBlocks", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Lists all outstanding invitations for a group + /// + public static void ListGroupInvitations(ListGroupInvitationsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Group/ListGroupInvitations", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Lists all members for a group + /// + public static void ListGroupMembers(ListGroupMembersRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Group/ListGroupMembers", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Lists all groups and roles for an entity + /// + public static void ListMembership(ListMembershipRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Group/ListMembership", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Lists all outstanding invitations and group applications for an entity + /// + public static void ListMembershipOpportunities(ListMembershipOpportunitiesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Group/ListMembershipOpportunities", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Removes an application to join a group + /// + public static void RemoveGroupApplication(RemoveGroupApplicationRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Group/RemoveGroupApplication", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Removes an invitation join a group + /// + public static void RemoveGroupInvitation(RemoveGroupInvitationRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Group/RemoveGroupInvitation", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Removes members from a group. + /// + public static void RemoveMembers(RemoveMembersRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Group/RemoveMembers", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Unblocks a list of entities from joining a group + /// + public static void UnblockEntity(UnblockEntityRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Group/UnblockEntity", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates non-membership data about a group. + /// + public static void UpdateGroup(UpdateGroupRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Group/UpdateGroup", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates metadata about a role. + /// + public static void UpdateRole(UpdateGroupRoleRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Group/UpdateRole", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + + } +} + +#endif diff --git a/Assets/PlayFabSDK/Groups/PlayFabGroupsAPI.cs.meta b/Assets/PlayFabSDK/Groups/PlayFabGroupsAPI.cs.meta new file mode 100644 index 00000000..c4945c8f --- /dev/null +++ b/Assets/PlayFabSDK/Groups/PlayFabGroupsAPI.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 42170e999ab34f549ac03af203959176 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Groups/PlayFabGroupsInstanceAPI.cs b/Assets/PlayFabSDK/Groups/PlayFabGroupsInstanceAPI.cs new file mode 100644 index 00000000..2a6fe0bd --- /dev/null +++ b/Assets/PlayFabSDK/Groups/PlayFabGroupsInstanceAPI.cs @@ -0,0 +1,334 @@ +#if !DISABLE_PLAYFABENTITY_API + +using System; +using System.Collections.Generic; +using PlayFab.GroupsModels; +using PlayFab.Internal; +using PlayFab.SharedModels; + +namespace PlayFab +{ + /// + /// The Groups API is designed for any permanent or semi-permanent collections of Entities (players, or non-players). If you + /// want to make Guilds/Clans/Corporations/etc., then you should use groups. Groups can also be used to make chatrooms, + /// parties, or any other persistent collection of entities. + /// + public class PlayFabGroupsInstanceAPI : IPlayFabInstanceApi + { + public readonly PlayFabApiSettings apiSettings = null; + public readonly PlayFabAuthenticationContext authenticationContext = null; + + public PlayFabGroupsInstanceAPI(PlayFabAuthenticationContext context) + { + if (context == null) + throw new PlayFabException(PlayFabExceptionCode.AuthContextRequired, "Context cannot be null, create a PlayFabAuthenticationContext for each player in advance, or call .GetAuthenticationContext()"); + authenticationContext = context; + } + + public PlayFabGroupsInstanceAPI(PlayFabApiSettings settings, PlayFabAuthenticationContext context) + { + if (context == null) + throw new PlayFabException(PlayFabExceptionCode.AuthContextRequired, "Context cannot be null, create a PlayFabAuthenticationContext for each player in advance, or call .GetAuthenticationContext()"); + apiSettings = settings; + authenticationContext = context; + } + + /// + /// Verify entity login. + /// + public bool IsEntityLoggedIn() + { + return authenticationContext == null ? false : authenticationContext.IsEntityLoggedIn(); + } + + /// + /// Clear the Client SessionToken which allows this Client to call API calls requiring login. + /// A new/fresh login will be required after calling this. + /// + public void ForgetAllCredentials() + { + if (authenticationContext != null) + { + authenticationContext.ForgetAllCredentials(); + } + } + + /// + /// Accepts an outstanding invitation to to join a group + /// + public void AcceptGroupApplication(AcceptGroupApplicationRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Group/AcceptGroupApplication", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Accepts an invitation to join a group + /// + public void AcceptGroupInvitation(AcceptGroupInvitationRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Group/AcceptGroupInvitation", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Adds members to a group or role. + /// + public void AddMembers(AddMembersRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Group/AddMembers", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Applies to join a group + /// + public void ApplyToGroup(ApplyToGroupRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Group/ApplyToGroup", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Blocks a list of entities from joining a group. + /// + public void BlockEntity(BlockEntityRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Group/BlockEntity", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Changes the role membership of a list of entities from one role to another. + /// + public void ChangeMemberRole(ChangeMemberRoleRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Group/ChangeMemberRole", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Creates a new group. + /// + public void CreateGroup(CreateGroupRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Group/CreateGroup", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Creates a new group role. + /// + public void CreateRole(CreateGroupRoleRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Group/CreateRole", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Deletes a group and all roles, invitations, join requests, and blocks associated with it. + /// + public void DeleteGroup(DeleteGroupRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Group/DeleteGroup", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Deletes an existing role in a group. + /// + public void DeleteRole(DeleteRoleRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Group/DeleteRole", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets information about a group and its roles + /// + public void GetGroup(GetGroupRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Group/GetGroup", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Invites a player to join a group + /// + public void InviteToGroup(InviteToGroupRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Group/InviteToGroup", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Checks to see if an entity is a member of a group or role within the group + /// + public void IsMember(IsMemberRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Group/IsMember", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Lists all outstanding requests to join a group + /// + public void ListGroupApplications(ListGroupApplicationsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Group/ListGroupApplications", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Lists all entities blocked from joining a group + /// + public void ListGroupBlocks(ListGroupBlocksRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Group/ListGroupBlocks", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Lists all outstanding invitations for a group + /// + public void ListGroupInvitations(ListGroupInvitationsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Group/ListGroupInvitations", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Lists all members for a group + /// + public void ListGroupMembers(ListGroupMembersRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Group/ListGroupMembers", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Lists all groups and roles for an entity + /// + public void ListMembership(ListMembershipRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Group/ListMembership", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Lists all outstanding invitations and group applications for an entity + /// + public void ListMembershipOpportunities(ListMembershipOpportunitiesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Group/ListMembershipOpportunities", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Removes an application to join a group + /// + public void RemoveGroupApplication(RemoveGroupApplicationRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Group/RemoveGroupApplication", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Removes an invitation join a group + /// + public void RemoveGroupInvitation(RemoveGroupInvitationRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Group/RemoveGroupInvitation", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Removes members from a group. + /// + public void RemoveMembers(RemoveMembersRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Group/RemoveMembers", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Unblocks a list of entities from joining a group + /// + public void UnblockEntity(UnblockEntityRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Group/UnblockEntity", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates non-membership data about a group. + /// + public void UpdateGroup(UpdateGroupRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Group/UpdateGroup", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates metadata about a role. + /// + public void UpdateRole(UpdateGroupRoleRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Group/UpdateRole", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + } +} + +#endif diff --git a/Assets/PlayFabSDK/Groups/PlayFabGroupsInstanceAPI.cs.meta b/Assets/PlayFabSDK/Groups/PlayFabGroupsInstanceAPI.cs.meta new file mode 100644 index 00000000..2de4310f --- /dev/null +++ b/Assets/PlayFabSDK/Groups/PlayFabGroupsInstanceAPI.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e14b336d534f60f4e911c8db52e74a86 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Groups/PlayFabGroupsModels.cs b/Assets/PlayFabSDK/Groups/PlayFabGroupsModels.cs new file mode 100644 index 00000000..e2ce9b30 --- /dev/null +++ b/Assets/PlayFabSDK/Groups/PlayFabGroupsModels.cs @@ -0,0 +1,985 @@ +#if !DISABLE_PLAYFABENTITY_API +using System; +using System.Collections.Generic; +using PlayFab.SharedModels; + +namespace PlayFab.GroupsModels +{ + /// + /// Accepts an outstanding invitation to to join a group if the invited entity is not blocked by the group. Nothing is + /// returned in the case of success. + /// + [Serializable] + public class AcceptGroupApplicationRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Type of the entity to accept as. Must be the same entity as the claimant or an entity that is a child of the claimant + /// entity. + /// + public EntityKey Entity; + /// + /// The identifier of the group + /// + public EntityKey Group; + } + + /// + /// Accepts an outstanding invitation to join the group if the invited entity is not blocked by the group. Only the invited + /// entity or a parent in its chain (e.g. title) may accept the invitation on the invited entity's behalf. Nothing is + /// returned in the case of success. + /// + [Serializable] + public class AcceptGroupInvitationRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The optional entity to perform this action on. Defaults to the currently logged in entity. + /// + public EntityKey Entity; + /// + /// The identifier of the group + /// + public EntityKey Group; + } + + /// + /// Adds members to a group or role. Existing members of the group will added to roles within the group, but if the user is + /// not already a member of the group, only title claimants may add them to the group, and others must use the group + /// application or invite system to add new members to a group. Returns nothing if successful. + /// + [Serializable] + public class AddMembersRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The identifier of the group + /// + public EntityKey Group; + /// + /// List of entities to add to the group. Only entities of type title_player_account and character may be added to groups. + /// + public List Members; + /// + /// Optional: The ID of the existing role to add the entities to. If this is not specified, the default member role for the + /// group will be used. Role IDs must be between 1 and 64 characters long. + /// + public string RoleId; + } + + /// + /// Creates an application to join a group. Calling this while a group application already exists will return the same + /// application instead of an error and will not refresh the time before the application expires. By default, if the entity + /// has an invitation to join the group outstanding, this will accept the invitation to join the group instead and return an + /// error indicating such, rather than creating a duplicate application to join that will need to be cleaned up later. + /// Returns information about the application or an error indicating an invitation was accepted instead. + /// + [Serializable] + public class ApplyToGroupRequest : PlayFabRequestCommon + { + /// + /// Optional, default true. Automatically accept an outstanding invitation if one exists instead of creating an application + /// + public bool? AutoAcceptOutstandingInvite; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The optional entity to perform this action on. Defaults to the currently logged in entity. + /// + public EntityKey Entity; + /// + /// The identifier of the group + /// + public EntityKey Group; + } + + /// + /// Describes an application to join a group + /// + [Serializable] + public class ApplyToGroupResponse : PlayFabResultCommon + { + /// + /// Type of entity that requested membership + /// + public EntityWithLineage Entity; + /// + /// When the application to join will expire and be deleted + /// + public DateTime Expires; + /// + /// ID of the group that the entity requesting membership to + /// + public EntityKey Group; + } + + /// + /// Blocks a list of entities from joining a group. Blocked entities may not create new applications to join, be invited to + /// join, accept an invitation, or have an application accepted. Failure due to being blocked does not clean up existing + /// applications or invitations to the group. No data is returned in the case of success. + /// + [Serializable] + public class BlockEntityRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// The identifier of the group + /// + public EntityKey Group; + } + + /// + /// Changes the role membership of a list of entities from one role to another in in a single operation. The destination + /// role must already exist. This is equivalent to adding the entities to the destination role and removing from the origin + /// role. Returns nothing if successful. + /// + [Serializable] + public class ChangeMemberRoleRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The ID of the role that the entities will become a member of. This must be an existing role. Role IDs must be between 1 + /// and 64 characters long. + /// + public string DestinationRoleId; + /// + /// The identifier of the group + /// + public EntityKey Group; + /// + /// List of entities to move between roles in the group. All entities in this list must be members of the group and origin + /// role. + /// + public List Members; + /// + /// The ID of the role that the entities currently are a member of. Role IDs must be between 1 and 64 characters long. + /// + public string OriginRoleId; + } + + /// + /// Creates a new group, as well as administration and member roles, based off of a title's group template. Returns + /// information about the group that was created. + /// + [Serializable] + public class CreateGroupRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The optional entity to perform this action on. Defaults to the currently logged in entity. + /// + public EntityKey Entity; + /// + /// The name of the group. This is unique at the title level by default. + /// + public string GroupName; + } + + [Serializable] + public class CreateGroupResponse : PlayFabResultCommon + { + /// + /// The ID of the administrator role for the group. + /// + public string AdminRoleId; + /// + /// The server date and time the group was created. + /// + public DateTime Created; + /// + /// The identifier of the group + /// + public EntityKey Group; + /// + /// The name of the group. + /// + public string GroupName; + /// + /// The ID of the default member role for the group. + /// + public string MemberRoleId; + /// + /// The current version of the profile, can be used for concurrency control during updates. + /// + public int ProfileVersion; + /// + /// The list of roles and names that belong to the group. + /// + public Dictionary Roles; + } + + /// + /// Creates a new role within an existing group, with no members. Both the role ID and role name must be unique within the + /// group, but the name can be the same as the ID. The role ID is set at creation and cannot be changed. Returns information + /// about the role that was created. + /// + [Serializable] + public class CreateGroupRoleRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The identifier of the group + /// + public EntityKey Group; + /// + /// The ID of the role. This must be unique within the group and cannot be changed. Role IDs must be between 1 and 64 + /// characters long and are restricted to a-Z, A-Z, 0-9, '(', ')', '_', '-' and '.'. + /// + public string RoleId; + /// + /// The name of the role. This must be unique within the group and can be changed later. Role names must be between 1 and + /// 100 characters long + /// + public string RoleName; + } + + [Serializable] + public class CreateGroupRoleResponse : PlayFabResultCommon + { + /// + /// The current version of the group profile, can be used for concurrency control during updates. + /// + public int ProfileVersion; + /// + /// ID for the role + /// + public string RoleId; + /// + /// The name of the role + /// + public string RoleName; + } + + /// + /// Deletes a group and all roles, invitations, join requests, and blocks associated with it. Permission to delete is only + /// required the group itself to execute this action. The group and data cannot be cannot be recovered once removed, but any + /// abuse reports about the group will remain. No data is returned in the case of success. + /// + [Serializable] + public class DeleteGroupRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// ID of the group or role to remove + /// + public EntityKey Group; + } + + /// + /// Returns information about the role + /// + [Serializable] + public class DeleteRoleRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The identifier of the group + /// + public EntityKey Group; + /// + /// The ID of the role to delete. Role IDs must be between 1 and 64 characters long. + /// + public string RoleId; + } + + [Serializable] + public class EmptyResponse : PlayFabResultCommon + { + } + + /// + /// Combined entity type and ID structure which uniquely identifies a single entity. + /// + [Serializable] + public class EntityKey : PlayFabBaseModel + { + /// + /// Unique ID of the entity. + /// + public string Id; + /// + /// Entity type. See https://docs.microsoft.com/gaming/playfab/features/data/entities/available-built-in-entity-types + /// + public string Type; + } + + [Serializable] + public class EntityMemberRole : PlayFabBaseModel + { + /// + /// The list of members in the role + /// + public List Members; + /// + /// The ID of the role. + /// + public string RoleId; + /// + /// The name of the role + /// + public string RoleName; + } + + /// + /// Entity wrapper class that contains the entity key and the entities that make up the lineage of the entity. + /// + [Serializable] + public class EntityWithLineage : PlayFabBaseModel + { + /// + /// The entity key for the specified entity + /// + public EntityKey Key; + /// + /// Dictionary of entity keys for related entities. Dictionary key is entity type. + /// + public Dictionary Lineage; + } + + /// + /// Returns the ID, name, role list and other non-membership related information about a group. + /// + [Serializable] + public class GetGroupRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The identifier of the group + /// + public EntityKey Group; + /// + /// The full name of the group + /// + public string GroupName; + } + + [Serializable] + public class GetGroupResponse : PlayFabResultCommon + { + /// + /// The ID of the administrator role for the group. + /// + public string AdminRoleId; + /// + /// The server date and time the group was created. + /// + public DateTime Created; + /// + /// The identifier of the group + /// + public EntityKey Group; + /// + /// The name of the group. + /// + public string GroupName; + /// + /// The ID of the default member role for the group. + /// + public string MemberRoleId; + /// + /// The current version of the profile, can be used for concurrency control during updates. + /// + public int ProfileVersion; + /// + /// The list of roles and names that belong to the group. + /// + public Dictionary Roles; + } + + /// + /// Describes an application to join a group + /// + [Serializable] + public class GroupApplication : PlayFabBaseModel + { + /// + /// Type of entity that requested membership + /// + public EntityWithLineage Entity; + /// + /// When the application to join will expire and be deleted + /// + public DateTime Expires; + /// + /// ID of the group that the entity requesting membership to + /// + public EntityKey Group; + } + + /// + /// Describes an entity that is blocked from joining a group. + /// + [Serializable] + public class GroupBlock : PlayFabBaseModel + { + /// + /// The entity that is blocked + /// + public EntityWithLineage Entity; + /// + /// ID of the group that the entity is blocked from + /// + public EntityKey Group; + } + + /// + /// Describes an invitation to a group. + /// + [Serializable] + public class GroupInvitation : PlayFabBaseModel + { + /// + /// When the invitation will expire and be deleted + /// + public DateTime Expires; + /// + /// The group that the entity invited to + /// + public EntityKey Group; + /// + /// The entity that created the invitation + /// + public EntityWithLineage InvitedByEntity; + /// + /// The entity that is invited + /// + public EntityWithLineage InvitedEntity; + /// + /// ID of the role in the group to assign the user to. + /// + public string RoleId; + } + + /// + /// Describes a group role + /// + [Serializable] + public class GroupRole : PlayFabBaseModel + { + /// + /// ID for the role + /// + public string RoleId; + /// + /// The name of the role + /// + public string RoleName; + } + + /// + /// Describes a group and the roles that it contains + /// + [Serializable] + public class GroupWithRoles : PlayFabBaseModel + { + /// + /// ID for the group + /// + public EntityKey Group; + /// + /// The name of the group + /// + public string GroupName; + /// + /// The current version of the profile, can be used for concurrency control during updates. + /// + public int ProfileVersion; + /// + /// The list of roles within the group + /// + public List Roles; + } + + /// + /// Invites a player to join a group, if they are not blocked by the group. An optional role can be provided to + /// automatically assign the player to the role if they accept the invitation. By default, if the entity has an application + /// to the group outstanding, this will accept the application instead and return an error indicating such, rather than + /// creating a duplicate invitation to join that will need to be cleaned up later. Returns information about the new + /// invitation or an error indicating an existing application to join was accepted. + /// + [Serializable] + public class InviteToGroupRequest : PlayFabRequestCommon + { + /// + /// Optional, default true. Automatically accept an application if one exists instead of creating an invitation + /// + public bool? AutoAcceptOutstandingApplication; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// The identifier of the group + /// + public EntityKey Group; + /// + /// Optional. ID of an existing a role in the group to assign the user to. The group's default member role is used if this + /// is not specified. Role IDs must be between 1 and 64 characters long. + /// + public string RoleId; + } + + /// + /// Describes an invitation to a group. + /// + [Serializable] + public class InviteToGroupResponse : PlayFabResultCommon + { + /// + /// When the invitation will expire and be deleted + /// + public DateTime Expires; + /// + /// The group that the entity invited to + /// + public EntityKey Group; + /// + /// The entity that created the invitation + /// + public EntityWithLineage InvitedByEntity; + /// + /// The entity that is invited + /// + public EntityWithLineage InvitedEntity; + /// + /// ID of the role in the group to assign the user to. + /// + public string RoleId; + } + + /// + /// Checks to see if an entity is a member of a group or role within the group. A result indicating if the entity is a + /// member of the group is returned, or a permission error if the caller does not have permission to read the group's member + /// list. + /// + [Serializable] + public class IsMemberRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// The identifier of the group + /// + public EntityKey Group; + /// + /// Optional: ID of the role to check membership of. Defaults to any role (that is, check to see if the entity is a member + /// of the group in any capacity) if not specified. + /// + public string RoleId; + } + + [Serializable] + public class IsMemberResponse : PlayFabResultCommon + { + /// + /// A value indicating whether or not the entity is a member. + /// + public bool IsMember; + } + + /// + /// Lists all outstanding requests to join a group. Returns a list of all requests to join, as well as when the request will + /// expire. To get the group applications for a specific entity, use ListMembershipOpportunities. + /// + [Serializable] + public class ListGroupApplicationsRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The identifier of the group + /// + public EntityKey Group; + } + + [Serializable] + public class ListGroupApplicationsResponse : PlayFabResultCommon + { + /// + /// The requested list of applications to the group. + /// + public List Applications; + } + + /// + /// Lists all entities blocked from joining a group. A list of blocked entities is returned + /// + [Serializable] + public class ListGroupBlocksRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The identifier of the group + /// + public EntityKey Group; + } + + [Serializable] + public class ListGroupBlocksResponse : PlayFabResultCommon + { + /// + /// The requested list blocked entities. + /// + public List BlockedEntities; + } + + /// + /// Lists all outstanding invitations for a group. Returns a list of entities that have been invited, as well as when the + /// invitation will expire. To get the group invitations for a specific entity, use ListMembershipOpportunities. + /// + [Serializable] + public class ListGroupInvitationsRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The identifier of the group + /// + public EntityKey Group; + } + + [Serializable] + public class ListGroupInvitationsResponse : PlayFabResultCommon + { + /// + /// The requested list of group invitations. + /// + public List Invitations; + } + + /// + /// Gets a list of members and the roles they belong to within the group. If the caller does not have permission to view the + /// role, and the member is in no other role, the member is not displayed. Returns a list of entities that are members of + /// the group. + /// + [Serializable] + public class ListGroupMembersRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// ID of the group to list the members and roles for + /// + public EntityKey Group; + } + + [Serializable] + public class ListGroupMembersResponse : PlayFabResultCommon + { + /// + /// The requested list of roles and member entity IDs. + /// + public List Members; + } + + /// + /// Lists all outstanding group applications and invitations for an entity. Anyone may call this for any entity, but data + /// will only be returned for the entity or a parent of that entity. To list invitations or applications for a group to + /// check if a player is trying to join, use ListGroupInvitations and ListGroupApplications. + /// + [Serializable] + public class ListMembershipOpportunitiesRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The optional entity to perform this action on. Defaults to the currently logged in entity. + /// + public EntityKey Entity; + } + + [Serializable] + public class ListMembershipOpportunitiesResponse : PlayFabResultCommon + { + /// + /// The requested list of group applications. + /// + public List Applications; + /// + /// The requested list of group invitations. + /// + public List Invitations; + } + + /// + /// Lists the groups and roles that an entity is a part of, checking to see if group and role metadata and memberships + /// should be visible to the caller. If the entity is not in any roles that are visible to the caller, the group is not + /// returned in the results, even if the caller otherwise has permission to see that the entity is a member of that group. + /// + [Serializable] + public class ListMembershipRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The optional entity to perform this action on. Defaults to the currently logged in entity. + /// + public EntityKey Entity; + } + + [Serializable] + public class ListMembershipResponse : PlayFabResultCommon + { + /// + /// The list of groups + /// + public List Groups; + } + + public enum OperationTypes + { + Created, + Updated, + Deleted, + None + } + + /// + /// Removes an existing application to join the group. This is used for both rejection of an application as well as + /// withdrawing an application. The applying entity or a parent in its chain (e.g. title) may withdraw the application, and + /// any caller with appropriate access in the group may reject an application. No data is returned in the case of success. + /// + [Serializable] + public class RemoveGroupApplicationRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// The identifier of the group + /// + public EntityKey Group; + } + + /// + /// Removes an existing invitation to join the group. This is used for both rejection of an invitation as well as rescinding + /// an invitation. The invited entity or a parent in its chain (e.g. title) may reject the invitation by calling this + /// method, and any caller with appropriate access in the group may rescind an invitation. No data is returned in the case + /// of success. + /// + [Serializable] + public class RemoveGroupInvitationRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// The identifier of the group + /// + public EntityKey Group; + } + + /// + /// Removes members from a group. A member can always remove themselves from a group, regardless of permissions. Returns + /// nothing if successful. + /// + [Serializable] + public class RemoveMembersRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The identifier of the group + /// + public EntityKey Group; + /// + /// List of entities to remove + /// + public List Members; + /// + /// The ID of the role to remove the entities from. + /// + public string RoleId; + } + + /// + /// Unblocks a list of entities from joining a group. No data is returned in the case of success. + /// + [Serializable] + public class UnblockEntityRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// The identifier of the group + /// + public EntityKey Group; + } + + /// + /// Updates data about a group, such as the name or default member role. Returns information about whether the update was + /// successful. Only title claimants may modify the administration role for a group. + /// + [Serializable] + public class UpdateGroupRequest : PlayFabRequestCommon + { + /// + /// Optional: the ID of an existing role to set as the new administrator role for the group + /// + public string AdminRoleId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Optional field used for concurrency control. By specifying the previously returned value of ProfileVersion from the + /// GetGroup API, you can ensure that the group data update will only be performed if the group has not been updated by any + /// other clients since the version you last loaded. + /// + public int? ExpectedProfileVersion; + /// + /// The identifier of the group + /// + public EntityKey Group; + /// + /// Optional: the new name of the group + /// + public string GroupName; + /// + /// Optional: the ID of an existing role to set as the new member role for the group + /// + public string MemberRoleId; + } + + [Serializable] + public class UpdateGroupResponse : PlayFabResultCommon + { + /// + /// Optional reason to explain why the operation was the result that it was. + /// + public string OperationReason; + /// + /// New version of the group data. + /// + public int ProfileVersion; + /// + /// Indicates which operation was completed, either Created, Updated, Deleted or None. + /// + public OperationTypes? SetResult; + } + + /// + /// Updates the role name. Returns information about whether the update was successful. + /// + [Serializable] + public class UpdateGroupRoleRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Optional field used for concurrency control. By specifying the previously returned value of ProfileVersion from the + /// GetGroup API, you can ensure that the group data update will only be performed if the group has not been updated by any + /// other clients since the version you last loaded. + /// + public int? ExpectedProfileVersion; + /// + /// The identifier of the group + /// + public EntityKey Group; + /// + /// ID of the role to update. Role IDs must be between 1 and 64 characters long. + /// + public string RoleId; + /// + /// The new name of the role + /// + public string RoleName; + } + + [Serializable] + public class UpdateGroupRoleResponse : PlayFabResultCommon + { + /// + /// Optional reason to explain why the operation was the result that it was. + /// + public string OperationReason; + /// + /// New version of the role data. + /// + public int ProfileVersion; + /// + /// Indicates which operation was completed, either Created, Updated, Deleted or None. + /// + public OperationTypes? SetResult; + } +} +#endif diff --git a/Assets/PlayFabSDK/Groups/PlayFabGroupsModels.cs.meta b/Assets/PlayFabSDK/Groups/PlayFabGroupsModels.cs.meta new file mode 100644 index 00000000..c093d751 --- /dev/null +++ b/Assets/PlayFabSDK/Groups/PlayFabGroupsModels.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d73f86b427d81044bb2417ea3b5b03ac +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Insights.meta b/Assets/PlayFabSDK/Insights.meta new file mode 100644 index 00000000..64e17155 --- /dev/null +++ b/Assets/PlayFabSDK/Insights.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 235ba2563033d604387492e511b028ef +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Insights/PlayFabEvents.cs b/Assets/PlayFabSDK/Insights/PlayFabEvents.cs new file mode 100644 index 00000000..b07d1a5c --- /dev/null +++ b/Assets/PlayFabSDK/Insights/PlayFabEvents.cs @@ -0,0 +1,22 @@ +#if !DISABLE_PLAYFABENTITY_API +using PlayFab.InsightsModels; + +namespace PlayFab.Events +{ + public partial class PlayFabEvents + { + public event PlayFabRequestEvent OnInsightsGetDetailsRequestEvent; + public event PlayFabResultEvent OnInsightsGetDetailsResultEvent; + public event PlayFabRequestEvent OnInsightsGetLimitsRequestEvent; + public event PlayFabResultEvent OnInsightsGetLimitsResultEvent; + public event PlayFabRequestEvent OnInsightsGetOperationStatusRequestEvent; + public event PlayFabResultEvent OnInsightsGetOperationStatusResultEvent; + public event PlayFabRequestEvent OnInsightsGetPendingOperationsRequestEvent; + public event PlayFabResultEvent OnInsightsGetPendingOperationsResultEvent; + public event PlayFabRequestEvent OnInsightsSetPerformanceRequestEvent; + public event PlayFabResultEvent OnInsightsSetPerformanceResultEvent; + public event PlayFabRequestEvent OnInsightsSetStorageRetentionRequestEvent; + public event PlayFabResultEvent OnInsightsSetStorageRetentionResultEvent; + } +} +#endif diff --git a/Assets/PlayFabSDK/Insights/PlayFabEvents.cs.meta b/Assets/PlayFabSDK/Insights/PlayFabEvents.cs.meta new file mode 100644 index 00000000..a7bdce18 --- /dev/null +++ b/Assets/PlayFabSDK/Insights/PlayFabEvents.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f37defb20913be94a8d7b0e4ed5b97cf +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Insights/PlayFabInsightsAPI.cs b/Assets/PlayFabSDK/Insights/PlayFabInsightsAPI.cs new file mode 100644 index 00000000..b67e3883 --- /dev/null +++ b/Assets/PlayFabSDK/Insights/PlayFabInsightsAPI.cs @@ -0,0 +1,119 @@ +#if !DISABLE_PLAYFABENTITY_API && !DISABLE_PLAYFAB_STATIC_API + +using System; +using System.Collections.Generic; +using PlayFab.InsightsModels; +using PlayFab.Internal; + +namespace PlayFab +{ + /// + /// Manage the Insights performance level and data storage retention settings. + /// + public static class PlayFabInsightsAPI + { + static PlayFabInsightsAPI() {} + + + /// + /// Verify entity login. + /// + public static bool IsEntityLoggedIn() + { + return PlayFabSettings.staticPlayer.IsEntityLoggedIn(); + } + + /// + /// Clear the Client SessionToken which allows this Client to call API calls requiring login. + /// A new/fresh login will be required after calling this. + /// + public static void ForgetAllCredentials() + { + PlayFabSettings.staticPlayer.ForgetAllCredentials(); + } + + /// + /// Gets the current values for the Insights performance and data storage retention, list of pending operations, and the + /// performance and data storage retention limits. + /// + public static void GetDetails(InsightsEmptyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Insights/GetDetails", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the range of allowed values for performance and data storage retention values as well as the submeter details + /// for each performance level. + /// + public static void GetLimits(InsightsEmptyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Insights/GetLimits", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets the status of a SetPerformance or SetStorageRetention operation. + /// + public static void GetOperationStatus(InsightsGetOperationStatusRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Insights/GetOperationStatus", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets a list of pending SetPerformance and/or SetStorageRetention operations for the title. + /// + public static void GetPendingOperations(InsightsGetPendingOperationsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Insights/GetPendingOperations", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Sets the Insights performance level value for the title. + /// + public static void SetPerformance(InsightsSetPerformanceRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Insights/SetPerformance", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Sets the Insights data storage retention days value for the title. + /// + public static void SetStorageRetention(InsightsSetStorageRetentionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Insights/SetStorageRetention", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + + } +} + +#endif diff --git a/Assets/PlayFabSDK/Insights/PlayFabInsightsAPI.cs.meta b/Assets/PlayFabSDK/Insights/PlayFabInsightsAPI.cs.meta new file mode 100644 index 00000000..51bd4edb --- /dev/null +++ b/Assets/PlayFabSDK/Insights/PlayFabInsightsAPI.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 711d5cb10af3bcf44b9a605a7e7c03e3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Insights/PlayFabInsightsInstanceAPI.cs b/Assets/PlayFabSDK/Insights/PlayFabInsightsInstanceAPI.cs new file mode 100644 index 00000000..5a6c4200 --- /dev/null +++ b/Assets/PlayFabSDK/Insights/PlayFabInsightsInstanceAPI.cs @@ -0,0 +1,125 @@ +#if !DISABLE_PLAYFABENTITY_API + +using System; +using System.Collections.Generic; +using PlayFab.InsightsModels; +using PlayFab.Internal; +using PlayFab.SharedModels; + +namespace PlayFab +{ + /// + /// Manage the Insights performance level and data storage retention settings. + /// + public class PlayFabInsightsInstanceAPI : IPlayFabInstanceApi + { + public readonly PlayFabApiSettings apiSettings = null; + public readonly PlayFabAuthenticationContext authenticationContext = null; + + public PlayFabInsightsInstanceAPI(PlayFabAuthenticationContext context) + { + if (context == null) + throw new PlayFabException(PlayFabExceptionCode.AuthContextRequired, "Context cannot be null, create a PlayFabAuthenticationContext for each player in advance, or call .GetAuthenticationContext()"); + authenticationContext = context; + } + + public PlayFabInsightsInstanceAPI(PlayFabApiSettings settings, PlayFabAuthenticationContext context) + { + if (context == null) + throw new PlayFabException(PlayFabExceptionCode.AuthContextRequired, "Context cannot be null, create a PlayFabAuthenticationContext for each player in advance, or call .GetAuthenticationContext()"); + apiSettings = settings; + authenticationContext = context; + } + + /// + /// Verify entity login. + /// + public bool IsEntityLoggedIn() + { + return authenticationContext == null ? false : authenticationContext.IsEntityLoggedIn(); + } + + /// + /// Clear the Client SessionToken which allows this Client to call API calls requiring login. + /// A new/fresh login will be required after calling this. + /// + public void ForgetAllCredentials() + { + if (authenticationContext != null) + { + authenticationContext.ForgetAllCredentials(); + } + } + + /// + /// Gets the current values for the Insights performance and data storage retention, list of pending operations, and the + /// performance and data storage retention limits. + /// + public void GetDetails(InsightsEmptyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Insights/GetDetails", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the range of allowed values for performance and data storage retention values as well as the submeter details + /// for each performance level. + /// + public void GetLimits(InsightsEmptyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Insights/GetLimits", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets the status of a SetPerformance or SetStorageRetention operation. + /// + public void GetOperationStatus(InsightsGetOperationStatusRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Insights/GetOperationStatus", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets a list of pending SetPerformance and/or SetStorageRetention operations for the title. + /// + public void GetPendingOperations(InsightsGetPendingOperationsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Insights/GetPendingOperations", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Sets the Insights performance level value for the title. + /// + public void SetPerformance(InsightsSetPerformanceRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Insights/SetPerformance", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Sets the Insights data storage retention days value for the title. + /// + public void SetStorageRetention(InsightsSetStorageRetentionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Insights/SetStorageRetention", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + } +} + +#endif diff --git a/Assets/PlayFabSDK/Insights/PlayFabInsightsInstanceAPI.cs.meta b/Assets/PlayFabSDK/Insights/PlayFabInsightsInstanceAPI.cs.meta new file mode 100644 index 00000000..3007153c --- /dev/null +++ b/Assets/PlayFabSDK/Insights/PlayFabInsightsInstanceAPI.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c2e7ee83796bb834cbd6263a7a6d65ca +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Insights/PlayFabInsightsModels.cs b/Assets/PlayFabSDK/Insights/PlayFabInsightsModels.cs new file mode 100644 index 00000000..fbfd2d62 --- /dev/null +++ b/Assets/PlayFabSDK/Insights/PlayFabInsightsModels.cs @@ -0,0 +1,235 @@ +#if !DISABLE_PLAYFABENTITY_API +using System; +using System.Collections.Generic; +using PlayFab.SharedModels; + +namespace PlayFab.InsightsModels +{ + [Serializable] + public class InsightsEmptyRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + [Serializable] + public class InsightsGetDetailsResponse : PlayFabResultCommon + { + /// + /// Amount of data (in MB) currently used by Insights. + /// + public uint DataUsageMb; + /// + /// Details of any error that occurred while retrieving Insights details. + /// + public string ErrorMessage; + /// + /// Allowed range of values for performance level and data storage retention. + /// + public InsightsGetLimitsResponse Limits; + /// + /// List of pending Insights operations for the title. + /// + public List PendingOperations; + /// + /// Current Insights performance level setting. + /// + public int PerformanceLevel; + /// + /// Current Insights data storage retention value in days. + /// + public int RetentionDays; + } + + [Serializable] + public class InsightsGetLimitsResponse : PlayFabResultCommon + { + /// + /// Default Insights performance level. + /// + public int DefaultPerformanceLevel; + /// + /// Default Insights data storage retention days. + /// + public int DefaultStorageRetentionDays; + /// + /// Maximum allowed data storage retention days. + /// + public int StorageMaxRetentionDays; + /// + /// Minimum allowed data storage retention days. + /// + public int StorageMinRetentionDays; + /// + /// List of Insights submeter limits for the allowed performance levels. + /// + public List SubMeters; + } + + /// + /// Returns the current status for the requested operation id. + /// + [Serializable] + public class InsightsGetOperationStatusRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Id of the Insights operation. + /// + public string OperationId; + } + + [Serializable] + public class InsightsGetOperationStatusResponse : PlayFabResultCommon + { + /// + /// Optional message related to the operation details. + /// + public string Message; + /// + /// Time the operation was completed. + /// + public DateTime OperationCompletedTime; + /// + /// Id of the Insights operation. + /// + public string OperationId; + /// + /// Time the operation status was last updated. + /// + public DateTime OperationLastUpdated; + /// + /// Time the operation started. + /// + public DateTime OperationStartedTime; + /// + /// The type of operation, SetPerformance or SetStorageRetention. + /// + public string OperationType; + /// + /// The value requested for the operation. + /// + public int OperationValue; + /// + /// Current status of the operation. + /// + public string Status; + } + + /// + /// Returns a list of operations that are in the pending state for the requested operation type. + /// + [Serializable] + public class InsightsGetPendingOperationsRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The type of pending operations requested, or blank for all operation types. + /// + public string OperationType; + } + + [Serializable] + public class InsightsGetPendingOperationsResponse : PlayFabResultCommon + { + /// + /// List of pending Insights operations. + /// + public List PendingOperations; + } + + [Serializable] + public class InsightsOperationResponse : PlayFabResultCommon + { + /// + /// Optional message related to the operation details. + /// + public string Message; + /// + /// Id of the Insights operation. + /// + public string OperationId; + /// + /// The type of operation, SetPerformance or SetStorageRetention. + /// + public string OperationType; + } + + [Serializable] + public class InsightsPerformanceLevel : PlayFabBaseModel + { + /// + /// Number of allowed active event exports. + /// + public int ActiveEventExports; + /// + /// Maximum cache size. + /// + public int CacheSizeMB; + /// + /// Maximum number of concurrent queries. + /// + public int Concurrency; + /// + /// Number of Insights credits consumed per minute. + /// + public double CreditsPerMinute; + /// + /// Maximum events per second. + /// + public int EventsPerSecond; + /// + /// Performance level. + /// + public int Level; + /// + /// Maximum amount of memory allowed per query. + /// + public int MaxMemoryPerQueryMB; + /// + /// Amount of compute power allocated for queries and operations. + /// + public int VirtualCpuCores; + } + + /// + /// Sets the performance level to the requested value. Use the GetLimits method to get the allowed values. + /// + [Serializable] + public class InsightsSetPerformanceRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The Insights performance level to apply to the title. + /// + public int PerformanceLevel; + } + + /// + /// Sets the data storage retention to the requested value. Use the GetLimits method to get the range of allowed values. + /// + [Serializable] + public class InsightsSetStorageRetentionRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The Insights data storage retention value (in days) to apply to the title. + /// + public int RetentionDays; + } +} +#endif diff --git a/Assets/PlayFabSDK/Insights/PlayFabInsightsModels.cs.meta b/Assets/PlayFabSDK/Insights/PlayFabInsightsModels.cs.meta new file mode 100644 index 00000000..ab052d03 --- /dev/null +++ b/Assets/PlayFabSDK/Insights/PlayFabInsightsModels.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0018df8cb03ec3a498320c2be74427e4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Localization.meta b/Assets/PlayFabSDK/Localization.meta new file mode 100644 index 00000000..6b6838ec --- /dev/null +++ b/Assets/PlayFabSDK/Localization.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 66902b25e3ba7714d880315c0d1ea67e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Localization/PlayFabEvents.cs b/Assets/PlayFabSDK/Localization/PlayFabEvents.cs new file mode 100644 index 00000000..02a262eb --- /dev/null +++ b/Assets/PlayFabSDK/Localization/PlayFabEvents.cs @@ -0,0 +1,12 @@ +#if !DISABLE_PLAYFABENTITY_API +using PlayFab.LocalizationModels; + +namespace PlayFab.Events +{ + public partial class PlayFabEvents + { + public event PlayFabRequestEvent OnLocalizationGetLanguageListRequestEvent; + public event PlayFabResultEvent OnLocalizationGetLanguageListResultEvent; + } +} +#endif diff --git a/Assets/PlayFabSDK/Localization/PlayFabEvents.cs.meta b/Assets/PlayFabSDK/Localization/PlayFabEvents.cs.meta new file mode 100644 index 00000000..0edb54ce --- /dev/null +++ b/Assets/PlayFabSDK/Localization/PlayFabEvents.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1c3bd18b65a5d8d4eb83e5ef98114e4d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Localization/PlayFabLocalizationAPI.cs b/Assets/PlayFabSDK/Localization/PlayFabLocalizationAPI.cs new file mode 100644 index 00000000..d16787fe --- /dev/null +++ b/Assets/PlayFabSDK/Localization/PlayFabLocalizationAPI.cs @@ -0,0 +1,52 @@ +#if !DISABLE_PLAYFABENTITY_API && !DISABLE_PLAYFAB_STATIC_API + +using System; +using System.Collections.Generic; +using PlayFab.LocalizationModels; +using PlayFab.Internal; + +namespace PlayFab +{ + /// + /// The Localization APIs give you the tools needed to manage language setup in your title. + /// + public static class PlayFabLocalizationAPI + { + static PlayFabLocalizationAPI() {} + + + /// + /// Verify entity login. + /// + public static bool IsEntityLoggedIn() + { + return PlayFabSettings.staticPlayer.IsEntityLoggedIn(); + } + + /// + /// Clear the Client SessionToken which allows this Client to call API calls requiring login. + /// A new/fresh login will be required after calling this. + /// + public static void ForgetAllCredentials() + { + PlayFabSettings.staticPlayer.ForgetAllCredentials(); + } + + /// + /// Retrieves the list of allowed languages, only accessible by title entities + /// + public static void GetLanguageList(GetLanguageListRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Locale/GetLanguageList", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + + } +} + +#endif diff --git a/Assets/PlayFabSDK/Localization/PlayFabLocalizationAPI.cs.meta b/Assets/PlayFabSDK/Localization/PlayFabLocalizationAPI.cs.meta new file mode 100644 index 00000000..997fea20 --- /dev/null +++ b/Assets/PlayFabSDK/Localization/PlayFabLocalizationAPI.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ca10b96ef3ce52644a989907c77d047f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Localization/PlayFabLocalizationInstanceAPI.cs b/Assets/PlayFabSDK/Localization/PlayFabLocalizationInstanceAPI.cs new file mode 100644 index 00000000..8797cfc7 --- /dev/null +++ b/Assets/PlayFabSDK/Localization/PlayFabLocalizationInstanceAPI.cs @@ -0,0 +1,68 @@ +#if !DISABLE_PLAYFABENTITY_API + +using System; +using System.Collections.Generic; +using PlayFab.LocalizationModels; +using PlayFab.Internal; +using PlayFab.SharedModels; + +namespace PlayFab +{ + /// + /// The Localization APIs give you the tools needed to manage language setup in your title. + /// + public class PlayFabLocalizationInstanceAPI : IPlayFabInstanceApi + { + public readonly PlayFabApiSettings apiSettings = null; + public readonly PlayFabAuthenticationContext authenticationContext = null; + + public PlayFabLocalizationInstanceAPI(PlayFabAuthenticationContext context) + { + if (context == null) + throw new PlayFabException(PlayFabExceptionCode.AuthContextRequired, "Context cannot be null, create a PlayFabAuthenticationContext for each player in advance, or call .GetAuthenticationContext()"); + authenticationContext = context; + } + + public PlayFabLocalizationInstanceAPI(PlayFabApiSettings settings, PlayFabAuthenticationContext context) + { + if (context == null) + throw new PlayFabException(PlayFabExceptionCode.AuthContextRequired, "Context cannot be null, create a PlayFabAuthenticationContext for each player in advance, or call .GetAuthenticationContext()"); + apiSettings = settings; + authenticationContext = context; + } + + /// + /// Verify entity login. + /// + public bool IsEntityLoggedIn() + { + return authenticationContext == null ? false : authenticationContext.IsEntityLoggedIn(); + } + + /// + /// Clear the Client SessionToken which allows this Client to call API calls requiring login. + /// A new/fresh login will be required after calling this. + /// + public void ForgetAllCredentials() + { + if (authenticationContext != null) + { + authenticationContext.ForgetAllCredentials(); + } + } + + /// + /// Retrieves the list of allowed languages, only accessible by title entities + /// + public void GetLanguageList(GetLanguageListRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Locale/GetLanguageList", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + } +} + +#endif diff --git a/Assets/PlayFabSDK/Localization/PlayFabLocalizationInstanceAPI.cs.meta b/Assets/PlayFabSDK/Localization/PlayFabLocalizationInstanceAPI.cs.meta new file mode 100644 index 00000000..ab52fccc --- /dev/null +++ b/Assets/PlayFabSDK/Localization/PlayFabLocalizationInstanceAPI.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0e3a59c48c3c6fb45a9d83845b225dde +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Localization/PlayFabLocalizationModels.cs b/Assets/PlayFabSDK/Localization/PlayFabLocalizationModels.cs new file mode 100644 index 00000000..49d2d475 --- /dev/null +++ b/Assets/PlayFabSDK/Localization/PlayFabLocalizationModels.cs @@ -0,0 +1,26 @@ +#if !DISABLE_PLAYFABENTITY_API +using System; +using System.Collections.Generic; +using PlayFab.SharedModels; + +namespace PlayFab.LocalizationModels +{ + [Serializable] + public class GetLanguageListRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + [Serializable] + public class GetLanguageListResponse : PlayFabResultCommon + { + /// + /// The list of allowed languages, in BCP47 two-letter format + /// + public List LanguageList; + } +} +#endif diff --git a/Assets/PlayFabSDK/Localization/PlayFabLocalizationModels.cs.meta b/Assets/PlayFabSDK/Localization/PlayFabLocalizationModels.cs.meta new file mode 100644 index 00000000..0e2da1e1 --- /dev/null +++ b/Assets/PlayFabSDK/Localization/PlayFabLocalizationModels.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 772d6350724839b498944cab1b377fb5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Matchmaker.meta b/Assets/PlayFabSDK/Matchmaker.meta new file mode 100644 index 00000000..532fb973 --- /dev/null +++ b/Assets/PlayFabSDK/Matchmaker.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 68b5c41b409fa1842b0ce5bf831d8540 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Matchmaker/PlayFabEvents.cs b/Assets/PlayFabSDK/Matchmaker/PlayFabEvents.cs new file mode 100644 index 00000000..9248067c --- /dev/null +++ b/Assets/PlayFabSDK/Matchmaker/PlayFabEvents.cs @@ -0,0 +1,18 @@ +#if ENABLE_PLAYFABSERVER_API +using PlayFab.MatchmakerModels; + +namespace PlayFab.Events +{ + public partial class PlayFabEvents + { + public event PlayFabRequestEvent OnMatchmakerAuthUserRequestEvent; + public event PlayFabResultEvent OnMatchmakerAuthUserResultEvent; + public event PlayFabRequestEvent OnMatchmakerPlayerJoinedRequestEvent; + public event PlayFabResultEvent OnMatchmakerPlayerJoinedResultEvent; + public event PlayFabRequestEvent OnMatchmakerPlayerLeftRequestEvent; + public event PlayFabResultEvent OnMatchmakerPlayerLeftResultEvent; + public event PlayFabRequestEvent OnMatchmakerUserInfoRequestEvent; + public event PlayFabResultEvent OnMatchmakerUserInfoResultEvent; + } +} +#endif diff --git a/Assets/PlayFabSDK/Matchmaker/PlayFabEvents.cs.meta b/Assets/PlayFabSDK/Matchmaker/PlayFabEvents.cs.meta new file mode 100644 index 00000000..e3a3343c --- /dev/null +++ b/Assets/PlayFabSDK/Matchmaker/PlayFabEvents.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1055058934189914bac79666a289e9fd +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Matchmaker/PlayFabMatchmakerAPI.cs b/Assets/PlayFabSDK/Matchmaker/PlayFabMatchmakerAPI.cs new file mode 100644 index 00000000..6265d304 --- /dev/null +++ b/Assets/PlayFabSDK/Matchmaker/PlayFabMatchmakerAPI.cs @@ -0,0 +1,88 @@ +#if ENABLE_PLAYFABSERVER_API && !DISABLE_PLAYFAB_STATIC_API + +using System; +using System.Collections.Generic; +using PlayFab.MatchmakerModels; +using PlayFab.Internal; + +namespace PlayFab +{ + /// + /// Enables the use of an external match-making service in conjunction with PlayFab hosted Game Server instances + /// + public static class PlayFabMatchmakerAPI + { + static PlayFabMatchmakerAPI() {} + + + /// + /// Clear the Client SessionToken which allows this Client to call API calls requiring login. + /// A new/fresh login will be required after calling this. + /// + public static void ForgetAllCredentials() + { + PlayFabSettings.staticPlayer.ForgetAllCredentials(); + } + + /// + /// Validates a user with the PlayFab service + /// + [Obsolete("No longer available", true)] + public static void AuthUser(AuthUserRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Matchmaker/AuthUser", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Informs the PlayFab game server hosting service that the indicated user has joined the Game Server Instance specified + /// + [Obsolete("No longer available", true)] + public static void PlayerJoined(PlayerJoinedRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Matchmaker/PlayerJoined", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Informs the PlayFab game server hosting service that the indicated user has left the Game Server Instance specified + /// + [Obsolete("No longer available", true)] + public static void PlayerLeft(PlayerLeftRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Matchmaker/PlayerLeft", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the relevant details for a specified user, which the external match-making service can then use to compute + /// effective matches + /// + [Obsolete("No longer available", true)] + public static void UserInfo(UserInfoRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Matchmaker/UserInfo", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + + } +} + +#endif diff --git a/Assets/PlayFabSDK/Matchmaker/PlayFabMatchmakerAPI.cs.meta b/Assets/PlayFabSDK/Matchmaker/PlayFabMatchmakerAPI.cs.meta new file mode 100644 index 00000000..e6f48d33 --- /dev/null +++ b/Assets/PlayFabSDK/Matchmaker/PlayFabMatchmakerAPI.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: c712eeedbc85dfa4c80d30f8a2ed6cd9 +timeCreated: 1468524876 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Matchmaker/PlayFabMatchmakerInstanceAPI.cs b/Assets/PlayFabSDK/Matchmaker/PlayFabMatchmakerInstanceAPI.cs new file mode 100644 index 00000000..b16f710d --- /dev/null +++ b/Assets/PlayFabSDK/Matchmaker/PlayFabMatchmakerInstanceAPI.cs @@ -0,0 +1,98 @@ +#if ENABLE_PLAYFABSERVER_API + +using System; +using System.Collections.Generic; +using PlayFab.MatchmakerModels; +using PlayFab.Internal; +using PlayFab.SharedModels; + +namespace PlayFab +{ + /// + /// Enables the use of an external match-making service in conjunction with PlayFab hosted Game Server instances + /// + public class PlayFabMatchmakerInstanceAPI : IPlayFabInstanceApi + { + public readonly PlayFabApiSettings apiSettings = null; + public readonly PlayFabAuthenticationContext authenticationContext = null; + + public PlayFabMatchmakerInstanceAPI(PlayFabAuthenticationContext context) + { + if (context == null) + throw new PlayFabException(PlayFabExceptionCode.AuthContextRequired, "Context cannot be null, create a PlayFabAuthenticationContext for each player in advance, or call .GetAuthenticationContext()"); + authenticationContext = context; + } + + public PlayFabMatchmakerInstanceAPI(PlayFabApiSettings settings, PlayFabAuthenticationContext context) + { + if (context == null) + throw new PlayFabException(PlayFabExceptionCode.AuthContextRequired, "Context cannot be null, create a PlayFabAuthenticationContext for each player in advance, or call .GetAuthenticationContext()"); + apiSettings = settings; + authenticationContext = context; + } + + /// + /// Clear the Client SessionToken which allows this Client to call API calls requiring login. + /// A new/fresh login will be required after calling this. + /// + public void ForgetAllCredentials() + { + if (authenticationContext != null) + { + authenticationContext.ForgetAllCredentials(); + } + } + + /// + /// Validates a user with the PlayFab service + /// + [Obsolete("No longer available", true)] + public void AuthUser(AuthUserRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Matchmaker/AuthUser", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Informs the PlayFab game server hosting service that the indicated user has joined the Game Server Instance specified + /// + [Obsolete("No longer available", true)] + public void PlayerJoined(PlayerJoinedRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Matchmaker/PlayerJoined", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Informs the PlayFab game server hosting service that the indicated user has left the Game Server Instance specified + /// + [Obsolete("No longer available", true)] + public void PlayerLeft(PlayerLeftRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Matchmaker/PlayerLeft", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the relevant details for a specified user, which the external match-making service can then use to compute + /// effective matches + /// + [Obsolete("No longer available", true)] + public void UserInfo(UserInfoRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Matchmaker/UserInfo", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + } +} + +#endif diff --git a/Assets/PlayFabSDK/Matchmaker/PlayFabMatchmakerInstanceAPI.cs.meta b/Assets/PlayFabSDK/Matchmaker/PlayFabMatchmakerInstanceAPI.cs.meta new file mode 100644 index 00000000..cb8059c9 --- /dev/null +++ b/Assets/PlayFabSDK/Matchmaker/PlayFabMatchmakerInstanceAPI.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 77057761a62cdb648960d924f1b322af +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Matchmaker/PlayFabMatchmakerModels.cs b/Assets/PlayFabSDK/Matchmaker/PlayFabMatchmakerModels.cs new file mode 100644 index 00000000..ed6a7e22 --- /dev/null +++ b/Assets/PlayFabSDK/Matchmaker/PlayFabMatchmakerModels.cs @@ -0,0 +1,229 @@ +#if ENABLE_PLAYFABSERVER_API +using System; +using System.Collections.Generic; +using PlayFab.SharedModels; + +namespace PlayFab.MatchmakerModels +{ + /// + /// This API allows the external match-making service to confirm that the user has a valid Session Ticket for the title, in + /// order to securely enable match-making. The client passes the user's Session Ticket to the external match-making service, + /// which then passes the Session Ticket in as the AuthorizationTicket in this call. + /// + [Serializable] + public class AuthUserRequest : PlayFabRequestCommon + { + /// + /// Session Ticket provided by the client. + /// + public string AuthorizationTicket; + } + + [Serializable] + public class AuthUserResponse : PlayFabResultCommon + { + /// + /// Boolean indicating if the user has been authorized to use the external match-making service. + /// + public bool Authorized; + /// + /// PlayFab unique identifier of the account that has been authorized. + /// + public string PlayFabId; + } + + /// + /// A unique instance of an item in a user's inventory. Note, to retrieve additional information for an item such as Tags, + /// Description that are the same across all instances of the item, a call to GetCatalogItems is required. The ItemID of can + /// be matched to a catalog entry, which contains the additional information. Also note that Custom Data is only set when + /// the User's specific instance has updated the CustomData via a call to UpdateUserInventoryItemCustomData. Other fields + /// such as UnitPrice and UnitCurrency are only set when the item was granted via a purchase. + /// + [Serializable] + public class ItemInstance : PlayFabBaseModel + { + /// + /// Game specific comment associated with this instance when it was added to the user inventory. + /// + public string Annotation; + /// + /// Array of unique items that were awarded when this catalog item was purchased. + /// + public List BundleContents; + /// + /// Unique identifier for the parent inventory item, as defined in the catalog, for object which were added from a bundle or + /// container. + /// + public string BundleParent; + /// + /// Catalog version for the inventory item, when this instance was created. + /// + public string CatalogVersion; + /// + /// A set of custom key-value pairs on the instance of the inventory item, which is not to be confused with the catalog + /// item's custom data. + /// + public Dictionary CustomData; + /// + /// CatalogItem.DisplayName at the time this item was purchased. + /// + public string DisplayName; + /// + /// Timestamp for when this instance will expire. + /// + public DateTime? Expiration; + /// + /// Class name for the inventory item, as defined in the catalog. + /// + public string ItemClass; + /// + /// Unique identifier for the inventory item, as defined in the catalog. + /// + public string ItemId; + /// + /// Unique item identifier for this specific instance of the item. + /// + public string ItemInstanceId; + /// + /// Timestamp for when this instance was purchased. + /// + public DateTime? PurchaseDate; + /// + /// Total number of remaining uses, if this is a consumable item. + /// + public int? RemainingUses; + /// + /// Currency type for the cost of the catalog item. Not available when granting items. + /// + public string UnitCurrency; + /// + /// Cost of the catalog item in the given currency. Not available when granting items. + /// + public uint UnitPrice; + /// + /// The number of uses that were added or removed to this item in this call. + /// + public int? UsesIncrementedBy; + } + + [Serializable] + public class PlayerJoinedRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Unique identifier of the Game Server Instance the user is joining. This must be a Game Server Instance started with the + /// Matchmaker/StartGame API. + /// + public string LobbyId; + /// + /// PlayFab unique identifier for the player joining. + /// + public string PlayFabId; + } + + [Serializable] + public class PlayerJoinedResponse : PlayFabResultCommon + { + } + + [Serializable] + public class PlayerLeftRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Unique identifier of the Game Server Instance the user is leaving. This must be a Game Server Instance started with the + /// Matchmaker/StartGame API. + /// + public string LobbyId; + /// + /// PlayFab unique identifier for the player leaving. + /// + public string PlayFabId; + } + + [Serializable] + public class PlayerLeftResponse : PlayFabResultCommon + { + } + + [Serializable] + public class UserInfoRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Minimum catalog version for which data is requested (filters the results to only contain inventory items which have a + /// catalog version of this or higher). + /// + public int MinCatalogVersion; + /// + /// PlayFab unique identifier of the user whose information is being requested. + /// + public string PlayFabId; + } + + [Serializable] + public class UserInfoResponse : PlayFabResultCommon + { + /// + /// Array of inventory items in the user's current inventory. + /// + public List Inventory; + /// + /// Boolean indicating whether the user is a developer. + /// + public bool IsDeveloper; + /// + /// PlayFab unique identifier of the user whose information was requested. + /// + public string PlayFabId; + /// + /// Steam unique identifier, if the user has an associated Steam account. + /// + public string SteamId; + /// + /// Title specific display name, if set. + /// + public string TitleDisplayName; + /// + /// PlayFab unique user name. + /// + public string Username; + /// + /// Array of virtual currency balance(s) belonging to the user. + /// + public Dictionary VirtualCurrency; + /// + /// Array of remaining times and timestamps for virtual currencies. + /// + public Dictionary VirtualCurrencyRechargeTimes; + } + + [Serializable] + public class VirtualCurrencyRechargeTime : PlayFabBaseModel + { + /// + /// Maximum value to which the regenerating currency will automatically increment. Note that it can exceed this value + /// through use of the AddUserVirtualCurrency API call. However, it will not regenerate automatically until it has fallen + /// below this value. + /// + public int RechargeMax; + /// + /// Server timestamp in UTC indicating the next time the virtual currency will be incremented. + /// + public DateTime RechargeTime; + /// + /// Time remaining (in seconds) before the next recharge increment of the virtual currency. + /// + public int SecondsToRecharge; + } +} +#endif diff --git a/Assets/PlayFabSDK/Matchmaker/PlayFabMatchmakerModels.cs.meta b/Assets/PlayFabSDK/Matchmaker/PlayFabMatchmakerModels.cs.meta new file mode 100644 index 00000000..ca305967 --- /dev/null +++ b/Assets/PlayFabSDK/Matchmaker/PlayFabMatchmakerModels.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: c7c60a1006c1e64499804ca82b2412ed +timeCreated: 1468524876 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Multiplayer.meta b/Assets/PlayFabSDK/Multiplayer.meta new file mode 100644 index 00000000..03232081 --- /dev/null +++ b/Assets/PlayFabSDK/Multiplayer.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: de90c696622c1834282ff91ab76f822c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Multiplayer/PlayFabEvents.cs b/Assets/PlayFabSDK/Multiplayer/PlayFabEvents.cs new file mode 100644 index 00000000..46607776 --- /dev/null +++ b/Assets/PlayFabSDK/Multiplayer/PlayFabEvents.cs @@ -0,0 +1,184 @@ +#if !DISABLE_PLAYFABENTITY_API +using PlayFab.MultiplayerModels; + +namespace PlayFab.Events +{ + public partial class PlayFabEvents + { + public event PlayFabRequestEvent OnMultiplayerCancelAllMatchmakingTicketsForPlayerRequestEvent; + public event PlayFabResultEvent OnMultiplayerCancelAllMatchmakingTicketsForPlayerResultEvent; + public event PlayFabRequestEvent OnMultiplayerCancelAllServerBackfillTicketsForPlayerRequestEvent; + public event PlayFabResultEvent OnMultiplayerCancelAllServerBackfillTicketsForPlayerResultEvent; + public event PlayFabRequestEvent OnMultiplayerCancelMatchmakingTicketRequestEvent; + public event PlayFabResultEvent OnMultiplayerCancelMatchmakingTicketResultEvent; + public event PlayFabRequestEvent OnMultiplayerCancelServerBackfillTicketRequestEvent; + public event PlayFabResultEvent OnMultiplayerCancelServerBackfillTicketResultEvent; + public event PlayFabRequestEvent OnMultiplayerCreateBuildAliasRequestEvent; + public event PlayFabResultEvent OnMultiplayerCreateBuildAliasResultEvent; + public event PlayFabRequestEvent OnMultiplayerCreateBuildWithCustomContainerRequestEvent; + public event PlayFabResultEvent OnMultiplayerCreateBuildWithCustomContainerResultEvent; + public event PlayFabRequestEvent OnMultiplayerCreateBuildWithManagedContainerRequestEvent; + public event PlayFabResultEvent OnMultiplayerCreateBuildWithManagedContainerResultEvent; + public event PlayFabRequestEvent OnMultiplayerCreateBuildWithProcessBasedServerRequestEvent; + public event PlayFabResultEvent OnMultiplayerCreateBuildWithProcessBasedServerResultEvent; + public event PlayFabRequestEvent OnMultiplayerCreateLobbyRequestEvent; + public event PlayFabResultEvent OnMultiplayerCreateLobbyResultEvent; + public event PlayFabRequestEvent OnMultiplayerCreateMatchmakingTicketRequestEvent; + public event PlayFabResultEvent OnMultiplayerCreateMatchmakingTicketResultEvent; + public event PlayFabRequestEvent OnMultiplayerCreateRemoteUserRequestEvent; + public event PlayFabResultEvent OnMultiplayerCreateRemoteUserResultEvent; + public event PlayFabRequestEvent OnMultiplayerCreateServerBackfillTicketRequestEvent; + public event PlayFabResultEvent OnMultiplayerCreateServerBackfillTicketResultEvent; + public event PlayFabRequestEvent OnMultiplayerCreateServerMatchmakingTicketRequestEvent; + public event PlayFabResultEvent OnMultiplayerCreateServerMatchmakingTicketResultEvent; + public event PlayFabRequestEvent OnMultiplayerCreateTitleMultiplayerServersQuotaChangeRequestEvent; + public event PlayFabResultEvent OnMultiplayerCreateTitleMultiplayerServersQuotaChangeResultEvent; + public event PlayFabRequestEvent OnMultiplayerDeleteAssetRequestEvent; + public event PlayFabResultEvent OnMultiplayerDeleteAssetResultEvent; + public event PlayFabRequestEvent OnMultiplayerDeleteBuildRequestEvent; + public event PlayFabResultEvent OnMultiplayerDeleteBuildResultEvent; + public event PlayFabRequestEvent OnMultiplayerDeleteBuildAliasRequestEvent; + public event PlayFabResultEvent OnMultiplayerDeleteBuildAliasResultEvent; + public event PlayFabRequestEvent OnMultiplayerDeleteBuildRegionRequestEvent; + public event PlayFabResultEvent OnMultiplayerDeleteBuildRegionResultEvent; + public event PlayFabRequestEvent OnMultiplayerDeleteCertificateRequestEvent; + public event PlayFabResultEvent OnMultiplayerDeleteCertificateResultEvent; + public event PlayFabRequestEvent OnMultiplayerDeleteContainerImageRepositoryRequestEvent; + public event PlayFabResultEvent OnMultiplayerDeleteContainerImageRepositoryResultEvent; + public event PlayFabRequestEvent OnMultiplayerDeleteLobbyRequestEvent; + public event PlayFabResultEvent OnMultiplayerDeleteLobbyResultEvent; + public event PlayFabRequestEvent OnMultiplayerDeleteRemoteUserRequestEvent; + public event PlayFabResultEvent OnMultiplayerDeleteRemoteUserResultEvent; + public event PlayFabRequestEvent OnMultiplayerDeleteSecretRequestEvent; + public event PlayFabResultEvent OnMultiplayerDeleteSecretResultEvent; + public event PlayFabRequestEvent OnMultiplayerEnableMultiplayerServersForTitleRequestEvent; + public event PlayFabResultEvent OnMultiplayerEnableMultiplayerServersForTitleResultEvent; + public event PlayFabRequestEvent OnMultiplayerFindFriendLobbiesRequestEvent; + public event PlayFabResultEvent OnMultiplayerFindFriendLobbiesResultEvent; + public event PlayFabRequestEvent OnMultiplayerFindLobbiesRequestEvent; + public event PlayFabResultEvent OnMultiplayerFindLobbiesResultEvent; + public event PlayFabRequestEvent OnMultiplayerGetAssetDownloadUrlRequestEvent; + public event PlayFabResultEvent OnMultiplayerGetAssetDownloadUrlResultEvent; + public event PlayFabRequestEvent OnMultiplayerGetAssetUploadUrlRequestEvent; + public event PlayFabResultEvent OnMultiplayerGetAssetUploadUrlResultEvent; + public event PlayFabRequestEvent OnMultiplayerGetBuildRequestEvent; + public event PlayFabResultEvent OnMultiplayerGetBuildResultEvent; + public event PlayFabRequestEvent OnMultiplayerGetBuildAliasRequestEvent; + public event PlayFabResultEvent OnMultiplayerGetBuildAliasResultEvent; + public event PlayFabRequestEvent OnMultiplayerGetContainerRegistryCredentialsRequestEvent; + public event PlayFabResultEvent OnMultiplayerGetContainerRegistryCredentialsResultEvent; + public event PlayFabRequestEvent OnMultiplayerGetLobbyRequestEvent; + public event PlayFabResultEvent OnMultiplayerGetLobbyResultEvent; + public event PlayFabRequestEvent OnMultiplayerGetMatchRequestEvent; + public event PlayFabResultEvent OnMultiplayerGetMatchResultEvent; + public event PlayFabRequestEvent OnMultiplayerGetMatchmakingQueueRequestEvent; + public event PlayFabResultEvent OnMultiplayerGetMatchmakingQueueResultEvent; + public event PlayFabRequestEvent OnMultiplayerGetMatchmakingTicketRequestEvent; + public event PlayFabResultEvent OnMultiplayerGetMatchmakingTicketResultEvent; + public event PlayFabRequestEvent OnMultiplayerGetMultiplayerServerDetailsRequestEvent; + public event PlayFabResultEvent OnMultiplayerGetMultiplayerServerDetailsResultEvent; + public event PlayFabRequestEvent OnMultiplayerGetMultiplayerServerLogsRequestEvent; + public event PlayFabResultEvent OnMultiplayerGetMultiplayerServerLogsResultEvent; + public event PlayFabRequestEvent OnMultiplayerGetMultiplayerSessionLogsBySessionIdRequestEvent; + public event PlayFabResultEvent OnMultiplayerGetMultiplayerSessionLogsBySessionIdResultEvent; + public event PlayFabRequestEvent OnMultiplayerGetQueueStatisticsRequestEvent; + public event PlayFabResultEvent OnMultiplayerGetQueueStatisticsResultEvent; + public event PlayFabRequestEvent OnMultiplayerGetRemoteLoginEndpointRequestEvent; + public event PlayFabResultEvent OnMultiplayerGetRemoteLoginEndpointResultEvent; + public event PlayFabRequestEvent OnMultiplayerGetServerBackfillTicketRequestEvent; + public event PlayFabResultEvent OnMultiplayerGetServerBackfillTicketResultEvent; + public event PlayFabRequestEvent OnMultiplayerGetTitleEnabledForMultiplayerServersStatusRequestEvent; + public event PlayFabResultEvent OnMultiplayerGetTitleEnabledForMultiplayerServersStatusResultEvent; + public event PlayFabRequestEvent OnMultiplayerGetTitleMultiplayerServersQuotaChangeRequestEvent; + public event PlayFabResultEvent OnMultiplayerGetTitleMultiplayerServersQuotaChangeResultEvent; + public event PlayFabRequestEvent OnMultiplayerGetTitleMultiplayerServersQuotasRequestEvent; + public event PlayFabResultEvent OnMultiplayerGetTitleMultiplayerServersQuotasResultEvent; + public event PlayFabRequestEvent OnMultiplayerInviteToLobbyRequestEvent; + public event PlayFabResultEvent OnMultiplayerInviteToLobbyResultEvent; + public event PlayFabRequestEvent OnMultiplayerJoinArrangedLobbyRequestEvent; + public event PlayFabResultEvent OnMultiplayerJoinArrangedLobbyResultEvent; + public event PlayFabRequestEvent OnMultiplayerJoinLobbyRequestEvent; + public event PlayFabResultEvent OnMultiplayerJoinLobbyResultEvent; + public event PlayFabRequestEvent OnMultiplayerJoinLobbyAsServerRequestEvent; + public event PlayFabResultEvent OnMultiplayerJoinLobbyAsServerResultEvent; + public event PlayFabRequestEvent OnMultiplayerJoinMatchmakingTicketRequestEvent; + public event PlayFabResultEvent OnMultiplayerJoinMatchmakingTicketResultEvent; + public event PlayFabRequestEvent OnMultiplayerLeaveLobbyRequestEvent; + public event PlayFabResultEvent OnMultiplayerLeaveLobbyResultEvent; + public event PlayFabRequestEvent OnMultiplayerLeaveLobbyAsServerRequestEvent; + public event PlayFabResultEvent OnMultiplayerLeaveLobbyAsServerResultEvent; + public event PlayFabRequestEvent OnMultiplayerListArchivedMultiplayerServersRequestEvent; + public event PlayFabResultEvent OnMultiplayerListArchivedMultiplayerServersResultEvent; + public event PlayFabRequestEvent OnMultiplayerListAssetSummariesRequestEvent; + public event PlayFabResultEvent OnMultiplayerListAssetSummariesResultEvent; + public event PlayFabRequestEvent OnMultiplayerListBuildAliasesRequestEvent; + public event PlayFabResultEvent OnMultiplayerListBuildAliasesResultEvent; + public event PlayFabRequestEvent OnMultiplayerListBuildSummariesV2RequestEvent; + public event PlayFabResultEvent OnMultiplayerListBuildSummariesV2ResultEvent; + public event PlayFabRequestEvent OnMultiplayerListCertificateSummariesRequestEvent; + public event PlayFabResultEvent OnMultiplayerListCertificateSummariesResultEvent; + public event PlayFabRequestEvent OnMultiplayerListContainerImagesRequestEvent; + public event PlayFabResultEvent OnMultiplayerListContainerImagesResultEvent; + public event PlayFabRequestEvent OnMultiplayerListContainerImageTagsRequestEvent; + public event PlayFabResultEvent OnMultiplayerListContainerImageTagsResultEvent; + public event PlayFabRequestEvent OnMultiplayerListMatchmakingQueuesRequestEvent; + public event PlayFabResultEvent OnMultiplayerListMatchmakingQueuesResultEvent; + public event PlayFabRequestEvent OnMultiplayerListMatchmakingTicketsForPlayerRequestEvent; + public event PlayFabResultEvent OnMultiplayerListMatchmakingTicketsForPlayerResultEvent; + public event PlayFabRequestEvent OnMultiplayerListMultiplayerServersRequestEvent; + public event PlayFabResultEvent OnMultiplayerListMultiplayerServersResultEvent; + public event PlayFabRequestEvent OnMultiplayerListPartyQosServersRequestEvent; + public event PlayFabResultEvent OnMultiplayerListPartyQosServersResultEvent; + public event PlayFabRequestEvent OnMultiplayerListQosServersForTitleRequestEvent; + public event PlayFabResultEvent OnMultiplayerListQosServersForTitleResultEvent; + public event PlayFabRequestEvent OnMultiplayerListSecretSummariesRequestEvent; + public event PlayFabResultEvent OnMultiplayerListSecretSummariesResultEvent; + public event PlayFabRequestEvent OnMultiplayerListServerBackfillTicketsForPlayerRequestEvent; + public event PlayFabResultEvent OnMultiplayerListServerBackfillTicketsForPlayerResultEvent; + public event PlayFabRequestEvent OnMultiplayerListTitleMultiplayerServersQuotaChangesRequestEvent; + public event PlayFabResultEvent OnMultiplayerListTitleMultiplayerServersQuotaChangesResultEvent; + public event PlayFabRequestEvent OnMultiplayerListVirtualMachineSummariesRequestEvent; + public event PlayFabResultEvent OnMultiplayerListVirtualMachineSummariesResultEvent; + public event PlayFabRequestEvent OnMultiplayerRemoveMatchmakingQueueRequestEvent; + public event PlayFabResultEvent OnMultiplayerRemoveMatchmakingQueueResultEvent; + public event PlayFabRequestEvent OnMultiplayerRemoveMemberRequestEvent; + public event PlayFabResultEvent OnMultiplayerRemoveMemberResultEvent; + public event PlayFabRequestEvent OnMultiplayerRequestMultiplayerServerRequestEvent; + public event PlayFabResultEvent OnMultiplayerRequestMultiplayerServerResultEvent; + public event PlayFabRequestEvent OnMultiplayerRequestPartyServiceRequestEvent; + public event PlayFabResultEvent OnMultiplayerRequestPartyServiceResultEvent; + public event PlayFabRequestEvent OnMultiplayerRolloverContainerRegistryCredentialsRequestEvent; + public event PlayFabResultEvent OnMultiplayerRolloverContainerRegistryCredentialsResultEvent; + public event PlayFabRequestEvent OnMultiplayerSetMatchmakingQueueRequestEvent; + public event PlayFabResultEvent OnMultiplayerSetMatchmakingQueueResultEvent; + public event PlayFabRequestEvent OnMultiplayerShutdownMultiplayerServerRequestEvent; + public event PlayFabResultEvent OnMultiplayerShutdownMultiplayerServerResultEvent; + public event PlayFabRequestEvent OnMultiplayerSubscribeToLobbyResourceRequestEvent; + public event PlayFabResultEvent OnMultiplayerSubscribeToLobbyResourceResultEvent; + public event PlayFabRequestEvent OnMultiplayerSubscribeToMatchmakingResourceRequestEvent; + public event PlayFabResultEvent OnMultiplayerSubscribeToMatchmakingResourceResultEvent; + public event PlayFabRequestEvent OnMultiplayerUnsubscribeFromLobbyResourceRequestEvent; + public event PlayFabResultEvent OnMultiplayerUnsubscribeFromLobbyResourceResultEvent; + public event PlayFabRequestEvent OnMultiplayerUnsubscribeFromMatchmakingResourceRequestEvent; + public event PlayFabResultEvent OnMultiplayerUnsubscribeFromMatchmakingResourceResultEvent; + public event PlayFabRequestEvent OnMultiplayerUntagContainerImageRequestEvent; + public event PlayFabResultEvent OnMultiplayerUntagContainerImageResultEvent; + public event PlayFabRequestEvent OnMultiplayerUpdateBuildAliasRequestEvent; + public event PlayFabResultEvent OnMultiplayerUpdateBuildAliasResultEvent; + public event PlayFabRequestEvent OnMultiplayerUpdateBuildNameRequestEvent; + public event PlayFabResultEvent OnMultiplayerUpdateBuildNameResultEvent; + public event PlayFabRequestEvent OnMultiplayerUpdateBuildRegionRequestEvent; + public event PlayFabResultEvent OnMultiplayerUpdateBuildRegionResultEvent; + public event PlayFabRequestEvent OnMultiplayerUpdateBuildRegionsRequestEvent; + public event PlayFabResultEvent OnMultiplayerUpdateBuildRegionsResultEvent; + public event PlayFabRequestEvent OnMultiplayerUpdateLobbyRequestEvent; + public event PlayFabResultEvent OnMultiplayerUpdateLobbyResultEvent; + public event PlayFabRequestEvent OnMultiplayerUpdateLobbyAsServerRequestEvent; + public event PlayFabResultEvent OnMultiplayerUpdateLobbyAsServerResultEvent; + public event PlayFabRequestEvent OnMultiplayerUploadCertificateRequestEvent; + public event PlayFabResultEvent OnMultiplayerUploadCertificateResultEvent; + public event PlayFabRequestEvent OnMultiplayerUploadSecretRequestEvent; + public event PlayFabResultEvent OnMultiplayerUploadSecretResultEvent; + } +} +#endif diff --git a/Assets/PlayFabSDK/Multiplayer/PlayFabEvents.cs.meta b/Assets/PlayFabSDK/Multiplayer/PlayFabEvents.cs.meta new file mode 100644 index 00000000..90c0c090 --- /dev/null +++ b/Assets/PlayFabSDK/Multiplayer/PlayFabEvents.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: fe16c398171536247a7e4685790d4dac +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Multiplayer/PlayFabMultiplayerAPI.cs b/Assets/PlayFabSDK/Multiplayer/PlayFabMultiplayerAPI.cs new file mode 100644 index 00000000..fd344674 --- /dev/null +++ b/Assets/PlayFabSDK/Multiplayer/PlayFabMultiplayerAPI.cs @@ -0,0 +1,1183 @@ +#if !DISABLE_PLAYFABENTITY_API && !DISABLE_PLAYFAB_STATIC_API + +using System; +using System.Collections.Generic; +using PlayFab.MultiplayerModels; +using PlayFab.Internal; + +namespace PlayFab +{ + /// + /// API methods for managing multiplayer servers. API methods for managing parties. The lobby service helps players group + /// together to play multiplayer games. It is often used as a rendezvous point for players to share connection information. + /// The TrueSkill service helps titles to estimate a player's skill based on their match results. The player skill values + /// from this service are commonly used by a matchmaking service to provide players with balanced matches. + /// + public static partial class PlayFabMultiplayerAPI + { + static PlayFabMultiplayerAPI() {} + + + /// + /// Verify entity login. + /// + public static bool IsEntityLoggedIn() + { + return PlayFabSettings.staticPlayer.IsEntityLoggedIn(); + } + + /// + /// Clear the Client SessionToken which allows this Client to call API calls requiring login. + /// A new/fresh login will be required after calling this. + /// + public static void ForgetAllCredentials() + { + PlayFabSettings.staticPlayer.ForgetAllCredentials(); + } + + /// + /// Cancel all active tickets the player is a member of in a given queue. + /// + public static void CancelAllMatchmakingTicketsForPlayer(CancelAllMatchmakingTicketsForPlayerRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Match/CancelAllMatchmakingTicketsForPlayer", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Cancel all active backfill tickets the player is a member of in a given queue. + /// + public static void CancelAllServerBackfillTicketsForPlayer(CancelAllServerBackfillTicketsForPlayerRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Match/CancelAllServerBackfillTicketsForPlayer", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Cancel a matchmaking ticket. + /// + public static void CancelMatchmakingTicket(CancelMatchmakingTicketRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Match/CancelMatchmakingTicket", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Cancel a server backfill ticket. + /// + public static void CancelServerBackfillTicket(CancelServerBackfillTicketRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Match/CancelServerBackfillTicket", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Creates a multiplayer server build alias. + /// + public static void CreateBuildAlias(CreateBuildAliasRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/CreateBuildAlias", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Creates a multiplayer server build with a custom container. + /// + public static void CreateBuildWithCustomContainer(CreateBuildWithCustomContainerRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/CreateBuildWithCustomContainer", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Creates a multiplayer server build with a managed container. + /// + public static void CreateBuildWithManagedContainer(CreateBuildWithManagedContainerRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/CreateBuildWithManagedContainer", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Creates a multiplayer server build with the server running as a process. + /// + public static void CreateBuildWithProcessBasedServer(CreateBuildWithProcessBasedServerRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/CreateBuildWithProcessBasedServer", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Create a lobby. + /// + public static void CreateLobby(CreateLobbyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Lobby/CreateLobby", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Create a matchmaking ticket as a client. + /// + public static void CreateMatchmakingTicket(CreateMatchmakingTicketRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Match/CreateMatchmakingTicket", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Creates a remote user to log on to a VM for a multiplayer server build. + /// + public static void CreateRemoteUser(CreateRemoteUserRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/CreateRemoteUser", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Create a backfill matchmaking ticket as a server. A backfill ticket represents an ongoing game. The matchmaking service + /// automatically starts matching the backfill ticket against other matchmaking tickets. Backfill tickets cannot match with + /// other backfill tickets. + /// + public static void CreateServerBackfillTicket(CreateServerBackfillTicketRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Match/CreateServerBackfillTicket", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Create a matchmaking ticket as a server. The matchmaking service automatically starts matching the ticket against other + /// matchmaking tickets. + /// + public static void CreateServerMatchmakingTicket(CreateServerMatchmakingTicketRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Match/CreateServerMatchmakingTicket", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Creates a request to change a title's multiplayer server quotas. + /// + public static void CreateTitleMultiplayerServersQuotaChange(CreateTitleMultiplayerServersQuotaChangeRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/CreateTitleMultiplayerServersQuotaChange", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Deletes a multiplayer server game asset for a title. + /// + public static void DeleteAsset(DeleteAssetRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/DeleteAsset", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Deletes a multiplayer server build. + /// + public static void DeleteBuild(DeleteBuildRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/DeleteBuild", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Deletes a multiplayer server build alias. + /// + public static void DeleteBuildAlias(DeleteBuildAliasRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/DeleteBuildAlias", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Removes a multiplayer server build's region. + /// + public static void DeleteBuildRegion(DeleteBuildRegionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/DeleteBuildRegion", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Deletes a multiplayer server game certificate. + /// + public static void DeleteCertificate(DeleteCertificateRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/DeleteCertificate", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Deletes a container image repository. + /// + public static void DeleteContainerImageRepository(DeleteContainerImageRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/DeleteContainerImageRepository", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Delete a lobby. + /// + public static void DeleteLobby(DeleteLobbyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Lobby/DeleteLobby", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Deletes a remote user to log on to a VM for a multiplayer server build. + /// + public static void DeleteRemoteUser(DeleteRemoteUserRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/DeleteRemoteUser", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Deletes a multiplayer server game secret. + /// + public static void DeleteSecret(DeleteSecretRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/DeleteSecret", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Enables the multiplayer server feature for a title. + /// + public static void EnableMultiplayerServersForTitle(EnableMultiplayerServersForTitleRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/EnableMultiplayerServersForTitle", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Find lobbies which match certain criteria, and which friends are in. + /// + public static void FindFriendLobbies(FindFriendLobbiesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Lobby/FindFriendLobbies", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Find all the lobbies that match certain criteria. + /// + public static void FindLobbies(FindLobbiesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Lobby/FindLobbies", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets a URL that can be used to download the specified asset. A sample pre-authenticated url - + /// https://sampleStorageAccount.blob.core.windows.net/gameassets/gameserver.zip?sv=2015-04-05&ss=b&srt=sco&sp=rw&st=startDate&se=endDate&spr=https&sig=sampleSig&api-version=2017-07-29 + /// + public static void GetAssetDownloadUrl(GetAssetDownloadUrlRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/GetAssetDownloadUrl", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets the URL to upload assets to. A sample pre-authenticated url - + /// https://sampleStorageAccount.blob.core.windows.net/gameassets/gameserver.zip?sv=2015-04-05&ss=b&srt=sco&sp=rw&st=startDate&se=endDate&spr=https&sig=sampleSig&api-version=2017-07-29 + /// + public static void GetAssetUploadUrl(GetAssetUploadUrlRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/GetAssetUploadUrl", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets a multiplayer server build. + /// + public static void GetBuild(GetBuildRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/GetBuild", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets a multiplayer server build alias. + /// + public static void GetBuildAlias(GetBuildAliasRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/GetBuildAlias", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets the credentials to the container registry. + /// + public static void GetContainerRegistryCredentials(GetContainerRegistryCredentialsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/GetContainerRegistryCredentials", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Get a lobby. + /// + public static void GetLobby(GetLobbyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Lobby/GetLobby", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Get a match. + /// + public static void GetMatch(GetMatchRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Match/GetMatch", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// SDK support is limited to C# and Java for this API. Get a matchmaking queue configuration. + /// + public static void GetMatchmakingQueue(GetMatchmakingQueueRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Match/GetMatchmakingQueue", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Get a matchmaking ticket by ticket Id. + /// + public static void GetMatchmakingTicket(GetMatchmakingTicketRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Match/GetMatchmakingTicket", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets multiplayer server session details for a build. + /// + public static void GetMultiplayerServerDetails(GetMultiplayerServerDetailsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/GetMultiplayerServerDetails", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets multiplayer server logs after a server has terminated. + /// + public static void GetMultiplayerServerLogs(GetMultiplayerServerLogsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/GetMultiplayerServerLogs", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets multiplayer server logs after a server has terminated. + /// + public static void GetMultiplayerSessionLogsBySessionId(GetMultiplayerSessionLogsBySessionIdRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/GetMultiplayerSessionLogsBySessionId", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Get the statistics for a queue. + /// + public static void GetQueueStatistics(GetQueueStatisticsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Match/GetQueueStatistics", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets a remote login endpoint to a VM that is hosting a multiplayer server build. + /// + public static void GetRemoteLoginEndpoint(GetRemoteLoginEndpointRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/GetRemoteLoginEndpoint", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Get a matchmaking backfill ticket by ticket Id. + /// + public static void GetServerBackfillTicket(GetServerBackfillTicketRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Match/GetServerBackfillTicket", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets the status of whether a title is enabled for the multiplayer server feature. + /// + public static void GetTitleEnabledForMultiplayerServersStatus(GetTitleEnabledForMultiplayerServersStatusRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/GetTitleEnabledForMultiplayerServersStatus", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets a title's server quota change request. + /// + public static void GetTitleMultiplayerServersQuotaChange(GetTitleMultiplayerServersQuotaChangeRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/GetTitleMultiplayerServersQuotaChange", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets the quotas for a title in relation to multiplayer servers. + /// + public static void GetTitleMultiplayerServersQuotas(GetTitleMultiplayerServersQuotasRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/GetTitleMultiplayerServersQuotas", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Send a notification to invite a player to a lobby. + /// + public static void InviteToLobby(InviteToLobbyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Lobby/InviteToLobby", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Join an Arranged lobby. + /// + public static void JoinArrangedLobby(JoinArrangedLobbyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Lobby/JoinArrangedLobby", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Join a lobby. + /// + public static void JoinLobby(JoinLobbyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Lobby/JoinLobby", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Preview: Join a lobby as a server entity. This is restricted to client lobbies which are using connections. + /// + public static void JoinLobbyAsServer(JoinLobbyAsServerRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Lobby/JoinLobbyAsServer", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Join a matchmaking ticket. + /// + public static void JoinMatchmakingTicket(JoinMatchmakingTicketRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Match/JoinMatchmakingTicket", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Leave a lobby. + /// + public static void LeaveLobby(LeaveLobbyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Lobby/LeaveLobby", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Preview: Request for server to leave a lobby. This is restricted to client owned lobbies which are using connections. + /// + public static void LeaveLobbyAsServer(LeaveLobbyAsServerRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Lobby/LeaveLobbyAsServer", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Lists archived multiplayer server sessions for a build. + /// + public static void ListArchivedMultiplayerServers(ListMultiplayerServersRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/ListArchivedMultiplayerServers", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Lists multiplayer server game assets for a title. + /// + public static void ListAssetSummaries(ListAssetSummariesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/ListAssetSummaries", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Lists details of all build aliases for a title. Accepts tokens for title and if game client access is enabled, allows + /// game client to request list of builds with player entity token. + /// + public static void ListBuildAliases(ListBuildAliasesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/ListBuildAliases", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Lists summarized details of all multiplayer server builds for a title. Accepts tokens for title and if game client + /// access is enabled, allows game client to request list of builds with player entity token. + /// + public static void ListBuildSummariesV2(ListBuildSummariesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/ListBuildSummariesV2", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Lists multiplayer server game certificates for a title. + /// + public static void ListCertificateSummaries(ListCertificateSummariesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/ListCertificateSummaries", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Lists custom container images for a title. + /// + public static void ListContainerImages(ListContainerImagesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/ListContainerImages", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Lists the tags for a custom container image. + /// + public static void ListContainerImageTags(ListContainerImageTagsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/ListContainerImageTags", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// SDK support is limited to C# and Java for this API. List all matchmaking queue configs. + /// + public static void ListMatchmakingQueues(ListMatchmakingQueuesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Match/ListMatchmakingQueues", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// List all matchmaking ticket Ids the user is a member of. + /// + public static void ListMatchmakingTicketsForPlayer(ListMatchmakingTicketsForPlayerRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Match/ListMatchmakingTicketsForPlayer", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Lists multiplayer server sessions for a build. + /// + public static void ListMultiplayerServers(ListMultiplayerServersRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/ListMultiplayerServers", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Lists quality of service servers for party. + /// + public static void ListPartyQosServers(ListPartyQosServersRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/ListPartyQosServers", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Lists quality of service servers for the title. By default, servers are only returned for regions where a Multiplayer + /// Servers build has been deployed. + /// + public static void ListQosServersForTitle(ListQosServersForTitleRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/ListQosServersForTitle", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Lists multiplayer server game secrets for a title. + /// + public static void ListSecretSummaries(ListSecretSummariesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/ListSecretSummaries", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// List all server backfill ticket Ids the user is a member of. + /// + public static void ListServerBackfillTicketsForPlayer(ListServerBackfillTicketsForPlayerRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Match/ListServerBackfillTicketsForPlayer", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// List all server quota change requests for a title. + /// + public static void ListTitleMultiplayerServersQuotaChanges(ListTitleMultiplayerServersQuotaChangesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/ListTitleMultiplayerServersQuotaChanges", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Lists virtual machines for a title. + /// + public static void ListVirtualMachineSummaries(ListVirtualMachineSummariesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/ListVirtualMachineSummaries", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// SDK support is limited to C# and Java for this API. Remove a matchmaking queue config. + /// + public static void RemoveMatchmakingQueue(RemoveMatchmakingQueueRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Match/RemoveMatchmakingQueue", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Remove a member from a lobby. + /// + public static void RemoveMember(RemoveMemberFromLobbyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Lobby/RemoveMember", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Request a multiplayer server session. Accepts tokens for title and if game client access is enabled, allows game client + /// to request a server with player entity token. + /// + public static void RequestMultiplayerServer(RequestMultiplayerServerRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/RequestMultiplayerServer", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Request a party session. + /// + public static void RequestPartyService(RequestPartyServiceRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Party/RequestPartyService", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Rolls over the credentials to the container registry. + /// + public static void RolloverContainerRegistryCredentials(RolloverContainerRegistryCredentialsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/RolloverContainerRegistryCredentials", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// SDK support is limited to C# and Java for this API. Create or update a matchmaking queue configuration. + /// + public static void SetMatchmakingQueue(SetMatchmakingQueueRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Match/SetMatchmakingQueue", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Shuts down a multiplayer server session. + /// + public static void ShutdownMultiplayerServer(ShutdownMultiplayerServerRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/ShutdownMultiplayerServer", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Subscribe to lobby resource notifications. + /// + public static void SubscribeToLobbyResource(SubscribeToLobbyResourceRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Lobby/SubscribeToLobbyResource", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Subscribe to match resource notifications. + /// + public static void SubscribeToMatchmakingResource(SubscribeToMatchResourceRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Match/SubscribeToMatchmakingResource", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Unsubscribe from lobby notifications. + /// + public static void UnsubscribeFromLobbyResource(UnsubscribeFromLobbyResourceRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Lobby/UnsubscribeFromLobbyResource", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Unsubscribe from match resource notifications. + /// + public static void UnsubscribeFromMatchmakingResource(UnsubscribeFromMatchResourceRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Match/UnsubscribeFromMatchmakingResource", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Untags a container image. + /// + public static void UntagContainerImage(UntagContainerImageRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/UntagContainerImage", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Creates a multiplayer server build alias. + /// + public static void UpdateBuildAlias(UpdateBuildAliasRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/UpdateBuildAlias", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates a multiplayer server build's name. + /// + public static void UpdateBuildName(UpdateBuildNameRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/UpdateBuildName", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates a multiplayer server build's region. If the region is not yet created, it will be created + /// + public static void UpdateBuildRegion(UpdateBuildRegionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/UpdateBuildRegion", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates a multiplayer server build's regions. + /// + public static void UpdateBuildRegions(UpdateBuildRegionsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/UpdateBuildRegions", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Update a lobby. + /// + public static void UpdateLobby(UpdateLobbyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Lobby/UpdateLobby", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Preview: Update fields related to a joined server in the lobby the server is in. Servers can keep a lobby from expiring + /// by being the one to "update" the lobby in some way. Servers have no impact on last member leave/last member disconnect + /// behavior. + /// + public static void UpdateLobbyAsServer(UpdateLobbyAsServerRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Lobby/UpdateLobbyAsServer", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Uploads a multiplayer server game certificate. + /// + public static void UploadCertificate(UploadCertificateRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/UploadCertificate", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Uploads a multiplayer server game secret. + /// + public static void UploadSecret(UploadSecretRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/UploadSecret", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + + } +} + +#endif diff --git a/Assets/PlayFabSDK/Multiplayer/PlayFabMultiplayerAPI.cs.meta b/Assets/PlayFabSDK/Multiplayer/PlayFabMultiplayerAPI.cs.meta new file mode 100644 index 00000000..d022d5dc --- /dev/null +++ b/Assets/PlayFabSDK/Multiplayer/PlayFabMultiplayerAPI.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a5dd863da40a92a46b55d58a56b8db93 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Multiplayer/PlayFabMultiplayerInstanceAPI.cs b/Assets/PlayFabSDK/Multiplayer/PlayFabMultiplayerInstanceAPI.cs new file mode 100644 index 00000000..9d6c5519 --- /dev/null +++ b/Assets/PlayFabSDK/Multiplayer/PlayFabMultiplayerInstanceAPI.cs @@ -0,0 +1,1027 @@ +#if !DISABLE_PLAYFABENTITY_API + +using System; +using System.Collections.Generic; +using PlayFab.MultiplayerModels; +using PlayFab.Internal; +using PlayFab.SharedModels; + +namespace PlayFab +{ + /// + /// API methods for managing multiplayer servers. API methods for managing parties. The lobby service helps players group + /// together to play multiplayer games. It is often used as a rendezvous point for players to share connection information. + /// The TrueSkill service helps titles to estimate a player's skill based on their match results. The player skill values + /// from this service are commonly used by a matchmaking service to provide players with balanced matches. + /// + public partial class PlayFabMultiplayerInstanceAPI : IPlayFabInstanceApi + { + public readonly PlayFabApiSettings apiSettings = null; + public readonly PlayFabAuthenticationContext authenticationContext = null; + + public PlayFabMultiplayerInstanceAPI(PlayFabAuthenticationContext context) + { + if (context == null) + throw new PlayFabException(PlayFabExceptionCode.AuthContextRequired, "Context cannot be null, create a PlayFabAuthenticationContext for each player in advance, or call .GetAuthenticationContext()"); + authenticationContext = context; + } + + public PlayFabMultiplayerInstanceAPI(PlayFabApiSettings settings, PlayFabAuthenticationContext context) + { + if (context == null) + throw new PlayFabException(PlayFabExceptionCode.AuthContextRequired, "Context cannot be null, create a PlayFabAuthenticationContext for each player in advance, or call .GetAuthenticationContext()"); + apiSettings = settings; + authenticationContext = context; + } + + /// + /// Verify entity login. + /// + public bool IsEntityLoggedIn() + { + return authenticationContext == null ? false : authenticationContext.IsEntityLoggedIn(); + } + + /// + /// Clear the Client SessionToken which allows this Client to call API calls requiring login. + /// A new/fresh login will be required after calling this. + /// + public void ForgetAllCredentials() + { + if (authenticationContext != null) + { + authenticationContext.ForgetAllCredentials(); + } + } + + /// + /// Cancel all active tickets the player is a member of in a given queue. + /// + public void CancelAllMatchmakingTicketsForPlayer(CancelAllMatchmakingTicketsForPlayerRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Match/CancelAllMatchmakingTicketsForPlayer", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Cancel all active backfill tickets the player is a member of in a given queue. + /// + public void CancelAllServerBackfillTicketsForPlayer(CancelAllServerBackfillTicketsForPlayerRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Match/CancelAllServerBackfillTicketsForPlayer", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Cancel a matchmaking ticket. + /// + public void CancelMatchmakingTicket(CancelMatchmakingTicketRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Match/CancelMatchmakingTicket", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Cancel a server backfill ticket. + /// + public void CancelServerBackfillTicket(CancelServerBackfillTicketRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Match/CancelServerBackfillTicket", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Creates a multiplayer server build alias. + /// + public void CreateBuildAlias(CreateBuildAliasRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/CreateBuildAlias", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Creates a multiplayer server build with a custom container. + /// + public void CreateBuildWithCustomContainer(CreateBuildWithCustomContainerRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/CreateBuildWithCustomContainer", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Creates a multiplayer server build with a managed container. + /// + public void CreateBuildWithManagedContainer(CreateBuildWithManagedContainerRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/CreateBuildWithManagedContainer", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Creates a multiplayer server build with the server running as a process. + /// + public void CreateBuildWithProcessBasedServer(CreateBuildWithProcessBasedServerRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/CreateBuildWithProcessBasedServer", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Create a lobby. + /// + public void CreateLobby(CreateLobbyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Lobby/CreateLobby", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Create a matchmaking ticket as a client. + /// + public void CreateMatchmakingTicket(CreateMatchmakingTicketRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Match/CreateMatchmakingTicket", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Creates a remote user to log on to a VM for a multiplayer server build. + /// + public void CreateRemoteUser(CreateRemoteUserRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/CreateRemoteUser", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Create a backfill matchmaking ticket as a server. A backfill ticket represents an ongoing game. The matchmaking service + /// automatically starts matching the backfill ticket against other matchmaking tickets. Backfill tickets cannot match with + /// other backfill tickets. + /// + public void CreateServerBackfillTicket(CreateServerBackfillTicketRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Match/CreateServerBackfillTicket", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Create a matchmaking ticket as a server. The matchmaking service automatically starts matching the ticket against other + /// matchmaking tickets. + /// + public void CreateServerMatchmakingTicket(CreateServerMatchmakingTicketRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Match/CreateServerMatchmakingTicket", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Creates a request to change a title's multiplayer server quotas. + /// + public void CreateTitleMultiplayerServersQuotaChange(CreateTitleMultiplayerServersQuotaChangeRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/CreateTitleMultiplayerServersQuotaChange", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Deletes a multiplayer server game asset for a title. + /// + public void DeleteAsset(DeleteAssetRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/DeleteAsset", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Deletes a multiplayer server build. + /// + public void DeleteBuild(DeleteBuildRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/DeleteBuild", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Deletes a multiplayer server build alias. + /// + public void DeleteBuildAlias(DeleteBuildAliasRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/DeleteBuildAlias", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Removes a multiplayer server build's region. + /// + public void DeleteBuildRegion(DeleteBuildRegionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/DeleteBuildRegion", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Deletes a multiplayer server game certificate. + /// + public void DeleteCertificate(DeleteCertificateRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/DeleteCertificate", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Deletes a container image repository. + /// + public void DeleteContainerImageRepository(DeleteContainerImageRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/DeleteContainerImageRepository", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Delete a lobby. + /// + public void DeleteLobby(DeleteLobbyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Lobby/DeleteLobby", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Deletes a remote user to log on to a VM for a multiplayer server build. + /// + public void DeleteRemoteUser(DeleteRemoteUserRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/DeleteRemoteUser", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Deletes a multiplayer server game secret. + /// + public void DeleteSecret(DeleteSecretRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/DeleteSecret", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Enables the multiplayer server feature for a title. + /// + public void EnableMultiplayerServersForTitle(EnableMultiplayerServersForTitleRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/EnableMultiplayerServersForTitle", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Find lobbies which match certain criteria, and which friends are in. + /// + public void FindFriendLobbies(FindFriendLobbiesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Lobby/FindFriendLobbies", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Find all the lobbies that match certain criteria. + /// + public void FindLobbies(FindLobbiesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Lobby/FindLobbies", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets a URL that can be used to download the specified asset. A sample pre-authenticated url - + /// https://sampleStorageAccount.blob.core.windows.net/gameassets/gameserver.zip?sv=2015-04-05&ss=b&srt=sco&sp=rw&st=startDate&se=endDate&spr=https&sig=sampleSig&api-version=2017-07-29 + /// + public void GetAssetDownloadUrl(GetAssetDownloadUrlRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/GetAssetDownloadUrl", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets the URL to upload assets to. A sample pre-authenticated url - + /// https://sampleStorageAccount.blob.core.windows.net/gameassets/gameserver.zip?sv=2015-04-05&ss=b&srt=sco&sp=rw&st=startDate&se=endDate&spr=https&sig=sampleSig&api-version=2017-07-29 + /// + public void GetAssetUploadUrl(GetAssetUploadUrlRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/GetAssetUploadUrl", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets a multiplayer server build. + /// + public void GetBuild(GetBuildRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/GetBuild", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets a multiplayer server build alias. + /// + public void GetBuildAlias(GetBuildAliasRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/GetBuildAlias", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets the credentials to the container registry. + /// + public void GetContainerRegistryCredentials(GetContainerRegistryCredentialsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/GetContainerRegistryCredentials", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Get a lobby. + /// + public void GetLobby(GetLobbyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Lobby/GetLobby", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Get a match. + /// + public void GetMatch(GetMatchRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Match/GetMatch", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// SDK support is limited to C# and Java for this API. Get a matchmaking queue configuration. + /// + public void GetMatchmakingQueue(GetMatchmakingQueueRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Match/GetMatchmakingQueue", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Get a matchmaking ticket by ticket Id. + /// + public void GetMatchmakingTicket(GetMatchmakingTicketRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Match/GetMatchmakingTicket", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets multiplayer server session details for a build. + /// + public void GetMultiplayerServerDetails(GetMultiplayerServerDetailsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/GetMultiplayerServerDetails", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets multiplayer server logs after a server has terminated. + /// + public void GetMultiplayerServerLogs(GetMultiplayerServerLogsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/GetMultiplayerServerLogs", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets multiplayer server logs after a server has terminated. + /// + public void GetMultiplayerSessionLogsBySessionId(GetMultiplayerSessionLogsBySessionIdRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/GetMultiplayerSessionLogsBySessionId", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Get the statistics for a queue. + /// + public void GetQueueStatistics(GetQueueStatisticsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Match/GetQueueStatistics", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets a remote login endpoint to a VM that is hosting a multiplayer server build. + /// + public void GetRemoteLoginEndpoint(GetRemoteLoginEndpointRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/GetRemoteLoginEndpoint", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Get a matchmaking backfill ticket by ticket Id. + /// + public void GetServerBackfillTicket(GetServerBackfillTicketRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Match/GetServerBackfillTicket", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets the status of whether a title is enabled for the multiplayer server feature. + /// + public void GetTitleEnabledForMultiplayerServersStatus(GetTitleEnabledForMultiplayerServersStatusRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/GetTitleEnabledForMultiplayerServersStatus", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets a title's server quota change request. + /// + public void GetTitleMultiplayerServersQuotaChange(GetTitleMultiplayerServersQuotaChangeRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/GetTitleMultiplayerServersQuotaChange", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets the quotas for a title in relation to multiplayer servers. + /// + public void GetTitleMultiplayerServersQuotas(GetTitleMultiplayerServersQuotasRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/GetTitleMultiplayerServersQuotas", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Send a notification to invite a player to a lobby. + /// + public void InviteToLobby(InviteToLobbyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Lobby/InviteToLobby", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Join an Arranged lobby. + /// + public void JoinArrangedLobby(JoinArrangedLobbyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Lobby/JoinArrangedLobby", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Join a lobby. + /// + public void JoinLobby(JoinLobbyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Lobby/JoinLobby", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Preview: Join a lobby as a server entity. This is restricted to client lobbies which are using connections. + /// + public void JoinLobbyAsServer(JoinLobbyAsServerRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Lobby/JoinLobbyAsServer", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Join a matchmaking ticket. + /// + public void JoinMatchmakingTicket(JoinMatchmakingTicketRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Match/JoinMatchmakingTicket", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Leave a lobby. + /// + public void LeaveLobby(LeaveLobbyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Lobby/LeaveLobby", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Preview: Request for server to leave a lobby. This is restricted to client owned lobbies which are using connections. + /// + public void LeaveLobbyAsServer(LeaveLobbyAsServerRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Lobby/LeaveLobbyAsServer", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Lists archived multiplayer server sessions for a build. + /// + public void ListArchivedMultiplayerServers(ListMultiplayerServersRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/ListArchivedMultiplayerServers", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Lists multiplayer server game assets for a title. + /// + public void ListAssetSummaries(ListAssetSummariesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/ListAssetSummaries", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Lists details of all build aliases for a title. Accepts tokens for title and if game client access is enabled, allows + /// game client to request list of builds with player entity token. + /// + public void ListBuildAliases(ListBuildAliasesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/ListBuildAliases", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Lists summarized details of all multiplayer server builds for a title. Accepts tokens for title and if game client + /// access is enabled, allows game client to request list of builds with player entity token. + /// + public void ListBuildSummariesV2(ListBuildSummariesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/ListBuildSummariesV2", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Lists multiplayer server game certificates for a title. + /// + public void ListCertificateSummaries(ListCertificateSummariesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/ListCertificateSummaries", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Lists custom container images for a title. + /// + public void ListContainerImages(ListContainerImagesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/ListContainerImages", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Lists the tags for a custom container image. + /// + public void ListContainerImageTags(ListContainerImageTagsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/ListContainerImageTags", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// SDK support is limited to C# and Java for this API. List all matchmaking queue configs. + /// + public void ListMatchmakingQueues(ListMatchmakingQueuesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Match/ListMatchmakingQueues", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// List all matchmaking ticket Ids the user is a member of. + /// + public void ListMatchmakingTicketsForPlayer(ListMatchmakingTicketsForPlayerRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Match/ListMatchmakingTicketsForPlayer", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Lists multiplayer server sessions for a build. + /// + public void ListMultiplayerServers(ListMultiplayerServersRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/ListMultiplayerServers", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Lists quality of service servers for party. + /// + public void ListPartyQosServers(ListPartyQosServersRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + PlayFabHttp.MakeApiCall("/MultiplayerServer/ListPartyQosServers", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Lists quality of service servers for the title. By default, servers are only returned for regions where a Multiplayer + /// Servers build has been deployed. + /// + public void ListQosServersForTitle(ListQosServersForTitleRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/ListQosServersForTitle", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Lists multiplayer server game secrets for a title. + /// + public void ListSecretSummaries(ListSecretSummariesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/ListSecretSummaries", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// List all server backfill ticket Ids the user is a member of. + /// + public void ListServerBackfillTicketsForPlayer(ListServerBackfillTicketsForPlayerRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Match/ListServerBackfillTicketsForPlayer", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// List all server quota change requests for a title. + /// + public void ListTitleMultiplayerServersQuotaChanges(ListTitleMultiplayerServersQuotaChangesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/ListTitleMultiplayerServersQuotaChanges", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Lists virtual machines for a title. + /// + public void ListVirtualMachineSummaries(ListVirtualMachineSummariesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/ListVirtualMachineSummaries", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// SDK support is limited to C# and Java for this API. Remove a matchmaking queue config. + /// + public void RemoveMatchmakingQueue(RemoveMatchmakingQueueRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Match/RemoveMatchmakingQueue", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Remove a member from a lobby. + /// + public void RemoveMember(RemoveMemberFromLobbyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Lobby/RemoveMember", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Request a multiplayer server session. Accepts tokens for title and if game client access is enabled, allows game client + /// to request a server with player entity token. + /// + public void RequestMultiplayerServer(RequestMultiplayerServerRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/RequestMultiplayerServer", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Request a party session. + /// + public void RequestPartyService(RequestPartyServiceRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Party/RequestPartyService", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Rolls over the credentials to the container registry. + /// + public void RolloverContainerRegistryCredentials(RolloverContainerRegistryCredentialsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/RolloverContainerRegistryCredentials", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// SDK support is limited to C# and Java for this API. Create or update a matchmaking queue configuration. + /// + public void SetMatchmakingQueue(SetMatchmakingQueueRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Match/SetMatchmakingQueue", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Shuts down a multiplayer server session. + /// + public void ShutdownMultiplayerServer(ShutdownMultiplayerServerRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/ShutdownMultiplayerServer", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Subscribe to lobby resource notifications. + /// + public void SubscribeToLobbyResource(SubscribeToLobbyResourceRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Lobby/SubscribeToLobbyResource", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Subscribe to match resource notifications. + /// + public void SubscribeToMatchmakingResource(SubscribeToMatchResourceRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Match/SubscribeToMatchmakingResource", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Unsubscribe from lobby notifications. + /// + public void UnsubscribeFromLobbyResource(UnsubscribeFromLobbyResourceRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Lobby/UnsubscribeFromLobbyResource", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Unsubscribe from match resource notifications. + /// + public void UnsubscribeFromMatchmakingResource(UnsubscribeFromMatchResourceRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Match/UnsubscribeFromMatchmakingResource", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Untags a container image. + /// + public void UntagContainerImage(UntagContainerImageRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/UntagContainerImage", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Creates a multiplayer server build alias. + /// + public void UpdateBuildAlias(UpdateBuildAliasRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/UpdateBuildAlias", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates a multiplayer server build's name. + /// + public void UpdateBuildName(UpdateBuildNameRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/UpdateBuildName", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates a multiplayer server build's region. If the region is not yet created, it will be created + /// + public void UpdateBuildRegion(UpdateBuildRegionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/UpdateBuildRegion", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates a multiplayer server build's regions. + /// + public void UpdateBuildRegions(UpdateBuildRegionsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/UpdateBuildRegions", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Update a lobby. + /// + public void UpdateLobby(UpdateLobbyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Lobby/UpdateLobby", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Preview: Update fields related to a joined server in the lobby the server is in. Servers can keep a lobby from expiring + /// by being the one to "update" the lobby in some way. Servers have no impact on last member leave/last member disconnect + /// behavior. + /// + public void UpdateLobbyAsServer(UpdateLobbyAsServerRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Lobby/UpdateLobbyAsServer", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Uploads a multiplayer server game certificate. + /// + public void UploadCertificate(UploadCertificateRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/UploadCertificate", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Uploads a multiplayer server game secret. + /// + public void UploadSecret(UploadSecretRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/UploadSecret", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + } +} + +#endif diff --git a/Assets/PlayFabSDK/Multiplayer/PlayFabMultiplayerInstanceAPI.cs.meta b/Assets/PlayFabSDK/Multiplayer/PlayFabMultiplayerInstanceAPI.cs.meta new file mode 100644 index 00000000..0d3c42fa --- /dev/null +++ b/Assets/PlayFabSDK/Multiplayer/PlayFabMultiplayerInstanceAPI.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a4dbb109fa8001b4b9fa53260ba50cf8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Multiplayer/PlayFabMultiplayerModels.cs b/Assets/PlayFabSDK/Multiplayer/PlayFabMultiplayerModels.cs new file mode 100644 index 00000000..aae42535 --- /dev/null +++ b/Assets/PlayFabSDK/Multiplayer/PlayFabMultiplayerModels.cs @@ -0,0 +1,5357 @@ +#if !DISABLE_PLAYFABENTITY_API +using System; +using System.Collections.Generic; +using PlayFab.SharedModels; + +namespace PlayFab.MultiplayerModels +{ + public enum AccessPolicy + { + Public, + Friends, + Private + } + + [Serializable] + public class AssetReference : PlayFabBaseModel + { + /// + /// The asset's file name. This is a filename with the .zip, .tar, or .tar.gz extension. + /// + public string FileName; + /// + /// The asset's mount path. + /// + public string MountPath; + } + + [Serializable] + public class AssetReferenceParams : PlayFabBaseModel + { + /// + /// The asset's file name. + /// + public string FileName; + /// + /// The asset's mount path. + /// + public string MountPath; + } + + [Serializable] + public class AssetSummary : PlayFabBaseModel + { + /// + /// The asset's file name. This is a filename with the .zip, .tar, or .tar.gz extension. + /// + public string FileName; + /// + /// The metadata associated with the asset. + /// + public Dictionary Metadata; + } + + public enum AttributeMergeFunction + { + Min, + Max, + Average + } + + public enum AttributeNotSpecifiedBehavior + { + UseDefault, + MatchAny + } + + public enum AttributeSource + { + User, + PlayerEntity + } + + public enum AzureRegion + { + AustraliaEast, + AustraliaSoutheast, + BrazilSouth, + CentralUs, + EastAsia, + EastUs, + EastUs2, + JapanEast, + JapanWest, + NorthCentralUs, + NorthEurope, + SouthCentralUs, + SoutheastAsia, + WestEurope, + WestUs, + SouthAfricaNorth, + WestCentralUs, + KoreaCentral, + FranceCentral, + WestUs2, + CentralIndia, + UaeNorth, + UkSouth, + SwedenCentral + } + + public enum AzureVmFamily + { + A, + Av2, + Dv2, + Dv3, + F, + Fsv2, + Dasv4, + Dav4, + Dadsv5, + Eav4, + Easv4, + Ev4, + Esv4, + Dsv3, + Dsv2, + NCasT4_v3, + Ddv4, + Ddsv4, + HBv3, + Ddv5, + Ddsv5 + } + + public enum AzureVmSize + { + Standard_A1, + Standard_A2, + Standard_A3, + Standard_A4, + Standard_A1_v2, + Standard_A2_v2, + Standard_A4_v2, + Standard_A8_v2, + Standard_D1_v2, + Standard_D2_v2, + Standard_D3_v2, + Standard_D4_v2, + Standard_D5_v2, + Standard_D2_v3, + Standard_D4_v3, + Standard_D8_v3, + Standard_D16_v3, + Standard_F1, + Standard_F2, + Standard_F4, + Standard_F8, + Standard_F16, + Standard_F2s_v2, + Standard_F4s_v2, + Standard_F8s_v2, + Standard_F16s_v2, + Standard_D2as_v4, + Standard_D4as_v4, + Standard_D8as_v4, + Standard_D16as_v4, + Standard_D2a_v4, + Standard_D4a_v4, + Standard_D8a_v4, + Standard_D16a_v4, + Standard_D2ads_v5, + Standard_D4ads_v5, + Standard_D8ads_v5, + Standard_D16ads_v5, + Standard_E2a_v4, + Standard_E4a_v4, + Standard_E8a_v4, + Standard_E16a_v4, + Standard_E2as_v4, + Standard_E4as_v4, + Standard_E8as_v4, + Standard_E16as_v4, + Standard_D2s_v3, + Standard_D4s_v3, + Standard_D8s_v3, + Standard_D16s_v3, + Standard_DS1_v2, + Standard_DS2_v2, + Standard_DS3_v2, + Standard_DS4_v2, + Standard_DS5_v2, + Standard_NC4as_T4_v3, + Standard_D2d_v4, + Standard_D4d_v4, + Standard_D8d_v4, + Standard_D16d_v4, + Standard_D2ds_v4, + Standard_D4ds_v4, + Standard_D8ds_v4, + Standard_D16ds_v4, + Standard_HB120_16rs_v3, + Standard_HB120_32rs_v3, + Standard_HB120_64rs_v3, + Standard_HB120_96rs_v3, + Standard_HB120rs_v3, + Standard_D2d_v5, + Standard_D4d_v5, + Standard_D8d_v5, + Standard_D16d_v5, + Standard_D32d_v5, + Standard_D2ds_v5, + Standard_D4ds_v5, + Standard_D8ds_v5, + Standard_D16ds_v5, + Standard_D32ds_v5 + } + + [Serializable] + public class BuildAliasDetailsResponse : PlayFabResultCommon + { + /// + /// The guid string alias Id of the alias to be created or updated. + /// + public string AliasId; + /// + /// The alias name. + /// + public string AliasName; + /// + /// Array of build selection criteria. + /// + public List BuildSelectionCriteria; + } + + [Serializable] + public class BuildAliasParams : PlayFabBaseModel + { + /// + /// The guid string alias ID to use for the request. + /// + public string AliasId; + } + + [Serializable] + public class BuildRegion : PlayFabBaseModel + { + /// + /// The current multiplayer server stats for the region. + /// + public CurrentServerStats CurrentServerStats; + /// + /// Optional settings to control dynamic adjustment of standby target + /// + public DynamicStandbySettings DynamicStandbySettings; + /// + /// Whether the game assets provided for the build have been replicated to this region. + /// + public bool IsAssetReplicationComplete; + /// + /// The maximum number of multiplayer servers for the region. + /// + public int MaxServers; + /// + /// Regional override for the number of multiplayer servers to host on a single VM of the build. + /// + public int? MultiplayerServerCountPerVm; + /// + /// The build region. + /// + public string Region; + /// + /// Optional settings to set the standby target to specified values during the supplied schedules + /// + public ScheduledStandbySettings ScheduledStandbySettings; + /// + /// The target number of standby multiplayer servers for the region. + /// + public int StandbyServers; + /// + /// The status of multiplayer servers in the build region. Valid values are - Unknown, Initialized, Deploying, Deployed, + /// Unhealthy, Deleting, Deleted. + /// + public string Status; + /// + /// Regional override for the VM size the build was created on. + /// + public AzureVmSize? VmSize; + } + + [Serializable] + public class BuildRegionParams : PlayFabBaseModel + { + /// + /// Optional settings to control dynamic adjustment of standby target. If not specified, dynamic standby is disabled + /// + public DynamicStandbySettings DynamicStandbySettings; + /// + /// The maximum number of multiplayer servers for the region. + /// + public int MaxServers; + /// + /// Regional override for the number of multiplayer servers to host on a single VM of the build. + /// + public int? MultiplayerServerCountPerVm; + /// + /// The build region. + /// + public string Region; + /// + /// Optional settings to set the standby target to specified values during the supplied schedules + /// + public ScheduledStandbySettings ScheduledStandbySettings; + /// + /// The number of standby multiplayer servers for the region. + /// + public int StandbyServers; + /// + /// Regional override for the VM size the build was created on. + /// + public AzureVmSize? VmSize; + } + + [Serializable] + public class BuildSelectionCriterion : PlayFabBaseModel + { + /// + /// Dictionary of build ids and their respective weights for distribution of allocation requests. + /// + public Dictionary BuildWeightDistribution; + } + + [Serializable] + public class BuildSummary : PlayFabBaseModel + { + /// + /// The guid string build ID of the build. + /// + public string BuildId; + /// + /// The build name. + /// + public string BuildName; + /// + /// The time the build was created in UTC. + /// + public DateTime? CreationTime; + /// + /// The metadata of the build. + /// + public Dictionary Metadata; + /// + /// The configuration and status for each region in the build. + /// + public List RegionConfigurations; + } + + /// + /// Cancels all tickets of which the player is a member in a given queue that are not cancelled or matched. This API is + /// useful if you lose track of what tickets the player is a member of (if the title crashes for instance) and want to + /// "reset". The Entity field is optional if the caller is a player and defaults to that player. Players may not cancel + /// tickets for other people. The Entity field is required if the caller is a server (authenticated as the title). + /// + [Serializable] + public class CancelAllMatchmakingTicketsForPlayerRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity key of the player whose tickets should be canceled. + /// + public EntityKey Entity; + /// + /// The name of the queue from which a player's tickets should be canceled. + /// + public string QueueName; + } + + [Serializable] + public class CancelAllMatchmakingTicketsForPlayerResult : PlayFabResultCommon + { + } + + /// + /// Cancels all backfill tickets of which the player is a member in a given queue that are not cancelled or matched. This + /// API is useful if you lose track of what tickets the player is a member of (if the server crashes for instance) and want + /// to "reset". + /// + [Serializable] + public class CancelAllServerBackfillTicketsForPlayerRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity key of the player whose backfill tickets should be canceled. + /// + public EntityKey Entity; + /// + /// The name of the queue from which a player's backfill tickets should be canceled. + /// + public string QueueName; + } + + [Serializable] + public class CancelAllServerBackfillTicketsForPlayerResult : PlayFabResultCommon + { + } + + public enum CancellationReason + { + Requested, + Internal, + Timeout + } + + /// + /// Only servers and ticket members can cancel a ticket. The ticket can be in five different states when it is cancelled. 1: + /// the ticket is waiting for members to join it, and it has not started matching. If the ticket is cancelled at this stage, + /// it will never match. 2: the ticket is matching. If the ticket is cancelled, it will stop matching. 3: the ticket is + /// matched. A matched ticket cannot be cancelled. 4: the ticket is already cancelled and nothing happens. 5: the ticket is + /// waiting for a server. If the ticket is cancelled, server allocation will be stopped. A server may still be allocated due + /// to a race condition, but that will not be reflected in the ticket. There may be race conditions between the ticket + /// getting matched and the client making a cancellation request. The client must handle the possibility that the cancel + /// request fails if a match is found before the cancellation request is processed. We do not allow resubmitting a cancelled + /// ticket because players must consent to enter matchmaking again. Create a new ticket instead. + /// + [Serializable] + public class CancelMatchmakingTicketRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The name of the queue the ticket is in. + /// + public string QueueName; + /// + /// The Id of the ticket to find a match for. + /// + public string TicketId; + } + + [Serializable] + public class CancelMatchmakingTicketResult : PlayFabResultCommon + { + } + + /// + /// Only servers can cancel a backfill ticket. The ticket can be in three different states when it is cancelled. 1: the + /// ticket is matching. If the ticket is cancelled, it will stop matching. 2: the ticket is matched. A matched ticket cannot + /// be cancelled. 3: the ticket is already cancelled and nothing happens. There may be race conditions between the ticket + /// getting matched and the server making a cancellation request. The server must handle the possibility that the cancel + /// request fails if a match is found before the cancellation request is processed. We do not allow resubmitting a cancelled + /// ticket. Create a new ticket instead. + /// + [Serializable] + public class CancelServerBackfillTicketRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The name of the queue the ticket is in. + /// + public string QueueName; + /// + /// The Id of the ticket to find a match for. + /// + public string TicketId; + } + + [Serializable] + public class CancelServerBackfillTicketResult : PlayFabResultCommon + { + } + + [Serializable] + public class Certificate : PlayFabBaseModel + { + /// + /// Base64 encoded string contents of the certificate. + /// + public string Base64EncodedValue; + /// + /// A name for the certificate. This is used to reference certificates in build configurations. + /// + public string Name; + /// + /// If required for your PFX certificate, use this field to provide a password that will be used to install the certificate + /// on the container. + /// + public string Password; + } + + [Serializable] + public class CertificateSummary : PlayFabBaseModel + { + /// + /// The name of the certificate. + /// + public string Name; + /// + /// The thumbprint for the certificate. + /// + public string Thumbprint; + } + + [Serializable] + public class ConnectedPlayer : PlayFabBaseModel + { + /// + /// The player ID of the player connected to the multiplayer server. + /// + public string PlayerId; + } + + public enum ContainerFlavor + { + ManagedWindowsServerCore, + CustomLinux, + ManagedWindowsServerCorePreview, + Invalid + } + + [Serializable] + public class ContainerImageReference : PlayFabBaseModel + { + /// + /// The container image name. + /// + public string ImageName; + /// + /// The container tag. + /// + public string Tag; + } + + [Serializable] + public class CoreCapacity : PlayFabBaseModel + { + /// + /// The available core capacity for the (Region, VmFamily) + /// + public int Available; + /// + /// The AzureRegion + /// + public string Region; + /// + /// The total core capacity for the (Region, VmFamily) + /// + public int Total; + /// + /// The AzureVmFamily + /// + public AzureVmFamily? VmFamily; + } + + [Serializable] + public class CoreCapacityChange : PlayFabBaseModel + { + /// + /// New quota core limit for the given vm family/region. + /// + public int NewCoreLimit; + /// + /// Region to change. + /// + public string Region; + /// + /// Virtual machine family to change. + /// + public AzureVmFamily VmFamily; + } + + /// + /// Creates a multiplayer server build alias and returns the created alias. + /// + [Serializable] + public class CreateBuildAliasRequest : PlayFabRequestCommon + { + /// + /// The alias name. + /// + public string AliasName; + /// + /// Array of build selection criteria. + /// + public List BuildSelectionCriteria; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + /// + /// Creates a multiplayer server build with a custom container and returns information about the build creation request. + /// + [Serializable] + public class CreateBuildWithCustomContainerRequest : PlayFabRequestCommon + { + /// + /// When true, assets will not be copied for each server inside the VM. All serverswill run from the same set of assets, or + /// will have the same assets mounted in the container. + /// + public bool? AreAssetsReadonly; + /// + /// The build name. + /// + public string BuildName; + /// + /// The flavor of container to create a build from. + /// + public ContainerFlavor? ContainerFlavor; + /// + /// The container reference, consisting of the image name and tag. + /// + public ContainerImageReference ContainerImageReference; + /// + /// The container command to run when the multiplayer server has been allocated, including any arguments. + /// + public string ContainerRunCommand; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The list of game assets related to the build. + /// + public List GameAssetReferences; + /// + /// The game certificates for the build. + /// + public List GameCertificateReferences; + /// + /// The game secrets for the build. + /// + public List GameSecretReferences; + /// + /// The Linux instrumentation configuration for the build. + /// + public LinuxInstrumentationConfiguration LinuxInstrumentationConfiguration; + /// + /// Metadata to tag the build. The keys are case insensitive. The build metadata is made available to the server through + /// Game Server SDK (GSDK).Constraints: Maximum number of keys: 30, Maximum key length: 50, Maximum value length: 100 + /// + public Dictionary Metadata; + /// + /// The configuration for the monitoring application on the build + /// + public MonitoringApplicationConfigurationParams MonitoringApplicationConfiguration; + /// + /// The number of multiplayer servers to host on a single VM. + /// + public int MultiplayerServerCountPerVm; + /// + /// The ports to map the build on. + /// + public List Ports; + /// + /// The region configurations for the build. + /// + public List RegionConfigurations; + /// + /// The resource constraints to apply to each server on the VM (EXPERIMENTAL API) + /// + public ServerResourceConstraintParams ServerResourceConstraints; + /// + /// The VM size to create the build on. + /// + public AzureVmSize? VmSize; + /// + /// The configuration for the VmStartupScript for the build + /// + public VmStartupScriptParams VmStartupScriptConfiguration; + } + + [Serializable] + public class CreateBuildWithCustomContainerResponse : PlayFabResultCommon + { + /// + /// When true, assets will not be copied for each server inside the VM. All serverswill run from the same set of assets, or + /// will have the same assets mounted in the container. + /// + public bool? AreAssetsReadonly; + /// + /// The guid string build ID. Must be unique for every build. + /// + public string BuildId; + /// + /// The build name. + /// + public string BuildName; + /// + /// The flavor of container of the build. + /// + public ContainerFlavor? ContainerFlavor; + /// + /// The container command to run when the multiplayer server has been allocated, including any arguments. + /// + public string ContainerRunCommand; + /// + /// The time the build was created in UTC. + /// + public DateTime? CreationTime; + /// + /// The custom game container image reference information. + /// + public ContainerImageReference CustomGameContainerImage; + /// + /// The game assets for the build. + /// + public List GameAssetReferences; + /// + /// The game certificates for the build. + /// + public List GameCertificateReferences; + /// + /// The game secrets for the build. + /// + public List GameSecretReferences; + /// + /// The Linux instrumentation configuration for this build. + /// + public LinuxInstrumentationConfiguration LinuxInstrumentationConfiguration; + /// + /// The metadata of the build. + /// + public Dictionary Metadata; + /// + /// The configuration for the monitoring application for the build + /// + public MonitoringApplicationConfiguration MonitoringApplicationConfiguration; + /// + /// The number of multiplayer servers to host on a single VM of the build. + /// + public int MultiplayerServerCountPerVm; + /// + /// The OS platform used for running the game process. + /// + public string OsPlatform; + /// + /// The ports the build is mapped on. + /// + public List Ports; + /// + /// The region configuration for the build. + /// + public List RegionConfigurations; + /// + /// The resource constraints to apply to each server on the VM (EXPERIMENTAL API) + /// + public ServerResourceConstraintParams ServerResourceConstraints; + /// + /// The type of game server being hosted. + /// + public string ServerType; + /// + /// When true, assets will be downloaded and uncompressed in memory, without the compressedversion being written first to + /// disc. + /// + public bool? UseStreamingForAssetDownloads; + /// + /// The VM size the build was created on. + /// + public AzureVmSize? VmSize; + /// + /// The configuration for the VmStartupScript feature for the build + /// + public VmStartupScriptConfiguration VmStartupScriptConfiguration; + } + + /// + /// Creates a multiplayer server build with a managed container and returns information about the build creation request. + /// + [Serializable] + public class CreateBuildWithManagedContainerRequest : PlayFabRequestCommon + { + /// + /// When true, assets will not be copied for each server inside the VM. All serverswill run from the same set of assets, or + /// will have the same assets mounted in the container. + /// + public bool? AreAssetsReadonly; + /// + /// The build name. + /// + public string BuildName; + /// + /// The flavor of container to create a build from. + /// + public ContainerFlavor? ContainerFlavor; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The list of game assets related to the build. + /// + public List GameAssetReferences; + /// + /// The game certificates for the build. + /// + public List GameCertificateReferences; + /// + /// The game secrets for the build. + /// + public List GameSecretReferences; + /// + /// The directory containing the game executable. This would be the start path of the game assets that contain the main game + /// server executable. If not provided, a best effort will be made to extract it from the start game command. + /// + public string GameWorkingDirectory; + /// + /// The instrumentation configuration for the build. + /// + public InstrumentationConfiguration InstrumentationConfiguration; + /// + /// Metadata to tag the build. The keys are case insensitive. The build metadata is made available to the server through + /// Game Server SDK (GSDK).Constraints: Maximum number of keys: 30, Maximum key length: 50, Maximum value length: 100 + /// + public Dictionary Metadata; + /// + /// The configuration for the monitoring application on the build + /// + public MonitoringApplicationConfigurationParams MonitoringApplicationConfiguration; + /// + /// The number of multiplayer servers to host on a single VM. + /// + public int MultiplayerServerCountPerVm; + /// + /// The ports to map the build on. + /// + public List Ports; + /// + /// The region configurations for the build. + /// + public List RegionConfigurations; + /// + /// The resource constraints to apply to each server on the VM (EXPERIMENTAL API) + /// + public ServerResourceConstraintParams ServerResourceConstraints; + /// + /// The command to run when the multiplayer server is started, including any arguments. + /// + public string StartMultiplayerServerCommand; + /// + /// The VM size to create the build on. + /// + public AzureVmSize? VmSize; + /// + /// The configuration for the VmStartupScript for the build + /// + public VmStartupScriptParams VmStartupScriptConfiguration; + /// + /// The crash dump configuration for the build. + /// + public WindowsCrashDumpConfiguration WindowsCrashDumpConfiguration; + } + + [Serializable] + public class CreateBuildWithManagedContainerResponse : PlayFabResultCommon + { + /// + /// When true, assets will not be copied for each server inside the VM. All serverswill run from the same set of assets, or + /// will have the same assets mounted in the container. + /// + public bool? AreAssetsReadonly; + /// + /// The guid string build ID. Must be unique for every build. + /// + public string BuildId; + /// + /// The build name. + /// + public string BuildName; + /// + /// The flavor of container of the build. + /// + public ContainerFlavor? ContainerFlavor; + /// + /// The time the build was created in UTC. + /// + public DateTime? CreationTime; + /// + /// The game assets for the build. + /// + public List GameAssetReferences; + /// + /// The game certificates for the build. + /// + public List GameCertificateReferences; + /// + /// The game secrets for the build. + /// + public List GameSecretReferences; + /// + /// The directory containing the game executable. This would be the start path of the game assets that contain the main game + /// server executable. If not provided, a best effort will be made to extract it from the start game command. + /// + public string GameWorkingDirectory; + /// + /// The instrumentation configuration for this build. + /// + public InstrumentationConfiguration InstrumentationConfiguration; + /// + /// The metadata of the build. + /// + public Dictionary Metadata; + /// + /// The configuration for the monitoring application for the build + /// + public MonitoringApplicationConfiguration MonitoringApplicationConfiguration; + /// + /// The number of multiplayer servers to host on a single VM of the build. + /// + public int MultiplayerServerCountPerVm; + /// + /// The OS platform used for running the game process. + /// + public string OsPlatform; + /// + /// The ports the build is mapped on. + /// + public List Ports; + /// + /// The region configuration for the build. + /// + public List RegionConfigurations; + /// + /// The resource constraints to apply to each server on the VM (EXPERIMENTAL API) + /// + public ServerResourceConstraintParams ServerResourceConstraints; + /// + /// The type of game server being hosted. + /// + public string ServerType; + /// + /// The command to run when the multiplayer server has been allocated, including any arguments. + /// + public string StartMultiplayerServerCommand; + /// + /// When true, assets will be downloaded and uncompressed in memory, without the compressedversion being written first to + /// disc. + /// + public bool? UseStreamingForAssetDownloads; + /// + /// The VM size the build was created on. + /// + public AzureVmSize? VmSize; + /// + /// The configuration for the VmStartupScript feature for the build + /// + public VmStartupScriptConfiguration VmStartupScriptConfiguration; + } + + /// + /// Creates a multiplayer server build with the game server running as a process and returns information about the build + /// creation request. + /// + [Serializable] + public class CreateBuildWithProcessBasedServerRequest : PlayFabRequestCommon + { + /// + /// When true, assets will not be copied for each server inside the VM. All serverswill run from the same set of assets, or + /// will have the same assets mounted in the container. + /// + public bool? AreAssetsReadonly; + /// + /// The build name. + /// + public string BuildName; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The list of game assets related to the build. + /// + public List GameAssetReferences; + /// + /// The game certificates for the build. + /// + public List GameCertificateReferences; + /// + /// The game secrets for the build. + /// + public List GameSecretReferences; + /// + /// The working directory for the game process. If this is not provided, the working directory will be set based on the + /// mount path of the game server executable. + /// + public string GameWorkingDirectory; + /// + /// The instrumentation configuration for the Build. Used only if it is a Windows Build. + /// + public InstrumentationConfiguration InstrumentationConfiguration; + /// + /// Indicates whether this build will be created using the OS Preview versionPreview OS is recommended for dev builds to + /// detect any breaking changes before they are released to retail. Retail builds should set this value to false. + /// + public bool? IsOSPreview; + /// + /// The Linux instrumentation configuration for the Build. Used only if it is a Linux Build. + /// + public LinuxInstrumentationConfiguration LinuxInstrumentationConfiguration; + /// + /// Metadata to tag the build. The keys are case insensitive. The build metadata is made available to the server through + /// Game Server SDK (GSDK).Constraints: Maximum number of keys: 30, Maximum key length: 50, Maximum value length: 100 + /// + public Dictionary Metadata; + /// + /// The configuration for the monitoring application on the build + /// + public MonitoringApplicationConfigurationParams MonitoringApplicationConfiguration; + /// + /// The number of multiplayer servers to host on a single VM. + /// + public int MultiplayerServerCountPerVm; + /// + /// The OS platform used for running the game process. + /// + public string OsPlatform; + /// + /// The ports to map the build on. + /// + public List Ports; + /// + /// The region configurations for the build. + /// + public List RegionConfigurations; + /// + /// The command to run when the multiplayer server is started, including any arguments. The path to any executable should be + /// relative to the root asset folder when unzipped. + /// + public string StartMultiplayerServerCommand; + /// + /// The VM size to create the build on. + /// + public AzureVmSize? VmSize; + /// + /// The configuration for the VmStartupScript for the build + /// + public VmStartupScriptParams VmStartupScriptConfiguration; + } + + [Serializable] + public class CreateBuildWithProcessBasedServerResponse : PlayFabResultCommon + { + /// + /// When true, assets will not be copied for each server inside the VM. All serverswill run from the same set of assets, or + /// will have the same assets mounted in the container. + /// + public bool? AreAssetsReadonly; + /// + /// The guid string build ID. Must be unique for every build. + /// + public string BuildId; + /// + /// The build name. + /// + public string BuildName; + /// + /// The flavor of container of the build. + /// + public ContainerFlavor? ContainerFlavor; + /// + /// The time the build was created in UTC. + /// + public DateTime? CreationTime; + /// + /// The game assets for the build. + /// + public List GameAssetReferences; + /// + /// The game certificates for the build. + /// + public List GameCertificateReferences; + /// + /// The game secrets for the build. + /// + public List GameSecretReferences; + /// + /// The working directory for the game process. If this is not provided, the working directory will be set based on the + /// mount path of the game server executable. + /// + public string GameWorkingDirectory; + /// + /// The instrumentation configuration for this build. + /// + public InstrumentationConfiguration InstrumentationConfiguration; + /// + /// Indicates whether this build will be created using the OS Preview versionPreview OS is recommended for dev builds to + /// detect any breaking changes before they are released to retail. Retail builds should set this value to false. + /// + public bool? IsOSPreview; + /// + /// The Linux instrumentation configuration for this build. + /// + public LinuxInstrumentationConfiguration LinuxInstrumentationConfiguration; + /// + /// The metadata of the build. + /// + public Dictionary Metadata; + /// + /// The configuration for the monitoring application for the build + /// + public MonitoringApplicationConfiguration MonitoringApplicationConfiguration; + /// + /// The number of multiplayer servers to host on a single VM of the build. + /// + public int MultiplayerServerCountPerVm; + /// + /// The OS platform used for running the game process. + /// + public string OsPlatform; + /// + /// The ports the build is mapped on. + /// + public List Ports; + /// + /// The region configuration for the build. + /// + public List RegionConfigurations; + /// + /// The type of game server being hosted. + /// + public string ServerType; + /// + /// The command to run when the multiplayer server is started, including any arguments. The path to any executable is + /// relative to the root asset folder when unzipped. + /// + public string StartMultiplayerServerCommand; + /// + /// When true, assets will be downloaded and uncompressed in memory, without the compressedversion being written first to + /// disc. + /// + public bool? UseStreamingForAssetDownloads; + /// + /// The VM size the build was created on. + /// + public AzureVmSize? VmSize; + /// + /// The configuration for the VmStartupScript feature for the build + /// + public VmStartupScriptConfiguration VmStartupScriptConfiguration; + } + + /// + /// Request to create a lobby. A Server or client can create a lobby. + /// + [Serializable] + public class CreateLobbyRequest : PlayFabRequestCommon + { + /// + /// The policy indicating who is allowed to join the lobby, and the visibility to queries. May be 'Public', 'Friends' or + /// 'Private'. Public means the lobby is both visible in queries and any player may join, including invited players. Friends + /// means that users who are bidirectional friends of members in the lobby may search to find friend lobbies, to retrieve + /// its connection string. Private means the lobby is not visible in queries, and a player must receive an invitation to + /// join. Defaults to 'Public' on creation. Can only be changed by the lobby owner. + /// + public AccessPolicy? AccessPolicy; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The private key-value pairs which are visible to all entities in the lobby. At most 30 key-value pairs may be stored + /// here, keys are limited to 30 characters and values to 1000. The total size of all lobbyData values may not exceed 4096 + /// bytes. Keys are case sensitive. + /// + public Dictionary LobbyData; + /// + /// The maximum number of players allowed in the lobby. The value must be between 2 and 128. + /// + public uint MaxPlayers; + /// + /// The member initially added to the lobby. Client must specify exactly one member, which is the creator's entity and + /// member data. Member PubSubConnectionHandle must be null or empty. Game servers must not specify any members. + /// + public List Members; + /// + /// The lobby owner. Must be the calling entity. + /// + public EntityKey Owner; + /// + /// The policy for how a new owner is chosen. May be 'Automatic', 'Manual' or 'None'. Can only be specified by clients. If + /// client-owned and 'Automatic' - The Lobby service will automatically assign another connected owner when the current + /// owner leaves or disconnects. The useConnections property must be true. If client - owned and 'Manual' - Ownership is + /// protected as long as the current owner is connected. If the current owner leaves or disconnects any member may set + /// themselves as the current owner. The useConnections property must be true. If client-owned and 'None' - Any member can + /// set ownership. The useConnections property can be either true or false. + /// + public OwnerMigrationPolicy? OwnerMigrationPolicy; + /// + /// The public key-value pairs which allow queries to differentiate between lobbies. Queries will refer to these key-value + /// pairs in their filter and order by clauses to retrieve lobbies fitting the specified criteria. At most 30 key-value + /// pairs may be stored here. Keys are of the format string_key1, string_key2 ... string_key30 for string values, or + /// number_key1, number_key2, ... number_key30 for numeric values.Numeric values are floats. Values can be at most 256 + /// characters long. The total size of all searchData values may not exceed 1024 bytes. + /// + public Dictionary SearchData; + /// + /// A setting to control whether connections are used. Defaults to true. When true, notifications are sent to subscribed + /// players, disconnect detection removes connectionHandles, only owner migration policies using connections are allowed, + /// and lobbies must have at least one connected member to be searchable or be a server hosted lobby with a connected + /// server. If false, then notifications are not sent, connections are not allowed, and lobbies do not need connections to + /// be searchable. + /// + public bool UseConnections; + } + + [Serializable] + public class CreateLobbyResult : PlayFabResultCommon + { + /// + /// A field which indicates which lobby the user will be joining. + /// + public string ConnectionString; + /// + /// Id to uniquely identify a lobby. + /// + public string LobbyId; + } + + /// + /// The client specifies the creator's attributes and optionally a list of other users to match with. + /// + [Serializable] + public class CreateMatchmakingTicketRequest : PlayFabRequestCommon + { + /// + /// The User who created this ticket. + /// + public MatchmakingPlayer Creator; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// How long to attempt matching this ticket in seconds. + /// + public int GiveUpAfterSeconds; + /// + /// A list of Entity Keys of other users to match with. + /// + public List MembersToMatchWith; + /// + /// The Id of a match queue. + /// + public string QueueName; + } + + [Serializable] + public class CreateMatchmakingTicketResult : PlayFabResultCommon + { + /// + /// The Id of the ticket to find a match for. + /// + public string TicketId; + } + + /// + /// Creates a remote user to log on to a VM for a multiplayer server build in a specific region. Returns user credential + /// information necessary to log on. + /// + [Serializable] + public class CreateRemoteUserRequest : PlayFabRequestCommon + { + /// + /// The guid string build ID of to create the remote user for. + /// + public string BuildId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The expiration time for the remote user created. Defaults to expiring in one day if not specified. + /// + public DateTime? ExpirationTime; + /// + /// The region of virtual machine to create the remote user for. + /// + public string Region; + /// + /// The username to create the remote user with. + /// + public string Username; + /// + /// The virtual machine ID the multiplayer server is located on. + /// + public string VmId; + } + + [Serializable] + public class CreateRemoteUserResponse : PlayFabResultCommon + { + /// + /// The expiration time for the remote user created. + /// + public DateTime? ExpirationTime; + /// + /// The generated password for the remote user that was created. + /// + public string Password; + /// + /// The username for the remote user that was created. + /// + public string Username; + } + + /// + /// The server specifies all the members, their teams and their attributes, and the server details if applicable. + /// + [Serializable] + public class CreateServerBackfillTicketRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// How long to attempt matching this ticket in seconds. + /// + public int GiveUpAfterSeconds; + /// + /// The users who will be part of this ticket, along with their team assignments. + /// + public List Members; + /// + /// The Id of a match queue. + /// + public string QueueName; + /// + /// The details of the server the members are connected to. + /// + public ServerDetails ServerDetails; + } + + [Serializable] + public class CreateServerBackfillTicketResult : PlayFabResultCommon + { + /// + /// The Id of the ticket to find a match for. + /// + public string TicketId; + } + + /// + /// The server specifies all the members and their attributes. + /// + [Serializable] + public class CreateServerMatchmakingTicketRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// How long to attempt matching this ticket in seconds. + /// + public int GiveUpAfterSeconds; + /// + /// The users who will be part of this ticket. + /// + public List Members; + /// + /// The Id of a match queue. + /// + public string QueueName; + } + + /// + /// Creates a request to change a title's multiplayer server quotas. + /// + [Serializable] + public class CreateTitleMultiplayerServersQuotaChangeRequest : PlayFabRequestCommon + { + /// + /// A brief description of the requested changes. + /// + public string ChangeDescription; + /// + /// Changes to make to the titles cores quota. + /// + public List Changes; + /// + /// Email to be contacted by our team about this request. Only required when a request is not approved. + /// + public string ContactEmail; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Additional information about this request that our team can use to better understand the requirements. + /// + public string Notes; + /// + /// When these changes would need to be in effect. Only required when a request is not approved. + /// + public DateTime? StartDate; + } + + [Serializable] + public class CreateTitleMultiplayerServersQuotaChangeResponse : PlayFabResultCommon + { + /// + /// Id of the change request that was created. + /// + public string RequestId; + /// + /// Determines if the request was approved or not. When false, our team is reviewing and may respond within 2 business days. + /// + public bool WasApproved; + } + + [Serializable] + public class CurrentServerStats : PlayFabBaseModel + { + /// + /// The number of active multiplayer servers. + /// + public int Active; + /// + /// The number of multiplayer servers still downloading game resources (such as assets). + /// + public int Propping; + /// + /// The number of standingby multiplayer servers. + /// + public int StandingBy; + /// + /// The total number of multiplayer servers. + /// + public int Total; + } + + [Serializable] + public class CustomDifferenceRuleExpansion : PlayFabBaseModel + { + /// + /// Manually specify the values to use for each expansion interval (this overrides Difference, Delta, and MaxDifference). + /// + public List DifferenceOverrides; + /// + /// How many seconds before this rule is expanded. + /// + public uint SecondsBetweenExpansions; + } + + [Serializable] + public class CustomRegionSelectionRuleExpansion : PlayFabBaseModel + { + /// + /// Manually specify the maximum latency to use for each expansion interval. + /// + public List MaxLatencyOverrides; + /// + /// How many seconds before this rule is expanded. + /// + public uint SecondsBetweenExpansions; + } + + [Serializable] + public class CustomSetIntersectionRuleExpansion : PlayFabBaseModel + { + /// + /// Manually specify the values to use for each expansion interval. + /// + public List MinIntersectionSizeOverrides; + /// + /// How many seconds before this rule is expanded. + /// + public uint SecondsBetweenExpansions; + } + + [Serializable] + public class CustomTeamDifferenceRuleExpansion : PlayFabBaseModel + { + /// + /// Manually specify the team difference value to use for each expansion interval. + /// + public List DifferenceOverrides; + /// + /// How many seconds before this rule is expanded. + /// + public uint SecondsBetweenExpansions; + } + + [Serializable] + public class CustomTeamSizeBalanceRuleExpansion : PlayFabBaseModel + { + /// + /// Manually specify the team size difference to use for each expansion interval. + /// + public List DifferenceOverrides; + /// + /// How many seconds before this rule is expanded. + /// + public uint SecondsBetweenExpansions; + } + + /// + /// Deletes a multiplayer server game asset for a title. + /// + [Serializable] + public class DeleteAssetRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The filename of the asset to delete. + /// + public string FileName; + } + + /// + /// Deletes a multiplayer server build alias. + /// + [Serializable] + public class DeleteBuildAliasRequest : PlayFabRequestCommon + { + /// + /// The guid string alias ID of the alias to perform the action on. + /// + public string AliasId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + /// + /// Removes a multiplayer server build's region. + /// + [Serializable] + public class DeleteBuildRegionRequest : PlayFabRequestCommon + { + /// + /// The guid string ID of the build we want to update regions for. + /// + public string BuildId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The build region to delete. + /// + public string Region; + } + + /// + /// Deletes a multiplayer server build. + /// + [Serializable] + public class DeleteBuildRequest : PlayFabRequestCommon + { + /// + /// The guid string build ID of the build to delete. + /// + public string BuildId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + /// + /// Deletes a multiplayer server game certificate. + /// + [Serializable] + public class DeleteCertificateRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The name of the certificate. + /// + public string Name; + } + + /// + /// Removes the specified container image repository. After this operation, a 'docker pull' will fail for all the tags of + /// the specified image. Morever, ListContainerImages will not return the specified image. + /// + [Serializable] + public class DeleteContainerImageRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The container image repository we want to delete. + /// + public string ImageName; + } + + /// + /// Request to delete a lobby. Only servers can delete lobbies. + /// + [Serializable] + public class DeleteLobbyRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The id of the lobby. + /// + public string LobbyId; + } + + /// + /// Deletes a remote user to log on to a VM for a multiplayer server build in a specific region. Returns user credential + /// information necessary to log on. + /// + [Serializable] + public class DeleteRemoteUserRequest : PlayFabRequestCommon + { + /// + /// The guid string build ID of the multiplayer server where the remote user is to delete. + /// + public string BuildId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The region of the multiplayer server where the remote user is to delete. + /// + public string Region; + /// + /// The username of the remote user to delete. + /// + public string Username; + /// + /// The virtual machine ID the multiplayer server is located on. + /// + public string VmId; + } + + /// + /// Deletes a multiplayer server game secret. + /// + [Serializable] + public class DeleteSecretRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The name of the secret. + /// + public string Name; + } + + [Serializable] + public class DifferenceRule : PlayFabBaseModel + { + /// + /// Description of the attribute used by this rule to match tickets. + /// + public QueueRuleAttribute Attribute; + /// + /// Describes the behavior when an attribute is not specified in the ticket creation request or in the user's entity + /// profile. + /// + public AttributeNotSpecifiedBehavior AttributeNotSpecifiedBehavior; + /// + /// Collection of fields relating to expanding this rule at set intervals. Only one expansion can be set per rule. When this + /// is set, Difference is ignored. + /// + public CustomDifferenceRuleExpansion CustomExpansion; + /// + /// The default value assigned to tickets that are missing the attribute specified by AttributePath (assuming that + /// AttributeNotSpecifiedBehavior is false). Optional. + /// + public double? DefaultAttributeValue; + /// + /// The allowed difference between any two tickets at the start of matchmaking. + /// + public double Difference; + /// + /// Collection of fields relating to expanding this rule at set intervals. Only one expansion can be set per rule. + /// + public LinearDifferenceRuleExpansion LinearExpansion; + /// + /// How values are treated when there are multiple players in a single ticket. + /// + public AttributeMergeFunction MergeFunction; + /// + /// Friendly name chosen by developer. + /// + public string Name; + /// + /// How many seconds before this rule is no longer enforced (but tickets that comply with this rule will still be + /// prioritized over those that don't). Leave blank if this rule is always enforced. + /// + public uint? SecondsUntilOptional; + /// + /// The relative weight of this rule compared to others. + /// + public double Weight; + } + + public enum DirectPeerConnectivityOptions + { + None, + SamePlatformType, + DifferentPlatformType, + AnyPlatformType, + SameEntityLoginProvider, + DifferentEntityLoginProvider, + AnyEntityLoginProvider, + AnyPlatformTypeAndEntityLoginProvider, + OnlyServers + } + + [Serializable] + public class DynamicStandbySettings : PlayFabBaseModel + { + /// + /// List of auto standing by trigger values and corresponding standing by multiplier. Defaults to 1.5X at 50%, 3X at 25%, + /// and 4X at 5% + /// + public List DynamicFloorMultiplierThresholds; + /// + /// When true, dynamic standby will be enabled + /// + public bool IsEnabled; + /// + /// The time it takes to reduce target standing by to configured floor value after an increase. Defaults to 30 minutes + /// + public int? RampDownSeconds; + } + + [Serializable] + public class DynamicStandbyThreshold : PlayFabBaseModel + { + /// + /// When the trigger threshold is reached, multiply by this value + /// + public double Multiplier; + /// + /// The multiplier will be applied when the actual standby divided by target standby floor is less than this value + /// + public double TriggerThresholdPercentage; + } + + [Serializable] + public class EmptyResponse : PlayFabResultCommon + { + } + + /// + /// Enables the multiplayer server feature for a title and returns the enabled status. The enabled status can be + /// Initializing, Enabled, and Disabled. It can up to 20 minutes or more for the title to be enabled for the feature. On + /// average, it can take up to 20 minutes for the title to be enabled for the feature. + /// + [Serializable] + public class EnableMultiplayerServersForTitleRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + [Serializable] + public class EnableMultiplayerServersForTitleResponse : PlayFabResultCommon + { + /// + /// The enabled status for the multiplayer server features for the title. + /// + public TitleMultiplayerServerEnabledStatus? Status; + } + + /// + /// Combined entity type and ID structure which uniquely identifies a single entity. + /// + [Serializable] + public class EntityKey : PlayFabBaseModel + { + /// + /// Unique ID of the entity. + /// + public string Id; + /// + /// Entity type. See https://docs.microsoft.com/gaming/playfab/features/data/entities/available-built-in-entity-types + /// + public string Type; + } + + public enum ExternalFriendSources + { + None, + Steam, + Facebook, + Xbox, + Psn, + All + } + + /// + /// Request to find friends lobbies. Only a client can find friend lobbies. + /// + [Serializable] + public class FindFriendLobbiesRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Indicates which other platforms' friends this query should link to. + /// + public ExternalFriendSources? ExternalPlatformFriends; + /// + /// OData style string that contains one or more filters. Only the following operators are supported: "and" (logical and), + /// "eq" (equal), "ne" (not equals), "ge" (greater than or equal), "gt" (greater than), "le" (less than or equal), and "lt" + /// (less than). The left-hand side of each OData logical expression should be either a search property key (e.g. + /// string_key1, number_key3, etc) or one of the pre-defined search keys all of which must be prefixed by "lobby/": + /// lobby/memberCount (number of players in a lobby), lobby/maxMemberCount (maximum number of players allowed in a lobby), + /// lobby/memberCountRemaining (remaining number of players who can be allowed in a lobby), lobby/membershipLock (must equal + /// 'Unlocked' or 'Locked'), lobby/amOwner (required to equal "true"), lobby/amMember (required to equal "true"). + /// + public string Filter; + /// + /// OData style string that contains sorting for this query in either ascending ("asc") or descending ("desc") order. + /// OrderBy clauses are of the form "number_key1 asc" or the pre-defined search key "lobby/memberCount asc", + /// "lobby/memberCountRemaining desc" and "lobby/maxMemberCount desc". To sort by closest, a moniker `distance{number_key1 = + /// 5}` can be used to sort by distance from the given number. This field only supports either one sort clause or one + /// distance clause. + /// + public string OrderBy; + /// + /// Request pagination information. + /// + public PaginationRequest Pagination; + /// + /// Xbox token if Xbox friends should be included. Requires Xbox be configured on PlayFab. + /// + public string XboxToken; + } + + [Serializable] + public class FindFriendLobbiesResult : PlayFabResultCommon + { + /// + /// Array of lobbies found that matched FindFriendLobbies request. + /// + public List Lobbies; + /// + /// Pagination response for FindFriendLobbies request. + /// + public PaginationResponse Pagination; + } + + /// + /// Request to find lobbies. + /// + [Serializable] + public class FindLobbiesRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// OData style string that contains one or more filters. Only the following operators are supported: "and" (logical and), + /// "eq" (equal), "ne" (not equals), "ge" (greater than or equal), "gt" (greater than), "le" (less than or equal), and "lt" + /// (less than). The left-hand side of each OData logical expression should be either a search property key (e.g. + /// string_key1, number_key3, etc) or one of the pre-defined search keys all of which must be prefixed by "lobby/": + /// lobby/memberCount (number of players in a lobby), lobby/maxMemberCount (maximum number of players allowed in a lobby), + /// lobby/memberCountRemaining (remaining number of players who can be allowed in a lobby), lobby/membershipLock (must equal + /// 'Unlocked' or 'Locked'), lobby/amOwner (required to equal "true"), lobby/amMember (required to equal "true"). + /// + public string Filter; + /// + /// OData style string that contains sorting for this query in either ascending ("asc") or descending ("desc") order. + /// OrderBy clauses are of the form "number_key1 asc" or the pre-defined search key "lobby/memberCount asc", + /// "lobby/memberCountRemaining desc" and "lobby/maxMemberCount desc". To sort by closest, a moniker `distance{number_key1 = + /// 5}` can be used to sort by distance from the given number. This field only supports either one sort clause or one + /// distance clause. + /// + public string OrderBy; + /// + /// Request pagination information. + /// + public PaginationRequest Pagination; + } + + [Serializable] + public class FindLobbiesResult : PlayFabResultCommon + { + /// + /// Array of lobbies found that matched FindLobbies request. + /// + public List Lobbies; + /// + /// Pagination response for FindLobbies request. + /// + public PaginationResponse Pagination; + } + + [Serializable] + public class FriendLobbySummary : PlayFabBaseModel + { + /// + /// A string used to join the lobby.This field is populated by the Lobby service.Invites are performed by communicating this + /// connectionString to other players. + /// + public string ConnectionString; + /// + /// The current number of players in the lobby. + /// + public uint CurrentPlayers; + /// + /// Friends in Lobby. + /// + public List Friends; + /// + /// Id to uniquely identify a lobby. + /// + public string LobbyId; + /// + /// The maximum number of players allowed in the lobby. + /// + public uint MaxPlayers; + /// + /// A setting indicating whether members are allowed to join this lobby. When Locked new members are prevented from joining. + /// + public MembershipLock? MembershipLock; + /// + /// The client or server entity which owns this lobby. + /// + public EntityKey Owner; + /// + /// Search data. + /// + public Dictionary SearchData; + } + + [Serializable] + public class GameCertificateReference : PlayFabBaseModel + { + /// + /// An alias for the game certificate. The game server will reference this alias via GSDK config to retrieve the game + /// certificate. This alias is used as an identifier in game server code to allow a new certificate with different Name + /// field to be uploaded without the need to change any game server code to reference the new Name. + /// + public string GsdkAlias; + /// + /// The name of the game certificate. This name should match the name of a certificate that was previously uploaded to this + /// title. + /// + public string Name; + } + + [Serializable] + public class GameCertificateReferenceParams : PlayFabBaseModel + { + /// + /// An alias for the game certificate. The game server will reference this alias via GSDK config to retrieve the game + /// certificate. This alias is used as an identifier in game server code to allow a new certificate with different Name + /// field to be uploaded without the need to change any game server code to reference the new Name. + /// + public string GsdkAlias; + /// + /// The name of the game certificate. This name should match the name of a certificate that was previously uploaded to this + /// title. + /// + public string Name; + } + + [Serializable] + public class GameSecretReference : PlayFabBaseModel + { + /// + /// The name of the game secret. This name should match the name of a secret that was previously added to this title. + /// + public string Name; + } + + [Serializable] + public class GameSecretReferenceParams : PlayFabBaseModel + { + /// + /// The name of the game secret. This name should match the name of a secret that was previously added to this title. + /// + public string Name; + } + + /// + /// Gets a URL that can be used to download the specified asset. + /// + [Serializable] + public class GetAssetDownloadUrlRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The asset's file name to get the download URL for. + /// + public string FileName; + } + + [Serializable] + public class GetAssetDownloadUrlResponse : PlayFabResultCommon + { + /// + /// The asset's download URL. + /// + public string AssetDownloadUrl; + /// + /// The asset's file name to get the download URL for. + /// + public string FileName; + } + + /// + /// Gets the URL to upload assets to. + /// + [Serializable] + public class GetAssetUploadUrlRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The asset's file name to get the upload URL for. + /// + public string FileName; + } + + [Serializable] + public class GetAssetUploadUrlResponse : PlayFabResultCommon + { + /// + /// The asset's upload URL. + /// + public string AssetUploadUrl; + /// + /// The asset's file name to get the upload URL for. + /// + public string FileName; + } + + /// + /// Returns the details about a multiplayer server build alias. + /// + [Serializable] + public class GetBuildAliasRequest : PlayFabRequestCommon + { + /// + /// The guid string alias ID of the alias to perform the action on. + /// + public string AliasId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + /// + /// Returns the details about a multiplayer server build. + /// + [Serializable] + public class GetBuildRequest : PlayFabRequestCommon + { + /// + /// The guid string build ID of the build to get. + /// + public string BuildId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + [Serializable] + public class GetBuildResponse : PlayFabResultCommon + { + /// + /// When true, assets will not be copied for each server inside the VM. All serverswill run from the same set of assets, or + /// will have the same assets mounted in the container. + /// + public bool? AreAssetsReadonly; + /// + /// The guid string build ID of the build. + /// + public string BuildId; + /// + /// The build name. + /// + public string BuildName; + /// + /// The current build status. Valid values are - Deploying, Deployed, DeletingRegion, Unhealthy. + /// + public string BuildStatus; + /// + /// The flavor of container of he build. + /// + public ContainerFlavor? ContainerFlavor; + /// + /// The container command to run when the multiplayer server has been allocated, including any arguments. This only applies + /// to custom builds. If the build is a managed build, this field will be null. + /// + public string ContainerRunCommand; + /// + /// The time the build was created in UTC. + /// + public DateTime? CreationTime; + /// + /// The custom game container image for a custom build. + /// + public ContainerImageReference CustomGameContainerImage; + /// + /// The game assets for the build. + /// + public List GameAssetReferences; + /// + /// The game certificates for the build. + /// + public List GameCertificateReferences; + /// + /// The instrumentation configuration of the build. + /// + public InstrumentationConfiguration InstrumentationConfiguration; + /// + /// Metadata of the build. The keys are case insensitive. The build metadata is made available to the server through Game + /// Server SDK (GSDK). + /// + public Dictionary Metadata; + /// + /// The number of multiplayer servers to hosted on a single VM of the build. + /// + public int MultiplayerServerCountPerVm; + /// + /// The OS platform used for running the game process. + /// + public string OsPlatform; + /// + /// The ports the build is mapped on. + /// + public List Ports; + /// + /// The region configuration for the build. + /// + public List RegionConfigurations; + /// + /// The resource constraints to apply to each server on the VM. + /// + public ServerResourceConstraintParams ServerResourceConstraints; + /// + /// The type of game server being hosted. + /// + public string ServerType; + /// + /// The command to run when the multiplayer server has been allocated, including any arguments. This only applies to managed + /// builds. If the build is a custom build, this field will be null. + /// + public string StartMultiplayerServerCommand; + /// + /// The VM size the build was created on. + /// + public AzureVmSize? VmSize; + /// + /// The configuration for the VmStartupScript feature for the build + /// + public VmStartupScriptConfiguration VmStartupScriptConfiguration; + } + + /// + /// Gets credentials to the container registry where game developers can upload custom container images to before creating a + /// new build. + /// + [Serializable] + public class GetContainerRegistryCredentialsRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + [Serializable] + public class GetContainerRegistryCredentialsResponse : PlayFabResultCommon + { + /// + /// The url of the container registry. + /// + public string DnsName; + /// + /// The password for accessing the container registry. + /// + public string Password; + /// + /// The username for accessing the container registry. + /// + public string Username; + } + + /// + /// Request to get a lobby. + /// + [Serializable] + public class GetLobbyRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The id of the lobby. + /// + public string LobbyId; + } + + [Serializable] + public class GetLobbyResult : PlayFabResultCommon + { + /// + /// The information pertaining to the requested lobby. + /// + public Lobby Lobby; + } + + /// + /// Gets the current configuration for a queue. + /// + [Serializable] + public class GetMatchmakingQueueRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The Id of the matchmaking queue to retrieve. + /// + public string QueueName; + } + + [Serializable] + public class GetMatchmakingQueueResult : PlayFabResultCommon + { + /// + /// The matchmaking queue config. + /// + public MatchmakingQueueConfig MatchmakingQueue; + } + + /// + /// The ticket includes the invited players, their attributes if they have joined, the ticket status, the match Id when + /// applicable, etc. Only servers, the ticket creator and the invited players can get the ticket. + /// + [Serializable] + public class GetMatchmakingTicketRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Determines whether the matchmaking attributes will be returned as an escaped JSON string or as an un-escaped JSON + /// object. + /// + public bool EscapeObject; + /// + /// The name of the queue to find a match for. + /// + public string QueueName; + /// + /// The Id of the ticket to find a match for. + /// + public string TicketId; + } + + [Serializable] + public class GetMatchmakingTicketResult : PlayFabResultCommon + { + /// + /// The reason why the current ticket was canceled. This field is only set if the ticket is in canceled state. Please retry + /// if CancellationReason is RetryRequired. + /// + public string CancellationReasonString; + /// + /// Change number used for differentiating older matchmaking status updates from newer ones. + /// + public uint? ChangeNumber; + /// + /// The server date and time at which ticket was created. + /// + public DateTime Created; + /// + /// The Creator's entity key. + /// + public EntityKey Creator; + /// + /// How long to attempt matching this ticket in seconds. + /// + public int GiveUpAfterSeconds; + /// + /// The Id of a match. + /// + public string MatchId; + /// + /// A list of Users that have joined this ticket. + /// + public List Members; + /// + /// A list of PlayFab Ids of Users to match with. + /// + public List MembersToMatchWith; + /// + /// The Id of a match queue. + /// + public string QueueName; + /// + /// The current ticket status. Possible values are: WaitingForPlayers, WaitingForMatch, WaitingForServer, Canceled and + /// Matched. + /// + public string Status; + /// + /// The Id of the ticket to find a match for. + /// + public string TicketId; + } + + /// + /// When matchmaking has successfully matched together a collection of tickets, it produces a 'match' with an Id. The match + /// contains all of the players that were matched together, and their team assigments. Only servers and ticket members can + /// get the match. + /// + [Serializable] + public class GetMatchRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Determines whether the matchmaking attributes will be returned as an escaped JSON string or as an un-escaped JSON + /// object. + /// + public bool EscapeObject; + /// + /// The Id of a match. + /// + public string MatchId; + /// + /// The name of the queue to join. + /// + public string QueueName; + /// + /// Determines whether the matchmaking attributes for each user should be returned in the response for match request. + /// + public bool ReturnMemberAttributes; + } + + [Serializable] + public class GetMatchResult : PlayFabResultCommon + { + /// + /// A string that is used by players that are matched together to join an arranged lobby. + /// + public string ArrangementString; + /// + /// The Id of a match. + /// + public string MatchId; + /// + /// A list of Users that are matched together, along with their team assignments. + /// + public List Members; + /// + /// A list of regions that the match could be played in sorted by preference. This value is only set if the queue has a + /// region selection rule. + /// + public List RegionPreferences; + /// + /// The details of the server that the match has been allocated to. + /// + public ServerDetails ServerDetails; + } + + /// + /// Gets multiplayer server session details for a build in a specific region. + /// + [Serializable] + public class GetMultiplayerServerDetailsRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The title generated guid string session ID of the multiplayer server to get details for. This is to keep track of + /// multiplayer server sessions. + /// + public string SessionId; + } + + [Serializable] + public class GetMultiplayerServerDetailsResponse : PlayFabResultCommon + { + /// + /// The identity of the build in which the server was allocated. + /// + public string BuildId; + /// + /// The connected players in the multiplayer server. + /// + public List ConnectedPlayers; + /// + /// The fully qualified domain name of the virtual machine that is hosting this multiplayer server. + /// + public string FQDN; + /// + /// The public IPv4 address of the virtual machine that is hosting this multiplayer server. + /// + public string IPV4Address; + /// + /// The time (UTC) at which a change in the multiplayer server state was observed. + /// + public DateTime? LastStateTransitionTime; + /// + /// The ports the multiplayer server uses. + /// + public List Ports; + /// + /// The list of public Ipv4 addresses associated with the server. + /// + public List PublicIPV4Addresses; + /// + /// The region the multiplayer server is located in. + /// + public string Region; + /// + /// The string server ID of the multiplayer server generated by PlayFab. + /// + public string ServerId; + /// + /// The guid string session ID of the multiplayer server. + /// + public string SessionId; + /// + /// The state of the multiplayer server. + /// + public string State; + /// + /// The virtual machine ID that the multiplayer server is located on. + /// + public string VmId; + } + + /// + /// Gets multiplayer server logs for a specific server id in a region. The logs are available only after a server has + /// terminated. + /// + [Serializable] + public class GetMultiplayerServerLogsRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The server ID of multiplayer server to get logs for. + /// + public string ServerId; + } + + [Serializable] + public class GetMultiplayerServerLogsResponse : PlayFabResultCommon + { + /// + /// URL for logs download. + /// + public string LogDownloadUrl; + } + + /// + /// Gets multiplayer server logs for a specific server id in a region. The logs are available only after a server has + /// terminated. + /// + [Serializable] + public class GetMultiplayerSessionLogsBySessionIdRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The server ID of multiplayer server to get logs for. + /// + public string SessionId; + } + + /// + /// Returns the matchmaking statistics for a queue. These include the number of players matching and the statistics related + /// to the time to match statistics in seconds (average and percentiles). Statistics are refreshed once every 5 minutes. + /// Servers can access all statistics no matter what the ClientStatisticsVisibility is configured to. Clients can access + /// statistics according to the ClientStatisticsVisibility. Client requests are forbidden if all visibility fields are + /// false. + /// + [Serializable] + public class GetQueueStatisticsRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The name of the queue. + /// + public string QueueName; + } + + [Serializable] + public class GetQueueStatisticsResult : PlayFabResultCommon + { + /// + /// The current number of players in the matchmaking queue, who are waiting to be matched. + /// + public uint? NumberOfPlayersMatching; + /// + /// Statistics representing the time (in seconds) it takes for tickets to find a match. + /// + public Statistics TimeToMatchStatisticsInSeconds; + } + + /// + /// Gets a remote login endpoint to a VM that is hosting a multiplayer server build in a specific region. + /// + [Serializable] + public class GetRemoteLoginEndpointRequest : PlayFabRequestCommon + { + /// + /// The guid string build ID of the multiplayer server to get remote login information for. + /// + public string BuildId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The region of the multiplayer server to get remote login information for. + /// + public string Region; + /// + /// The virtual machine ID the multiplayer server is located on. + /// + public string VmId; + } + + [Serializable] + public class GetRemoteLoginEndpointResponse : PlayFabResultCommon + { + /// + /// The remote login IPV4 address of multiplayer server. + /// + public string IPV4Address; + /// + /// The remote login port of multiplayer server. + /// + public int Port; + } + + /// + /// The ticket includes the players, their attributes, their teams, the ticket status, the match Id and the server details + /// when applicable, etc. Only servers can get the ticket. + /// + [Serializable] + public class GetServerBackfillTicketRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Determines whether the matchmaking attributes will be returned as an escaped JSON string or as an un-escaped JSON + /// object. + /// + public bool EscapeObject; + /// + /// The name of the queue to find a match for. + /// + public string QueueName; + /// + /// The Id of the ticket to find a match for. + /// + public string TicketId; + } + + [Serializable] + public class GetServerBackfillTicketResult : PlayFabResultCommon + { + /// + /// The reason why the current ticket was canceled. This field is only set if the ticket is in canceled state. + /// + public string CancellationReasonString; + /// + /// The server date and time at which ticket was created. + /// + public DateTime Created; + /// + /// How long to attempt matching this ticket in seconds. + /// + public int GiveUpAfterSeconds; + /// + /// The Id of a match. + /// + public string MatchId; + /// + /// A list of Users that are part of this ticket, along with their team assignments. + /// + public List Members; + /// + /// The Id of a match queue. + /// + public string QueueName; + /// + /// The details of the server the members are connected to. + /// + public ServerDetails ServerDetails; + /// + /// The current ticket status. Possible values are: WaitingForMatch, Canceled and Matched. + /// + public string Status; + /// + /// The Id of the ticket to find a match for. + /// + public string TicketId; + } + + /// + /// Gets the status of whether a title is enabled for the multiplayer server feature. The enabled status can be + /// Initializing, Enabled, and Disabled. + /// + [Serializable] + public class GetTitleEnabledForMultiplayerServersStatusRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + [Serializable] + public class GetTitleEnabledForMultiplayerServersStatusResponse : PlayFabResultCommon + { + /// + /// The enabled status for the multiplayer server features for the title. + /// + public TitleMultiplayerServerEnabledStatus? Status; + } + + /// + /// Gets a title's server quota change request. + /// + [Serializable] + public class GetTitleMultiplayerServersQuotaChangeRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Id of the change request to get. + /// + public string RequestId; + } + + [Serializable] + public class GetTitleMultiplayerServersQuotaChangeResponse : PlayFabResultCommon + { + /// + /// The change request for this title. + /// + public QuotaChange Change; + } + + /// + /// Gets the quotas for a title in relation to multiplayer servers. + /// + [Serializable] + public class GetTitleMultiplayerServersQuotasRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + [Serializable] + public class GetTitleMultiplayerServersQuotasResponse : PlayFabResultCommon + { + /// + /// The various quotas for multiplayer servers for the title. + /// + public TitleMultiplayerServersQuotas Quotas; + } + + [Serializable] + public class InstrumentationConfiguration : PlayFabBaseModel + { + /// + /// Designates whether windows instrumentation configuration will be enabled for this Build + /// + public bool? IsEnabled; + /// + /// This property is deprecated, use IsEnabled. The list of processes to be monitored on a VM for this build. Providing + /// processes will turn on performance metrics collection for this build. Process names should not include extensions. If + /// the game server process is: GameServer.exe; then, ProcessesToMonitor = [ GameServer ] + /// + public List ProcessesToMonitor; + } + + /// + /// Request to invite a player to a lobby the caller is already a member of. Only a client can invite another player to a + /// lobby. + /// + [Serializable] + public class InviteToLobbyRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity invited to the lobby. + /// + public EntityKey InviteeEntity; + /// + /// The id of the lobby. + /// + public string LobbyId; + /// + /// The member entity sending the invite. Must be a member of the lobby. + /// + public EntityKey MemberEntity; + } + + /// + /// Request to join an arranged lobby. Only a client can join an arranged lobby. + /// + [Serializable] + public class JoinArrangedLobbyRequest : PlayFabRequestCommon + { + /// + /// The policy indicating who is allowed to join the lobby, and the visibility to queries. May be 'Public', 'Friends' or + /// 'Private'. Public means the lobby is both visible in queries and any player may join, including invited players. Friends + /// means that users who are bidirectional friends of members in the lobby may search to find friend lobbies, to retrieve + /// its connection string. Private means the lobby is not visible in queries, and a player must receive an invitation to + /// join. Defaults to 'Public' on creation. Can only be changed by the lobby owner. + /// + public AccessPolicy? AccessPolicy; + /// + /// A field which indicates which lobby the user will be joining. This field is opaque to everyone except the Lobby service + /// and the creator of the arrangementString (Matchmaking). This string defines a unique identifier for the arranged lobby + /// as well as the title and member the string is valid for. Arrangement strings have an expiration. + /// + public string ArrangementString; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The maximum number of players allowed in the lobby. The value must be between 2 and 128. + /// + public uint MaxPlayers; + /// + /// The private key-value pairs used by the member to communicate information to other members and the owner. Visible to all + /// entities in the lobby. At most 30 key-value pairs may be stored here, keys are limited to 30 characters and values to + /// 1000. The total size of all memberData values may not exceed 4096 bytes. Keys are case sensitive. + /// + public Dictionary MemberData; + /// + /// The member entity who is joining the lobby. The first member to join will be the lobby owner. + /// + public EntityKey MemberEntity; + /// + /// The policy for how a new owner is chosen. May be 'Automatic', 'Manual' or 'None'. Can only be specified by clients. If + /// client-owned and 'Automatic' - The Lobby service will automatically assign another connected owner when the current + /// owner leaves or disconnects. The useConnections property must be true. If client - owned and 'Manual' - Ownership is + /// protected as long as the current owner is connected. If the current owner leaves or disconnects any member may set + /// themselves as the current owner. The useConnections property must be true. If client-owned and 'None' - Any member can + /// set ownership. The useConnections property can be either true or false. + /// + public OwnerMigrationPolicy? OwnerMigrationPolicy; + /// + /// A setting to control whether connections are used. Defaults to true. When true, notifications are sent to subscribed + /// players, disconnect detection removes connectionHandles, only owner migration policies using connections are allowed, + /// and lobbies must have at least one connected member to be searchable or be a server hosted lobby with a connected + /// server. If false, then notifications are not sent, connections are not allowed, and lobbies do not need connections to + /// be searchable. + /// + public bool UseConnections; + } + + /// + /// Preview: Request to join a lobby as a server. Only callable by a game_server entity and this is restricted to client + /// owned lobbies which are using connections. + /// + [Serializable] + public class JoinLobbyAsServerRequest : PlayFabRequestCommon + { + /// + /// A field which indicates which lobby the game_server will be joining. This field is opaque to everyone except the Lobby + /// service. + /// + public string ConnectionString; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The private key-value pairs which are visible to all entities in the lobby but can only be modified by the joined + /// server.At most 30 key - value pairs may be stored here, keys are limited to 30 characters and values to 1000.The total + /// size of all serverData values may not exceed 4096 bytes. + /// + public Dictionary ServerData; + /// + /// The game_server entity which is joining the Lobby. If a different game_server entity has already joined the request will + /// fail unless the joined entity is disconnected, in which case the incoming game_server entity will replace the + /// disconnected entity. + /// + public EntityKey ServerEntity; + } + + [Serializable] + public class JoinLobbyAsServerResult : PlayFabResultCommon + { + /// + /// Successfully joined lobby's id. + /// + public string LobbyId; + } + + /// + /// Request to join a lobby. Only a client can join a lobby. + /// + [Serializable] + public class JoinLobbyRequest : PlayFabRequestCommon + { + /// + /// A field which indicates which lobby the user will be joining. This field is opaque to everyone except the Lobby service. + /// + public string ConnectionString; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The private key-value pairs used by the member to communicate information to other members and the owner. Visible to all + /// entities in the lobby. At most 30 key-value pairs may be stored here, keys are limited to 30 characters and values to + /// 1000. The total size of all memberData values may not exceed 4096 bytes.Keys are case sensitive. + /// + public Dictionary MemberData; + /// + /// The member entity who is joining the lobby. + /// + public EntityKey MemberEntity; + } + + [Serializable] + public class JoinLobbyResult : PlayFabResultCommon + { + /// + /// Successfully joined lobby's id. + /// + public string LobbyId; + } + + /// + /// Add the player to a matchmaking ticket and specify all of its matchmaking attributes. Players can join a ticket if and + /// only if their EntityKeys are already listed in the ticket's Members list. The matchmaking service automatically starts + /// matching the ticket against other matchmaking tickets once all players have joined the ticket. It is not possible to + /// join a ticket once it has started matching. + /// + [Serializable] + public class JoinMatchmakingTicketRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The User who wants to join the ticket. Their Id must be listed in PlayFabIdsToMatchWith. + /// + public MatchmakingPlayer Member; + /// + /// The name of the queue to join. + /// + public string QueueName; + /// + /// The Id of the ticket to find a match for. + /// + public string TicketId; + } + + [Serializable] + public class JoinMatchmakingTicketResult : PlayFabResultCommon + { + } + + /// + /// Preview: Request for server to leave a lobby. Only a game_server entity can leave and this is restricted to client owned + /// lobbies which are using connections. + /// + [Serializable] + public class LeaveLobbyAsServerRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The id of the lobby. + /// + public string LobbyId; + /// + /// The game_server entity leaving the lobby. If the game_server was subscribed to notifications, it will be unsubscribed. + /// If a the given game_server entity is not in the lobby, it will fail. + /// + public EntityKey ServerEntity; + } + + /// + /// Request to leave a lobby. Only a client can leave a lobby. + /// + [Serializable] + public class LeaveLobbyRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The id of the lobby. + /// + public string LobbyId; + /// + /// The member entity leaving the lobby. + /// + public EntityKey MemberEntity; + } + + [Serializable] + public class LinearDifferenceRuleExpansion : PlayFabBaseModel + { + /// + /// This value gets added to Difference at every expansion interval. + /// + public double Delta; + /// + /// Once the total difference reaches this value, expansion stops. Optional. + /// + public double? Limit; + /// + /// How many seconds before this rule is expanded. + /// + public uint SecondsBetweenExpansions; + } + + [Serializable] + public class LinearRegionSelectionRuleExpansion : PlayFabBaseModel + { + /// + /// This value gets added to MaxLatency at every expansion interval. + /// + public uint Delta; + /// + /// Once the max Latency reaches this value, expansion stops. + /// + public uint Limit; + /// + /// How many seconds before this rule is expanded. + /// + public uint SecondsBetweenExpansions; + } + + [Serializable] + public class LinearSetIntersectionRuleExpansion : PlayFabBaseModel + { + /// + /// This value gets added to MinIntersectionSize at every expansion interval. + /// + public uint Delta; + /// + /// How many seconds before this rule is expanded. + /// + public uint SecondsBetweenExpansions; + } + + [Serializable] + public class LinearTeamDifferenceRuleExpansion : PlayFabBaseModel + { + /// + /// This value gets added to Difference at every expansion interval. + /// + public double Delta; + /// + /// Once the total difference reaches this value, expansion stops. Optional. + /// + public double? Limit; + /// + /// How many seconds before this rule is expanded. + /// + public uint SecondsBetweenExpansions; + } + + [Serializable] + public class LinearTeamSizeBalanceRuleExpansion : PlayFabBaseModel + { + /// + /// This value gets added to Difference at every expansion interval. + /// + public uint Delta; + /// + /// Once the total difference reaches this value, expansion stops. Optional. + /// + public uint? Limit; + /// + /// How many seconds before this rule is expanded. + /// + public uint SecondsBetweenExpansions; + } + + [Serializable] + public class LinuxInstrumentationConfiguration : PlayFabBaseModel + { + /// + /// Designates whether Linux instrumentation configuration will be enabled for this Build + /// + public bool IsEnabled; + } + + /// + /// Returns a list of multiplayer server game asset summaries for a title. + /// + [Serializable] + public class ListAssetSummariesRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The page size for the request. + /// + public int? PageSize; + /// + /// The skip token for the paged request. + /// + public string SkipToken; + } + + [Serializable] + public class ListAssetSummariesResponse : PlayFabResultCommon + { + /// + /// The list of asset summaries. + /// + public List AssetSummaries; + /// + /// The page size on the response. + /// + public int PageSize; + /// + /// The skip token for the paged response. + /// + public string SkipToken; + } + + /// + /// Returns a list of summarized details of all multiplayer server builds for a title. + /// + [Serializable] + public class ListBuildAliasesRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The page size for the request. + /// + public int? PageSize; + /// + /// The skip token for the paged request. + /// + public string SkipToken; + } + + [Serializable] + public class ListBuildAliasesResponse : PlayFabResultCommon + { + /// + /// The list of build aliases for the title + /// + public List BuildAliases; + /// + /// The page size on the response. + /// + public int PageSize; + /// + /// The skip token for the paged response. + /// + public string SkipToken; + } + + /// + /// Returns a list of summarized details of all multiplayer server builds for a title. + /// + [Serializable] + public class ListBuildSummariesRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The page size for the request. + /// + public int? PageSize; + /// + /// The skip token for the paged request. + /// + public string SkipToken; + } + + [Serializable] + public class ListBuildSummariesResponse : PlayFabResultCommon + { + /// + /// The list of build summaries for a title. + /// + public List BuildSummaries; + /// + /// The page size on the response. + /// + public int PageSize; + /// + /// The skip token for the paged response. + /// + public string SkipToken; + } + + /// + /// Returns a list of multiplayer server game certificates for a title. + /// + [Serializable] + public class ListCertificateSummariesRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The page size for the request. + /// + public int? PageSize; + /// + /// The skip token for the paged request. + /// + public string SkipToken; + } + + [Serializable] + public class ListCertificateSummariesResponse : PlayFabResultCommon + { + /// + /// The list of game certificates. + /// + public List CertificateSummaries; + /// + /// The page size on the response. + /// + public int PageSize; + /// + /// The skip token for the paged response. + /// + public string SkipToken; + } + + /// + /// Returns a list of the container images that have been uploaded to the container registry for a title. + /// + [Serializable] + public class ListContainerImagesRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The page size for the request. + /// + public int? PageSize; + /// + /// The skip token for the paged request. + /// + public string SkipToken; + } + + [Serializable] + public class ListContainerImagesResponse : PlayFabResultCommon + { + /// + /// The list of container images. + /// + public List Images; + /// + /// The page size on the response. + /// + public int PageSize; + /// + /// The skip token for the paged response. + /// + public string SkipToken; + } + + /// + /// Returns a list of the tags for a particular container image that exists in the container registry for a title. + /// + [Serializable] + public class ListContainerImageTagsRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The container images we want to list tags for. + /// + public string ImageName; + /// + /// The page size for the request. + /// + public int? PageSize; + /// + /// The skip token for the paged request. + /// + public string SkipToken; + } + + [Serializable] + public class ListContainerImageTagsResponse : PlayFabResultCommon + { + /// + /// The page size on the response. + /// + public int PageSize; + /// + /// The skip token for the paged response. + /// + public string SkipToken; + /// + /// The list of tags for a particular container image. + /// + public List Tags; + } + + /// + /// Gets a list of all the matchmaking queue configurations for the title. + /// + [Serializable] + public class ListMatchmakingQueuesRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + [Serializable] + public class ListMatchmakingQueuesResult : PlayFabResultCommon + { + /// + /// The list of matchmaking queue configs for this title. + /// + public List MatchMakingQueues; + } + + /// + /// If the caller is a title, the EntityKey in the request is required. If the caller is a player, then it is optional. If + /// it is provided it must match the caller's entity. + /// + [Serializable] + public class ListMatchmakingTicketsForPlayerRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity key for which to find the ticket Ids. + /// + public EntityKey Entity; + /// + /// The name of the queue to find a match for. + /// + public string QueueName; + } + + [Serializable] + public class ListMatchmakingTicketsForPlayerResult : PlayFabResultCommon + { + /// + /// The list of ticket Ids the user is a member of. + /// + public List TicketIds; + } + + /// + /// Returns a list of multiplayer servers for a build in a specific region. + /// + [Serializable] + public class ListMultiplayerServersRequest : PlayFabRequestCommon + { + /// + /// The guid string build ID of the multiplayer servers to list. + /// + public string BuildId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The page size for the request. + /// + public int? PageSize; + /// + /// The region the multiplayer servers to list. + /// + public string Region; + /// + /// The skip token for the paged request. + /// + public string SkipToken; + } + + [Serializable] + public class ListMultiplayerServersResponse : PlayFabResultCommon + { + /// + /// The list of multiplayer server summary details. + /// + public List MultiplayerServerSummaries; + /// + /// The page size on the response. + /// + public int PageSize; + /// + /// The skip token for the paged response. + /// + public string SkipToken; + } + + /// + /// Returns a list of quality of service servers for party. + /// + [Serializable] + public class ListPartyQosServersRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + [Serializable] + public class ListPartyQosServersResponse : PlayFabResultCommon + { + /// + /// The page size on the response. + /// + public int PageSize; + /// + /// The list of QoS servers. + /// + public List QosServers; + /// + /// The skip token for the paged response. + /// + public string SkipToken; + } + + /// + /// Returns a list of quality of service servers for a title. + /// + [Serializable] + public class ListQosServersForTitleRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Indicates that the response should contain Qos servers for all regions, including those where there are no builds + /// deployed for the title. + /// + public bool? IncludeAllRegions; + /// + /// Indicates the Routing Preference used by the Qos servers. The default Routing Preference is Microsoft + /// + public string RoutingPreference; + } + + [Serializable] + public class ListQosServersForTitleResponse : PlayFabResultCommon + { + /// + /// The page size on the response. + /// + public int PageSize; + /// + /// The list of QoS servers. + /// + public List QosServers; + /// + /// The skip token for the paged response. + /// + public string SkipToken; + } + + /// + /// Returns a list of multiplayer server game secrets for a title. + /// + [Serializable] + public class ListSecretSummariesRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The page size for the request. + /// + public int? PageSize; + /// + /// The skip token for the paged request. + /// + public string SkipToken; + } + + [Serializable] + public class ListSecretSummariesResponse : PlayFabResultCommon + { + /// + /// The page size on the response. + /// + public int PageSize; + /// + /// The list of game secret. + /// + public List SecretSummaries; + /// + /// The skip token for the paged response. + /// + public string SkipToken; + } + + /// + /// List all server backfill ticket Ids the user is a member of. + /// + [Serializable] + public class ListServerBackfillTicketsForPlayerRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity key for which to find the ticket Ids. + /// + public EntityKey Entity; + /// + /// The name of the queue the tickets are in. + /// + public string QueueName; + } + + [Serializable] + public class ListServerBackfillTicketsForPlayerResult : PlayFabResultCommon + { + /// + /// The list of backfill ticket Ids the user is a member of. + /// + public List TicketIds; + } + + /// + /// List all server quota change requests for a title. + /// + [Serializable] + public class ListTitleMultiplayerServersQuotaChangesRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + [Serializable] + public class ListTitleMultiplayerServersQuotaChangesResponse : PlayFabResultCommon + { + /// + /// All change requests for this title. + /// + public List Changes; + } + + /// + /// Returns a list of virtual machines for a title. + /// + [Serializable] + public class ListVirtualMachineSummariesRequest : PlayFabRequestCommon + { + /// + /// The guid string build ID of the virtual machines to list. + /// + public string BuildId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The page size for the request. + /// + public int? PageSize; + /// + /// The region of the virtual machines to list. + /// + public string Region; + /// + /// The skip token for the paged request. + /// + public string SkipToken; + } + + [Serializable] + public class ListVirtualMachineSummariesResponse : PlayFabResultCommon + { + /// + /// The page size on the response. + /// + public int PageSize; + /// + /// The skip token for the paged response. + /// + public string SkipToken; + /// + /// The list of virtual machine summaries. + /// + public List VirtualMachines; + } + + [Serializable] + public class Lobby : PlayFabBaseModel + { + /// + /// A setting indicating who is allowed to join this lobby, as well as see it in queries. + /// + public AccessPolicy AccessPolicy; + /// + /// A number that increments once for each request that modifies the lobby. + /// + public uint ChangeNumber; + /// + /// A string used to join the lobby. This field is populated by the Lobby service. Invites are performed by communicating + /// this connectionString to other players. + /// + public string ConnectionString; + /// + /// Lobby data. + /// + public Dictionary LobbyData; + /// + /// Id to uniquely identify a lobby. + /// + public string LobbyId; + /// + /// The maximum number of players allowed in the lobby. + /// + public uint MaxPlayers; + /// + /// Array of all lobby members. + /// + public List Members; + /// + /// A setting indicating whether members are allowed to join this lobby. When Locked new members are prevented from joining. + /// + public MembershipLock MembershipLock; + /// + /// The client or server entity which owns this lobby. + /// + public EntityKey Owner; + /// + /// A setting indicating the owner migration policy. If server owned, this field is not present. + /// + public OwnerMigrationPolicy? OwnerMigrationPolicy; + /// + /// An opaque string stored on a SubscribeToLobbyResource call, which indicates the connection an owner or member has with + /// PubSub. + /// + public string PubSubConnectionHandle; + /// + /// Search data. + /// + public Dictionary SearchData; + /// + /// Preview: Lobby joined server. This is not the server owner, rather the server that has joined a client owned lobby. + /// + public LobbyServer Server; + /// + /// A flag which determines if connections are used. Defaults to true. Only set on create. + /// + public bool UseConnections; + } + + [Serializable] + public class LobbyEmptyResult : PlayFabResultCommon + { + } + + [Serializable] + public class LobbyServer : PlayFabBaseModel + { + /// + /// Opaque string, stored on a Subscribe call, which indicates the connection a joined server has with PubSub. + /// + public string PubSubConnectionHandle; + /// + /// Key-value pairs specific to the joined server. + /// + public Dictionary ServerData; + /// + /// The server entity key. + /// + public EntityKey ServerEntity; + } + + [Serializable] + public class LobbySummary : PlayFabBaseModel + { + /// + /// A string used to join the lobby.This field is populated by the Lobby service.Invites are performed by communicating this + /// connectionString to other players. + /// + public string ConnectionString; + /// + /// The current number of players in the lobby. + /// + public uint CurrentPlayers; + /// + /// Id to uniquely identify a lobby. + /// + public string LobbyId; + /// + /// The maximum number of players allowed in the lobby. + /// + public uint MaxPlayers; + /// + /// A setting indicating whether members are allowed to join this lobby. When Locked new members are prevented from joining. + /// + public MembershipLock? MembershipLock; + /// + /// The client or server entity which owns this lobby. + /// + public EntityKey Owner; + /// + /// Search data. + /// + public Dictionary SearchData; + } + + /// + /// A user in a matchmaking ticket. + /// + [Serializable] + public class MatchmakingPlayer : PlayFabBaseModel + { + /// + /// The user's attributes custom to the title. + /// + public MatchmakingPlayerAttributes Attributes; + /// + /// The entity key of the matchmaking user. + /// + public EntityKey Entity; + } + + /// + /// The matchmaking attributes for a user. + /// + [Serializable] + public class MatchmakingPlayerAttributes : PlayFabBaseModel + { + /// + /// A data object representing a user's attributes. + /// + public object DataObject; + /// + /// An escaped data object representing a user's attributes. + /// + public string EscapedDataObject; + } + + /// + /// A player in a created matchmaking match with a team assignment. + /// + [Serializable] + public class MatchmakingPlayerWithTeamAssignment : PlayFabBaseModel + { + /// + /// The user's attributes custom to the title. These attributes will be null unless the request has ReturnMemberAttributes + /// flag set to true. + /// + public MatchmakingPlayerAttributes Attributes; + /// + /// The entity key of the matchmaking user. + /// + public EntityKey Entity; + /// + /// The Id of the team the User is assigned to. + /// + public string TeamId; + } + + [Serializable] + public class MatchmakingQueueConfig : PlayFabBaseModel + { + /// + /// This is the buildAlias that will be used to allocate the multiplayer server for the match. + /// + public BuildAliasParams BuildAliasParams; + /// + /// This is the buildId that will be used to allocate the multiplayer server for the match. + /// + public string BuildId; + /// + /// List of difference rules used to find an optimal match. + /// + public List DifferenceRules; + /// + /// List of match total rules used to find an optimal match. + /// + public List MatchTotalRules; + /// + /// Maximum number of players in a match. + /// + public uint MaxMatchSize; + /// + /// Maximum number of players in a ticket. Optional. + /// + public uint? MaxTicketSize; + /// + /// Minimum number of players in a match. + /// + public uint MinMatchSize; + /// + /// Unique identifier for a Queue. Chosen by the developer. + /// + public string Name; + /// + /// Region selection rule used to find an optimal match. + /// + public RegionSelectionRule RegionSelectionRule; + /// + /// Boolean flag to enable server allocation for the queue. + /// + public bool ServerAllocationEnabled; + /// + /// List of set intersection rules used to find an optimal match. + /// + public List SetIntersectionRules; + /// + /// Controls which statistics are visible to players. + /// + public StatisticsVisibilityToPlayers StatisticsVisibilityToPlayers; + /// + /// List of string equality rules used to find an optimal match. + /// + public List StringEqualityRules; + /// + /// List of team difference rules used to find an optimal match. + /// + public List TeamDifferenceRules; + /// + /// The team configuration for a match. This may be null if there are no teams. + /// + public List Teams; + /// + /// Team size balance rule used to find an optimal match. + /// + public TeamSizeBalanceRule TeamSizeBalanceRule; + /// + /// Team ticket size similarity rule used to find an optimal match. + /// + public TeamTicketSizeSimilarityRule TeamTicketSizeSimilarityRule; + } + + [Serializable] + public class MatchmakingQueueTeam : PlayFabBaseModel + { + /// + /// The maximum number of players required for the team. + /// + public uint MaxTeamSize; + /// + /// The minimum number of players required for the team. + /// + public uint MinTeamSize; + /// + /// A name to identify the team. This is case insensitive. + /// + public string Name; + } + + [Serializable] + public class MatchTotalRule : PlayFabBaseModel + { + /// + /// Description of the attribute used by this rule to match tickets. + /// + public QueueRuleAttribute Attribute; + /// + /// Collection of fields relating to expanding this rule at set intervals. + /// + public MatchTotalRuleExpansion Expansion; + /// + /// The maximum total value for a group. Must be >= Min. + /// + public double Max; + /// + /// The minimum total value for a group. Must be >=2. + /// + public double Min; + /// + /// Friendly name chosen by developer. + /// + public string Name; + /// + /// How many seconds before this rule is no longer enforced (but tickets that comply with this rule will still be + /// prioritized over those that don't). Leave blank if this rule is always enforced. + /// + public uint? SecondsUntilOptional; + /// + /// The relative weight of this rule compared to others. + /// + public double Weight; + } + + [Serializable] + public class MatchTotalRuleExpansion : PlayFabBaseModel + { + /// + /// Manually specify the values to use for each expansion interval. When this is set, Max is ignored. + /// + public List MaxOverrides; + /// + /// Manually specify the values to use for each expansion interval. When this is set, Min is ignored. + /// + public List MinOverrides; + /// + /// How many seconds before this rule is expanded. + /// + public uint SecondsBetweenExpansions; + } + + [Serializable] + public class Member : PlayFabBaseModel + { + /// + /// Key-value pairs specific to member. + /// + public Dictionary MemberData; + /// + /// The member entity key. + /// + public EntityKey MemberEntity; + /// + /// Opaque string, stored on a Subscribe call, which indicates the connection an owner or member has with PubSub. + /// + public string PubSubConnectionHandle; + } + + public enum MembershipLock + { + Unlocked, + Locked + } + + [Serializable] + public class MonitoringApplicationConfiguration : PlayFabBaseModel + { + /// + /// Asset which contains the monitoring application files and scripts. + /// + public AssetReference AssetReference; + /// + /// Execution script name, this will be the main executable for the monitoring application. + /// + public string ExecutionScriptName; + /// + /// Installation script name, this will be run before the ExecutionScript. + /// + public string InstallationScriptName; + /// + /// Timespan the monitoring application will be kept alive when running from the start of the VM + /// + public double? OnStartRuntimeInMinutes; + } + + [Serializable] + public class MonitoringApplicationConfigurationParams : PlayFabBaseModel + { + /// + /// Asset which contains the monitoring application files and scripts. + /// + public AssetReferenceParams AssetReference; + /// + /// Execution script name, this will be the main executable for the monitoring application. + /// + public string ExecutionScriptName; + /// + /// Installation script name, this will be run before the ExecutionScript. + /// + public string InstallationScriptName; + /// + /// Timespan the monitoring application will be kept alive when running from the start of the VM + /// + public double? OnStartRuntimeInMinutes; + } + + [Serializable] + public class MultiplayerServerSummary : PlayFabBaseModel + { + /// + /// The connected players in the multiplayer server. + /// + public List ConnectedPlayers; + /// + /// The time (UTC) at which a change in the multiplayer server state was observed. + /// + public DateTime? LastStateTransitionTime; + /// + /// The region the multiplayer server is located in. + /// + public string Region; + /// + /// The string server ID of the multiplayer server generated by PlayFab. + /// + public string ServerId; + /// + /// The title generated guid string session ID of the multiplayer server. + /// + public string SessionId; + /// + /// The state of the multiplayer server. + /// + public string State; + /// + /// The virtual machine ID that the multiplayer server is located on. + /// + public string VmId; + } + + public enum OsPlatform + { + Windows, + Linux + } + + [Serializable] + public class OverrideDouble : PlayFabBaseModel + { + /// + /// The custom expansion value. + /// + public double Value; + } + + [Serializable] + public class OverrideUnsignedInt : PlayFabBaseModel + { + /// + /// The custom expansion value. + /// + public uint Value; + } + + public enum OwnerMigrationPolicy + { + None, + Automatic, + Manual, + Server + } + + [Serializable] + public class PaginationRequest : PlayFabBaseModel + { + /// + /// Continuation token returned as a result in a previous FindLobbies call. Cannot be specified by clients. + /// + public string ContinuationToken; + /// + /// The number of lobbies that should be retrieved. Cannot be specified by servers, clients may specify any value up to 50 + /// + public uint? PageSizeRequested; + } + + [Serializable] + public class PaginationResponse : PlayFabBaseModel + { + /// + /// Continuation token returned by server call. Not returned for clients + /// + public string ContinuationToken; + /// + /// The number of lobbies that matched the search request. + /// + public uint? TotalMatchedLobbyCount; + } + + [Serializable] + public class PartyInvitationConfiguration : PlayFabBaseModel + { + /// + /// The list of PlayFab EntityKeys that the invitation allows to authenticate into the network. If this list is empty, all + /// users are allowed to authenticate using the invitation's identifier. This list may contain no more than 1024 items. + /// + public List EntityKeys; + /// + /// The invite identifier for this party. If this value is specified, it must be no longer than 127 characters. + /// + public string Identifier; + /// + /// Controls which participants can revoke this invite. + /// + public string Revocability; + } + + public enum PartyInvitationRevocability + { + Creator, + Anyone + } + + [Serializable] + public class PartyNetworkConfiguration : PlayFabBaseModel + { + /// + /// Controls whether and how to support direct peer-to-peer connection attempts among devices in the network. + /// + public string DirectPeerConnectivityOptions; + /// + /// The maximum number of devices allowed to connect to the network. Must be between 1 and 128, inclusive. + /// + public uint MaxDevices; + /// + /// The maximum number of devices allowed per user. Must be greater than 0. + /// + public uint MaxDevicesPerUser; + /// + /// The maximum number of endpoints allowed per device. Must be between 0 and 32, inclusive. + /// + public uint MaxEndpointsPerDevice; + /// + /// The maximum number of unique users allowed in the network. Must be greater than 0. + /// + public uint MaxUsers; + /// + /// The maximum number of users allowed per device. Must be between 1 and 8, inclusive. + /// + public uint MaxUsersPerDevice; + /// + /// An optionally-specified configuration for the initial invitation for this party. If not provided, default configuration + /// values will be used: a title-unique invitation identifier will be generated, the revocability will be Anyone, and the + /// EntityID list will be empty. + /// + public PartyInvitationConfiguration PartyInvitationConfiguration; + } + + [Serializable] + public class Port : PlayFabBaseModel + { + /// + /// The name for the port. + /// + public string Name; + /// + /// The number for the port. + /// + public int Num; + /// + /// The protocol for the port. + /// + public ProtocolType Protocol; + } + + public enum ProtocolType + { + TCP, + UDP + } + + [Serializable] + public class PublicIpAddress : PlayFabBaseModel + { + /// + /// FQDN of the public IP + /// + public string FQDN; + /// + /// Server IP Address + /// + public string IpAddress; + /// + /// Routing Type of the public IP. + /// + public string RoutingType; + } + + [Serializable] + public class QosServer : PlayFabBaseModel + { + /// + /// The region the QoS server is located in. + /// + public string Region; + /// + /// The QoS server URL. + /// + public string ServerUrl; + } + + [Serializable] + public class QueueRuleAttribute : PlayFabBaseModel + { + /// + /// Specifies which attribute in a ticket to use. + /// + public string Path; + /// + /// Specifies which source the attribute comes from. + /// + public AttributeSource Source; + } + + [Serializable] + public class QuotaChange : PlayFabBaseModel + { + /// + /// A brief description of the requested changes. + /// + public string ChangeDescription; + /// + /// Requested changes to make to the titles cores quota. + /// + public List Changes; + /// + /// Whether or not this request is pending a review. + /// + public bool IsPendingReview; + /// + /// Additional information about this request that our team can use to better understand the requirements. + /// + public string Notes; + /// + /// Id of the change request. + /// + public string RequestId; + /// + /// Comments by our team when a request is reviewed. + /// + public string ReviewComments; + /// + /// Whether or not this request was approved. + /// + public bool WasApproved; + } + + [Serializable] + public class RegionSelectionRule : PlayFabBaseModel + { + /// + /// Controls how the Max Latency parameter expands over time. Only one expansion can be set per rule. When this is set, + /// MaxLatency is ignored. + /// + public CustomRegionSelectionRuleExpansion CustomExpansion; + /// + /// Controls how the Max Latency parameter expands over time. Only one expansion can be set per rule. + /// + public LinearRegionSelectionRuleExpansion LinearExpansion; + /// + /// Specifies the maximum latency that is allowed between the client and the selected server. The value is in milliseconds. + /// + public uint MaxLatency; + /// + /// Friendly name chosen by developer. + /// + public string Name; + /// + /// Specifies which attribute in a ticket to use. + /// + public string Path; + /// + /// How many seconds before this rule is no longer enforced (but tickets that comply with this rule will still be + /// prioritized over those that don't). Leave blank if this rule is always enforced. + /// + public uint? SecondsUntilOptional; + /// + /// The relative weight of this rule compared to others. + /// + public double Weight; + } + + /// + /// Deletes the configuration for a queue. This will permanently delete the configuration and players will no longer be able + /// to match in the queue. All outstanding matchmaking tickets will be cancelled. + /// + [Serializable] + public class RemoveMatchmakingQueueRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The Id of the matchmaking queue to remove. + /// + public string QueueName; + } + + [Serializable] + public class RemoveMatchmakingQueueResult : PlayFabResultCommon + { + } + + /// + /// Request to remove a member from a lobby. Owners may remove other members from a lobby. Members cannot remove themselves + /// (use LeaveLobby instead). + /// + [Serializable] + public class RemoveMemberFromLobbyRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The id of the lobby. + /// + public string LobbyId; + /// + /// The member entity to be removed from the lobby. + /// + public EntityKey MemberEntity; + /// + /// If true, removed member can never rejoin this lobby. + /// + public bool PreventRejoin; + } + + /// + /// Requests a multiplayer server session from a particular build in any of the given preferred regions. + /// + [Serializable] + public class RequestMultiplayerServerRequest : PlayFabRequestCommon + { + /// + /// The identifiers of the build alias to use for the request. + /// + public BuildAliasParams BuildAliasParams; + /// + /// The guid string build ID of the multiplayer server to request. + /// + public string BuildId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Initial list of players (potentially matchmade) allowed to connect to the game. This list is passed to the game server + /// when requested (via GSDK) and can be used to validate players connecting to it. + /// + public List InitialPlayers; + /// + /// The preferred regions to request a multiplayer server from. The Multiplayer Service will iterate through the regions in + /// the specified order and allocate a server from the first one that has servers available. + /// + public List PreferredRegions; + /// + /// Data encoded as a string that is passed to the game server when requested. This can be used to to communicate + /// information such as game mode or map through the request flow. + /// + public string SessionCookie; + /// + /// A guid string session ID created track the multiplayer server session over its life. + /// + public string SessionId; + } + + [Serializable] + public class RequestMultiplayerServerResponse : PlayFabResultCommon + { + /// + /// The identity of the build in which the server was allocated. + /// + public string BuildId; + /// + /// The connected players in the multiplayer server. + /// + public List ConnectedPlayers; + /// + /// The fully qualified domain name of the virtual machine that is hosting this multiplayer server. + /// + public string FQDN; + /// + /// The public IPv4 address of the virtual machine that is hosting this multiplayer server. + /// + public string IPV4Address; + /// + /// The time (UTC) at which a change in the multiplayer server state was observed. + /// + public DateTime? LastStateTransitionTime; + /// + /// The ports the multiplayer server uses. + /// + public List Ports; + /// + /// The list of public Ipv4 addresses associated with the server. + /// + public List PublicIPV4Addresses; + /// + /// The region the multiplayer server is located in. + /// + public string Region; + /// + /// The string server ID of the multiplayer server generated by PlayFab. + /// + public string ServerId; + /// + /// The guid string session ID of the multiplayer server. + /// + public string SessionId; + /// + /// The state of the multiplayer server. + /// + public string State; + /// + /// The virtual machine ID that the multiplayer server is located on. + /// + public string VmId; + } + + /// + /// Requests a party session from a particular set of builds if build alias params is provided, in any of the given + /// preferred regions. + /// + [Serializable] + public class RequestPartyServiceRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The network configuration for this request. + /// + public PartyNetworkConfiguration NetworkConfiguration; + /// + /// A guid string party ID created track the party session over its life. + /// + public string PartyId; + /// + /// The preferred regions to request a party session from. The party service will iterate through the regions in the + /// specified order and allocate a party session from the first one that is available. + /// + public List PreferredRegions; + } + + [Serializable] + public class RequestPartyServiceResponse : PlayFabResultCommon + { + /// + /// The invitation identifier supplied in the PartyInvitationConfiguration, or the PlayFab-generated guid if none was + /// supplied. + /// + public string InvitationId; + /// + /// The guid string party ID of the party session. + /// + public string PartyId; + /// + /// A base-64 encoded string containing the serialized network descriptor for this party. + /// + public string SerializedNetworkDescriptor; + } + + /// + /// Gets new credentials to the container registry where game developers can upload custom container images to before + /// creating a new build. + /// + [Serializable] + public class RolloverContainerRegistryCredentialsRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + [Serializable] + public class RolloverContainerRegistryCredentialsResponse : PlayFabResultCommon + { + /// + /// The url of the container registry. + /// + public string DnsName; + /// + /// The password for accessing the container registry. + /// + public string Password; + /// + /// The username for accessing the container registry. + /// + public string Username; + } + + public enum RoutingType + { + Microsoft, + Internet + } + + [Serializable] + public class Schedule : PlayFabBaseModel + { + /// + /// A short description about this schedule. For example, "Game launch on July 15th". + /// + public string Description; + /// + /// The date and time in UTC at which the schedule ends. If IsRecurringWeekly is true, this schedule will keep renewing for + /// future weeks until disabled or removed. + /// + public DateTime EndTime; + /// + /// Disables the schedule. + /// + public bool IsDisabled; + /// + /// If true, the StartTime and EndTime will get renewed every week. + /// + public bool IsRecurringWeekly; + /// + /// The date and time in UTC at which the schedule starts. + /// + public DateTime StartTime; + /// + /// The standby target to maintain for the duration of the schedule. + /// + public int TargetStandby; + } + + [Serializable] + public class ScheduledStandbySettings : PlayFabBaseModel + { + /// + /// When true, scheduled standby will be enabled + /// + public bool IsEnabled; + /// + /// A list of non-overlapping schedules + /// + public List ScheduleList; + } + + [Serializable] + public class Secret : PlayFabBaseModel + { + /// + /// Optional secret expiration date. + /// + public DateTime? ExpirationDate; + /// + /// A name for the secret. This is used to reference secrets in build configurations. + /// + public string Name; + /// + /// Secret value. + /// + public string Value; + } + + [Serializable] + public class SecretSummary : PlayFabBaseModel + { + /// + /// Optional secret expiration date. + /// + public DateTime? ExpirationDate; + /// + /// The name of the secret. + /// + public string Name; + /// + /// The secret version auto-generated after upload. + /// + public string Version; + } + + [Serializable] + public class ServerDetails : PlayFabBaseModel + { + /// + /// The fully qualified domain name of the virtual machine that is hosting this multiplayer server. + /// + public string Fqdn; + /// + /// The IPv4 address of the virtual machine that is hosting this multiplayer server. + /// + public string IPV4Address; + /// + /// The ports the multiplayer server uses. + /// + public List Ports; + /// + /// The server's region. + /// + public string Region; + /// + /// The string server ID of the multiplayer server generated by PlayFab. + /// + public string ServerId; + } + + [Serializable] + public class ServerResourceConstraintParams : PlayFabBaseModel + { + /// + /// The maximum number of cores that each server is allowed to use. + /// + public double CpuLimit; + /// + /// The maximum number of GiB of memory that each server is allowed to use. WARNING: After exceeding this limit, the server + /// will be killed + /// + public double MemoryLimitGB; + } + + public enum ServerType + { + Container, + Process + } + + [Serializable] + public class SetIntersectionRule : PlayFabBaseModel + { + /// + /// Description of the attribute used by this rule to match tickets. + /// + public QueueRuleAttribute Attribute; + /// + /// Describes the behavior when an attribute is not specified in the ticket creation request or in the user's entity + /// profile. + /// + public AttributeNotSpecifiedBehavior AttributeNotSpecifiedBehavior; + /// + /// Collection of fields relating to expanding this rule at set intervals. Only one expansion can be set per rule. When this + /// is set, MinIntersectionSize is ignored. + /// + public CustomSetIntersectionRuleExpansion CustomExpansion; + /// + /// The default value assigned to tickets that are missing the attribute specified by AttributePath (assuming that + /// AttributeNotSpecifiedBehavior is UseDefault). Values must be unique. + /// + public List DefaultAttributeValue; + /// + /// Collection of fields relating to expanding this rule at set intervals. Only one expansion can be set per rule. + /// + public LinearSetIntersectionRuleExpansion LinearExpansion; + /// + /// The minimum number of values that must match between sets. + /// + public uint MinIntersectionSize; + /// + /// Friendly name chosen by developer. + /// + public string Name; + /// + /// How many seconds before this rule is no longer enforced (but tickets that comply with this rule will still be + /// prioritized over those that don't). Leave blank if this rule is always enforced. + /// + public uint? SecondsUntilOptional; + /// + /// The relative weight of this rule compared to others. + /// + public double Weight; + } + + /// + /// Use this API to create or update matchmaking queue configurations. The queue configuration defines the matchmaking + /// rules. The matchmaking service will match tickets together according to the configured rules. Queue resources are not + /// spun up by calling this API. Queues are created when the first ticket is submitted. + /// + [Serializable] + public class SetMatchmakingQueueRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The matchmaking queue config. + /// + public MatchmakingQueueConfig MatchmakingQueue; + } + + [Serializable] + public class SetMatchmakingQueueResult : PlayFabResultCommon + { + } + + /// + /// Executes the shutdown callback from the GSDK and terminates the multiplayer server session. The callback in the GSDK + /// will allow for graceful shutdown with a 15 minute timeoutIf graceful shutdown has not been completed before 15 minutes + /// have elapsed, the multiplayer server session will be forcefully terminated on it's own. + /// + [Serializable] + public class ShutdownMultiplayerServerRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// A guid string session ID of the multiplayer server to shut down. + /// + public string SessionId; + } + + [Serializable] + public class Statistics : PlayFabBaseModel + { + /// + /// The average. + /// + public double Average; + /// + /// The 50th percentile. + /// + public double Percentile50; + /// + /// The 90th percentile. + /// + public double Percentile90; + /// + /// The 99th percentile. + /// + public double Percentile99; + } + + [Serializable] + public class StatisticsVisibilityToPlayers : PlayFabBaseModel + { + /// + /// Whether to allow players to view the current number of players in the matchmaking queue. + /// + public bool ShowNumberOfPlayersMatching; + /// + /// Whether to allow players to view statistics representing the time it takes for tickets to find a match. + /// + public bool ShowTimeToMatch; + } + + [Serializable] + public class StringEqualityRule : PlayFabBaseModel + { + /// + /// Description of the attribute used by this rule to match tickets. + /// + public QueueRuleAttribute Attribute; + /// + /// Describes the behavior when an attribute is not specified in the ticket creation request or in the user's entity + /// profile. + /// + public AttributeNotSpecifiedBehavior AttributeNotSpecifiedBehavior; + /// + /// The default value assigned to tickets that are missing the attribute specified by AttributePath (assuming that + /// AttributeNotSpecifiedBehavior is false). + /// + public string DefaultAttributeValue; + /// + /// Collection of fields relating to expanding this rule at set intervals. For StringEqualityRules, this is limited to + /// turning the rule off or on during different intervals. + /// + public StringEqualityRuleExpansion Expansion; + /// + /// Friendly name chosen by developer. + /// + public string Name; + /// + /// How many seconds before this rule is no longer enforced (but tickets that comply with this rule will still be + /// prioritized over those that don't). Leave blank if this rule is always enforced. + /// + public uint? SecondsUntilOptional; + /// + /// The relative weight of this rule compared to others. + /// + public double Weight; + } + + [Serializable] + public class StringEqualityRuleExpansion : PlayFabBaseModel + { + /// + /// List of bools specifying whether the rule is applied during this expansion. + /// + public List EnabledOverrides; + /// + /// How many seconds before this rule is expanded. + /// + public uint SecondsBetweenExpansions; + } + + /// + /// Request to subscribe to lobby resource notifications. + /// + [Serializable] + public class SubscribeToLobbyResourceRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity performing the subscription. + /// + public EntityKey EntityKey; + /// + /// Opaque string, given to a client upon creating a connection with PubSub. + /// + public string PubSubConnectionHandle; + /// + /// The name of the resource to subscribe to. + /// + public string ResourceId; + /// + /// Version number for the subscription of this resource. + /// + public uint SubscriptionVersion; + /// + /// Subscription type. + /// + public SubscriptionType Type; + } + + [Serializable] + public class SubscribeToLobbyResourceResult : PlayFabResultCommon + { + /// + /// Topic will be returned in all notifications that are the result of this subscription. + /// + public string Topic; + } + + /// + /// Subscribe to match resource notifications. Match subscriptions have two types; MatchInvite and MatchTicketStatusChange + /// + [Serializable] + public class SubscribeToMatchResourceRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity performing the subscription. The entity must be authorized to use this connectionHandle. + /// + public EntityKey EntityKey; + /// + /// Opaque string, given to a client upon creating a connection with PubSub. Notifications will be sent to the connection + /// associated with this handle. + /// + public string PubSubConnectionHandle; + /// + /// The name of the resource to subscribe to. It follows the format {queueName}|{ticketId} for MatchTicketStatusChange. For + /// MatchInvite, ResourceId is @me. + /// + public string ResourceId; + /// + /// Version number for the subscription of this resource. Current supported version must be 1. + /// + public uint SubscriptionVersion; + /// + /// Subscription type. MatchInvite subscriptions are per-player. MatchTicketStatusChange subscriptions are per-ticket. + /// Subscribe calls are idempotent. Subscribing on the same resource for the same connection results in success. + /// + public string Type; + } + + [Serializable] + public class SubscribeToMatchResourceResult : PlayFabResultCommon + { + /// + /// Matchmaking resource + /// + public string Topic; + } + + public enum SubscriptionType + { + LobbyChange, + LobbyInvite + } + + [Serializable] + public class TeamDifferenceRule : PlayFabBaseModel + { + /// + /// Description of the attribute used by this rule to match teams. + /// + public QueueRuleAttribute Attribute; + /// + /// Collection of fields relating to expanding this rule at set intervals. Only one expansion can be set per rule. When this + /// is set, Difference is ignored. + /// + public CustomTeamDifferenceRuleExpansion CustomExpansion; + /// + /// The default value assigned to tickets that are missing the attribute specified by AttributePath (assuming that + /// AttributeNotSpecifiedBehavior is false). + /// + public double DefaultAttributeValue; + /// + /// The allowed difference between any two teams at the start of matchmaking. + /// + public double Difference; + /// + /// Collection of fields relating to expanding this rule at set intervals. Only one expansion can be set per rule. + /// + public LinearTeamDifferenceRuleExpansion LinearExpansion; + /// + /// Friendly name chosen by developer. + /// + public string Name; + /// + /// How many seconds before this rule is no longer enforced (but tickets that comply with this rule will still be + /// prioritized over those that don't). Leave blank if this rule is always enforced. + /// + public uint? SecondsUntilOptional; + } + + [Serializable] + public class TeamSizeBalanceRule : PlayFabBaseModel + { + /// + /// Controls how the Difference parameter expands over time. Only one expansion can be set per rule. When this is set, + /// Difference is ignored. + /// + public CustomTeamSizeBalanceRuleExpansion CustomExpansion; + /// + /// The allowed difference in team size between any two teams. + /// + public uint Difference; + /// + /// Controls how the Difference parameter expands over time. Only one expansion can be set per rule. + /// + public LinearTeamSizeBalanceRuleExpansion LinearExpansion; + /// + /// Friendly name chosen by developer. + /// + public string Name; + /// + /// How many seconds before this rule is no longer enforced (but tickets that comply with this rule will still be + /// prioritized over those that don't). Leave blank if this rule is always enforced. + /// + public uint? SecondsUntilOptional; + } + + [Serializable] + public class TeamTicketSizeSimilarityRule : PlayFabBaseModel + { + /// + /// Friendly name chosen by developer. + /// + public string Name; + /// + /// How many seconds before this rule is no longer enforced (but tickets that comply with this rule will still be + /// prioritized over those that don't). Leave blank if this rule is always enforced. + /// + public uint? SecondsUntilOptional; + } + + public enum TitleMultiplayerServerEnabledStatus + { + Initializing, + Enabled, + Disabled + } + + [Serializable] + public class TitleMultiplayerServersQuotas : PlayFabBaseModel + { + /// + /// The core capacity for the various regions and VM Family + /// + public List CoreCapacities; + } + + /// + /// Request to unsubscribe from lobby notifications. + /// + [Serializable] + public class UnsubscribeFromLobbyResourceRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity which performed the subscription. + /// + public EntityKey EntityKey; + /// + /// Opaque string, given to a client upon creating a connection with PubSub. + /// + public string PubSubConnectionHandle; + /// + /// The name of the resource to unsubscribe from. + /// + public string ResourceId; + /// + /// Version number passed for the subscription of this resource. + /// + public uint SubscriptionVersion; + /// + /// Subscription type. + /// + public SubscriptionType Type; + } + + /// + /// Unsubscribe from a Match resource's notifications. For MatchInvite, players are expected to unsubscribe once they can no + /// longer accept invites. For MatchTicketStatusChange, players are expected to unsusbcribe once the ticket has reached a + /// canceled or matched state. + /// + [Serializable] + public class UnsubscribeFromMatchResourceRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity performing the unsubscription. The entity must be authorized to use this connectionHandle. + /// + public EntityKey EntityKey; + /// + /// Opaque string, given to a client upon creating a connection with PubSub. + /// + public string PubSubConnectionHandle; + /// + /// The name of the resource to unsubscribe from. It follows the format {queueName}|{ticketId} for MatchTicketStatusChange. + /// For MatchInvite, ResourceId is @me. + /// + public string ResourceId; + /// + /// Version number for the unsubscription from this resource. + /// + public uint SubscriptionVersion; + /// + /// Type of the subscription to be canceled. + /// + public string Type; + } + + [Serializable] + public class UnsubscribeFromMatchResourceResult : PlayFabResultCommon + { + } + + /// + /// Removes the specified tag from the image. After this operation, a 'docker pull' will fail for the specified image and + /// tag combination. Morever, ListContainerImageTags will not return the specified tag. + /// + [Serializable] + public class UntagContainerImageRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The container image which tag we want to remove. + /// + public string ImageName; + /// + /// The tag we want to remove. + /// + public string Tag; + } + + /// + /// Creates a multiplayer server build alias and returns the created alias. + /// + [Serializable] + public class UpdateBuildAliasRequest : PlayFabRequestCommon + { + /// + /// The guid string alias Id of the alias to be updated. + /// + public string AliasId; + /// + /// The alias name. + /// + public string AliasName; + /// + /// Array of build selection criteria. + /// + public List BuildSelectionCriteria; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + /// + /// Updates a multiplayer server build's name. + /// + [Serializable] + public class UpdateBuildNameRequest : PlayFabRequestCommon + { + /// + /// The guid string ID of the build we want to update the name of. + /// + public string BuildId; + /// + /// The build name. + /// + public string BuildName; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + /// + /// Updates a multiplayer server build's region. + /// + [Serializable] + public class UpdateBuildRegionRequest : PlayFabRequestCommon + { + /// + /// The guid string ID of the build we want to update regions for. + /// + public string BuildId; + /// + /// The updated region configuration that should be applied to the specified build. + /// + public BuildRegionParams BuildRegion; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + /// + /// Updates a multiplayer server build's regions. + /// + [Serializable] + public class UpdateBuildRegionsRequest : PlayFabRequestCommon + { + /// + /// The guid string ID of the build we want to update regions for. + /// + public string BuildId; + /// + /// The updated region configuration that should be applied to the specified build. + /// + public List BuildRegions; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + /// + /// Preview: Request to update the serverData and serverEntity in case of migration. Only a game_server entity can update + /// this information and this is restricted to client owned lobbies which are using connections. + /// + [Serializable] + public class UpdateLobbyAsServerRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The id of the lobby. + /// + public string LobbyId; + /// + /// The private key-value pairs which are visible to all entities in the lobby and modifiable by the joined server. + /// Optional. Sets or updates key-value pairs on the lobby. Only the current lobby lobby server can set serverData. Keys may + /// be an arbitrary string of at most 30 characters. The total size of all serverData values may not exceed 4096 bytes. + /// Values are not individually limited. There can be up to 30 key-value pairs stored here. Keys are case sensitive. + /// + public Dictionary ServerData; + /// + /// The keys to delete from the lobby serverData. Optional. Optional. Deletes key-value pairs on the lobby. Only the current + /// joined lobby server can delete serverData. All the specified keys will be removed from the serverData. Keys that do not + /// exist in the lobby are a no-op. If the key to delete exists in the serverData (same request) it will result in a bad + /// request. + /// + public List ServerDataToDelete; + /// + /// The lobby server. Optional. Set a different server as the joined server of the lobby (there can only be 1 joined + /// server). When changing the server the previous server will automatically be unsubscribed. + /// + public EntityKey ServerEntity; + } + + /// + /// Request to update a lobby. + /// + [Serializable] + public class UpdateLobbyRequest : PlayFabRequestCommon + { + /// + /// The policy indicating who is allowed to join the lobby, and the visibility to queries. May be 'Public', 'Friends' or + /// 'Private'. Public means the lobby is both visible in queries and any player may join, including invited players. Friends + /// means that users who are bidirectional friends of members in the lobby may search to find friend lobbies, to retrieve + /// its connection string. Private means the lobby is not visible in queries, and a player must receive an invitation to + /// join. Defaults to 'Public' on creation. Can only be changed by the lobby owner. + /// + public AccessPolicy? AccessPolicy; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The private key-value pairs which are visible to all entities in the lobby. Optional. Sets or updates key-value pairs on + /// the lobby. Only the current lobby owner can set lobby data. Keys may be an arbitrary string of at most 30 characters. + /// The total size of all lobbyData values may not exceed 4096 bytes. Values are not individually limited. There can be up + /// to 30 key-value pairs stored here. Keys are case sensitive. + /// + public Dictionary LobbyData; + /// + /// The keys to delete from the lobby LobbyData. Optional. Behaves similar to searchDataToDelete, but applies to lobbyData. + /// + public List LobbyDataToDelete; + /// + /// The id of the lobby. + /// + public string LobbyId; + /// + /// The maximum number of players allowed in the lobby. Updates the maximum allowed number of players in the lobby. Only the + /// current lobby owner can set this. If set, the value must be greater than or equal to the number of members currently in + /// the lobby. + /// + public uint? MaxPlayers; + /// + /// The private key-value pairs used by the member to communicate information to other members and the owner. Optional. Sets + /// or updates new key-value pairs on the caller's member data. New keys will be added with their values and existing keys + /// will be updated with the new values. Visible to all entities in the lobby. At most 30 key-value pairs may be stored + /// here, keys are limited to 30 characters and values to 1000. The total size of all memberData values may not exceed 4096 + /// bytes. Keys are case sensitive. Servers cannot specifiy this. + /// + public Dictionary MemberData; + /// + /// The keys to delete from the lobby MemberData. Optional. Deletes key-value pairs on the caller's member data. All the + /// specified keys will be removed from the caller's member data. Keys that do not exist are a no-op. If the key to delete + /// exists in the memberData (same request) it will result in a bad request. Servers cannot specifiy this. + /// + public List MemberDataToDelete; + /// + /// The member entity whose data is being modified. Servers cannot specify this. + /// + public EntityKey MemberEntity; + /// + /// A setting indicating whether the lobby is locked. May be 'Unlocked' or 'Locked'. When Locked new members are not allowed + /// to join. Defaults to 'Unlocked' on creation. Can only be changed by the lobby owner. + /// + public MembershipLock? MembershipLock; + /// + /// The lobby owner. Optional. Set to transfer ownership of the lobby. If client - owned and 'Automatic' - The Lobby service + /// will automatically assign another connected owner when the current owner leaves or disconnects. useConnections must be + /// true. If client - owned and 'Manual' - Ownership is protected as long as the current owner is connected. If the current + /// owner leaves or disconnects any member may set themselves as the current owner. The useConnections property must be + /// true. If client-owned and 'None' - Any member can set ownership. The useConnections property can be either true or + /// false. For all client-owned lobbies when the owner leaves and a new owner can not be automatically selected - The owner + /// field is set to null. For all client-owned lobbies when the owner disconnects and a new owner can not be automatically + /// selected - The owner field remains unchanged and the current owner retains all owner abilities for the lobby. If + /// server-owned (must be 'Server') - Any server can set ownership. The useConnections property must be true. + /// + public EntityKey Owner; + /// + /// The public key-value pairs which allow queries to differentiate between lobbies. Optional. Sets or updates key-value + /// pairs on the lobby for use with queries. Only the current lobby owner can set search data. New keys will be added with + /// their values and existing keys will be updated with the new values. There can be up to 30 key-value pairs stored here. + /// Keys are of the format string_key1, string_key2... string_key30 for string values, or number_key1, number_key2, ... + /// number_key30 for numeric values. Numeric values are floats. Values can be at most 256 characters long. The total size of + /// all searchData values may not exceed 1024 bytes.Keys are case sensitive. + /// + public Dictionary SearchData; + /// + /// The keys to delete from the lobby SearchData. Optional. Deletes key-value pairs on the lobby. Only the current lobby + /// owner can delete search data. All the specified keys will be removed from the search data. Keys that do not exist in the + /// lobby are a no-op.If the key to delete exists in the searchData (same request) it will result in a bad request. + /// + public List SearchDataToDelete; + } + + /// + /// Uploads a multiplayer server game certificate. + /// + [Serializable] + public class UploadCertificateRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Forces the certificate renewal if the certificate already exists. Default is false + /// + public bool? ForceUpdate; + /// + /// The game certificate to upload. + /// + public Certificate GameCertificate; + } + + /// + /// Uploads a multiplayer server game secret. + /// + [Serializable] + public class UploadSecretRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Forces the secret renewal if the secret already exists. Default is false + /// + public bool? ForceUpdate; + /// + /// The game secret to add. + /// + public Secret GameSecret; + } + + [Serializable] + public class VirtualMachineSummary : PlayFabBaseModel + { + /// + /// The virtual machine health status. + /// + public string HealthStatus; + /// + /// The virtual machine state. + /// + public string State; + /// + /// The virtual machine ID. + /// + public string VmId; + } + + [Serializable] + public class VmStartupScriptConfiguration : PlayFabBaseModel + { + /// + /// Optional port requests (name/protocol) that will be used by the VmStartupScript. Max of 5 requests. + /// + public List PortRequests; + /// + /// Asset which contains the VmStartupScript script and any other required files. + /// + public AssetReference VmStartupScriptAssetReference; + } + + [Serializable] + public class VmStartupScriptParams : PlayFabBaseModel + { + /// + /// Optional port requests (name/protocol) that will be used by the VmStartupScript. Max of 5 requests. + /// + public List PortRequests; + /// + /// Asset which contains the VmStartupScript script and any other required files. + /// + public AssetReferenceParams VmStartupScriptAssetReference; + } + + [Serializable] + public class VmStartupScriptPortRequest : PlayFabBaseModel + { + /// + /// The name for the port. + /// + public string Name; + /// + /// The protocol for the port. + /// + public ProtocolType Protocol; + } + + [Serializable] + public class VmStartupScriptPortRequestParams : PlayFabBaseModel + { + /// + /// The name for the port. + /// + public string Name; + /// + /// The protocol for the port. + /// + public ProtocolType Protocol; + } + + [Serializable] + public class WindowsCrashDumpConfiguration : PlayFabBaseModel + { + /// + /// See https://docs.microsoft.com/en-us/windows/win32/wer/collecting-user-mode-dumps for valid values. + /// + public int? CustomDumpFlags; + /// + /// See https://docs.microsoft.com/en-us/windows/win32/wer/collecting-user-mode-dumps for valid values. + /// + public int? DumpType; + /// + /// Designates whether automatic crash dump capturing will be enabled for this Build. + /// + public bool IsEnabled; + } +} +#endif diff --git a/Assets/PlayFabSDK/Multiplayer/PlayFabMultiplayerModels.cs.meta b/Assets/PlayFabSDK/Multiplayer/PlayFabMultiplayerModels.cs.meta new file mode 100644 index 00000000..f6ca95fd --- /dev/null +++ b/Assets/PlayFabSDK/Multiplayer/PlayFabMultiplayerModels.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c9c53dd06e97f414cafc09e35d9f24aa +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Profiles.meta b/Assets/PlayFabSDK/Profiles.meta new file mode 100644 index 00000000..b4e35e5f --- /dev/null +++ b/Assets/PlayFabSDK/Profiles.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7fe6baad6b1791b479d6cf5082f56c5d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Profiles/PlayFabEvents.cs b/Assets/PlayFabSDK/Profiles/PlayFabEvents.cs new file mode 100644 index 00000000..069ee41a --- /dev/null +++ b/Assets/PlayFabSDK/Profiles/PlayFabEvents.cs @@ -0,0 +1,28 @@ +#if !DISABLE_PLAYFABENTITY_API +using PlayFab.ProfilesModels; + +namespace PlayFab.Events +{ + public partial class PlayFabEvents + { + public event PlayFabRequestEvent OnProfilesGetGlobalPolicyRequestEvent; + public event PlayFabResultEvent OnProfilesGetGlobalPolicyResultEvent; + public event PlayFabRequestEvent OnProfilesGetProfileRequestEvent; + public event PlayFabResultEvent OnProfilesGetProfileResultEvent; + public event PlayFabRequestEvent OnProfilesGetProfilesRequestEvent; + public event PlayFabResultEvent OnProfilesGetProfilesResultEvent; + public event PlayFabRequestEvent OnProfilesGetTitlePlayersFromMasterPlayerAccountIdsRequestEvent; + public event PlayFabResultEvent OnProfilesGetTitlePlayersFromMasterPlayerAccountIdsResultEvent; + public event PlayFabRequestEvent OnProfilesGetTitlePlayersFromXboxLiveIDsRequestEvent; + public event PlayFabResultEvent OnProfilesGetTitlePlayersFromXboxLiveIDsResultEvent; + public event PlayFabRequestEvent OnProfilesSetDisplayNameRequestEvent; + public event PlayFabResultEvent OnProfilesSetDisplayNameResultEvent; + public event PlayFabRequestEvent OnProfilesSetGlobalPolicyRequestEvent; + public event PlayFabResultEvent OnProfilesSetGlobalPolicyResultEvent; + public event PlayFabRequestEvent OnProfilesSetProfileLanguageRequestEvent; + public event PlayFabResultEvent OnProfilesSetProfileLanguageResultEvent; + public event PlayFabRequestEvent OnProfilesSetProfilePolicyRequestEvent; + public event PlayFabResultEvent OnProfilesSetProfilePolicyResultEvent; + } +} +#endif diff --git a/Assets/PlayFabSDK/Profiles/PlayFabEvents.cs.meta b/Assets/PlayFabSDK/Profiles/PlayFabEvents.cs.meta new file mode 100644 index 00000000..7b89c240 --- /dev/null +++ b/Assets/PlayFabSDK/Profiles/PlayFabEvents.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 108a292bd382f6c4a88576ed2173cb93 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Profiles/PlayFabProfilesAPI.cs b/Assets/PlayFabSDK/Profiles/PlayFabProfilesAPI.cs new file mode 100644 index 00000000..aec3d21d --- /dev/null +++ b/Assets/PlayFabSDK/Profiles/PlayFabProfilesAPI.cs @@ -0,0 +1,158 @@ +#if !DISABLE_PLAYFABENTITY_API && !DISABLE_PLAYFAB_STATIC_API + +using System; +using System.Collections.Generic; +using PlayFab.ProfilesModels; +using PlayFab.Internal; + +namespace PlayFab +{ + /// + /// All PlayFab entities have profiles, which hold top-level properties about the entity. These APIs give you the tools + /// needed to manage entity profiles. + /// + public static class PlayFabProfilesAPI + { + static PlayFabProfilesAPI() {} + + + /// + /// Verify entity login. + /// + public static bool IsEntityLoggedIn() + { + return PlayFabSettings.staticPlayer.IsEntityLoggedIn(); + } + + /// + /// Clear the Client SessionToken which allows this Client to call API calls requiring login. + /// A new/fresh login will be required after calling this. + /// + public static void ForgetAllCredentials() + { + PlayFabSettings.staticPlayer.ForgetAllCredentials(); + } + + /// + /// Gets the global title access policy + /// + public static void GetGlobalPolicy(GetGlobalPolicyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Profile/GetGlobalPolicy", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the entity's profile. + /// + public static void GetProfile(GetEntityProfileRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Profile/GetProfile", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the entity's profile. + /// + public static void GetProfiles(GetEntityProfilesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Profile/GetProfiles", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the title player accounts associated with the given master player account. + /// + public static void GetTitlePlayersFromMasterPlayerAccountIds(GetTitlePlayersFromMasterPlayerAccountIdsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Profile/GetTitlePlayersFromMasterPlayerAccountIds", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the title player accounts associated with the given XUIDs. + /// + public static void GetTitlePlayersFromXboxLiveIDs(GetTitlePlayersFromXboxLiveIDsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Profile/GetTitlePlayersFromXboxLiveIDs", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Update the display name of the entity + /// + public static void SetDisplayName(SetDisplayNameRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Profile/SetDisplayName", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Sets the global title access policy + /// + public static void SetGlobalPolicy(SetGlobalPolicyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Profile/SetGlobalPolicy", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates the entity's language. The precedence hierarchy for communication to the player is Title Player Account + /// language, Master Player Account language, and then title default language if the first two aren't set or supported. + /// + public static void SetProfileLanguage(SetProfileLanguageRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Profile/SetProfileLanguage", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Sets the profiles access policy + /// + public static void SetProfilePolicy(SetEntityProfilePolicyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Profile/SetProfilePolicy", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + + } +} + +#endif diff --git a/Assets/PlayFabSDK/Profiles/PlayFabProfilesAPI.cs.meta b/Assets/PlayFabSDK/Profiles/PlayFabProfilesAPI.cs.meta new file mode 100644 index 00000000..eb3d8cb1 --- /dev/null +++ b/Assets/PlayFabSDK/Profiles/PlayFabProfilesAPI.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 04039b10ae9eebd46a8c4a5b401ea567 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Profiles/PlayFabProfilesInstanceAPI.cs b/Assets/PlayFabSDK/Profiles/PlayFabProfilesInstanceAPI.cs new file mode 100644 index 00000000..d332f6f4 --- /dev/null +++ b/Assets/PlayFabSDK/Profiles/PlayFabProfilesInstanceAPI.cs @@ -0,0 +1,158 @@ +#if !DISABLE_PLAYFABENTITY_API + +using System; +using System.Collections.Generic; +using PlayFab.ProfilesModels; +using PlayFab.Internal; +using PlayFab.SharedModels; + +namespace PlayFab +{ + /// + /// All PlayFab entities have profiles, which hold top-level properties about the entity. These APIs give you the tools + /// needed to manage entity profiles. + /// + public class PlayFabProfilesInstanceAPI : IPlayFabInstanceApi + { + public readonly PlayFabApiSettings apiSettings = null; + public readonly PlayFabAuthenticationContext authenticationContext = null; + + public PlayFabProfilesInstanceAPI(PlayFabAuthenticationContext context) + { + if (context == null) + throw new PlayFabException(PlayFabExceptionCode.AuthContextRequired, "Context cannot be null, create a PlayFabAuthenticationContext for each player in advance, or call .GetAuthenticationContext()"); + authenticationContext = context; + } + + public PlayFabProfilesInstanceAPI(PlayFabApiSettings settings, PlayFabAuthenticationContext context) + { + if (context == null) + throw new PlayFabException(PlayFabExceptionCode.AuthContextRequired, "Context cannot be null, create a PlayFabAuthenticationContext for each player in advance, or call .GetAuthenticationContext()"); + apiSettings = settings; + authenticationContext = context; + } + + /// + /// Verify entity login. + /// + public bool IsEntityLoggedIn() + { + return authenticationContext == null ? false : authenticationContext.IsEntityLoggedIn(); + } + + /// + /// Clear the Client SessionToken which allows this Client to call API calls requiring login. + /// A new/fresh login will be required after calling this. + /// + public void ForgetAllCredentials() + { + if (authenticationContext != null) + { + authenticationContext.ForgetAllCredentials(); + } + } + + /// + /// Gets the global title access policy + /// + public void GetGlobalPolicy(GetGlobalPolicyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Profile/GetGlobalPolicy", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the entity's profile. + /// + public void GetProfile(GetEntityProfileRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Profile/GetProfile", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the entity's profile. + /// + public void GetProfiles(GetEntityProfilesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Profile/GetProfiles", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the title player accounts associated with the given master player account. + /// + public void GetTitlePlayersFromMasterPlayerAccountIds(GetTitlePlayersFromMasterPlayerAccountIdsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Profile/GetTitlePlayersFromMasterPlayerAccountIds", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the title player accounts associated with the given XUIDs. + /// + public void GetTitlePlayersFromXboxLiveIDs(GetTitlePlayersFromXboxLiveIDsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Profile/GetTitlePlayersFromXboxLiveIDs", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Update the display name of the entity + /// + public void SetDisplayName(SetDisplayNameRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Profile/SetDisplayName", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Sets the global title access policy + /// + public void SetGlobalPolicy(SetGlobalPolicyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Profile/SetGlobalPolicy", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates the entity's language. The precedence hierarchy for communication to the player is Title Player Account + /// language, Master Player Account language, and then title default language if the first two aren't set or supported. + /// + public void SetProfileLanguage(SetProfileLanguageRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Profile/SetProfileLanguage", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Sets the profiles access policy + /// + public void SetProfilePolicy(SetEntityProfilePolicyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Profile/SetProfilePolicy", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + } +} + +#endif diff --git a/Assets/PlayFabSDK/Profiles/PlayFabProfilesInstanceAPI.cs.meta b/Assets/PlayFabSDK/Profiles/PlayFabProfilesInstanceAPI.cs.meta new file mode 100644 index 00000000..ffd238a7 --- /dev/null +++ b/Assets/PlayFabSDK/Profiles/PlayFabProfilesInstanceAPI.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ef2cfc8d3e49a7e479e1fe8c2cf18478 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Profiles/PlayFabProfilesModels.cs b/Assets/PlayFabSDK/Profiles/PlayFabProfilesModels.cs new file mode 100644 index 00000000..76cebbbd --- /dev/null +++ b/Assets/PlayFabSDK/Profiles/PlayFabProfilesModels.cs @@ -0,0 +1,508 @@ +#if !DISABLE_PLAYFABENTITY_API +using System; +using System.Collections.Generic; +using PlayFab.SharedModels; + +namespace PlayFab.ProfilesModels +{ + public enum EffectType + { + Allow, + Deny + } + + /// + /// An entity object and its associated meta data. + /// + [Serializable] + public class EntityDataObject : PlayFabBaseModel + { + /// + /// Un-escaped JSON object, if DataAsObject is true. + /// + public object DataObject; + /// + /// Escaped string JSON body of the object, if DataAsObject is default or false. + /// + public string EscapedDataObject; + /// + /// Name of this object. + /// + public string ObjectName; + } + + /// + /// Combined entity type and ID structure which uniquely identifies a single entity. + /// + [Serializable] + public class EntityKey : PlayFabBaseModel + { + /// + /// Unique ID of the entity. + /// + public string Id; + /// + /// Entity type. See https://docs.microsoft.com/gaming/playfab/features/data/entities/available-built-in-entity-types + /// + public string Type; + } + + [Serializable] + public class EntityLineage : PlayFabBaseModel + { + /// + /// The Character Id of the associated entity. + /// + public string CharacterId; + /// + /// The Group Id of the associated entity. + /// + public string GroupId; + /// + /// The Master Player Account Id of the associated entity. + /// + public string MasterPlayerAccountId; + /// + /// The Namespace Id of the associated entity. + /// + public string NamespaceId; + /// + /// The Title Id of the associated entity. + /// + public string TitleId; + /// + /// The Title Player Account Id of the associated entity. + /// + public string TitlePlayerAccountId; + } + + [Serializable] + public class EntityPermissionStatement : PlayFabBaseModel + { + /// + /// The action this statement effects. May be 'Read', 'Write' or '*' for both read and write. + /// + public string Action; + /// + /// A comment about the statement. Intended solely for bookkeeping and debugging. + /// + public string Comment; + /// + /// Additional conditions to be applied for entity resources. + /// + public object Condition; + /// + /// The effect this statement will have. It may be either Allow or Deny + /// + public EffectType Effect; + /// + /// The principal this statement will effect. + /// + public object Principal; + /// + /// The resource this statements effects. Similar to 'pfrn:data--title![Title ID]/Profile/*' + /// + public string Resource; + } + + [Serializable] + public class EntityProfileBody : PlayFabBaseModel + { + /// + /// Avatar URL for the entity. + /// + public string AvatarUrl; + /// + /// The creation time of this profile in UTC. + /// + public DateTime Created; + /// + /// The display name of the entity. This field may serve different purposes for different entity types. i.e.: for a title + /// player account it could represent the display name of the player, whereas on a character it could be character's name. + /// + public string DisplayName; + /// + /// The entity id and type. + /// + public EntityKey Entity; + /// + /// The chain of responsibility for this entity. Use Lineage. + /// + public string EntityChain; + /// + /// The experiment variants of this profile. + /// + public List ExperimentVariants; + /// + /// The files on this profile. + /// + public Dictionary Files; + /// + /// The language on this profile. + /// + public string Language; + /// + /// The lineage of this profile. + /// + public EntityLineage Lineage; + /// + /// The objects on this profile. + /// + public Dictionary Objects; + /// + /// The permissions that govern access to this entity profile and its properties. Only includes permissions set on this + /// profile, not global statements from titles and namespaces. + /// + public List Permissions; + /// + /// The statistics on this profile. + /// + public Dictionary Statistics; + /// + /// The version number of the profile in persistent storage at the time of the read. Used for optional optimistic + /// concurrency during update. + /// + public int VersionNumber; + } + + /// + /// An entity file's meta data. To get a download URL call File/GetFiles API. + /// + [Serializable] + public class EntityProfileFileMetadata : PlayFabBaseModel + { + /// + /// Checksum value for the file, can be used to check if the file on the server has changed. + /// + public string Checksum; + /// + /// Name of the file + /// + public string FileName; + /// + /// Last UTC time the file was modified + /// + public DateTime LastModified; + /// + /// Storage service's reported byte count + /// + public int Size; + } + + [Serializable] + public class EntityStatisticValue : PlayFabBaseModel + { + /// + /// Metadata associated with the Statistic. + /// + public string Metadata; + /// + /// Statistic name + /// + public string Name; + /// + /// Statistic scores + /// + public List Scores; + /// + /// Statistic version + /// + public int Version; + } + + /// + /// Given an entity type and entity identifier will retrieve the profile from the entity store. If the profile being + /// retrieved is the caller's, then the read operation is consistent, if not it is an inconsistent read. An inconsistent + /// read means that we do not guarantee all committed writes have occurred before reading the profile, allowing for a stale + /// read. If consistency is important the Version Number on the result can be used to compare which version of the profile + /// any reader has. + /// + [Serializable] + public class GetEntityProfileRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Determines whether the objects will be returned as an escaped JSON string or as a un-escaped JSON object. Default is + /// JSON string. + /// + public bool? DataAsObject; + /// + /// The optional entity to perform this action on. Defaults to the currently logged in entity. + /// + public EntityKey Entity; + } + + [Serializable] + public class GetEntityProfileResponse : PlayFabResultCommon + { + /// + /// Entity profile + /// + public EntityProfileBody Profile; + } + + /// + /// Given a set of entity types and entity identifiers will retrieve all readable profiles properties for the caller. + /// Profiles that the caller is not allowed to read will silently not be included in the results. + /// + [Serializable] + public class GetEntityProfilesRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Determines whether the objects will be returned as an escaped JSON string or as a un-escaped JSON object. Default is + /// JSON string. + /// + public bool? DataAsObject; + /// + /// Entity keys of the profiles to load. Must be between 1 and 25 + /// + public List Entities; + } + + [Serializable] + public class GetEntityProfilesResponse : PlayFabResultCommon + { + /// + /// Entity profiles + /// + public List Profiles; + } + + /// + /// Retrieves the title access policy that is used before the profile's policy is inspected during a request. If never + /// customized this will return the default starter policy built by PlayFab. + /// + [Serializable] + public class GetGlobalPolicyRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The optional entity to perform this action on. Defaults to the currently logged in entity. + /// + public EntityKey Entity; + } + + [Serializable] + public class GetGlobalPolicyResponse : PlayFabResultCommon + { + /// + /// The permissions that govern access to all entities under this title or namespace. + /// + public List Permissions; + } + + /// + /// Given a master player account id (PlayFab ID), returns all title player accounts associated with it. + /// + [Serializable] + public class GetTitlePlayersFromMasterPlayerAccountIdsRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Master player account ids. + /// + public List MasterPlayerAccountIds; + /// + /// Id of title to get players from. + /// + public string TitleId; + } + + [Serializable] + public class GetTitlePlayersFromMasterPlayerAccountIdsResponse : PlayFabResultCommon + { + /// + /// Optional id of title to get players from, required if calling using a master_player_account. + /// + public string TitleId; + /// + /// Dictionary of master player ids mapped to title player entity keys and id pairs + /// + public Dictionary TitlePlayerAccounts; + } + + [Serializable] + public class GetTitlePlayersFromProviderIDsResponse : PlayFabResultCommon + { + /// + /// Dictionary of provider identifiers mapped to title_player_account lineage. Missing lineage indicates the player either + /// doesn't exist or doesn't play the requested title. + /// + public Dictionary TitlePlayerAccounts; + } + + /// + /// Given a collection of Xbox IDs (XUIDs), returns all title player accounts. + /// + [Serializable] + public class GetTitlePlayersFromXboxLiveIDsRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Xbox Sandbox the players had on their Xbox tokens. + /// + public string Sandbox; + /// + /// Optional ID of title to get players from, required if calling using a master_player_account. + /// + public string TitleId; + /// + /// List of Xbox Live XUIDs + /// + public List XboxLiveIds; + } + + public enum OperationTypes + { + Created, + Updated, + Deleted, + None + } + + /// + /// Given an entity profile, will update its display name to the one passed in if the profile's version is equal to the + /// specified value + /// + [Serializable] + public class SetDisplayNameRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The new value to be set on Entity Profile's display name + /// + public string DisplayName; + /// + /// The optional entity to perform this action on. Defaults to the currently logged in entity. + /// + public EntityKey Entity; + /// + /// The expected version of a profile to perform this update on + /// + public int? ExpectedVersion; + } + + [Serializable] + public class SetDisplayNameResponse : PlayFabResultCommon + { + /// + /// The type of operation that occured on the profile's display name + /// + public OperationTypes? OperationResult; + /// + /// The updated version of the profile after the display name update + /// + public int? VersionNumber; + } + + /// + /// This will set the access policy statements on the given entity profile. This is not additive, any existing statements + /// will be replaced with the statements in this request. + /// + [Serializable] + public class SetEntityProfilePolicyRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// The statements to include in the access policy. + /// + public List Statements; + } + + [Serializable] + public class SetEntityProfilePolicyResponse : PlayFabResultCommon + { + /// + /// The permissions that govern access to this entity profile and its properties. Only includes permissions set on this + /// profile, not global statements from titles and namespaces. + /// + public List Permissions; + } + + /// + /// Updates the title access policy that is used before the profile's policy is inspected during a request. Policies are + /// compiled and cached for several minutes so an update here may not be reflected in behavior for a short time. + /// + [Serializable] + public class SetGlobalPolicyRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The permissions that govern access to all entities under this title or namespace. + /// + public List Permissions; + } + + [Serializable] + public class SetGlobalPolicyResponse : PlayFabResultCommon + { + } + + /// + /// Given an entity profile, will update its language to the one passed in if the profile's version is equal to the one + /// passed in. + /// + [Serializable] + public class SetProfileLanguageRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The optional entity to perform this action on. Defaults to the currently logged in entity. + /// + public EntityKey Entity; + /// + /// The expected version of a profile to perform this update on + /// + public int? ExpectedVersion; + /// + /// The language to set on the given entity. Deletes the profile's language if passed in a null string. + /// + public string Language; + } + + [Serializable] + public class SetProfileLanguageResponse : PlayFabResultCommon + { + /// + /// The type of operation that occured on the profile's language + /// + public OperationTypes? OperationResult; + /// + /// The updated version of the profile after the language update + /// + public int? VersionNumber; + } +} +#endif diff --git a/Assets/PlayFabSDK/Profiles/PlayFabProfilesModels.cs.meta b/Assets/PlayFabSDK/Profiles/PlayFabProfilesModels.cs.meta new file mode 100644 index 00000000..9250c5c9 --- /dev/null +++ b/Assets/PlayFabSDK/Profiles/PlayFabProfilesModels.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d7cf1e15acb646e4eaf8ef5d951b1477 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Progression.meta b/Assets/PlayFabSDK/Progression.meta new file mode 100644 index 00000000..0fb2ad1a --- /dev/null +++ b/Assets/PlayFabSDK/Progression.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7c7a9aa122eeea84480c18f1fc5cdeb4 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Progression/PlayFabEvents.cs b/Assets/PlayFabSDK/Progression/PlayFabEvents.cs new file mode 100644 index 00000000..ee302234 --- /dev/null +++ b/Assets/PlayFabSDK/Progression/PlayFabEvents.cs @@ -0,0 +1,52 @@ +#if !DISABLE_PLAYFABENTITY_API +using PlayFab.ProgressionModels; + +namespace PlayFab.Events +{ + public partial class PlayFabEvents + { + public event PlayFabRequestEvent OnProgressionCreateLeaderboardDefinitionRequestEvent; + public event PlayFabResultEvent OnProgressionCreateLeaderboardDefinitionResultEvent; + public event PlayFabRequestEvent OnProgressionCreateStatisticDefinitionRequestEvent; + public event PlayFabResultEvent OnProgressionCreateStatisticDefinitionResultEvent; + public event PlayFabRequestEvent OnProgressionDeleteLeaderboardDefinitionRequestEvent; + public event PlayFabResultEvent OnProgressionDeleteLeaderboardDefinitionResultEvent; + public event PlayFabRequestEvent OnProgressionDeleteLeaderboardEntriesRequestEvent; + public event PlayFabResultEvent OnProgressionDeleteLeaderboardEntriesResultEvent; + public event PlayFabRequestEvent OnProgressionDeleteStatisticDefinitionRequestEvent; + public event PlayFabResultEvent OnProgressionDeleteStatisticDefinitionResultEvent; + public event PlayFabRequestEvent OnProgressionDeleteStatisticsRequestEvent; + public event PlayFabResultEvent OnProgressionDeleteStatisticsResultEvent; + public event PlayFabRequestEvent OnProgressionGetFriendLeaderboardForEntityRequestEvent; + public event PlayFabResultEvent OnProgressionGetFriendLeaderboardForEntityResultEvent; + public event PlayFabRequestEvent OnProgressionGetLeaderboardRequestEvent; + public event PlayFabResultEvent OnProgressionGetLeaderboardResultEvent; + public event PlayFabRequestEvent OnProgressionGetLeaderboardAroundEntityRequestEvent; + public event PlayFabResultEvent OnProgressionGetLeaderboardAroundEntityResultEvent; + public event PlayFabRequestEvent OnProgressionGetLeaderboardDefinitionRequestEvent; + public event PlayFabResultEvent OnProgressionGetLeaderboardDefinitionResultEvent; + public event PlayFabRequestEvent OnProgressionGetLeaderboardForEntitiesRequestEvent; + public event PlayFabResultEvent OnProgressionGetLeaderboardForEntitiesResultEvent; + public event PlayFabRequestEvent OnProgressionGetStatisticDefinitionRequestEvent; + public event PlayFabResultEvent OnProgressionGetStatisticDefinitionResultEvent; + public event PlayFabRequestEvent OnProgressionGetStatisticsRequestEvent; + public event PlayFabResultEvent OnProgressionGetStatisticsResultEvent; + public event PlayFabRequestEvent OnProgressionGetStatisticsForEntitiesRequestEvent; + public event PlayFabResultEvent OnProgressionGetStatisticsForEntitiesResultEvent; + public event PlayFabRequestEvent OnProgressionIncrementLeaderboardVersionRequestEvent; + public event PlayFabResultEvent OnProgressionIncrementLeaderboardVersionResultEvent; + public event PlayFabRequestEvent OnProgressionIncrementStatisticVersionRequestEvent; + public event PlayFabResultEvent OnProgressionIncrementStatisticVersionResultEvent; + public event PlayFabRequestEvent OnProgressionListLeaderboardDefinitionsRequestEvent; + public event PlayFabResultEvent OnProgressionListLeaderboardDefinitionsResultEvent; + public event PlayFabRequestEvent OnProgressionListStatisticDefinitionsRequestEvent; + public event PlayFabResultEvent OnProgressionListStatisticDefinitionsResultEvent; + public event PlayFabRequestEvent OnProgressionUnlinkLeaderboardFromStatisticRequestEvent; + public event PlayFabResultEvent OnProgressionUnlinkLeaderboardFromStatisticResultEvent; + public event PlayFabRequestEvent OnProgressionUpdateLeaderboardEntriesRequestEvent; + public event PlayFabResultEvent OnProgressionUpdateLeaderboardEntriesResultEvent; + public event PlayFabRequestEvent OnProgressionUpdateStatisticsRequestEvent; + public event PlayFabResultEvent OnProgressionUpdateStatisticsResultEvent; + } +} +#endif diff --git a/Assets/PlayFabSDK/Progression/PlayFabEvents.cs.meta b/Assets/PlayFabSDK/Progression/PlayFabEvents.cs.meta new file mode 100644 index 00000000..03f473a1 --- /dev/null +++ b/Assets/PlayFabSDK/Progression/PlayFabEvents.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0baf01ae0e5700e41a23409b4e548524 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Progression/PlayFabProgressionAPI.cs b/Assets/PlayFabSDK/Progression/PlayFabProgressionAPI.cs new file mode 100644 index 00000000..a8f83eea --- /dev/null +++ b/Assets/PlayFabSDK/Progression/PlayFabProgressionAPI.cs @@ -0,0 +1,313 @@ +#if !DISABLE_PLAYFABENTITY_API && !DISABLE_PLAYFAB_STATIC_API + +using System; +using System.Collections.Generic; +using PlayFab.ProgressionModels; +using PlayFab.Internal; + +namespace PlayFab +{ + /// + /// Manage entity statistics Manage entity leaderboards + /// + public static class PlayFabProgressionAPI + { + static PlayFabProgressionAPI() {} + + + /// + /// Verify entity login. + /// + public static bool IsEntityLoggedIn() + { + return PlayFabSettings.staticPlayer.IsEntityLoggedIn(); + } + + /// + /// Clear the Client SessionToken which allows this Client to call API calls requiring login. + /// A new/fresh login will be required after calling this. + /// + public static void ForgetAllCredentials() + { + PlayFabSettings.staticPlayer.ForgetAllCredentials(); + } + + /// + /// Creates a new leaderboard definition. + /// + public static void CreateLeaderboardDefinition(CreateLeaderboardDefinitionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Leaderboard/CreateLeaderboardDefinition", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Create a new entity statistic definition. + /// + public static void CreateStatisticDefinition(CreateStatisticDefinitionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Statistic/CreateStatisticDefinition", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Deletes a leaderboard definition. + /// + public static void DeleteLeaderboardDefinition(DeleteLeaderboardDefinitionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Leaderboard/DeleteLeaderboardDefinition", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Deletes the specified entries from the given leaderboard. + /// + public static void DeleteLeaderboardEntries(DeleteLeaderboardEntriesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Leaderboard/DeleteLeaderboardEntries", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Delete an entity statistic definition. Will delete all statistics on entity profiles and leaderboards. + /// + public static void DeleteStatisticDefinition(DeleteStatisticDefinitionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Statistic/DeleteStatisticDefinition", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Delete statistics on an entity profile. This will remove all rankings from associated leaderboards. + /// + public static void DeleteStatistics(DeleteStatisticsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Statistic/DeleteStatistics", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Get the friend leaderboard for the specified entity. A maximum of 25 friend entries are listed in the leaderboard. + /// + public static void GetFriendLeaderboardForEntity(GetFriendLeaderboardForEntityRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Leaderboard/GetFriendLeaderboardForEntity", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Get the leaderboard for a specific entity type and statistic. + /// + public static void GetLeaderboard(GetEntityLeaderboardRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Leaderboard/GetLeaderboard", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Get the leaderboard around a specific entity. + /// + public static void GetLeaderboardAroundEntity(GetLeaderboardAroundEntityRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Leaderboard/GetLeaderboardAroundEntity", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets the specified leaderboard definition. + /// + public static void GetLeaderboardDefinition(GetLeaderboardDefinitionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Leaderboard/GetLeaderboardDefinition", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Get the leaderboard limited to a set of entities. + /// + public static void GetLeaderboardForEntities(GetLeaderboardForEntitiesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Leaderboard/GetLeaderboardForEntities", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Get current statistic definition information + /// + public static void GetStatisticDefinition(GetStatisticDefinitionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Statistic/GetStatisticDefinition", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets statistics for the specified entity. + /// + public static void GetStatistics(GetStatisticsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Statistic/GetStatistics", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets statistics for the specified collection of entities. + /// + public static void GetStatisticsForEntities(GetStatisticsForEntitiesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Statistic/GetStatisticsForEntities", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Increment a leaderboard version. + /// + public static void IncrementLeaderboardVersion(IncrementLeaderboardVersionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Leaderboard/IncrementLeaderboardVersion", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Increment an entity statistic definition version. + /// + public static void IncrementStatisticVersion(IncrementStatisticVersionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Statistic/IncrementStatisticVersion", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Lists the leaderboard definitions defined for the Title. + /// + public static void ListLeaderboardDefinitions(ListLeaderboardDefinitionsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Leaderboard/ListLeaderboardDefinitions", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Get all current statistic definitions information + /// + public static void ListStatisticDefinitions(ListStatisticDefinitionsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Statistic/ListStatisticDefinitions", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Unlinks a leaderboard definition from it's linked statistic definition. + /// + public static void UnlinkLeaderboardFromStatistic(UnlinkLeaderboardFromStatisticRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Leaderboard/UnlinkLeaderboardFromStatistic", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Adds or updates entries on the specified leaderboard. + /// + public static void UpdateLeaderboardEntries(UpdateLeaderboardEntriesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Leaderboard/UpdateLeaderboardEntries", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Update statistics on an entity profile. Depending on the statistic definition, this may result in entity being ranked on + /// various leaderboards. + /// + public static void UpdateStatistics(UpdateStatisticsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Statistic/UpdateStatistics", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + + } +} + +#endif diff --git a/Assets/PlayFabSDK/Progression/PlayFabProgressionAPI.cs.meta b/Assets/PlayFabSDK/Progression/PlayFabProgressionAPI.cs.meta new file mode 100644 index 00000000..ea6b3eb0 --- /dev/null +++ b/Assets/PlayFabSDK/Progression/PlayFabProgressionAPI.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 77a7d66f0cc99ad40a5068f8a1e2865f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Progression/PlayFabProgressionInstanceAPI.cs b/Assets/PlayFabSDK/Progression/PlayFabProgressionInstanceAPI.cs new file mode 100644 index 00000000..30470ddd --- /dev/null +++ b/Assets/PlayFabSDK/Progression/PlayFabProgressionInstanceAPI.cs @@ -0,0 +1,289 @@ +#if !DISABLE_PLAYFABENTITY_API + +using System; +using System.Collections.Generic; +using PlayFab.ProgressionModels; +using PlayFab.Internal; +using PlayFab.SharedModels; + +namespace PlayFab +{ + /// + /// Manage entity statistics Manage entity leaderboards + /// + public class PlayFabProgressionInstanceAPI : IPlayFabInstanceApi + { + public readonly PlayFabApiSettings apiSettings = null; + public readonly PlayFabAuthenticationContext authenticationContext = null; + + public PlayFabProgressionInstanceAPI(PlayFabAuthenticationContext context) + { + if (context == null) + throw new PlayFabException(PlayFabExceptionCode.AuthContextRequired, "Context cannot be null, create a PlayFabAuthenticationContext for each player in advance, or call .GetAuthenticationContext()"); + authenticationContext = context; + } + + public PlayFabProgressionInstanceAPI(PlayFabApiSettings settings, PlayFabAuthenticationContext context) + { + if (context == null) + throw new PlayFabException(PlayFabExceptionCode.AuthContextRequired, "Context cannot be null, create a PlayFabAuthenticationContext for each player in advance, or call .GetAuthenticationContext()"); + apiSettings = settings; + authenticationContext = context; + } + + /// + /// Verify entity login. + /// + public bool IsEntityLoggedIn() + { + return authenticationContext == null ? false : authenticationContext.IsEntityLoggedIn(); + } + + /// + /// Clear the Client SessionToken which allows this Client to call API calls requiring login. + /// A new/fresh login will be required after calling this. + /// + public void ForgetAllCredentials() + { + if (authenticationContext != null) + { + authenticationContext.ForgetAllCredentials(); + } + } + + /// + /// Creates a new leaderboard definition. + /// + public void CreateLeaderboardDefinition(CreateLeaderboardDefinitionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Leaderboard/CreateLeaderboardDefinition", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Create a new entity statistic definition. + /// + public void CreateStatisticDefinition(CreateStatisticDefinitionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Statistic/CreateStatisticDefinition", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Deletes a leaderboard definition. + /// + public void DeleteLeaderboardDefinition(DeleteLeaderboardDefinitionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Leaderboard/DeleteLeaderboardDefinition", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Deletes the specified entries from the given leaderboard. + /// + public void DeleteLeaderboardEntries(DeleteLeaderboardEntriesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Leaderboard/DeleteLeaderboardEntries", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Delete an entity statistic definition. Will delete all statistics on entity profiles and leaderboards. + /// + public void DeleteStatisticDefinition(DeleteStatisticDefinitionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Statistic/DeleteStatisticDefinition", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Delete statistics on an entity profile. This will remove all rankings from associated leaderboards. + /// + public void DeleteStatistics(DeleteStatisticsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Statistic/DeleteStatistics", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Get the friend leaderboard for the specified entity. A maximum of 25 friend entries are listed in the leaderboard. + /// + public void GetFriendLeaderboardForEntity(GetFriendLeaderboardForEntityRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Leaderboard/GetFriendLeaderboardForEntity", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Get the leaderboard for a specific entity type and statistic. + /// + public void GetLeaderboard(GetEntityLeaderboardRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Leaderboard/GetLeaderboard", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Get the leaderboard around a specific entity. + /// + public void GetLeaderboardAroundEntity(GetLeaderboardAroundEntityRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Leaderboard/GetLeaderboardAroundEntity", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets the specified leaderboard definition. + /// + public void GetLeaderboardDefinition(GetLeaderboardDefinitionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Leaderboard/GetLeaderboardDefinition", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Get the leaderboard limited to a set of entities. + /// + public void GetLeaderboardForEntities(GetLeaderboardForEntitiesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Leaderboard/GetLeaderboardForEntities", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Get current statistic definition information + /// + public void GetStatisticDefinition(GetStatisticDefinitionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Statistic/GetStatisticDefinition", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets statistics for the specified entity. + /// + public void GetStatistics(GetStatisticsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Statistic/GetStatistics", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets statistics for the specified collection of entities. + /// + public void GetStatisticsForEntities(GetStatisticsForEntitiesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Statistic/GetStatisticsForEntities", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Increment a leaderboard version. + /// + public void IncrementLeaderboardVersion(IncrementLeaderboardVersionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Leaderboard/IncrementLeaderboardVersion", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Increment an entity statistic definition version. + /// + public void IncrementStatisticVersion(IncrementStatisticVersionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Statistic/IncrementStatisticVersion", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Lists the leaderboard definitions defined for the Title. + /// + public void ListLeaderboardDefinitions(ListLeaderboardDefinitionsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Leaderboard/ListLeaderboardDefinitions", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Get all current statistic definitions information + /// + public void ListStatisticDefinitions(ListStatisticDefinitionsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Statistic/ListStatisticDefinitions", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Unlinks a leaderboard definition from it's linked statistic definition. + /// + public void UnlinkLeaderboardFromStatistic(UnlinkLeaderboardFromStatisticRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Leaderboard/UnlinkLeaderboardFromStatistic", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Adds or updates entries on the specified leaderboard. + /// + public void UpdateLeaderboardEntries(UpdateLeaderboardEntriesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Leaderboard/UpdateLeaderboardEntries", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Update statistics on an entity profile. Depending on the statistic definition, this may result in entity being ranked on + /// various leaderboards. + /// + public void UpdateStatistics(UpdateStatisticsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Statistic/UpdateStatistics", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + } +} + +#endif diff --git a/Assets/PlayFabSDK/Progression/PlayFabProgressionInstanceAPI.cs.meta b/Assets/PlayFabSDK/Progression/PlayFabProgressionInstanceAPI.cs.meta new file mode 100644 index 00000000..cb592500 --- /dev/null +++ b/Assets/PlayFabSDK/Progression/PlayFabProgressionInstanceAPI.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9b633860fe71fc24dacbbfe3f943e227 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Progression/PlayFabProgressionModels.cs b/Assets/PlayFabSDK/Progression/PlayFabProgressionModels.cs new file mode 100644 index 00000000..f8e91df7 --- /dev/null +++ b/Assets/PlayFabSDK/Progression/PlayFabProgressionModels.cs @@ -0,0 +1,897 @@ +#if !DISABLE_PLAYFABENTITY_API +using System; +using System.Collections.Generic; +using PlayFab.SharedModels; + +namespace PlayFab.ProgressionModels +{ + [Serializable] + public class CreateLeaderboardDefinitionRequest : PlayFabRequestCommon + { + /// + /// Leaderboard columns describing the sort directions, cannot be changed after creation. + /// + public List Columns; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity type being represented on the leaderboard. If it doesn't correspond to the PlayFab entity types, use + /// 'external' as the type. + /// + public string EntityType; + /// + /// A name for the leaderboard, unique per title. + /// + public string Name; + /// + /// Maximum number of entries on this leaderboard + /// + public int SizeLimit; + /// + /// The version reset configuration for the leaderboard definition. + /// + public VersionConfiguration VersionConfiguration; + } + + [Serializable] + public class CreateStatisticDefinitionRequest : PlayFabRequestCommon + { + /// + /// The columns for the statistic defining the aggregation method for each column. + /// + public List Columns; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity type allowed to have score(s) for this statistic. + /// + public string EntityType; + /// + /// Name of the statistic. Must be less than 150 characters. Restricted to a-Z, 0-9, '(', ')', '_', '-' and '.'. + /// + public string Name; + /// + /// The version reset configuration for the statistic definition. + /// + public VersionConfiguration VersionConfiguration; + } + + [Serializable] + public class DeleteLeaderboardDefinitionRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The name of the leaderboard definition to delete. + /// + public string Name; + } + + [Serializable] + public class DeleteLeaderboardEntriesRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The unique Ids of the entries to delete from the leaderboard. + /// + public List EntityIds; + /// + /// The name of the leaderboard. + /// + public string Name; + } + + [Serializable] + public class DeleteStatisticDefinitionRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Name of the statistic to delete. + /// + public string Name; + } + + [Serializable] + public class DeleteStatisticsRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The optional entity to perform this action on. Defaults to the currently logged in entity. + /// + public EntityKey Entity; + /// + /// Collection of statistics to remove from this entity. + /// + public List Statistics; + } + + [Serializable] + public class DeleteStatisticsResponse : PlayFabResultCommon + { + /// + /// The entity id and type. + /// + public EntityKey Entity; + } + + [Serializable] + public class EmptyResponse : PlayFabResultCommon + { + } + + /// + /// Combined entity type and ID structure which uniquely identifies a single entity. + /// + [Serializable] + public class EntityKey : PlayFabBaseModel + { + /// + /// Unique ID of the entity. + /// + public string Id; + /// + /// Entity type. See https://docs.microsoft.com/gaming/playfab/features/data/entities/available-built-in-entity-types + /// + public string Type; + } + + /// + /// Individual rank of an entity in a leaderboard + /// + [Serializable] + public class EntityLeaderboardEntry : PlayFabBaseModel + { + /// + /// Entity's display name. + /// + public string DisplayName; + /// + /// Entity identifier. + /// + public EntityKey Entity; + /// + /// The time at which the last update to the entry was recorded on the server. + /// + public DateTime LastUpdated; + /// + /// An opaque blob of data stored on the leaderboard entry. Note that the metadata is not used for ranking purposes. + /// + public string Metadata; + /// + /// Position on the leaderboard. + /// + public int Rank; + /// + /// Scores for the entry. + /// + public List Scores; + } + + [Serializable] + public class EntityStatistics : PlayFabBaseModel + { + /// + /// Entity key + /// + public EntityKey EntityKey; + /// + /// All statistics for the given entitykey + /// + public List Statistics; + } + + [Serializable] + public class EntityStatisticValue : PlayFabBaseModel + { + /// + /// Metadata associated with the Statistic. + /// + public string Metadata; + /// + /// Statistic name + /// + public string Name; + /// + /// Statistic scores + /// + public List Scores; + /// + /// Statistic version + /// + public int Version; + } + + public enum ExternalFriendSources + { + None, + Steam, + Facebook, + Xbox, + Psn, + All + } + + /// + /// Request to load a leaderboard. + /// + [Serializable] + public class GetEntityLeaderboardRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Name of the leaderboard. + /// + public string LeaderboardName; + /// + /// Maximum number of results to return from the leaderboard. Minimum 1, maximum 1,000. + /// + public uint PageSize; + /// + /// Index position to start from. 1 is beginning of leaderboard. + /// + public uint? StartingPosition; + /// + /// Optional version of the leaderboard, defaults to current version. + /// + public uint? Version; + } + + /// + /// Leaderboard response + /// + [Serializable] + public class GetEntityLeaderboardResponse : PlayFabResultCommon + { + /// + /// Leaderboard columns describing the sort directions. + /// + public List Columns; + /// + /// The number of entries on the leaderboard. + /// + public uint EntryCount; + /// + /// Individual entity rankings in the leaderboard, in sorted order by rank. + /// + public List Rankings; + /// + /// Version of the leaderboard being returned. + /// + public uint Version; + } + + [Serializable] + public class GetFriendLeaderboardForEntityRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The optional entity to perform this action on. Defaults to the currently logged in entity. + /// + public EntityKey Entity; + /// + /// Indicates which other platforms' friends should be included in the response. In HTTP, it is represented as a + /// comma-separated list of platforms. + /// + public ExternalFriendSources? ExternalFriendSources; + /// + /// Name of the leaderboard. + /// + public string LeaderboardName; + /// + /// Optional version of the leaderboard, defaults to current version. + /// + public uint? Version; + /// + /// Xbox token if Xbox friends should be included. Requires Xbox be configured on PlayFab. + /// + public string XboxToken; + } + + /// + /// Request to load a section of a leaderboard centered on a specific entity. + /// + [Serializable] + public class GetLeaderboardAroundEntityRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The optional entity to perform this action on. Defaults to the currently logged in entity. + /// + public EntityKey Entity; + /// + /// Name of the leaderboard. + /// + public string LeaderboardName; + /// + /// Number of surrounding entries to return (in addition to specified entity). In general, the number of ranks above and + /// below will be split into half. For example, if the specified value is 10, 5 ranks above and 5 ranks below will be + /// retrieved. However, the numbers will get skewed in either direction when the specified entity is towards the top or + /// bottom of the leaderboard. Also, the number of entries returned can be lower than the value specified for entries at the + /// bottom of the leaderboard. + /// + public uint MaxSurroundingEntries; + /// + /// Optional version of the leaderboard, defaults to current. + /// + public uint? Version; + } + + [Serializable] + public class GetLeaderboardDefinitionRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The name of the leaderboard to retrieve the definition for. + /// + public string Name; + } + + [Serializable] + public class GetLeaderboardDefinitionResponse : PlayFabResultCommon + { + /// + /// Sort direction of the leaderboard columns, cannot be changed after creation. + /// + public List Columns; + /// + /// Created time, in UTC + /// + public DateTime Created; + /// + /// The entity type being represented on the leaderboard. If it doesn't correspond to the PlayFab entity types, use + /// 'external' as the type. + /// + public string EntityType; + /// + /// Last time, in UTC, leaderboard version was incremented. + /// + public DateTime? LastResetTime; + /// + /// A name for the leaderboard, unique per title. + /// + public string Name; + /// + /// Maximum number of entries on this leaderboard + /// + public int SizeLimit; + /// + /// Latest Leaderboard version. + /// + public uint Version; + /// + /// The version reset configuration for the leaderboard definition. + /// + public VersionConfiguration VersionConfiguration; + } + + /// + /// Request a leaderboard limited to a collection of entities. + /// + [Serializable] + public class GetLeaderboardForEntitiesRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Collection of Entity IDs to include in the leaderboard. + /// + public List EntityIds; + /// + /// Name of the leaderboard. + /// + public string LeaderboardName; + /// + /// Optional version of the leaderboard, defaults to current. + /// + public uint? Version; + } + + [Serializable] + public class GetStatisticDefinitionRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Name of the statistic. Must be less than 150 characters. + /// + public string Name; + } + + [Serializable] + public class GetStatisticDefinitionResponse : PlayFabResultCommon + { + /// + /// The columns for the statistic defining the aggregation method for each column. + /// + public List Columns; + /// + /// Created time, in UTC + /// + public DateTime Created; + /// + /// The entity type that can have this statistic. + /// + public string EntityType; + /// + /// Last time, in UTC, statistic version was incremented. + /// + public DateTime? LastResetTime; + /// + /// The list of leaderboards that are linked to this statistic definition. + /// + public List LinkedLeaderboardNames; + /// + /// Name of the statistic. + /// + public string Name; + /// + /// Statistic version. + /// + public uint Version; + /// + /// The version reset configuration for the leaderboard definition. + /// + public VersionConfiguration VersionConfiguration; + } + + [Serializable] + public class GetStatisticsForEntitiesRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Collection of Entity IDs to retrieve statistics for. + /// + public List Entities; + } + + [Serializable] + public class GetStatisticsForEntitiesResponse : PlayFabResultCommon + { + /// + /// A mapping of statistic name to the columns defined in the corresponding definition. + /// + public Dictionary ColumnDetails; + /// + /// List of entities mapped to their statistics. Only the latest version of a statistic is returned. + /// + public List EntitiesStatistics; + } + + [Serializable] + public class GetStatisticsRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The optional entity to perform this action on. Defaults to the currently logged in entity. + /// + public EntityKey Entity; + } + + [Serializable] + public class GetStatisticsResponse : PlayFabResultCommon + { + /// + /// A mapping of statistic name to the columns defined in the corresponding definition. + /// + public Dictionary ColumnDetails; + /// + /// The entity id and type. + /// + public EntityKey Entity; + /// + /// List of statistics keyed by Name. Only the latest version of a statistic is returned. + /// + public Dictionary Statistics; + } + + [Serializable] + public class IncrementLeaderboardVersionRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The name of the leaderboard to increment the version for. + /// + public string Name; + } + + [Serializable] + public class IncrementLeaderboardVersionResponse : PlayFabResultCommon + { + /// + /// New Leaderboard version. + /// + public uint Version; + } + + [Serializable] + public class IncrementStatisticVersionRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Name of the statistic to increment the version of. + /// + public string Name; + } + + [Serializable] + public class IncrementStatisticVersionResponse : PlayFabResultCommon + { + /// + /// New statistic version. + /// + public uint Version; + } + + [Serializable] + public class LeaderboardColumn : PlayFabBaseModel + { + /// + /// If the value for this column is sourced from a statistic, details of the linked column. Null if the leaderboard is not + /// linked. + /// + public LinkedStatisticColumn LinkedStatisticColumn; + /// + /// A name for the leaderboard column, unique per leaderboard definition. + /// + public string Name; + /// + /// The sort direction for this column. + /// + public LeaderboardSortDirection SortDirection; + } + + [Serializable] + public class LeaderboardDefinition : PlayFabBaseModel + { + /// + /// Sort direction of the leaderboard columns, cannot be changed after creation. + /// + public List Columns; + /// + /// Created time, in UTC + /// + public DateTime Created; + /// + /// The entity type being represented on the leaderboard. If it doesn't correspond to the PlayFab entity types, use + /// 'external' as the type. + /// + public string EntityType; + /// + /// Last time, in UTC, leaderboard version was incremented. + /// + public DateTime? LastResetTime; + /// + /// A name for the leaderboard, unique per title. + /// + public string Name; + /// + /// Maximum number of entries on this leaderboard + /// + public int SizeLimit; + /// + /// Latest Leaderboard version. + /// + public uint Version; + /// + /// The version reset configuration for the leaderboard definition. + /// + public VersionConfiguration VersionConfiguration; + } + + [Serializable] + public class LeaderboardEntryUpdate : PlayFabBaseModel + { + /// + /// The unique Id for the entry. If using PlayFab Entities, this would be the entityId of the entity. + /// + public string EntityId; + /// + /// Arbitrary metadata to store along side the leaderboard entry, will be returned by all Leaderboard APIs. Must be less + /// than 50 UTF8 encoded characters. + /// + public string Metadata; + /// + /// The scores for the leaderboard. The number of values provided here must match the number of columns in the Leaderboard + /// definition. + /// + public List Scores; + } + + public enum LeaderboardSortDirection + { + Descending, + Ascending + } + + [Serializable] + public class LinkedStatisticColumn : PlayFabBaseModel + { + /// + /// The name of the statistic column that this leaderboard column is sourced from. + /// + public string LinkedStatisticColumnName; + /// + /// The name of the statistic. + /// + public string LinkedStatisticName; + } + + [Serializable] + public class ListLeaderboardDefinitionsRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + [Serializable] + public class ListLeaderboardDefinitionsResponse : PlayFabResultCommon + { + /// + /// List of leaderboard definitions for the title. + /// + public List LeaderboardDefinitions; + } + + [Serializable] + public class ListStatisticDefinitionsRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + [Serializable] + public class ListStatisticDefinitionsResponse : PlayFabResultCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// List of statistic definitions for the title. + /// + public List StatisticDefinitions; + } + + public enum ResetInterval + { + Manual, + Hour, + Day, + Week, + Month + } + + public enum StatisticAggregationMethod + { + Last, + Min, + Max, + Sum + } + + [Serializable] + public class StatisticColumn : PlayFabBaseModel + { + /// + /// Aggregation method for calculating new value of a statistic. + /// + public StatisticAggregationMethod AggregationMethod; + /// + /// Name of the statistic column, as originally configured. + /// + public string Name; + } + + [Serializable] + public class StatisticColumnCollection : PlayFabBaseModel + { + /// + /// Columns for the statistic defining the aggregation method for each column. + /// + public List Columns; + } + + [Serializable] + public class StatisticDefinition : PlayFabBaseModel + { + /// + /// The columns for the statistic defining the aggregation method for each column. + /// + public List Columns; + /// + /// Created time, in UTC + /// + public DateTime Created; + /// + /// The entity type that can have this statistic. + /// + public string EntityType; + /// + /// Last time, in UTC, statistic version was incremented. + /// + public DateTime? LastResetTime; + /// + /// The list of leaderboards that are linked to this statistic definition. + /// + public List LinkedLeaderboardNames; + /// + /// Name of the statistic. + /// + public string Name; + /// + /// Statistic version. + /// + public uint Version; + /// + /// The version reset configuration for the leaderboard definition. + /// + public VersionConfiguration VersionConfiguration; + } + + [Serializable] + public class StatisticDelete : PlayFabBaseModel + { + /// + /// Name of the statistic, as originally configured. + /// + public string Name; + } + + [Serializable] + public class StatisticUpdate : PlayFabBaseModel + { + /// + /// Arbitrary metadata to store along side the statistic, will be returned by all Leaderboard APIs. Must be less than 50 + /// UTF8 encoded characters. + /// + public string Metadata; + /// + /// Name of the statistic, as originally configured. + /// + public string Name; + /// + /// Statistic scores for the entity. This will be used in accordance with the aggregation method configured for the + /// statistics.The maximum value allowed for each individual score is 9223372036854775807. The minimum value for each + /// individual score is -9223372036854775807The values are formatted as strings to avoid interop issues with client + /// libraries unable to handle 64bit integers. + /// + public List Scores; + /// + /// Optional field to indicate the version of the statistic to set. When empty defaults to the statistic's current version. + /// + public uint? Version; + } + + [Serializable] + public class UnlinkLeaderboardFromStatisticRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The name of the leaderboard definition to unlink. + /// + public string Name; + /// + /// The name of the statistic definition to unlink. + /// + public string StatisticName; + } + + [Serializable] + public class UpdateLeaderboardEntriesRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entries to add or update on the leaderboard. + /// + public List Entries; + /// + /// The name of the leaderboard. + /// + public string LeaderboardName; + } + + [Serializable] + public class UpdateStatisticsRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The optional entity to perform this action on. Defaults to the currently logged in entity. + /// + public EntityKey Entity; + /// + /// Collection of statistics to update, maximum 50. + /// + public List Statistics; + } + + [Serializable] + public class UpdateStatisticsResponse : PlayFabResultCommon + { + /// + /// A mapping of statistic name to the columns defined in the corresponding definition. + /// + public Dictionary ColumnDetails; + /// + /// The entity id and type. + /// + public EntityKey Entity; + /// + /// Updated entity profile statistics. + /// + public Dictionary Statistics; + } + + [Serializable] + public class VersionConfiguration : PlayFabBaseModel + { + /// + /// The maximum number of versions of this leaderboard/statistic that can be queried. + /// + public int MaxQueryableVersions; + /// + /// Reset interval that statistics or leaderboards will reset on. When using Manual intervalthe reset can only be increased + /// by calling the Increase version API. When using Hour interval the resetwill occur at the start of the next hour UTC + /// time. When using Day interval the reset will occur at thestart of the next day in UTC time. When using the Week interval + /// the reset will occur at the start ofthe next Monday in UTC time. When using Month interval the reset will occur at the + /// start of the nextmonth in UTC time. + /// + public ResetInterval ResetInterval; + } +} +#endif diff --git a/Assets/PlayFabSDK/Progression/PlayFabProgressionModels.cs.meta b/Assets/PlayFabSDK/Progression/PlayFabProgressionModels.cs.meta new file mode 100644 index 00000000..382d715d --- /dev/null +++ b/Assets/PlayFabSDK/Progression/PlayFabProgressionModels.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 98dd4b7b25d8a1c4481a206e643cb9e3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Server.meta b/Assets/PlayFabSDK/Server.meta new file mode 100644 index 00000000..662e8e33 --- /dev/null +++ b/Assets/PlayFabSDK/Server.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 786fe1734d049a549bcfddfa85763635 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Server/PlayFabEvents.cs b/Assets/PlayFabSDK/Server/PlayFabEvents.cs new file mode 100644 index 00000000..f64b6b39 --- /dev/null +++ b/Assets/PlayFabSDK/Server/PlayFabEvents.cs @@ -0,0 +1,284 @@ +#if ENABLE_PLAYFABSERVER_API +using PlayFab.ServerModels; + +namespace PlayFab.Events +{ + public partial class PlayFabEvents + { + public event PlayFabRequestEvent OnServerAddCharacterVirtualCurrencyRequestEvent; + public event PlayFabResultEvent OnServerAddCharacterVirtualCurrencyResultEvent; + public event PlayFabRequestEvent OnServerAddFriendRequestEvent; + public event PlayFabResultEvent OnServerAddFriendResultEvent; + public event PlayFabRequestEvent OnServerAddGenericIDRequestEvent; + public event PlayFabResultEvent OnServerAddGenericIDResultEvent; + public event PlayFabRequestEvent OnServerAddPlayerTagRequestEvent; + public event PlayFabResultEvent OnServerAddPlayerTagResultEvent; + public event PlayFabRequestEvent OnServerAddSharedGroupMembersRequestEvent; + public event PlayFabResultEvent OnServerAddSharedGroupMembersResultEvent; + public event PlayFabRequestEvent OnServerAddUserVirtualCurrencyRequestEvent; + public event PlayFabResultEvent OnServerAddUserVirtualCurrencyResultEvent; + public event PlayFabRequestEvent OnServerAuthenticateSessionTicketRequestEvent; + public event PlayFabResultEvent OnServerAuthenticateSessionTicketResultEvent; + public event PlayFabRequestEvent OnServerAwardSteamAchievementRequestEvent; + public event PlayFabResultEvent OnServerAwardSteamAchievementResultEvent; + public event PlayFabRequestEvent OnServerBanUsersRequestEvent; + public event PlayFabResultEvent OnServerBanUsersResultEvent; + public event PlayFabRequestEvent OnServerConsumeItemRequestEvent; + public event PlayFabResultEvent OnServerConsumeItemResultEvent; + public event PlayFabRequestEvent OnServerCreateSharedGroupRequestEvent; + public event PlayFabResultEvent OnServerCreateSharedGroupResultEvent; + public event PlayFabRequestEvent OnServerDeleteCharacterFromUserRequestEvent; + public event PlayFabResultEvent OnServerDeleteCharacterFromUserResultEvent; + public event PlayFabRequestEvent OnServerDeletePlayerRequestEvent; + public event PlayFabResultEvent OnServerDeletePlayerResultEvent; + public event PlayFabRequestEvent OnServerDeletePushNotificationTemplateRequestEvent; + public event PlayFabResultEvent OnServerDeletePushNotificationTemplateResultEvent; + public event PlayFabRequestEvent OnServerDeleteSharedGroupRequestEvent; + public event PlayFabResultEvent OnServerDeleteSharedGroupResultEvent; + public event PlayFabRequestEvent OnServerEvaluateRandomResultTableRequestEvent; + public event PlayFabResultEvent OnServerEvaluateRandomResultTableResultEvent; + public event PlayFabRequestEvent OnServerExecuteCloudScriptRequestEvent; + public event PlayFabResultEvent OnServerExecuteCloudScriptResultEvent; + public event PlayFabRequestEvent OnServerGetAllSegmentsRequestEvent; + public event PlayFabResultEvent OnServerGetAllSegmentsResultEvent; + public event PlayFabRequestEvent OnServerGetAllUsersCharactersRequestEvent; + public event PlayFabResultEvent OnServerGetAllUsersCharactersResultEvent; + public event PlayFabRequestEvent OnServerGetCatalogItemsRequestEvent; + public event PlayFabResultEvent OnServerGetCatalogItemsResultEvent; + public event PlayFabRequestEvent OnServerGetCharacterDataRequestEvent; + public event PlayFabResultEvent OnServerGetCharacterDataResultEvent; + public event PlayFabRequestEvent OnServerGetCharacterInternalDataRequestEvent; + public event PlayFabResultEvent OnServerGetCharacterInternalDataResultEvent; + public event PlayFabRequestEvent OnServerGetCharacterInventoryRequestEvent; + public event PlayFabResultEvent OnServerGetCharacterInventoryResultEvent; + public event PlayFabRequestEvent OnServerGetCharacterLeaderboardRequestEvent; + public event PlayFabResultEvent OnServerGetCharacterLeaderboardResultEvent; + public event PlayFabRequestEvent OnServerGetCharacterReadOnlyDataRequestEvent; + public event PlayFabResultEvent OnServerGetCharacterReadOnlyDataResultEvent; + public event PlayFabRequestEvent OnServerGetCharacterStatisticsRequestEvent; + public event PlayFabResultEvent OnServerGetCharacterStatisticsResultEvent; + public event PlayFabRequestEvent OnServerGetContentDownloadUrlRequestEvent; + public event PlayFabResultEvent OnServerGetContentDownloadUrlResultEvent; + public event PlayFabRequestEvent OnServerGetFriendLeaderboardRequestEvent; + public event PlayFabResultEvent OnServerGetFriendLeaderboardResultEvent; + public event PlayFabRequestEvent OnServerGetFriendsListRequestEvent; + public event PlayFabResultEvent OnServerGetFriendsListResultEvent; + public event PlayFabRequestEvent OnServerGetLeaderboardRequestEvent; + public event PlayFabResultEvent OnServerGetLeaderboardResultEvent; + public event PlayFabRequestEvent OnServerGetLeaderboardAroundCharacterRequestEvent; + public event PlayFabResultEvent OnServerGetLeaderboardAroundCharacterResultEvent; + public event PlayFabRequestEvent OnServerGetLeaderboardAroundUserRequestEvent; + public event PlayFabResultEvent OnServerGetLeaderboardAroundUserResultEvent; + public event PlayFabRequestEvent OnServerGetLeaderboardForUserCharactersRequestEvent; + public event PlayFabResultEvent OnServerGetLeaderboardForUserCharactersResultEvent; + public event PlayFabRequestEvent OnServerGetPlayerCombinedInfoRequestEvent; + public event PlayFabResultEvent OnServerGetPlayerCombinedInfoResultEvent; + public event PlayFabRequestEvent OnServerGetPlayerProfileRequestEvent; + public event PlayFabResultEvent OnServerGetPlayerProfileResultEvent; + public event PlayFabRequestEvent OnServerGetPlayerSegmentsRequestEvent; + public event PlayFabResultEvent OnServerGetPlayerSegmentsResultEvent; + public event PlayFabRequestEvent OnServerGetPlayersInSegmentRequestEvent; + public event PlayFabResultEvent OnServerGetPlayersInSegmentResultEvent; + public event PlayFabRequestEvent OnServerGetPlayerStatisticsRequestEvent; + public event PlayFabResultEvent OnServerGetPlayerStatisticsResultEvent; + public event PlayFabRequestEvent OnServerGetPlayerStatisticVersionsRequestEvent; + public event PlayFabResultEvent OnServerGetPlayerStatisticVersionsResultEvent; + public event PlayFabRequestEvent OnServerGetPlayerTagsRequestEvent; + public event PlayFabResultEvent OnServerGetPlayerTagsResultEvent; + public event PlayFabRequestEvent OnServerGetPlayFabIDsFromFacebookIDsRequestEvent; + public event PlayFabResultEvent OnServerGetPlayFabIDsFromFacebookIDsResultEvent; + public event PlayFabRequestEvent OnServerGetPlayFabIDsFromFacebookInstantGamesIdsRequestEvent; + public event PlayFabResultEvent OnServerGetPlayFabIDsFromFacebookInstantGamesIdsResultEvent; + public event PlayFabRequestEvent OnServerGetPlayFabIDsFromGenericIDsRequestEvent; + public event PlayFabResultEvent OnServerGetPlayFabIDsFromGenericIDsResultEvent; + public event PlayFabRequestEvent OnServerGetPlayFabIDsFromNintendoServiceAccountIdsRequestEvent; + public event PlayFabResultEvent OnServerGetPlayFabIDsFromNintendoServiceAccountIdsResultEvent; + public event PlayFabRequestEvent OnServerGetPlayFabIDsFromNintendoSwitchDeviceIdsRequestEvent; + public event PlayFabResultEvent OnServerGetPlayFabIDsFromNintendoSwitchDeviceIdsResultEvent; + public event PlayFabRequestEvent OnServerGetPlayFabIDsFromPSNAccountIDsRequestEvent; + public event PlayFabResultEvent OnServerGetPlayFabIDsFromPSNAccountIDsResultEvent; + public event PlayFabRequestEvent OnServerGetPlayFabIDsFromPSNOnlineIDsRequestEvent; + public event PlayFabResultEvent OnServerGetPlayFabIDsFromPSNOnlineIDsResultEvent; + public event PlayFabRequestEvent OnServerGetPlayFabIDsFromSteamIDsRequestEvent; + public event PlayFabResultEvent OnServerGetPlayFabIDsFromSteamIDsResultEvent; + public event PlayFabRequestEvent OnServerGetPlayFabIDsFromTwitchIDsRequestEvent; + public event PlayFabResultEvent OnServerGetPlayFabIDsFromTwitchIDsResultEvent; + public event PlayFabRequestEvent OnServerGetPlayFabIDsFromXboxLiveIDsRequestEvent; + public event PlayFabResultEvent OnServerGetPlayFabIDsFromXboxLiveIDsResultEvent; + public event PlayFabRequestEvent OnServerGetPublisherDataRequestEvent; + public event PlayFabResultEvent OnServerGetPublisherDataResultEvent; + public event PlayFabRequestEvent OnServerGetRandomResultTablesRequestEvent; + public event PlayFabResultEvent OnServerGetRandomResultTablesResultEvent; + public event PlayFabRequestEvent OnServerGetServerCustomIDsFromPlayFabIDsRequestEvent; + public event PlayFabResultEvent OnServerGetServerCustomIDsFromPlayFabIDsResultEvent; + public event PlayFabRequestEvent OnServerGetSharedGroupDataRequestEvent; + public event PlayFabResultEvent OnServerGetSharedGroupDataResultEvent; + public event PlayFabRequestEvent OnServerGetStoreItemsRequestEvent; + public event PlayFabResultEvent OnServerGetStoreItemsResultEvent; + public event PlayFabRequestEvent OnServerGetTimeRequestEvent; + public event PlayFabResultEvent OnServerGetTimeResultEvent; + public event PlayFabRequestEvent OnServerGetTitleDataRequestEvent; + public event PlayFabResultEvent OnServerGetTitleDataResultEvent; + public event PlayFabRequestEvent OnServerGetTitleInternalDataRequestEvent; + public event PlayFabResultEvent OnServerGetTitleInternalDataResultEvent; + public event PlayFabRequestEvent OnServerGetTitleNewsRequestEvent; + public event PlayFabResultEvent OnServerGetTitleNewsResultEvent; + public event PlayFabRequestEvent OnServerGetUserAccountInfoRequestEvent; + public event PlayFabResultEvent OnServerGetUserAccountInfoResultEvent; + public event PlayFabRequestEvent OnServerGetUserBansRequestEvent; + public event PlayFabResultEvent OnServerGetUserBansResultEvent; + public event PlayFabRequestEvent OnServerGetUserDataRequestEvent; + public event PlayFabResultEvent OnServerGetUserDataResultEvent; + public event PlayFabRequestEvent OnServerGetUserInternalDataRequestEvent; + public event PlayFabResultEvent OnServerGetUserInternalDataResultEvent; + public event PlayFabRequestEvent OnServerGetUserInventoryRequestEvent; + public event PlayFabResultEvent OnServerGetUserInventoryResultEvent; + public event PlayFabRequestEvent OnServerGetUserPublisherDataRequestEvent; + public event PlayFabResultEvent OnServerGetUserPublisherDataResultEvent; + public event PlayFabRequestEvent OnServerGetUserPublisherInternalDataRequestEvent; + public event PlayFabResultEvent OnServerGetUserPublisherInternalDataResultEvent; + public event PlayFabRequestEvent OnServerGetUserPublisherReadOnlyDataRequestEvent; + public event PlayFabResultEvent OnServerGetUserPublisherReadOnlyDataResultEvent; + public event PlayFabRequestEvent OnServerGetUserReadOnlyDataRequestEvent; + public event PlayFabResultEvent OnServerGetUserReadOnlyDataResultEvent; + public event PlayFabRequestEvent OnServerGrantCharacterToUserRequestEvent; + public event PlayFabResultEvent OnServerGrantCharacterToUserResultEvent; + public event PlayFabRequestEvent OnServerGrantItemsToCharacterRequestEvent; + public event PlayFabResultEvent OnServerGrantItemsToCharacterResultEvent; + public event PlayFabRequestEvent OnServerGrantItemsToUserRequestEvent; + public event PlayFabResultEvent OnServerGrantItemsToUserResultEvent; + public event PlayFabRequestEvent OnServerGrantItemsToUsersRequestEvent; + public event PlayFabResultEvent OnServerGrantItemsToUsersResultEvent; + public event PlayFabRequestEvent OnServerLinkNintendoServiceAccountRequestEvent; + public event PlayFabResultEvent OnServerLinkNintendoServiceAccountResultEvent; + public event PlayFabRequestEvent OnServerLinkNintendoServiceAccountSubjectRequestEvent; + public event PlayFabResultEvent OnServerLinkNintendoServiceAccountSubjectResultEvent; + public event PlayFabRequestEvent OnServerLinkNintendoSwitchDeviceIdRequestEvent; + public event PlayFabResultEvent OnServerLinkNintendoSwitchDeviceIdResultEvent; + public event PlayFabRequestEvent OnServerLinkPSNAccountRequestEvent; + public event PlayFabResultEvent OnServerLinkPSNAccountResultEvent; + public event PlayFabRequestEvent OnServerLinkPSNIdRequestEvent; + public event PlayFabResultEvent OnServerLinkPSNIdResultEvent; + public event PlayFabRequestEvent OnServerLinkServerCustomIdRequestEvent; + public event PlayFabResultEvent OnServerLinkServerCustomIdResultEvent; + public event PlayFabRequestEvent OnServerLinkSteamIdRequestEvent; + public event PlayFabResultEvent OnServerLinkSteamIdResultEvent; + public event PlayFabRequestEvent OnServerLinkXboxAccountRequestEvent; + public event PlayFabResultEvent OnServerLinkXboxAccountResultEvent; + public event PlayFabRequestEvent OnServerLoginWithPSNRequestEvent; + public event PlayFabResultEvent OnServerLoginWithPSNResultEvent; + public event PlayFabRequestEvent OnServerLoginWithServerCustomIdRequestEvent; + public event PlayFabResultEvent OnServerLoginWithServerCustomIdResultEvent; + public event PlayFabRequestEvent OnServerLoginWithSteamIdRequestEvent; + public event PlayFabResultEvent OnServerLoginWithSteamIdResultEvent; + public event PlayFabRequestEvent OnServerLoginWithXboxRequestEvent; + public event PlayFabResultEvent OnServerLoginWithXboxResultEvent; + public event PlayFabRequestEvent OnServerLoginWithXboxIdRequestEvent; + public event PlayFabResultEvent OnServerLoginWithXboxIdResultEvent; + public event PlayFabRequestEvent OnServerModifyItemUsesRequestEvent; + public event PlayFabResultEvent OnServerModifyItemUsesResultEvent; + public event PlayFabRequestEvent OnServerMoveItemToCharacterFromCharacterRequestEvent; + public event PlayFabResultEvent OnServerMoveItemToCharacterFromCharacterResultEvent; + public event PlayFabRequestEvent OnServerMoveItemToCharacterFromUserRequestEvent; + public event PlayFabResultEvent OnServerMoveItemToCharacterFromUserResultEvent; + public event PlayFabRequestEvent OnServerMoveItemToUserFromCharacterRequestEvent; + public event PlayFabResultEvent OnServerMoveItemToUserFromCharacterResultEvent; + public event PlayFabRequestEvent OnServerRedeemCouponRequestEvent; + public event PlayFabResultEvent OnServerRedeemCouponResultEvent; + public event PlayFabRequestEvent OnServerRemoveFriendRequestEvent; + public event PlayFabResultEvent OnServerRemoveFriendResultEvent; + public event PlayFabRequestEvent OnServerRemoveGenericIDRequestEvent; + public event PlayFabResultEvent OnServerRemoveGenericIDResultEvent; + public event PlayFabRequestEvent OnServerRemovePlayerTagRequestEvent; + public event PlayFabResultEvent OnServerRemovePlayerTagResultEvent; + public event PlayFabRequestEvent OnServerRemoveSharedGroupMembersRequestEvent; + public event PlayFabResultEvent OnServerRemoveSharedGroupMembersResultEvent; + public event PlayFabRequestEvent OnServerReportPlayerRequestEvent; + public event PlayFabResultEvent OnServerReportPlayerResultEvent; + public event PlayFabRequestEvent OnServerRevokeAllBansForUserRequestEvent; + public event PlayFabResultEvent OnServerRevokeAllBansForUserResultEvent; + public event PlayFabRequestEvent OnServerRevokeBansRequestEvent; + public event PlayFabResultEvent OnServerRevokeBansResultEvent; + public event PlayFabRequestEvent OnServerRevokeInventoryItemRequestEvent; + public event PlayFabResultEvent OnServerRevokeInventoryItemResultEvent; + public event PlayFabRequestEvent OnServerRevokeInventoryItemsRequestEvent; + public event PlayFabResultEvent OnServerRevokeInventoryItemsResultEvent; + public event PlayFabRequestEvent OnServerSavePushNotificationTemplateRequestEvent; + public event PlayFabResultEvent OnServerSavePushNotificationTemplateResultEvent; + public event PlayFabRequestEvent OnServerSendCustomAccountRecoveryEmailRequestEvent; + public event PlayFabResultEvent OnServerSendCustomAccountRecoveryEmailResultEvent; + public event PlayFabRequestEvent OnServerSendEmailFromTemplateRequestEvent; + public event PlayFabResultEvent OnServerSendEmailFromTemplateResultEvent; + public event PlayFabRequestEvent OnServerSendPushNotificationRequestEvent; + public event PlayFabResultEvent OnServerSendPushNotificationResultEvent; + public event PlayFabRequestEvent OnServerSendPushNotificationFromTemplateRequestEvent; + public event PlayFabResultEvent OnServerSendPushNotificationFromTemplateResultEvent; + public event PlayFabRequestEvent OnServerSetFriendTagsRequestEvent; + public event PlayFabResultEvent OnServerSetFriendTagsResultEvent; + public event PlayFabRequestEvent OnServerSetPlayerSecretRequestEvent; + public event PlayFabResultEvent OnServerSetPlayerSecretResultEvent; + public event PlayFabRequestEvent OnServerSetPublisherDataRequestEvent; + public event PlayFabResultEvent OnServerSetPublisherDataResultEvent; + public event PlayFabRequestEvent OnServerSetTitleDataRequestEvent; + public event PlayFabResultEvent OnServerSetTitleDataResultEvent; + public event PlayFabRequestEvent OnServerSetTitleInternalDataRequestEvent; + public event PlayFabResultEvent OnServerSetTitleInternalDataResultEvent; + public event PlayFabRequestEvent OnServerSubtractCharacterVirtualCurrencyRequestEvent; + public event PlayFabResultEvent OnServerSubtractCharacterVirtualCurrencyResultEvent; + public event PlayFabRequestEvent OnServerSubtractUserVirtualCurrencyRequestEvent; + public event PlayFabResultEvent OnServerSubtractUserVirtualCurrencyResultEvent; + public event PlayFabRequestEvent OnServerUnlinkNintendoServiceAccountRequestEvent; + public event PlayFabResultEvent OnServerUnlinkNintendoServiceAccountResultEvent; + public event PlayFabRequestEvent OnServerUnlinkNintendoSwitchDeviceIdRequestEvent; + public event PlayFabResultEvent OnServerUnlinkNintendoSwitchDeviceIdResultEvent; + public event PlayFabRequestEvent OnServerUnlinkPSNAccountRequestEvent; + public event PlayFabResultEvent OnServerUnlinkPSNAccountResultEvent; + public event PlayFabRequestEvent OnServerUnlinkServerCustomIdRequestEvent; + public event PlayFabResultEvent OnServerUnlinkServerCustomIdResultEvent; + public event PlayFabRequestEvent OnServerUnlinkSteamIdRequestEvent; + public event PlayFabResultEvent OnServerUnlinkSteamIdResultEvent; + public event PlayFabRequestEvent OnServerUnlinkXboxAccountRequestEvent; + public event PlayFabResultEvent OnServerUnlinkXboxAccountResultEvent; + public event PlayFabRequestEvent OnServerUnlockContainerInstanceRequestEvent; + public event PlayFabResultEvent OnServerUnlockContainerInstanceResultEvent; + public event PlayFabRequestEvent OnServerUnlockContainerItemRequestEvent; + public event PlayFabResultEvent OnServerUnlockContainerItemResultEvent; + public event PlayFabRequestEvent OnServerUpdateAvatarUrlRequestEvent; + public event PlayFabResultEvent OnServerUpdateAvatarUrlResultEvent; + public event PlayFabRequestEvent OnServerUpdateBansRequestEvent; + public event PlayFabResultEvent OnServerUpdateBansResultEvent; + public event PlayFabRequestEvent OnServerUpdateCharacterDataRequestEvent; + public event PlayFabResultEvent OnServerUpdateCharacterDataResultEvent; + public event PlayFabRequestEvent OnServerUpdateCharacterInternalDataRequestEvent; + public event PlayFabResultEvent OnServerUpdateCharacterInternalDataResultEvent; + public event PlayFabRequestEvent OnServerUpdateCharacterReadOnlyDataRequestEvent; + public event PlayFabResultEvent OnServerUpdateCharacterReadOnlyDataResultEvent; + public event PlayFabRequestEvent OnServerUpdateCharacterStatisticsRequestEvent; + public event PlayFabResultEvent OnServerUpdateCharacterStatisticsResultEvent; + public event PlayFabRequestEvent OnServerUpdatePlayerStatisticsRequestEvent; + public event PlayFabResultEvent OnServerUpdatePlayerStatisticsResultEvent; + public event PlayFabRequestEvent OnServerUpdateSharedGroupDataRequestEvent; + public event PlayFabResultEvent OnServerUpdateSharedGroupDataResultEvent; + public event PlayFabRequestEvent OnServerUpdateUserDataRequestEvent; + public event PlayFabResultEvent OnServerUpdateUserDataResultEvent; + public event PlayFabRequestEvent OnServerUpdateUserInternalDataRequestEvent; + public event PlayFabResultEvent OnServerUpdateUserInternalDataResultEvent; + public event PlayFabRequestEvent OnServerUpdateUserInventoryItemCustomDataRequestEvent; + public event PlayFabResultEvent OnServerUpdateUserInventoryItemCustomDataResultEvent; + public event PlayFabRequestEvent OnServerUpdateUserPublisherDataRequestEvent; + public event PlayFabResultEvent OnServerUpdateUserPublisherDataResultEvent; + public event PlayFabRequestEvent OnServerUpdateUserPublisherInternalDataRequestEvent; + public event PlayFabResultEvent OnServerUpdateUserPublisherInternalDataResultEvent; + public event PlayFabRequestEvent OnServerUpdateUserPublisherReadOnlyDataRequestEvent; + public event PlayFabResultEvent OnServerUpdateUserPublisherReadOnlyDataResultEvent; + public event PlayFabRequestEvent OnServerUpdateUserReadOnlyDataRequestEvent; + public event PlayFabResultEvent OnServerUpdateUserReadOnlyDataResultEvent; + public event PlayFabRequestEvent OnServerWriteCharacterEventRequestEvent; + public event PlayFabResultEvent OnServerWriteCharacterEventResultEvent; + public event PlayFabRequestEvent OnServerWritePlayerEventRequestEvent; + public event PlayFabResultEvent OnServerWritePlayerEventResultEvent; + public event PlayFabRequestEvent OnServerWriteTitleEventRequestEvent; + public event PlayFabResultEvent OnServerWriteTitleEventResultEvent; + } +} +#endif diff --git a/Assets/PlayFabSDK/Server/PlayFabEvents.cs.meta b/Assets/PlayFabSDK/Server/PlayFabEvents.cs.meta new file mode 100644 index 00000000..0cac239c --- /dev/null +++ b/Assets/PlayFabSDK/Server/PlayFabEvents.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0d5076be1f923f141a2a5ea2a53a1385 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Server/PlayFabServerAPI.cs b/Assets/PlayFabSDK/Server/PlayFabServerAPI.cs new file mode 100644 index 00000000..317d6b70 --- /dev/null +++ b/Assets/PlayFabSDK/Server/PlayFabServerAPI.cs @@ -0,0 +1,1921 @@ +#if ENABLE_PLAYFABSERVER_API && !DISABLE_PLAYFAB_STATIC_API + +using System; +using System.Collections.Generic; +using PlayFab.ServerModels; +using PlayFab.Internal; + +namespace PlayFab +{ + /// + /// Provides functionality to allow external (developer-controlled) servers to interact with user inventories and data in a + /// trusted manner, and to handle matchmaking and client connection orchestration + /// + public static class PlayFabServerAPI + { + static PlayFabServerAPI() {} + + + /// + /// Clear the Client SessionToken which allows this Client to call API calls requiring login. + /// A new/fresh login will be required after calling this. + /// + public static void ForgetAllCredentials() + { + PlayFabSettings.staticPlayer.ForgetAllCredentials(); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Increments the character's balance of the specified virtual currency by the stated amount + /// + public static void AddCharacterVirtualCurrency(AddCharacterVirtualCurrencyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/AddCharacterVirtualCurrency", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Adds the Friend user to the friendlist of the user with PlayFabId. At least one of + /// FriendPlayFabId,FriendUsername,FriendEmail, or FriendTitleDisplayName should be initialized. + /// + public static void AddFriend(AddFriendRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/AddFriend", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Adds the specified generic service identifier to the player's PlayFab account. This is designed to allow for a PlayFab + /// ID lookup of any arbitrary service identifier a title wants to add. This identifier should never be used as + /// authentication credentials, as the intent is that it is easily accessible by other players. + /// + public static void AddGenericID(AddGenericIDRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/AddGenericID", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Adds a given tag to a player profile. The tag's namespace is automatically generated based on the source of the tag. + /// + public static void AddPlayerTag(AddPlayerTagRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/AddPlayerTag", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Adds users to the set of those able to update both the shared data, as well as the set of users in the group. Only users + /// in the group (and the server) can add new members. Shared Groups are designed for sharing data between a very small + /// number of players, please see our guide: + /// https://docs.microsoft.com/gaming/playfab/features/social/groups/using-shared-group-data + /// + public static void AddSharedGroupMembers(AddSharedGroupMembersRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/AddSharedGroupMembers", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Increments the user's balance of the specified virtual currency by the stated amount + /// + public static void AddUserVirtualCurrency(AddUserVirtualCurrencyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/AddUserVirtualCurrency", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Validated a client's session ticket, and if successful, returns details for that user + /// + public static void AuthenticateSessionTicket(AuthenticateSessionTicketRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/AuthenticateSessionTicket", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Awards the specified users the specified Steam achievements + /// + public static void AwardSteamAchievement(AwardSteamAchievementRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/AwardSteamAchievement", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Bans users by PlayFab ID with optional IP address, or MAC address for the provided game. + /// + public static void BanUsers(BanUsersRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/BanUsers", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Consume uses of a consumable item. When all uses are consumed, it will be removed from the player's + /// inventory. + /// + public static void ConsumeItem(ConsumeItemRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/ConsumeItem", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Requests the creation of a shared group object, containing key/value pairs which may be updated by all members of the + /// group. When created by a server, the group will initially have no members. Shared Groups are designed for sharing data + /// between a very small number of players, please see our guide: + /// https://docs.microsoft.com/gaming/playfab/features/social/groups/using-shared-group-data + /// + public static void CreateSharedGroup(CreateSharedGroupRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/CreateSharedGroup", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Deletes the specific character ID from the specified user. + /// + public static void DeleteCharacterFromUser(DeleteCharacterFromUserRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/DeleteCharacterFromUser", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Removes a user's player account from a title and deletes all associated data + /// + public static void DeletePlayer(DeletePlayerRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/DeletePlayer", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Deletes push notification template for title + /// + public static void DeletePushNotificationTemplate(DeletePushNotificationTemplateRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/DeletePushNotificationTemplate", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Deletes a shared group, freeing up the shared group ID to be reused for a new group. Shared Groups are designed for + /// sharing data between a very small number of players, please see our guide: + /// https://docs.microsoft.com/gaming/playfab/features/social/groups/using-shared-group-data + /// + public static void DeleteSharedGroup(DeleteSharedGroupRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/DeleteSharedGroup", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Returns the result of an evaluation of a Random Result Table - the ItemId from the game Catalog which would + /// have been added to the player inventory, if the Random Result Table were added via a Bundle or a call to + /// UnlockContainer. + /// + public static void EvaluateRandomResultTable(EvaluateRandomResultTableRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/EvaluateRandomResultTable", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Executes a CloudScript function, with the 'currentPlayerId' set to the PlayFab ID of the authenticated player. The + /// PlayFab ID is the entity ID of the player's master_player_account entity. + /// + public static void ExecuteCloudScript(ExecuteCloudScriptServerRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/ExecuteCloudScript", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + public static void ExecuteCloudScript(ExecuteCloudScriptServerRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); + Action wrappedResultCallback = (wrappedResult) => + { + var serializer = PluginManager.GetPlugin(PluginContract.PlayFab_Serializer); + var wrappedJson = serializer.SerializeObject(wrappedResult.FunctionResult); + try { + wrappedResult.FunctionResult = serializer.DeserializeObject(wrappedJson); + } catch (Exception) { + wrappedResult.FunctionResult = wrappedJson; + wrappedResult.Logs.Add(new LogStatement { Level = "Warning", Data = wrappedJson, Message = "Sdk Message: Could not deserialize result as: " + typeof(TOut).Name }); + } + resultCallback(wrappedResult); + }; + PlayFabHttp.MakeApiCall("/Server/ExecuteCloudScript", request, AuthType.DevSecretKey, wrappedResultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves an array of player segment definitions. Results from this can be used in subsequent API calls such as + /// GetPlayersInSegment which requires a Segment ID. While segment names can change the ID for that segment will not change. + /// + public static void GetAllSegments(GetAllSegmentsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetAllSegments", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Lists all of the characters that belong to a specific user. CharacterIds are not globally unique; characterId must be + /// evaluated with the parent PlayFabId to guarantee uniqueness. + /// + public static void GetAllUsersCharacters(ListUsersCharactersRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetAllUsersCharacters", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Retrieves the specified version of the title's catalog of virtual goods, including all defined properties + /// + public static void GetCatalogItems(GetCatalogItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetCatalogItems", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the title-specific custom data for the user which is readable and writable by the client + /// + public static void GetCharacterData(GetCharacterDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetCharacterData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the title-specific custom data for the user's character which cannot be accessed by the client + /// + public static void GetCharacterInternalData(GetCharacterDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetCharacterInternalData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Retrieves the specified character's current inventory of virtual goods + /// + public static void GetCharacterInventory(GetCharacterInventoryRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetCharacterInventory", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves a list of ranked characters for the given statistic, starting from the indicated point in the leaderboard + /// + public static void GetCharacterLeaderboard(GetCharacterLeaderboardRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetCharacterLeaderboard", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the title-specific custom data for the user's character which can only be read by the client + /// + public static void GetCharacterReadOnlyData(GetCharacterDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetCharacterReadOnlyData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the details of all title-specific statistics for the specific character + /// + public static void GetCharacterStatistics(GetCharacterStatisticsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetCharacterStatistics", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// This API retrieves a pre-signed URL for accessing a content file for the title. A subsequent HTTP GET to the returned + /// URL will attempt to download the content. A HEAD query to the returned URL will attempt to retrieve the metadata of the + /// content. Note that a successful result does not guarantee the existence of this content - if it has not been uploaded, + /// the query to retrieve the data will fail. See this post for more information: + /// https://community.playfab.com/hc/community/posts/205469488-How-to-upload-files-to-PlayFab-s-Content-Service. Also, + /// please be aware that the Content service is specifically PlayFab's CDN offering, for which standard CDN rates apply. + /// + public static void GetContentDownloadUrl(GetContentDownloadUrlRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetContentDownloadUrl", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves a list of ranked friends of the given player for the given statistic, starting from the indicated point in the + /// leaderboard + /// + public static void GetFriendLeaderboard(GetFriendLeaderboardRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetFriendLeaderboard", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the current friends for the user with PlayFabId, constrained to users who have PlayFab accounts. Friends from + /// linked accounts (Facebook, Steam) are also included. You may optionally exclude some linked services' friends. + /// + public static void GetFriendsList(GetFriendsListRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetFriendsList", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves a list of ranked users for the given statistic, starting from the indicated point in the leaderboard + /// + public static void GetLeaderboard(GetLeaderboardRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetLeaderboard", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves a list of ranked characters for the given statistic, centered on the requested user + /// + public static void GetLeaderboardAroundCharacter(GetLeaderboardAroundCharacterRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetLeaderboardAroundCharacter", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves a list of ranked users for the given statistic, centered on the currently signed-in user + /// + public static void GetLeaderboardAroundUser(GetLeaderboardAroundUserRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetLeaderboardAroundUser", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves a list of all of the user's characters for the given statistic. + /// + public static void GetLeaderboardForUserCharacters(GetLeaderboardForUsersCharactersRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetLeaderboardForUserCharacters", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Returns whatever info is requested in the response for the user. Note that PII (like email address, facebook id) may be + /// returned. All parameters default to false. + /// + public static void GetPlayerCombinedInfo(GetPlayerCombinedInfoRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetPlayerCombinedInfo", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the player's profile + /// + public static void GetPlayerProfile(GetPlayerProfileRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetPlayerProfile", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// List all segments that a player currently belongs to at this moment in time. + /// + public static void GetPlayerSegments(GetPlayersSegmentsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetPlayerSegments", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Allows for paging through all players in a given segment. This API creates a snapshot of all player profiles that match + /// the segment definition at the time of its creation and lives through the Total Seconds to Live, refreshing its life span + /// on each subsequent use of the Continuation Token. Profiles that change during the course of paging will not be reflected + /// in the results. AB Test segments are currently not supported by this operation. NOTE: This API is limited to being + /// called 30 times in one minute. You will be returned an error if you exceed this threshold. + /// + public static void GetPlayersInSegment(GetPlayersInSegmentRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetPlayersInSegment", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the current version and values for the indicated statistics, for the local player. + /// + public static void GetPlayerStatistics(GetPlayerStatisticsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetPlayerStatistics", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the information on the available versions of the specified statistic. + /// + public static void GetPlayerStatisticVersions(GetPlayerStatisticVersionsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetPlayerStatisticVersions", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Get all tags with a given Namespace (optional) from a player profile. + /// + public static void GetPlayerTags(GetPlayerTagsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetPlayerTags", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of Facebook identifiers. + /// + public static void GetPlayFabIDsFromFacebookIDs(GetPlayFabIDsFromFacebookIDsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetPlayFabIDsFromFacebookIDs", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of Facebook Instant Games identifiers. + /// + public static void GetPlayFabIDsFromFacebookInstantGamesIds(GetPlayFabIDsFromFacebookInstantGamesIdsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetPlayFabIDsFromFacebookInstantGamesIds", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of generic service identifiers. A generic identifier is the + /// service name plus the service-specific ID for the player, as specified by the title when the generic identifier was + /// added to the player account. + /// + public static void GetPlayFabIDsFromGenericIDs(GetPlayFabIDsFromGenericIDsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetPlayFabIDsFromGenericIDs", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of Nintendo Service Account identifiers. + /// + public static void GetPlayFabIDsFromNintendoServiceAccountIds(GetPlayFabIDsFromNintendoServiceAccountIdsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetPlayFabIDsFromNintendoServiceAccountIds", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of Nintendo Switch Device identifiers. + /// + public static void GetPlayFabIDsFromNintendoSwitchDeviceIds(GetPlayFabIDsFromNintendoSwitchDeviceIdsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetPlayFabIDsFromNintendoSwitchDeviceIds", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of PlayStation :tm: Network identifiers. + /// + public static void GetPlayFabIDsFromPSNAccountIDs(GetPlayFabIDsFromPSNAccountIDsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetPlayFabIDsFromPSNAccountIDs", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of PlayStation :tm: Network identifiers. + /// + public static void GetPlayFabIDsFromPSNOnlineIDs(GetPlayFabIDsFromPSNOnlineIDsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetPlayFabIDsFromPSNOnlineIDs", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of Steam identifiers. The Steam identifiers are the profile + /// IDs for the user accounts, available as SteamId in the Steamworks Community API calls. + /// + public static void GetPlayFabIDsFromSteamIDs(GetPlayFabIDsFromSteamIDsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetPlayFabIDsFromSteamIDs", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of Twitch identifiers. The Twitch identifiers are the IDs for + /// the user accounts, available as "_id" from the Twitch API methods (ex: + /// https://github.com/justintv/Twitch-API/blob/master/v3_resources/users.md#get-usersuser). + /// + public static void GetPlayFabIDsFromTwitchIDs(GetPlayFabIDsFromTwitchIDsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetPlayFabIDsFromTwitchIDs", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of XboxLive identifiers. + /// + public static void GetPlayFabIDsFromXboxLiveIDs(GetPlayFabIDsFromXboxLiveIDsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetPlayFabIDsFromXboxLiveIDs", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the key-value store of custom publisher settings + /// + public static void GetPublisherData(GetPublisherDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetPublisherData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Retrieves the configuration information for the specified random results tables for the title, including all + /// ItemId values and weights + /// + public static void GetRandomResultTables(GetRandomResultTablesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetRandomResultTables", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the associated PlayFab account identifiers for the given set of server custom identifiers. + /// + public static void GetServerCustomIDsFromPlayFabIDs(GetServerCustomIDsFromPlayFabIDsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetServerCustomIDsFromPlayFabIDs", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves data stored in a shared group object, as well as the list of members in the group. The server can access all + /// public and private group data. Shared Groups are designed for sharing data between a very small number of players, + /// please see our guide: https://docs.microsoft.com/gaming/playfab/features/social/groups/using-shared-group-data + /// + public static void GetSharedGroupData(GetSharedGroupDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetSharedGroupData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Retrieves the set of items defined for the specified store, including all prices defined, for the specified + /// player + /// + public static void GetStoreItems(GetStoreItemsServerRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetStoreItems", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the current server time + /// + public static void GetTime(GetTimeRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetTime", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the key-value store of custom title settings + /// + public static void GetTitleData(GetTitleDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetTitleData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the key-value store of custom internal title settings + /// + public static void GetTitleInternalData(GetTitleDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetTitleInternalData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the title news feed, as configured in the developer portal + /// + public static void GetTitleNews(GetTitleNewsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetTitleNews", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the relevant details for a specified user + /// + public static void GetUserAccountInfo(GetUserAccountInfoRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetUserAccountInfo", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets all bans for a user. + /// + public static void GetUserBans(GetUserBansRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetUserBans", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the title-specific custom data for the user which is readable and writable by the client + /// + public static void GetUserData(GetUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetUserData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the title-specific custom data for the user which cannot be accessed by the client + /// + public static void GetUserInternalData(GetUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetUserInternalData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Retrieves the specified user's current inventory of virtual goods + /// + public static void GetUserInventory(GetUserInventoryRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetUserInventory", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the publisher-specific custom data for the user which is readable and writable by the client + /// + public static void GetUserPublisherData(GetUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetUserPublisherData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the publisher-specific custom data for the user which cannot be accessed by the client + /// + public static void GetUserPublisherInternalData(GetUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetUserPublisherInternalData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the publisher-specific custom data for the user which can only be read by the client + /// + public static void GetUserPublisherReadOnlyData(GetUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetUserPublisherReadOnlyData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the title-specific custom data for the user which can only be read by the client + /// + public static void GetUserReadOnlyData(GetUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetUserReadOnlyData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Grants the specified character type to the user. CharacterIds are not globally unique; characterId must be evaluated + /// with the parent PlayFabId to guarantee uniqueness. + /// + public static void GrantCharacterToUser(GrantCharacterToUserRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GrantCharacterToUser", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Adds the specified items to the specified character's inventory + /// + public static void GrantItemsToCharacter(GrantItemsToCharacterRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GrantItemsToCharacter", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Adds the specified items to the specified user's inventory + /// + public static void GrantItemsToUser(GrantItemsToUserRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GrantItemsToUser", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Adds the specified items to the specified user inventories + /// + public static void GrantItemsToUsers(GrantItemsToUsersRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GrantItemsToUsers", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Links the Nintendo account associated with the token to the user's PlayFab account + /// + public static void LinkNintendoServiceAccount(LinkNintendoServiceAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/LinkNintendoServiceAccount", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Links the Nintendo account associated with the Nintendo Service Account subject or id to the user's PlayFab account + /// + public static void LinkNintendoServiceAccountSubject(LinkNintendoServiceAccountSubjectRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/LinkNintendoServiceAccountSubject", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Links the NintendoSwitchDeviceId to the user's PlayFab account + /// + public static void LinkNintendoSwitchDeviceId(LinkNintendoSwitchDeviceIdRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/LinkNintendoSwitchDeviceId", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Links the PlayStation :tm: Network account associated with the provided access code to the user's PlayFab account + /// + public static void LinkPSNAccount(LinkPSNAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/LinkPSNAccount", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Links the PlayStation :tm: Network account associated with the provided user id to the user's PlayFab account + /// + public static void LinkPSNId(LinkPSNIdRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/LinkPSNId", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Links the custom server identifier, generated by the title, to the user's PlayFab account. + /// + public static void LinkServerCustomId(LinkServerCustomIdRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/LinkServerCustomId", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Links the Steam account associated with the provided Steam ID to the user's PlayFab account + /// + public static void LinkSteamId(LinkSteamIdRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/LinkSteamId", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Links the Xbox Live account associated with the provided access code to the user's PlayFab account + /// + public static void LinkXboxAccount(LinkXboxAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/LinkXboxAccount", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Signs the user in using a PlayStation :tm: Network authentication code, returning a session identifier that can + /// subsequently be used for API calls which require an authenticated user + /// + public static void LoginWithPSN(LoginWithPSNRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/LoginWithPSN", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Securely login a game client from an external server backend using a custom identifier for that player. Server Custom ID + /// and Client Custom ID are mutually exclusive and cannot be used to retrieve the same player account. + /// + public static void LoginWithServerCustomId(LoginWithServerCustomIdRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/LoginWithServerCustomId", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Signs the user in using an Steam ID, returning a session identifier that can subsequently be used for API calls which + /// require an authenticated user + /// + public static void LoginWithSteamId(LoginWithSteamIdRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/LoginWithSteamId", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Signs the user in using a Xbox Live Token from an external server backend, returning a session identifier that can + /// subsequently be used for API calls which require an authenticated user + /// + public static void LoginWithXbox(LoginWithXboxRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/LoginWithXbox", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Signs the user in using an Xbox ID and Sandbox ID, returning a session identifier that can subsequently be used for API + /// calls which require an authenticated user + /// + public static void LoginWithXboxId(LoginWithXboxIdRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/LoginWithXboxId", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Modifies the number of remaining uses of a player's inventory item + /// + public static void ModifyItemUses(ModifyItemUsesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/ModifyItemUses", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Moves an item from a character's inventory into another of the users's character's inventory. + /// + public static void MoveItemToCharacterFromCharacter(MoveItemToCharacterFromCharacterRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/MoveItemToCharacterFromCharacter", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Moves an item from a user's inventory into their character's inventory. + /// + public static void MoveItemToCharacterFromUser(MoveItemToCharacterFromUserRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/MoveItemToCharacterFromUser", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Moves an item from a character's inventory into the owning user's inventory. + /// + public static void MoveItemToUserFromCharacter(MoveItemToUserFromCharacterRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/MoveItemToUserFromCharacter", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Adds the virtual goods associated with the coupon to the user's inventory. Coupons can be generated via the + /// Economy->Catalogs tab in the PlayFab Game Manager. + /// + public static void RedeemCoupon(RedeemCouponRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/RedeemCoupon", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Removes the specified friend from the the user's friend list + /// + public static void RemoveFriend(RemoveFriendRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/RemoveFriend", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Removes the specified generic service identifier from the player's PlayFab account. + /// + public static void RemoveGenericID(RemoveGenericIDRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/RemoveGenericID", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Remove a given tag from a player profile. The tag's namespace is automatically generated based on the source of the tag. + /// + public static void RemovePlayerTag(RemovePlayerTagRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/RemovePlayerTag", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Removes users from the set of those able to update the shared data and the set of users in the group. Only users in the + /// group can remove members. If as a result of the call, zero users remain with access, the group and its associated data + /// will be deleted. Shared Groups are designed for sharing data between a very small number of players, please see our + /// guide: https://docs.microsoft.com/gaming/playfab/features/social/groups/using-shared-group-data + /// + public static void RemoveSharedGroupMembers(RemoveSharedGroupMembersRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/RemoveSharedGroupMembers", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Submit a report about a player (due to bad bahavior, etc.) on behalf of another player, so that customer service + /// representatives for the title can take action concerning potentially toxic players. + /// + public static void ReportPlayer(ReportPlayerServerRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/ReportPlayer", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Revoke all active bans for a user. + /// + public static void RevokeAllBansForUser(RevokeAllBansForUserRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/RevokeAllBansForUser", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Revoke all active bans specified with BanId. + /// + public static void RevokeBans(RevokeBansRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/RevokeBans", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Revokes access to an item in a user's inventory + /// + public static void RevokeInventoryItem(RevokeInventoryItemRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/RevokeInventoryItem", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Revokes access for up to 25 items across multiple users and characters. + /// + public static void RevokeInventoryItems(RevokeInventoryItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/RevokeInventoryItems", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Saves push notification template for title + /// + public static void SavePushNotificationTemplate(SavePushNotificationTemplateRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/SavePushNotificationTemplate", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Forces an email to be sent to the registered contact email address for the user's account based on an account recovery + /// email template + /// + public static void SendCustomAccountRecoveryEmail(SendCustomAccountRecoveryEmailRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/SendCustomAccountRecoveryEmail", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Sends an email based on an email template to a player's contact email + /// + public static void SendEmailFromTemplate(SendEmailFromTemplateRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/SendEmailFromTemplate", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Sends an iOS/Android Push Notification to a specific user, if that user's device has been configured for Push + /// Notifications in PlayFab. If a user has linked both Android and iOS devices, both will be notified. + /// + public static void SendPushNotification(SendPushNotificationRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/SendPushNotification", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Sends an iOS/Android Push Notification template to a specific user, if that user's device has been configured for Push + /// Notifications in PlayFab. If a user has linked both Android and iOS devices, both will be notified. + /// + public static void SendPushNotificationFromTemplate(SendPushNotificationFromTemplateRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/SendPushNotificationFromTemplate", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates the tag list for a specified user in the friend list of another user + /// + public static void SetFriendTags(SetFriendTagsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/SetFriendTags", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Sets the player's secret if it is not already set. Player secrets are used to sign API requests. To reset a player's + /// secret use the Admin or Server API method SetPlayerSecret. + /// + public static void SetPlayerSecret(SetPlayerSecretRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/SetPlayerSecret", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates the key-value store of custom publisher settings + /// + public static void SetPublisherData(SetPublisherDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/SetPublisherData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates the key-value store of custom title settings + /// + public static void SetTitleData(SetTitleDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/SetTitleData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates the key-value store of custom title settings + /// + public static void SetTitleInternalData(SetTitleDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/SetTitleInternalData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Decrements the character's balance of the specified virtual currency by the stated amount. It is possible to + /// make a VC balance negative with this API. + /// + public static void SubtractCharacterVirtualCurrency(SubtractCharacterVirtualCurrencyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/SubtractCharacterVirtualCurrency", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Decrements the user's balance of the specified virtual currency by the stated amount. It is possible to make + /// a VC balance negative with this API. + /// + public static void SubtractUserVirtualCurrency(SubtractUserVirtualCurrencyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/SubtractUserVirtualCurrency", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Unlinks the related Nintendo account from the user's PlayFab account + /// + public static void UnlinkNintendoServiceAccount(UnlinkNintendoServiceAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/UnlinkNintendoServiceAccount", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Unlinks the related NintendoSwitchDeviceId from the user's PlayFab account + /// + public static void UnlinkNintendoSwitchDeviceId(UnlinkNintendoSwitchDeviceIdRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/UnlinkNintendoSwitchDeviceId", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Unlinks the related PlayStation :tm: Network account from the user's PlayFab account + /// + public static void UnlinkPSNAccount(UnlinkPSNAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/UnlinkPSNAccount", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Unlinks the custom server identifier from the user's PlayFab account. + /// + public static void UnlinkServerCustomId(UnlinkServerCustomIdRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/UnlinkServerCustomId", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Unlinks the Steam account associated with the provided Steam ID to the user's PlayFab account + /// + public static void UnlinkSteamId(UnlinkSteamIdRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/UnlinkSteamId", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Unlinks the related Xbox Live account from the user's PlayFab account + /// + public static void UnlinkXboxAccount(UnlinkXboxAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/UnlinkXboxAccount", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Opens a specific container (ContainerItemInstanceId), with a specific key (KeyItemInstanceId, when + /// required), and returns the contents of the opened container. If the container (and key when relevant) are consumable + /// (RemainingUses > 0), their RemainingUses will be decremented, consistent with the operation of ConsumeItem. + /// + public static void UnlockContainerInstance(UnlockContainerInstanceRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/UnlockContainerInstance", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Searches Player or Character inventory for any ItemInstance matching the given CatalogItemId, if necessary + /// unlocks it using any appropriate key, and returns the contents of the opened container. If the container (and key when + /// relevant) are consumable (RemainingUses > 0), their RemainingUses will be decremented, consistent with the operation of + /// ConsumeItem. + /// + public static void UnlockContainerItem(UnlockContainerItemRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/UnlockContainerItem", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Update the avatar URL of the specified player + /// + public static void UpdateAvatarUrl(UpdateAvatarUrlRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/UpdateAvatarUrl", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates information of a list of existing bans specified with Ban Ids. + /// + public static void UpdateBans(UpdateBansRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/UpdateBans", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates the title-specific custom data for the user's character which is readable and writable by the client + /// + public static void UpdateCharacterData(UpdateCharacterDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/UpdateCharacterData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates the title-specific custom data for the user's character which cannot be accessed by the client + /// + public static void UpdateCharacterInternalData(UpdateCharacterDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/UpdateCharacterInternalData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates the title-specific custom data for the user's character which can only be read by the client + /// + public static void UpdateCharacterReadOnlyData(UpdateCharacterDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/UpdateCharacterReadOnlyData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates the values of the specified title-specific statistics for the specific character + /// + public static void UpdateCharacterStatistics(UpdateCharacterStatisticsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/UpdateCharacterStatistics", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates the values of the specified title-specific statistics for the user + /// + public static void UpdatePlayerStatistics(UpdatePlayerStatisticsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/UpdatePlayerStatistics", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Adds, updates, and removes data keys for a shared group object. If the permission is set to Public, all fields updated + /// or added in this call will be readable by users not in the group. By default, data permissions are set to Private. + /// Regardless of the permission setting, only members of the group (and the server) can update the data. Shared Groups are + /// designed for sharing data between a very small number of players, please see our guide: + /// https://docs.microsoft.com/gaming/playfab/features/social/groups/using-shared-group-data + /// + public static void UpdateSharedGroupData(UpdateSharedGroupDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/UpdateSharedGroupData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates the title-specific custom data for the user which is readable and writable by the client + /// + public static void UpdateUserData(UpdateUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/UpdateUserData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates the title-specific custom data for the user which cannot be accessed by the client + /// + public static void UpdateUserInternalData(UpdateUserInternalDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/UpdateUserInternalData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Updates the key-value pair data tagged to the specified item, which is read-only from the client. + /// + public static void UpdateUserInventoryItemCustomData(UpdateUserInventoryItemDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/UpdateUserInventoryItemCustomData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates the publisher-specific custom data for the user which is readable and writable by the client + /// + public static void UpdateUserPublisherData(UpdateUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/UpdateUserPublisherData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates the publisher-specific custom data for the user which cannot be accessed by the client + /// + public static void UpdateUserPublisherInternalData(UpdateUserInternalDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/UpdateUserPublisherInternalData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates the publisher-specific custom data for the user which can only be read by the client + /// + public static void UpdateUserPublisherReadOnlyData(UpdateUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/UpdateUserPublisherReadOnlyData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates the title-specific custom data for the user which can only be read by the client + /// + public static void UpdateUserReadOnlyData(UpdateUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/UpdateUserReadOnlyData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Writes a character-based event into PlayStream. + /// + public static void WriteCharacterEvent(WriteServerCharacterEventRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/WriteCharacterEvent", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Writes a player-based event into PlayStream. + /// + public static void WritePlayerEvent(WriteServerPlayerEventRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/WritePlayerEvent", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Writes a title-based event into PlayStream. + /// + public static void WriteTitleEvent(WriteTitleEventRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/WriteTitleEvent", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + + } +} + +#endif diff --git a/Assets/PlayFabSDK/Server/PlayFabServerAPI.cs.meta b/Assets/PlayFabSDK/Server/PlayFabServerAPI.cs.meta new file mode 100644 index 00000000..259a32e7 --- /dev/null +++ b/Assets/PlayFabSDK/Server/PlayFabServerAPI.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: d1e12172e1632754fa9cf42f58d7bc9e +timeCreated: 1468524876 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Server/PlayFabServerInstanceAPI.cs b/Assets/PlayFabSDK/Server/PlayFabServerInstanceAPI.cs new file mode 100644 index 00000000..7c7771d2 --- /dev/null +++ b/Assets/PlayFabSDK/Server/PlayFabServerInstanceAPI.cs @@ -0,0 +1,1668 @@ +#if ENABLE_PLAYFABSERVER_API + +using System; +using System.Collections.Generic; +using PlayFab.ServerModels; +using PlayFab.Internal; +using PlayFab.SharedModels; + +namespace PlayFab +{ + /// + /// Provides functionality to allow external (developer-controlled) servers to interact with user inventories and data in a + /// trusted manner, and to handle matchmaking and client connection orchestration + /// + public class PlayFabServerInstanceAPI : IPlayFabInstanceApi + { + public readonly PlayFabApiSettings apiSettings = null; + public readonly PlayFabAuthenticationContext authenticationContext = null; + + public PlayFabServerInstanceAPI() { } + + public PlayFabServerInstanceAPI(PlayFabApiSettings settings) + { + apiSettings = settings; + } + + public PlayFabServerInstanceAPI(PlayFabAuthenticationContext context) + { + authenticationContext = context; + } + + public PlayFabServerInstanceAPI(PlayFabApiSettings settings, PlayFabAuthenticationContext context) + { + apiSettings = settings; + authenticationContext = context; + } + + /// + /// Clear the Client SessionToken which allows this Client to call API calls requiring login. + /// A new/fresh login will be required after calling this. + /// + public void ForgetAllCredentials() + { + if (authenticationContext != null) + { + authenticationContext.ForgetAllCredentials(); + } + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Increments the character's balance of the specified virtual currency by the stated amount + /// + public void AddCharacterVirtualCurrency(AddCharacterVirtualCurrencyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/AddCharacterVirtualCurrency", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Adds the Friend user to the friendlist of the user with PlayFabId. At least one of + /// FriendPlayFabId,FriendUsername,FriendEmail, or FriendTitleDisplayName should be initialized. + /// + public void AddFriend(AddFriendRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/AddFriend", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Adds the specified generic service identifier to the player's PlayFab account. This is designed to allow for a PlayFab + /// ID lookup of any arbitrary service identifier a title wants to add. This identifier should never be used as + /// authentication credentials, as the intent is that it is easily accessible by other players. + /// + public void AddGenericID(AddGenericIDRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/AddGenericID", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Adds a given tag to a player profile. The tag's namespace is automatically generated based on the source of the tag. + /// + public void AddPlayerTag(AddPlayerTagRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/AddPlayerTag", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Adds users to the set of those able to update both the shared data, as well as the set of users in the group. Only users + /// in the group (and the server) can add new members. Shared Groups are designed for sharing data between a very small + /// number of players, please see our guide: + /// https://docs.microsoft.com/gaming/playfab/features/social/groups/using-shared-group-data + /// + public void AddSharedGroupMembers(AddSharedGroupMembersRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/AddSharedGroupMembers", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Increments the user's balance of the specified virtual currency by the stated amount + /// + public void AddUserVirtualCurrency(AddUserVirtualCurrencyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/AddUserVirtualCurrency", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Validated a client's session ticket, and if successful, returns details for that user + /// + public void AuthenticateSessionTicket(AuthenticateSessionTicketRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/AuthenticateSessionTicket", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Awards the specified users the specified Steam achievements + /// + public void AwardSteamAchievement(AwardSteamAchievementRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/AwardSteamAchievement", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Bans users by PlayFab ID with optional IP address, or MAC address for the provided game. + /// + public void BanUsers(BanUsersRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/BanUsers", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Consume uses of a consumable item. When all uses are consumed, it will be removed from the player's + /// inventory. + /// + public void ConsumeItem(ConsumeItemRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/ConsumeItem", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Requests the creation of a shared group object, containing key/value pairs which may be updated by all members of the + /// group. When created by a server, the group will initially have no members. Shared Groups are designed for sharing data + /// between a very small number of players, please see our guide: + /// https://docs.microsoft.com/gaming/playfab/features/social/groups/using-shared-group-data + /// + public void CreateSharedGroup(CreateSharedGroupRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/CreateSharedGroup", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Deletes the specific character ID from the specified user. + /// + public void DeleteCharacterFromUser(DeleteCharacterFromUserRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/DeleteCharacterFromUser", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Removes a user's player account from a title and deletes all associated data + /// + public void DeletePlayer(DeletePlayerRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/DeletePlayer", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Deletes push notification template for title + /// + public void DeletePushNotificationTemplate(DeletePushNotificationTemplateRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/DeletePushNotificationTemplate", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Deletes a shared group, freeing up the shared group ID to be reused for a new group. Shared Groups are designed for + /// sharing data between a very small number of players, please see our guide: + /// https://docs.microsoft.com/gaming/playfab/features/social/groups/using-shared-group-data + /// + public void DeleteSharedGroup(DeleteSharedGroupRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/DeleteSharedGroup", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Returns the result of an evaluation of a Random Result Table - the ItemId from the game Catalog which would + /// have been added to the player inventory, if the Random Result Table were added via a Bundle or a call to + /// UnlockContainer. + /// + public void EvaluateRandomResultTable(EvaluateRandomResultTableRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/EvaluateRandomResultTable", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Executes a CloudScript function, with the 'currentPlayerId' set to the PlayFab ID of the authenticated player. The + /// PlayFab ID is the entity ID of the player's master_player_account entity. + /// + public void ExecuteCloudScript(ExecuteCloudScriptServerRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/ExecuteCloudScript", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + public void ExecuteCloudScript(ExecuteCloudScriptServerRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); + Action wrappedResultCallback = (wrappedResult) => + { + var serializer = PluginManager.GetPlugin(PluginContract.PlayFab_Serializer); + var wrappedJson = serializer.SerializeObject(wrappedResult.FunctionResult); + try { + wrappedResult.FunctionResult = serializer.DeserializeObject(wrappedJson); + } catch (Exception) { + wrappedResult.FunctionResult = wrappedJson; + wrappedResult.Logs.Add(new LogStatement { Level = "Warning", Data = wrappedJson, Message = "Sdk Message: Could not deserialize result as: " + typeof(TOut).Name }); + } + resultCallback(wrappedResult); + }; + PlayFabHttp.MakeApiCall("/Server/ExecuteCloudScript", request, AuthType.DevSecretKey, wrappedResultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves an array of player segment definitions. Results from this can be used in subsequent API calls such as + /// GetPlayersInSegment which requires a Segment ID. While segment names can change the ID for that segment will not change. + /// + public void GetAllSegments(GetAllSegmentsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetAllSegments", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Lists all of the characters that belong to a specific user. CharacterIds are not globally unique; characterId must be + /// evaluated with the parent PlayFabId to guarantee uniqueness. + /// + public void GetAllUsersCharacters(ListUsersCharactersRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetAllUsersCharacters", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Retrieves the specified version of the title's catalog of virtual goods, including all defined properties + /// + public void GetCatalogItems(GetCatalogItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetCatalogItems", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the title-specific custom data for the user which is readable and writable by the client + /// + public void GetCharacterData(GetCharacterDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetCharacterData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the title-specific custom data for the user's character which cannot be accessed by the client + /// + public void GetCharacterInternalData(GetCharacterDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetCharacterInternalData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Retrieves the specified character's current inventory of virtual goods + /// + public void GetCharacterInventory(GetCharacterInventoryRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetCharacterInventory", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves a list of ranked characters for the given statistic, starting from the indicated point in the leaderboard + /// + public void GetCharacterLeaderboard(GetCharacterLeaderboardRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetCharacterLeaderboard", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the title-specific custom data for the user's character which can only be read by the client + /// + public void GetCharacterReadOnlyData(GetCharacterDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetCharacterReadOnlyData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the details of all title-specific statistics for the specific character + /// + public void GetCharacterStatistics(GetCharacterStatisticsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetCharacterStatistics", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// This API retrieves a pre-signed URL for accessing a content file for the title. A subsequent HTTP GET to the returned + /// URL will attempt to download the content. A HEAD query to the returned URL will attempt to retrieve the metadata of the + /// content. Note that a successful result does not guarantee the existence of this content - if it has not been uploaded, + /// the query to retrieve the data will fail. See this post for more information: + /// https://community.playfab.com/hc/community/posts/205469488-How-to-upload-files-to-PlayFab-s-Content-Service. Also, + /// please be aware that the Content service is specifically PlayFab's CDN offering, for which standard CDN rates apply. + /// + public void GetContentDownloadUrl(GetContentDownloadUrlRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetContentDownloadUrl", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves a list of ranked friends of the given player for the given statistic, starting from the indicated point in the + /// leaderboard + /// + public void GetFriendLeaderboard(GetFriendLeaderboardRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetFriendLeaderboard", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the current friends for the user with PlayFabId, constrained to users who have PlayFab accounts. Friends from + /// linked accounts (Facebook, Steam) are also included. You may optionally exclude some linked services' friends. + /// + public void GetFriendsList(GetFriendsListRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetFriendsList", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves a list of ranked users for the given statistic, starting from the indicated point in the leaderboard + /// + public void GetLeaderboard(GetLeaderboardRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetLeaderboard", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves a list of ranked characters for the given statistic, centered on the requested user + /// + public void GetLeaderboardAroundCharacter(GetLeaderboardAroundCharacterRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetLeaderboardAroundCharacter", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves a list of ranked users for the given statistic, centered on the currently signed-in user + /// + public void GetLeaderboardAroundUser(GetLeaderboardAroundUserRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetLeaderboardAroundUser", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves a list of all of the user's characters for the given statistic. + /// + public void GetLeaderboardForUserCharacters(GetLeaderboardForUsersCharactersRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetLeaderboardForUserCharacters", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Returns whatever info is requested in the response for the user. Note that PII (like email address, facebook id) may be + /// returned. All parameters default to false. + /// + public void GetPlayerCombinedInfo(GetPlayerCombinedInfoRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetPlayerCombinedInfo", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the player's profile + /// + public void GetPlayerProfile(GetPlayerProfileRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetPlayerProfile", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// List all segments that a player currently belongs to at this moment in time. + /// + public void GetPlayerSegments(GetPlayersSegmentsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetPlayerSegments", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Allows for paging through all players in a given segment. This API creates a snapshot of all player profiles that match + /// the segment definition at the time of its creation and lives through the Total Seconds to Live, refreshing its life span + /// on each subsequent use of the Continuation Token. Profiles that change during the course of paging will not be reflected + /// in the results. AB Test segments are currently not supported by this operation. NOTE: This API is limited to being + /// called 30 times in one minute. You will be returned an error if you exceed this threshold. + /// + public void GetPlayersInSegment(GetPlayersInSegmentRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetPlayersInSegment", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the current version and values for the indicated statistics, for the local player. + /// + public void GetPlayerStatistics(GetPlayerStatisticsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetPlayerStatistics", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the information on the available versions of the specified statistic. + /// + public void GetPlayerStatisticVersions(GetPlayerStatisticVersionsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetPlayerStatisticVersions", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Get all tags with a given Namespace (optional) from a player profile. + /// + public void GetPlayerTags(GetPlayerTagsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetPlayerTags", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of Facebook identifiers. + /// + public void GetPlayFabIDsFromFacebookIDs(GetPlayFabIDsFromFacebookIDsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetPlayFabIDsFromFacebookIDs", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of Facebook Instant Games identifiers. + /// + public void GetPlayFabIDsFromFacebookInstantGamesIds(GetPlayFabIDsFromFacebookInstantGamesIdsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetPlayFabIDsFromFacebookInstantGamesIds", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of generic service identifiers. A generic identifier is the + /// service name plus the service-specific ID for the player, as specified by the title when the generic identifier was + /// added to the player account. + /// + public void GetPlayFabIDsFromGenericIDs(GetPlayFabIDsFromGenericIDsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetPlayFabIDsFromGenericIDs", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of Nintendo Service Account identifiers. + /// + public void GetPlayFabIDsFromNintendoServiceAccountIds(GetPlayFabIDsFromNintendoServiceAccountIdsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetPlayFabIDsFromNintendoServiceAccountIds", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of Nintendo Switch Device identifiers. + /// + public void GetPlayFabIDsFromNintendoSwitchDeviceIds(GetPlayFabIDsFromNintendoSwitchDeviceIdsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetPlayFabIDsFromNintendoSwitchDeviceIds", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of PlayStation :tm: Network identifiers. + /// + public void GetPlayFabIDsFromPSNAccountIDs(GetPlayFabIDsFromPSNAccountIDsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetPlayFabIDsFromPSNAccountIDs", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of PlayStation :tm: Network identifiers. + /// + public void GetPlayFabIDsFromPSNOnlineIDs(GetPlayFabIDsFromPSNOnlineIDsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetPlayFabIDsFromPSNOnlineIDs", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of Steam identifiers. The Steam identifiers are the profile + /// IDs for the user accounts, available as SteamId in the Steamworks Community API calls. + /// + public void GetPlayFabIDsFromSteamIDs(GetPlayFabIDsFromSteamIDsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetPlayFabIDsFromSteamIDs", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of Twitch identifiers. The Twitch identifiers are the IDs for + /// the user accounts, available as "_id" from the Twitch API methods (ex: + /// https://github.com/justintv/Twitch-API/blob/master/v3_resources/users.md#get-usersuser). + /// + public void GetPlayFabIDsFromTwitchIDs(GetPlayFabIDsFromTwitchIDsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetPlayFabIDsFromTwitchIDs", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of XboxLive identifiers. + /// + public void GetPlayFabIDsFromXboxLiveIDs(GetPlayFabIDsFromXboxLiveIDsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetPlayFabIDsFromXboxLiveIDs", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the key-value store of custom publisher settings + /// + public void GetPublisherData(GetPublisherDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetPublisherData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Retrieves the configuration information for the specified random results tables for the title, including all + /// ItemId values and weights + /// + public void GetRandomResultTables(GetRandomResultTablesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetRandomResultTables", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the associated PlayFab account identifiers for the given set of server custom identifiers. + /// + public void GetServerCustomIDsFromPlayFabIDs(GetServerCustomIDsFromPlayFabIDsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetServerCustomIDsFromPlayFabIDs", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves data stored in a shared group object, as well as the list of members in the group. The server can access all + /// public and private group data. Shared Groups are designed for sharing data between a very small number of players, + /// please see our guide: https://docs.microsoft.com/gaming/playfab/features/social/groups/using-shared-group-data + /// + public void GetSharedGroupData(GetSharedGroupDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetSharedGroupData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Retrieves the set of items defined for the specified store, including all prices defined, for the specified + /// player + /// + public void GetStoreItems(GetStoreItemsServerRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetStoreItems", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the current server time + /// + public void GetTime(GetTimeRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetTime", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the key-value store of custom title settings + /// + public void GetTitleData(GetTitleDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetTitleData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the key-value store of custom internal title settings + /// + public void GetTitleInternalData(GetTitleDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetTitleInternalData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the title news feed, as configured in the developer portal + /// + public void GetTitleNews(GetTitleNewsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetTitleNews", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the relevant details for a specified user + /// + public void GetUserAccountInfo(GetUserAccountInfoRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetUserAccountInfo", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets all bans for a user. + /// + public void GetUserBans(GetUserBansRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetUserBans", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the title-specific custom data for the user which is readable and writable by the client + /// + public void GetUserData(GetUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetUserData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the title-specific custom data for the user which cannot be accessed by the client + /// + public void GetUserInternalData(GetUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetUserInternalData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Retrieves the specified user's current inventory of virtual goods + /// + public void GetUserInventory(GetUserInventoryRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetUserInventory", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the publisher-specific custom data for the user which is readable and writable by the client + /// + public void GetUserPublisherData(GetUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetUserPublisherData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the publisher-specific custom data for the user which cannot be accessed by the client + /// + public void GetUserPublisherInternalData(GetUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetUserPublisherInternalData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the publisher-specific custom data for the user which can only be read by the client + /// + public void GetUserPublisherReadOnlyData(GetUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetUserPublisherReadOnlyData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the title-specific custom data for the user which can only be read by the client + /// + public void GetUserReadOnlyData(GetUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetUserReadOnlyData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Grants the specified character type to the user. CharacterIds are not globally unique; characterId must be evaluated + /// with the parent PlayFabId to guarantee uniqueness. + /// + public void GrantCharacterToUser(GrantCharacterToUserRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GrantCharacterToUser", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Adds the specified items to the specified character's inventory + /// + public void GrantItemsToCharacter(GrantItemsToCharacterRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GrantItemsToCharacter", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Adds the specified items to the specified user's inventory + /// + public void GrantItemsToUser(GrantItemsToUserRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GrantItemsToUser", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Adds the specified items to the specified user inventories + /// + public void GrantItemsToUsers(GrantItemsToUsersRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GrantItemsToUsers", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Links the Nintendo account associated with the token to the user's PlayFab account + /// + public void LinkNintendoServiceAccount(LinkNintendoServiceAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/LinkNintendoServiceAccount", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Links the Nintendo account associated with the Nintendo Service Account subject or id to the user's PlayFab account + /// + public void LinkNintendoServiceAccountSubject(LinkNintendoServiceAccountSubjectRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/LinkNintendoServiceAccountSubject", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Links the NintendoSwitchDeviceId to the user's PlayFab account + /// + public void LinkNintendoSwitchDeviceId(LinkNintendoSwitchDeviceIdRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/LinkNintendoSwitchDeviceId", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Links the PlayStation :tm: Network account associated with the provided access code to the user's PlayFab account + /// + public void LinkPSNAccount(LinkPSNAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/LinkPSNAccount", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Links the PlayStation :tm: Network account associated with the provided user id to the user's PlayFab account + /// + public void LinkPSNId(LinkPSNIdRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/LinkPSNId", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Links the custom server identifier, generated by the title, to the user's PlayFab account. + /// + public void LinkServerCustomId(LinkServerCustomIdRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/LinkServerCustomId", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Links the Steam account associated with the provided Steam ID to the user's PlayFab account + /// + public void LinkSteamId(LinkSteamIdRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/LinkSteamId", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Links the Xbox Live account associated with the provided access code to the user's PlayFab account + /// + public void LinkXboxAccount(LinkXboxAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/LinkXboxAccount", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Signs the user in using a PlayStation :tm: Network authentication code, returning a session identifier that can + /// subsequently be used for API calls which require an authenticated user + /// + public void LoginWithPSN(LoginWithPSNRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/LoginWithPSN", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Securely login a game client from an external server backend using a custom identifier for that player. Server Custom ID + /// and Client Custom ID are mutually exclusive and cannot be used to retrieve the same player account. + /// + public void LoginWithServerCustomId(LoginWithServerCustomIdRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/LoginWithServerCustomId", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Signs the user in using an Steam ID, returning a session identifier that can subsequently be used for API calls which + /// require an authenticated user + /// + public void LoginWithSteamId(LoginWithSteamIdRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/LoginWithSteamId", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Signs the user in using a Xbox Live Token from an external server backend, returning a session identifier that can + /// subsequently be used for API calls which require an authenticated user + /// + public void LoginWithXbox(LoginWithXboxRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/LoginWithXbox", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Signs the user in using an Xbox ID and Sandbox ID, returning a session identifier that can subsequently be used for API + /// calls which require an authenticated user + /// + public void LoginWithXboxId(LoginWithXboxIdRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/LoginWithXboxId", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Modifies the number of remaining uses of a player's inventory item + /// + public void ModifyItemUses(ModifyItemUsesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/ModifyItemUses", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Moves an item from a character's inventory into another of the users's character's inventory. + /// + public void MoveItemToCharacterFromCharacter(MoveItemToCharacterFromCharacterRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/MoveItemToCharacterFromCharacter", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Moves an item from a user's inventory into their character's inventory. + /// + public void MoveItemToCharacterFromUser(MoveItemToCharacterFromUserRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/MoveItemToCharacterFromUser", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Moves an item from a character's inventory into the owning user's inventory. + /// + public void MoveItemToUserFromCharacter(MoveItemToUserFromCharacterRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/MoveItemToUserFromCharacter", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Adds the virtual goods associated with the coupon to the user's inventory. Coupons can be generated via the + /// Economy->Catalogs tab in the PlayFab Game Manager. + /// + public void RedeemCoupon(RedeemCouponRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/RedeemCoupon", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Removes the specified friend from the the user's friend list + /// + public void RemoveFriend(RemoveFriendRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/RemoveFriend", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Removes the specified generic service identifier from the player's PlayFab account. + /// + public void RemoveGenericID(RemoveGenericIDRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/RemoveGenericID", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Remove a given tag from a player profile. The tag's namespace is automatically generated based on the source of the tag. + /// + public void RemovePlayerTag(RemovePlayerTagRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/RemovePlayerTag", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Removes users from the set of those able to update the shared data and the set of users in the group. Only users in the + /// group can remove members. If as a result of the call, zero users remain with access, the group and its associated data + /// will be deleted. Shared Groups are designed for sharing data between a very small number of players, please see our + /// guide: https://docs.microsoft.com/gaming/playfab/features/social/groups/using-shared-group-data + /// + public void RemoveSharedGroupMembers(RemoveSharedGroupMembersRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/RemoveSharedGroupMembers", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Submit a report about a player (due to bad bahavior, etc.) on behalf of another player, so that customer service + /// representatives for the title can take action concerning potentially toxic players. + /// + public void ReportPlayer(ReportPlayerServerRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/ReportPlayer", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Revoke all active bans for a user. + /// + public void RevokeAllBansForUser(RevokeAllBansForUserRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/RevokeAllBansForUser", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Revoke all active bans specified with BanId. + /// + public void RevokeBans(RevokeBansRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/RevokeBans", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Revokes access to an item in a user's inventory + /// + public void RevokeInventoryItem(RevokeInventoryItemRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/RevokeInventoryItem", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Revokes access for up to 25 items across multiple users and characters. + /// + public void RevokeInventoryItems(RevokeInventoryItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/RevokeInventoryItems", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Saves push notification template for title + /// + public void SavePushNotificationTemplate(SavePushNotificationTemplateRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/SavePushNotificationTemplate", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Forces an email to be sent to the registered contact email address for the user's account based on an account recovery + /// email template + /// + public void SendCustomAccountRecoveryEmail(SendCustomAccountRecoveryEmailRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/SendCustomAccountRecoveryEmail", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Sends an email based on an email template to a player's contact email + /// + public void SendEmailFromTemplate(SendEmailFromTemplateRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/SendEmailFromTemplate", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Sends an iOS/Android Push Notification to a specific user, if that user's device has been configured for Push + /// Notifications in PlayFab. If a user has linked both Android and iOS devices, both will be notified. + /// + public void SendPushNotification(SendPushNotificationRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/SendPushNotification", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Sends an iOS/Android Push Notification template to a specific user, if that user's device has been configured for Push + /// Notifications in PlayFab. If a user has linked both Android and iOS devices, both will be notified. + /// + public void SendPushNotificationFromTemplate(SendPushNotificationFromTemplateRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/SendPushNotificationFromTemplate", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates the tag list for a specified user in the friend list of another user + /// + public void SetFriendTags(SetFriendTagsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/SetFriendTags", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Sets the player's secret if it is not already set. Player secrets are used to sign API requests. To reset a player's + /// secret use the Admin or Server API method SetPlayerSecret. + /// + public void SetPlayerSecret(SetPlayerSecretRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/SetPlayerSecret", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates the key-value store of custom publisher settings + /// + public void SetPublisherData(SetPublisherDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/SetPublisherData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates the key-value store of custom title settings + /// + public void SetTitleData(SetTitleDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/SetTitleData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates the key-value store of custom title settings + /// + public void SetTitleInternalData(SetTitleDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/SetTitleInternalData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Decrements the character's balance of the specified virtual currency by the stated amount. It is possible to + /// make a VC balance negative with this API. + /// + public void SubtractCharacterVirtualCurrency(SubtractCharacterVirtualCurrencyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/SubtractCharacterVirtualCurrency", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Decrements the user's balance of the specified virtual currency by the stated amount. It is possible to make + /// a VC balance negative with this API. + /// + public void SubtractUserVirtualCurrency(SubtractUserVirtualCurrencyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/SubtractUserVirtualCurrency", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Unlinks the related Nintendo account from the user's PlayFab account + /// + public void UnlinkNintendoServiceAccount(UnlinkNintendoServiceAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/UnlinkNintendoServiceAccount", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Unlinks the related NintendoSwitchDeviceId from the user's PlayFab account + /// + public void UnlinkNintendoSwitchDeviceId(UnlinkNintendoSwitchDeviceIdRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/UnlinkNintendoSwitchDeviceId", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Unlinks the related PlayStation :tm: Network account from the user's PlayFab account + /// + public void UnlinkPSNAccount(UnlinkPSNAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/UnlinkPSNAccount", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Unlinks the custom server identifier from the user's PlayFab account. + /// + public void UnlinkServerCustomId(UnlinkServerCustomIdRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/UnlinkServerCustomId", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Unlinks the Steam account associated with the provided Steam ID to the user's PlayFab account + /// + public void UnlinkSteamId(UnlinkSteamIdRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/UnlinkSteamId", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Unlinks the related Xbox Live account from the user's PlayFab account + /// + public void UnlinkXboxAccount(UnlinkXboxAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/UnlinkXboxAccount", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Opens a specific container (ContainerItemInstanceId), with a specific key (KeyItemInstanceId, when + /// required), and returns the contents of the opened container. If the container (and key when relevant) are consumable + /// (RemainingUses > 0), their RemainingUses will be decremented, consistent with the operation of ConsumeItem. + /// + public void UnlockContainerInstance(UnlockContainerInstanceRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/UnlockContainerInstance", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Searches Player or Character inventory for any ItemInstance matching the given CatalogItemId, if necessary + /// unlocks it using any appropriate key, and returns the contents of the opened container. If the container (and key when + /// relevant) are consumable (RemainingUses > 0), their RemainingUses will be decremented, consistent with the operation of + /// ConsumeItem. + /// + public void UnlockContainerItem(UnlockContainerItemRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/UnlockContainerItem", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Update the avatar URL of the specified player + /// + public void UpdateAvatarUrl(UpdateAvatarUrlRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/UpdateAvatarUrl", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates information of a list of existing bans specified with Ban Ids. + /// + public void UpdateBans(UpdateBansRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/UpdateBans", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates the title-specific custom data for the user's character which is readable and writable by the client + /// + public void UpdateCharacterData(UpdateCharacterDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/UpdateCharacterData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates the title-specific custom data for the user's character which cannot be accessed by the client + /// + public void UpdateCharacterInternalData(UpdateCharacterDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/UpdateCharacterInternalData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates the title-specific custom data for the user's character which can only be read by the client + /// + public void UpdateCharacterReadOnlyData(UpdateCharacterDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/UpdateCharacterReadOnlyData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates the values of the specified title-specific statistics for the specific character + /// + public void UpdateCharacterStatistics(UpdateCharacterStatisticsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/UpdateCharacterStatistics", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates the values of the specified title-specific statistics for the user + /// + public void UpdatePlayerStatistics(UpdatePlayerStatisticsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/UpdatePlayerStatistics", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Adds, updates, and removes data keys for a shared group object. If the permission is set to Public, all fields updated + /// or added in this call will be readable by users not in the group. By default, data permissions are set to Private. + /// Regardless of the permission setting, only members of the group (and the server) can update the data. Shared Groups are + /// designed for sharing data between a very small number of players, please see our guide: + /// https://docs.microsoft.com/gaming/playfab/features/social/groups/using-shared-group-data + /// + public void UpdateSharedGroupData(UpdateSharedGroupDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/UpdateSharedGroupData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates the title-specific custom data for the user which is readable and writable by the client + /// + public void UpdateUserData(UpdateUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/UpdateUserData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates the title-specific custom data for the user which cannot be accessed by the client + /// + public void UpdateUserInternalData(UpdateUserInternalDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/UpdateUserInternalData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// _NOTE: This is a Legacy Economy API, and is in bugfix-only mode. All new Economy features are being developed only for + /// version 2._ Updates the key-value pair data tagged to the specified item, which is read-only from the client. + /// + public void UpdateUserInventoryItemCustomData(UpdateUserInventoryItemDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/UpdateUserInventoryItemCustomData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates the publisher-specific custom data for the user which is readable and writable by the client + /// + public void UpdateUserPublisherData(UpdateUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/UpdateUserPublisherData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates the publisher-specific custom data for the user which cannot be accessed by the client + /// + public void UpdateUserPublisherInternalData(UpdateUserInternalDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/UpdateUserPublisherInternalData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates the publisher-specific custom data for the user which can only be read by the client + /// + public void UpdateUserPublisherReadOnlyData(UpdateUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/UpdateUserPublisherReadOnlyData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates the title-specific custom data for the user which can only be read by the client + /// + public void UpdateUserReadOnlyData(UpdateUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/UpdateUserReadOnlyData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Writes a character-based event into PlayStream. + /// + public void WriteCharacterEvent(WriteServerCharacterEventRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/WriteCharacterEvent", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Writes a player-based event into PlayStream. + /// + public void WritePlayerEvent(WriteServerPlayerEventRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/WritePlayerEvent", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Writes a title-based event into PlayStream. + /// + public void WriteTitleEvent(WriteTitleEventRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/WriteTitleEvent", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + } +} + +#endif diff --git a/Assets/PlayFabSDK/Server/PlayFabServerInstanceAPI.cs.meta b/Assets/PlayFabSDK/Server/PlayFabServerInstanceAPI.cs.meta new file mode 100644 index 00000000..c087b059 --- /dev/null +++ b/Assets/PlayFabSDK/Server/PlayFabServerInstanceAPI.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 76d4a622fa263d34b9f73488c0095f8b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Server/PlayFabServerModels.cs b/Assets/PlayFabSDK/Server/PlayFabServerModels.cs new file mode 100644 index 00000000..518490d5 --- /dev/null +++ b/Assets/PlayFabSDK/Server/PlayFabServerModels.cs @@ -0,0 +1,7374 @@ +#if ENABLE_PLAYFABSERVER_API +using System; +using System.Collections.Generic; +using PlayFab.SharedModels; + +namespace PlayFab.ServerModels +{ + [Serializable] + public class AdCampaignAttribution : PlayFabBaseModel + { + /// + /// UTC time stamp of attribution + /// + public DateTime AttributedAt; + /// + /// Attribution campaign identifier + /// + public string CampaignId; + /// + /// Attribution network name + /// + public string Platform; + } + + [Serializable] + public class AdCampaignAttributionModel : PlayFabBaseModel + { + /// + /// UTC time stamp of attribution + /// + public DateTime AttributedAt; + /// + /// Attribution campaign identifier + /// + public string CampaignId; + /// + /// Attribution network name + /// + public string Platform; + } + + [Serializable] + public class AddCharacterVirtualCurrencyRequest : PlayFabRequestCommon + { + /// + /// Amount to be added to the character balance of the specified virtual currency. Maximum VC balance is Int32 + /// (2,147,483,647). Any increase over this value will be discarded. + /// + public int Amount; + /// + /// Unique PlayFab assigned ID for a specific character owned by a user + /// + public string CharacterId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// PlayFab unique identifier of the user whose virtual currency balance is to be incremented. + /// + public string PlayFabId; + /// + /// Name of the virtual currency which is to be incremented. + /// + public string VirtualCurrency; + } + + [Serializable] + public class AddFriendRequest : PlayFabRequestCommon + { + /// + /// Email address of the user being added. + /// + public string FriendEmail; + /// + /// The PlayFab identifier of the user being added. + /// + public string FriendPlayFabId; + /// + /// Title-specific display name of the user to being added. + /// + public string FriendTitleDisplayName; + /// + /// The PlayFab username of the user being added + /// + public string FriendUsername; + /// + /// PlayFab identifier of the player to add a new friend. + /// + public string PlayFabId; + } + + [Serializable] + public class AddGenericIDRequest : PlayFabRequestCommon + { + /// + /// Generic service identifier to add to the player account. + /// + public GenericServiceId GenericId; + /// + /// PlayFabId of the user to link. + /// + public string PlayFabId; + } + + /// + /// This API will trigger a player_tag_added event and add a tag with the given TagName and PlayFabID to the corresponding + /// player profile. TagName can be used for segmentation and it is limited to 256 characters. Also there is a limit on the + /// number of tags a title can have. + /// + [Serializable] + public class AddPlayerTagRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + /// + /// Unique tag for player profile. + /// + public string TagName; + } + + [Serializable] + public class AddPlayerTagResult : PlayFabResultCommon + { + } + + [Serializable] + public class AddSharedGroupMembersRequest : PlayFabRequestCommon + { + /// + /// An array of unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public List PlayFabIds; + /// + /// Unique identifier for the shared group. + /// + public string SharedGroupId; + } + + [Serializable] + public class AddSharedGroupMembersResult : PlayFabResultCommon + { + } + + [Serializable] + public class AddUserVirtualCurrencyRequest : PlayFabRequestCommon + { + /// + /// Amount to be added to the user balance of the specified virtual currency. Maximum VC balance is Int32 (2,147,483,647). + /// Any increase over this value will be discarded. + /// + public int Amount; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// PlayFab unique identifier of the user whose virtual currency balance is to be increased. + /// + public string PlayFabId; + /// + /// Name of the virtual currency which is to be incremented. + /// + public string VirtualCurrency; + } + + [Serializable] + public class AdvancedPushPlatformMsg : PlayFabBaseModel + { + /// + /// Stops GoogleCloudMessaging notifications from including both notification and data properties and instead only sends the + /// data property. + /// + public bool? GCMDataOnly; + /// + /// The Json the platform should receive. + /// + public string Json; + /// + /// The platform that should receive the Json. + /// + public PushNotificationPlatform Platform; + } + + /// + /// Note that data returned may be Personally Identifying Information (PII), such as email address, and so care should be + /// taken in how this data is stored and managed. Since this call will always return the relevant information for users who + /// have accessed the title, the recommendation is to not store this data locally. + /// + [Serializable] + public class AuthenticateSessionTicketRequest : PlayFabRequestCommon + { + /// + /// Session ticket as issued by a PlayFab client login API. + /// + public string SessionTicket; + } + + [Serializable] + public class AuthenticateSessionTicketResult : PlayFabResultCommon + { + /// + /// Indicates if token was expired at request time. + /// + public bool? IsSessionTicketExpired; + /// + /// Account info for the user whose session ticket was supplied. + /// + public UserAccountInfo UserInfo; + } + + [Serializable] + public class AwardSteamAchievementItem : PlayFabBaseModel + { + /// + /// Unique Steam achievement name. + /// + public string AchievementName; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + /// + /// Result of the award attempt (only valid on response, not on request). + /// + public bool Result; + } + + [Serializable] + public class AwardSteamAchievementRequest : PlayFabRequestCommon + { + /// + /// Array of achievements to grant and the users to whom they are to be granted. + /// + public List Achievements; + } + + [Serializable] + public class AwardSteamAchievementResult : PlayFabResultCommon + { + /// + /// Array of achievements granted. + /// + public List AchievementResults; + } + + /// + /// Contains information for a ban. + /// + [Serializable] + public class BanInfo : PlayFabBaseModel + { + /// + /// The active state of this ban. Expired bans may still have this value set to true but they will have no effect. + /// + public bool Active; + /// + /// The unique Ban Id associated with this ban. + /// + public string BanId; + /// + /// The time when this ban was applied. + /// + public DateTime? Created; + /// + /// The time when this ban expires. Permanent bans do not have expiration date. + /// + public DateTime? Expires; + /// + /// The IP address on which the ban was applied. May affect multiple players. + /// + public string IPAddress; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + /// + /// The reason why this ban was applied. + /// + public string Reason; + /// + /// The family type of the suer that is included in the ban. + /// + public string UserFamilyType; + } + + /// + /// Represents a single ban request. + /// + [Serializable] + public class BanRequest : PlayFabBaseModel + { + /// + /// The duration in hours for the ban. Leave this blank for a permanent ban. + /// + public uint? DurationInHours; + /// + /// IP address to be banned. May affect multiple players. + /// + public string IPAddress; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + /// + /// The reason for this ban. Maximum 140 characters. + /// + public string Reason; + /// + /// The family type of the user that should be included in the ban if applicable. May affect multiple players. + /// + public UserFamilyType? UserFamilyType; + } + + /// + /// The existence of each user will not be verified. When banning by IP or MAC address, multiple players may be affected, so + /// use this feature with caution. Returns information about the new bans. + /// + [Serializable] + public class BanUsersRequest : PlayFabRequestCommon + { + /// + /// List of ban requests to be applied. Maximum 100. + /// + public List Bans; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + [Serializable] + public class BanUsersResult : PlayFabResultCommon + { + /// + /// Information on the bans that were applied + /// + public List BanData; + } + + /// + /// A purchasable item from the item catalog + /// + [Serializable] + public class CatalogItem : PlayFabBaseModel + { + /// + /// defines the bundle properties for the item - bundles are items which contain other items, including random drop tables + /// and virtual currencies + /// + public CatalogItemBundleInfo Bundle; + /// + /// if true, then an item instance of this type can be used to grant a character to a user. + /// + public bool CanBecomeCharacter; + /// + /// catalog version for this item + /// + public string CatalogVersion; + /// + /// defines the consumable properties (number of uses, timeout) for the item + /// + public CatalogItemConsumableInfo Consumable; + /// + /// defines the container properties for the item - what items it contains, including random drop tables and virtual + /// currencies, and what item (if any) is required to open it via the UnlockContainerItem API + /// + public CatalogItemContainerInfo Container; + /// + /// game specific custom data + /// + public string CustomData; + /// + /// text description of item, to show in-game + /// + public string Description; + /// + /// text name for the item, to show in-game + /// + public string DisplayName; + /// + /// If the item has IsLImitedEdition set to true, and this is the first time this ItemId has been defined as a limited + /// edition item, this value determines the total number of instances to allocate for the title. Once this limit has been + /// reached, no more instances of this ItemId can be created, and attempts to purchase or grant it will return a Result of + /// false for that ItemId. If the item has already been defined to have a limited edition count, or if this value is less + /// than zero, it will be ignored. + /// + public int InitialLimitedEditionCount; + /// + /// BETA: If true, then only a fixed number can ever be granted. + /// + public bool IsLimitedEdition; + /// + /// if true, then only one item instance of this type will exist and its remaininguses will be incremented instead. + /// RemainingUses will cap out at Int32.Max (2,147,483,647). All subsequent increases will be discarded + /// + public bool IsStackable; + /// + /// if true, then an item instance of this type can be traded between players using the trading APIs + /// + public bool IsTradable; + /// + /// class to which the item belongs + /// + public string ItemClass; + /// + /// unique identifier for this item + /// + public string ItemId; + /// + /// URL to the item image. For Facebook purchase to display the image on the item purchase page, this must be set to an HTTP + /// URL. + /// + public string ItemImageUrl; + /// + /// override prices for this item for specific currencies + /// + public Dictionary RealCurrencyPrices; + /// + /// list of item tags + /// + public List Tags; + /// + /// price of this item in virtual currencies and "RM" (the base Real Money purchase price, in USD pennies) + /// + public Dictionary VirtualCurrencyPrices; + } + + [Serializable] + public class CatalogItemBundleInfo : PlayFabBaseModel + { + /// + /// unique ItemId values for all items which will be added to the player inventory when the bundle is added + /// + public List BundledItems; + /// + /// unique TableId values for all RandomResultTable objects which are part of the bundle (random tables will be resolved and + /// add the relevant items to the player inventory when the bundle is added) + /// + public List BundledResultTables; + /// + /// virtual currency types and balances which will be added to the player inventory when the bundle is added + /// + public Dictionary BundledVirtualCurrencies; + } + + [Serializable] + public class CatalogItemConsumableInfo : PlayFabBaseModel + { + /// + /// number of times this object can be used, after which it will be removed from the player inventory + /// + public uint? UsageCount; + /// + /// duration in seconds for how long the item will remain in the player inventory - once elapsed, the item will be removed + /// (recommended minimum value is 5 seconds, as lower values can cause the item to expire before operations depending on + /// this item's details have completed) + /// + public uint? UsagePeriod; + /// + /// all inventory item instances in the player inventory sharing a non-null UsagePeriodGroup have their UsagePeriod values + /// added together, and share the result - when that period has elapsed, all the items in the group will be removed + /// + public string UsagePeriodGroup; + } + + /// + /// Containers are inventory items that can hold other items defined in the catalog, as well as virtual currency, which is + /// added to the player inventory when the container is unlocked, using the UnlockContainerItem API. The items can be + /// anything defined in the catalog, as well as RandomResultTable objects which will be resolved when the container is + /// unlocked. Containers and their keys should be defined as Consumable (having a limited number of uses) in their catalog + /// defintiions, unless the intent is for the player to be able to re-use them infinitely. + /// + [Serializable] + public class CatalogItemContainerInfo : PlayFabBaseModel + { + /// + /// unique ItemId values for all items which will be added to the player inventory, once the container has been unlocked + /// + public List ItemContents; + /// + /// ItemId for the catalog item used to unlock the container, if any (if not specified, a call to UnlockContainerItem will + /// open the container, adding the contents to the player inventory and currency balances) + /// + public string KeyItemId; + /// + /// unique TableId values for all RandomResultTable objects which are part of the container (once unlocked, random tables + /// will be resolved and add the relevant items to the player inventory) + /// + public List ResultTableContents; + /// + /// virtual currency types and balances which will be added to the player inventory when the container is unlocked + /// + public Dictionary VirtualCurrencyContents; + } + + [Serializable] + public class CharacterInventory : PlayFabBaseModel + { + /// + /// The id of this character. + /// + public string CharacterId; + /// + /// The inventory of this character. + /// + public List Inventory; + } + + [Serializable] + public class CharacterLeaderboardEntry : PlayFabBaseModel + { + /// + /// PlayFab unique identifier of the character that belongs to the user for this leaderboard entry. + /// + public string CharacterId; + /// + /// Title-specific display name of the character for this leaderboard entry. + /// + public string CharacterName; + /// + /// Name of the character class for this entry. + /// + public string CharacterType; + /// + /// Title-specific display name of the user for this leaderboard entry. + /// + public string DisplayName; + /// + /// PlayFab unique identifier of the user for this leaderboard entry. + /// + public string PlayFabId; + /// + /// User's overall position in the leaderboard. + /// + public int Position; + /// + /// Specific value of the user's statistic. + /// + public int StatValue; + } + + [Serializable] + public class CharacterResult : PlayFabBaseModel + { + /// + /// The id for this character on this player. + /// + public string CharacterId; + /// + /// The name of this character. + /// + public string CharacterName; + /// + /// The type-string that was given to this character on creation. + /// + public string CharacterType; + } + + public enum ChurnRiskLevel + { + NoData, + LowRisk, + MediumRisk, + HighRisk + } + + public enum CloudScriptRevisionOption + { + Live, + Latest, + Specific + } + + [Serializable] + public class ConsumeItemRequest : PlayFabRequestCommon + { + /// + /// Unique PlayFab assigned ID for a specific character owned by a user + /// + public string CharacterId; + /// + /// Number of uses to consume from the item. + /// + public int ConsumeCount; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Unique instance identifier of the item to be consumed. + /// + public string ItemInstanceId; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class ConsumeItemResult : PlayFabResultCommon + { + /// + /// Unique instance identifier of the item with uses consumed. + /// + public string ItemInstanceId; + /// + /// Number of uses remaining on the item. + /// + public int RemainingUses; + } + + [Serializable] + public class ContactEmailInfo : PlayFabBaseModel + { + /// + /// The email address + /// + public string EmailAddress; + /// + /// The name of the email info data + /// + public string Name; + /// + /// The verification status of the email + /// + public EmailVerificationStatus? VerificationStatus; + } + + [Serializable] + public class ContactEmailInfoModel : PlayFabBaseModel + { + /// + /// The email address + /// + public string EmailAddress; + /// + /// The name of the email info data + /// + public string Name; + /// + /// The verification status of the email + /// + public EmailVerificationStatus? VerificationStatus; + } + + public enum ContinentCode + { + AF, + AN, + AS, + EU, + NA, + OC, + SA, + Unknown + } + + public enum CountryCode + { + AF, + AX, + AL, + DZ, + AS, + AD, + AO, + AI, + AQ, + AG, + AR, + AM, + AW, + AU, + AT, + AZ, + BS, + BH, + BD, + BB, + BY, + BE, + BZ, + BJ, + BM, + BT, + BO, + BQ, + BA, + BW, + BV, + BR, + IO, + BN, + BG, + BF, + BI, + KH, + CM, + CA, + CV, + KY, + CF, + TD, + CL, + CN, + CX, + CC, + CO, + KM, + CG, + CD, + CK, + CR, + CI, + HR, + CU, + CW, + CY, + CZ, + DK, + DJ, + DM, + DO, + EC, + EG, + SV, + GQ, + ER, + EE, + ET, + FK, + FO, + FJ, + FI, + FR, + GF, + PF, + TF, + GA, + GM, + GE, + DE, + GH, + GI, + GR, + GL, + GD, + GP, + GU, + GT, + GG, + GN, + GW, + GY, + HT, + HM, + VA, + HN, + HK, + HU, + IS, + IN, + ID, + IR, + IQ, + IE, + IM, + IL, + IT, + JM, + JP, + JE, + JO, + KZ, + KE, + KI, + KP, + KR, + KW, + KG, + LA, + LV, + LB, + LS, + LR, + LY, + LI, + LT, + LU, + MO, + MK, + MG, + MW, + MY, + MV, + ML, + MT, + MH, + MQ, + MR, + MU, + YT, + MX, + FM, + MD, + MC, + MN, + ME, + MS, + MA, + MZ, + MM, + NA, + NR, + NP, + NL, + NC, + NZ, + NI, + NE, + NG, + NU, + NF, + MP, + NO, + OM, + PK, + PW, + PS, + PA, + PG, + PY, + PE, + PH, + PN, + PL, + PT, + PR, + QA, + RE, + RO, + RU, + RW, + BL, + SH, + KN, + LC, + MF, + PM, + VC, + WS, + SM, + ST, + SA, + SN, + RS, + SC, + SL, + SG, + SX, + SK, + SI, + SB, + SO, + ZA, + GS, + SS, + ES, + LK, + SD, + SR, + SJ, + SZ, + SE, + CH, + SY, + TW, + TJ, + TZ, + TH, + TL, + TG, + TK, + TO, + TT, + TN, + TR, + TM, + TC, + TV, + UG, + UA, + AE, + GB, + US, + UM, + UY, + UZ, + VU, + VE, + VN, + VG, + VI, + WF, + EH, + YE, + ZM, + ZW, + Unknown + } + + /// + /// If SharedGroupId is specified, the service will attempt to create a group with that identifier, and will return an error + /// if it is already in use. If no SharedGroupId is specified, a random identifier will be assigned. + /// + [Serializable] + public class CreateSharedGroupRequest : PlayFabRequestCommon + { + /// + /// Unique identifier for the shared group (a random identifier will be assigned, if one is not specified). + /// + public string SharedGroupId; + } + + [Serializable] + public class CreateSharedGroupResult : PlayFabResultCommon + { + /// + /// Unique identifier for the shared group. + /// + public string SharedGroupId; + } + + public enum Currency + { + AED, + AFN, + ALL, + AMD, + ANG, + AOA, + ARS, + AUD, + AWG, + AZN, + BAM, + BBD, + BDT, + BGN, + BHD, + BIF, + BMD, + BND, + BOB, + BRL, + BSD, + BTN, + BWP, + BYR, + BZD, + CAD, + CDF, + CHF, + CLP, + CNY, + COP, + CRC, + CUC, + CUP, + CVE, + CZK, + DJF, + DKK, + DOP, + DZD, + EGP, + ERN, + ETB, + EUR, + FJD, + FKP, + GBP, + GEL, + GGP, + GHS, + GIP, + GMD, + GNF, + GTQ, + GYD, + HKD, + HNL, + HRK, + HTG, + HUF, + IDR, + ILS, + IMP, + INR, + IQD, + IRR, + ISK, + JEP, + JMD, + JOD, + JPY, + KES, + KGS, + KHR, + KMF, + KPW, + KRW, + KWD, + KYD, + KZT, + LAK, + LBP, + LKR, + LRD, + LSL, + LYD, + MAD, + MDL, + MGA, + MKD, + MMK, + MNT, + MOP, + MRO, + MUR, + MVR, + MWK, + MXN, + MYR, + MZN, + NAD, + NGN, + NIO, + NOK, + NPR, + NZD, + OMR, + PAB, + PEN, + PGK, + PHP, + PKR, + PLN, + PYG, + QAR, + RON, + RSD, + RUB, + RWF, + SAR, + SBD, + SCR, + SDG, + SEK, + SGD, + SHP, + SLL, + SOS, + SPL, + SRD, + STD, + SVC, + SYP, + SZL, + THB, + TJS, + TMT, + TND, + TOP, + TRY, + TTD, + TVD, + TWD, + TZS, + UAH, + UGX, + USD, + UYU, + UZS, + VEF, + VND, + VUV, + WST, + XAF, + XCD, + XDR, + XOF, + XPF, + YER, + ZAR, + ZMW, + ZWD + } + + /// + /// This function will delete the specified character from the list allowed by the user, and will also delete any inventory + /// or VC currently held by that character. It will NOT delete any statistics associated for this character, in order to + /// preserve leaderboard integrity. + /// + [Serializable] + public class DeleteCharacterFromUserRequest : PlayFabRequestCommon + { + /// + /// Unique PlayFab assigned ID for a specific character owned by a user + /// + public string CharacterId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + /// + /// If true, the character's inventory will be transferred up to the owning user; otherwise, this request will purge those + /// items. + /// + public bool SaveCharacterInventory; + } + + [Serializable] + public class DeleteCharacterFromUserResult : PlayFabResultCommon + { + } + + /// + /// Deletes all data associated with the player, including statistics, custom data, inventory, purchases, virtual currency + /// balances, characters and shared group memberships. Removes the player from all leaderboards and player search indexes. + /// Does not delete PlayStream event history associated with the player. Does not delete the publisher user account that + /// created the player in the title nor associated data such as username, password, email address, account linkages, or + /// friends list. Note, this API queues the player for deletion and returns immediately. It may take several minutes or more + /// before all player data is fully deleted. Until the player data is fully deleted, attempts to recreate the player with + /// the same user account in the same title will fail with the 'AccountDeleted' error. This API must be enabled for use as + /// an option in the game manager website. It is disabled by default. + /// + [Serializable] + public class DeletePlayerRequest : PlayFabRequestCommon + { + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class DeletePlayerResult : PlayFabResultCommon + { + } + + /// + /// Represents the request to delete a push notification template. + /// + [Serializable] + public class DeletePushNotificationTemplateRequest : PlayFabRequestCommon + { + /// + /// Id of the push notification template to be deleted. + /// + public string PushNotificationTemplateId; + } + + [Serializable] + public class DeletePushNotificationTemplateResult : PlayFabResultCommon + { + } + + [Serializable] + public class DeleteSharedGroupRequest : PlayFabRequestCommon + { + /// + /// Unique identifier for the shared group. + /// + public string SharedGroupId; + } + + public enum EmailVerificationStatus + { + Unverified, + Pending, + Confirmed + } + + [Serializable] + public class EmptyResponse : PlayFabResultCommon + { + } + + [Serializable] + public class EmptyResult : PlayFabResultCommon + { + } + + /// + /// Combined entity type and ID structure which uniquely identifies a single entity. + /// + [Serializable] + public class EntityKey : PlayFabBaseModel + { + /// + /// Unique ID of the entity. + /// + public string Id; + /// + /// Entity type. See https://docs.microsoft.com/gaming/playfab/features/data/entities/available-built-in-entity-types + /// + public string Type; + } + + [Serializable] + public class EntityTokenResponse : PlayFabBaseModel + { + /// + /// The entity id and type. + /// + public EntityKey Entity; + /// + /// The token used to set X-EntityToken for all entity based API calls. + /// + public string EntityToken; + /// + /// The time the token will expire, if it is an expiring token, in UTC. + /// + public DateTime? TokenExpiration; + } + + [Serializable] + public class EvaluateRandomResultTableRequest : PlayFabRequestCommon + { + /// + /// Specifies the catalog version that should be used to evaluate the Random Result Table. If unspecified, uses + /// default/primary catalog. + /// + public string CatalogVersion; + /// + /// The unique identifier of the Random Result Table to use. + /// + public string TableId; + } + + /// + /// Note that if the Random Result Table contains no entries, or does not exist for the catalog specified (the Primary + /// catalog if one is not specified), an InvalidDropTable error will be returned. + /// + [Serializable] + public class EvaluateRandomResultTableResult : PlayFabResultCommon + { + /// + /// Unique identifier for the item returned from the Random Result Table evaluation, for the given catalog. + /// + public string ResultItemId; + } + + [Serializable] + public class ExecuteCloudScriptResult : PlayFabResultCommon + { + /// + /// Number of PlayFab API requests issued by the CloudScript function + /// + public int APIRequestsIssued; + /// + /// Information about the error, if any, that occurred during execution + /// + public ScriptExecutionError Error; + public double ExecutionTimeSeconds; + /// + /// The name of the function that executed + /// + public string FunctionName; + /// + /// The object returned from the CloudScript function, if any + /// + public object FunctionResult; + /// + /// Flag indicating if the FunctionResult was too large and was subsequently dropped from this event. This only occurs if + /// the total event size is larger than 350KB. + /// + public bool? FunctionResultTooLarge; + /// + /// Number of external HTTP requests issued by the CloudScript function + /// + public int HttpRequestsIssued; + /// + /// Entries logged during the function execution. These include both entries logged in the function code using log.info() + /// and log.error() and error entries for API and HTTP request failures. + /// + public List Logs; + /// + /// Flag indicating if the logs were too large and were subsequently dropped from this event. This only occurs if the total + /// event size is larger than 350KB after the FunctionResult was removed. + /// + public bool? LogsTooLarge; + public uint MemoryConsumedBytes; + /// + /// Processor time consumed while executing the function. This does not include time spent waiting on API calls or HTTP + /// requests. + /// + public double ProcessorTimeSeconds; + /// + /// The revision of the CloudScript that executed + /// + public int Revision; + } + + [Serializable] + public class ExecuteCloudScriptServerRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The name of the CloudScript function to execute + /// + public string FunctionName; + /// + /// Object that is passed in to the function as the first argument + /// + public object FunctionParameter; + /// + /// Generate a 'player_executed_cloudscript' PlayStream event containing the results of the function execution and other + /// contextual information. This event will show up in the PlayStream debugger console for the player in Game Manager. + /// + public bool? GeneratePlayStreamEvent; + /// + /// The unique user identifier for the player on whose behalf the script is being run + /// + public string PlayFabId; + /// + /// Option for which revision of the CloudScript to execute. 'Latest' executes the most recently created revision, 'Live' + /// executes the current live, published revision, and 'Specific' executes the specified revision. The default value is + /// 'Specific', if the SpeificRevision parameter is specified, otherwise it is 'Live'. + /// + public CloudScriptRevisionOption? RevisionSelection; + /// + /// The specivic revision to execute, when RevisionSelection is set to 'Specific' + /// + public int? SpecificRevision; + } + + public enum ExternalFriendSources + { + None, + Steam, + Facebook, + Xbox, + Psn, + All + } + + [Serializable] + public class FacebookInstantGamesPlayFabIdPair : PlayFabBaseModel + { + /// + /// Unique Facebook Instant Games identifier for a user. + /// + public string FacebookInstantGamesId; + /// + /// Unique PlayFab identifier for a user, or null if no PlayFab account is linked to the Facebook Instant Games identifier. + /// + public string PlayFabId; + } + + [Serializable] + public class FacebookPlayFabIdPair : PlayFabBaseModel + { + /// + /// Unique Facebook identifier for a user. + /// + public string FacebookId; + /// + /// Unique PlayFab identifier for a user, or null if no PlayFab account is linked to the Facebook identifier. + /// + public string PlayFabId; + } + + [Serializable] + public class FriendInfo : PlayFabBaseModel + { + /// + /// Available Facebook information (if the user and connected Facebook friend both have PlayFab Accounts in the same title). + /// + public UserFacebookInfo FacebookInfo; + /// + /// PlayFab unique identifier for this friend. + /// + public string FriendPlayFabId; + /// + /// Available Game Center information (if the user and connected Game Center friend both have PlayFab Accounts in the same + /// title). + /// + public UserGameCenterInfo GameCenterInfo; + /// + /// The profile of the user, if requested. + /// + public PlayerProfileModel Profile; + /// + /// Available PlayStation :tm: Network information, if the user connected PlayStation :tm Network friend both have PlayFab + /// Accounts in the same title. + /// + public UserPsnInfo PSNInfo; + /// + /// Available Steam information (if the user and connected Steam friend both have PlayFab Accounts in the same title). + /// + public UserSteamInfo SteamInfo; + /// + /// Tags which have been associated with this friend. + /// + public List Tags; + /// + /// Title-specific display name for this friend. + /// + public string TitleDisplayName; + /// + /// PlayFab unique username for this friend. + /// + public string Username; + /// + /// Available Xbox information, (if the user and connected Xbox Live friend both have PlayFab Accounts in the same title). + /// + public UserXboxInfo XboxInfo; + } + + public enum GenericErrorCodes + { + Success, + UnkownError, + InvalidParams, + AccountNotFound, + AccountBanned, + InvalidUsernameOrPassword, + InvalidTitleId, + InvalidEmailAddress, + EmailAddressNotAvailable, + InvalidUsername, + InvalidPassword, + UsernameNotAvailable, + InvalidSteamTicket, + AccountAlreadyLinked, + LinkedAccountAlreadyClaimed, + InvalidFacebookToken, + AccountNotLinked, + FailedByPaymentProvider, + CouponCodeNotFound, + InvalidContainerItem, + ContainerNotOwned, + KeyNotOwned, + InvalidItemIdInTable, + InvalidReceipt, + ReceiptAlreadyUsed, + ReceiptCancelled, + GameNotFound, + GameModeNotFound, + InvalidGoogleToken, + UserIsNotPartOfDeveloper, + InvalidTitleForDeveloper, + TitleNameConflicts, + UserisNotValid, + ValueAlreadyExists, + BuildNotFound, + PlayerNotInGame, + InvalidTicket, + InvalidDeveloper, + InvalidOrderInfo, + RegistrationIncomplete, + InvalidPlatform, + UnknownError, + SteamApplicationNotOwned, + WrongSteamAccount, + TitleNotActivated, + RegistrationSessionNotFound, + NoSuchMod, + FileNotFound, + DuplicateEmail, + ItemNotFound, + ItemNotOwned, + ItemNotRecycleable, + ItemNotAffordable, + InvalidVirtualCurrency, + WrongVirtualCurrency, + WrongPrice, + NonPositiveValue, + InvalidRegion, + RegionAtCapacity, + ServerFailedToStart, + NameNotAvailable, + InsufficientFunds, + InvalidDeviceID, + InvalidPushNotificationToken, + NoRemainingUses, + InvalidPaymentProvider, + PurchaseInitializationFailure, + DuplicateUsername, + InvalidBuyerInfo, + NoGameModeParamsSet, + BodyTooLarge, + ReservedWordInBody, + InvalidTypeInBody, + InvalidRequest, + ReservedEventName, + InvalidUserStatistics, + NotAuthenticated, + StreamAlreadyExists, + ErrorCreatingStream, + StreamNotFound, + InvalidAccount, + PurchaseDoesNotExist, + InvalidPurchaseTransactionStatus, + APINotEnabledForGameClientAccess, + NoPushNotificationARNForTitle, + BuildAlreadyExists, + BuildPackageDoesNotExist, + CustomAnalyticsEventsNotEnabledForTitle, + InvalidSharedGroupId, + NotAuthorized, + MissingTitleGoogleProperties, + InvalidItemProperties, + InvalidPSNAuthCode, + InvalidItemId, + PushNotEnabledForAccount, + PushServiceError, + ReceiptDoesNotContainInAppItems, + ReceiptContainsMultipleInAppItems, + InvalidBundleID, + JavascriptException, + InvalidSessionTicket, + UnableToConnectToDatabase, + InternalServerError, + InvalidReportDate, + ReportNotAvailable, + DatabaseThroughputExceeded, + InvalidGameTicket, + ExpiredGameTicket, + GameTicketDoesNotMatchLobby, + LinkedDeviceAlreadyClaimed, + DeviceAlreadyLinked, + DeviceNotLinked, + PartialFailure, + PublisherNotSet, + ServiceUnavailable, + VersionNotFound, + RevisionNotFound, + InvalidPublisherId, + DownstreamServiceUnavailable, + APINotIncludedInTitleUsageTier, + DAULimitExceeded, + APIRequestLimitExceeded, + InvalidAPIEndpoint, + BuildNotAvailable, + ConcurrentEditError, + ContentNotFound, + CharacterNotFound, + CloudScriptNotFound, + ContentQuotaExceeded, + InvalidCharacterStatistics, + PhotonNotEnabledForTitle, + PhotonApplicationNotFound, + PhotonApplicationNotAssociatedWithTitle, + InvalidEmailOrPassword, + FacebookAPIError, + InvalidContentType, + KeyLengthExceeded, + DataLengthExceeded, + TooManyKeys, + FreeTierCannotHaveVirtualCurrency, + MissingAmazonSharedKey, + AmazonValidationError, + InvalidPSNIssuerId, + PSNInaccessible, + ExpiredAuthToken, + FailedToGetEntitlements, + FailedToConsumeEntitlement, + TradeAcceptingUserNotAllowed, + TradeInventoryItemIsAssignedToCharacter, + TradeInventoryItemIsBundle, + TradeStatusNotValidForCancelling, + TradeStatusNotValidForAccepting, + TradeDoesNotExist, + TradeCancelled, + TradeAlreadyFilled, + TradeWaitForStatusTimeout, + TradeInventoryItemExpired, + TradeMissingOfferedAndAcceptedItems, + TradeAcceptedItemIsBundle, + TradeAcceptedItemIsStackable, + TradeInventoryItemInvalidStatus, + TradeAcceptedCatalogItemInvalid, + TradeAllowedUsersInvalid, + TradeInventoryItemDoesNotExist, + TradeInventoryItemIsConsumed, + TradeInventoryItemIsStackable, + TradeAcceptedItemsMismatch, + InvalidKongregateToken, + FeatureNotConfiguredForTitle, + NoMatchingCatalogItemForReceipt, + InvalidCurrencyCode, + NoRealMoneyPriceForCatalogItem, + TradeInventoryItemIsNotTradable, + TradeAcceptedCatalogItemIsNotTradable, + UsersAlreadyFriends, + LinkedIdentifierAlreadyClaimed, + CustomIdNotLinked, + TotalDataSizeExceeded, + DeleteKeyConflict, + InvalidXboxLiveToken, + ExpiredXboxLiveToken, + ResettableStatisticVersionRequired, + NotAuthorizedByTitle, + NoPartnerEnabled, + InvalidPartnerResponse, + APINotEnabledForGameServerAccess, + StatisticNotFound, + StatisticNameConflict, + StatisticVersionClosedForWrites, + StatisticVersionInvalid, + APIClientRequestRateLimitExceeded, + InvalidJSONContent, + InvalidDropTable, + StatisticVersionAlreadyIncrementedForScheduledInterval, + StatisticCountLimitExceeded, + StatisticVersionIncrementRateExceeded, + ContainerKeyInvalid, + CloudScriptExecutionTimeLimitExceeded, + NoWritePermissionsForEvent, + CloudScriptFunctionArgumentSizeExceeded, + CloudScriptAPIRequestCountExceeded, + CloudScriptAPIRequestError, + CloudScriptHTTPRequestError, + InsufficientGuildRole, + GuildNotFound, + OverLimit, + EventNotFound, + InvalidEventField, + InvalidEventName, + CatalogNotConfigured, + OperationNotSupportedForPlatform, + SegmentNotFound, + StoreNotFound, + InvalidStatisticName, + TitleNotQualifiedForLimit, + InvalidServiceLimitLevel, + ServiceLimitLevelInTransition, + CouponAlreadyRedeemed, + GameServerBuildSizeLimitExceeded, + GameServerBuildCountLimitExceeded, + VirtualCurrencyCountLimitExceeded, + VirtualCurrencyCodeExists, + TitleNewsItemCountLimitExceeded, + InvalidTwitchToken, + TwitchResponseError, + ProfaneDisplayName, + UserAlreadyAdded, + InvalidVirtualCurrencyCode, + VirtualCurrencyCannotBeDeleted, + IdentifierAlreadyClaimed, + IdentifierNotLinked, + InvalidContinuationToken, + ExpiredContinuationToken, + InvalidSegment, + InvalidSessionId, + SessionLogNotFound, + InvalidSearchTerm, + TwoFactorAuthenticationTokenRequired, + GameServerHostCountLimitExceeded, + PlayerTagCountLimitExceeded, + RequestAlreadyRunning, + ActionGroupNotFound, + MaximumSegmentBulkActionJobsRunning, + NoActionsOnPlayersInSegmentJob, + DuplicateStatisticName, + ScheduledTaskNameConflict, + ScheduledTaskCreateConflict, + InvalidScheduledTaskName, + InvalidTaskSchedule, + SteamNotEnabledForTitle, + LimitNotAnUpgradeOption, + NoSecretKeyEnabledForCloudScript, + TaskNotFound, + TaskInstanceNotFound, + InvalidIdentityProviderId, + MisconfiguredIdentityProvider, + InvalidScheduledTaskType, + BillingInformationRequired, + LimitedEditionItemUnavailable, + InvalidAdPlacementAndReward, + AllAdPlacementViewsAlreadyConsumed, + GoogleOAuthNotConfiguredForTitle, + GoogleOAuthError, + UserNotFriend, + InvalidSignature, + InvalidPublicKey, + GoogleOAuthNoIdTokenIncludedInResponse, + StatisticUpdateInProgress, + LeaderboardVersionNotAvailable, + StatisticAlreadyHasPrizeTable, + PrizeTableHasOverlappingRanks, + PrizeTableHasMissingRanks, + PrizeTableRankStartsAtZero, + InvalidStatistic, + ExpressionParseFailure, + ExpressionInvokeFailure, + ExpressionTooLong, + DataUpdateRateExceeded, + RestrictedEmailDomain, + EncryptionKeyDisabled, + EncryptionKeyMissing, + EncryptionKeyBroken, + NoSharedSecretKeyConfigured, + SecretKeyNotFound, + PlayerSecretAlreadyConfigured, + APIRequestsDisabledForTitle, + InvalidSharedSecretKey, + PrizeTableHasNoRanks, + ProfileDoesNotExist, + ContentS3OriginBucketNotConfigured, + InvalidEnvironmentForReceipt, + EncryptedRequestNotAllowed, + SignedRequestNotAllowed, + RequestViewConstraintParamsNotAllowed, + BadPartnerConfiguration, + XboxBPCertificateFailure, + XboxXASSExchangeFailure, + InvalidEntityId, + StatisticValueAggregationOverflow, + EmailMessageFromAddressIsMissing, + EmailMessageToAddressIsMissing, + SmtpServerAuthenticationError, + SmtpServerLimitExceeded, + SmtpServerInsufficientStorage, + SmtpServerCommunicationError, + SmtpServerGeneralFailure, + EmailClientTimeout, + EmailClientCanceledTask, + EmailTemplateMissing, + InvalidHostForTitleId, + EmailConfirmationTokenDoesNotExist, + EmailConfirmationTokenExpired, + AccountDeleted, + PlayerSecretNotConfigured, + InvalidSignatureTime, + NoContactEmailAddressFound, + InvalidAuthToken, + AuthTokenDoesNotExist, + AuthTokenExpired, + AuthTokenAlreadyUsedToResetPassword, + MembershipNameTooLong, + MembershipNotFound, + GoogleServiceAccountInvalid, + GoogleServiceAccountParseFailure, + EntityTokenMissing, + EntityTokenInvalid, + EntityTokenExpired, + EntityTokenRevoked, + InvalidProductForSubscription, + XboxInaccessible, + SubscriptionAlreadyTaken, + SmtpAddonNotEnabled, + APIConcurrentRequestLimitExceeded, + XboxRejectedXSTSExchangeRequest, + VariableNotDefined, + TemplateVersionNotDefined, + FileTooLarge, + TitleDeleted, + TitleContainsUserAccounts, + TitleDeletionPlayerCleanupFailure, + EntityFileOperationPending, + NoEntityFileOperationPending, + EntityProfileVersionMismatch, + TemplateVersionTooOld, + MembershipDefinitionInUse, + PaymentPageNotConfigured, + FailedLoginAttemptRateLimitExceeded, + EntityBlockedByGroup, + RoleDoesNotExist, + EntityIsAlreadyMember, + DuplicateRoleId, + GroupInvitationNotFound, + GroupApplicationNotFound, + OutstandingInvitationAcceptedInstead, + OutstandingApplicationAcceptedInstead, + RoleIsGroupDefaultMember, + RoleIsGroupAdmin, + RoleNameNotAvailable, + GroupNameNotAvailable, + EmailReportAlreadySent, + EmailReportRecipientBlacklisted, + EventNamespaceNotAllowed, + EventEntityNotAllowed, + InvalidEntityType, + NullTokenResultFromAad, + InvalidTokenResultFromAad, + NoValidCertificateForAad, + InvalidCertificateForAad, + DuplicateDropTableId, + MultiplayerServerError, + MultiplayerServerTooManyRequests, + MultiplayerServerNoContent, + MultiplayerServerBadRequest, + MultiplayerServerUnauthorized, + MultiplayerServerForbidden, + MultiplayerServerNotFound, + MultiplayerServerConflict, + MultiplayerServerInternalServerError, + MultiplayerServerUnavailable, + ExplicitContentDetected, + PIIContentDetected, + InvalidScheduledTaskParameter, + PerEntityEventRateLimitExceeded, + TitleDefaultLanguageNotSet, + EmailTemplateMissingDefaultVersion, + FacebookInstantGamesIdNotLinked, + InvalidFacebookInstantGamesSignature, + FacebookInstantGamesAuthNotConfiguredForTitle, + EntityProfileConstraintValidationFailed, + TelemetryIngestionKeyPending, + TelemetryIngestionKeyNotFound, + StatisticChildNameInvalid, + DataIntegrityError, + VirtualCurrencyCannotBeSetToOlderVersion, + VirtualCurrencyMustBeWithinIntegerRange, + EmailTemplateInvalidSyntax, + EmailTemplateMissingCallback, + PushNotificationTemplateInvalidPayload, + InvalidLocalizedPushNotificationLanguage, + MissingLocalizedPushNotificationMessage, + PushNotificationTemplateMissingPlatformPayload, + PushNotificationTemplatePayloadContainsInvalidJson, + PushNotificationTemplateContainsInvalidIosPayload, + PushNotificationTemplateContainsInvalidAndroidPayload, + PushNotificationTemplateIosPayloadMissingNotificationBody, + PushNotificationTemplateAndroidPayloadMissingNotificationBody, + PushNotificationTemplateNotFound, + PushNotificationTemplateMissingDefaultVersion, + PushNotificationTemplateInvalidSyntax, + PushNotificationTemplateNoCustomPayloadForV1, + NoLeaderboardForStatistic, + TitleNewsMissingDefaultLanguage, + TitleNewsNotFound, + TitleNewsDuplicateLanguage, + TitleNewsMissingTitleOrBody, + TitleNewsInvalidLanguage, + EmailRecipientBlacklisted, + InvalidGameCenterAuthRequest, + GameCenterAuthenticationFailed, + CannotEnablePartiesForTitle, + PartyError, + PartyRequests, + PartyNoContent, + PartyBadRequest, + PartyUnauthorized, + PartyForbidden, + PartyNotFound, + PartyConflict, + PartyInternalServerError, + PartyUnavailable, + PartyTooManyRequests, + PushNotificationTemplateMissingName, + CannotEnableMultiplayerServersForTitle, + WriteAttemptedDuringExport, + MultiplayerServerTitleQuotaCoresExceeded, + AutomationRuleNotFound, + EntityAPIKeyLimitExceeded, + EntityAPIKeyNotFound, + EntityAPIKeyOrSecretInvalid, + EconomyServiceUnavailable, + EconomyServiceInternalError, + QueryRateLimitExceeded, + EntityAPIKeyCreationDisabledForEntity, + ForbiddenByEntityPolicy, + UpdateInventoryRateLimitExceeded, + StudioCreationRateLimited, + StudioCreationInProgress, + DuplicateStudioName, + StudioNotFound, + StudioDeleted, + StudioDeactivated, + StudioActivated, + TitleCreationRateLimited, + TitleCreationInProgress, + DuplicateTitleName, + TitleActivationRateLimited, + TitleActivationInProgress, + TitleDeactivated, + TitleActivated, + CloudScriptAzureFunctionsExecutionTimeLimitExceeded, + CloudScriptAzureFunctionsArgumentSizeExceeded, + CloudScriptAzureFunctionsReturnSizeExceeded, + CloudScriptAzureFunctionsHTTPRequestError, + VirtualCurrencyBetaGetError, + VirtualCurrencyBetaCreateError, + VirtualCurrencyBetaInitialDepositSaveError, + VirtualCurrencyBetaSaveError, + VirtualCurrencyBetaDeleteError, + VirtualCurrencyBetaRestoreError, + VirtualCurrencyBetaSaveConflict, + VirtualCurrencyBetaUpdateError, + InsightsManagementDatabaseNotFound, + InsightsManagementOperationNotFound, + InsightsManagementErrorPendingOperationExists, + InsightsManagementSetPerformanceLevelInvalidParameter, + InsightsManagementSetStorageRetentionInvalidParameter, + InsightsManagementGetStorageUsageInvalidParameter, + InsightsManagementGetOperationStatusInvalidParameter, + DuplicatePurchaseTransactionId, + EvaluationModePlayerCountExceeded, + GetPlayersInSegmentRateLimitExceeded, + CloudScriptFunctionNameSizeExceeded, + PaidInsightsFeaturesNotEnabled, + CloudScriptAzureFunctionsQueueRequestError, + EvaluationModeTitleCountExceeded, + InsightsManagementTitleNotInFlight, + LimitNotFound, + LimitNotAvailableViaAPI, + InsightsManagementSetStorageRetentionBelowMinimum, + InsightsManagementSetStorageRetentionAboveMaximum, + AppleNotEnabledForTitle, + InsightsManagementNewActiveEventExportLimitInvalid, + InsightsManagementSetPerformanceRateLimited, + PartyRequestsThrottledFromRateLimiter, + XboxServiceTooManyRequests, + NintendoSwitchNotEnabledForTitle, + RequestMultiplayerServersThrottledFromRateLimiter, + TitleDataOverrideNotFound, + DuplicateKeys, + WasNotCreatedWithCloudRoot, + LegacyMultiplayerServersDeprecated, + VirtualCurrencyCurrentlyUnavailable, + SteamUserNotFound, + ElasticSearchOperationFailed, + NotImplemented, + PublisherNotFound, + PublisherDeleted, + ApiDisabledForMigration, + ResourceNameUpdateNotAllowed, + ApiNotEnabledForTitle, + DuplicateTitleNameForPublisher, + AzureTitleCreationInProgress, + TitleConstraintsPublisherDeletion, + InvalidPlayerAccountPoolId, + PlayerAccountPoolNotFound, + PlayerAccountPoolDeleted, + TitleCleanupInProgress, + AzureResourceConcurrentOperationInProgress, + TitlePublisherUpdateNotAllowed, + AzureResourceManagerNotSupportedInStamp, + ApiNotIncludedInAzurePlayFabFeatureSet, + GoogleServiceAccountFailedAuth, + GoogleAPIServiceUnavailable, + GoogleAPIServiceUnknownError, + NoValidIdentityForAad, + PlayerIdentityLinkNotFound, + PhotonApplicationIdAlreadyInUse, + CloudScriptUnableToDeleteProductionRevision, + CustomIdNotFound, + AutomationInvalidInput, + AutomationInvalidRuleName, + AutomationRuleAlreadyExists, + AutomationRuleLimitExceeded, + InvalidGooglePlayGamesServerAuthCode, + PlayStreamConnectionFailed, + InvalidEventContents, + InsightsV1Deprecated, + AnalysisSubscriptionNotFound, + AnalysisSubscriptionFailed, + AnalysisSubscriptionFoundAlready, + AnalysisSubscriptionManagementInvalidInput, + InvalidGameCenterId, + InvalidNintendoSwitchAccountId, + EntityAPIKeysNotSupported, + IpAddressBanned, + EntityLineageBanned, + NamespaceMismatch, + InvalidServiceConfiguration, + InvalidNamespaceMismatch, + LeaderboardColumnLengthMismatch, + InvalidStatisticScore, + LeaderboardColumnsNotSpecified, + LeaderboardMaxSizeTooLarge, + InvalidAttributeStatisticsSpecified, + LeaderboardNotFound, + TokenSigningKeyNotFound, + LeaderboardNameConflict, + LinkedStatisticColumnMismatch, + NoLinkedStatisticToLeaderboard, + StatDefinitionAlreadyLinkedToLeaderboard, + LinkingStatsNotAllowedForEntityType, + LeaderboardCountLimitExceeded, + LeaderboardSizeLimitExceeded, + LeaderboardDefinitionModificationNotAllowedWhileLinked, + StatisticDefinitionModificationNotAllowedWhileLinked, + LeaderboardUpdateNotAllowedWhileLinked, + CloudScriptAzureFunctionsEventHubRequestError, + ExternalEntityNotAllowedForTier, + InvalidBaseTimeForInterval, + EntityTypeMismatchWithStatDefinition, + SpecifiedVersionLeaderboardNotFound, + LeaderboardColumnLengthMismatchWithStatDefinition, + DuplicateColumnNameFound, + LinkedStatisticColumnNotFound, + LinkedStatisticColumnRequired, + MultipleLinkedStatisticsNotAllowed, + DuplicateLinkedStatisticColumnNameFound, + AggregationTypeNotAllowedForMultiColumnStatistic, + MaxQueryableVersionsValueNotAllowedForTier, + StatisticDefinitionHasNullOrEmptyVersionConfiguration, + StatisticColumnLengthMismatch, + MatchmakingEntityInvalid, + MatchmakingPlayerAttributesInvalid, + MatchmakingQueueNotFound, + MatchmakingMatchNotFound, + MatchmakingTicketNotFound, + MatchmakingAlreadyJoinedTicket, + MatchmakingTicketAlreadyCompleted, + MatchmakingQueueConfigInvalid, + MatchmakingMemberProfileInvalid, + NintendoSwitchDeviceIdNotLinked, + MatchmakingNotEnabled, + MatchmakingPlayerAttributesTooLarge, + MatchmakingNumberOfPlayersInTicketTooLarge, + MatchmakingAttributeInvalid, + MatchmakingPlayerHasNotJoinedTicket, + MatchmakingRateLimitExceeded, + MatchmakingTicketMembershipLimitExceeded, + MatchmakingUnauthorized, + MatchmakingQueueLimitExceeded, + MatchmakingRequestTypeMismatch, + MatchmakingBadRequest, + PubSubFeatureNotEnabledForTitle, + PubSubTooManyRequests, + PubSubConnectionNotFoundForEntity, + PubSubConnectionHandleInvalid, + PubSubSubscriptionLimitExceeded, + TitleConfigNotFound, + TitleConfigUpdateConflict, + TitleConfigSerializationError, + CatalogApiNotImplemented, + CatalogEntityInvalid, + CatalogTitleIdMissing, + CatalogPlayerIdMissing, + CatalogClientIdentityInvalid, + CatalogOneOrMoreFilesInvalid, + CatalogItemMetadataInvalid, + CatalogItemIdInvalid, + CatalogSearchParameterInvalid, + CatalogFeatureDisabled, + CatalogConfigInvalid, + CatalogItemTypeInvalid, + CatalogBadRequest, + CatalogTooManyRequests, + InvalidCatalogItemConfiguration, + ExportInvalidStatusUpdate, + ExportInvalidPrefix, + ExportBlobContainerDoesNotExist, + ExportNotFound, + ExportCouldNotUpdate, + ExportInvalidStorageType, + ExportAmazonBucketDoesNotExist, + ExportInvalidBlobStorage, + ExportKustoException, + ExportKustoConnectionFailed, + ExportUnknownError, + ExportCantEditPendingExport, + ExportLimitExports, + ExportLimitEvents, + ExportInvalidPartitionStatusModification, + ExportCouldNotCreate, + ExportNoBackingDatabaseFound, + ExportCouldNotDelete, + ExportCannotDetermineEventQuery, + ExportInvalidQuerySchemaModification, + ExportQuerySchemaMissingRequiredColumns, + ExportCannotParseQuery, + ExportControlCommandsNotAllowed, + ExportQueryMissingTableReference, + ExportInsightsV1Deprecated, + ExplorerBasicInvalidQueryName, + ExplorerBasicInvalidQueryDescription, + ExplorerBasicInvalidQueryConditions, + ExplorerBasicInvalidQueryStartDate, + ExplorerBasicInvalidQueryEndDate, + ExplorerBasicInvalidQueryGroupBy, + ExplorerBasicInvalidQueryAggregateType, + ExplorerBasicInvalidQueryAggregateProperty, + ExplorerBasicLoadQueriesError, + ExplorerBasicLoadQueryError, + ExplorerBasicCreateQueryError, + ExplorerBasicDeleteQueryError, + ExplorerBasicUpdateQueryError, + ExplorerBasicSavedQueriesLimit, + ExplorerBasicSavedQueryNotFound, + TenantShardMapperShardNotFound, + TitleNotEnabledForParty, + PartyVersionNotFound, + MultiplayerServerBuildReferencedByMatchmakingQueue, + MultiplayerServerBuildReferencedByBuildAlias, + MultiplayerServerBuildAliasReferencedByMatchmakingQueue, + PartySerializationError, + ExperimentationExperimentStopped, + ExperimentationExperimentRunning, + ExperimentationExperimentNotFound, + ExperimentationExperimentNeverStarted, + ExperimentationExperimentDeleted, + ExperimentationClientTimeout, + ExperimentationInvalidVariantConfiguration, + ExperimentationInvalidVariableConfiguration, + ExperimentInvalidId, + ExperimentationNoScorecard, + ExperimentationTreatmentAssignmentFailed, + ExperimentationTreatmentAssignmentDisabled, + ExperimentationInvalidDuration, + ExperimentationMaxExperimentsReached, + ExperimentationExperimentSchedulingInProgress, + ExperimentationInvalidEndDate, + ExperimentationInvalidStartDate, + ExperimentationMaxDurationExceeded, + ExperimentationExclusionGroupNotFound, + ExperimentationExclusionGroupInsufficientCapacity, + ExperimentationExclusionGroupCannotDelete, + ExperimentationExclusionGroupInvalidTrafficAllocation, + ExperimentationExclusionGroupInvalidName, + MaxActionDepthExceeded, + TitleNotOnUpdatedPricingPlan, + SegmentManagementTitleNotInFlight, + SegmentManagementNoExpressionTree, + SegmentManagementTriggerActionCountOverLimit, + SegmentManagementSegmentCountOverLimit, + SegmentManagementInvalidSegmentId, + SegmentManagementInvalidInput, + SegmentManagementInvalidSegmentName, + DeleteSegmentRateLimitExceeded, + CreateSegmentRateLimitExceeded, + UpdateSegmentRateLimitExceeded, + GetSegmentsRateLimitExceeded, + AsyncExportNotInFlight, + AsyncExportNotFound, + AsyncExportRateLimitExceeded, + AnalyticsSegmentCountOverLimit, + SnapshotNotFound, + InventoryApiNotImplemented, + LobbyDoesNotExist, + LobbyRateLimitExceeded, + LobbyPlayerAlreadyJoined, + LobbyNotJoinable, + LobbyMemberCannotRejoin, + LobbyCurrentPlayersMoreThanMaxPlayers, + LobbyPlayerNotPresent, + LobbyBadRequest, + LobbyPlayerMaxLobbyLimitExceeded, + LobbyNewOwnerMustBeConnected, + LobbyCurrentOwnerStillConnected, + LobbyMemberIsNotOwner, + LobbyServerMismatch, + LobbyServerNotFound, + LobbyDifferentServerAlreadyJoined, + LobbyServerAlreadyJoined, + LobbyIsNotClientOwned, + LobbyDoesNotUseConnections, + EventSamplingInvalidRatio, + EventSamplingInvalidEventNamespace, + EventSamplingInvalidEventName, + EventSamplingRatioNotFound, + TelemetryKeyNotFound, + TelemetryKeyInvalidName, + TelemetryKeyAlreadyExists, + TelemetryKeyInvalid, + TelemetryKeyCountOverLimit, + TelemetryKeyDeactivated, + TelemetryKeyLongInsightsRetentionNotAllowed, + EventSinkConnectionInvalid, + EventSinkConnectionUnauthorized, + EventSinkRegionInvalid, + EventSinkLimitExceeded, + EventSinkSasTokenInvalid, + EventSinkNotFound, + EventSinkNameInvalid, + EventSinkSasTokenPermissionInvalid, + EventSinkSecretInvalid, + EventSinkTenantNotFound, + EventSinkAadNotFound, + EventSinkDatabaseNotFound, + EventSinkTitleUnauthorized, + EventSinkInsufficientRoleAssignment, + EventSinkContainerNotFound, + EventSinkTenantIdInvalid, + OperationCanceled, + InvalidDisplayNameRandomSuffixLength, + AllowNonUniquePlayerDisplayNamesDisableNotAllowed, + PartitionedEventInvalid, + PartitionedEventCountOverLimit, + ManageEventNamespaceInvalid, + ManageEventNameInvalid, + ManagedEventNotFound, + ManageEventsInvalidRatio, + ManagedEventInvalid, + PlayerCustomPropertiesPropertyNameTooLong, + PlayerCustomPropertiesPropertyNameIsInvalid, + PlayerCustomPropertiesStringPropertyValueTooLong, + PlayerCustomPropertiesValueIsInvalidType, + PlayerCustomPropertiesVersionMismatch, + PlayerCustomPropertiesPropertyCountTooHigh, + PlayerCustomPropertiesDuplicatePropertyName, + PlayerCustomPropertiesPropertyDoesNotExist, + AddonAlreadyExists, + AddonDoesntExist, + CopilotDisabled, + CopilotInvalidRequest, + TrueSkillUnauthorized, + TrueSkillInvalidTitleId, + TrueSkillInvalidScenarioId, + TrueSkillInvalidModelId, + TrueSkillInvalidModelName, + TrueSkillInvalidPlayerIds, + TrueSkillInvalidEntityKey, + TrueSkillInvalidConditionKey, + TrueSkillInvalidConditionValue, + TrueSkillInvalidConditionAffinityWeight, + TrueSkillInvalidEventName, + TrueSkillMatchResultCreated, + TrueSkillMatchResultAlreadySubmitted, + TrueSkillBadPlayerIdInMatchResult, + TrueSkillInvalidBotIdInMatchResult, + TrueSkillDuplicatePlayerInMatchResult, + TrueSkillNoPlayerInMatchResultTeam, + TrueSkillPlayersInMatchResultExceedingLimit, + TrueSkillInvalidPreMatchPartyInMatchResult, + TrueSkillInvalidTimestampInMatchResult, + TrueSkillStartTimeMissingInMatchResult, + TrueSkillEndTimeMissingInMatchResult, + TrueSkillInvalidPlayerSecondsPlayedInMatchResult, + TrueSkillNoTeamInMatchResult, + TrueSkillNotEnoughTeamsInMatchResult, + TrueSkillInvalidRanksInMatchResult, + TrueSkillNoWinnerInMatchResult, + TrueSkillMissingRequiredCondition, + TrueSkillMissingRequiredEvent, + TrueSkillUnknownEventName, + TrueSkillInvalidEventCount, + TrueSkillUnknownConditionKey, + TrueSkillUnknownConditionValue, + TrueSkillScenarioConfigDoesNotExist, + TrueSkillUnknownModelId, + TrueSkillNoModelInScenario, + TrueSkillNotSupportedForTitle, + TrueSkillModelIsNotActive, + TrueSkillUnauthorizedToQueryOtherPlayerSkills, + TrueSkillInvalidMaxIterations, + TrueSkillEndTimeBeforeStartTime, + TrueSkillInvalidJobId, + TrueSkillInvalidMetadataId, + TrueSkillMissingBuildVerison, + TrueSkillJobAlreadyExists, + TrueSkillJobNotFound, + TrueSkillOperationCanceled, + TrueSkillActiveModelLimitExceeded, + TrueSkillTotalModelLimitExceeded, + TrueSkillUnknownInitialModelId, + TrueSkillUnauthorizedForJob, + TrueSkillInvalidScenarioName, + TrueSkillConditionStateIsRequired, + TrueSkillEventStateIsRequired, + TrueSkillDuplicateEvent, + TrueSkillDuplicateCondition, + TrueSkillInvalidAnomalyThreshold, + TrueSkillConditionKeyLimitExceeded, + TrueSkillConditionValuePerKeyLimitExceeded, + TrueSkillInvalidTimestamp, + TrueSkillEventLimitExceeded, + TrueSkillInvalidPlayers, + TrueSkillTrueSkillPlayerNull, + TrueSkillInvalidPlayerId, + TrueSkillInvalidSquadSize, + TrueSkillConditionSetNotInModel, + TrueSkillModelStateInvalidForOperation, + TrueSkillScenarioContainsActiveModel, + GameSaveManifestNotFound, + GameSaveManifestVersionAlreadyExists, + GameSaveConflictUpdatingManifest, + GameSaveManifestUpdatesNotAllowed, + GameSaveFileAlreadyExists, + GameSaveManifestVersionNotFinalized, + GameSaveUnknownFileInManifest, + GameSaveFileExceededReportedSize, + GameSaveFileNotUploaded, + GameSaveBadRequest, + GameSaveOperationNotAllowed, + StateShareForbidden, + StateShareTitleNotInFlight, + StateShareStateNotFound, + StateShareLinkNotFound, + StateShareStateRedemptionLimitExceeded, + StateShareStateRedemptionLimitNotUpdated, + StateShareCreatedStatesLimitExceeded, + StateShareIdMissingOrMalformed + } + + [Serializable] + public class GenericPlayFabIdPair : PlayFabBaseModel + { + /// + /// Unique generic service identifier for a user. + /// + public GenericServiceId GenericId; + /// + /// Unique PlayFab identifier for a user, or null if no PlayFab account is linked to the given generic identifier. + /// + public string PlayFabId; + } + + [Serializable] + public class GenericServiceId : PlayFabBaseModel + { + /// + /// Name of the service for which the player has a unique identifier. + /// + public string ServiceName; + /// + /// Unique identifier of the player in that service. + /// + public string UserId; + } + + /// + /// Request has no paramaters. + /// + [Serializable] + public class GetAllSegmentsRequest : PlayFabRequestCommon + { + } + + [Serializable] + public class GetAllSegmentsResult : PlayFabResultCommon + { + /// + /// Array of segments for this title. + /// + public List Segments; + } + + [Serializable] + public class GetCatalogItemsRequest : PlayFabRequestCommon + { + /// + /// Which catalog is being requested. If null, uses the default catalog. + /// + public string CatalogVersion; + } + + [Serializable] + public class GetCatalogItemsResult : PlayFabResultCommon + { + /// + /// Array of items which can be purchased. + /// + public List Catalog; + } + + /// + /// Data is stored as JSON key-value pairs. If the Keys parameter is provided, the data object returned will only contain + /// the data specific to the indicated Keys. Otherwise, the full set of custom user data will be returned. + /// + [Serializable] + public class GetCharacterDataRequest : PlayFabRequestCommon + { + /// + /// Unique PlayFab assigned ID for a specific character owned by a user + /// + public string CharacterId; + /// + /// The version that currently exists according to the caller. The call will return the data for all of the keys if the + /// version in the system is greater than this. + /// + public uint? IfChangedFromDataVersion; + /// + /// Specific keys to search for in the custom user data. + /// + public List Keys; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class GetCharacterDataResult : PlayFabResultCommon + { + /// + /// Unique PlayFab assigned ID for a specific character owned by a user + /// + public string CharacterId; + /// + /// User specific data for this title. + /// + public Dictionary Data; + /// + /// Indicates the current version of the data that has been set. This is incremented with every set call for that type of + /// data (read-only, internal, etc). This version can be provided in Get calls to find updated data. + /// + public uint DataVersion; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + /// + /// All items currently in the character inventory will be returned, irrespective of how they were acquired (via purchasing, + /// grants, coupons, etc.). Items that are expired, fully consumed, or are no longer valid are not considered to be in the + /// user's current inventory, and so will not be not included. Also returns their virtual currency balances. + /// + [Serializable] + public class GetCharacterInventoryRequest : PlayFabRequestCommon + { + /// + /// Used to limit results to only those from a specific catalog version. + /// + public string CatalogVersion; + /// + /// Unique PlayFab assigned ID for a specific character owned by a user + /// + public string CharacterId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class GetCharacterInventoryResult : PlayFabResultCommon + { + /// + /// Unique identifier of the character for this inventory. + /// + public string CharacterId; + /// + /// Array of inventory items belonging to the character. + /// + public List Inventory; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + /// + /// Array of virtual currency balance(s) belonging to the character. + /// + public Dictionary VirtualCurrency; + /// + /// Array of remaining times and timestamps for virtual currencies. + /// + public Dictionary VirtualCurrencyRechargeTimes; + } + + [Serializable] + public class GetCharacterLeaderboardRequest : PlayFabRequestCommon + { + /// + /// Maximum number of entries to retrieve. + /// + public int MaxResultsCount; + /// + /// First entry in the leaderboard to be retrieved. + /// + public int StartPosition; + /// + /// Unique identifier for the title-specific statistic for the leaderboard. + /// + public string StatisticName; + } + + /// + /// Note that the Position of the character in the results is for the overall leaderboard. + /// + [Serializable] + public class GetCharacterLeaderboardResult : PlayFabResultCommon + { + /// + /// Ordered list of leaderboard entries. + /// + public List Leaderboard; + } + + /// + /// Character statistics are similar to user statistics in that they are numeric values which may only be updated by a + /// server operation, in order to minimize the opportunity for unauthorized changes. In addition to being available for use + /// by the title, the statistics are used for all leaderboard operations in PlayFab. + /// + [Serializable] + public class GetCharacterStatisticsRequest : PlayFabRequestCommon + { + /// + /// Unique PlayFab assigned ID for a specific character owned by a user + /// + public string CharacterId; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class GetCharacterStatisticsResult : PlayFabResultCommon + { + /// + /// Unique identifier of the character for the statistics. + /// + public string CharacterId; + /// + /// Character statistics for the requested user. + /// + public Dictionary CharacterStatistics; + /// + /// PlayFab unique identifier of the user whose character statistics are being returned. + /// + public string PlayFabId; + } + + [Serializable] + public class GetContentDownloadUrlRequest : PlayFabRequestCommon + { + /// + /// HTTP method to fetch item - GET or HEAD. Use HEAD when only fetching metadata. Default is GET. + /// + public string HttpMethod; + /// + /// Key of the content item to fetch, usually formatted as a path, e.g. images/a.png + /// + public string Key; + /// + /// True to download through CDN. CDN provides higher download bandwidth and lower latency. However, if you want the latest, + /// non-cached version of the content during development, set this to false. Default is true. + /// + public bool? ThruCDN; + } + + [Serializable] + public class GetContentDownloadUrlResult : PlayFabResultCommon + { + /// + /// URL for downloading content via HTTP GET or HEAD method. The URL will expire in approximately one hour. + /// + public string URL; + } + + [Serializable] + public class GetFriendLeaderboardRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Indicates which other platforms' friends should be included in the response. In HTTP, it is represented as a + /// comma-separated list of platforms. + /// + public ExternalFriendSources? ExternalPlatformFriends; + /// + /// Maximum number of entries to retrieve. + /// + public int MaxResultsCount; + /// + /// The player whose friend leaderboard to get + /// + public string PlayFabId; + /// + /// If non-null, this determines which properties of the resulting player profiles to return. For API calls from the client, + /// only the allowed client profile properties for the title may be requested. These allowed properties are configured in + /// the Game Manager "Client Profile Options" tab in the "Settings" section. + /// + public PlayerProfileViewConstraints ProfileConstraints; + /// + /// Position in the leaderboard to start this listing (defaults to the first entry). + /// + public int StartPosition; + /// + /// Statistic used to rank friends for this leaderboard. + /// + public string StatisticName; + /// + /// The version of the leaderboard to get. + /// + public int? Version; + /// + /// Xbox token if Xbox friends should be included. Requires Xbox be configured on PlayFab. + /// + public string XboxToken; + } + + [Serializable] + public class GetFriendsListRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Indicates which other platforms' friends should be included in the response. In HTTP, it is represented as a + /// comma-separated list of platforms. + /// + public ExternalFriendSources? ExternalPlatformFriends; + /// + /// PlayFab identifier of the player whose friend list to get. + /// + public string PlayFabId; + /// + /// If non-null, this determines which properties of the resulting player profiles to return. For API calls from the client, + /// only the allowed client profile properties for the title may be requested. These allowed properties are configured in + /// the Game Manager "Client Profile Options" tab in the "Settings" section. + /// + public PlayerProfileViewConstraints ProfileConstraints; + /// + /// Xbox token if Xbox friends should be included. Requires Xbox be configured on PlayFab. + /// + public string XboxToken; + } + + /// + /// If any additional services are queried for the user's friends, those friends who also have a PlayFab account registered + /// for the title will be returned in the results. For Facebook, user has to have logged into the title's Facebook app + /// recently, and only friends who also plays this game will be included. For Xbox Live, user has to have logged into the + /// Xbox Live recently, and only friends who also play this game will be included. + /// + [Serializable] + public class GetFriendsListResult : PlayFabResultCommon + { + /// + /// Array of friends found. + /// + public List Friends; + } + + [Serializable] + public class GetLeaderboardAroundCharacterRequest : PlayFabRequestCommon + { + /// + /// Unique PlayFab assigned ID for a specific character owned by a user + /// + public string CharacterId; + /// + /// Maximum number of entries to retrieve. + /// + public int MaxResultsCount; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + /// + /// Unique identifier for the title-specific statistic for the leaderboard. + /// + public string StatisticName; + } + + /// + /// Note: When calling 'GetLeaderboardAround...' APIs, the position of the character defaults to 0 when the character does + /// not have the corresponding statistic. + /// + [Serializable] + public class GetLeaderboardAroundCharacterResult : PlayFabResultCommon + { + /// + /// Ordered list of leaderboard entries. + /// + public List Leaderboard; + } + + [Serializable] + public class GetLeaderboardAroundUserRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Maximum number of entries to retrieve. + /// + public int MaxResultsCount; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + /// + /// If non-null, this determines which properties of the resulting player profiles to return. For API calls from the client, + /// only the allowed client profile properties for the title may be requested. These allowed properties are configured in + /// the Game Manager "Client Profile Options" tab in the "Settings" section. + /// + public PlayerProfileViewConstraints ProfileConstraints; + /// + /// Unique identifier for the title-specific statistic for the leaderboard. + /// + public string StatisticName; + /// + /// The version of the leaderboard to get. + /// + public int? Version; + } + + /// + /// Note: When calling 'GetLeaderboardAround...' APIs, the position of the user defaults to 0 when the user does not have + /// the corresponding statistic. + /// + [Serializable] + public class GetLeaderboardAroundUserResult : PlayFabResultCommon + { + /// + /// Ordered listing of users and their positions in the requested leaderboard. + /// + public List Leaderboard; + /// + /// The time the next scheduled reset will occur. Null if the leaderboard does not reset on a schedule. + /// + public DateTime? NextReset; + /// + /// The version of the leaderboard returned. + /// + public int Version; + } + + [Serializable] + public class GetLeaderboardForUsersCharactersRequest : PlayFabRequestCommon + { + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + /// + /// Unique identifier for the title-specific statistic for the leaderboard. + /// + public string StatisticName; + } + + /// + /// NOTE: The position of the character in the results is relative to the other characters for that specific user. This mean + /// the values will always be between 0 and one less than the number of characters returned regardless of the size of the + /// actual leaderboard. + /// + [Serializable] + public class GetLeaderboardForUsersCharactersResult : PlayFabResultCommon + { + /// + /// Ordered list of leaderboard entries. + /// + public List Leaderboard; + } + + [Serializable] + public class GetLeaderboardRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Maximum number of entries to retrieve. + /// + public int MaxResultsCount; + /// + /// If non-null, this determines which properties of the resulting player profiles to return. For API calls from the client, + /// only the allowed client profile properties for the title may be requested. These allowed properties are configured in + /// the Game Manager "Client Profile Options" tab in the "Settings" section. + /// + public PlayerProfileViewConstraints ProfileConstraints; + /// + /// First entry in the leaderboard to be retrieved. + /// + public int StartPosition; + /// + /// Unique identifier for the title-specific statistic for the leaderboard. + /// + public string StatisticName; + /// + /// The version of the leaderboard to get. + /// + public int? Version; + } + + /// + /// Note that the Position of the user in the results is for the overall leaderboard. + /// + [Serializable] + public class GetLeaderboardResult : PlayFabResultCommon + { + /// + /// Ordered listing of users and their positions in the requested leaderboard. + /// + public List Leaderboard; + /// + /// The time the next scheduled reset will occur. Null if the leaderboard does not reset on a schedule. + /// + public DateTime? NextReset; + /// + /// The version of the leaderboard returned. + /// + public int Version; + } + + [Serializable] + public class GetPlayerCombinedInfoRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Flags for which pieces of info to return for the user. + /// + public GetPlayerCombinedInfoRequestParams InfoRequestParameters; + /// + /// PlayFabId of the user whose data will be returned + /// + public string PlayFabId; + } + + [Serializable] + public class GetPlayerCombinedInfoRequestParams : PlayFabBaseModel + { + /// + /// Whether to get character inventories. Defaults to false. + /// + public bool GetCharacterInventories; + /// + /// Whether to get the list of characters. Defaults to false. + /// + public bool GetCharacterList; + /// + /// Whether to get player profile. Defaults to false. Has no effect for a new player. + /// + public bool GetPlayerProfile; + /// + /// Whether to get player statistics. Defaults to false. + /// + public bool GetPlayerStatistics; + /// + /// Whether to get title data. Defaults to false. + /// + public bool GetTitleData; + /// + /// Whether to get the player's account Info. Defaults to false + /// + public bool GetUserAccountInfo; + /// + /// Whether to get the player's custom data. Defaults to false + /// + public bool GetUserData; + /// + /// Whether to get the player's inventory. Defaults to false + /// + public bool GetUserInventory; + /// + /// Whether to get the player's read only data. Defaults to false + /// + public bool GetUserReadOnlyData; + /// + /// Whether to get the player's virtual currency balances. Defaults to false + /// + public bool GetUserVirtualCurrency; + /// + /// Specific statistics to retrieve. Leave null to get all keys. Has no effect if GetPlayerStatistics is false + /// + public List PlayerStatisticNames; + /// + /// Specifies the properties to return from the player profile. Defaults to returning the player's display name. + /// + public PlayerProfileViewConstraints ProfileConstraints; + /// + /// Specific keys to search for in the custom data. Leave null to get all keys. Has no effect if GetTitleData is false + /// + public List TitleDataKeys; + /// + /// Specific keys to search for in the custom data. Leave null to get all keys. Has no effect if GetUserData is false + /// + public List UserDataKeys; + /// + /// Specific keys to search for in the custom data. Leave null to get all keys. Has no effect if GetUserReadOnlyData is + /// false + /// + public List UserReadOnlyDataKeys; + } + + [Serializable] + public class GetPlayerCombinedInfoResult : PlayFabResultCommon + { + /// + /// Results for requested info. + /// + public GetPlayerCombinedInfoResultPayload InfoResultPayload; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class GetPlayerCombinedInfoResultPayload : PlayFabBaseModel + { + /// + /// Account information for the user. This is always retrieved. + /// + public UserAccountInfo AccountInfo; + /// + /// Inventories for each character for the user. + /// + public List CharacterInventories; + /// + /// List of characters for the user. + /// + public List CharacterList; + /// + /// The profile of the players. This profile is not guaranteed to be up-to-date. For a new player, this profile will not + /// exist. + /// + public PlayerProfileModel PlayerProfile; + /// + /// List of statistics for this player. + /// + public List PlayerStatistics; + /// + /// Title data for this title. + /// + public Dictionary TitleData; + /// + /// User specific custom data. + /// + public Dictionary UserData; + /// + /// The version of the UserData that was returned. + /// + public uint UserDataVersion; + /// + /// Array of inventory items in the user's current inventory. + /// + public List UserInventory; + /// + /// User specific read-only data. + /// + public Dictionary UserReadOnlyData; + /// + /// The version of the Read-Only UserData that was returned. + /// + public uint UserReadOnlyDataVersion; + /// + /// Dictionary of virtual currency balance(s) belonging to the user. + /// + public Dictionary UserVirtualCurrency; + /// + /// Dictionary of remaining times and timestamps for virtual currencies. + /// + public Dictionary UserVirtualCurrencyRechargeTimes; + } + + /// + /// This API allows for access to details regarding a user in the PlayFab service, usually for purposes of customer support. + /// Note that data returned may be Personally Identifying Information (PII), such as email address, and so care should be + /// taken in how this data is stored and managed. Since this call will always return the relevant information for users who + /// have accessed the title, the recommendation is to not store this data locally. + /// + [Serializable] + public class GetPlayerProfileRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + /// + /// If non-null, this determines which properties of the resulting player profiles to return. For API calls from the client, + /// only the allowed client profile properties for the title may be requested. These allowed properties are configured in + /// the Game Manager "Client Profile Options" tab in the "Settings" section. + /// + public PlayerProfileViewConstraints ProfileConstraints; + } + + [Serializable] + public class GetPlayerProfileResult : PlayFabResultCommon + { + /// + /// The profile of the player. This profile is not guaranteed to be up-to-date. For a new player, this profile will not + /// exist. + /// + public PlayerProfileModel PlayerProfile; + } + + [Serializable] + public class GetPlayerSegmentsResult : PlayFabResultCommon + { + /// + /// Array of segments the requested player currently belongs to. + /// + public List Segments; + } + + /// + /// Initial request must contain at least a Segment ID. Subsequent requests must contain the Segment ID as well as the + /// Continuation Token. Failure to send the Continuation Token will result in a new player segment list being generated. + /// Each time the Continuation Token is passed in the length of the Total Seconds to Live is refreshed. If too much time + /// passes between requests to the point that a subsequent request is past the Total Seconds to Live an error will be + /// returned and paging will be terminated. This API is resource intensive and should not be used in scenarios which might + /// generate high request volumes. Only one request to this API at a time should be made per title. Concurrent requests to + /// the API may be rejected with the APIConcurrentRequestLimitExceeded error. + /// + [Serializable] + public class GetPlayersInSegmentRequest : PlayFabRequestCommon + { + /// + /// Continuation token if retrieving subsequent pages of results. + /// + public string ContinuationToken; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// If set to true, the profiles are loaded asynchronously and the response will include a continuation token and + /// approximate profile count until the first batch of profiles is loaded. Use this parameter to help avoid network + /// timeouts. + /// + public bool? GetProfilesAsync; + /// + /// Maximum is 10,000. The value 0 will prevent loading any profiles and return only the count of profiles matching this + /// segment. + /// + public uint? MaxBatchSize; + /// + /// Number of seconds to keep the continuation token active. After token expiration it is not possible to continue paging + /// results. Default is 300 (5 minutes). Maximum is 5,400 (90 minutes). + /// + public uint? SecondsToLive; + /// + /// Unique identifier for this segment. + /// + public string SegmentId; + } + + [Serializable] + public class GetPlayersInSegmentResult : PlayFabResultCommon + { + /// + /// Continuation token to use to retrieve subsequent pages of results. If token returns null there are no more results. + /// + public string ContinuationToken; + /// + /// Array of player profiles in this segment. + /// + public List PlayerProfiles; + /// + /// Count of profiles matching this segment. + /// + public int ProfilesInSegment; + } + + [Serializable] + public class GetPlayersSegmentsRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class GetPlayerStatisticsRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// user for whom statistics are being requested + /// + public string PlayFabId; + /// + /// statistics to return + /// + public List StatisticNames; + /// + /// statistics to return, if StatisticNames is not set (only statistics which have a version matching that provided will be + /// returned) + /// + public List StatisticNameVersions; + } + + /// + /// In addition to being available for use by the title, the statistics are used for all leaderboard operations in PlayFab. + /// + [Serializable] + public class GetPlayerStatisticsResult : PlayFabResultCommon + { + /// + /// PlayFab unique identifier of the user whose statistics are being returned + /// + public string PlayFabId; + /// + /// User statistics for the requested user. + /// + public List Statistics; + } + + [Serializable] + public class GetPlayerStatisticVersionsRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// unique name of the statistic + /// + public string StatisticName; + } + + [Serializable] + public class GetPlayerStatisticVersionsResult : PlayFabResultCommon + { + /// + /// version change history of the statistic + /// + public List StatisticVersions; + } + + /// + /// This API will return a list of canonical tags which includes both namespace and tag's name. If namespace is not + /// provided, the result is a list of all canonical tags. TagName can be used for segmentation and Namespace is limited to + /// 128 characters. + /// + [Serializable] + public class GetPlayerTagsRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Optional namespace to filter results by + /// + public string Namespace; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class GetPlayerTagsResult : PlayFabResultCommon + { + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + /// + /// Canonical tags (including namespace and tag's name) for the requested user + /// + public List Tags; + } + + [Serializable] + public class GetPlayFabIDsFromFacebookIDsRequest : PlayFabRequestCommon + { + /// + /// Array of unique Facebook identifiers for which the title needs to get PlayFab identifiers. The array cannot exceed 2,000 + /// in length. + /// + public List FacebookIDs; + } + + /// + /// For Facebook identifiers which have not been linked to PlayFab accounts, null will be returned. + /// + [Serializable] + public class GetPlayFabIDsFromFacebookIDsResult : PlayFabResultCommon + { + /// + /// Mapping of Facebook identifiers to PlayFab identifiers. + /// + public List Data; + } + + [Serializable] + public class GetPlayFabIDsFromFacebookInstantGamesIdsRequest : PlayFabRequestCommon + { + /// + /// Array of unique Facebook Instant Games identifiers for which the title needs to get PlayFab identifiers. The array + /// cannot exceed 25 in length. + /// + public List FacebookInstantGamesIds; + } + + /// + /// For Facebook Instant Games identifiers which have not been linked to PlayFab accounts, null will be returned. + /// + [Serializable] + public class GetPlayFabIDsFromFacebookInstantGamesIdsResult : PlayFabResultCommon + { + /// + /// Mapping of Facebook Instant Games identifiers to PlayFab identifiers. + /// + public List Data; + } + + [Serializable] + public class GetPlayFabIDsFromGenericIDsRequest : PlayFabRequestCommon + { + /// + /// Array of unique generic service identifiers for which the title needs to get PlayFab identifiers. Currently limited to a + /// maximum of 10 in a single request. + /// + public List GenericIDs; + } + + /// + /// For generic service identifiers which have not been linked to PlayFab accounts, null will be returned. + /// + [Serializable] + public class GetPlayFabIDsFromGenericIDsResult : PlayFabResultCommon + { + /// + /// Mapping of generic service identifiers to PlayFab identifiers. + /// + public List Data; + } + + [Serializable] + public class GetPlayFabIDsFromNintendoServiceAccountIdsRequest : PlayFabRequestCommon + { + /// + /// Array of unique Nintendo Switch Account identifiers for which the title needs to get PlayFab identifiers. The array + /// cannot exceed 2,000 in length. + /// + public List NintendoAccountIds; + } + + /// + /// For Nintendo Service Account identifiers which have not been linked to PlayFab accounts, null will be returned. + /// + [Serializable] + public class GetPlayFabIDsFromNintendoServiceAccountIdsResult : PlayFabResultCommon + { + /// + /// Mapping of Nintendo Switch Service Account identifiers to PlayFab identifiers. + /// + public List Data; + } + + [Serializable] + public class GetPlayFabIDsFromNintendoSwitchDeviceIdsRequest : PlayFabRequestCommon + { + /// + /// Array of unique Nintendo Switch Device identifiers for which the title needs to get PlayFab identifiers. The array + /// cannot exceed 2,000 in length. + /// + public List NintendoSwitchDeviceIds; + } + + /// + /// For Nintendo Switch Device identifiers which have not been linked to PlayFab accounts, null will be returned. + /// + [Serializable] + public class GetPlayFabIDsFromNintendoSwitchDeviceIdsResult : PlayFabResultCommon + { + /// + /// Mapping of Nintendo Switch Device identifiers to PlayFab identifiers. + /// + public List Data; + } + + [Serializable] + public class GetPlayFabIDsFromPSNAccountIDsRequest : PlayFabRequestCommon + { + /// + /// Id of the PlayStation :tm: Network issuer environment. If null, defaults to production environment. + /// + public int? IssuerId; + /// + /// Array of unique PlayStation :tm: Network identifiers for which the title needs to get PlayFab identifiers. The array + /// cannot exceed 2,000 in length. + /// + public List PSNAccountIDs; + } + + /// + /// For PlayStation :tm: Network identifiers which have not been linked to PlayFab accounts, null will be returned. + /// + [Serializable] + public class GetPlayFabIDsFromPSNAccountIDsResult : PlayFabResultCommon + { + /// + /// Mapping of PlayStation :tm: Network identifiers to PlayFab identifiers. + /// + public List Data; + } + + [Serializable] + public class GetPlayFabIDsFromPSNOnlineIDsRequest : PlayFabRequestCommon + { + /// + /// Id of the PlayStation :tm: Network issuer environment. If null, defaults to production environment. + /// + public int? IssuerId; + /// + /// Array of unique PlayStation :tm: Network identifiers for which the title needs to get PlayFab identifiers. The array + /// cannot exceed 2,000 in length. + /// + public List PSNOnlineIDs; + } + + /// + /// For PlayStation :tm: Network identifiers which have not been linked to PlayFab accounts, null will be returned. + /// + [Serializable] + public class GetPlayFabIDsFromPSNOnlineIDsResult : PlayFabResultCommon + { + /// + /// Mapping of PlayStation :tm: Network identifiers to PlayFab identifiers. + /// + public List Data; + } + + [Serializable] + public class GetPlayFabIDsFromSteamIDsRequest : PlayFabRequestCommon + { + /// + /// Array of unique Steam identifiers (Steam profile IDs) for which the title needs to get PlayFab identifiers. The array + /// cannot exceed 2,000 in length. + /// + public List SteamStringIDs; + } + + /// + /// For Steam identifiers which have not been linked to PlayFab accounts, null will be returned. + /// + [Serializable] + public class GetPlayFabIDsFromSteamIDsResult : PlayFabResultCommon + { + /// + /// Mapping of Steam identifiers to PlayFab identifiers. + /// + public List Data; + } + + [Serializable] + public class GetPlayFabIDsFromTwitchIDsRequest : PlayFabRequestCommon + { + /// + /// Array of unique Twitch identifiers (Twitch's _id) for which the title needs to get PlayFab identifiers. The array cannot + /// exceed 2,000 in length. + /// + public List TwitchIds; + } + + /// + /// For Twitch identifiers which have not been linked to PlayFab accounts, null will be returned. + /// + [Serializable] + public class GetPlayFabIDsFromTwitchIDsResult : PlayFabResultCommon + { + /// + /// Mapping of Twitch identifiers to PlayFab identifiers. + /// + public List Data; + } + + [Serializable] + public class GetPlayFabIDsFromXboxLiveIDsRequest : PlayFabRequestCommon + { + /// + /// The ID of Xbox Live sandbox. + /// + public string Sandbox; + /// + /// Array of unique Xbox Live account identifiers for which the title needs to get PlayFab identifiers. The array cannot + /// exceed 2,000 in length. + /// + public List XboxLiveAccountIDs; + } + + /// + /// For XboxLive identifiers which have not been linked to PlayFab accounts, null will be returned. + /// + [Serializable] + public class GetPlayFabIDsFromXboxLiveIDsResult : PlayFabResultCommon + { + /// + /// Mapping of Xbox Live identifiers to PlayFab identifiers. + /// + public List Data; + } + + /// + /// This API is designed to return publisher-specific values which can be read, but not written to, by the client. This data + /// is shared across all titles assigned to a particular publisher, and can be used for cross-game coordination. Only titles + /// assigned to a publisher can use this API. For more information email helloplayfab@microsoft.com. Note that there may up + /// to a minute delay in between updating title data and this API call returning the newest value. + /// + [Serializable] + public class GetPublisherDataRequest : PlayFabRequestCommon + { + /// + /// array of keys to get back data from the Publisher data blob, set by the admin tools + /// + public List Keys; + } + + [Serializable] + public class GetPublisherDataResult : PlayFabResultCommon + { + /// + /// a dictionary object of key / value pairs + /// + public Dictionary Data; + } + + [Serializable] + public class GetRandomResultTablesRequest : PlayFabRequestCommon + { + /// + /// Specifies the catalog version that should be used to retrieve the Random Result Tables. If unspecified, uses + /// default/primary catalog. + /// + public string CatalogVersion; + /// + /// The unique identifier of the Random Result Table to use. + /// + public List TableIDs; + } + + /// + /// Note that if a specified Random Result Table contains no entries, or does not exist in the catalog, an InvalidDropTable + /// error will be returned. + /// + [Serializable] + public class GetRandomResultTablesResult : PlayFabResultCommon + { + /// + /// array of random result tables currently available + /// + public Dictionary Tables; + } + + [Serializable] + public class GetSegmentResult : PlayFabBaseModel + { + /// + /// Identifier of the segments AB Test, if it is attached to one. + /// + public string ABTestParent; + /// + /// Unique identifier for this segment. + /// + public string Id; + /// + /// Segment name. + /// + public string Name; + } + + [Serializable] + public class GetServerCustomIDsFromPlayFabIDsRequest : PlayFabRequestCommon + { + /// + /// Array of unique PlayFab player identifiers for which the title needs to get server custom identifiers. Cannot contain + /// more than 25 identifiers. + /// + public List PlayFabIDs; + } + + /// + /// For a PlayFab account that isn't associated with a server custom identity, ServerCustomId will be null. + /// + [Serializable] + public class GetServerCustomIDsFromPlayFabIDsResult : PlayFabResultCommon + { + /// + /// Mapping of server custom player identifiers to PlayFab identifiers. + /// + public List Data; + } + + [Serializable] + public class GetSharedGroupDataRequest : PlayFabRequestCommon + { + /// + /// If true, return the list of all members of the shared group. + /// + public bool? GetMembers; + /// + /// Specific keys to retrieve from the shared group (if not specified, all keys will be returned, while an empty array + /// indicates that no keys should be returned). + /// + public List Keys; + /// + /// Unique identifier for the shared group. + /// + public string SharedGroupId; + } + + [Serializable] + public class GetSharedGroupDataResult : PlayFabResultCommon + { + /// + /// Data for the requested keys. + /// + public Dictionary Data; + /// + /// List of PlayFabId identifiers for the members of this group, if requested. + /// + public List Members; + } + + [Serializable] + public class GetStoreItemsResult : PlayFabResultCommon + { + /// + /// The base catalog that this store is a part of. + /// + public string CatalogVersion; + /// + /// Additional data about the store. + /// + public StoreMarketingModel MarketingData; + /// + /// How the store was last updated (Admin or a third party). + /// + public SourceType? Source; + /// + /// Array of items which can be purchased from this store. + /// + public List Store; + /// + /// The ID of this store. + /// + public string StoreId; + } + + /// + /// A store contains an array of references to items defined in one or more catalog versions of the game, along with the + /// prices for the item, in both real world and virtual currencies. These prices act as an override to any prices defined in + /// the catalog. In this way, the base definitions of the items may be defined in the catalog, with all associated + /// properties, while the pricing can be set for each store, as needed. This allows for subsets of goods to be defined for + /// different purposes (in order to simplify showing some, but not all catalog items to users, based upon different + /// characteristics), along with unique prices. Note that all prices defined in the catalog and store definitions for the + /// item are considered valid, and that a compromised client can be made to send a request for an item based upon any of + /// these definitions. If no price is specified in the store for an item, the price set in the catalog should be displayed + /// to the user. + /// + [Serializable] + public class GetStoreItemsServerRequest : PlayFabRequestCommon + { + /// + /// Catalog version to store items from. Use default catalog version if null + /// + public string CatalogVersion; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Optional identifier for the player to use in requesting the store information - if used, segment overrides will be + /// applied + /// + public string PlayFabId; + /// + /// Unqiue identifier for the store which is being requested + /// + public string StoreId; + } + + /// + /// This query retrieves the current time from one of the servers in PlayFab. Please note that due to clock drift between + /// servers, there is a potential variance of up to 5 seconds. + /// + [Serializable] + public class GetTimeRequest : PlayFabRequestCommon + { + } + + /// + /// Time is always returned as Coordinated Universal Time (UTC). + /// + [Serializable] + public class GetTimeResult : PlayFabResultCommon + { + /// + /// Current server time when the request was received, in UTC + /// + public DateTime Time; + } + + /// + /// This API is designed to return title specific values which can be read, but not written to, by the client. For example, + /// a developer could choose to store values which modify the user experience, such as enemy spawn rates, weapon strengths, + /// movement speeds, etc. This allows a developer to update the title without the need to create, test, and ship a new + /// build. If an override label is specified in the request, the overrides are applied automatically and returned with the + /// title data. Note that there may up to a minute delay in between updating title data and this API call returning the + /// newest value. + /// + [Serializable] + public class GetTitleDataRequest : PlayFabRequestCommon + { + /// + /// Specific keys to search for in the title data (leave null to get all keys) + /// + public List Keys; + /// + /// Optional field that specifies the name of an override. This value is ignored when used by the game client; otherwise, + /// the overrides are applied automatically to the title data. + /// + public string OverrideLabel; + } + + [Serializable] + public class GetTitleDataResult : PlayFabResultCommon + { + /// + /// a dictionary object of key / value pairs + /// + public Dictionary Data; + } + + [Serializable] + public class GetTitleNewsRequest : PlayFabRequestCommon + { + /// + /// Limits the results to the last n entries. Defaults to 10 if not set. + /// + public int? Count; + } + + [Serializable] + public class GetTitleNewsResult : PlayFabResultCommon + { + /// + /// Array of localized news items. + /// + public List News; + } + + /// + /// This API allows for access to details regarding a user in the PlayFab service, usually for purposes of customer support. + /// Note that data returned may be Personally Identifying Information (PII), such as email address, and so care should be + /// taken in how this data is stored and managed. Since this call will always return the relevant information for users who + /// have accessed the title, the recommendation is to not store this data locally. + /// + [Serializable] + public class GetUserAccountInfoRequest : PlayFabRequestCommon + { + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class GetUserAccountInfoResult : PlayFabResultCommon + { + /// + /// Account details for the user whose information was requested. + /// + public UserAccountInfo UserInfo; + } + + /// + /// Get all bans for a user, including inactive and expired bans. + /// + [Serializable] + public class GetUserBansRequest : PlayFabRequestCommon + { + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class GetUserBansResult : PlayFabResultCommon + { + /// + /// Information about the bans + /// + public List BanData; + } + + /// + /// Data is stored as JSON key-value pairs. If the Keys parameter is provided, the data object returned will only contain + /// the data specific to the indicated Keys. Otherwise, the full set of custom user data will be returned. + /// + [Serializable] + public class GetUserDataRequest : PlayFabRequestCommon + { + /// + /// The version that currently exists according to the caller. The call will return the data for all of the keys if the + /// version in the system is greater than this. + /// + public uint? IfChangedFromDataVersion; + /// + /// Specific keys to search for in the custom user data. + /// + public List Keys; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class GetUserDataResult : PlayFabResultCommon + { + /// + /// User specific data for this title. + /// + public Dictionary Data; + /// + /// Indicates the current version of the data that has been set. This is incremented with every set call for that type of + /// data (read-only, internal, etc). This version can be provided in Get calls to find updated data. + /// + public uint DataVersion; + /// + /// PlayFab unique identifier of the user whose custom data is being returned. + /// + public string PlayFabId; + } + + /// + /// All items currently in the user inventory will be returned, irrespective of how they were acquired (via purchasing, + /// grants, coupons, etc.). Items that are expired, fully consumed, or are no longer valid are not considered to be in the + /// user's current inventory, and so will not be not included. + /// + [Serializable] + public class GetUserInventoryRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class GetUserInventoryResult : PlayFabResultCommon + { + /// + /// Array of inventory items belonging to the user. + /// + public List Inventory; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + /// + /// Array of virtual currency balance(s) belonging to the user. + /// + public Dictionary VirtualCurrency; + /// + /// Array of remaining times and timestamps for virtual currencies. + /// + public Dictionary VirtualCurrencyRechargeTimes; + } + + /// + /// Grants a character to the user of the type and name specified in the request. + /// + [Serializable] + public class GrantCharacterToUserRequest : PlayFabRequestCommon + { + /// + /// Non-unique display name of the character being granted (1-40 characters in length). + /// + public string CharacterName; + /// + /// Type of the character being granted; statistics can be sliced based on this value. + /// + public string CharacterType; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class GrantCharacterToUserResult : PlayFabResultCommon + { + /// + /// Unique identifier tagged to this character. + /// + public string CharacterId; + } + + /// + /// Result of granting an item to a user. Note, to retrieve additional information for an item such as Tags, Description + /// that are the same across all instances of the item, a call to GetCatalogItems is required. The ItemID of can be matched + /// to a catalog entry, which contains the additional information. Also note that Custom Data is only set when the User's + /// specific instance has updated the CustomData via a call to UpdateUserInventoryItemCustomData. Other fields such as + /// UnitPrice and UnitCurrency are only set when the item was granted via a purchase. + /// + [Serializable] + public class GrantedItemInstance : PlayFabBaseModel + { + /// + /// Game specific comment associated with this instance when it was added to the user inventory. + /// + public string Annotation; + /// + /// Array of unique items that were awarded when this catalog item was purchased. + /// + public List BundleContents; + /// + /// Unique identifier for the parent inventory item, as defined in the catalog, for object which were added from a bundle or + /// container. + /// + public string BundleParent; + /// + /// Catalog version for the inventory item, when this instance was created. + /// + public string CatalogVersion; + /// + /// Unique PlayFab assigned ID for a specific character owned by a user + /// + public string CharacterId; + /// + /// A set of custom key-value pairs on the instance of the inventory item, which is not to be confused with the catalog + /// item's custom data. + /// + public Dictionary CustomData; + /// + /// CatalogItem.DisplayName at the time this item was purchased. + /// + public string DisplayName; + /// + /// Timestamp for when this instance will expire. + /// + public DateTime? Expiration; + /// + /// Class name for the inventory item, as defined in the catalog. + /// + public string ItemClass; + /// + /// Unique identifier for the inventory item, as defined in the catalog. + /// + public string ItemId; + /// + /// Unique item identifier for this specific instance of the item. + /// + public string ItemInstanceId; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + /// + /// Timestamp for when this instance was purchased. + /// + public DateTime? PurchaseDate; + /// + /// Total number of remaining uses, if this is a consumable item. + /// + public int? RemainingUses; + /// + /// Result of this operation. + /// + public bool Result; + /// + /// Currency type for the cost of the catalog item. Not available when granting items. + /// + public string UnitCurrency; + /// + /// Cost of the catalog item in the given currency. Not available when granting items. + /// + public uint UnitPrice; + /// + /// The number of uses that were added or removed to this item in this call. + /// + public int? UsesIncrementedBy; + } + + /// + /// This function directly adds inventory items to the character's inventories. As a result of this operations, the user + /// will not be charged any transaction fee, regardless of the inventory item catalog definition. Please note that the + /// processing time for inventory grants and purchases increases fractionally the more items are in the inventory, and the + /// more items are in the grant/purchase operation. + /// + [Serializable] + public class GrantItemsToCharacterRequest : PlayFabRequestCommon + { + /// + /// String detailing any additional information concerning this operation. + /// + public string Annotation; + /// + /// Catalog version from which items are to be granted. + /// + public string CatalogVersion; + /// + /// Unique PlayFab assigned ID for a specific character owned by a user + /// + public string CharacterId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Array of itemIds to grant to the user. + /// + public List ItemIds; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class GrantItemsToCharacterResult : PlayFabResultCommon + { + /// + /// Array of items granted to users. + /// + public List ItemGrantResults; + } + + /// + /// This function directly adds inventory items to the user's inventories. As a result of this operations, the user will not + /// be charged any transaction fee, regardless of the inventory item catalog definition. Please note that the processing + /// time for inventory grants and purchases increases fractionally the more items are in the inventory, and the more items + /// are in the grant/purchase operation. + /// + [Serializable] + public class GrantItemsToUserRequest : PlayFabRequestCommon + { + /// + /// String detailing any additional information concerning this operation. + /// + public string Annotation; + /// + /// Catalog version from which items are to be granted. + /// + public string CatalogVersion; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Array of itemIds to grant to the user. + /// + public List ItemIds; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + /// + /// Please note that the order of the items in the response may not match the order of items in the request. + /// + [Serializable] + public class GrantItemsToUserResult : PlayFabResultCommon + { + /// + /// Array of items granted to users. + /// + public List ItemGrantResults; + } + + /// + /// This function directly adds inventory items to user inventories. As a result of this operations, the user will not be + /// charged any transaction fee, regardless of the inventory item catalog definition. Please note that the processing time + /// for inventory grants and purchases increases fractionally the more items are in the inventory, and the more items are in + /// the grant/purchase operation. + /// + [Serializable] + public class GrantItemsToUsersRequest : PlayFabRequestCommon + { + /// + /// Catalog version from which items are to be granted. + /// + public string CatalogVersion; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Array of items to grant and the users to whom the items are to be granted. + /// + public List ItemGrants; + } + + /// + /// Please note that the order of the items in the response may not match the order of items in the request. + /// + [Serializable] + public class GrantItemsToUsersResult : PlayFabResultCommon + { + /// + /// Array of items granted to users. + /// + public List ItemGrantResults; + } + + [Serializable] + public class ItemGrant : PlayFabBaseModel + { + /// + /// String detailing any additional information concerning this operation. + /// + public string Annotation; + /// + /// Unique PlayFab assigned ID for a specific character owned by a user + /// + public string CharacterId; + /// + /// Key-value pairs to be written to the custom data. Note that keys are trimmed of whitespace, are limited in size, and may + /// not begin with a '!' character or be null. + /// + public Dictionary Data; + /// + /// Unique identifier of the catalog item to be granted to the user. + /// + public string ItemId; + /// + /// Optional list of Data-keys to remove from UserData. Some SDKs cannot insert null-values into Data due to language + /// constraints. Use this to delete the keys directly. + /// + public List KeysToRemove; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + /// + /// A unique instance of an item in a user's inventory. Note, to retrieve additional information for an item such as Tags, + /// Description that are the same across all instances of the item, a call to GetCatalogItems is required. The ItemID of can + /// be matched to a catalog entry, which contains the additional information. Also note that Custom Data is only set when + /// the User's specific instance has updated the CustomData via a call to UpdateUserInventoryItemCustomData. Other fields + /// such as UnitPrice and UnitCurrency are only set when the item was granted via a purchase. + /// + [Serializable] + public class ItemInstance : PlayFabBaseModel + { + /// + /// Game specific comment associated with this instance when it was added to the user inventory. + /// + public string Annotation; + /// + /// Array of unique items that were awarded when this catalog item was purchased. + /// + public List BundleContents; + /// + /// Unique identifier for the parent inventory item, as defined in the catalog, for object which were added from a bundle or + /// container. + /// + public string BundleParent; + /// + /// Catalog version for the inventory item, when this instance was created. + /// + public string CatalogVersion; + /// + /// A set of custom key-value pairs on the instance of the inventory item, which is not to be confused with the catalog + /// item's custom data. + /// + public Dictionary CustomData; + /// + /// CatalogItem.DisplayName at the time this item was purchased. + /// + public string DisplayName; + /// + /// Timestamp for when this instance will expire. + /// + public DateTime? Expiration; + /// + /// Class name for the inventory item, as defined in the catalog. + /// + public string ItemClass; + /// + /// Unique identifier for the inventory item, as defined in the catalog. + /// + public string ItemId; + /// + /// Unique item identifier for this specific instance of the item. + /// + public string ItemInstanceId; + /// + /// Timestamp for when this instance was purchased. + /// + public DateTime? PurchaseDate; + /// + /// Total number of remaining uses, if this is a consumable item. + /// + public int? RemainingUses; + /// + /// Currency type for the cost of the catalog item. Not available when granting items. + /// + public string UnitCurrency; + /// + /// Cost of the catalog item in the given currency. Not available when granting items. + /// + public uint UnitPrice; + /// + /// The number of uses that were added or removed to this item in this call. + /// + public int? UsesIncrementedBy; + } + + [Serializable] + public class LinkedPlatformAccountModel : PlayFabBaseModel + { + /// + /// Linked account email of the user on the platform, if available + /// + public string Email; + /// + /// Authentication platform + /// + public LoginIdentityProvider? Platform; + /// + /// Unique account identifier of the user on the platform + /// + public string PlatformUserId; + /// + /// Linked account username of the user on the platform, if available + /// + public string Username; + } + + [Serializable] + public class LinkNintendoServiceAccountRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// If another user is already linked to a specific Nintendo Switch account, unlink the other user and re-link. + /// + public bool? ForceLink; + /// + /// The JSON Web token (JWT) returned by Nintendo after login. Used to validate the request and find the user ID (Nintendo + /// Switch subject) to link with. + /// + public string IdentityToken; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class LinkNintendoServiceAccountSubjectRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// If another user is already linked to a specific Nintendo Service Account, unlink the other user and re-link. + /// + public bool? ForceLink; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + /// + /// The Nintendo Service Account subject or id to link to the PlayFab user. + /// + public string Subject; + } + + [Serializable] + public class LinkNintendoSwitchDeviceIdRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// If another user is already linked to the Nintendo Switch Device ID, unlink the other user and re-link. + /// + public bool? ForceLink; + /// + /// Nintendo Switch unique identifier for the user's device. + /// + public string NintendoSwitchDeviceId; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class LinkNintendoSwitchDeviceIdResult : PlayFabResultCommon + { + } + + [Serializable] + public class LinkPSNAccountRequest : PlayFabRequestCommon + { + /// + /// Authentication code provided by the PlayStation :tm: Network. + /// + public string AuthCode; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// If another user is already linked to the account, unlink the other user and re-link. + /// + public bool? ForceLink; + /// + /// Id of the PlayStation :tm: Network issuer environment. If null, defaults to production environment. + /// + public int? IssuerId; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + /// + /// Redirect URI supplied to PlayStation :tm: Network when requesting an auth code + /// + public string RedirectUri; + } + + [Serializable] + public class LinkPSNAccountResult : PlayFabResultCommon + { + } + + [Serializable] + public class LinkPSNIdRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// If another user is already linked to the account, unlink the other user and re-link. + /// + public bool? ForceLink; + /// + /// Id of the PlayStation :tm: Network issuer environment. If null, defaults to production environment. + /// + public int? IssuerId; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + /// + /// Id of the PlayStation :tm: Network user. Also known as the PSN Account Id. + /// + public string PSNUserId; + } + + [Serializable] + public class LinkPSNIdResponse : PlayFabResultCommon + { + } + + [Serializable] + public class LinkServerCustomIdRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// If another user is already linked to the custom ID, unlink the other user and re-link. + /// + public bool? ForceLink; + /// + /// Unique PlayFab identifier. + /// + public string PlayFabId; + /// + /// Unique server custom identifier for this player. + /// + public string ServerCustomId; + } + + [Serializable] + public class LinkServerCustomIdResult : PlayFabResultCommon + { + } + + [Serializable] + public class LinkSteamIdRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// If another user is already linked to the account, unlink the other user and re-link. + /// + public bool? ForceLink; + /// + /// Unique PlayFab identifier for a user, or null if no PlayFab account is linked to the Xbox Live identifier. + /// + public string PlayFabId; + /// + /// Unique Steam identifier for a user. + /// + public string SteamId; + } + + [Serializable] + public class LinkSteamIdResult : PlayFabResultCommon + { + } + + [Serializable] + public class LinkXboxAccountRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// If another user is already linked to the account, unlink the other user and re-link. + /// + public bool? ForceLink; + /// + /// Unique PlayFab identifier for a user, or null if no PlayFab account is linked to the Xbox Live identifier. + /// + public string PlayFabId; + /// + /// Token provided by the Xbox Live SDK/XDK method GetTokenAndSignatureAsync("POST", "https://playfabapi.com/", ""). + /// + public string XboxToken; + } + + [Serializable] + public class LinkXboxAccountResult : PlayFabResultCommon + { + } + + /// + /// Returns a list of every character that currently belongs to a user. + /// + [Serializable] + public class ListUsersCharactersRequest : PlayFabRequestCommon + { + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class ListUsersCharactersResult : PlayFabResultCommon + { + /// + /// The requested list of characters. + /// + public List Characters; + } + + /// + /// Contains the localized push notification content. + /// + [Serializable] + public class LocalizedPushNotificationProperties : PlayFabBaseModel + { + /// + /// Message of the localized push notification template. + /// + public string Message; + /// + /// Subject of the localized push notification template. + /// + public string Subject; + } + + [Serializable] + public class LocationModel : PlayFabBaseModel + { + /// + /// City name. + /// + public string City; + /// + /// The two-character continent code for this location + /// + public ContinentCode? ContinentCode; + /// + /// The two-character ISO 3166-1 country code for the country associated with the location + /// + public CountryCode? CountryCode; + /// + /// Latitude coordinate of the geographic location. + /// + public double? Latitude; + /// + /// Longitude coordinate of the geographic location. + /// + public double? Longitude; + } + + public enum LoginIdentityProvider + { + Unknown, + PlayFab, + Custom, + GameCenter, + GooglePlay, + Steam, + XBoxLive, + PSN, + Kongregate, + Facebook, + IOSDevice, + AndroidDevice, + Twitch, + WindowsHello, + GameServer, + CustomServer, + NintendoSwitch, + FacebookInstantGames, + OpenIdConnect, + Apple, + NintendoSwitchAccount, + GooglePlayGames, + XboxMobileStore, + King + } + + /// + /// If this is the first time a user has signed in with the PlayStation :tm: Network account and CreateAccount is set to + /// true, a new PlayFab account will be created and linked to the PlayStation :tm: Network account. In this case, no email + /// or username will be associated with the PlayFab account. Otherwise, if no PlayFab account is linked to the PlayStation + /// :tm: Network account, an error indicating this will be returned, so that the title can guide the user through creation + /// of a PlayFab account. + /// + [Serializable] + public class LoginWithPSNRequest : PlayFabRequestCommon + { + /// + /// Auth code provided by the PlayStation :tm: Network OAuth provider. + /// + public string AuthCode; + /// + /// Automatically create a PlayFab account if one is not currently linked to this ID. + /// + public bool? CreateAccount; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Flags for which pieces of info to return for the user. + /// + public GetPlayerCombinedInfoRequestParams InfoRequestParameters; + /// + /// Id of the PlayStation :tm: Network issuer environment. If null, defaults to production environment. + /// + public int? IssuerId; + /// + /// Redirect URI supplied to PlayStation :tm: Network when requesting an auth code + /// + public string RedirectUri; + } + + [Serializable] + public class LoginWithServerCustomIdRequest : PlayFabRequestCommon + { + /// + /// Automatically create a PlayFab account if one is not currently linked to this ID. + /// + public bool? CreateAccount; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Flags for which pieces of info to return for the user. + /// + public GetPlayerCombinedInfoRequestParams InfoRequestParameters; + /// + /// Player secret that is used to verify API request signatures (Enterprise Only). + /// + public string PlayerSecret; + /// + /// The backend server identifier for this player. + /// + public string ServerCustomId; + } + + /// + /// If this is the first time a user has signed in with the Steam ID and CreateAccount is set to true, a new PlayFab account + /// will be created and linked to the Steam account. In this case, no email or username will be associated with the PlayFab + /// account. Otherwise, if no PlayFab account is linked to the Steam account, an error indicating this will be returned, so + /// that the title can guide the user through creation of a PlayFab account. Steam users that are not logged into the Steam + /// Client app will only have their Steam username synced, other data, such as currency and country will not be available + /// until they login while the Client is open. + /// + [Serializable] + public class LoginWithSteamIdRequest : PlayFabRequestCommon + { + /// + /// Automatically create a PlayFab account if one is not currently linked to this ID. + /// + public bool? CreateAccount; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Flags for which pieces of info to return for the user. + /// + public GetPlayerCombinedInfoRequestParams InfoRequestParameters; + /// + /// Unique Steam identifier for a user. + /// + public string SteamId; + } + + /// + /// If this is the first time a user has signed in with the Xbox ID and CreateAccount is set to true, a new PlayFab account + /// will be created and linked to the Xbox Live account. In this case, no email or username will be associated with the + /// PlayFab account. Otherwise, if no PlayFab account is linked to the Xbox Live account, an error indicating this will be + /// returned, so that the title can guide the user through creation of a PlayFab account. + /// + [Serializable] + public class LoginWithXboxIdRequest : PlayFabRequestCommon + { + /// + /// Automatically create a PlayFab account if one is not currently linked to this ID. + /// + public bool? CreateAccount; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Flags for which pieces of info to return for the user. + /// + public GetPlayerCombinedInfoRequestParams InfoRequestParameters; + /// + /// The id of Xbox Live sandbox. + /// + public string Sandbox; + /// + /// Unique Xbox identifier for a user. + /// + public string XboxId; + } + + /// + /// If this is the first time a user has signed in with the Xbox Live account and CreateAccount is set to true, a new + /// PlayFab account will be created and linked to the Xbox Live account. In this case, no email or username will be + /// associated with the PlayFab account. Otherwise, if no PlayFab account is linked to the Xbox Live account, an error + /// indicating this will be returned, so that the title can guide the user through creation of a PlayFab account. + /// + [Serializable] + public class LoginWithXboxRequest : PlayFabRequestCommon + { + /// + /// Automatically create a PlayFab account if one is not currently linked to this ID. + /// + public bool? CreateAccount; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Flags for which pieces of info to return for the user. + /// + public GetPlayerCombinedInfoRequestParams InfoRequestParameters; + /// + /// Token provided by the Xbox Live SDK/XDK method GetTokenAndSignatureAsync("POST", "https://playfabapi.com/", ""). + /// + public string XboxToken; + } + + [Serializable] + public class LogStatement : PlayFabBaseModel + { + /// + /// Optional object accompanying the message as contextual information + /// + public object Data; + /// + /// 'Debug', 'Info', or 'Error' + /// + public string Level; + public string Message; + } + + [Serializable] + public class MembershipModel : PlayFabBaseModel + { + /// + /// Whether this membership is active. That is, whether the MembershipExpiration time has been reached. + /// + public bool IsActive; + /// + /// The time this membership expires + /// + public DateTime MembershipExpiration; + /// + /// The id of the membership + /// + public string MembershipId; + /// + /// Membership expirations can be explicitly overridden (via game manager or the admin api). If this membership has been + /// overridden, this will be the new expiration time. + /// + public DateTime? OverrideExpiration; + /// + /// The list of subscriptions that this player has for this membership + /// + public List Subscriptions; + } + + [Serializable] + public class ModifyCharacterVirtualCurrencyResult : PlayFabResultCommon + { + /// + /// Balance of the virtual currency after modification. + /// + public int Balance; + /// + /// Name of the virtual currency which was modified. + /// + public string VirtualCurrency; + } + + /// + /// This function can both add and remove uses of an inventory item. If the number of uses drops below zero, the item will + /// be removed from active inventory. + /// + [Serializable] + public class ModifyItemUsesRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Unique instance identifier of the item to be modified. + /// + public string ItemInstanceId; + /// + /// PlayFab unique identifier of the user whose item is being modified. + /// + public string PlayFabId; + /// + /// Number of uses to add to the item. Can be negative to remove uses. + /// + public int UsesToAdd; + } + + [Serializable] + public class ModifyItemUsesResult : PlayFabResultCommon + { + /// + /// Unique instance identifier of the item with uses consumed. + /// + public string ItemInstanceId; + /// + /// Number of uses remaining on the item. + /// + public int RemainingUses; + } + + [Serializable] + public class ModifyUserVirtualCurrencyResult : PlayFabResultCommon + { + /// + /// Balance of the virtual currency after modification. + /// + public int Balance; + /// + /// Amount added or subtracted from the user's virtual currency. Maximum VC balance is Int32 (2,147,483,647). Any increase + /// over this value will be discarded. + /// + public int BalanceChange; + /// + /// User currency was subtracted from. + /// + public string PlayFabId; + /// + /// Name of the virtual currency which was modified. + /// + public string VirtualCurrency; + } + + /// + /// Transfers an item from a character to another character that is owned by the same user. This will remove the item from + /// the character's inventory (until and unless it is moved back), and will enable the other character to make use of the + /// item instead. + /// + [Serializable] + public class MoveItemToCharacterFromCharacterRequest : PlayFabRequestCommon + { + /// + /// Unique identifier of the character that currently has the item. + /// + public string GivingCharacterId; + /// + /// Unique PlayFab assigned instance identifier of the item + /// + public string ItemInstanceId; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + /// + /// Unique identifier of the character that will be receiving the item. + /// + public string ReceivingCharacterId; + } + + [Serializable] + public class MoveItemToCharacterFromCharacterResult : PlayFabResultCommon + { + } + + /// + /// Transfers an item from a user to a character she owns. This will remove the item from the user's inventory (until and + /// unless it is moved back), and will enable the character to make use of the item instead. + /// + [Serializable] + public class MoveItemToCharacterFromUserRequest : PlayFabRequestCommon + { + /// + /// Unique PlayFab assigned ID for a specific character owned by a user + /// + public string CharacterId; + /// + /// Unique PlayFab assigned instance identifier of the item + /// + public string ItemInstanceId; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class MoveItemToCharacterFromUserResult : PlayFabResultCommon + { + } + + /// + /// Transfers an item from a character to the owning user. This will remove the item from the character's inventory (until + /// and unless it is moved back), and will enable the user to make use of the item instead. + /// + [Serializable] + public class MoveItemToUserFromCharacterRequest : PlayFabRequestCommon + { + /// + /// Unique PlayFab assigned ID for a specific character owned by a user + /// + public string CharacterId; + /// + /// Unique PlayFab assigned instance identifier of the item + /// + public string ItemInstanceId; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class MoveItemToUserFromCharacterResult : PlayFabResultCommon + { + } + + [Serializable] + public class NintendoServiceAccountPlayFabIdPair : PlayFabBaseModel + { + /// + /// Unique Nintendo Switch Service Account identifier for a user. + /// + public string NintendoServiceAccountId; + /// + /// Unique PlayFab identifier for a user, or null if no PlayFab account is linked to the Nintendo Switch Service Account + /// identifier. + /// + public string PlayFabId; + } + + [Serializable] + public class NintendoSwitchPlayFabIdPair : PlayFabBaseModel + { + /// + /// Unique Nintendo Switch Device identifier for a user. + /// + public string NintendoSwitchDeviceId; + /// + /// Unique PlayFab identifier for a user, or null if no PlayFab account is linked to the Nintendo Switch Device identifier. + /// + public string PlayFabId; + } + + [Serializable] + public class PlayerLeaderboardEntry : PlayFabBaseModel + { + /// + /// Title-specific display name of the user for this leaderboard entry. + /// + public string DisplayName; + /// + /// PlayFab unique identifier of the user for this leaderboard entry. + /// + public string PlayFabId; + /// + /// User's overall position in the leaderboard. + /// + public int Position; + /// + /// The profile of the user, if requested. + /// + public PlayerProfileModel Profile; + /// + /// Specific value of the user's statistic. + /// + public int StatValue; + } + + [Serializable] + public class PlayerLinkedAccount : PlayFabBaseModel + { + /// + /// Linked account's email + /// + public string Email; + /// + /// Authentication platform + /// + public LoginIdentityProvider? Platform; + /// + /// Platform user identifier + /// + public string PlatformUserId; + /// + /// Linked account's username + /// + public string Username; + } + + [Serializable] + public class PlayerLocation : PlayFabBaseModel + { + /// + /// City of the player's geographic location. + /// + public string City; + /// + /// The two-character continent code for this location + /// + public ContinentCode ContinentCode; + /// + /// The two-character ISO 3166-1 country code for the country associated with the location + /// + public CountryCode CountryCode; + /// + /// Latitude coordinate of the player's geographic location. + /// + public double? Latitude; + /// + /// Longitude coordinate of the player's geographic location. + /// + public double? Longitude; + } + + [Serializable] + public class PlayerProfile : PlayFabBaseModel + { + /// + /// Array of ad campaigns player has been attributed to + /// + public List AdCampaignAttributions; + /// + /// Image URL of the player's avatar. + /// + public string AvatarUrl; + /// + /// Banned until UTC Date. If permanent ban this is set for 20 years after the original ban date. + /// + public DateTime? BannedUntil; + /// + /// The prediction of the player to churn within the next seven days. + /// + public ChurnRiskLevel? ChurnPrediction; + /// + /// Array of contact email addresses associated with the player + /// + public List ContactEmailAddresses; + /// + /// Player record created + /// + public DateTime? Created; + /// + /// Player Display Name + /// + public string DisplayName; + /// + /// Last login + /// + public DateTime? LastLogin; + /// + /// Array of third party accounts linked to this player + /// + public List LinkedAccounts; + /// + /// Dictionary of player's locations by type. + /// + public Dictionary Locations; + /// + /// Player account origination + /// + public LoginIdentityProvider? Origination; + /// + /// List of player variants for experimentation + /// + public List PlayerExperimentVariants; + /// + /// PlayFab Player ID + /// + public string PlayerId; + /// + /// Array of player statistics + /// + public List PlayerStatistics; + /// + /// Publisher this player belongs to + /// + public string PublisherId; + /// + /// Array of configured push notification end points + /// + public List PushNotificationRegistrations; + /// + /// Dictionary of player's statistics using only the latest version's value + /// + public Dictionary Statistics; + /// + /// List of player's tags for segmentation. + /// + public List Tags; + /// + /// Title ID this profile applies to + /// + public string TitleId; + /// + /// A sum of player's total purchases in USD across all currencies. + /// + public uint? TotalValueToDateInUSD; + /// + /// Dictionary of player's total purchases by currency. + /// + public Dictionary ValuesToDate; + /// + /// Dictionary of player's virtual currency balances + /// + public Dictionary VirtualCurrencyBalances; + } + + [Serializable] + public class PlayerProfileModel : PlayFabBaseModel + { + /// + /// List of advertising campaigns the player has been attributed to + /// + public List AdCampaignAttributions; + /// + /// URL of the player's avatar image + /// + public string AvatarUrl; + /// + /// If the player is currently banned, the UTC Date when the ban expires + /// + public DateTime? BannedUntil; + /// + /// List of all contact email info associated with the player account + /// + public List ContactEmailAddresses; + /// + /// Player record created + /// + public DateTime? Created; + /// + /// Player display name + /// + public string DisplayName; + /// + /// List of experiment variants for the player. Note that these variants are not guaranteed to be up-to-date when returned + /// during login because the player profile is updated only after login. Instead, use the LoginResult.TreatmentAssignment + /// property during login to get the correct variants and variables. + /// + public List ExperimentVariants; + /// + /// UTC time when the player most recently logged in to the title + /// + public DateTime? LastLogin; + /// + /// List of all authentication systems linked to this player account + /// + public List LinkedAccounts; + /// + /// List of geographic locations from which the player has logged in to the title + /// + public List Locations; + /// + /// List of memberships for the player, along with whether are expired. + /// + public List Memberships; + /// + /// Player account origination + /// + public LoginIdentityProvider? Origination; + /// + /// PlayFab player account unique identifier + /// + public string PlayerId; + /// + /// Publisher this player belongs to + /// + public string PublisherId; + /// + /// List of configured end points registered for sending the player push notifications + /// + public List PushNotificationRegistrations; + /// + /// List of leaderboard statistic values for the player + /// + public List Statistics; + /// + /// List of player's tags for segmentation + /// + public List Tags; + /// + /// Title ID this player profile applies to + /// + public string TitleId; + /// + /// Sum of the player's purchases made with real-money currencies, converted to US dollars equivalent and represented as a + /// whole number of cents (1/100 USD). For example, 999 indicates nine dollars and ninety-nine cents. + /// + public uint? TotalValueToDateInUSD; + /// + /// List of the player's lifetime purchase totals, summed by real-money currency + /// + public List ValuesToDate; + } + + [Serializable] + public class PlayerProfileViewConstraints : PlayFabBaseModel + { + /// + /// Whether to show player's avatar URL. Defaults to false + /// + public bool ShowAvatarUrl; + /// + /// Whether to show the banned until time. Defaults to false + /// + public bool ShowBannedUntil; + /// + /// Whether to show campaign attributions. Defaults to false + /// + public bool ShowCampaignAttributions; + /// + /// Whether to show contact email addresses. Defaults to false + /// + public bool ShowContactEmailAddresses; + /// + /// Whether to show the created date. Defaults to false + /// + public bool ShowCreated; + /// + /// Whether to show the display name. Defaults to false + /// + public bool ShowDisplayName; + /// + /// Whether to show player's experiment variants. Defaults to false + /// + public bool ShowExperimentVariants; + /// + /// Whether to show the last login time. Defaults to false + /// + public bool ShowLastLogin; + /// + /// Whether to show the linked accounts. Defaults to false + /// + public bool ShowLinkedAccounts; + /// + /// Whether to show player's locations. Defaults to false + /// + public bool ShowLocations; + /// + /// Whether to show player's membership information. Defaults to false + /// + public bool ShowMemberships; + /// + /// Whether to show origination. Defaults to false + /// + public bool ShowOrigination; + /// + /// Whether to show push notification registrations. Defaults to false + /// + public bool ShowPushNotificationRegistrations; + /// + /// Reserved for future development + /// + public bool ShowStatistics; + /// + /// Whether to show tags. Defaults to false + /// + public bool ShowTags; + /// + /// Whether to show the total value to date in usd. Defaults to false + /// + public bool ShowTotalValueToDateInUsd; + /// + /// Whether to show the values to date. Defaults to false + /// + public bool ShowValuesToDate; + } + + [Serializable] + public class PlayerStatistic : PlayFabBaseModel + { + /// + /// Statistic ID + /// + public string Id; + /// + /// Statistic name + /// + public string Name; + /// + /// Current statistic value + /// + public int StatisticValue; + /// + /// Statistic version (0 if not a versioned statistic) + /// + public int StatisticVersion; + } + + [Serializable] + public class PlayerStatisticVersion : PlayFabBaseModel + { + /// + /// time when the statistic version became active + /// + public DateTime ActivationTime; + /// + /// time when the statistic version became inactive due to statistic version incrementing + /// + public DateTime? DeactivationTime; + /// + /// time at which the statistic version was scheduled to become active, based on the configured ResetInterval + /// + public DateTime? ScheduledActivationTime; + /// + /// time at which the statistic version was scheduled to become inactive, based on the configured ResetInterval + /// + public DateTime? ScheduledDeactivationTime; + /// + /// name of the statistic when the version became active + /// + public string StatisticName; + /// + /// version of the statistic + /// + public uint Version; + } + + [Serializable] + public class PSNAccountPlayFabIdPair : PlayFabBaseModel + { + /// + /// Unique PlayFab identifier for a user, or null if no PlayFab account is linked to the PlayStation :tm: Network + /// identifier. + /// + public string PlayFabId; + /// + /// Unique PlayStation :tm: Network identifier for a user. + /// + public string PSNAccountId; + } + + [Serializable] + public class PSNOnlinePlayFabIdPair : PlayFabBaseModel + { + /// + /// Unique PlayFab identifier for a user, or null if no PlayFab account is linked to the PlayStation :tm: Network + /// identifier. + /// + public string PlayFabId; + /// + /// Unique PlayStation :tm: Network identifier for a user. + /// + public string PSNOnlineId; + } + + [Serializable] + public class PushNotificationPackage : PlayFabBaseModel + { + /// + /// Numerical badge to display on App icon (iOS only) + /// + public int Badge; + /// + /// This must be a JSON formatted object. For use with developer-created custom Push Notification plugins + /// + public string CustomData; + /// + /// Icon file to display with the message (Not supported for iOS) + /// + public string Icon; + /// + /// Content of the message (all platforms) + /// + public string Message; + /// + /// Sound file to play with the message (all platforms) + /// + public string Sound; + /// + /// Title/Subject of the message. Not supported for iOS + /// + public string Title; + } + + public enum PushNotificationPlatform + { + ApplePushNotificationService, + GoogleCloudMessaging + } + + [Serializable] + public class PushNotificationRegistration : PlayFabBaseModel + { + /// + /// Notification configured endpoint + /// + public string NotificationEndpointARN; + /// + /// Push notification platform + /// + public PushNotificationPlatform? Platform; + } + + [Serializable] + public class PushNotificationRegistrationModel : PlayFabBaseModel + { + /// + /// Notification configured endpoint + /// + public string NotificationEndpointARN; + /// + /// Push notification platform + /// + public PushNotificationPlatform? Platform; + } + + [Serializable] + public class RandomResultTableListing : PlayFabBaseModel + { + /// + /// Catalog version this table is associated with + /// + public string CatalogVersion; + /// + /// Child nodes that indicate what kind of drop table item this actually is. + /// + public List Nodes; + /// + /// Unique name for this drop table + /// + public string TableId; + } + + /// + /// Coupon codes can be created for any item, or set of items, in the catalog for the title. This operation causes the + /// coupon to be consumed, and the specific items to be awarded to the user. Attempting to re-use an already consumed code, + /// or a code which has not yet been created in the service, will result in an error. + /// + [Serializable] + public class RedeemCouponRequest : PlayFabRequestCommon + { + /// + /// Catalog version of the coupon. + /// + public string CatalogVersion; + /// + /// Optional identifier for the Character that should receive the item. If null, item is added to the player + /// + public string CharacterId; + /// + /// Generated coupon code to redeem. + /// + public string CouponCode; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class RedeemCouponResult : PlayFabResultCommon + { + /// + /// Items granted to the player as a result of redeeming the coupon. + /// + public List GrantedItems; + } + + [Serializable] + public class RemoveFriendRequest : PlayFabRequestCommon + { + /// + /// PlayFab identifier of the friend account which is to be removed. + /// + public string FriendPlayFabId; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class RemoveGenericIDRequest : PlayFabRequestCommon + { + /// + /// Generic service identifier to be removed from the player. + /// + public GenericServiceId GenericId; + /// + /// PlayFabId of the user to remove. + /// + public string PlayFabId; + } + + /// + /// This API will trigger a player_tag_removed event and remove a tag with the given TagName and PlayFabID from the + /// corresponding player profile. TagName can be used for segmentation and it is limited to 256 characters + /// + [Serializable] + public class RemovePlayerTagRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + /// + /// Unique tag for player profile. + /// + public string TagName; + } + + [Serializable] + public class RemovePlayerTagResult : PlayFabResultCommon + { + } + + [Serializable] + public class RemoveSharedGroupMembersRequest : PlayFabRequestCommon + { + /// + /// An array of unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public List PlayFabIds; + /// + /// Unique identifier for the shared group. + /// + public string SharedGroupId; + } + + [Serializable] + public class RemoveSharedGroupMembersResult : PlayFabResultCommon + { + } + + [Serializable] + public class ReportPlayerServerRequest : PlayFabRequestCommon + { + /// + /// Optional additional comment by reporting player. + /// + public string Comment; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Unique PlayFab identifier of the reported player. + /// + public string ReporteeId; + /// + /// PlayFabId of the reporting player. + /// + public string ReporterId; + } + + /// + /// Players are currently limited to five reports per day. Attempts by a single user account to submit reports beyond five + /// will result in Updated being returned as false. + /// + [Serializable] + public class ReportPlayerServerResult : PlayFabResultCommon + { + /// + /// The number of remaining reports which may be filed today by this reporting player. + /// + public int SubmissionsRemaining; + } + + [Serializable] + public class ResultTableNode : PlayFabBaseModel + { + /// + /// Either an ItemId, or the TableId of another random result table + /// + public string ResultItem; + /// + /// Whether this entry in the table is an item or a link to another table + /// + public ResultTableNodeType ResultItemType; + /// + /// How likely this is to be rolled - larger numbers add more weight + /// + public int Weight; + } + + public enum ResultTableNodeType + { + ItemId, + TableId + } + + /// + /// Setting the active state of all non-expired bans for a user to Inactive. Expired bans with an Active state will be + /// ignored, however. Returns information about applied updates only. + /// + [Serializable] + public class RevokeAllBansForUserRequest : PlayFabRequestCommon + { + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class RevokeAllBansForUserResult : PlayFabResultCommon + { + /// + /// Information on the bans that were revoked. + /// + public List BanData; + } + + /// + /// Setting the active state of all bans requested to Inactive regardless of whether that ban has already expired. BanIds + /// that do not exist will be skipped. Returns information about applied updates only. + /// + [Serializable] + public class RevokeBansRequest : PlayFabRequestCommon + { + /// + /// Ids of the bans to be revoked. Maximum 100. + /// + public List BanIds; + } + + [Serializable] + public class RevokeBansResult : PlayFabResultCommon + { + /// + /// Information on the bans that were revoked + /// + public List BanData; + } + + [Serializable] + public class RevokeInventoryItem : PlayFabBaseModel + { + /// + /// Unique PlayFab assigned ID for a specific character owned by a user + /// + public string CharacterId; + /// + /// Unique PlayFab assigned instance identifier of the item + /// + public string ItemInstanceId; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + /// + /// In cases where the inventory item in question is a "crate", and the items it contained have already been dispensed, this + /// will not revoke access or otherwise remove the items which were dispensed. + /// + [Serializable] + public class RevokeInventoryItemRequest : PlayFabRequestCommon + { + /// + /// Unique PlayFab assigned ID for a specific character owned by a user + /// + public string CharacterId; + /// + /// Unique PlayFab assigned instance identifier of the item + /// + public string ItemInstanceId; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + /// + /// In cases where the inventory item in question is a "crate", and the items it contained have already been dispensed, this + /// will not revoke access or otherwise remove the items which were dispensed. + /// + [Serializable] + public class RevokeInventoryItemsRequest : PlayFabRequestCommon + { + /// + /// Array of player items to revoke, between 1 and 25 items. + /// + public List Items; + } + + [Serializable] + public class RevokeInventoryItemsResult : PlayFabResultCommon + { + /// + /// Collection of any errors that occurred during processing. + /// + public List Errors; + } + + [Serializable] + public class RevokeInventoryResult : PlayFabResultCommon + { + } + + [Serializable] + public class RevokeItemError : PlayFabBaseModel + { + /// + /// Specific error that was encountered. + /// + public GenericErrorCodes? Error; + /// + /// Item information that failed to be revoked. + /// + public RevokeInventoryItem Item; + } + + /// + /// Represents the save push notification template request. + /// + [Serializable] + public class SavePushNotificationTemplateRequest : PlayFabRequestCommon + { + /// + /// Android JSON for the notification template. + /// + public string AndroidPayload; + /// + /// Id of the push notification template. + /// + public string Id; + /// + /// IOS JSON for the notification template. + /// + public string IOSPayload; + /// + /// Dictionary of localized push notification templates with the language as the key. + /// + public Dictionary LocalizedPushNotificationTemplates; + /// + /// Name of the push notification template. + /// + public string Name; + } + + /// + /// Represents the save push notification template result. + /// + [Serializable] + public class SavePushNotificationTemplateResult : PlayFabResultCommon + { + /// + /// Id of the push notification template that was saved. + /// + public string PushNotificationTemplateId; + } + + [Serializable] + public class ScriptExecutionError : PlayFabBaseModel + { + /// + /// Error code, such as CloudScriptNotFound, JavascriptException, CloudScriptFunctionArgumentSizeExceeded, + /// CloudScriptAPIRequestCountExceeded, CloudScriptAPIRequestError, or CloudScriptHTTPRequestError + /// + public string Error; + /// + /// Details about the error + /// + public string Message; + /// + /// Point during the execution of the script at which the error occurred, if any + /// + public string StackTrace; + } + + /// + /// PlayFab accounts which have valid email address or username will be able to receive a password reset email using this + /// API.The email sent must be an account recovery email template. The username or email can be passed in to send the email + /// + [Serializable] + public class SendCustomAccountRecoveryEmailRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// User email address attached to their account + /// + public string Email; + /// + /// The email template id of the account recovery email template to send. + /// + public string EmailTemplateId; + /// + /// The user's username requesting an account recovery. + /// + public string Username; + } + + [Serializable] + public class SendCustomAccountRecoveryEmailResult : PlayFabResultCommon + { + } + + /// + /// Sends an email for only players that have contact emails associated with them. Takes in an email template ID + /// specifyingthe email template to send. + /// + [Serializable] + public class SendEmailFromTemplateRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The email template id of the email template to send. + /// + public string EmailTemplateId; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class SendEmailFromTemplateResult : PlayFabResultCommon + { + } + + /// + /// Represents the request for sending a push notification template to a recipient. + /// + [Serializable] + public class SendPushNotificationFromTemplateRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Id of the push notification template. + /// + public string PushNotificationTemplateId; + /// + /// PlayFabId of the push notification recipient. + /// + public string Recipient; + } + + [Serializable] + public class SendPushNotificationRequest : PlayFabRequestCommon + { + /// + /// Allows you to provide precisely formatted json to target devices. This is an advanced feature, allowing you to deliver + /// to custom plugin logic, fields, or functionality not natively supported by PlayFab. + /// + public List AdvancedPlatformDelivery; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Text of message to send. + /// + public string Message; + /// + /// Defines all possible push attributes like message, title, icon, etc. Some parameters are device specific - please see + /// the PushNotificationPackage documentation for details. + /// + public PushNotificationPackage Package; + /// + /// PlayFabId of the recipient of the push notification. + /// + public string Recipient; + /// + /// Subject of message to send (may not be displayed in all platforms) + /// + public string Subject; + /// + /// Target Platforms that should receive the Message or Package. If omitted, we will send to all available platforms. + /// + public List TargetPlatforms; + } + + [Serializable] + public class SendPushNotificationResult : PlayFabResultCommon + { + } + + [Serializable] + public class ServerCustomIDPlayFabIDPair : PlayFabBaseModel + { + /// + /// Unique PlayFab identifier. + /// + public string PlayFabId; + /// + /// Unique server custom identifier for this player. + /// + public string ServerCustomId; + } + + [Serializable] + public class ServerLoginResult : PlayFabResultCommon + { + /// + /// If LoginTitlePlayerAccountEntity flag is set on the login request the title_player_account will also be logged in and + /// returned. + /// + public EntityTokenResponse EntityToken; + /// + /// Results for requested info. + /// + public GetPlayerCombinedInfoResultPayload InfoResultPayload; + /// + /// The time of this user's previous login. If there was no previous login, then it's DateTime.MinValue + /// + public DateTime? LastLoginTime; + /// + /// True if the account was newly created on this login. + /// + public bool NewlyCreated; + /// + /// Player's unique PlayFabId. + /// + public string PlayFabId; + /// + /// Unique token authorizing the user and game at the server level, for the current session. + /// + public string SessionTicket; + /// + /// Settings specific to this user. + /// + public UserSettings SettingsForUser; + /// + /// The experimentation treatments for this user at the time of login. + /// + public TreatmentAssignment TreatmentAssignment; + } + + /// + /// This operation is not additive. It will completely replace the tag list for the specified user. Please note that only + /// users in the PlayFab friends list can be assigned tags. Attempting to set a tag on a friend only included in the friends + /// list from a social site integration (such as Facebook or Steam) will return the AccountNotFound error. + /// + [Serializable] + public class SetFriendTagsRequest : PlayFabRequestCommon + { + /// + /// PlayFab identifier of the friend account to which the tag(s) should be applied. + /// + public string FriendPlayFabId; + /// + /// PlayFab identifier of the player whose friend is to be updated. + /// + public string PlayFabId; + /// + /// Array of tags to set on the friend account. + /// + public List Tags; + } + + /// + /// APIs that require signatures require that the player have a configured Player Secret Key that is used to sign all + /// requests. Players that don't have a secret will be blocked from making API calls until it is configured. To create a + /// signature header add a SHA256 hashed string containing UTF8 encoded JSON body as it will be sent to the server, the + /// current time in UTC formatted to ISO 8601, and the players secret formatted as 'body.date.secret'. Place the resulting + /// hash into the header X-PlayFab-Signature, along with a header X-PlayFab-Timestamp of the same UTC timestamp used in the + /// signature. + /// + [Serializable] + public class SetPlayerSecretRequest : PlayFabRequestCommon + { + /// + /// Player secret that is used to verify API request signatures (Enterprise Only). + /// + public string PlayerSecret; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class SetPlayerSecretResult : PlayFabResultCommon + { + } + + /// + /// This API is designed to store publisher-specific values which can be read, but not written to, by the client. This data + /// is shared across all titles assigned to a particular publisher, and can be used for cross-game coordination. Only titles + /// assigned to a publisher can use this API. This operation is additive. If a Key does not exist in the current dataset, it + /// will be added with the specified Value. If it already exists, the Value for that key will be overwritten with the new + /// Value. For more information email helloplayfab@microsoft.com + /// + [Serializable] + public class SetPublisherDataRequest : PlayFabRequestCommon + { + /// + /// key we want to set a value on (note, this is additive - will only replace an existing key's value if they are the same + /// name.) Keys are trimmed of whitespace. Keys may not begin with the '!' character. + /// + public string Key; + /// + /// new value to set. Set to null to remove a value + /// + public string Value; + } + + [Serializable] + public class SetPublisherDataResult : PlayFabResultCommon + { + } + + /// + /// This API is designed to store title specific values which can be read, but not written to, by the client. For example, a + /// developer could choose to store values which modify the user experience, such as enemy spawn rates, weapon strengths, + /// movement speeds, etc. This allows a developer to update the title without the need to create, test, and ship a new + /// build. This operation is additive. If a Key does not exist in the current dataset, it will be added with the specified + /// Value. If it already exists, the Value for that key will be overwritten with the new Value. + /// + [Serializable] + public class SetTitleDataRequest : PlayFabRequestCommon + { + /// + /// key we want to set a value on (note, this is additive - will only replace an existing key's value if they are the same + /// name.) Keys are trimmed of whitespace. Keys may not begin with the '!' character. + /// + public string Key; + /// + /// new value to set. Set to null to remove a value + /// + public string Value; + } + + [Serializable] + public class SetTitleDataResult : PlayFabResultCommon + { + } + + [Serializable] + public class SharedGroupDataRecord : PlayFabBaseModel + { + /// + /// Timestamp for when this data was last updated. + /// + public DateTime LastUpdated; + /// + /// PlayFabId of the user to last update this value. + /// + public string LastUpdatedBy; + /// + /// Indicates whether this data can be read by all users (public) or only members of the group (private). + /// + public UserDataPermission? Permission; + /// + /// Data stored for the specified group data key. + /// + public string Value; + } + + public enum SourceType + { + Admin, + BackEnd, + GameClient, + GameServer, + Partner, + Custom, + API + } + + [Serializable] + public class StatisticModel : PlayFabBaseModel + { + /// + /// Statistic name + /// + public string Name; + /// + /// Statistic value + /// + public int Value; + /// + /// Statistic version (0 if not a versioned statistic) + /// + public int Version; + } + + [Serializable] + public class StatisticNameVersion : PlayFabBaseModel + { + /// + /// unique name of the statistic + /// + public string StatisticName; + /// + /// the version of the statistic to be returned + /// + public uint Version; + } + + [Serializable] + public class StatisticUpdate : PlayFabBaseModel + { + /// + /// unique name of the statistic + /// + public string StatisticName; + /// + /// statistic value for the player + /// + public int Value; + /// + /// for updates to an existing statistic value for a player, the version of the statistic when it was loaded. Null when + /// setting the statistic value for the first time. + /// + public uint? Version; + } + + [Serializable] + public class StatisticValue : PlayFabBaseModel + { + /// + /// unique name of the statistic + /// + public string StatisticName; + /// + /// statistic value for the player + /// + public int Value; + /// + /// for updates to an existing statistic value for a player, the version of the statistic when it was loaded + /// + public uint Version; + } + + [Serializable] + public class SteamPlayFabIdPair : PlayFabBaseModel + { + /// + /// Unique PlayFab identifier for a user, or null if no PlayFab account is linked to the Steam identifier. + /// + public string PlayFabId; + /// + /// Unique Steam identifier for a user. + /// + public string SteamStringId; + } + + /// + /// A store entry that list a catalog item at a particular price + /// + [Serializable] + public class StoreItem : PlayFabBaseModel + { + /// + /// Store specific custom data. The data only exists as part of this store; it is not transferred to item instances + /// + public object CustomData; + /// + /// Intended display position for this item. Note that 0 is the first position + /// + public uint? DisplayPosition; + /// + /// Unique identifier of the item as it exists in the catalog - note that this must exactly match the ItemId from the + /// catalog + /// + public string ItemId; + /// + /// Override prices for this item for specific currencies + /// + public Dictionary RealCurrencyPrices; + /// + /// Override prices for this item in virtual currencies and "RM" (the base Real Money purchase price, in USD pennies) + /// + public Dictionary VirtualCurrencyPrices; + } + + /// + /// Marketing data about a specific store + /// + [Serializable] + public class StoreMarketingModel : PlayFabBaseModel + { + /// + /// Tagline for a store. + /// + public string Description; + /// + /// Display name of a store as it will appear to users. + /// + public string DisplayName; + /// + /// Custom data about a store. + /// + public object Metadata; + } + + [Serializable] + public class SubscriptionModel : PlayFabBaseModel + { + /// + /// When this subscription expires. + /// + public DateTime Expiration; + /// + /// The time the subscription was orignially purchased + /// + public DateTime InitialSubscriptionTime; + /// + /// Whether this subscription is currently active. That is, if Expiration > now. + /// + public bool IsActive; + /// + /// The status of this subscription, according to the subscription provider. + /// + public SubscriptionProviderStatus? Status; + /// + /// The id for this subscription + /// + public string SubscriptionId; + /// + /// The item id for this subscription from the primary catalog + /// + public string SubscriptionItemId; + /// + /// The provider for this subscription. Apple or Google Play are supported today. + /// + public string SubscriptionProvider; + } + + public enum SubscriptionProviderStatus + { + NoError, + Cancelled, + UnknownError, + BillingError, + ProductUnavailable, + CustomerDidNotAcceptPriceChange, + FreeTrial, + PaymentPending + } + + [Serializable] + public class SubtractCharacterVirtualCurrencyRequest : PlayFabRequestCommon + { + /// + /// Amount to be subtracted from the user balance of the specified virtual currency. + /// + public int Amount; + /// + /// Unique PlayFab assigned ID for a specific character owned by a user + /// + public string CharacterId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + /// + /// Name of the virtual currency which is to be decremented. + /// + public string VirtualCurrency; + } + + [Serializable] + public class SubtractUserVirtualCurrencyRequest : PlayFabRequestCommon + { + /// + /// Amount to be subtracted from the user balance of the specified virtual currency. + /// + public int Amount; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// PlayFab unique identifier of the user whose virtual currency balance is to be decreased. + /// + public string PlayFabId; + /// + /// Name of the virtual currency which is to be decremented. + /// + public string VirtualCurrency; + } + + [Serializable] + public class TagModel : PlayFabBaseModel + { + /// + /// Full value of the tag, including namespace + /// + public string TagValue; + } + + public enum TitleActivationStatus + { + None, + ActivatedTitleKey, + PendingSteam, + ActivatedSteam, + RevokedSteam + } + + [Serializable] + public class TitleNewsItem : PlayFabBaseModel + { + /// + /// News item body. + /// + public string Body; + /// + /// Unique identifier of news item. + /// + public string NewsId; + /// + /// Date and time when the news item was posted. + /// + public DateTime Timestamp; + /// + /// Title of the news item. + /// + public string Title; + } + + [Serializable] + public class TreatmentAssignment : PlayFabBaseModel + { + /// + /// List of the experiment variables. + /// + public List Variables; + /// + /// List of the experiment variants. + /// + public List Variants; + } + + [Serializable] + public class TwitchPlayFabIdPair : PlayFabBaseModel + { + /// + /// Unique PlayFab identifier for a user, or null if no PlayFab account is linked to the Twitch identifier. + /// + public string PlayFabId; + /// + /// Unique Twitch identifier for a user. + /// + public string TwitchId; + } + + [Serializable] + public class UnlinkNintendoServiceAccountRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class UnlinkNintendoSwitchDeviceIdRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Nintendo Switch Device identifier for the user. If not specified, the most recently signed in device ID will be used. + /// + public string NintendoSwitchDeviceId; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class UnlinkNintendoSwitchDeviceIdResult : PlayFabResultCommon + { + } + + [Serializable] + public class UnlinkPSNAccountRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class UnlinkPSNAccountResult : PlayFabResultCommon + { + } + + [Serializable] + public class UnlinkServerCustomIdRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Unique PlayFab identifier. + /// + public string PlayFabId; + /// + /// Unique server custom identifier for this player. + /// + public string ServerCustomId; + } + + [Serializable] + public class UnlinkServerCustomIdResult : PlayFabResultCommon + { + } + + [Serializable] + public class UnlinkSteamIdRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Unique PlayFab identifier for a user, or null if no PlayFab account is linked to the Steam account. + /// + public string PlayFabId; + } + + [Serializable] + public class UnlinkSteamIdResult : PlayFabResultCommon + { + } + + [Serializable] + public class UnlinkXboxAccountRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Unique PlayFab identifier for a user, or null if no PlayFab account is linked to the Xbox Live identifier. + /// + public string PlayFabId; + } + + [Serializable] + public class UnlinkXboxAccountResult : PlayFabResultCommon + { + } + + /// + /// Specify the container and optionally the catalogVersion for the container to open + /// + [Serializable] + public class UnlockContainerInstanceRequest : PlayFabRequestCommon + { + /// + /// Specifies the catalog version that should be used to determine container contents. If unspecified, uses catalog + /// associated with the item instance. + /// + public string CatalogVersion; + /// + /// Unique PlayFab assigned ID for a specific character owned by a user + /// + public string CharacterId; + /// + /// ItemInstanceId of the container to unlock. + /// + public string ContainerItemInstanceId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// ItemInstanceId of the key that will be consumed by unlocking this container. If the container requires a key, this + /// parameter is required. + /// + public string KeyItemInstanceId; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + /// + /// Specify the type of container to open and optionally the catalogVersion for the container to open + /// + [Serializable] + public class UnlockContainerItemRequest : PlayFabRequestCommon + { + /// + /// Specifies the catalog version that should be used to determine container contents. If unspecified, uses default/primary + /// catalog. + /// + public string CatalogVersion; + /// + /// Unique PlayFab assigned ID for a specific character owned by a user + /// + public string CharacterId; + /// + /// Catalog ItemId of the container type to unlock. + /// + public string ContainerItemId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + /// + /// The items and vc found within the container. These will be added and stacked in your inventory as appropriate. + /// + [Serializable] + public class UnlockContainerItemResult : PlayFabResultCommon + { + /// + /// Items granted to the player as a result of unlocking the container. + /// + public List GrantedItems; + /// + /// Unique instance identifier of the container unlocked. + /// + public string UnlockedItemInstanceId; + /// + /// Unique instance identifier of the key used to unlock the container, if applicable. + /// + public string UnlockedWithItemInstanceId; + /// + /// Virtual currency granted to the player as a result of unlocking the container. + /// + public Dictionary VirtualCurrency; + } + + [Serializable] + public class UpdateAvatarUrlRequest : PlayFabRequestCommon + { + /// + /// URL of the avatar image. If empty, it removes the existing avatar URL. + /// + public string ImageUrl; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + /// + /// Represents a single update ban request. + /// + [Serializable] + public class UpdateBanRequest : PlayFabBaseModel + { + /// + /// The updated active state for the ban. Null for no change. + /// + public bool? Active; + /// + /// The id of the ban to be updated. + /// + public string BanId; + /// + /// The updated expiration date for the ban. Null for no change. + /// + public DateTime? Expires; + /// + /// The updated IP address for the ban. Null for no change. + /// + public string IPAddress; + /// + /// Whether to make this ban permanent. Set to true to make this ban permanent. This will not modify Active state. + /// + public bool? Permanent; + /// + /// The updated reason for the ban to be updated. Maximum 140 characters. Null for no change. + /// + public string Reason; + /// + /// The updated family type of the user that should be included in the ban. Null for no change. + /// + public UserFamilyType? UserFamilyType; + } + + /// + /// For each ban, only updates the values that are set. Leave any value to null for no change. If a ban could not be found, + /// the rest are still applied. Returns information about applied updates only. + /// + [Serializable] + public class UpdateBansRequest : PlayFabRequestCommon + { + /// + /// List of bans to be updated. Maximum 100. + /// + public List Bans; + } + + [Serializable] + public class UpdateBansResult : PlayFabResultCommon + { + /// + /// Information on the bans that were updated + /// + public List BanData; + } + + /// + /// This function performs an additive update of the arbitrary JSON object containing the custom data for the user. In + /// updating the custom data object, keys which already exist in the object will have their values overwritten, while keys + /// with null values will be removed. No other key-value pairs will be changed apart from those specified in the call. + /// + [Serializable] + public class UpdateCharacterDataRequest : PlayFabRequestCommon + { + /// + /// Unique PlayFab assigned ID for a specific character owned by a user + /// + public string CharacterId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Key-value pairs to be written to the custom data. Note that keys are trimmed of whitespace, are limited in size, and may + /// not begin with a '!' character or be null. + /// + public Dictionary Data; + /// + /// Optional list of Data-keys to remove from UserData. Some SDKs cannot insert null-values into Data due to language + /// constraints. Use this to delete the keys directly. + /// + public List KeysToRemove; + /// + /// Permission to be applied to all user data keys written in this request. Defaults to "private" if not set. + /// + public UserDataPermission? Permission; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class UpdateCharacterDataResult : PlayFabResultCommon + { + /// + /// Indicates the current version of the data that has been set. This is incremented with every set call for that type of + /// data (read-only, internal, etc). This version can be provided in Get calls to find updated data. + /// + public uint DataVersion; + } + + /// + /// Character statistics are similar to user statistics in that they are numeric values which may only be updated by a + /// server operation, in order to minimize the opportunity for unauthorized changes. In addition to being available for use + /// by the title, the statistics are used for all leaderboard operations in PlayFab. + /// + [Serializable] + public class UpdateCharacterStatisticsRequest : PlayFabRequestCommon + { + /// + /// Unique PlayFab assigned ID for a specific character owned by a user + /// + public string CharacterId; + /// + /// Statistics to be updated with the provided values. + /// + public Dictionary CharacterStatistics; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class UpdateCharacterStatisticsResult : PlayFabResultCommon + { + } + + /// + /// This operation is additive. Statistics not currently defined will be added, while those already defined will be updated + /// with the given values. All other user statistics will remain unchanged. + /// + [Serializable] + public class UpdatePlayerStatisticsRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Indicates whether the statistics provided should be set, regardless of the aggregation method set on the statistic. + /// Default is false. + /// + public bool? ForceUpdate; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + /// + /// Statistics to be updated with the provided values + /// + public List Statistics; + } + + [Serializable] + public class UpdatePlayerStatisticsResult : PlayFabResultCommon + { + } + + /// + /// Note that in the case of multiple calls to write to the same shared group data keys, the last write received by the + /// PlayFab service will determine the value available to subsequent read operations. For scenarios requiring coordination + /// of data updates, it is recommended that titles make use of user data with read permission set to public, or a + /// combination of user data and shared group data. + /// + [Serializable] + public class UpdateSharedGroupDataRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Key-value pairs to be written to the custom data. Note that keys are trimmed of whitespace, are limited in size, and may + /// not begin with a '!' character or be null. + /// + public Dictionary Data; + /// + /// Optional list of Data-keys to remove from UserData. Some SDKs cannot insert null-values into Data due to language + /// constraints. Use this to delete the keys directly. + /// + public List KeysToRemove; + /// + /// Permission to be applied to all user data keys in this request. + /// + public UserDataPermission? Permission; + /// + /// Unique identifier for the shared group. + /// + public string SharedGroupId; + } + + [Serializable] + public class UpdateSharedGroupDataResult : PlayFabResultCommon + { + } + + /// + /// This function performs an additive update of the arbitrary JSON object containing the custom data for the user. In + /// updating the custom data object, keys which already exist in the object will have their values overwritten, while keys + /// with null values will be removed. No other key-value pairs will be changed apart from those specified in the call. + /// + [Serializable] + public class UpdateUserDataRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Key-value pairs to be written to the custom data. Note that keys are trimmed of whitespace, are limited in size, and may + /// not begin with a '!' character or be null. + /// + public Dictionary Data; + /// + /// Optional list of Data-keys to remove from UserData. Some SDKs cannot insert null-values into Data due to language + /// constraints. Use this to delete the keys directly. + /// + public List KeysToRemove; + /// + /// Permission to be applied to all user data keys written in this request. Defaults to "private" if not set. + /// + public UserDataPermission? Permission; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class UpdateUserDataResult : PlayFabResultCommon + { + /// + /// Indicates the current version of the data that has been set. This is incremented with every set call for that type of + /// data (read-only, internal, etc). This version can be provided in Get calls to find updated data. + /// + public uint DataVersion; + } + + /// + /// This function performs an additive update of the arbitrary JSON object containing the custom data for the user. In + /// updating the custom data object, keys which already exist in the object will have their values overwritten, keys with + /// null values will be removed. No other key-value pairs will be changed apart from those specified in the call. + /// + [Serializable] + public class UpdateUserInternalDataRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Key-value pairs to be written to the custom data. Note that keys are trimmed of whitespace, are limited in size, and may + /// not begin with a '!' character or be null. + /// + public Dictionary Data; + /// + /// Optional list of Data-keys to remove from UserData. Some SDKs cannot insert null-values into Data due to language + /// constraints. Use this to delete the keys directly. + /// + public List KeysToRemove; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + /// + /// This function performs an additive update of the arbitrary JSON object containing the custom data for the item instance + /// which belongs to the specified user. In updating the custom data object, keys which already exist in the object will + /// have their values overwritten, while keys with null values will be removed. No other key-value pairs will be changed + /// apart from those specified in the call. + /// + [Serializable] + public class UpdateUserInventoryItemDataRequest : PlayFabRequestCommon + { + /// + /// Unique PlayFab assigned ID for a specific character owned by a user + /// + public string CharacterId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Key-value pairs to be written to the custom data. Note that keys are trimmed of whitespace, are limited in size, and may + /// not begin with a '!' character or be null. + /// + public Dictionary Data; + /// + /// Unique PlayFab assigned instance identifier of the item + /// + public string ItemInstanceId; + /// + /// Optional list of Data-keys to remove from UserData. Some SDKs cannot insert null-values into Data due to language + /// constraints. Use this to delete the keys directly. + /// + public List KeysToRemove; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class UserAccountInfo : PlayFabBaseModel + { + /// + /// User Android device information, if an Android device has been linked + /// + public UserAndroidDeviceInfo AndroidDeviceInfo; + /// + /// Sign in with Apple account information, if an Apple account has been linked + /// + public UserAppleIdInfo AppleAccountInfo; + /// + /// Timestamp indicating when the user account was created + /// + public DateTime Created; + /// + /// Custom ID information, if a custom ID has been assigned + /// + public UserCustomIdInfo CustomIdInfo; + /// + /// User Facebook information, if a Facebook account has been linked + /// + public UserFacebookInfo FacebookInfo; + /// + /// Facebook Instant Games account information, if a Facebook Instant Games account has been linked + /// + public UserFacebookInstantGamesIdInfo FacebookInstantGamesIdInfo; + /// + /// User Gamecenter information, if a Gamecenter account has been linked + /// + public UserGameCenterInfo GameCenterInfo; + /// + /// User Google account information, if a Google account has been linked + /// + public UserGoogleInfo GoogleInfo; + /// + /// User Google Play Games account information, if a Google Play Games account has been linked + /// + public UserGooglePlayGamesInfo GooglePlayGamesInfo; + /// + /// User iOS device information, if an iOS device has been linked + /// + public UserIosDeviceInfo IosDeviceInfo; + /// + /// User Kongregate account information, if a Kongregate account has been linked + /// + public UserKongregateInfo KongregateInfo; + /// + /// Nintendo Switch account information, if a Nintendo Switch account has been linked + /// + public UserNintendoSwitchAccountIdInfo NintendoSwitchAccountInfo; + /// + /// Nintendo Switch device information, if a Nintendo Switch device has been linked + /// + public UserNintendoSwitchDeviceIdInfo NintendoSwitchDeviceIdInfo; + /// + /// OpenID Connect information, if any OpenID Connect accounts have been linked + /// + public List OpenIdInfo; + /// + /// Unique identifier for the user account + /// + public string PlayFabId; + /// + /// Personal information for the user which is considered more sensitive + /// + public UserPrivateAccountInfo PrivateInfo; + /// + /// User PlayStation :tm: Network account information, if a PlayStation :tm: Network account has been linked + /// + public UserPsnInfo PsnInfo; + /// + /// Server Custom ID information, if a server custom ID has been assigned + /// + public UserServerCustomIdInfo ServerCustomIdInfo; + /// + /// User Steam information, if a Steam account has been linked + /// + public UserSteamInfo SteamInfo; + /// + /// Title-specific information for the user account + /// + public UserTitleInfo TitleInfo; + /// + /// User Twitch account information, if a Twitch account has been linked + /// + public UserTwitchInfo TwitchInfo; + /// + /// User account name in the PlayFab service + /// + public string Username; + /// + /// User XBox account information, if a XBox account has been linked + /// + public UserXboxInfo XboxInfo; + } + + [Serializable] + public class UserAndroidDeviceInfo : PlayFabBaseModel + { + /// + /// Android device ID + /// + public string AndroidDeviceId; + } + + [Serializable] + public class UserAppleIdInfo : PlayFabBaseModel + { + /// + /// Apple subject ID + /// + public string AppleSubjectId; + } + + [Serializable] + public class UserCustomIdInfo : PlayFabBaseModel + { + /// + /// Custom ID + /// + public string CustomId; + } + + /// + /// Indicates whether a given data key is private (readable only by the player) or public (readable by all players). When a + /// player makes a GetUserData request about another player, only keys marked Public will be returned. + /// + public enum UserDataPermission + { + Private, + Public + } + + [Serializable] + public class UserDataRecord : PlayFabBaseModel + { + /// + /// Timestamp for when this data was last updated. + /// + public DateTime LastUpdated; + /// + /// Indicates whether this data can be read by all users (public) or only the user (private). This is used for GetUserData + /// requests being made by one player about another player. + /// + public UserDataPermission? Permission; + /// + /// Data stored for the specified user data key. + /// + public string Value; + } + + [Serializable] + public class UserFacebookInfo : PlayFabBaseModel + { + /// + /// Facebook identifier + /// + public string FacebookId; + /// + /// Facebook full name + /// + public string FullName; + } + + [Serializable] + public class UserFacebookInstantGamesIdInfo : PlayFabBaseModel + { + /// + /// Facebook Instant Games ID + /// + public string FacebookInstantGamesId; + } + + public enum UserFamilyType + { + None, + Xbox, + Steam + } + + [Serializable] + public class UserGameCenterInfo : PlayFabBaseModel + { + /// + /// Gamecenter identifier + /// + public string GameCenterId; + } + + [Serializable] + public class UserGoogleInfo : PlayFabBaseModel + { + /// + /// Email address of the Google account + /// + public string GoogleEmail; + /// + /// Gender information of the Google account + /// + public string GoogleGender; + /// + /// Google ID + /// + public string GoogleId; + /// + /// Locale of the Google account + /// + public string GoogleLocale; + /// + /// Name of the Google account user + /// + public string GoogleName; + } + + [Serializable] + public class UserGooglePlayGamesInfo : PlayFabBaseModel + { + /// + /// Avatar image url of the Google Play Games player + /// + public string GooglePlayGamesPlayerAvatarImageUrl; + /// + /// Display name of the Google Play Games player + /// + public string GooglePlayGamesPlayerDisplayName; + /// + /// Google Play Games player ID + /// + public string GooglePlayGamesPlayerId; + } + + [Serializable] + public class UserIosDeviceInfo : PlayFabBaseModel + { + /// + /// iOS device ID + /// + public string IosDeviceId; + } + + [Serializable] + public class UserKongregateInfo : PlayFabBaseModel + { + /// + /// Kongregate ID + /// + public string KongregateId; + /// + /// Kongregate Username + /// + public string KongregateName; + } + + [Serializable] + public class UserNintendoSwitchAccountIdInfo : PlayFabBaseModel + { + /// + /// Nintendo Switch account subject ID + /// + public string NintendoSwitchAccountSubjectId; + } + + [Serializable] + public class UserNintendoSwitchDeviceIdInfo : PlayFabBaseModel + { + /// + /// Nintendo Switch Device ID + /// + public string NintendoSwitchDeviceId; + } + + [Serializable] + public class UserOpenIdInfo : PlayFabBaseModel + { + /// + /// OpenID Connection ID + /// + public string ConnectionId; + /// + /// OpenID Issuer + /// + public string Issuer; + /// + /// OpenID Subject + /// + public string Subject; + } + + public enum UserOrigination + { + Organic, + Steam, + Google, + Amazon, + Facebook, + Kongregate, + GamersFirst, + Unknown, + IOS, + LoadTest, + Android, + PSN, + GameCenter, + CustomId, + XboxLive, + Parse, + Twitch, + ServerCustomId, + NintendoSwitchDeviceId, + FacebookInstantGamesId, + OpenIdConnect, + Apple, + NintendoSwitchAccount, + GooglePlayGames, + XboxMobileStore, + King + } + + [Serializable] + public class UserPrivateAccountInfo : PlayFabBaseModel + { + /// + /// user email address + /// + public string Email; + } + + [Serializable] + public class UserPsnInfo : PlayFabBaseModel + { + /// + /// PlayStation :tm: Network account ID + /// + public string PsnAccountId; + /// + /// PlayStation :tm: Network online ID + /// + public string PsnOnlineId; + } + + [Serializable] + public class UserServerCustomIdInfo : PlayFabBaseModel + { + /// + /// Custom ID + /// + public string CustomId; + } + + [Serializable] + public class UserSettings : PlayFabBaseModel + { + /// + /// Boolean for whether this player is eligible for gathering device info. + /// + public bool GatherDeviceInfo; + /// + /// Boolean for whether this player should report OnFocus play-time tracking. + /// + public bool GatherFocusInfo; + /// + /// Boolean for whether this player is eligible for ad tracking. + /// + public bool NeedsAttribution; + } + + [Serializable] + public class UserSteamInfo : PlayFabBaseModel + { + /// + /// what stage of game ownership the user is listed as being in, from Steam + /// + public TitleActivationStatus? SteamActivationStatus; + /// + /// the country in which the player resides, from Steam data + /// + public string SteamCountry; + /// + /// currency type set in the user Steam account + /// + public Currency? SteamCurrency; + /// + /// Steam identifier + /// + public string SteamId; + /// + /// Steam display name + /// + public string SteamName; + } + + [Serializable] + public class UserTitleInfo : PlayFabBaseModel + { + /// + /// URL to the player's avatar. + /// + public string AvatarUrl; + /// + /// timestamp indicating when the user was first associated with this game (this can differ significantly from when the user + /// first registered with PlayFab) + /// + public DateTime Created; + /// + /// name of the user, as it is displayed in-game + /// + public string DisplayName; + /// + /// timestamp indicating when the user first signed into this game (this can differ from the Created timestamp, as other + /// events, such as issuing a beta key to the user, can associate the title to the user) + /// + public DateTime? FirstLogin; + /// + /// boolean indicating whether or not the user is currently banned for a title + /// + public bool? isBanned; + /// + /// timestamp for the last user login for this title + /// + public DateTime? LastLogin; + /// + /// source by which the user first joined the game, if known + /// + public UserOrigination? Origination; + /// + /// Title player account entity for this user + /// + public EntityKey TitlePlayerAccount; + } + + [Serializable] + public class UserTwitchInfo : PlayFabBaseModel + { + /// + /// Twitch ID + /// + public string TwitchId; + /// + /// Twitch Username + /// + public string TwitchUserName; + } + + [Serializable] + public class UserXboxInfo : PlayFabBaseModel + { + /// + /// XBox user ID + /// + public string XboxUserId; + /// + /// XBox user sandbox + /// + public string XboxUserSandbox; + } + + [Serializable] + public class ValueToDateModel : PlayFabBaseModel + { + /// + /// ISO 4217 code of the currency used in the purchases + /// + public string Currency; + /// + /// Total value of the purchases in a whole number of 1/100 monetary units. For example, 999 indicates nine dollars and + /// ninety-nine cents when Currency is 'USD') + /// + public uint TotalValue; + /// + /// Total value of the purchases in a string representation of decimal monetary units. For example, '9.99' indicates nine + /// dollars and ninety-nine cents when Currency is 'USD'. + /// + public string TotalValueAsDecimal; + } + + [Serializable] + public class Variable : PlayFabBaseModel + { + /// + /// Name of the variable. + /// + public string Name; + /// + /// Value of the variable. + /// + public string Value; + } + + [Serializable] + public class VirtualCurrencyRechargeTime : PlayFabBaseModel + { + /// + /// Maximum value to which the regenerating currency will automatically increment. Note that it can exceed this value + /// through use of the AddUserVirtualCurrency API call. However, it will not regenerate automatically until it has fallen + /// below this value. + /// + public int RechargeMax; + /// + /// Server timestamp in UTC indicating the next time the virtual currency will be incremented. + /// + public DateTime RechargeTime; + /// + /// Time remaining (in seconds) before the next recharge increment of the virtual currency. + /// + public int SecondsToRecharge; + } + + [Serializable] + public class WriteEventResponse : PlayFabResultCommon + { + /// + /// The unique identifier of the event. The values of this identifier consist of ASCII characters and are not constrained to + /// any particular format. + /// + public string EventId; + } + + /// + /// This API is designed to write a multitude of different event types into PlayStream. It supports a flexible JSON schema, + /// which allowsfor arbitrary key-value pairs to describe any character-based event. The created event will be locked to the + /// authenticated title. + /// + [Serializable] + public class WriteServerCharacterEventRequest : PlayFabRequestCommon + { + /// + /// Custom event properties. Each property consists of a name (string) and a value (JSON object). + /// + public Dictionary Body; + /// + /// Unique PlayFab assigned ID for a specific character owned by a user + /// + public string CharacterId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The name of the event, within the namespace scoped to the title. The naming convention is up to the caller, but it + /// commonly follows the subject_verb_object pattern (e.g. player_logged_in). + /// + public string EventName; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + /// + /// The time (in UTC) associated with this event. The value defaults to the current time. + /// + public DateTime? Timestamp; + } + + /// + /// This API is designed to write a multitude of different event types into PlayStream. It supports a flexible JSON schema, + /// which allowsfor arbitrary key-value pairs to describe any player-based event. The created event will be locked to the + /// authenticated title. + /// + [Serializable] + public class WriteServerPlayerEventRequest : PlayFabRequestCommon + { + /// + /// Custom data properties associated with the event. Each property consists of a name (string) and a value (JSON object). + /// + public Dictionary Body; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The name of the event, within the namespace scoped to the title. The naming convention is up to the caller, but it + /// commonly follows the subject_verb_object pattern (e.g. player_logged_in). + /// + public string EventName; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + /// + /// The time (in UTC) associated with this event. The value defaults to the current time. + /// + public DateTime? Timestamp; + } + + /// + /// This API is designed to write a multitude of different event types into PlayStream. It supports a flexible JSON schema, + /// which allowsfor arbitrary key-value pairs to describe any title-based event. The created event will be locked to the + /// authenticated title. + /// + [Serializable] + public class WriteTitleEventRequest : PlayFabRequestCommon + { + /// + /// Custom event properties. Each property consists of a name (string) and a value (JSON object). + /// + public Dictionary Body; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The name of the event, within the namespace scoped to the title. The naming convention is up to the caller, but it + /// commonly follows the subject_verb_object pattern (e.g. player_logged_in). + /// + public string EventName; + /// + /// The time (in UTC) associated with this event. The value defaults to the current time. + /// + public DateTime? Timestamp; + } + + [Serializable] + public class XboxLiveAccountPlayFabIdPair : PlayFabBaseModel + { + /// + /// Unique PlayFab identifier for a user, or null if no PlayFab account is linked to the Xbox Live identifier. + /// + public string PlayFabId; + /// + /// Unique Xbox Live identifier for a user. + /// + public string XboxLiveAccountId; + } +} +#endif diff --git a/Assets/PlayFabSDK/Server/PlayFabServerModels.cs.meta b/Assets/PlayFabSDK/Server/PlayFabServerModels.cs.meta new file mode 100644 index 00000000..cafb56b4 --- /dev/null +++ b/Assets/PlayFabSDK/Server/PlayFabServerModels.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 85069115b99da8c4688d838452001d89 +timeCreated: 1468524876 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Shared.meta b/Assets/PlayFabSDK/Shared.meta new file mode 100644 index 00000000..5f239f20 --- /dev/null +++ b/Assets/PlayFabSDK/Shared.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 58e5e838862096746a71aec23d49e6ae +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Shared/Editor.meta b/Assets/PlayFabSDK/Shared/Editor.meta new file mode 100644 index 00000000..eddd5ded --- /dev/null +++ b/Assets/PlayFabSDK/Shared/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8524103f5769d154595ec5eeb53b9c7c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Shared/Editor/MakeSharedSettingsObj.cs b/Assets/PlayFabSDK/Shared/Editor/MakeSharedSettingsObj.cs new file mode 100644 index 00000000..75c12db2 --- /dev/null +++ b/Assets/PlayFabSDK/Shared/Editor/MakeSharedSettingsObj.cs @@ -0,0 +1,21 @@ +#if UNITY_2017_1_OR_NEWER +using PlayFab.PfEditor; +using UnityEditor; +using UnityEngine; + +public class MakeScriptableObject +{ + [MenuItem("PlayFab/MakePlayFabSharedSettings")] + public static void MakePlayFabSharedSettings() + { + PlayFabSharedSettings asset = ScriptableObject.CreateInstance(); + + AssetDatabase.CreateAsset(asset, "Assets/PlayFabSdk/Shared/Public/Resources/PlayFabSharedSettings.asset"); // TODO: Path should not be hard coded + AssetDatabase.SaveAssets(); + + EditorUtility.FocusProjectWindow(); + + Selection.activeObject = asset; + } +} +#endif diff --git a/Assets/PlayFabSDK/Shared/Editor/MakeSharedSettingsObj.cs.meta b/Assets/PlayFabSDK/Shared/Editor/MakeSharedSettingsObj.cs.meta new file mode 100644 index 00000000..1d5091f5 --- /dev/null +++ b/Assets/PlayFabSDK/Shared/Editor/MakeSharedSettingsObj.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3e92542860dab28489c3d9cc0baa1ebd +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Shared/Editor/PlayFabHelp.cs b/Assets/PlayFabSDK/Shared/Editor/PlayFabHelp.cs new file mode 100644 index 00000000..6cf2e91f --- /dev/null +++ b/Assets/PlayFabSDK/Shared/Editor/PlayFabHelp.cs @@ -0,0 +1,38 @@ +using UnityEditor; +using UnityEngine; + +namespace PlayFab.PfEditor +{ + public static class PlayFabHelp + { + [MenuItem("PlayFab/GettingStarted")] + private static void GettingStarted() + { + Application.OpenURL("https://docs.microsoft.com/en-us/gaming/playfab/index#pivot=documentation&panel=quickstarts"); + } + + [MenuItem("PlayFab/Docs")] + private static void Documentation() + { + Application.OpenURL("https://docs.microsoft.com/en-us/gaming/playfab/api-references/"); + } + + [MenuItem("PlayFab/Dashboard")] + private static void Dashboard() + { + Application.OpenURL("https://developer.playfab.com/"); + } + + [MenuItem("PlayFab/Forum")] + private static void Forum() + { + Application.OpenURL("https://community.playfab.com/index.html"); + } + + [MenuItem("PlayFab/Provide Feedback")] + private static void Feedback() + { + Application.OpenURL("https://playfab.com/contact/"); + } + } +} diff --git a/Assets/PlayFabSDK/Shared/Editor/PlayFabHelp.cs.meta b/Assets/PlayFabSDK/Shared/Editor/PlayFabHelp.cs.meta new file mode 100644 index 00000000..b9a59d8f --- /dev/null +++ b/Assets/PlayFabSDK/Shared/Editor/PlayFabHelp.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e51e733dabbc847fa839b19c01bc577c +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/Assets/PlayFabSDK/Shared/Internal.meta b/Assets/PlayFabSDK/Shared/Internal.meta new file mode 100644 index 00000000..46f8d34e --- /dev/null +++ b/Assets/PlayFabSDK/Shared/Internal.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f2d2d06279d1f7b45a72c442913f839c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Shared/Internal/ISerializer.cs b/Assets/PlayFabSDK/Shared/Internal/ISerializer.cs new file mode 100644 index 00000000..83f1ba6c --- /dev/null +++ b/Assets/PlayFabSDK/Shared/Internal/ISerializer.cs @@ -0,0 +1,108 @@ +using System; +using System.Globalization; +using PlayFab.Internal; + +namespace PlayFab.Json +{ + public class SimpleJsonInstance : ISerializerPlugin + { + /// + /// Most users shouldn't access this + /// JsonWrapper.Serialize, and JsonWrapper.Deserialize will always use it automatically (Unless you deliberately mess with them) + /// Any Serialization of an object in the PlayFab namespace should just use JsonWrapper + /// + public static PlayFabSimpleJsonCuztomization ApiSerializerStrategy = new PlayFabSimpleJsonCuztomization(); + public class PlayFabSimpleJsonCuztomization : PocoJsonSerializerStrategy + { + /// + /// Convert the json value into the destination field/property + /// + public override object DeserializeObject(object value, Type type) + { + var valueStr = value as string; + if (valueStr == null) // For all of our custom conversions, value is a string + return base.DeserializeObject(value, type); + + var underType = Nullable.GetUnderlyingType(type); + if (underType != null) + return DeserializeObject(value, underType); + else if (type.GetTypeInfo().IsEnum) + return Enum.Parse(type, (string)value, true); + else if (type == typeof(DateTime)) + { + DateTime output; + var result = DateTime.TryParseExact(valueStr, PlayFabUtil._defaultDateTimeFormats, CultureInfo.InvariantCulture, PlayFabUtil.DateTimeStyles, out output); + if (result) + return output; + } + else if (type == typeof(DateTimeOffset)) + { + DateTimeOffset output; + var result = DateTimeOffset.TryParseExact(valueStr, PlayFabUtil._defaultDateTimeFormats, CultureInfo.InvariantCulture, PlayFabUtil.DateTimeStyles, out output); + if (result) + return output; + } + else if (type == typeof(TimeSpan)) + { + double seconds; + if (double.TryParse(valueStr, out seconds)) + return TimeSpan.FromSeconds(seconds); + } + return base.DeserializeObject(value, type); + } + + /// + /// Set output to a string that represents the input object + /// + protected override bool TrySerializeKnownTypes(object input, out object output) + { + if (input.GetType().GetTypeInfo().IsEnum) + { + output = input.ToString(); + return true; + } + else if (input is DateTime) + { + output = ((DateTime)input).ToString(PlayFabUtil._defaultDateTimeFormats[PlayFabUtil.DEFAULT_UTC_OUTPUT_INDEX], CultureInfo.InvariantCulture); + return true; + } + else if (input is DateTimeOffset) + { + output = ((DateTimeOffset)input).ToString(PlayFabUtil._defaultDateTimeFormats[PlayFabUtil.DEFAULT_UTC_OUTPUT_INDEX], CultureInfo.InvariantCulture); + return true; + } + else if (input is TimeSpan) + { + output = ((TimeSpan)input).TotalSeconds; + return true; + } + return base.TrySerializeKnownTypes(input, out output); + } + } + + public T DeserializeObject(string json) + { + return PlayFabSimpleJson.DeserializeObject(json, ApiSerializerStrategy); + } + + public T DeserializeObject(string json, object jsonSerializerStrategy) + { + return PlayFabSimpleJson.DeserializeObject(json, (IJsonSerializerStrategy)jsonSerializerStrategy); + } + + public object DeserializeObject(string json) + { + return PlayFabSimpleJson.DeserializeObject(json, typeof(object), ApiSerializerStrategy); + } + + public string SerializeObject(object json) + { + return PlayFabSimpleJson.SerializeObject(json, ApiSerializerStrategy); + } + + public string SerializeObject(object json, object jsonSerializerStrategy) + { + return PlayFabSimpleJson.SerializeObject(json, (IJsonSerializerStrategy)jsonSerializerStrategy); + } + } +} diff --git a/Assets/PlayFabSDK/Shared/Internal/ISerializer.cs.meta b/Assets/PlayFabSDK/Shared/Internal/ISerializer.cs.meta new file mode 100644 index 00000000..285cd843 --- /dev/null +++ b/Assets/PlayFabSDK/Shared/Internal/ISerializer.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 1337f8c156b41834691b131f3b6774f9 +timeCreated: 1462682372 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Shared/Internal/Log.cs b/Assets/PlayFabSDK/Shared/Internal/Log.cs new file mode 100644 index 00000000..40767f07 --- /dev/null +++ b/Assets/PlayFabSDK/Shared/Internal/Log.cs @@ -0,0 +1,44 @@ +using System; + +namespace PlayFab.Internal +{ + [Obsolete("This logging utility has been deprecated. Use UnityEngine.Debug.Log")] + public static class Log + { + [Obsolete("Debug is deprecated.")] + public static void Debug(string text, params object[] args) + { + if ((PlayFabSettings.LogLevel & PlayFabLogLevel.Debug) != 0) + { + UnityEngine.Debug.Log(PlayFabUtil.timeStamp + " DEBUG: " + PlayFabUtil.Format(text, args)); + } + } + + [Obsolete("Info is deprecated.")] + public static void Info(string text, params object[] args) + { + if ((PlayFabSettings.LogLevel & PlayFabLogLevel.Info) != 0) + { + UnityEngine.Debug.Log(PlayFabUtil.timeStamp + " INFO: " + PlayFabUtil.Format(text, args)); + } + } + + [Obsolete("Warning is deprecated.")] + public static void Warning(string text, params object[] args) + { + if ((PlayFabSettings.LogLevel & PlayFabLogLevel.Warning) != 0) + { + UnityEngine.Debug.LogWarning(PlayFabUtil.timeStamp + " WARNING: " + PlayFabUtil.Format(text, args)); + } + } + + [Obsolete("Error is deprecated.")] + public static void Error(string text, params object[] args) + { + if ((PlayFabSettings.LogLevel & PlayFabLogLevel.Error) != 0) + { + UnityEngine.Debug.LogError(PlayFabUtil.timeStamp + " ERROR: " + PlayFabUtil.Format(text, args)); + } + } + } +} diff --git a/Assets/PlayFabSDK/Shared/Internal/Log.cs.meta b/Assets/PlayFabSDK/Shared/Internal/Log.cs.meta new file mode 100644 index 00000000..ebf6395e --- /dev/null +++ b/Assets/PlayFabSDK/Shared/Internal/Log.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 5b55790eeab1b3c41a4f1381cbea1213 +timeCreated: 1462682372 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Shared/Internal/PlayFabErrors.cs b/Assets/PlayFabSDK/Shared/Internal/PlayFabErrors.cs new file mode 100644 index 00000000..3c9d6008 --- /dev/null +++ b/Assets/PlayFabSDK/Shared/Internal/PlayFabErrors.cs @@ -0,0 +1,948 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace PlayFab +{ + /// + /// Error codes returned by PlayFabAPIs + /// + public enum PlayFabErrorCode + { + Unknown = 1, + ConnectionError = 2, + JsonParseError = 3, + Success = 0, + UnkownError = 500, + InvalidParams = 1000, + AccountNotFound = 1001, + AccountBanned = 1002, + InvalidUsernameOrPassword = 1003, + InvalidTitleId = 1004, + InvalidEmailAddress = 1005, + EmailAddressNotAvailable = 1006, + InvalidUsername = 1007, + InvalidPassword = 1008, + UsernameNotAvailable = 1009, + InvalidSteamTicket = 1010, + AccountAlreadyLinked = 1011, + LinkedAccountAlreadyClaimed = 1012, + InvalidFacebookToken = 1013, + AccountNotLinked = 1014, + FailedByPaymentProvider = 1015, + CouponCodeNotFound = 1016, + InvalidContainerItem = 1017, + ContainerNotOwned = 1018, + KeyNotOwned = 1019, + InvalidItemIdInTable = 1020, + InvalidReceipt = 1021, + ReceiptAlreadyUsed = 1022, + ReceiptCancelled = 1023, + GameNotFound = 1024, + GameModeNotFound = 1025, + InvalidGoogleToken = 1026, + UserIsNotPartOfDeveloper = 1027, + InvalidTitleForDeveloper = 1028, + TitleNameConflicts = 1029, + UserisNotValid = 1030, + ValueAlreadyExists = 1031, + BuildNotFound = 1032, + PlayerNotInGame = 1033, + InvalidTicket = 1034, + InvalidDeveloper = 1035, + InvalidOrderInfo = 1036, + RegistrationIncomplete = 1037, + InvalidPlatform = 1038, + UnknownError = 1039, + SteamApplicationNotOwned = 1040, + WrongSteamAccount = 1041, + TitleNotActivated = 1042, + RegistrationSessionNotFound = 1043, + NoSuchMod = 1044, + FileNotFound = 1045, + DuplicateEmail = 1046, + ItemNotFound = 1047, + ItemNotOwned = 1048, + ItemNotRecycleable = 1049, + ItemNotAffordable = 1050, + InvalidVirtualCurrency = 1051, + WrongVirtualCurrency = 1052, + WrongPrice = 1053, + NonPositiveValue = 1054, + InvalidRegion = 1055, + RegionAtCapacity = 1056, + ServerFailedToStart = 1057, + NameNotAvailable = 1058, + InsufficientFunds = 1059, + InvalidDeviceID = 1060, + InvalidPushNotificationToken = 1061, + NoRemainingUses = 1062, + InvalidPaymentProvider = 1063, + PurchaseInitializationFailure = 1064, + DuplicateUsername = 1065, + InvalidBuyerInfo = 1066, + NoGameModeParamsSet = 1067, + BodyTooLarge = 1068, + ReservedWordInBody = 1069, + InvalidTypeInBody = 1070, + InvalidRequest = 1071, + ReservedEventName = 1072, + InvalidUserStatistics = 1073, + NotAuthenticated = 1074, + StreamAlreadyExists = 1075, + ErrorCreatingStream = 1076, + StreamNotFound = 1077, + InvalidAccount = 1078, + PurchaseDoesNotExist = 1080, + InvalidPurchaseTransactionStatus = 1081, + APINotEnabledForGameClientAccess = 1082, + NoPushNotificationARNForTitle = 1083, + BuildAlreadyExists = 1084, + BuildPackageDoesNotExist = 1085, + CustomAnalyticsEventsNotEnabledForTitle = 1087, + InvalidSharedGroupId = 1088, + NotAuthorized = 1089, + MissingTitleGoogleProperties = 1090, + InvalidItemProperties = 1091, + InvalidPSNAuthCode = 1092, + InvalidItemId = 1093, + PushNotEnabledForAccount = 1094, + PushServiceError = 1095, + ReceiptDoesNotContainInAppItems = 1096, + ReceiptContainsMultipleInAppItems = 1097, + InvalidBundleID = 1098, + JavascriptException = 1099, + InvalidSessionTicket = 1100, + UnableToConnectToDatabase = 1101, + InternalServerError = 1110, + InvalidReportDate = 1111, + ReportNotAvailable = 1112, + DatabaseThroughputExceeded = 1113, + InvalidGameTicket = 1115, + ExpiredGameTicket = 1116, + GameTicketDoesNotMatchLobby = 1117, + LinkedDeviceAlreadyClaimed = 1118, + DeviceAlreadyLinked = 1119, + DeviceNotLinked = 1120, + PartialFailure = 1121, + PublisherNotSet = 1122, + ServiceUnavailable = 1123, + VersionNotFound = 1124, + RevisionNotFound = 1125, + InvalidPublisherId = 1126, + DownstreamServiceUnavailable = 1127, + APINotIncludedInTitleUsageTier = 1128, + DAULimitExceeded = 1129, + APIRequestLimitExceeded = 1130, + InvalidAPIEndpoint = 1131, + BuildNotAvailable = 1132, + ConcurrentEditError = 1133, + ContentNotFound = 1134, + CharacterNotFound = 1135, + CloudScriptNotFound = 1136, + ContentQuotaExceeded = 1137, + InvalidCharacterStatistics = 1138, + PhotonNotEnabledForTitle = 1139, + PhotonApplicationNotFound = 1140, + PhotonApplicationNotAssociatedWithTitle = 1141, + InvalidEmailOrPassword = 1142, + FacebookAPIError = 1143, + InvalidContentType = 1144, + KeyLengthExceeded = 1145, + DataLengthExceeded = 1146, + TooManyKeys = 1147, + FreeTierCannotHaveVirtualCurrency = 1148, + MissingAmazonSharedKey = 1149, + AmazonValidationError = 1150, + InvalidPSNIssuerId = 1151, + PSNInaccessible = 1152, + ExpiredAuthToken = 1153, + FailedToGetEntitlements = 1154, + FailedToConsumeEntitlement = 1155, + TradeAcceptingUserNotAllowed = 1156, + TradeInventoryItemIsAssignedToCharacter = 1157, + TradeInventoryItemIsBundle = 1158, + TradeStatusNotValidForCancelling = 1159, + TradeStatusNotValidForAccepting = 1160, + TradeDoesNotExist = 1161, + TradeCancelled = 1162, + TradeAlreadyFilled = 1163, + TradeWaitForStatusTimeout = 1164, + TradeInventoryItemExpired = 1165, + TradeMissingOfferedAndAcceptedItems = 1166, + TradeAcceptedItemIsBundle = 1167, + TradeAcceptedItemIsStackable = 1168, + TradeInventoryItemInvalidStatus = 1169, + TradeAcceptedCatalogItemInvalid = 1170, + TradeAllowedUsersInvalid = 1171, + TradeInventoryItemDoesNotExist = 1172, + TradeInventoryItemIsConsumed = 1173, + TradeInventoryItemIsStackable = 1174, + TradeAcceptedItemsMismatch = 1175, + InvalidKongregateToken = 1176, + FeatureNotConfiguredForTitle = 1177, + NoMatchingCatalogItemForReceipt = 1178, + InvalidCurrencyCode = 1179, + NoRealMoneyPriceForCatalogItem = 1180, + TradeInventoryItemIsNotTradable = 1181, + TradeAcceptedCatalogItemIsNotTradable = 1182, + UsersAlreadyFriends = 1183, + LinkedIdentifierAlreadyClaimed = 1184, + CustomIdNotLinked = 1185, + TotalDataSizeExceeded = 1186, + DeleteKeyConflict = 1187, + InvalidXboxLiveToken = 1188, + ExpiredXboxLiveToken = 1189, + ResettableStatisticVersionRequired = 1190, + NotAuthorizedByTitle = 1191, + NoPartnerEnabled = 1192, + InvalidPartnerResponse = 1193, + APINotEnabledForGameServerAccess = 1194, + StatisticNotFound = 1195, + StatisticNameConflict = 1196, + StatisticVersionClosedForWrites = 1197, + StatisticVersionInvalid = 1198, + APIClientRequestRateLimitExceeded = 1199, + InvalidJSONContent = 1200, + InvalidDropTable = 1201, + StatisticVersionAlreadyIncrementedForScheduledInterval = 1202, + StatisticCountLimitExceeded = 1203, + StatisticVersionIncrementRateExceeded = 1204, + ContainerKeyInvalid = 1205, + CloudScriptExecutionTimeLimitExceeded = 1206, + NoWritePermissionsForEvent = 1207, + CloudScriptFunctionArgumentSizeExceeded = 1208, + CloudScriptAPIRequestCountExceeded = 1209, + CloudScriptAPIRequestError = 1210, + CloudScriptHTTPRequestError = 1211, + InsufficientGuildRole = 1212, + GuildNotFound = 1213, + OverLimit = 1214, + EventNotFound = 1215, + InvalidEventField = 1216, + InvalidEventName = 1217, + CatalogNotConfigured = 1218, + OperationNotSupportedForPlatform = 1219, + SegmentNotFound = 1220, + StoreNotFound = 1221, + InvalidStatisticName = 1222, + TitleNotQualifiedForLimit = 1223, + InvalidServiceLimitLevel = 1224, + ServiceLimitLevelInTransition = 1225, + CouponAlreadyRedeemed = 1226, + GameServerBuildSizeLimitExceeded = 1227, + GameServerBuildCountLimitExceeded = 1228, + VirtualCurrencyCountLimitExceeded = 1229, + VirtualCurrencyCodeExists = 1230, + TitleNewsItemCountLimitExceeded = 1231, + InvalidTwitchToken = 1232, + TwitchResponseError = 1233, + ProfaneDisplayName = 1234, + UserAlreadyAdded = 1235, + InvalidVirtualCurrencyCode = 1236, + VirtualCurrencyCannotBeDeleted = 1237, + IdentifierAlreadyClaimed = 1238, + IdentifierNotLinked = 1239, + InvalidContinuationToken = 1240, + ExpiredContinuationToken = 1241, + InvalidSegment = 1242, + InvalidSessionId = 1243, + SessionLogNotFound = 1244, + InvalidSearchTerm = 1245, + TwoFactorAuthenticationTokenRequired = 1246, + GameServerHostCountLimitExceeded = 1247, + PlayerTagCountLimitExceeded = 1248, + RequestAlreadyRunning = 1249, + ActionGroupNotFound = 1250, + MaximumSegmentBulkActionJobsRunning = 1251, + NoActionsOnPlayersInSegmentJob = 1252, + DuplicateStatisticName = 1253, + ScheduledTaskNameConflict = 1254, + ScheduledTaskCreateConflict = 1255, + InvalidScheduledTaskName = 1256, + InvalidTaskSchedule = 1257, + SteamNotEnabledForTitle = 1258, + LimitNotAnUpgradeOption = 1259, + NoSecretKeyEnabledForCloudScript = 1260, + TaskNotFound = 1261, + TaskInstanceNotFound = 1262, + InvalidIdentityProviderId = 1263, + MisconfiguredIdentityProvider = 1264, + InvalidScheduledTaskType = 1265, + BillingInformationRequired = 1266, + LimitedEditionItemUnavailable = 1267, + InvalidAdPlacementAndReward = 1268, + AllAdPlacementViewsAlreadyConsumed = 1269, + GoogleOAuthNotConfiguredForTitle = 1270, + GoogleOAuthError = 1271, + UserNotFriend = 1272, + InvalidSignature = 1273, + InvalidPublicKey = 1274, + GoogleOAuthNoIdTokenIncludedInResponse = 1275, + StatisticUpdateInProgress = 1276, + LeaderboardVersionNotAvailable = 1277, + StatisticAlreadyHasPrizeTable = 1279, + PrizeTableHasOverlappingRanks = 1280, + PrizeTableHasMissingRanks = 1281, + PrizeTableRankStartsAtZero = 1282, + InvalidStatistic = 1283, + ExpressionParseFailure = 1284, + ExpressionInvokeFailure = 1285, + ExpressionTooLong = 1286, + DataUpdateRateExceeded = 1287, + RestrictedEmailDomain = 1288, + EncryptionKeyDisabled = 1289, + EncryptionKeyMissing = 1290, + EncryptionKeyBroken = 1291, + NoSharedSecretKeyConfigured = 1292, + SecretKeyNotFound = 1293, + PlayerSecretAlreadyConfigured = 1294, + APIRequestsDisabledForTitle = 1295, + InvalidSharedSecretKey = 1296, + PrizeTableHasNoRanks = 1297, + ProfileDoesNotExist = 1298, + ContentS3OriginBucketNotConfigured = 1299, + InvalidEnvironmentForReceipt = 1300, + EncryptedRequestNotAllowed = 1301, + SignedRequestNotAllowed = 1302, + RequestViewConstraintParamsNotAllowed = 1303, + BadPartnerConfiguration = 1304, + XboxBPCertificateFailure = 1305, + XboxXASSExchangeFailure = 1306, + InvalidEntityId = 1307, + StatisticValueAggregationOverflow = 1308, + EmailMessageFromAddressIsMissing = 1309, + EmailMessageToAddressIsMissing = 1310, + SmtpServerAuthenticationError = 1311, + SmtpServerLimitExceeded = 1312, + SmtpServerInsufficientStorage = 1313, + SmtpServerCommunicationError = 1314, + SmtpServerGeneralFailure = 1315, + EmailClientTimeout = 1316, + EmailClientCanceledTask = 1317, + EmailTemplateMissing = 1318, + InvalidHostForTitleId = 1319, + EmailConfirmationTokenDoesNotExist = 1320, + EmailConfirmationTokenExpired = 1321, + AccountDeleted = 1322, + PlayerSecretNotConfigured = 1323, + InvalidSignatureTime = 1324, + NoContactEmailAddressFound = 1325, + InvalidAuthToken = 1326, + AuthTokenDoesNotExist = 1327, + AuthTokenExpired = 1328, + AuthTokenAlreadyUsedToResetPassword = 1329, + MembershipNameTooLong = 1330, + MembershipNotFound = 1331, + GoogleServiceAccountInvalid = 1332, + GoogleServiceAccountParseFailure = 1333, + EntityTokenMissing = 1334, + EntityTokenInvalid = 1335, + EntityTokenExpired = 1336, + EntityTokenRevoked = 1337, + InvalidProductForSubscription = 1338, + XboxInaccessible = 1339, + SubscriptionAlreadyTaken = 1340, + SmtpAddonNotEnabled = 1341, + APIConcurrentRequestLimitExceeded = 1342, + XboxRejectedXSTSExchangeRequest = 1343, + VariableNotDefined = 1344, + TemplateVersionNotDefined = 1345, + FileTooLarge = 1346, + TitleDeleted = 1347, + TitleContainsUserAccounts = 1348, + TitleDeletionPlayerCleanupFailure = 1349, + EntityFileOperationPending = 1350, + NoEntityFileOperationPending = 1351, + EntityProfileVersionMismatch = 1352, + TemplateVersionTooOld = 1353, + MembershipDefinitionInUse = 1354, + PaymentPageNotConfigured = 1355, + FailedLoginAttemptRateLimitExceeded = 1356, + EntityBlockedByGroup = 1357, + RoleDoesNotExist = 1358, + EntityIsAlreadyMember = 1359, + DuplicateRoleId = 1360, + GroupInvitationNotFound = 1361, + GroupApplicationNotFound = 1362, + OutstandingInvitationAcceptedInstead = 1363, + OutstandingApplicationAcceptedInstead = 1364, + RoleIsGroupDefaultMember = 1365, + RoleIsGroupAdmin = 1366, + RoleNameNotAvailable = 1367, + GroupNameNotAvailable = 1368, + EmailReportAlreadySent = 1369, + EmailReportRecipientBlacklisted = 1370, + EventNamespaceNotAllowed = 1371, + EventEntityNotAllowed = 1372, + InvalidEntityType = 1373, + NullTokenResultFromAad = 1374, + InvalidTokenResultFromAad = 1375, + NoValidCertificateForAad = 1376, + InvalidCertificateForAad = 1377, + DuplicateDropTableId = 1378, + MultiplayerServerError = 1379, + MultiplayerServerTooManyRequests = 1380, + MultiplayerServerNoContent = 1381, + MultiplayerServerBadRequest = 1382, + MultiplayerServerUnauthorized = 1383, + MultiplayerServerForbidden = 1384, + MultiplayerServerNotFound = 1385, + MultiplayerServerConflict = 1386, + MultiplayerServerInternalServerError = 1387, + MultiplayerServerUnavailable = 1388, + ExplicitContentDetected = 1389, + PIIContentDetected = 1390, + InvalidScheduledTaskParameter = 1391, + PerEntityEventRateLimitExceeded = 1392, + TitleDefaultLanguageNotSet = 1393, + EmailTemplateMissingDefaultVersion = 1394, + FacebookInstantGamesIdNotLinked = 1395, + InvalidFacebookInstantGamesSignature = 1396, + FacebookInstantGamesAuthNotConfiguredForTitle = 1397, + EntityProfileConstraintValidationFailed = 1398, + TelemetryIngestionKeyPending = 1399, + TelemetryIngestionKeyNotFound = 1400, + StatisticChildNameInvalid = 1402, + DataIntegrityError = 1403, + VirtualCurrencyCannotBeSetToOlderVersion = 1404, + VirtualCurrencyMustBeWithinIntegerRange = 1405, + EmailTemplateInvalidSyntax = 1406, + EmailTemplateMissingCallback = 1407, + PushNotificationTemplateInvalidPayload = 1408, + InvalidLocalizedPushNotificationLanguage = 1409, + MissingLocalizedPushNotificationMessage = 1410, + PushNotificationTemplateMissingPlatformPayload = 1411, + PushNotificationTemplatePayloadContainsInvalidJson = 1412, + PushNotificationTemplateContainsInvalidIosPayload = 1413, + PushNotificationTemplateContainsInvalidAndroidPayload = 1414, + PushNotificationTemplateIosPayloadMissingNotificationBody = 1415, + PushNotificationTemplateAndroidPayloadMissingNotificationBody = 1416, + PushNotificationTemplateNotFound = 1417, + PushNotificationTemplateMissingDefaultVersion = 1418, + PushNotificationTemplateInvalidSyntax = 1419, + PushNotificationTemplateNoCustomPayloadForV1 = 1420, + NoLeaderboardForStatistic = 1421, + TitleNewsMissingDefaultLanguage = 1422, + TitleNewsNotFound = 1423, + TitleNewsDuplicateLanguage = 1424, + TitleNewsMissingTitleOrBody = 1425, + TitleNewsInvalidLanguage = 1426, + EmailRecipientBlacklisted = 1427, + InvalidGameCenterAuthRequest = 1428, + GameCenterAuthenticationFailed = 1429, + CannotEnablePartiesForTitle = 1430, + PartyError = 1431, + PartyRequests = 1432, + PartyNoContent = 1433, + PartyBadRequest = 1434, + PartyUnauthorized = 1435, + PartyForbidden = 1436, + PartyNotFound = 1437, + PartyConflict = 1438, + PartyInternalServerError = 1439, + PartyUnavailable = 1440, + PartyTooManyRequests = 1441, + PushNotificationTemplateMissingName = 1442, + CannotEnableMultiplayerServersForTitle = 1443, + WriteAttemptedDuringExport = 1444, + MultiplayerServerTitleQuotaCoresExceeded = 1445, + AutomationRuleNotFound = 1446, + EntityAPIKeyLimitExceeded = 1447, + EntityAPIKeyNotFound = 1448, + EntityAPIKeyOrSecretInvalid = 1449, + EconomyServiceUnavailable = 1450, + EconomyServiceInternalError = 1451, + QueryRateLimitExceeded = 1452, + EntityAPIKeyCreationDisabledForEntity = 1453, + ForbiddenByEntityPolicy = 1454, + UpdateInventoryRateLimitExceeded = 1455, + StudioCreationRateLimited = 1456, + StudioCreationInProgress = 1457, + DuplicateStudioName = 1458, + StudioNotFound = 1459, + StudioDeleted = 1460, + StudioDeactivated = 1461, + StudioActivated = 1462, + TitleCreationRateLimited = 1463, + TitleCreationInProgress = 1464, + DuplicateTitleName = 1465, + TitleActivationRateLimited = 1466, + TitleActivationInProgress = 1467, + TitleDeactivated = 1468, + TitleActivated = 1469, + CloudScriptAzureFunctionsExecutionTimeLimitExceeded = 1470, + CloudScriptAzureFunctionsArgumentSizeExceeded = 1471, + CloudScriptAzureFunctionsReturnSizeExceeded = 1472, + CloudScriptAzureFunctionsHTTPRequestError = 1473, + VirtualCurrencyBetaGetError = 1474, + VirtualCurrencyBetaCreateError = 1475, + VirtualCurrencyBetaInitialDepositSaveError = 1476, + VirtualCurrencyBetaSaveError = 1477, + VirtualCurrencyBetaDeleteError = 1478, + VirtualCurrencyBetaRestoreError = 1479, + VirtualCurrencyBetaSaveConflict = 1480, + VirtualCurrencyBetaUpdateError = 1481, + InsightsManagementDatabaseNotFound = 1482, + InsightsManagementOperationNotFound = 1483, + InsightsManagementErrorPendingOperationExists = 1484, + InsightsManagementSetPerformanceLevelInvalidParameter = 1485, + InsightsManagementSetStorageRetentionInvalidParameter = 1486, + InsightsManagementGetStorageUsageInvalidParameter = 1487, + InsightsManagementGetOperationStatusInvalidParameter = 1488, + DuplicatePurchaseTransactionId = 1489, + EvaluationModePlayerCountExceeded = 1490, + GetPlayersInSegmentRateLimitExceeded = 1491, + CloudScriptFunctionNameSizeExceeded = 1492, + PaidInsightsFeaturesNotEnabled = 1493, + CloudScriptAzureFunctionsQueueRequestError = 1494, + EvaluationModeTitleCountExceeded = 1495, + InsightsManagementTitleNotInFlight = 1496, + LimitNotFound = 1497, + LimitNotAvailableViaAPI = 1498, + InsightsManagementSetStorageRetentionBelowMinimum = 1499, + InsightsManagementSetStorageRetentionAboveMaximum = 1500, + AppleNotEnabledForTitle = 1501, + InsightsManagementNewActiveEventExportLimitInvalid = 1502, + InsightsManagementSetPerformanceRateLimited = 1503, + PartyRequestsThrottledFromRateLimiter = 1504, + XboxServiceTooManyRequests = 1505, + NintendoSwitchNotEnabledForTitle = 1506, + RequestMultiplayerServersThrottledFromRateLimiter = 1507, + TitleDataOverrideNotFound = 1508, + DuplicateKeys = 1509, + WasNotCreatedWithCloudRoot = 1510, + LegacyMultiplayerServersDeprecated = 1511, + VirtualCurrencyCurrentlyUnavailable = 1512, + SteamUserNotFound = 1513, + ElasticSearchOperationFailed = 1514, + NotImplemented = 1515, + PublisherNotFound = 1516, + PublisherDeleted = 1517, + ApiDisabledForMigration = 1518, + ResourceNameUpdateNotAllowed = 1519, + ApiNotEnabledForTitle = 1520, + DuplicateTitleNameForPublisher = 1521, + AzureTitleCreationInProgress = 1522, + TitleConstraintsPublisherDeletion = 1524, + InvalidPlayerAccountPoolId = 1525, + PlayerAccountPoolNotFound = 1526, + PlayerAccountPoolDeleted = 1527, + TitleCleanupInProgress = 1528, + AzureResourceConcurrentOperationInProgress = 1529, + TitlePublisherUpdateNotAllowed = 1530, + AzureResourceManagerNotSupportedInStamp = 1531, + ApiNotIncludedInAzurePlayFabFeatureSet = 1532, + GoogleServiceAccountFailedAuth = 1533, + GoogleAPIServiceUnavailable = 1534, + GoogleAPIServiceUnknownError = 1535, + NoValidIdentityForAad = 1536, + PlayerIdentityLinkNotFound = 1537, + PhotonApplicationIdAlreadyInUse = 1538, + CloudScriptUnableToDeleteProductionRevision = 1539, + CustomIdNotFound = 1540, + AutomationInvalidInput = 1541, + AutomationInvalidRuleName = 1542, + AutomationRuleAlreadyExists = 1543, + AutomationRuleLimitExceeded = 1544, + InvalidGooglePlayGamesServerAuthCode = 1545, + PlayStreamConnectionFailed = 1547, + InvalidEventContents = 1548, + InsightsV1Deprecated = 1549, + AnalysisSubscriptionNotFound = 1550, + AnalysisSubscriptionFailed = 1551, + AnalysisSubscriptionFoundAlready = 1552, + AnalysisSubscriptionManagementInvalidInput = 1553, + InvalidGameCenterId = 1554, + InvalidNintendoSwitchAccountId = 1555, + EntityAPIKeysNotSupported = 1556, + IpAddressBanned = 1557, + EntityLineageBanned = 1558, + NamespaceMismatch = 1559, + InvalidServiceConfiguration = 1560, + InvalidNamespaceMismatch = 1561, + LeaderboardColumnLengthMismatch = 1562, + InvalidStatisticScore = 1563, + LeaderboardColumnsNotSpecified = 1564, + LeaderboardMaxSizeTooLarge = 1565, + InvalidAttributeStatisticsSpecified = 1566, + LeaderboardNotFound = 1567, + TokenSigningKeyNotFound = 1568, + LeaderboardNameConflict = 1569, + LinkedStatisticColumnMismatch = 1570, + NoLinkedStatisticToLeaderboard = 1571, + StatDefinitionAlreadyLinkedToLeaderboard = 1572, + LinkingStatsNotAllowedForEntityType = 1573, + LeaderboardCountLimitExceeded = 1574, + LeaderboardSizeLimitExceeded = 1575, + LeaderboardDefinitionModificationNotAllowedWhileLinked = 1576, + StatisticDefinitionModificationNotAllowedWhileLinked = 1577, + LeaderboardUpdateNotAllowedWhileLinked = 1578, + CloudScriptAzureFunctionsEventHubRequestError = 1579, + ExternalEntityNotAllowedForTier = 1580, + InvalidBaseTimeForInterval = 1581, + EntityTypeMismatchWithStatDefinition = 1582, + SpecifiedVersionLeaderboardNotFound = 1583, + LeaderboardColumnLengthMismatchWithStatDefinition = 1584, + DuplicateColumnNameFound = 1585, + LinkedStatisticColumnNotFound = 1586, + LinkedStatisticColumnRequired = 1587, + MultipleLinkedStatisticsNotAllowed = 1588, + DuplicateLinkedStatisticColumnNameFound = 1589, + AggregationTypeNotAllowedForMultiColumnStatistic = 1590, + MaxQueryableVersionsValueNotAllowedForTier = 1591, + StatisticDefinitionHasNullOrEmptyVersionConfiguration = 1592, + StatisticColumnLengthMismatch = 1593, + MatchmakingEntityInvalid = 2001, + MatchmakingPlayerAttributesInvalid = 2002, + MatchmakingQueueNotFound = 2016, + MatchmakingMatchNotFound = 2017, + MatchmakingTicketNotFound = 2018, + MatchmakingAlreadyJoinedTicket = 2028, + MatchmakingTicketAlreadyCompleted = 2029, + MatchmakingQueueConfigInvalid = 2031, + MatchmakingMemberProfileInvalid = 2032, + NintendoSwitchDeviceIdNotLinked = 2034, + MatchmakingNotEnabled = 2035, + MatchmakingPlayerAttributesTooLarge = 2043, + MatchmakingNumberOfPlayersInTicketTooLarge = 2044, + MatchmakingAttributeInvalid = 2046, + MatchmakingPlayerHasNotJoinedTicket = 2053, + MatchmakingRateLimitExceeded = 2054, + MatchmakingTicketMembershipLimitExceeded = 2055, + MatchmakingUnauthorized = 2056, + MatchmakingQueueLimitExceeded = 2057, + MatchmakingRequestTypeMismatch = 2058, + MatchmakingBadRequest = 2059, + PubSubFeatureNotEnabledForTitle = 2500, + PubSubTooManyRequests = 2501, + PubSubConnectionNotFoundForEntity = 2502, + PubSubConnectionHandleInvalid = 2503, + PubSubSubscriptionLimitExceeded = 2504, + TitleConfigNotFound = 3001, + TitleConfigUpdateConflict = 3002, + TitleConfigSerializationError = 3003, + CatalogApiNotImplemented = 4000, + CatalogEntityInvalid = 4001, + CatalogTitleIdMissing = 4002, + CatalogPlayerIdMissing = 4003, + CatalogClientIdentityInvalid = 4004, + CatalogOneOrMoreFilesInvalid = 4005, + CatalogItemMetadataInvalid = 4006, + CatalogItemIdInvalid = 4007, + CatalogSearchParameterInvalid = 4008, + CatalogFeatureDisabled = 4009, + CatalogConfigInvalid = 4010, + CatalogItemTypeInvalid = 4012, + CatalogBadRequest = 4013, + CatalogTooManyRequests = 4014, + InvalidCatalogItemConfiguration = 4015, + ExportInvalidStatusUpdate = 5000, + ExportInvalidPrefix = 5001, + ExportBlobContainerDoesNotExist = 5002, + ExportNotFound = 5004, + ExportCouldNotUpdate = 5005, + ExportInvalidStorageType = 5006, + ExportAmazonBucketDoesNotExist = 5007, + ExportInvalidBlobStorage = 5008, + ExportKustoException = 5009, + ExportKustoConnectionFailed = 5012, + ExportUnknownError = 5013, + ExportCantEditPendingExport = 5014, + ExportLimitExports = 5015, + ExportLimitEvents = 5016, + ExportInvalidPartitionStatusModification = 5017, + ExportCouldNotCreate = 5018, + ExportNoBackingDatabaseFound = 5019, + ExportCouldNotDelete = 5020, + ExportCannotDetermineEventQuery = 5021, + ExportInvalidQuerySchemaModification = 5022, + ExportQuerySchemaMissingRequiredColumns = 5023, + ExportCannotParseQuery = 5024, + ExportControlCommandsNotAllowed = 5025, + ExportQueryMissingTableReference = 5026, + ExportInsightsV1Deprecated = 5027, + ExplorerBasicInvalidQueryName = 5100, + ExplorerBasicInvalidQueryDescription = 5101, + ExplorerBasicInvalidQueryConditions = 5102, + ExplorerBasicInvalidQueryStartDate = 5103, + ExplorerBasicInvalidQueryEndDate = 5104, + ExplorerBasicInvalidQueryGroupBy = 5105, + ExplorerBasicInvalidQueryAggregateType = 5106, + ExplorerBasicInvalidQueryAggregateProperty = 5107, + ExplorerBasicLoadQueriesError = 5108, + ExplorerBasicLoadQueryError = 5109, + ExplorerBasicCreateQueryError = 5110, + ExplorerBasicDeleteQueryError = 5111, + ExplorerBasicUpdateQueryError = 5112, + ExplorerBasicSavedQueriesLimit = 5113, + ExplorerBasicSavedQueryNotFound = 5114, + TenantShardMapperShardNotFound = 5500, + TitleNotEnabledForParty = 6000, + PartyVersionNotFound = 6001, + MultiplayerServerBuildReferencedByMatchmakingQueue = 6002, + MultiplayerServerBuildReferencedByBuildAlias = 6003, + MultiplayerServerBuildAliasReferencedByMatchmakingQueue = 6004, + PartySerializationError = 6005, + ExperimentationExperimentStopped = 7000, + ExperimentationExperimentRunning = 7001, + ExperimentationExperimentNotFound = 7002, + ExperimentationExperimentNeverStarted = 7003, + ExperimentationExperimentDeleted = 7004, + ExperimentationClientTimeout = 7005, + ExperimentationInvalidVariantConfiguration = 7006, + ExperimentationInvalidVariableConfiguration = 7007, + ExperimentInvalidId = 7008, + ExperimentationNoScorecard = 7009, + ExperimentationTreatmentAssignmentFailed = 7010, + ExperimentationTreatmentAssignmentDisabled = 7011, + ExperimentationInvalidDuration = 7012, + ExperimentationMaxExperimentsReached = 7013, + ExperimentationExperimentSchedulingInProgress = 7014, + ExperimentationInvalidEndDate = 7015, + ExperimentationInvalidStartDate = 7016, + ExperimentationMaxDurationExceeded = 7017, + ExperimentationExclusionGroupNotFound = 7018, + ExperimentationExclusionGroupInsufficientCapacity = 7019, + ExperimentationExclusionGroupCannotDelete = 7020, + ExperimentationExclusionGroupInvalidTrafficAllocation = 7021, + ExperimentationExclusionGroupInvalidName = 7022, + MaxActionDepthExceeded = 8000, + TitleNotOnUpdatedPricingPlan = 9000, + SegmentManagementTitleNotInFlight = 10000, + SegmentManagementNoExpressionTree = 10001, + SegmentManagementTriggerActionCountOverLimit = 10002, + SegmentManagementSegmentCountOverLimit = 10003, + SegmentManagementInvalidSegmentId = 10004, + SegmentManagementInvalidInput = 10005, + SegmentManagementInvalidSegmentName = 10006, + DeleteSegmentRateLimitExceeded = 10007, + CreateSegmentRateLimitExceeded = 10008, + UpdateSegmentRateLimitExceeded = 10009, + GetSegmentsRateLimitExceeded = 10010, + AsyncExportNotInFlight = 10011, + AsyncExportNotFound = 10012, + AsyncExportRateLimitExceeded = 10013, + AnalyticsSegmentCountOverLimit = 10014, + SnapshotNotFound = 11000, + InventoryApiNotImplemented = 12000, + LobbyDoesNotExist = 13000, + LobbyRateLimitExceeded = 13001, + LobbyPlayerAlreadyJoined = 13002, + LobbyNotJoinable = 13003, + LobbyMemberCannotRejoin = 13004, + LobbyCurrentPlayersMoreThanMaxPlayers = 13005, + LobbyPlayerNotPresent = 13006, + LobbyBadRequest = 13007, + LobbyPlayerMaxLobbyLimitExceeded = 13008, + LobbyNewOwnerMustBeConnected = 13009, + LobbyCurrentOwnerStillConnected = 13010, + LobbyMemberIsNotOwner = 13011, + LobbyServerMismatch = 13012, + LobbyServerNotFound = 13013, + LobbyDifferentServerAlreadyJoined = 13014, + LobbyServerAlreadyJoined = 13015, + LobbyIsNotClientOwned = 13016, + LobbyDoesNotUseConnections = 13017, + EventSamplingInvalidRatio = 14000, + EventSamplingInvalidEventNamespace = 14001, + EventSamplingInvalidEventName = 14002, + EventSamplingRatioNotFound = 14003, + TelemetryKeyNotFound = 14200, + TelemetryKeyInvalidName = 14201, + TelemetryKeyAlreadyExists = 14202, + TelemetryKeyInvalid = 14203, + TelemetryKeyCountOverLimit = 14204, + TelemetryKeyDeactivated = 14205, + TelemetryKeyLongInsightsRetentionNotAllowed = 14206, + EventSinkConnectionInvalid = 15000, + EventSinkConnectionUnauthorized = 15001, + EventSinkRegionInvalid = 15002, + EventSinkLimitExceeded = 15003, + EventSinkSasTokenInvalid = 15004, + EventSinkNotFound = 15005, + EventSinkNameInvalid = 15006, + EventSinkSasTokenPermissionInvalid = 15007, + EventSinkSecretInvalid = 15008, + EventSinkTenantNotFound = 15009, + EventSinkAadNotFound = 15010, + EventSinkDatabaseNotFound = 15011, + EventSinkTitleUnauthorized = 15012, + EventSinkInsufficientRoleAssignment = 15013, + EventSinkContainerNotFound = 15014, + EventSinkTenantIdInvalid = 15015, + OperationCanceled = 16000, + InvalidDisplayNameRandomSuffixLength = 17000, + AllowNonUniquePlayerDisplayNamesDisableNotAllowed = 17001, + PartitionedEventInvalid = 18000, + PartitionedEventCountOverLimit = 18001, + ManageEventNamespaceInvalid = 18002, + ManageEventNameInvalid = 18003, + ManagedEventNotFound = 18004, + ManageEventsInvalidRatio = 18005, + ManagedEventInvalid = 18006, + PlayerCustomPropertiesPropertyNameTooLong = 19000, + PlayerCustomPropertiesPropertyNameIsInvalid = 19001, + PlayerCustomPropertiesStringPropertyValueTooLong = 19002, + PlayerCustomPropertiesValueIsInvalidType = 19003, + PlayerCustomPropertiesVersionMismatch = 19004, + PlayerCustomPropertiesPropertyCountTooHigh = 19005, + PlayerCustomPropertiesDuplicatePropertyName = 19006, + PlayerCustomPropertiesPropertyDoesNotExist = 19007, + AddonAlreadyExists = 19008, + AddonDoesntExist = 19009, + CopilotDisabled = 19100, + CopilotInvalidRequest = 19101, + TrueSkillUnauthorized = 20000, + TrueSkillInvalidTitleId = 20001, + TrueSkillInvalidScenarioId = 20002, + TrueSkillInvalidModelId = 20003, + TrueSkillInvalidModelName = 20004, + TrueSkillInvalidPlayerIds = 20005, + TrueSkillInvalidEntityKey = 20006, + TrueSkillInvalidConditionKey = 20007, + TrueSkillInvalidConditionValue = 20008, + TrueSkillInvalidConditionAffinityWeight = 20009, + TrueSkillInvalidEventName = 20010, + TrueSkillMatchResultCreated = 20011, + TrueSkillMatchResultAlreadySubmitted = 20012, + TrueSkillBadPlayerIdInMatchResult = 20013, + TrueSkillInvalidBotIdInMatchResult = 20014, + TrueSkillDuplicatePlayerInMatchResult = 20015, + TrueSkillNoPlayerInMatchResultTeam = 20016, + TrueSkillPlayersInMatchResultExceedingLimit = 20017, + TrueSkillInvalidPreMatchPartyInMatchResult = 20018, + TrueSkillInvalidTimestampInMatchResult = 20019, + TrueSkillStartTimeMissingInMatchResult = 20020, + TrueSkillEndTimeMissingInMatchResult = 20021, + TrueSkillInvalidPlayerSecondsPlayedInMatchResult = 20022, + TrueSkillNoTeamInMatchResult = 20023, + TrueSkillNotEnoughTeamsInMatchResult = 20024, + TrueSkillInvalidRanksInMatchResult = 20025, + TrueSkillNoWinnerInMatchResult = 20026, + TrueSkillMissingRequiredCondition = 20027, + TrueSkillMissingRequiredEvent = 20028, + TrueSkillUnknownEventName = 20029, + TrueSkillInvalidEventCount = 20030, + TrueSkillUnknownConditionKey = 20031, + TrueSkillUnknownConditionValue = 20032, + TrueSkillScenarioConfigDoesNotExist = 20033, + TrueSkillUnknownModelId = 20034, + TrueSkillNoModelInScenario = 20035, + TrueSkillNotSupportedForTitle = 20036, + TrueSkillModelIsNotActive = 20037, + TrueSkillUnauthorizedToQueryOtherPlayerSkills = 20038, + TrueSkillInvalidMaxIterations = 20039, + TrueSkillEndTimeBeforeStartTime = 20040, + TrueSkillInvalidJobId = 20041, + TrueSkillInvalidMetadataId = 20042, + TrueSkillMissingBuildVerison = 20043, + TrueSkillJobAlreadyExists = 20044, + TrueSkillJobNotFound = 20045, + TrueSkillOperationCanceled = 20046, + TrueSkillActiveModelLimitExceeded = 20047, + TrueSkillTotalModelLimitExceeded = 20048, + TrueSkillUnknownInitialModelId = 20049, + TrueSkillUnauthorizedForJob = 20050, + TrueSkillInvalidScenarioName = 20051, + TrueSkillConditionStateIsRequired = 20052, + TrueSkillEventStateIsRequired = 20053, + TrueSkillDuplicateEvent = 20054, + TrueSkillDuplicateCondition = 20055, + TrueSkillInvalidAnomalyThreshold = 20056, + TrueSkillConditionKeyLimitExceeded = 20057, + TrueSkillConditionValuePerKeyLimitExceeded = 20058, + TrueSkillInvalidTimestamp = 20059, + TrueSkillEventLimitExceeded = 20060, + TrueSkillInvalidPlayers = 20061, + TrueSkillTrueSkillPlayerNull = 20062, + TrueSkillInvalidPlayerId = 20063, + TrueSkillInvalidSquadSize = 20064, + TrueSkillConditionSetNotInModel = 20065, + TrueSkillModelStateInvalidForOperation = 20066, + TrueSkillScenarioContainsActiveModel = 20067, + GameSaveManifestNotFound = 20300, + GameSaveManifestVersionAlreadyExists = 20301, + GameSaveConflictUpdatingManifest = 20302, + GameSaveManifestUpdatesNotAllowed = 20303, + GameSaveFileAlreadyExists = 20304, + GameSaveManifestVersionNotFinalized = 20305, + GameSaveUnknownFileInManifest = 20306, + GameSaveFileExceededReportedSize = 20307, + GameSaveFileNotUploaded = 20308, + GameSaveBadRequest = 20309, + GameSaveOperationNotAllowed = 20310, + StateShareForbidden = 21000, + StateShareTitleNotInFlight = 21001, + StateShareStateNotFound = 21002, + StateShareLinkNotFound = 21003, + StateShareStateRedemptionLimitExceeded = 21004, + StateShareStateRedemptionLimitNotUpdated = 21005, + StateShareCreatedStatesLimitExceeded = 21006, + StateShareIdMissingOrMalformed = 21007 + } + + public class PlayFabError + { + public string ApiEndpoint; + public int HttpCode; + public string HttpStatus; + public PlayFabErrorCode Error; + public string ErrorMessage; + public Dictionary> ErrorDetails; + public object CustomData; + public uint? RetryAfterSeconds = null; + + public override string ToString() + { + return GenerateErrorReport(); + } + + [ThreadStatic] + private static StringBuilder _tempSb; + /// + /// This converts the PlayFabError into a human readable string describing the error. + /// If error is not found, it will return the http code, status, and error + /// + /// A description of the error that we just incur. + public string GenerateErrorReport() + { + if (_tempSb == null) + _tempSb = new StringBuilder(); + _tempSb.Length = 0; + if (String.IsNullOrEmpty(ErrorMessage)) + { + _tempSb.Append(ApiEndpoint).Append(": ").Append("Http Code: ").Append(HttpCode.ToString()).Append("\nHttp Status: ").Append(HttpStatus).Append("\nError: ").Append(Error.ToString()).Append("\n"); + } + else + { + _tempSb.Append(ApiEndpoint).Append(": ").Append(ErrorMessage); + } + + if (ErrorDetails != null) + foreach (var pair in ErrorDetails) + foreach (var msg in pair.Value) + _tempSb.Append("\n").Append(pair.Key).Append(": ").Append(msg); + return _tempSb.ToString(); + } + } + + public class PlayFabException : Exception + { + public readonly PlayFabExceptionCode Code; + public PlayFabException(PlayFabExceptionCode code, string message) : base(message) + { + Code = code; + } + } + + public enum PlayFabExceptionCode + { + AuthContextRequired, + BuildError, + DeveloperKeyNotSet, + EntityTokenNotSet, + NotLoggedIn, + TitleNotSet, + } +} diff --git a/Assets/PlayFabSDK/Shared/Internal/PlayFabErrors.cs.meta b/Assets/PlayFabSDK/Shared/Internal/PlayFabErrors.cs.meta new file mode 100644 index 00000000..1104460f --- /dev/null +++ b/Assets/PlayFabSDK/Shared/Internal/PlayFabErrors.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: ed146f2193bb8ef49ad1200eefdab503 +timeCreated: 1468524876 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp.meta b/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp.meta new file mode 100644 index 00000000..ae160e38 --- /dev/null +++ b/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 58c4d401e405a6d4a835532b985aa874 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/GzipDownloadHandler.cs b/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/GzipDownloadHandler.cs new file mode 100644 index 00000000..a9e6368f --- /dev/null +++ b/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/GzipDownloadHandler.cs @@ -0,0 +1,57 @@ +using PlayFab; +using System.Diagnostics; +using System.IO; +using System.IO.Compression; +using UnityEngine.Networking; + +public class GzipDownloadHandler : DownloadHandlerScript +{ + private byte[] _data; + public byte[] Data { get { return _data; } } + + public GzipDownloadHandler() : base() + { + } + + protected override byte[] GetData() { return _data; } + + protected override bool ReceiveData(byte[] data, int dataLength) + { + if (_data == null) + _data = data; + else + { + byte[] newData = new byte[_data.Length + dataLength]; + _data.CopyTo(newData, 0); + data.CopyTo(newData, _data.Length); + _data = newData; + } + return true; + } + + protected override void CompleteContent() + { + try + { + using MemoryStream stream = new MemoryStream(_data); + using GZipStream gZipStream = new GZipStream(stream, CompressionMode.Decompress, true); + + byte[] buffer = new byte[4096]; + using MemoryStream resultStream = new MemoryStream(); + + int read; + while ((read = gZipStream.Read(buffer, 0, buffer.Length)) > 0) + { + resultStream.Write(buffer, 0, read); + } + + _data = resultStream.ToArray(); + } + catch (IOException) + { + // If we fail to decompress, it should be because Unity silently decompressed already, so we should disable this custom handler. + // There is no info on which platforms Unity decompresses on, so we have to assume this is needed until we reach this. + PlayFabSettings.staticSettings.DecompressWithDownloadHandler = false; + } + } +} diff --git a/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/GzipDownloadHandler.cs.meta b/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/GzipDownloadHandler.cs.meta new file mode 100644 index 00000000..e51896e5 --- /dev/null +++ b/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/GzipDownloadHandler.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 40479a6315f18a54a9db2c924e0af5ae +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/IPlayFabHttp.cs b/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/IPlayFabHttp.cs new file mode 100644 index 00000000..2977de03 --- /dev/null +++ b/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/IPlayFabHttp.cs @@ -0,0 +1,61 @@ +using System; +using System.Collections.Generic; +using PlayFab.SharedModels; + +namespace PlayFab.Internal +{ + public enum AuthType + { + None, + PreLoginSession, // Not yet defined + LoginSession, // "X-Authorization" + DevSecretKey, // "X-SecretKey" + EntityToken, // "X-EntityToken" + TelemetryKey // "X-TelemetryKey" + } + + public enum HttpRequestState + { + Sent, + Received, + Idle, + Error + } + + public class CallRequestContainer + { +#if !UNITY_WSA && !UNITY_WP8 + public HttpRequestState HttpState = HttpRequestState.Idle; + public System.Net.HttpWebRequest HttpRequest = null; +#endif +#if PLAYFAB_REQUEST_TIMING + public PlayFabHttp.RequestTiming Timing; + public System.Diagnostics.Stopwatch Stopwatch; +#endif + + // This class stores the state of the request and all associated data + public string ApiEndpoint = null; + public string FullUrl = null; + public byte[] Payload = null; + public string JsonResponse = null; + public PlayFabRequestCommon ApiRequest; + public Dictionary RequestHeaders; + public PlayFabResultCommon ApiResult; + public PlayFabError Error; + public Action DeserializeResultJson; + public Action InvokeSuccessCallback; + public Action ErrorCallback; + public object CustomData = null; + public PlayFabApiSettings settings; + public PlayFabAuthenticationContext context; + public IPlayFabInstanceApi instanceApi; + public bool CalledGetResponse = false; + + public CallRequestContainer() + { +#if PLAYFAB_REQUEST_TIMING + Stopwatch = System.Diagnostics.Stopwatch.StartNew(); +#endif + } + } +} diff --git a/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/IPlayFabHttp.cs.meta b/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/IPlayFabHttp.cs.meta new file mode 100644 index 00000000..00621125 --- /dev/null +++ b/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/IPlayFabHttp.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: aeac58284b4b1cd4ab93ab0e71ba8540 +timeCreated: 1462745280 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/PlayFabHTTP.cs b/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/PlayFabHTTP.cs new file mode 100644 index 00000000..23894d90 --- /dev/null +++ b/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/PlayFabHTTP.cs @@ -0,0 +1,504 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Text; +using PlayFab.Public; +using PlayFab.SharedModels; +using UnityEngine; + +namespace PlayFab.Internal +{ + /// + /// This is a wrapper for Http So we can better separate the functionaity of Http Requests delegated to WWW or HttpWebRequest + /// + public class PlayFabHttp : SingletonMonoBehaviour + { + private static List _apiCallQueue = new List(); // Starts initialized, and is nulled when it's flushed + + public delegate void ApiProcessingEvent(TEventArgs e); + public delegate void ApiProcessErrorEvent(PlayFabRequestCommon request, PlayFabError error); + public static event ApiProcessingEvent ApiProcessingEventHandler; + public static event ApiProcessErrorEvent ApiProcessingErrorEventHandler; + public static readonly Dictionary GlobalHeaderInjection = new Dictionary(); + + private static IPlayFabLogger _logger; +#if !DISABLE_PLAYFABENTITY_API && !DISABLE_PLAYFABCLIENT_API + private static IScreenTimeTracker screenTimeTracker = new ScreenTimeTracker(); + private const float delayBetweenBatches = 5.0f; +#endif + +#if PLAYFAB_REQUEST_TIMING + public struct RequestTiming + { + public DateTime StartTimeUtc; + public string ApiEndpoint; + public int WorkerRequestMs; + public int MainThreadRequestMs; + } + + public delegate void ApiRequestTimingEvent(RequestTiming time); + public static event ApiRequestTimingEvent ApiRequestTimingEventHandler; +#endif + + /// + /// Return the number of api calls that are waiting for results from the server + /// + /// + public static int GetPendingMessages() + { + var transport = PluginManager.GetPlugin(PluginContract.PlayFab_Transport); + return transport.IsInitialized ? transport.GetPendingMessages() : 0; + } + + /// + /// This initializes the GameObject and ensures it is in the scene. + /// + public static void InitializeHttp() + { + if (string.IsNullOrEmpty(PlayFabSettings.TitleId)) + throw new PlayFabException(PlayFabExceptionCode.TitleNotSet, "You must set PlayFabSettings.TitleId before making API Calls."); + var transport = PluginManager.GetPlugin(PluginContract.PlayFab_Transport); + if (transport.IsInitialized) + return; + + transport.Initialize(); + CreateInstance(); // Invoke the SingletonMonoBehaviour + } + + /// + /// This initializes the GameObject and ensures it is in the scene. + /// + public static void InitializeLogger(IPlayFabLogger setLogger = null) + { + if (_logger != null) + throw new InvalidOperationException("Once initialized, the logger cannot be reset."); + if (setLogger == null) + setLogger = new PlayFabLogger(); + _logger = setLogger; + } + +#if !DISABLE_PLAYFABENTITY_API && !DISABLE_PLAYFABCLIENT_API + /// + /// This initializes ScreenTimeTracker object and notifying it to start sending info. + /// + /// Result of the user's login, represent user ID + public static void InitializeScreenTimeTracker(string entityId, string entityType, string playFabUserId) + { + screenTimeTracker.ClientSessionStart(entityId, entityType, playFabUserId); + instance.StartCoroutine(SendScreenTimeEvents(delayBetweenBatches)); + } + + /// + /// This function will send Screen Time events on a periodic basis. + /// + /// Delay between batches, in seconds + private static IEnumerator SendScreenTimeEvents(float secondsBetweenBatches) + { + WaitForSeconds delay = new WaitForSeconds(secondsBetweenBatches); + + while (!PlayFabSettings.DisableFocusTimeCollection) + { + screenTimeTracker.Send(); + yield return delay; + } + } +#endif + + public static void SimpleGetCall(string fullUrl, Action successCallback, Action errorCallback) + { + InitializeHttp(); + PluginManager.GetPlugin(PluginContract.PlayFab_Transport).SimpleGetCall(fullUrl, successCallback, errorCallback); + } + + + public static void SimplePutCall(string fullUrl, byte[] payload, Action successCallback, Action errorCallback) + { + InitializeHttp(); + PluginManager.GetPlugin(PluginContract.PlayFab_Transport).SimplePutCall(fullUrl, payload, successCallback, errorCallback); + } + + public static void SimplePostCall(string fullUrl, byte[] payload, Action successCallback, Action errorCallback) + { + InitializeHttp(); + PluginManager.GetPlugin(PluginContract.PlayFab_Transport).SimplePostCall(fullUrl, payload, successCallback, errorCallback); + } + + protected internal static void MakeApiCall(string apiEndpoint, + PlayFabRequestCommon request, AuthType authType, Action resultCallback, + Action errorCallback, object customData = null, Dictionary extraHeaders = null, PlayFabAuthenticationContext authenticationContext = null, PlayFabApiSettings apiSettings = null, IPlayFabInstanceApi instanceApi = null) + where TResult : PlayFabResultCommon + { + apiSettings = apiSettings ?? PlayFabSettings.staticSettings; + var fullUrl = apiSettings.GetFullUrl(apiEndpoint, apiSettings.RequestGetParams); + _MakeApiCall(apiEndpoint, fullUrl, request, authType, resultCallback, errorCallback, customData, extraHeaders, false, authenticationContext, apiSettings, instanceApi); + } + + protected internal static void MakeApiCallWithFullUri(string fullUri, + PlayFabRequestCommon request, AuthType authType, Action resultCallback, + Action errorCallback, object customData = null, Dictionary extraHeaders = null, PlayFabAuthenticationContext authenticationContext = null, PlayFabApiSettings apiSettings = null, IPlayFabInstanceApi instanceApi = null) + where TResult : PlayFabResultCommon + { + apiSettings = apiSettings ?? PlayFabSettings.staticSettings; + // This will not be called if environment file does not exist or does not contain property the debugging URI + _MakeApiCall(null, fullUri, request, authType, resultCallback, errorCallback, customData, extraHeaders, false, authenticationContext, apiSettings, instanceApi); + } + + /// + /// Internal method for Make API Calls + /// + private static void _MakeApiCall(string apiEndpoint, string fullUrl, + PlayFabRequestCommon request, AuthType authType, Action resultCallback, + Action errorCallback, object customData, Dictionary extraHeaders, bool allowQueueing, PlayFabAuthenticationContext authenticationContext, PlayFabApiSettings apiSettings, IPlayFabInstanceApi instanceApi) + where TResult : PlayFabResultCommon + { + InitializeHttp(); + SendEvent(apiEndpoint, request, null, ApiProcessingEventType.Pre); + + var serializer = PluginManager.GetPlugin(PluginContract.PlayFab_Serializer); + var reqContainer = new CallRequestContainer + { + ApiEndpoint = apiEndpoint, + FullUrl = fullUrl, + settings = apiSettings, + context = authenticationContext, + CustomData = customData, + Payload = Encoding.UTF8.GetBytes(serializer.SerializeObject(request)), + ApiRequest = request, + ErrorCallback = errorCallback, + RequestHeaders = extraHeaders ?? new Dictionary(), // Use any headers provided by the customer + instanceApi = instanceApi + }; + // Append any additional headers + foreach (var pair in GlobalHeaderInjection) + if (!reqContainer.RequestHeaders.ContainsKey(pair.Key)) + reqContainer.RequestHeaders[pair.Key] = pair.Value; + +#if PLAYFAB_REQUEST_TIMING + reqContainer.Timing.StartTimeUtc = DateTime.UtcNow; + reqContainer.Timing.ApiEndpoint = apiEndpoint; +#endif + + // Add PlayFab Headers + var transport = PluginManager.GetPlugin(PluginContract.PlayFab_Transport); + reqContainer.RequestHeaders["X-ReportErrorAsSuccess"] = "true"; // Makes processing PlayFab errors a little easier + reqContainer.RequestHeaders["X-PlayFabSDK"] = PlayFabSettings.VersionString; // Tell PlayFab which SDK this is + switch (authType) + { +#if ENABLE_PLAYFABSERVER_API || ENABLE_PLAYFABADMIN_API || UNITY_EDITOR || ENABLE_PLAYFAB_SECRETKEY + case AuthType.DevSecretKey: + if (apiSettings.DeveloperSecretKey == null) throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "DeveloperSecretKey is not found in Request, Server Instance or PlayFabSettings"); + reqContainer.RequestHeaders["X-SecretKey"] = apiSettings.DeveloperSecretKey; break; +#endif +#if !DISABLE_PLAYFABCLIENT_API + case AuthType.LoginSession: + if (authenticationContext != null) + reqContainer.RequestHeaders["X-Authorization"] = authenticationContext.ClientSessionTicket; + break; +#endif +#if !DISABLE_PLAYFABENTITY_API + case AuthType.EntityToken: + if (authenticationContext != null) + reqContainer.RequestHeaders["X-EntityToken"] = authenticationContext.EntityToken; + break; +#endif + case AuthType.TelemetryKey: + if (authenticationContext != null) + reqContainer.RequestHeaders["X-TelemetryKey"] = authenticationContext.TelemetryKey; + break; + } + + // These closures preserve the TResult generic information in a way that's safe for all the devices + reqContainer.DeserializeResultJson = () => + { + reqContainer.ApiResult = serializer.DeserializeObject(reqContainer.JsonResponse); + }; + reqContainer.InvokeSuccessCallback = () => + { + if (resultCallback != null) + { + resultCallback((TResult)reqContainer.ApiResult); + } + }; + + if (allowQueueing && _apiCallQueue != null) + { + for (var i = _apiCallQueue.Count - 1; i >= 0; i--) + if (_apiCallQueue[i].ApiEndpoint == apiEndpoint) + _apiCallQueue.RemoveAt(i); + _apiCallQueue.Add(reqContainer); + } + else + { + transport.MakeApiCall(reqContainer); + } + } + + /// + /// Internal code shared by IPlayFabHTTP implementations + /// + internal void OnPlayFabApiResult(CallRequestContainer reqContainer) + { + var result = reqContainer.ApiResult; + +#if !DISABLE_PLAYFABENTITY_API + + var entRes = result as AuthenticationModels.GetEntityTokenResponse; + if (entRes != null) + { + PlayFabSettings.staticPlayer.EntityToken = entRes.EntityToken; + } + +#endif +#if !DISABLE_PLAYFABCLIENT_API + var logRes = result as ClientModels.LoginResult; + var regRes = result as ClientModels.RegisterPlayFabUserResult; + if (logRes != null) + { + logRes.AuthenticationContext = new PlayFabAuthenticationContext(logRes.SessionTicket, logRes.EntityToken.EntityToken, logRes.PlayFabId, logRes.EntityToken.Entity.Id, logRes.EntityToken.Entity.Type); + if (reqContainer.context != null) + reqContainer.context.CopyFrom(logRes.AuthenticationContext); + } + else if (regRes != null) + { + regRes.AuthenticationContext = new PlayFabAuthenticationContext(regRes.SessionTicket, regRes.EntityToken.EntityToken, regRes.PlayFabId, regRes.EntityToken.Entity.Id, regRes.EntityToken.Entity.Type); + if (reqContainer.context != null) + reqContainer.context.CopyFrom(regRes.AuthenticationContext); + } +#endif + } + + /// + /// MonoBehaviour OnEnable Method + /// + private void OnEnable() + { + if (_logger != null) + { + _logger.OnEnable(); + } + +#if !DISABLE_PLAYFABENTITY_API && !DISABLE_PLAYFABCLIENT_API + if ((screenTimeTracker != null) && !PlayFabSettings.DisableFocusTimeCollection) + { + screenTimeTracker.OnEnable(); + } +#endif + } + + /// + /// MonoBehaviour OnDisable + /// + private void OnDisable() + { + if (_logger != null) + { + _logger.OnDisable(); + } + +#if !DISABLE_PLAYFABENTITY_API && !DISABLE_PLAYFABCLIENT_API + if ((screenTimeTracker != null) && !PlayFabSettings.DisableFocusTimeCollection) + { + screenTimeTracker.OnDisable(); + } +#endif + } + + /// + /// MonoBehaviour OnDestroy + /// + private void OnDestroy() + { + var transport = PluginManager.GetPlugin(PluginContract.PlayFab_Transport); + if (transport.IsInitialized) + { + transport.OnDestroy(); + } + + if (_logger != null) + { + _logger.OnDestroy(); + } + +#if !DISABLE_PLAYFABENTITY_API && !DISABLE_PLAYFABCLIENT_API + if ((screenTimeTracker != null) && !PlayFabSettings.DisableFocusTimeCollection) + { + screenTimeTracker.OnDestroy(); + } +#endif + } + + /// + /// MonoBehaviour OnApplicationFocus + /// + public void OnApplicationFocus(bool isFocused) + { +#if !DISABLE_PLAYFABENTITY_API && !DISABLE_PLAYFABCLIENT_API + if ((screenTimeTracker != null) && !PlayFabSettings.DisableFocusTimeCollection) + { + screenTimeTracker.OnApplicationFocus(isFocused); + } +#endif + } + + /// + /// MonoBehaviour OnApplicationQuit + /// + public void OnApplicationQuit() + { +#if !DISABLE_PLAYFABENTITY_API && !DISABLE_PLAYFABCLIENT_API + if ((screenTimeTracker != null) && !PlayFabSettings.DisableFocusTimeCollection) + { + screenTimeTracker.OnApplicationQuit(); + } +#endif + } + + /// + /// MonoBehaviour Update + /// + private void Update() + { + var transport = PluginManager.GetPlugin(PluginContract.PlayFab_Transport); + if (transport.IsInitialized) + { + if (_apiCallQueue != null) + { + foreach (var eachRequest in _apiCallQueue) + transport.MakeApiCall(eachRequest); // Flush the queue + _apiCallQueue = null; // null this after it's flushed + } + transport.Update(); + } + + while (_injectedCoroutines.Count > 0) + StartCoroutine(_injectedCoroutines.Dequeue()); + + while (_injectedAction.Count > 0) + { + var action = _injectedAction.Dequeue(); + if (action != null) + { + action.Invoke(); + } + } + } + + #region Helpers + protected internal static PlayFabError GeneratePlayFabError(string apiEndpoint, string json, object customData) + { + Dictionary errorDict = null; + Dictionary> errorDetails = null; + var serializer = PluginManager.GetPlugin(PluginContract.PlayFab_Serializer); + try + { + // Deserialize the error + errorDict = serializer.DeserializeObject>(json); + } + catch (Exception) { /* Unusual, but shouldn't actually matter */ } + try + { + object errorDetailsString; + if (errorDict != null && errorDict.TryGetValue("errorDetails", out errorDetailsString)) + errorDetails = serializer.DeserializeObject>>(errorDetailsString.ToString()); + } + catch (Exception) { /* Unusual, but shouldn't actually matter */ } + + return new PlayFabError + { + ApiEndpoint = apiEndpoint, + HttpCode = errorDict != null && errorDict.ContainsKey("code") ? Convert.ToInt32(errorDict["code"]) : 400, + HttpStatus = errorDict != null && errorDict.ContainsKey("status") ? (string)errorDict["status"] : "BadRequest", + Error = errorDict != null && errorDict.ContainsKey("errorCode") ? (PlayFabErrorCode)Convert.ToInt32(errorDict["errorCode"]) : PlayFabErrorCode.ServiceUnavailable, + ErrorMessage = errorDict != null && errorDict.ContainsKey("errorMessage") ? (string)errorDict["errorMessage"] : json, + ErrorDetails = errorDetails, + CustomData = customData, + RetryAfterSeconds = errorDict != null && errorDict.ContainsKey("retryAfterSeconds") ? Convert.ToUInt32(errorDict["retryAfterSeconds"]) : (uint?)null, + }; + } + + protected internal static void SendErrorEvent(PlayFabRequestCommon request, PlayFabError error) + { + if (ApiProcessingErrorEventHandler == null) + return; + + try + { + ApiProcessingErrorEventHandler(request, error); + } + catch (Exception e) + { + Debug.LogException(e); + } + } + + protected internal static void SendEvent(string apiEndpoint, PlayFabRequestCommon request, PlayFabResultCommon result, ApiProcessingEventType eventType) + { + if (ApiProcessingEventHandler == null) + return; + try + { + ApiProcessingEventHandler(new ApiProcessingEventArgs + { + ApiEndpoint = apiEndpoint, + EventType = eventType, + Request = request, + Result = result + }); + } + catch (Exception e) + { + Debug.LogException(e); + } + } + + public static void ClearAllEvents() + { + ApiProcessingEventHandler = null; + ApiProcessingErrorEventHandler = null; + } + +#if PLAYFAB_REQUEST_TIMING + protected internal static void SendRequestTiming(RequestTiming rt) + { + if (ApiRequestTimingEventHandler != null) + { + ApiRequestTimingEventHandler(rt); + } + } +#endif + #endregion + private readonly Queue _injectedCoroutines = new Queue(); + private readonly Queue _injectedAction = new Queue(); + + public void InjectInUnityThread(IEnumerator x) + { + _injectedCoroutines.Enqueue(x); + } + + public void InjectInUnityThread(Action action) + { + _injectedAction.Enqueue(action); + } + } + + #region Event Classes + public enum ApiProcessingEventType + { + Pre, + Post + } + + public class ApiProcessingEventArgs + { + public string ApiEndpoint; + public ApiProcessingEventType EventType; + public PlayFabRequestCommon Request; + public PlayFabResultCommon Result; + + public TRequest GetRequest() where TRequest : PlayFabRequestCommon + { + return Request as TRequest; + } + } + #endregion +} diff --git a/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/PlayFabHTTP.cs.meta b/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/PlayFabHTTP.cs.meta new file mode 100644 index 00000000..646a626b --- /dev/null +++ b/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/PlayFabHTTP.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 97a8a3caac8b73541aa8a9a1e330f479 +timeCreated: 1462575707 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/PlayFabUnityHttp.cs b/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/PlayFabUnityHttp.cs new file mode 100644 index 00000000..98d2c4c9 --- /dev/null +++ b/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/PlayFabUnityHttp.cs @@ -0,0 +1,273 @@ +#if UNITY_2017_2_OR_NEWER + +using PlayFab.SharedModels; +using System; +using System.Collections; +using System.IO; +using UnityEngine; +using UnityEngine.Networking; + +namespace PlayFab.Internal +{ + public class PlayFabUnityHttp : ITransportPlugin + { + private bool _isInitialized = false; + private readonly int _pendingWwwMessages = 0; + + public bool IsInitialized { get { return _isInitialized; } } + + public void Initialize() { _isInitialized = true; } + + public void Update() { } + + public void OnDestroy() { } + + public void SimpleGetCall(string fullUrl, Action successCallback, Action errorCallback) + { + PlayFabHttp.instance.StartCoroutine(SimpleCallCoroutine("get", fullUrl, null, successCallback, errorCallback)); + } + + public void SimplePutCall(string fullUrl, byte[] payload, Action successCallback, Action errorCallback) + { + PlayFabHttp.instance.StartCoroutine(SimpleCallCoroutine("put", fullUrl, payload, successCallback, errorCallback)); + } + + public void SimplePostCall(string fullUrl, byte[] payload, Action successCallback, Action errorCallback) + { + PlayFabHttp.instance.StartCoroutine(SimpleCallCoroutine("post", fullUrl, payload, successCallback, errorCallback)); + } + + private static IEnumerator SimpleCallCoroutine(string method, string fullUrl, byte[] payload, Action successCallback, Action errorCallback) + { + if (payload == null) + { + using (UnityWebRequest www = UnityWebRequest.Get(fullUrl)) + { + if (PlayFabSettings.staticSettings.CompressResponses) + { + www.SetRequestHeader("Accept-Encoding", "gzip"); + + if (PlayFabSettings.staticSettings.DecompressWithDownloadHandler) + { + www.downloadHandler = new GzipDownloadHandler(); + } + } + +#if UNITY_2017_2_OR_NEWER + yield return www.SendWebRequest(); +#else + yield return www.Send(); +#endif + + if (!string.IsNullOrEmpty(www.error)) + errorCallback(www.error); + else + successCallback(www.downloadHandler.data); + }; + } + else + { + + UnityWebRequest request; + if (method == "put") + { + request = UnityWebRequest.Put(fullUrl, payload); + } + else + { + request = new UnityWebRequest(fullUrl, "POST"); + request.uploadHandler = (UploadHandler)new UploadHandlerRaw(payload); + request.SetRequestHeader("Content-Type", "application/json"); + + if (PlayFabSettings.staticSettings.CompressResponses) + { + request.SetRequestHeader("Accept-Encoding", "gzip"); + request.downloadHandler = PlayFabSettings.staticSettings.DecompressWithDownloadHandler ? new GzipDownloadHandler() + : new DownloadHandlerBuffer(); + } + else + { + request.downloadHandler = new DownloadHandlerBuffer(); + } + } + + +#if UNITY_2017_2_OR_NEWER +#if !UNITY_2019_1_OR_NEWER + request.chunkedTransfer = false; // can be removed after Unity's PUT will be more stable +#endif + yield return request.SendWebRequest(); +#else + yield return request.Send(); +#endif + +#if UNITY_2020_1_OR_NEWER + if (request.result == UnityWebRequest.Result.ConnectionError || request.result == UnityWebRequest.Result.ProtocolError) +#else + if (request.isNetworkError || request.isHttpError) +#endif + { + errorCallback(request.error); + } + else + { + successCallback(request.downloadHandler.data); + } + + request.Dispose(); + } + } + + public void MakeApiCall(object reqContainerObj) + { + CallRequestContainer reqContainer = (CallRequestContainer)reqContainerObj; + reqContainer.RequestHeaders["Content-Type"] = "application/json"; + + // Start the www corouting to Post, and get a response or error which is then passed to the callbacks. + PlayFabHttp.instance.StartCoroutine(Post(reqContainer)); + } + + private IEnumerator Post(CallRequestContainer reqContainer) + { +#if PLAYFAB_REQUEST_TIMING + var stopwatch = System.Diagnostics.Stopwatch.StartNew(); + var startTime = DateTime.UtcNow; +#endif + + using var www = new UnityWebRequest(reqContainer.FullUrl) + { + uploadHandler = new UploadHandlerRaw(reqContainer.Payload), + method = "POST" + }; + + if (reqContainer.settings.CompressResponses) + { + www.SetRequestHeader("Accept-Encoding", "gzip"); + www.downloadHandler = reqContainer.settings.DecompressWithDownloadHandler ? new GzipDownloadHandler() + : new DownloadHandlerBuffer(); + } + else + { + www.downloadHandler = new DownloadHandlerBuffer(); + } + + foreach (var headerPair in reqContainer.RequestHeaders) + { + if (!string.IsNullOrEmpty(headerPair.Key) && !string.IsNullOrEmpty(headerPair.Value)) + www.SetRequestHeader(headerPair.Key, headerPair.Value); + else + Debug.LogWarning("Null header: " + headerPair.Key + " = " + headerPair.Value); + } + +#if UNITY_2017_2_OR_NEWER + yield return www.SendWebRequest(); +#else + yield return www.Send(); +#endif + +#if PLAYFAB_REQUEST_TIMING + stopwatch.Stop(); + var timing = new PlayFabHttp.RequestTiming { + StartTimeUtc = startTime, + ApiEndpoint = reqContainer.ApiEndpoint, + WorkerRequestMs = (int)stopwatch.ElapsedMilliseconds, + MainThreadRequestMs = (int)stopwatch.ElapsedMilliseconds + }; + PlayFabHttp.SendRequestTiming(timing); +#endif + + if (!string.IsNullOrEmpty(www.error)) + { + OnError(www.error, reqContainer); + } + else + { + try + { + byte[] responseBytes = www.downloadHandler.data; + string responseText = System.Text.Encoding.UTF8.GetString(responseBytes, 0, responseBytes.Length); + OnResponse(responseText, reqContainer); + } + catch (Exception e) + { + OnError("Unhandled error in PlayFabUnityHttp: " + e, reqContainer); + } + } + www.Dispose(); + } + + public int GetPendingMessages() + { + return _pendingWwwMessages; + } + + public void OnResponse(string response, CallRequestContainer reqContainer) + { + try + { +#if PLAYFAB_REQUEST_TIMING + var startTime = DateTime.UtcNow; +#endif + var serializer = PluginManager.GetPlugin(PluginContract.PlayFab_Serializer); + var httpResult = serializer.DeserializeObject(response); + + if (httpResult.code == 200) + { + // We have a good response from the server + reqContainer.JsonResponse = serializer.SerializeObject(httpResult.data); + reqContainer.DeserializeResultJson(); + reqContainer.ApiResult.Request = reqContainer.ApiRequest; + reqContainer.ApiResult.CustomData = reqContainer.CustomData; + + PlayFabHttp.instance.OnPlayFabApiResult(reqContainer); +#if !DISABLE_PLAYFABCLIENT_API + PlayFabDeviceUtil.OnPlayFabLogin(reqContainer.ApiResult, reqContainer.settings, reqContainer.instanceApi); +#endif + try + { + PlayFabHttp.SendEvent(reqContainer.ApiEndpoint, reqContainer.ApiRequest, reqContainer.ApiResult, ApiProcessingEventType.Post); + } + catch (Exception e) + { + Debug.LogException(e); + } + + try + { + reqContainer.InvokeSuccessCallback(); + } + catch (Exception e) + { + Debug.LogException(e); + } + } + else + { + if (reqContainer.ErrorCallback != null) + { + reqContainer.Error = PlayFabHttp.GeneratePlayFabError(reqContainer.ApiEndpoint, response, reqContainer.CustomData); + PlayFabHttp.SendErrorEvent(reqContainer.ApiRequest, reqContainer.Error); + reqContainer.ErrorCallback(reqContainer.Error); + } + } + } + catch (Exception e) + { + Debug.LogException(e); + } + } + + public void OnError(string error, CallRequestContainer reqContainer) + { + reqContainer.JsonResponse = error; + if (reqContainer.ErrorCallback != null) + { + reqContainer.Error = PlayFabHttp.GeneratePlayFabError(reqContainer.ApiEndpoint, reqContainer.JsonResponse, reqContainer.CustomData); + PlayFabHttp.SendErrorEvent(reqContainer.ApiRequest, reqContainer.Error); + reqContainer.ErrorCallback(reqContainer.Error); + } + } + } +} + +#endif diff --git a/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/PlayFabUnityHttp.cs.meta b/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/PlayFabUnityHttp.cs.meta new file mode 100644 index 00000000..9d9a8f47 --- /dev/null +++ b/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/PlayFabUnityHttp.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: fdda21a9c6bb5c74d85422afab113b0f +timeCreated: 1512617003 +licenseType: Pro +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/PlayFabWWW.cs b/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/PlayFabWWW.cs new file mode 100644 index 00000000..42e37818 --- /dev/null +++ b/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/PlayFabWWW.cs @@ -0,0 +1,219 @@ +#if !UNITY_2018_2_OR_NEWER // Unity has deprecated Www +using System; +using System.Collections; +using System.IO; +using PlayFab.Json; +using PlayFab.SharedModels; +using UnityEngine; +#if UNITY_5_4_OR_NEWER +using UnityEngine.Networking; +#else +using UnityEngine.Experimental.Networking; +#endif + +namespace PlayFab.Internal +{ + public class PlayFabWww : ITransportPlugin + { + private bool _isInitialized = false; + private int _pendingWwwMessages = 0; + + public bool IsInitialized { get { return _isInitialized; } } + + public void Initialize() + { + _isInitialized = true; + } + + public void Update() { } + public void OnDestroy() { } + + public void SimpleGetCall(string fullUrl, Action successCallback, Action errorCallback) + { + PlayFabHttp.instance.StartCoroutine(SimpleCallCoroutine("get", fullUrl, null, successCallback, errorCallback)); + } + + public void SimplePutCall(string fullUrl, byte[] payload, Action successCallback, Action errorCallback) + { + PlayFabHttp.instance.StartCoroutine(SimpleCallCoroutine("put", fullUrl, payload, successCallback, errorCallback)); + } + + public void SimplePostCall(string fullUrl, byte[] payload, Action successCallback, Action errorCallback) + { + PlayFabHttp.instance.StartCoroutine(SimpleCallCoroutine("post", fullUrl, payload, successCallback, errorCallback)); + } + + private static IEnumerator SimpleCallCoroutine(string method, string fullUrl, byte[] payload, Action successCallback, Action errorCallback) + { + if (payload == null) + { + var www = new WWW(fullUrl); + yield return www; + if (!string.IsNullOrEmpty(www.error)) + errorCallback(www.error); + else + successCallback(www.bytes); + } + else + { + UnityWebRequest request; + if (method == "put") + { + request = UnityWebRequest.Put(fullUrl, payload); + } + else + { + var strPayload = System.Text.Encoding.UTF8.GetString(payload, 0, payload.Length); + request = UnityWebRequest.Post(fullUrl, strPayload); + } + +#if UNITY_2017_2_OR_NEWER + request.chunkedTransfer = false; // can be removed after Unity's PUT will be more stable + request.SendWebRequest(); +#else + request.Send(); +#endif + +#if !UNITY_WEBGL + while (request.uploadProgress < 1 || request.downloadProgress < 1) + { + yield return 1; + } +#else + while (!request.isDone) + { + yield return 1; + } +#endif + + if (!string.IsNullOrEmpty(request.error)) + errorCallback(request.error); + else + successCallback(request.downloadHandler.data); + } + } + + public void MakeApiCall(object reqContainerObj) + { + CallRequestContainer reqContainer = (CallRequestContainer)reqContainerObj; + reqContainer.RequestHeaders["Content-Type"] = "application/json"; + + //Debug.LogFormat("Posting {0} to Url: {1}", req.Trim(), url); + var www = new WWW(reqContainer.FullUrl, reqContainer.Payload, reqContainer.RequestHeaders); + +#if PLAYFAB_REQUEST_TIMING + var stopwatch = System.Diagnostics.Stopwatch.StartNew(); +#endif + + // Start the www corouting to Post, and get a response or error which is then passed to the callbacks. + Action wwwSuccessCallback = (response) => + { + try + { +#if PLAYFAB_REQUEST_TIMING + var startTime = DateTime.UtcNow; +#endif + var serializer = PluginManager.GetPlugin(PluginContract.PlayFab_Serializer); + var httpResult = serializer.DeserializeObject(response); + + if (httpResult.code == 200) + { + // We have a good response from the server + reqContainer.JsonResponse = serializer.SerializeObject(httpResult.data); + reqContainer.DeserializeResultJson(); + reqContainer.ApiResult.Request = reqContainer.ApiRequest; + reqContainer.ApiResult.CustomData = reqContainer.CustomData; + + PlayFabHttp.instance.OnPlayFabApiResult(reqContainer); +#if !DISABLE_PLAYFABCLIENT_API + PlayFabDeviceUtil.OnPlayFabLogin(reqContainer.ApiResult, reqContainer.settings, reqContainer.instanceApi); +#endif + + try + { + PlayFabHttp.SendEvent(reqContainer.ApiEndpoint, reqContainer.ApiRequest, reqContainer.ApiResult, ApiProcessingEventType.Post); + } + catch (Exception e) + { + Debug.LogException(e); + } + +#if PLAYFAB_REQUEST_TIMING + stopwatch.Stop(); + var timing = new PlayFabHttp.RequestTiming { + StartTimeUtc = startTime, + ApiEndpoint = reqContainer.ApiEndpoint, + WorkerRequestMs = (int)stopwatch.ElapsedMilliseconds, + MainThreadRequestMs = (int)stopwatch.ElapsedMilliseconds + }; + PlayFabHttp.SendRequestTiming(timing); +#endif + try + { + reqContainer.InvokeSuccessCallback(); + } + catch (Exception e) + { + Debug.LogException(e); + } + } + else + { + if (reqContainer.ErrorCallback != null) + { + reqContainer.Error = PlayFabHttp.GeneratePlayFabError(reqContainer.ApiEndpoint, response, reqContainer.CustomData); + PlayFabHttp.SendErrorEvent(reqContainer.ApiRequest, reqContainer.Error); + reqContainer.ErrorCallback(reqContainer.Error); + } + } + } + catch (Exception e) + { + Debug.LogException(e); + } + }; + + Action wwwErrorCallback = (errorCb) => + { + reqContainer.JsonResponse = errorCb; + if (reqContainer.ErrorCallback != null) + { + reqContainer.Error = PlayFabHttp.GeneratePlayFabError(reqContainer.ApiEndpoint, reqContainer.JsonResponse, reqContainer.CustomData); + PlayFabHttp.SendErrorEvent(reqContainer.ApiRequest, reqContainer.Error); + reqContainer.ErrorCallback(reqContainer.Error); + } + }; + + PlayFabHttp.instance.StartCoroutine(PostPlayFabApiCall(www, wwwSuccessCallback, wwwErrorCallback)); + } + + private IEnumerator PostPlayFabApiCall(WWW www, Action wwwSuccessCallback, Action wwwErrorCallback) + { + yield return www; + if (!string.IsNullOrEmpty(www.error)) + { + wwwErrorCallback(www.error); + } + else + { + try + { + byte[] responseBytes = www.bytes; + string responseText = System.Text.Encoding.UTF8.GetString(responseBytes, 0, responseBytes.Length); + wwwSuccessCallback(responseText); + } + catch (Exception e) + { + wwwErrorCallback("Unhandled error in PlayFabWWW: " + e); + } + } + www.Dispose(); + } + + public int GetPendingMessages() + { + return _pendingWwwMessages; + } + } +} +#endif diff --git a/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/PlayFabWWW.cs.meta b/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/PlayFabWWW.cs.meta new file mode 100644 index 00000000..6159d82f --- /dev/null +++ b/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/PlayFabWWW.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 71ae810a641b9644187c8824db5ff1fe +timeCreated: 1462745593 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/PlayFabWebRequest.cs b/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/PlayFabWebRequest.cs new file mode 100644 index 00000000..014774ce --- /dev/null +++ b/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/PlayFabWebRequest.cs @@ -0,0 +1,544 @@ +#if !UNITY_WSA && !UNITY_WP8 + +using System; +using UnityEngine; +using System.Collections.Generic; +using System.IO; +using System.Net; +using System.Threading; +using PlayFab.SharedModels; +#if !DISABLE_PLAYFABCLIENT_API +using PlayFab.ClientModels; +#endif + +namespace PlayFab.Internal +{ + public class PlayFabWebRequest : ITransportPlugin + { + /// + /// Disable encryption certificate validation within PlayFabWebRequest using this request. + /// This is not generally recommended. + /// As of early 2018: + /// None of the built-in Unity mechanisms validate the certificate, using .Net 3.5 equivalent runtime + /// It is also not currently feasible to provide a single cross platform solution that will correctly validate a certificate. + /// The Risk: + /// All Unity HTTPS mechanisms are vulnerable to Man-In-The-Middle attacks. + /// The only more-secure option is to define a custom CustomCertValidationHook, specifically tailored to the platforms you support, + /// which validate the cert based on a list of trusted certificate providers. This list of providers must be able to update itself, as the + /// base certificates for those providers will also expire and need updating on a regular basis. + /// + public static void SkipCertificateValidation() + { + var rcvc = new System.Net.Security.RemoteCertificateValidationCallback(AcceptAllCertifications); //(sender, cert, chain, ssl) => true + ServicePointManager.ServerCertificateValidationCallback = rcvc; + certValidationSet = true; + } + + /// + /// Provide PlayFabWebRequest with a custom ServerCertificateValidationCallback which can be used to validate the PlayFab encryption certificate. + /// Please do not: + /// - Hard code the current PlayFab certificate information - The PlayFab certificate updates itself on a regular schedule, and your game will fail and require a republish to fix + /// - Hard code a list of static certificate authorities - Any single exported list of certificate authorities will become out of date, and have the same problem when the CA cert expires + /// Real solution: + /// - A mechanism where a valid certificate authority list can be securely downloaded and updated without republishing the client when existing certificates expire. + /// + public static System.Net.Security.RemoteCertificateValidationCallback CustomCertValidationHook + { + set + { + ServicePointManager.ServerCertificateValidationCallback = value; + certValidationSet = true; + } + } + + private static readonly Queue ResultQueueTransferThread = new Queue(); + private static readonly Queue ResultQueueMainThread = new Queue(); + private static readonly List ActiveRequests = new List(); + + private static bool certValidationSet = false; + private static Thread _requestQueueThread; + private static readonly object _ThreadLock = new object(); + private static readonly TimeSpan ThreadKillTimeout = TimeSpan.FromSeconds(60); + private static DateTime _threadKillTime = DateTime.UtcNow + ThreadKillTimeout; // Kill the thread after 1 minute of inactivity + private static bool _isApplicationPlaying; + private static int _activeCallCount; + + private static string _unityVersion; + + private bool _isInitialized = false; + + public bool IsInitialized { get { return _isInitialized; } } + + public void Initialize() + { + SetupCertificates(); + _isApplicationPlaying = true; + _unityVersion = Application.unityVersion; + _isInitialized = true; + } + + public void OnDestroy() + { + _isApplicationPlaying = false; + lock (ResultQueueTransferThread) + { + ResultQueueTransferThread.Clear(); + } + lock (ActiveRequests) + { + ActiveRequests.Clear(); + } + lock (_ThreadLock) + { + _requestQueueThread = null; + } + } + + private void SetupCertificates() + { + // These are performance Optimizations for HttpWebRequests. + ServicePointManager.DefaultConnectionLimit = 10; + ServicePointManager.Expect100Continue = false; + + if (!certValidationSet) + { + Debug.LogWarning("PlayFab API calls will likely fail because you have not set up a HttpWebRequest certificate validation mechanism"); + Debug.LogWarning("Please set a validation callback into PlayFab.Internal.PlayFabWebRequest.CustomCertValidationHook, or set PlayFab.Internal.PlayFabWebRequest.SkipCertificateValidation()"); + } + } + + /// + /// This disables certificate validation, if it's been activated by a customer via SkipCertificateValidation() + /// + private static bool AcceptAllCertifications(object sender, System.Security.Cryptography.X509Certificates.X509Certificate certificate, System.Security.Cryptography.X509Certificates.X509Chain chain, System.Net.Security.SslPolicyErrors sslPolicyErrors) + { + return true; + } + + public void SimpleGetCall(string fullUrl, Action successCallback, Action errorCallback) + { + // This needs to be improved to use a decent thread-pool, but it can be improved invisibly later + var newThread = new Thread(() => SimpleHttpsWorker("GET", fullUrl, null, successCallback, errorCallback)); + newThread.Start(); + } + + public void SimplePutCall(string fullUrl, byte[] payload, Action successCallback, Action errorCallback) + { + // This needs to be improved to use a decent thread-pool, but it can be improved invisibly later + var newThread = new Thread(() => SimpleHttpsWorker("PUT", fullUrl, payload, successCallback, errorCallback)); + newThread.Start(); + } + + public void SimplePostCall(string fullUrl, byte[] payload, Action successCallback, Action errorCallback) + { + // This needs to be improved to use a decent thread-pool, but it can be improved invisibly later + var newThread = new Thread(() => SimpleHttpsWorker("POST", fullUrl, payload, successCallback, errorCallback)); + newThread.Start(); + } + + + private void SimpleHttpsWorker(string httpMethod, string fullUrl, byte[] payload, Action successCallback, Action errorCallback) + { + // This should also use a pooled HttpWebRequest object, but that too can be improved invisibly later + var httpRequest = (HttpWebRequest)WebRequest.Create(fullUrl); + httpRequest.UserAgent = "UnityEngine-Unity; Version: " + _unityVersion; + httpRequest.Method = httpMethod; + httpRequest.KeepAlive = PlayFabSettings.RequestKeepAlive; + httpRequest.Timeout = PlayFabSettings.RequestTimeout; + httpRequest.AllowWriteStreamBuffering = false; + httpRequest.ReadWriteTimeout = PlayFabSettings.RequestTimeout; + + if (payload != null) + { + httpRequest.ContentLength = payload.LongLength; + using (var stream = httpRequest.GetRequestStream()) + { + stream.Write(payload, 0, payload.Length); + } + } + + try + { + var response = httpRequest.GetResponse(); + byte[] output = null; + using (var responseStream = response.GetResponseStream()) + { + if (responseStream != null) + { + output = new byte[response.ContentLength]; + responseStream.Read(output, 0, output.Length); + } + } + successCallback(output); + } + catch (WebException webException) + { + try + { + using (var responseStream = webException.Response.GetResponseStream()) + { + if (responseStream != null) + using (var stream = new StreamReader(responseStream)) + errorCallback(stream.ReadToEnd()); + } + } + catch (Exception e) + { + Debug.LogException(e); + } + } + catch (Exception e) + { + Debug.LogException(e); + } + } + + public void MakeApiCall(object reqContainerObj) + { + CallRequestContainer reqContainer = (CallRequestContainer)reqContainerObj; + reqContainer.HttpState = HttpRequestState.Idle; + + lock (ActiveRequests) + { + ActiveRequests.Insert(0, reqContainer); + } + + ActivateThreadWorker(); + } + + private static void ActivateThreadWorker() + { + lock (_ThreadLock) + { + if (_requestQueueThread != null) + { + return; + } + _requestQueueThread = new Thread(WorkerThreadMainLoop); + _requestQueueThread.Start(); + } + } + + private static void WorkerThreadMainLoop() + { + try + { + bool active; + lock (_ThreadLock) + { + // Kill the thread after 1 minute of inactivity + _threadKillTime = DateTime.UtcNow + ThreadKillTimeout; + } + + List localActiveRequests = new List(); + do + { + //process active requests + lock (ActiveRequests) + { + localActiveRequests.AddRange(ActiveRequests); + ActiveRequests.Clear(); + _activeCallCount = localActiveRequests.Count; + } + + var activeCalls = localActiveRequests.Count; + for (var i = activeCalls - 1; i >= 0; i--) // We must iterate backwards, because we remove at index i in some cases + { + switch (localActiveRequests[i].HttpState) + { + case HttpRequestState.Error: + localActiveRequests.RemoveAt(i); break; + case HttpRequestState.Idle: + Post(localActiveRequests[i]); break; + case HttpRequestState.Sent: + if (!localActiveRequests[i].CalledGetResponse) { // Else we'll GetResponse try again next tick + localActiveRequests[i].HttpRequest.GetResponseAsync(); + localActiveRequests[i].CalledGetResponse = true; + } + else if (localActiveRequests[i].HttpRequest.HaveResponse) + ProcessHttpResponse(localActiveRequests[i]); + break; + case HttpRequestState.Received: + ProcessJsonResponse(localActiveRequests[i]); + localActiveRequests.RemoveAt(i); + break; + } + } + + #region Expire Thread. + // Check if we've been inactive + lock (_ThreadLock) + { + var now = DateTime.UtcNow; + if (activeCalls > 0 && _isApplicationPlaying) + { + // Still active, reset the _threadKillTime + _threadKillTime = now + ThreadKillTimeout; + } + // Kill the thread after 1 minute of inactivity + active = now <= _threadKillTime; + if (!active) + { + _requestQueueThread = null; + } + // This thread will be stopped, so null this now, inside lock (_threadLock) + } + #endregion + + Thread.Sleep(1); + } while (active); + + } + catch (Exception e) + { + Debug.LogException(e); + _requestQueueThread = null; + } + } + + private static void Post(CallRequestContainer reqContainer) + { + try + { + reqContainer.HttpRequest = (HttpWebRequest)WebRequest.Create(reqContainer.FullUrl); + reqContainer.HttpRequest.UserAgent = "UnityEngine-Unity; Version: " + _unityVersion; + reqContainer.HttpRequest.SendChunked = false; + // Prevents hitting a proxy if no proxy is available. TODO: Add support for proxy's. + reqContainer.HttpRequest.Proxy = null; + + foreach (var pair in reqContainer.RequestHeaders) + reqContainer.HttpRequest.Headers.Add(pair.Key, pair.Value); + + reqContainer.HttpRequest.ContentType = "application/json"; + reqContainer.HttpRequest.Method = "POST"; + reqContainer.HttpRequest.KeepAlive = PlayFabSettings.RequestKeepAlive; + reqContainer.HttpRequest.Timeout = PlayFabSettings.RequestTimeout; + reqContainer.HttpRequest.AllowWriteStreamBuffering = false; + reqContainer.HttpRequest.Proxy = null; + reqContainer.HttpRequest.ContentLength = reqContainer.Payload.LongLength; + reqContainer.HttpRequest.ReadWriteTimeout = PlayFabSettings.RequestTimeout; + + //Debug.Log("Get Stream"); + // Get Request Stream and send data in the body. + using (var stream = reqContainer.HttpRequest.GetRequestStream()) + { + //Debug.Log("Post Stream"); + stream.Write(reqContainer.Payload, 0, reqContainer.Payload.Length); + //Debug.Log("After Post stream"); + } + + reqContainer.HttpState = HttpRequestState.Sent; + } + catch (WebException e) + { + reqContainer.JsonResponse = ResponseToString(e.Response) ?? e.Status + ": WebException making http request to: " + reqContainer.FullUrl; + var enhancedError = new WebException(reqContainer.JsonResponse, e); + Debug.LogException(enhancedError); + QueueRequestError(reqContainer); + } + catch (Exception e) + { + reqContainer.JsonResponse = "Unhandled exception in Post : " + reqContainer.FullUrl; + var enhancedError = new Exception(reqContainer.JsonResponse, e); + Debug.LogException(enhancedError); + QueueRequestError(reqContainer); + } + } + + private static void ProcessHttpResponse(CallRequestContainer reqContainer) + { + try + { +#if PLAYFAB_REQUEST_TIMING + reqContainer.Timing.WorkerRequestMs = (int)reqContainer.Stopwatch.ElapsedMilliseconds; +#endif + // Get and check the response + var httpResponse = (HttpWebResponse)reqContainer.HttpRequest.GetResponse(); + if (httpResponse.StatusCode == HttpStatusCode.OK) + { + reqContainer.JsonResponse = ResponseToString(httpResponse); + } + + if (httpResponse.StatusCode != HttpStatusCode.OK || string.IsNullOrEmpty(reqContainer.JsonResponse)) + { + reqContainer.JsonResponse = reqContainer.JsonResponse ?? "No response from server"; + QueueRequestError(reqContainer); + return; + } + else + { + // Response Recieved Successfully, now process. + } + + reqContainer.HttpState = HttpRequestState.Received; + } + catch (Exception e) + { + var msg = "Unhandled exception in ProcessHttpResponse : " + reqContainer.FullUrl; + reqContainer.JsonResponse = reqContainer.JsonResponse ?? msg; + var enhancedError = new Exception(msg, e); + Debug.LogException(enhancedError); + QueueRequestError(reqContainer); + } + } + + /// + /// Set the reqContainer into an error state, and queue it to invoke the ErrorCallback for that request + /// + private static void QueueRequestError(CallRequestContainer reqContainer) + { + reqContainer.Error = PlayFabHttp.GeneratePlayFabError(reqContainer.ApiEndpoint, reqContainer.JsonResponse, reqContainer.CustomData); // Decode the server-json error + reqContainer.HttpState = HttpRequestState.Error; + lock (ResultQueueTransferThread) + { + //Queue The result callbacks to run on the main thread. + ResultQueueTransferThread.Enqueue(() => + { + PlayFabHttp.SendErrorEvent(reqContainer.ApiRequest, reqContainer.Error); + if (reqContainer.ErrorCallback != null) + reqContainer.ErrorCallback(reqContainer.Error); + }); + } + } + + private static void ProcessJsonResponse(CallRequestContainer reqContainer) + { + try + { + var serializer = PluginManager.GetPlugin(PluginContract.PlayFab_Serializer); + var httpResult = serializer.DeserializeObject(reqContainer.JsonResponse); + +#if PLAYFAB_REQUEST_TIMING + reqContainer.Timing.WorkerRequestMs = (int)reqContainer.Stopwatch.ElapsedMilliseconds; +#endif + + //This would happen if playfab returned a 500 internal server error or a bad json response. + if (httpResult == null || httpResult.code != 200) + { + QueueRequestError(reqContainer); + return; + } + + reqContainer.JsonResponse = serializer.SerializeObject(httpResult.data); + reqContainer.DeserializeResultJson(); // Assigns Result with a properly typed object + reqContainer.ApiResult.Request = reqContainer.ApiRequest; + reqContainer.ApiResult.CustomData = reqContainer.CustomData; + + if(_isApplicationPlaying) + { + PlayFabHttp.instance.OnPlayFabApiResult(reqContainer); + } + +#if !DISABLE_PLAYFABCLIENT_API + lock (ResultQueueTransferThread) + { + ResultQueueTransferThread.Enqueue(() => { PlayFabDeviceUtil.OnPlayFabLogin(reqContainer.ApiResult, reqContainer.settings, reqContainer.instanceApi); }); + } +#endif + lock (ResultQueueTransferThread) + { + //Queue The result callbacks to run on the main thread. + ResultQueueTransferThread.Enqueue(() => + { +#if PLAYFAB_REQUEST_TIMING + reqContainer.Stopwatch.Stop(); + reqContainer.Timing.MainThreadRequestMs = (int)reqContainer.Stopwatch.ElapsedMilliseconds; + PlayFabHttp.SendRequestTiming(reqContainer.Timing); +#endif + try + { + PlayFabHttp.SendEvent(reqContainer.ApiEndpoint, reqContainer.ApiRequest, reqContainer.ApiResult, ApiProcessingEventType.Post); + reqContainer.InvokeSuccessCallback(); + } + catch (Exception e) + { + Debug.LogException(e); // Log the user's callback exception back to them without halting PlayFabHttp + } + }); + } + } + catch (Exception e) + { + var msg = "Unhandled exception in ProcessJsonResponse : " + reqContainer.FullUrl; + reqContainer.JsonResponse = reqContainer.JsonResponse ?? msg; + var enhancedError = new Exception(msg, e); + Debug.LogException(enhancedError); + QueueRequestError(reqContainer); + } + } + + public void Update() + { + lock (ResultQueueTransferThread) + { + while (ResultQueueTransferThread.Count > 0) + { + var actionToQueue = ResultQueueTransferThread.Dequeue(); + ResultQueueMainThread.Enqueue(actionToQueue); + } + } + + while (ResultQueueMainThread.Count > 0) + { + var finishedRequest = ResultQueueMainThread.Dequeue(); + finishedRequest(); + } + } + + private static string ResponseToString(WebResponse webResponse) + { + if (webResponse == null) + return null; + + try + { + using (var responseStream = webResponse.GetResponseStream()) + { + if (responseStream == null) + return null; + using (var stream = new StreamReader(responseStream)) + { + return stream.ReadToEnd(); + } + } + } + catch (WebException webException) + { + try + { + using (var responseStream = webException.Response.GetResponseStream()) + { + if (responseStream == null) + return null; + using (var stream = new StreamReader(responseStream)) + { + return stream.ReadToEnd(); + } + } + } + catch (Exception e) + { + Debug.LogException(e); + return null; + } + } + catch (Exception e) + { + Debug.LogException(e); + return null; + } + } + + public int GetPendingMessages() + { + var count = 0; + lock (ActiveRequests) + count += ActiveRequests.Count + _activeCallCount; + lock (ResultQueueTransferThread) + count += ResultQueueTransferThread.Count; + return count; + } + } +} + +#endif diff --git a/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/PlayFabWebRequest.cs.meta b/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/PlayFabWebRequest.cs.meta new file mode 100644 index 00000000..3ebab9de --- /dev/null +++ b/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/PlayFabWebRequest.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 18fd1a0daadd68d45aebf8c19cac2bda +timeCreated: 1466016486 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Shared/Internal/SimpleJson.cs b/Assets/PlayFabSDK/Shared/Internal/SimpleJson.cs new file mode 100644 index 00000000..52486e69 --- /dev/null +++ b/Assets/PlayFabSDK/Shared/Internal/SimpleJson.cs @@ -0,0 +1,2081 @@ +//----------------------------------------------------------------------- +// +// Copyright (c) 2011, The Outercurve Foundation. +// +// Licensed under the MIT License (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.opensource.org/licenses/mit-license.php +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Nathan Totten (ntotten.com), Jim Zimmerman (jimzimmerman.com) and Prabir Shrestha (prabir.me) +// https://github.com/facebook-csharp-sdk/simple-json +//----------------------------------------------------------------------- + +// VERSION: + +// NOTE: uncomment the following line to make SimpleJson class internal. +//#define SIMPLE_JSON_INTERNAL + +// NOTE: uncomment the following line to make JsonArray and JsonObject class internal. +//#define SIMPLE_JSON_OBJARRAYINTERNAL + +// NOTE: uncomment the following line to enable dynamic support. +//#define SIMPLE_JSON_DYNAMIC + +// NOTE: uncomment the following line to enable DataContract support. +//#define SIMPLE_JSON_DATACONTRACT + +// NOTE: uncomment the following line to enable IReadOnlyCollection and IReadOnlyList support. +//#define SIMPLE_JSON_READONLY_COLLECTIONS + +// NOTE: uncomment the following line if you are compiling under Windows Store app/library. +// usually already defined in properties +#if UNITY_WSA && UNITY_WP8 +#define NETFX_CORE +#endif + +// If you are targetting WinStore, WP8 and NET4.5+ PCL make sure to +#if UNITY_WP8 || UNITY_WP8_1 || UNITY_WSA +// #define SIMPLE_JSON_TYPEINFO +#endif + +// original json parsing code from http://techblog.procurios.nl/k/618/news/view/14605/14863/How-do-I-write-my-own-parser-for-JSON.html + +#if NETFX_CORE +#define SIMPLE_JSON_TYPEINFO +#endif + +using System; +using System.CodeDom.Compiler; +using System.Collections; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics.CodeAnalysis; +#if SIMPLE_JSON_DYNAMIC +using System.Dynamic; +#endif +using System.Globalization; +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.Serialization; +using System.Text; + +// ReSharper disable LoopCanBeConvertedToQuery +// ReSharper disable RedundantExplicitArrayCreation +// ReSharper disable SuggestUseVarKeywordEvident +namespace PlayFab.Json +{ + public enum NullValueHandling + { + Include, // Include null values when serializing and deserializing objects + Ignore // Ignore null values when serializing and deserializing objects + } + + /// + /// Customize the json output of a field or property + /// + [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)] + public class JsonProperty : Attribute + { + public string PropertyName = null; + public NullValueHandling NullValueHandling = NullValueHandling.Include; + } + + /// + /// Represents the json array. + /// + [GeneratedCode("simple-json", "1.0.0")] + [EditorBrowsable(EditorBrowsableState.Never)] + [SuppressMessage("Microsoft.Naming", "CA1710:IdentifiersShouldHaveCorrectSuffix")] +#if SIMPLE_JSON_OBJARRAYINTERNAL + internal +#else + public +#endif + class JsonArray : List + { + /// + /// Initializes a new instance of the class. + /// + public JsonArray() { } + + /// + /// Initializes a new instance of the class. + /// + /// The capacity of the json array. + public JsonArray(int capacity) : base(capacity) { } + + /// + /// The json representation of the array. + /// + /// The json representation of the array. + public override string ToString() + { + return PlayFabSimpleJson.SerializeObject(this) ?? string.Empty; + } + } + + /// + /// Represents the json object. + /// + [GeneratedCode("simple-json", "1.0.0")] + [EditorBrowsable(EditorBrowsableState.Never)] + [SuppressMessage("Microsoft.Naming", "CA1710:IdentifiersShouldHaveCorrectSuffix")] +#if SIMPLE_JSON_OBJARRAYINTERNAL + internal +#else + public +#endif + class JsonObject : +#if SIMPLE_JSON_DYNAMIC + DynamicObject, +#endif + IDictionary + { + private const int DICTIONARY_DEFAULT_SIZE = 16; + /// + /// The internal member dictionary. + /// + private readonly Dictionary _members; + + /// + /// Initializes a new instance of . + /// + public JsonObject() + { + _members = new Dictionary(DICTIONARY_DEFAULT_SIZE); + } + + /// + /// Initializes a new instance of . + /// + /// The implementation to use when comparing keys, or null to use the default for the type of the key. + public JsonObject(IEqualityComparer comparer) + { + _members = new Dictionary(comparer); + } + + /// + /// Gets the at the specified index. + /// + /// + public object this[int index] + { + get { return GetAtIndex(_members, index); } + } + + internal static object GetAtIndex(IDictionary obj, int index) + { + if (obj == null) + throw new ArgumentNullException("obj"); + if (index >= obj.Count) + throw new ArgumentOutOfRangeException("index"); + int i = 0; + foreach (KeyValuePair o in obj) + if (i++ == index) return o.Value; + return null; + } + + /// + /// Adds the specified key. + /// + /// The key. + /// The value. + public void Add(string key, object value) + { + _members.Add(key, value); + } + + /// + /// Determines whether the specified key contains key. + /// + /// The key. + /// + /// true if the specified key contains key; otherwise, false. + /// + public bool ContainsKey(string key) + { + return _members.ContainsKey(key); + } + + /// + /// Gets the keys. + /// + /// The keys. + public ICollection Keys + { + get { return _members.Keys; } + } + + /// + /// Removes the specified key. + /// + /// The key. + /// + public bool Remove(string key) + { + return _members.Remove(key); + } + + /// + /// Tries the get value. + /// + /// The key. + /// The value. + /// + public bool TryGetValue(string key, out object value) + { + return _members.TryGetValue(key, out value); + } + + /// + /// Gets the values. + /// + /// The values. + public ICollection Values + { + get { return _members.Values; } + } + + /// + /// Gets or sets the with the specified key. + /// + /// + public object this[string key] + { + get { return _members[key]; } + set { _members[key] = value; } + } + + /// + /// Adds the specified item. + /// + /// The item. + public void Add(KeyValuePair item) + { + _members.Add(item.Key, item.Value); + } + + /// + /// Clears this instance. + /// + public void Clear() + { + _members.Clear(); + } + + /// + /// Determines whether [contains] [the specified item]. + /// + /// The item. + /// + /// true if [contains] [the specified item]; otherwise, false. + /// + public bool Contains(KeyValuePair item) + { + object value; + return _members.TryGetValue(item.Key, out value) && value == item.Value; + } + + /// + /// Copies to. + /// + /// The array. + /// Index of the array. + public void CopyTo(KeyValuePair[] array, int arrayIndex) + { + if (array == null) throw new ArgumentNullException("array"); + int num = Count; + foreach (KeyValuePair kvp in _members) + { + array[arrayIndex++] = kvp; + if (--num <= 0) + return; + } + } + + /// + /// Gets the count. + /// + /// The count. + public int Count + { + get { return _members.Count; } + } + + /// + /// Gets a value indicating whether this instance is read only. + /// + /// + /// true if this instance is read only; otherwise, false. + /// + public bool IsReadOnly + { + get { return false; } + } + + /// + /// Removes the specified item. + /// + /// The item. + /// + public bool Remove(KeyValuePair item) + { + return _members.Remove(item.Key); + } + + /// + /// Gets the enumerator. + /// + /// + public IEnumerator> GetEnumerator() + { + return _members.GetEnumerator(); + } + + /// + /// Returns an enumerator that iterates through a collection. + /// + /// + /// An object that can be used to iterate through the collection. + /// + IEnumerator IEnumerable.GetEnumerator() + { + return _members.GetEnumerator(); + } + + /// + /// Returns a json that represents the current . + /// + /// + /// A json that represents the current . + /// + public override string ToString() + { + return PlayFabSimpleJson.SerializeObject(_members); + } + +#if SIMPLE_JSON_DYNAMIC + /// + /// Provides implementation for type conversion operations. Classes derived from the class can override this method to specify dynamic behavior for operations that convert an object from one type to another. + /// + /// Provides information about the conversion operation. The binder.Type property provides the type to which the object must be converted. For example, for the statement (String)sampleObject in C# (CType(sampleObject, Type) in Visual Basic), where sampleObject is an instance of the class derived from the class, binder.Type returns the type. The binder.Explicit property provides information about the kind of conversion that occurs. It returns true for explicit conversion and false for implicit conversion. + /// The result of the type conversion operation. + /// + /// Alwasy returns true. + /// + public override bool TryConvert(ConvertBinder binder, out object result) + { + // + if (binder == null) + throw new ArgumentNullException("binder"); + // + Type targetType = binder.Type; + + if ((targetType == typeof(IEnumerable)) || + (targetType == typeof(IEnumerable>)) || + (targetType == typeof(IDictionary)) || + (targetType == typeof(IDictionary))) + { + result = this; + return true; + } + + return base.TryConvert(binder, out result); + } + + /// + /// Provides the implementation for operations that delete an object member. This method is not intended for use in C# or Visual Basic. + /// + /// Provides information about the deletion. + /// + /// Alwasy returns true. + /// + public override bool TryDeleteMember(DeleteMemberBinder binder) + { + // + if (binder == null) + throw new ArgumentNullException("binder"); + // + return _members.Remove(binder.Name); + } + + /// + /// Provides the implementation for operations that get a value by index. Classes derived from the class can override this method to specify dynamic behavior for indexing operations. + /// + /// Provides information about the operation. + /// The indexes that are used in the operation. For example, for the sampleObject[3] operation in C# (sampleObject(3) in Visual Basic), where sampleObject is derived from the DynamicObject class, is equal to 3. + /// The result of the index operation. + /// + /// Alwasy returns true. + /// + public override bool TryGetIndex(GetIndexBinder binder, object[] indexes, out object result) + { + if (indexes == null) throw new ArgumentNullException("indexes"); + if (indexes.Length == 1) + { + result = ((IDictionary)this)[(string)indexes[0]]; + return true; + } + result = null; + return true; + } + + /// + /// Provides the implementation for operations that get member values. Classes derived from the class can override this method to specify dynamic behavior for operations such as getting a value for a property. + /// + /// Provides information about the object that called the dynamic operation. The binder.Name property provides the name of the member on which the dynamic operation is performed. For example, for the Console.WriteLine(sampleObject.SampleProperty) statement, where sampleObject is an instance of the class derived from the class, binder.Name returns "SampleProperty". The binder.IgnoreCase property specifies whether the member name is case-sensitive. + /// The result of the get operation. For example, if the method is called for a property, you can assign the property value to . + /// + /// Alwasy returns true. + /// + public override bool TryGetMember(GetMemberBinder binder, out object result) + { + object value; + if (_members.TryGetValue(binder.Name, out value)) + { + result = value; + return true; + } + result = null; + return true; + } + + /// + /// Provides the implementation for operations that set a value by index. Classes derived from the class can override this method to specify dynamic behavior for operations that access objects by a specified index. + /// + /// Provides information about the operation. + /// The indexes that are used in the operation. For example, for the sampleObject[3] = 10 operation in C# (sampleObject(3) = 10 in Visual Basic), where sampleObject is derived from the class, is equal to 3. + /// The value to set to the object that has the specified index. For example, for the sampleObject[3] = 10 operation in C# (sampleObject(3) = 10 in Visual Basic), where sampleObject is derived from the class, is equal to 10. + /// + /// true if the operation is successful; otherwise, false. If this method returns false, the run-time binder of the language determines the behavior. (In most cases, a language-specific run-time exception is thrown. + /// + public override bool TrySetIndex(SetIndexBinder binder, object[] indexes, object value) + { + if (indexes == null) throw new ArgumentNullException("indexes"); + if (indexes.Length == 1) + { + ((IDictionary)this)[(string)indexes[0]] = value; + return true; + } + return base.TrySetIndex(binder, indexes, value); + } + + /// + /// Provides the implementation for operations that set member values. Classes derived from the class can override this method to specify dynamic behavior for operations such as setting a value for a property. + /// + /// Provides information about the object that called the dynamic operation. The binder.Name property provides the name of the member to which the value is being assigned. For example, for the statement sampleObject.SampleProperty = "Test", where sampleObject is an instance of the class derived from the class, binder.Name returns "SampleProperty". The binder.IgnoreCase property specifies whether the member name is case-sensitive. + /// The value to set to the member. For example, for sampleObject.SampleProperty = "Test", where sampleObject is an instance of the class derived from the class, the is "Test". + /// + /// true if the operation is successful; otherwise, false. If this method returns false, the run-time binder of the language determines the behavior. (In most cases, a language-specific run-time exception is thrown.) + /// + public override bool TrySetMember(SetMemberBinder binder, object value) + { + // + if (binder == null) + throw new ArgumentNullException("binder"); + // + _members[binder.Name] = value; + return true; + } + + /// + /// Returns the enumeration of all dynamic member names. + /// + /// + /// A sequence that contains dynamic member names. + /// + public override IEnumerable GetDynamicMemberNames() + { + foreach (var key in Keys) + yield return key; + } +#endif + } + + /// + /// Private. Do not call from client code. + /// This class encodes and decodes JSON strings. + /// Spec. details, see http://www.json.org/ + /// + /// JSON uses Arrays and Objects. These correspond here to the datatypes JsonArray(IList<object>) and JsonObject(IDictionary<string,object>). + /// All numbers are parsed to doubles. + /// + [GeneratedCode("simple-json", "1.0.0")] +#if SIMPLE_JSON_INTERNAL + internal +#else + public +#endif + static class PlayFabSimpleJson + { + private enum TokenType : byte + { + NONE = 0, + CURLY_OPEN = 1, + CURLY_CLOSE = 2, + SQUARED_OPEN = 3, + SQUARED_CLOSE = 4, + COLON = 5, + COMMA = 6, + STRING = 7, + NUMBER = 8, + TRUE = 9, + FALSE = 10, + NULL = 11, + } + private const int BUILDER_INIT = 2000; + + private static readonly char[] EscapeTable; + private static readonly char[] EscapeCharacters = new char[] { '"', '\\', '\b', '\f', '\n', '\r', '\t' }; + // private static readonly string EscapeCharactersString = new string(EscapeCharacters); + internal static readonly List NumberTypes = new List { + typeof(bool), typeof(byte), typeof(ushort), typeof(uint), typeof(ulong), typeof(sbyte), typeof(short), typeof(int), typeof(long), typeof(double), typeof(float), typeof(decimal) + }; + + // Performance stuff + [ThreadStatic] + private static StringBuilder _serializeObjectBuilder; + [ThreadStatic] + private static StringBuilder _parseStringBuilder; + + static PlayFabSimpleJson() + { + EscapeTable = new char[93]; + EscapeTable['"'] = '"'; + EscapeTable['\\'] = '\\'; + EscapeTable['\b'] = 'b'; + EscapeTable['\f'] = 'f'; + EscapeTable['\n'] = 'n'; + EscapeTable['\r'] = 'r'; + EscapeTable['\t'] = 't'; + } + + /// + /// Parses the string json into a value + /// + /// A JSON string. + /// An IList<object>, a IDictionary<string,object>, a double, a string, null, true, or false + public static object DeserializeObject(string json) + { + object obj; + if (TryDeserializeObject(json, out obj)) + return obj; + throw new SerializationException("Invalid JSON string"); + } + + /// + /// Try parsing the json string into a value. + /// + /// + /// A JSON string. + /// + /// + /// The object. + /// + /// + /// Returns true if successfull otherwise false. + /// + [SuppressMessage("Microsoft.Design", "CA1007:UseGenericsWhereAppropriate", Justification = "Need to support .NET 2")] + public static bool TryDeserializeObject(string json, out object obj) + { + bool success = true; + if (json != null) + { + int index = 0; + obj = ParseValue(json, ref index, ref success); + } + else + obj = null; + + return success; + } + + public static object DeserializeObject(string json, Type type, IJsonSerializerStrategy jsonSerializerStrategy = null) + { + object jsonObject = DeserializeObject(json); + if (type == null || jsonObject != null && ReflectionUtils.IsAssignableFrom(jsonObject.GetType(), type)) + return jsonObject; + return (jsonSerializerStrategy ?? CurrentJsonSerializerStrategy).DeserializeObject(jsonObject, type); + } + + public static T DeserializeObject(string json, IJsonSerializerStrategy jsonSerializerStrategy = null) + { + return (T)DeserializeObject(json, typeof(T), jsonSerializerStrategy); + } + + /// + /// Converts a IDictionary<string,object> / IList<object> object into a JSON string + /// + /// A IDictionary<string,object> / IList<object> + /// Serializer strategy to use + /// A JSON encoded string, or null if object 'json' is not serializable + public static string SerializeObject(object json, IJsonSerializerStrategy jsonSerializerStrategy = null) + { + if (_serializeObjectBuilder == null) + _serializeObjectBuilder = new StringBuilder(BUILDER_INIT); + _serializeObjectBuilder.Length = 0; + + if (jsonSerializerStrategy == null) + jsonSerializerStrategy = CurrentJsonSerializerStrategy; + + bool success = SerializeValue(jsonSerializerStrategy, json, _serializeObjectBuilder); + return (success ? _serializeObjectBuilder.ToString() : null); + } + + public static string EscapeToJavascriptString(string jsonString) + { + if (string.IsNullOrEmpty(jsonString)) + return jsonString; + + StringBuilder sb = new StringBuilder(); + char c; + + for (int i = 0; i < jsonString.Length;) + { + c = jsonString[i++]; + + if (c == '\\') + { + int remainingLength = jsonString.Length - i; + if (remainingLength >= 2) + { + char lookahead = jsonString[i]; + if (lookahead == '\\') + { + sb.Append('\\'); + ++i; + } + else if (lookahead == '"') + { + sb.Append("\""); + ++i; + } + else if (lookahead == 't') + { + sb.Append('\t'); + ++i; + } + else if (lookahead == 'b') + { + sb.Append('\b'); + ++i; + } + else if (lookahead == 'n') + { + sb.Append('\n'); + ++i; + } + else if (lookahead == 'r') + { + sb.Append('\r'); + ++i; + } + } + } + else + { + sb.Append(c); + } + } + return sb.ToString(); + } + + static IDictionary ParseObject(string json, ref int index, ref bool success) + { + IDictionary table = new JsonObject(); + TokenType token; + + // { + NextToken(json, ref index); + + bool done = false; + while (!done) + { + token = LookAhead(json, index); + if (token == TokenType.NONE) + { + success = false; + return null; + } + else if (token == TokenType.COMMA) + NextToken(json, ref index); + else if (token == TokenType.CURLY_CLOSE) + { + NextToken(json, ref index); + return table; + } + else + { + // name + string name = ParseString(json, ref index, ref success); + if (!success) + { + success = false; + return null; + } + // : + token = NextToken(json, ref index); + if (token != TokenType.COLON) + { + success = false; + return null; + } + // value + object value = ParseValue(json, ref index, ref success); + if (!success) + { + success = false; + return null; + } + table[name] = value; + } + } + return table; + } + + static JsonArray ParseArray(string json, ref int index, ref bool success) + { + JsonArray array = new JsonArray(); + + // [ + NextToken(json, ref index); + + bool done = false; + while (!done) + { + TokenType token = LookAhead(json, index); + if (token == TokenType.NONE) + { + success = false; + return null; + } + else if (token == TokenType.COMMA) + NextToken(json, ref index); + else if (token == TokenType.SQUARED_CLOSE) + { + NextToken(json, ref index); + break; + } + else + { + object value = ParseValue(json, ref index, ref success); + if (!success) + return null; + array.Add(value); + } + } + return array; + } + + static object ParseValue(string json, ref int index, ref bool success) + { + switch (LookAhead(json, index)) + { + case TokenType.STRING: + return ParseString(json, ref index, ref success); + case TokenType.NUMBER: + return ParseNumber(json, ref index, ref success); + case TokenType.CURLY_OPEN: + return ParseObject(json, ref index, ref success); + case TokenType.SQUARED_OPEN: + return ParseArray(json, ref index, ref success); + case TokenType.TRUE: + NextToken(json, ref index); + return true; + case TokenType.FALSE: + NextToken(json, ref index); + return false; + case TokenType.NULL: + NextToken(json, ref index); + return null; + case TokenType.NONE: + break; + } + success = false; + return null; + } + + static string ParseString(string json, ref int index, ref bool success) + { + if (_parseStringBuilder == null) + _parseStringBuilder = new StringBuilder(BUILDER_INIT); + _parseStringBuilder.Length = 0; + + EatWhitespace(json, ref index); + + // " + char c = json[index++]; + bool complete = false; + while (!complete) + { + if (index == json.Length) + break; + + c = json[index++]; + if (c == '"') + { + complete = true; + break; + } + else if (c == '\\') + { + if (index == json.Length) + break; + c = json[index++]; + if (c == '"') + _parseStringBuilder.Append('"'); + else if (c == '\\') + _parseStringBuilder.Append('\\'); + else if (c == '/') + _parseStringBuilder.Append('/'); + else if (c == 'b') + _parseStringBuilder.Append('\b'); + else if (c == 'f') + _parseStringBuilder.Append('\f'); + else if (c == 'n') + _parseStringBuilder.Append('\n'); + else if (c == 'r') + _parseStringBuilder.Append('\r'); + else if (c == 't') + _parseStringBuilder.Append('\t'); + else if (c == 'u') + { + int remainingLength = json.Length - index; + if (remainingLength >= 4) + { + // parse the 32 bit hex into an integer codepoint + uint codePoint; + if (!(success = UInt32.TryParse(json.Substring(index, 4), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out codePoint))) + return ""; + + // convert the integer codepoint to a unicode char and add to string + if (0xD800 <= codePoint && codePoint <= 0xDBFF) // if high surrogate + { + index += 4; // skip 4 chars + remainingLength = json.Length - index; + if (remainingLength >= 6) + { + uint lowCodePoint; + if (json.Substring(index, 2) == "\\u" && UInt32.TryParse(json.Substring(index + 2, 4), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out lowCodePoint)) + { + if (0xDC00 <= lowCodePoint && lowCodePoint <= 0xDFFF) // if low surrogate + { + _parseStringBuilder.Append((char)codePoint); + _parseStringBuilder.Append((char)lowCodePoint); + index += 6; // skip 6 chars + continue; + } + } + } + success = false; // invalid surrogate pair + return ""; + } + _parseStringBuilder.Append(ConvertFromUtf32((int)codePoint)); + // skip 4 chars + index += 4; + } + else + break; + } + } + else + _parseStringBuilder.Append(c); + } + if (!complete) + { + success = false; + return null; + } + return _parseStringBuilder.ToString(); + } + + private static string ConvertFromUtf32(int utf32) + { + // http://www.java2s.com/Open-Source/CSharp/2.6.4-mono-.net-core/System/System/Char.cs.htm + if (utf32 < 0 || utf32 > 0x10FFFF) + throw new ArgumentOutOfRangeException("utf32", "The argument must be from 0 to 0x10FFFF."); + if (0xD800 <= utf32 && utf32 <= 0xDFFF) + throw new ArgumentOutOfRangeException("utf32", "The argument must not be in surrogate pair range."); + if (utf32 < 0x10000) + return new string((char)utf32, 1); + utf32 -= 0x10000; + return new string(new char[] { (char)((utf32 >> 10) + 0xD800), (char)(utf32 % 0x0400 + 0xDC00) }); + } + + static object ParseNumber(string json, ref int index, ref bool success) + { + EatWhitespace(json, ref index); + int lastIndex = GetLastIndexOfNumber(json, index); + int charLength = (lastIndex - index) + 1; + object returnNumber; + string str = json.Substring(index, charLength); + if (str.IndexOf(".", StringComparison.OrdinalIgnoreCase) != -1 || str.IndexOf("e", StringComparison.OrdinalIgnoreCase) != -1) + { + double number; + success = double.TryParse(json.Substring(index, charLength), NumberStyles.Any, CultureInfo.InvariantCulture, out number); + returnNumber = number; + } + else if (str.IndexOf("-", StringComparison.OrdinalIgnoreCase) == -1) + { + ulong number; + success = ulong.TryParse(json.Substring(index, charLength), NumberStyles.Any, CultureInfo.InvariantCulture, out number); + returnNumber = number; + } + else + { + long number; + success = long.TryParse(json.Substring(index, charLength), NumberStyles.Any, CultureInfo.InvariantCulture, out number); + returnNumber = number; + } + index = lastIndex + 1; + return returnNumber; + } + + static int GetLastIndexOfNumber(string json, int index) + { + int lastIndex; + for (lastIndex = index; lastIndex < json.Length; lastIndex++) + if ("0123456789+-.eE".IndexOf(json[lastIndex]) == -1) break; + return lastIndex - 1; + } + + static void EatWhitespace(string json, ref int index) + { + for (; index < json.Length; index++) + if (" \t\n\r\b\f".IndexOf(json[index]) == -1) break; + } + + static TokenType LookAhead(string json, int index) + { + int saveIndex = index; + return NextToken(json, ref saveIndex); + } + + [SuppressMessage("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + static TokenType NextToken(string json, ref int index) + { + EatWhitespace(json, ref index); + if (index == json.Length) + return TokenType.NONE; + char c = json[index]; + index++; + switch (c) + { + case '{': + return TokenType.CURLY_OPEN; + case '}': + return TokenType.CURLY_CLOSE; + case '[': + return TokenType.SQUARED_OPEN; + case ']': + return TokenType.SQUARED_CLOSE; + case ',': + return TokenType.COMMA; + case '"': + return TokenType.STRING; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case '-': + return TokenType.NUMBER; + case ':': + return TokenType.COLON; + } + index--; + int remainingLength = json.Length - index; + // false + if (remainingLength >= 5) + { + if (json[index] == 'f' && json[index + 1] == 'a' && json[index + 2] == 'l' && json[index + 3] == 's' && json[index + 4] == 'e') + { + index += 5; + return TokenType.FALSE; + } + } + // true + if (remainingLength >= 4) + { + if (json[index] == 't' && json[index + 1] == 'r' && json[index + 2] == 'u' && json[index + 3] == 'e') + { + index += 4; + return TokenType.TRUE; + } + } + // null + if (remainingLength >= 4) + { + if (json[index] == 'n' && json[index + 1] == 'u' && json[index + 2] == 'l' && json[index + 3] == 'l') + { + index += 4; + return TokenType.NULL; + } + } + return TokenType.NONE; + } + + static bool SerializeValue(IJsonSerializerStrategy jsonSerializerStrategy, object value, StringBuilder builder) + { + bool success = true; + string stringValue = value as string; + if (value == null) + builder.Append("null"); + else if (stringValue != null) + success = SerializeString(stringValue, builder); + else + { + IDictionary dict = value as IDictionary; + Type type = value.GetType(); + Type[] genArgs = ReflectionUtils.GetGenericTypeArguments(type); + var isStringKeyDictionary = type.GetTypeInfo().IsGenericType && type.GetGenericTypeDefinition() == typeof(Dictionary<,>) && genArgs[0] == typeof(string); + if (isStringKeyDictionary) + { + var strDictValue = value as IDictionary; + success = SerializeObject(jsonSerializerStrategy, strDictValue.Keys, strDictValue.Values, builder); + } + else if (dict != null) + { + success = SerializeObject(jsonSerializerStrategy, dict.Keys, dict.Values, builder); + } + else + { + IDictionary stringDictionary = value as IDictionary; + if (stringDictionary != null) + { + success = SerializeObject(jsonSerializerStrategy, stringDictionary.Keys, stringDictionary.Values, builder); + } + else + { + IEnumerable enumerableValue = value as IEnumerable; + if (enumerableValue != null) + success = SerializeArray(jsonSerializerStrategy, enumerableValue, builder); + else if (IsNumeric(value)) + success = SerializeNumber(value, builder); + else if (value is bool) + builder.Append((bool)value ? "true" : "false"); + else + { + object serializedObject; + success = jsonSerializerStrategy.TrySerializeNonPrimitiveObject(value, out serializedObject); + if (success) + SerializeValue(jsonSerializerStrategy, serializedObject, builder); + } + } + } + } + return success; + } + + static bool SerializeObject(IJsonSerializerStrategy jsonSerializerStrategy, IEnumerable keys, IEnumerable values, StringBuilder builder) + { + builder.Append("{"); + IEnumerator ke = keys.GetEnumerator(); + IEnumerator ve = values.GetEnumerator(); + bool first = true; + while (ke.MoveNext() && ve.MoveNext()) + { + object key = ke.Current; + object value = ve.Current; + if (!first) + builder.Append(","); + string stringKey = key as string; + if (stringKey != null) + SerializeString(stringKey, builder); + else + if (!SerializeValue(jsonSerializerStrategy, value, builder)) return false; + builder.Append(":"); + if (!SerializeValue(jsonSerializerStrategy, value, builder)) + return false; + first = false; + } + builder.Append("}"); + return true; + } + + static bool SerializeArray(IJsonSerializerStrategy jsonSerializerStrategy, IEnumerable anArray, StringBuilder builder) + { + builder.Append("["); + bool first = true; + foreach (object value in anArray) + { + if (!first) + builder.Append(","); + if (!SerializeValue(jsonSerializerStrategy, value, builder)) + return false; + first = false; + } + builder.Append("]"); + return true; + } + + static bool SerializeString(string aString, StringBuilder builder) + { + // Happy path if there's nothing to be escaped. IndexOfAny is highly optimized (and unmanaged) + if (aString.IndexOfAny(EscapeCharacters) == -1) + { + builder.Append('"'); + builder.Append(aString); + builder.Append('"'); + + return true; + } + + builder.Append('"'); + int safeCharacterCount = 0; + char[] charArray = aString.ToCharArray(); + + for (int i = 0; i < charArray.Length; i++) + { + char c = charArray[i]; + + // Non ascii characters are fine, buffer them up and send them to the builder + // in larger chunks if possible. The escape table is a 1:1 translation table + // with \0 [default(char)] denoting a safe character. + if (c >= EscapeTable.Length || EscapeTable[c] == default(char)) + { + safeCharacterCount++; + } + else + { + if (safeCharacterCount > 0) + { + builder.Append(charArray, i - safeCharacterCount, safeCharacterCount); + safeCharacterCount = 0; + } + + builder.Append('\\'); + builder.Append(EscapeTable[c]); + } + } + + if (safeCharacterCount > 0) + { + builder.Append(charArray, charArray.Length - safeCharacterCount, safeCharacterCount); + } + + builder.Append('"'); + return true; + } + + static bool SerializeNumber(object number, StringBuilder builder) + { + if (number is decimal) + builder.Append(((decimal)number).ToString("R", CultureInfo.InvariantCulture)); + else if (number is double) + builder.Append(((double)number).ToString("R", CultureInfo.InvariantCulture)); + else if (number is float) + builder.Append(((float)number).ToString("R", CultureInfo.InvariantCulture)); + else if (NumberTypes.IndexOf(number.GetType()) != -1) + builder.Append(number); + return true; + } + + /// + /// Determines if a given object is numeric in any way + /// (can be integer, double, null, etc). + /// + static bool IsNumeric(object value) + { + if (value is sbyte) return true; + if (value is byte) return true; + if (value is short) return true; + if (value is ushort) return true; + if (value is int) return true; + if (value is uint) return true; + if (value is long) return true; + if (value is ulong) return true; + if (value is float) return true; + if (value is double) return true; + if (value is decimal) return true; + return false; + } + + private static IJsonSerializerStrategy _currentJsonSerializerStrategy; + public static IJsonSerializerStrategy CurrentJsonSerializerStrategy + { + get + { + return _currentJsonSerializerStrategy ?? + (_currentJsonSerializerStrategy = +#if SIMPLE_JSON_DATACONTRACT + DataContractJsonSerializerStrategy +#else + PocoJsonSerializerStrategy +#endif +); + } + set + { + _currentJsonSerializerStrategy = value; + } + } + + private static PocoJsonSerializerStrategy _pocoJsonSerializerStrategy; + [EditorBrowsable(EditorBrowsableState.Advanced)] + public static PocoJsonSerializerStrategy PocoJsonSerializerStrategy + { + get + { + return _pocoJsonSerializerStrategy ?? (_pocoJsonSerializerStrategy = new PocoJsonSerializerStrategy()); + } + } + +#if SIMPLE_JSON_DATACONTRACT + + private static DataContractJsonSerializerStrategy _dataContractJsonSerializerStrategy; + [System.ComponentModel.EditorBrowsable(EditorBrowsableState.Advanced)] + public static DataContractJsonSerializerStrategy DataContractJsonSerializerStrategy + { + get + { + return _dataContractJsonSerializerStrategy ?? (_dataContractJsonSerializerStrategy = new DataContractJsonSerializerStrategy()); + } + } + +#endif + } + + [GeneratedCode("simple-json", "1.0.0")] +#if SIMPLE_JSON_INTERNAL + internal +#else + public +#endif + interface IJsonSerializerStrategy + { + [SuppressMessage("Microsoft.Design", "CA1007:UseGenericsWhereAppropriate", Justification = "Need to support .NET 2")] + bool TrySerializeNonPrimitiveObject(object input, out object output); + object DeserializeObject(object value, Type type); + } + + [GeneratedCode("simple-json", "1.0.0")] +#if SIMPLE_JSON_INTERNAL + internal +#else + public +#endif + class PocoJsonSerializerStrategy : IJsonSerializerStrategy + { + internal IDictionary ConstructorCache; + internal IDictionary> GetCache; + internal IDictionary>> SetCache; + + internal static readonly Type[] EmptyTypes = new Type[0]; + internal static readonly Type[] ArrayConstructorParameterTypes = new Type[] { typeof(int) }; + + private static readonly string[] Iso8601Format = new string[] + { + @"yyyy-MM-dd\THH:mm:ss.FFFFFFF\Z", + @"yyyy-MM-dd\THH:mm:ss\Z", + @"yyyy-MM-dd\THH:mm:ssK" + }; + + public PocoJsonSerializerStrategy() + { + ConstructorCache = new ReflectionUtils.ThreadSafeDictionary(ContructorDelegateFactory); + GetCache = new ReflectionUtils.ThreadSafeDictionary>(GetterValueFactory); + SetCache = new ReflectionUtils.ThreadSafeDictionary>>(SetterValueFactory); + } + + protected virtual string MapClrMemberNameToJsonFieldName(MemberInfo memberInfo) + { + // TODO: Optimize and/or cache + foreach (JsonProperty eachAttr in memberInfo.GetCustomAttributes(typeof(JsonProperty), true)) + if (!string.IsNullOrEmpty(eachAttr.PropertyName)) + return eachAttr.PropertyName; + return memberInfo.Name; + } + + protected virtual void MapClrMemberNameToJsonFieldName(MemberInfo memberInfo, out string jsonName, out JsonProperty jsonProp) + { + jsonName = memberInfo.Name; + jsonProp = null; + // TODO: Optimize and/or cache + foreach (JsonProperty eachAttr in memberInfo.GetCustomAttributes(typeof(JsonProperty), true)) + { + jsonProp = eachAttr; + if (!string.IsNullOrEmpty(eachAttr.PropertyName)) + jsonName = eachAttr.PropertyName; + } + } + + internal virtual ReflectionUtils.ConstructorDelegate ContructorDelegateFactory(Type key) + { + return ReflectionUtils.GetContructor(key, key.IsArray ? ArrayConstructorParameterTypes : EmptyTypes); + } + + internal virtual IDictionary GetterValueFactory(Type type) + { + IDictionary result = new Dictionary(); + foreach (PropertyInfo propertyInfo in ReflectionUtils.GetProperties(type)) + { + if (propertyInfo.CanRead) + { + MethodInfo getMethod = ReflectionUtils.GetGetterMethodInfo(propertyInfo); + if (getMethod.IsStatic || !getMethod.IsPublic) + continue; + result[propertyInfo] = ReflectionUtils.GetGetMethod(propertyInfo); + } + } + foreach (FieldInfo fieldInfo in ReflectionUtils.GetFields(type)) + { + if (fieldInfo.IsStatic || !fieldInfo.IsPublic) + continue; + result[fieldInfo] = ReflectionUtils.GetGetMethod(fieldInfo); + } + return result; + } + + internal virtual IDictionary> SetterValueFactory(Type type) + { + IDictionary> result = new Dictionary>(); + foreach (PropertyInfo propertyInfo in ReflectionUtils.GetProperties(type)) + { + if (propertyInfo.CanWrite) + { + MethodInfo setMethod = ReflectionUtils.GetSetterMethodInfo(propertyInfo); + if (setMethod.IsStatic || !setMethod.IsPublic) + continue; + result[MapClrMemberNameToJsonFieldName(propertyInfo)] = new KeyValuePair(propertyInfo.PropertyType, ReflectionUtils.GetSetMethod(propertyInfo)); + } + } + foreach (FieldInfo fieldInfo in ReflectionUtils.GetFields(type)) + { + if (fieldInfo.IsInitOnly || fieldInfo.IsStatic || !fieldInfo.IsPublic) + continue; + result[MapClrMemberNameToJsonFieldName(fieldInfo)] = new KeyValuePair(fieldInfo.FieldType, ReflectionUtils.GetSetMethod(fieldInfo)); + } + return result; + } + + public virtual bool TrySerializeNonPrimitiveObject(object input, out object output) + { + return TrySerializeKnownTypes(input, out output) || TrySerializeUnknownTypes(input, out output); + } + + [SuppressMessage("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + public virtual object DeserializeObject(object value, Type type) + { + if (type == null) throw new ArgumentNullException("type"); + if (value != null && type.IsInstanceOfType(value)) return value; + + string str = value as string; + if (type == typeof(Guid) && string.IsNullOrEmpty(str)) + return default(Guid); + + if (value == null) + return null; + + object obj = null; + + if (str != null) + { + if (str.Length != 0) // We know it can't be null now. + { + if (type == typeof(DateTime) || (ReflectionUtils.IsNullableType(type) && Nullable.GetUnderlyingType(type) == typeof(DateTime))) + return DateTime.ParseExact(str, Iso8601Format, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal); + if (type == typeof(DateTimeOffset) || (ReflectionUtils.IsNullableType(type) && Nullable.GetUnderlyingType(type) == typeof(DateTimeOffset))) + return DateTimeOffset.ParseExact(str, Iso8601Format, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal); + if (type == typeof(Guid) || (ReflectionUtils.IsNullableType(type) && Nullable.GetUnderlyingType(type) == typeof(Guid))) + return new Guid(str); + if (type == typeof(Uri)) + { + bool isValid = Uri.IsWellFormedUriString(str, UriKind.RelativeOrAbsolute); + + Uri result; + if (isValid && Uri.TryCreate(str, UriKind.RelativeOrAbsolute, out result)) + return result; + + return null; + } + + if (type == typeof(string)) + return str; + + return Convert.ChangeType(str, type, CultureInfo.InvariantCulture); + } + else + { + if (type == typeof(Guid)) + obj = default(Guid); + else if (ReflectionUtils.IsNullableType(type) && Nullable.GetUnderlyingType(type) == typeof(Guid)) + obj = null; + else + obj = str; + } + // Empty string case + if (!ReflectionUtils.IsNullableType(type) && Nullable.GetUnderlyingType(type) == typeof(Guid)) + return str; + } + else if (value is bool) + return value; + + bool valueIsLong = value is long; + bool valueIsUlong = value is ulong; + bool valueIsDouble = value is double; + Type nullableType = Nullable.GetUnderlyingType(type); + if (nullableType != null && PlayFabSimpleJson.NumberTypes.IndexOf(nullableType) != -1) + type = nullableType; // Just use the regular type for the conversion + bool isNumberType = PlayFabSimpleJson.NumberTypes.IndexOf(type) != -1; + bool isEnumType = type.GetTypeInfo().IsEnum; + if ((valueIsLong && type == typeof(long)) || (valueIsUlong && type == typeof(ulong)) || (valueIsDouble && type == typeof(double))) + return value; + if ((valueIsLong || valueIsUlong || valueIsDouble) && isEnumType) + return Enum.ToObject(type, Convert.ChangeType(value, Enum.GetUnderlyingType(type), CultureInfo.InvariantCulture)); + if ((valueIsLong || valueIsUlong || valueIsDouble) && isNumberType) + return Convert.ChangeType(value, type, CultureInfo.InvariantCulture); + + IDictionary objects = value as IDictionary; + if (objects != null) + { + IDictionary jsonObject = objects; + + if (ReflectionUtils.IsTypeDictionary(type)) + { + // if dictionary then + Type[] types = ReflectionUtils.GetGenericTypeArguments(type); + Type keyType = types[0]; + Type valueType = types[1]; + + Type genericType = typeof(Dictionary<,>).MakeGenericType(keyType, valueType); + + IDictionary dict = (IDictionary)ConstructorCache[genericType](); + + foreach (KeyValuePair kvp in jsonObject) + dict.Add(kvp.Key, DeserializeObject(kvp.Value, valueType)); + + obj = dict; + } + else + { + if (type == typeof(object)) + obj = value; + else + { + obj = ConstructorCache[type](); + foreach (KeyValuePair> setter in SetCache[type]) + { + object jsonValue; + if (jsonObject.TryGetValue(setter.Key, out jsonValue)) + { + jsonValue = DeserializeObject(jsonValue, setter.Value.Key); + setter.Value.Value(obj, jsonValue); + } + } + } + } + } + else + { + IList valueAsList = value as IList; + if (valueAsList != null) + { + IList jsonObject = valueAsList; + IList list = null; + + if (type.IsArray) + { + list = (IList)ConstructorCache[type](jsonObject.Count); + int i = 0; + foreach (object o in jsonObject) + list[i++] = DeserializeObject(o, type.GetElementType()); + } + else if (ReflectionUtils.IsTypeGenericeCollectionInterface(type) || ReflectionUtils.IsAssignableFrom(typeof(IList), type) || type == typeof(object)) + { + Type innerType = ReflectionUtils.GetGenericListElementType(type); + ReflectionUtils.ConstructorDelegate ctrDelegate = null; + if (type != typeof(object)) + ctrDelegate = ConstructorCache[type]; + if (ctrDelegate == null) + ctrDelegate = ConstructorCache[typeof(List<>).MakeGenericType(innerType)]; + list = (IList)ctrDelegate(); + foreach (object o in jsonObject) + list.Add(DeserializeObject(o, innerType)); + } + obj = list; + } + return obj; + } + if (ReflectionUtils.IsNullableType(type)) + return ReflectionUtils.ToNullableType(obj, type); + return obj; + } + + protected virtual object SerializeEnum(Enum p) + { + return Convert.ToDouble(p, CultureInfo.InvariantCulture); + } + + [SuppressMessage("Microsoft.Design", "CA1007:UseGenericsWhereAppropriate", Justification = "Need to support .NET 2")] + protected virtual bool TrySerializeKnownTypes(object input, out object output) + { + bool returnValue = true; + if (input is DateTime) + output = ((DateTime)input).ToUniversalTime().ToString(Iso8601Format[0], CultureInfo.InvariantCulture); + else if (input is DateTimeOffset) + output = ((DateTimeOffset)input).ToUniversalTime().ToString(Iso8601Format[0], CultureInfo.InvariantCulture); + else if (input is Guid) + output = ((Guid)input).ToString("D"); + else if (input is Uri) + output = input.ToString(); + else + { + Enum inputEnum = input as Enum; + if (inputEnum != null) + output = SerializeEnum(inputEnum); + else + { + returnValue = false; + output = null; + } + } + return returnValue; + } + [SuppressMessage("Microsoft.Design", "CA1007:UseGenericsWhereAppropriate", Justification = "Need to support .NET 2")] + protected virtual bool TrySerializeUnknownTypes(object input, out object output) + { + if (input == null) throw new ArgumentNullException("input"); + output = null; + Type type = input.GetType(); + if (type.FullName == null) + return false; + IDictionary obj = new JsonObject(); + IDictionary getters = GetCache[type]; + foreach (KeyValuePair getter in getters) + { + if (getter.Value == null) + continue; + string jsonKey; + JsonProperty jsonProp; + MapClrMemberNameToJsonFieldName(getter.Key, out jsonKey, out jsonProp); + if (obj.ContainsKey(jsonKey)) + throw new Exception("The given key is defined multiple times in the same type: " + input.GetType().Name + "." + jsonKey); + object value = getter.Value(input); + if (jsonProp == null || jsonProp.NullValueHandling == NullValueHandling.Include || value != null) + obj.Add(jsonKey, value); + } + output = obj; + return true; + } + } + +#if SIMPLE_JSON_DATACONTRACT + [GeneratedCode("simple-json", "1.0.0")] +#if SIMPLE_JSON_INTERNAL + internal +#else + public +#endif + class DataContractJsonSerializerStrategy : PocoJsonSerializerStrategy + { + public DataContractJsonSerializerStrategy() + { + GetCache = new ReflectionUtils.ThreadSafeDictionary>(GetterValueFactory); + SetCache = new ReflectionUtils.ThreadSafeDictionary>>(SetterValueFactory); + } + + internal override IDictionary GetterValueFactory(Type type) + { + bool hasDataContract = ReflectionUtils.GetAttribute(type, typeof(DataContractAttribute)) != null; + if (!hasDataContract) + return base.GetterValueFactory(type); + string jsonKey; + IDictionary result = new Dictionary(); + foreach (PropertyInfo propertyInfo in ReflectionUtils.GetProperties(type)) + { + if (propertyInfo.CanRead) + { + MethodInfo getMethod = ReflectionUtils.GetGetterMethodInfo(propertyInfo); + if (!getMethod.IsStatic && CanAdd(propertyInfo, out jsonKey)) + result[jsonKey] = ReflectionUtils.GetGetMethod(propertyInfo); + } + } + foreach (FieldInfo fieldInfo in ReflectionUtils.GetFields(type)) + { + if (!fieldInfo.IsStatic && CanAdd(fieldInfo, out jsonKey)) + result[jsonKey] = ReflectionUtils.GetGetMethod(fieldInfo); + } + return result; + } + + internal override IDictionary> SetterValueFactory(Type type) + { + bool hasDataContract = ReflectionUtils.GetAttribute(type, typeof(DataContractAttribute)) != null; + if (!hasDataContract) + return base.SetterValueFactory(type); + string jsonKey; + IDictionary> result = new Dictionary>(); + foreach (PropertyInfo propertyInfo in ReflectionUtils.GetProperties(type)) + { + if (propertyInfo.CanWrite) + { + MethodInfo setMethod = ReflectionUtils.GetSetterMethodInfo(propertyInfo); + if (!setMethod.IsStatic && CanAdd(propertyInfo, out jsonKey)) + result[jsonKey] = new KeyValuePair(propertyInfo.PropertyType, ReflectionUtils.GetSetMethod(propertyInfo)); + } + } + foreach (FieldInfo fieldInfo in ReflectionUtils.GetFields(type)) + { + if (!fieldInfo.IsInitOnly && !fieldInfo.IsStatic && CanAdd(fieldInfo, out jsonKey)) + result[jsonKey] = new KeyValuePair(fieldInfo.FieldType, ReflectionUtils.GetSetMethod(fieldInfo)); + } + // todo implement sorting for DATACONTRACT. + return result; + } + + private static bool CanAdd(MemberInfo info, out string jsonKey) + { + jsonKey = null; + if (ReflectionUtils.GetAttribute(info, typeof(IgnoreDataMemberAttribute)) != null) + return false; + DataMemberAttribute dataMemberAttribute = (DataMemberAttribute)ReflectionUtils.GetAttribute(info, typeof(DataMemberAttribute)); + if (dataMemberAttribute == null) + return false; + jsonKey = string.IsNullOrEmpty(dataMemberAttribute.Name) ? info.Name : dataMemberAttribute.Name; + return true; + } + } + +#endif + + // This class is meant to be copied into other libraries. So we want to exclude it from Code Analysis rules + // that might be in place in the target project. + [GeneratedCode("reflection-utils", "1.0.0")] +#if SIMPLE_JSON_REFLECTION_UTILS_PUBLIC + public +#else + internal +#endif + class ReflectionUtils + { + private static readonly object[] EmptyObjects = new object[0]; + + public delegate object GetDelegate(object source); + public delegate void SetDelegate(object source, object value); + public delegate object ConstructorDelegate(params object[] args); + + public delegate TValue ThreadSafeDictionaryValueFactory(TKey key); + + [ThreadStatic] + private static object[] _1ObjArray; + +#if SIMPLE_JSON_TYPEINFO + public static TypeInfo GetTypeInfo(Type type) + { + return type.GetTypeInfo(); + } +#else + public static Type GetTypeInfo(Type type) + { + return type; + } +#endif + + public static Attribute GetAttribute(MemberInfo info, Type type) + { +#if SIMPLE_JSON_TYPEINFO + if (info == null || type == null || !info.IsDefined(type)) + return null; + return info.GetCustomAttribute(type); +#else + if (info == null || type == null || !Attribute.IsDefined(info, type)) + return null; + return Attribute.GetCustomAttribute(info, type); +#endif + } + + public static Type GetGenericListElementType(Type type) + { + if (type == typeof(object)) + return type; + + IEnumerable interfaces; +#if SIMPLE_JSON_TYPEINFO + interfaces = type.GetTypeInfo().ImplementedInterfaces; +#else + interfaces = type.GetInterfaces(); +#endif + foreach (Type implementedInterface in interfaces) + { + if (IsTypeGeneric(implementedInterface) && + implementedInterface.GetGenericTypeDefinition() == typeof(IList<>)) + { + return GetGenericTypeArguments(implementedInterface)[0]; + } + } + return GetGenericTypeArguments(type)[0]; + } + + public static Attribute GetAttribute(Type objectType, Type attributeType) + { + +#if SIMPLE_JSON_TYPEINFO + if (objectType == null || attributeType == null || !objectType.GetTypeInfo().IsDefined(attributeType)) + return null; + return objectType.GetTypeInfo().GetCustomAttribute(attributeType); +#else + if (objectType == null || attributeType == null || !Attribute.IsDefined(objectType, attributeType)) + return null; + return Attribute.GetCustomAttribute(objectType, attributeType); +#endif + } + + public static Type[] GetGenericTypeArguments(Type type) + { +#if SIMPLE_JSON_TYPEINFO + return type.GetTypeInfo().GenericTypeArguments; +#else + return type.GetGenericArguments(); +#endif + } + + public static bool IsTypeGeneric(Type type) + { + return GetTypeInfo(type).IsGenericType; + } + + public static bool IsTypeGenericeCollectionInterface(Type type) + { + if (!IsTypeGeneric(type)) + return false; + + Type genericDefinition = type.GetGenericTypeDefinition(); + + return (genericDefinition == typeof(IList<>) + || genericDefinition == typeof(ICollection<>) + || genericDefinition == typeof(IEnumerable<>) +#if SIMPLE_JSON_READONLY_COLLECTIONS + || genericDefinition == typeof(IReadOnlyCollection<>) + || genericDefinition == typeof(IReadOnlyList<>) +#endif +); + } + + public static bool IsAssignableFrom(Type type1, Type type2) + { + return GetTypeInfo(type1).IsAssignableFrom(GetTypeInfo(type2)); + } + + public static bool IsTypeDictionary(Type type) + { +#if SIMPLE_JSON_TYPEINFO + if (typeof(IDictionary<,>).GetTypeInfo().IsAssignableFrom(type.GetTypeInfo())) + return true; +#else + if (typeof(System.Collections.IDictionary).IsAssignableFrom(type)) + return true; +#endif + if (!GetTypeInfo(type).IsGenericType) + return false; + + Type genericDefinition = type.GetGenericTypeDefinition(); + return genericDefinition == typeof(IDictionary<,>) || genericDefinition == typeof(Dictionary<,>); + } + + public static bool IsNullableType(Type type) + { + return GetTypeInfo(type).IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>); + } + + public static object ToNullableType(object obj, Type nullableType) + { + return obj == null ? null : Convert.ChangeType(obj, Nullable.GetUnderlyingType(nullableType), CultureInfo.InvariantCulture); + } + + public static bool IsValueType(Type type) + { + return GetTypeInfo(type).IsValueType; + } + + public static IEnumerable GetConstructors(Type type) + { +#if SIMPLE_JSON_TYPEINFO + return type.GetTypeInfo().DeclaredConstructors; +#else + return type.GetConstructors(); +#endif + } + + public static ConstructorInfo GetConstructorInfo(Type type, params Type[] argsType) + { + IEnumerable constructorInfos = GetConstructors(type); + int i; + bool matches; + foreach (ConstructorInfo constructorInfo in constructorInfos) + { + ParameterInfo[] parameters = constructorInfo.GetParameters(); + if (argsType.Length != parameters.Length) + continue; + + i = 0; + matches = true; + foreach (ParameterInfo parameterInfo in constructorInfo.GetParameters()) + { + if (parameterInfo.ParameterType != argsType[i]) + { + matches = false; + break; + } + } + + if (matches) + return constructorInfo; + } + + return null; + } + + public static IEnumerable GetProperties(Type type) + { +#if SIMPLE_JSON_TYPEINFO + return type.GetRuntimeProperties(); +#else + return type.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static); +#endif + } + + public static IEnumerable GetFields(Type type) + { +#if SIMPLE_JSON_TYPEINFO + return type.GetRuntimeFields(); +#else + return type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static); +#endif + } + + public static MethodInfo GetGetterMethodInfo(PropertyInfo propertyInfo) + { +#if SIMPLE_JSON_TYPEINFO + return propertyInfo.GetMethod; +#else + return propertyInfo.GetGetMethod(true); +#endif + } + + public static MethodInfo GetSetterMethodInfo(PropertyInfo propertyInfo) + { +#if SIMPLE_JSON_TYPEINFO + return propertyInfo.SetMethod; +#else + return propertyInfo.GetSetMethod(true); +#endif + } + + public static ConstructorDelegate GetContructor(ConstructorInfo constructorInfo) + { + return GetConstructorByReflection(constructorInfo); + } + + public static ConstructorDelegate GetContructor(Type type, params Type[] argsType) + { + return GetConstructorByReflection(type, argsType); + } + + public static ConstructorDelegate GetConstructorByReflection(ConstructorInfo constructorInfo) + { + return delegate (object[] args) + { + var x = constructorInfo; + return x.Invoke(args); + }; + } + + public static ConstructorDelegate GetConstructorByReflection(Type type, params Type[] argsType) + { + ConstructorInfo constructorInfo = GetConstructorInfo(type, argsType); + return constructorInfo == null ? null : GetConstructorByReflection(constructorInfo); + } + + public static GetDelegate GetGetMethod(PropertyInfo propertyInfo) + { + return GetGetMethodByReflection(propertyInfo); + } + + public static GetDelegate GetGetMethod(FieldInfo fieldInfo) + { + return GetGetMethodByReflection(fieldInfo); + } + + public static GetDelegate GetGetMethodByReflection(PropertyInfo propertyInfo) + { + MethodInfo methodInfo = GetGetterMethodInfo(propertyInfo); + return delegate (object source) { return methodInfo.Invoke(source, EmptyObjects); }; + } + + public static GetDelegate GetGetMethodByReflection(FieldInfo fieldInfo) + { + return delegate (object source) { return fieldInfo.GetValue(source); }; + } + + public static SetDelegate GetSetMethod(PropertyInfo propertyInfo) + { + return GetSetMethodByReflection(propertyInfo); + } + + public static SetDelegate GetSetMethod(FieldInfo fieldInfo) + { + return GetSetMethodByReflection(fieldInfo); + } + + public static SetDelegate GetSetMethodByReflection(PropertyInfo propertyInfo) + { + MethodInfo methodInfo = GetSetterMethodInfo(propertyInfo); + return delegate (object source, object value) + { + if (_1ObjArray == null) + _1ObjArray = new object[1]; + _1ObjArray[0] = value; + methodInfo.Invoke(source, _1ObjArray); + }; + } + + public static SetDelegate GetSetMethodByReflection(FieldInfo fieldInfo) + { + return delegate (object source, object value) { fieldInfo.SetValue(source, value); }; + } + + public sealed class ThreadSafeDictionary : IDictionary + { + private readonly object _lock = new object(); + private readonly ThreadSafeDictionaryValueFactory _valueFactory; + private Dictionary _dictionary; + + public ThreadSafeDictionary(ThreadSafeDictionaryValueFactory valueFactory) + { + _valueFactory = valueFactory; + } + + private TValue Get(TKey key) + { + if (_dictionary == null) + return AddValue(key); + TValue value; + if (!_dictionary.TryGetValue(key, out value)) + return AddValue(key); + return value; + } + + private TValue AddValue(TKey key) + { + TValue value = _valueFactory(key); + lock (_lock) + { + if (_dictionary == null) + { + _dictionary = new Dictionary(); + _dictionary[key] = value; + } + else + { + TValue val; + if (_dictionary.TryGetValue(key, out val)) + return val; + Dictionary dict = new Dictionary(_dictionary); + dict[key] = value; + _dictionary = dict; + } + } + return value; + } + + public void Add(TKey key, TValue value) + { + throw new NotImplementedException(); + } + + public bool ContainsKey(TKey key) + { + return _dictionary.ContainsKey(key); + } + + public ICollection Keys + { + get { return _dictionary.Keys; } + } + + public bool Remove(TKey key) + { + throw new NotImplementedException(); + } + + public bool TryGetValue(TKey key, out TValue value) + { + value = this[key]; + return true; + } + + public ICollection Values + { + get { return _dictionary.Values; } + } + + public TValue this[TKey key] + { + get { return Get(key); } + set { throw new NotImplementedException(); } + } + + public void Add(KeyValuePair item) + { + throw new NotImplementedException(); + } + + public void Clear() + { + throw new NotImplementedException(); + } + + public bool Contains(KeyValuePair item) + { + throw new NotImplementedException(); + } + + public void CopyTo(KeyValuePair[] array, int arrayIndex) + { + throw new NotImplementedException(); + } + + public int Count + { + get { return _dictionary.Count; } + } + + public bool IsReadOnly + { + get { throw new NotImplementedException(); } + } + + public bool Remove(KeyValuePair item) + { + throw new NotImplementedException(); + } + + public IEnumerator> GetEnumerator() + { + return _dictionary.GetEnumerator(); + } + + System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() + { + return _dictionary.GetEnumerator(); + } + } + } +} + +// ReSharper restore LoopCanBeConvertedToQuery +// ReSharper restore RedundantExplicitArrayCreation +// ReSharper restore SuggestUseVarKeywordEvident diff --git a/Assets/PlayFabSDK/Shared/Internal/SimpleJson.cs.meta b/Assets/PlayFabSDK/Shared/Internal/SimpleJson.cs.meta new file mode 100644 index 00000000..38d3b82f --- /dev/null +++ b/Assets/PlayFabSDK/Shared/Internal/SimpleJson.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: bce6184794650f24fa8ac244b25edc17 +timeCreated: 1462682372 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Shared/Internal/SingletonMonoBehaviour.cs b/Assets/PlayFabSDK/Shared/Internal/SingletonMonoBehaviour.cs new file mode 100644 index 00000000..4abc8b34 --- /dev/null +++ b/Assets/PlayFabSDK/Shared/Internal/SingletonMonoBehaviour.cs @@ -0,0 +1,58 @@ +using UnityEngine; + +namespace PlayFab.Internal +{ + //public to be accessible by Unity engine + public class SingletonMonoBehaviour : MonoBehaviour where T : SingletonMonoBehaviour + { + private static T _instance; + + public static T instance + { + get + { + CreateInstance(); + return _instance; + } + } + + public static void CreateInstance() + { + if (_instance == null) + { + //find existing instance + _instance = FindObjectOfType(); + if (_instance == null) + { + //create new instance + var go = new GameObject(typeof(T).Name); + _instance = go.AddComponent(); + } + //initialize instance if necessary + if (!_instance.initialized) + { + _instance.Initialize(); + _instance.initialized = true; + } + } + } + + public virtual void Awake () + { + if (Application.isPlaying) + { + DontDestroyOnLoad(this); + } + + //check if instance already exists when reloading original scene + if (_instance != null) + { + DestroyImmediate (gameObject); + } + } + + protected bool initialized; + + protected virtual void Initialize() { } + } +} diff --git a/Assets/PlayFabSDK/Shared/Internal/SingletonMonoBehaviour.cs.meta b/Assets/PlayFabSDK/Shared/Internal/SingletonMonoBehaviour.cs.meta new file mode 100644 index 00000000..4a1f14a2 --- /dev/null +++ b/Assets/PlayFabSDK/Shared/Internal/SingletonMonoBehaviour.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: f6a51fa1ed684497db153f40961979c4 +timeCreated: 1462682373 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Shared/Internal/Util.cs b/Assets/PlayFabSDK/Shared/Internal/Util.cs new file mode 100644 index 00000000..6c5e4650 --- /dev/null +++ b/Assets/PlayFabSDK/Shared/Internal/Util.cs @@ -0,0 +1,157 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Text; + +#if NETFX_CORE +using System.Reflection; +#endif + +namespace PlayFab.Internal +{ + public static class PlayFabUtil + { + static PlayFabUtil() { } + + private static string _localSettingsFileName = "playfab.local.settings.json"; + public static readonly string[] _defaultDateTimeFormats = new string[]{ // All parseable ISO 8601 formats for DateTime.[Try]ParseExact - Lets us deserialize any legacy timestamps in one of these formats + // These are the standard format with ISO 8601 UTC markers (T/Z) + "yyyy-MM-ddTHH:mm:ss.FFFFFFZ", + "yyyy-MM-ddTHH:mm:ss.FFFFZ", + "yyyy-MM-ddTHH:mm:ss.FFFZ", // DEFAULT_UTC_OUTPUT_INDEX + "yyyy-MM-ddTHH:mm:ss.FFZ", + "yyyy-MM-ddTHH:mm:ssZ", + "yyyy-MM-dd HH:mm:ssZ", // Added for Android Push Plugin + + // These are the standard format without ISO 8601 UTC markers (T/Z) + "yyyy-MM-dd HH:mm:ss.FFFFFF", + "yyyy-MM-dd HH:mm:ss.FFFF", + "yyyy-MM-dd HH:mm:ss.FFF", + "yyyy-MM-dd HH:mm:ss.FF", // DEFAULT_LOCAL_OUTPUT_INDEX + "yyyy-MM-dd HH:mm:ss", + + // These are the result of an input bug, which we now have to support as long as the db has entries formatted like this + "yyyy-MM-dd HH:mm.ss.FFFF", + "yyyy-MM-dd HH:mm.ss.FFF", + "yyyy-MM-dd HH:mm.ss.FF", + "yyyy-MM-dd HH:mm.ss", + }; + public const int DEFAULT_UTC_OUTPUT_INDEX = 2; // The default format everybody should use + public const int DEFAULT_LOCAL_OUTPUT_INDEX = 9; // The default format if you want to use local time (This doesn't have universal support in all PlayFab code) + public static DateTimeStyles DateTimeStyles = DateTimeStyles.RoundtripKind; + + public static string timeStamp + { + get { return DateTime.Now.ToString(_defaultDateTimeFormats[DEFAULT_LOCAL_OUTPUT_INDEX]); } + } + + public static string utcTimeStamp + { + get { return DateTime.UtcNow.ToString(_defaultDateTimeFormats[DEFAULT_UTC_OUTPUT_INDEX]); } + } + + public static string Format(string text, params object[] args) + { + return args.Length > 0 ? string.Format(text, args) : text; + } + + [ThreadStatic] + private static StringBuilder _sb; + /// + /// A threadsafe way to block and load a text file + /// + /// Load a text file, and return the file as text. + /// Used for small (usually json) files. + /// + public static string ReadAllFileText(string filename) + { + if (!File.Exists(filename)) + { + return string.Empty; + } + + if (_sb == null) + { + _sb = new StringBuilder(); + } + _sb.Length = 0; + + using (var fs = new FileStream(filename, FileMode.Open)) + { + using (var br = new BinaryReader(fs)) + { + while (br.BaseStream.Position != br.BaseStream.Length) + { + _sb.Append(br.ReadChar()); + } + } + } + + return _sb.ToString(); + } + + public static T TryEnumParse(string value, T defaultValue) + { + try + { + return (T)Enum.Parse(typeof(T), value); + } + catch (InvalidCastException) + { + return defaultValue; + } + catch (Exception e) + { + UnityEngine.Debug.LogError("Enum cast failed with unknown error: " + e.Message); + return defaultValue; + } + } + +#if UNITY_2017_1_OR_NEWER + internal static string GetLocalSettingsFileProperty(string propertyKey) + { + string envFileContent = null; + + string currDir = Directory.GetCurrentDirectory(); + string currDirEnvFile = Path.Combine(currDir, _localSettingsFileName); + + if (File.Exists(currDirEnvFile)) + { + envFileContent = ReadAllFileText(currDirEnvFile); + } + else + { + string tempDir = Path.GetTempPath(); + string tempDirEnvFile = Path.Combine(tempDir, _localSettingsFileName); + + if (File.Exists(tempDirEnvFile)) + { + envFileContent = ReadAllFileText(tempDirEnvFile); + } + } + + if (!string.IsNullOrEmpty(envFileContent)) + { + var serializer = PluginManager.GetPlugin(PluginContract.PlayFab_Serializer); + var envJson = serializer.DeserializeObject>(envFileContent); + try + { + object result; + if (envJson.TryGetValue(propertyKey, out result)) + { + return result == null ? null : result.ToString(); + } + + return null; + } + catch (KeyNotFoundException) + { + return string.Empty; + } + } + return string.Empty; + } +#endif + } +} diff --git a/Assets/PlayFabSDK/Shared/Internal/Util.cs.meta b/Assets/PlayFabSDK/Shared/Internal/Util.cs.meta new file mode 100644 index 00000000..199e91ed --- /dev/null +++ b/Assets/PlayFabSDK/Shared/Internal/Util.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: b3bfc0fbdbe1a36429699dfc30c9e488 +timeCreated: 1462682372 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Shared/Internal/wsaReflectionExtensions.cs b/Assets/PlayFabSDK/Shared/Internal/wsaReflectionExtensions.cs new file mode 100644 index 00000000..db85a94e --- /dev/null +++ b/Assets/PlayFabSDK/Shared/Internal/wsaReflectionExtensions.cs @@ -0,0 +1,66 @@ +#if UNITY_WSA && UNITY_WP8 +#define NETFX_CORE +#endif + +using System; +using System.Collections.Generic; +using System.Reflection; +using System.Text; + +namespace PlayFab +{ + public static class WsaReflectionExtensions + { +#if !NETFX_CORE + public static Delegate CreateDelegate(this MethodInfo methodInfo, Type delegateType, object instance) + { + return Delegate.CreateDelegate(delegateType, instance, methodInfo); + } + public static Type GetTypeInfo(this Type type) + { + return type; + } + public static Type AsType(this Type type) + { + return type; + } + public static string GetDelegateName(this Delegate delegateInstance) + { + return delegateInstance.Method.Name; + } +#else + public static bool IsInstanceOfType(this Type type, object obj) + { + return obj != null && type.GetTypeInfo().IsAssignableFrom(obj.GetType().GetTypeInfo()); + } + public static string GetDelegateName(this Delegate delegateInstance) + { + return delegateInstance.ToString(); + } + public static MethodInfo GetMethod(this Type type, string methodName) + { + return type.GetTypeInfo().GetDeclaredMethod(methodName); + } + public static IEnumerable GetFields(this TypeInfo typeInfo) + { + return typeInfo.DeclaredFields; + } + public static TypeInfo GetTypeInfo(this TypeInfo typeInfo) + { + return typeInfo; + } + public static IEnumerable GetConstructors(this TypeInfo typeInfo) + { + return typeInfo.DeclaredConstructors; + } + public static IEnumerable GetMethods(this TypeInfo typeInfo, BindingFlags ignored) + { + return typeInfo.DeclaredMethods; + } + public static IEnumerable GetTypes(this Assembly assembly) + { + return assembly.DefinedTypes; + } +#endif + } +} diff --git a/Assets/PlayFabSDK/Shared/Internal/wsaReflectionExtensions.cs.meta b/Assets/PlayFabSDK/Shared/Internal/wsaReflectionExtensions.cs.meta new file mode 100644 index 00000000..aa63e032 --- /dev/null +++ b/Assets/PlayFabSDK/Shared/Internal/wsaReflectionExtensions.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 1b20d57e2279b3a408268b20c2be2208 +timeCreated: 1468890373 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Shared/Models.meta b/Assets/PlayFabSDK/Shared/Models.meta new file mode 100644 index 00000000..eabacb04 --- /dev/null +++ b/Assets/PlayFabSDK/Shared/Models.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 11942c5efe97c9d448ccaa2b0bb6aa39 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Shared/Models/PlayFabSharedSettings.cs b/Assets/PlayFabSDK/Shared/Models/PlayFabSharedSettings.cs new file mode 100644 index 00000000..8067a126 --- /dev/null +++ b/Assets/PlayFabSDK/Shared/Models/PlayFabSharedSettings.cs @@ -0,0 +1,36 @@ +using UnityEngine; +using PlayFab; + +#if UNITY_5_3_OR_NEWER +[CreateAssetMenu(fileName = "PlayFabSharedSettings", menuName = "PlayFab/CreateSharedSettings", order = 1)] +#endif +public class PlayFabSharedSettings : ScriptableObject +{ + public string TitleId; + + internal string VerticalName = null; +#if ENABLE_PLAYFABSERVER_API || ENABLE_PLAYFABADMIN_API || UNITY_EDITOR || ENABLE_PLAYFAB_SECRETKEY + public string DeveloperSecretKey; +#endif + public string ProductionEnvironmentUrl = ""; + +#if UNITY_2017_2_OR_NEWER + public WebRequestType RequestType = WebRequestType.UnityWebRequest; +#else + public WebRequestType RequestType = WebRequestType.UnityWww; +#endif + + public bool DisableDeviceInfo; + public bool DisableFocusTimeCollection; + + public int RequestTimeout = 2000; + public bool RequestKeepAlive = true; + public bool CompressResponses = false; + public bool DecompressWithDownloadHandler = true; + + public PlayFabLogLevel LogLevel = PlayFabLogLevel.Warning | PlayFabLogLevel.Error; + public string LoggerHost = ""; + public int LoggerPort = 0; + public bool EnableRealTimeLogging = false; + public int LogCapLimit = 30; +} diff --git a/Assets/PlayFabSDK/Shared/Models/PlayFabSharedSettings.cs.meta b/Assets/PlayFabSDK/Shared/Models/PlayFabSharedSettings.cs.meta new file mode 100644 index 00000000..5612c93a --- /dev/null +++ b/Assets/PlayFabSDK/Shared/Models/PlayFabSharedSettings.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 093286084a3d1994a9c28281a1c38b1d +timeCreated: 1467748518 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Shared/Models/SharedModels.cs b/Assets/PlayFabSDK/Shared/Models/SharedModels.cs new file mode 100644 index 00000000..0d147cb8 --- /dev/null +++ b/Assets/PlayFabSDK/Shared/Models/SharedModels.cs @@ -0,0 +1,44 @@ +using PlayFab.Internal; + +namespace PlayFab.SharedModels +{ + public class HttpResponseObject + { + public int code; + public string status; + public object data; + } + + public class PlayFabBaseModel + { + public string ToJson() + { + var json = PluginManager.GetPlugin(PluginContract.PlayFab_Serializer); + return json.SerializeObject(this); + } + } + + public interface IPlayFabInstanceApi { } + + public class PlayFabRequestCommon : PlayFabBaseModel + { + public PlayFabAuthenticationContext AuthenticationContext; + } + + public class PlayFabResultCommon : PlayFabBaseModel + { + public PlayFabRequestCommon Request; + public object CustomData; + } + + public class PlayFabLoginResultCommon : PlayFabResultCommon + { + public PlayFabAuthenticationContext AuthenticationContext; + } + + public class PlayFabResult where TResult : PlayFabResultCommon + { + public TResult Result; + public object CustomData; + } +} diff --git a/Assets/PlayFabSDK/Shared/Models/SharedModels.cs.meta b/Assets/PlayFabSDK/Shared/Models/SharedModels.cs.meta new file mode 100644 index 00000000..ba966239 --- /dev/null +++ b/Assets/PlayFabSDK/Shared/Models/SharedModels.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 8e2ad5324972b434883785ddddf9c851 +timeCreated: 1467491766 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Shared/Public.meta b/Assets/PlayFabSDK/Shared/Public.meta new file mode 100644 index 00000000..a7bc0ef0 --- /dev/null +++ b/Assets/PlayFabSDK/Shared/Public.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1a863f9ccbc4d2c44b7c44802e341669 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Shared/Public/IPlayFabPlugin.cs b/Assets/PlayFabSDK/Shared/Public/IPlayFabPlugin.cs new file mode 100644 index 00000000..676ca434 --- /dev/null +++ b/Assets/PlayFabSDK/Shared/Public/IPlayFabPlugin.cs @@ -0,0 +1,9 @@ +namespace PlayFab +{ + /// + /// Base interface of any PlayFab SDK plugin. + /// + public interface IPlayFabPlugin + { + } +} \ No newline at end of file diff --git a/Assets/PlayFabSDK/Shared/Public/IPlayFabPlugin.cs.meta b/Assets/PlayFabSDK/Shared/Public/IPlayFabPlugin.cs.meta new file mode 100644 index 00000000..25d6f1b9 --- /dev/null +++ b/Assets/PlayFabSDK/Shared/Public/IPlayFabPlugin.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c515d14de9458ef449d382c41e4943b0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Shared/Public/ISerializerPlugin.cs b/Assets/PlayFabSDK/Shared/Public/ISerializerPlugin.cs new file mode 100644 index 00000000..d2889c9d --- /dev/null +++ b/Assets/PlayFabSDK/Shared/Public/ISerializerPlugin.cs @@ -0,0 +1,15 @@ +namespace PlayFab +{ + /// + /// Interface of any data serializer SDK plugin. + /// + public interface ISerializerPlugin : IPlayFabPlugin + { + T DeserializeObject(string serialized); + T DeserializeObject(string serialized, object serializerStrategy); + object DeserializeObject(string serialized); + + string SerializeObject(object obj); + string SerializeObject(object obj, object serializerStrategy); + } +} \ No newline at end of file diff --git a/Assets/PlayFabSDK/Shared/Public/ISerializerPlugin.cs.meta b/Assets/PlayFabSDK/Shared/Public/ISerializerPlugin.cs.meta new file mode 100644 index 00000000..1a0051ce --- /dev/null +++ b/Assets/PlayFabSDK/Shared/Public/ISerializerPlugin.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d33ec65e8a628fe44a4aa5c55289a16d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Shared/Public/ITransportPlugin.cs b/Assets/PlayFabSDK/Shared/Public/ITransportPlugin.cs new file mode 100644 index 00000000..0206bb72 --- /dev/null +++ b/Assets/PlayFabSDK/Shared/Public/ITransportPlugin.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; + +namespace PlayFab +{ + /// + /// Interface of any transport SDK plugin. + /// + public interface ITransportPlugin: IPlayFabPlugin + { + bool IsInitialized { get; } + void Initialize(); + + // Mirroring MonoBehaviour - Relayed from PlayFabHTTP + void Update(); + void OnDestroy(); + + void SimpleGetCall(string fullUrl, Action successCallback, Action errorCallback); + void SimplePutCall(string fullUrl, byte[] payload, Action successCallback, Action errorCallback); + + void SimplePostCall(string fullUrl, byte[] payload, Action successCallback, Action errorCallback); + + void MakeApiCall(object reqContainer); + + int GetPendingMessages(); + } +} diff --git a/Assets/PlayFabSDK/Shared/Public/ITransportPlugin.cs.meta b/Assets/PlayFabSDK/Shared/Public/ITransportPlugin.cs.meta new file mode 100644 index 00000000..ebf43af4 --- /dev/null +++ b/Assets/PlayFabSDK/Shared/Public/ITransportPlugin.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b97cd56b9c312144bb35f37b431aa18f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Shared/Public/PlayFabApiSettings.cs b/Assets/PlayFabSDK/Shared/Public/PlayFabApiSettings.cs new file mode 100644 index 00000000..d9e3c72f --- /dev/null +++ b/Assets/PlayFabSDK/Shared/Public/PlayFabApiSettings.cs @@ -0,0 +1,102 @@ +using System.Collections.Generic; +using System; + +namespace PlayFab +{ + public class PlayFabApiSettings + { + private string _ProductionEnvironmentUrl = PlayFabSettings.DefaultPlayFabApiUrl; + public readonly Dictionary _requestGetParams = new Dictionary { + { "sdk", PlayFabSettings.VersionString } + }; + + public virtual Dictionary RequestGetParams { get { return _requestGetParams; } } + + /// This is only for customers running a private cluster. Generally you shouldn't touch this + public virtual string ProductionEnvironmentUrl { get { return _ProductionEnvironmentUrl; } set { _ProductionEnvironmentUrl = value; } } + /// You must set this value for PlayFabSdk to work properly (Found in the Game Manager for your title, at the PlayFab Website) + public virtual string TitleId { get; set; } + + /// The name of a customer vertical. This is only for customers running a private cluster. Generally you shouldn't touch this + internal virtual string VerticalName { get; set; } +#if ENABLE_PLAYFABSERVER_API || ENABLE_PLAYFABADMIN_API || UNITY_EDITOR || ENABLE_PLAYFAB_SECRETKEY + /// You must set this value for PlayFabSdk to work properly (Found in the Game Manager for your title, at the PlayFab Website) + public virtual string DeveloperSecretKey { get; set; } +#endif + /// Set this to true to prevent hardware information from leaving the device + public virtual bool DisableDeviceInfo { get; set; } + /// Set this to true to prevent focus change information from leaving the device + public virtual bool DisableFocusTimeCollection { get; set; } + + /// Set to enable Gzip compression on all responses. Defaults to false. + public virtual bool CompressResponses { get; set; } + + /// Enables the custom Gzip DownloadHandler on all responses. Defaults to true. + internal virtual bool DecompressWithDownloadHandler { get; set; } = true; + + + public virtual string GetFullUrl(string apiCall, Dictionary getParams) + { + return PlayFabSettings.GetFullUrl(apiCall, getParams, this); + } + } + + /// + /// This is only meant for PlayFabSettings to use as a redirect to store values on PlayFabSharedSettings instead of locally + /// + internal class PlayFabSettingsRedirect : PlayFabApiSettings + { + private readonly Func GetSO; + public PlayFabSettingsRedirect(Func getSO) { GetSO = getSO; } + + public override string ProductionEnvironmentUrl + { + get { var so = GetSO(); return so == null ? base.ProductionEnvironmentUrl : so.ProductionEnvironmentUrl; } + set { var so = GetSO(); if (so != null) so.ProductionEnvironmentUrl = value; base.ProductionEnvironmentUrl = value; } + } + + internal override string VerticalName + { + get { var so = GetSO(); return so == null ? base.VerticalName : so.VerticalName; } + set { var so = GetSO(); if (so != null) so.VerticalName = value; base.VerticalName = value; } + } + +#if ENABLE_PLAYFABSERVER_API || ENABLE_PLAYFABADMIN_API || UNITY_EDITOR || ENABLE_PLAYFAB_SECRETKEY + public override string DeveloperSecretKey + { + get { var so = GetSO(); return so == null ? base.DeveloperSecretKey : so.DeveloperSecretKey; } + set { var so = GetSO(); if (so != null) so.DeveloperSecretKey = value; base.DeveloperSecretKey = value; } + } +#endif + + public override string TitleId + { + get { var so = GetSO(); return so == null ? base.TitleId : so.TitleId; } + set { var so = GetSO(); if (so != null) so.TitleId = value; base.TitleId = value; } + } + + public override bool DisableDeviceInfo + { + get { var so = GetSO(); return so == null ? base.DisableDeviceInfo : so.DisableDeviceInfo; } + set { var so = GetSO(); if (so != null) so.DisableDeviceInfo = value; base.DisableDeviceInfo = value; } + } + + public override bool DisableFocusTimeCollection + { + get { var so = GetSO(); return so == null ? base.DisableFocusTimeCollection : so.DisableFocusTimeCollection; } + set { var so = GetSO(); if (so != null) so.DisableFocusTimeCollection = value; base.DisableFocusTimeCollection = value; } + } + + public override bool CompressResponses + { + get { var so = GetSO(); return so == null ? base.CompressResponses : so.CompressResponses; } + set { var so = GetSO(); if (so != null) so.CompressResponses = value; base.CompressResponses = value; } + } + + internal override bool DecompressWithDownloadHandler + { + get { var so = GetSO(); return so == null ? base.DecompressWithDownloadHandler : so.DecompressWithDownloadHandler; } + set { var so = GetSO(); if (so != null) so.DecompressWithDownloadHandler = value; base.DecompressWithDownloadHandler = value; } + } + } +} diff --git a/Assets/PlayFabSDK/Shared/Public/PlayFabApiSettings.cs.meta b/Assets/PlayFabSDK/Shared/Public/PlayFabApiSettings.cs.meta new file mode 100644 index 00000000..de68200a --- /dev/null +++ b/Assets/PlayFabSDK/Shared/Public/PlayFabApiSettings.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 66cd997c6a8b2ed4d8d2b5c2a97b6e22 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Shared/Public/PlayFabAuthenticationContext.cs b/Assets/PlayFabSDK/Shared/Public/PlayFabAuthenticationContext.cs new file mode 100644 index 00000000..cf951449 --- /dev/null +++ b/Assets/PlayFabSDK/Shared/Public/PlayFabAuthenticationContext.cs @@ -0,0 +1,87 @@ +namespace PlayFab +{ + public sealed class PlayFabAuthenticationContext + { + public PlayFabAuthenticationContext() + { + } + + public PlayFabAuthenticationContext(string clientSessionTicket, string entityToken, string playFabId, string entityId, string entityType, string telemetryKey = null) : this() + { +#if !DISABLE_PLAYFABCLIENT_API + ClientSessionTicket = clientSessionTicket; + PlayFabId = playFabId; +#endif +#if !DISABLE_PLAYFABENTITY_API + EntityToken = entityToken; + EntityId = entityId; + EntityType = entityType; +#endif + TelemetryKey = telemetryKey; + } + + public void CopyFrom(PlayFabAuthenticationContext other) + { +#if !DISABLE_PLAYFABCLIENT_API + ClientSessionTicket = other.ClientSessionTicket; + PlayFabId = other.PlayFabId; +#endif +#if !DISABLE_PLAYFABENTITY_API + EntityToken = other.EntityToken; + EntityId = other.EntityId; + EntityType = other.EntityType; +#endif + TelemetryKey = other.TelemetryKey; + } + +#if !DISABLE_PLAYFABCLIENT_API + /// Allows access to the ClientAPI + public string ClientSessionTicket; + /// The master player entity Id + public string PlayFabId; + public bool IsClientLoggedIn() + { + return !string.IsNullOrEmpty(ClientSessionTicket); + } +#endif + +#if !DISABLE_PLAYFABENTITY_API + /// Allows access to most Entity APIs + public string EntityToken; + /// + /// Clients: The title player entity Id (unless replaced with a related entity) + /// Servers: The title id (unless replaced with a related entity) + /// + public string EntityId; + /// + /// Describes the type of entity identified by EntityId + /// + public string EntityType; + public bool IsEntityLoggedIn() + { + return !string.IsNullOrEmpty(EntityToken); + } +#endif + + public string TelemetryKey; + + public bool IsTelemetryKeyProvided() + { + return !string.IsNullOrEmpty(TelemetryKey); + } + + public void ForgetAllCredentials() + { +#if !DISABLE_PLAYFABCLIENT_API + PlayFabId = null; + ClientSessionTicket = null; +#endif +#if !DISABLE_PLAYFABENTITY_API + EntityToken = null; + EntityId = null; + EntityType = null; +#endif + TelemetryKey = null; + } + } +} diff --git a/Assets/PlayFabSDK/Shared/Public/PlayFabAuthenticationContext.cs.meta b/Assets/PlayFabSDK/Shared/Public/PlayFabAuthenticationContext.cs.meta new file mode 100644 index 00000000..54e8f4f4 --- /dev/null +++ b/Assets/PlayFabSDK/Shared/Public/PlayFabAuthenticationContext.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5e4df1f8e07aee2409343554f628ce8b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Shared/Public/PlayFabDataGatherer.cs b/Assets/PlayFabSDK/Shared/Public/PlayFabDataGatherer.cs new file mode 100644 index 00000000..1ac5d571 --- /dev/null +++ b/Assets/PlayFabSDK/Shared/Public/PlayFabDataGatherer.cs @@ -0,0 +1,138 @@ +using UnityEngine; +using System.Text; +using PlayFab.SharedModels; +using UnityEngine.Rendering; +#if NETFX_CORE +using System.Reflection; +#endif + +namespace PlayFab +{ + public class PlayFabDataGatherer + { +#if UNITY_5 || UNITY_5_3_OR_NEWER + // UNITY_5 Application info + public string ProductName; + public string ProductBundle; + public string Version; + public string Company; + public RuntimePlatform Platform; + // UNITY_5 Graphics Abilities + public bool GraphicsMultiThreaded; +#else + public enum GraphicsDeviceType + { + OpenGL2 = 0, Direct3D9 = 1, Direct3D11 = 2, PlayStation3 = 3, Null = 4, Xbox360 = 6, OpenGLES2 = 8, OpenGLES3 = 11, PlayStationVita = 12, + PlayStation4 = 13, XboxOne = 14, PlayStationMobile = 15, Metal = 16, OpenGLCore = 17, Direct3D12 = 18, Nintendo3DS = 19 + } + + // RuntimePlatform Enum info: + // OSXEditor = 0, OSXPlayer = 1, WindowsPlayer = 2, OSXWebPlayer = 3, OSXDashboardPlayer = 4, WindowsWebPlayer = 5, WindowsEditor = 7, + // IPhonePlayer = 8, PS3 = 9, XBOX360 = 10, Android = 11, LinuxPlayer = 13, FlashPlayer = 15, WebGLPlayer = 17, MetroPlayerX86 = 18, + // WSAPlayerX86 = 18, MetroPlayerX64 = 19,WSAPlayerX64 = 19, MetroPlayerARM = 20, WSAPlayerARM = 20, WP8Player = 21, + // EditorBrowsable(EditorBrowsableState.Never)] BB10Player = 22, BlackBerryPlayer = 22, TizenPlayer = 23, PSP2 = 24, PS4 = 25, + // PSM = 26, XboxOne = 27, SamsungTVPlayer = 28, WiiU = 30, tvOS = 31 +#endif +#if !UNITY_5_0 && (UNITY_5 || UNITY_5_3_OR_NEWER) + public GraphicsDeviceType GraphicsType; +#endif + + // Application info + public string DataPath; + public string PersistentDataPath; + public string StreamingAssetsPath; + public int TargetFrameRate; + public string UnityVersion; + public bool RunInBackground; + + //DEVICE & OS + public string DeviceModel; + //public enum DeviceType { Unknown, Handheld, Console, Desktop } + public DeviceType DeviceType; + public string DeviceUniqueId; + public string OperatingSystem; + + //GRAPHICS ABILITIES + public int GraphicsDeviceId; + public string GraphicsDeviceName; + public int GraphicsMemorySize; + public int GraphicsShaderLevel; + + //SYSTEM INFO + public int SystemMemorySize; + public int ProcessorCount; + public int ProcessorFrequency; + public string ProcessorType; + public bool SupportsAccelerometer; + public bool SupportsGyroscope; + public bool SupportsLocationService; + + public PlayFabDataGatherer() + { +#if UNITY_5 || UNITY_5_3_OR_NEWER + // UNITY_5 Application info + ProductName = Application.productName; + Version = Application.version; + Company = Application.companyName; + Platform = Application.platform; + // UNITY_5 Graphics Abilities + GraphicsMultiThreaded = SystemInfo.graphicsMultiThreaded; +#endif +#if !UNITY_5_0 && (UNITY_5 || UNITY_5_3_OR_NEWER) + GraphicsType = SystemInfo.graphicsDeviceType; +#endif + + //Only Used on iOS & Android +#if UNITY_5_6_OR_NEWER && (UNITY_ANDROID || UNITY_IOS || UNITY_IPHONE) + ProductBundle = Application.identifier; +#elif UNITY_ANDROID || UNITY_IOS || UNITY_IPHONE + ProductBundle = Application.bundleIdentifier; +#endif + + // Application info + DataPath = Application.dataPath; +#if !UNITY_SWITCH + PersistentDataPath = Application.persistentDataPath; +#endif + StreamingAssetsPath = Application.streamingAssetsPath; + TargetFrameRate = Application.targetFrameRate; + UnityVersion = Application.unityVersion; + + //DEVICE & OS + DeviceModel = SystemInfo.deviceModel; + DeviceType = SystemInfo.deviceType; + + DeviceUniqueId = PlayFabSettings.DeviceUniqueIdentifier; + OperatingSystem = SystemInfo.operatingSystem; + + //GRAPHICS ABILITIES + GraphicsDeviceId = SystemInfo.graphicsDeviceID; + GraphicsDeviceName = SystemInfo.graphicsDeviceName; + GraphicsMemorySize = SystemInfo.graphicsMemorySize; + GraphicsShaderLevel = SystemInfo.graphicsShaderLevel; + + //SYSTEM INFO + SystemMemorySize = SystemInfo.systemMemorySize; + ProcessorCount = SystemInfo.processorCount; +#if UNITY_5_3_OR_NEWER + ProcessorFrequency = SystemInfo.processorFrequency; // Not Supported in PRE Unity 5_2 +#endif + ProcessorType = SystemInfo.processorType; + SupportsAccelerometer = SystemInfo.supportsAccelerometer; + SupportsGyroscope = SystemInfo.supportsGyroscope; + SupportsLocationService = SystemInfo.supportsLocationService; + } + + public string GenerateReport() + { + var sb = new StringBuilder(); + sb.Append("Logging System Info: ========================================\n"); + foreach (var field in GetType().GetTypeInfo().GetFields()) + { + var fld = field.GetValue(this).ToString(); + sb.AppendFormat("System Info - {0}: {1}\n", field.Name, fld); + } + return sb.ToString(); + } + } +} diff --git a/Assets/PlayFabSDK/Shared/Public/PlayFabDataGatherer.cs.meta b/Assets/PlayFabSDK/Shared/Public/PlayFabDataGatherer.cs.meta new file mode 100644 index 00000000..8998e9aa --- /dev/null +++ b/Assets/PlayFabSDK/Shared/Public/PlayFabDataGatherer.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 9021fc3e0230b9a4db0f0e1b104b764b +timeCreated: 1464569227 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Shared/Public/PlayFabEvents.cs b/Assets/PlayFabSDK/Shared/Public/PlayFabEvents.cs new file mode 100644 index 00000000..c51fe881 --- /dev/null +++ b/Assets/PlayFabSDK/Shared/Public/PlayFabEvents.cs @@ -0,0 +1,3554 @@ +using PlayFab.SharedModels; +using PlayFab.Internal; + +namespace PlayFab.Events +{ + public partial class PlayFabEvents + { + public delegate void PlayFabErrorEvent(PlayFabRequestCommon request, PlayFabError error); + public delegate void PlayFabResultEvent(TResult result) where TResult : PlayFabResultCommon; + public delegate void PlayFabRequestEvent(TRequest request) where TRequest : PlayFabRequestCommon; + public event PlayFabErrorEvent OnGlobalErrorEvent; + + private static PlayFabEvents _instance; + /// + /// Private constructor because we call PlayFabEvents.init(); + /// + private PlayFabEvents() { } + + public static PlayFabEvents Init() + { + if (_instance == null) + { + _instance = new PlayFabEvents(); + } + PlayFabHttp.ApiProcessingEventHandler += _instance.OnProcessingEvent; + PlayFabHttp.ApiProcessingErrorEventHandler += _instance.OnProcessingErrorEvent; + return _instance; + } + + public void UnregisterInstance(object instance) + { +#if !DISABLE_PLAYFABCLIENT_API + if (OnLoginResultEvent != null) { foreach (var each in OnLoginResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLoginResultEvent -= (PlayFabResultEvent)each; } } } +#endif +#if ENABLE_PLAYFABADMIN_API + if (OnAdminAbortTaskInstanceRequestEvent != null) { foreach (var each in OnAdminAbortTaskInstanceRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminAbortTaskInstanceRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminAbortTaskInstanceResultEvent != null) { foreach (var each in OnAdminAbortTaskInstanceResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminAbortTaskInstanceResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminAddLocalizedNewsRequestEvent != null) { foreach (var each in OnAdminAddLocalizedNewsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminAddLocalizedNewsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminAddLocalizedNewsResultEvent != null) { foreach (var each in OnAdminAddLocalizedNewsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminAddLocalizedNewsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminAddNewsRequestEvent != null) { foreach (var each in OnAdminAddNewsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminAddNewsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminAddNewsResultEvent != null) { foreach (var each in OnAdminAddNewsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminAddNewsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminAddPlayerTagRequestEvent != null) { foreach (var each in OnAdminAddPlayerTagRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminAddPlayerTagRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminAddPlayerTagResultEvent != null) { foreach (var each in OnAdminAddPlayerTagResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminAddPlayerTagResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminAddUserVirtualCurrencyRequestEvent != null) { foreach (var each in OnAdminAddUserVirtualCurrencyRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminAddUserVirtualCurrencyRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminAddUserVirtualCurrencyResultEvent != null) { foreach (var each in OnAdminAddUserVirtualCurrencyResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminAddUserVirtualCurrencyResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminAddVirtualCurrencyTypesRequestEvent != null) { foreach (var each in OnAdminAddVirtualCurrencyTypesRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminAddVirtualCurrencyTypesRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminAddVirtualCurrencyTypesResultEvent != null) { foreach (var each in OnAdminAddVirtualCurrencyTypesResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminAddVirtualCurrencyTypesResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminBanUsersRequestEvent != null) { foreach (var each in OnAdminBanUsersRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminBanUsersRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminBanUsersResultEvent != null) { foreach (var each in OnAdminBanUsersResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminBanUsersResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminCheckLimitedEditionItemAvailabilityRequestEvent != null) { foreach (var each in OnAdminCheckLimitedEditionItemAvailabilityRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminCheckLimitedEditionItemAvailabilityRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminCheckLimitedEditionItemAvailabilityResultEvent != null) { foreach (var each in OnAdminCheckLimitedEditionItemAvailabilityResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminCheckLimitedEditionItemAvailabilityResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminCreateActionsOnPlayersInSegmentTaskRequestEvent != null) { foreach (var each in OnAdminCreateActionsOnPlayersInSegmentTaskRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminCreateActionsOnPlayersInSegmentTaskRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminCreateActionsOnPlayersInSegmentTaskResultEvent != null) { foreach (var each in OnAdminCreateActionsOnPlayersInSegmentTaskResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminCreateActionsOnPlayersInSegmentTaskResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminCreateCloudScriptTaskRequestEvent != null) { foreach (var each in OnAdminCreateCloudScriptTaskRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminCreateCloudScriptTaskRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminCreateCloudScriptTaskResultEvent != null) { foreach (var each in OnAdminCreateCloudScriptTaskResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminCreateCloudScriptTaskResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminCreateInsightsScheduledScalingTaskRequestEvent != null) { foreach (var each in OnAdminCreateInsightsScheduledScalingTaskRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminCreateInsightsScheduledScalingTaskRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminCreateInsightsScheduledScalingTaskResultEvent != null) { foreach (var each in OnAdminCreateInsightsScheduledScalingTaskResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminCreateInsightsScheduledScalingTaskResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminCreateOpenIdConnectionRequestEvent != null) { foreach (var each in OnAdminCreateOpenIdConnectionRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminCreateOpenIdConnectionRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminCreateOpenIdConnectionResultEvent != null) { foreach (var each in OnAdminCreateOpenIdConnectionResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminCreateOpenIdConnectionResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminCreatePlayerSharedSecretRequestEvent != null) { foreach (var each in OnAdminCreatePlayerSharedSecretRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminCreatePlayerSharedSecretRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminCreatePlayerSharedSecretResultEvent != null) { foreach (var each in OnAdminCreatePlayerSharedSecretResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminCreatePlayerSharedSecretResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminCreatePlayerStatisticDefinitionRequestEvent != null) { foreach (var each in OnAdminCreatePlayerStatisticDefinitionRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminCreatePlayerStatisticDefinitionRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminCreatePlayerStatisticDefinitionResultEvent != null) { foreach (var each in OnAdminCreatePlayerStatisticDefinitionResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminCreatePlayerStatisticDefinitionResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminCreateSegmentRequestEvent != null) { foreach (var each in OnAdminCreateSegmentRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminCreateSegmentRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminCreateSegmentResultEvent != null) { foreach (var each in OnAdminCreateSegmentResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminCreateSegmentResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminDeleteContentRequestEvent != null) { foreach (var each in OnAdminDeleteContentRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminDeleteContentRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminDeleteContentResultEvent != null) { foreach (var each in OnAdminDeleteContentResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminDeleteContentResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminDeleteMasterPlayerAccountRequestEvent != null) { foreach (var each in OnAdminDeleteMasterPlayerAccountRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminDeleteMasterPlayerAccountRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminDeleteMasterPlayerAccountResultEvent != null) { foreach (var each in OnAdminDeleteMasterPlayerAccountResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminDeleteMasterPlayerAccountResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminDeleteMasterPlayerEventDataRequestEvent != null) { foreach (var each in OnAdminDeleteMasterPlayerEventDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminDeleteMasterPlayerEventDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminDeleteMasterPlayerEventDataResultEvent != null) { foreach (var each in OnAdminDeleteMasterPlayerEventDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminDeleteMasterPlayerEventDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminDeleteMembershipSubscriptionRequestEvent != null) { foreach (var each in OnAdminDeleteMembershipSubscriptionRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminDeleteMembershipSubscriptionRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminDeleteMembershipSubscriptionResultEvent != null) { foreach (var each in OnAdminDeleteMembershipSubscriptionResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminDeleteMembershipSubscriptionResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminDeleteOpenIdConnectionRequestEvent != null) { foreach (var each in OnAdminDeleteOpenIdConnectionRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminDeleteOpenIdConnectionRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminDeleteOpenIdConnectionResultEvent != null) { foreach (var each in OnAdminDeleteOpenIdConnectionResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminDeleteOpenIdConnectionResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminDeletePlayerRequestEvent != null) { foreach (var each in OnAdminDeletePlayerRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminDeletePlayerRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminDeletePlayerResultEvent != null) { foreach (var each in OnAdminDeletePlayerResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminDeletePlayerResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminDeletePlayerSharedSecretRequestEvent != null) { foreach (var each in OnAdminDeletePlayerSharedSecretRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminDeletePlayerSharedSecretRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminDeletePlayerSharedSecretResultEvent != null) { foreach (var each in OnAdminDeletePlayerSharedSecretResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminDeletePlayerSharedSecretResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminDeleteSegmentRequestEvent != null) { foreach (var each in OnAdminDeleteSegmentRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminDeleteSegmentRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminDeleteSegmentResultEvent != null) { foreach (var each in OnAdminDeleteSegmentResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminDeleteSegmentResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminDeleteStoreRequestEvent != null) { foreach (var each in OnAdminDeleteStoreRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminDeleteStoreRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminDeleteStoreResultEvent != null) { foreach (var each in OnAdminDeleteStoreResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminDeleteStoreResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminDeleteTaskRequestEvent != null) { foreach (var each in OnAdminDeleteTaskRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminDeleteTaskRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminDeleteTaskResultEvent != null) { foreach (var each in OnAdminDeleteTaskResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminDeleteTaskResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminDeleteTitleRequestEvent != null) { foreach (var each in OnAdminDeleteTitleRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminDeleteTitleRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminDeleteTitleResultEvent != null) { foreach (var each in OnAdminDeleteTitleResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminDeleteTitleResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminDeleteTitleDataOverrideRequestEvent != null) { foreach (var each in OnAdminDeleteTitleDataOverrideRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminDeleteTitleDataOverrideRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminDeleteTitleDataOverrideResultEvent != null) { foreach (var each in OnAdminDeleteTitleDataOverrideResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminDeleteTitleDataOverrideResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminExportMasterPlayerDataRequestEvent != null) { foreach (var each in OnAdminExportMasterPlayerDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminExportMasterPlayerDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminExportMasterPlayerDataResultEvent != null) { foreach (var each in OnAdminExportMasterPlayerDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminExportMasterPlayerDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminExportPlayersInSegmentRequestEvent != null) { foreach (var each in OnAdminExportPlayersInSegmentRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminExportPlayersInSegmentRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminExportPlayersInSegmentResultEvent != null) { foreach (var each in OnAdminExportPlayersInSegmentResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminExportPlayersInSegmentResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminGetActionsOnPlayersInSegmentTaskInstanceRequestEvent != null) { foreach (var each in OnAdminGetActionsOnPlayersInSegmentTaskInstanceRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetActionsOnPlayersInSegmentTaskInstanceRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminGetActionsOnPlayersInSegmentTaskInstanceResultEvent != null) { foreach (var each in OnAdminGetActionsOnPlayersInSegmentTaskInstanceResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetActionsOnPlayersInSegmentTaskInstanceResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminGetAllSegmentsRequestEvent != null) { foreach (var each in OnAdminGetAllSegmentsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetAllSegmentsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminGetAllSegmentsResultEvent != null) { foreach (var each in OnAdminGetAllSegmentsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetAllSegmentsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminGetCatalogItemsRequestEvent != null) { foreach (var each in OnAdminGetCatalogItemsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetCatalogItemsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminGetCatalogItemsResultEvent != null) { foreach (var each in OnAdminGetCatalogItemsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetCatalogItemsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminGetCloudScriptRevisionRequestEvent != null) { foreach (var each in OnAdminGetCloudScriptRevisionRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetCloudScriptRevisionRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminGetCloudScriptRevisionResultEvent != null) { foreach (var each in OnAdminGetCloudScriptRevisionResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetCloudScriptRevisionResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminGetCloudScriptTaskInstanceRequestEvent != null) { foreach (var each in OnAdminGetCloudScriptTaskInstanceRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetCloudScriptTaskInstanceRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminGetCloudScriptTaskInstanceResultEvent != null) { foreach (var each in OnAdminGetCloudScriptTaskInstanceResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetCloudScriptTaskInstanceResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminGetCloudScriptVersionsRequestEvent != null) { foreach (var each in OnAdminGetCloudScriptVersionsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetCloudScriptVersionsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminGetCloudScriptVersionsResultEvent != null) { foreach (var each in OnAdminGetCloudScriptVersionsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetCloudScriptVersionsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminGetContentListRequestEvent != null) { foreach (var each in OnAdminGetContentListRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetContentListRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminGetContentListResultEvent != null) { foreach (var each in OnAdminGetContentListResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetContentListResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminGetContentUploadUrlRequestEvent != null) { foreach (var each in OnAdminGetContentUploadUrlRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetContentUploadUrlRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminGetContentUploadUrlResultEvent != null) { foreach (var each in OnAdminGetContentUploadUrlResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetContentUploadUrlResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminGetDataReportRequestEvent != null) { foreach (var each in OnAdminGetDataReportRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetDataReportRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminGetDataReportResultEvent != null) { foreach (var each in OnAdminGetDataReportResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetDataReportResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminGetPlayedTitleListRequestEvent != null) { foreach (var each in OnAdminGetPlayedTitleListRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetPlayedTitleListRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminGetPlayedTitleListResultEvent != null) { foreach (var each in OnAdminGetPlayedTitleListResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetPlayedTitleListResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminGetPlayerIdFromAuthTokenRequestEvent != null) { foreach (var each in OnAdminGetPlayerIdFromAuthTokenRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetPlayerIdFromAuthTokenRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminGetPlayerIdFromAuthTokenResultEvent != null) { foreach (var each in OnAdminGetPlayerIdFromAuthTokenResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetPlayerIdFromAuthTokenResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminGetPlayerProfileRequestEvent != null) { foreach (var each in OnAdminGetPlayerProfileRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetPlayerProfileRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminGetPlayerProfileResultEvent != null) { foreach (var each in OnAdminGetPlayerProfileResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetPlayerProfileResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminGetPlayerSegmentsRequestEvent != null) { foreach (var each in OnAdminGetPlayerSegmentsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetPlayerSegmentsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminGetPlayerSegmentsResultEvent != null) { foreach (var each in OnAdminGetPlayerSegmentsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetPlayerSegmentsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminGetPlayerSharedSecretsRequestEvent != null) { foreach (var each in OnAdminGetPlayerSharedSecretsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetPlayerSharedSecretsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminGetPlayerSharedSecretsResultEvent != null) { foreach (var each in OnAdminGetPlayerSharedSecretsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetPlayerSharedSecretsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminGetPlayersInSegmentRequestEvent != null) { foreach (var each in OnAdminGetPlayersInSegmentRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetPlayersInSegmentRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminGetPlayersInSegmentResultEvent != null) { foreach (var each in OnAdminGetPlayersInSegmentResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetPlayersInSegmentResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminGetPlayerStatisticDefinitionsRequestEvent != null) { foreach (var each in OnAdminGetPlayerStatisticDefinitionsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetPlayerStatisticDefinitionsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminGetPlayerStatisticDefinitionsResultEvent != null) { foreach (var each in OnAdminGetPlayerStatisticDefinitionsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetPlayerStatisticDefinitionsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminGetPlayerStatisticVersionsRequestEvent != null) { foreach (var each in OnAdminGetPlayerStatisticVersionsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetPlayerStatisticVersionsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminGetPlayerStatisticVersionsResultEvent != null) { foreach (var each in OnAdminGetPlayerStatisticVersionsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetPlayerStatisticVersionsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminGetPlayerTagsRequestEvent != null) { foreach (var each in OnAdminGetPlayerTagsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetPlayerTagsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminGetPlayerTagsResultEvent != null) { foreach (var each in OnAdminGetPlayerTagsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetPlayerTagsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminGetPolicyRequestEvent != null) { foreach (var each in OnAdminGetPolicyRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetPolicyRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminGetPolicyResultEvent != null) { foreach (var each in OnAdminGetPolicyResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetPolicyResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminGetPublisherDataRequestEvent != null) { foreach (var each in OnAdminGetPublisherDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetPublisherDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminGetPublisherDataResultEvent != null) { foreach (var each in OnAdminGetPublisherDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetPublisherDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminGetRandomResultTablesRequestEvent != null) { foreach (var each in OnAdminGetRandomResultTablesRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetRandomResultTablesRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminGetRandomResultTablesResultEvent != null) { foreach (var each in OnAdminGetRandomResultTablesResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetRandomResultTablesResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminGetSegmentExportRequestEvent != null) { foreach (var each in OnAdminGetSegmentExportRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetSegmentExportRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminGetSegmentExportResultEvent != null) { foreach (var each in OnAdminGetSegmentExportResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetSegmentExportResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminGetSegmentsRequestEvent != null) { foreach (var each in OnAdminGetSegmentsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetSegmentsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminGetSegmentsResultEvent != null) { foreach (var each in OnAdminGetSegmentsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetSegmentsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminGetStoreItemsRequestEvent != null) { foreach (var each in OnAdminGetStoreItemsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetStoreItemsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminGetStoreItemsResultEvent != null) { foreach (var each in OnAdminGetStoreItemsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetStoreItemsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminGetTaskInstancesRequestEvent != null) { foreach (var each in OnAdminGetTaskInstancesRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetTaskInstancesRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminGetTaskInstancesResultEvent != null) { foreach (var each in OnAdminGetTaskInstancesResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetTaskInstancesResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminGetTasksRequestEvent != null) { foreach (var each in OnAdminGetTasksRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetTasksRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminGetTasksResultEvent != null) { foreach (var each in OnAdminGetTasksResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetTasksResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminGetTitleDataRequestEvent != null) { foreach (var each in OnAdminGetTitleDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetTitleDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminGetTitleDataResultEvent != null) { foreach (var each in OnAdminGetTitleDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetTitleDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminGetTitleInternalDataRequestEvent != null) { foreach (var each in OnAdminGetTitleInternalDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetTitleInternalDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminGetTitleInternalDataResultEvent != null) { foreach (var each in OnAdminGetTitleInternalDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetTitleInternalDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminGetUserAccountInfoRequestEvent != null) { foreach (var each in OnAdminGetUserAccountInfoRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetUserAccountInfoRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminGetUserAccountInfoResultEvent != null) { foreach (var each in OnAdminGetUserAccountInfoResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetUserAccountInfoResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminGetUserBansRequestEvent != null) { foreach (var each in OnAdminGetUserBansRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetUserBansRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminGetUserBansResultEvent != null) { foreach (var each in OnAdminGetUserBansResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetUserBansResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminGetUserDataRequestEvent != null) { foreach (var each in OnAdminGetUserDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetUserDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminGetUserDataResultEvent != null) { foreach (var each in OnAdminGetUserDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetUserDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminGetUserInternalDataRequestEvent != null) { foreach (var each in OnAdminGetUserInternalDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetUserInternalDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminGetUserInternalDataResultEvent != null) { foreach (var each in OnAdminGetUserInternalDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetUserInternalDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminGetUserInventoryRequestEvent != null) { foreach (var each in OnAdminGetUserInventoryRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetUserInventoryRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminGetUserInventoryResultEvent != null) { foreach (var each in OnAdminGetUserInventoryResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetUserInventoryResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminGetUserPublisherDataRequestEvent != null) { foreach (var each in OnAdminGetUserPublisherDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetUserPublisherDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminGetUserPublisherDataResultEvent != null) { foreach (var each in OnAdminGetUserPublisherDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetUserPublisherDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminGetUserPublisherInternalDataRequestEvent != null) { foreach (var each in OnAdminGetUserPublisherInternalDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetUserPublisherInternalDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminGetUserPublisherInternalDataResultEvent != null) { foreach (var each in OnAdminGetUserPublisherInternalDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetUserPublisherInternalDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminGetUserPublisherReadOnlyDataRequestEvent != null) { foreach (var each in OnAdminGetUserPublisherReadOnlyDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetUserPublisherReadOnlyDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminGetUserPublisherReadOnlyDataResultEvent != null) { foreach (var each in OnAdminGetUserPublisherReadOnlyDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetUserPublisherReadOnlyDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminGetUserReadOnlyDataRequestEvent != null) { foreach (var each in OnAdminGetUserReadOnlyDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetUserReadOnlyDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminGetUserReadOnlyDataResultEvent != null) { foreach (var each in OnAdminGetUserReadOnlyDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetUserReadOnlyDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminGrantItemsToUsersRequestEvent != null) { foreach (var each in OnAdminGrantItemsToUsersRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGrantItemsToUsersRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminGrantItemsToUsersResultEvent != null) { foreach (var each in OnAdminGrantItemsToUsersResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGrantItemsToUsersResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminIncrementLimitedEditionItemAvailabilityRequestEvent != null) { foreach (var each in OnAdminIncrementLimitedEditionItemAvailabilityRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminIncrementLimitedEditionItemAvailabilityRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminIncrementLimitedEditionItemAvailabilityResultEvent != null) { foreach (var each in OnAdminIncrementLimitedEditionItemAvailabilityResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminIncrementLimitedEditionItemAvailabilityResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminIncrementPlayerStatisticVersionRequestEvent != null) { foreach (var each in OnAdminIncrementPlayerStatisticVersionRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminIncrementPlayerStatisticVersionRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminIncrementPlayerStatisticVersionResultEvent != null) { foreach (var each in OnAdminIncrementPlayerStatisticVersionResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminIncrementPlayerStatisticVersionResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminListOpenIdConnectionRequestEvent != null) { foreach (var each in OnAdminListOpenIdConnectionRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminListOpenIdConnectionRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminListOpenIdConnectionResultEvent != null) { foreach (var each in OnAdminListOpenIdConnectionResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminListOpenIdConnectionResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminListVirtualCurrencyTypesRequestEvent != null) { foreach (var each in OnAdminListVirtualCurrencyTypesRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminListVirtualCurrencyTypesRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminListVirtualCurrencyTypesResultEvent != null) { foreach (var each in OnAdminListVirtualCurrencyTypesResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminListVirtualCurrencyTypesResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminRefundPurchaseRequestEvent != null) { foreach (var each in OnAdminRefundPurchaseRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminRefundPurchaseRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminRefundPurchaseResultEvent != null) { foreach (var each in OnAdminRefundPurchaseResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminRefundPurchaseResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminRemovePlayerTagRequestEvent != null) { foreach (var each in OnAdminRemovePlayerTagRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminRemovePlayerTagRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminRemovePlayerTagResultEvent != null) { foreach (var each in OnAdminRemovePlayerTagResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminRemovePlayerTagResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminRemoveVirtualCurrencyTypesRequestEvent != null) { foreach (var each in OnAdminRemoveVirtualCurrencyTypesRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminRemoveVirtualCurrencyTypesRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminRemoveVirtualCurrencyTypesResultEvent != null) { foreach (var each in OnAdminRemoveVirtualCurrencyTypesResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminRemoveVirtualCurrencyTypesResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminResetCharacterStatisticsRequestEvent != null) { foreach (var each in OnAdminResetCharacterStatisticsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminResetCharacterStatisticsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminResetCharacterStatisticsResultEvent != null) { foreach (var each in OnAdminResetCharacterStatisticsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminResetCharacterStatisticsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminResetPasswordRequestEvent != null) { foreach (var each in OnAdminResetPasswordRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminResetPasswordRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminResetPasswordResultEvent != null) { foreach (var each in OnAdminResetPasswordResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminResetPasswordResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminResetUserStatisticsRequestEvent != null) { foreach (var each in OnAdminResetUserStatisticsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminResetUserStatisticsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminResetUserStatisticsResultEvent != null) { foreach (var each in OnAdminResetUserStatisticsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminResetUserStatisticsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminResolvePurchaseDisputeRequestEvent != null) { foreach (var each in OnAdminResolvePurchaseDisputeRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminResolvePurchaseDisputeRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminResolvePurchaseDisputeResultEvent != null) { foreach (var each in OnAdminResolvePurchaseDisputeResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminResolvePurchaseDisputeResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminRevokeAllBansForUserRequestEvent != null) { foreach (var each in OnAdminRevokeAllBansForUserRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminRevokeAllBansForUserRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminRevokeAllBansForUserResultEvent != null) { foreach (var each in OnAdminRevokeAllBansForUserResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminRevokeAllBansForUserResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminRevokeBansRequestEvent != null) { foreach (var each in OnAdminRevokeBansRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminRevokeBansRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminRevokeBansResultEvent != null) { foreach (var each in OnAdminRevokeBansResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminRevokeBansResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminRevokeInventoryItemRequestEvent != null) { foreach (var each in OnAdminRevokeInventoryItemRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminRevokeInventoryItemRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminRevokeInventoryItemResultEvent != null) { foreach (var each in OnAdminRevokeInventoryItemResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminRevokeInventoryItemResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminRevokeInventoryItemsRequestEvent != null) { foreach (var each in OnAdminRevokeInventoryItemsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminRevokeInventoryItemsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminRevokeInventoryItemsResultEvent != null) { foreach (var each in OnAdminRevokeInventoryItemsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminRevokeInventoryItemsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminRunTaskRequestEvent != null) { foreach (var each in OnAdminRunTaskRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminRunTaskRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminRunTaskResultEvent != null) { foreach (var each in OnAdminRunTaskResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminRunTaskResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminSendAccountRecoveryEmailRequestEvent != null) { foreach (var each in OnAdminSendAccountRecoveryEmailRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminSendAccountRecoveryEmailRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminSendAccountRecoveryEmailResultEvent != null) { foreach (var each in OnAdminSendAccountRecoveryEmailResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminSendAccountRecoveryEmailResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminSetCatalogItemsRequestEvent != null) { foreach (var each in OnAdminSetCatalogItemsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminSetCatalogItemsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminSetCatalogItemsResultEvent != null) { foreach (var each in OnAdminSetCatalogItemsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminSetCatalogItemsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminSetMembershipOverrideRequestEvent != null) { foreach (var each in OnAdminSetMembershipOverrideRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminSetMembershipOverrideRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminSetMembershipOverrideResultEvent != null) { foreach (var each in OnAdminSetMembershipOverrideResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminSetMembershipOverrideResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminSetPlayerSecretRequestEvent != null) { foreach (var each in OnAdminSetPlayerSecretRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminSetPlayerSecretRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminSetPlayerSecretResultEvent != null) { foreach (var each in OnAdminSetPlayerSecretResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminSetPlayerSecretResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminSetPublishedRevisionRequestEvent != null) { foreach (var each in OnAdminSetPublishedRevisionRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminSetPublishedRevisionRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminSetPublishedRevisionResultEvent != null) { foreach (var each in OnAdminSetPublishedRevisionResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminSetPublishedRevisionResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminSetPublisherDataRequestEvent != null) { foreach (var each in OnAdminSetPublisherDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminSetPublisherDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminSetPublisherDataResultEvent != null) { foreach (var each in OnAdminSetPublisherDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminSetPublisherDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminSetStoreItemsRequestEvent != null) { foreach (var each in OnAdminSetStoreItemsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminSetStoreItemsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminSetStoreItemsResultEvent != null) { foreach (var each in OnAdminSetStoreItemsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminSetStoreItemsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminSetTitleDataRequestEvent != null) { foreach (var each in OnAdminSetTitleDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminSetTitleDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminSetTitleDataResultEvent != null) { foreach (var each in OnAdminSetTitleDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminSetTitleDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminSetTitleDataAndOverridesRequestEvent != null) { foreach (var each in OnAdminSetTitleDataAndOverridesRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminSetTitleDataAndOverridesRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminSetTitleDataAndOverridesResultEvent != null) { foreach (var each in OnAdminSetTitleDataAndOverridesResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminSetTitleDataAndOverridesResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminSetTitleInternalDataRequestEvent != null) { foreach (var each in OnAdminSetTitleInternalDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminSetTitleInternalDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminSetTitleInternalDataResultEvent != null) { foreach (var each in OnAdminSetTitleInternalDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminSetTitleInternalDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminSetupPushNotificationRequestEvent != null) { foreach (var each in OnAdminSetupPushNotificationRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminSetupPushNotificationRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminSetupPushNotificationResultEvent != null) { foreach (var each in OnAdminSetupPushNotificationResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminSetupPushNotificationResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminSubtractUserVirtualCurrencyRequestEvent != null) { foreach (var each in OnAdminSubtractUserVirtualCurrencyRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminSubtractUserVirtualCurrencyRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminSubtractUserVirtualCurrencyResultEvent != null) { foreach (var each in OnAdminSubtractUserVirtualCurrencyResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminSubtractUserVirtualCurrencyResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminUpdateBansRequestEvent != null) { foreach (var each in OnAdminUpdateBansRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminUpdateBansRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminUpdateBansResultEvent != null) { foreach (var each in OnAdminUpdateBansResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminUpdateBansResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminUpdateCatalogItemsRequestEvent != null) { foreach (var each in OnAdminUpdateCatalogItemsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminUpdateCatalogItemsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminUpdateCatalogItemsResultEvent != null) { foreach (var each in OnAdminUpdateCatalogItemsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminUpdateCatalogItemsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminUpdateCloudScriptRequestEvent != null) { foreach (var each in OnAdminUpdateCloudScriptRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminUpdateCloudScriptRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminUpdateCloudScriptResultEvent != null) { foreach (var each in OnAdminUpdateCloudScriptResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminUpdateCloudScriptResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminUpdateOpenIdConnectionRequestEvent != null) { foreach (var each in OnAdminUpdateOpenIdConnectionRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminUpdateOpenIdConnectionRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminUpdateOpenIdConnectionResultEvent != null) { foreach (var each in OnAdminUpdateOpenIdConnectionResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminUpdateOpenIdConnectionResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminUpdatePlayerSharedSecretRequestEvent != null) { foreach (var each in OnAdminUpdatePlayerSharedSecretRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminUpdatePlayerSharedSecretRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminUpdatePlayerSharedSecretResultEvent != null) { foreach (var each in OnAdminUpdatePlayerSharedSecretResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminUpdatePlayerSharedSecretResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminUpdatePlayerStatisticDefinitionRequestEvent != null) { foreach (var each in OnAdminUpdatePlayerStatisticDefinitionRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminUpdatePlayerStatisticDefinitionRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminUpdatePlayerStatisticDefinitionResultEvent != null) { foreach (var each in OnAdminUpdatePlayerStatisticDefinitionResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminUpdatePlayerStatisticDefinitionResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminUpdatePolicyRequestEvent != null) { foreach (var each in OnAdminUpdatePolicyRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminUpdatePolicyRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminUpdatePolicyResultEvent != null) { foreach (var each in OnAdminUpdatePolicyResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminUpdatePolicyResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminUpdateRandomResultTablesRequestEvent != null) { foreach (var each in OnAdminUpdateRandomResultTablesRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminUpdateRandomResultTablesRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminUpdateRandomResultTablesResultEvent != null) { foreach (var each in OnAdminUpdateRandomResultTablesResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminUpdateRandomResultTablesResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminUpdateSegmentRequestEvent != null) { foreach (var each in OnAdminUpdateSegmentRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminUpdateSegmentRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminUpdateSegmentResultEvent != null) { foreach (var each in OnAdminUpdateSegmentResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminUpdateSegmentResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminUpdateStoreItemsRequestEvent != null) { foreach (var each in OnAdminUpdateStoreItemsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminUpdateStoreItemsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminUpdateStoreItemsResultEvent != null) { foreach (var each in OnAdminUpdateStoreItemsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminUpdateStoreItemsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminUpdateTaskRequestEvent != null) { foreach (var each in OnAdminUpdateTaskRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminUpdateTaskRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminUpdateTaskResultEvent != null) { foreach (var each in OnAdminUpdateTaskResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminUpdateTaskResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminUpdateUserDataRequestEvent != null) { foreach (var each in OnAdminUpdateUserDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminUpdateUserDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminUpdateUserDataResultEvent != null) { foreach (var each in OnAdminUpdateUserDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminUpdateUserDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminUpdateUserInternalDataRequestEvent != null) { foreach (var each in OnAdminUpdateUserInternalDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminUpdateUserInternalDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminUpdateUserInternalDataResultEvent != null) { foreach (var each in OnAdminUpdateUserInternalDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminUpdateUserInternalDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminUpdateUserPublisherDataRequestEvent != null) { foreach (var each in OnAdminUpdateUserPublisherDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminUpdateUserPublisherDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminUpdateUserPublisherDataResultEvent != null) { foreach (var each in OnAdminUpdateUserPublisherDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminUpdateUserPublisherDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminUpdateUserPublisherInternalDataRequestEvent != null) { foreach (var each in OnAdminUpdateUserPublisherInternalDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminUpdateUserPublisherInternalDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminUpdateUserPublisherInternalDataResultEvent != null) { foreach (var each in OnAdminUpdateUserPublisherInternalDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminUpdateUserPublisherInternalDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminUpdateUserPublisherReadOnlyDataRequestEvent != null) { foreach (var each in OnAdminUpdateUserPublisherReadOnlyDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminUpdateUserPublisherReadOnlyDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminUpdateUserPublisherReadOnlyDataResultEvent != null) { foreach (var each in OnAdminUpdateUserPublisherReadOnlyDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminUpdateUserPublisherReadOnlyDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminUpdateUserReadOnlyDataRequestEvent != null) { foreach (var each in OnAdminUpdateUserReadOnlyDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminUpdateUserReadOnlyDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminUpdateUserReadOnlyDataResultEvent != null) { foreach (var each in OnAdminUpdateUserReadOnlyDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminUpdateUserReadOnlyDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminUpdateUserTitleDisplayNameRequestEvent != null) { foreach (var each in OnAdminUpdateUserTitleDisplayNameRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminUpdateUserTitleDisplayNameRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminUpdateUserTitleDisplayNameResultEvent != null) { foreach (var each in OnAdminUpdateUserTitleDisplayNameResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminUpdateUserTitleDisplayNameResultEvent -= (PlayFabResultEvent)each; } } } + +#endif +#if !DISABLE_PLAYFABCLIENT_API + if (OnAcceptTradeRequestEvent != null) { foreach (var each in OnAcceptTradeRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAcceptTradeRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAcceptTradeResultEvent != null) { foreach (var each in OnAcceptTradeResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAcceptTradeResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAddFriendRequestEvent != null) { foreach (var each in OnAddFriendRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAddFriendRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAddFriendResultEvent != null) { foreach (var each in OnAddFriendResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAddFriendResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAddGenericIDRequestEvent != null) { foreach (var each in OnAddGenericIDRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAddGenericIDRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAddGenericIDResultEvent != null) { foreach (var each in OnAddGenericIDResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAddGenericIDResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAddOrUpdateContactEmailRequestEvent != null) { foreach (var each in OnAddOrUpdateContactEmailRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAddOrUpdateContactEmailRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAddOrUpdateContactEmailResultEvent != null) { foreach (var each in OnAddOrUpdateContactEmailResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAddOrUpdateContactEmailResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAddSharedGroupMembersRequestEvent != null) { foreach (var each in OnAddSharedGroupMembersRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAddSharedGroupMembersRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAddSharedGroupMembersResultEvent != null) { foreach (var each in OnAddSharedGroupMembersResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAddSharedGroupMembersResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAddUsernamePasswordRequestEvent != null) { foreach (var each in OnAddUsernamePasswordRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAddUsernamePasswordRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAddUsernamePasswordResultEvent != null) { foreach (var each in OnAddUsernamePasswordResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAddUsernamePasswordResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAddUserVirtualCurrencyRequestEvent != null) { foreach (var each in OnAddUserVirtualCurrencyRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAddUserVirtualCurrencyRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAddUserVirtualCurrencyResultEvent != null) { foreach (var each in OnAddUserVirtualCurrencyResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAddUserVirtualCurrencyResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAndroidDevicePushNotificationRegistrationRequestEvent != null) { foreach (var each in OnAndroidDevicePushNotificationRegistrationRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAndroidDevicePushNotificationRegistrationRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAndroidDevicePushNotificationRegistrationResultEvent != null) { foreach (var each in OnAndroidDevicePushNotificationRegistrationResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAndroidDevicePushNotificationRegistrationResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAttributeInstallRequestEvent != null) { foreach (var each in OnAttributeInstallRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAttributeInstallRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAttributeInstallResultEvent != null) { foreach (var each in OnAttributeInstallResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAttributeInstallResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnCancelTradeRequestEvent != null) { foreach (var each in OnCancelTradeRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnCancelTradeRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnCancelTradeResultEvent != null) { foreach (var each in OnCancelTradeResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnCancelTradeResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnConfirmPurchaseRequestEvent != null) { foreach (var each in OnConfirmPurchaseRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnConfirmPurchaseRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnConfirmPurchaseResultEvent != null) { foreach (var each in OnConfirmPurchaseResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnConfirmPurchaseResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnConsumeItemRequestEvent != null) { foreach (var each in OnConsumeItemRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnConsumeItemRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnConsumeItemResultEvent != null) { foreach (var each in OnConsumeItemResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnConsumeItemResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnConsumeMicrosoftStoreEntitlementsRequestEvent != null) { foreach (var each in OnConsumeMicrosoftStoreEntitlementsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnConsumeMicrosoftStoreEntitlementsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnConsumeMicrosoftStoreEntitlementsResultEvent != null) { foreach (var each in OnConsumeMicrosoftStoreEntitlementsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnConsumeMicrosoftStoreEntitlementsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnConsumePS5EntitlementsRequestEvent != null) { foreach (var each in OnConsumePS5EntitlementsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnConsumePS5EntitlementsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnConsumePS5EntitlementsResultEvent != null) { foreach (var each in OnConsumePS5EntitlementsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnConsumePS5EntitlementsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnConsumePSNEntitlementsRequestEvent != null) { foreach (var each in OnConsumePSNEntitlementsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnConsumePSNEntitlementsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnConsumePSNEntitlementsResultEvent != null) { foreach (var each in OnConsumePSNEntitlementsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnConsumePSNEntitlementsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnConsumeXboxEntitlementsRequestEvent != null) { foreach (var each in OnConsumeXboxEntitlementsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnConsumeXboxEntitlementsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnConsumeXboxEntitlementsResultEvent != null) { foreach (var each in OnConsumeXboxEntitlementsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnConsumeXboxEntitlementsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnCreateSharedGroupRequestEvent != null) { foreach (var each in OnCreateSharedGroupRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnCreateSharedGroupRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnCreateSharedGroupResultEvent != null) { foreach (var each in OnCreateSharedGroupResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnCreateSharedGroupResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnExecuteCloudScriptRequestEvent != null) { foreach (var each in OnExecuteCloudScriptRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnExecuteCloudScriptRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnExecuteCloudScriptResultEvent != null) { foreach (var each in OnExecuteCloudScriptResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnExecuteCloudScriptResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetAccountInfoRequestEvent != null) { foreach (var each in OnGetAccountInfoRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetAccountInfoRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetAccountInfoResultEvent != null) { foreach (var each in OnGetAccountInfoResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetAccountInfoResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetAdPlacementsRequestEvent != null) { foreach (var each in OnGetAdPlacementsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetAdPlacementsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetAdPlacementsResultEvent != null) { foreach (var each in OnGetAdPlacementsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetAdPlacementsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetAllUsersCharactersRequestEvent != null) { foreach (var each in OnGetAllUsersCharactersRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetAllUsersCharactersRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetAllUsersCharactersResultEvent != null) { foreach (var each in OnGetAllUsersCharactersResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetAllUsersCharactersResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetCatalogItemsRequestEvent != null) { foreach (var each in OnGetCatalogItemsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetCatalogItemsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetCatalogItemsResultEvent != null) { foreach (var each in OnGetCatalogItemsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetCatalogItemsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetCharacterDataRequestEvent != null) { foreach (var each in OnGetCharacterDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetCharacterDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetCharacterDataResultEvent != null) { foreach (var each in OnGetCharacterDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetCharacterDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetCharacterInventoryRequestEvent != null) { foreach (var each in OnGetCharacterInventoryRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetCharacterInventoryRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetCharacterInventoryResultEvent != null) { foreach (var each in OnGetCharacterInventoryResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetCharacterInventoryResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetCharacterLeaderboardRequestEvent != null) { foreach (var each in OnGetCharacterLeaderboardRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetCharacterLeaderboardRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetCharacterLeaderboardResultEvent != null) { foreach (var each in OnGetCharacterLeaderboardResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetCharacterLeaderboardResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetCharacterReadOnlyDataRequestEvent != null) { foreach (var each in OnGetCharacterReadOnlyDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetCharacterReadOnlyDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetCharacterReadOnlyDataResultEvent != null) { foreach (var each in OnGetCharacterReadOnlyDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetCharacterReadOnlyDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetCharacterStatisticsRequestEvent != null) { foreach (var each in OnGetCharacterStatisticsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetCharacterStatisticsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetCharacterStatisticsResultEvent != null) { foreach (var each in OnGetCharacterStatisticsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetCharacterStatisticsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetContentDownloadUrlRequestEvent != null) { foreach (var each in OnGetContentDownloadUrlRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetContentDownloadUrlRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetContentDownloadUrlResultEvent != null) { foreach (var each in OnGetContentDownloadUrlResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetContentDownloadUrlResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetFriendLeaderboardRequestEvent != null) { foreach (var each in OnGetFriendLeaderboardRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetFriendLeaderboardRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetFriendLeaderboardResultEvent != null) { foreach (var each in OnGetFriendLeaderboardResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetFriendLeaderboardResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetFriendLeaderboardAroundPlayerRequestEvent != null) { foreach (var each in OnGetFriendLeaderboardAroundPlayerRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetFriendLeaderboardAroundPlayerRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetFriendLeaderboardAroundPlayerResultEvent != null) { foreach (var each in OnGetFriendLeaderboardAroundPlayerResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetFriendLeaderboardAroundPlayerResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetFriendsListRequestEvent != null) { foreach (var each in OnGetFriendsListRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetFriendsListRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetFriendsListResultEvent != null) { foreach (var each in OnGetFriendsListResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetFriendsListResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetLeaderboardRequestEvent != null) { foreach (var each in OnGetLeaderboardRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetLeaderboardRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetLeaderboardResultEvent != null) { foreach (var each in OnGetLeaderboardResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetLeaderboardResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetLeaderboardAroundCharacterRequestEvent != null) { foreach (var each in OnGetLeaderboardAroundCharacterRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetLeaderboardAroundCharacterRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetLeaderboardAroundCharacterResultEvent != null) { foreach (var each in OnGetLeaderboardAroundCharacterResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetLeaderboardAroundCharacterResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetLeaderboardAroundPlayerRequestEvent != null) { foreach (var each in OnGetLeaderboardAroundPlayerRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetLeaderboardAroundPlayerRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetLeaderboardAroundPlayerResultEvent != null) { foreach (var each in OnGetLeaderboardAroundPlayerResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetLeaderboardAroundPlayerResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetLeaderboardForUserCharactersRequestEvent != null) { foreach (var each in OnGetLeaderboardForUserCharactersRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetLeaderboardForUserCharactersRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetLeaderboardForUserCharactersResultEvent != null) { foreach (var each in OnGetLeaderboardForUserCharactersResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetLeaderboardForUserCharactersResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetPaymentTokenRequestEvent != null) { foreach (var each in OnGetPaymentTokenRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPaymentTokenRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetPaymentTokenResultEvent != null) { foreach (var each in OnGetPaymentTokenResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPaymentTokenResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetPhotonAuthenticationTokenRequestEvent != null) { foreach (var each in OnGetPhotonAuthenticationTokenRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPhotonAuthenticationTokenRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetPhotonAuthenticationTokenResultEvent != null) { foreach (var each in OnGetPhotonAuthenticationTokenResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPhotonAuthenticationTokenResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetPlayerCombinedInfoRequestEvent != null) { foreach (var each in OnGetPlayerCombinedInfoRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayerCombinedInfoRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetPlayerCombinedInfoResultEvent != null) { foreach (var each in OnGetPlayerCombinedInfoResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayerCombinedInfoResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetPlayerProfileRequestEvent != null) { foreach (var each in OnGetPlayerProfileRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayerProfileRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetPlayerProfileResultEvent != null) { foreach (var each in OnGetPlayerProfileResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayerProfileResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetPlayerSegmentsRequestEvent != null) { foreach (var each in OnGetPlayerSegmentsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayerSegmentsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetPlayerSegmentsResultEvent != null) { foreach (var each in OnGetPlayerSegmentsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayerSegmentsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetPlayerStatisticsRequestEvent != null) { foreach (var each in OnGetPlayerStatisticsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayerStatisticsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetPlayerStatisticsResultEvent != null) { foreach (var each in OnGetPlayerStatisticsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayerStatisticsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetPlayerStatisticVersionsRequestEvent != null) { foreach (var each in OnGetPlayerStatisticVersionsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayerStatisticVersionsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetPlayerStatisticVersionsResultEvent != null) { foreach (var each in OnGetPlayerStatisticVersionsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayerStatisticVersionsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetPlayerTagsRequestEvent != null) { foreach (var each in OnGetPlayerTagsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayerTagsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetPlayerTagsResultEvent != null) { foreach (var each in OnGetPlayerTagsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayerTagsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetPlayerTradesRequestEvent != null) { foreach (var each in OnGetPlayerTradesRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayerTradesRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetPlayerTradesResultEvent != null) { foreach (var each in OnGetPlayerTradesResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayerTradesResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetPlayFabIDsFromFacebookIDsRequestEvent != null) { foreach (var each in OnGetPlayFabIDsFromFacebookIDsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayFabIDsFromFacebookIDsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetPlayFabIDsFromFacebookIDsResultEvent != null) { foreach (var each in OnGetPlayFabIDsFromFacebookIDsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayFabIDsFromFacebookIDsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetPlayFabIDsFromFacebookInstantGamesIdsRequestEvent != null) { foreach (var each in OnGetPlayFabIDsFromFacebookInstantGamesIdsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayFabIDsFromFacebookInstantGamesIdsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetPlayFabIDsFromFacebookInstantGamesIdsResultEvent != null) { foreach (var each in OnGetPlayFabIDsFromFacebookInstantGamesIdsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayFabIDsFromFacebookInstantGamesIdsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetPlayFabIDsFromGameCenterIDsRequestEvent != null) { foreach (var each in OnGetPlayFabIDsFromGameCenterIDsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayFabIDsFromGameCenterIDsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetPlayFabIDsFromGameCenterIDsResultEvent != null) { foreach (var each in OnGetPlayFabIDsFromGameCenterIDsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayFabIDsFromGameCenterIDsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetPlayFabIDsFromGenericIDsRequestEvent != null) { foreach (var each in OnGetPlayFabIDsFromGenericIDsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayFabIDsFromGenericIDsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetPlayFabIDsFromGenericIDsResultEvent != null) { foreach (var each in OnGetPlayFabIDsFromGenericIDsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayFabIDsFromGenericIDsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetPlayFabIDsFromGoogleIDsRequestEvent != null) { foreach (var each in OnGetPlayFabIDsFromGoogleIDsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayFabIDsFromGoogleIDsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetPlayFabIDsFromGoogleIDsResultEvent != null) { foreach (var each in OnGetPlayFabIDsFromGoogleIDsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayFabIDsFromGoogleIDsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetPlayFabIDsFromGooglePlayGamesPlayerIDsRequestEvent != null) { foreach (var each in OnGetPlayFabIDsFromGooglePlayGamesPlayerIDsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayFabIDsFromGooglePlayGamesPlayerIDsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetPlayFabIDsFromGooglePlayGamesPlayerIDsResultEvent != null) { foreach (var each in OnGetPlayFabIDsFromGooglePlayGamesPlayerIDsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayFabIDsFromGooglePlayGamesPlayerIDsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetPlayFabIDsFromKongregateIDsRequestEvent != null) { foreach (var each in OnGetPlayFabIDsFromKongregateIDsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayFabIDsFromKongregateIDsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetPlayFabIDsFromKongregateIDsResultEvent != null) { foreach (var each in OnGetPlayFabIDsFromKongregateIDsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayFabIDsFromKongregateIDsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetPlayFabIDsFromNintendoServiceAccountIdsRequestEvent != null) { foreach (var each in OnGetPlayFabIDsFromNintendoServiceAccountIdsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayFabIDsFromNintendoServiceAccountIdsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetPlayFabIDsFromNintendoServiceAccountIdsResultEvent != null) { foreach (var each in OnGetPlayFabIDsFromNintendoServiceAccountIdsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayFabIDsFromNintendoServiceAccountIdsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetPlayFabIDsFromNintendoSwitchDeviceIdsRequestEvent != null) { foreach (var each in OnGetPlayFabIDsFromNintendoSwitchDeviceIdsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayFabIDsFromNintendoSwitchDeviceIdsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetPlayFabIDsFromNintendoSwitchDeviceIdsResultEvent != null) { foreach (var each in OnGetPlayFabIDsFromNintendoSwitchDeviceIdsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayFabIDsFromNintendoSwitchDeviceIdsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetPlayFabIDsFromPSNAccountIDsRequestEvent != null) { foreach (var each in OnGetPlayFabIDsFromPSNAccountIDsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayFabIDsFromPSNAccountIDsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetPlayFabIDsFromPSNAccountIDsResultEvent != null) { foreach (var each in OnGetPlayFabIDsFromPSNAccountIDsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayFabIDsFromPSNAccountIDsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetPlayFabIDsFromPSNOnlineIDsRequestEvent != null) { foreach (var each in OnGetPlayFabIDsFromPSNOnlineIDsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayFabIDsFromPSNOnlineIDsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetPlayFabIDsFromPSNOnlineIDsResultEvent != null) { foreach (var each in OnGetPlayFabIDsFromPSNOnlineIDsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayFabIDsFromPSNOnlineIDsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetPlayFabIDsFromSteamIDsRequestEvent != null) { foreach (var each in OnGetPlayFabIDsFromSteamIDsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayFabIDsFromSteamIDsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetPlayFabIDsFromSteamIDsResultEvent != null) { foreach (var each in OnGetPlayFabIDsFromSteamIDsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayFabIDsFromSteamIDsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetPlayFabIDsFromTwitchIDsRequestEvent != null) { foreach (var each in OnGetPlayFabIDsFromTwitchIDsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayFabIDsFromTwitchIDsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetPlayFabIDsFromTwitchIDsResultEvent != null) { foreach (var each in OnGetPlayFabIDsFromTwitchIDsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayFabIDsFromTwitchIDsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetPlayFabIDsFromXboxLiveIDsRequestEvent != null) { foreach (var each in OnGetPlayFabIDsFromXboxLiveIDsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayFabIDsFromXboxLiveIDsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetPlayFabIDsFromXboxLiveIDsResultEvent != null) { foreach (var each in OnGetPlayFabIDsFromXboxLiveIDsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayFabIDsFromXboxLiveIDsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetPublisherDataRequestEvent != null) { foreach (var each in OnGetPublisherDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPublisherDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetPublisherDataResultEvent != null) { foreach (var each in OnGetPublisherDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPublisherDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetPurchaseRequestEvent != null) { foreach (var each in OnGetPurchaseRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPurchaseRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetPurchaseResultEvent != null) { foreach (var each in OnGetPurchaseResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPurchaseResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetSharedGroupDataRequestEvent != null) { foreach (var each in OnGetSharedGroupDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetSharedGroupDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetSharedGroupDataResultEvent != null) { foreach (var each in OnGetSharedGroupDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetSharedGroupDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetStoreItemsRequestEvent != null) { foreach (var each in OnGetStoreItemsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetStoreItemsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetStoreItemsResultEvent != null) { foreach (var each in OnGetStoreItemsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetStoreItemsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetTimeRequestEvent != null) { foreach (var each in OnGetTimeRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetTimeRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetTimeResultEvent != null) { foreach (var each in OnGetTimeResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetTimeResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetTitleDataRequestEvent != null) { foreach (var each in OnGetTitleDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetTitleDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetTitleDataResultEvent != null) { foreach (var each in OnGetTitleDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetTitleDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetTitleNewsRequestEvent != null) { foreach (var each in OnGetTitleNewsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetTitleNewsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetTitleNewsResultEvent != null) { foreach (var each in OnGetTitleNewsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetTitleNewsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetTitlePublicKeyRequestEvent != null) { foreach (var each in OnGetTitlePublicKeyRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetTitlePublicKeyRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetTitlePublicKeyResultEvent != null) { foreach (var each in OnGetTitlePublicKeyResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetTitlePublicKeyResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetTradeStatusRequestEvent != null) { foreach (var each in OnGetTradeStatusRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetTradeStatusRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetTradeStatusResultEvent != null) { foreach (var each in OnGetTradeStatusResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetTradeStatusResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetUserDataRequestEvent != null) { foreach (var each in OnGetUserDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetUserDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetUserDataResultEvent != null) { foreach (var each in OnGetUserDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetUserDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetUserInventoryRequestEvent != null) { foreach (var each in OnGetUserInventoryRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetUserInventoryRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetUserInventoryResultEvent != null) { foreach (var each in OnGetUserInventoryResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetUserInventoryResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetUserPublisherDataRequestEvent != null) { foreach (var each in OnGetUserPublisherDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetUserPublisherDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetUserPublisherDataResultEvent != null) { foreach (var each in OnGetUserPublisherDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetUserPublisherDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetUserPublisherReadOnlyDataRequestEvent != null) { foreach (var each in OnGetUserPublisherReadOnlyDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetUserPublisherReadOnlyDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetUserPublisherReadOnlyDataResultEvent != null) { foreach (var each in OnGetUserPublisherReadOnlyDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetUserPublisherReadOnlyDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetUserReadOnlyDataRequestEvent != null) { foreach (var each in OnGetUserReadOnlyDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetUserReadOnlyDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetUserReadOnlyDataResultEvent != null) { foreach (var each in OnGetUserReadOnlyDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetUserReadOnlyDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGrantCharacterToUserRequestEvent != null) { foreach (var each in OnGrantCharacterToUserRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGrantCharacterToUserRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGrantCharacterToUserResultEvent != null) { foreach (var each in OnGrantCharacterToUserResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGrantCharacterToUserResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnLinkAndroidDeviceIDRequestEvent != null) { foreach (var each in OnLinkAndroidDeviceIDRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLinkAndroidDeviceIDRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnLinkAndroidDeviceIDResultEvent != null) { foreach (var each in OnLinkAndroidDeviceIDResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLinkAndroidDeviceIDResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnLinkAppleRequestEvent != null) { foreach (var each in OnLinkAppleRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLinkAppleRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnLinkAppleResultEvent != null) { foreach (var each in OnLinkAppleResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLinkAppleResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnLinkCustomIDRequestEvent != null) { foreach (var each in OnLinkCustomIDRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLinkCustomIDRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnLinkCustomIDResultEvent != null) { foreach (var each in OnLinkCustomIDResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLinkCustomIDResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnLinkFacebookAccountRequestEvent != null) { foreach (var each in OnLinkFacebookAccountRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLinkFacebookAccountRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnLinkFacebookAccountResultEvent != null) { foreach (var each in OnLinkFacebookAccountResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLinkFacebookAccountResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnLinkFacebookInstantGamesIdRequestEvent != null) { foreach (var each in OnLinkFacebookInstantGamesIdRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLinkFacebookInstantGamesIdRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnLinkFacebookInstantGamesIdResultEvent != null) { foreach (var each in OnLinkFacebookInstantGamesIdResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLinkFacebookInstantGamesIdResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnLinkGameCenterAccountRequestEvent != null) { foreach (var each in OnLinkGameCenterAccountRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLinkGameCenterAccountRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnLinkGameCenterAccountResultEvent != null) { foreach (var each in OnLinkGameCenterAccountResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLinkGameCenterAccountResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnLinkGoogleAccountRequestEvent != null) { foreach (var each in OnLinkGoogleAccountRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLinkGoogleAccountRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnLinkGoogleAccountResultEvent != null) { foreach (var each in OnLinkGoogleAccountResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLinkGoogleAccountResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnLinkGooglePlayGamesServicesAccountRequestEvent != null) { foreach (var each in OnLinkGooglePlayGamesServicesAccountRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLinkGooglePlayGamesServicesAccountRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnLinkGooglePlayGamesServicesAccountResultEvent != null) { foreach (var each in OnLinkGooglePlayGamesServicesAccountResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLinkGooglePlayGamesServicesAccountResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnLinkIOSDeviceIDRequestEvent != null) { foreach (var each in OnLinkIOSDeviceIDRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLinkIOSDeviceIDRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnLinkIOSDeviceIDResultEvent != null) { foreach (var each in OnLinkIOSDeviceIDResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLinkIOSDeviceIDResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnLinkKongregateRequestEvent != null) { foreach (var each in OnLinkKongregateRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLinkKongregateRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnLinkKongregateResultEvent != null) { foreach (var each in OnLinkKongregateResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLinkKongregateResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnLinkNintendoServiceAccountRequestEvent != null) { foreach (var each in OnLinkNintendoServiceAccountRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLinkNintendoServiceAccountRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnLinkNintendoServiceAccountResultEvent != null) { foreach (var each in OnLinkNintendoServiceAccountResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLinkNintendoServiceAccountResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnLinkNintendoSwitchDeviceIdRequestEvent != null) { foreach (var each in OnLinkNintendoSwitchDeviceIdRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLinkNintendoSwitchDeviceIdRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnLinkNintendoSwitchDeviceIdResultEvent != null) { foreach (var each in OnLinkNintendoSwitchDeviceIdResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLinkNintendoSwitchDeviceIdResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnLinkOpenIdConnectRequestEvent != null) { foreach (var each in OnLinkOpenIdConnectRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLinkOpenIdConnectRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnLinkOpenIdConnectResultEvent != null) { foreach (var each in OnLinkOpenIdConnectResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLinkOpenIdConnectResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnLinkPSNAccountRequestEvent != null) { foreach (var each in OnLinkPSNAccountRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLinkPSNAccountRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnLinkPSNAccountResultEvent != null) { foreach (var each in OnLinkPSNAccountResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLinkPSNAccountResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnLinkSteamAccountRequestEvent != null) { foreach (var each in OnLinkSteamAccountRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLinkSteamAccountRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnLinkSteamAccountResultEvent != null) { foreach (var each in OnLinkSteamAccountResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLinkSteamAccountResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnLinkTwitchRequestEvent != null) { foreach (var each in OnLinkTwitchRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLinkTwitchRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnLinkTwitchResultEvent != null) { foreach (var each in OnLinkTwitchResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLinkTwitchResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnLinkXboxAccountRequestEvent != null) { foreach (var each in OnLinkXboxAccountRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLinkXboxAccountRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnLinkXboxAccountResultEvent != null) { foreach (var each in OnLinkXboxAccountResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLinkXboxAccountResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnLoginWithAndroidDeviceIDRequestEvent != null) { foreach (var each in OnLoginWithAndroidDeviceIDRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLoginWithAndroidDeviceIDRequestEvent -= (PlayFabRequestEvent)each; } } } + + if (OnLoginWithAppleRequestEvent != null) { foreach (var each in OnLoginWithAppleRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLoginWithAppleRequestEvent -= (PlayFabRequestEvent)each; } } } + + if (OnLoginWithCustomIDRequestEvent != null) { foreach (var each in OnLoginWithCustomIDRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLoginWithCustomIDRequestEvent -= (PlayFabRequestEvent)each; } } } + + if (OnLoginWithEmailAddressRequestEvent != null) { foreach (var each in OnLoginWithEmailAddressRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLoginWithEmailAddressRequestEvent -= (PlayFabRequestEvent)each; } } } + + if (OnLoginWithFacebookRequestEvent != null) { foreach (var each in OnLoginWithFacebookRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLoginWithFacebookRequestEvent -= (PlayFabRequestEvent)each; } } } + + if (OnLoginWithFacebookInstantGamesIdRequestEvent != null) { foreach (var each in OnLoginWithFacebookInstantGamesIdRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLoginWithFacebookInstantGamesIdRequestEvent -= (PlayFabRequestEvent)each; } } } + + if (OnLoginWithGameCenterRequestEvent != null) { foreach (var each in OnLoginWithGameCenterRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLoginWithGameCenterRequestEvent -= (PlayFabRequestEvent)each; } } } + + if (OnLoginWithGoogleAccountRequestEvent != null) { foreach (var each in OnLoginWithGoogleAccountRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLoginWithGoogleAccountRequestEvent -= (PlayFabRequestEvent)each; } } } + + if (OnLoginWithGooglePlayGamesServicesRequestEvent != null) { foreach (var each in OnLoginWithGooglePlayGamesServicesRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLoginWithGooglePlayGamesServicesRequestEvent -= (PlayFabRequestEvent)each; } } } + + if (OnLoginWithIOSDeviceIDRequestEvent != null) { foreach (var each in OnLoginWithIOSDeviceIDRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLoginWithIOSDeviceIDRequestEvent -= (PlayFabRequestEvent)each; } } } + + if (OnLoginWithKongregateRequestEvent != null) { foreach (var each in OnLoginWithKongregateRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLoginWithKongregateRequestEvent -= (PlayFabRequestEvent)each; } } } + + if (OnLoginWithNintendoServiceAccountRequestEvent != null) { foreach (var each in OnLoginWithNintendoServiceAccountRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLoginWithNintendoServiceAccountRequestEvent -= (PlayFabRequestEvent)each; } } } + + if (OnLoginWithNintendoSwitchDeviceIdRequestEvent != null) { foreach (var each in OnLoginWithNintendoSwitchDeviceIdRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLoginWithNintendoSwitchDeviceIdRequestEvent -= (PlayFabRequestEvent)each; } } } + + if (OnLoginWithOpenIdConnectRequestEvent != null) { foreach (var each in OnLoginWithOpenIdConnectRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLoginWithOpenIdConnectRequestEvent -= (PlayFabRequestEvent)each; } } } + + if (OnLoginWithPlayFabRequestEvent != null) { foreach (var each in OnLoginWithPlayFabRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLoginWithPlayFabRequestEvent -= (PlayFabRequestEvent)each; } } } + + if (OnLoginWithPSNRequestEvent != null) { foreach (var each in OnLoginWithPSNRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLoginWithPSNRequestEvent -= (PlayFabRequestEvent)each; } } } + + if (OnLoginWithSteamRequestEvent != null) { foreach (var each in OnLoginWithSteamRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLoginWithSteamRequestEvent -= (PlayFabRequestEvent)each; } } } + + if (OnLoginWithTwitchRequestEvent != null) { foreach (var each in OnLoginWithTwitchRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLoginWithTwitchRequestEvent -= (PlayFabRequestEvent)each; } } } + + if (OnLoginWithXboxRequestEvent != null) { foreach (var each in OnLoginWithXboxRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLoginWithXboxRequestEvent -= (PlayFabRequestEvent)each; } } } + + if (OnOpenTradeRequestEvent != null) { foreach (var each in OnOpenTradeRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnOpenTradeRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnOpenTradeResultEvent != null) { foreach (var each in OnOpenTradeResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnOpenTradeResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnPayForPurchaseRequestEvent != null) { foreach (var each in OnPayForPurchaseRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnPayForPurchaseRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnPayForPurchaseResultEvent != null) { foreach (var each in OnPayForPurchaseResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnPayForPurchaseResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnPurchaseItemRequestEvent != null) { foreach (var each in OnPurchaseItemRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnPurchaseItemRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnPurchaseItemResultEvent != null) { foreach (var each in OnPurchaseItemResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnPurchaseItemResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnRedeemCouponRequestEvent != null) { foreach (var each in OnRedeemCouponRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnRedeemCouponRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnRedeemCouponResultEvent != null) { foreach (var each in OnRedeemCouponResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnRedeemCouponResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnRefreshPSNAuthTokenRequestEvent != null) { foreach (var each in OnRefreshPSNAuthTokenRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnRefreshPSNAuthTokenRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnRefreshPSNAuthTokenResultEvent != null) { foreach (var each in OnRefreshPSNAuthTokenResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnRefreshPSNAuthTokenResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnRegisterForIOSPushNotificationRequestEvent != null) { foreach (var each in OnRegisterForIOSPushNotificationRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnRegisterForIOSPushNotificationRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnRegisterForIOSPushNotificationResultEvent != null) { foreach (var each in OnRegisterForIOSPushNotificationResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnRegisterForIOSPushNotificationResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnRegisterPlayFabUserRequestEvent != null) { foreach (var each in OnRegisterPlayFabUserRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnRegisterPlayFabUserRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnRegisterPlayFabUserResultEvent != null) { foreach (var each in OnRegisterPlayFabUserResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnRegisterPlayFabUserResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnRemoveContactEmailRequestEvent != null) { foreach (var each in OnRemoveContactEmailRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnRemoveContactEmailRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnRemoveContactEmailResultEvent != null) { foreach (var each in OnRemoveContactEmailResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnRemoveContactEmailResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnRemoveFriendRequestEvent != null) { foreach (var each in OnRemoveFriendRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnRemoveFriendRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnRemoveFriendResultEvent != null) { foreach (var each in OnRemoveFriendResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnRemoveFriendResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnRemoveGenericIDRequestEvent != null) { foreach (var each in OnRemoveGenericIDRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnRemoveGenericIDRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnRemoveGenericIDResultEvent != null) { foreach (var each in OnRemoveGenericIDResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnRemoveGenericIDResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnRemoveSharedGroupMembersRequestEvent != null) { foreach (var each in OnRemoveSharedGroupMembersRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnRemoveSharedGroupMembersRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnRemoveSharedGroupMembersResultEvent != null) { foreach (var each in OnRemoveSharedGroupMembersResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnRemoveSharedGroupMembersResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnReportAdActivityRequestEvent != null) { foreach (var each in OnReportAdActivityRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnReportAdActivityRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnReportAdActivityResultEvent != null) { foreach (var each in OnReportAdActivityResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnReportAdActivityResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnReportDeviceInfoRequestEvent != null) { foreach (var each in OnReportDeviceInfoRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnReportDeviceInfoRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnReportDeviceInfoResultEvent != null) { foreach (var each in OnReportDeviceInfoResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnReportDeviceInfoResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnReportPlayerRequestEvent != null) { foreach (var each in OnReportPlayerRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnReportPlayerRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnReportPlayerResultEvent != null) { foreach (var each in OnReportPlayerResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnReportPlayerResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnRestoreIOSPurchasesRequestEvent != null) { foreach (var each in OnRestoreIOSPurchasesRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnRestoreIOSPurchasesRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnRestoreIOSPurchasesResultEvent != null) { foreach (var each in OnRestoreIOSPurchasesResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnRestoreIOSPurchasesResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnRewardAdActivityRequestEvent != null) { foreach (var each in OnRewardAdActivityRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnRewardAdActivityRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnRewardAdActivityResultEvent != null) { foreach (var each in OnRewardAdActivityResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnRewardAdActivityResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnSendAccountRecoveryEmailRequestEvent != null) { foreach (var each in OnSendAccountRecoveryEmailRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnSendAccountRecoveryEmailRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnSendAccountRecoveryEmailResultEvent != null) { foreach (var each in OnSendAccountRecoveryEmailResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnSendAccountRecoveryEmailResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnSetFriendTagsRequestEvent != null) { foreach (var each in OnSetFriendTagsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnSetFriendTagsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnSetFriendTagsResultEvent != null) { foreach (var each in OnSetFriendTagsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnSetFriendTagsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnSetPlayerSecretRequestEvent != null) { foreach (var each in OnSetPlayerSecretRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnSetPlayerSecretRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnSetPlayerSecretResultEvent != null) { foreach (var each in OnSetPlayerSecretResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnSetPlayerSecretResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnStartPurchaseRequestEvent != null) { foreach (var each in OnStartPurchaseRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnStartPurchaseRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnStartPurchaseResultEvent != null) { foreach (var each in OnStartPurchaseResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnStartPurchaseResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnSubtractUserVirtualCurrencyRequestEvent != null) { foreach (var each in OnSubtractUserVirtualCurrencyRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnSubtractUserVirtualCurrencyRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnSubtractUserVirtualCurrencyResultEvent != null) { foreach (var each in OnSubtractUserVirtualCurrencyResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnSubtractUserVirtualCurrencyResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnUnlinkAndroidDeviceIDRequestEvent != null) { foreach (var each in OnUnlinkAndroidDeviceIDRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUnlinkAndroidDeviceIDRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnUnlinkAndroidDeviceIDResultEvent != null) { foreach (var each in OnUnlinkAndroidDeviceIDResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUnlinkAndroidDeviceIDResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnUnlinkAppleRequestEvent != null) { foreach (var each in OnUnlinkAppleRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUnlinkAppleRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnUnlinkAppleResultEvent != null) { foreach (var each in OnUnlinkAppleResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUnlinkAppleResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnUnlinkCustomIDRequestEvent != null) { foreach (var each in OnUnlinkCustomIDRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUnlinkCustomIDRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnUnlinkCustomIDResultEvent != null) { foreach (var each in OnUnlinkCustomIDResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUnlinkCustomIDResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnUnlinkFacebookAccountRequestEvent != null) { foreach (var each in OnUnlinkFacebookAccountRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUnlinkFacebookAccountRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnUnlinkFacebookAccountResultEvent != null) { foreach (var each in OnUnlinkFacebookAccountResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUnlinkFacebookAccountResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnUnlinkFacebookInstantGamesIdRequestEvent != null) { foreach (var each in OnUnlinkFacebookInstantGamesIdRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUnlinkFacebookInstantGamesIdRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnUnlinkFacebookInstantGamesIdResultEvent != null) { foreach (var each in OnUnlinkFacebookInstantGamesIdResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUnlinkFacebookInstantGamesIdResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnUnlinkGameCenterAccountRequestEvent != null) { foreach (var each in OnUnlinkGameCenterAccountRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUnlinkGameCenterAccountRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnUnlinkGameCenterAccountResultEvent != null) { foreach (var each in OnUnlinkGameCenterAccountResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUnlinkGameCenterAccountResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnUnlinkGoogleAccountRequestEvent != null) { foreach (var each in OnUnlinkGoogleAccountRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUnlinkGoogleAccountRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnUnlinkGoogleAccountResultEvent != null) { foreach (var each in OnUnlinkGoogleAccountResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUnlinkGoogleAccountResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnUnlinkGooglePlayGamesServicesAccountRequestEvent != null) { foreach (var each in OnUnlinkGooglePlayGamesServicesAccountRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUnlinkGooglePlayGamesServicesAccountRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnUnlinkGooglePlayGamesServicesAccountResultEvent != null) { foreach (var each in OnUnlinkGooglePlayGamesServicesAccountResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUnlinkGooglePlayGamesServicesAccountResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnUnlinkIOSDeviceIDRequestEvent != null) { foreach (var each in OnUnlinkIOSDeviceIDRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUnlinkIOSDeviceIDRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnUnlinkIOSDeviceIDResultEvent != null) { foreach (var each in OnUnlinkIOSDeviceIDResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUnlinkIOSDeviceIDResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnUnlinkKongregateRequestEvent != null) { foreach (var each in OnUnlinkKongregateRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUnlinkKongregateRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnUnlinkKongregateResultEvent != null) { foreach (var each in OnUnlinkKongregateResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUnlinkKongregateResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnUnlinkNintendoServiceAccountRequestEvent != null) { foreach (var each in OnUnlinkNintendoServiceAccountRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUnlinkNintendoServiceAccountRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnUnlinkNintendoServiceAccountResultEvent != null) { foreach (var each in OnUnlinkNintendoServiceAccountResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUnlinkNintendoServiceAccountResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnUnlinkNintendoSwitchDeviceIdRequestEvent != null) { foreach (var each in OnUnlinkNintendoSwitchDeviceIdRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUnlinkNintendoSwitchDeviceIdRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnUnlinkNintendoSwitchDeviceIdResultEvent != null) { foreach (var each in OnUnlinkNintendoSwitchDeviceIdResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUnlinkNintendoSwitchDeviceIdResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnUnlinkOpenIdConnectRequestEvent != null) { foreach (var each in OnUnlinkOpenIdConnectRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUnlinkOpenIdConnectRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnUnlinkOpenIdConnectResultEvent != null) { foreach (var each in OnUnlinkOpenIdConnectResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUnlinkOpenIdConnectResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnUnlinkPSNAccountRequestEvent != null) { foreach (var each in OnUnlinkPSNAccountRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUnlinkPSNAccountRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnUnlinkPSNAccountResultEvent != null) { foreach (var each in OnUnlinkPSNAccountResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUnlinkPSNAccountResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnUnlinkSteamAccountRequestEvent != null) { foreach (var each in OnUnlinkSteamAccountRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUnlinkSteamAccountRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnUnlinkSteamAccountResultEvent != null) { foreach (var each in OnUnlinkSteamAccountResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUnlinkSteamAccountResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnUnlinkTwitchRequestEvent != null) { foreach (var each in OnUnlinkTwitchRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUnlinkTwitchRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnUnlinkTwitchResultEvent != null) { foreach (var each in OnUnlinkTwitchResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUnlinkTwitchResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnUnlinkXboxAccountRequestEvent != null) { foreach (var each in OnUnlinkXboxAccountRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUnlinkXboxAccountRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnUnlinkXboxAccountResultEvent != null) { foreach (var each in OnUnlinkXboxAccountResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUnlinkXboxAccountResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnUnlockContainerInstanceRequestEvent != null) { foreach (var each in OnUnlockContainerInstanceRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUnlockContainerInstanceRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnUnlockContainerInstanceResultEvent != null) { foreach (var each in OnUnlockContainerInstanceResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUnlockContainerInstanceResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnUnlockContainerItemRequestEvent != null) { foreach (var each in OnUnlockContainerItemRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUnlockContainerItemRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnUnlockContainerItemResultEvent != null) { foreach (var each in OnUnlockContainerItemResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUnlockContainerItemResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnUpdateAvatarUrlRequestEvent != null) { foreach (var each in OnUpdateAvatarUrlRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUpdateAvatarUrlRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnUpdateAvatarUrlResultEvent != null) { foreach (var each in OnUpdateAvatarUrlResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUpdateAvatarUrlResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnUpdateCharacterDataRequestEvent != null) { foreach (var each in OnUpdateCharacterDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUpdateCharacterDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnUpdateCharacterDataResultEvent != null) { foreach (var each in OnUpdateCharacterDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUpdateCharacterDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnUpdateCharacterStatisticsRequestEvent != null) { foreach (var each in OnUpdateCharacterStatisticsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUpdateCharacterStatisticsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnUpdateCharacterStatisticsResultEvent != null) { foreach (var each in OnUpdateCharacterStatisticsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUpdateCharacterStatisticsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnUpdatePlayerStatisticsRequestEvent != null) { foreach (var each in OnUpdatePlayerStatisticsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUpdatePlayerStatisticsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnUpdatePlayerStatisticsResultEvent != null) { foreach (var each in OnUpdatePlayerStatisticsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUpdatePlayerStatisticsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnUpdateSharedGroupDataRequestEvent != null) { foreach (var each in OnUpdateSharedGroupDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUpdateSharedGroupDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnUpdateSharedGroupDataResultEvent != null) { foreach (var each in OnUpdateSharedGroupDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUpdateSharedGroupDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnUpdateUserDataRequestEvent != null) { foreach (var each in OnUpdateUserDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUpdateUserDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnUpdateUserDataResultEvent != null) { foreach (var each in OnUpdateUserDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUpdateUserDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnUpdateUserPublisherDataRequestEvent != null) { foreach (var each in OnUpdateUserPublisherDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUpdateUserPublisherDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnUpdateUserPublisherDataResultEvent != null) { foreach (var each in OnUpdateUserPublisherDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUpdateUserPublisherDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnUpdateUserTitleDisplayNameRequestEvent != null) { foreach (var each in OnUpdateUserTitleDisplayNameRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUpdateUserTitleDisplayNameRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnUpdateUserTitleDisplayNameResultEvent != null) { foreach (var each in OnUpdateUserTitleDisplayNameResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUpdateUserTitleDisplayNameResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnValidateAmazonIAPReceiptRequestEvent != null) { foreach (var each in OnValidateAmazonIAPReceiptRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnValidateAmazonIAPReceiptRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnValidateAmazonIAPReceiptResultEvent != null) { foreach (var each in OnValidateAmazonIAPReceiptResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnValidateAmazonIAPReceiptResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnValidateGooglePlayPurchaseRequestEvent != null) { foreach (var each in OnValidateGooglePlayPurchaseRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnValidateGooglePlayPurchaseRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnValidateGooglePlayPurchaseResultEvent != null) { foreach (var each in OnValidateGooglePlayPurchaseResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnValidateGooglePlayPurchaseResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnValidateIOSReceiptRequestEvent != null) { foreach (var each in OnValidateIOSReceiptRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnValidateIOSReceiptRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnValidateIOSReceiptResultEvent != null) { foreach (var each in OnValidateIOSReceiptResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnValidateIOSReceiptResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnValidateWindowsStoreReceiptRequestEvent != null) { foreach (var each in OnValidateWindowsStoreReceiptRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnValidateWindowsStoreReceiptRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnValidateWindowsStoreReceiptResultEvent != null) { foreach (var each in OnValidateWindowsStoreReceiptResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnValidateWindowsStoreReceiptResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnWriteCharacterEventRequestEvent != null) { foreach (var each in OnWriteCharacterEventRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnWriteCharacterEventRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnWriteCharacterEventResultEvent != null) { foreach (var each in OnWriteCharacterEventResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnWriteCharacterEventResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnWritePlayerEventRequestEvent != null) { foreach (var each in OnWritePlayerEventRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnWritePlayerEventRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnWritePlayerEventResultEvent != null) { foreach (var each in OnWritePlayerEventResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnWritePlayerEventResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnWriteTitleEventRequestEvent != null) { foreach (var each in OnWriteTitleEventRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnWriteTitleEventRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnWriteTitleEventResultEvent != null) { foreach (var each in OnWriteTitleEventResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnWriteTitleEventResultEvent -= (PlayFabResultEvent)each; } } } + +#endif +#if ENABLE_PLAYFABSERVER_API + if (OnServerAddCharacterVirtualCurrencyRequestEvent != null) { foreach (var each in OnServerAddCharacterVirtualCurrencyRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerAddCharacterVirtualCurrencyRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerAddCharacterVirtualCurrencyResultEvent != null) { foreach (var each in OnServerAddCharacterVirtualCurrencyResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerAddCharacterVirtualCurrencyResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerAddFriendRequestEvent != null) { foreach (var each in OnServerAddFriendRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerAddFriendRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerAddFriendResultEvent != null) { foreach (var each in OnServerAddFriendResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerAddFriendResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerAddGenericIDRequestEvent != null) { foreach (var each in OnServerAddGenericIDRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerAddGenericIDRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerAddGenericIDResultEvent != null) { foreach (var each in OnServerAddGenericIDResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerAddGenericIDResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerAddPlayerTagRequestEvent != null) { foreach (var each in OnServerAddPlayerTagRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerAddPlayerTagRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerAddPlayerTagResultEvent != null) { foreach (var each in OnServerAddPlayerTagResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerAddPlayerTagResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerAddSharedGroupMembersRequestEvent != null) { foreach (var each in OnServerAddSharedGroupMembersRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerAddSharedGroupMembersRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerAddSharedGroupMembersResultEvent != null) { foreach (var each in OnServerAddSharedGroupMembersResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerAddSharedGroupMembersResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerAddUserVirtualCurrencyRequestEvent != null) { foreach (var each in OnServerAddUserVirtualCurrencyRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerAddUserVirtualCurrencyRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerAddUserVirtualCurrencyResultEvent != null) { foreach (var each in OnServerAddUserVirtualCurrencyResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerAddUserVirtualCurrencyResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerAuthenticateSessionTicketRequestEvent != null) { foreach (var each in OnServerAuthenticateSessionTicketRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerAuthenticateSessionTicketRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerAuthenticateSessionTicketResultEvent != null) { foreach (var each in OnServerAuthenticateSessionTicketResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerAuthenticateSessionTicketResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerAwardSteamAchievementRequestEvent != null) { foreach (var each in OnServerAwardSteamAchievementRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerAwardSteamAchievementRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerAwardSteamAchievementResultEvent != null) { foreach (var each in OnServerAwardSteamAchievementResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerAwardSteamAchievementResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerBanUsersRequestEvent != null) { foreach (var each in OnServerBanUsersRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerBanUsersRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerBanUsersResultEvent != null) { foreach (var each in OnServerBanUsersResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerBanUsersResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerConsumeItemRequestEvent != null) { foreach (var each in OnServerConsumeItemRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerConsumeItemRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerConsumeItemResultEvent != null) { foreach (var each in OnServerConsumeItemResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerConsumeItemResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerCreateSharedGroupRequestEvent != null) { foreach (var each in OnServerCreateSharedGroupRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerCreateSharedGroupRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerCreateSharedGroupResultEvent != null) { foreach (var each in OnServerCreateSharedGroupResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerCreateSharedGroupResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerDeleteCharacterFromUserRequestEvent != null) { foreach (var each in OnServerDeleteCharacterFromUserRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerDeleteCharacterFromUserRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerDeleteCharacterFromUserResultEvent != null) { foreach (var each in OnServerDeleteCharacterFromUserResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerDeleteCharacterFromUserResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerDeletePlayerRequestEvent != null) { foreach (var each in OnServerDeletePlayerRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerDeletePlayerRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerDeletePlayerResultEvent != null) { foreach (var each in OnServerDeletePlayerResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerDeletePlayerResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerDeletePushNotificationTemplateRequestEvent != null) { foreach (var each in OnServerDeletePushNotificationTemplateRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerDeletePushNotificationTemplateRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerDeletePushNotificationTemplateResultEvent != null) { foreach (var each in OnServerDeletePushNotificationTemplateResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerDeletePushNotificationTemplateResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerDeleteSharedGroupRequestEvent != null) { foreach (var each in OnServerDeleteSharedGroupRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerDeleteSharedGroupRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerDeleteSharedGroupResultEvent != null) { foreach (var each in OnServerDeleteSharedGroupResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerDeleteSharedGroupResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerEvaluateRandomResultTableRequestEvent != null) { foreach (var each in OnServerEvaluateRandomResultTableRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerEvaluateRandomResultTableRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerEvaluateRandomResultTableResultEvent != null) { foreach (var each in OnServerEvaluateRandomResultTableResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerEvaluateRandomResultTableResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerExecuteCloudScriptRequestEvent != null) { foreach (var each in OnServerExecuteCloudScriptRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerExecuteCloudScriptRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerExecuteCloudScriptResultEvent != null) { foreach (var each in OnServerExecuteCloudScriptResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerExecuteCloudScriptResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetAllSegmentsRequestEvent != null) { foreach (var each in OnServerGetAllSegmentsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetAllSegmentsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetAllSegmentsResultEvent != null) { foreach (var each in OnServerGetAllSegmentsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetAllSegmentsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetAllUsersCharactersRequestEvent != null) { foreach (var each in OnServerGetAllUsersCharactersRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetAllUsersCharactersRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetAllUsersCharactersResultEvent != null) { foreach (var each in OnServerGetAllUsersCharactersResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetAllUsersCharactersResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetCatalogItemsRequestEvent != null) { foreach (var each in OnServerGetCatalogItemsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetCatalogItemsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetCatalogItemsResultEvent != null) { foreach (var each in OnServerGetCatalogItemsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetCatalogItemsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetCharacterDataRequestEvent != null) { foreach (var each in OnServerGetCharacterDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetCharacterDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetCharacterDataResultEvent != null) { foreach (var each in OnServerGetCharacterDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetCharacterDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetCharacterInternalDataRequestEvent != null) { foreach (var each in OnServerGetCharacterInternalDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetCharacterInternalDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetCharacterInternalDataResultEvent != null) { foreach (var each in OnServerGetCharacterInternalDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetCharacterInternalDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetCharacterInventoryRequestEvent != null) { foreach (var each in OnServerGetCharacterInventoryRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetCharacterInventoryRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetCharacterInventoryResultEvent != null) { foreach (var each in OnServerGetCharacterInventoryResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetCharacterInventoryResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetCharacterLeaderboardRequestEvent != null) { foreach (var each in OnServerGetCharacterLeaderboardRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetCharacterLeaderboardRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetCharacterLeaderboardResultEvent != null) { foreach (var each in OnServerGetCharacterLeaderboardResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetCharacterLeaderboardResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetCharacterReadOnlyDataRequestEvent != null) { foreach (var each in OnServerGetCharacterReadOnlyDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetCharacterReadOnlyDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetCharacterReadOnlyDataResultEvent != null) { foreach (var each in OnServerGetCharacterReadOnlyDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetCharacterReadOnlyDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetCharacterStatisticsRequestEvent != null) { foreach (var each in OnServerGetCharacterStatisticsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetCharacterStatisticsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetCharacterStatisticsResultEvent != null) { foreach (var each in OnServerGetCharacterStatisticsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetCharacterStatisticsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetContentDownloadUrlRequestEvent != null) { foreach (var each in OnServerGetContentDownloadUrlRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetContentDownloadUrlRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetContentDownloadUrlResultEvent != null) { foreach (var each in OnServerGetContentDownloadUrlResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetContentDownloadUrlResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetFriendLeaderboardRequestEvent != null) { foreach (var each in OnServerGetFriendLeaderboardRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetFriendLeaderboardRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetFriendLeaderboardResultEvent != null) { foreach (var each in OnServerGetFriendLeaderboardResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetFriendLeaderboardResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetFriendsListRequestEvent != null) { foreach (var each in OnServerGetFriendsListRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetFriendsListRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetFriendsListResultEvent != null) { foreach (var each in OnServerGetFriendsListResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetFriendsListResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetLeaderboardRequestEvent != null) { foreach (var each in OnServerGetLeaderboardRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetLeaderboardRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetLeaderboardResultEvent != null) { foreach (var each in OnServerGetLeaderboardResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetLeaderboardResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetLeaderboardAroundCharacterRequestEvent != null) { foreach (var each in OnServerGetLeaderboardAroundCharacterRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetLeaderboardAroundCharacterRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetLeaderboardAroundCharacterResultEvent != null) { foreach (var each in OnServerGetLeaderboardAroundCharacterResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetLeaderboardAroundCharacterResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetLeaderboardAroundUserRequestEvent != null) { foreach (var each in OnServerGetLeaderboardAroundUserRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetLeaderboardAroundUserRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetLeaderboardAroundUserResultEvent != null) { foreach (var each in OnServerGetLeaderboardAroundUserResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetLeaderboardAroundUserResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetLeaderboardForUserCharactersRequestEvent != null) { foreach (var each in OnServerGetLeaderboardForUserCharactersRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetLeaderboardForUserCharactersRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetLeaderboardForUserCharactersResultEvent != null) { foreach (var each in OnServerGetLeaderboardForUserCharactersResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetLeaderboardForUserCharactersResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetPlayerCombinedInfoRequestEvent != null) { foreach (var each in OnServerGetPlayerCombinedInfoRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetPlayerCombinedInfoRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetPlayerCombinedInfoResultEvent != null) { foreach (var each in OnServerGetPlayerCombinedInfoResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetPlayerCombinedInfoResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetPlayerProfileRequestEvent != null) { foreach (var each in OnServerGetPlayerProfileRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetPlayerProfileRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetPlayerProfileResultEvent != null) { foreach (var each in OnServerGetPlayerProfileResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetPlayerProfileResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetPlayerSegmentsRequestEvent != null) { foreach (var each in OnServerGetPlayerSegmentsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetPlayerSegmentsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetPlayerSegmentsResultEvent != null) { foreach (var each in OnServerGetPlayerSegmentsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetPlayerSegmentsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetPlayersInSegmentRequestEvent != null) { foreach (var each in OnServerGetPlayersInSegmentRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetPlayersInSegmentRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetPlayersInSegmentResultEvent != null) { foreach (var each in OnServerGetPlayersInSegmentResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetPlayersInSegmentResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetPlayerStatisticsRequestEvent != null) { foreach (var each in OnServerGetPlayerStatisticsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetPlayerStatisticsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetPlayerStatisticsResultEvent != null) { foreach (var each in OnServerGetPlayerStatisticsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetPlayerStatisticsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetPlayerStatisticVersionsRequestEvent != null) { foreach (var each in OnServerGetPlayerStatisticVersionsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetPlayerStatisticVersionsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetPlayerStatisticVersionsResultEvent != null) { foreach (var each in OnServerGetPlayerStatisticVersionsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetPlayerStatisticVersionsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetPlayerTagsRequestEvent != null) { foreach (var each in OnServerGetPlayerTagsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetPlayerTagsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetPlayerTagsResultEvent != null) { foreach (var each in OnServerGetPlayerTagsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetPlayerTagsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetPlayFabIDsFromFacebookIDsRequestEvent != null) { foreach (var each in OnServerGetPlayFabIDsFromFacebookIDsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetPlayFabIDsFromFacebookIDsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetPlayFabIDsFromFacebookIDsResultEvent != null) { foreach (var each in OnServerGetPlayFabIDsFromFacebookIDsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetPlayFabIDsFromFacebookIDsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetPlayFabIDsFromFacebookInstantGamesIdsRequestEvent != null) { foreach (var each in OnServerGetPlayFabIDsFromFacebookInstantGamesIdsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetPlayFabIDsFromFacebookInstantGamesIdsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetPlayFabIDsFromFacebookInstantGamesIdsResultEvent != null) { foreach (var each in OnServerGetPlayFabIDsFromFacebookInstantGamesIdsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetPlayFabIDsFromFacebookInstantGamesIdsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetPlayFabIDsFromGenericIDsRequestEvent != null) { foreach (var each in OnServerGetPlayFabIDsFromGenericIDsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetPlayFabIDsFromGenericIDsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetPlayFabIDsFromGenericIDsResultEvent != null) { foreach (var each in OnServerGetPlayFabIDsFromGenericIDsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetPlayFabIDsFromGenericIDsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetPlayFabIDsFromNintendoServiceAccountIdsRequestEvent != null) { foreach (var each in OnServerGetPlayFabIDsFromNintendoServiceAccountIdsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetPlayFabIDsFromNintendoServiceAccountIdsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetPlayFabIDsFromNintendoServiceAccountIdsResultEvent != null) { foreach (var each in OnServerGetPlayFabIDsFromNintendoServiceAccountIdsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetPlayFabIDsFromNintendoServiceAccountIdsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetPlayFabIDsFromNintendoSwitchDeviceIdsRequestEvent != null) { foreach (var each in OnServerGetPlayFabIDsFromNintendoSwitchDeviceIdsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetPlayFabIDsFromNintendoSwitchDeviceIdsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetPlayFabIDsFromNintendoSwitchDeviceIdsResultEvent != null) { foreach (var each in OnServerGetPlayFabIDsFromNintendoSwitchDeviceIdsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetPlayFabIDsFromNintendoSwitchDeviceIdsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetPlayFabIDsFromPSNAccountIDsRequestEvent != null) { foreach (var each in OnServerGetPlayFabIDsFromPSNAccountIDsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetPlayFabIDsFromPSNAccountIDsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetPlayFabIDsFromPSNAccountIDsResultEvent != null) { foreach (var each in OnServerGetPlayFabIDsFromPSNAccountIDsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetPlayFabIDsFromPSNAccountIDsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetPlayFabIDsFromPSNOnlineIDsRequestEvent != null) { foreach (var each in OnServerGetPlayFabIDsFromPSNOnlineIDsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetPlayFabIDsFromPSNOnlineIDsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetPlayFabIDsFromPSNOnlineIDsResultEvent != null) { foreach (var each in OnServerGetPlayFabIDsFromPSNOnlineIDsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetPlayFabIDsFromPSNOnlineIDsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetPlayFabIDsFromSteamIDsRequestEvent != null) { foreach (var each in OnServerGetPlayFabIDsFromSteamIDsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetPlayFabIDsFromSteamIDsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetPlayFabIDsFromSteamIDsResultEvent != null) { foreach (var each in OnServerGetPlayFabIDsFromSteamIDsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetPlayFabIDsFromSteamIDsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetPlayFabIDsFromTwitchIDsRequestEvent != null) { foreach (var each in OnServerGetPlayFabIDsFromTwitchIDsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetPlayFabIDsFromTwitchIDsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetPlayFabIDsFromTwitchIDsResultEvent != null) { foreach (var each in OnServerGetPlayFabIDsFromTwitchIDsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetPlayFabIDsFromTwitchIDsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetPlayFabIDsFromXboxLiveIDsRequestEvent != null) { foreach (var each in OnServerGetPlayFabIDsFromXboxLiveIDsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetPlayFabIDsFromXboxLiveIDsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetPlayFabIDsFromXboxLiveIDsResultEvent != null) { foreach (var each in OnServerGetPlayFabIDsFromXboxLiveIDsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetPlayFabIDsFromXboxLiveIDsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetPublisherDataRequestEvent != null) { foreach (var each in OnServerGetPublisherDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetPublisherDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetPublisherDataResultEvent != null) { foreach (var each in OnServerGetPublisherDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetPublisherDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetRandomResultTablesRequestEvent != null) { foreach (var each in OnServerGetRandomResultTablesRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetRandomResultTablesRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetRandomResultTablesResultEvent != null) { foreach (var each in OnServerGetRandomResultTablesResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetRandomResultTablesResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetServerCustomIDsFromPlayFabIDsRequestEvent != null) { foreach (var each in OnServerGetServerCustomIDsFromPlayFabIDsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetServerCustomIDsFromPlayFabIDsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetServerCustomIDsFromPlayFabIDsResultEvent != null) { foreach (var each in OnServerGetServerCustomIDsFromPlayFabIDsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetServerCustomIDsFromPlayFabIDsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetSharedGroupDataRequestEvent != null) { foreach (var each in OnServerGetSharedGroupDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetSharedGroupDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetSharedGroupDataResultEvent != null) { foreach (var each in OnServerGetSharedGroupDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetSharedGroupDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetStoreItemsRequestEvent != null) { foreach (var each in OnServerGetStoreItemsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetStoreItemsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetStoreItemsResultEvent != null) { foreach (var each in OnServerGetStoreItemsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetStoreItemsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetTimeRequestEvent != null) { foreach (var each in OnServerGetTimeRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetTimeRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetTimeResultEvent != null) { foreach (var each in OnServerGetTimeResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetTimeResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetTitleDataRequestEvent != null) { foreach (var each in OnServerGetTitleDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetTitleDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetTitleDataResultEvent != null) { foreach (var each in OnServerGetTitleDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetTitleDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetTitleInternalDataRequestEvent != null) { foreach (var each in OnServerGetTitleInternalDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetTitleInternalDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetTitleInternalDataResultEvent != null) { foreach (var each in OnServerGetTitleInternalDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetTitleInternalDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetTitleNewsRequestEvent != null) { foreach (var each in OnServerGetTitleNewsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetTitleNewsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetTitleNewsResultEvent != null) { foreach (var each in OnServerGetTitleNewsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetTitleNewsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetUserAccountInfoRequestEvent != null) { foreach (var each in OnServerGetUserAccountInfoRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetUserAccountInfoRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetUserAccountInfoResultEvent != null) { foreach (var each in OnServerGetUserAccountInfoResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetUserAccountInfoResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetUserBansRequestEvent != null) { foreach (var each in OnServerGetUserBansRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetUserBansRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetUserBansResultEvent != null) { foreach (var each in OnServerGetUserBansResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetUserBansResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetUserDataRequestEvent != null) { foreach (var each in OnServerGetUserDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetUserDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetUserDataResultEvent != null) { foreach (var each in OnServerGetUserDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetUserDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetUserInternalDataRequestEvent != null) { foreach (var each in OnServerGetUserInternalDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetUserInternalDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetUserInternalDataResultEvent != null) { foreach (var each in OnServerGetUserInternalDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetUserInternalDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetUserInventoryRequestEvent != null) { foreach (var each in OnServerGetUserInventoryRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetUserInventoryRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetUserInventoryResultEvent != null) { foreach (var each in OnServerGetUserInventoryResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetUserInventoryResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetUserPublisherDataRequestEvent != null) { foreach (var each in OnServerGetUserPublisherDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetUserPublisherDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetUserPublisherDataResultEvent != null) { foreach (var each in OnServerGetUserPublisherDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetUserPublisherDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetUserPublisherInternalDataRequestEvent != null) { foreach (var each in OnServerGetUserPublisherInternalDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetUserPublisherInternalDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetUserPublisherInternalDataResultEvent != null) { foreach (var each in OnServerGetUserPublisherInternalDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetUserPublisherInternalDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetUserPublisherReadOnlyDataRequestEvent != null) { foreach (var each in OnServerGetUserPublisherReadOnlyDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetUserPublisherReadOnlyDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetUserPublisherReadOnlyDataResultEvent != null) { foreach (var each in OnServerGetUserPublisherReadOnlyDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetUserPublisherReadOnlyDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetUserReadOnlyDataRequestEvent != null) { foreach (var each in OnServerGetUserReadOnlyDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetUserReadOnlyDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetUserReadOnlyDataResultEvent != null) { foreach (var each in OnServerGetUserReadOnlyDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetUserReadOnlyDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGrantCharacterToUserRequestEvent != null) { foreach (var each in OnServerGrantCharacterToUserRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGrantCharacterToUserRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGrantCharacterToUserResultEvent != null) { foreach (var each in OnServerGrantCharacterToUserResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGrantCharacterToUserResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGrantItemsToCharacterRequestEvent != null) { foreach (var each in OnServerGrantItemsToCharacterRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGrantItemsToCharacterRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGrantItemsToCharacterResultEvent != null) { foreach (var each in OnServerGrantItemsToCharacterResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGrantItemsToCharacterResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGrantItemsToUserRequestEvent != null) { foreach (var each in OnServerGrantItemsToUserRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGrantItemsToUserRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGrantItemsToUserResultEvent != null) { foreach (var each in OnServerGrantItemsToUserResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGrantItemsToUserResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGrantItemsToUsersRequestEvent != null) { foreach (var each in OnServerGrantItemsToUsersRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGrantItemsToUsersRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGrantItemsToUsersResultEvent != null) { foreach (var each in OnServerGrantItemsToUsersResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGrantItemsToUsersResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerLinkNintendoServiceAccountRequestEvent != null) { foreach (var each in OnServerLinkNintendoServiceAccountRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerLinkNintendoServiceAccountRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerLinkNintendoServiceAccountResultEvent != null) { foreach (var each in OnServerLinkNintendoServiceAccountResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerLinkNintendoServiceAccountResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerLinkNintendoServiceAccountSubjectRequestEvent != null) { foreach (var each in OnServerLinkNintendoServiceAccountSubjectRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerLinkNintendoServiceAccountSubjectRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerLinkNintendoServiceAccountSubjectResultEvent != null) { foreach (var each in OnServerLinkNintendoServiceAccountSubjectResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerLinkNintendoServiceAccountSubjectResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerLinkNintendoSwitchDeviceIdRequestEvent != null) { foreach (var each in OnServerLinkNintendoSwitchDeviceIdRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerLinkNintendoSwitchDeviceIdRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerLinkNintendoSwitchDeviceIdResultEvent != null) { foreach (var each in OnServerLinkNintendoSwitchDeviceIdResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerLinkNintendoSwitchDeviceIdResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerLinkPSNAccountRequestEvent != null) { foreach (var each in OnServerLinkPSNAccountRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerLinkPSNAccountRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerLinkPSNAccountResultEvent != null) { foreach (var each in OnServerLinkPSNAccountResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerLinkPSNAccountResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerLinkPSNIdRequestEvent != null) { foreach (var each in OnServerLinkPSNIdRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerLinkPSNIdRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerLinkPSNIdResultEvent != null) { foreach (var each in OnServerLinkPSNIdResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerLinkPSNIdResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerLinkServerCustomIdRequestEvent != null) { foreach (var each in OnServerLinkServerCustomIdRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerLinkServerCustomIdRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerLinkServerCustomIdResultEvent != null) { foreach (var each in OnServerLinkServerCustomIdResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerLinkServerCustomIdResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerLinkSteamIdRequestEvent != null) { foreach (var each in OnServerLinkSteamIdRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerLinkSteamIdRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerLinkSteamIdResultEvent != null) { foreach (var each in OnServerLinkSteamIdResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerLinkSteamIdResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerLinkXboxAccountRequestEvent != null) { foreach (var each in OnServerLinkXboxAccountRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerLinkXboxAccountRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerLinkXboxAccountResultEvent != null) { foreach (var each in OnServerLinkXboxAccountResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerLinkXboxAccountResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerLoginWithPSNRequestEvent != null) { foreach (var each in OnServerLoginWithPSNRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerLoginWithPSNRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerLoginWithPSNResultEvent != null) { foreach (var each in OnServerLoginWithPSNResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerLoginWithPSNResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerLoginWithServerCustomIdRequestEvent != null) { foreach (var each in OnServerLoginWithServerCustomIdRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerLoginWithServerCustomIdRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerLoginWithServerCustomIdResultEvent != null) { foreach (var each in OnServerLoginWithServerCustomIdResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerLoginWithServerCustomIdResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerLoginWithSteamIdRequestEvent != null) { foreach (var each in OnServerLoginWithSteamIdRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerLoginWithSteamIdRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerLoginWithSteamIdResultEvent != null) { foreach (var each in OnServerLoginWithSteamIdResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerLoginWithSteamIdResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerLoginWithXboxRequestEvent != null) { foreach (var each in OnServerLoginWithXboxRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerLoginWithXboxRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerLoginWithXboxResultEvent != null) { foreach (var each in OnServerLoginWithXboxResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerLoginWithXboxResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerLoginWithXboxIdRequestEvent != null) { foreach (var each in OnServerLoginWithXboxIdRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerLoginWithXboxIdRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerLoginWithXboxIdResultEvent != null) { foreach (var each in OnServerLoginWithXboxIdResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerLoginWithXboxIdResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerModifyItemUsesRequestEvent != null) { foreach (var each in OnServerModifyItemUsesRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerModifyItemUsesRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerModifyItemUsesResultEvent != null) { foreach (var each in OnServerModifyItemUsesResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerModifyItemUsesResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerMoveItemToCharacterFromCharacterRequestEvent != null) { foreach (var each in OnServerMoveItemToCharacterFromCharacterRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerMoveItemToCharacterFromCharacterRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerMoveItemToCharacterFromCharacterResultEvent != null) { foreach (var each in OnServerMoveItemToCharacterFromCharacterResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerMoveItemToCharacterFromCharacterResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerMoveItemToCharacterFromUserRequestEvent != null) { foreach (var each in OnServerMoveItemToCharacterFromUserRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerMoveItemToCharacterFromUserRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerMoveItemToCharacterFromUserResultEvent != null) { foreach (var each in OnServerMoveItemToCharacterFromUserResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerMoveItemToCharacterFromUserResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerMoveItemToUserFromCharacterRequestEvent != null) { foreach (var each in OnServerMoveItemToUserFromCharacterRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerMoveItemToUserFromCharacterRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerMoveItemToUserFromCharacterResultEvent != null) { foreach (var each in OnServerMoveItemToUserFromCharacterResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerMoveItemToUserFromCharacterResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerRedeemCouponRequestEvent != null) { foreach (var each in OnServerRedeemCouponRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerRedeemCouponRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerRedeemCouponResultEvent != null) { foreach (var each in OnServerRedeemCouponResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerRedeemCouponResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerRemoveFriendRequestEvent != null) { foreach (var each in OnServerRemoveFriendRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerRemoveFriendRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerRemoveFriendResultEvent != null) { foreach (var each in OnServerRemoveFriendResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerRemoveFriendResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerRemoveGenericIDRequestEvent != null) { foreach (var each in OnServerRemoveGenericIDRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerRemoveGenericIDRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerRemoveGenericIDResultEvent != null) { foreach (var each in OnServerRemoveGenericIDResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerRemoveGenericIDResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerRemovePlayerTagRequestEvent != null) { foreach (var each in OnServerRemovePlayerTagRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerRemovePlayerTagRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerRemovePlayerTagResultEvent != null) { foreach (var each in OnServerRemovePlayerTagResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerRemovePlayerTagResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerRemoveSharedGroupMembersRequestEvent != null) { foreach (var each in OnServerRemoveSharedGroupMembersRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerRemoveSharedGroupMembersRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerRemoveSharedGroupMembersResultEvent != null) { foreach (var each in OnServerRemoveSharedGroupMembersResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerRemoveSharedGroupMembersResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerReportPlayerRequestEvent != null) { foreach (var each in OnServerReportPlayerRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerReportPlayerRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerReportPlayerResultEvent != null) { foreach (var each in OnServerReportPlayerResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerReportPlayerResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerRevokeAllBansForUserRequestEvent != null) { foreach (var each in OnServerRevokeAllBansForUserRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerRevokeAllBansForUserRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerRevokeAllBansForUserResultEvent != null) { foreach (var each in OnServerRevokeAllBansForUserResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerRevokeAllBansForUserResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerRevokeBansRequestEvent != null) { foreach (var each in OnServerRevokeBansRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerRevokeBansRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerRevokeBansResultEvent != null) { foreach (var each in OnServerRevokeBansResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerRevokeBansResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerRevokeInventoryItemRequestEvent != null) { foreach (var each in OnServerRevokeInventoryItemRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerRevokeInventoryItemRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerRevokeInventoryItemResultEvent != null) { foreach (var each in OnServerRevokeInventoryItemResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerRevokeInventoryItemResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerRevokeInventoryItemsRequestEvent != null) { foreach (var each in OnServerRevokeInventoryItemsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerRevokeInventoryItemsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerRevokeInventoryItemsResultEvent != null) { foreach (var each in OnServerRevokeInventoryItemsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerRevokeInventoryItemsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerSavePushNotificationTemplateRequestEvent != null) { foreach (var each in OnServerSavePushNotificationTemplateRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerSavePushNotificationTemplateRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerSavePushNotificationTemplateResultEvent != null) { foreach (var each in OnServerSavePushNotificationTemplateResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerSavePushNotificationTemplateResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerSendCustomAccountRecoveryEmailRequestEvent != null) { foreach (var each in OnServerSendCustomAccountRecoveryEmailRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerSendCustomAccountRecoveryEmailRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerSendCustomAccountRecoveryEmailResultEvent != null) { foreach (var each in OnServerSendCustomAccountRecoveryEmailResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerSendCustomAccountRecoveryEmailResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerSendEmailFromTemplateRequestEvent != null) { foreach (var each in OnServerSendEmailFromTemplateRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerSendEmailFromTemplateRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerSendEmailFromTemplateResultEvent != null) { foreach (var each in OnServerSendEmailFromTemplateResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerSendEmailFromTemplateResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerSendPushNotificationRequestEvent != null) { foreach (var each in OnServerSendPushNotificationRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerSendPushNotificationRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerSendPushNotificationResultEvent != null) { foreach (var each in OnServerSendPushNotificationResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerSendPushNotificationResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerSendPushNotificationFromTemplateRequestEvent != null) { foreach (var each in OnServerSendPushNotificationFromTemplateRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerSendPushNotificationFromTemplateRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerSendPushNotificationFromTemplateResultEvent != null) { foreach (var each in OnServerSendPushNotificationFromTemplateResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerSendPushNotificationFromTemplateResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerSetFriendTagsRequestEvent != null) { foreach (var each in OnServerSetFriendTagsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerSetFriendTagsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerSetFriendTagsResultEvent != null) { foreach (var each in OnServerSetFriendTagsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerSetFriendTagsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerSetPlayerSecretRequestEvent != null) { foreach (var each in OnServerSetPlayerSecretRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerSetPlayerSecretRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerSetPlayerSecretResultEvent != null) { foreach (var each in OnServerSetPlayerSecretResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerSetPlayerSecretResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerSetPublisherDataRequestEvent != null) { foreach (var each in OnServerSetPublisherDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerSetPublisherDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerSetPublisherDataResultEvent != null) { foreach (var each in OnServerSetPublisherDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerSetPublisherDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerSetTitleDataRequestEvent != null) { foreach (var each in OnServerSetTitleDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerSetTitleDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerSetTitleDataResultEvent != null) { foreach (var each in OnServerSetTitleDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerSetTitleDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerSetTitleInternalDataRequestEvent != null) { foreach (var each in OnServerSetTitleInternalDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerSetTitleInternalDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerSetTitleInternalDataResultEvent != null) { foreach (var each in OnServerSetTitleInternalDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerSetTitleInternalDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerSubtractCharacterVirtualCurrencyRequestEvent != null) { foreach (var each in OnServerSubtractCharacterVirtualCurrencyRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerSubtractCharacterVirtualCurrencyRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerSubtractCharacterVirtualCurrencyResultEvent != null) { foreach (var each in OnServerSubtractCharacterVirtualCurrencyResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerSubtractCharacterVirtualCurrencyResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerSubtractUserVirtualCurrencyRequestEvent != null) { foreach (var each in OnServerSubtractUserVirtualCurrencyRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerSubtractUserVirtualCurrencyRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerSubtractUserVirtualCurrencyResultEvent != null) { foreach (var each in OnServerSubtractUserVirtualCurrencyResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerSubtractUserVirtualCurrencyResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerUnlinkNintendoServiceAccountRequestEvent != null) { foreach (var each in OnServerUnlinkNintendoServiceAccountRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUnlinkNintendoServiceAccountRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerUnlinkNintendoServiceAccountResultEvent != null) { foreach (var each in OnServerUnlinkNintendoServiceAccountResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUnlinkNintendoServiceAccountResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerUnlinkNintendoSwitchDeviceIdRequestEvent != null) { foreach (var each in OnServerUnlinkNintendoSwitchDeviceIdRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUnlinkNintendoSwitchDeviceIdRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerUnlinkNintendoSwitchDeviceIdResultEvent != null) { foreach (var each in OnServerUnlinkNintendoSwitchDeviceIdResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUnlinkNintendoSwitchDeviceIdResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerUnlinkPSNAccountRequestEvent != null) { foreach (var each in OnServerUnlinkPSNAccountRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUnlinkPSNAccountRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerUnlinkPSNAccountResultEvent != null) { foreach (var each in OnServerUnlinkPSNAccountResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUnlinkPSNAccountResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerUnlinkServerCustomIdRequestEvent != null) { foreach (var each in OnServerUnlinkServerCustomIdRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUnlinkServerCustomIdRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerUnlinkServerCustomIdResultEvent != null) { foreach (var each in OnServerUnlinkServerCustomIdResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUnlinkServerCustomIdResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerUnlinkSteamIdRequestEvent != null) { foreach (var each in OnServerUnlinkSteamIdRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUnlinkSteamIdRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerUnlinkSteamIdResultEvent != null) { foreach (var each in OnServerUnlinkSteamIdResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUnlinkSteamIdResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerUnlinkXboxAccountRequestEvent != null) { foreach (var each in OnServerUnlinkXboxAccountRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUnlinkXboxAccountRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerUnlinkXboxAccountResultEvent != null) { foreach (var each in OnServerUnlinkXboxAccountResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUnlinkXboxAccountResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerUnlockContainerInstanceRequestEvent != null) { foreach (var each in OnServerUnlockContainerInstanceRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUnlockContainerInstanceRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerUnlockContainerInstanceResultEvent != null) { foreach (var each in OnServerUnlockContainerInstanceResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUnlockContainerInstanceResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerUnlockContainerItemRequestEvent != null) { foreach (var each in OnServerUnlockContainerItemRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUnlockContainerItemRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerUnlockContainerItemResultEvent != null) { foreach (var each in OnServerUnlockContainerItemResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUnlockContainerItemResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerUpdateAvatarUrlRequestEvent != null) { foreach (var each in OnServerUpdateAvatarUrlRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUpdateAvatarUrlRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerUpdateAvatarUrlResultEvent != null) { foreach (var each in OnServerUpdateAvatarUrlResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUpdateAvatarUrlResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerUpdateBansRequestEvent != null) { foreach (var each in OnServerUpdateBansRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUpdateBansRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerUpdateBansResultEvent != null) { foreach (var each in OnServerUpdateBansResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUpdateBansResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerUpdateCharacterDataRequestEvent != null) { foreach (var each in OnServerUpdateCharacterDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUpdateCharacterDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerUpdateCharacterDataResultEvent != null) { foreach (var each in OnServerUpdateCharacterDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUpdateCharacterDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerUpdateCharacterInternalDataRequestEvent != null) { foreach (var each in OnServerUpdateCharacterInternalDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUpdateCharacterInternalDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerUpdateCharacterInternalDataResultEvent != null) { foreach (var each in OnServerUpdateCharacterInternalDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUpdateCharacterInternalDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerUpdateCharacterReadOnlyDataRequestEvent != null) { foreach (var each in OnServerUpdateCharacterReadOnlyDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUpdateCharacterReadOnlyDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerUpdateCharacterReadOnlyDataResultEvent != null) { foreach (var each in OnServerUpdateCharacterReadOnlyDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUpdateCharacterReadOnlyDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerUpdateCharacterStatisticsRequestEvent != null) { foreach (var each in OnServerUpdateCharacterStatisticsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUpdateCharacterStatisticsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerUpdateCharacterStatisticsResultEvent != null) { foreach (var each in OnServerUpdateCharacterStatisticsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUpdateCharacterStatisticsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerUpdatePlayerStatisticsRequestEvent != null) { foreach (var each in OnServerUpdatePlayerStatisticsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUpdatePlayerStatisticsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerUpdatePlayerStatisticsResultEvent != null) { foreach (var each in OnServerUpdatePlayerStatisticsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUpdatePlayerStatisticsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerUpdateSharedGroupDataRequestEvent != null) { foreach (var each in OnServerUpdateSharedGroupDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUpdateSharedGroupDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerUpdateSharedGroupDataResultEvent != null) { foreach (var each in OnServerUpdateSharedGroupDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUpdateSharedGroupDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerUpdateUserDataRequestEvent != null) { foreach (var each in OnServerUpdateUserDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUpdateUserDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerUpdateUserDataResultEvent != null) { foreach (var each in OnServerUpdateUserDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUpdateUserDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerUpdateUserInternalDataRequestEvent != null) { foreach (var each in OnServerUpdateUserInternalDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUpdateUserInternalDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerUpdateUserInternalDataResultEvent != null) { foreach (var each in OnServerUpdateUserInternalDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUpdateUserInternalDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerUpdateUserInventoryItemCustomDataRequestEvent != null) { foreach (var each in OnServerUpdateUserInventoryItemCustomDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUpdateUserInventoryItemCustomDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerUpdateUserInventoryItemCustomDataResultEvent != null) { foreach (var each in OnServerUpdateUserInventoryItemCustomDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUpdateUserInventoryItemCustomDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerUpdateUserPublisherDataRequestEvent != null) { foreach (var each in OnServerUpdateUserPublisherDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUpdateUserPublisherDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerUpdateUserPublisherDataResultEvent != null) { foreach (var each in OnServerUpdateUserPublisherDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUpdateUserPublisherDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerUpdateUserPublisherInternalDataRequestEvent != null) { foreach (var each in OnServerUpdateUserPublisherInternalDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUpdateUserPublisherInternalDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerUpdateUserPublisherInternalDataResultEvent != null) { foreach (var each in OnServerUpdateUserPublisherInternalDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUpdateUserPublisherInternalDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerUpdateUserPublisherReadOnlyDataRequestEvent != null) { foreach (var each in OnServerUpdateUserPublisherReadOnlyDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUpdateUserPublisherReadOnlyDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerUpdateUserPublisherReadOnlyDataResultEvent != null) { foreach (var each in OnServerUpdateUserPublisherReadOnlyDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUpdateUserPublisherReadOnlyDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerUpdateUserReadOnlyDataRequestEvent != null) { foreach (var each in OnServerUpdateUserReadOnlyDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUpdateUserReadOnlyDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerUpdateUserReadOnlyDataResultEvent != null) { foreach (var each in OnServerUpdateUserReadOnlyDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUpdateUserReadOnlyDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerWriteCharacterEventRequestEvent != null) { foreach (var each in OnServerWriteCharacterEventRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerWriteCharacterEventRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerWriteCharacterEventResultEvent != null) { foreach (var each in OnServerWriteCharacterEventResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerWriteCharacterEventResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerWritePlayerEventRequestEvent != null) { foreach (var each in OnServerWritePlayerEventRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerWritePlayerEventRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerWritePlayerEventResultEvent != null) { foreach (var each in OnServerWritePlayerEventResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerWritePlayerEventResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerWriteTitleEventRequestEvent != null) { foreach (var each in OnServerWriteTitleEventRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerWriteTitleEventRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerWriteTitleEventResultEvent != null) { foreach (var each in OnServerWriteTitleEventResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerWriteTitleEventResultEvent -= (PlayFabResultEvent)each; } } } + +#endif +#if !DISABLE_PLAYFABENTITY_API + if (OnAuthenticationAuthenticateGameServerWithCustomIdRequestEvent != null) { foreach (var each in OnAuthenticationAuthenticateGameServerWithCustomIdRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAuthenticationAuthenticateGameServerWithCustomIdRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAuthenticationAuthenticateGameServerWithCustomIdResultEvent != null) { foreach (var each in OnAuthenticationAuthenticateGameServerWithCustomIdResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAuthenticationAuthenticateGameServerWithCustomIdResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAuthenticationDeleteRequestEvent != null) { foreach (var each in OnAuthenticationDeleteRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAuthenticationDeleteRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAuthenticationDeleteResultEvent != null) { foreach (var each in OnAuthenticationDeleteResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAuthenticationDeleteResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAuthenticationGetEntityTokenRequestEvent != null) { foreach (var each in OnAuthenticationGetEntityTokenRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAuthenticationGetEntityTokenRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAuthenticationGetEntityTokenResultEvent != null) { foreach (var each in OnAuthenticationGetEntityTokenResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAuthenticationGetEntityTokenResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAuthenticationValidateEntityTokenRequestEvent != null) { foreach (var each in OnAuthenticationValidateEntityTokenRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAuthenticationValidateEntityTokenRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAuthenticationValidateEntityTokenResultEvent != null) { foreach (var each in OnAuthenticationValidateEntityTokenResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAuthenticationValidateEntityTokenResultEvent -= (PlayFabResultEvent)each; } } } + +#endif +#if !DISABLE_PLAYFABENTITY_API + if (OnCloudScriptExecuteEntityCloudScriptRequestEvent != null) { foreach (var each in OnCloudScriptExecuteEntityCloudScriptRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnCloudScriptExecuteEntityCloudScriptRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnCloudScriptExecuteEntityCloudScriptResultEvent != null) { foreach (var each in OnCloudScriptExecuteEntityCloudScriptResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnCloudScriptExecuteEntityCloudScriptResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnCloudScriptExecuteFunctionRequestEvent != null) { foreach (var each in OnCloudScriptExecuteFunctionRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnCloudScriptExecuteFunctionRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnCloudScriptExecuteFunctionResultEvent != null) { foreach (var each in OnCloudScriptExecuteFunctionResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnCloudScriptExecuteFunctionResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnCloudScriptGetFunctionRequestEvent != null) { foreach (var each in OnCloudScriptGetFunctionRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnCloudScriptGetFunctionRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnCloudScriptGetFunctionResultEvent != null) { foreach (var each in OnCloudScriptGetFunctionResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnCloudScriptGetFunctionResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnCloudScriptListEventHubFunctionsRequestEvent != null) { foreach (var each in OnCloudScriptListEventHubFunctionsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnCloudScriptListEventHubFunctionsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnCloudScriptListEventHubFunctionsResultEvent != null) { foreach (var each in OnCloudScriptListEventHubFunctionsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnCloudScriptListEventHubFunctionsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnCloudScriptListFunctionsRequestEvent != null) { foreach (var each in OnCloudScriptListFunctionsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnCloudScriptListFunctionsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnCloudScriptListFunctionsResultEvent != null) { foreach (var each in OnCloudScriptListFunctionsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnCloudScriptListFunctionsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnCloudScriptListHttpFunctionsRequestEvent != null) { foreach (var each in OnCloudScriptListHttpFunctionsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnCloudScriptListHttpFunctionsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnCloudScriptListHttpFunctionsResultEvent != null) { foreach (var each in OnCloudScriptListHttpFunctionsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnCloudScriptListHttpFunctionsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnCloudScriptListQueuedFunctionsRequestEvent != null) { foreach (var each in OnCloudScriptListQueuedFunctionsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnCloudScriptListQueuedFunctionsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnCloudScriptListQueuedFunctionsResultEvent != null) { foreach (var each in OnCloudScriptListQueuedFunctionsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnCloudScriptListQueuedFunctionsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnCloudScriptPostFunctionResultForEntityTriggeredActionRequestEvent != null) { foreach (var each in OnCloudScriptPostFunctionResultForEntityTriggeredActionRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnCloudScriptPostFunctionResultForEntityTriggeredActionRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnCloudScriptPostFunctionResultForEntityTriggeredActionResultEvent != null) { foreach (var each in OnCloudScriptPostFunctionResultForEntityTriggeredActionResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnCloudScriptPostFunctionResultForEntityTriggeredActionResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnCloudScriptPostFunctionResultForFunctionExecutionRequestEvent != null) { foreach (var each in OnCloudScriptPostFunctionResultForFunctionExecutionRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnCloudScriptPostFunctionResultForFunctionExecutionRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnCloudScriptPostFunctionResultForFunctionExecutionResultEvent != null) { foreach (var each in OnCloudScriptPostFunctionResultForFunctionExecutionResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnCloudScriptPostFunctionResultForFunctionExecutionResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnCloudScriptPostFunctionResultForPlayerTriggeredActionRequestEvent != null) { foreach (var each in OnCloudScriptPostFunctionResultForPlayerTriggeredActionRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnCloudScriptPostFunctionResultForPlayerTriggeredActionRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnCloudScriptPostFunctionResultForPlayerTriggeredActionResultEvent != null) { foreach (var each in OnCloudScriptPostFunctionResultForPlayerTriggeredActionResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnCloudScriptPostFunctionResultForPlayerTriggeredActionResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnCloudScriptPostFunctionResultForScheduledTaskRequestEvent != null) { foreach (var each in OnCloudScriptPostFunctionResultForScheduledTaskRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnCloudScriptPostFunctionResultForScheduledTaskRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnCloudScriptPostFunctionResultForScheduledTaskResultEvent != null) { foreach (var each in OnCloudScriptPostFunctionResultForScheduledTaskResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnCloudScriptPostFunctionResultForScheduledTaskResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnCloudScriptRegisterEventHubFunctionRequestEvent != null) { foreach (var each in OnCloudScriptRegisterEventHubFunctionRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnCloudScriptRegisterEventHubFunctionRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnCloudScriptRegisterEventHubFunctionResultEvent != null) { foreach (var each in OnCloudScriptRegisterEventHubFunctionResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnCloudScriptRegisterEventHubFunctionResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnCloudScriptRegisterHttpFunctionRequestEvent != null) { foreach (var each in OnCloudScriptRegisterHttpFunctionRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnCloudScriptRegisterHttpFunctionRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnCloudScriptRegisterHttpFunctionResultEvent != null) { foreach (var each in OnCloudScriptRegisterHttpFunctionResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnCloudScriptRegisterHttpFunctionResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnCloudScriptRegisterQueuedFunctionRequestEvent != null) { foreach (var each in OnCloudScriptRegisterQueuedFunctionRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnCloudScriptRegisterQueuedFunctionRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnCloudScriptRegisterQueuedFunctionResultEvent != null) { foreach (var each in OnCloudScriptRegisterQueuedFunctionResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnCloudScriptRegisterQueuedFunctionResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnCloudScriptUnregisterFunctionRequestEvent != null) { foreach (var each in OnCloudScriptUnregisterFunctionRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnCloudScriptUnregisterFunctionRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnCloudScriptUnregisterFunctionResultEvent != null) { foreach (var each in OnCloudScriptUnregisterFunctionResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnCloudScriptUnregisterFunctionResultEvent -= (PlayFabResultEvent)each; } } } + +#endif +#if !DISABLE_PLAYFABENTITY_API + if (OnDataAbortFileUploadsRequestEvent != null) { foreach (var each in OnDataAbortFileUploadsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnDataAbortFileUploadsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnDataAbortFileUploadsResultEvent != null) { foreach (var each in OnDataAbortFileUploadsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnDataAbortFileUploadsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnDataDeleteFilesRequestEvent != null) { foreach (var each in OnDataDeleteFilesRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnDataDeleteFilesRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnDataDeleteFilesResultEvent != null) { foreach (var each in OnDataDeleteFilesResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnDataDeleteFilesResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnDataFinalizeFileUploadsRequestEvent != null) { foreach (var each in OnDataFinalizeFileUploadsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnDataFinalizeFileUploadsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnDataFinalizeFileUploadsResultEvent != null) { foreach (var each in OnDataFinalizeFileUploadsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnDataFinalizeFileUploadsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnDataGetFilesRequestEvent != null) { foreach (var each in OnDataGetFilesRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnDataGetFilesRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnDataGetFilesResultEvent != null) { foreach (var each in OnDataGetFilesResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnDataGetFilesResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnDataGetObjectsRequestEvent != null) { foreach (var each in OnDataGetObjectsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnDataGetObjectsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnDataGetObjectsResultEvent != null) { foreach (var each in OnDataGetObjectsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnDataGetObjectsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnDataInitiateFileUploadsRequestEvent != null) { foreach (var each in OnDataInitiateFileUploadsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnDataInitiateFileUploadsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnDataInitiateFileUploadsResultEvent != null) { foreach (var each in OnDataInitiateFileUploadsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnDataInitiateFileUploadsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnDataSetObjectsRequestEvent != null) { foreach (var each in OnDataSetObjectsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnDataSetObjectsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnDataSetObjectsResultEvent != null) { foreach (var each in OnDataSetObjectsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnDataSetObjectsResultEvent -= (PlayFabResultEvent)each; } } } + +#endif +#if !DISABLE_PLAYFABENTITY_API + if (OnEconomyAddInventoryItemsRequestEvent != null) { foreach (var each in OnEconomyAddInventoryItemsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyAddInventoryItemsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyAddInventoryItemsResultEvent != null) { foreach (var each in OnEconomyAddInventoryItemsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyAddInventoryItemsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyCreateDraftItemRequestEvent != null) { foreach (var each in OnEconomyCreateDraftItemRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyCreateDraftItemRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyCreateDraftItemResultEvent != null) { foreach (var each in OnEconomyCreateDraftItemResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyCreateDraftItemResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyCreateUploadUrlsRequestEvent != null) { foreach (var each in OnEconomyCreateUploadUrlsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyCreateUploadUrlsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyCreateUploadUrlsResultEvent != null) { foreach (var each in OnEconomyCreateUploadUrlsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyCreateUploadUrlsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyDeleteEntityItemReviewsRequestEvent != null) { foreach (var each in OnEconomyDeleteEntityItemReviewsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyDeleteEntityItemReviewsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyDeleteEntityItemReviewsResultEvent != null) { foreach (var each in OnEconomyDeleteEntityItemReviewsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyDeleteEntityItemReviewsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyDeleteInventoryCollectionRequestEvent != null) { foreach (var each in OnEconomyDeleteInventoryCollectionRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyDeleteInventoryCollectionRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyDeleteInventoryCollectionResultEvent != null) { foreach (var each in OnEconomyDeleteInventoryCollectionResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyDeleteInventoryCollectionResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyDeleteInventoryItemsRequestEvent != null) { foreach (var each in OnEconomyDeleteInventoryItemsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyDeleteInventoryItemsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyDeleteInventoryItemsResultEvent != null) { foreach (var each in OnEconomyDeleteInventoryItemsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyDeleteInventoryItemsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyDeleteItemRequestEvent != null) { foreach (var each in OnEconomyDeleteItemRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyDeleteItemRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyDeleteItemResultEvent != null) { foreach (var each in OnEconomyDeleteItemResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyDeleteItemResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyExecuteInventoryOperationsRequestEvent != null) { foreach (var each in OnEconomyExecuteInventoryOperationsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyExecuteInventoryOperationsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyExecuteInventoryOperationsResultEvent != null) { foreach (var each in OnEconomyExecuteInventoryOperationsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyExecuteInventoryOperationsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyExecuteTransferOperationsRequestEvent != null) { foreach (var each in OnEconomyExecuteTransferOperationsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyExecuteTransferOperationsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyExecuteTransferOperationsResultEvent != null) { foreach (var each in OnEconomyExecuteTransferOperationsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyExecuteTransferOperationsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyGetCatalogConfigRequestEvent != null) { foreach (var each in OnEconomyGetCatalogConfigRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyGetCatalogConfigRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyGetCatalogConfigResultEvent != null) { foreach (var each in OnEconomyGetCatalogConfigResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyGetCatalogConfigResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyGetDraftItemRequestEvent != null) { foreach (var each in OnEconomyGetDraftItemRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyGetDraftItemRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyGetDraftItemResultEvent != null) { foreach (var each in OnEconomyGetDraftItemResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyGetDraftItemResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyGetDraftItemsRequestEvent != null) { foreach (var each in OnEconomyGetDraftItemsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyGetDraftItemsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyGetDraftItemsResultEvent != null) { foreach (var each in OnEconomyGetDraftItemsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyGetDraftItemsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyGetEntityDraftItemsRequestEvent != null) { foreach (var each in OnEconomyGetEntityDraftItemsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyGetEntityDraftItemsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyGetEntityDraftItemsResultEvent != null) { foreach (var each in OnEconomyGetEntityDraftItemsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyGetEntityDraftItemsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyGetEntityItemReviewRequestEvent != null) { foreach (var each in OnEconomyGetEntityItemReviewRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyGetEntityItemReviewRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyGetEntityItemReviewResultEvent != null) { foreach (var each in OnEconomyGetEntityItemReviewResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyGetEntityItemReviewResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyGetInventoryCollectionIdsRequestEvent != null) { foreach (var each in OnEconomyGetInventoryCollectionIdsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyGetInventoryCollectionIdsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyGetInventoryCollectionIdsResultEvent != null) { foreach (var each in OnEconomyGetInventoryCollectionIdsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyGetInventoryCollectionIdsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyGetInventoryItemsRequestEvent != null) { foreach (var each in OnEconomyGetInventoryItemsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyGetInventoryItemsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyGetInventoryItemsResultEvent != null) { foreach (var each in OnEconomyGetInventoryItemsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyGetInventoryItemsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyGetInventoryOperationStatusRequestEvent != null) { foreach (var each in OnEconomyGetInventoryOperationStatusRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyGetInventoryOperationStatusRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyGetInventoryOperationStatusResultEvent != null) { foreach (var each in OnEconomyGetInventoryOperationStatusResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyGetInventoryOperationStatusResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyGetItemRequestEvent != null) { foreach (var each in OnEconomyGetItemRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyGetItemRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyGetItemResultEvent != null) { foreach (var each in OnEconomyGetItemResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyGetItemResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyGetItemContainersRequestEvent != null) { foreach (var each in OnEconomyGetItemContainersRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyGetItemContainersRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyGetItemContainersResultEvent != null) { foreach (var each in OnEconomyGetItemContainersResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyGetItemContainersResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyGetItemModerationStateRequestEvent != null) { foreach (var each in OnEconomyGetItemModerationStateRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyGetItemModerationStateRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyGetItemModerationStateResultEvent != null) { foreach (var each in OnEconomyGetItemModerationStateResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyGetItemModerationStateResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyGetItemPublishStatusRequestEvent != null) { foreach (var each in OnEconomyGetItemPublishStatusRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyGetItemPublishStatusRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyGetItemPublishStatusResultEvent != null) { foreach (var each in OnEconomyGetItemPublishStatusResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyGetItemPublishStatusResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyGetItemReviewsRequestEvent != null) { foreach (var each in OnEconomyGetItemReviewsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyGetItemReviewsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyGetItemReviewsResultEvent != null) { foreach (var each in OnEconomyGetItemReviewsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyGetItemReviewsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyGetItemReviewSummaryRequestEvent != null) { foreach (var each in OnEconomyGetItemReviewSummaryRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyGetItemReviewSummaryRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyGetItemReviewSummaryResultEvent != null) { foreach (var each in OnEconomyGetItemReviewSummaryResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyGetItemReviewSummaryResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyGetItemsRequestEvent != null) { foreach (var each in OnEconomyGetItemsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyGetItemsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyGetItemsResultEvent != null) { foreach (var each in OnEconomyGetItemsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyGetItemsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyGetMicrosoftStoreAccessTokensRequestEvent != null) { foreach (var each in OnEconomyGetMicrosoftStoreAccessTokensRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyGetMicrosoftStoreAccessTokensRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyGetMicrosoftStoreAccessTokensResultEvent != null) { foreach (var each in OnEconomyGetMicrosoftStoreAccessTokensResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyGetMicrosoftStoreAccessTokensResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyGetTransactionHistoryRequestEvent != null) { foreach (var each in OnEconomyGetTransactionHistoryRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyGetTransactionHistoryRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyGetTransactionHistoryResultEvent != null) { foreach (var each in OnEconomyGetTransactionHistoryResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyGetTransactionHistoryResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyPublishDraftItemRequestEvent != null) { foreach (var each in OnEconomyPublishDraftItemRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyPublishDraftItemRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyPublishDraftItemResultEvent != null) { foreach (var each in OnEconomyPublishDraftItemResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyPublishDraftItemResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyPurchaseInventoryItemsRequestEvent != null) { foreach (var each in OnEconomyPurchaseInventoryItemsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyPurchaseInventoryItemsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyPurchaseInventoryItemsResultEvent != null) { foreach (var each in OnEconomyPurchaseInventoryItemsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyPurchaseInventoryItemsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyRedeemAppleAppStoreInventoryItemsRequestEvent != null) { foreach (var each in OnEconomyRedeemAppleAppStoreInventoryItemsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyRedeemAppleAppStoreInventoryItemsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyRedeemAppleAppStoreInventoryItemsResultEvent != null) { foreach (var each in OnEconomyRedeemAppleAppStoreInventoryItemsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyRedeemAppleAppStoreInventoryItemsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyRedeemGooglePlayInventoryItemsRequestEvent != null) { foreach (var each in OnEconomyRedeemGooglePlayInventoryItemsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyRedeemGooglePlayInventoryItemsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyRedeemGooglePlayInventoryItemsResultEvent != null) { foreach (var each in OnEconomyRedeemGooglePlayInventoryItemsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyRedeemGooglePlayInventoryItemsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyRedeemMicrosoftStoreInventoryItemsRequestEvent != null) { foreach (var each in OnEconomyRedeemMicrosoftStoreInventoryItemsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyRedeemMicrosoftStoreInventoryItemsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyRedeemMicrosoftStoreInventoryItemsResultEvent != null) { foreach (var each in OnEconomyRedeemMicrosoftStoreInventoryItemsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyRedeemMicrosoftStoreInventoryItemsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyRedeemNintendoEShopInventoryItemsRequestEvent != null) { foreach (var each in OnEconomyRedeemNintendoEShopInventoryItemsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyRedeemNintendoEShopInventoryItemsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyRedeemNintendoEShopInventoryItemsResultEvent != null) { foreach (var each in OnEconomyRedeemNintendoEShopInventoryItemsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyRedeemNintendoEShopInventoryItemsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyRedeemPlayStationStoreInventoryItemsRequestEvent != null) { foreach (var each in OnEconomyRedeemPlayStationStoreInventoryItemsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyRedeemPlayStationStoreInventoryItemsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyRedeemPlayStationStoreInventoryItemsResultEvent != null) { foreach (var each in OnEconomyRedeemPlayStationStoreInventoryItemsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyRedeemPlayStationStoreInventoryItemsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyRedeemSteamInventoryItemsRequestEvent != null) { foreach (var each in OnEconomyRedeemSteamInventoryItemsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyRedeemSteamInventoryItemsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyRedeemSteamInventoryItemsResultEvent != null) { foreach (var each in OnEconomyRedeemSteamInventoryItemsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyRedeemSteamInventoryItemsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyReportItemRequestEvent != null) { foreach (var each in OnEconomyReportItemRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyReportItemRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyReportItemResultEvent != null) { foreach (var each in OnEconomyReportItemResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyReportItemResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyReportItemReviewRequestEvent != null) { foreach (var each in OnEconomyReportItemReviewRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyReportItemReviewRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyReportItemReviewResultEvent != null) { foreach (var each in OnEconomyReportItemReviewResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyReportItemReviewResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyReviewItemRequestEvent != null) { foreach (var each in OnEconomyReviewItemRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyReviewItemRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyReviewItemResultEvent != null) { foreach (var each in OnEconomyReviewItemResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyReviewItemResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomySearchItemsRequestEvent != null) { foreach (var each in OnEconomySearchItemsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomySearchItemsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomySearchItemsResultEvent != null) { foreach (var each in OnEconomySearchItemsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomySearchItemsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomySetItemModerationStateRequestEvent != null) { foreach (var each in OnEconomySetItemModerationStateRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomySetItemModerationStateRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomySetItemModerationStateResultEvent != null) { foreach (var each in OnEconomySetItemModerationStateResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomySetItemModerationStateResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomySubmitItemReviewVoteRequestEvent != null) { foreach (var each in OnEconomySubmitItemReviewVoteRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomySubmitItemReviewVoteRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomySubmitItemReviewVoteResultEvent != null) { foreach (var each in OnEconomySubmitItemReviewVoteResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomySubmitItemReviewVoteResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomySubtractInventoryItemsRequestEvent != null) { foreach (var each in OnEconomySubtractInventoryItemsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomySubtractInventoryItemsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomySubtractInventoryItemsResultEvent != null) { foreach (var each in OnEconomySubtractInventoryItemsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomySubtractInventoryItemsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyTakedownItemReviewsRequestEvent != null) { foreach (var each in OnEconomyTakedownItemReviewsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyTakedownItemReviewsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyTakedownItemReviewsResultEvent != null) { foreach (var each in OnEconomyTakedownItemReviewsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyTakedownItemReviewsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyTransferInventoryItemsRequestEvent != null) { foreach (var each in OnEconomyTransferInventoryItemsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyTransferInventoryItemsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyTransferInventoryItemsResultEvent != null) { foreach (var each in OnEconomyTransferInventoryItemsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyTransferInventoryItemsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyUpdateCatalogConfigRequestEvent != null) { foreach (var each in OnEconomyUpdateCatalogConfigRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyUpdateCatalogConfigRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyUpdateCatalogConfigResultEvent != null) { foreach (var each in OnEconomyUpdateCatalogConfigResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyUpdateCatalogConfigResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyUpdateDraftItemRequestEvent != null) { foreach (var each in OnEconomyUpdateDraftItemRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyUpdateDraftItemRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyUpdateDraftItemResultEvent != null) { foreach (var each in OnEconomyUpdateDraftItemResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyUpdateDraftItemResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyUpdateInventoryItemsRequestEvent != null) { foreach (var each in OnEconomyUpdateInventoryItemsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyUpdateInventoryItemsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyUpdateInventoryItemsResultEvent != null) { foreach (var each in OnEconomyUpdateInventoryItemsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyUpdateInventoryItemsResultEvent -= (PlayFabResultEvent)each; } } } + +#endif +#if !DISABLE_PLAYFABENTITY_API + if (OnEventsCreateTelemetryKeyRequestEvent != null) { foreach (var each in OnEventsCreateTelemetryKeyRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEventsCreateTelemetryKeyRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEventsCreateTelemetryKeyResultEvent != null) { foreach (var each in OnEventsCreateTelemetryKeyResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEventsCreateTelemetryKeyResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEventsDeleteTelemetryKeyRequestEvent != null) { foreach (var each in OnEventsDeleteTelemetryKeyRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEventsDeleteTelemetryKeyRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEventsDeleteTelemetryKeyResultEvent != null) { foreach (var each in OnEventsDeleteTelemetryKeyResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEventsDeleteTelemetryKeyResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEventsGetTelemetryKeyRequestEvent != null) { foreach (var each in OnEventsGetTelemetryKeyRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEventsGetTelemetryKeyRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEventsGetTelemetryKeyResultEvent != null) { foreach (var each in OnEventsGetTelemetryKeyResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEventsGetTelemetryKeyResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEventsListTelemetryKeysRequestEvent != null) { foreach (var each in OnEventsListTelemetryKeysRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEventsListTelemetryKeysRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEventsListTelemetryKeysResultEvent != null) { foreach (var each in OnEventsListTelemetryKeysResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEventsListTelemetryKeysResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEventsSetTelemetryKeyActiveRequestEvent != null) { foreach (var each in OnEventsSetTelemetryKeyActiveRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEventsSetTelemetryKeyActiveRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEventsSetTelemetryKeyActiveResultEvent != null) { foreach (var each in OnEventsSetTelemetryKeyActiveResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEventsSetTelemetryKeyActiveResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEventsWriteEventsRequestEvent != null) { foreach (var each in OnEventsWriteEventsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEventsWriteEventsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEventsWriteEventsResultEvent != null) { foreach (var each in OnEventsWriteEventsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEventsWriteEventsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEventsWriteTelemetryEventsRequestEvent != null) { foreach (var each in OnEventsWriteTelemetryEventsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEventsWriteTelemetryEventsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEventsWriteTelemetryEventsResultEvent != null) { foreach (var each in OnEventsWriteTelemetryEventsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEventsWriteTelemetryEventsResultEvent -= (PlayFabResultEvent)each; } } } + +#endif +#if !DISABLE_PLAYFABENTITY_API + if (OnExperimentationCreateExclusionGroupRequestEvent != null) { foreach (var each in OnExperimentationCreateExclusionGroupRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnExperimentationCreateExclusionGroupRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnExperimentationCreateExclusionGroupResultEvent != null) { foreach (var each in OnExperimentationCreateExclusionGroupResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnExperimentationCreateExclusionGroupResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnExperimentationCreateExperimentRequestEvent != null) { foreach (var each in OnExperimentationCreateExperimentRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnExperimentationCreateExperimentRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnExperimentationCreateExperimentResultEvent != null) { foreach (var each in OnExperimentationCreateExperimentResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnExperimentationCreateExperimentResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnExperimentationDeleteExclusionGroupRequestEvent != null) { foreach (var each in OnExperimentationDeleteExclusionGroupRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnExperimentationDeleteExclusionGroupRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnExperimentationDeleteExclusionGroupResultEvent != null) { foreach (var each in OnExperimentationDeleteExclusionGroupResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnExperimentationDeleteExclusionGroupResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnExperimentationDeleteExperimentRequestEvent != null) { foreach (var each in OnExperimentationDeleteExperimentRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnExperimentationDeleteExperimentRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnExperimentationDeleteExperimentResultEvent != null) { foreach (var each in OnExperimentationDeleteExperimentResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnExperimentationDeleteExperimentResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnExperimentationGetExclusionGroupsRequestEvent != null) { foreach (var each in OnExperimentationGetExclusionGroupsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnExperimentationGetExclusionGroupsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnExperimentationGetExclusionGroupsResultEvent != null) { foreach (var each in OnExperimentationGetExclusionGroupsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnExperimentationGetExclusionGroupsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnExperimentationGetExclusionGroupTrafficRequestEvent != null) { foreach (var each in OnExperimentationGetExclusionGroupTrafficRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnExperimentationGetExclusionGroupTrafficRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnExperimentationGetExclusionGroupTrafficResultEvent != null) { foreach (var each in OnExperimentationGetExclusionGroupTrafficResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnExperimentationGetExclusionGroupTrafficResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnExperimentationGetExperimentsRequestEvent != null) { foreach (var each in OnExperimentationGetExperimentsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnExperimentationGetExperimentsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnExperimentationGetExperimentsResultEvent != null) { foreach (var each in OnExperimentationGetExperimentsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnExperimentationGetExperimentsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnExperimentationGetLatestScorecardRequestEvent != null) { foreach (var each in OnExperimentationGetLatestScorecardRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnExperimentationGetLatestScorecardRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnExperimentationGetLatestScorecardResultEvent != null) { foreach (var each in OnExperimentationGetLatestScorecardResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnExperimentationGetLatestScorecardResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnExperimentationGetTreatmentAssignmentRequestEvent != null) { foreach (var each in OnExperimentationGetTreatmentAssignmentRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnExperimentationGetTreatmentAssignmentRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnExperimentationGetTreatmentAssignmentResultEvent != null) { foreach (var each in OnExperimentationGetTreatmentAssignmentResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnExperimentationGetTreatmentAssignmentResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnExperimentationStartExperimentRequestEvent != null) { foreach (var each in OnExperimentationStartExperimentRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnExperimentationStartExperimentRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnExperimentationStartExperimentResultEvent != null) { foreach (var each in OnExperimentationStartExperimentResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnExperimentationStartExperimentResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnExperimentationStopExperimentRequestEvent != null) { foreach (var each in OnExperimentationStopExperimentRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnExperimentationStopExperimentRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnExperimentationStopExperimentResultEvent != null) { foreach (var each in OnExperimentationStopExperimentResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnExperimentationStopExperimentResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnExperimentationUpdateExclusionGroupRequestEvent != null) { foreach (var each in OnExperimentationUpdateExclusionGroupRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnExperimentationUpdateExclusionGroupRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnExperimentationUpdateExclusionGroupResultEvent != null) { foreach (var each in OnExperimentationUpdateExclusionGroupResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnExperimentationUpdateExclusionGroupResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnExperimentationUpdateExperimentRequestEvent != null) { foreach (var each in OnExperimentationUpdateExperimentRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnExperimentationUpdateExperimentRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnExperimentationUpdateExperimentResultEvent != null) { foreach (var each in OnExperimentationUpdateExperimentResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnExperimentationUpdateExperimentResultEvent -= (PlayFabResultEvent)each; } } } + +#endif +#if !DISABLE_PLAYFABENTITY_API + if (OnInsightsGetDetailsRequestEvent != null) { foreach (var each in OnInsightsGetDetailsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnInsightsGetDetailsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnInsightsGetDetailsResultEvent != null) { foreach (var each in OnInsightsGetDetailsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnInsightsGetDetailsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnInsightsGetLimitsRequestEvent != null) { foreach (var each in OnInsightsGetLimitsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnInsightsGetLimitsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnInsightsGetLimitsResultEvent != null) { foreach (var each in OnInsightsGetLimitsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnInsightsGetLimitsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnInsightsGetOperationStatusRequestEvent != null) { foreach (var each in OnInsightsGetOperationStatusRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnInsightsGetOperationStatusRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnInsightsGetOperationStatusResultEvent != null) { foreach (var each in OnInsightsGetOperationStatusResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnInsightsGetOperationStatusResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnInsightsGetPendingOperationsRequestEvent != null) { foreach (var each in OnInsightsGetPendingOperationsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnInsightsGetPendingOperationsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnInsightsGetPendingOperationsResultEvent != null) { foreach (var each in OnInsightsGetPendingOperationsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnInsightsGetPendingOperationsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnInsightsSetPerformanceRequestEvent != null) { foreach (var each in OnInsightsSetPerformanceRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnInsightsSetPerformanceRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnInsightsSetPerformanceResultEvent != null) { foreach (var each in OnInsightsSetPerformanceResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnInsightsSetPerformanceResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnInsightsSetStorageRetentionRequestEvent != null) { foreach (var each in OnInsightsSetStorageRetentionRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnInsightsSetStorageRetentionRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnInsightsSetStorageRetentionResultEvent != null) { foreach (var each in OnInsightsSetStorageRetentionResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnInsightsSetStorageRetentionResultEvent -= (PlayFabResultEvent)each; } } } + +#endif +#if !DISABLE_PLAYFABENTITY_API + if (OnGroupsAcceptGroupApplicationRequestEvent != null) { foreach (var each in OnGroupsAcceptGroupApplicationRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsAcceptGroupApplicationRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGroupsAcceptGroupApplicationResultEvent != null) { foreach (var each in OnGroupsAcceptGroupApplicationResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsAcceptGroupApplicationResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGroupsAcceptGroupInvitationRequestEvent != null) { foreach (var each in OnGroupsAcceptGroupInvitationRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsAcceptGroupInvitationRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGroupsAcceptGroupInvitationResultEvent != null) { foreach (var each in OnGroupsAcceptGroupInvitationResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsAcceptGroupInvitationResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGroupsAddMembersRequestEvent != null) { foreach (var each in OnGroupsAddMembersRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsAddMembersRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGroupsAddMembersResultEvent != null) { foreach (var each in OnGroupsAddMembersResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsAddMembersResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGroupsApplyToGroupRequestEvent != null) { foreach (var each in OnGroupsApplyToGroupRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsApplyToGroupRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGroupsApplyToGroupResultEvent != null) { foreach (var each in OnGroupsApplyToGroupResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsApplyToGroupResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGroupsBlockEntityRequestEvent != null) { foreach (var each in OnGroupsBlockEntityRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsBlockEntityRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGroupsBlockEntityResultEvent != null) { foreach (var each in OnGroupsBlockEntityResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsBlockEntityResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGroupsChangeMemberRoleRequestEvent != null) { foreach (var each in OnGroupsChangeMemberRoleRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsChangeMemberRoleRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGroupsChangeMemberRoleResultEvent != null) { foreach (var each in OnGroupsChangeMemberRoleResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsChangeMemberRoleResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGroupsCreateGroupRequestEvent != null) { foreach (var each in OnGroupsCreateGroupRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsCreateGroupRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGroupsCreateGroupResultEvent != null) { foreach (var each in OnGroupsCreateGroupResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsCreateGroupResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGroupsCreateRoleRequestEvent != null) { foreach (var each in OnGroupsCreateRoleRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsCreateRoleRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGroupsCreateRoleResultEvent != null) { foreach (var each in OnGroupsCreateRoleResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsCreateRoleResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGroupsDeleteGroupRequestEvent != null) { foreach (var each in OnGroupsDeleteGroupRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsDeleteGroupRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGroupsDeleteGroupResultEvent != null) { foreach (var each in OnGroupsDeleteGroupResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsDeleteGroupResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGroupsDeleteRoleRequestEvent != null) { foreach (var each in OnGroupsDeleteRoleRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsDeleteRoleRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGroupsDeleteRoleResultEvent != null) { foreach (var each in OnGroupsDeleteRoleResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsDeleteRoleResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGroupsGetGroupRequestEvent != null) { foreach (var each in OnGroupsGetGroupRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsGetGroupRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGroupsGetGroupResultEvent != null) { foreach (var each in OnGroupsGetGroupResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsGetGroupResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGroupsInviteToGroupRequestEvent != null) { foreach (var each in OnGroupsInviteToGroupRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsInviteToGroupRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGroupsInviteToGroupResultEvent != null) { foreach (var each in OnGroupsInviteToGroupResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsInviteToGroupResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGroupsIsMemberRequestEvent != null) { foreach (var each in OnGroupsIsMemberRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsIsMemberRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGroupsIsMemberResultEvent != null) { foreach (var each in OnGroupsIsMemberResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsIsMemberResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGroupsListGroupApplicationsRequestEvent != null) { foreach (var each in OnGroupsListGroupApplicationsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsListGroupApplicationsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGroupsListGroupApplicationsResultEvent != null) { foreach (var each in OnGroupsListGroupApplicationsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsListGroupApplicationsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGroupsListGroupBlocksRequestEvent != null) { foreach (var each in OnGroupsListGroupBlocksRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsListGroupBlocksRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGroupsListGroupBlocksResultEvent != null) { foreach (var each in OnGroupsListGroupBlocksResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsListGroupBlocksResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGroupsListGroupInvitationsRequestEvent != null) { foreach (var each in OnGroupsListGroupInvitationsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsListGroupInvitationsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGroupsListGroupInvitationsResultEvent != null) { foreach (var each in OnGroupsListGroupInvitationsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsListGroupInvitationsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGroupsListGroupMembersRequestEvent != null) { foreach (var each in OnGroupsListGroupMembersRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsListGroupMembersRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGroupsListGroupMembersResultEvent != null) { foreach (var each in OnGroupsListGroupMembersResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsListGroupMembersResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGroupsListMembershipRequestEvent != null) { foreach (var each in OnGroupsListMembershipRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsListMembershipRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGroupsListMembershipResultEvent != null) { foreach (var each in OnGroupsListMembershipResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsListMembershipResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGroupsListMembershipOpportunitiesRequestEvent != null) { foreach (var each in OnGroupsListMembershipOpportunitiesRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsListMembershipOpportunitiesRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGroupsListMembershipOpportunitiesResultEvent != null) { foreach (var each in OnGroupsListMembershipOpportunitiesResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsListMembershipOpportunitiesResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGroupsRemoveGroupApplicationRequestEvent != null) { foreach (var each in OnGroupsRemoveGroupApplicationRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsRemoveGroupApplicationRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGroupsRemoveGroupApplicationResultEvent != null) { foreach (var each in OnGroupsRemoveGroupApplicationResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsRemoveGroupApplicationResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGroupsRemoveGroupInvitationRequestEvent != null) { foreach (var each in OnGroupsRemoveGroupInvitationRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsRemoveGroupInvitationRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGroupsRemoveGroupInvitationResultEvent != null) { foreach (var each in OnGroupsRemoveGroupInvitationResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsRemoveGroupInvitationResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGroupsRemoveMembersRequestEvent != null) { foreach (var each in OnGroupsRemoveMembersRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsRemoveMembersRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGroupsRemoveMembersResultEvent != null) { foreach (var each in OnGroupsRemoveMembersResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsRemoveMembersResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGroupsUnblockEntityRequestEvent != null) { foreach (var each in OnGroupsUnblockEntityRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsUnblockEntityRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGroupsUnblockEntityResultEvent != null) { foreach (var each in OnGroupsUnblockEntityResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsUnblockEntityResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGroupsUpdateGroupRequestEvent != null) { foreach (var each in OnGroupsUpdateGroupRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsUpdateGroupRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGroupsUpdateGroupResultEvent != null) { foreach (var each in OnGroupsUpdateGroupResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsUpdateGroupResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGroupsUpdateRoleRequestEvent != null) { foreach (var each in OnGroupsUpdateRoleRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsUpdateRoleRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGroupsUpdateRoleResultEvent != null) { foreach (var each in OnGroupsUpdateRoleResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsUpdateRoleResultEvent -= (PlayFabResultEvent)each; } } } + +#endif +#if !DISABLE_PLAYFABENTITY_API + if (OnProgressionCreateLeaderboardDefinitionRequestEvent != null) { foreach (var each in OnProgressionCreateLeaderboardDefinitionRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnProgressionCreateLeaderboardDefinitionRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnProgressionCreateLeaderboardDefinitionResultEvent != null) { foreach (var each in OnProgressionCreateLeaderboardDefinitionResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnProgressionCreateLeaderboardDefinitionResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnProgressionCreateStatisticDefinitionRequestEvent != null) { foreach (var each in OnProgressionCreateStatisticDefinitionRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnProgressionCreateStatisticDefinitionRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnProgressionCreateStatisticDefinitionResultEvent != null) { foreach (var each in OnProgressionCreateStatisticDefinitionResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnProgressionCreateStatisticDefinitionResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnProgressionDeleteLeaderboardDefinitionRequestEvent != null) { foreach (var each in OnProgressionDeleteLeaderboardDefinitionRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnProgressionDeleteLeaderboardDefinitionRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnProgressionDeleteLeaderboardDefinitionResultEvent != null) { foreach (var each in OnProgressionDeleteLeaderboardDefinitionResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnProgressionDeleteLeaderboardDefinitionResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnProgressionDeleteLeaderboardEntriesRequestEvent != null) { foreach (var each in OnProgressionDeleteLeaderboardEntriesRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnProgressionDeleteLeaderboardEntriesRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnProgressionDeleteLeaderboardEntriesResultEvent != null) { foreach (var each in OnProgressionDeleteLeaderboardEntriesResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnProgressionDeleteLeaderboardEntriesResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnProgressionDeleteStatisticDefinitionRequestEvent != null) { foreach (var each in OnProgressionDeleteStatisticDefinitionRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnProgressionDeleteStatisticDefinitionRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnProgressionDeleteStatisticDefinitionResultEvent != null) { foreach (var each in OnProgressionDeleteStatisticDefinitionResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnProgressionDeleteStatisticDefinitionResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnProgressionDeleteStatisticsRequestEvent != null) { foreach (var each in OnProgressionDeleteStatisticsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnProgressionDeleteStatisticsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnProgressionDeleteStatisticsResultEvent != null) { foreach (var each in OnProgressionDeleteStatisticsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnProgressionDeleteStatisticsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnProgressionGetFriendLeaderboardForEntityRequestEvent != null) { foreach (var each in OnProgressionGetFriendLeaderboardForEntityRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnProgressionGetFriendLeaderboardForEntityRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnProgressionGetFriendLeaderboardForEntityResultEvent != null) { foreach (var each in OnProgressionGetFriendLeaderboardForEntityResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnProgressionGetFriendLeaderboardForEntityResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnProgressionGetLeaderboardRequestEvent != null) { foreach (var each in OnProgressionGetLeaderboardRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnProgressionGetLeaderboardRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnProgressionGetLeaderboardResultEvent != null) { foreach (var each in OnProgressionGetLeaderboardResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnProgressionGetLeaderboardResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnProgressionGetLeaderboardAroundEntityRequestEvent != null) { foreach (var each in OnProgressionGetLeaderboardAroundEntityRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnProgressionGetLeaderboardAroundEntityRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnProgressionGetLeaderboardAroundEntityResultEvent != null) { foreach (var each in OnProgressionGetLeaderboardAroundEntityResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnProgressionGetLeaderboardAroundEntityResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnProgressionGetLeaderboardDefinitionRequestEvent != null) { foreach (var each in OnProgressionGetLeaderboardDefinitionRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnProgressionGetLeaderboardDefinitionRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnProgressionGetLeaderboardDefinitionResultEvent != null) { foreach (var each in OnProgressionGetLeaderboardDefinitionResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnProgressionGetLeaderboardDefinitionResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnProgressionGetLeaderboardForEntitiesRequestEvent != null) { foreach (var each in OnProgressionGetLeaderboardForEntitiesRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnProgressionGetLeaderboardForEntitiesRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnProgressionGetLeaderboardForEntitiesResultEvent != null) { foreach (var each in OnProgressionGetLeaderboardForEntitiesResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnProgressionGetLeaderboardForEntitiesResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnProgressionGetStatisticDefinitionRequestEvent != null) { foreach (var each in OnProgressionGetStatisticDefinitionRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnProgressionGetStatisticDefinitionRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnProgressionGetStatisticDefinitionResultEvent != null) { foreach (var each in OnProgressionGetStatisticDefinitionResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnProgressionGetStatisticDefinitionResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnProgressionGetStatisticsRequestEvent != null) { foreach (var each in OnProgressionGetStatisticsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnProgressionGetStatisticsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnProgressionGetStatisticsResultEvent != null) { foreach (var each in OnProgressionGetStatisticsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnProgressionGetStatisticsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnProgressionGetStatisticsForEntitiesRequestEvent != null) { foreach (var each in OnProgressionGetStatisticsForEntitiesRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnProgressionGetStatisticsForEntitiesRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnProgressionGetStatisticsForEntitiesResultEvent != null) { foreach (var each in OnProgressionGetStatisticsForEntitiesResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnProgressionGetStatisticsForEntitiesResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnProgressionIncrementLeaderboardVersionRequestEvent != null) { foreach (var each in OnProgressionIncrementLeaderboardVersionRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnProgressionIncrementLeaderboardVersionRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnProgressionIncrementLeaderboardVersionResultEvent != null) { foreach (var each in OnProgressionIncrementLeaderboardVersionResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnProgressionIncrementLeaderboardVersionResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnProgressionIncrementStatisticVersionRequestEvent != null) { foreach (var each in OnProgressionIncrementStatisticVersionRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnProgressionIncrementStatisticVersionRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnProgressionIncrementStatisticVersionResultEvent != null) { foreach (var each in OnProgressionIncrementStatisticVersionResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnProgressionIncrementStatisticVersionResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnProgressionListLeaderboardDefinitionsRequestEvent != null) { foreach (var each in OnProgressionListLeaderboardDefinitionsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnProgressionListLeaderboardDefinitionsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnProgressionListLeaderboardDefinitionsResultEvent != null) { foreach (var each in OnProgressionListLeaderboardDefinitionsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnProgressionListLeaderboardDefinitionsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnProgressionListStatisticDefinitionsRequestEvent != null) { foreach (var each in OnProgressionListStatisticDefinitionsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnProgressionListStatisticDefinitionsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnProgressionListStatisticDefinitionsResultEvent != null) { foreach (var each in OnProgressionListStatisticDefinitionsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnProgressionListStatisticDefinitionsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnProgressionUnlinkLeaderboardFromStatisticRequestEvent != null) { foreach (var each in OnProgressionUnlinkLeaderboardFromStatisticRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnProgressionUnlinkLeaderboardFromStatisticRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnProgressionUnlinkLeaderboardFromStatisticResultEvent != null) { foreach (var each in OnProgressionUnlinkLeaderboardFromStatisticResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnProgressionUnlinkLeaderboardFromStatisticResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnProgressionUpdateLeaderboardEntriesRequestEvent != null) { foreach (var each in OnProgressionUpdateLeaderboardEntriesRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnProgressionUpdateLeaderboardEntriesRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnProgressionUpdateLeaderboardEntriesResultEvent != null) { foreach (var each in OnProgressionUpdateLeaderboardEntriesResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnProgressionUpdateLeaderboardEntriesResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnProgressionUpdateStatisticsRequestEvent != null) { foreach (var each in OnProgressionUpdateStatisticsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnProgressionUpdateStatisticsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnProgressionUpdateStatisticsResultEvent != null) { foreach (var each in OnProgressionUpdateStatisticsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnProgressionUpdateStatisticsResultEvent -= (PlayFabResultEvent)each; } } } + +#endif +#if !DISABLE_PLAYFABENTITY_API + if (OnLocalizationGetLanguageListRequestEvent != null) { foreach (var each in OnLocalizationGetLanguageListRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLocalizationGetLanguageListRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnLocalizationGetLanguageListResultEvent != null) { foreach (var each in OnLocalizationGetLanguageListResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLocalizationGetLanguageListResultEvent -= (PlayFabResultEvent)each; } } } + +#endif +#if !DISABLE_PLAYFABENTITY_API + if (OnMultiplayerCancelAllMatchmakingTicketsForPlayerRequestEvent != null) { foreach (var each in OnMultiplayerCancelAllMatchmakingTicketsForPlayerRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerCancelAllMatchmakingTicketsForPlayerRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerCancelAllMatchmakingTicketsForPlayerResultEvent != null) { foreach (var each in OnMultiplayerCancelAllMatchmakingTicketsForPlayerResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerCancelAllMatchmakingTicketsForPlayerResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerCancelAllServerBackfillTicketsForPlayerRequestEvent != null) { foreach (var each in OnMultiplayerCancelAllServerBackfillTicketsForPlayerRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerCancelAllServerBackfillTicketsForPlayerRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerCancelAllServerBackfillTicketsForPlayerResultEvent != null) { foreach (var each in OnMultiplayerCancelAllServerBackfillTicketsForPlayerResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerCancelAllServerBackfillTicketsForPlayerResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerCancelMatchmakingTicketRequestEvent != null) { foreach (var each in OnMultiplayerCancelMatchmakingTicketRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerCancelMatchmakingTicketRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerCancelMatchmakingTicketResultEvent != null) { foreach (var each in OnMultiplayerCancelMatchmakingTicketResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerCancelMatchmakingTicketResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerCancelServerBackfillTicketRequestEvent != null) { foreach (var each in OnMultiplayerCancelServerBackfillTicketRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerCancelServerBackfillTicketRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerCancelServerBackfillTicketResultEvent != null) { foreach (var each in OnMultiplayerCancelServerBackfillTicketResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerCancelServerBackfillTicketResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerCreateBuildAliasRequestEvent != null) { foreach (var each in OnMultiplayerCreateBuildAliasRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerCreateBuildAliasRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerCreateBuildAliasResultEvent != null) { foreach (var each in OnMultiplayerCreateBuildAliasResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerCreateBuildAliasResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerCreateBuildWithCustomContainerRequestEvent != null) { foreach (var each in OnMultiplayerCreateBuildWithCustomContainerRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerCreateBuildWithCustomContainerRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerCreateBuildWithCustomContainerResultEvent != null) { foreach (var each in OnMultiplayerCreateBuildWithCustomContainerResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerCreateBuildWithCustomContainerResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerCreateBuildWithManagedContainerRequestEvent != null) { foreach (var each in OnMultiplayerCreateBuildWithManagedContainerRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerCreateBuildWithManagedContainerRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerCreateBuildWithManagedContainerResultEvent != null) { foreach (var each in OnMultiplayerCreateBuildWithManagedContainerResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerCreateBuildWithManagedContainerResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerCreateBuildWithProcessBasedServerRequestEvent != null) { foreach (var each in OnMultiplayerCreateBuildWithProcessBasedServerRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerCreateBuildWithProcessBasedServerRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerCreateBuildWithProcessBasedServerResultEvent != null) { foreach (var each in OnMultiplayerCreateBuildWithProcessBasedServerResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerCreateBuildWithProcessBasedServerResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerCreateLobbyRequestEvent != null) { foreach (var each in OnMultiplayerCreateLobbyRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerCreateLobbyRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerCreateLobbyResultEvent != null) { foreach (var each in OnMultiplayerCreateLobbyResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerCreateLobbyResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerCreateMatchmakingTicketRequestEvent != null) { foreach (var each in OnMultiplayerCreateMatchmakingTicketRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerCreateMatchmakingTicketRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerCreateMatchmakingTicketResultEvent != null) { foreach (var each in OnMultiplayerCreateMatchmakingTicketResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerCreateMatchmakingTicketResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerCreateRemoteUserRequestEvent != null) { foreach (var each in OnMultiplayerCreateRemoteUserRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerCreateRemoteUserRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerCreateRemoteUserResultEvent != null) { foreach (var each in OnMultiplayerCreateRemoteUserResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerCreateRemoteUserResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerCreateServerBackfillTicketRequestEvent != null) { foreach (var each in OnMultiplayerCreateServerBackfillTicketRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerCreateServerBackfillTicketRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerCreateServerBackfillTicketResultEvent != null) { foreach (var each in OnMultiplayerCreateServerBackfillTicketResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerCreateServerBackfillTicketResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerCreateServerMatchmakingTicketRequestEvent != null) { foreach (var each in OnMultiplayerCreateServerMatchmakingTicketRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerCreateServerMatchmakingTicketRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerCreateServerMatchmakingTicketResultEvent != null) { foreach (var each in OnMultiplayerCreateServerMatchmakingTicketResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerCreateServerMatchmakingTicketResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerCreateTitleMultiplayerServersQuotaChangeRequestEvent != null) { foreach (var each in OnMultiplayerCreateTitleMultiplayerServersQuotaChangeRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerCreateTitleMultiplayerServersQuotaChangeRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerCreateTitleMultiplayerServersQuotaChangeResultEvent != null) { foreach (var each in OnMultiplayerCreateTitleMultiplayerServersQuotaChangeResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerCreateTitleMultiplayerServersQuotaChangeResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerDeleteAssetRequestEvent != null) { foreach (var each in OnMultiplayerDeleteAssetRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerDeleteAssetRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerDeleteAssetResultEvent != null) { foreach (var each in OnMultiplayerDeleteAssetResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerDeleteAssetResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerDeleteBuildRequestEvent != null) { foreach (var each in OnMultiplayerDeleteBuildRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerDeleteBuildRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerDeleteBuildResultEvent != null) { foreach (var each in OnMultiplayerDeleteBuildResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerDeleteBuildResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerDeleteBuildAliasRequestEvent != null) { foreach (var each in OnMultiplayerDeleteBuildAliasRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerDeleteBuildAliasRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerDeleteBuildAliasResultEvent != null) { foreach (var each in OnMultiplayerDeleteBuildAliasResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerDeleteBuildAliasResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerDeleteBuildRegionRequestEvent != null) { foreach (var each in OnMultiplayerDeleteBuildRegionRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerDeleteBuildRegionRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerDeleteBuildRegionResultEvent != null) { foreach (var each in OnMultiplayerDeleteBuildRegionResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerDeleteBuildRegionResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerDeleteCertificateRequestEvent != null) { foreach (var each in OnMultiplayerDeleteCertificateRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerDeleteCertificateRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerDeleteCertificateResultEvent != null) { foreach (var each in OnMultiplayerDeleteCertificateResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerDeleteCertificateResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerDeleteContainerImageRepositoryRequestEvent != null) { foreach (var each in OnMultiplayerDeleteContainerImageRepositoryRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerDeleteContainerImageRepositoryRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerDeleteContainerImageRepositoryResultEvent != null) { foreach (var each in OnMultiplayerDeleteContainerImageRepositoryResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerDeleteContainerImageRepositoryResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerDeleteLobbyRequestEvent != null) { foreach (var each in OnMultiplayerDeleteLobbyRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerDeleteLobbyRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerDeleteLobbyResultEvent != null) { foreach (var each in OnMultiplayerDeleteLobbyResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerDeleteLobbyResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerDeleteRemoteUserRequestEvent != null) { foreach (var each in OnMultiplayerDeleteRemoteUserRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerDeleteRemoteUserRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerDeleteRemoteUserResultEvent != null) { foreach (var each in OnMultiplayerDeleteRemoteUserResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerDeleteRemoteUserResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerDeleteSecretRequestEvent != null) { foreach (var each in OnMultiplayerDeleteSecretRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerDeleteSecretRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerDeleteSecretResultEvent != null) { foreach (var each in OnMultiplayerDeleteSecretResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerDeleteSecretResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerEnableMultiplayerServersForTitleRequestEvent != null) { foreach (var each in OnMultiplayerEnableMultiplayerServersForTitleRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerEnableMultiplayerServersForTitleRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerEnableMultiplayerServersForTitleResultEvent != null) { foreach (var each in OnMultiplayerEnableMultiplayerServersForTitleResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerEnableMultiplayerServersForTitleResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerFindFriendLobbiesRequestEvent != null) { foreach (var each in OnMultiplayerFindFriendLobbiesRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerFindFriendLobbiesRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerFindFriendLobbiesResultEvent != null) { foreach (var each in OnMultiplayerFindFriendLobbiesResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerFindFriendLobbiesResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerFindLobbiesRequestEvent != null) { foreach (var each in OnMultiplayerFindLobbiesRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerFindLobbiesRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerFindLobbiesResultEvent != null) { foreach (var each in OnMultiplayerFindLobbiesResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerFindLobbiesResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerGetAssetDownloadUrlRequestEvent != null) { foreach (var each in OnMultiplayerGetAssetDownloadUrlRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerGetAssetDownloadUrlRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerGetAssetDownloadUrlResultEvent != null) { foreach (var each in OnMultiplayerGetAssetDownloadUrlResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerGetAssetDownloadUrlResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerGetAssetUploadUrlRequestEvent != null) { foreach (var each in OnMultiplayerGetAssetUploadUrlRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerGetAssetUploadUrlRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerGetAssetUploadUrlResultEvent != null) { foreach (var each in OnMultiplayerGetAssetUploadUrlResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerGetAssetUploadUrlResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerGetBuildRequestEvent != null) { foreach (var each in OnMultiplayerGetBuildRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerGetBuildRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerGetBuildResultEvent != null) { foreach (var each in OnMultiplayerGetBuildResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerGetBuildResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerGetBuildAliasRequestEvent != null) { foreach (var each in OnMultiplayerGetBuildAliasRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerGetBuildAliasRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerGetBuildAliasResultEvent != null) { foreach (var each in OnMultiplayerGetBuildAliasResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerGetBuildAliasResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerGetContainerRegistryCredentialsRequestEvent != null) { foreach (var each in OnMultiplayerGetContainerRegistryCredentialsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerGetContainerRegistryCredentialsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerGetContainerRegistryCredentialsResultEvent != null) { foreach (var each in OnMultiplayerGetContainerRegistryCredentialsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerGetContainerRegistryCredentialsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerGetLobbyRequestEvent != null) { foreach (var each in OnMultiplayerGetLobbyRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerGetLobbyRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerGetLobbyResultEvent != null) { foreach (var each in OnMultiplayerGetLobbyResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerGetLobbyResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerGetMatchRequestEvent != null) { foreach (var each in OnMultiplayerGetMatchRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerGetMatchRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerGetMatchResultEvent != null) { foreach (var each in OnMultiplayerGetMatchResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerGetMatchResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerGetMatchmakingQueueRequestEvent != null) { foreach (var each in OnMultiplayerGetMatchmakingQueueRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerGetMatchmakingQueueRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerGetMatchmakingQueueResultEvent != null) { foreach (var each in OnMultiplayerGetMatchmakingQueueResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerGetMatchmakingQueueResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerGetMatchmakingTicketRequestEvent != null) { foreach (var each in OnMultiplayerGetMatchmakingTicketRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerGetMatchmakingTicketRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerGetMatchmakingTicketResultEvent != null) { foreach (var each in OnMultiplayerGetMatchmakingTicketResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerGetMatchmakingTicketResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerGetMultiplayerServerDetailsRequestEvent != null) { foreach (var each in OnMultiplayerGetMultiplayerServerDetailsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerGetMultiplayerServerDetailsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerGetMultiplayerServerDetailsResultEvent != null) { foreach (var each in OnMultiplayerGetMultiplayerServerDetailsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerGetMultiplayerServerDetailsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerGetMultiplayerServerLogsRequestEvent != null) { foreach (var each in OnMultiplayerGetMultiplayerServerLogsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerGetMultiplayerServerLogsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerGetMultiplayerServerLogsResultEvent != null) { foreach (var each in OnMultiplayerGetMultiplayerServerLogsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerGetMultiplayerServerLogsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerGetMultiplayerSessionLogsBySessionIdRequestEvent != null) { foreach (var each in OnMultiplayerGetMultiplayerSessionLogsBySessionIdRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerGetMultiplayerSessionLogsBySessionIdRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerGetMultiplayerSessionLogsBySessionIdResultEvent != null) { foreach (var each in OnMultiplayerGetMultiplayerSessionLogsBySessionIdResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerGetMultiplayerSessionLogsBySessionIdResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerGetQueueStatisticsRequestEvent != null) { foreach (var each in OnMultiplayerGetQueueStatisticsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerGetQueueStatisticsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerGetQueueStatisticsResultEvent != null) { foreach (var each in OnMultiplayerGetQueueStatisticsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerGetQueueStatisticsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerGetRemoteLoginEndpointRequestEvent != null) { foreach (var each in OnMultiplayerGetRemoteLoginEndpointRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerGetRemoteLoginEndpointRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerGetRemoteLoginEndpointResultEvent != null) { foreach (var each in OnMultiplayerGetRemoteLoginEndpointResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerGetRemoteLoginEndpointResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerGetServerBackfillTicketRequestEvent != null) { foreach (var each in OnMultiplayerGetServerBackfillTicketRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerGetServerBackfillTicketRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerGetServerBackfillTicketResultEvent != null) { foreach (var each in OnMultiplayerGetServerBackfillTicketResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerGetServerBackfillTicketResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerGetTitleEnabledForMultiplayerServersStatusRequestEvent != null) { foreach (var each in OnMultiplayerGetTitleEnabledForMultiplayerServersStatusRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerGetTitleEnabledForMultiplayerServersStatusRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerGetTitleEnabledForMultiplayerServersStatusResultEvent != null) { foreach (var each in OnMultiplayerGetTitleEnabledForMultiplayerServersStatusResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerGetTitleEnabledForMultiplayerServersStatusResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerGetTitleMultiplayerServersQuotaChangeRequestEvent != null) { foreach (var each in OnMultiplayerGetTitleMultiplayerServersQuotaChangeRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerGetTitleMultiplayerServersQuotaChangeRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerGetTitleMultiplayerServersQuotaChangeResultEvent != null) { foreach (var each in OnMultiplayerGetTitleMultiplayerServersQuotaChangeResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerGetTitleMultiplayerServersQuotaChangeResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerGetTitleMultiplayerServersQuotasRequestEvent != null) { foreach (var each in OnMultiplayerGetTitleMultiplayerServersQuotasRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerGetTitleMultiplayerServersQuotasRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerGetTitleMultiplayerServersQuotasResultEvent != null) { foreach (var each in OnMultiplayerGetTitleMultiplayerServersQuotasResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerGetTitleMultiplayerServersQuotasResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerInviteToLobbyRequestEvent != null) { foreach (var each in OnMultiplayerInviteToLobbyRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerInviteToLobbyRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerInviteToLobbyResultEvent != null) { foreach (var each in OnMultiplayerInviteToLobbyResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerInviteToLobbyResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerJoinArrangedLobbyRequestEvent != null) { foreach (var each in OnMultiplayerJoinArrangedLobbyRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerJoinArrangedLobbyRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerJoinArrangedLobbyResultEvent != null) { foreach (var each in OnMultiplayerJoinArrangedLobbyResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerJoinArrangedLobbyResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerJoinLobbyRequestEvent != null) { foreach (var each in OnMultiplayerJoinLobbyRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerJoinLobbyRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerJoinLobbyResultEvent != null) { foreach (var each in OnMultiplayerJoinLobbyResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerJoinLobbyResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerJoinLobbyAsServerRequestEvent != null) { foreach (var each in OnMultiplayerJoinLobbyAsServerRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerJoinLobbyAsServerRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerJoinLobbyAsServerResultEvent != null) { foreach (var each in OnMultiplayerJoinLobbyAsServerResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerJoinLobbyAsServerResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerJoinMatchmakingTicketRequestEvent != null) { foreach (var each in OnMultiplayerJoinMatchmakingTicketRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerJoinMatchmakingTicketRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerJoinMatchmakingTicketResultEvent != null) { foreach (var each in OnMultiplayerJoinMatchmakingTicketResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerJoinMatchmakingTicketResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerLeaveLobbyRequestEvent != null) { foreach (var each in OnMultiplayerLeaveLobbyRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerLeaveLobbyRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerLeaveLobbyResultEvent != null) { foreach (var each in OnMultiplayerLeaveLobbyResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerLeaveLobbyResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerLeaveLobbyAsServerRequestEvent != null) { foreach (var each in OnMultiplayerLeaveLobbyAsServerRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerLeaveLobbyAsServerRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerLeaveLobbyAsServerResultEvent != null) { foreach (var each in OnMultiplayerLeaveLobbyAsServerResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerLeaveLobbyAsServerResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerListArchivedMultiplayerServersRequestEvent != null) { foreach (var each in OnMultiplayerListArchivedMultiplayerServersRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerListArchivedMultiplayerServersRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerListArchivedMultiplayerServersResultEvent != null) { foreach (var each in OnMultiplayerListArchivedMultiplayerServersResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerListArchivedMultiplayerServersResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerListAssetSummariesRequestEvent != null) { foreach (var each in OnMultiplayerListAssetSummariesRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerListAssetSummariesRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerListAssetSummariesResultEvent != null) { foreach (var each in OnMultiplayerListAssetSummariesResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerListAssetSummariesResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerListBuildAliasesRequestEvent != null) { foreach (var each in OnMultiplayerListBuildAliasesRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerListBuildAliasesRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerListBuildAliasesResultEvent != null) { foreach (var each in OnMultiplayerListBuildAliasesResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerListBuildAliasesResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerListBuildSummariesV2RequestEvent != null) { foreach (var each in OnMultiplayerListBuildSummariesV2RequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerListBuildSummariesV2RequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerListBuildSummariesV2ResultEvent != null) { foreach (var each in OnMultiplayerListBuildSummariesV2ResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerListBuildSummariesV2ResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerListCertificateSummariesRequestEvent != null) { foreach (var each in OnMultiplayerListCertificateSummariesRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerListCertificateSummariesRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerListCertificateSummariesResultEvent != null) { foreach (var each in OnMultiplayerListCertificateSummariesResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerListCertificateSummariesResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerListContainerImagesRequestEvent != null) { foreach (var each in OnMultiplayerListContainerImagesRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerListContainerImagesRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerListContainerImagesResultEvent != null) { foreach (var each in OnMultiplayerListContainerImagesResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerListContainerImagesResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerListContainerImageTagsRequestEvent != null) { foreach (var each in OnMultiplayerListContainerImageTagsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerListContainerImageTagsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerListContainerImageTagsResultEvent != null) { foreach (var each in OnMultiplayerListContainerImageTagsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerListContainerImageTagsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerListMatchmakingQueuesRequestEvent != null) { foreach (var each in OnMultiplayerListMatchmakingQueuesRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerListMatchmakingQueuesRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerListMatchmakingQueuesResultEvent != null) { foreach (var each in OnMultiplayerListMatchmakingQueuesResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerListMatchmakingQueuesResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerListMatchmakingTicketsForPlayerRequestEvent != null) { foreach (var each in OnMultiplayerListMatchmakingTicketsForPlayerRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerListMatchmakingTicketsForPlayerRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerListMatchmakingTicketsForPlayerResultEvent != null) { foreach (var each in OnMultiplayerListMatchmakingTicketsForPlayerResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerListMatchmakingTicketsForPlayerResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerListMultiplayerServersRequestEvent != null) { foreach (var each in OnMultiplayerListMultiplayerServersRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerListMultiplayerServersRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerListMultiplayerServersResultEvent != null) { foreach (var each in OnMultiplayerListMultiplayerServersResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerListMultiplayerServersResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerListPartyQosServersRequestEvent != null) { foreach (var each in OnMultiplayerListPartyQosServersRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerListPartyQosServersRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerListPartyQosServersResultEvent != null) { foreach (var each in OnMultiplayerListPartyQosServersResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerListPartyQosServersResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerListQosServersForTitleRequestEvent != null) { foreach (var each in OnMultiplayerListQosServersForTitleRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerListQosServersForTitleRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerListQosServersForTitleResultEvent != null) { foreach (var each in OnMultiplayerListQosServersForTitleResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerListQosServersForTitleResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerListSecretSummariesRequestEvent != null) { foreach (var each in OnMultiplayerListSecretSummariesRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerListSecretSummariesRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerListSecretSummariesResultEvent != null) { foreach (var each in OnMultiplayerListSecretSummariesResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerListSecretSummariesResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerListServerBackfillTicketsForPlayerRequestEvent != null) { foreach (var each in OnMultiplayerListServerBackfillTicketsForPlayerRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerListServerBackfillTicketsForPlayerRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerListServerBackfillTicketsForPlayerResultEvent != null) { foreach (var each in OnMultiplayerListServerBackfillTicketsForPlayerResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerListServerBackfillTicketsForPlayerResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerListTitleMultiplayerServersQuotaChangesRequestEvent != null) { foreach (var each in OnMultiplayerListTitleMultiplayerServersQuotaChangesRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerListTitleMultiplayerServersQuotaChangesRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerListTitleMultiplayerServersQuotaChangesResultEvent != null) { foreach (var each in OnMultiplayerListTitleMultiplayerServersQuotaChangesResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerListTitleMultiplayerServersQuotaChangesResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerListVirtualMachineSummariesRequestEvent != null) { foreach (var each in OnMultiplayerListVirtualMachineSummariesRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerListVirtualMachineSummariesRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerListVirtualMachineSummariesResultEvent != null) { foreach (var each in OnMultiplayerListVirtualMachineSummariesResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerListVirtualMachineSummariesResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerRemoveMatchmakingQueueRequestEvent != null) { foreach (var each in OnMultiplayerRemoveMatchmakingQueueRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerRemoveMatchmakingQueueRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerRemoveMatchmakingQueueResultEvent != null) { foreach (var each in OnMultiplayerRemoveMatchmakingQueueResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerRemoveMatchmakingQueueResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerRemoveMemberRequestEvent != null) { foreach (var each in OnMultiplayerRemoveMemberRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerRemoveMemberRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerRemoveMemberResultEvent != null) { foreach (var each in OnMultiplayerRemoveMemberResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerRemoveMemberResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerRequestMultiplayerServerRequestEvent != null) { foreach (var each in OnMultiplayerRequestMultiplayerServerRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerRequestMultiplayerServerRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerRequestMultiplayerServerResultEvent != null) { foreach (var each in OnMultiplayerRequestMultiplayerServerResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerRequestMultiplayerServerResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerRequestPartyServiceRequestEvent != null) { foreach (var each in OnMultiplayerRequestPartyServiceRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerRequestPartyServiceRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerRequestPartyServiceResultEvent != null) { foreach (var each in OnMultiplayerRequestPartyServiceResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerRequestPartyServiceResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerRolloverContainerRegistryCredentialsRequestEvent != null) { foreach (var each in OnMultiplayerRolloverContainerRegistryCredentialsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerRolloverContainerRegistryCredentialsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerRolloverContainerRegistryCredentialsResultEvent != null) { foreach (var each in OnMultiplayerRolloverContainerRegistryCredentialsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerRolloverContainerRegistryCredentialsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerSetMatchmakingQueueRequestEvent != null) { foreach (var each in OnMultiplayerSetMatchmakingQueueRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerSetMatchmakingQueueRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerSetMatchmakingQueueResultEvent != null) { foreach (var each in OnMultiplayerSetMatchmakingQueueResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerSetMatchmakingQueueResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerShutdownMultiplayerServerRequestEvent != null) { foreach (var each in OnMultiplayerShutdownMultiplayerServerRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerShutdownMultiplayerServerRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerShutdownMultiplayerServerResultEvent != null) { foreach (var each in OnMultiplayerShutdownMultiplayerServerResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerShutdownMultiplayerServerResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerSubscribeToLobbyResourceRequestEvent != null) { foreach (var each in OnMultiplayerSubscribeToLobbyResourceRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerSubscribeToLobbyResourceRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerSubscribeToLobbyResourceResultEvent != null) { foreach (var each in OnMultiplayerSubscribeToLobbyResourceResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerSubscribeToLobbyResourceResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerSubscribeToMatchmakingResourceRequestEvent != null) { foreach (var each in OnMultiplayerSubscribeToMatchmakingResourceRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerSubscribeToMatchmakingResourceRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerSubscribeToMatchmakingResourceResultEvent != null) { foreach (var each in OnMultiplayerSubscribeToMatchmakingResourceResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerSubscribeToMatchmakingResourceResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerUnsubscribeFromLobbyResourceRequestEvent != null) { foreach (var each in OnMultiplayerUnsubscribeFromLobbyResourceRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerUnsubscribeFromLobbyResourceRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerUnsubscribeFromLobbyResourceResultEvent != null) { foreach (var each in OnMultiplayerUnsubscribeFromLobbyResourceResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerUnsubscribeFromLobbyResourceResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerUnsubscribeFromMatchmakingResourceRequestEvent != null) { foreach (var each in OnMultiplayerUnsubscribeFromMatchmakingResourceRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerUnsubscribeFromMatchmakingResourceRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerUnsubscribeFromMatchmakingResourceResultEvent != null) { foreach (var each in OnMultiplayerUnsubscribeFromMatchmakingResourceResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerUnsubscribeFromMatchmakingResourceResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerUntagContainerImageRequestEvent != null) { foreach (var each in OnMultiplayerUntagContainerImageRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerUntagContainerImageRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerUntagContainerImageResultEvent != null) { foreach (var each in OnMultiplayerUntagContainerImageResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerUntagContainerImageResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerUpdateBuildAliasRequestEvent != null) { foreach (var each in OnMultiplayerUpdateBuildAliasRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerUpdateBuildAliasRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerUpdateBuildAliasResultEvent != null) { foreach (var each in OnMultiplayerUpdateBuildAliasResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerUpdateBuildAliasResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerUpdateBuildNameRequestEvent != null) { foreach (var each in OnMultiplayerUpdateBuildNameRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerUpdateBuildNameRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerUpdateBuildNameResultEvent != null) { foreach (var each in OnMultiplayerUpdateBuildNameResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerUpdateBuildNameResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerUpdateBuildRegionRequestEvent != null) { foreach (var each in OnMultiplayerUpdateBuildRegionRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerUpdateBuildRegionRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerUpdateBuildRegionResultEvent != null) { foreach (var each in OnMultiplayerUpdateBuildRegionResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerUpdateBuildRegionResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerUpdateBuildRegionsRequestEvent != null) { foreach (var each in OnMultiplayerUpdateBuildRegionsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerUpdateBuildRegionsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerUpdateBuildRegionsResultEvent != null) { foreach (var each in OnMultiplayerUpdateBuildRegionsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerUpdateBuildRegionsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerUpdateLobbyRequestEvent != null) { foreach (var each in OnMultiplayerUpdateLobbyRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerUpdateLobbyRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerUpdateLobbyResultEvent != null) { foreach (var each in OnMultiplayerUpdateLobbyResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerUpdateLobbyResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerUpdateLobbyAsServerRequestEvent != null) { foreach (var each in OnMultiplayerUpdateLobbyAsServerRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerUpdateLobbyAsServerRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerUpdateLobbyAsServerResultEvent != null) { foreach (var each in OnMultiplayerUpdateLobbyAsServerResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerUpdateLobbyAsServerResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerUploadCertificateRequestEvent != null) { foreach (var each in OnMultiplayerUploadCertificateRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerUploadCertificateRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerUploadCertificateResultEvent != null) { foreach (var each in OnMultiplayerUploadCertificateResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerUploadCertificateResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerUploadSecretRequestEvent != null) { foreach (var each in OnMultiplayerUploadSecretRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerUploadSecretRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerUploadSecretResultEvent != null) { foreach (var each in OnMultiplayerUploadSecretResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerUploadSecretResultEvent -= (PlayFabResultEvent)each; } } } + +#endif +#if !DISABLE_PLAYFABENTITY_API + if (OnProfilesGetGlobalPolicyRequestEvent != null) { foreach (var each in OnProfilesGetGlobalPolicyRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnProfilesGetGlobalPolicyRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnProfilesGetGlobalPolicyResultEvent != null) { foreach (var each in OnProfilesGetGlobalPolicyResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnProfilesGetGlobalPolicyResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnProfilesGetProfileRequestEvent != null) { foreach (var each in OnProfilesGetProfileRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnProfilesGetProfileRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnProfilesGetProfileResultEvent != null) { foreach (var each in OnProfilesGetProfileResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnProfilesGetProfileResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnProfilesGetProfilesRequestEvent != null) { foreach (var each in OnProfilesGetProfilesRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnProfilesGetProfilesRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnProfilesGetProfilesResultEvent != null) { foreach (var each in OnProfilesGetProfilesResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnProfilesGetProfilesResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnProfilesGetTitlePlayersFromMasterPlayerAccountIdsRequestEvent != null) { foreach (var each in OnProfilesGetTitlePlayersFromMasterPlayerAccountIdsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnProfilesGetTitlePlayersFromMasterPlayerAccountIdsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnProfilesGetTitlePlayersFromMasterPlayerAccountIdsResultEvent != null) { foreach (var each in OnProfilesGetTitlePlayersFromMasterPlayerAccountIdsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnProfilesGetTitlePlayersFromMasterPlayerAccountIdsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnProfilesGetTitlePlayersFromXboxLiveIDsRequestEvent != null) { foreach (var each in OnProfilesGetTitlePlayersFromXboxLiveIDsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnProfilesGetTitlePlayersFromXboxLiveIDsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnProfilesGetTitlePlayersFromXboxLiveIDsResultEvent != null) { foreach (var each in OnProfilesGetTitlePlayersFromXboxLiveIDsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnProfilesGetTitlePlayersFromXboxLiveIDsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnProfilesSetDisplayNameRequestEvent != null) { foreach (var each in OnProfilesSetDisplayNameRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnProfilesSetDisplayNameRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnProfilesSetDisplayNameResultEvent != null) { foreach (var each in OnProfilesSetDisplayNameResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnProfilesSetDisplayNameResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnProfilesSetGlobalPolicyRequestEvent != null) { foreach (var each in OnProfilesSetGlobalPolicyRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnProfilesSetGlobalPolicyRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnProfilesSetGlobalPolicyResultEvent != null) { foreach (var each in OnProfilesSetGlobalPolicyResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnProfilesSetGlobalPolicyResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnProfilesSetProfileLanguageRequestEvent != null) { foreach (var each in OnProfilesSetProfileLanguageRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnProfilesSetProfileLanguageRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnProfilesSetProfileLanguageResultEvent != null) { foreach (var each in OnProfilesSetProfileLanguageResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnProfilesSetProfileLanguageResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnProfilesSetProfilePolicyRequestEvent != null) { foreach (var each in OnProfilesSetProfilePolicyRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnProfilesSetProfilePolicyRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnProfilesSetProfilePolicyResultEvent != null) { foreach (var each in OnProfilesSetProfilePolicyResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnProfilesSetProfilePolicyResultEvent -= (PlayFabResultEvent)each; } } } + +#endif +#if ENABLE_PLAYFABSERVER_API +#endif +#if !DISABLE_PLAYFABENTITY_API + if (OnAddonCreateOrUpdateAppleRequestEvent != null) { foreach (var each in OnAddonCreateOrUpdateAppleRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAddonCreateOrUpdateAppleRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAddonCreateOrUpdateAppleResultEvent != null) { foreach (var each in OnAddonCreateOrUpdateAppleResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAddonCreateOrUpdateAppleResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAddonCreateOrUpdateFacebookRequestEvent != null) { foreach (var each in OnAddonCreateOrUpdateFacebookRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAddonCreateOrUpdateFacebookRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAddonCreateOrUpdateFacebookResultEvent != null) { foreach (var each in OnAddonCreateOrUpdateFacebookResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAddonCreateOrUpdateFacebookResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAddonCreateOrUpdateFacebookInstantGamesRequestEvent != null) { foreach (var each in OnAddonCreateOrUpdateFacebookInstantGamesRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAddonCreateOrUpdateFacebookInstantGamesRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAddonCreateOrUpdateFacebookInstantGamesResultEvent != null) { foreach (var each in OnAddonCreateOrUpdateFacebookInstantGamesResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAddonCreateOrUpdateFacebookInstantGamesResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAddonCreateOrUpdateGoogleRequestEvent != null) { foreach (var each in OnAddonCreateOrUpdateGoogleRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAddonCreateOrUpdateGoogleRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAddonCreateOrUpdateGoogleResultEvent != null) { foreach (var each in OnAddonCreateOrUpdateGoogleResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAddonCreateOrUpdateGoogleResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAddonCreateOrUpdateKongregateRequestEvent != null) { foreach (var each in OnAddonCreateOrUpdateKongregateRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAddonCreateOrUpdateKongregateRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAddonCreateOrUpdateKongregateResultEvent != null) { foreach (var each in OnAddonCreateOrUpdateKongregateResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAddonCreateOrUpdateKongregateResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAddonCreateOrUpdateNintendoRequestEvent != null) { foreach (var each in OnAddonCreateOrUpdateNintendoRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAddonCreateOrUpdateNintendoRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAddonCreateOrUpdateNintendoResultEvent != null) { foreach (var each in OnAddonCreateOrUpdateNintendoResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAddonCreateOrUpdateNintendoResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAddonCreateOrUpdatePSNRequestEvent != null) { foreach (var each in OnAddonCreateOrUpdatePSNRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAddonCreateOrUpdatePSNRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAddonCreateOrUpdatePSNResultEvent != null) { foreach (var each in OnAddonCreateOrUpdatePSNResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAddonCreateOrUpdatePSNResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAddonCreateOrUpdateSteamRequestEvent != null) { foreach (var each in OnAddonCreateOrUpdateSteamRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAddonCreateOrUpdateSteamRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAddonCreateOrUpdateSteamResultEvent != null) { foreach (var each in OnAddonCreateOrUpdateSteamResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAddonCreateOrUpdateSteamResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAddonCreateOrUpdateTwitchRequestEvent != null) { foreach (var each in OnAddonCreateOrUpdateTwitchRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAddonCreateOrUpdateTwitchRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAddonCreateOrUpdateTwitchResultEvent != null) { foreach (var each in OnAddonCreateOrUpdateTwitchResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAddonCreateOrUpdateTwitchResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAddonDeleteAppleRequestEvent != null) { foreach (var each in OnAddonDeleteAppleRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAddonDeleteAppleRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAddonDeleteAppleResultEvent != null) { foreach (var each in OnAddonDeleteAppleResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAddonDeleteAppleResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAddonDeleteFacebookRequestEvent != null) { foreach (var each in OnAddonDeleteFacebookRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAddonDeleteFacebookRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAddonDeleteFacebookResultEvent != null) { foreach (var each in OnAddonDeleteFacebookResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAddonDeleteFacebookResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAddonDeleteFacebookInstantGamesRequestEvent != null) { foreach (var each in OnAddonDeleteFacebookInstantGamesRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAddonDeleteFacebookInstantGamesRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAddonDeleteFacebookInstantGamesResultEvent != null) { foreach (var each in OnAddonDeleteFacebookInstantGamesResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAddonDeleteFacebookInstantGamesResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAddonDeleteGoogleRequestEvent != null) { foreach (var each in OnAddonDeleteGoogleRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAddonDeleteGoogleRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAddonDeleteGoogleResultEvent != null) { foreach (var each in OnAddonDeleteGoogleResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAddonDeleteGoogleResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAddonDeleteKongregateRequestEvent != null) { foreach (var each in OnAddonDeleteKongregateRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAddonDeleteKongregateRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAddonDeleteKongregateResultEvent != null) { foreach (var each in OnAddonDeleteKongregateResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAddonDeleteKongregateResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAddonDeleteNintendoRequestEvent != null) { foreach (var each in OnAddonDeleteNintendoRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAddonDeleteNintendoRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAddonDeleteNintendoResultEvent != null) { foreach (var each in OnAddonDeleteNintendoResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAddonDeleteNintendoResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAddonDeletePSNRequestEvent != null) { foreach (var each in OnAddonDeletePSNRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAddonDeletePSNRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAddonDeletePSNResultEvent != null) { foreach (var each in OnAddonDeletePSNResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAddonDeletePSNResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAddonDeleteSteamRequestEvent != null) { foreach (var each in OnAddonDeleteSteamRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAddonDeleteSteamRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAddonDeleteSteamResultEvent != null) { foreach (var each in OnAddonDeleteSteamResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAddonDeleteSteamResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAddonDeleteTwitchRequestEvent != null) { foreach (var each in OnAddonDeleteTwitchRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAddonDeleteTwitchRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAddonDeleteTwitchResultEvent != null) { foreach (var each in OnAddonDeleteTwitchResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAddonDeleteTwitchResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAddonGetAppleRequestEvent != null) { foreach (var each in OnAddonGetAppleRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAddonGetAppleRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAddonGetAppleResultEvent != null) { foreach (var each in OnAddonGetAppleResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAddonGetAppleResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAddonGetFacebookRequestEvent != null) { foreach (var each in OnAddonGetFacebookRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAddonGetFacebookRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAddonGetFacebookResultEvent != null) { foreach (var each in OnAddonGetFacebookResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAddonGetFacebookResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAddonGetFacebookInstantGamesRequestEvent != null) { foreach (var each in OnAddonGetFacebookInstantGamesRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAddonGetFacebookInstantGamesRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAddonGetFacebookInstantGamesResultEvent != null) { foreach (var each in OnAddonGetFacebookInstantGamesResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAddonGetFacebookInstantGamesResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAddonGetGoogleRequestEvent != null) { foreach (var each in OnAddonGetGoogleRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAddonGetGoogleRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAddonGetGoogleResultEvent != null) { foreach (var each in OnAddonGetGoogleResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAddonGetGoogleResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAddonGetKongregateRequestEvent != null) { foreach (var each in OnAddonGetKongregateRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAddonGetKongregateRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAddonGetKongregateResultEvent != null) { foreach (var each in OnAddonGetKongregateResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAddonGetKongregateResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAddonGetNintendoRequestEvent != null) { foreach (var each in OnAddonGetNintendoRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAddonGetNintendoRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAddonGetNintendoResultEvent != null) { foreach (var each in OnAddonGetNintendoResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAddonGetNintendoResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAddonGetPSNRequestEvent != null) { foreach (var each in OnAddonGetPSNRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAddonGetPSNRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAddonGetPSNResultEvent != null) { foreach (var each in OnAddonGetPSNResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAddonGetPSNResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAddonGetSteamRequestEvent != null) { foreach (var each in OnAddonGetSteamRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAddonGetSteamRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAddonGetSteamResultEvent != null) { foreach (var each in OnAddonGetSteamResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAddonGetSteamResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAddonGetTwitchRequestEvent != null) { foreach (var each in OnAddonGetTwitchRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAddonGetTwitchRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAddonGetTwitchResultEvent != null) { foreach (var each in OnAddonGetTwitchResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAddonGetTwitchResultEvent -= (PlayFabResultEvent)each; } } } + +#endif + + } + + private void OnProcessingErrorEvent(PlayFabRequestCommon request, PlayFabError error) + { + //This just forwards the event. + if (_instance.OnGlobalErrorEvent != null) + { + _instance.OnGlobalErrorEvent(request, error); + } + } + + private void OnProcessingEvent(ApiProcessingEventArgs e) + { + + if (e.EventType == ApiProcessingEventType.Pre) + { + var type = e.Request.GetType(); +#if ENABLE_PLAYFABADMIN_API + if (type == typeof(AdminModels.AbortTaskInstanceRequest)) { if (_instance.OnAdminAbortTaskInstanceRequestEvent != null) { _instance.OnAdminAbortTaskInstanceRequestEvent((AdminModels.AbortTaskInstanceRequest)e.Request); return; } } + if (type == typeof(AdminModels.AddLocalizedNewsRequest)) { if (_instance.OnAdminAddLocalizedNewsRequestEvent != null) { _instance.OnAdminAddLocalizedNewsRequestEvent((AdminModels.AddLocalizedNewsRequest)e.Request); return; } } + if (type == typeof(AdminModels.AddNewsRequest)) { if (_instance.OnAdminAddNewsRequestEvent != null) { _instance.OnAdminAddNewsRequestEvent((AdminModels.AddNewsRequest)e.Request); return; } } + if (type == typeof(AdminModels.AddPlayerTagRequest)) { if (_instance.OnAdminAddPlayerTagRequestEvent != null) { _instance.OnAdminAddPlayerTagRequestEvent((AdminModels.AddPlayerTagRequest)e.Request); return; } } + if (type == typeof(AdminModels.AddUserVirtualCurrencyRequest)) { if (_instance.OnAdminAddUserVirtualCurrencyRequestEvent != null) { _instance.OnAdminAddUserVirtualCurrencyRequestEvent((AdminModels.AddUserVirtualCurrencyRequest)e.Request); return; } } + if (type == typeof(AdminModels.AddVirtualCurrencyTypesRequest)) { if (_instance.OnAdminAddVirtualCurrencyTypesRequestEvent != null) { _instance.OnAdminAddVirtualCurrencyTypesRequestEvent((AdminModels.AddVirtualCurrencyTypesRequest)e.Request); return; } } + if (type == typeof(AdminModels.BanUsersRequest)) { if (_instance.OnAdminBanUsersRequestEvent != null) { _instance.OnAdminBanUsersRequestEvent((AdminModels.BanUsersRequest)e.Request); return; } } + if (type == typeof(AdminModels.CheckLimitedEditionItemAvailabilityRequest)) { if (_instance.OnAdminCheckLimitedEditionItemAvailabilityRequestEvent != null) { _instance.OnAdminCheckLimitedEditionItemAvailabilityRequestEvent((AdminModels.CheckLimitedEditionItemAvailabilityRequest)e.Request); return; } } + if (type == typeof(AdminModels.CreateActionsOnPlayerSegmentTaskRequest)) { if (_instance.OnAdminCreateActionsOnPlayersInSegmentTaskRequestEvent != null) { _instance.OnAdminCreateActionsOnPlayersInSegmentTaskRequestEvent((AdminModels.CreateActionsOnPlayerSegmentTaskRequest)e.Request); return; } } + if (type == typeof(AdminModels.CreateCloudScriptTaskRequest)) { if (_instance.OnAdminCreateCloudScriptTaskRequestEvent != null) { _instance.OnAdminCreateCloudScriptTaskRequestEvent((AdminModels.CreateCloudScriptTaskRequest)e.Request); return; } } + if (type == typeof(AdminModels.CreateInsightsScheduledScalingTaskRequest)) { if (_instance.OnAdminCreateInsightsScheduledScalingTaskRequestEvent != null) { _instance.OnAdminCreateInsightsScheduledScalingTaskRequestEvent((AdminModels.CreateInsightsScheduledScalingTaskRequest)e.Request); return; } } + if (type == typeof(AdminModels.CreateOpenIdConnectionRequest)) { if (_instance.OnAdminCreateOpenIdConnectionRequestEvent != null) { _instance.OnAdminCreateOpenIdConnectionRequestEvent((AdminModels.CreateOpenIdConnectionRequest)e.Request); return; } } + if (type == typeof(AdminModels.CreatePlayerSharedSecretRequest)) { if (_instance.OnAdminCreatePlayerSharedSecretRequestEvent != null) { _instance.OnAdminCreatePlayerSharedSecretRequestEvent((AdminModels.CreatePlayerSharedSecretRequest)e.Request); return; } } + if (type == typeof(AdminModels.CreatePlayerStatisticDefinitionRequest)) { if (_instance.OnAdminCreatePlayerStatisticDefinitionRequestEvent != null) { _instance.OnAdminCreatePlayerStatisticDefinitionRequestEvent((AdminModels.CreatePlayerStatisticDefinitionRequest)e.Request); return; } } + if (type == typeof(AdminModels.CreateSegmentRequest)) { if (_instance.OnAdminCreateSegmentRequestEvent != null) { _instance.OnAdminCreateSegmentRequestEvent((AdminModels.CreateSegmentRequest)e.Request); return; } } + if (type == typeof(AdminModels.DeleteContentRequest)) { if (_instance.OnAdminDeleteContentRequestEvent != null) { _instance.OnAdminDeleteContentRequestEvent((AdminModels.DeleteContentRequest)e.Request); return; } } + if (type == typeof(AdminModels.DeleteMasterPlayerAccountRequest)) { if (_instance.OnAdminDeleteMasterPlayerAccountRequestEvent != null) { _instance.OnAdminDeleteMasterPlayerAccountRequestEvent((AdminModels.DeleteMasterPlayerAccountRequest)e.Request); return; } } + if (type == typeof(AdminModels.DeleteMasterPlayerEventDataRequest)) { if (_instance.OnAdminDeleteMasterPlayerEventDataRequestEvent != null) { _instance.OnAdminDeleteMasterPlayerEventDataRequestEvent((AdminModels.DeleteMasterPlayerEventDataRequest)e.Request); return; } } + if (type == typeof(AdminModels.DeleteMembershipSubscriptionRequest)) { if (_instance.OnAdminDeleteMembershipSubscriptionRequestEvent != null) { _instance.OnAdminDeleteMembershipSubscriptionRequestEvent((AdminModels.DeleteMembershipSubscriptionRequest)e.Request); return; } } + if (type == typeof(AdminModels.DeleteOpenIdConnectionRequest)) { if (_instance.OnAdminDeleteOpenIdConnectionRequestEvent != null) { _instance.OnAdminDeleteOpenIdConnectionRequestEvent((AdminModels.DeleteOpenIdConnectionRequest)e.Request); return; } } + if (type == typeof(AdminModels.DeletePlayerRequest)) { if (_instance.OnAdminDeletePlayerRequestEvent != null) { _instance.OnAdminDeletePlayerRequestEvent((AdminModels.DeletePlayerRequest)e.Request); return; } } + if (type == typeof(AdminModels.DeletePlayerSharedSecretRequest)) { if (_instance.OnAdminDeletePlayerSharedSecretRequestEvent != null) { _instance.OnAdminDeletePlayerSharedSecretRequestEvent((AdminModels.DeletePlayerSharedSecretRequest)e.Request); return; } } + if (type == typeof(AdminModels.DeleteSegmentRequest)) { if (_instance.OnAdminDeleteSegmentRequestEvent != null) { _instance.OnAdminDeleteSegmentRequestEvent((AdminModels.DeleteSegmentRequest)e.Request); return; } } + if (type == typeof(AdminModels.DeleteStoreRequest)) { if (_instance.OnAdminDeleteStoreRequestEvent != null) { _instance.OnAdminDeleteStoreRequestEvent((AdminModels.DeleteStoreRequest)e.Request); return; } } + if (type == typeof(AdminModels.DeleteTaskRequest)) { if (_instance.OnAdminDeleteTaskRequestEvent != null) { _instance.OnAdminDeleteTaskRequestEvent((AdminModels.DeleteTaskRequest)e.Request); return; } } + if (type == typeof(AdminModels.DeleteTitleRequest)) { if (_instance.OnAdminDeleteTitleRequestEvent != null) { _instance.OnAdminDeleteTitleRequestEvent((AdminModels.DeleteTitleRequest)e.Request); return; } } + if (type == typeof(AdminModels.DeleteTitleDataOverrideRequest)) { if (_instance.OnAdminDeleteTitleDataOverrideRequestEvent != null) { _instance.OnAdminDeleteTitleDataOverrideRequestEvent((AdminModels.DeleteTitleDataOverrideRequest)e.Request); return; } } + if (type == typeof(AdminModels.ExportMasterPlayerDataRequest)) { if (_instance.OnAdminExportMasterPlayerDataRequestEvent != null) { _instance.OnAdminExportMasterPlayerDataRequestEvent((AdminModels.ExportMasterPlayerDataRequest)e.Request); return; } } + if (type == typeof(AdminModels.ExportPlayersInSegmentRequest)) { if (_instance.OnAdminExportPlayersInSegmentRequestEvent != null) { _instance.OnAdminExportPlayersInSegmentRequestEvent((AdminModels.ExportPlayersInSegmentRequest)e.Request); return; } } + if (type == typeof(AdminModels.GetTaskInstanceRequest)) { if (_instance.OnAdminGetActionsOnPlayersInSegmentTaskInstanceRequestEvent != null) { _instance.OnAdminGetActionsOnPlayersInSegmentTaskInstanceRequestEvent((AdminModels.GetTaskInstanceRequest)e.Request); return; } } + if (type == typeof(AdminModels.GetAllSegmentsRequest)) { if (_instance.OnAdminGetAllSegmentsRequestEvent != null) { _instance.OnAdminGetAllSegmentsRequestEvent((AdminModels.GetAllSegmentsRequest)e.Request); return; } } + if (type == typeof(AdminModels.GetCatalogItemsRequest)) { if (_instance.OnAdminGetCatalogItemsRequestEvent != null) { _instance.OnAdminGetCatalogItemsRequestEvent((AdminModels.GetCatalogItemsRequest)e.Request); return; } } + if (type == typeof(AdminModels.GetCloudScriptRevisionRequest)) { if (_instance.OnAdminGetCloudScriptRevisionRequestEvent != null) { _instance.OnAdminGetCloudScriptRevisionRequestEvent((AdminModels.GetCloudScriptRevisionRequest)e.Request); return; } } + if (type == typeof(AdminModels.GetTaskInstanceRequest)) { if (_instance.OnAdminGetCloudScriptTaskInstanceRequestEvent != null) { _instance.OnAdminGetCloudScriptTaskInstanceRequestEvent((AdminModels.GetTaskInstanceRequest)e.Request); return; } } + if (type == typeof(AdminModels.GetCloudScriptVersionsRequest)) { if (_instance.OnAdminGetCloudScriptVersionsRequestEvent != null) { _instance.OnAdminGetCloudScriptVersionsRequestEvent((AdminModels.GetCloudScriptVersionsRequest)e.Request); return; } } + if (type == typeof(AdminModels.GetContentListRequest)) { if (_instance.OnAdminGetContentListRequestEvent != null) { _instance.OnAdminGetContentListRequestEvent((AdminModels.GetContentListRequest)e.Request); return; } } + if (type == typeof(AdminModels.GetContentUploadUrlRequest)) { if (_instance.OnAdminGetContentUploadUrlRequestEvent != null) { _instance.OnAdminGetContentUploadUrlRequestEvent((AdminModels.GetContentUploadUrlRequest)e.Request); return; } } + if (type == typeof(AdminModels.GetDataReportRequest)) { if (_instance.OnAdminGetDataReportRequestEvent != null) { _instance.OnAdminGetDataReportRequestEvent((AdminModels.GetDataReportRequest)e.Request); return; } } + if (type == typeof(AdminModels.GetPlayedTitleListRequest)) { if (_instance.OnAdminGetPlayedTitleListRequestEvent != null) { _instance.OnAdminGetPlayedTitleListRequestEvent((AdminModels.GetPlayedTitleListRequest)e.Request); return; } } + if (type == typeof(AdminModels.GetPlayerIdFromAuthTokenRequest)) { if (_instance.OnAdminGetPlayerIdFromAuthTokenRequestEvent != null) { _instance.OnAdminGetPlayerIdFromAuthTokenRequestEvent((AdminModels.GetPlayerIdFromAuthTokenRequest)e.Request); return; } } + if (type == typeof(AdminModels.GetPlayerProfileRequest)) { if (_instance.OnAdminGetPlayerProfileRequestEvent != null) { _instance.OnAdminGetPlayerProfileRequestEvent((AdminModels.GetPlayerProfileRequest)e.Request); return; } } + if (type == typeof(AdminModels.GetPlayersSegmentsRequest)) { if (_instance.OnAdminGetPlayerSegmentsRequestEvent != null) { _instance.OnAdminGetPlayerSegmentsRequestEvent((AdminModels.GetPlayersSegmentsRequest)e.Request); return; } } + if (type == typeof(AdminModels.GetPlayerSharedSecretsRequest)) { if (_instance.OnAdminGetPlayerSharedSecretsRequestEvent != null) { _instance.OnAdminGetPlayerSharedSecretsRequestEvent((AdminModels.GetPlayerSharedSecretsRequest)e.Request); return; } } + if (type == typeof(AdminModels.GetPlayersInSegmentRequest)) { if (_instance.OnAdminGetPlayersInSegmentRequestEvent != null) { _instance.OnAdminGetPlayersInSegmentRequestEvent((AdminModels.GetPlayersInSegmentRequest)e.Request); return; } } + if (type == typeof(AdminModels.GetPlayerStatisticDefinitionsRequest)) { if (_instance.OnAdminGetPlayerStatisticDefinitionsRequestEvent != null) { _instance.OnAdminGetPlayerStatisticDefinitionsRequestEvent((AdminModels.GetPlayerStatisticDefinitionsRequest)e.Request); return; } } + if (type == typeof(AdminModels.GetPlayerStatisticVersionsRequest)) { if (_instance.OnAdminGetPlayerStatisticVersionsRequestEvent != null) { _instance.OnAdminGetPlayerStatisticVersionsRequestEvent((AdminModels.GetPlayerStatisticVersionsRequest)e.Request); return; } } + if (type == typeof(AdminModels.GetPlayerTagsRequest)) { if (_instance.OnAdminGetPlayerTagsRequestEvent != null) { _instance.OnAdminGetPlayerTagsRequestEvent((AdminModels.GetPlayerTagsRequest)e.Request); return; } } + if (type == typeof(AdminModels.GetPolicyRequest)) { if (_instance.OnAdminGetPolicyRequestEvent != null) { _instance.OnAdminGetPolicyRequestEvent((AdminModels.GetPolicyRequest)e.Request); return; } } + if (type == typeof(AdminModels.GetPublisherDataRequest)) { if (_instance.OnAdminGetPublisherDataRequestEvent != null) { _instance.OnAdminGetPublisherDataRequestEvent((AdminModels.GetPublisherDataRequest)e.Request); return; } } + if (type == typeof(AdminModels.GetRandomResultTablesRequest)) { if (_instance.OnAdminGetRandomResultTablesRequestEvent != null) { _instance.OnAdminGetRandomResultTablesRequestEvent((AdminModels.GetRandomResultTablesRequest)e.Request); return; } } + if (type == typeof(AdminModels.GetPlayersInSegmentExportRequest)) { if (_instance.OnAdminGetSegmentExportRequestEvent != null) { _instance.OnAdminGetSegmentExportRequestEvent((AdminModels.GetPlayersInSegmentExportRequest)e.Request); return; } } + if (type == typeof(AdminModels.GetSegmentsRequest)) { if (_instance.OnAdminGetSegmentsRequestEvent != null) { _instance.OnAdminGetSegmentsRequestEvent((AdminModels.GetSegmentsRequest)e.Request); return; } } + if (type == typeof(AdminModels.GetStoreItemsRequest)) { if (_instance.OnAdminGetStoreItemsRequestEvent != null) { _instance.OnAdminGetStoreItemsRequestEvent((AdminModels.GetStoreItemsRequest)e.Request); return; } } + if (type == typeof(AdminModels.GetTaskInstancesRequest)) { if (_instance.OnAdminGetTaskInstancesRequestEvent != null) { _instance.OnAdminGetTaskInstancesRequestEvent((AdminModels.GetTaskInstancesRequest)e.Request); return; } } + if (type == typeof(AdminModels.GetTasksRequest)) { if (_instance.OnAdminGetTasksRequestEvent != null) { _instance.OnAdminGetTasksRequestEvent((AdminModels.GetTasksRequest)e.Request); return; } } + if (type == typeof(AdminModels.GetTitleDataRequest)) { if (_instance.OnAdminGetTitleDataRequestEvent != null) { _instance.OnAdminGetTitleDataRequestEvent((AdminModels.GetTitleDataRequest)e.Request); return; } } + if (type == typeof(AdminModels.GetTitleDataRequest)) { if (_instance.OnAdminGetTitleInternalDataRequestEvent != null) { _instance.OnAdminGetTitleInternalDataRequestEvent((AdminModels.GetTitleDataRequest)e.Request); return; } } + if (type == typeof(AdminModels.LookupUserAccountInfoRequest)) { if (_instance.OnAdminGetUserAccountInfoRequestEvent != null) { _instance.OnAdminGetUserAccountInfoRequestEvent((AdminModels.LookupUserAccountInfoRequest)e.Request); return; } } + if (type == typeof(AdminModels.GetUserBansRequest)) { if (_instance.OnAdminGetUserBansRequestEvent != null) { _instance.OnAdminGetUserBansRequestEvent((AdminModels.GetUserBansRequest)e.Request); return; } } + if (type == typeof(AdminModels.GetUserDataRequest)) { if (_instance.OnAdminGetUserDataRequestEvent != null) { _instance.OnAdminGetUserDataRequestEvent((AdminModels.GetUserDataRequest)e.Request); return; } } + if (type == typeof(AdminModels.GetUserDataRequest)) { if (_instance.OnAdminGetUserInternalDataRequestEvent != null) { _instance.OnAdminGetUserInternalDataRequestEvent((AdminModels.GetUserDataRequest)e.Request); return; } } + if (type == typeof(AdminModels.GetUserInventoryRequest)) { if (_instance.OnAdminGetUserInventoryRequestEvent != null) { _instance.OnAdminGetUserInventoryRequestEvent((AdminModels.GetUserInventoryRequest)e.Request); return; } } + if (type == typeof(AdminModels.GetUserDataRequest)) { if (_instance.OnAdminGetUserPublisherDataRequestEvent != null) { _instance.OnAdminGetUserPublisherDataRequestEvent((AdminModels.GetUserDataRequest)e.Request); return; } } + if (type == typeof(AdminModels.GetUserDataRequest)) { if (_instance.OnAdminGetUserPublisherInternalDataRequestEvent != null) { _instance.OnAdminGetUserPublisherInternalDataRequestEvent((AdminModels.GetUserDataRequest)e.Request); return; } } + if (type == typeof(AdminModels.GetUserDataRequest)) { if (_instance.OnAdminGetUserPublisherReadOnlyDataRequestEvent != null) { _instance.OnAdminGetUserPublisherReadOnlyDataRequestEvent((AdminModels.GetUserDataRequest)e.Request); return; } } + if (type == typeof(AdminModels.GetUserDataRequest)) { if (_instance.OnAdminGetUserReadOnlyDataRequestEvent != null) { _instance.OnAdminGetUserReadOnlyDataRequestEvent((AdminModels.GetUserDataRequest)e.Request); return; } } + if (type == typeof(AdminModels.GrantItemsToUsersRequest)) { if (_instance.OnAdminGrantItemsToUsersRequestEvent != null) { _instance.OnAdminGrantItemsToUsersRequestEvent((AdminModels.GrantItemsToUsersRequest)e.Request); return; } } + if (type == typeof(AdminModels.IncrementLimitedEditionItemAvailabilityRequest)) { if (_instance.OnAdminIncrementLimitedEditionItemAvailabilityRequestEvent != null) { _instance.OnAdminIncrementLimitedEditionItemAvailabilityRequestEvent((AdminModels.IncrementLimitedEditionItemAvailabilityRequest)e.Request); return; } } + if (type == typeof(AdminModels.IncrementPlayerStatisticVersionRequest)) { if (_instance.OnAdminIncrementPlayerStatisticVersionRequestEvent != null) { _instance.OnAdminIncrementPlayerStatisticVersionRequestEvent((AdminModels.IncrementPlayerStatisticVersionRequest)e.Request); return; } } + if (type == typeof(AdminModels.ListOpenIdConnectionRequest)) { if (_instance.OnAdminListOpenIdConnectionRequestEvent != null) { _instance.OnAdminListOpenIdConnectionRequestEvent((AdminModels.ListOpenIdConnectionRequest)e.Request); return; } } + if (type == typeof(AdminModels.ListVirtualCurrencyTypesRequest)) { if (_instance.OnAdminListVirtualCurrencyTypesRequestEvent != null) { _instance.OnAdminListVirtualCurrencyTypesRequestEvent((AdminModels.ListVirtualCurrencyTypesRequest)e.Request); return; } } + if (type == typeof(AdminModels.RefundPurchaseRequest)) { if (_instance.OnAdminRefundPurchaseRequestEvent != null) { _instance.OnAdminRefundPurchaseRequestEvent((AdminModels.RefundPurchaseRequest)e.Request); return; } } + if (type == typeof(AdminModels.RemovePlayerTagRequest)) { if (_instance.OnAdminRemovePlayerTagRequestEvent != null) { _instance.OnAdminRemovePlayerTagRequestEvent((AdminModels.RemovePlayerTagRequest)e.Request); return; } } + if (type == typeof(AdminModels.RemoveVirtualCurrencyTypesRequest)) { if (_instance.OnAdminRemoveVirtualCurrencyTypesRequestEvent != null) { _instance.OnAdminRemoveVirtualCurrencyTypesRequestEvent((AdminModels.RemoveVirtualCurrencyTypesRequest)e.Request); return; } } + if (type == typeof(AdminModels.ResetCharacterStatisticsRequest)) { if (_instance.OnAdminResetCharacterStatisticsRequestEvent != null) { _instance.OnAdminResetCharacterStatisticsRequestEvent((AdminModels.ResetCharacterStatisticsRequest)e.Request); return; } } + if (type == typeof(AdminModels.ResetPasswordRequest)) { if (_instance.OnAdminResetPasswordRequestEvent != null) { _instance.OnAdminResetPasswordRequestEvent((AdminModels.ResetPasswordRequest)e.Request); return; } } + if (type == typeof(AdminModels.ResetUserStatisticsRequest)) { if (_instance.OnAdminResetUserStatisticsRequestEvent != null) { _instance.OnAdminResetUserStatisticsRequestEvent((AdminModels.ResetUserStatisticsRequest)e.Request); return; } } + if (type == typeof(AdminModels.ResolvePurchaseDisputeRequest)) { if (_instance.OnAdminResolvePurchaseDisputeRequestEvent != null) { _instance.OnAdminResolvePurchaseDisputeRequestEvent((AdminModels.ResolvePurchaseDisputeRequest)e.Request); return; } } + if (type == typeof(AdminModels.RevokeAllBansForUserRequest)) { if (_instance.OnAdminRevokeAllBansForUserRequestEvent != null) { _instance.OnAdminRevokeAllBansForUserRequestEvent((AdminModels.RevokeAllBansForUserRequest)e.Request); return; } } + if (type == typeof(AdminModels.RevokeBansRequest)) { if (_instance.OnAdminRevokeBansRequestEvent != null) { _instance.OnAdminRevokeBansRequestEvent((AdminModels.RevokeBansRequest)e.Request); return; } } + if (type == typeof(AdminModels.RevokeInventoryItemRequest)) { if (_instance.OnAdminRevokeInventoryItemRequestEvent != null) { _instance.OnAdminRevokeInventoryItemRequestEvent((AdminModels.RevokeInventoryItemRequest)e.Request); return; } } + if (type == typeof(AdminModels.RevokeInventoryItemsRequest)) { if (_instance.OnAdminRevokeInventoryItemsRequestEvent != null) { _instance.OnAdminRevokeInventoryItemsRequestEvent((AdminModels.RevokeInventoryItemsRequest)e.Request); return; } } + if (type == typeof(AdminModels.RunTaskRequest)) { if (_instance.OnAdminRunTaskRequestEvent != null) { _instance.OnAdminRunTaskRequestEvent((AdminModels.RunTaskRequest)e.Request); return; } } + if (type == typeof(AdminModels.SendAccountRecoveryEmailRequest)) { if (_instance.OnAdminSendAccountRecoveryEmailRequestEvent != null) { _instance.OnAdminSendAccountRecoveryEmailRequestEvent((AdminModels.SendAccountRecoveryEmailRequest)e.Request); return; } } + if (type == typeof(AdminModels.UpdateCatalogItemsRequest)) { if (_instance.OnAdminSetCatalogItemsRequestEvent != null) { _instance.OnAdminSetCatalogItemsRequestEvent((AdminModels.UpdateCatalogItemsRequest)e.Request); return; } } + if (type == typeof(AdminModels.SetMembershipOverrideRequest)) { if (_instance.OnAdminSetMembershipOverrideRequestEvent != null) { _instance.OnAdminSetMembershipOverrideRequestEvent((AdminModels.SetMembershipOverrideRequest)e.Request); return; } } + if (type == typeof(AdminModels.SetPlayerSecretRequest)) { if (_instance.OnAdminSetPlayerSecretRequestEvent != null) { _instance.OnAdminSetPlayerSecretRequestEvent((AdminModels.SetPlayerSecretRequest)e.Request); return; } } + if (type == typeof(AdminModels.SetPublishedRevisionRequest)) { if (_instance.OnAdminSetPublishedRevisionRequestEvent != null) { _instance.OnAdminSetPublishedRevisionRequestEvent((AdminModels.SetPublishedRevisionRequest)e.Request); return; } } + if (type == typeof(AdminModels.SetPublisherDataRequest)) { if (_instance.OnAdminSetPublisherDataRequestEvent != null) { _instance.OnAdminSetPublisherDataRequestEvent((AdminModels.SetPublisherDataRequest)e.Request); return; } } + if (type == typeof(AdminModels.UpdateStoreItemsRequest)) { if (_instance.OnAdminSetStoreItemsRequestEvent != null) { _instance.OnAdminSetStoreItemsRequestEvent((AdminModels.UpdateStoreItemsRequest)e.Request); return; } } + if (type == typeof(AdminModels.SetTitleDataRequest)) { if (_instance.OnAdminSetTitleDataRequestEvent != null) { _instance.OnAdminSetTitleDataRequestEvent((AdminModels.SetTitleDataRequest)e.Request); return; } } + if (type == typeof(AdminModels.SetTitleDataAndOverridesRequest)) { if (_instance.OnAdminSetTitleDataAndOverridesRequestEvent != null) { _instance.OnAdminSetTitleDataAndOverridesRequestEvent((AdminModels.SetTitleDataAndOverridesRequest)e.Request); return; } } + if (type == typeof(AdminModels.SetTitleDataRequest)) { if (_instance.OnAdminSetTitleInternalDataRequestEvent != null) { _instance.OnAdminSetTitleInternalDataRequestEvent((AdminModels.SetTitleDataRequest)e.Request); return; } } + if (type == typeof(AdminModels.SetupPushNotificationRequest)) { if (_instance.OnAdminSetupPushNotificationRequestEvent != null) { _instance.OnAdminSetupPushNotificationRequestEvent((AdminModels.SetupPushNotificationRequest)e.Request); return; } } + if (type == typeof(AdminModels.SubtractUserVirtualCurrencyRequest)) { if (_instance.OnAdminSubtractUserVirtualCurrencyRequestEvent != null) { _instance.OnAdminSubtractUserVirtualCurrencyRequestEvent((AdminModels.SubtractUserVirtualCurrencyRequest)e.Request); return; } } + if (type == typeof(AdminModels.UpdateBansRequest)) { if (_instance.OnAdminUpdateBansRequestEvent != null) { _instance.OnAdminUpdateBansRequestEvent((AdminModels.UpdateBansRequest)e.Request); return; } } + if (type == typeof(AdminModels.UpdateCatalogItemsRequest)) { if (_instance.OnAdminUpdateCatalogItemsRequestEvent != null) { _instance.OnAdminUpdateCatalogItemsRequestEvent((AdminModels.UpdateCatalogItemsRequest)e.Request); return; } } + if (type == typeof(AdminModels.UpdateCloudScriptRequest)) { if (_instance.OnAdminUpdateCloudScriptRequestEvent != null) { _instance.OnAdminUpdateCloudScriptRequestEvent((AdminModels.UpdateCloudScriptRequest)e.Request); return; } } + if (type == typeof(AdminModels.UpdateOpenIdConnectionRequest)) { if (_instance.OnAdminUpdateOpenIdConnectionRequestEvent != null) { _instance.OnAdminUpdateOpenIdConnectionRequestEvent((AdminModels.UpdateOpenIdConnectionRequest)e.Request); return; } } + if (type == typeof(AdminModels.UpdatePlayerSharedSecretRequest)) { if (_instance.OnAdminUpdatePlayerSharedSecretRequestEvent != null) { _instance.OnAdminUpdatePlayerSharedSecretRequestEvent((AdminModels.UpdatePlayerSharedSecretRequest)e.Request); return; } } + if (type == typeof(AdminModels.UpdatePlayerStatisticDefinitionRequest)) { if (_instance.OnAdminUpdatePlayerStatisticDefinitionRequestEvent != null) { _instance.OnAdminUpdatePlayerStatisticDefinitionRequestEvent((AdminModels.UpdatePlayerStatisticDefinitionRequest)e.Request); return; } } + if (type == typeof(AdminModels.UpdatePolicyRequest)) { if (_instance.OnAdminUpdatePolicyRequestEvent != null) { _instance.OnAdminUpdatePolicyRequestEvent((AdminModels.UpdatePolicyRequest)e.Request); return; } } + if (type == typeof(AdminModels.UpdateRandomResultTablesRequest)) { if (_instance.OnAdminUpdateRandomResultTablesRequestEvent != null) { _instance.OnAdminUpdateRandomResultTablesRequestEvent((AdminModels.UpdateRandomResultTablesRequest)e.Request); return; } } + if (type == typeof(AdminModels.UpdateSegmentRequest)) { if (_instance.OnAdminUpdateSegmentRequestEvent != null) { _instance.OnAdminUpdateSegmentRequestEvent((AdminModels.UpdateSegmentRequest)e.Request); return; } } + if (type == typeof(AdminModels.UpdateStoreItemsRequest)) { if (_instance.OnAdminUpdateStoreItemsRequestEvent != null) { _instance.OnAdminUpdateStoreItemsRequestEvent((AdminModels.UpdateStoreItemsRequest)e.Request); return; } } + if (type == typeof(AdminModels.UpdateTaskRequest)) { if (_instance.OnAdminUpdateTaskRequestEvent != null) { _instance.OnAdminUpdateTaskRequestEvent((AdminModels.UpdateTaskRequest)e.Request); return; } } + if (type == typeof(AdminModels.UpdateUserDataRequest)) { if (_instance.OnAdminUpdateUserDataRequestEvent != null) { _instance.OnAdminUpdateUserDataRequestEvent((AdminModels.UpdateUserDataRequest)e.Request); return; } } + if (type == typeof(AdminModels.UpdateUserInternalDataRequest)) { if (_instance.OnAdminUpdateUserInternalDataRequestEvent != null) { _instance.OnAdminUpdateUserInternalDataRequestEvent((AdminModels.UpdateUserInternalDataRequest)e.Request); return; } } + if (type == typeof(AdminModels.UpdateUserDataRequest)) { if (_instance.OnAdminUpdateUserPublisherDataRequestEvent != null) { _instance.OnAdminUpdateUserPublisherDataRequestEvent((AdminModels.UpdateUserDataRequest)e.Request); return; } } + if (type == typeof(AdminModels.UpdateUserInternalDataRequest)) { if (_instance.OnAdminUpdateUserPublisherInternalDataRequestEvent != null) { _instance.OnAdminUpdateUserPublisherInternalDataRequestEvent((AdminModels.UpdateUserInternalDataRequest)e.Request); return; } } + if (type == typeof(AdminModels.UpdateUserDataRequest)) { if (_instance.OnAdminUpdateUserPublisherReadOnlyDataRequestEvent != null) { _instance.OnAdminUpdateUserPublisherReadOnlyDataRequestEvent((AdminModels.UpdateUserDataRequest)e.Request); return; } } + if (type == typeof(AdminModels.UpdateUserDataRequest)) { if (_instance.OnAdminUpdateUserReadOnlyDataRequestEvent != null) { _instance.OnAdminUpdateUserReadOnlyDataRequestEvent((AdminModels.UpdateUserDataRequest)e.Request); return; } } + if (type == typeof(AdminModels.UpdateUserTitleDisplayNameRequest)) { if (_instance.OnAdminUpdateUserTitleDisplayNameRequestEvent != null) { _instance.OnAdminUpdateUserTitleDisplayNameRequestEvent((AdminModels.UpdateUserTitleDisplayNameRequest)e.Request); return; } } +#endif +#if !DISABLE_PLAYFABCLIENT_API + if (type == typeof(ClientModels.AcceptTradeRequest)) { if (_instance.OnAcceptTradeRequestEvent != null) { _instance.OnAcceptTradeRequestEvent((ClientModels.AcceptTradeRequest)e.Request); return; } } + if (type == typeof(ClientModels.AddFriendRequest)) { if (_instance.OnAddFriendRequestEvent != null) { _instance.OnAddFriendRequestEvent((ClientModels.AddFriendRequest)e.Request); return; } } + if (type == typeof(ClientModels.AddGenericIDRequest)) { if (_instance.OnAddGenericIDRequestEvent != null) { _instance.OnAddGenericIDRequestEvent((ClientModels.AddGenericIDRequest)e.Request); return; } } + if (type == typeof(ClientModels.AddOrUpdateContactEmailRequest)) { if (_instance.OnAddOrUpdateContactEmailRequestEvent != null) { _instance.OnAddOrUpdateContactEmailRequestEvent((ClientModels.AddOrUpdateContactEmailRequest)e.Request); return; } } + if (type == typeof(ClientModels.AddSharedGroupMembersRequest)) { if (_instance.OnAddSharedGroupMembersRequestEvent != null) { _instance.OnAddSharedGroupMembersRequestEvent((ClientModels.AddSharedGroupMembersRequest)e.Request); return; } } + if (type == typeof(ClientModels.AddUsernamePasswordRequest)) { if (_instance.OnAddUsernamePasswordRequestEvent != null) { _instance.OnAddUsernamePasswordRequestEvent((ClientModels.AddUsernamePasswordRequest)e.Request); return; } } + if (type == typeof(ClientModels.AddUserVirtualCurrencyRequest)) { if (_instance.OnAddUserVirtualCurrencyRequestEvent != null) { _instance.OnAddUserVirtualCurrencyRequestEvent((ClientModels.AddUserVirtualCurrencyRequest)e.Request); return; } } + if (type == typeof(ClientModels.AndroidDevicePushNotificationRegistrationRequest)) { if (_instance.OnAndroidDevicePushNotificationRegistrationRequestEvent != null) { _instance.OnAndroidDevicePushNotificationRegistrationRequestEvent((ClientModels.AndroidDevicePushNotificationRegistrationRequest)e.Request); return; } } + if (type == typeof(ClientModels.AttributeInstallRequest)) { if (_instance.OnAttributeInstallRequestEvent != null) { _instance.OnAttributeInstallRequestEvent((ClientModels.AttributeInstallRequest)e.Request); return; } } + if (type == typeof(ClientModels.CancelTradeRequest)) { if (_instance.OnCancelTradeRequestEvent != null) { _instance.OnCancelTradeRequestEvent((ClientModels.CancelTradeRequest)e.Request); return; } } + if (type == typeof(ClientModels.ConfirmPurchaseRequest)) { if (_instance.OnConfirmPurchaseRequestEvent != null) { _instance.OnConfirmPurchaseRequestEvent((ClientModels.ConfirmPurchaseRequest)e.Request); return; } } + if (type == typeof(ClientModels.ConsumeItemRequest)) { if (_instance.OnConsumeItemRequestEvent != null) { _instance.OnConsumeItemRequestEvent((ClientModels.ConsumeItemRequest)e.Request); return; } } + if (type == typeof(ClientModels.ConsumeMicrosoftStoreEntitlementsRequest)) { if (_instance.OnConsumeMicrosoftStoreEntitlementsRequestEvent != null) { _instance.OnConsumeMicrosoftStoreEntitlementsRequestEvent((ClientModels.ConsumeMicrosoftStoreEntitlementsRequest)e.Request); return; } } + if (type == typeof(ClientModels.ConsumePS5EntitlementsRequest)) { if (_instance.OnConsumePS5EntitlementsRequestEvent != null) { _instance.OnConsumePS5EntitlementsRequestEvent((ClientModels.ConsumePS5EntitlementsRequest)e.Request); return; } } + if (type == typeof(ClientModels.ConsumePSNEntitlementsRequest)) { if (_instance.OnConsumePSNEntitlementsRequestEvent != null) { _instance.OnConsumePSNEntitlementsRequestEvent((ClientModels.ConsumePSNEntitlementsRequest)e.Request); return; } } + if (type == typeof(ClientModels.ConsumeXboxEntitlementsRequest)) { if (_instance.OnConsumeXboxEntitlementsRequestEvent != null) { _instance.OnConsumeXboxEntitlementsRequestEvent((ClientModels.ConsumeXboxEntitlementsRequest)e.Request); return; } } + if (type == typeof(ClientModels.CreateSharedGroupRequest)) { if (_instance.OnCreateSharedGroupRequestEvent != null) { _instance.OnCreateSharedGroupRequestEvent((ClientModels.CreateSharedGroupRequest)e.Request); return; } } + if (type == typeof(ClientModels.ExecuteCloudScriptRequest)) { if (_instance.OnExecuteCloudScriptRequestEvent != null) { _instance.OnExecuteCloudScriptRequestEvent((ClientModels.ExecuteCloudScriptRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetAccountInfoRequest)) { if (_instance.OnGetAccountInfoRequestEvent != null) { _instance.OnGetAccountInfoRequestEvent((ClientModels.GetAccountInfoRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetAdPlacementsRequest)) { if (_instance.OnGetAdPlacementsRequestEvent != null) { _instance.OnGetAdPlacementsRequestEvent((ClientModels.GetAdPlacementsRequest)e.Request); return; } } + if (type == typeof(ClientModels.ListUsersCharactersRequest)) { if (_instance.OnGetAllUsersCharactersRequestEvent != null) { _instance.OnGetAllUsersCharactersRequestEvent((ClientModels.ListUsersCharactersRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetCatalogItemsRequest)) { if (_instance.OnGetCatalogItemsRequestEvent != null) { _instance.OnGetCatalogItemsRequestEvent((ClientModels.GetCatalogItemsRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetCharacterDataRequest)) { if (_instance.OnGetCharacterDataRequestEvent != null) { _instance.OnGetCharacterDataRequestEvent((ClientModels.GetCharacterDataRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetCharacterInventoryRequest)) { if (_instance.OnGetCharacterInventoryRequestEvent != null) { _instance.OnGetCharacterInventoryRequestEvent((ClientModels.GetCharacterInventoryRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetCharacterLeaderboardRequest)) { if (_instance.OnGetCharacterLeaderboardRequestEvent != null) { _instance.OnGetCharacterLeaderboardRequestEvent((ClientModels.GetCharacterLeaderboardRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetCharacterDataRequest)) { if (_instance.OnGetCharacterReadOnlyDataRequestEvent != null) { _instance.OnGetCharacterReadOnlyDataRequestEvent((ClientModels.GetCharacterDataRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetCharacterStatisticsRequest)) { if (_instance.OnGetCharacterStatisticsRequestEvent != null) { _instance.OnGetCharacterStatisticsRequestEvent((ClientModels.GetCharacterStatisticsRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetContentDownloadUrlRequest)) { if (_instance.OnGetContentDownloadUrlRequestEvent != null) { _instance.OnGetContentDownloadUrlRequestEvent((ClientModels.GetContentDownloadUrlRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetFriendLeaderboardRequest)) { if (_instance.OnGetFriendLeaderboardRequestEvent != null) { _instance.OnGetFriendLeaderboardRequestEvent((ClientModels.GetFriendLeaderboardRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetFriendLeaderboardAroundPlayerRequest)) { if (_instance.OnGetFriendLeaderboardAroundPlayerRequestEvent != null) { _instance.OnGetFriendLeaderboardAroundPlayerRequestEvent((ClientModels.GetFriendLeaderboardAroundPlayerRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetFriendsListRequest)) { if (_instance.OnGetFriendsListRequestEvent != null) { _instance.OnGetFriendsListRequestEvent((ClientModels.GetFriendsListRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetLeaderboardRequest)) { if (_instance.OnGetLeaderboardRequestEvent != null) { _instance.OnGetLeaderboardRequestEvent((ClientModels.GetLeaderboardRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetLeaderboardAroundCharacterRequest)) { if (_instance.OnGetLeaderboardAroundCharacterRequestEvent != null) { _instance.OnGetLeaderboardAroundCharacterRequestEvent((ClientModels.GetLeaderboardAroundCharacterRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetLeaderboardAroundPlayerRequest)) { if (_instance.OnGetLeaderboardAroundPlayerRequestEvent != null) { _instance.OnGetLeaderboardAroundPlayerRequestEvent((ClientModels.GetLeaderboardAroundPlayerRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetLeaderboardForUsersCharactersRequest)) { if (_instance.OnGetLeaderboardForUserCharactersRequestEvent != null) { _instance.OnGetLeaderboardForUserCharactersRequestEvent((ClientModels.GetLeaderboardForUsersCharactersRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetPaymentTokenRequest)) { if (_instance.OnGetPaymentTokenRequestEvent != null) { _instance.OnGetPaymentTokenRequestEvent((ClientModels.GetPaymentTokenRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetPhotonAuthenticationTokenRequest)) { if (_instance.OnGetPhotonAuthenticationTokenRequestEvent != null) { _instance.OnGetPhotonAuthenticationTokenRequestEvent((ClientModels.GetPhotonAuthenticationTokenRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetPlayerCombinedInfoRequest)) { if (_instance.OnGetPlayerCombinedInfoRequestEvent != null) { _instance.OnGetPlayerCombinedInfoRequestEvent((ClientModels.GetPlayerCombinedInfoRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetPlayerProfileRequest)) { if (_instance.OnGetPlayerProfileRequestEvent != null) { _instance.OnGetPlayerProfileRequestEvent((ClientModels.GetPlayerProfileRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetPlayerSegmentsRequest)) { if (_instance.OnGetPlayerSegmentsRequestEvent != null) { _instance.OnGetPlayerSegmentsRequestEvent((ClientModels.GetPlayerSegmentsRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetPlayerStatisticsRequest)) { if (_instance.OnGetPlayerStatisticsRequestEvent != null) { _instance.OnGetPlayerStatisticsRequestEvent((ClientModels.GetPlayerStatisticsRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetPlayerStatisticVersionsRequest)) { if (_instance.OnGetPlayerStatisticVersionsRequestEvent != null) { _instance.OnGetPlayerStatisticVersionsRequestEvent((ClientModels.GetPlayerStatisticVersionsRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetPlayerTagsRequest)) { if (_instance.OnGetPlayerTagsRequestEvent != null) { _instance.OnGetPlayerTagsRequestEvent((ClientModels.GetPlayerTagsRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetPlayerTradesRequest)) { if (_instance.OnGetPlayerTradesRequestEvent != null) { _instance.OnGetPlayerTradesRequestEvent((ClientModels.GetPlayerTradesRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetPlayFabIDsFromFacebookIDsRequest)) { if (_instance.OnGetPlayFabIDsFromFacebookIDsRequestEvent != null) { _instance.OnGetPlayFabIDsFromFacebookIDsRequestEvent((ClientModels.GetPlayFabIDsFromFacebookIDsRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetPlayFabIDsFromFacebookInstantGamesIdsRequest)) { if (_instance.OnGetPlayFabIDsFromFacebookInstantGamesIdsRequestEvent != null) { _instance.OnGetPlayFabIDsFromFacebookInstantGamesIdsRequestEvent((ClientModels.GetPlayFabIDsFromFacebookInstantGamesIdsRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetPlayFabIDsFromGameCenterIDsRequest)) { if (_instance.OnGetPlayFabIDsFromGameCenterIDsRequestEvent != null) { _instance.OnGetPlayFabIDsFromGameCenterIDsRequestEvent((ClientModels.GetPlayFabIDsFromGameCenterIDsRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetPlayFabIDsFromGenericIDsRequest)) { if (_instance.OnGetPlayFabIDsFromGenericIDsRequestEvent != null) { _instance.OnGetPlayFabIDsFromGenericIDsRequestEvent((ClientModels.GetPlayFabIDsFromGenericIDsRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetPlayFabIDsFromGoogleIDsRequest)) { if (_instance.OnGetPlayFabIDsFromGoogleIDsRequestEvent != null) { _instance.OnGetPlayFabIDsFromGoogleIDsRequestEvent((ClientModels.GetPlayFabIDsFromGoogleIDsRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetPlayFabIDsFromGooglePlayGamesPlayerIDsRequest)) { if (_instance.OnGetPlayFabIDsFromGooglePlayGamesPlayerIDsRequestEvent != null) { _instance.OnGetPlayFabIDsFromGooglePlayGamesPlayerIDsRequestEvent((ClientModels.GetPlayFabIDsFromGooglePlayGamesPlayerIDsRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetPlayFabIDsFromKongregateIDsRequest)) { if (_instance.OnGetPlayFabIDsFromKongregateIDsRequestEvent != null) { _instance.OnGetPlayFabIDsFromKongregateIDsRequestEvent((ClientModels.GetPlayFabIDsFromKongregateIDsRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetPlayFabIDsFromNintendoServiceAccountIdsRequest)) { if (_instance.OnGetPlayFabIDsFromNintendoServiceAccountIdsRequestEvent != null) { _instance.OnGetPlayFabIDsFromNintendoServiceAccountIdsRequestEvent((ClientModels.GetPlayFabIDsFromNintendoServiceAccountIdsRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetPlayFabIDsFromNintendoSwitchDeviceIdsRequest)) { if (_instance.OnGetPlayFabIDsFromNintendoSwitchDeviceIdsRequestEvent != null) { _instance.OnGetPlayFabIDsFromNintendoSwitchDeviceIdsRequestEvent((ClientModels.GetPlayFabIDsFromNintendoSwitchDeviceIdsRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetPlayFabIDsFromPSNAccountIDsRequest)) { if (_instance.OnGetPlayFabIDsFromPSNAccountIDsRequestEvent != null) { _instance.OnGetPlayFabIDsFromPSNAccountIDsRequestEvent((ClientModels.GetPlayFabIDsFromPSNAccountIDsRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetPlayFabIDsFromPSNOnlineIDsRequest)) { if (_instance.OnGetPlayFabIDsFromPSNOnlineIDsRequestEvent != null) { _instance.OnGetPlayFabIDsFromPSNOnlineIDsRequestEvent((ClientModels.GetPlayFabIDsFromPSNOnlineIDsRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetPlayFabIDsFromSteamIDsRequest)) { if (_instance.OnGetPlayFabIDsFromSteamIDsRequestEvent != null) { _instance.OnGetPlayFabIDsFromSteamIDsRequestEvent((ClientModels.GetPlayFabIDsFromSteamIDsRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetPlayFabIDsFromTwitchIDsRequest)) { if (_instance.OnGetPlayFabIDsFromTwitchIDsRequestEvent != null) { _instance.OnGetPlayFabIDsFromTwitchIDsRequestEvent((ClientModels.GetPlayFabIDsFromTwitchIDsRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetPlayFabIDsFromXboxLiveIDsRequest)) { if (_instance.OnGetPlayFabIDsFromXboxLiveIDsRequestEvent != null) { _instance.OnGetPlayFabIDsFromXboxLiveIDsRequestEvent((ClientModels.GetPlayFabIDsFromXboxLiveIDsRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetPublisherDataRequest)) { if (_instance.OnGetPublisherDataRequestEvent != null) { _instance.OnGetPublisherDataRequestEvent((ClientModels.GetPublisherDataRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetPurchaseRequest)) { if (_instance.OnGetPurchaseRequestEvent != null) { _instance.OnGetPurchaseRequestEvent((ClientModels.GetPurchaseRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetSharedGroupDataRequest)) { if (_instance.OnGetSharedGroupDataRequestEvent != null) { _instance.OnGetSharedGroupDataRequestEvent((ClientModels.GetSharedGroupDataRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetStoreItemsRequest)) { if (_instance.OnGetStoreItemsRequestEvent != null) { _instance.OnGetStoreItemsRequestEvent((ClientModels.GetStoreItemsRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetTimeRequest)) { if (_instance.OnGetTimeRequestEvent != null) { _instance.OnGetTimeRequestEvent((ClientModels.GetTimeRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetTitleDataRequest)) { if (_instance.OnGetTitleDataRequestEvent != null) { _instance.OnGetTitleDataRequestEvent((ClientModels.GetTitleDataRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetTitleNewsRequest)) { if (_instance.OnGetTitleNewsRequestEvent != null) { _instance.OnGetTitleNewsRequestEvent((ClientModels.GetTitleNewsRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetTitlePublicKeyRequest)) { if (_instance.OnGetTitlePublicKeyRequestEvent != null) { _instance.OnGetTitlePublicKeyRequestEvent((ClientModels.GetTitlePublicKeyRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetTradeStatusRequest)) { if (_instance.OnGetTradeStatusRequestEvent != null) { _instance.OnGetTradeStatusRequestEvent((ClientModels.GetTradeStatusRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetUserDataRequest)) { if (_instance.OnGetUserDataRequestEvent != null) { _instance.OnGetUserDataRequestEvent((ClientModels.GetUserDataRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetUserInventoryRequest)) { if (_instance.OnGetUserInventoryRequestEvent != null) { _instance.OnGetUserInventoryRequestEvent((ClientModels.GetUserInventoryRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetUserDataRequest)) { if (_instance.OnGetUserPublisherDataRequestEvent != null) { _instance.OnGetUserPublisherDataRequestEvent((ClientModels.GetUserDataRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetUserDataRequest)) { if (_instance.OnGetUserPublisherReadOnlyDataRequestEvent != null) { _instance.OnGetUserPublisherReadOnlyDataRequestEvent((ClientModels.GetUserDataRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetUserDataRequest)) { if (_instance.OnGetUserReadOnlyDataRequestEvent != null) { _instance.OnGetUserReadOnlyDataRequestEvent((ClientModels.GetUserDataRequest)e.Request); return; } } + if (type == typeof(ClientModels.GrantCharacterToUserRequest)) { if (_instance.OnGrantCharacterToUserRequestEvent != null) { _instance.OnGrantCharacterToUserRequestEvent((ClientModels.GrantCharacterToUserRequest)e.Request); return; } } + if (type == typeof(ClientModels.LinkAndroidDeviceIDRequest)) { if (_instance.OnLinkAndroidDeviceIDRequestEvent != null) { _instance.OnLinkAndroidDeviceIDRequestEvent((ClientModels.LinkAndroidDeviceIDRequest)e.Request); return; } } + if (type == typeof(ClientModels.LinkAppleRequest)) { if (_instance.OnLinkAppleRequestEvent != null) { _instance.OnLinkAppleRequestEvent((ClientModels.LinkAppleRequest)e.Request); return; } } + if (type == typeof(ClientModels.LinkCustomIDRequest)) { if (_instance.OnLinkCustomIDRequestEvent != null) { _instance.OnLinkCustomIDRequestEvent((ClientModels.LinkCustomIDRequest)e.Request); return; } } + if (type == typeof(ClientModels.LinkFacebookAccountRequest)) { if (_instance.OnLinkFacebookAccountRequestEvent != null) { _instance.OnLinkFacebookAccountRequestEvent((ClientModels.LinkFacebookAccountRequest)e.Request); return; } } + if (type == typeof(ClientModels.LinkFacebookInstantGamesIdRequest)) { if (_instance.OnLinkFacebookInstantGamesIdRequestEvent != null) { _instance.OnLinkFacebookInstantGamesIdRequestEvent((ClientModels.LinkFacebookInstantGamesIdRequest)e.Request); return; } } + if (type == typeof(ClientModels.LinkGameCenterAccountRequest)) { if (_instance.OnLinkGameCenterAccountRequestEvent != null) { _instance.OnLinkGameCenterAccountRequestEvent((ClientModels.LinkGameCenterAccountRequest)e.Request); return; } } + if (type == typeof(ClientModels.LinkGoogleAccountRequest)) { if (_instance.OnLinkGoogleAccountRequestEvent != null) { _instance.OnLinkGoogleAccountRequestEvent((ClientModels.LinkGoogleAccountRequest)e.Request); return; } } + if (type == typeof(ClientModels.LinkGooglePlayGamesServicesAccountRequest)) { if (_instance.OnLinkGooglePlayGamesServicesAccountRequestEvent != null) { _instance.OnLinkGooglePlayGamesServicesAccountRequestEvent((ClientModels.LinkGooglePlayGamesServicesAccountRequest)e.Request); return; } } + if (type == typeof(ClientModels.LinkIOSDeviceIDRequest)) { if (_instance.OnLinkIOSDeviceIDRequestEvent != null) { _instance.OnLinkIOSDeviceIDRequestEvent((ClientModels.LinkIOSDeviceIDRequest)e.Request); return; } } + if (type == typeof(ClientModels.LinkKongregateAccountRequest)) { if (_instance.OnLinkKongregateRequestEvent != null) { _instance.OnLinkKongregateRequestEvent((ClientModels.LinkKongregateAccountRequest)e.Request); return; } } + if (type == typeof(ClientModels.LinkNintendoServiceAccountRequest)) { if (_instance.OnLinkNintendoServiceAccountRequestEvent != null) { _instance.OnLinkNintendoServiceAccountRequestEvent((ClientModels.LinkNintendoServiceAccountRequest)e.Request); return; } } + if (type == typeof(ClientModels.LinkNintendoSwitchDeviceIdRequest)) { if (_instance.OnLinkNintendoSwitchDeviceIdRequestEvent != null) { _instance.OnLinkNintendoSwitchDeviceIdRequestEvent((ClientModels.LinkNintendoSwitchDeviceIdRequest)e.Request); return; } } + if (type == typeof(ClientModels.LinkOpenIdConnectRequest)) { if (_instance.OnLinkOpenIdConnectRequestEvent != null) { _instance.OnLinkOpenIdConnectRequestEvent((ClientModels.LinkOpenIdConnectRequest)e.Request); return; } } + if (type == typeof(ClientModels.LinkPSNAccountRequest)) { if (_instance.OnLinkPSNAccountRequestEvent != null) { _instance.OnLinkPSNAccountRequestEvent((ClientModels.LinkPSNAccountRequest)e.Request); return; } } + if (type == typeof(ClientModels.LinkSteamAccountRequest)) { if (_instance.OnLinkSteamAccountRequestEvent != null) { _instance.OnLinkSteamAccountRequestEvent((ClientModels.LinkSteamAccountRequest)e.Request); return; } } + if (type == typeof(ClientModels.LinkTwitchAccountRequest)) { if (_instance.OnLinkTwitchRequestEvent != null) { _instance.OnLinkTwitchRequestEvent((ClientModels.LinkTwitchAccountRequest)e.Request); return; } } + if (type == typeof(ClientModels.LinkXboxAccountRequest)) { if (_instance.OnLinkXboxAccountRequestEvent != null) { _instance.OnLinkXboxAccountRequestEvent((ClientModels.LinkXboxAccountRequest)e.Request); return; } } + if (type == typeof(ClientModels.LoginWithAndroidDeviceIDRequest)) { if (_instance.OnLoginWithAndroidDeviceIDRequestEvent != null) { _instance.OnLoginWithAndroidDeviceIDRequestEvent((ClientModels.LoginWithAndroidDeviceIDRequest)e.Request); return; } } + if (type == typeof(ClientModels.LoginWithAppleRequest)) { if (_instance.OnLoginWithAppleRequestEvent != null) { _instance.OnLoginWithAppleRequestEvent((ClientModels.LoginWithAppleRequest)e.Request); return; } } + if (type == typeof(ClientModels.LoginWithCustomIDRequest)) { if (_instance.OnLoginWithCustomIDRequestEvent != null) { _instance.OnLoginWithCustomIDRequestEvent((ClientModels.LoginWithCustomIDRequest)e.Request); return; } } + if (type == typeof(ClientModels.LoginWithEmailAddressRequest)) { if (_instance.OnLoginWithEmailAddressRequestEvent != null) { _instance.OnLoginWithEmailAddressRequestEvent((ClientModels.LoginWithEmailAddressRequest)e.Request); return; } } + if (type == typeof(ClientModels.LoginWithFacebookRequest)) { if (_instance.OnLoginWithFacebookRequestEvent != null) { _instance.OnLoginWithFacebookRequestEvent((ClientModels.LoginWithFacebookRequest)e.Request); return; } } + if (type == typeof(ClientModels.LoginWithFacebookInstantGamesIdRequest)) { if (_instance.OnLoginWithFacebookInstantGamesIdRequestEvent != null) { _instance.OnLoginWithFacebookInstantGamesIdRequestEvent((ClientModels.LoginWithFacebookInstantGamesIdRequest)e.Request); return; } } + if (type == typeof(ClientModels.LoginWithGameCenterRequest)) { if (_instance.OnLoginWithGameCenterRequestEvent != null) { _instance.OnLoginWithGameCenterRequestEvent((ClientModels.LoginWithGameCenterRequest)e.Request); return; } } + if (type == typeof(ClientModels.LoginWithGoogleAccountRequest)) { if (_instance.OnLoginWithGoogleAccountRequestEvent != null) { _instance.OnLoginWithGoogleAccountRequestEvent((ClientModels.LoginWithGoogleAccountRequest)e.Request); return; } } + if (type == typeof(ClientModels.LoginWithGooglePlayGamesServicesRequest)) { if (_instance.OnLoginWithGooglePlayGamesServicesRequestEvent != null) { _instance.OnLoginWithGooglePlayGamesServicesRequestEvent((ClientModels.LoginWithGooglePlayGamesServicesRequest)e.Request); return; } } + if (type == typeof(ClientModels.LoginWithIOSDeviceIDRequest)) { if (_instance.OnLoginWithIOSDeviceIDRequestEvent != null) { _instance.OnLoginWithIOSDeviceIDRequestEvent((ClientModels.LoginWithIOSDeviceIDRequest)e.Request); return; } } + if (type == typeof(ClientModels.LoginWithKongregateRequest)) { if (_instance.OnLoginWithKongregateRequestEvent != null) { _instance.OnLoginWithKongregateRequestEvent((ClientModels.LoginWithKongregateRequest)e.Request); return; } } + if (type == typeof(ClientModels.LoginWithNintendoServiceAccountRequest)) { if (_instance.OnLoginWithNintendoServiceAccountRequestEvent != null) { _instance.OnLoginWithNintendoServiceAccountRequestEvent((ClientModels.LoginWithNintendoServiceAccountRequest)e.Request); return; } } + if (type == typeof(ClientModels.LoginWithNintendoSwitchDeviceIdRequest)) { if (_instance.OnLoginWithNintendoSwitchDeviceIdRequestEvent != null) { _instance.OnLoginWithNintendoSwitchDeviceIdRequestEvent((ClientModels.LoginWithNintendoSwitchDeviceIdRequest)e.Request); return; } } + if (type == typeof(ClientModels.LoginWithOpenIdConnectRequest)) { if (_instance.OnLoginWithOpenIdConnectRequestEvent != null) { _instance.OnLoginWithOpenIdConnectRequestEvent((ClientModels.LoginWithOpenIdConnectRequest)e.Request); return; } } + if (type == typeof(ClientModels.LoginWithPlayFabRequest)) { if (_instance.OnLoginWithPlayFabRequestEvent != null) { _instance.OnLoginWithPlayFabRequestEvent((ClientModels.LoginWithPlayFabRequest)e.Request); return; } } + if (type == typeof(ClientModels.LoginWithPSNRequest)) { if (_instance.OnLoginWithPSNRequestEvent != null) { _instance.OnLoginWithPSNRequestEvent((ClientModels.LoginWithPSNRequest)e.Request); return; } } + if (type == typeof(ClientModels.LoginWithSteamRequest)) { if (_instance.OnLoginWithSteamRequestEvent != null) { _instance.OnLoginWithSteamRequestEvent((ClientModels.LoginWithSteamRequest)e.Request); return; } } + if (type == typeof(ClientModels.LoginWithTwitchRequest)) { if (_instance.OnLoginWithTwitchRequestEvent != null) { _instance.OnLoginWithTwitchRequestEvent((ClientModels.LoginWithTwitchRequest)e.Request); return; } } + if (type == typeof(ClientModels.LoginWithXboxRequest)) { if (_instance.OnLoginWithXboxRequestEvent != null) { _instance.OnLoginWithXboxRequestEvent((ClientModels.LoginWithXboxRequest)e.Request); return; } } + if (type == typeof(ClientModels.OpenTradeRequest)) { if (_instance.OnOpenTradeRequestEvent != null) { _instance.OnOpenTradeRequestEvent((ClientModels.OpenTradeRequest)e.Request); return; } } + if (type == typeof(ClientModels.PayForPurchaseRequest)) { if (_instance.OnPayForPurchaseRequestEvent != null) { _instance.OnPayForPurchaseRequestEvent((ClientModels.PayForPurchaseRequest)e.Request); return; } } + if (type == typeof(ClientModels.PurchaseItemRequest)) { if (_instance.OnPurchaseItemRequestEvent != null) { _instance.OnPurchaseItemRequestEvent((ClientModels.PurchaseItemRequest)e.Request); return; } } + if (type == typeof(ClientModels.RedeemCouponRequest)) { if (_instance.OnRedeemCouponRequestEvent != null) { _instance.OnRedeemCouponRequestEvent((ClientModels.RedeemCouponRequest)e.Request); return; } } + if (type == typeof(ClientModels.RefreshPSNAuthTokenRequest)) { if (_instance.OnRefreshPSNAuthTokenRequestEvent != null) { _instance.OnRefreshPSNAuthTokenRequestEvent((ClientModels.RefreshPSNAuthTokenRequest)e.Request); return; } } + if (type == typeof(ClientModels.RegisterForIOSPushNotificationRequest)) { if (_instance.OnRegisterForIOSPushNotificationRequestEvent != null) { _instance.OnRegisterForIOSPushNotificationRequestEvent((ClientModels.RegisterForIOSPushNotificationRequest)e.Request); return; } } + if (type == typeof(ClientModels.RegisterPlayFabUserRequest)) { if (_instance.OnRegisterPlayFabUserRequestEvent != null) { _instance.OnRegisterPlayFabUserRequestEvent((ClientModels.RegisterPlayFabUserRequest)e.Request); return; } } + if (type == typeof(ClientModels.RemoveContactEmailRequest)) { if (_instance.OnRemoveContactEmailRequestEvent != null) { _instance.OnRemoveContactEmailRequestEvent((ClientModels.RemoveContactEmailRequest)e.Request); return; } } + if (type == typeof(ClientModels.RemoveFriendRequest)) { if (_instance.OnRemoveFriendRequestEvent != null) { _instance.OnRemoveFriendRequestEvent((ClientModels.RemoveFriendRequest)e.Request); return; } } + if (type == typeof(ClientModels.RemoveGenericIDRequest)) { if (_instance.OnRemoveGenericIDRequestEvent != null) { _instance.OnRemoveGenericIDRequestEvent((ClientModels.RemoveGenericIDRequest)e.Request); return; } } + if (type == typeof(ClientModels.RemoveSharedGroupMembersRequest)) { if (_instance.OnRemoveSharedGroupMembersRequestEvent != null) { _instance.OnRemoveSharedGroupMembersRequestEvent((ClientModels.RemoveSharedGroupMembersRequest)e.Request); return; } } + if (type == typeof(ClientModels.ReportAdActivityRequest)) { if (_instance.OnReportAdActivityRequestEvent != null) { _instance.OnReportAdActivityRequestEvent((ClientModels.ReportAdActivityRequest)e.Request); return; } } + if (type == typeof(ClientModels.DeviceInfoRequest)) { if (_instance.OnReportDeviceInfoRequestEvent != null) { _instance.OnReportDeviceInfoRequestEvent((ClientModels.DeviceInfoRequest)e.Request); return; } } + if (type == typeof(ClientModels.ReportPlayerClientRequest)) { if (_instance.OnReportPlayerRequestEvent != null) { _instance.OnReportPlayerRequestEvent((ClientModels.ReportPlayerClientRequest)e.Request); return; } } + if (type == typeof(ClientModels.RestoreIOSPurchasesRequest)) { if (_instance.OnRestoreIOSPurchasesRequestEvent != null) { _instance.OnRestoreIOSPurchasesRequestEvent((ClientModels.RestoreIOSPurchasesRequest)e.Request); return; } } + if (type == typeof(ClientModels.RewardAdActivityRequest)) { if (_instance.OnRewardAdActivityRequestEvent != null) { _instance.OnRewardAdActivityRequestEvent((ClientModels.RewardAdActivityRequest)e.Request); return; } } + if (type == typeof(ClientModels.SendAccountRecoveryEmailRequest)) { if (_instance.OnSendAccountRecoveryEmailRequestEvent != null) { _instance.OnSendAccountRecoveryEmailRequestEvent((ClientModels.SendAccountRecoveryEmailRequest)e.Request); return; } } + if (type == typeof(ClientModels.SetFriendTagsRequest)) { if (_instance.OnSetFriendTagsRequestEvent != null) { _instance.OnSetFriendTagsRequestEvent((ClientModels.SetFriendTagsRequest)e.Request); return; } } + if (type == typeof(ClientModels.SetPlayerSecretRequest)) { if (_instance.OnSetPlayerSecretRequestEvent != null) { _instance.OnSetPlayerSecretRequestEvent((ClientModels.SetPlayerSecretRequest)e.Request); return; } } + if (type == typeof(ClientModels.StartPurchaseRequest)) { if (_instance.OnStartPurchaseRequestEvent != null) { _instance.OnStartPurchaseRequestEvent((ClientModels.StartPurchaseRequest)e.Request); return; } } + if (type == typeof(ClientModels.SubtractUserVirtualCurrencyRequest)) { if (_instance.OnSubtractUserVirtualCurrencyRequestEvent != null) { _instance.OnSubtractUserVirtualCurrencyRequestEvent((ClientModels.SubtractUserVirtualCurrencyRequest)e.Request); return; } } + if (type == typeof(ClientModels.UnlinkAndroidDeviceIDRequest)) { if (_instance.OnUnlinkAndroidDeviceIDRequestEvent != null) { _instance.OnUnlinkAndroidDeviceIDRequestEvent((ClientModels.UnlinkAndroidDeviceIDRequest)e.Request); return; } } + if (type == typeof(ClientModels.UnlinkAppleRequest)) { if (_instance.OnUnlinkAppleRequestEvent != null) { _instance.OnUnlinkAppleRequestEvent((ClientModels.UnlinkAppleRequest)e.Request); return; } } + if (type == typeof(ClientModels.UnlinkCustomIDRequest)) { if (_instance.OnUnlinkCustomIDRequestEvent != null) { _instance.OnUnlinkCustomIDRequestEvent((ClientModels.UnlinkCustomIDRequest)e.Request); return; } } + if (type == typeof(ClientModels.UnlinkFacebookAccountRequest)) { if (_instance.OnUnlinkFacebookAccountRequestEvent != null) { _instance.OnUnlinkFacebookAccountRequestEvent((ClientModels.UnlinkFacebookAccountRequest)e.Request); return; } } + if (type == typeof(ClientModels.UnlinkFacebookInstantGamesIdRequest)) { if (_instance.OnUnlinkFacebookInstantGamesIdRequestEvent != null) { _instance.OnUnlinkFacebookInstantGamesIdRequestEvent((ClientModels.UnlinkFacebookInstantGamesIdRequest)e.Request); return; } } + if (type == typeof(ClientModels.UnlinkGameCenterAccountRequest)) { if (_instance.OnUnlinkGameCenterAccountRequestEvent != null) { _instance.OnUnlinkGameCenterAccountRequestEvent((ClientModels.UnlinkGameCenterAccountRequest)e.Request); return; } } + if (type == typeof(ClientModels.UnlinkGoogleAccountRequest)) { if (_instance.OnUnlinkGoogleAccountRequestEvent != null) { _instance.OnUnlinkGoogleAccountRequestEvent((ClientModels.UnlinkGoogleAccountRequest)e.Request); return; } } + if (type == typeof(ClientModels.UnlinkGooglePlayGamesServicesAccountRequest)) { if (_instance.OnUnlinkGooglePlayGamesServicesAccountRequestEvent != null) { _instance.OnUnlinkGooglePlayGamesServicesAccountRequestEvent((ClientModels.UnlinkGooglePlayGamesServicesAccountRequest)e.Request); return; } } + if (type == typeof(ClientModels.UnlinkIOSDeviceIDRequest)) { if (_instance.OnUnlinkIOSDeviceIDRequestEvent != null) { _instance.OnUnlinkIOSDeviceIDRequestEvent((ClientModels.UnlinkIOSDeviceIDRequest)e.Request); return; } } + if (type == typeof(ClientModels.UnlinkKongregateAccountRequest)) { if (_instance.OnUnlinkKongregateRequestEvent != null) { _instance.OnUnlinkKongregateRequestEvent((ClientModels.UnlinkKongregateAccountRequest)e.Request); return; } } + if (type == typeof(ClientModels.UnlinkNintendoServiceAccountRequest)) { if (_instance.OnUnlinkNintendoServiceAccountRequestEvent != null) { _instance.OnUnlinkNintendoServiceAccountRequestEvent((ClientModels.UnlinkNintendoServiceAccountRequest)e.Request); return; } } + if (type == typeof(ClientModels.UnlinkNintendoSwitchDeviceIdRequest)) { if (_instance.OnUnlinkNintendoSwitchDeviceIdRequestEvent != null) { _instance.OnUnlinkNintendoSwitchDeviceIdRequestEvent((ClientModels.UnlinkNintendoSwitchDeviceIdRequest)e.Request); return; } } + if (type == typeof(ClientModels.UnlinkOpenIdConnectRequest)) { if (_instance.OnUnlinkOpenIdConnectRequestEvent != null) { _instance.OnUnlinkOpenIdConnectRequestEvent((ClientModels.UnlinkOpenIdConnectRequest)e.Request); return; } } + if (type == typeof(ClientModels.UnlinkPSNAccountRequest)) { if (_instance.OnUnlinkPSNAccountRequestEvent != null) { _instance.OnUnlinkPSNAccountRequestEvent((ClientModels.UnlinkPSNAccountRequest)e.Request); return; } } + if (type == typeof(ClientModels.UnlinkSteamAccountRequest)) { if (_instance.OnUnlinkSteamAccountRequestEvent != null) { _instance.OnUnlinkSteamAccountRequestEvent((ClientModels.UnlinkSteamAccountRequest)e.Request); return; } } + if (type == typeof(ClientModels.UnlinkTwitchAccountRequest)) { if (_instance.OnUnlinkTwitchRequestEvent != null) { _instance.OnUnlinkTwitchRequestEvent((ClientModels.UnlinkTwitchAccountRequest)e.Request); return; } } + if (type == typeof(ClientModels.UnlinkXboxAccountRequest)) { if (_instance.OnUnlinkXboxAccountRequestEvent != null) { _instance.OnUnlinkXboxAccountRequestEvent((ClientModels.UnlinkXboxAccountRequest)e.Request); return; } } + if (type == typeof(ClientModels.UnlockContainerInstanceRequest)) { if (_instance.OnUnlockContainerInstanceRequestEvent != null) { _instance.OnUnlockContainerInstanceRequestEvent((ClientModels.UnlockContainerInstanceRequest)e.Request); return; } } + if (type == typeof(ClientModels.UnlockContainerItemRequest)) { if (_instance.OnUnlockContainerItemRequestEvent != null) { _instance.OnUnlockContainerItemRequestEvent((ClientModels.UnlockContainerItemRequest)e.Request); return; } } + if (type == typeof(ClientModels.UpdateAvatarUrlRequest)) { if (_instance.OnUpdateAvatarUrlRequestEvent != null) { _instance.OnUpdateAvatarUrlRequestEvent((ClientModels.UpdateAvatarUrlRequest)e.Request); return; } } + if (type == typeof(ClientModels.UpdateCharacterDataRequest)) { if (_instance.OnUpdateCharacterDataRequestEvent != null) { _instance.OnUpdateCharacterDataRequestEvent((ClientModels.UpdateCharacterDataRequest)e.Request); return; } } + if (type == typeof(ClientModels.UpdateCharacterStatisticsRequest)) { if (_instance.OnUpdateCharacterStatisticsRequestEvent != null) { _instance.OnUpdateCharacterStatisticsRequestEvent((ClientModels.UpdateCharacterStatisticsRequest)e.Request); return; } } + if (type == typeof(ClientModels.UpdatePlayerStatisticsRequest)) { if (_instance.OnUpdatePlayerStatisticsRequestEvent != null) { _instance.OnUpdatePlayerStatisticsRequestEvent((ClientModels.UpdatePlayerStatisticsRequest)e.Request); return; } } + if (type == typeof(ClientModels.UpdateSharedGroupDataRequest)) { if (_instance.OnUpdateSharedGroupDataRequestEvent != null) { _instance.OnUpdateSharedGroupDataRequestEvent((ClientModels.UpdateSharedGroupDataRequest)e.Request); return; } } + if (type == typeof(ClientModels.UpdateUserDataRequest)) { if (_instance.OnUpdateUserDataRequestEvent != null) { _instance.OnUpdateUserDataRequestEvent((ClientModels.UpdateUserDataRequest)e.Request); return; } } + if (type == typeof(ClientModels.UpdateUserDataRequest)) { if (_instance.OnUpdateUserPublisherDataRequestEvent != null) { _instance.OnUpdateUserPublisherDataRequestEvent((ClientModels.UpdateUserDataRequest)e.Request); return; } } + if (type == typeof(ClientModels.UpdateUserTitleDisplayNameRequest)) { if (_instance.OnUpdateUserTitleDisplayNameRequestEvent != null) { _instance.OnUpdateUserTitleDisplayNameRequestEvent((ClientModels.UpdateUserTitleDisplayNameRequest)e.Request); return; } } + if (type == typeof(ClientModels.ValidateAmazonReceiptRequest)) { if (_instance.OnValidateAmazonIAPReceiptRequestEvent != null) { _instance.OnValidateAmazonIAPReceiptRequestEvent((ClientModels.ValidateAmazonReceiptRequest)e.Request); return; } } + if (type == typeof(ClientModels.ValidateGooglePlayPurchaseRequest)) { if (_instance.OnValidateGooglePlayPurchaseRequestEvent != null) { _instance.OnValidateGooglePlayPurchaseRequestEvent((ClientModels.ValidateGooglePlayPurchaseRequest)e.Request); return; } } + if (type == typeof(ClientModels.ValidateIOSReceiptRequest)) { if (_instance.OnValidateIOSReceiptRequestEvent != null) { _instance.OnValidateIOSReceiptRequestEvent((ClientModels.ValidateIOSReceiptRequest)e.Request); return; } } + if (type == typeof(ClientModels.ValidateWindowsReceiptRequest)) { if (_instance.OnValidateWindowsStoreReceiptRequestEvent != null) { _instance.OnValidateWindowsStoreReceiptRequestEvent((ClientModels.ValidateWindowsReceiptRequest)e.Request); return; } } + if (type == typeof(ClientModels.WriteClientCharacterEventRequest)) { if (_instance.OnWriteCharacterEventRequestEvent != null) { _instance.OnWriteCharacterEventRequestEvent((ClientModels.WriteClientCharacterEventRequest)e.Request); return; } } + if (type == typeof(ClientModels.WriteClientPlayerEventRequest)) { if (_instance.OnWritePlayerEventRequestEvent != null) { _instance.OnWritePlayerEventRequestEvent((ClientModels.WriteClientPlayerEventRequest)e.Request); return; } } + if (type == typeof(ClientModels.WriteTitleEventRequest)) { if (_instance.OnWriteTitleEventRequestEvent != null) { _instance.OnWriteTitleEventRequestEvent((ClientModels.WriteTitleEventRequest)e.Request); return; } } +#endif +#if ENABLE_PLAYFABSERVER_API + if (type == typeof(ServerModels.AddCharacterVirtualCurrencyRequest)) { if (_instance.OnServerAddCharacterVirtualCurrencyRequestEvent != null) { _instance.OnServerAddCharacterVirtualCurrencyRequestEvent((ServerModels.AddCharacterVirtualCurrencyRequest)e.Request); return; } } + if (type == typeof(ServerModels.AddFriendRequest)) { if (_instance.OnServerAddFriendRequestEvent != null) { _instance.OnServerAddFriendRequestEvent((ServerModels.AddFriendRequest)e.Request); return; } } + if (type == typeof(ServerModels.AddGenericIDRequest)) { if (_instance.OnServerAddGenericIDRequestEvent != null) { _instance.OnServerAddGenericIDRequestEvent((ServerModels.AddGenericIDRequest)e.Request); return; } } + if (type == typeof(ServerModels.AddPlayerTagRequest)) { if (_instance.OnServerAddPlayerTagRequestEvent != null) { _instance.OnServerAddPlayerTagRequestEvent((ServerModels.AddPlayerTagRequest)e.Request); return; } } + if (type == typeof(ServerModels.AddSharedGroupMembersRequest)) { if (_instance.OnServerAddSharedGroupMembersRequestEvent != null) { _instance.OnServerAddSharedGroupMembersRequestEvent((ServerModels.AddSharedGroupMembersRequest)e.Request); return; } } + if (type == typeof(ServerModels.AddUserVirtualCurrencyRequest)) { if (_instance.OnServerAddUserVirtualCurrencyRequestEvent != null) { _instance.OnServerAddUserVirtualCurrencyRequestEvent((ServerModels.AddUserVirtualCurrencyRequest)e.Request); return; } } + if (type == typeof(ServerModels.AuthenticateSessionTicketRequest)) { if (_instance.OnServerAuthenticateSessionTicketRequestEvent != null) { _instance.OnServerAuthenticateSessionTicketRequestEvent((ServerModels.AuthenticateSessionTicketRequest)e.Request); return; } } + if (type == typeof(ServerModels.AwardSteamAchievementRequest)) { if (_instance.OnServerAwardSteamAchievementRequestEvent != null) { _instance.OnServerAwardSteamAchievementRequestEvent((ServerModels.AwardSteamAchievementRequest)e.Request); return; } } + if (type == typeof(ServerModels.BanUsersRequest)) { if (_instance.OnServerBanUsersRequestEvent != null) { _instance.OnServerBanUsersRequestEvent((ServerModels.BanUsersRequest)e.Request); return; } } + if (type == typeof(ServerModels.ConsumeItemRequest)) { if (_instance.OnServerConsumeItemRequestEvent != null) { _instance.OnServerConsumeItemRequestEvent((ServerModels.ConsumeItemRequest)e.Request); return; } } + if (type == typeof(ServerModels.CreateSharedGroupRequest)) { if (_instance.OnServerCreateSharedGroupRequestEvent != null) { _instance.OnServerCreateSharedGroupRequestEvent((ServerModels.CreateSharedGroupRequest)e.Request); return; } } + if (type == typeof(ServerModels.DeleteCharacterFromUserRequest)) { if (_instance.OnServerDeleteCharacterFromUserRequestEvent != null) { _instance.OnServerDeleteCharacterFromUserRequestEvent((ServerModels.DeleteCharacterFromUserRequest)e.Request); return; } } + if (type == typeof(ServerModels.DeletePlayerRequest)) { if (_instance.OnServerDeletePlayerRequestEvent != null) { _instance.OnServerDeletePlayerRequestEvent((ServerModels.DeletePlayerRequest)e.Request); return; } } + if (type == typeof(ServerModels.DeletePushNotificationTemplateRequest)) { if (_instance.OnServerDeletePushNotificationTemplateRequestEvent != null) { _instance.OnServerDeletePushNotificationTemplateRequestEvent((ServerModels.DeletePushNotificationTemplateRequest)e.Request); return; } } + if (type == typeof(ServerModels.DeleteSharedGroupRequest)) { if (_instance.OnServerDeleteSharedGroupRequestEvent != null) { _instance.OnServerDeleteSharedGroupRequestEvent((ServerModels.DeleteSharedGroupRequest)e.Request); return; } } + if (type == typeof(ServerModels.EvaluateRandomResultTableRequest)) { if (_instance.OnServerEvaluateRandomResultTableRequestEvent != null) { _instance.OnServerEvaluateRandomResultTableRequestEvent((ServerModels.EvaluateRandomResultTableRequest)e.Request); return; } } + if (type == typeof(ServerModels.ExecuteCloudScriptServerRequest)) { if (_instance.OnServerExecuteCloudScriptRequestEvent != null) { _instance.OnServerExecuteCloudScriptRequestEvent((ServerModels.ExecuteCloudScriptServerRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetAllSegmentsRequest)) { if (_instance.OnServerGetAllSegmentsRequestEvent != null) { _instance.OnServerGetAllSegmentsRequestEvent((ServerModels.GetAllSegmentsRequest)e.Request); return; } } + if (type == typeof(ServerModels.ListUsersCharactersRequest)) { if (_instance.OnServerGetAllUsersCharactersRequestEvent != null) { _instance.OnServerGetAllUsersCharactersRequestEvent((ServerModels.ListUsersCharactersRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetCatalogItemsRequest)) { if (_instance.OnServerGetCatalogItemsRequestEvent != null) { _instance.OnServerGetCatalogItemsRequestEvent((ServerModels.GetCatalogItemsRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetCharacterDataRequest)) { if (_instance.OnServerGetCharacterDataRequestEvent != null) { _instance.OnServerGetCharacterDataRequestEvent((ServerModels.GetCharacterDataRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetCharacterDataRequest)) { if (_instance.OnServerGetCharacterInternalDataRequestEvent != null) { _instance.OnServerGetCharacterInternalDataRequestEvent((ServerModels.GetCharacterDataRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetCharacterInventoryRequest)) { if (_instance.OnServerGetCharacterInventoryRequestEvent != null) { _instance.OnServerGetCharacterInventoryRequestEvent((ServerModels.GetCharacterInventoryRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetCharacterLeaderboardRequest)) { if (_instance.OnServerGetCharacterLeaderboardRequestEvent != null) { _instance.OnServerGetCharacterLeaderboardRequestEvent((ServerModels.GetCharacterLeaderboardRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetCharacterDataRequest)) { if (_instance.OnServerGetCharacterReadOnlyDataRequestEvent != null) { _instance.OnServerGetCharacterReadOnlyDataRequestEvent((ServerModels.GetCharacterDataRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetCharacterStatisticsRequest)) { if (_instance.OnServerGetCharacterStatisticsRequestEvent != null) { _instance.OnServerGetCharacterStatisticsRequestEvent((ServerModels.GetCharacterStatisticsRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetContentDownloadUrlRequest)) { if (_instance.OnServerGetContentDownloadUrlRequestEvent != null) { _instance.OnServerGetContentDownloadUrlRequestEvent((ServerModels.GetContentDownloadUrlRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetFriendLeaderboardRequest)) { if (_instance.OnServerGetFriendLeaderboardRequestEvent != null) { _instance.OnServerGetFriendLeaderboardRequestEvent((ServerModels.GetFriendLeaderboardRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetFriendsListRequest)) { if (_instance.OnServerGetFriendsListRequestEvent != null) { _instance.OnServerGetFriendsListRequestEvent((ServerModels.GetFriendsListRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetLeaderboardRequest)) { if (_instance.OnServerGetLeaderboardRequestEvent != null) { _instance.OnServerGetLeaderboardRequestEvent((ServerModels.GetLeaderboardRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetLeaderboardAroundCharacterRequest)) { if (_instance.OnServerGetLeaderboardAroundCharacterRequestEvent != null) { _instance.OnServerGetLeaderboardAroundCharacterRequestEvent((ServerModels.GetLeaderboardAroundCharacterRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetLeaderboardAroundUserRequest)) { if (_instance.OnServerGetLeaderboardAroundUserRequestEvent != null) { _instance.OnServerGetLeaderboardAroundUserRequestEvent((ServerModels.GetLeaderboardAroundUserRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetLeaderboardForUsersCharactersRequest)) { if (_instance.OnServerGetLeaderboardForUserCharactersRequestEvent != null) { _instance.OnServerGetLeaderboardForUserCharactersRequestEvent((ServerModels.GetLeaderboardForUsersCharactersRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetPlayerCombinedInfoRequest)) { if (_instance.OnServerGetPlayerCombinedInfoRequestEvent != null) { _instance.OnServerGetPlayerCombinedInfoRequestEvent((ServerModels.GetPlayerCombinedInfoRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetPlayerProfileRequest)) { if (_instance.OnServerGetPlayerProfileRequestEvent != null) { _instance.OnServerGetPlayerProfileRequestEvent((ServerModels.GetPlayerProfileRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetPlayersSegmentsRequest)) { if (_instance.OnServerGetPlayerSegmentsRequestEvent != null) { _instance.OnServerGetPlayerSegmentsRequestEvent((ServerModels.GetPlayersSegmentsRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetPlayersInSegmentRequest)) { if (_instance.OnServerGetPlayersInSegmentRequestEvent != null) { _instance.OnServerGetPlayersInSegmentRequestEvent((ServerModels.GetPlayersInSegmentRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetPlayerStatisticsRequest)) { if (_instance.OnServerGetPlayerStatisticsRequestEvent != null) { _instance.OnServerGetPlayerStatisticsRequestEvent((ServerModels.GetPlayerStatisticsRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetPlayerStatisticVersionsRequest)) { if (_instance.OnServerGetPlayerStatisticVersionsRequestEvent != null) { _instance.OnServerGetPlayerStatisticVersionsRequestEvent((ServerModels.GetPlayerStatisticVersionsRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetPlayerTagsRequest)) { if (_instance.OnServerGetPlayerTagsRequestEvent != null) { _instance.OnServerGetPlayerTagsRequestEvent((ServerModels.GetPlayerTagsRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetPlayFabIDsFromFacebookIDsRequest)) { if (_instance.OnServerGetPlayFabIDsFromFacebookIDsRequestEvent != null) { _instance.OnServerGetPlayFabIDsFromFacebookIDsRequestEvent((ServerModels.GetPlayFabIDsFromFacebookIDsRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetPlayFabIDsFromFacebookInstantGamesIdsRequest)) { if (_instance.OnServerGetPlayFabIDsFromFacebookInstantGamesIdsRequestEvent != null) { _instance.OnServerGetPlayFabIDsFromFacebookInstantGamesIdsRequestEvent((ServerModels.GetPlayFabIDsFromFacebookInstantGamesIdsRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetPlayFabIDsFromGenericIDsRequest)) { if (_instance.OnServerGetPlayFabIDsFromGenericIDsRequestEvent != null) { _instance.OnServerGetPlayFabIDsFromGenericIDsRequestEvent((ServerModels.GetPlayFabIDsFromGenericIDsRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetPlayFabIDsFromNintendoServiceAccountIdsRequest)) { if (_instance.OnServerGetPlayFabIDsFromNintendoServiceAccountIdsRequestEvent != null) { _instance.OnServerGetPlayFabIDsFromNintendoServiceAccountIdsRequestEvent((ServerModels.GetPlayFabIDsFromNintendoServiceAccountIdsRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetPlayFabIDsFromNintendoSwitchDeviceIdsRequest)) { if (_instance.OnServerGetPlayFabIDsFromNintendoSwitchDeviceIdsRequestEvent != null) { _instance.OnServerGetPlayFabIDsFromNintendoSwitchDeviceIdsRequestEvent((ServerModels.GetPlayFabIDsFromNintendoSwitchDeviceIdsRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetPlayFabIDsFromPSNAccountIDsRequest)) { if (_instance.OnServerGetPlayFabIDsFromPSNAccountIDsRequestEvent != null) { _instance.OnServerGetPlayFabIDsFromPSNAccountIDsRequestEvent((ServerModels.GetPlayFabIDsFromPSNAccountIDsRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetPlayFabIDsFromPSNOnlineIDsRequest)) { if (_instance.OnServerGetPlayFabIDsFromPSNOnlineIDsRequestEvent != null) { _instance.OnServerGetPlayFabIDsFromPSNOnlineIDsRequestEvent((ServerModels.GetPlayFabIDsFromPSNOnlineIDsRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetPlayFabIDsFromSteamIDsRequest)) { if (_instance.OnServerGetPlayFabIDsFromSteamIDsRequestEvent != null) { _instance.OnServerGetPlayFabIDsFromSteamIDsRequestEvent((ServerModels.GetPlayFabIDsFromSteamIDsRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetPlayFabIDsFromTwitchIDsRequest)) { if (_instance.OnServerGetPlayFabIDsFromTwitchIDsRequestEvent != null) { _instance.OnServerGetPlayFabIDsFromTwitchIDsRequestEvent((ServerModels.GetPlayFabIDsFromTwitchIDsRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetPlayFabIDsFromXboxLiveIDsRequest)) { if (_instance.OnServerGetPlayFabIDsFromXboxLiveIDsRequestEvent != null) { _instance.OnServerGetPlayFabIDsFromXboxLiveIDsRequestEvent((ServerModels.GetPlayFabIDsFromXboxLiveIDsRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetPublisherDataRequest)) { if (_instance.OnServerGetPublisherDataRequestEvent != null) { _instance.OnServerGetPublisherDataRequestEvent((ServerModels.GetPublisherDataRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetRandomResultTablesRequest)) { if (_instance.OnServerGetRandomResultTablesRequestEvent != null) { _instance.OnServerGetRandomResultTablesRequestEvent((ServerModels.GetRandomResultTablesRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetServerCustomIDsFromPlayFabIDsRequest)) { if (_instance.OnServerGetServerCustomIDsFromPlayFabIDsRequestEvent != null) { _instance.OnServerGetServerCustomIDsFromPlayFabIDsRequestEvent((ServerModels.GetServerCustomIDsFromPlayFabIDsRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetSharedGroupDataRequest)) { if (_instance.OnServerGetSharedGroupDataRequestEvent != null) { _instance.OnServerGetSharedGroupDataRequestEvent((ServerModels.GetSharedGroupDataRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetStoreItemsServerRequest)) { if (_instance.OnServerGetStoreItemsRequestEvent != null) { _instance.OnServerGetStoreItemsRequestEvent((ServerModels.GetStoreItemsServerRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetTimeRequest)) { if (_instance.OnServerGetTimeRequestEvent != null) { _instance.OnServerGetTimeRequestEvent((ServerModels.GetTimeRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetTitleDataRequest)) { if (_instance.OnServerGetTitleDataRequestEvent != null) { _instance.OnServerGetTitleDataRequestEvent((ServerModels.GetTitleDataRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetTitleDataRequest)) { if (_instance.OnServerGetTitleInternalDataRequestEvent != null) { _instance.OnServerGetTitleInternalDataRequestEvent((ServerModels.GetTitleDataRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetTitleNewsRequest)) { if (_instance.OnServerGetTitleNewsRequestEvent != null) { _instance.OnServerGetTitleNewsRequestEvent((ServerModels.GetTitleNewsRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetUserAccountInfoRequest)) { if (_instance.OnServerGetUserAccountInfoRequestEvent != null) { _instance.OnServerGetUserAccountInfoRequestEvent((ServerModels.GetUserAccountInfoRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetUserBansRequest)) { if (_instance.OnServerGetUserBansRequestEvent != null) { _instance.OnServerGetUserBansRequestEvent((ServerModels.GetUserBansRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetUserDataRequest)) { if (_instance.OnServerGetUserDataRequestEvent != null) { _instance.OnServerGetUserDataRequestEvent((ServerModels.GetUserDataRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetUserDataRequest)) { if (_instance.OnServerGetUserInternalDataRequestEvent != null) { _instance.OnServerGetUserInternalDataRequestEvent((ServerModels.GetUserDataRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetUserInventoryRequest)) { if (_instance.OnServerGetUserInventoryRequestEvent != null) { _instance.OnServerGetUserInventoryRequestEvent((ServerModels.GetUserInventoryRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetUserDataRequest)) { if (_instance.OnServerGetUserPublisherDataRequestEvent != null) { _instance.OnServerGetUserPublisherDataRequestEvent((ServerModels.GetUserDataRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetUserDataRequest)) { if (_instance.OnServerGetUserPublisherInternalDataRequestEvent != null) { _instance.OnServerGetUserPublisherInternalDataRequestEvent((ServerModels.GetUserDataRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetUserDataRequest)) { if (_instance.OnServerGetUserPublisherReadOnlyDataRequestEvent != null) { _instance.OnServerGetUserPublisherReadOnlyDataRequestEvent((ServerModels.GetUserDataRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetUserDataRequest)) { if (_instance.OnServerGetUserReadOnlyDataRequestEvent != null) { _instance.OnServerGetUserReadOnlyDataRequestEvent((ServerModels.GetUserDataRequest)e.Request); return; } } + if (type == typeof(ServerModels.GrantCharacterToUserRequest)) { if (_instance.OnServerGrantCharacterToUserRequestEvent != null) { _instance.OnServerGrantCharacterToUserRequestEvent((ServerModels.GrantCharacterToUserRequest)e.Request); return; } } + if (type == typeof(ServerModels.GrantItemsToCharacterRequest)) { if (_instance.OnServerGrantItemsToCharacterRequestEvent != null) { _instance.OnServerGrantItemsToCharacterRequestEvent((ServerModels.GrantItemsToCharacterRequest)e.Request); return; } } + if (type == typeof(ServerModels.GrantItemsToUserRequest)) { if (_instance.OnServerGrantItemsToUserRequestEvent != null) { _instance.OnServerGrantItemsToUserRequestEvent((ServerModels.GrantItemsToUserRequest)e.Request); return; } } + if (type == typeof(ServerModels.GrantItemsToUsersRequest)) { if (_instance.OnServerGrantItemsToUsersRequestEvent != null) { _instance.OnServerGrantItemsToUsersRequestEvent((ServerModels.GrantItemsToUsersRequest)e.Request); return; } } + if (type == typeof(ServerModels.LinkNintendoServiceAccountRequest)) { if (_instance.OnServerLinkNintendoServiceAccountRequestEvent != null) { _instance.OnServerLinkNintendoServiceAccountRequestEvent((ServerModels.LinkNintendoServiceAccountRequest)e.Request); return; } } + if (type == typeof(ServerModels.LinkNintendoServiceAccountSubjectRequest)) { if (_instance.OnServerLinkNintendoServiceAccountSubjectRequestEvent != null) { _instance.OnServerLinkNintendoServiceAccountSubjectRequestEvent((ServerModels.LinkNintendoServiceAccountSubjectRequest)e.Request); return; } } + if (type == typeof(ServerModels.LinkNintendoSwitchDeviceIdRequest)) { if (_instance.OnServerLinkNintendoSwitchDeviceIdRequestEvent != null) { _instance.OnServerLinkNintendoSwitchDeviceIdRequestEvent((ServerModels.LinkNintendoSwitchDeviceIdRequest)e.Request); return; } } + if (type == typeof(ServerModels.LinkPSNAccountRequest)) { if (_instance.OnServerLinkPSNAccountRequestEvent != null) { _instance.OnServerLinkPSNAccountRequestEvent((ServerModels.LinkPSNAccountRequest)e.Request); return; } } + if (type == typeof(ServerModels.LinkPSNIdRequest)) { if (_instance.OnServerLinkPSNIdRequestEvent != null) { _instance.OnServerLinkPSNIdRequestEvent((ServerModels.LinkPSNIdRequest)e.Request); return; } } + if (type == typeof(ServerModels.LinkServerCustomIdRequest)) { if (_instance.OnServerLinkServerCustomIdRequestEvent != null) { _instance.OnServerLinkServerCustomIdRequestEvent((ServerModels.LinkServerCustomIdRequest)e.Request); return; } } + if (type == typeof(ServerModels.LinkSteamIdRequest)) { if (_instance.OnServerLinkSteamIdRequestEvent != null) { _instance.OnServerLinkSteamIdRequestEvent((ServerModels.LinkSteamIdRequest)e.Request); return; } } + if (type == typeof(ServerModels.LinkXboxAccountRequest)) { if (_instance.OnServerLinkXboxAccountRequestEvent != null) { _instance.OnServerLinkXboxAccountRequestEvent((ServerModels.LinkXboxAccountRequest)e.Request); return; } } + if (type == typeof(ServerModels.LoginWithPSNRequest)) { if (_instance.OnServerLoginWithPSNRequestEvent != null) { _instance.OnServerLoginWithPSNRequestEvent((ServerModels.LoginWithPSNRequest)e.Request); return; } } + if (type == typeof(ServerModels.LoginWithServerCustomIdRequest)) { if (_instance.OnServerLoginWithServerCustomIdRequestEvent != null) { _instance.OnServerLoginWithServerCustomIdRequestEvent((ServerModels.LoginWithServerCustomIdRequest)e.Request); return; } } + if (type == typeof(ServerModels.LoginWithSteamIdRequest)) { if (_instance.OnServerLoginWithSteamIdRequestEvent != null) { _instance.OnServerLoginWithSteamIdRequestEvent((ServerModels.LoginWithSteamIdRequest)e.Request); return; } } + if (type == typeof(ServerModels.LoginWithXboxRequest)) { if (_instance.OnServerLoginWithXboxRequestEvent != null) { _instance.OnServerLoginWithXboxRequestEvent((ServerModels.LoginWithXboxRequest)e.Request); return; } } + if (type == typeof(ServerModels.LoginWithXboxIdRequest)) { if (_instance.OnServerLoginWithXboxIdRequestEvent != null) { _instance.OnServerLoginWithXboxIdRequestEvent((ServerModels.LoginWithXboxIdRequest)e.Request); return; } } + if (type == typeof(ServerModels.ModifyItemUsesRequest)) { if (_instance.OnServerModifyItemUsesRequestEvent != null) { _instance.OnServerModifyItemUsesRequestEvent((ServerModels.ModifyItemUsesRequest)e.Request); return; } } + if (type == typeof(ServerModels.MoveItemToCharacterFromCharacterRequest)) { if (_instance.OnServerMoveItemToCharacterFromCharacterRequestEvent != null) { _instance.OnServerMoveItemToCharacterFromCharacterRequestEvent((ServerModels.MoveItemToCharacterFromCharacterRequest)e.Request); return; } } + if (type == typeof(ServerModels.MoveItemToCharacterFromUserRequest)) { if (_instance.OnServerMoveItemToCharacterFromUserRequestEvent != null) { _instance.OnServerMoveItemToCharacterFromUserRequestEvent((ServerModels.MoveItemToCharacterFromUserRequest)e.Request); return; } } + if (type == typeof(ServerModels.MoveItemToUserFromCharacterRequest)) { if (_instance.OnServerMoveItemToUserFromCharacterRequestEvent != null) { _instance.OnServerMoveItemToUserFromCharacterRequestEvent((ServerModels.MoveItemToUserFromCharacterRequest)e.Request); return; } } + if (type == typeof(ServerModels.RedeemCouponRequest)) { if (_instance.OnServerRedeemCouponRequestEvent != null) { _instance.OnServerRedeemCouponRequestEvent((ServerModels.RedeemCouponRequest)e.Request); return; } } + if (type == typeof(ServerModels.RemoveFriendRequest)) { if (_instance.OnServerRemoveFriendRequestEvent != null) { _instance.OnServerRemoveFriendRequestEvent((ServerModels.RemoveFriendRequest)e.Request); return; } } + if (type == typeof(ServerModels.RemoveGenericIDRequest)) { if (_instance.OnServerRemoveGenericIDRequestEvent != null) { _instance.OnServerRemoveGenericIDRequestEvent((ServerModels.RemoveGenericIDRequest)e.Request); return; } } + if (type == typeof(ServerModels.RemovePlayerTagRequest)) { if (_instance.OnServerRemovePlayerTagRequestEvent != null) { _instance.OnServerRemovePlayerTagRequestEvent((ServerModels.RemovePlayerTagRequest)e.Request); return; } } + if (type == typeof(ServerModels.RemoveSharedGroupMembersRequest)) { if (_instance.OnServerRemoveSharedGroupMembersRequestEvent != null) { _instance.OnServerRemoveSharedGroupMembersRequestEvent((ServerModels.RemoveSharedGroupMembersRequest)e.Request); return; } } + if (type == typeof(ServerModels.ReportPlayerServerRequest)) { if (_instance.OnServerReportPlayerRequestEvent != null) { _instance.OnServerReportPlayerRequestEvent((ServerModels.ReportPlayerServerRequest)e.Request); return; } } + if (type == typeof(ServerModels.RevokeAllBansForUserRequest)) { if (_instance.OnServerRevokeAllBansForUserRequestEvent != null) { _instance.OnServerRevokeAllBansForUserRequestEvent((ServerModels.RevokeAllBansForUserRequest)e.Request); return; } } + if (type == typeof(ServerModels.RevokeBansRequest)) { if (_instance.OnServerRevokeBansRequestEvent != null) { _instance.OnServerRevokeBansRequestEvent((ServerModels.RevokeBansRequest)e.Request); return; } } + if (type == typeof(ServerModels.RevokeInventoryItemRequest)) { if (_instance.OnServerRevokeInventoryItemRequestEvent != null) { _instance.OnServerRevokeInventoryItemRequestEvent((ServerModels.RevokeInventoryItemRequest)e.Request); return; } } + if (type == typeof(ServerModels.RevokeInventoryItemsRequest)) { if (_instance.OnServerRevokeInventoryItemsRequestEvent != null) { _instance.OnServerRevokeInventoryItemsRequestEvent((ServerModels.RevokeInventoryItemsRequest)e.Request); return; } } + if (type == typeof(ServerModels.SavePushNotificationTemplateRequest)) { if (_instance.OnServerSavePushNotificationTemplateRequestEvent != null) { _instance.OnServerSavePushNotificationTemplateRequestEvent((ServerModels.SavePushNotificationTemplateRequest)e.Request); return; } } + if (type == typeof(ServerModels.SendCustomAccountRecoveryEmailRequest)) { if (_instance.OnServerSendCustomAccountRecoveryEmailRequestEvent != null) { _instance.OnServerSendCustomAccountRecoveryEmailRequestEvent((ServerModels.SendCustomAccountRecoveryEmailRequest)e.Request); return; } } + if (type == typeof(ServerModels.SendEmailFromTemplateRequest)) { if (_instance.OnServerSendEmailFromTemplateRequestEvent != null) { _instance.OnServerSendEmailFromTemplateRequestEvent((ServerModels.SendEmailFromTemplateRequest)e.Request); return; } } + if (type == typeof(ServerModels.SendPushNotificationRequest)) { if (_instance.OnServerSendPushNotificationRequestEvent != null) { _instance.OnServerSendPushNotificationRequestEvent((ServerModels.SendPushNotificationRequest)e.Request); return; } } + if (type == typeof(ServerModels.SendPushNotificationFromTemplateRequest)) { if (_instance.OnServerSendPushNotificationFromTemplateRequestEvent != null) { _instance.OnServerSendPushNotificationFromTemplateRequestEvent((ServerModels.SendPushNotificationFromTemplateRequest)e.Request); return; } } + if (type == typeof(ServerModels.SetFriendTagsRequest)) { if (_instance.OnServerSetFriendTagsRequestEvent != null) { _instance.OnServerSetFriendTagsRequestEvent((ServerModels.SetFriendTagsRequest)e.Request); return; } } + if (type == typeof(ServerModels.SetPlayerSecretRequest)) { if (_instance.OnServerSetPlayerSecretRequestEvent != null) { _instance.OnServerSetPlayerSecretRequestEvent((ServerModels.SetPlayerSecretRequest)e.Request); return; } } + if (type == typeof(ServerModels.SetPublisherDataRequest)) { if (_instance.OnServerSetPublisherDataRequestEvent != null) { _instance.OnServerSetPublisherDataRequestEvent((ServerModels.SetPublisherDataRequest)e.Request); return; } } + if (type == typeof(ServerModels.SetTitleDataRequest)) { if (_instance.OnServerSetTitleDataRequestEvent != null) { _instance.OnServerSetTitleDataRequestEvent((ServerModels.SetTitleDataRequest)e.Request); return; } } + if (type == typeof(ServerModels.SetTitleDataRequest)) { if (_instance.OnServerSetTitleInternalDataRequestEvent != null) { _instance.OnServerSetTitleInternalDataRequestEvent((ServerModels.SetTitleDataRequest)e.Request); return; } } + if (type == typeof(ServerModels.SubtractCharacterVirtualCurrencyRequest)) { if (_instance.OnServerSubtractCharacterVirtualCurrencyRequestEvent != null) { _instance.OnServerSubtractCharacterVirtualCurrencyRequestEvent((ServerModels.SubtractCharacterVirtualCurrencyRequest)e.Request); return; } } + if (type == typeof(ServerModels.SubtractUserVirtualCurrencyRequest)) { if (_instance.OnServerSubtractUserVirtualCurrencyRequestEvent != null) { _instance.OnServerSubtractUserVirtualCurrencyRequestEvent((ServerModels.SubtractUserVirtualCurrencyRequest)e.Request); return; } } + if (type == typeof(ServerModels.UnlinkNintendoServiceAccountRequest)) { if (_instance.OnServerUnlinkNintendoServiceAccountRequestEvent != null) { _instance.OnServerUnlinkNintendoServiceAccountRequestEvent((ServerModels.UnlinkNintendoServiceAccountRequest)e.Request); return; } } + if (type == typeof(ServerModels.UnlinkNintendoSwitchDeviceIdRequest)) { if (_instance.OnServerUnlinkNintendoSwitchDeviceIdRequestEvent != null) { _instance.OnServerUnlinkNintendoSwitchDeviceIdRequestEvent((ServerModels.UnlinkNintendoSwitchDeviceIdRequest)e.Request); return; } } + if (type == typeof(ServerModels.UnlinkPSNAccountRequest)) { if (_instance.OnServerUnlinkPSNAccountRequestEvent != null) { _instance.OnServerUnlinkPSNAccountRequestEvent((ServerModels.UnlinkPSNAccountRequest)e.Request); return; } } + if (type == typeof(ServerModels.UnlinkServerCustomIdRequest)) { if (_instance.OnServerUnlinkServerCustomIdRequestEvent != null) { _instance.OnServerUnlinkServerCustomIdRequestEvent((ServerModels.UnlinkServerCustomIdRequest)e.Request); return; } } + if (type == typeof(ServerModels.UnlinkSteamIdRequest)) { if (_instance.OnServerUnlinkSteamIdRequestEvent != null) { _instance.OnServerUnlinkSteamIdRequestEvent((ServerModels.UnlinkSteamIdRequest)e.Request); return; } } + if (type == typeof(ServerModels.UnlinkXboxAccountRequest)) { if (_instance.OnServerUnlinkXboxAccountRequestEvent != null) { _instance.OnServerUnlinkXboxAccountRequestEvent((ServerModels.UnlinkXboxAccountRequest)e.Request); return; } } + if (type == typeof(ServerModels.UnlockContainerInstanceRequest)) { if (_instance.OnServerUnlockContainerInstanceRequestEvent != null) { _instance.OnServerUnlockContainerInstanceRequestEvent((ServerModels.UnlockContainerInstanceRequest)e.Request); return; } } + if (type == typeof(ServerModels.UnlockContainerItemRequest)) { if (_instance.OnServerUnlockContainerItemRequestEvent != null) { _instance.OnServerUnlockContainerItemRequestEvent((ServerModels.UnlockContainerItemRequest)e.Request); return; } } + if (type == typeof(ServerModels.UpdateAvatarUrlRequest)) { if (_instance.OnServerUpdateAvatarUrlRequestEvent != null) { _instance.OnServerUpdateAvatarUrlRequestEvent((ServerModels.UpdateAvatarUrlRequest)e.Request); return; } } + if (type == typeof(ServerModels.UpdateBansRequest)) { if (_instance.OnServerUpdateBansRequestEvent != null) { _instance.OnServerUpdateBansRequestEvent((ServerModels.UpdateBansRequest)e.Request); return; } } + if (type == typeof(ServerModels.UpdateCharacterDataRequest)) { if (_instance.OnServerUpdateCharacterDataRequestEvent != null) { _instance.OnServerUpdateCharacterDataRequestEvent((ServerModels.UpdateCharacterDataRequest)e.Request); return; } } + if (type == typeof(ServerModels.UpdateCharacterDataRequest)) { if (_instance.OnServerUpdateCharacterInternalDataRequestEvent != null) { _instance.OnServerUpdateCharacterInternalDataRequestEvent((ServerModels.UpdateCharacterDataRequest)e.Request); return; } } + if (type == typeof(ServerModels.UpdateCharacterDataRequest)) { if (_instance.OnServerUpdateCharacterReadOnlyDataRequestEvent != null) { _instance.OnServerUpdateCharacterReadOnlyDataRequestEvent((ServerModels.UpdateCharacterDataRequest)e.Request); return; } } + if (type == typeof(ServerModels.UpdateCharacterStatisticsRequest)) { if (_instance.OnServerUpdateCharacterStatisticsRequestEvent != null) { _instance.OnServerUpdateCharacterStatisticsRequestEvent((ServerModels.UpdateCharacterStatisticsRequest)e.Request); return; } } + if (type == typeof(ServerModels.UpdatePlayerStatisticsRequest)) { if (_instance.OnServerUpdatePlayerStatisticsRequestEvent != null) { _instance.OnServerUpdatePlayerStatisticsRequestEvent((ServerModels.UpdatePlayerStatisticsRequest)e.Request); return; } } + if (type == typeof(ServerModels.UpdateSharedGroupDataRequest)) { if (_instance.OnServerUpdateSharedGroupDataRequestEvent != null) { _instance.OnServerUpdateSharedGroupDataRequestEvent((ServerModels.UpdateSharedGroupDataRequest)e.Request); return; } } + if (type == typeof(ServerModels.UpdateUserDataRequest)) { if (_instance.OnServerUpdateUserDataRequestEvent != null) { _instance.OnServerUpdateUserDataRequestEvent((ServerModels.UpdateUserDataRequest)e.Request); return; } } + if (type == typeof(ServerModels.UpdateUserInternalDataRequest)) { if (_instance.OnServerUpdateUserInternalDataRequestEvent != null) { _instance.OnServerUpdateUserInternalDataRequestEvent((ServerModels.UpdateUserInternalDataRequest)e.Request); return; } } + if (type == typeof(ServerModels.UpdateUserInventoryItemDataRequest)) { if (_instance.OnServerUpdateUserInventoryItemCustomDataRequestEvent != null) { _instance.OnServerUpdateUserInventoryItemCustomDataRequestEvent((ServerModels.UpdateUserInventoryItemDataRequest)e.Request); return; } } + if (type == typeof(ServerModels.UpdateUserDataRequest)) { if (_instance.OnServerUpdateUserPublisherDataRequestEvent != null) { _instance.OnServerUpdateUserPublisherDataRequestEvent((ServerModels.UpdateUserDataRequest)e.Request); return; } } + if (type == typeof(ServerModels.UpdateUserInternalDataRequest)) { if (_instance.OnServerUpdateUserPublisherInternalDataRequestEvent != null) { _instance.OnServerUpdateUserPublisherInternalDataRequestEvent((ServerModels.UpdateUserInternalDataRequest)e.Request); return; } } + if (type == typeof(ServerModels.UpdateUserDataRequest)) { if (_instance.OnServerUpdateUserPublisherReadOnlyDataRequestEvent != null) { _instance.OnServerUpdateUserPublisherReadOnlyDataRequestEvent((ServerModels.UpdateUserDataRequest)e.Request); return; } } + if (type == typeof(ServerModels.UpdateUserDataRequest)) { if (_instance.OnServerUpdateUserReadOnlyDataRequestEvent != null) { _instance.OnServerUpdateUserReadOnlyDataRequestEvent((ServerModels.UpdateUserDataRequest)e.Request); return; } } + if (type == typeof(ServerModels.WriteServerCharacterEventRequest)) { if (_instance.OnServerWriteCharacterEventRequestEvent != null) { _instance.OnServerWriteCharacterEventRequestEvent((ServerModels.WriteServerCharacterEventRequest)e.Request); return; } } + if (type == typeof(ServerModels.WriteServerPlayerEventRequest)) { if (_instance.OnServerWritePlayerEventRequestEvent != null) { _instance.OnServerWritePlayerEventRequestEvent((ServerModels.WriteServerPlayerEventRequest)e.Request); return; } } + if (type == typeof(ServerModels.WriteTitleEventRequest)) { if (_instance.OnServerWriteTitleEventRequestEvent != null) { _instance.OnServerWriteTitleEventRequestEvent((ServerModels.WriteTitleEventRequest)e.Request); return; } } +#endif +#if !DISABLE_PLAYFABENTITY_API + if (type == typeof(AuthenticationModels.AuthenticateCustomIdRequest)) { if (_instance.OnAuthenticationAuthenticateGameServerWithCustomIdRequestEvent != null) { _instance.OnAuthenticationAuthenticateGameServerWithCustomIdRequestEvent((AuthenticationModels.AuthenticateCustomIdRequest)e.Request); return; } } + if (type == typeof(AuthenticationModels.DeleteRequest)) { if (_instance.OnAuthenticationDeleteRequestEvent != null) { _instance.OnAuthenticationDeleteRequestEvent((AuthenticationModels.DeleteRequest)e.Request); return; } } + if (type == typeof(AuthenticationModels.GetEntityTokenRequest)) { if (_instance.OnAuthenticationGetEntityTokenRequestEvent != null) { _instance.OnAuthenticationGetEntityTokenRequestEvent((AuthenticationModels.GetEntityTokenRequest)e.Request); return; } } + if (type == typeof(AuthenticationModels.ValidateEntityTokenRequest)) { if (_instance.OnAuthenticationValidateEntityTokenRequestEvent != null) { _instance.OnAuthenticationValidateEntityTokenRequestEvent((AuthenticationModels.ValidateEntityTokenRequest)e.Request); return; } } +#endif +#if !DISABLE_PLAYFABENTITY_API + if (type == typeof(CloudScriptModels.ExecuteEntityCloudScriptRequest)) { if (_instance.OnCloudScriptExecuteEntityCloudScriptRequestEvent != null) { _instance.OnCloudScriptExecuteEntityCloudScriptRequestEvent((CloudScriptModels.ExecuteEntityCloudScriptRequest)e.Request); return; } } + if (type == typeof(CloudScriptModels.ExecuteFunctionRequest)) { if (_instance.OnCloudScriptExecuteFunctionRequestEvent != null) { _instance.OnCloudScriptExecuteFunctionRequestEvent((CloudScriptModels.ExecuteFunctionRequest)e.Request); return; } } + if (type == typeof(CloudScriptModels.GetFunctionRequest)) { if (_instance.OnCloudScriptGetFunctionRequestEvent != null) { _instance.OnCloudScriptGetFunctionRequestEvent((CloudScriptModels.GetFunctionRequest)e.Request); return; } } + if (type == typeof(CloudScriptModels.ListFunctionsRequest)) { if (_instance.OnCloudScriptListEventHubFunctionsRequestEvent != null) { _instance.OnCloudScriptListEventHubFunctionsRequestEvent((CloudScriptModels.ListFunctionsRequest)e.Request); return; } } + if (type == typeof(CloudScriptModels.ListFunctionsRequest)) { if (_instance.OnCloudScriptListFunctionsRequestEvent != null) { _instance.OnCloudScriptListFunctionsRequestEvent((CloudScriptModels.ListFunctionsRequest)e.Request); return; } } + if (type == typeof(CloudScriptModels.ListFunctionsRequest)) { if (_instance.OnCloudScriptListHttpFunctionsRequestEvent != null) { _instance.OnCloudScriptListHttpFunctionsRequestEvent((CloudScriptModels.ListFunctionsRequest)e.Request); return; } } + if (type == typeof(CloudScriptModels.ListFunctionsRequest)) { if (_instance.OnCloudScriptListQueuedFunctionsRequestEvent != null) { _instance.OnCloudScriptListQueuedFunctionsRequestEvent((CloudScriptModels.ListFunctionsRequest)e.Request); return; } } + if (type == typeof(CloudScriptModels.PostFunctionResultForEntityTriggeredActionRequest)) { if (_instance.OnCloudScriptPostFunctionResultForEntityTriggeredActionRequestEvent != null) { _instance.OnCloudScriptPostFunctionResultForEntityTriggeredActionRequestEvent((CloudScriptModels.PostFunctionResultForEntityTriggeredActionRequest)e.Request); return; } } + if (type == typeof(CloudScriptModels.PostFunctionResultForFunctionExecutionRequest)) { if (_instance.OnCloudScriptPostFunctionResultForFunctionExecutionRequestEvent != null) { _instance.OnCloudScriptPostFunctionResultForFunctionExecutionRequestEvent((CloudScriptModels.PostFunctionResultForFunctionExecutionRequest)e.Request); return; } } + if (type == typeof(CloudScriptModels.PostFunctionResultForPlayerTriggeredActionRequest)) { if (_instance.OnCloudScriptPostFunctionResultForPlayerTriggeredActionRequestEvent != null) { _instance.OnCloudScriptPostFunctionResultForPlayerTriggeredActionRequestEvent((CloudScriptModels.PostFunctionResultForPlayerTriggeredActionRequest)e.Request); return; } } + if (type == typeof(CloudScriptModels.PostFunctionResultForScheduledTaskRequest)) { if (_instance.OnCloudScriptPostFunctionResultForScheduledTaskRequestEvent != null) { _instance.OnCloudScriptPostFunctionResultForScheduledTaskRequestEvent((CloudScriptModels.PostFunctionResultForScheduledTaskRequest)e.Request); return; } } + if (type == typeof(CloudScriptModels.RegisterEventHubFunctionRequest)) { if (_instance.OnCloudScriptRegisterEventHubFunctionRequestEvent != null) { _instance.OnCloudScriptRegisterEventHubFunctionRequestEvent((CloudScriptModels.RegisterEventHubFunctionRequest)e.Request); return; } } + if (type == typeof(CloudScriptModels.RegisterHttpFunctionRequest)) { if (_instance.OnCloudScriptRegisterHttpFunctionRequestEvent != null) { _instance.OnCloudScriptRegisterHttpFunctionRequestEvent((CloudScriptModels.RegisterHttpFunctionRequest)e.Request); return; } } + if (type == typeof(CloudScriptModels.RegisterQueuedFunctionRequest)) { if (_instance.OnCloudScriptRegisterQueuedFunctionRequestEvent != null) { _instance.OnCloudScriptRegisterQueuedFunctionRequestEvent((CloudScriptModels.RegisterQueuedFunctionRequest)e.Request); return; } } + if (type == typeof(CloudScriptModels.UnregisterFunctionRequest)) { if (_instance.OnCloudScriptUnregisterFunctionRequestEvent != null) { _instance.OnCloudScriptUnregisterFunctionRequestEvent((CloudScriptModels.UnregisterFunctionRequest)e.Request); return; } } +#endif +#if !DISABLE_PLAYFABENTITY_API + if (type == typeof(DataModels.AbortFileUploadsRequest)) { if (_instance.OnDataAbortFileUploadsRequestEvent != null) { _instance.OnDataAbortFileUploadsRequestEvent((DataModels.AbortFileUploadsRequest)e.Request); return; } } + if (type == typeof(DataModels.DeleteFilesRequest)) { if (_instance.OnDataDeleteFilesRequestEvent != null) { _instance.OnDataDeleteFilesRequestEvent((DataModels.DeleteFilesRequest)e.Request); return; } } + if (type == typeof(DataModels.FinalizeFileUploadsRequest)) { if (_instance.OnDataFinalizeFileUploadsRequestEvent != null) { _instance.OnDataFinalizeFileUploadsRequestEvent((DataModels.FinalizeFileUploadsRequest)e.Request); return; } } + if (type == typeof(DataModels.GetFilesRequest)) { if (_instance.OnDataGetFilesRequestEvent != null) { _instance.OnDataGetFilesRequestEvent((DataModels.GetFilesRequest)e.Request); return; } } + if (type == typeof(DataModels.GetObjectsRequest)) { if (_instance.OnDataGetObjectsRequestEvent != null) { _instance.OnDataGetObjectsRequestEvent((DataModels.GetObjectsRequest)e.Request); return; } } + if (type == typeof(DataModels.InitiateFileUploadsRequest)) { if (_instance.OnDataInitiateFileUploadsRequestEvent != null) { _instance.OnDataInitiateFileUploadsRequestEvent((DataModels.InitiateFileUploadsRequest)e.Request); return; } } + if (type == typeof(DataModels.SetObjectsRequest)) { if (_instance.OnDataSetObjectsRequestEvent != null) { _instance.OnDataSetObjectsRequestEvent((DataModels.SetObjectsRequest)e.Request); return; } } +#endif +#if !DISABLE_PLAYFABENTITY_API + if (type == typeof(EconomyModels.AddInventoryItemsRequest)) { if (_instance.OnEconomyAddInventoryItemsRequestEvent != null) { _instance.OnEconomyAddInventoryItemsRequestEvent((EconomyModels.AddInventoryItemsRequest)e.Request); return; } } + if (type == typeof(EconomyModels.CreateDraftItemRequest)) { if (_instance.OnEconomyCreateDraftItemRequestEvent != null) { _instance.OnEconomyCreateDraftItemRequestEvent((EconomyModels.CreateDraftItemRequest)e.Request); return; } } + if (type == typeof(EconomyModels.CreateUploadUrlsRequest)) { if (_instance.OnEconomyCreateUploadUrlsRequestEvent != null) { _instance.OnEconomyCreateUploadUrlsRequestEvent((EconomyModels.CreateUploadUrlsRequest)e.Request); return; } } + if (type == typeof(EconomyModels.DeleteEntityItemReviewsRequest)) { if (_instance.OnEconomyDeleteEntityItemReviewsRequestEvent != null) { _instance.OnEconomyDeleteEntityItemReviewsRequestEvent((EconomyModels.DeleteEntityItemReviewsRequest)e.Request); return; } } + if (type == typeof(EconomyModels.DeleteInventoryCollectionRequest)) { if (_instance.OnEconomyDeleteInventoryCollectionRequestEvent != null) { _instance.OnEconomyDeleteInventoryCollectionRequestEvent((EconomyModels.DeleteInventoryCollectionRequest)e.Request); return; } } + if (type == typeof(EconomyModels.DeleteInventoryItemsRequest)) { if (_instance.OnEconomyDeleteInventoryItemsRequestEvent != null) { _instance.OnEconomyDeleteInventoryItemsRequestEvent((EconomyModels.DeleteInventoryItemsRequest)e.Request); return; } } + if (type == typeof(EconomyModels.DeleteItemRequest)) { if (_instance.OnEconomyDeleteItemRequestEvent != null) { _instance.OnEconomyDeleteItemRequestEvent((EconomyModels.DeleteItemRequest)e.Request); return; } } + if (type == typeof(EconomyModels.ExecuteInventoryOperationsRequest)) { if (_instance.OnEconomyExecuteInventoryOperationsRequestEvent != null) { _instance.OnEconomyExecuteInventoryOperationsRequestEvent((EconomyModels.ExecuteInventoryOperationsRequest)e.Request); return; } } + if (type == typeof(EconomyModels.ExecuteTransferOperationsRequest)) { if (_instance.OnEconomyExecuteTransferOperationsRequestEvent != null) { _instance.OnEconomyExecuteTransferOperationsRequestEvent((EconomyModels.ExecuteTransferOperationsRequest)e.Request); return; } } + if (type == typeof(EconomyModels.GetCatalogConfigRequest)) { if (_instance.OnEconomyGetCatalogConfigRequestEvent != null) { _instance.OnEconomyGetCatalogConfigRequestEvent((EconomyModels.GetCatalogConfigRequest)e.Request); return; } } + if (type == typeof(EconomyModels.GetDraftItemRequest)) { if (_instance.OnEconomyGetDraftItemRequestEvent != null) { _instance.OnEconomyGetDraftItemRequestEvent((EconomyModels.GetDraftItemRequest)e.Request); return; } } + if (type == typeof(EconomyModels.GetDraftItemsRequest)) { if (_instance.OnEconomyGetDraftItemsRequestEvent != null) { _instance.OnEconomyGetDraftItemsRequestEvent((EconomyModels.GetDraftItemsRequest)e.Request); return; } } + if (type == typeof(EconomyModels.GetEntityDraftItemsRequest)) { if (_instance.OnEconomyGetEntityDraftItemsRequestEvent != null) { _instance.OnEconomyGetEntityDraftItemsRequestEvent((EconomyModels.GetEntityDraftItemsRequest)e.Request); return; } } + if (type == typeof(EconomyModels.GetEntityItemReviewRequest)) { if (_instance.OnEconomyGetEntityItemReviewRequestEvent != null) { _instance.OnEconomyGetEntityItemReviewRequestEvent((EconomyModels.GetEntityItemReviewRequest)e.Request); return; } } + if (type == typeof(EconomyModels.GetInventoryCollectionIdsRequest)) { if (_instance.OnEconomyGetInventoryCollectionIdsRequestEvent != null) { _instance.OnEconomyGetInventoryCollectionIdsRequestEvent((EconomyModels.GetInventoryCollectionIdsRequest)e.Request); return; } } + if (type == typeof(EconomyModels.GetInventoryItemsRequest)) { if (_instance.OnEconomyGetInventoryItemsRequestEvent != null) { _instance.OnEconomyGetInventoryItemsRequestEvent((EconomyModels.GetInventoryItemsRequest)e.Request); return; } } + if (type == typeof(EconomyModels.GetInventoryOperationStatusRequest)) { if (_instance.OnEconomyGetInventoryOperationStatusRequestEvent != null) { _instance.OnEconomyGetInventoryOperationStatusRequestEvent((EconomyModels.GetInventoryOperationStatusRequest)e.Request); return; } } + if (type == typeof(EconomyModels.GetItemRequest)) { if (_instance.OnEconomyGetItemRequestEvent != null) { _instance.OnEconomyGetItemRequestEvent((EconomyModels.GetItemRequest)e.Request); return; } } + if (type == typeof(EconomyModels.GetItemContainersRequest)) { if (_instance.OnEconomyGetItemContainersRequestEvent != null) { _instance.OnEconomyGetItemContainersRequestEvent((EconomyModels.GetItemContainersRequest)e.Request); return; } } + if (type == typeof(EconomyModels.GetItemModerationStateRequest)) { if (_instance.OnEconomyGetItemModerationStateRequestEvent != null) { _instance.OnEconomyGetItemModerationStateRequestEvent((EconomyModels.GetItemModerationStateRequest)e.Request); return; } } + if (type == typeof(EconomyModels.GetItemPublishStatusRequest)) { if (_instance.OnEconomyGetItemPublishStatusRequestEvent != null) { _instance.OnEconomyGetItemPublishStatusRequestEvent((EconomyModels.GetItemPublishStatusRequest)e.Request); return; } } + if (type == typeof(EconomyModels.GetItemReviewsRequest)) { if (_instance.OnEconomyGetItemReviewsRequestEvent != null) { _instance.OnEconomyGetItemReviewsRequestEvent((EconomyModels.GetItemReviewsRequest)e.Request); return; } } + if (type == typeof(EconomyModels.GetItemReviewSummaryRequest)) { if (_instance.OnEconomyGetItemReviewSummaryRequestEvent != null) { _instance.OnEconomyGetItemReviewSummaryRequestEvent((EconomyModels.GetItemReviewSummaryRequest)e.Request); return; } } + if (type == typeof(EconomyModels.GetItemsRequest)) { if (_instance.OnEconomyGetItemsRequestEvent != null) { _instance.OnEconomyGetItemsRequestEvent((EconomyModels.GetItemsRequest)e.Request); return; } } + if (type == typeof(EconomyModels.GetMicrosoftStoreAccessTokensRequest)) { if (_instance.OnEconomyGetMicrosoftStoreAccessTokensRequestEvent != null) { _instance.OnEconomyGetMicrosoftStoreAccessTokensRequestEvent((EconomyModels.GetMicrosoftStoreAccessTokensRequest)e.Request); return; } } + if (type == typeof(EconomyModels.GetTransactionHistoryRequest)) { if (_instance.OnEconomyGetTransactionHistoryRequestEvent != null) { _instance.OnEconomyGetTransactionHistoryRequestEvent((EconomyModels.GetTransactionHistoryRequest)e.Request); return; } } + if (type == typeof(EconomyModels.PublishDraftItemRequest)) { if (_instance.OnEconomyPublishDraftItemRequestEvent != null) { _instance.OnEconomyPublishDraftItemRequestEvent((EconomyModels.PublishDraftItemRequest)e.Request); return; } } + if (type == typeof(EconomyModels.PurchaseInventoryItemsRequest)) { if (_instance.OnEconomyPurchaseInventoryItemsRequestEvent != null) { _instance.OnEconomyPurchaseInventoryItemsRequestEvent((EconomyModels.PurchaseInventoryItemsRequest)e.Request); return; } } + if (type == typeof(EconomyModels.RedeemAppleAppStoreInventoryItemsRequest)) { if (_instance.OnEconomyRedeemAppleAppStoreInventoryItemsRequestEvent != null) { _instance.OnEconomyRedeemAppleAppStoreInventoryItemsRequestEvent((EconomyModels.RedeemAppleAppStoreInventoryItemsRequest)e.Request); return; } } + if (type == typeof(EconomyModels.RedeemGooglePlayInventoryItemsRequest)) { if (_instance.OnEconomyRedeemGooglePlayInventoryItemsRequestEvent != null) { _instance.OnEconomyRedeemGooglePlayInventoryItemsRequestEvent((EconomyModels.RedeemGooglePlayInventoryItemsRequest)e.Request); return; } } + if (type == typeof(EconomyModels.RedeemMicrosoftStoreInventoryItemsRequest)) { if (_instance.OnEconomyRedeemMicrosoftStoreInventoryItemsRequestEvent != null) { _instance.OnEconomyRedeemMicrosoftStoreInventoryItemsRequestEvent((EconomyModels.RedeemMicrosoftStoreInventoryItemsRequest)e.Request); return; } } + if (type == typeof(EconomyModels.RedeemNintendoEShopInventoryItemsRequest)) { if (_instance.OnEconomyRedeemNintendoEShopInventoryItemsRequestEvent != null) { _instance.OnEconomyRedeemNintendoEShopInventoryItemsRequestEvent((EconomyModels.RedeemNintendoEShopInventoryItemsRequest)e.Request); return; } } + if (type == typeof(EconomyModels.RedeemPlayStationStoreInventoryItemsRequest)) { if (_instance.OnEconomyRedeemPlayStationStoreInventoryItemsRequestEvent != null) { _instance.OnEconomyRedeemPlayStationStoreInventoryItemsRequestEvent((EconomyModels.RedeemPlayStationStoreInventoryItemsRequest)e.Request); return; } } + if (type == typeof(EconomyModels.RedeemSteamInventoryItemsRequest)) { if (_instance.OnEconomyRedeemSteamInventoryItemsRequestEvent != null) { _instance.OnEconomyRedeemSteamInventoryItemsRequestEvent((EconomyModels.RedeemSteamInventoryItemsRequest)e.Request); return; } } + if (type == typeof(EconomyModels.ReportItemRequest)) { if (_instance.OnEconomyReportItemRequestEvent != null) { _instance.OnEconomyReportItemRequestEvent((EconomyModels.ReportItemRequest)e.Request); return; } } + if (type == typeof(EconomyModels.ReportItemReviewRequest)) { if (_instance.OnEconomyReportItemReviewRequestEvent != null) { _instance.OnEconomyReportItemReviewRequestEvent((EconomyModels.ReportItemReviewRequest)e.Request); return; } } + if (type == typeof(EconomyModels.ReviewItemRequest)) { if (_instance.OnEconomyReviewItemRequestEvent != null) { _instance.OnEconomyReviewItemRequestEvent((EconomyModels.ReviewItemRequest)e.Request); return; } } + if (type == typeof(EconomyModels.SearchItemsRequest)) { if (_instance.OnEconomySearchItemsRequestEvent != null) { _instance.OnEconomySearchItemsRequestEvent((EconomyModels.SearchItemsRequest)e.Request); return; } } + if (type == typeof(EconomyModels.SetItemModerationStateRequest)) { if (_instance.OnEconomySetItemModerationStateRequestEvent != null) { _instance.OnEconomySetItemModerationStateRequestEvent((EconomyModels.SetItemModerationStateRequest)e.Request); return; } } + if (type == typeof(EconomyModels.SubmitItemReviewVoteRequest)) { if (_instance.OnEconomySubmitItemReviewVoteRequestEvent != null) { _instance.OnEconomySubmitItemReviewVoteRequestEvent((EconomyModels.SubmitItemReviewVoteRequest)e.Request); return; } } + if (type == typeof(EconomyModels.SubtractInventoryItemsRequest)) { if (_instance.OnEconomySubtractInventoryItemsRequestEvent != null) { _instance.OnEconomySubtractInventoryItemsRequestEvent((EconomyModels.SubtractInventoryItemsRequest)e.Request); return; } } + if (type == typeof(EconomyModels.TakedownItemReviewsRequest)) { if (_instance.OnEconomyTakedownItemReviewsRequestEvent != null) { _instance.OnEconomyTakedownItemReviewsRequestEvent((EconomyModels.TakedownItemReviewsRequest)e.Request); return; } } + if (type == typeof(EconomyModels.TransferInventoryItemsRequest)) { if (_instance.OnEconomyTransferInventoryItemsRequestEvent != null) { _instance.OnEconomyTransferInventoryItemsRequestEvent((EconomyModels.TransferInventoryItemsRequest)e.Request); return; } } + if (type == typeof(EconomyModels.UpdateCatalogConfigRequest)) { if (_instance.OnEconomyUpdateCatalogConfigRequestEvent != null) { _instance.OnEconomyUpdateCatalogConfigRequestEvent((EconomyModels.UpdateCatalogConfigRequest)e.Request); return; } } + if (type == typeof(EconomyModels.UpdateDraftItemRequest)) { if (_instance.OnEconomyUpdateDraftItemRequestEvent != null) { _instance.OnEconomyUpdateDraftItemRequestEvent((EconomyModels.UpdateDraftItemRequest)e.Request); return; } } + if (type == typeof(EconomyModels.UpdateInventoryItemsRequest)) { if (_instance.OnEconomyUpdateInventoryItemsRequestEvent != null) { _instance.OnEconomyUpdateInventoryItemsRequestEvent((EconomyModels.UpdateInventoryItemsRequest)e.Request); return; } } +#endif +#if !DISABLE_PLAYFABENTITY_API + if (type == typeof(EventsModels.CreateTelemetryKeyRequest)) { if (_instance.OnEventsCreateTelemetryKeyRequestEvent != null) { _instance.OnEventsCreateTelemetryKeyRequestEvent((EventsModels.CreateTelemetryKeyRequest)e.Request); return; } } + if (type == typeof(EventsModels.DeleteTelemetryKeyRequest)) { if (_instance.OnEventsDeleteTelemetryKeyRequestEvent != null) { _instance.OnEventsDeleteTelemetryKeyRequestEvent((EventsModels.DeleteTelemetryKeyRequest)e.Request); return; } } + if (type == typeof(EventsModels.GetTelemetryKeyRequest)) { if (_instance.OnEventsGetTelemetryKeyRequestEvent != null) { _instance.OnEventsGetTelemetryKeyRequestEvent((EventsModels.GetTelemetryKeyRequest)e.Request); return; } } + if (type == typeof(EventsModels.ListTelemetryKeysRequest)) { if (_instance.OnEventsListTelemetryKeysRequestEvent != null) { _instance.OnEventsListTelemetryKeysRequestEvent((EventsModels.ListTelemetryKeysRequest)e.Request); return; } } + if (type == typeof(EventsModels.SetTelemetryKeyActiveRequest)) { if (_instance.OnEventsSetTelemetryKeyActiveRequestEvent != null) { _instance.OnEventsSetTelemetryKeyActiveRequestEvent((EventsModels.SetTelemetryKeyActiveRequest)e.Request); return; } } + if (type == typeof(EventsModels.WriteEventsRequest)) { if (_instance.OnEventsWriteEventsRequestEvent != null) { _instance.OnEventsWriteEventsRequestEvent((EventsModels.WriteEventsRequest)e.Request); return; } } + if (type == typeof(EventsModels.WriteEventsRequest)) { if (_instance.OnEventsWriteTelemetryEventsRequestEvent != null) { _instance.OnEventsWriteTelemetryEventsRequestEvent((EventsModels.WriteEventsRequest)e.Request); return; } } +#endif +#if !DISABLE_PLAYFABENTITY_API + if (type == typeof(ExperimentationModels.CreateExclusionGroupRequest)) { if (_instance.OnExperimentationCreateExclusionGroupRequestEvent != null) { _instance.OnExperimentationCreateExclusionGroupRequestEvent((ExperimentationModels.CreateExclusionGroupRequest)e.Request); return; } } + if (type == typeof(ExperimentationModels.CreateExperimentRequest)) { if (_instance.OnExperimentationCreateExperimentRequestEvent != null) { _instance.OnExperimentationCreateExperimentRequestEvent((ExperimentationModels.CreateExperimentRequest)e.Request); return; } } + if (type == typeof(ExperimentationModels.DeleteExclusionGroupRequest)) { if (_instance.OnExperimentationDeleteExclusionGroupRequestEvent != null) { _instance.OnExperimentationDeleteExclusionGroupRequestEvent((ExperimentationModels.DeleteExclusionGroupRequest)e.Request); return; } } + if (type == typeof(ExperimentationModels.DeleteExperimentRequest)) { if (_instance.OnExperimentationDeleteExperimentRequestEvent != null) { _instance.OnExperimentationDeleteExperimentRequestEvent((ExperimentationModels.DeleteExperimentRequest)e.Request); return; } } + if (type == typeof(ExperimentationModels.GetExclusionGroupsRequest)) { if (_instance.OnExperimentationGetExclusionGroupsRequestEvent != null) { _instance.OnExperimentationGetExclusionGroupsRequestEvent((ExperimentationModels.GetExclusionGroupsRequest)e.Request); return; } } + if (type == typeof(ExperimentationModels.GetExclusionGroupTrafficRequest)) { if (_instance.OnExperimentationGetExclusionGroupTrafficRequestEvent != null) { _instance.OnExperimentationGetExclusionGroupTrafficRequestEvent((ExperimentationModels.GetExclusionGroupTrafficRequest)e.Request); return; } } + if (type == typeof(ExperimentationModels.GetExperimentsRequest)) { if (_instance.OnExperimentationGetExperimentsRequestEvent != null) { _instance.OnExperimentationGetExperimentsRequestEvent((ExperimentationModels.GetExperimentsRequest)e.Request); return; } } + if (type == typeof(ExperimentationModels.GetLatestScorecardRequest)) { if (_instance.OnExperimentationGetLatestScorecardRequestEvent != null) { _instance.OnExperimentationGetLatestScorecardRequestEvent((ExperimentationModels.GetLatestScorecardRequest)e.Request); return; } } + if (type == typeof(ExperimentationModels.GetTreatmentAssignmentRequest)) { if (_instance.OnExperimentationGetTreatmentAssignmentRequestEvent != null) { _instance.OnExperimentationGetTreatmentAssignmentRequestEvent((ExperimentationModels.GetTreatmentAssignmentRequest)e.Request); return; } } + if (type == typeof(ExperimentationModels.StartExperimentRequest)) { if (_instance.OnExperimentationStartExperimentRequestEvent != null) { _instance.OnExperimentationStartExperimentRequestEvent((ExperimentationModels.StartExperimentRequest)e.Request); return; } } + if (type == typeof(ExperimentationModels.StopExperimentRequest)) { if (_instance.OnExperimentationStopExperimentRequestEvent != null) { _instance.OnExperimentationStopExperimentRequestEvent((ExperimentationModels.StopExperimentRequest)e.Request); return; } } + if (type == typeof(ExperimentationModels.UpdateExclusionGroupRequest)) { if (_instance.OnExperimentationUpdateExclusionGroupRequestEvent != null) { _instance.OnExperimentationUpdateExclusionGroupRequestEvent((ExperimentationModels.UpdateExclusionGroupRequest)e.Request); return; } } + if (type == typeof(ExperimentationModels.UpdateExperimentRequest)) { if (_instance.OnExperimentationUpdateExperimentRequestEvent != null) { _instance.OnExperimentationUpdateExperimentRequestEvent((ExperimentationModels.UpdateExperimentRequest)e.Request); return; } } +#endif +#if !DISABLE_PLAYFABENTITY_API + if (type == typeof(InsightsModels.InsightsEmptyRequest)) { if (_instance.OnInsightsGetDetailsRequestEvent != null) { _instance.OnInsightsGetDetailsRequestEvent((InsightsModels.InsightsEmptyRequest)e.Request); return; } } + if (type == typeof(InsightsModels.InsightsEmptyRequest)) { if (_instance.OnInsightsGetLimitsRequestEvent != null) { _instance.OnInsightsGetLimitsRequestEvent((InsightsModels.InsightsEmptyRequest)e.Request); return; } } + if (type == typeof(InsightsModels.InsightsGetOperationStatusRequest)) { if (_instance.OnInsightsGetOperationStatusRequestEvent != null) { _instance.OnInsightsGetOperationStatusRequestEvent((InsightsModels.InsightsGetOperationStatusRequest)e.Request); return; } } + if (type == typeof(InsightsModels.InsightsGetPendingOperationsRequest)) { if (_instance.OnInsightsGetPendingOperationsRequestEvent != null) { _instance.OnInsightsGetPendingOperationsRequestEvent((InsightsModels.InsightsGetPendingOperationsRequest)e.Request); return; } } + if (type == typeof(InsightsModels.InsightsSetPerformanceRequest)) { if (_instance.OnInsightsSetPerformanceRequestEvent != null) { _instance.OnInsightsSetPerformanceRequestEvent((InsightsModels.InsightsSetPerformanceRequest)e.Request); return; } } + if (type == typeof(InsightsModels.InsightsSetStorageRetentionRequest)) { if (_instance.OnInsightsSetStorageRetentionRequestEvent != null) { _instance.OnInsightsSetStorageRetentionRequestEvent((InsightsModels.InsightsSetStorageRetentionRequest)e.Request); return; } } +#endif +#if !DISABLE_PLAYFABENTITY_API + if (type == typeof(GroupsModels.AcceptGroupApplicationRequest)) { if (_instance.OnGroupsAcceptGroupApplicationRequestEvent != null) { _instance.OnGroupsAcceptGroupApplicationRequestEvent((GroupsModels.AcceptGroupApplicationRequest)e.Request); return; } } + if (type == typeof(GroupsModels.AcceptGroupInvitationRequest)) { if (_instance.OnGroupsAcceptGroupInvitationRequestEvent != null) { _instance.OnGroupsAcceptGroupInvitationRequestEvent((GroupsModels.AcceptGroupInvitationRequest)e.Request); return; } } + if (type == typeof(GroupsModels.AddMembersRequest)) { if (_instance.OnGroupsAddMembersRequestEvent != null) { _instance.OnGroupsAddMembersRequestEvent((GroupsModels.AddMembersRequest)e.Request); return; } } + if (type == typeof(GroupsModels.ApplyToGroupRequest)) { if (_instance.OnGroupsApplyToGroupRequestEvent != null) { _instance.OnGroupsApplyToGroupRequestEvent((GroupsModels.ApplyToGroupRequest)e.Request); return; } } + if (type == typeof(GroupsModels.BlockEntityRequest)) { if (_instance.OnGroupsBlockEntityRequestEvent != null) { _instance.OnGroupsBlockEntityRequestEvent((GroupsModels.BlockEntityRequest)e.Request); return; } } + if (type == typeof(GroupsModels.ChangeMemberRoleRequest)) { if (_instance.OnGroupsChangeMemberRoleRequestEvent != null) { _instance.OnGroupsChangeMemberRoleRequestEvent((GroupsModels.ChangeMemberRoleRequest)e.Request); return; } } + if (type == typeof(GroupsModels.CreateGroupRequest)) { if (_instance.OnGroupsCreateGroupRequestEvent != null) { _instance.OnGroupsCreateGroupRequestEvent((GroupsModels.CreateGroupRequest)e.Request); return; } } + if (type == typeof(GroupsModels.CreateGroupRoleRequest)) { if (_instance.OnGroupsCreateRoleRequestEvent != null) { _instance.OnGroupsCreateRoleRequestEvent((GroupsModels.CreateGroupRoleRequest)e.Request); return; } } + if (type == typeof(GroupsModels.DeleteGroupRequest)) { if (_instance.OnGroupsDeleteGroupRequestEvent != null) { _instance.OnGroupsDeleteGroupRequestEvent((GroupsModels.DeleteGroupRequest)e.Request); return; } } + if (type == typeof(GroupsModels.DeleteRoleRequest)) { if (_instance.OnGroupsDeleteRoleRequestEvent != null) { _instance.OnGroupsDeleteRoleRequestEvent((GroupsModels.DeleteRoleRequest)e.Request); return; } } + if (type == typeof(GroupsModels.GetGroupRequest)) { if (_instance.OnGroupsGetGroupRequestEvent != null) { _instance.OnGroupsGetGroupRequestEvent((GroupsModels.GetGroupRequest)e.Request); return; } } + if (type == typeof(GroupsModels.InviteToGroupRequest)) { if (_instance.OnGroupsInviteToGroupRequestEvent != null) { _instance.OnGroupsInviteToGroupRequestEvent((GroupsModels.InviteToGroupRequest)e.Request); return; } } + if (type == typeof(GroupsModels.IsMemberRequest)) { if (_instance.OnGroupsIsMemberRequestEvent != null) { _instance.OnGroupsIsMemberRequestEvent((GroupsModels.IsMemberRequest)e.Request); return; } } + if (type == typeof(GroupsModels.ListGroupApplicationsRequest)) { if (_instance.OnGroupsListGroupApplicationsRequestEvent != null) { _instance.OnGroupsListGroupApplicationsRequestEvent((GroupsModels.ListGroupApplicationsRequest)e.Request); return; } } + if (type == typeof(GroupsModels.ListGroupBlocksRequest)) { if (_instance.OnGroupsListGroupBlocksRequestEvent != null) { _instance.OnGroupsListGroupBlocksRequestEvent((GroupsModels.ListGroupBlocksRequest)e.Request); return; } } + if (type == typeof(GroupsModels.ListGroupInvitationsRequest)) { if (_instance.OnGroupsListGroupInvitationsRequestEvent != null) { _instance.OnGroupsListGroupInvitationsRequestEvent((GroupsModels.ListGroupInvitationsRequest)e.Request); return; } } + if (type == typeof(GroupsModels.ListGroupMembersRequest)) { if (_instance.OnGroupsListGroupMembersRequestEvent != null) { _instance.OnGroupsListGroupMembersRequestEvent((GroupsModels.ListGroupMembersRequest)e.Request); return; } } + if (type == typeof(GroupsModels.ListMembershipRequest)) { if (_instance.OnGroupsListMembershipRequestEvent != null) { _instance.OnGroupsListMembershipRequestEvent((GroupsModels.ListMembershipRequest)e.Request); return; } } + if (type == typeof(GroupsModels.ListMembershipOpportunitiesRequest)) { if (_instance.OnGroupsListMembershipOpportunitiesRequestEvent != null) { _instance.OnGroupsListMembershipOpportunitiesRequestEvent((GroupsModels.ListMembershipOpportunitiesRequest)e.Request); return; } } + if (type == typeof(GroupsModels.RemoveGroupApplicationRequest)) { if (_instance.OnGroupsRemoveGroupApplicationRequestEvent != null) { _instance.OnGroupsRemoveGroupApplicationRequestEvent((GroupsModels.RemoveGroupApplicationRequest)e.Request); return; } } + if (type == typeof(GroupsModels.RemoveGroupInvitationRequest)) { if (_instance.OnGroupsRemoveGroupInvitationRequestEvent != null) { _instance.OnGroupsRemoveGroupInvitationRequestEvent((GroupsModels.RemoveGroupInvitationRequest)e.Request); return; } } + if (type == typeof(GroupsModels.RemoveMembersRequest)) { if (_instance.OnGroupsRemoveMembersRequestEvent != null) { _instance.OnGroupsRemoveMembersRequestEvent((GroupsModels.RemoveMembersRequest)e.Request); return; } } + if (type == typeof(GroupsModels.UnblockEntityRequest)) { if (_instance.OnGroupsUnblockEntityRequestEvent != null) { _instance.OnGroupsUnblockEntityRequestEvent((GroupsModels.UnblockEntityRequest)e.Request); return; } } + if (type == typeof(GroupsModels.UpdateGroupRequest)) { if (_instance.OnGroupsUpdateGroupRequestEvent != null) { _instance.OnGroupsUpdateGroupRequestEvent((GroupsModels.UpdateGroupRequest)e.Request); return; } } + if (type == typeof(GroupsModels.UpdateGroupRoleRequest)) { if (_instance.OnGroupsUpdateRoleRequestEvent != null) { _instance.OnGroupsUpdateRoleRequestEvent((GroupsModels.UpdateGroupRoleRequest)e.Request); return; } } +#endif +#if !DISABLE_PLAYFABENTITY_API + if (type == typeof(ProgressionModels.CreateLeaderboardDefinitionRequest)) { if (_instance.OnProgressionCreateLeaderboardDefinitionRequestEvent != null) { _instance.OnProgressionCreateLeaderboardDefinitionRequestEvent((ProgressionModels.CreateLeaderboardDefinitionRequest)e.Request); return; } } + if (type == typeof(ProgressionModels.CreateStatisticDefinitionRequest)) { if (_instance.OnProgressionCreateStatisticDefinitionRequestEvent != null) { _instance.OnProgressionCreateStatisticDefinitionRequestEvent((ProgressionModels.CreateStatisticDefinitionRequest)e.Request); return; } } + if (type == typeof(ProgressionModels.DeleteLeaderboardDefinitionRequest)) { if (_instance.OnProgressionDeleteLeaderboardDefinitionRequestEvent != null) { _instance.OnProgressionDeleteLeaderboardDefinitionRequestEvent((ProgressionModels.DeleteLeaderboardDefinitionRequest)e.Request); return; } } + if (type == typeof(ProgressionModels.DeleteLeaderboardEntriesRequest)) { if (_instance.OnProgressionDeleteLeaderboardEntriesRequestEvent != null) { _instance.OnProgressionDeleteLeaderboardEntriesRequestEvent((ProgressionModels.DeleteLeaderboardEntriesRequest)e.Request); return; } } + if (type == typeof(ProgressionModels.DeleteStatisticDefinitionRequest)) { if (_instance.OnProgressionDeleteStatisticDefinitionRequestEvent != null) { _instance.OnProgressionDeleteStatisticDefinitionRequestEvent((ProgressionModels.DeleteStatisticDefinitionRequest)e.Request); return; } } + if (type == typeof(ProgressionModels.DeleteStatisticsRequest)) { if (_instance.OnProgressionDeleteStatisticsRequestEvent != null) { _instance.OnProgressionDeleteStatisticsRequestEvent((ProgressionModels.DeleteStatisticsRequest)e.Request); return; } } + if (type == typeof(ProgressionModels.GetFriendLeaderboardForEntityRequest)) { if (_instance.OnProgressionGetFriendLeaderboardForEntityRequestEvent != null) { _instance.OnProgressionGetFriendLeaderboardForEntityRequestEvent((ProgressionModels.GetFriendLeaderboardForEntityRequest)e.Request); return; } } + if (type == typeof(ProgressionModels.GetEntityLeaderboardRequest)) { if (_instance.OnProgressionGetLeaderboardRequestEvent != null) { _instance.OnProgressionGetLeaderboardRequestEvent((ProgressionModels.GetEntityLeaderboardRequest)e.Request); return; } } + if (type == typeof(ProgressionModels.GetLeaderboardAroundEntityRequest)) { if (_instance.OnProgressionGetLeaderboardAroundEntityRequestEvent != null) { _instance.OnProgressionGetLeaderboardAroundEntityRequestEvent((ProgressionModels.GetLeaderboardAroundEntityRequest)e.Request); return; } } + if (type == typeof(ProgressionModels.GetLeaderboardDefinitionRequest)) { if (_instance.OnProgressionGetLeaderboardDefinitionRequestEvent != null) { _instance.OnProgressionGetLeaderboardDefinitionRequestEvent((ProgressionModels.GetLeaderboardDefinitionRequest)e.Request); return; } } + if (type == typeof(ProgressionModels.GetLeaderboardForEntitiesRequest)) { if (_instance.OnProgressionGetLeaderboardForEntitiesRequestEvent != null) { _instance.OnProgressionGetLeaderboardForEntitiesRequestEvent((ProgressionModels.GetLeaderboardForEntitiesRequest)e.Request); return; } } + if (type == typeof(ProgressionModels.GetStatisticDefinitionRequest)) { if (_instance.OnProgressionGetStatisticDefinitionRequestEvent != null) { _instance.OnProgressionGetStatisticDefinitionRequestEvent((ProgressionModels.GetStatisticDefinitionRequest)e.Request); return; } } + if (type == typeof(ProgressionModels.GetStatisticsRequest)) { if (_instance.OnProgressionGetStatisticsRequestEvent != null) { _instance.OnProgressionGetStatisticsRequestEvent((ProgressionModels.GetStatisticsRequest)e.Request); return; } } + if (type == typeof(ProgressionModels.GetStatisticsForEntitiesRequest)) { if (_instance.OnProgressionGetStatisticsForEntitiesRequestEvent != null) { _instance.OnProgressionGetStatisticsForEntitiesRequestEvent((ProgressionModels.GetStatisticsForEntitiesRequest)e.Request); return; } } + if (type == typeof(ProgressionModels.IncrementLeaderboardVersionRequest)) { if (_instance.OnProgressionIncrementLeaderboardVersionRequestEvent != null) { _instance.OnProgressionIncrementLeaderboardVersionRequestEvent((ProgressionModels.IncrementLeaderboardVersionRequest)e.Request); return; } } + if (type == typeof(ProgressionModels.IncrementStatisticVersionRequest)) { if (_instance.OnProgressionIncrementStatisticVersionRequestEvent != null) { _instance.OnProgressionIncrementStatisticVersionRequestEvent((ProgressionModels.IncrementStatisticVersionRequest)e.Request); return; } } + if (type == typeof(ProgressionModels.ListLeaderboardDefinitionsRequest)) { if (_instance.OnProgressionListLeaderboardDefinitionsRequestEvent != null) { _instance.OnProgressionListLeaderboardDefinitionsRequestEvent((ProgressionModels.ListLeaderboardDefinitionsRequest)e.Request); return; } } + if (type == typeof(ProgressionModels.ListStatisticDefinitionsRequest)) { if (_instance.OnProgressionListStatisticDefinitionsRequestEvent != null) { _instance.OnProgressionListStatisticDefinitionsRequestEvent((ProgressionModels.ListStatisticDefinitionsRequest)e.Request); return; } } + if (type == typeof(ProgressionModels.UnlinkLeaderboardFromStatisticRequest)) { if (_instance.OnProgressionUnlinkLeaderboardFromStatisticRequestEvent != null) { _instance.OnProgressionUnlinkLeaderboardFromStatisticRequestEvent((ProgressionModels.UnlinkLeaderboardFromStatisticRequest)e.Request); return; } } + if (type == typeof(ProgressionModels.UpdateLeaderboardEntriesRequest)) { if (_instance.OnProgressionUpdateLeaderboardEntriesRequestEvent != null) { _instance.OnProgressionUpdateLeaderboardEntriesRequestEvent((ProgressionModels.UpdateLeaderboardEntriesRequest)e.Request); return; } } + if (type == typeof(ProgressionModels.UpdateStatisticsRequest)) { if (_instance.OnProgressionUpdateStatisticsRequestEvent != null) { _instance.OnProgressionUpdateStatisticsRequestEvent((ProgressionModels.UpdateStatisticsRequest)e.Request); return; } } +#endif +#if !DISABLE_PLAYFABENTITY_API + if (type == typeof(LocalizationModels.GetLanguageListRequest)) { if (_instance.OnLocalizationGetLanguageListRequestEvent != null) { _instance.OnLocalizationGetLanguageListRequestEvent((LocalizationModels.GetLanguageListRequest)e.Request); return; } } +#endif +#if !DISABLE_PLAYFABENTITY_API + if (type == typeof(MultiplayerModels.CancelAllMatchmakingTicketsForPlayerRequest)) { if (_instance.OnMultiplayerCancelAllMatchmakingTicketsForPlayerRequestEvent != null) { _instance.OnMultiplayerCancelAllMatchmakingTicketsForPlayerRequestEvent((MultiplayerModels.CancelAllMatchmakingTicketsForPlayerRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.CancelAllServerBackfillTicketsForPlayerRequest)) { if (_instance.OnMultiplayerCancelAllServerBackfillTicketsForPlayerRequestEvent != null) { _instance.OnMultiplayerCancelAllServerBackfillTicketsForPlayerRequestEvent((MultiplayerModels.CancelAllServerBackfillTicketsForPlayerRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.CancelMatchmakingTicketRequest)) { if (_instance.OnMultiplayerCancelMatchmakingTicketRequestEvent != null) { _instance.OnMultiplayerCancelMatchmakingTicketRequestEvent((MultiplayerModels.CancelMatchmakingTicketRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.CancelServerBackfillTicketRequest)) { if (_instance.OnMultiplayerCancelServerBackfillTicketRequestEvent != null) { _instance.OnMultiplayerCancelServerBackfillTicketRequestEvent((MultiplayerModels.CancelServerBackfillTicketRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.CreateBuildAliasRequest)) { if (_instance.OnMultiplayerCreateBuildAliasRequestEvent != null) { _instance.OnMultiplayerCreateBuildAliasRequestEvent((MultiplayerModels.CreateBuildAliasRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.CreateBuildWithCustomContainerRequest)) { if (_instance.OnMultiplayerCreateBuildWithCustomContainerRequestEvent != null) { _instance.OnMultiplayerCreateBuildWithCustomContainerRequestEvent((MultiplayerModels.CreateBuildWithCustomContainerRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.CreateBuildWithManagedContainerRequest)) { if (_instance.OnMultiplayerCreateBuildWithManagedContainerRequestEvent != null) { _instance.OnMultiplayerCreateBuildWithManagedContainerRequestEvent((MultiplayerModels.CreateBuildWithManagedContainerRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.CreateBuildWithProcessBasedServerRequest)) { if (_instance.OnMultiplayerCreateBuildWithProcessBasedServerRequestEvent != null) { _instance.OnMultiplayerCreateBuildWithProcessBasedServerRequestEvent((MultiplayerModels.CreateBuildWithProcessBasedServerRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.CreateLobbyRequest)) { if (_instance.OnMultiplayerCreateLobbyRequestEvent != null) { _instance.OnMultiplayerCreateLobbyRequestEvent((MultiplayerModels.CreateLobbyRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.CreateMatchmakingTicketRequest)) { if (_instance.OnMultiplayerCreateMatchmakingTicketRequestEvent != null) { _instance.OnMultiplayerCreateMatchmakingTicketRequestEvent((MultiplayerModels.CreateMatchmakingTicketRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.CreateRemoteUserRequest)) { if (_instance.OnMultiplayerCreateRemoteUserRequestEvent != null) { _instance.OnMultiplayerCreateRemoteUserRequestEvent((MultiplayerModels.CreateRemoteUserRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.CreateServerBackfillTicketRequest)) { if (_instance.OnMultiplayerCreateServerBackfillTicketRequestEvent != null) { _instance.OnMultiplayerCreateServerBackfillTicketRequestEvent((MultiplayerModels.CreateServerBackfillTicketRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.CreateServerMatchmakingTicketRequest)) { if (_instance.OnMultiplayerCreateServerMatchmakingTicketRequestEvent != null) { _instance.OnMultiplayerCreateServerMatchmakingTicketRequestEvent((MultiplayerModels.CreateServerMatchmakingTicketRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.CreateTitleMultiplayerServersQuotaChangeRequest)) { if (_instance.OnMultiplayerCreateTitleMultiplayerServersQuotaChangeRequestEvent != null) { _instance.OnMultiplayerCreateTitleMultiplayerServersQuotaChangeRequestEvent((MultiplayerModels.CreateTitleMultiplayerServersQuotaChangeRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.DeleteAssetRequest)) { if (_instance.OnMultiplayerDeleteAssetRequestEvent != null) { _instance.OnMultiplayerDeleteAssetRequestEvent((MultiplayerModels.DeleteAssetRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.DeleteBuildRequest)) { if (_instance.OnMultiplayerDeleteBuildRequestEvent != null) { _instance.OnMultiplayerDeleteBuildRequestEvent((MultiplayerModels.DeleteBuildRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.DeleteBuildAliasRequest)) { if (_instance.OnMultiplayerDeleteBuildAliasRequestEvent != null) { _instance.OnMultiplayerDeleteBuildAliasRequestEvent((MultiplayerModels.DeleteBuildAliasRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.DeleteBuildRegionRequest)) { if (_instance.OnMultiplayerDeleteBuildRegionRequestEvent != null) { _instance.OnMultiplayerDeleteBuildRegionRequestEvent((MultiplayerModels.DeleteBuildRegionRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.DeleteCertificateRequest)) { if (_instance.OnMultiplayerDeleteCertificateRequestEvent != null) { _instance.OnMultiplayerDeleteCertificateRequestEvent((MultiplayerModels.DeleteCertificateRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.DeleteContainerImageRequest)) { if (_instance.OnMultiplayerDeleteContainerImageRepositoryRequestEvent != null) { _instance.OnMultiplayerDeleteContainerImageRepositoryRequestEvent((MultiplayerModels.DeleteContainerImageRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.DeleteLobbyRequest)) { if (_instance.OnMultiplayerDeleteLobbyRequestEvent != null) { _instance.OnMultiplayerDeleteLobbyRequestEvent((MultiplayerModels.DeleteLobbyRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.DeleteRemoteUserRequest)) { if (_instance.OnMultiplayerDeleteRemoteUserRequestEvent != null) { _instance.OnMultiplayerDeleteRemoteUserRequestEvent((MultiplayerModels.DeleteRemoteUserRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.DeleteSecretRequest)) { if (_instance.OnMultiplayerDeleteSecretRequestEvent != null) { _instance.OnMultiplayerDeleteSecretRequestEvent((MultiplayerModels.DeleteSecretRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.EnableMultiplayerServersForTitleRequest)) { if (_instance.OnMultiplayerEnableMultiplayerServersForTitleRequestEvent != null) { _instance.OnMultiplayerEnableMultiplayerServersForTitleRequestEvent((MultiplayerModels.EnableMultiplayerServersForTitleRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.FindFriendLobbiesRequest)) { if (_instance.OnMultiplayerFindFriendLobbiesRequestEvent != null) { _instance.OnMultiplayerFindFriendLobbiesRequestEvent((MultiplayerModels.FindFriendLobbiesRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.FindLobbiesRequest)) { if (_instance.OnMultiplayerFindLobbiesRequestEvent != null) { _instance.OnMultiplayerFindLobbiesRequestEvent((MultiplayerModels.FindLobbiesRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.GetAssetDownloadUrlRequest)) { if (_instance.OnMultiplayerGetAssetDownloadUrlRequestEvent != null) { _instance.OnMultiplayerGetAssetDownloadUrlRequestEvent((MultiplayerModels.GetAssetDownloadUrlRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.GetAssetUploadUrlRequest)) { if (_instance.OnMultiplayerGetAssetUploadUrlRequestEvent != null) { _instance.OnMultiplayerGetAssetUploadUrlRequestEvent((MultiplayerModels.GetAssetUploadUrlRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.GetBuildRequest)) { if (_instance.OnMultiplayerGetBuildRequestEvent != null) { _instance.OnMultiplayerGetBuildRequestEvent((MultiplayerModels.GetBuildRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.GetBuildAliasRequest)) { if (_instance.OnMultiplayerGetBuildAliasRequestEvent != null) { _instance.OnMultiplayerGetBuildAliasRequestEvent((MultiplayerModels.GetBuildAliasRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.GetContainerRegistryCredentialsRequest)) { if (_instance.OnMultiplayerGetContainerRegistryCredentialsRequestEvent != null) { _instance.OnMultiplayerGetContainerRegistryCredentialsRequestEvent((MultiplayerModels.GetContainerRegistryCredentialsRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.GetLobbyRequest)) { if (_instance.OnMultiplayerGetLobbyRequestEvent != null) { _instance.OnMultiplayerGetLobbyRequestEvent((MultiplayerModels.GetLobbyRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.GetMatchRequest)) { if (_instance.OnMultiplayerGetMatchRequestEvent != null) { _instance.OnMultiplayerGetMatchRequestEvent((MultiplayerModels.GetMatchRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.GetMatchmakingQueueRequest)) { if (_instance.OnMultiplayerGetMatchmakingQueueRequestEvent != null) { _instance.OnMultiplayerGetMatchmakingQueueRequestEvent((MultiplayerModels.GetMatchmakingQueueRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.GetMatchmakingTicketRequest)) { if (_instance.OnMultiplayerGetMatchmakingTicketRequestEvent != null) { _instance.OnMultiplayerGetMatchmakingTicketRequestEvent((MultiplayerModels.GetMatchmakingTicketRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.GetMultiplayerServerDetailsRequest)) { if (_instance.OnMultiplayerGetMultiplayerServerDetailsRequestEvent != null) { _instance.OnMultiplayerGetMultiplayerServerDetailsRequestEvent((MultiplayerModels.GetMultiplayerServerDetailsRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.GetMultiplayerServerLogsRequest)) { if (_instance.OnMultiplayerGetMultiplayerServerLogsRequestEvent != null) { _instance.OnMultiplayerGetMultiplayerServerLogsRequestEvent((MultiplayerModels.GetMultiplayerServerLogsRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.GetMultiplayerSessionLogsBySessionIdRequest)) { if (_instance.OnMultiplayerGetMultiplayerSessionLogsBySessionIdRequestEvent != null) { _instance.OnMultiplayerGetMultiplayerSessionLogsBySessionIdRequestEvent((MultiplayerModels.GetMultiplayerSessionLogsBySessionIdRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.GetQueueStatisticsRequest)) { if (_instance.OnMultiplayerGetQueueStatisticsRequestEvent != null) { _instance.OnMultiplayerGetQueueStatisticsRequestEvent((MultiplayerModels.GetQueueStatisticsRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.GetRemoteLoginEndpointRequest)) { if (_instance.OnMultiplayerGetRemoteLoginEndpointRequestEvent != null) { _instance.OnMultiplayerGetRemoteLoginEndpointRequestEvent((MultiplayerModels.GetRemoteLoginEndpointRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.GetServerBackfillTicketRequest)) { if (_instance.OnMultiplayerGetServerBackfillTicketRequestEvent != null) { _instance.OnMultiplayerGetServerBackfillTicketRequestEvent((MultiplayerModels.GetServerBackfillTicketRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.GetTitleEnabledForMultiplayerServersStatusRequest)) { if (_instance.OnMultiplayerGetTitleEnabledForMultiplayerServersStatusRequestEvent != null) { _instance.OnMultiplayerGetTitleEnabledForMultiplayerServersStatusRequestEvent((MultiplayerModels.GetTitleEnabledForMultiplayerServersStatusRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.GetTitleMultiplayerServersQuotaChangeRequest)) { if (_instance.OnMultiplayerGetTitleMultiplayerServersQuotaChangeRequestEvent != null) { _instance.OnMultiplayerGetTitleMultiplayerServersQuotaChangeRequestEvent((MultiplayerModels.GetTitleMultiplayerServersQuotaChangeRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.GetTitleMultiplayerServersQuotasRequest)) { if (_instance.OnMultiplayerGetTitleMultiplayerServersQuotasRequestEvent != null) { _instance.OnMultiplayerGetTitleMultiplayerServersQuotasRequestEvent((MultiplayerModels.GetTitleMultiplayerServersQuotasRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.InviteToLobbyRequest)) { if (_instance.OnMultiplayerInviteToLobbyRequestEvent != null) { _instance.OnMultiplayerInviteToLobbyRequestEvent((MultiplayerModels.InviteToLobbyRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.JoinArrangedLobbyRequest)) { if (_instance.OnMultiplayerJoinArrangedLobbyRequestEvent != null) { _instance.OnMultiplayerJoinArrangedLobbyRequestEvent((MultiplayerModels.JoinArrangedLobbyRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.JoinLobbyRequest)) { if (_instance.OnMultiplayerJoinLobbyRequestEvent != null) { _instance.OnMultiplayerJoinLobbyRequestEvent((MultiplayerModels.JoinLobbyRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.JoinLobbyAsServerRequest)) { if (_instance.OnMultiplayerJoinLobbyAsServerRequestEvent != null) { _instance.OnMultiplayerJoinLobbyAsServerRequestEvent((MultiplayerModels.JoinLobbyAsServerRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.JoinMatchmakingTicketRequest)) { if (_instance.OnMultiplayerJoinMatchmakingTicketRequestEvent != null) { _instance.OnMultiplayerJoinMatchmakingTicketRequestEvent((MultiplayerModels.JoinMatchmakingTicketRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.LeaveLobbyRequest)) { if (_instance.OnMultiplayerLeaveLobbyRequestEvent != null) { _instance.OnMultiplayerLeaveLobbyRequestEvent((MultiplayerModels.LeaveLobbyRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.LeaveLobbyAsServerRequest)) { if (_instance.OnMultiplayerLeaveLobbyAsServerRequestEvent != null) { _instance.OnMultiplayerLeaveLobbyAsServerRequestEvent((MultiplayerModels.LeaveLobbyAsServerRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.ListMultiplayerServersRequest)) { if (_instance.OnMultiplayerListArchivedMultiplayerServersRequestEvent != null) { _instance.OnMultiplayerListArchivedMultiplayerServersRequestEvent((MultiplayerModels.ListMultiplayerServersRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.ListAssetSummariesRequest)) { if (_instance.OnMultiplayerListAssetSummariesRequestEvent != null) { _instance.OnMultiplayerListAssetSummariesRequestEvent((MultiplayerModels.ListAssetSummariesRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.ListBuildAliasesRequest)) { if (_instance.OnMultiplayerListBuildAliasesRequestEvent != null) { _instance.OnMultiplayerListBuildAliasesRequestEvent((MultiplayerModels.ListBuildAliasesRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.ListBuildSummariesRequest)) { if (_instance.OnMultiplayerListBuildSummariesV2RequestEvent != null) { _instance.OnMultiplayerListBuildSummariesV2RequestEvent((MultiplayerModels.ListBuildSummariesRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.ListCertificateSummariesRequest)) { if (_instance.OnMultiplayerListCertificateSummariesRequestEvent != null) { _instance.OnMultiplayerListCertificateSummariesRequestEvent((MultiplayerModels.ListCertificateSummariesRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.ListContainerImagesRequest)) { if (_instance.OnMultiplayerListContainerImagesRequestEvent != null) { _instance.OnMultiplayerListContainerImagesRequestEvent((MultiplayerModels.ListContainerImagesRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.ListContainerImageTagsRequest)) { if (_instance.OnMultiplayerListContainerImageTagsRequestEvent != null) { _instance.OnMultiplayerListContainerImageTagsRequestEvent((MultiplayerModels.ListContainerImageTagsRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.ListMatchmakingQueuesRequest)) { if (_instance.OnMultiplayerListMatchmakingQueuesRequestEvent != null) { _instance.OnMultiplayerListMatchmakingQueuesRequestEvent((MultiplayerModels.ListMatchmakingQueuesRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.ListMatchmakingTicketsForPlayerRequest)) { if (_instance.OnMultiplayerListMatchmakingTicketsForPlayerRequestEvent != null) { _instance.OnMultiplayerListMatchmakingTicketsForPlayerRequestEvent((MultiplayerModels.ListMatchmakingTicketsForPlayerRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.ListMultiplayerServersRequest)) { if (_instance.OnMultiplayerListMultiplayerServersRequestEvent != null) { _instance.OnMultiplayerListMultiplayerServersRequestEvent((MultiplayerModels.ListMultiplayerServersRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.ListPartyQosServersRequest)) { if (_instance.OnMultiplayerListPartyQosServersRequestEvent != null) { _instance.OnMultiplayerListPartyQosServersRequestEvent((MultiplayerModels.ListPartyQosServersRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.ListQosServersForTitleRequest)) { if (_instance.OnMultiplayerListQosServersForTitleRequestEvent != null) { _instance.OnMultiplayerListQosServersForTitleRequestEvent((MultiplayerModels.ListQosServersForTitleRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.ListSecretSummariesRequest)) { if (_instance.OnMultiplayerListSecretSummariesRequestEvent != null) { _instance.OnMultiplayerListSecretSummariesRequestEvent((MultiplayerModels.ListSecretSummariesRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.ListServerBackfillTicketsForPlayerRequest)) { if (_instance.OnMultiplayerListServerBackfillTicketsForPlayerRequestEvent != null) { _instance.OnMultiplayerListServerBackfillTicketsForPlayerRequestEvent((MultiplayerModels.ListServerBackfillTicketsForPlayerRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.ListTitleMultiplayerServersQuotaChangesRequest)) { if (_instance.OnMultiplayerListTitleMultiplayerServersQuotaChangesRequestEvent != null) { _instance.OnMultiplayerListTitleMultiplayerServersQuotaChangesRequestEvent((MultiplayerModels.ListTitleMultiplayerServersQuotaChangesRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.ListVirtualMachineSummariesRequest)) { if (_instance.OnMultiplayerListVirtualMachineSummariesRequestEvent != null) { _instance.OnMultiplayerListVirtualMachineSummariesRequestEvent((MultiplayerModels.ListVirtualMachineSummariesRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.RemoveMatchmakingQueueRequest)) { if (_instance.OnMultiplayerRemoveMatchmakingQueueRequestEvent != null) { _instance.OnMultiplayerRemoveMatchmakingQueueRequestEvent((MultiplayerModels.RemoveMatchmakingQueueRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.RemoveMemberFromLobbyRequest)) { if (_instance.OnMultiplayerRemoveMemberRequestEvent != null) { _instance.OnMultiplayerRemoveMemberRequestEvent((MultiplayerModels.RemoveMemberFromLobbyRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.RequestMultiplayerServerRequest)) { if (_instance.OnMultiplayerRequestMultiplayerServerRequestEvent != null) { _instance.OnMultiplayerRequestMultiplayerServerRequestEvent((MultiplayerModels.RequestMultiplayerServerRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.RequestPartyServiceRequest)) { if (_instance.OnMultiplayerRequestPartyServiceRequestEvent != null) { _instance.OnMultiplayerRequestPartyServiceRequestEvent((MultiplayerModels.RequestPartyServiceRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.RolloverContainerRegistryCredentialsRequest)) { if (_instance.OnMultiplayerRolloverContainerRegistryCredentialsRequestEvent != null) { _instance.OnMultiplayerRolloverContainerRegistryCredentialsRequestEvent((MultiplayerModels.RolloverContainerRegistryCredentialsRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.SetMatchmakingQueueRequest)) { if (_instance.OnMultiplayerSetMatchmakingQueueRequestEvent != null) { _instance.OnMultiplayerSetMatchmakingQueueRequestEvent((MultiplayerModels.SetMatchmakingQueueRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.ShutdownMultiplayerServerRequest)) { if (_instance.OnMultiplayerShutdownMultiplayerServerRequestEvent != null) { _instance.OnMultiplayerShutdownMultiplayerServerRequestEvent((MultiplayerModels.ShutdownMultiplayerServerRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.SubscribeToLobbyResourceRequest)) { if (_instance.OnMultiplayerSubscribeToLobbyResourceRequestEvent != null) { _instance.OnMultiplayerSubscribeToLobbyResourceRequestEvent((MultiplayerModels.SubscribeToLobbyResourceRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.SubscribeToMatchResourceRequest)) { if (_instance.OnMultiplayerSubscribeToMatchmakingResourceRequestEvent != null) { _instance.OnMultiplayerSubscribeToMatchmakingResourceRequestEvent((MultiplayerModels.SubscribeToMatchResourceRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.UnsubscribeFromLobbyResourceRequest)) { if (_instance.OnMultiplayerUnsubscribeFromLobbyResourceRequestEvent != null) { _instance.OnMultiplayerUnsubscribeFromLobbyResourceRequestEvent((MultiplayerModels.UnsubscribeFromLobbyResourceRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.UnsubscribeFromMatchResourceRequest)) { if (_instance.OnMultiplayerUnsubscribeFromMatchmakingResourceRequestEvent != null) { _instance.OnMultiplayerUnsubscribeFromMatchmakingResourceRequestEvent((MultiplayerModels.UnsubscribeFromMatchResourceRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.UntagContainerImageRequest)) { if (_instance.OnMultiplayerUntagContainerImageRequestEvent != null) { _instance.OnMultiplayerUntagContainerImageRequestEvent((MultiplayerModels.UntagContainerImageRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.UpdateBuildAliasRequest)) { if (_instance.OnMultiplayerUpdateBuildAliasRequestEvent != null) { _instance.OnMultiplayerUpdateBuildAliasRequestEvent((MultiplayerModels.UpdateBuildAliasRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.UpdateBuildNameRequest)) { if (_instance.OnMultiplayerUpdateBuildNameRequestEvent != null) { _instance.OnMultiplayerUpdateBuildNameRequestEvent((MultiplayerModels.UpdateBuildNameRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.UpdateBuildRegionRequest)) { if (_instance.OnMultiplayerUpdateBuildRegionRequestEvent != null) { _instance.OnMultiplayerUpdateBuildRegionRequestEvent((MultiplayerModels.UpdateBuildRegionRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.UpdateBuildRegionsRequest)) { if (_instance.OnMultiplayerUpdateBuildRegionsRequestEvent != null) { _instance.OnMultiplayerUpdateBuildRegionsRequestEvent((MultiplayerModels.UpdateBuildRegionsRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.UpdateLobbyRequest)) { if (_instance.OnMultiplayerUpdateLobbyRequestEvent != null) { _instance.OnMultiplayerUpdateLobbyRequestEvent((MultiplayerModels.UpdateLobbyRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.UpdateLobbyAsServerRequest)) { if (_instance.OnMultiplayerUpdateLobbyAsServerRequestEvent != null) { _instance.OnMultiplayerUpdateLobbyAsServerRequestEvent((MultiplayerModels.UpdateLobbyAsServerRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.UploadCertificateRequest)) { if (_instance.OnMultiplayerUploadCertificateRequestEvent != null) { _instance.OnMultiplayerUploadCertificateRequestEvent((MultiplayerModels.UploadCertificateRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.UploadSecretRequest)) { if (_instance.OnMultiplayerUploadSecretRequestEvent != null) { _instance.OnMultiplayerUploadSecretRequestEvent((MultiplayerModels.UploadSecretRequest)e.Request); return; } } +#endif +#if !DISABLE_PLAYFABENTITY_API + if (type == typeof(ProfilesModels.GetGlobalPolicyRequest)) { if (_instance.OnProfilesGetGlobalPolicyRequestEvent != null) { _instance.OnProfilesGetGlobalPolicyRequestEvent((ProfilesModels.GetGlobalPolicyRequest)e.Request); return; } } + if (type == typeof(ProfilesModels.GetEntityProfileRequest)) { if (_instance.OnProfilesGetProfileRequestEvent != null) { _instance.OnProfilesGetProfileRequestEvent((ProfilesModels.GetEntityProfileRequest)e.Request); return; } } + if (type == typeof(ProfilesModels.GetEntityProfilesRequest)) { if (_instance.OnProfilesGetProfilesRequestEvent != null) { _instance.OnProfilesGetProfilesRequestEvent((ProfilesModels.GetEntityProfilesRequest)e.Request); return; } } + if (type == typeof(ProfilesModels.GetTitlePlayersFromMasterPlayerAccountIdsRequest)) { if (_instance.OnProfilesGetTitlePlayersFromMasterPlayerAccountIdsRequestEvent != null) { _instance.OnProfilesGetTitlePlayersFromMasterPlayerAccountIdsRequestEvent((ProfilesModels.GetTitlePlayersFromMasterPlayerAccountIdsRequest)e.Request); return; } } + if (type == typeof(ProfilesModels.GetTitlePlayersFromXboxLiveIDsRequest)) { if (_instance.OnProfilesGetTitlePlayersFromXboxLiveIDsRequestEvent != null) { _instance.OnProfilesGetTitlePlayersFromXboxLiveIDsRequestEvent((ProfilesModels.GetTitlePlayersFromXboxLiveIDsRequest)e.Request); return; } } + if (type == typeof(ProfilesModels.SetDisplayNameRequest)) { if (_instance.OnProfilesSetDisplayNameRequestEvent != null) { _instance.OnProfilesSetDisplayNameRequestEvent((ProfilesModels.SetDisplayNameRequest)e.Request); return; } } + if (type == typeof(ProfilesModels.SetGlobalPolicyRequest)) { if (_instance.OnProfilesSetGlobalPolicyRequestEvent != null) { _instance.OnProfilesSetGlobalPolicyRequestEvent((ProfilesModels.SetGlobalPolicyRequest)e.Request); return; } } + if (type == typeof(ProfilesModels.SetProfileLanguageRequest)) { if (_instance.OnProfilesSetProfileLanguageRequestEvent != null) { _instance.OnProfilesSetProfileLanguageRequestEvent((ProfilesModels.SetProfileLanguageRequest)e.Request); return; } } + if (type == typeof(ProfilesModels.SetEntityProfilePolicyRequest)) { if (_instance.OnProfilesSetProfilePolicyRequestEvent != null) { _instance.OnProfilesSetProfilePolicyRequestEvent((ProfilesModels.SetEntityProfilePolicyRequest)e.Request); return; } } +#endif +#if ENABLE_PLAYFABSERVER_API +#endif +#if !DISABLE_PLAYFABENTITY_API + if (type == typeof(AddonModels.CreateOrUpdateAppleRequest)) { if (_instance.OnAddonCreateOrUpdateAppleRequestEvent != null) { _instance.OnAddonCreateOrUpdateAppleRequestEvent((AddonModels.CreateOrUpdateAppleRequest)e.Request); return; } } + if (type == typeof(AddonModels.CreateOrUpdateFacebookRequest)) { if (_instance.OnAddonCreateOrUpdateFacebookRequestEvent != null) { _instance.OnAddonCreateOrUpdateFacebookRequestEvent((AddonModels.CreateOrUpdateFacebookRequest)e.Request); return; } } + if (type == typeof(AddonModels.CreateOrUpdateFacebookInstantGamesRequest)) { if (_instance.OnAddonCreateOrUpdateFacebookInstantGamesRequestEvent != null) { _instance.OnAddonCreateOrUpdateFacebookInstantGamesRequestEvent((AddonModels.CreateOrUpdateFacebookInstantGamesRequest)e.Request); return; } } + if (type == typeof(AddonModels.CreateOrUpdateGoogleRequest)) { if (_instance.OnAddonCreateOrUpdateGoogleRequestEvent != null) { _instance.OnAddonCreateOrUpdateGoogleRequestEvent((AddonModels.CreateOrUpdateGoogleRequest)e.Request); return; } } + if (type == typeof(AddonModels.CreateOrUpdateKongregateRequest)) { if (_instance.OnAddonCreateOrUpdateKongregateRequestEvent != null) { _instance.OnAddonCreateOrUpdateKongregateRequestEvent((AddonModels.CreateOrUpdateKongregateRequest)e.Request); return; } } + if (type == typeof(AddonModels.CreateOrUpdateNintendoRequest)) { if (_instance.OnAddonCreateOrUpdateNintendoRequestEvent != null) { _instance.OnAddonCreateOrUpdateNintendoRequestEvent((AddonModels.CreateOrUpdateNintendoRequest)e.Request); return; } } + if (type == typeof(AddonModels.CreateOrUpdatePSNRequest)) { if (_instance.OnAddonCreateOrUpdatePSNRequestEvent != null) { _instance.OnAddonCreateOrUpdatePSNRequestEvent((AddonModels.CreateOrUpdatePSNRequest)e.Request); return; } } + if (type == typeof(AddonModels.CreateOrUpdateSteamRequest)) { if (_instance.OnAddonCreateOrUpdateSteamRequestEvent != null) { _instance.OnAddonCreateOrUpdateSteamRequestEvent((AddonModels.CreateOrUpdateSteamRequest)e.Request); return; } } + if (type == typeof(AddonModels.CreateOrUpdateTwitchRequest)) { if (_instance.OnAddonCreateOrUpdateTwitchRequestEvent != null) { _instance.OnAddonCreateOrUpdateTwitchRequestEvent((AddonModels.CreateOrUpdateTwitchRequest)e.Request); return; } } + if (type == typeof(AddonModels.DeleteAppleRequest)) { if (_instance.OnAddonDeleteAppleRequestEvent != null) { _instance.OnAddonDeleteAppleRequestEvent((AddonModels.DeleteAppleRequest)e.Request); return; } } + if (type == typeof(AddonModels.DeleteFacebookRequest)) { if (_instance.OnAddonDeleteFacebookRequestEvent != null) { _instance.OnAddonDeleteFacebookRequestEvent((AddonModels.DeleteFacebookRequest)e.Request); return; } } + if (type == typeof(AddonModels.DeleteFacebookInstantGamesRequest)) { if (_instance.OnAddonDeleteFacebookInstantGamesRequestEvent != null) { _instance.OnAddonDeleteFacebookInstantGamesRequestEvent((AddonModels.DeleteFacebookInstantGamesRequest)e.Request); return; } } + if (type == typeof(AddonModels.DeleteGoogleRequest)) { if (_instance.OnAddonDeleteGoogleRequestEvent != null) { _instance.OnAddonDeleteGoogleRequestEvent((AddonModels.DeleteGoogleRequest)e.Request); return; } } + if (type == typeof(AddonModels.DeleteKongregateRequest)) { if (_instance.OnAddonDeleteKongregateRequestEvent != null) { _instance.OnAddonDeleteKongregateRequestEvent((AddonModels.DeleteKongregateRequest)e.Request); return; } } + if (type == typeof(AddonModels.DeleteNintendoRequest)) { if (_instance.OnAddonDeleteNintendoRequestEvent != null) { _instance.OnAddonDeleteNintendoRequestEvent((AddonModels.DeleteNintendoRequest)e.Request); return; } } + if (type == typeof(AddonModels.DeletePSNRequest)) { if (_instance.OnAddonDeletePSNRequestEvent != null) { _instance.OnAddonDeletePSNRequestEvent((AddonModels.DeletePSNRequest)e.Request); return; } } + if (type == typeof(AddonModels.DeleteSteamRequest)) { if (_instance.OnAddonDeleteSteamRequestEvent != null) { _instance.OnAddonDeleteSteamRequestEvent((AddonModels.DeleteSteamRequest)e.Request); return; } } + if (type == typeof(AddonModels.DeleteTwitchRequest)) { if (_instance.OnAddonDeleteTwitchRequestEvent != null) { _instance.OnAddonDeleteTwitchRequestEvent((AddonModels.DeleteTwitchRequest)e.Request); return; } } + if (type == typeof(AddonModels.GetAppleRequest)) { if (_instance.OnAddonGetAppleRequestEvent != null) { _instance.OnAddonGetAppleRequestEvent((AddonModels.GetAppleRequest)e.Request); return; } } + if (type == typeof(AddonModels.GetFacebookRequest)) { if (_instance.OnAddonGetFacebookRequestEvent != null) { _instance.OnAddonGetFacebookRequestEvent((AddonModels.GetFacebookRequest)e.Request); return; } } + if (type == typeof(AddonModels.GetFacebookInstantGamesRequest)) { if (_instance.OnAddonGetFacebookInstantGamesRequestEvent != null) { _instance.OnAddonGetFacebookInstantGamesRequestEvent((AddonModels.GetFacebookInstantGamesRequest)e.Request); return; } } + if (type == typeof(AddonModels.GetGoogleRequest)) { if (_instance.OnAddonGetGoogleRequestEvent != null) { _instance.OnAddonGetGoogleRequestEvent((AddonModels.GetGoogleRequest)e.Request); return; } } + if (type == typeof(AddonModels.GetKongregateRequest)) { if (_instance.OnAddonGetKongregateRequestEvent != null) { _instance.OnAddonGetKongregateRequestEvent((AddonModels.GetKongregateRequest)e.Request); return; } } + if (type == typeof(AddonModels.GetNintendoRequest)) { if (_instance.OnAddonGetNintendoRequestEvent != null) { _instance.OnAddonGetNintendoRequestEvent((AddonModels.GetNintendoRequest)e.Request); return; } } + if (type == typeof(AddonModels.GetPSNRequest)) { if (_instance.OnAddonGetPSNRequestEvent != null) { _instance.OnAddonGetPSNRequestEvent((AddonModels.GetPSNRequest)e.Request); return; } } + if (type == typeof(AddonModels.GetSteamRequest)) { if (_instance.OnAddonGetSteamRequestEvent != null) { _instance.OnAddonGetSteamRequestEvent((AddonModels.GetSteamRequest)e.Request); return; } } + if (type == typeof(AddonModels.GetTwitchRequest)) { if (_instance.OnAddonGetTwitchRequestEvent != null) { _instance.OnAddonGetTwitchRequestEvent((AddonModels.GetTwitchRequest)e.Request); return; } } +#endif + + } + else + { + var type = e.Result.GetType(); +#if ENABLE_PLAYFABADMIN_API + + if (type == typeof(AdminModels.EmptyResponse)) { if (_instance.OnAdminAbortTaskInstanceResultEvent != null) { _instance.OnAdminAbortTaskInstanceResultEvent((AdminModels.EmptyResponse)e.Result); return; } } + if (type == typeof(AdminModels.AddLocalizedNewsResult)) { if (_instance.OnAdminAddLocalizedNewsResultEvent != null) { _instance.OnAdminAddLocalizedNewsResultEvent((AdminModels.AddLocalizedNewsResult)e.Result); return; } } + if (type == typeof(AdminModels.AddNewsResult)) { if (_instance.OnAdminAddNewsResultEvent != null) { _instance.OnAdminAddNewsResultEvent((AdminModels.AddNewsResult)e.Result); return; } } + if (type == typeof(AdminModels.AddPlayerTagResult)) { if (_instance.OnAdminAddPlayerTagResultEvent != null) { _instance.OnAdminAddPlayerTagResultEvent((AdminModels.AddPlayerTagResult)e.Result); return; } } + if (type == typeof(AdminModels.ModifyUserVirtualCurrencyResult)) { if (_instance.OnAdminAddUserVirtualCurrencyResultEvent != null) { _instance.OnAdminAddUserVirtualCurrencyResultEvent((AdminModels.ModifyUserVirtualCurrencyResult)e.Result); return; } } + if (type == typeof(AdminModels.BlankResult)) { if (_instance.OnAdminAddVirtualCurrencyTypesResultEvent != null) { _instance.OnAdminAddVirtualCurrencyTypesResultEvent((AdminModels.BlankResult)e.Result); return; } } + if (type == typeof(AdminModels.BanUsersResult)) { if (_instance.OnAdminBanUsersResultEvent != null) { _instance.OnAdminBanUsersResultEvent((AdminModels.BanUsersResult)e.Result); return; } } + if (type == typeof(AdminModels.CheckLimitedEditionItemAvailabilityResult)) { if (_instance.OnAdminCheckLimitedEditionItemAvailabilityResultEvent != null) { _instance.OnAdminCheckLimitedEditionItemAvailabilityResultEvent((AdminModels.CheckLimitedEditionItemAvailabilityResult)e.Result); return; } } + if (type == typeof(AdminModels.CreateTaskResult)) { if (_instance.OnAdminCreateActionsOnPlayersInSegmentTaskResultEvent != null) { _instance.OnAdminCreateActionsOnPlayersInSegmentTaskResultEvent((AdminModels.CreateTaskResult)e.Result); return; } } + if (type == typeof(AdminModels.CreateTaskResult)) { if (_instance.OnAdminCreateCloudScriptTaskResultEvent != null) { _instance.OnAdminCreateCloudScriptTaskResultEvent((AdminModels.CreateTaskResult)e.Result); return; } } + if (type == typeof(AdminModels.CreateTaskResult)) { if (_instance.OnAdminCreateInsightsScheduledScalingTaskResultEvent != null) { _instance.OnAdminCreateInsightsScheduledScalingTaskResultEvent((AdminModels.CreateTaskResult)e.Result); return; } } + if (type == typeof(AdminModels.EmptyResponse)) { if (_instance.OnAdminCreateOpenIdConnectionResultEvent != null) { _instance.OnAdminCreateOpenIdConnectionResultEvent((AdminModels.EmptyResponse)e.Result); return; } } + if (type == typeof(AdminModels.CreatePlayerSharedSecretResult)) { if (_instance.OnAdminCreatePlayerSharedSecretResultEvent != null) { _instance.OnAdminCreatePlayerSharedSecretResultEvent((AdminModels.CreatePlayerSharedSecretResult)e.Result); return; } } + if (type == typeof(AdminModels.CreatePlayerStatisticDefinitionResult)) { if (_instance.OnAdminCreatePlayerStatisticDefinitionResultEvent != null) { _instance.OnAdminCreatePlayerStatisticDefinitionResultEvent((AdminModels.CreatePlayerStatisticDefinitionResult)e.Result); return; } } + if (type == typeof(AdminModels.CreateSegmentResponse)) { if (_instance.OnAdminCreateSegmentResultEvent != null) { _instance.OnAdminCreateSegmentResultEvent((AdminModels.CreateSegmentResponse)e.Result); return; } } + if (type == typeof(AdminModels.BlankResult)) { if (_instance.OnAdminDeleteContentResultEvent != null) { _instance.OnAdminDeleteContentResultEvent((AdminModels.BlankResult)e.Result); return; } } + if (type == typeof(AdminModels.DeleteMasterPlayerAccountResult)) { if (_instance.OnAdminDeleteMasterPlayerAccountResultEvent != null) { _instance.OnAdminDeleteMasterPlayerAccountResultEvent((AdminModels.DeleteMasterPlayerAccountResult)e.Result); return; } } + if (type == typeof(AdminModels.DeleteMasterPlayerEventDataResult)) { if (_instance.OnAdminDeleteMasterPlayerEventDataResultEvent != null) { _instance.OnAdminDeleteMasterPlayerEventDataResultEvent((AdminModels.DeleteMasterPlayerEventDataResult)e.Result); return; } } + if (type == typeof(AdminModels.DeleteMembershipSubscriptionResult)) { if (_instance.OnAdminDeleteMembershipSubscriptionResultEvent != null) { _instance.OnAdminDeleteMembershipSubscriptionResultEvent((AdminModels.DeleteMembershipSubscriptionResult)e.Result); return; } } + if (type == typeof(AdminModels.EmptyResponse)) { if (_instance.OnAdminDeleteOpenIdConnectionResultEvent != null) { _instance.OnAdminDeleteOpenIdConnectionResultEvent((AdminModels.EmptyResponse)e.Result); return; } } + if (type == typeof(AdminModels.DeletePlayerResult)) { if (_instance.OnAdminDeletePlayerResultEvent != null) { _instance.OnAdminDeletePlayerResultEvent((AdminModels.DeletePlayerResult)e.Result); return; } } + if (type == typeof(AdminModels.DeletePlayerSharedSecretResult)) { if (_instance.OnAdminDeletePlayerSharedSecretResultEvent != null) { _instance.OnAdminDeletePlayerSharedSecretResultEvent((AdminModels.DeletePlayerSharedSecretResult)e.Result); return; } } + if (type == typeof(AdminModels.DeleteSegmentsResponse)) { if (_instance.OnAdminDeleteSegmentResultEvent != null) { _instance.OnAdminDeleteSegmentResultEvent((AdminModels.DeleteSegmentsResponse)e.Result); return; } } + if (type == typeof(AdminModels.DeleteStoreResult)) { if (_instance.OnAdminDeleteStoreResultEvent != null) { _instance.OnAdminDeleteStoreResultEvent((AdminModels.DeleteStoreResult)e.Result); return; } } + if (type == typeof(AdminModels.EmptyResponse)) { if (_instance.OnAdminDeleteTaskResultEvent != null) { _instance.OnAdminDeleteTaskResultEvent((AdminModels.EmptyResponse)e.Result); return; } } + if (type == typeof(AdminModels.DeleteTitleResult)) { if (_instance.OnAdminDeleteTitleResultEvent != null) { _instance.OnAdminDeleteTitleResultEvent((AdminModels.DeleteTitleResult)e.Result); return; } } + if (type == typeof(AdminModels.DeleteTitleDataOverrideResult)) { if (_instance.OnAdminDeleteTitleDataOverrideResultEvent != null) { _instance.OnAdminDeleteTitleDataOverrideResultEvent((AdminModels.DeleteTitleDataOverrideResult)e.Result); return; } } + if (type == typeof(AdminModels.ExportMasterPlayerDataResult)) { if (_instance.OnAdminExportMasterPlayerDataResultEvent != null) { _instance.OnAdminExportMasterPlayerDataResultEvent((AdminModels.ExportMasterPlayerDataResult)e.Result); return; } } + if (type == typeof(AdminModels.ExportPlayersInSegmentResult)) { if (_instance.OnAdminExportPlayersInSegmentResultEvent != null) { _instance.OnAdminExportPlayersInSegmentResultEvent((AdminModels.ExportPlayersInSegmentResult)e.Result); return; } } + if (type == typeof(AdminModels.GetActionsOnPlayersInSegmentTaskInstanceResult)) { if (_instance.OnAdminGetActionsOnPlayersInSegmentTaskInstanceResultEvent != null) { _instance.OnAdminGetActionsOnPlayersInSegmentTaskInstanceResultEvent((AdminModels.GetActionsOnPlayersInSegmentTaskInstanceResult)e.Result); return; } } + if (type == typeof(AdminModels.GetAllSegmentsResult)) { if (_instance.OnAdminGetAllSegmentsResultEvent != null) { _instance.OnAdminGetAllSegmentsResultEvent((AdminModels.GetAllSegmentsResult)e.Result); return; } } + if (type == typeof(AdminModels.GetCatalogItemsResult)) { if (_instance.OnAdminGetCatalogItemsResultEvent != null) { _instance.OnAdminGetCatalogItemsResultEvent((AdminModels.GetCatalogItemsResult)e.Result); return; } } + if (type == typeof(AdminModels.GetCloudScriptRevisionResult)) { if (_instance.OnAdminGetCloudScriptRevisionResultEvent != null) { _instance.OnAdminGetCloudScriptRevisionResultEvent((AdminModels.GetCloudScriptRevisionResult)e.Result); return; } } + if (type == typeof(AdminModels.GetCloudScriptTaskInstanceResult)) { if (_instance.OnAdminGetCloudScriptTaskInstanceResultEvent != null) { _instance.OnAdminGetCloudScriptTaskInstanceResultEvent((AdminModels.GetCloudScriptTaskInstanceResult)e.Result); return; } } + if (type == typeof(AdminModels.GetCloudScriptVersionsResult)) { if (_instance.OnAdminGetCloudScriptVersionsResultEvent != null) { _instance.OnAdminGetCloudScriptVersionsResultEvent((AdminModels.GetCloudScriptVersionsResult)e.Result); return; } } + if (type == typeof(AdminModels.GetContentListResult)) { if (_instance.OnAdminGetContentListResultEvent != null) { _instance.OnAdminGetContentListResultEvent((AdminModels.GetContentListResult)e.Result); return; } } + if (type == typeof(AdminModels.GetContentUploadUrlResult)) { if (_instance.OnAdminGetContentUploadUrlResultEvent != null) { _instance.OnAdminGetContentUploadUrlResultEvent((AdminModels.GetContentUploadUrlResult)e.Result); return; } } + if (type == typeof(AdminModels.GetDataReportResult)) { if (_instance.OnAdminGetDataReportResultEvent != null) { _instance.OnAdminGetDataReportResultEvent((AdminModels.GetDataReportResult)e.Result); return; } } + if (type == typeof(AdminModels.GetPlayedTitleListResult)) { if (_instance.OnAdminGetPlayedTitleListResultEvent != null) { _instance.OnAdminGetPlayedTitleListResultEvent((AdminModels.GetPlayedTitleListResult)e.Result); return; } } + if (type == typeof(AdminModels.GetPlayerIdFromAuthTokenResult)) { if (_instance.OnAdminGetPlayerIdFromAuthTokenResultEvent != null) { _instance.OnAdminGetPlayerIdFromAuthTokenResultEvent((AdminModels.GetPlayerIdFromAuthTokenResult)e.Result); return; } } + if (type == typeof(AdminModels.GetPlayerProfileResult)) { if (_instance.OnAdminGetPlayerProfileResultEvent != null) { _instance.OnAdminGetPlayerProfileResultEvent((AdminModels.GetPlayerProfileResult)e.Result); return; } } + if (type == typeof(AdminModels.GetPlayerSegmentsResult)) { if (_instance.OnAdminGetPlayerSegmentsResultEvent != null) { _instance.OnAdminGetPlayerSegmentsResultEvent((AdminModels.GetPlayerSegmentsResult)e.Result); return; } } + if (type == typeof(AdminModels.GetPlayerSharedSecretsResult)) { if (_instance.OnAdminGetPlayerSharedSecretsResultEvent != null) { _instance.OnAdminGetPlayerSharedSecretsResultEvent((AdminModels.GetPlayerSharedSecretsResult)e.Result); return; } } + if (type == typeof(AdminModels.GetPlayersInSegmentResult)) { if (_instance.OnAdminGetPlayersInSegmentResultEvent != null) { _instance.OnAdminGetPlayersInSegmentResultEvent((AdminModels.GetPlayersInSegmentResult)e.Result); return; } } + if (type == typeof(AdminModels.GetPlayerStatisticDefinitionsResult)) { if (_instance.OnAdminGetPlayerStatisticDefinitionsResultEvent != null) { _instance.OnAdminGetPlayerStatisticDefinitionsResultEvent((AdminModels.GetPlayerStatisticDefinitionsResult)e.Result); return; } } + if (type == typeof(AdminModels.GetPlayerStatisticVersionsResult)) { if (_instance.OnAdminGetPlayerStatisticVersionsResultEvent != null) { _instance.OnAdminGetPlayerStatisticVersionsResultEvent((AdminModels.GetPlayerStatisticVersionsResult)e.Result); return; } } + if (type == typeof(AdminModels.GetPlayerTagsResult)) { if (_instance.OnAdminGetPlayerTagsResultEvent != null) { _instance.OnAdminGetPlayerTagsResultEvent((AdminModels.GetPlayerTagsResult)e.Result); return; } } + if (type == typeof(AdminModels.GetPolicyResponse)) { if (_instance.OnAdminGetPolicyResultEvent != null) { _instance.OnAdminGetPolicyResultEvent((AdminModels.GetPolicyResponse)e.Result); return; } } + if (type == typeof(AdminModels.GetPublisherDataResult)) { if (_instance.OnAdminGetPublisherDataResultEvent != null) { _instance.OnAdminGetPublisherDataResultEvent((AdminModels.GetPublisherDataResult)e.Result); return; } } + if (type == typeof(AdminModels.GetRandomResultTablesResult)) { if (_instance.OnAdminGetRandomResultTablesResultEvent != null) { _instance.OnAdminGetRandomResultTablesResultEvent((AdminModels.GetRandomResultTablesResult)e.Result); return; } } + if (type == typeof(AdminModels.GetPlayersInSegmentExportResponse)) { if (_instance.OnAdminGetSegmentExportResultEvent != null) { _instance.OnAdminGetSegmentExportResultEvent((AdminModels.GetPlayersInSegmentExportResponse)e.Result); return; } } + if (type == typeof(AdminModels.GetSegmentsResponse)) { if (_instance.OnAdminGetSegmentsResultEvent != null) { _instance.OnAdminGetSegmentsResultEvent((AdminModels.GetSegmentsResponse)e.Result); return; } } + if (type == typeof(AdminModels.GetStoreItemsResult)) { if (_instance.OnAdminGetStoreItemsResultEvent != null) { _instance.OnAdminGetStoreItemsResultEvent((AdminModels.GetStoreItemsResult)e.Result); return; } } + if (type == typeof(AdminModels.GetTaskInstancesResult)) { if (_instance.OnAdminGetTaskInstancesResultEvent != null) { _instance.OnAdminGetTaskInstancesResultEvent((AdminModels.GetTaskInstancesResult)e.Result); return; } } + if (type == typeof(AdminModels.GetTasksResult)) { if (_instance.OnAdminGetTasksResultEvent != null) { _instance.OnAdminGetTasksResultEvent((AdminModels.GetTasksResult)e.Result); return; } } + if (type == typeof(AdminModels.GetTitleDataResult)) { if (_instance.OnAdminGetTitleDataResultEvent != null) { _instance.OnAdminGetTitleDataResultEvent((AdminModels.GetTitleDataResult)e.Result); return; } } + if (type == typeof(AdminModels.GetTitleDataResult)) { if (_instance.OnAdminGetTitleInternalDataResultEvent != null) { _instance.OnAdminGetTitleInternalDataResultEvent((AdminModels.GetTitleDataResult)e.Result); return; } } + if (type == typeof(AdminModels.LookupUserAccountInfoResult)) { if (_instance.OnAdminGetUserAccountInfoResultEvent != null) { _instance.OnAdminGetUserAccountInfoResultEvent((AdminModels.LookupUserAccountInfoResult)e.Result); return; } } + if (type == typeof(AdminModels.GetUserBansResult)) { if (_instance.OnAdminGetUserBansResultEvent != null) { _instance.OnAdminGetUserBansResultEvent((AdminModels.GetUserBansResult)e.Result); return; } } + if (type == typeof(AdminModels.GetUserDataResult)) { if (_instance.OnAdminGetUserDataResultEvent != null) { _instance.OnAdminGetUserDataResultEvent((AdminModels.GetUserDataResult)e.Result); return; } } + if (type == typeof(AdminModels.GetUserDataResult)) { if (_instance.OnAdminGetUserInternalDataResultEvent != null) { _instance.OnAdminGetUserInternalDataResultEvent((AdminModels.GetUserDataResult)e.Result); return; } } + if (type == typeof(AdminModels.GetUserInventoryResult)) { if (_instance.OnAdminGetUserInventoryResultEvent != null) { _instance.OnAdminGetUserInventoryResultEvent((AdminModels.GetUserInventoryResult)e.Result); return; } } + if (type == typeof(AdminModels.GetUserDataResult)) { if (_instance.OnAdminGetUserPublisherDataResultEvent != null) { _instance.OnAdminGetUserPublisherDataResultEvent((AdminModels.GetUserDataResult)e.Result); return; } } + if (type == typeof(AdminModels.GetUserDataResult)) { if (_instance.OnAdminGetUserPublisherInternalDataResultEvent != null) { _instance.OnAdminGetUserPublisherInternalDataResultEvent((AdminModels.GetUserDataResult)e.Result); return; } } + if (type == typeof(AdminModels.GetUserDataResult)) { if (_instance.OnAdminGetUserPublisherReadOnlyDataResultEvent != null) { _instance.OnAdminGetUserPublisherReadOnlyDataResultEvent((AdminModels.GetUserDataResult)e.Result); return; } } + if (type == typeof(AdminModels.GetUserDataResult)) { if (_instance.OnAdminGetUserReadOnlyDataResultEvent != null) { _instance.OnAdminGetUserReadOnlyDataResultEvent((AdminModels.GetUserDataResult)e.Result); return; } } + if (type == typeof(AdminModels.GrantItemsToUsersResult)) { if (_instance.OnAdminGrantItemsToUsersResultEvent != null) { _instance.OnAdminGrantItemsToUsersResultEvent((AdminModels.GrantItemsToUsersResult)e.Result); return; } } + if (type == typeof(AdminModels.IncrementLimitedEditionItemAvailabilityResult)) { if (_instance.OnAdminIncrementLimitedEditionItemAvailabilityResultEvent != null) { _instance.OnAdminIncrementLimitedEditionItemAvailabilityResultEvent((AdminModels.IncrementLimitedEditionItemAvailabilityResult)e.Result); return; } } + if (type == typeof(AdminModels.IncrementPlayerStatisticVersionResult)) { if (_instance.OnAdminIncrementPlayerStatisticVersionResultEvent != null) { _instance.OnAdminIncrementPlayerStatisticVersionResultEvent((AdminModels.IncrementPlayerStatisticVersionResult)e.Result); return; } } + if (type == typeof(AdminModels.ListOpenIdConnectionResponse)) { if (_instance.OnAdminListOpenIdConnectionResultEvent != null) { _instance.OnAdminListOpenIdConnectionResultEvent((AdminModels.ListOpenIdConnectionResponse)e.Result); return; } } + if (type == typeof(AdminModels.ListVirtualCurrencyTypesResult)) { if (_instance.OnAdminListVirtualCurrencyTypesResultEvent != null) { _instance.OnAdminListVirtualCurrencyTypesResultEvent((AdminModels.ListVirtualCurrencyTypesResult)e.Result); return; } } + if (type == typeof(AdminModels.RefundPurchaseResponse)) { if (_instance.OnAdminRefundPurchaseResultEvent != null) { _instance.OnAdminRefundPurchaseResultEvent((AdminModels.RefundPurchaseResponse)e.Result); return; } } + if (type == typeof(AdminModels.RemovePlayerTagResult)) { if (_instance.OnAdminRemovePlayerTagResultEvent != null) { _instance.OnAdminRemovePlayerTagResultEvent((AdminModels.RemovePlayerTagResult)e.Result); return; } } + if (type == typeof(AdminModels.BlankResult)) { if (_instance.OnAdminRemoveVirtualCurrencyTypesResultEvent != null) { _instance.OnAdminRemoveVirtualCurrencyTypesResultEvent((AdminModels.BlankResult)e.Result); return; } } + if (type == typeof(AdminModels.ResetCharacterStatisticsResult)) { if (_instance.OnAdminResetCharacterStatisticsResultEvent != null) { _instance.OnAdminResetCharacterStatisticsResultEvent((AdminModels.ResetCharacterStatisticsResult)e.Result); return; } } + if (type == typeof(AdminModels.ResetPasswordResult)) { if (_instance.OnAdminResetPasswordResultEvent != null) { _instance.OnAdminResetPasswordResultEvent((AdminModels.ResetPasswordResult)e.Result); return; } } + if (type == typeof(AdminModels.ResetUserStatisticsResult)) { if (_instance.OnAdminResetUserStatisticsResultEvent != null) { _instance.OnAdminResetUserStatisticsResultEvent((AdminModels.ResetUserStatisticsResult)e.Result); return; } } + if (type == typeof(AdminModels.ResolvePurchaseDisputeResponse)) { if (_instance.OnAdminResolvePurchaseDisputeResultEvent != null) { _instance.OnAdminResolvePurchaseDisputeResultEvent((AdminModels.ResolvePurchaseDisputeResponse)e.Result); return; } } + if (type == typeof(AdminModels.RevokeAllBansForUserResult)) { if (_instance.OnAdminRevokeAllBansForUserResultEvent != null) { _instance.OnAdminRevokeAllBansForUserResultEvent((AdminModels.RevokeAllBansForUserResult)e.Result); return; } } + if (type == typeof(AdminModels.RevokeBansResult)) { if (_instance.OnAdminRevokeBansResultEvent != null) { _instance.OnAdminRevokeBansResultEvent((AdminModels.RevokeBansResult)e.Result); return; } } + if (type == typeof(AdminModels.RevokeInventoryResult)) { if (_instance.OnAdminRevokeInventoryItemResultEvent != null) { _instance.OnAdminRevokeInventoryItemResultEvent((AdminModels.RevokeInventoryResult)e.Result); return; } } + if (type == typeof(AdminModels.RevokeInventoryItemsResult)) { if (_instance.OnAdminRevokeInventoryItemsResultEvent != null) { _instance.OnAdminRevokeInventoryItemsResultEvent((AdminModels.RevokeInventoryItemsResult)e.Result); return; } } + if (type == typeof(AdminModels.RunTaskResult)) { if (_instance.OnAdminRunTaskResultEvent != null) { _instance.OnAdminRunTaskResultEvent((AdminModels.RunTaskResult)e.Result); return; } } + if (type == typeof(AdminModels.SendAccountRecoveryEmailResult)) { if (_instance.OnAdminSendAccountRecoveryEmailResultEvent != null) { _instance.OnAdminSendAccountRecoveryEmailResultEvent((AdminModels.SendAccountRecoveryEmailResult)e.Result); return; } } + if (type == typeof(AdminModels.UpdateCatalogItemsResult)) { if (_instance.OnAdminSetCatalogItemsResultEvent != null) { _instance.OnAdminSetCatalogItemsResultEvent((AdminModels.UpdateCatalogItemsResult)e.Result); return; } } + if (type == typeof(AdminModels.SetMembershipOverrideResult)) { if (_instance.OnAdminSetMembershipOverrideResultEvent != null) { _instance.OnAdminSetMembershipOverrideResultEvent((AdminModels.SetMembershipOverrideResult)e.Result); return; } } + if (type == typeof(AdminModels.SetPlayerSecretResult)) { if (_instance.OnAdminSetPlayerSecretResultEvent != null) { _instance.OnAdminSetPlayerSecretResultEvent((AdminModels.SetPlayerSecretResult)e.Result); return; } } + if (type == typeof(AdminModels.SetPublishedRevisionResult)) { if (_instance.OnAdminSetPublishedRevisionResultEvent != null) { _instance.OnAdminSetPublishedRevisionResultEvent((AdminModels.SetPublishedRevisionResult)e.Result); return; } } + if (type == typeof(AdminModels.SetPublisherDataResult)) { if (_instance.OnAdminSetPublisherDataResultEvent != null) { _instance.OnAdminSetPublisherDataResultEvent((AdminModels.SetPublisherDataResult)e.Result); return; } } + if (type == typeof(AdminModels.UpdateStoreItemsResult)) { if (_instance.OnAdminSetStoreItemsResultEvent != null) { _instance.OnAdminSetStoreItemsResultEvent((AdminModels.UpdateStoreItemsResult)e.Result); return; } } + if (type == typeof(AdminModels.SetTitleDataResult)) { if (_instance.OnAdminSetTitleDataResultEvent != null) { _instance.OnAdminSetTitleDataResultEvent((AdminModels.SetTitleDataResult)e.Result); return; } } + if (type == typeof(AdminModels.SetTitleDataAndOverridesResult)) { if (_instance.OnAdminSetTitleDataAndOverridesResultEvent != null) { _instance.OnAdminSetTitleDataAndOverridesResultEvent((AdminModels.SetTitleDataAndOverridesResult)e.Result); return; } } + if (type == typeof(AdminModels.SetTitleDataResult)) { if (_instance.OnAdminSetTitleInternalDataResultEvent != null) { _instance.OnAdminSetTitleInternalDataResultEvent((AdminModels.SetTitleDataResult)e.Result); return; } } + if (type == typeof(AdminModels.SetupPushNotificationResult)) { if (_instance.OnAdminSetupPushNotificationResultEvent != null) { _instance.OnAdminSetupPushNotificationResultEvent((AdminModels.SetupPushNotificationResult)e.Result); return; } } + if (type == typeof(AdminModels.ModifyUserVirtualCurrencyResult)) { if (_instance.OnAdminSubtractUserVirtualCurrencyResultEvent != null) { _instance.OnAdminSubtractUserVirtualCurrencyResultEvent((AdminModels.ModifyUserVirtualCurrencyResult)e.Result); return; } } + if (type == typeof(AdminModels.UpdateBansResult)) { if (_instance.OnAdminUpdateBansResultEvent != null) { _instance.OnAdminUpdateBansResultEvent((AdminModels.UpdateBansResult)e.Result); return; } } + if (type == typeof(AdminModels.UpdateCatalogItemsResult)) { if (_instance.OnAdminUpdateCatalogItemsResultEvent != null) { _instance.OnAdminUpdateCatalogItemsResultEvent((AdminModels.UpdateCatalogItemsResult)e.Result); return; } } + if (type == typeof(AdminModels.UpdateCloudScriptResult)) { if (_instance.OnAdminUpdateCloudScriptResultEvent != null) { _instance.OnAdminUpdateCloudScriptResultEvent((AdminModels.UpdateCloudScriptResult)e.Result); return; } } + if (type == typeof(AdminModels.EmptyResponse)) { if (_instance.OnAdminUpdateOpenIdConnectionResultEvent != null) { _instance.OnAdminUpdateOpenIdConnectionResultEvent((AdminModels.EmptyResponse)e.Result); return; } } + if (type == typeof(AdminModels.UpdatePlayerSharedSecretResult)) { if (_instance.OnAdminUpdatePlayerSharedSecretResultEvent != null) { _instance.OnAdminUpdatePlayerSharedSecretResultEvent((AdminModels.UpdatePlayerSharedSecretResult)e.Result); return; } } + if (type == typeof(AdminModels.UpdatePlayerStatisticDefinitionResult)) { if (_instance.OnAdminUpdatePlayerStatisticDefinitionResultEvent != null) { _instance.OnAdminUpdatePlayerStatisticDefinitionResultEvent((AdminModels.UpdatePlayerStatisticDefinitionResult)e.Result); return; } } + if (type == typeof(AdminModels.UpdatePolicyResponse)) { if (_instance.OnAdminUpdatePolicyResultEvent != null) { _instance.OnAdminUpdatePolicyResultEvent((AdminModels.UpdatePolicyResponse)e.Result); return; } } + if (type == typeof(AdminModels.UpdateRandomResultTablesResult)) { if (_instance.OnAdminUpdateRandomResultTablesResultEvent != null) { _instance.OnAdminUpdateRandomResultTablesResultEvent((AdminModels.UpdateRandomResultTablesResult)e.Result); return; } } + if (type == typeof(AdminModels.UpdateSegmentResponse)) { if (_instance.OnAdminUpdateSegmentResultEvent != null) { _instance.OnAdminUpdateSegmentResultEvent((AdminModels.UpdateSegmentResponse)e.Result); return; } } + if (type == typeof(AdminModels.UpdateStoreItemsResult)) { if (_instance.OnAdminUpdateStoreItemsResultEvent != null) { _instance.OnAdminUpdateStoreItemsResultEvent((AdminModels.UpdateStoreItemsResult)e.Result); return; } } + if (type == typeof(AdminModels.EmptyResponse)) { if (_instance.OnAdminUpdateTaskResultEvent != null) { _instance.OnAdminUpdateTaskResultEvent((AdminModels.EmptyResponse)e.Result); return; } } + if (type == typeof(AdminModels.UpdateUserDataResult)) { if (_instance.OnAdminUpdateUserDataResultEvent != null) { _instance.OnAdminUpdateUserDataResultEvent((AdminModels.UpdateUserDataResult)e.Result); return; } } + if (type == typeof(AdminModels.UpdateUserDataResult)) { if (_instance.OnAdminUpdateUserInternalDataResultEvent != null) { _instance.OnAdminUpdateUserInternalDataResultEvent((AdminModels.UpdateUserDataResult)e.Result); return; } } + if (type == typeof(AdminModels.UpdateUserDataResult)) { if (_instance.OnAdminUpdateUserPublisherDataResultEvent != null) { _instance.OnAdminUpdateUserPublisherDataResultEvent((AdminModels.UpdateUserDataResult)e.Result); return; } } + if (type == typeof(AdminModels.UpdateUserDataResult)) { if (_instance.OnAdminUpdateUserPublisherInternalDataResultEvent != null) { _instance.OnAdminUpdateUserPublisherInternalDataResultEvent((AdminModels.UpdateUserDataResult)e.Result); return; } } + if (type == typeof(AdminModels.UpdateUserDataResult)) { if (_instance.OnAdminUpdateUserPublisherReadOnlyDataResultEvent != null) { _instance.OnAdminUpdateUserPublisherReadOnlyDataResultEvent((AdminModels.UpdateUserDataResult)e.Result); return; } } + if (type == typeof(AdminModels.UpdateUserDataResult)) { if (_instance.OnAdminUpdateUserReadOnlyDataResultEvent != null) { _instance.OnAdminUpdateUserReadOnlyDataResultEvent((AdminModels.UpdateUserDataResult)e.Result); return; } } + if (type == typeof(AdminModels.UpdateUserTitleDisplayNameResult)) { if (_instance.OnAdminUpdateUserTitleDisplayNameResultEvent != null) { _instance.OnAdminUpdateUserTitleDisplayNameResultEvent((AdminModels.UpdateUserTitleDisplayNameResult)e.Result); return; } } +#endif +#if !DISABLE_PLAYFABCLIENT_API + if (type == typeof(ClientModels.LoginResult)) { if (_instance.OnLoginResultEvent != null) { _instance.OnLoginResultEvent((ClientModels.LoginResult)e.Result); return; } } + + if (type == typeof(ClientModels.AcceptTradeResponse)) { if (_instance.OnAcceptTradeResultEvent != null) { _instance.OnAcceptTradeResultEvent((ClientModels.AcceptTradeResponse)e.Result); return; } } + if (type == typeof(ClientModels.AddFriendResult)) { if (_instance.OnAddFriendResultEvent != null) { _instance.OnAddFriendResultEvent((ClientModels.AddFriendResult)e.Result); return; } } + if (type == typeof(ClientModels.AddGenericIDResult)) { if (_instance.OnAddGenericIDResultEvent != null) { _instance.OnAddGenericIDResultEvent((ClientModels.AddGenericIDResult)e.Result); return; } } + if (type == typeof(ClientModels.AddOrUpdateContactEmailResult)) { if (_instance.OnAddOrUpdateContactEmailResultEvent != null) { _instance.OnAddOrUpdateContactEmailResultEvent((ClientModels.AddOrUpdateContactEmailResult)e.Result); return; } } + if (type == typeof(ClientModels.AddSharedGroupMembersResult)) { if (_instance.OnAddSharedGroupMembersResultEvent != null) { _instance.OnAddSharedGroupMembersResultEvent((ClientModels.AddSharedGroupMembersResult)e.Result); return; } } + if (type == typeof(ClientModels.AddUsernamePasswordResult)) { if (_instance.OnAddUsernamePasswordResultEvent != null) { _instance.OnAddUsernamePasswordResultEvent((ClientModels.AddUsernamePasswordResult)e.Result); return; } } + if (type == typeof(ClientModels.ModifyUserVirtualCurrencyResult)) { if (_instance.OnAddUserVirtualCurrencyResultEvent != null) { _instance.OnAddUserVirtualCurrencyResultEvent((ClientModels.ModifyUserVirtualCurrencyResult)e.Result); return; } } + if (type == typeof(ClientModels.AndroidDevicePushNotificationRegistrationResult)) { if (_instance.OnAndroidDevicePushNotificationRegistrationResultEvent != null) { _instance.OnAndroidDevicePushNotificationRegistrationResultEvent((ClientModels.AndroidDevicePushNotificationRegistrationResult)e.Result); return; } } + if (type == typeof(ClientModels.AttributeInstallResult)) { if (_instance.OnAttributeInstallResultEvent != null) { _instance.OnAttributeInstallResultEvent((ClientModels.AttributeInstallResult)e.Result); return; } } + if (type == typeof(ClientModels.CancelTradeResponse)) { if (_instance.OnCancelTradeResultEvent != null) { _instance.OnCancelTradeResultEvent((ClientModels.CancelTradeResponse)e.Result); return; } } + if (type == typeof(ClientModels.ConfirmPurchaseResult)) { if (_instance.OnConfirmPurchaseResultEvent != null) { _instance.OnConfirmPurchaseResultEvent((ClientModels.ConfirmPurchaseResult)e.Result); return; } } + if (type == typeof(ClientModels.ConsumeItemResult)) { if (_instance.OnConsumeItemResultEvent != null) { _instance.OnConsumeItemResultEvent((ClientModels.ConsumeItemResult)e.Result); return; } } + if (type == typeof(ClientModels.ConsumeMicrosoftStoreEntitlementsResponse)) { if (_instance.OnConsumeMicrosoftStoreEntitlementsResultEvent != null) { _instance.OnConsumeMicrosoftStoreEntitlementsResultEvent((ClientModels.ConsumeMicrosoftStoreEntitlementsResponse)e.Result); return; } } + if (type == typeof(ClientModels.ConsumePS5EntitlementsResult)) { if (_instance.OnConsumePS5EntitlementsResultEvent != null) { _instance.OnConsumePS5EntitlementsResultEvent((ClientModels.ConsumePS5EntitlementsResult)e.Result); return; } } + if (type == typeof(ClientModels.ConsumePSNEntitlementsResult)) { if (_instance.OnConsumePSNEntitlementsResultEvent != null) { _instance.OnConsumePSNEntitlementsResultEvent((ClientModels.ConsumePSNEntitlementsResult)e.Result); return; } } + if (type == typeof(ClientModels.ConsumeXboxEntitlementsResult)) { if (_instance.OnConsumeXboxEntitlementsResultEvent != null) { _instance.OnConsumeXboxEntitlementsResultEvent((ClientModels.ConsumeXboxEntitlementsResult)e.Result); return; } } + if (type == typeof(ClientModels.CreateSharedGroupResult)) { if (_instance.OnCreateSharedGroupResultEvent != null) { _instance.OnCreateSharedGroupResultEvent((ClientModels.CreateSharedGroupResult)e.Result); return; } } + if (type == typeof(ClientModels.ExecuteCloudScriptResult)) { if (_instance.OnExecuteCloudScriptResultEvent != null) { _instance.OnExecuteCloudScriptResultEvent((ClientModels.ExecuteCloudScriptResult)e.Result); return; } } + if (type == typeof(ClientModels.GetAccountInfoResult)) { if (_instance.OnGetAccountInfoResultEvent != null) { _instance.OnGetAccountInfoResultEvent((ClientModels.GetAccountInfoResult)e.Result); return; } } + if (type == typeof(ClientModels.GetAdPlacementsResult)) { if (_instance.OnGetAdPlacementsResultEvent != null) { _instance.OnGetAdPlacementsResultEvent((ClientModels.GetAdPlacementsResult)e.Result); return; } } + if (type == typeof(ClientModels.ListUsersCharactersResult)) { if (_instance.OnGetAllUsersCharactersResultEvent != null) { _instance.OnGetAllUsersCharactersResultEvent((ClientModels.ListUsersCharactersResult)e.Result); return; } } + if (type == typeof(ClientModels.GetCatalogItemsResult)) { if (_instance.OnGetCatalogItemsResultEvent != null) { _instance.OnGetCatalogItemsResultEvent((ClientModels.GetCatalogItemsResult)e.Result); return; } } + if (type == typeof(ClientModels.GetCharacterDataResult)) { if (_instance.OnGetCharacterDataResultEvent != null) { _instance.OnGetCharacterDataResultEvent((ClientModels.GetCharacterDataResult)e.Result); return; } } + if (type == typeof(ClientModels.GetCharacterInventoryResult)) { if (_instance.OnGetCharacterInventoryResultEvent != null) { _instance.OnGetCharacterInventoryResultEvent((ClientModels.GetCharacterInventoryResult)e.Result); return; } } + if (type == typeof(ClientModels.GetCharacterLeaderboardResult)) { if (_instance.OnGetCharacterLeaderboardResultEvent != null) { _instance.OnGetCharacterLeaderboardResultEvent((ClientModels.GetCharacterLeaderboardResult)e.Result); return; } } + if (type == typeof(ClientModels.GetCharacterDataResult)) { if (_instance.OnGetCharacterReadOnlyDataResultEvent != null) { _instance.OnGetCharacterReadOnlyDataResultEvent((ClientModels.GetCharacterDataResult)e.Result); return; } } + if (type == typeof(ClientModels.GetCharacterStatisticsResult)) { if (_instance.OnGetCharacterStatisticsResultEvent != null) { _instance.OnGetCharacterStatisticsResultEvent((ClientModels.GetCharacterStatisticsResult)e.Result); return; } } + if (type == typeof(ClientModels.GetContentDownloadUrlResult)) { if (_instance.OnGetContentDownloadUrlResultEvent != null) { _instance.OnGetContentDownloadUrlResultEvent((ClientModels.GetContentDownloadUrlResult)e.Result); return; } } + if (type == typeof(ClientModels.GetLeaderboardResult)) { if (_instance.OnGetFriendLeaderboardResultEvent != null) { _instance.OnGetFriendLeaderboardResultEvent((ClientModels.GetLeaderboardResult)e.Result); return; } } + if (type == typeof(ClientModels.GetFriendLeaderboardAroundPlayerResult)) { if (_instance.OnGetFriendLeaderboardAroundPlayerResultEvent != null) { _instance.OnGetFriendLeaderboardAroundPlayerResultEvent((ClientModels.GetFriendLeaderboardAroundPlayerResult)e.Result); return; } } + if (type == typeof(ClientModels.GetFriendsListResult)) { if (_instance.OnGetFriendsListResultEvent != null) { _instance.OnGetFriendsListResultEvent((ClientModels.GetFriendsListResult)e.Result); return; } } + if (type == typeof(ClientModels.GetLeaderboardResult)) { if (_instance.OnGetLeaderboardResultEvent != null) { _instance.OnGetLeaderboardResultEvent((ClientModels.GetLeaderboardResult)e.Result); return; } } + if (type == typeof(ClientModels.GetLeaderboardAroundCharacterResult)) { if (_instance.OnGetLeaderboardAroundCharacterResultEvent != null) { _instance.OnGetLeaderboardAroundCharacterResultEvent((ClientModels.GetLeaderboardAroundCharacterResult)e.Result); return; } } + if (type == typeof(ClientModels.GetLeaderboardAroundPlayerResult)) { if (_instance.OnGetLeaderboardAroundPlayerResultEvent != null) { _instance.OnGetLeaderboardAroundPlayerResultEvent((ClientModels.GetLeaderboardAroundPlayerResult)e.Result); return; } } + if (type == typeof(ClientModels.GetLeaderboardForUsersCharactersResult)) { if (_instance.OnGetLeaderboardForUserCharactersResultEvent != null) { _instance.OnGetLeaderboardForUserCharactersResultEvent((ClientModels.GetLeaderboardForUsersCharactersResult)e.Result); return; } } + if (type == typeof(ClientModels.GetPaymentTokenResult)) { if (_instance.OnGetPaymentTokenResultEvent != null) { _instance.OnGetPaymentTokenResultEvent((ClientModels.GetPaymentTokenResult)e.Result); return; } } + if (type == typeof(ClientModels.GetPhotonAuthenticationTokenResult)) { if (_instance.OnGetPhotonAuthenticationTokenResultEvent != null) { _instance.OnGetPhotonAuthenticationTokenResultEvent((ClientModels.GetPhotonAuthenticationTokenResult)e.Result); return; } } + if (type == typeof(ClientModels.GetPlayerCombinedInfoResult)) { if (_instance.OnGetPlayerCombinedInfoResultEvent != null) { _instance.OnGetPlayerCombinedInfoResultEvent((ClientModels.GetPlayerCombinedInfoResult)e.Result); return; } } + if (type == typeof(ClientModels.GetPlayerProfileResult)) { if (_instance.OnGetPlayerProfileResultEvent != null) { _instance.OnGetPlayerProfileResultEvent((ClientModels.GetPlayerProfileResult)e.Result); return; } } + if (type == typeof(ClientModels.GetPlayerSegmentsResult)) { if (_instance.OnGetPlayerSegmentsResultEvent != null) { _instance.OnGetPlayerSegmentsResultEvent((ClientModels.GetPlayerSegmentsResult)e.Result); return; } } + if (type == typeof(ClientModels.GetPlayerStatisticsResult)) { if (_instance.OnGetPlayerStatisticsResultEvent != null) { _instance.OnGetPlayerStatisticsResultEvent((ClientModels.GetPlayerStatisticsResult)e.Result); return; } } + if (type == typeof(ClientModels.GetPlayerStatisticVersionsResult)) { if (_instance.OnGetPlayerStatisticVersionsResultEvent != null) { _instance.OnGetPlayerStatisticVersionsResultEvent((ClientModels.GetPlayerStatisticVersionsResult)e.Result); return; } } + if (type == typeof(ClientModels.GetPlayerTagsResult)) { if (_instance.OnGetPlayerTagsResultEvent != null) { _instance.OnGetPlayerTagsResultEvent((ClientModels.GetPlayerTagsResult)e.Result); return; } } + if (type == typeof(ClientModels.GetPlayerTradesResponse)) { if (_instance.OnGetPlayerTradesResultEvent != null) { _instance.OnGetPlayerTradesResultEvent((ClientModels.GetPlayerTradesResponse)e.Result); return; } } + if (type == typeof(ClientModels.GetPlayFabIDsFromFacebookIDsResult)) { if (_instance.OnGetPlayFabIDsFromFacebookIDsResultEvent != null) { _instance.OnGetPlayFabIDsFromFacebookIDsResultEvent((ClientModels.GetPlayFabIDsFromFacebookIDsResult)e.Result); return; } } + if (type == typeof(ClientModels.GetPlayFabIDsFromFacebookInstantGamesIdsResult)) { if (_instance.OnGetPlayFabIDsFromFacebookInstantGamesIdsResultEvent != null) { _instance.OnGetPlayFabIDsFromFacebookInstantGamesIdsResultEvent((ClientModels.GetPlayFabIDsFromFacebookInstantGamesIdsResult)e.Result); return; } } + if (type == typeof(ClientModels.GetPlayFabIDsFromGameCenterIDsResult)) { if (_instance.OnGetPlayFabIDsFromGameCenterIDsResultEvent != null) { _instance.OnGetPlayFabIDsFromGameCenterIDsResultEvent((ClientModels.GetPlayFabIDsFromGameCenterIDsResult)e.Result); return; } } + if (type == typeof(ClientModels.GetPlayFabIDsFromGenericIDsResult)) { if (_instance.OnGetPlayFabIDsFromGenericIDsResultEvent != null) { _instance.OnGetPlayFabIDsFromGenericIDsResultEvent((ClientModels.GetPlayFabIDsFromGenericIDsResult)e.Result); return; } } + if (type == typeof(ClientModels.GetPlayFabIDsFromGoogleIDsResult)) { if (_instance.OnGetPlayFabIDsFromGoogleIDsResultEvent != null) { _instance.OnGetPlayFabIDsFromGoogleIDsResultEvent((ClientModels.GetPlayFabIDsFromGoogleIDsResult)e.Result); return; } } + if (type == typeof(ClientModels.GetPlayFabIDsFromGooglePlayGamesPlayerIDsResult)) { if (_instance.OnGetPlayFabIDsFromGooglePlayGamesPlayerIDsResultEvent != null) { _instance.OnGetPlayFabIDsFromGooglePlayGamesPlayerIDsResultEvent((ClientModels.GetPlayFabIDsFromGooglePlayGamesPlayerIDsResult)e.Result); return; } } + if (type == typeof(ClientModels.GetPlayFabIDsFromKongregateIDsResult)) { if (_instance.OnGetPlayFabIDsFromKongregateIDsResultEvent != null) { _instance.OnGetPlayFabIDsFromKongregateIDsResultEvent((ClientModels.GetPlayFabIDsFromKongregateIDsResult)e.Result); return; } } + if (type == typeof(ClientModels.GetPlayFabIDsFromNintendoServiceAccountIdsResult)) { if (_instance.OnGetPlayFabIDsFromNintendoServiceAccountIdsResultEvent != null) { _instance.OnGetPlayFabIDsFromNintendoServiceAccountIdsResultEvent((ClientModels.GetPlayFabIDsFromNintendoServiceAccountIdsResult)e.Result); return; } } + if (type == typeof(ClientModels.GetPlayFabIDsFromNintendoSwitchDeviceIdsResult)) { if (_instance.OnGetPlayFabIDsFromNintendoSwitchDeviceIdsResultEvent != null) { _instance.OnGetPlayFabIDsFromNintendoSwitchDeviceIdsResultEvent((ClientModels.GetPlayFabIDsFromNintendoSwitchDeviceIdsResult)e.Result); return; } } + if (type == typeof(ClientModels.GetPlayFabIDsFromPSNAccountIDsResult)) { if (_instance.OnGetPlayFabIDsFromPSNAccountIDsResultEvent != null) { _instance.OnGetPlayFabIDsFromPSNAccountIDsResultEvent((ClientModels.GetPlayFabIDsFromPSNAccountIDsResult)e.Result); return; } } + if (type == typeof(ClientModels.GetPlayFabIDsFromPSNOnlineIDsResult)) { if (_instance.OnGetPlayFabIDsFromPSNOnlineIDsResultEvent != null) { _instance.OnGetPlayFabIDsFromPSNOnlineIDsResultEvent((ClientModels.GetPlayFabIDsFromPSNOnlineIDsResult)e.Result); return; } } + if (type == typeof(ClientModels.GetPlayFabIDsFromSteamIDsResult)) { if (_instance.OnGetPlayFabIDsFromSteamIDsResultEvent != null) { _instance.OnGetPlayFabIDsFromSteamIDsResultEvent((ClientModels.GetPlayFabIDsFromSteamIDsResult)e.Result); return; } } + if (type == typeof(ClientModels.GetPlayFabIDsFromTwitchIDsResult)) { if (_instance.OnGetPlayFabIDsFromTwitchIDsResultEvent != null) { _instance.OnGetPlayFabIDsFromTwitchIDsResultEvent((ClientModels.GetPlayFabIDsFromTwitchIDsResult)e.Result); return; } } + if (type == typeof(ClientModels.GetPlayFabIDsFromXboxLiveIDsResult)) { if (_instance.OnGetPlayFabIDsFromXboxLiveIDsResultEvent != null) { _instance.OnGetPlayFabIDsFromXboxLiveIDsResultEvent((ClientModels.GetPlayFabIDsFromXboxLiveIDsResult)e.Result); return; } } + if (type == typeof(ClientModels.GetPublisherDataResult)) { if (_instance.OnGetPublisherDataResultEvent != null) { _instance.OnGetPublisherDataResultEvent((ClientModels.GetPublisherDataResult)e.Result); return; } } + if (type == typeof(ClientModels.GetPurchaseResult)) { if (_instance.OnGetPurchaseResultEvent != null) { _instance.OnGetPurchaseResultEvent((ClientModels.GetPurchaseResult)e.Result); return; } } + if (type == typeof(ClientModels.GetSharedGroupDataResult)) { if (_instance.OnGetSharedGroupDataResultEvent != null) { _instance.OnGetSharedGroupDataResultEvent((ClientModels.GetSharedGroupDataResult)e.Result); return; } } + if (type == typeof(ClientModels.GetStoreItemsResult)) { if (_instance.OnGetStoreItemsResultEvent != null) { _instance.OnGetStoreItemsResultEvent((ClientModels.GetStoreItemsResult)e.Result); return; } } + if (type == typeof(ClientModels.GetTimeResult)) { if (_instance.OnGetTimeResultEvent != null) { _instance.OnGetTimeResultEvent((ClientModels.GetTimeResult)e.Result); return; } } + if (type == typeof(ClientModels.GetTitleDataResult)) { if (_instance.OnGetTitleDataResultEvent != null) { _instance.OnGetTitleDataResultEvent((ClientModels.GetTitleDataResult)e.Result); return; } } + if (type == typeof(ClientModels.GetTitleNewsResult)) { if (_instance.OnGetTitleNewsResultEvent != null) { _instance.OnGetTitleNewsResultEvent((ClientModels.GetTitleNewsResult)e.Result); return; } } + if (type == typeof(ClientModels.GetTitlePublicKeyResult)) { if (_instance.OnGetTitlePublicKeyResultEvent != null) { _instance.OnGetTitlePublicKeyResultEvent((ClientModels.GetTitlePublicKeyResult)e.Result); return; } } + if (type == typeof(ClientModels.GetTradeStatusResponse)) { if (_instance.OnGetTradeStatusResultEvent != null) { _instance.OnGetTradeStatusResultEvent((ClientModels.GetTradeStatusResponse)e.Result); return; } } + if (type == typeof(ClientModels.GetUserDataResult)) { if (_instance.OnGetUserDataResultEvent != null) { _instance.OnGetUserDataResultEvent((ClientModels.GetUserDataResult)e.Result); return; } } + if (type == typeof(ClientModels.GetUserInventoryResult)) { if (_instance.OnGetUserInventoryResultEvent != null) { _instance.OnGetUserInventoryResultEvent((ClientModels.GetUserInventoryResult)e.Result); return; } } + if (type == typeof(ClientModels.GetUserDataResult)) { if (_instance.OnGetUserPublisherDataResultEvent != null) { _instance.OnGetUserPublisherDataResultEvent((ClientModels.GetUserDataResult)e.Result); return; } } + if (type == typeof(ClientModels.GetUserDataResult)) { if (_instance.OnGetUserPublisherReadOnlyDataResultEvent != null) { _instance.OnGetUserPublisherReadOnlyDataResultEvent((ClientModels.GetUserDataResult)e.Result); return; } } + if (type == typeof(ClientModels.GetUserDataResult)) { if (_instance.OnGetUserReadOnlyDataResultEvent != null) { _instance.OnGetUserReadOnlyDataResultEvent((ClientModels.GetUserDataResult)e.Result); return; } } + if (type == typeof(ClientModels.GrantCharacterToUserResult)) { if (_instance.OnGrantCharacterToUserResultEvent != null) { _instance.OnGrantCharacterToUserResultEvent((ClientModels.GrantCharacterToUserResult)e.Result); return; } } + if (type == typeof(ClientModels.LinkAndroidDeviceIDResult)) { if (_instance.OnLinkAndroidDeviceIDResultEvent != null) { _instance.OnLinkAndroidDeviceIDResultEvent((ClientModels.LinkAndroidDeviceIDResult)e.Result); return; } } + if (type == typeof(ClientModels.EmptyResult)) { if (_instance.OnLinkAppleResultEvent != null) { _instance.OnLinkAppleResultEvent((ClientModels.EmptyResult)e.Result); return; } } + if (type == typeof(ClientModels.LinkCustomIDResult)) { if (_instance.OnLinkCustomIDResultEvent != null) { _instance.OnLinkCustomIDResultEvent((ClientModels.LinkCustomIDResult)e.Result); return; } } + if (type == typeof(ClientModels.LinkFacebookAccountResult)) { if (_instance.OnLinkFacebookAccountResultEvent != null) { _instance.OnLinkFacebookAccountResultEvent((ClientModels.LinkFacebookAccountResult)e.Result); return; } } + if (type == typeof(ClientModels.LinkFacebookInstantGamesIdResult)) { if (_instance.OnLinkFacebookInstantGamesIdResultEvent != null) { _instance.OnLinkFacebookInstantGamesIdResultEvent((ClientModels.LinkFacebookInstantGamesIdResult)e.Result); return; } } + if (type == typeof(ClientModels.LinkGameCenterAccountResult)) { if (_instance.OnLinkGameCenterAccountResultEvent != null) { _instance.OnLinkGameCenterAccountResultEvent((ClientModels.LinkGameCenterAccountResult)e.Result); return; } } + if (type == typeof(ClientModels.LinkGoogleAccountResult)) { if (_instance.OnLinkGoogleAccountResultEvent != null) { _instance.OnLinkGoogleAccountResultEvent((ClientModels.LinkGoogleAccountResult)e.Result); return; } } + if (type == typeof(ClientModels.LinkGooglePlayGamesServicesAccountResult)) { if (_instance.OnLinkGooglePlayGamesServicesAccountResultEvent != null) { _instance.OnLinkGooglePlayGamesServicesAccountResultEvent((ClientModels.LinkGooglePlayGamesServicesAccountResult)e.Result); return; } } + if (type == typeof(ClientModels.LinkIOSDeviceIDResult)) { if (_instance.OnLinkIOSDeviceIDResultEvent != null) { _instance.OnLinkIOSDeviceIDResultEvent((ClientModels.LinkIOSDeviceIDResult)e.Result); return; } } + if (type == typeof(ClientModels.LinkKongregateAccountResult)) { if (_instance.OnLinkKongregateResultEvent != null) { _instance.OnLinkKongregateResultEvent((ClientModels.LinkKongregateAccountResult)e.Result); return; } } + if (type == typeof(ClientModels.EmptyResult)) { if (_instance.OnLinkNintendoServiceAccountResultEvent != null) { _instance.OnLinkNintendoServiceAccountResultEvent((ClientModels.EmptyResult)e.Result); return; } } + if (type == typeof(ClientModels.LinkNintendoSwitchDeviceIdResult)) { if (_instance.OnLinkNintendoSwitchDeviceIdResultEvent != null) { _instance.OnLinkNintendoSwitchDeviceIdResultEvent((ClientModels.LinkNintendoSwitchDeviceIdResult)e.Result); return; } } + if (type == typeof(ClientModels.EmptyResult)) { if (_instance.OnLinkOpenIdConnectResultEvent != null) { _instance.OnLinkOpenIdConnectResultEvent((ClientModels.EmptyResult)e.Result); return; } } + if (type == typeof(ClientModels.LinkPSNAccountResult)) { if (_instance.OnLinkPSNAccountResultEvent != null) { _instance.OnLinkPSNAccountResultEvent((ClientModels.LinkPSNAccountResult)e.Result); return; } } + if (type == typeof(ClientModels.LinkSteamAccountResult)) { if (_instance.OnLinkSteamAccountResultEvent != null) { _instance.OnLinkSteamAccountResultEvent((ClientModels.LinkSteamAccountResult)e.Result); return; } } + if (type == typeof(ClientModels.LinkTwitchAccountResult)) { if (_instance.OnLinkTwitchResultEvent != null) { _instance.OnLinkTwitchResultEvent((ClientModels.LinkTwitchAccountResult)e.Result); return; } } + if (type == typeof(ClientModels.LinkXboxAccountResult)) { if (_instance.OnLinkXboxAccountResultEvent != null) { _instance.OnLinkXboxAccountResultEvent((ClientModels.LinkXboxAccountResult)e.Result); return; } } + if (type == typeof(ClientModels.OpenTradeResponse)) { if (_instance.OnOpenTradeResultEvent != null) { _instance.OnOpenTradeResultEvent((ClientModels.OpenTradeResponse)e.Result); return; } } + if (type == typeof(ClientModels.PayForPurchaseResult)) { if (_instance.OnPayForPurchaseResultEvent != null) { _instance.OnPayForPurchaseResultEvent((ClientModels.PayForPurchaseResult)e.Result); return; } } + if (type == typeof(ClientModels.PurchaseItemResult)) { if (_instance.OnPurchaseItemResultEvent != null) { _instance.OnPurchaseItemResultEvent((ClientModels.PurchaseItemResult)e.Result); return; } } + if (type == typeof(ClientModels.RedeemCouponResult)) { if (_instance.OnRedeemCouponResultEvent != null) { _instance.OnRedeemCouponResultEvent((ClientModels.RedeemCouponResult)e.Result); return; } } + if (type == typeof(ClientModels.EmptyResponse)) { if (_instance.OnRefreshPSNAuthTokenResultEvent != null) { _instance.OnRefreshPSNAuthTokenResultEvent((ClientModels.EmptyResponse)e.Result); return; } } + if (type == typeof(ClientModels.RegisterForIOSPushNotificationResult)) { if (_instance.OnRegisterForIOSPushNotificationResultEvent != null) { _instance.OnRegisterForIOSPushNotificationResultEvent((ClientModels.RegisterForIOSPushNotificationResult)e.Result); return; } } + if (type == typeof(ClientModels.RegisterPlayFabUserResult)) { if (_instance.OnRegisterPlayFabUserResultEvent != null) { _instance.OnRegisterPlayFabUserResultEvent((ClientModels.RegisterPlayFabUserResult)e.Result); return; } } + if (type == typeof(ClientModels.RemoveContactEmailResult)) { if (_instance.OnRemoveContactEmailResultEvent != null) { _instance.OnRemoveContactEmailResultEvent((ClientModels.RemoveContactEmailResult)e.Result); return; } } + if (type == typeof(ClientModels.RemoveFriendResult)) { if (_instance.OnRemoveFriendResultEvent != null) { _instance.OnRemoveFriendResultEvent((ClientModels.RemoveFriendResult)e.Result); return; } } + if (type == typeof(ClientModels.RemoveGenericIDResult)) { if (_instance.OnRemoveGenericIDResultEvent != null) { _instance.OnRemoveGenericIDResultEvent((ClientModels.RemoveGenericIDResult)e.Result); return; } } + if (type == typeof(ClientModels.RemoveSharedGroupMembersResult)) { if (_instance.OnRemoveSharedGroupMembersResultEvent != null) { _instance.OnRemoveSharedGroupMembersResultEvent((ClientModels.RemoveSharedGroupMembersResult)e.Result); return; } } + if (type == typeof(ClientModels.ReportAdActivityResult)) { if (_instance.OnReportAdActivityResultEvent != null) { _instance.OnReportAdActivityResultEvent((ClientModels.ReportAdActivityResult)e.Result); return; } } + if (type == typeof(ClientModels.EmptyResponse)) { if (_instance.OnReportDeviceInfoResultEvent != null) { _instance.OnReportDeviceInfoResultEvent((ClientModels.EmptyResponse)e.Result); return; } } + if (type == typeof(ClientModels.ReportPlayerClientResult)) { if (_instance.OnReportPlayerResultEvent != null) { _instance.OnReportPlayerResultEvent((ClientModels.ReportPlayerClientResult)e.Result); return; } } + if (type == typeof(ClientModels.RestoreIOSPurchasesResult)) { if (_instance.OnRestoreIOSPurchasesResultEvent != null) { _instance.OnRestoreIOSPurchasesResultEvent((ClientModels.RestoreIOSPurchasesResult)e.Result); return; } } + if (type == typeof(ClientModels.RewardAdActivityResult)) { if (_instance.OnRewardAdActivityResultEvent != null) { _instance.OnRewardAdActivityResultEvent((ClientModels.RewardAdActivityResult)e.Result); return; } } + if (type == typeof(ClientModels.SendAccountRecoveryEmailResult)) { if (_instance.OnSendAccountRecoveryEmailResultEvent != null) { _instance.OnSendAccountRecoveryEmailResultEvent((ClientModels.SendAccountRecoveryEmailResult)e.Result); return; } } + if (type == typeof(ClientModels.SetFriendTagsResult)) { if (_instance.OnSetFriendTagsResultEvent != null) { _instance.OnSetFriendTagsResultEvent((ClientModels.SetFriendTagsResult)e.Result); return; } } + if (type == typeof(ClientModels.SetPlayerSecretResult)) { if (_instance.OnSetPlayerSecretResultEvent != null) { _instance.OnSetPlayerSecretResultEvent((ClientModels.SetPlayerSecretResult)e.Result); return; } } + if (type == typeof(ClientModels.StartPurchaseResult)) { if (_instance.OnStartPurchaseResultEvent != null) { _instance.OnStartPurchaseResultEvent((ClientModels.StartPurchaseResult)e.Result); return; } } + if (type == typeof(ClientModels.ModifyUserVirtualCurrencyResult)) { if (_instance.OnSubtractUserVirtualCurrencyResultEvent != null) { _instance.OnSubtractUserVirtualCurrencyResultEvent((ClientModels.ModifyUserVirtualCurrencyResult)e.Result); return; } } + if (type == typeof(ClientModels.UnlinkAndroidDeviceIDResult)) { if (_instance.OnUnlinkAndroidDeviceIDResultEvent != null) { _instance.OnUnlinkAndroidDeviceIDResultEvent((ClientModels.UnlinkAndroidDeviceIDResult)e.Result); return; } } + if (type == typeof(ClientModels.EmptyResponse)) { if (_instance.OnUnlinkAppleResultEvent != null) { _instance.OnUnlinkAppleResultEvent((ClientModels.EmptyResponse)e.Result); return; } } + if (type == typeof(ClientModels.UnlinkCustomIDResult)) { if (_instance.OnUnlinkCustomIDResultEvent != null) { _instance.OnUnlinkCustomIDResultEvent((ClientModels.UnlinkCustomIDResult)e.Result); return; } } + if (type == typeof(ClientModels.UnlinkFacebookAccountResult)) { if (_instance.OnUnlinkFacebookAccountResultEvent != null) { _instance.OnUnlinkFacebookAccountResultEvent((ClientModels.UnlinkFacebookAccountResult)e.Result); return; } } + if (type == typeof(ClientModels.UnlinkFacebookInstantGamesIdResult)) { if (_instance.OnUnlinkFacebookInstantGamesIdResultEvent != null) { _instance.OnUnlinkFacebookInstantGamesIdResultEvent((ClientModels.UnlinkFacebookInstantGamesIdResult)e.Result); return; } } + if (type == typeof(ClientModels.UnlinkGameCenterAccountResult)) { if (_instance.OnUnlinkGameCenterAccountResultEvent != null) { _instance.OnUnlinkGameCenterAccountResultEvent((ClientModels.UnlinkGameCenterAccountResult)e.Result); return; } } + if (type == typeof(ClientModels.UnlinkGoogleAccountResult)) { if (_instance.OnUnlinkGoogleAccountResultEvent != null) { _instance.OnUnlinkGoogleAccountResultEvent((ClientModels.UnlinkGoogleAccountResult)e.Result); return; } } + if (type == typeof(ClientModels.UnlinkGooglePlayGamesServicesAccountResult)) { if (_instance.OnUnlinkGooglePlayGamesServicesAccountResultEvent != null) { _instance.OnUnlinkGooglePlayGamesServicesAccountResultEvent((ClientModels.UnlinkGooglePlayGamesServicesAccountResult)e.Result); return; } } + if (type == typeof(ClientModels.UnlinkIOSDeviceIDResult)) { if (_instance.OnUnlinkIOSDeviceIDResultEvent != null) { _instance.OnUnlinkIOSDeviceIDResultEvent((ClientModels.UnlinkIOSDeviceIDResult)e.Result); return; } } + if (type == typeof(ClientModels.UnlinkKongregateAccountResult)) { if (_instance.OnUnlinkKongregateResultEvent != null) { _instance.OnUnlinkKongregateResultEvent((ClientModels.UnlinkKongregateAccountResult)e.Result); return; } } + if (type == typeof(ClientModels.EmptyResponse)) { if (_instance.OnUnlinkNintendoServiceAccountResultEvent != null) { _instance.OnUnlinkNintendoServiceAccountResultEvent((ClientModels.EmptyResponse)e.Result); return; } } + if (type == typeof(ClientModels.UnlinkNintendoSwitchDeviceIdResult)) { if (_instance.OnUnlinkNintendoSwitchDeviceIdResultEvent != null) { _instance.OnUnlinkNintendoSwitchDeviceIdResultEvent((ClientModels.UnlinkNintendoSwitchDeviceIdResult)e.Result); return; } } + if (type == typeof(ClientModels.EmptyResponse)) { if (_instance.OnUnlinkOpenIdConnectResultEvent != null) { _instance.OnUnlinkOpenIdConnectResultEvent((ClientModels.EmptyResponse)e.Result); return; } } + if (type == typeof(ClientModels.UnlinkPSNAccountResult)) { if (_instance.OnUnlinkPSNAccountResultEvent != null) { _instance.OnUnlinkPSNAccountResultEvent((ClientModels.UnlinkPSNAccountResult)e.Result); return; } } + if (type == typeof(ClientModels.UnlinkSteamAccountResult)) { if (_instance.OnUnlinkSteamAccountResultEvent != null) { _instance.OnUnlinkSteamAccountResultEvent((ClientModels.UnlinkSteamAccountResult)e.Result); return; } } + if (type == typeof(ClientModels.UnlinkTwitchAccountResult)) { if (_instance.OnUnlinkTwitchResultEvent != null) { _instance.OnUnlinkTwitchResultEvent((ClientModels.UnlinkTwitchAccountResult)e.Result); return; } } + if (type == typeof(ClientModels.UnlinkXboxAccountResult)) { if (_instance.OnUnlinkXboxAccountResultEvent != null) { _instance.OnUnlinkXboxAccountResultEvent((ClientModels.UnlinkXboxAccountResult)e.Result); return; } } + if (type == typeof(ClientModels.UnlockContainerItemResult)) { if (_instance.OnUnlockContainerInstanceResultEvent != null) { _instance.OnUnlockContainerInstanceResultEvent((ClientModels.UnlockContainerItemResult)e.Result); return; } } + if (type == typeof(ClientModels.UnlockContainerItemResult)) { if (_instance.OnUnlockContainerItemResultEvent != null) { _instance.OnUnlockContainerItemResultEvent((ClientModels.UnlockContainerItemResult)e.Result); return; } } + if (type == typeof(ClientModels.EmptyResponse)) { if (_instance.OnUpdateAvatarUrlResultEvent != null) { _instance.OnUpdateAvatarUrlResultEvent((ClientModels.EmptyResponse)e.Result); return; } } + if (type == typeof(ClientModels.UpdateCharacterDataResult)) { if (_instance.OnUpdateCharacterDataResultEvent != null) { _instance.OnUpdateCharacterDataResultEvent((ClientModels.UpdateCharacterDataResult)e.Result); return; } } + if (type == typeof(ClientModels.UpdateCharacterStatisticsResult)) { if (_instance.OnUpdateCharacterStatisticsResultEvent != null) { _instance.OnUpdateCharacterStatisticsResultEvent((ClientModels.UpdateCharacterStatisticsResult)e.Result); return; } } + if (type == typeof(ClientModels.UpdatePlayerStatisticsResult)) { if (_instance.OnUpdatePlayerStatisticsResultEvent != null) { _instance.OnUpdatePlayerStatisticsResultEvent((ClientModels.UpdatePlayerStatisticsResult)e.Result); return; } } + if (type == typeof(ClientModels.UpdateSharedGroupDataResult)) { if (_instance.OnUpdateSharedGroupDataResultEvent != null) { _instance.OnUpdateSharedGroupDataResultEvent((ClientModels.UpdateSharedGroupDataResult)e.Result); return; } } + if (type == typeof(ClientModels.UpdateUserDataResult)) { if (_instance.OnUpdateUserDataResultEvent != null) { _instance.OnUpdateUserDataResultEvent((ClientModels.UpdateUserDataResult)e.Result); return; } } + if (type == typeof(ClientModels.UpdateUserDataResult)) { if (_instance.OnUpdateUserPublisherDataResultEvent != null) { _instance.OnUpdateUserPublisherDataResultEvent((ClientModels.UpdateUserDataResult)e.Result); return; } } + if (type == typeof(ClientModels.UpdateUserTitleDisplayNameResult)) { if (_instance.OnUpdateUserTitleDisplayNameResultEvent != null) { _instance.OnUpdateUserTitleDisplayNameResultEvent((ClientModels.UpdateUserTitleDisplayNameResult)e.Result); return; } } + if (type == typeof(ClientModels.ValidateAmazonReceiptResult)) { if (_instance.OnValidateAmazonIAPReceiptResultEvent != null) { _instance.OnValidateAmazonIAPReceiptResultEvent((ClientModels.ValidateAmazonReceiptResult)e.Result); return; } } + if (type == typeof(ClientModels.ValidateGooglePlayPurchaseResult)) { if (_instance.OnValidateGooglePlayPurchaseResultEvent != null) { _instance.OnValidateGooglePlayPurchaseResultEvent((ClientModels.ValidateGooglePlayPurchaseResult)e.Result); return; } } + if (type == typeof(ClientModels.ValidateIOSReceiptResult)) { if (_instance.OnValidateIOSReceiptResultEvent != null) { _instance.OnValidateIOSReceiptResultEvent((ClientModels.ValidateIOSReceiptResult)e.Result); return; } } + if (type == typeof(ClientModels.ValidateWindowsReceiptResult)) { if (_instance.OnValidateWindowsStoreReceiptResultEvent != null) { _instance.OnValidateWindowsStoreReceiptResultEvent((ClientModels.ValidateWindowsReceiptResult)e.Result); return; } } + if (type == typeof(ClientModels.WriteEventResponse)) { if (_instance.OnWriteCharacterEventResultEvent != null) { _instance.OnWriteCharacterEventResultEvent((ClientModels.WriteEventResponse)e.Result); return; } } + if (type == typeof(ClientModels.WriteEventResponse)) { if (_instance.OnWritePlayerEventResultEvent != null) { _instance.OnWritePlayerEventResultEvent((ClientModels.WriteEventResponse)e.Result); return; } } + if (type == typeof(ClientModels.WriteEventResponse)) { if (_instance.OnWriteTitleEventResultEvent != null) { _instance.OnWriteTitleEventResultEvent((ClientModels.WriteEventResponse)e.Result); return; } } +#endif +#if ENABLE_PLAYFABSERVER_API + + if (type == typeof(ServerModels.ModifyCharacterVirtualCurrencyResult)) { if (_instance.OnServerAddCharacterVirtualCurrencyResultEvent != null) { _instance.OnServerAddCharacterVirtualCurrencyResultEvent((ServerModels.ModifyCharacterVirtualCurrencyResult)e.Result); return; } } + if (type == typeof(ServerModels.EmptyResponse)) { if (_instance.OnServerAddFriendResultEvent != null) { _instance.OnServerAddFriendResultEvent((ServerModels.EmptyResponse)e.Result); return; } } + if (type == typeof(ServerModels.EmptyResult)) { if (_instance.OnServerAddGenericIDResultEvent != null) { _instance.OnServerAddGenericIDResultEvent((ServerModels.EmptyResult)e.Result); return; } } + if (type == typeof(ServerModels.AddPlayerTagResult)) { if (_instance.OnServerAddPlayerTagResultEvent != null) { _instance.OnServerAddPlayerTagResultEvent((ServerModels.AddPlayerTagResult)e.Result); return; } } + if (type == typeof(ServerModels.AddSharedGroupMembersResult)) { if (_instance.OnServerAddSharedGroupMembersResultEvent != null) { _instance.OnServerAddSharedGroupMembersResultEvent((ServerModels.AddSharedGroupMembersResult)e.Result); return; } } + if (type == typeof(ServerModels.ModifyUserVirtualCurrencyResult)) { if (_instance.OnServerAddUserVirtualCurrencyResultEvent != null) { _instance.OnServerAddUserVirtualCurrencyResultEvent((ServerModels.ModifyUserVirtualCurrencyResult)e.Result); return; } } + if (type == typeof(ServerModels.AuthenticateSessionTicketResult)) { if (_instance.OnServerAuthenticateSessionTicketResultEvent != null) { _instance.OnServerAuthenticateSessionTicketResultEvent((ServerModels.AuthenticateSessionTicketResult)e.Result); return; } } + if (type == typeof(ServerModels.AwardSteamAchievementResult)) { if (_instance.OnServerAwardSteamAchievementResultEvent != null) { _instance.OnServerAwardSteamAchievementResultEvent((ServerModels.AwardSteamAchievementResult)e.Result); return; } } + if (type == typeof(ServerModels.BanUsersResult)) { if (_instance.OnServerBanUsersResultEvent != null) { _instance.OnServerBanUsersResultEvent((ServerModels.BanUsersResult)e.Result); return; } } + if (type == typeof(ServerModels.ConsumeItemResult)) { if (_instance.OnServerConsumeItemResultEvent != null) { _instance.OnServerConsumeItemResultEvent((ServerModels.ConsumeItemResult)e.Result); return; } } + if (type == typeof(ServerModels.CreateSharedGroupResult)) { if (_instance.OnServerCreateSharedGroupResultEvent != null) { _instance.OnServerCreateSharedGroupResultEvent((ServerModels.CreateSharedGroupResult)e.Result); return; } } + if (type == typeof(ServerModels.DeleteCharacterFromUserResult)) { if (_instance.OnServerDeleteCharacterFromUserResultEvent != null) { _instance.OnServerDeleteCharacterFromUserResultEvent((ServerModels.DeleteCharacterFromUserResult)e.Result); return; } } + if (type == typeof(ServerModels.DeletePlayerResult)) { if (_instance.OnServerDeletePlayerResultEvent != null) { _instance.OnServerDeletePlayerResultEvent((ServerModels.DeletePlayerResult)e.Result); return; } } + if (type == typeof(ServerModels.DeletePushNotificationTemplateResult)) { if (_instance.OnServerDeletePushNotificationTemplateResultEvent != null) { _instance.OnServerDeletePushNotificationTemplateResultEvent((ServerModels.DeletePushNotificationTemplateResult)e.Result); return; } } + if (type == typeof(ServerModels.EmptyResponse)) { if (_instance.OnServerDeleteSharedGroupResultEvent != null) { _instance.OnServerDeleteSharedGroupResultEvent((ServerModels.EmptyResponse)e.Result); return; } } + if (type == typeof(ServerModels.EvaluateRandomResultTableResult)) { if (_instance.OnServerEvaluateRandomResultTableResultEvent != null) { _instance.OnServerEvaluateRandomResultTableResultEvent((ServerModels.EvaluateRandomResultTableResult)e.Result); return; } } + if (type == typeof(ServerModels.ExecuteCloudScriptResult)) { if (_instance.OnServerExecuteCloudScriptResultEvent != null) { _instance.OnServerExecuteCloudScriptResultEvent((ServerModels.ExecuteCloudScriptResult)e.Result); return; } } + if (type == typeof(ServerModels.GetAllSegmentsResult)) { if (_instance.OnServerGetAllSegmentsResultEvent != null) { _instance.OnServerGetAllSegmentsResultEvent((ServerModels.GetAllSegmentsResult)e.Result); return; } } + if (type == typeof(ServerModels.ListUsersCharactersResult)) { if (_instance.OnServerGetAllUsersCharactersResultEvent != null) { _instance.OnServerGetAllUsersCharactersResultEvent((ServerModels.ListUsersCharactersResult)e.Result); return; } } + if (type == typeof(ServerModels.GetCatalogItemsResult)) { if (_instance.OnServerGetCatalogItemsResultEvent != null) { _instance.OnServerGetCatalogItemsResultEvent((ServerModels.GetCatalogItemsResult)e.Result); return; } } + if (type == typeof(ServerModels.GetCharacterDataResult)) { if (_instance.OnServerGetCharacterDataResultEvent != null) { _instance.OnServerGetCharacterDataResultEvent((ServerModels.GetCharacterDataResult)e.Result); return; } } + if (type == typeof(ServerModels.GetCharacterDataResult)) { if (_instance.OnServerGetCharacterInternalDataResultEvent != null) { _instance.OnServerGetCharacterInternalDataResultEvent((ServerModels.GetCharacterDataResult)e.Result); return; } } + if (type == typeof(ServerModels.GetCharacterInventoryResult)) { if (_instance.OnServerGetCharacterInventoryResultEvent != null) { _instance.OnServerGetCharacterInventoryResultEvent((ServerModels.GetCharacterInventoryResult)e.Result); return; } } + if (type == typeof(ServerModels.GetCharacterLeaderboardResult)) { if (_instance.OnServerGetCharacterLeaderboardResultEvent != null) { _instance.OnServerGetCharacterLeaderboardResultEvent((ServerModels.GetCharacterLeaderboardResult)e.Result); return; } } + if (type == typeof(ServerModels.GetCharacterDataResult)) { if (_instance.OnServerGetCharacterReadOnlyDataResultEvent != null) { _instance.OnServerGetCharacterReadOnlyDataResultEvent((ServerModels.GetCharacterDataResult)e.Result); return; } } + if (type == typeof(ServerModels.GetCharacterStatisticsResult)) { if (_instance.OnServerGetCharacterStatisticsResultEvent != null) { _instance.OnServerGetCharacterStatisticsResultEvent((ServerModels.GetCharacterStatisticsResult)e.Result); return; } } + if (type == typeof(ServerModels.GetContentDownloadUrlResult)) { if (_instance.OnServerGetContentDownloadUrlResultEvent != null) { _instance.OnServerGetContentDownloadUrlResultEvent((ServerModels.GetContentDownloadUrlResult)e.Result); return; } } + if (type == typeof(ServerModels.GetLeaderboardResult)) { if (_instance.OnServerGetFriendLeaderboardResultEvent != null) { _instance.OnServerGetFriendLeaderboardResultEvent((ServerModels.GetLeaderboardResult)e.Result); return; } } + if (type == typeof(ServerModels.GetFriendsListResult)) { if (_instance.OnServerGetFriendsListResultEvent != null) { _instance.OnServerGetFriendsListResultEvent((ServerModels.GetFriendsListResult)e.Result); return; } } + if (type == typeof(ServerModels.GetLeaderboardResult)) { if (_instance.OnServerGetLeaderboardResultEvent != null) { _instance.OnServerGetLeaderboardResultEvent((ServerModels.GetLeaderboardResult)e.Result); return; } } + if (type == typeof(ServerModels.GetLeaderboardAroundCharacterResult)) { if (_instance.OnServerGetLeaderboardAroundCharacterResultEvent != null) { _instance.OnServerGetLeaderboardAroundCharacterResultEvent((ServerModels.GetLeaderboardAroundCharacterResult)e.Result); return; } } + if (type == typeof(ServerModels.GetLeaderboardAroundUserResult)) { if (_instance.OnServerGetLeaderboardAroundUserResultEvent != null) { _instance.OnServerGetLeaderboardAroundUserResultEvent((ServerModels.GetLeaderboardAroundUserResult)e.Result); return; } } + if (type == typeof(ServerModels.GetLeaderboardForUsersCharactersResult)) { if (_instance.OnServerGetLeaderboardForUserCharactersResultEvent != null) { _instance.OnServerGetLeaderboardForUserCharactersResultEvent((ServerModels.GetLeaderboardForUsersCharactersResult)e.Result); return; } } + if (type == typeof(ServerModels.GetPlayerCombinedInfoResult)) { if (_instance.OnServerGetPlayerCombinedInfoResultEvent != null) { _instance.OnServerGetPlayerCombinedInfoResultEvent((ServerModels.GetPlayerCombinedInfoResult)e.Result); return; } } + if (type == typeof(ServerModels.GetPlayerProfileResult)) { if (_instance.OnServerGetPlayerProfileResultEvent != null) { _instance.OnServerGetPlayerProfileResultEvent((ServerModels.GetPlayerProfileResult)e.Result); return; } } + if (type == typeof(ServerModels.GetPlayerSegmentsResult)) { if (_instance.OnServerGetPlayerSegmentsResultEvent != null) { _instance.OnServerGetPlayerSegmentsResultEvent((ServerModels.GetPlayerSegmentsResult)e.Result); return; } } + if (type == typeof(ServerModels.GetPlayersInSegmentResult)) { if (_instance.OnServerGetPlayersInSegmentResultEvent != null) { _instance.OnServerGetPlayersInSegmentResultEvent((ServerModels.GetPlayersInSegmentResult)e.Result); return; } } + if (type == typeof(ServerModels.GetPlayerStatisticsResult)) { if (_instance.OnServerGetPlayerStatisticsResultEvent != null) { _instance.OnServerGetPlayerStatisticsResultEvent((ServerModels.GetPlayerStatisticsResult)e.Result); return; } } + if (type == typeof(ServerModels.GetPlayerStatisticVersionsResult)) { if (_instance.OnServerGetPlayerStatisticVersionsResultEvent != null) { _instance.OnServerGetPlayerStatisticVersionsResultEvent((ServerModels.GetPlayerStatisticVersionsResult)e.Result); return; } } + if (type == typeof(ServerModels.GetPlayerTagsResult)) { if (_instance.OnServerGetPlayerTagsResultEvent != null) { _instance.OnServerGetPlayerTagsResultEvent((ServerModels.GetPlayerTagsResult)e.Result); return; } } + if (type == typeof(ServerModels.GetPlayFabIDsFromFacebookIDsResult)) { if (_instance.OnServerGetPlayFabIDsFromFacebookIDsResultEvent != null) { _instance.OnServerGetPlayFabIDsFromFacebookIDsResultEvent((ServerModels.GetPlayFabIDsFromFacebookIDsResult)e.Result); return; } } + if (type == typeof(ServerModels.GetPlayFabIDsFromFacebookInstantGamesIdsResult)) { if (_instance.OnServerGetPlayFabIDsFromFacebookInstantGamesIdsResultEvent != null) { _instance.OnServerGetPlayFabIDsFromFacebookInstantGamesIdsResultEvent((ServerModels.GetPlayFabIDsFromFacebookInstantGamesIdsResult)e.Result); return; } } + if (type == typeof(ServerModels.GetPlayFabIDsFromGenericIDsResult)) { if (_instance.OnServerGetPlayFabIDsFromGenericIDsResultEvent != null) { _instance.OnServerGetPlayFabIDsFromGenericIDsResultEvent((ServerModels.GetPlayFabIDsFromGenericIDsResult)e.Result); return; } } + if (type == typeof(ServerModels.GetPlayFabIDsFromNintendoServiceAccountIdsResult)) { if (_instance.OnServerGetPlayFabIDsFromNintendoServiceAccountIdsResultEvent != null) { _instance.OnServerGetPlayFabIDsFromNintendoServiceAccountIdsResultEvent((ServerModels.GetPlayFabIDsFromNintendoServiceAccountIdsResult)e.Result); return; } } + if (type == typeof(ServerModels.GetPlayFabIDsFromNintendoSwitchDeviceIdsResult)) { if (_instance.OnServerGetPlayFabIDsFromNintendoSwitchDeviceIdsResultEvent != null) { _instance.OnServerGetPlayFabIDsFromNintendoSwitchDeviceIdsResultEvent((ServerModels.GetPlayFabIDsFromNintendoSwitchDeviceIdsResult)e.Result); return; } } + if (type == typeof(ServerModels.GetPlayFabIDsFromPSNAccountIDsResult)) { if (_instance.OnServerGetPlayFabIDsFromPSNAccountIDsResultEvent != null) { _instance.OnServerGetPlayFabIDsFromPSNAccountIDsResultEvent((ServerModels.GetPlayFabIDsFromPSNAccountIDsResult)e.Result); return; } } + if (type == typeof(ServerModels.GetPlayFabIDsFromPSNOnlineIDsResult)) { if (_instance.OnServerGetPlayFabIDsFromPSNOnlineIDsResultEvent != null) { _instance.OnServerGetPlayFabIDsFromPSNOnlineIDsResultEvent((ServerModels.GetPlayFabIDsFromPSNOnlineIDsResult)e.Result); return; } } + if (type == typeof(ServerModels.GetPlayFabIDsFromSteamIDsResult)) { if (_instance.OnServerGetPlayFabIDsFromSteamIDsResultEvent != null) { _instance.OnServerGetPlayFabIDsFromSteamIDsResultEvent((ServerModels.GetPlayFabIDsFromSteamIDsResult)e.Result); return; } } + if (type == typeof(ServerModels.GetPlayFabIDsFromTwitchIDsResult)) { if (_instance.OnServerGetPlayFabIDsFromTwitchIDsResultEvent != null) { _instance.OnServerGetPlayFabIDsFromTwitchIDsResultEvent((ServerModels.GetPlayFabIDsFromTwitchIDsResult)e.Result); return; } } + if (type == typeof(ServerModels.GetPlayFabIDsFromXboxLiveIDsResult)) { if (_instance.OnServerGetPlayFabIDsFromXboxLiveIDsResultEvent != null) { _instance.OnServerGetPlayFabIDsFromXboxLiveIDsResultEvent((ServerModels.GetPlayFabIDsFromXboxLiveIDsResult)e.Result); return; } } + if (type == typeof(ServerModels.GetPublisherDataResult)) { if (_instance.OnServerGetPublisherDataResultEvent != null) { _instance.OnServerGetPublisherDataResultEvent((ServerModels.GetPublisherDataResult)e.Result); return; } } + if (type == typeof(ServerModels.GetRandomResultTablesResult)) { if (_instance.OnServerGetRandomResultTablesResultEvent != null) { _instance.OnServerGetRandomResultTablesResultEvent((ServerModels.GetRandomResultTablesResult)e.Result); return; } } + if (type == typeof(ServerModels.GetServerCustomIDsFromPlayFabIDsResult)) { if (_instance.OnServerGetServerCustomIDsFromPlayFabIDsResultEvent != null) { _instance.OnServerGetServerCustomIDsFromPlayFabIDsResultEvent((ServerModels.GetServerCustomIDsFromPlayFabIDsResult)e.Result); return; } } + if (type == typeof(ServerModels.GetSharedGroupDataResult)) { if (_instance.OnServerGetSharedGroupDataResultEvent != null) { _instance.OnServerGetSharedGroupDataResultEvent((ServerModels.GetSharedGroupDataResult)e.Result); return; } } + if (type == typeof(ServerModels.GetStoreItemsResult)) { if (_instance.OnServerGetStoreItemsResultEvent != null) { _instance.OnServerGetStoreItemsResultEvent((ServerModels.GetStoreItemsResult)e.Result); return; } } + if (type == typeof(ServerModels.GetTimeResult)) { if (_instance.OnServerGetTimeResultEvent != null) { _instance.OnServerGetTimeResultEvent((ServerModels.GetTimeResult)e.Result); return; } } + if (type == typeof(ServerModels.GetTitleDataResult)) { if (_instance.OnServerGetTitleDataResultEvent != null) { _instance.OnServerGetTitleDataResultEvent((ServerModels.GetTitleDataResult)e.Result); return; } } + if (type == typeof(ServerModels.GetTitleDataResult)) { if (_instance.OnServerGetTitleInternalDataResultEvent != null) { _instance.OnServerGetTitleInternalDataResultEvent((ServerModels.GetTitleDataResult)e.Result); return; } } + if (type == typeof(ServerModels.GetTitleNewsResult)) { if (_instance.OnServerGetTitleNewsResultEvent != null) { _instance.OnServerGetTitleNewsResultEvent((ServerModels.GetTitleNewsResult)e.Result); return; } } + if (type == typeof(ServerModels.GetUserAccountInfoResult)) { if (_instance.OnServerGetUserAccountInfoResultEvent != null) { _instance.OnServerGetUserAccountInfoResultEvent((ServerModels.GetUserAccountInfoResult)e.Result); return; } } + if (type == typeof(ServerModels.GetUserBansResult)) { if (_instance.OnServerGetUserBansResultEvent != null) { _instance.OnServerGetUserBansResultEvent((ServerModels.GetUserBansResult)e.Result); return; } } + if (type == typeof(ServerModels.GetUserDataResult)) { if (_instance.OnServerGetUserDataResultEvent != null) { _instance.OnServerGetUserDataResultEvent((ServerModels.GetUserDataResult)e.Result); return; } } + if (type == typeof(ServerModels.GetUserDataResult)) { if (_instance.OnServerGetUserInternalDataResultEvent != null) { _instance.OnServerGetUserInternalDataResultEvent((ServerModels.GetUserDataResult)e.Result); return; } } + if (type == typeof(ServerModels.GetUserInventoryResult)) { if (_instance.OnServerGetUserInventoryResultEvent != null) { _instance.OnServerGetUserInventoryResultEvent((ServerModels.GetUserInventoryResult)e.Result); return; } } + if (type == typeof(ServerModels.GetUserDataResult)) { if (_instance.OnServerGetUserPublisherDataResultEvent != null) { _instance.OnServerGetUserPublisherDataResultEvent((ServerModels.GetUserDataResult)e.Result); return; } } + if (type == typeof(ServerModels.GetUserDataResult)) { if (_instance.OnServerGetUserPublisherInternalDataResultEvent != null) { _instance.OnServerGetUserPublisherInternalDataResultEvent((ServerModels.GetUserDataResult)e.Result); return; } } + if (type == typeof(ServerModels.GetUserDataResult)) { if (_instance.OnServerGetUserPublisherReadOnlyDataResultEvent != null) { _instance.OnServerGetUserPublisherReadOnlyDataResultEvent((ServerModels.GetUserDataResult)e.Result); return; } } + if (type == typeof(ServerModels.GetUserDataResult)) { if (_instance.OnServerGetUserReadOnlyDataResultEvent != null) { _instance.OnServerGetUserReadOnlyDataResultEvent((ServerModels.GetUserDataResult)e.Result); return; } } + if (type == typeof(ServerModels.GrantCharacterToUserResult)) { if (_instance.OnServerGrantCharacterToUserResultEvent != null) { _instance.OnServerGrantCharacterToUserResultEvent((ServerModels.GrantCharacterToUserResult)e.Result); return; } } + if (type == typeof(ServerModels.GrantItemsToCharacterResult)) { if (_instance.OnServerGrantItemsToCharacterResultEvent != null) { _instance.OnServerGrantItemsToCharacterResultEvent((ServerModels.GrantItemsToCharacterResult)e.Result); return; } } + if (type == typeof(ServerModels.GrantItemsToUserResult)) { if (_instance.OnServerGrantItemsToUserResultEvent != null) { _instance.OnServerGrantItemsToUserResultEvent((ServerModels.GrantItemsToUserResult)e.Result); return; } } + if (type == typeof(ServerModels.GrantItemsToUsersResult)) { if (_instance.OnServerGrantItemsToUsersResultEvent != null) { _instance.OnServerGrantItemsToUsersResultEvent((ServerModels.GrantItemsToUsersResult)e.Result); return; } } + if (type == typeof(ServerModels.EmptyResult)) { if (_instance.OnServerLinkNintendoServiceAccountResultEvent != null) { _instance.OnServerLinkNintendoServiceAccountResultEvent((ServerModels.EmptyResult)e.Result); return; } } + if (type == typeof(ServerModels.EmptyResult)) { if (_instance.OnServerLinkNintendoServiceAccountSubjectResultEvent != null) { _instance.OnServerLinkNintendoServiceAccountSubjectResultEvent((ServerModels.EmptyResult)e.Result); return; } } + if (type == typeof(ServerModels.LinkNintendoSwitchDeviceIdResult)) { if (_instance.OnServerLinkNintendoSwitchDeviceIdResultEvent != null) { _instance.OnServerLinkNintendoSwitchDeviceIdResultEvent((ServerModels.LinkNintendoSwitchDeviceIdResult)e.Result); return; } } + if (type == typeof(ServerModels.LinkPSNAccountResult)) { if (_instance.OnServerLinkPSNAccountResultEvent != null) { _instance.OnServerLinkPSNAccountResultEvent((ServerModels.LinkPSNAccountResult)e.Result); return; } } + if (type == typeof(ServerModels.LinkPSNIdResponse)) { if (_instance.OnServerLinkPSNIdResultEvent != null) { _instance.OnServerLinkPSNIdResultEvent((ServerModels.LinkPSNIdResponse)e.Result); return; } } + if (type == typeof(ServerModels.LinkServerCustomIdResult)) { if (_instance.OnServerLinkServerCustomIdResultEvent != null) { _instance.OnServerLinkServerCustomIdResultEvent((ServerModels.LinkServerCustomIdResult)e.Result); return; } } + if (type == typeof(ServerModels.LinkSteamIdResult)) { if (_instance.OnServerLinkSteamIdResultEvent != null) { _instance.OnServerLinkSteamIdResultEvent((ServerModels.LinkSteamIdResult)e.Result); return; } } + if (type == typeof(ServerModels.LinkXboxAccountResult)) { if (_instance.OnServerLinkXboxAccountResultEvent != null) { _instance.OnServerLinkXboxAccountResultEvent((ServerModels.LinkXboxAccountResult)e.Result); return; } } + if (type == typeof(ServerModels.ServerLoginResult)) { if (_instance.OnServerLoginWithPSNResultEvent != null) { _instance.OnServerLoginWithPSNResultEvent((ServerModels.ServerLoginResult)e.Result); return; } } + if (type == typeof(ServerModels.ServerLoginResult)) { if (_instance.OnServerLoginWithServerCustomIdResultEvent != null) { _instance.OnServerLoginWithServerCustomIdResultEvent((ServerModels.ServerLoginResult)e.Result); return; } } + if (type == typeof(ServerModels.ServerLoginResult)) { if (_instance.OnServerLoginWithSteamIdResultEvent != null) { _instance.OnServerLoginWithSteamIdResultEvent((ServerModels.ServerLoginResult)e.Result); return; } } + if (type == typeof(ServerModels.ServerLoginResult)) { if (_instance.OnServerLoginWithXboxResultEvent != null) { _instance.OnServerLoginWithXboxResultEvent((ServerModels.ServerLoginResult)e.Result); return; } } + if (type == typeof(ServerModels.ServerLoginResult)) { if (_instance.OnServerLoginWithXboxIdResultEvent != null) { _instance.OnServerLoginWithXboxIdResultEvent((ServerModels.ServerLoginResult)e.Result); return; } } + if (type == typeof(ServerModels.ModifyItemUsesResult)) { if (_instance.OnServerModifyItemUsesResultEvent != null) { _instance.OnServerModifyItemUsesResultEvent((ServerModels.ModifyItemUsesResult)e.Result); return; } } + if (type == typeof(ServerModels.MoveItemToCharacterFromCharacterResult)) { if (_instance.OnServerMoveItemToCharacterFromCharacterResultEvent != null) { _instance.OnServerMoveItemToCharacterFromCharacterResultEvent((ServerModels.MoveItemToCharacterFromCharacterResult)e.Result); return; } } + if (type == typeof(ServerModels.MoveItemToCharacterFromUserResult)) { if (_instance.OnServerMoveItemToCharacterFromUserResultEvent != null) { _instance.OnServerMoveItemToCharacterFromUserResultEvent((ServerModels.MoveItemToCharacterFromUserResult)e.Result); return; } } + if (type == typeof(ServerModels.MoveItemToUserFromCharacterResult)) { if (_instance.OnServerMoveItemToUserFromCharacterResultEvent != null) { _instance.OnServerMoveItemToUserFromCharacterResultEvent((ServerModels.MoveItemToUserFromCharacterResult)e.Result); return; } } + if (type == typeof(ServerModels.RedeemCouponResult)) { if (_instance.OnServerRedeemCouponResultEvent != null) { _instance.OnServerRedeemCouponResultEvent((ServerModels.RedeemCouponResult)e.Result); return; } } + if (type == typeof(ServerModels.EmptyResponse)) { if (_instance.OnServerRemoveFriendResultEvent != null) { _instance.OnServerRemoveFriendResultEvent((ServerModels.EmptyResponse)e.Result); return; } } + if (type == typeof(ServerModels.EmptyResult)) { if (_instance.OnServerRemoveGenericIDResultEvent != null) { _instance.OnServerRemoveGenericIDResultEvent((ServerModels.EmptyResult)e.Result); return; } } + if (type == typeof(ServerModels.RemovePlayerTagResult)) { if (_instance.OnServerRemovePlayerTagResultEvent != null) { _instance.OnServerRemovePlayerTagResultEvent((ServerModels.RemovePlayerTagResult)e.Result); return; } } + if (type == typeof(ServerModels.RemoveSharedGroupMembersResult)) { if (_instance.OnServerRemoveSharedGroupMembersResultEvent != null) { _instance.OnServerRemoveSharedGroupMembersResultEvent((ServerModels.RemoveSharedGroupMembersResult)e.Result); return; } } + if (type == typeof(ServerModels.ReportPlayerServerResult)) { if (_instance.OnServerReportPlayerResultEvent != null) { _instance.OnServerReportPlayerResultEvent((ServerModels.ReportPlayerServerResult)e.Result); return; } } + if (type == typeof(ServerModels.RevokeAllBansForUserResult)) { if (_instance.OnServerRevokeAllBansForUserResultEvent != null) { _instance.OnServerRevokeAllBansForUserResultEvent((ServerModels.RevokeAllBansForUserResult)e.Result); return; } } + if (type == typeof(ServerModels.RevokeBansResult)) { if (_instance.OnServerRevokeBansResultEvent != null) { _instance.OnServerRevokeBansResultEvent((ServerModels.RevokeBansResult)e.Result); return; } } + if (type == typeof(ServerModels.RevokeInventoryResult)) { if (_instance.OnServerRevokeInventoryItemResultEvent != null) { _instance.OnServerRevokeInventoryItemResultEvent((ServerModels.RevokeInventoryResult)e.Result); return; } } + if (type == typeof(ServerModels.RevokeInventoryItemsResult)) { if (_instance.OnServerRevokeInventoryItemsResultEvent != null) { _instance.OnServerRevokeInventoryItemsResultEvent((ServerModels.RevokeInventoryItemsResult)e.Result); return; } } + if (type == typeof(ServerModels.SavePushNotificationTemplateResult)) { if (_instance.OnServerSavePushNotificationTemplateResultEvent != null) { _instance.OnServerSavePushNotificationTemplateResultEvent((ServerModels.SavePushNotificationTemplateResult)e.Result); return; } } + if (type == typeof(ServerModels.SendCustomAccountRecoveryEmailResult)) { if (_instance.OnServerSendCustomAccountRecoveryEmailResultEvent != null) { _instance.OnServerSendCustomAccountRecoveryEmailResultEvent((ServerModels.SendCustomAccountRecoveryEmailResult)e.Result); return; } } + if (type == typeof(ServerModels.SendEmailFromTemplateResult)) { if (_instance.OnServerSendEmailFromTemplateResultEvent != null) { _instance.OnServerSendEmailFromTemplateResultEvent((ServerModels.SendEmailFromTemplateResult)e.Result); return; } } + if (type == typeof(ServerModels.SendPushNotificationResult)) { if (_instance.OnServerSendPushNotificationResultEvent != null) { _instance.OnServerSendPushNotificationResultEvent((ServerModels.SendPushNotificationResult)e.Result); return; } } + if (type == typeof(ServerModels.SendPushNotificationResult)) { if (_instance.OnServerSendPushNotificationFromTemplateResultEvent != null) { _instance.OnServerSendPushNotificationFromTemplateResultEvent((ServerModels.SendPushNotificationResult)e.Result); return; } } + if (type == typeof(ServerModels.EmptyResponse)) { if (_instance.OnServerSetFriendTagsResultEvent != null) { _instance.OnServerSetFriendTagsResultEvent((ServerModels.EmptyResponse)e.Result); return; } } + if (type == typeof(ServerModels.SetPlayerSecretResult)) { if (_instance.OnServerSetPlayerSecretResultEvent != null) { _instance.OnServerSetPlayerSecretResultEvent((ServerModels.SetPlayerSecretResult)e.Result); return; } } + if (type == typeof(ServerModels.SetPublisherDataResult)) { if (_instance.OnServerSetPublisherDataResultEvent != null) { _instance.OnServerSetPublisherDataResultEvent((ServerModels.SetPublisherDataResult)e.Result); return; } } + if (type == typeof(ServerModels.SetTitleDataResult)) { if (_instance.OnServerSetTitleDataResultEvent != null) { _instance.OnServerSetTitleDataResultEvent((ServerModels.SetTitleDataResult)e.Result); return; } } + if (type == typeof(ServerModels.SetTitleDataResult)) { if (_instance.OnServerSetTitleInternalDataResultEvent != null) { _instance.OnServerSetTitleInternalDataResultEvent((ServerModels.SetTitleDataResult)e.Result); return; } } + if (type == typeof(ServerModels.ModifyCharacterVirtualCurrencyResult)) { if (_instance.OnServerSubtractCharacterVirtualCurrencyResultEvent != null) { _instance.OnServerSubtractCharacterVirtualCurrencyResultEvent((ServerModels.ModifyCharacterVirtualCurrencyResult)e.Result); return; } } + if (type == typeof(ServerModels.ModifyUserVirtualCurrencyResult)) { if (_instance.OnServerSubtractUserVirtualCurrencyResultEvent != null) { _instance.OnServerSubtractUserVirtualCurrencyResultEvent((ServerModels.ModifyUserVirtualCurrencyResult)e.Result); return; } } + if (type == typeof(ServerModels.EmptyResponse)) { if (_instance.OnServerUnlinkNintendoServiceAccountResultEvent != null) { _instance.OnServerUnlinkNintendoServiceAccountResultEvent((ServerModels.EmptyResponse)e.Result); return; } } + if (type == typeof(ServerModels.UnlinkNintendoSwitchDeviceIdResult)) { if (_instance.OnServerUnlinkNintendoSwitchDeviceIdResultEvent != null) { _instance.OnServerUnlinkNintendoSwitchDeviceIdResultEvent((ServerModels.UnlinkNintendoSwitchDeviceIdResult)e.Result); return; } } + if (type == typeof(ServerModels.UnlinkPSNAccountResult)) { if (_instance.OnServerUnlinkPSNAccountResultEvent != null) { _instance.OnServerUnlinkPSNAccountResultEvent((ServerModels.UnlinkPSNAccountResult)e.Result); return; } } + if (type == typeof(ServerModels.UnlinkServerCustomIdResult)) { if (_instance.OnServerUnlinkServerCustomIdResultEvent != null) { _instance.OnServerUnlinkServerCustomIdResultEvent((ServerModels.UnlinkServerCustomIdResult)e.Result); return; } } + if (type == typeof(ServerModels.UnlinkSteamIdResult)) { if (_instance.OnServerUnlinkSteamIdResultEvent != null) { _instance.OnServerUnlinkSteamIdResultEvent((ServerModels.UnlinkSteamIdResult)e.Result); return; } } + if (type == typeof(ServerModels.UnlinkXboxAccountResult)) { if (_instance.OnServerUnlinkXboxAccountResultEvent != null) { _instance.OnServerUnlinkXboxAccountResultEvent((ServerModels.UnlinkXboxAccountResult)e.Result); return; } } + if (type == typeof(ServerModels.UnlockContainerItemResult)) { if (_instance.OnServerUnlockContainerInstanceResultEvent != null) { _instance.OnServerUnlockContainerInstanceResultEvent((ServerModels.UnlockContainerItemResult)e.Result); return; } } + if (type == typeof(ServerModels.UnlockContainerItemResult)) { if (_instance.OnServerUnlockContainerItemResultEvent != null) { _instance.OnServerUnlockContainerItemResultEvent((ServerModels.UnlockContainerItemResult)e.Result); return; } } + if (type == typeof(ServerModels.EmptyResponse)) { if (_instance.OnServerUpdateAvatarUrlResultEvent != null) { _instance.OnServerUpdateAvatarUrlResultEvent((ServerModels.EmptyResponse)e.Result); return; } } + if (type == typeof(ServerModels.UpdateBansResult)) { if (_instance.OnServerUpdateBansResultEvent != null) { _instance.OnServerUpdateBansResultEvent((ServerModels.UpdateBansResult)e.Result); return; } } + if (type == typeof(ServerModels.UpdateCharacterDataResult)) { if (_instance.OnServerUpdateCharacterDataResultEvent != null) { _instance.OnServerUpdateCharacterDataResultEvent((ServerModels.UpdateCharacterDataResult)e.Result); return; } } + if (type == typeof(ServerModels.UpdateCharacterDataResult)) { if (_instance.OnServerUpdateCharacterInternalDataResultEvent != null) { _instance.OnServerUpdateCharacterInternalDataResultEvent((ServerModels.UpdateCharacterDataResult)e.Result); return; } } + if (type == typeof(ServerModels.UpdateCharacterDataResult)) { if (_instance.OnServerUpdateCharacterReadOnlyDataResultEvent != null) { _instance.OnServerUpdateCharacterReadOnlyDataResultEvent((ServerModels.UpdateCharacterDataResult)e.Result); return; } } + if (type == typeof(ServerModels.UpdateCharacterStatisticsResult)) { if (_instance.OnServerUpdateCharacterStatisticsResultEvent != null) { _instance.OnServerUpdateCharacterStatisticsResultEvent((ServerModels.UpdateCharacterStatisticsResult)e.Result); return; } } + if (type == typeof(ServerModels.UpdatePlayerStatisticsResult)) { if (_instance.OnServerUpdatePlayerStatisticsResultEvent != null) { _instance.OnServerUpdatePlayerStatisticsResultEvent((ServerModels.UpdatePlayerStatisticsResult)e.Result); return; } } + if (type == typeof(ServerModels.UpdateSharedGroupDataResult)) { if (_instance.OnServerUpdateSharedGroupDataResultEvent != null) { _instance.OnServerUpdateSharedGroupDataResultEvent((ServerModels.UpdateSharedGroupDataResult)e.Result); return; } } + if (type == typeof(ServerModels.UpdateUserDataResult)) { if (_instance.OnServerUpdateUserDataResultEvent != null) { _instance.OnServerUpdateUserDataResultEvent((ServerModels.UpdateUserDataResult)e.Result); return; } } + if (type == typeof(ServerModels.UpdateUserDataResult)) { if (_instance.OnServerUpdateUserInternalDataResultEvent != null) { _instance.OnServerUpdateUserInternalDataResultEvent((ServerModels.UpdateUserDataResult)e.Result); return; } } + if (type == typeof(ServerModels.EmptyResponse)) { if (_instance.OnServerUpdateUserInventoryItemCustomDataResultEvent != null) { _instance.OnServerUpdateUserInventoryItemCustomDataResultEvent((ServerModels.EmptyResponse)e.Result); return; } } + if (type == typeof(ServerModels.UpdateUserDataResult)) { if (_instance.OnServerUpdateUserPublisherDataResultEvent != null) { _instance.OnServerUpdateUserPublisherDataResultEvent((ServerModels.UpdateUserDataResult)e.Result); return; } } + if (type == typeof(ServerModels.UpdateUserDataResult)) { if (_instance.OnServerUpdateUserPublisherInternalDataResultEvent != null) { _instance.OnServerUpdateUserPublisherInternalDataResultEvent((ServerModels.UpdateUserDataResult)e.Result); return; } } + if (type == typeof(ServerModels.UpdateUserDataResult)) { if (_instance.OnServerUpdateUserPublisherReadOnlyDataResultEvent != null) { _instance.OnServerUpdateUserPublisherReadOnlyDataResultEvent((ServerModels.UpdateUserDataResult)e.Result); return; } } + if (type == typeof(ServerModels.UpdateUserDataResult)) { if (_instance.OnServerUpdateUserReadOnlyDataResultEvent != null) { _instance.OnServerUpdateUserReadOnlyDataResultEvent((ServerModels.UpdateUserDataResult)e.Result); return; } } + if (type == typeof(ServerModels.WriteEventResponse)) { if (_instance.OnServerWriteCharacterEventResultEvent != null) { _instance.OnServerWriteCharacterEventResultEvent((ServerModels.WriteEventResponse)e.Result); return; } } + if (type == typeof(ServerModels.WriteEventResponse)) { if (_instance.OnServerWritePlayerEventResultEvent != null) { _instance.OnServerWritePlayerEventResultEvent((ServerModels.WriteEventResponse)e.Result); return; } } + if (type == typeof(ServerModels.WriteEventResponse)) { if (_instance.OnServerWriteTitleEventResultEvent != null) { _instance.OnServerWriteTitleEventResultEvent((ServerModels.WriteEventResponse)e.Result); return; } } +#endif +#if !DISABLE_PLAYFABENTITY_API + + if (type == typeof(AuthenticationModels.AuthenticateCustomIdResult)) { if (_instance.OnAuthenticationAuthenticateGameServerWithCustomIdResultEvent != null) { _instance.OnAuthenticationAuthenticateGameServerWithCustomIdResultEvent((AuthenticationModels.AuthenticateCustomIdResult)e.Result); return; } } + if (type == typeof(AuthenticationModels.EmptyResponse)) { if (_instance.OnAuthenticationDeleteResultEvent != null) { _instance.OnAuthenticationDeleteResultEvent((AuthenticationModels.EmptyResponse)e.Result); return; } } + if (type == typeof(AuthenticationModels.GetEntityTokenResponse)) { if (_instance.OnAuthenticationGetEntityTokenResultEvent != null) { _instance.OnAuthenticationGetEntityTokenResultEvent((AuthenticationModels.GetEntityTokenResponse)e.Result); return; } } + if (type == typeof(AuthenticationModels.ValidateEntityTokenResponse)) { if (_instance.OnAuthenticationValidateEntityTokenResultEvent != null) { _instance.OnAuthenticationValidateEntityTokenResultEvent((AuthenticationModels.ValidateEntityTokenResponse)e.Result); return; } } +#endif +#if !DISABLE_PLAYFABENTITY_API + + if (type == typeof(CloudScriptModels.ExecuteCloudScriptResult)) { if (_instance.OnCloudScriptExecuteEntityCloudScriptResultEvent != null) { _instance.OnCloudScriptExecuteEntityCloudScriptResultEvent((CloudScriptModels.ExecuteCloudScriptResult)e.Result); return; } } + if (type == typeof(CloudScriptModels.ExecuteFunctionResult)) { if (_instance.OnCloudScriptExecuteFunctionResultEvent != null) { _instance.OnCloudScriptExecuteFunctionResultEvent((CloudScriptModels.ExecuteFunctionResult)e.Result); return; } } + if (type == typeof(CloudScriptModels.GetFunctionResult)) { if (_instance.OnCloudScriptGetFunctionResultEvent != null) { _instance.OnCloudScriptGetFunctionResultEvent((CloudScriptModels.GetFunctionResult)e.Result); return; } } + if (type == typeof(CloudScriptModels.ListEventHubFunctionsResult)) { if (_instance.OnCloudScriptListEventHubFunctionsResultEvent != null) { _instance.OnCloudScriptListEventHubFunctionsResultEvent((CloudScriptModels.ListEventHubFunctionsResult)e.Result); return; } } + if (type == typeof(CloudScriptModels.ListFunctionsResult)) { if (_instance.OnCloudScriptListFunctionsResultEvent != null) { _instance.OnCloudScriptListFunctionsResultEvent((CloudScriptModels.ListFunctionsResult)e.Result); return; } } + if (type == typeof(CloudScriptModels.ListHttpFunctionsResult)) { if (_instance.OnCloudScriptListHttpFunctionsResultEvent != null) { _instance.OnCloudScriptListHttpFunctionsResultEvent((CloudScriptModels.ListHttpFunctionsResult)e.Result); return; } } + if (type == typeof(CloudScriptModels.ListQueuedFunctionsResult)) { if (_instance.OnCloudScriptListQueuedFunctionsResultEvent != null) { _instance.OnCloudScriptListQueuedFunctionsResultEvent((CloudScriptModels.ListQueuedFunctionsResult)e.Result); return; } } + if (type == typeof(CloudScriptModels.EmptyResult)) { if (_instance.OnCloudScriptPostFunctionResultForEntityTriggeredActionResultEvent != null) { _instance.OnCloudScriptPostFunctionResultForEntityTriggeredActionResultEvent((CloudScriptModels.EmptyResult)e.Result); return; } } + if (type == typeof(CloudScriptModels.EmptyResult)) { if (_instance.OnCloudScriptPostFunctionResultForFunctionExecutionResultEvent != null) { _instance.OnCloudScriptPostFunctionResultForFunctionExecutionResultEvent((CloudScriptModels.EmptyResult)e.Result); return; } } + if (type == typeof(CloudScriptModels.EmptyResult)) { if (_instance.OnCloudScriptPostFunctionResultForPlayerTriggeredActionResultEvent != null) { _instance.OnCloudScriptPostFunctionResultForPlayerTriggeredActionResultEvent((CloudScriptModels.EmptyResult)e.Result); return; } } + if (type == typeof(CloudScriptModels.EmptyResult)) { if (_instance.OnCloudScriptPostFunctionResultForScheduledTaskResultEvent != null) { _instance.OnCloudScriptPostFunctionResultForScheduledTaskResultEvent((CloudScriptModels.EmptyResult)e.Result); return; } } + if (type == typeof(CloudScriptModels.EmptyResult)) { if (_instance.OnCloudScriptRegisterEventHubFunctionResultEvent != null) { _instance.OnCloudScriptRegisterEventHubFunctionResultEvent((CloudScriptModels.EmptyResult)e.Result); return; } } + if (type == typeof(CloudScriptModels.EmptyResult)) { if (_instance.OnCloudScriptRegisterHttpFunctionResultEvent != null) { _instance.OnCloudScriptRegisterHttpFunctionResultEvent((CloudScriptModels.EmptyResult)e.Result); return; } } + if (type == typeof(CloudScriptModels.EmptyResult)) { if (_instance.OnCloudScriptRegisterQueuedFunctionResultEvent != null) { _instance.OnCloudScriptRegisterQueuedFunctionResultEvent((CloudScriptModels.EmptyResult)e.Result); return; } } + if (type == typeof(CloudScriptModels.EmptyResult)) { if (_instance.OnCloudScriptUnregisterFunctionResultEvent != null) { _instance.OnCloudScriptUnregisterFunctionResultEvent((CloudScriptModels.EmptyResult)e.Result); return; } } +#endif +#if !DISABLE_PLAYFABENTITY_API + + if (type == typeof(DataModels.AbortFileUploadsResponse)) { if (_instance.OnDataAbortFileUploadsResultEvent != null) { _instance.OnDataAbortFileUploadsResultEvent((DataModels.AbortFileUploadsResponse)e.Result); return; } } + if (type == typeof(DataModels.DeleteFilesResponse)) { if (_instance.OnDataDeleteFilesResultEvent != null) { _instance.OnDataDeleteFilesResultEvent((DataModels.DeleteFilesResponse)e.Result); return; } } + if (type == typeof(DataModels.FinalizeFileUploadsResponse)) { if (_instance.OnDataFinalizeFileUploadsResultEvent != null) { _instance.OnDataFinalizeFileUploadsResultEvent((DataModels.FinalizeFileUploadsResponse)e.Result); return; } } + if (type == typeof(DataModels.GetFilesResponse)) { if (_instance.OnDataGetFilesResultEvent != null) { _instance.OnDataGetFilesResultEvent((DataModels.GetFilesResponse)e.Result); return; } } + if (type == typeof(DataModels.GetObjectsResponse)) { if (_instance.OnDataGetObjectsResultEvent != null) { _instance.OnDataGetObjectsResultEvent((DataModels.GetObjectsResponse)e.Result); return; } } + if (type == typeof(DataModels.InitiateFileUploadsResponse)) { if (_instance.OnDataInitiateFileUploadsResultEvent != null) { _instance.OnDataInitiateFileUploadsResultEvent((DataModels.InitiateFileUploadsResponse)e.Result); return; } } + if (type == typeof(DataModels.SetObjectsResponse)) { if (_instance.OnDataSetObjectsResultEvent != null) { _instance.OnDataSetObjectsResultEvent((DataModels.SetObjectsResponse)e.Result); return; } } +#endif +#if !DISABLE_PLAYFABENTITY_API + + if (type == typeof(EconomyModels.AddInventoryItemsResponse)) { if (_instance.OnEconomyAddInventoryItemsResultEvent != null) { _instance.OnEconomyAddInventoryItemsResultEvent((EconomyModels.AddInventoryItemsResponse)e.Result); return; } } + if (type == typeof(EconomyModels.CreateDraftItemResponse)) { if (_instance.OnEconomyCreateDraftItemResultEvent != null) { _instance.OnEconomyCreateDraftItemResultEvent((EconomyModels.CreateDraftItemResponse)e.Result); return; } } + if (type == typeof(EconomyModels.CreateUploadUrlsResponse)) { if (_instance.OnEconomyCreateUploadUrlsResultEvent != null) { _instance.OnEconomyCreateUploadUrlsResultEvent((EconomyModels.CreateUploadUrlsResponse)e.Result); return; } } + if (type == typeof(EconomyModels.DeleteEntityItemReviewsResponse)) { if (_instance.OnEconomyDeleteEntityItemReviewsResultEvent != null) { _instance.OnEconomyDeleteEntityItemReviewsResultEvent((EconomyModels.DeleteEntityItemReviewsResponse)e.Result); return; } } + if (type == typeof(EconomyModels.DeleteInventoryCollectionResponse)) { if (_instance.OnEconomyDeleteInventoryCollectionResultEvent != null) { _instance.OnEconomyDeleteInventoryCollectionResultEvent((EconomyModels.DeleteInventoryCollectionResponse)e.Result); return; } } + if (type == typeof(EconomyModels.DeleteInventoryItemsResponse)) { if (_instance.OnEconomyDeleteInventoryItemsResultEvent != null) { _instance.OnEconomyDeleteInventoryItemsResultEvent((EconomyModels.DeleteInventoryItemsResponse)e.Result); return; } } + if (type == typeof(EconomyModels.DeleteItemResponse)) { if (_instance.OnEconomyDeleteItemResultEvent != null) { _instance.OnEconomyDeleteItemResultEvent((EconomyModels.DeleteItemResponse)e.Result); return; } } + if (type == typeof(EconomyModels.ExecuteInventoryOperationsResponse)) { if (_instance.OnEconomyExecuteInventoryOperationsResultEvent != null) { _instance.OnEconomyExecuteInventoryOperationsResultEvent((EconomyModels.ExecuteInventoryOperationsResponse)e.Result); return; } } + if (type == typeof(EconomyModels.ExecuteTransferOperationsResponse)) { if (_instance.OnEconomyExecuteTransferOperationsResultEvent != null) { _instance.OnEconomyExecuteTransferOperationsResultEvent((EconomyModels.ExecuteTransferOperationsResponse)e.Result); return; } } + if (type == typeof(EconomyModels.GetCatalogConfigResponse)) { if (_instance.OnEconomyGetCatalogConfigResultEvent != null) { _instance.OnEconomyGetCatalogConfigResultEvent((EconomyModels.GetCatalogConfigResponse)e.Result); return; } } + if (type == typeof(EconomyModels.GetDraftItemResponse)) { if (_instance.OnEconomyGetDraftItemResultEvent != null) { _instance.OnEconomyGetDraftItemResultEvent((EconomyModels.GetDraftItemResponse)e.Result); return; } } + if (type == typeof(EconomyModels.GetDraftItemsResponse)) { if (_instance.OnEconomyGetDraftItemsResultEvent != null) { _instance.OnEconomyGetDraftItemsResultEvent((EconomyModels.GetDraftItemsResponse)e.Result); return; } } + if (type == typeof(EconomyModels.GetEntityDraftItemsResponse)) { if (_instance.OnEconomyGetEntityDraftItemsResultEvent != null) { _instance.OnEconomyGetEntityDraftItemsResultEvent((EconomyModels.GetEntityDraftItemsResponse)e.Result); return; } } + if (type == typeof(EconomyModels.GetEntityItemReviewResponse)) { if (_instance.OnEconomyGetEntityItemReviewResultEvent != null) { _instance.OnEconomyGetEntityItemReviewResultEvent((EconomyModels.GetEntityItemReviewResponse)e.Result); return; } } + if (type == typeof(EconomyModels.GetInventoryCollectionIdsResponse)) { if (_instance.OnEconomyGetInventoryCollectionIdsResultEvent != null) { _instance.OnEconomyGetInventoryCollectionIdsResultEvent((EconomyModels.GetInventoryCollectionIdsResponse)e.Result); return; } } + if (type == typeof(EconomyModels.GetInventoryItemsResponse)) { if (_instance.OnEconomyGetInventoryItemsResultEvent != null) { _instance.OnEconomyGetInventoryItemsResultEvent((EconomyModels.GetInventoryItemsResponse)e.Result); return; } } + if (type == typeof(EconomyModels.GetInventoryOperationStatusResponse)) { if (_instance.OnEconomyGetInventoryOperationStatusResultEvent != null) { _instance.OnEconomyGetInventoryOperationStatusResultEvent((EconomyModels.GetInventoryOperationStatusResponse)e.Result); return; } } + if (type == typeof(EconomyModels.GetItemResponse)) { if (_instance.OnEconomyGetItemResultEvent != null) { _instance.OnEconomyGetItemResultEvent((EconomyModels.GetItemResponse)e.Result); return; } } + if (type == typeof(EconomyModels.GetItemContainersResponse)) { if (_instance.OnEconomyGetItemContainersResultEvent != null) { _instance.OnEconomyGetItemContainersResultEvent((EconomyModels.GetItemContainersResponse)e.Result); return; } } + if (type == typeof(EconomyModels.GetItemModerationStateResponse)) { if (_instance.OnEconomyGetItemModerationStateResultEvent != null) { _instance.OnEconomyGetItemModerationStateResultEvent((EconomyModels.GetItemModerationStateResponse)e.Result); return; } } + if (type == typeof(EconomyModels.GetItemPublishStatusResponse)) { if (_instance.OnEconomyGetItemPublishStatusResultEvent != null) { _instance.OnEconomyGetItemPublishStatusResultEvent((EconomyModels.GetItemPublishStatusResponse)e.Result); return; } } + if (type == typeof(EconomyModels.GetItemReviewsResponse)) { if (_instance.OnEconomyGetItemReviewsResultEvent != null) { _instance.OnEconomyGetItemReviewsResultEvent((EconomyModels.GetItemReviewsResponse)e.Result); return; } } + if (type == typeof(EconomyModels.GetItemReviewSummaryResponse)) { if (_instance.OnEconomyGetItemReviewSummaryResultEvent != null) { _instance.OnEconomyGetItemReviewSummaryResultEvent((EconomyModels.GetItemReviewSummaryResponse)e.Result); return; } } + if (type == typeof(EconomyModels.GetItemsResponse)) { if (_instance.OnEconomyGetItemsResultEvent != null) { _instance.OnEconomyGetItemsResultEvent((EconomyModels.GetItemsResponse)e.Result); return; } } + if (type == typeof(EconomyModels.GetMicrosoftStoreAccessTokensResponse)) { if (_instance.OnEconomyGetMicrosoftStoreAccessTokensResultEvent != null) { _instance.OnEconomyGetMicrosoftStoreAccessTokensResultEvent((EconomyModels.GetMicrosoftStoreAccessTokensResponse)e.Result); return; } } + if (type == typeof(EconomyModels.GetTransactionHistoryResponse)) { if (_instance.OnEconomyGetTransactionHistoryResultEvent != null) { _instance.OnEconomyGetTransactionHistoryResultEvent((EconomyModels.GetTransactionHistoryResponse)e.Result); return; } } + if (type == typeof(EconomyModels.PublishDraftItemResponse)) { if (_instance.OnEconomyPublishDraftItemResultEvent != null) { _instance.OnEconomyPublishDraftItemResultEvent((EconomyModels.PublishDraftItemResponse)e.Result); return; } } + if (type == typeof(EconomyModels.PurchaseInventoryItemsResponse)) { if (_instance.OnEconomyPurchaseInventoryItemsResultEvent != null) { _instance.OnEconomyPurchaseInventoryItemsResultEvent((EconomyModels.PurchaseInventoryItemsResponse)e.Result); return; } } + if (type == typeof(EconomyModels.RedeemAppleAppStoreInventoryItemsResponse)) { if (_instance.OnEconomyRedeemAppleAppStoreInventoryItemsResultEvent != null) { _instance.OnEconomyRedeemAppleAppStoreInventoryItemsResultEvent((EconomyModels.RedeemAppleAppStoreInventoryItemsResponse)e.Result); return; } } + if (type == typeof(EconomyModels.RedeemGooglePlayInventoryItemsResponse)) { if (_instance.OnEconomyRedeemGooglePlayInventoryItemsResultEvent != null) { _instance.OnEconomyRedeemGooglePlayInventoryItemsResultEvent((EconomyModels.RedeemGooglePlayInventoryItemsResponse)e.Result); return; } } + if (type == typeof(EconomyModels.RedeemMicrosoftStoreInventoryItemsResponse)) { if (_instance.OnEconomyRedeemMicrosoftStoreInventoryItemsResultEvent != null) { _instance.OnEconomyRedeemMicrosoftStoreInventoryItemsResultEvent((EconomyModels.RedeemMicrosoftStoreInventoryItemsResponse)e.Result); return; } } + if (type == typeof(EconomyModels.RedeemNintendoEShopInventoryItemsResponse)) { if (_instance.OnEconomyRedeemNintendoEShopInventoryItemsResultEvent != null) { _instance.OnEconomyRedeemNintendoEShopInventoryItemsResultEvent((EconomyModels.RedeemNintendoEShopInventoryItemsResponse)e.Result); return; } } + if (type == typeof(EconomyModels.RedeemPlayStationStoreInventoryItemsResponse)) { if (_instance.OnEconomyRedeemPlayStationStoreInventoryItemsResultEvent != null) { _instance.OnEconomyRedeemPlayStationStoreInventoryItemsResultEvent((EconomyModels.RedeemPlayStationStoreInventoryItemsResponse)e.Result); return; } } + if (type == typeof(EconomyModels.RedeemSteamInventoryItemsResponse)) { if (_instance.OnEconomyRedeemSteamInventoryItemsResultEvent != null) { _instance.OnEconomyRedeemSteamInventoryItemsResultEvent((EconomyModels.RedeemSteamInventoryItemsResponse)e.Result); return; } } + if (type == typeof(EconomyModels.ReportItemResponse)) { if (_instance.OnEconomyReportItemResultEvent != null) { _instance.OnEconomyReportItemResultEvent((EconomyModels.ReportItemResponse)e.Result); return; } } + if (type == typeof(EconomyModels.ReportItemReviewResponse)) { if (_instance.OnEconomyReportItemReviewResultEvent != null) { _instance.OnEconomyReportItemReviewResultEvent((EconomyModels.ReportItemReviewResponse)e.Result); return; } } + if (type == typeof(EconomyModels.ReviewItemResponse)) { if (_instance.OnEconomyReviewItemResultEvent != null) { _instance.OnEconomyReviewItemResultEvent((EconomyModels.ReviewItemResponse)e.Result); return; } } + if (type == typeof(EconomyModels.SearchItemsResponse)) { if (_instance.OnEconomySearchItemsResultEvent != null) { _instance.OnEconomySearchItemsResultEvent((EconomyModels.SearchItemsResponse)e.Result); return; } } + if (type == typeof(EconomyModels.SetItemModerationStateResponse)) { if (_instance.OnEconomySetItemModerationStateResultEvent != null) { _instance.OnEconomySetItemModerationStateResultEvent((EconomyModels.SetItemModerationStateResponse)e.Result); return; } } + if (type == typeof(EconomyModels.SubmitItemReviewVoteResponse)) { if (_instance.OnEconomySubmitItemReviewVoteResultEvent != null) { _instance.OnEconomySubmitItemReviewVoteResultEvent((EconomyModels.SubmitItemReviewVoteResponse)e.Result); return; } } + if (type == typeof(EconomyModels.SubtractInventoryItemsResponse)) { if (_instance.OnEconomySubtractInventoryItemsResultEvent != null) { _instance.OnEconomySubtractInventoryItemsResultEvent((EconomyModels.SubtractInventoryItemsResponse)e.Result); return; } } + if (type == typeof(EconomyModels.TakedownItemReviewsResponse)) { if (_instance.OnEconomyTakedownItemReviewsResultEvent != null) { _instance.OnEconomyTakedownItemReviewsResultEvent((EconomyModels.TakedownItemReviewsResponse)e.Result); return; } } + if (type == typeof(EconomyModels.TransferInventoryItemsResponse)) { if (_instance.OnEconomyTransferInventoryItemsResultEvent != null) { _instance.OnEconomyTransferInventoryItemsResultEvent((EconomyModels.TransferInventoryItemsResponse)e.Result); return; } } + if (type == typeof(EconomyModels.UpdateCatalogConfigResponse)) { if (_instance.OnEconomyUpdateCatalogConfigResultEvent != null) { _instance.OnEconomyUpdateCatalogConfigResultEvent((EconomyModels.UpdateCatalogConfigResponse)e.Result); return; } } + if (type == typeof(EconomyModels.UpdateDraftItemResponse)) { if (_instance.OnEconomyUpdateDraftItemResultEvent != null) { _instance.OnEconomyUpdateDraftItemResultEvent((EconomyModels.UpdateDraftItemResponse)e.Result); return; } } + if (type == typeof(EconomyModels.UpdateInventoryItemsResponse)) { if (_instance.OnEconomyUpdateInventoryItemsResultEvent != null) { _instance.OnEconomyUpdateInventoryItemsResultEvent((EconomyModels.UpdateInventoryItemsResponse)e.Result); return; } } +#endif +#if !DISABLE_PLAYFABENTITY_API + + if (type == typeof(EventsModels.CreateTelemetryKeyResponse)) { if (_instance.OnEventsCreateTelemetryKeyResultEvent != null) { _instance.OnEventsCreateTelemetryKeyResultEvent((EventsModels.CreateTelemetryKeyResponse)e.Result); return; } } + if (type == typeof(EventsModels.DeleteTelemetryKeyResponse)) { if (_instance.OnEventsDeleteTelemetryKeyResultEvent != null) { _instance.OnEventsDeleteTelemetryKeyResultEvent((EventsModels.DeleteTelemetryKeyResponse)e.Result); return; } } + if (type == typeof(EventsModels.GetTelemetryKeyResponse)) { if (_instance.OnEventsGetTelemetryKeyResultEvent != null) { _instance.OnEventsGetTelemetryKeyResultEvent((EventsModels.GetTelemetryKeyResponse)e.Result); return; } } + if (type == typeof(EventsModels.ListTelemetryKeysResponse)) { if (_instance.OnEventsListTelemetryKeysResultEvent != null) { _instance.OnEventsListTelemetryKeysResultEvent((EventsModels.ListTelemetryKeysResponse)e.Result); return; } } + if (type == typeof(EventsModels.SetTelemetryKeyActiveResponse)) { if (_instance.OnEventsSetTelemetryKeyActiveResultEvent != null) { _instance.OnEventsSetTelemetryKeyActiveResultEvent((EventsModels.SetTelemetryKeyActiveResponse)e.Result); return; } } + if (type == typeof(EventsModels.WriteEventsResponse)) { if (_instance.OnEventsWriteEventsResultEvent != null) { _instance.OnEventsWriteEventsResultEvent((EventsModels.WriteEventsResponse)e.Result); return; } } + if (type == typeof(EventsModels.WriteEventsResponse)) { if (_instance.OnEventsWriteTelemetryEventsResultEvent != null) { _instance.OnEventsWriteTelemetryEventsResultEvent((EventsModels.WriteEventsResponse)e.Result); return; } } +#endif +#if !DISABLE_PLAYFABENTITY_API + + if (type == typeof(ExperimentationModels.CreateExclusionGroupResult)) { if (_instance.OnExperimentationCreateExclusionGroupResultEvent != null) { _instance.OnExperimentationCreateExclusionGroupResultEvent((ExperimentationModels.CreateExclusionGroupResult)e.Result); return; } } + if (type == typeof(ExperimentationModels.CreateExperimentResult)) { if (_instance.OnExperimentationCreateExperimentResultEvent != null) { _instance.OnExperimentationCreateExperimentResultEvent((ExperimentationModels.CreateExperimentResult)e.Result); return; } } + if (type == typeof(ExperimentationModels.EmptyResponse)) { if (_instance.OnExperimentationDeleteExclusionGroupResultEvent != null) { _instance.OnExperimentationDeleteExclusionGroupResultEvent((ExperimentationModels.EmptyResponse)e.Result); return; } } + if (type == typeof(ExperimentationModels.EmptyResponse)) { if (_instance.OnExperimentationDeleteExperimentResultEvent != null) { _instance.OnExperimentationDeleteExperimentResultEvent((ExperimentationModels.EmptyResponse)e.Result); return; } } + if (type == typeof(ExperimentationModels.GetExclusionGroupsResult)) { if (_instance.OnExperimentationGetExclusionGroupsResultEvent != null) { _instance.OnExperimentationGetExclusionGroupsResultEvent((ExperimentationModels.GetExclusionGroupsResult)e.Result); return; } } + if (type == typeof(ExperimentationModels.GetExclusionGroupTrafficResult)) { if (_instance.OnExperimentationGetExclusionGroupTrafficResultEvent != null) { _instance.OnExperimentationGetExclusionGroupTrafficResultEvent((ExperimentationModels.GetExclusionGroupTrafficResult)e.Result); return; } } + if (type == typeof(ExperimentationModels.GetExperimentsResult)) { if (_instance.OnExperimentationGetExperimentsResultEvent != null) { _instance.OnExperimentationGetExperimentsResultEvent((ExperimentationModels.GetExperimentsResult)e.Result); return; } } + if (type == typeof(ExperimentationModels.GetLatestScorecardResult)) { if (_instance.OnExperimentationGetLatestScorecardResultEvent != null) { _instance.OnExperimentationGetLatestScorecardResultEvent((ExperimentationModels.GetLatestScorecardResult)e.Result); return; } } + if (type == typeof(ExperimentationModels.GetTreatmentAssignmentResult)) { if (_instance.OnExperimentationGetTreatmentAssignmentResultEvent != null) { _instance.OnExperimentationGetTreatmentAssignmentResultEvent((ExperimentationModels.GetTreatmentAssignmentResult)e.Result); return; } } + if (type == typeof(ExperimentationModels.EmptyResponse)) { if (_instance.OnExperimentationStartExperimentResultEvent != null) { _instance.OnExperimentationStartExperimentResultEvent((ExperimentationModels.EmptyResponse)e.Result); return; } } + if (type == typeof(ExperimentationModels.EmptyResponse)) { if (_instance.OnExperimentationStopExperimentResultEvent != null) { _instance.OnExperimentationStopExperimentResultEvent((ExperimentationModels.EmptyResponse)e.Result); return; } } + if (type == typeof(ExperimentationModels.EmptyResponse)) { if (_instance.OnExperimentationUpdateExclusionGroupResultEvent != null) { _instance.OnExperimentationUpdateExclusionGroupResultEvent((ExperimentationModels.EmptyResponse)e.Result); return; } } + if (type == typeof(ExperimentationModels.EmptyResponse)) { if (_instance.OnExperimentationUpdateExperimentResultEvent != null) { _instance.OnExperimentationUpdateExperimentResultEvent((ExperimentationModels.EmptyResponse)e.Result); return; } } +#endif +#if !DISABLE_PLAYFABENTITY_API + + if (type == typeof(InsightsModels.InsightsGetDetailsResponse)) { if (_instance.OnInsightsGetDetailsResultEvent != null) { _instance.OnInsightsGetDetailsResultEvent((InsightsModels.InsightsGetDetailsResponse)e.Result); return; } } + if (type == typeof(InsightsModels.InsightsGetLimitsResponse)) { if (_instance.OnInsightsGetLimitsResultEvent != null) { _instance.OnInsightsGetLimitsResultEvent((InsightsModels.InsightsGetLimitsResponse)e.Result); return; } } + if (type == typeof(InsightsModels.InsightsGetOperationStatusResponse)) { if (_instance.OnInsightsGetOperationStatusResultEvent != null) { _instance.OnInsightsGetOperationStatusResultEvent((InsightsModels.InsightsGetOperationStatusResponse)e.Result); return; } } + if (type == typeof(InsightsModels.InsightsGetPendingOperationsResponse)) { if (_instance.OnInsightsGetPendingOperationsResultEvent != null) { _instance.OnInsightsGetPendingOperationsResultEvent((InsightsModels.InsightsGetPendingOperationsResponse)e.Result); return; } } + if (type == typeof(InsightsModels.InsightsOperationResponse)) { if (_instance.OnInsightsSetPerformanceResultEvent != null) { _instance.OnInsightsSetPerformanceResultEvent((InsightsModels.InsightsOperationResponse)e.Result); return; } } + if (type == typeof(InsightsModels.InsightsOperationResponse)) { if (_instance.OnInsightsSetStorageRetentionResultEvent != null) { _instance.OnInsightsSetStorageRetentionResultEvent((InsightsModels.InsightsOperationResponse)e.Result); return; } } +#endif +#if !DISABLE_PLAYFABENTITY_API + + if (type == typeof(GroupsModels.EmptyResponse)) { if (_instance.OnGroupsAcceptGroupApplicationResultEvent != null) { _instance.OnGroupsAcceptGroupApplicationResultEvent((GroupsModels.EmptyResponse)e.Result); return; } } + if (type == typeof(GroupsModels.EmptyResponse)) { if (_instance.OnGroupsAcceptGroupInvitationResultEvent != null) { _instance.OnGroupsAcceptGroupInvitationResultEvent((GroupsModels.EmptyResponse)e.Result); return; } } + if (type == typeof(GroupsModels.EmptyResponse)) { if (_instance.OnGroupsAddMembersResultEvent != null) { _instance.OnGroupsAddMembersResultEvent((GroupsModels.EmptyResponse)e.Result); return; } } + if (type == typeof(GroupsModels.ApplyToGroupResponse)) { if (_instance.OnGroupsApplyToGroupResultEvent != null) { _instance.OnGroupsApplyToGroupResultEvent((GroupsModels.ApplyToGroupResponse)e.Result); return; } } + if (type == typeof(GroupsModels.EmptyResponse)) { if (_instance.OnGroupsBlockEntityResultEvent != null) { _instance.OnGroupsBlockEntityResultEvent((GroupsModels.EmptyResponse)e.Result); return; } } + if (type == typeof(GroupsModels.EmptyResponse)) { if (_instance.OnGroupsChangeMemberRoleResultEvent != null) { _instance.OnGroupsChangeMemberRoleResultEvent((GroupsModels.EmptyResponse)e.Result); return; } } + if (type == typeof(GroupsModels.CreateGroupResponse)) { if (_instance.OnGroupsCreateGroupResultEvent != null) { _instance.OnGroupsCreateGroupResultEvent((GroupsModels.CreateGroupResponse)e.Result); return; } } + if (type == typeof(GroupsModels.CreateGroupRoleResponse)) { if (_instance.OnGroupsCreateRoleResultEvent != null) { _instance.OnGroupsCreateRoleResultEvent((GroupsModels.CreateGroupRoleResponse)e.Result); return; } } + if (type == typeof(GroupsModels.EmptyResponse)) { if (_instance.OnGroupsDeleteGroupResultEvent != null) { _instance.OnGroupsDeleteGroupResultEvent((GroupsModels.EmptyResponse)e.Result); return; } } + if (type == typeof(GroupsModels.EmptyResponse)) { if (_instance.OnGroupsDeleteRoleResultEvent != null) { _instance.OnGroupsDeleteRoleResultEvent((GroupsModels.EmptyResponse)e.Result); return; } } + if (type == typeof(GroupsModels.GetGroupResponse)) { if (_instance.OnGroupsGetGroupResultEvent != null) { _instance.OnGroupsGetGroupResultEvent((GroupsModels.GetGroupResponse)e.Result); return; } } + if (type == typeof(GroupsModels.InviteToGroupResponse)) { if (_instance.OnGroupsInviteToGroupResultEvent != null) { _instance.OnGroupsInviteToGroupResultEvent((GroupsModels.InviteToGroupResponse)e.Result); return; } } + if (type == typeof(GroupsModels.IsMemberResponse)) { if (_instance.OnGroupsIsMemberResultEvent != null) { _instance.OnGroupsIsMemberResultEvent((GroupsModels.IsMemberResponse)e.Result); return; } } + if (type == typeof(GroupsModels.ListGroupApplicationsResponse)) { if (_instance.OnGroupsListGroupApplicationsResultEvent != null) { _instance.OnGroupsListGroupApplicationsResultEvent((GroupsModels.ListGroupApplicationsResponse)e.Result); return; } } + if (type == typeof(GroupsModels.ListGroupBlocksResponse)) { if (_instance.OnGroupsListGroupBlocksResultEvent != null) { _instance.OnGroupsListGroupBlocksResultEvent((GroupsModels.ListGroupBlocksResponse)e.Result); return; } } + if (type == typeof(GroupsModels.ListGroupInvitationsResponse)) { if (_instance.OnGroupsListGroupInvitationsResultEvent != null) { _instance.OnGroupsListGroupInvitationsResultEvent((GroupsModels.ListGroupInvitationsResponse)e.Result); return; } } + if (type == typeof(GroupsModels.ListGroupMembersResponse)) { if (_instance.OnGroupsListGroupMembersResultEvent != null) { _instance.OnGroupsListGroupMembersResultEvent((GroupsModels.ListGroupMembersResponse)e.Result); return; } } + if (type == typeof(GroupsModels.ListMembershipResponse)) { if (_instance.OnGroupsListMembershipResultEvent != null) { _instance.OnGroupsListMembershipResultEvent((GroupsModels.ListMembershipResponse)e.Result); return; } } + if (type == typeof(GroupsModels.ListMembershipOpportunitiesResponse)) { if (_instance.OnGroupsListMembershipOpportunitiesResultEvent != null) { _instance.OnGroupsListMembershipOpportunitiesResultEvent((GroupsModels.ListMembershipOpportunitiesResponse)e.Result); return; } } + if (type == typeof(GroupsModels.EmptyResponse)) { if (_instance.OnGroupsRemoveGroupApplicationResultEvent != null) { _instance.OnGroupsRemoveGroupApplicationResultEvent((GroupsModels.EmptyResponse)e.Result); return; } } + if (type == typeof(GroupsModels.EmptyResponse)) { if (_instance.OnGroupsRemoveGroupInvitationResultEvent != null) { _instance.OnGroupsRemoveGroupInvitationResultEvent((GroupsModels.EmptyResponse)e.Result); return; } } + if (type == typeof(GroupsModels.EmptyResponse)) { if (_instance.OnGroupsRemoveMembersResultEvent != null) { _instance.OnGroupsRemoveMembersResultEvent((GroupsModels.EmptyResponse)e.Result); return; } } + if (type == typeof(GroupsModels.EmptyResponse)) { if (_instance.OnGroupsUnblockEntityResultEvent != null) { _instance.OnGroupsUnblockEntityResultEvent((GroupsModels.EmptyResponse)e.Result); return; } } + if (type == typeof(GroupsModels.UpdateGroupResponse)) { if (_instance.OnGroupsUpdateGroupResultEvent != null) { _instance.OnGroupsUpdateGroupResultEvent((GroupsModels.UpdateGroupResponse)e.Result); return; } } + if (type == typeof(GroupsModels.UpdateGroupRoleResponse)) { if (_instance.OnGroupsUpdateRoleResultEvent != null) { _instance.OnGroupsUpdateRoleResultEvent((GroupsModels.UpdateGroupRoleResponse)e.Result); return; } } +#endif +#if !DISABLE_PLAYFABENTITY_API + + if (type == typeof(ProgressionModels.EmptyResponse)) { if (_instance.OnProgressionCreateLeaderboardDefinitionResultEvent != null) { _instance.OnProgressionCreateLeaderboardDefinitionResultEvent((ProgressionModels.EmptyResponse)e.Result); return; } } + if (type == typeof(ProgressionModels.EmptyResponse)) { if (_instance.OnProgressionCreateStatisticDefinitionResultEvent != null) { _instance.OnProgressionCreateStatisticDefinitionResultEvent((ProgressionModels.EmptyResponse)e.Result); return; } } + if (type == typeof(ProgressionModels.EmptyResponse)) { if (_instance.OnProgressionDeleteLeaderboardDefinitionResultEvent != null) { _instance.OnProgressionDeleteLeaderboardDefinitionResultEvent((ProgressionModels.EmptyResponse)e.Result); return; } } + if (type == typeof(ProgressionModels.EmptyResponse)) { if (_instance.OnProgressionDeleteLeaderboardEntriesResultEvent != null) { _instance.OnProgressionDeleteLeaderboardEntriesResultEvent((ProgressionModels.EmptyResponse)e.Result); return; } } + if (type == typeof(ProgressionModels.EmptyResponse)) { if (_instance.OnProgressionDeleteStatisticDefinitionResultEvent != null) { _instance.OnProgressionDeleteStatisticDefinitionResultEvent((ProgressionModels.EmptyResponse)e.Result); return; } } + if (type == typeof(ProgressionModels.DeleteStatisticsResponse)) { if (_instance.OnProgressionDeleteStatisticsResultEvent != null) { _instance.OnProgressionDeleteStatisticsResultEvent((ProgressionModels.DeleteStatisticsResponse)e.Result); return; } } + if (type == typeof(ProgressionModels.GetEntityLeaderboardResponse)) { if (_instance.OnProgressionGetFriendLeaderboardForEntityResultEvent != null) { _instance.OnProgressionGetFriendLeaderboardForEntityResultEvent((ProgressionModels.GetEntityLeaderboardResponse)e.Result); return; } } + if (type == typeof(ProgressionModels.GetEntityLeaderboardResponse)) { if (_instance.OnProgressionGetLeaderboardResultEvent != null) { _instance.OnProgressionGetLeaderboardResultEvent((ProgressionModels.GetEntityLeaderboardResponse)e.Result); return; } } + if (type == typeof(ProgressionModels.GetEntityLeaderboardResponse)) { if (_instance.OnProgressionGetLeaderboardAroundEntityResultEvent != null) { _instance.OnProgressionGetLeaderboardAroundEntityResultEvent((ProgressionModels.GetEntityLeaderboardResponse)e.Result); return; } } + if (type == typeof(ProgressionModels.GetLeaderboardDefinitionResponse)) { if (_instance.OnProgressionGetLeaderboardDefinitionResultEvent != null) { _instance.OnProgressionGetLeaderboardDefinitionResultEvent((ProgressionModels.GetLeaderboardDefinitionResponse)e.Result); return; } } + if (type == typeof(ProgressionModels.GetEntityLeaderboardResponse)) { if (_instance.OnProgressionGetLeaderboardForEntitiesResultEvent != null) { _instance.OnProgressionGetLeaderboardForEntitiesResultEvent((ProgressionModels.GetEntityLeaderboardResponse)e.Result); return; } } + if (type == typeof(ProgressionModels.GetStatisticDefinitionResponse)) { if (_instance.OnProgressionGetStatisticDefinitionResultEvent != null) { _instance.OnProgressionGetStatisticDefinitionResultEvent((ProgressionModels.GetStatisticDefinitionResponse)e.Result); return; } } + if (type == typeof(ProgressionModels.GetStatisticsResponse)) { if (_instance.OnProgressionGetStatisticsResultEvent != null) { _instance.OnProgressionGetStatisticsResultEvent((ProgressionModels.GetStatisticsResponse)e.Result); return; } } + if (type == typeof(ProgressionModels.GetStatisticsForEntitiesResponse)) { if (_instance.OnProgressionGetStatisticsForEntitiesResultEvent != null) { _instance.OnProgressionGetStatisticsForEntitiesResultEvent((ProgressionModels.GetStatisticsForEntitiesResponse)e.Result); return; } } + if (type == typeof(ProgressionModels.IncrementLeaderboardVersionResponse)) { if (_instance.OnProgressionIncrementLeaderboardVersionResultEvent != null) { _instance.OnProgressionIncrementLeaderboardVersionResultEvent((ProgressionModels.IncrementLeaderboardVersionResponse)e.Result); return; } } + if (type == typeof(ProgressionModels.IncrementStatisticVersionResponse)) { if (_instance.OnProgressionIncrementStatisticVersionResultEvent != null) { _instance.OnProgressionIncrementStatisticVersionResultEvent((ProgressionModels.IncrementStatisticVersionResponse)e.Result); return; } } + if (type == typeof(ProgressionModels.ListLeaderboardDefinitionsResponse)) { if (_instance.OnProgressionListLeaderboardDefinitionsResultEvent != null) { _instance.OnProgressionListLeaderboardDefinitionsResultEvent((ProgressionModels.ListLeaderboardDefinitionsResponse)e.Result); return; } } + if (type == typeof(ProgressionModels.ListStatisticDefinitionsResponse)) { if (_instance.OnProgressionListStatisticDefinitionsResultEvent != null) { _instance.OnProgressionListStatisticDefinitionsResultEvent((ProgressionModels.ListStatisticDefinitionsResponse)e.Result); return; } } + if (type == typeof(ProgressionModels.EmptyResponse)) { if (_instance.OnProgressionUnlinkLeaderboardFromStatisticResultEvent != null) { _instance.OnProgressionUnlinkLeaderboardFromStatisticResultEvent((ProgressionModels.EmptyResponse)e.Result); return; } } + if (type == typeof(ProgressionModels.EmptyResponse)) { if (_instance.OnProgressionUpdateLeaderboardEntriesResultEvent != null) { _instance.OnProgressionUpdateLeaderboardEntriesResultEvent((ProgressionModels.EmptyResponse)e.Result); return; } } + if (type == typeof(ProgressionModels.UpdateStatisticsResponse)) { if (_instance.OnProgressionUpdateStatisticsResultEvent != null) { _instance.OnProgressionUpdateStatisticsResultEvent((ProgressionModels.UpdateStatisticsResponse)e.Result); return; } } +#endif +#if !DISABLE_PLAYFABENTITY_API + + if (type == typeof(LocalizationModels.GetLanguageListResponse)) { if (_instance.OnLocalizationGetLanguageListResultEvent != null) { _instance.OnLocalizationGetLanguageListResultEvent((LocalizationModels.GetLanguageListResponse)e.Result); return; } } +#endif +#if !DISABLE_PLAYFABENTITY_API + + if (type == typeof(MultiplayerModels.CancelAllMatchmakingTicketsForPlayerResult)) { if (_instance.OnMultiplayerCancelAllMatchmakingTicketsForPlayerResultEvent != null) { _instance.OnMultiplayerCancelAllMatchmakingTicketsForPlayerResultEvent((MultiplayerModels.CancelAllMatchmakingTicketsForPlayerResult)e.Result); return; } } + if (type == typeof(MultiplayerModels.CancelAllServerBackfillTicketsForPlayerResult)) { if (_instance.OnMultiplayerCancelAllServerBackfillTicketsForPlayerResultEvent != null) { _instance.OnMultiplayerCancelAllServerBackfillTicketsForPlayerResultEvent((MultiplayerModels.CancelAllServerBackfillTicketsForPlayerResult)e.Result); return; } } + if (type == typeof(MultiplayerModels.CancelMatchmakingTicketResult)) { if (_instance.OnMultiplayerCancelMatchmakingTicketResultEvent != null) { _instance.OnMultiplayerCancelMatchmakingTicketResultEvent((MultiplayerModels.CancelMatchmakingTicketResult)e.Result); return; } } + if (type == typeof(MultiplayerModels.CancelServerBackfillTicketResult)) { if (_instance.OnMultiplayerCancelServerBackfillTicketResultEvent != null) { _instance.OnMultiplayerCancelServerBackfillTicketResultEvent((MultiplayerModels.CancelServerBackfillTicketResult)e.Result); return; } } + if (type == typeof(MultiplayerModels.BuildAliasDetailsResponse)) { if (_instance.OnMultiplayerCreateBuildAliasResultEvent != null) { _instance.OnMultiplayerCreateBuildAliasResultEvent((MultiplayerModels.BuildAliasDetailsResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.CreateBuildWithCustomContainerResponse)) { if (_instance.OnMultiplayerCreateBuildWithCustomContainerResultEvent != null) { _instance.OnMultiplayerCreateBuildWithCustomContainerResultEvent((MultiplayerModels.CreateBuildWithCustomContainerResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.CreateBuildWithManagedContainerResponse)) { if (_instance.OnMultiplayerCreateBuildWithManagedContainerResultEvent != null) { _instance.OnMultiplayerCreateBuildWithManagedContainerResultEvent((MultiplayerModels.CreateBuildWithManagedContainerResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.CreateBuildWithProcessBasedServerResponse)) { if (_instance.OnMultiplayerCreateBuildWithProcessBasedServerResultEvent != null) { _instance.OnMultiplayerCreateBuildWithProcessBasedServerResultEvent((MultiplayerModels.CreateBuildWithProcessBasedServerResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.CreateLobbyResult)) { if (_instance.OnMultiplayerCreateLobbyResultEvent != null) { _instance.OnMultiplayerCreateLobbyResultEvent((MultiplayerModels.CreateLobbyResult)e.Result); return; } } + if (type == typeof(MultiplayerModels.CreateMatchmakingTicketResult)) { if (_instance.OnMultiplayerCreateMatchmakingTicketResultEvent != null) { _instance.OnMultiplayerCreateMatchmakingTicketResultEvent((MultiplayerModels.CreateMatchmakingTicketResult)e.Result); return; } } + if (type == typeof(MultiplayerModels.CreateRemoteUserResponse)) { if (_instance.OnMultiplayerCreateRemoteUserResultEvent != null) { _instance.OnMultiplayerCreateRemoteUserResultEvent((MultiplayerModels.CreateRemoteUserResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.CreateServerBackfillTicketResult)) { if (_instance.OnMultiplayerCreateServerBackfillTicketResultEvent != null) { _instance.OnMultiplayerCreateServerBackfillTicketResultEvent((MultiplayerModels.CreateServerBackfillTicketResult)e.Result); return; } } + if (type == typeof(MultiplayerModels.CreateMatchmakingTicketResult)) { if (_instance.OnMultiplayerCreateServerMatchmakingTicketResultEvent != null) { _instance.OnMultiplayerCreateServerMatchmakingTicketResultEvent((MultiplayerModels.CreateMatchmakingTicketResult)e.Result); return; } } + if (type == typeof(MultiplayerModels.CreateTitleMultiplayerServersQuotaChangeResponse)) { if (_instance.OnMultiplayerCreateTitleMultiplayerServersQuotaChangeResultEvent != null) { _instance.OnMultiplayerCreateTitleMultiplayerServersQuotaChangeResultEvent((MultiplayerModels.CreateTitleMultiplayerServersQuotaChangeResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.EmptyResponse)) { if (_instance.OnMultiplayerDeleteAssetResultEvent != null) { _instance.OnMultiplayerDeleteAssetResultEvent((MultiplayerModels.EmptyResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.EmptyResponse)) { if (_instance.OnMultiplayerDeleteBuildResultEvent != null) { _instance.OnMultiplayerDeleteBuildResultEvent((MultiplayerModels.EmptyResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.EmptyResponse)) { if (_instance.OnMultiplayerDeleteBuildAliasResultEvent != null) { _instance.OnMultiplayerDeleteBuildAliasResultEvent((MultiplayerModels.EmptyResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.EmptyResponse)) { if (_instance.OnMultiplayerDeleteBuildRegionResultEvent != null) { _instance.OnMultiplayerDeleteBuildRegionResultEvent((MultiplayerModels.EmptyResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.EmptyResponse)) { if (_instance.OnMultiplayerDeleteCertificateResultEvent != null) { _instance.OnMultiplayerDeleteCertificateResultEvent((MultiplayerModels.EmptyResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.EmptyResponse)) { if (_instance.OnMultiplayerDeleteContainerImageRepositoryResultEvent != null) { _instance.OnMultiplayerDeleteContainerImageRepositoryResultEvent((MultiplayerModels.EmptyResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.LobbyEmptyResult)) { if (_instance.OnMultiplayerDeleteLobbyResultEvent != null) { _instance.OnMultiplayerDeleteLobbyResultEvent((MultiplayerModels.LobbyEmptyResult)e.Result); return; } } + if (type == typeof(MultiplayerModels.EmptyResponse)) { if (_instance.OnMultiplayerDeleteRemoteUserResultEvent != null) { _instance.OnMultiplayerDeleteRemoteUserResultEvent((MultiplayerModels.EmptyResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.EmptyResponse)) { if (_instance.OnMultiplayerDeleteSecretResultEvent != null) { _instance.OnMultiplayerDeleteSecretResultEvent((MultiplayerModels.EmptyResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.EnableMultiplayerServersForTitleResponse)) { if (_instance.OnMultiplayerEnableMultiplayerServersForTitleResultEvent != null) { _instance.OnMultiplayerEnableMultiplayerServersForTitleResultEvent((MultiplayerModels.EnableMultiplayerServersForTitleResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.FindFriendLobbiesResult)) { if (_instance.OnMultiplayerFindFriendLobbiesResultEvent != null) { _instance.OnMultiplayerFindFriendLobbiesResultEvent((MultiplayerModels.FindFriendLobbiesResult)e.Result); return; } } + if (type == typeof(MultiplayerModels.FindLobbiesResult)) { if (_instance.OnMultiplayerFindLobbiesResultEvent != null) { _instance.OnMultiplayerFindLobbiesResultEvent((MultiplayerModels.FindLobbiesResult)e.Result); return; } } + if (type == typeof(MultiplayerModels.GetAssetDownloadUrlResponse)) { if (_instance.OnMultiplayerGetAssetDownloadUrlResultEvent != null) { _instance.OnMultiplayerGetAssetDownloadUrlResultEvent((MultiplayerModels.GetAssetDownloadUrlResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.GetAssetUploadUrlResponse)) { if (_instance.OnMultiplayerGetAssetUploadUrlResultEvent != null) { _instance.OnMultiplayerGetAssetUploadUrlResultEvent((MultiplayerModels.GetAssetUploadUrlResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.GetBuildResponse)) { if (_instance.OnMultiplayerGetBuildResultEvent != null) { _instance.OnMultiplayerGetBuildResultEvent((MultiplayerModels.GetBuildResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.BuildAliasDetailsResponse)) { if (_instance.OnMultiplayerGetBuildAliasResultEvent != null) { _instance.OnMultiplayerGetBuildAliasResultEvent((MultiplayerModels.BuildAliasDetailsResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.GetContainerRegistryCredentialsResponse)) { if (_instance.OnMultiplayerGetContainerRegistryCredentialsResultEvent != null) { _instance.OnMultiplayerGetContainerRegistryCredentialsResultEvent((MultiplayerModels.GetContainerRegistryCredentialsResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.GetLobbyResult)) { if (_instance.OnMultiplayerGetLobbyResultEvent != null) { _instance.OnMultiplayerGetLobbyResultEvent((MultiplayerModels.GetLobbyResult)e.Result); return; } } + if (type == typeof(MultiplayerModels.GetMatchResult)) { if (_instance.OnMultiplayerGetMatchResultEvent != null) { _instance.OnMultiplayerGetMatchResultEvent((MultiplayerModels.GetMatchResult)e.Result); return; } } + if (type == typeof(MultiplayerModels.GetMatchmakingQueueResult)) { if (_instance.OnMultiplayerGetMatchmakingQueueResultEvent != null) { _instance.OnMultiplayerGetMatchmakingQueueResultEvent((MultiplayerModels.GetMatchmakingQueueResult)e.Result); return; } } + if (type == typeof(MultiplayerModels.GetMatchmakingTicketResult)) { if (_instance.OnMultiplayerGetMatchmakingTicketResultEvent != null) { _instance.OnMultiplayerGetMatchmakingTicketResultEvent((MultiplayerModels.GetMatchmakingTicketResult)e.Result); return; } } + if (type == typeof(MultiplayerModels.GetMultiplayerServerDetailsResponse)) { if (_instance.OnMultiplayerGetMultiplayerServerDetailsResultEvent != null) { _instance.OnMultiplayerGetMultiplayerServerDetailsResultEvent((MultiplayerModels.GetMultiplayerServerDetailsResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.GetMultiplayerServerLogsResponse)) { if (_instance.OnMultiplayerGetMultiplayerServerLogsResultEvent != null) { _instance.OnMultiplayerGetMultiplayerServerLogsResultEvent((MultiplayerModels.GetMultiplayerServerLogsResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.GetMultiplayerServerLogsResponse)) { if (_instance.OnMultiplayerGetMultiplayerSessionLogsBySessionIdResultEvent != null) { _instance.OnMultiplayerGetMultiplayerSessionLogsBySessionIdResultEvent((MultiplayerModels.GetMultiplayerServerLogsResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.GetQueueStatisticsResult)) { if (_instance.OnMultiplayerGetQueueStatisticsResultEvent != null) { _instance.OnMultiplayerGetQueueStatisticsResultEvent((MultiplayerModels.GetQueueStatisticsResult)e.Result); return; } } + if (type == typeof(MultiplayerModels.GetRemoteLoginEndpointResponse)) { if (_instance.OnMultiplayerGetRemoteLoginEndpointResultEvent != null) { _instance.OnMultiplayerGetRemoteLoginEndpointResultEvent((MultiplayerModels.GetRemoteLoginEndpointResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.GetServerBackfillTicketResult)) { if (_instance.OnMultiplayerGetServerBackfillTicketResultEvent != null) { _instance.OnMultiplayerGetServerBackfillTicketResultEvent((MultiplayerModels.GetServerBackfillTicketResult)e.Result); return; } } + if (type == typeof(MultiplayerModels.GetTitleEnabledForMultiplayerServersStatusResponse)) { if (_instance.OnMultiplayerGetTitleEnabledForMultiplayerServersStatusResultEvent != null) { _instance.OnMultiplayerGetTitleEnabledForMultiplayerServersStatusResultEvent((MultiplayerModels.GetTitleEnabledForMultiplayerServersStatusResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.GetTitleMultiplayerServersQuotaChangeResponse)) { if (_instance.OnMultiplayerGetTitleMultiplayerServersQuotaChangeResultEvent != null) { _instance.OnMultiplayerGetTitleMultiplayerServersQuotaChangeResultEvent((MultiplayerModels.GetTitleMultiplayerServersQuotaChangeResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.GetTitleMultiplayerServersQuotasResponse)) { if (_instance.OnMultiplayerGetTitleMultiplayerServersQuotasResultEvent != null) { _instance.OnMultiplayerGetTitleMultiplayerServersQuotasResultEvent((MultiplayerModels.GetTitleMultiplayerServersQuotasResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.LobbyEmptyResult)) { if (_instance.OnMultiplayerInviteToLobbyResultEvent != null) { _instance.OnMultiplayerInviteToLobbyResultEvent((MultiplayerModels.LobbyEmptyResult)e.Result); return; } } + if (type == typeof(MultiplayerModels.JoinLobbyResult)) { if (_instance.OnMultiplayerJoinArrangedLobbyResultEvent != null) { _instance.OnMultiplayerJoinArrangedLobbyResultEvent((MultiplayerModels.JoinLobbyResult)e.Result); return; } } + if (type == typeof(MultiplayerModels.JoinLobbyResult)) { if (_instance.OnMultiplayerJoinLobbyResultEvent != null) { _instance.OnMultiplayerJoinLobbyResultEvent((MultiplayerModels.JoinLobbyResult)e.Result); return; } } + if (type == typeof(MultiplayerModels.JoinLobbyAsServerResult)) { if (_instance.OnMultiplayerJoinLobbyAsServerResultEvent != null) { _instance.OnMultiplayerJoinLobbyAsServerResultEvent((MultiplayerModels.JoinLobbyAsServerResult)e.Result); return; } } + if (type == typeof(MultiplayerModels.JoinMatchmakingTicketResult)) { if (_instance.OnMultiplayerJoinMatchmakingTicketResultEvent != null) { _instance.OnMultiplayerJoinMatchmakingTicketResultEvent((MultiplayerModels.JoinMatchmakingTicketResult)e.Result); return; } } + if (type == typeof(MultiplayerModels.LobbyEmptyResult)) { if (_instance.OnMultiplayerLeaveLobbyResultEvent != null) { _instance.OnMultiplayerLeaveLobbyResultEvent((MultiplayerModels.LobbyEmptyResult)e.Result); return; } } + if (type == typeof(MultiplayerModels.LobbyEmptyResult)) { if (_instance.OnMultiplayerLeaveLobbyAsServerResultEvent != null) { _instance.OnMultiplayerLeaveLobbyAsServerResultEvent((MultiplayerModels.LobbyEmptyResult)e.Result); return; } } + if (type == typeof(MultiplayerModels.ListMultiplayerServersResponse)) { if (_instance.OnMultiplayerListArchivedMultiplayerServersResultEvent != null) { _instance.OnMultiplayerListArchivedMultiplayerServersResultEvent((MultiplayerModels.ListMultiplayerServersResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.ListAssetSummariesResponse)) { if (_instance.OnMultiplayerListAssetSummariesResultEvent != null) { _instance.OnMultiplayerListAssetSummariesResultEvent((MultiplayerModels.ListAssetSummariesResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.ListBuildAliasesResponse)) { if (_instance.OnMultiplayerListBuildAliasesResultEvent != null) { _instance.OnMultiplayerListBuildAliasesResultEvent((MultiplayerModels.ListBuildAliasesResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.ListBuildSummariesResponse)) { if (_instance.OnMultiplayerListBuildSummariesV2ResultEvent != null) { _instance.OnMultiplayerListBuildSummariesV2ResultEvent((MultiplayerModels.ListBuildSummariesResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.ListCertificateSummariesResponse)) { if (_instance.OnMultiplayerListCertificateSummariesResultEvent != null) { _instance.OnMultiplayerListCertificateSummariesResultEvent((MultiplayerModels.ListCertificateSummariesResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.ListContainerImagesResponse)) { if (_instance.OnMultiplayerListContainerImagesResultEvent != null) { _instance.OnMultiplayerListContainerImagesResultEvent((MultiplayerModels.ListContainerImagesResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.ListContainerImageTagsResponse)) { if (_instance.OnMultiplayerListContainerImageTagsResultEvent != null) { _instance.OnMultiplayerListContainerImageTagsResultEvent((MultiplayerModels.ListContainerImageTagsResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.ListMatchmakingQueuesResult)) { if (_instance.OnMultiplayerListMatchmakingQueuesResultEvent != null) { _instance.OnMultiplayerListMatchmakingQueuesResultEvent((MultiplayerModels.ListMatchmakingQueuesResult)e.Result); return; } } + if (type == typeof(MultiplayerModels.ListMatchmakingTicketsForPlayerResult)) { if (_instance.OnMultiplayerListMatchmakingTicketsForPlayerResultEvent != null) { _instance.OnMultiplayerListMatchmakingTicketsForPlayerResultEvent((MultiplayerModels.ListMatchmakingTicketsForPlayerResult)e.Result); return; } } + if (type == typeof(MultiplayerModels.ListMultiplayerServersResponse)) { if (_instance.OnMultiplayerListMultiplayerServersResultEvent != null) { _instance.OnMultiplayerListMultiplayerServersResultEvent((MultiplayerModels.ListMultiplayerServersResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.ListPartyQosServersResponse)) { if (_instance.OnMultiplayerListPartyQosServersResultEvent != null) { _instance.OnMultiplayerListPartyQosServersResultEvent((MultiplayerModels.ListPartyQosServersResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.ListQosServersForTitleResponse)) { if (_instance.OnMultiplayerListQosServersForTitleResultEvent != null) { _instance.OnMultiplayerListQosServersForTitleResultEvent((MultiplayerModels.ListQosServersForTitleResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.ListSecretSummariesResponse)) { if (_instance.OnMultiplayerListSecretSummariesResultEvent != null) { _instance.OnMultiplayerListSecretSummariesResultEvent((MultiplayerModels.ListSecretSummariesResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.ListServerBackfillTicketsForPlayerResult)) { if (_instance.OnMultiplayerListServerBackfillTicketsForPlayerResultEvent != null) { _instance.OnMultiplayerListServerBackfillTicketsForPlayerResultEvent((MultiplayerModels.ListServerBackfillTicketsForPlayerResult)e.Result); return; } } + if (type == typeof(MultiplayerModels.ListTitleMultiplayerServersQuotaChangesResponse)) { if (_instance.OnMultiplayerListTitleMultiplayerServersQuotaChangesResultEvent != null) { _instance.OnMultiplayerListTitleMultiplayerServersQuotaChangesResultEvent((MultiplayerModels.ListTitleMultiplayerServersQuotaChangesResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.ListVirtualMachineSummariesResponse)) { if (_instance.OnMultiplayerListVirtualMachineSummariesResultEvent != null) { _instance.OnMultiplayerListVirtualMachineSummariesResultEvent((MultiplayerModels.ListVirtualMachineSummariesResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.RemoveMatchmakingQueueResult)) { if (_instance.OnMultiplayerRemoveMatchmakingQueueResultEvent != null) { _instance.OnMultiplayerRemoveMatchmakingQueueResultEvent((MultiplayerModels.RemoveMatchmakingQueueResult)e.Result); return; } } + if (type == typeof(MultiplayerModels.LobbyEmptyResult)) { if (_instance.OnMultiplayerRemoveMemberResultEvent != null) { _instance.OnMultiplayerRemoveMemberResultEvent((MultiplayerModels.LobbyEmptyResult)e.Result); return; } } + if (type == typeof(MultiplayerModels.RequestMultiplayerServerResponse)) { if (_instance.OnMultiplayerRequestMultiplayerServerResultEvent != null) { _instance.OnMultiplayerRequestMultiplayerServerResultEvent((MultiplayerModels.RequestMultiplayerServerResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.RequestPartyServiceResponse)) { if (_instance.OnMultiplayerRequestPartyServiceResultEvent != null) { _instance.OnMultiplayerRequestPartyServiceResultEvent((MultiplayerModels.RequestPartyServiceResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.RolloverContainerRegistryCredentialsResponse)) { if (_instance.OnMultiplayerRolloverContainerRegistryCredentialsResultEvent != null) { _instance.OnMultiplayerRolloverContainerRegistryCredentialsResultEvent((MultiplayerModels.RolloverContainerRegistryCredentialsResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.SetMatchmakingQueueResult)) { if (_instance.OnMultiplayerSetMatchmakingQueueResultEvent != null) { _instance.OnMultiplayerSetMatchmakingQueueResultEvent((MultiplayerModels.SetMatchmakingQueueResult)e.Result); return; } } + if (type == typeof(MultiplayerModels.EmptyResponse)) { if (_instance.OnMultiplayerShutdownMultiplayerServerResultEvent != null) { _instance.OnMultiplayerShutdownMultiplayerServerResultEvent((MultiplayerModels.EmptyResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.SubscribeToLobbyResourceResult)) { if (_instance.OnMultiplayerSubscribeToLobbyResourceResultEvent != null) { _instance.OnMultiplayerSubscribeToLobbyResourceResultEvent((MultiplayerModels.SubscribeToLobbyResourceResult)e.Result); return; } } + if (type == typeof(MultiplayerModels.SubscribeToMatchResourceResult)) { if (_instance.OnMultiplayerSubscribeToMatchmakingResourceResultEvent != null) { _instance.OnMultiplayerSubscribeToMatchmakingResourceResultEvent((MultiplayerModels.SubscribeToMatchResourceResult)e.Result); return; } } + if (type == typeof(MultiplayerModels.LobbyEmptyResult)) { if (_instance.OnMultiplayerUnsubscribeFromLobbyResourceResultEvent != null) { _instance.OnMultiplayerUnsubscribeFromLobbyResourceResultEvent((MultiplayerModels.LobbyEmptyResult)e.Result); return; } } + if (type == typeof(MultiplayerModels.UnsubscribeFromMatchResourceResult)) { if (_instance.OnMultiplayerUnsubscribeFromMatchmakingResourceResultEvent != null) { _instance.OnMultiplayerUnsubscribeFromMatchmakingResourceResultEvent((MultiplayerModels.UnsubscribeFromMatchResourceResult)e.Result); return; } } + if (type == typeof(MultiplayerModels.EmptyResponse)) { if (_instance.OnMultiplayerUntagContainerImageResultEvent != null) { _instance.OnMultiplayerUntagContainerImageResultEvent((MultiplayerModels.EmptyResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.BuildAliasDetailsResponse)) { if (_instance.OnMultiplayerUpdateBuildAliasResultEvent != null) { _instance.OnMultiplayerUpdateBuildAliasResultEvent((MultiplayerModels.BuildAliasDetailsResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.EmptyResponse)) { if (_instance.OnMultiplayerUpdateBuildNameResultEvent != null) { _instance.OnMultiplayerUpdateBuildNameResultEvent((MultiplayerModels.EmptyResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.EmptyResponse)) { if (_instance.OnMultiplayerUpdateBuildRegionResultEvent != null) { _instance.OnMultiplayerUpdateBuildRegionResultEvent((MultiplayerModels.EmptyResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.EmptyResponse)) { if (_instance.OnMultiplayerUpdateBuildRegionsResultEvent != null) { _instance.OnMultiplayerUpdateBuildRegionsResultEvent((MultiplayerModels.EmptyResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.LobbyEmptyResult)) { if (_instance.OnMultiplayerUpdateLobbyResultEvent != null) { _instance.OnMultiplayerUpdateLobbyResultEvent((MultiplayerModels.LobbyEmptyResult)e.Result); return; } } + if (type == typeof(MultiplayerModels.LobbyEmptyResult)) { if (_instance.OnMultiplayerUpdateLobbyAsServerResultEvent != null) { _instance.OnMultiplayerUpdateLobbyAsServerResultEvent((MultiplayerModels.LobbyEmptyResult)e.Result); return; } } + if (type == typeof(MultiplayerModels.EmptyResponse)) { if (_instance.OnMultiplayerUploadCertificateResultEvent != null) { _instance.OnMultiplayerUploadCertificateResultEvent((MultiplayerModels.EmptyResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.EmptyResponse)) { if (_instance.OnMultiplayerUploadSecretResultEvent != null) { _instance.OnMultiplayerUploadSecretResultEvent((MultiplayerModels.EmptyResponse)e.Result); return; } } +#endif +#if !DISABLE_PLAYFABENTITY_API + + if (type == typeof(ProfilesModels.GetGlobalPolicyResponse)) { if (_instance.OnProfilesGetGlobalPolicyResultEvent != null) { _instance.OnProfilesGetGlobalPolicyResultEvent((ProfilesModels.GetGlobalPolicyResponse)e.Result); return; } } + if (type == typeof(ProfilesModels.GetEntityProfileResponse)) { if (_instance.OnProfilesGetProfileResultEvent != null) { _instance.OnProfilesGetProfileResultEvent((ProfilesModels.GetEntityProfileResponse)e.Result); return; } } + if (type == typeof(ProfilesModels.GetEntityProfilesResponse)) { if (_instance.OnProfilesGetProfilesResultEvent != null) { _instance.OnProfilesGetProfilesResultEvent((ProfilesModels.GetEntityProfilesResponse)e.Result); return; } } + if (type == typeof(ProfilesModels.GetTitlePlayersFromMasterPlayerAccountIdsResponse)) { if (_instance.OnProfilesGetTitlePlayersFromMasterPlayerAccountIdsResultEvent != null) { _instance.OnProfilesGetTitlePlayersFromMasterPlayerAccountIdsResultEvent((ProfilesModels.GetTitlePlayersFromMasterPlayerAccountIdsResponse)e.Result); return; } } + if (type == typeof(ProfilesModels.GetTitlePlayersFromProviderIDsResponse)) { if (_instance.OnProfilesGetTitlePlayersFromXboxLiveIDsResultEvent != null) { _instance.OnProfilesGetTitlePlayersFromXboxLiveIDsResultEvent((ProfilesModels.GetTitlePlayersFromProviderIDsResponse)e.Result); return; } } + if (type == typeof(ProfilesModels.SetDisplayNameResponse)) { if (_instance.OnProfilesSetDisplayNameResultEvent != null) { _instance.OnProfilesSetDisplayNameResultEvent((ProfilesModels.SetDisplayNameResponse)e.Result); return; } } + if (type == typeof(ProfilesModels.SetGlobalPolicyResponse)) { if (_instance.OnProfilesSetGlobalPolicyResultEvent != null) { _instance.OnProfilesSetGlobalPolicyResultEvent((ProfilesModels.SetGlobalPolicyResponse)e.Result); return; } } + if (type == typeof(ProfilesModels.SetProfileLanguageResponse)) { if (_instance.OnProfilesSetProfileLanguageResultEvent != null) { _instance.OnProfilesSetProfileLanguageResultEvent((ProfilesModels.SetProfileLanguageResponse)e.Result); return; } } + if (type == typeof(ProfilesModels.SetEntityProfilePolicyResponse)) { if (_instance.OnProfilesSetProfilePolicyResultEvent != null) { _instance.OnProfilesSetProfilePolicyResultEvent((ProfilesModels.SetEntityProfilePolicyResponse)e.Result); return; } } +#endif +#if ENABLE_PLAYFABSERVER_API + +#endif +#if !DISABLE_PLAYFABENTITY_API + + if (type == typeof(AddonModels.CreateOrUpdateAppleResponse)) { if (_instance.OnAddonCreateOrUpdateAppleResultEvent != null) { _instance.OnAddonCreateOrUpdateAppleResultEvent((AddonModels.CreateOrUpdateAppleResponse)e.Result); return; } } + if (type == typeof(AddonModels.CreateOrUpdateFacebookResponse)) { if (_instance.OnAddonCreateOrUpdateFacebookResultEvent != null) { _instance.OnAddonCreateOrUpdateFacebookResultEvent((AddonModels.CreateOrUpdateFacebookResponse)e.Result); return; } } + if (type == typeof(AddonModels.CreateOrUpdateFacebookInstantGamesResponse)) { if (_instance.OnAddonCreateOrUpdateFacebookInstantGamesResultEvent != null) { _instance.OnAddonCreateOrUpdateFacebookInstantGamesResultEvent((AddonModels.CreateOrUpdateFacebookInstantGamesResponse)e.Result); return; } } + if (type == typeof(AddonModels.CreateOrUpdateGoogleResponse)) { if (_instance.OnAddonCreateOrUpdateGoogleResultEvent != null) { _instance.OnAddonCreateOrUpdateGoogleResultEvent((AddonModels.CreateOrUpdateGoogleResponse)e.Result); return; } } + if (type == typeof(AddonModels.CreateOrUpdateKongregateResponse)) { if (_instance.OnAddonCreateOrUpdateKongregateResultEvent != null) { _instance.OnAddonCreateOrUpdateKongregateResultEvent((AddonModels.CreateOrUpdateKongregateResponse)e.Result); return; } } + if (type == typeof(AddonModels.CreateOrUpdateNintendoResponse)) { if (_instance.OnAddonCreateOrUpdateNintendoResultEvent != null) { _instance.OnAddonCreateOrUpdateNintendoResultEvent((AddonModels.CreateOrUpdateNintendoResponse)e.Result); return; } } + if (type == typeof(AddonModels.CreateOrUpdatePSNResponse)) { if (_instance.OnAddonCreateOrUpdatePSNResultEvent != null) { _instance.OnAddonCreateOrUpdatePSNResultEvent((AddonModels.CreateOrUpdatePSNResponse)e.Result); return; } } + if (type == typeof(AddonModels.CreateOrUpdateSteamResponse)) { if (_instance.OnAddonCreateOrUpdateSteamResultEvent != null) { _instance.OnAddonCreateOrUpdateSteamResultEvent((AddonModels.CreateOrUpdateSteamResponse)e.Result); return; } } + if (type == typeof(AddonModels.CreateOrUpdateTwitchResponse)) { if (_instance.OnAddonCreateOrUpdateTwitchResultEvent != null) { _instance.OnAddonCreateOrUpdateTwitchResultEvent((AddonModels.CreateOrUpdateTwitchResponse)e.Result); return; } } + if (type == typeof(AddonModels.DeleteAppleResponse)) { if (_instance.OnAddonDeleteAppleResultEvent != null) { _instance.OnAddonDeleteAppleResultEvent((AddonModels.DeleteAppleResponse)e.Result); return; } } + if (type == typeof(AddonModels.DeleteFacebookResponse)) { if (_instance.OnAddonDeleteFacebookResultEvent != null) { _instance.OnAddonDeleteFacebookResultEvent((AddonModels.DeleteFacebookResponse)e.Result); return; } } + if (type == typeof(AddonModels.DeleteFacebookInstantGamesResponse)) { if (_instance.OnAddonDeleteFacebookInstantGamesResultEvent != null) { _instance.OnAddonDeleteFacebookInstantGamesResultEvent((AddonModels.DeleteFacebookInstantGamesResponse)e.Result); return; } } + if (type == typeof(AddonModels.DeleteGoogleResponse)) { if (_instance.OnAddonDeleteGoogleResultEvent != null) { _instance.OnAddonDeleteGoogleResultEvent((AddonModels.DeleteGoogleResponse)e.Result); return; } } + if (type == typeof(AddonModels.DeleteKongregateResponse)) { if (_instance.OnAddonDeleteKongregateResultEvent != null) { _instance.OnAddonDeleteKongregateResultEvent((AddonModels.DeleteKongregateResponse)e.Result); return; } } + if (type == typeof(AddonModels.DeleteNintendoResponse)) { if (_instance.OnAddonDeleteNintendoResultEvent != null) { _instance.OnAddonDeleteNintendoResultEvent((AddonModels.DeleteNintendoResponse)e.Result); return; } } + if (type == typeof(AddonModels.DeletePSNResponse)) { if (_instance.OnAddonDeletePSNResultEvent != null) { _instance.OnAddonDeletePSNResultEvent((AddonModels.DeletePSNResponse)e.Result); return; } } + if (type == typeof(AddonModels.DeleteSteamResponse)) { if (_instance.OnAddonDeleteSteamResultEvent != null) { _instance.OnAddonDeleteSteamResultEvent((AddonModels.DeleteSteamResponse)e.Result); return; } } + if (type == typeof(AddonModels.DeleteTwitchResponse)) { if (_instance.OnAddonDeleteTwitchResultEvent != null) { _instance.OnAddonDeleteTwitchResultEvent((AddonModels.DeleteTwitchResponse)e.Result); return; } } + if (type == typeof(AddonModels.GetAppleResponse)) { if (_instance.OnAddonGetAppleResultEvent != null) { _instance.OnAddonGetAppleResultEvent((AddonModels.GetAppleResponse)e.Result); return; } } + if (type == typeof(AddonModels.GetFacebookResponse)) { if (_instance.OnAddonGetFacebookResultEvent != null) { _instance.OnAddonGetFacebookResultEvent((AddonModels.GetFacebookResponse)e.Result); return; } } + if (type == typeof(AddonModels.GetFacebookInstantGamesResponse)) { if (_instance.OnAddonGetFacebookInstantGamesResultEvent != null) { _instance.OnAddonGetFacebookInstantGamesResultEvent((AddonModels.GetFacebookInstantGamesResponse)e.Result); return; } } + if (type == typeof(AddonModels.GetGoogleResponse)) { if (_instance.OnAddonGetGoogleResultEvent != null) { _instance.OnAddonGetGoogleResultEvent((AddonModels.GetGoogleResponse)e.Result); return; } } + if (type == typeof(AddonModels.GetKongregateResponse)) { if (_instance.OnAddonGetKongregateResultEvent != null) { _instance.OnAddonGetKongregateResultEvent((AddonModels.GetKongregateResponse)e.Result); return; } } + if (type == typeof(AddonModels.GetNintendoResponse)) { if (_instance.OnAddonGetNintendoResultEvent != null) { _instance.OnAddonGetNintendoResultEvent((AddonModels.GetNintendoResponse)e.Result); return; } } + if (type == typeof(AddonModels.GetPSNResponse)) { if (_instance.OnAddonGetPSNResultEvent != null) { _instance.OnAddonGetPSNResultEvent((AddonModels.GetPSNResponse)e.Result); return; } } + if (type == typeof(AddonModels.GetSteamResponse)) { if (_instance.OnAddonGetSteamResultEvent != null) { _instance.OnAddonGetSteamResultEvent((AddonModels.GetSteamResponse)e.Result); return; } } + if (type == typeof(AddonModels.GetTwitchResponse)) { if (_instance.OnAddonGetTwitchResultEvent != null) { _instance.OnAddonGetTwitchResultEvent((AddonModels.GetTwitchResponse)e.Result); return; } } +#endif + + } + } + } +} diff --git a/Assets/PlayFabSDK/Shared/Public/PlayFabEvents.cs.meta b/Assets/PlayFabSDK/Shared/Public/PlayFabEvents.cs.meta new file mode 100644 index 00000000..1eedf00a --- /dev/null +++ b/Assets/PlayFabSDK/Shared/Public/PlayFabEvents.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 059603d7e53649849b7f08d3b99af79c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Shared/Public/PlayFabLogger.cs b/Assets/PlayFabSDK/Shared/Public/PlayFabLogger.cs new file mode 100644 index 00000000..d0d23f0e --- /dev/null +++ b/Assets/PlayFabSDK/Shared/Public/PlayFabLogger.cs @@ -0,0 +1,270 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Net; +using System.Text; +using System.Threading; +using PlayFab.Internal; +using UnityEngine; + +namespace PlayFab.Public +{ +#if !UNITY_WSA && !UNITY_WP8 && !NETFX_CORE + public interface IPlayFabLogger + { + IPAddress ip { get; set; } + int port { get; set; } + string url { get; set; } + + // Unity MonoBehaviour callbacks + void OnEnable(); + void OnDisable(); + void OnDestroy(); + } + + /// + /// This is some unity-log capturing logic, and threading tools that allow logging to be caught and processed on another thread + /// + public abstract class PlayFabLoggerBase : IPlayFabLogger + { + private static readonly StringBuilder Sb = new StringBuilder(); + private readonly Queue LogMessageQueue = new Queue(); + private const int LOG_CACHE_INTERVAL_MS = 10000; + + private Thread _writeLogThread; + private readonly object _threadLock = new object(); + private static readonly TimeSpan _threadKillTimeout = TimeSpan.FromSeconds(60); + private DateTime _threadKillTime = DateTime.UtcNow + _threadKillTimeout; // Kill the thread after 1 minute of inactivity + private bool _isApplicationPlaying = true; + private int _pendingLogsCount; + + public IPAddress ip { get; set; } + public int port { get; set; } + public string url { get; set; } + + protected PlayFabLoggerBase() + { + var gatherer = new PlayFabDataGatherer(); + var message = gatherer.GenerateReport(); + lock (LogMessageQueue) + { + LogMessageQueue.Enqueue(message); + } + } + + public virtual void OnEnable() + { + PlayFabHttp.instance.StartCoroutine(RegisterLogger()); // Coroutine helper to set up log-callbacks + } + + private IEnumerator RegisterLogger() + { + yield return new WaitForEndOfFrame(); // Effectively just a short wait before activating this registration + if (!string.IsNullOrEmpty(PlayFabSettings.LoggerHost)) + { +#if UNITY_5 || UNITY_5_3_OR_NEWER + Application.logMessageReceivedThreaded += HandleUnityLog; +#else + Application.RegisterLogCallback(HandleUnityLog); +#endif + } + } + + public virtual void OnDisable() + { + if (!string.IsNullOrEmpty(PlayFabSettings.LoggerHost)) + { +#if UNITY_5 || UNITY_5_3_OR_NEWER + Application.logMessageReceivedThreaded -= HandleUnityLog; +#else + Application.RegisterLogCallback(null); +#endif + } + } + + public virtual void OnDestroy() + { + _isApplicationPlaying = false; + } + + /// + /// Logs are cached and written in bursts + /// BeginUploadLog is called at the begining of each burst + /// + protected abstract void BeginUploadLog(); + /// + /// Logs are cached and written in bursts + /// UploadLog is called for each cached log, between BeginUploadLog and EndUploadLog + /// + protected abstract void UploadLog(string message); + /// + /// Logs are cached and written in bursts + /// EndUploadLog is called at the end of each burst + /// + protected abstract void EndUploadLog(); + + /// + /// Handler to process Unity logs into our logging system + /// + /// + /// + /// + private void HandleUnityLog(string message, string stacktrace, LogType type) + { + if (!PlayFabSettings.EnableRealTimeLogging) + return; + + Sb.Length = 0; + if (type == LogType.Log || type == LogType.Warning) + { + Sb.Append(type).Append(": ").Append(message); + message = Sb.ToString(); + lock (LogMessageQueue) + { + LogMessageQueue.Enqueue(message); + } + } + else if (type == LogType.Error || type == LogType.Exception) + { + Sb.Append(type).Append(": ").Append(message).Append("\n").Append(stacktrace).Append(StackTraceUtility.ExtractStackTrace()); + message = Sb.ToString(); + lock (LogMessageQueue) + { + LogMessageQueue.Enqueue(message); + } + } + ActivateThreadWorker(); + } + + private void ActivateThreadWorker() + { + lock (_threadLock) + { + if (_writeLogThread != null) + { + return; + } + _writeLogThread = new Thread(WriteLogThreadWorker); + _writeLogThread.Start(); + } + } + + private void WriteLogThreadWorker() + { + try + { + bool active; + lock (_threadLock) + { + // Kill the thread after 1 minute of inactivity + _threadKillTime = DateTime.UtcNow + _threadKillTimeout; + } + + var localLogQueue = new Queue(); + do + { + lock (LogMessageQueue) + { + _pendingLogsCount = LogMessageQueue.Count; + while (LogMessageQueue.Count > 0) // Transfer the messages to the local queue + localLogQueue.Enqueue(LogMessageQueue.Dequeue()); + } + + BeginUploadLog(); + while (localLogQueue.Count > 0) // Transfer the messages to the local queue + UploadLog(localLogQueue.Dequeue()); + EndUploadLog(); + + #region Expire Thread. + // Check if we've been inactive + lock (_threadLock) + { + var now = DateTime.UtcNow; + if (_pendingLogsCount > 0 && _isApplicationPlaying) + { + // Still active, reset the _threadKillTime + _threadKillTime = now + _threadKillTimeout; + } + // Kill the thread after 1 minute of inactivity + active = now <= _threadKillTime; + if (!active) + { + _writeLogThread = null; + } + // This thread will be stopped, so null this now, inside lock (_threadLock) + } + #endregion + + Thread.Sleep(LOG_CACHE_INTERVAL_MS); + } while (active); + + } + catch (Exception e) + { + Debug.LogException(e); + _writeLogThread = null; + } + } + } +#else + public interface IPlayFabLogger + { + string ip { get; set; } + int port { get; set; } + string url { get; set; } + + // Unity MonoBehaviour callbacks + void OnEnable(); + void OnDisable(); + void OnDestroy(); + } + + /// + /// This is just a placeholder. WP8 doesn't support direct threading, but instead makes you use the await command. + /// + public abstract class PlayFabLoggerBase : IPlayFabLogger + { + public string ip { get; set; } + public int port { get; set; } + public string url { get; set; } + + // Unity MonoBehaviour callbacks + public void OnEnable() { } + public void OnDisable() { } + public void OnDestroy() { } + + protected abstract void BeginUploadLog(); + protected abstract void UploadLog(string message); + protected abstract void EndUploadLog(); + } +#endif + + /// + /// This translates the logs up to the PlayFab service via a PlayFab restful API + /// TODO: PLAYFAB - attach these to the PlayFab API + /// + public class PlayFabLogger : PlayFabLoggerBase + { + /// + /// Logs are cached and written in bursts + /// BeginUploadLog is called at the begining of each burst + /// + protected override void BeginUploadLog() + { + } + /// + /// Logs are cached and written in bursts + /// UploadLog is called for each cached log, between BeginUploadLog and EndUploadLog + /// + protected override void UploadLog(string message) + { + } + /// + /// Logs are cached and written in bursts + /// EndUploadLog is called at the end of each burst + /// + protected override void EndUploadLog() + { + } + } +} diff --git a/Assets/PlayFabSDK/Shared/Public/PlayFabLogger.cs.meta b/Assets/PlayFabSDK/Shared/Public/PlayFabLogger.cs.meta new file mode 100644 index 00000000..18ec9f00 --- /dev/null +++ b/Assets/PlayFabSDK/Shared/Public/PlayFabLogger.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 65702fe1cdebb8e4783afb157a614161 +timeCreated: 1465847308 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Shared/Public/PlayFabSettings.cs b/Assets/PlayFabSDK/Shared/Public/PlayFabSettings.cs new file mode 100644 index 00000000..61822a49 --- /dev/null +++ b/Assets/PlayFabSDK/Shared/Public/PlayFabSettings.cs @@ -0,0 +1,250 @@ +using PlayFab.Internal; +using System; +using System.Collections.Generic; +using System.Text; +using UnityEngine; + +namespace PlayFab +{ + public enum WebRequestType + { +#if !UNITY_2018_2_OR_NEWER // Unity has deprecated Www + UnityWww, // High compatability Unity api calls +#endif + UnityWebRequest, // Modern unity HTTP component + HttpWebRequest, // High performance multi-threaded api calls + CustomHttp //If this is used, you must set the Http to an IPlayFabHttp object. + } + + [Flags] + public enum PlayFabLogLevel + { + None = 0, + Debug = 1 << 0, + Info = 1 << 1, + Warning = 1 << 2, + Error = 1 << 3, + All = Debug | Info | Warning | Error, + } + + public static class PlayFabSettings + { + static PlayFabSettings() + { +#if UNITY_GAMECORE || UNITY_GAMECORE_XBOXONE || UNITY_GAMECORE_SCARLETT || MICROSOFT_GAME_CORE + PlatformString = "GDK"; +#else + switch (Application.platform) + { + case RuntimePlatform.WindowsEditor: + case RuntimePlatform.WindowsPlayer: + case RuntimePlatform.WindowsServer: + PlatformString = "Windows"; + break; + + case RuntimePlatform.IPhonePlayer: + PlatformString = "iOS"; + break; + + default: + PlatformString = Application.platform.ToString(); + break; + } +#endif + } + + private static PlayFabSharedSettings _playFabShared = null; + private static PlayFabSharedSettings PlayFabSharedPrivate { get { if (_playFabShared == null) _playFabShared = GetSharedSettingsObjectPrivate(); return _playFabShared; } } + + /// + /// Global settings used by all static API classes, and as the default for all instance API classes + /// + public static readonly PlayFabApiSettings staticSettings = new PlayFabSettingsRedirect(() => { return PlayFabSharedPrivate; }); + /// + /// Global user for all static API classes + /// + public static readonly PlayFabAuthenticationContext staticPlayer = new PlayFabAuthenticationContext(); + + public const string SdkVersion = "2.203.241014"; + public const string BuildIdentifier = "adobuild_unitysdk_167"; + public const string VersionString = "UnitySDK-2.203.241014"; + public static string EngineVersion = UnityEngine.Application.unityVersion; + public static string PlatformString; + + public const string DefaultPlayFabApiUrl = "playfabapi.com"; + + private static PlayFabSharedSettings GetSharedSettingsObjectPrivate() + { + var settingsList = Resources.LoadAll("PlayFabSharedSettings"); + if (settingsList.Length != 1) + { + Debug.LogWarning("The number of PlayFabSharedSettings objects should be 1: " + settingsList.Length); + Debug.LogWarning("If you are upgrading your SDK, you can ignore this warning as PlayFabSharedSettings will be imported soon. If you are not upgrading your SDK and you see this message, you should re-download the latest PlayFab source code."); + } + return settingsList[0]; + } + + public static string DeviceUniqueIdentifier + { + get + { + var deviceId = ""; +#if UNITY_ANDROID && !UNITY_EDITOR + AndroidJavaClass up = new AndroidJavaClass ("com.unity3d.player.UnityPlayer"); + AndroidJavaObject currentActivity = up.GetStatic ("currentActivity"); + AndroidJavaObject contentResolver = currentActivity.Call ("getContentResolver"); + AndroidJavaClass secure = new AndroidJavaClass ("android.provider.Settings$Secure"); + deviceId = secure.CallStatic ("getString", contentResolver, "android_id"); +#else + deviceId = SystemInfo.deviceUniqueIdentifier; +#endif + return deviceId; + } + } + + /// + /// These are variables which can differ from one PlayFab API Instance to another + /// + #region staticSettings Redirects + // You must set this value for PlayFabSdk to work properly (Found in the Game Manager for your title, at the PlayFab Website) + public static string TitleId { get { return staticSettings.TitleId; } set { staticSettings.TitleId = value; } } + + /// The name of a customer vertical. This is only for customers running a private cluster. Generally you shouldn't touch this + internal static string VerticalName { get { return staticSettings.VerticalName; } set { staticSettings.VerticalName = value; } } +#if ENABLE_PLAYFABSERVER_API || ENABLE_PLAYFABADMIN_API || UNITY_EDITOR || ENABLE_PLAYFAB_SECRETKEY + public static string DeveloperSecretKey { get { return staticSettings.DeveloperSecretKey; } set { staticSettings.DeveloperSecretKey = value; } } +#endif + /// Set this to true to prevent hardware information from leaving the device + public static bool DisableDeviceInfo { get { return staticSettings.DisableDeviceInfo; } set { staticSettings.DisableDeviceInfo = value; } } + /// Set this to true to prevent focus change information from leaving the device + public static bool DisableFocusTimeCollection { get { return staticSettings.DisableFocusTimeCollection; } set { staticSettings.DisableFocusTimeCollection = value; } } + #endregion staticSettings Redirects + + /// + /// These are variables which are always singleton global + /// + #region PlayFabSharedSettings Redirects + [ObsoleteAttribute("LogLevel has been deprecated, please use UnityEngine.Debug.Log for your logging needs.")] + public static PlayFabLogLevel LogLevel { get { return PlayFabSharedPrivate.LogLevel; } set { PlayFabSharedPrivate.LogLevel = value; } } + public static WebRequestType RequestType { get { return PlayFabSharedPrivate.RequestType; } set { PlayFabSharedPrivate.RequestType = value; } } + public static int RequestTimeout { get { return PlayFabSharedPrivate.RequestTimeout; } set { PlayFabSharedPrivate.RequestTimeout = value; } } + public static bool RequestKeepAlive { get { return PlayFabSharedPrivate.RequestKeepAlive; } set { PlayFabSharedPrivate.RequestKeepAlive = value; } } + public static string LoggerHost { get { return PlayFabSharedPrivate.LoggerHost; } set { PlayFabSharedPrivate.LoggerHost = value; } } + public static int LoggerPort { get { return PlayFabSharedPrivate.LoggerPort; } set { PlayFabSharedPrivate.LoggerPort = value; } } + public static bool EnableRealTimeLogging { get { return PlayFabSharedPrivate.EnableRealTimeLogging; } set { PlayFabSharedPrivate.EnableRealTimeLogging = value; } } + public static int LogCapLimit { get { return PlayFabSharedPrivate.LogCapLimit; } set { PlayFabSharedPrivate.LogCapLimit = value; } } + #endregion PlayFabSharedSettings Redirects + + private static string _localApiServer; + public static string LocalApiServer + { + get + { +#if UNITY_2017_1_OR_NEWER + return _localApiServer ?? PlayFabUtil.GetLocalSettingsFileProperty("LocalApiServer"); +#else + return _localApiServer; +#endif + } + + set + { + _localApiServer = value; + } + } + + [ThreadStatic] + private static StringBuilder _cachedStringBuilder; + + private static StringBuilder AcquireStringBuilder() + { + if (_cachedStringBuilder == null) + { + _cachedStringBuilder = new StringBuilder(1000); + } + + _cachedStringBuilder.Clear(); + return _cachedStringBuilder; + } + + public static string GetFullUrl(string apiCall, Dictionary getParams, PlayFabApiSettings apiSettings = null) + { + StringBuilder sb = AcquireStringBuilder(); + + string productionEnvironmentUrl = null, verticalName = null, titleId = null; + + if (apiSettings != null) + { + + if (!string.IsNullOrEmpty(apiSettings.ProductionEnvironmentUrl)) + { + productionEnvironmentUrl = apiSettings.ProductionEnvironmentUrl; + } + if (!string.IsNullOrEmpty(apiSettings.VerticalName)) + { + verticalName = apiSettings.VerticalName; + } + if (!string.IsNullOrEmpty(apiSettings.TitleId)) + { + titleId = apiSettings.TitleId; + } + + } + + + + if (productionEnvironmentUrl == null) + { + productionEnvironmentUrl = !string.IsNullOrEmpty(PlayFabSharedPrivate.ProductionEnvironmentUrl) ? PlayFabSharedPrivate.ProductionEnvironmentUrl : DefaultPlayFabApiUrl; + } + if (verticalName == null && apiSettings != null && !string.IsNullOrEmpty(apiSettings.VerticalName)) + { + verticalName = apiSettings.VerticalName; + } + if (titleId == null) + { + titleId = PlayFabSharedPrivate.TitleId; + } + + var baseUrl = productionEnvironmentUrl; + if (!baseUrl.StartsWith("http")) + { + sb.Append("https://"); + if (!string.IsNullOrEmpty(titleId)) + { + sb.Append(titleId).Append("."); + } + if (!string.IsNullOrEmpty(verticalName)) + { + sb.Append(verticalName).Append("."); + } + } + + sb.Append(baseUrl).Append(apiCall); + + bool firstParam = true; + if (getParams != null) + { + foreach (var paramPair in getParams) + { + if (firstParam) + { + sb.Append("?"); + firstParam = false; + } + else + { + sb.Append("&"); + } + sb.Append(paramPair.Key).Append("=").Append(paramPair.Value); + } + } + + sb.Append(firstParam ? "?" : "&"); + sb.Append("engine=").Append(EngineVersion); + sb.Append("&platform=").Append(PlatformString); + + return sb.ToString(); + } + } +} diff --git a/Assets/PlayFabSDK/Shared/Public/PlayFabSettings.cs.meta b/Assets/PlayFabSDK/Shared/Public/PlayFabSettings.cs.meta new file mode 100644 index 00000000..96dbc65f --- /dev/null +++ b/Assets/PlayFabSDK/Shared/Public/PlayFabSettings.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: aa223f24327e645d39b48f0ca9615e68 +timeCreated: 1462682372 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Shared/Public/PluginContract.cs b/Assets/PlayFabSDK/Shared/Public/PluginContract.cs new file mode 100644 index 00000000..f961c82b --- /dev/null +++ b/Assets/PlayFabSDK/Shared/Public/PluginContract.cs @@ -0,0 +1,8 @@ +namespace PlayFab +{ + public enum PluginContract + { + PlayFab_Serializer, + PlayFab_Transport + } +} \ No newline at end of file diff --git a/Assets/PlayFabSDK/Shared/Public/PluginContract.cs.meta b/Assets/PlayFabSDK/Shared/Public/PluginContract.cs.meta new file mode 100644 index 00000000..db1d69db --- /dev/null +++ b/Assets/PlayFabSDK/Shared/Public/PluginContract.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2e25ec8533eb4fe4fa7d39cc8dcda24c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Shared/Public/PluginContractKey.cs b/Assets/PlayFabSDK/Shared/Public/PluginContractKey.cs new file mode 100644 index 00000000..70e2892e --- /dev/null +++ b/Assets/PlayFabSDK/Shared/Public/PluginContractKey.cs @@ -0,0 +1,23 @@ +using System.Collections.Generic; + +namespace PlayFab +{ + public struct PluginContractKey + { + public PluginContract _pluginContract; + public string _pluginName; + } + + public class PluginContractKeyComparator : EqualityComparer + { + public override bool Equals(PluginContractKey x, PluginContractKey y) + { + return x._pluginContract == y._pluginContract && x._pluginName.Equals(y._pluginName); + } + + public override int GetHashCode(PluginContractKey obj) + { + return (int)obj._pluginContract + obj._pluginName.GetHashCode(); + } + } +} diff --git a/Assets/PlayFabSDK/Shared/Public/PluginContractKey.cs.meta b/Assets/PlayFabSDK/Shared/Public/PluginContractKey.cs.meta new file mode 100644 index 00000000..7b4f3419 --- /dev/null +++ b/Assets/PlayFabSDK/Shared/Public/PluginContractKey.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c74eb9de26e70e7489002fb92b96af0f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Shared/Public/PluginManager.cs b/Assets/PlayFabSDK/Shared/Public/PluginManager.cs new file mode 100644 index 00000000..94ba346b --- /dev/null +++ b/Assets/PlayFabSDK/Shared/Public/PluginManager.cs @@ -0,0 +1,110 @@ +using System; +using System.Collections.Concurrent; +using PlayFab.Internal; + +namespace PlayFab +{ + public class PluginManager + { + private ConcurrentDictionary plugins = new ConcurrentDictionary(new PluginContractKeyComparator()); + + /// + /// The singleton instance of plugin manager. + /// + private static readonly PluginManager Instance = new PluginManager(); + + private PluginManager() + { + } + + /// + /// Gets a plugin. + /// If a plugin with specified contract and optional instance name does not exist, it will create a new one. + /// + /// The plugin contract. + /// The optional plugin instance name. Instance names allow to have mulptiple plugins with the same contract. + /// The plugin instance. + public static T GetPlugin(PluginContract contract, string instanceName = "") where T : IPlayFabPlugin + { + return (T)Instance.GetPluginInternal(contract, instanceName); + } + + /// + /// Sets a custom plugin. + /// If a plugin with specified contract and optional instance name already exists, it will be replaced with specified instance. + /// + /// The plugin instance. + /// The app contract of plugin. + /// The optional plugin instance name. Instance names allow to have mulptiple plugins with the same contract. + public static void SetPlugin(IPlayFabPlugin plugin, PluginContract contract, string instanceName = "") + { + Instance.SetPluginInternal(plugin, contract, instanceName); + } + + private IPlayFabPlugin GetPluginInternal(PluginContract contract, string instanceName) + { + var key = new PluginContractKey { _pluginContract = contract, _pluginName = instanceName }; + IPlayFabPlugin plugin; + if (!this.plugins.TryGetValue(key, out plugin)) + { + // Requested plugin is not in the cache, create the default one + switch (contract) + { + case PluginContract.PlayFab_Serializer: + plugin = this.CreatePlugin(); + break; + case PluginContract.PlayFab_Transport: + plugin = this.CreatePlayFabTransportPlugin(); + break; + default: + throw new ArgumentException("This contract is not supported", "contract"); + } + + this.plugins[key] = plugin; + } + + return plugin; + } + + private void SetPluginInternal(IPlayFabPlugin plugin, PluginContract contract, string instanceName) + { + if (plugin == null) + { + throw new ArgumentNullException("plugin", "Plugin instance cannot be null"); + } + + var key = new PluginContractKey { _pluginContract = contract, _pluginName = instanceName }; + this.plugins[key] = plugin; + } + + private IPlayFabPlugin CreatePlugin() where T : IPlayFabPlugin, new() + { + return (IPlayFabPlugin)System.Activator.CreateInstance(typeof(T)); + } + + private ITransportPlugin CreatePlayFabTransportPlugin() + { + ITransportPlugin transport = null; +#if !UNITY_WSA && !UNITY_WP8 + if (PlayFabSettings.RequestType == WebRequestType.HttpWebRequest) + transport = new PlayFabWebRequest(); +#endif + +#if UNITY_2018_2_OR_NEWER // PlayFabWww will throw warnings as Unity has deprecated Www + if (transport == null) + transport = new PlayFabUnityHttp(); +#elif UNITY_2017_2_OR_NEWER + if (PlayFabSettings.RequestType == WebRequestType.UnityWww) + transport = new PlayFabWww(); + + if (transport == null) + transport = new PlayFabUnityHttp(); +#else + if (transport == null) + transport = new PlayFabWww(); +#endif + + return transport; + } + } +} diff --git a/Assets/PlayFabSDK/Shared/Public/PluginManager.cs.meta b/Assets/PlayFabSDK/Shared/Public/PluginManager.cs.meta new file mode 100644 index 00000000..3a175b54 --- /dev/null +++ b/Assets/PlayFabSDK/Shared/Public/PluginManager.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 408cd48212db9ae46b9100b1d3fef3b1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins.meta b/Assets/Plugins.meta new file mode 100644 index 00000000..55322045 --- /dev/null +++ b/Assets/Plugins.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 237fc3795f3235849a94769694095538 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/AssetUsageDetector.meta b/Assets/Plugins/AssetUsageDetector.meta new file mode 100644 index 00000000..07f30443 --- /dev/null +++ b/Assets/Plugins/AssetUsageDetector.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: c1764d69117881843b761dc14ca276d4 +folderAsset: yes +timeCreated: 1561225368 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/AssetUsageDetector/Editor.meta b/Assets/Plugins/AssetUsageDetector/Editor.meta new file mode 100644 index 00000000..3634eb53 --- /dev/null +++ b/Assets/Plugins/AssetUsageDetector/Editor.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 19f677a9eb83d3942af6d4c5fa8dbeee +folderAsset: yes +timeCreated: 1520032274 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/AssetUsageDetector/Editor/AssetUsageDetector.Editor.asmdef b/Assets/Plugins/AssetUsageDetector/Editor/AssetUsageDetector.Editor.asmdef new file mode 100644 index 00000000..f02732f0 --- /dev/null +++ b/Assets/Plugins/AssetUsageDetector/Editor/AssetUsageDetector.Editor.asmdef @@ -0,0 +1,29 @@ +{ + "name": "AssetUsageDetector.Editor", + "rootNamespace": "", + "references": [ + "Unity.Addressables" + ], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [ + { + "name": "com.unity.addressables", + "expression": "0.0.0", + "define": "ASSET_USAGE_ADDRESSABLES" + }, + { + "name": "com.unity.visualeffectgraph", + "expression": "0.0.0", + "define": "ASSET_USAGE_VFX_GRAPH" + } + ], + "noEngineReferences": false +} \ No newline at end of file diff --git a/Assets/Plugins/AssetUsageDetector/Editor/AssetUsageDetector.Editor.asmdef.meta b/Assets/Plugins/AssetUsageDetector/Editor/AssetUsageDetector.Editor.asmdef.meta new file mode 100644 index 00000000..a29079c3 --- /dev/null +++ b/Assets/Plugins/AssetUsageDetector/Editor/AssetUsageDetector.Editor.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 8579ab42c9ab63d4bac5fb07bd390b46 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/AssetUsageDetector/Editor/AssetUsageDetector.cs b/Assets/Plugins/AssetUsageDetector/Editor/AssetUsageDetector.cs new file mode 100644 index 00000000..b1a0a22e --- /dev/null +++ b/Assets/Plugins/AssetUsageDetector/Editor/AssetUsageDetector.cs @@ -0,0 +1,1398 @@ +// Asset Usage Detector - by Suleyman Yasir KULA (yasirkula@gmail.com) + +using UnityEngine; +using UnityEditor; +using UnityEngine.SceneManagement; +using UnityEditor.SceneManagement; +using System.Collections.Generic; +using System.Reflection; +using System; +using System.IO; +using System.Text; +using Object = UnityEngine.Object; +#if UNITY_2018_3_OR_NEWER && !UNITY_2021_2_OR_NEWER +using PrefabStage = UnityEditor.Experimental.SceneManagement.PrefabStage; +using PrefabStageUtility = UnityEditor.Experimental.SceneManagement.PrefabStageUtility; +#endif + +namespace AssetUsageDetectorNamespace +{ + [Flags] + public enum SceneSearchMode { None = 0, OpenScenes = 1, ScenesInBuildSettingsAll = 2, ScenesInBuildSettingsTickedOnly = 4, AllScenes = 8 }; + + public partial class AssetUsageDetector + { + #region Helper Classes + [Serializable] + public class Parameters + { + public Object[] objectsToSearch = null; + + public SceneSearchMode searchInScenes = SceneSearchMode.AllScenes; + public Object[] searchInScenesSubset = null; + public Object[] excludedScenesFromSearch = null; + public bool searchInSceneLightingSettings = true; + public bool searchInAssetsFolder = true; + public Object[] searchInAssetsSubset = null; + public Object[] excludedAssetsFromSearch = null; + public bool dontSearchInSourceAssets = true; + public bool searchInProjectSettings = true; + + public int searchDepthLimit = 4; + public BindingFlags fieldModifiers = BindingFlags.Public | BindingFlags.NonPublic; + public BindingFlags propertyModifiers = BindingFlags.Public | BindingFlags.NonPublic; + public bool searchNonSerializableVariables = true; + + public bool searchUnusedMaterialProperties = true; + + public SearchRefactoring searchRefactoring = null; + + public bool lazySceneSearch = true; +#if ASSET_USAGE_ADDRESSABLES + public bool addressablesSupport = false; +#endif + public bool calculateUnusedObjects = false; + public bool hideDuplicateRows = true; + public bool hideReduntantPrefabVariantLinks = true; + public bool noAssetDatabaseChanges = false; + public bool showDetailedProgressBar = true; + } + #endregion + + private Parameters searchParameters; + + // A set that contains the searched scene object(s), asset(s) and their sub-assets (if any) + private readonly HashSet objectsToSearchSet = new HashSet(); + // Scenes of scene object(s) in objectsToSearchSet + private readonly HashSet sceneObjectsToSearchScenesSet = new HashSet(); + // Project asset(s) in objectsToSearchSet + private readonly HashSet assetsToSearchSet = new HashSet(); + // assetsToSearchSet's path(s) + private readonly HashSet assetsToSearchPathsSet = new HashSet(); + // The root prefab objects in assetsToSearchSet that will be used to search for prefab references + private readonly List assetsToSearchRootPrefabs = new List( 4 ); + // Path(s) of the assets that should be excluded from the search + private readonly HashSet excludedAssetsPathsSet = new HashSet(); + // Extension(s) of assets that will always be searched in detail + private readonly HashSet alwaysSearchedExtensionsSet = new HashSet(); + + // Results for the currently searched scene + private SearchResultGroup currentSearchResultGroup; + + // An optimization to search an object only once (key is a hash of the searched object) + private readonly Dictionary searchedObjects = new Dictionary( 4096 ); + private readonly Dictionary searchedUnityObjects = new Dictionary( 32768 ); // Unity objects use their instanceIDs as key which is more performant + + // Stack of SearchObject function parameters to avoid infinite loops (which happens when same object is passed as parameter to function) + private readonly List callStack = new List( 64 ); + + private Object currentSearchedObject; + private int currentDepth; + + private bool searchingSourceAssets; + private bool isInPlayMode; + +#if UNITY_2018_3_OR_NEWER + private PrefabStage openPrefabStage; + private GameObject openPrefabStagePrefabAsset; +#if UNITY_2020_1_OR_NEWER + private GameObject openPrefabStageContextObject; +#endif +#endif + + private int searchedObjectsCount; // Number of searched objects + private double searchStartTime; + + private readonly List nodesPool = new List( 32 ); + + // Search for references! + public SearchResult Run( Parameters searchParameters ) + { + if( searchParameters == null ) + { + Debug.LogError( "'searchParameters' mustn't be null!" ); + return new SearchResult( false, null, null, null, this, searchParameters ); + } + + if( searchParameters.objectsToSearch == null ) + { + Debug.LogError( "'objectsToSearch' list (\"SEARCHED OBJECTS\") is empty!" ); + return new SearchResult( false, null, null, null, this, searchParameters ); + } + +#if UNITY_2018_3_OR_NEWER + openPrefabStagePrefabAsset = null; + string openPrefabStageAssetPath = null; + openPrefabStage = PrefabStageUtility.GetCurrentPrefabStage(); + if( openPrefabStage != null ) + { + if( !openPrefabStage.stageHandle.IsValid() ) + openPrefabStage = null; + else + { + if( openPrefabStage.scene.isDirty ) + { + // Don't start the search if a prefab stage is currently open and dirty (not saved) + Debug.LogError( "Save open prefab first!" ); + return new SearchResult( false, null, null, null, this, searchParameters ); + } + +#if UNITY_2020_1_OR_NEWER + string prefabAssetPath = openPrefabStage.assetPath; +#else + string prefabAssetPath = openPrefabStage.prefabAssetPath; +#endif + openPrefabStagePrefabAsset = AssetDatabase.LoadAssetAtPath( prefabAssetPath ); + openPrefabStageAssetPath = prefabAssetPath; + +#if UNITY_2020_1_OR_NEWER + openPrefabStageContextObject = openPrefabStage.openedFromInstanceRoot; +#endif + } + } +#endif + + List searchResult = null; + isInPlayMode = EditorApplication.isPlaying; + + if( !isInPlayMode && !Utilities.AreScenesSaved() && !EditorUtility.DisplayDialog( "Asset Usage Detector", "Some scene(s) aren't saved. This may result in incorrect search results in those scene(s). Proceed?", "Yes", "Cancel" ) ) + { + Debug.LogError( "Save open scene(s) first!" ); + return new SearchResult( false, null, null, null, this, searchParameters ); + } + + // Get the scenes that are open right now + SceneSetup[] initialSceneSetup = !isInPlayMode ? EditorSceneManager.GetSceneManagerSetup() : null; + Scene activeScene = EditorSceneManager.GetActiveScene(); + + // Make sure that the AssetDatabase is up-to-date + AssetDatabase.SaveAssets(); + + try + { + this.searchParameters = searchParameters; + + // Initialize commonly used variables + searchResult = new List(); // Overall search results + + currentSearchedObject = null; + currentDepth = 0; + searchedObjectsCount = 0; + searchStartTime = EditorApplication.timeSinceStartup; + + searchedObjects.Clear(); + searchedUnityObjects.Clear(); + animationClipUniqueBindings.Clear(); + callStack.Clear(); + objectsToSearchSet.Clear(); + sceneObjectsToSearchScenesSet.Clear(); + assetsToSearchSet.Clear(); + assetsToSearchPathsSet.Clear(); + assetsToSearchRootPrefabs.Clear(); + excludedAssetsPathsSet.Clear(); + alwaysSearchedExtensionsSet.Clear(); + shaderIncludesToSearchSet.Clear(); +#if UNITY_2017_3_OR_NEWER + assemblyDefinitionFilesToSearch.Clear(); +#endif + + if( assetDependencyCache == null ) + { + LoadCache(); + searchStartTime = EditorApplication.timeSinceStartup; + } + else if( !searchParameters.noAssetDatabaseChanges ) + { + foreach( var cacheEntry in assetDependencyCache.Values ) + cacheEntry.verified = false; + } + + foreach( var cacheEntry in assetDependencyCache.Values ) + cacheEntry.searchResult = CacheEntry.Result.Unknown; + + lastRefreshedCacheEntry = null; + + // Store the searched objects(s) in HashSets + HashSet folderContentsSet = new HashSet(); + foreach( Object obj in searchParameters.objectsToSearch ) + { + if( obj == null || obj.Equals( null ) ) + continue; + + if( obj.IsFolder() ) + folderContentsSet.UnionWith( Utilities.EnumerateFolderContents( obj ) ); + else + AddSearchedObjectToFilteredSets( obj, true ); + } + + foreach( string filePath in folderContentsSet ) + { + // Skip scene assets + if( filePath.EndsWithFast( ".unity" ) ) + continue; + + Object[] assets = AssetDatabase.LoadAllAssetsAtPath( filePath ); + if( assets == null || assets.Length == 0 ) + continue; + + for( int i = 0; i < assets.Length; i++ ) + AddSearchedObjectToFilteredSets( assets[i], true ); + } + + // Find Project Settings to search for references. Don't search Project Settings if searched object(s) are all scene objects + // as Project Settings can't hold references to scene objects + string[] projectSettingsToSearch = new string[0]; + if( searchParameters.searchInProjectSettings && assetsToSearchSet.Count > 0 ) + { + string[] projectSettingsAssets = Directory.GetFiles( "ProjectSettings" ); + projectSettingsToSearch = new string[projectSettingsAssets.Length]; + for( int i = 0; i < projectSettingsAssets.Length; i++ ) + projectSettingsToSearch[i] = "ProjectSettings/" + Path.GetFileName( projectSettingsAssets[i] ); + + // AssetDatabase.GetDependencies doesn't work with Project Settings assets. By adding these assets to assetsToSearchPathsSet, + // we make sure that AssetHasAnyReference returns true for these assets and they don't get excluded from the search + assetsToSearchPathsSet.UnionWith( projectSettingsToSearch ); + } + + // Find the scenes to search for references + HashSet scenesToSearch = new HashSet(); + if( searchParameters.searchInScenesSubset != null && searchParameters.searchInScenesSubset.Length > 0 ) + { + foreach( Object obj in searchParameters.searchInScenesSubset ) + { + if( obj == null || obj.Equals( null ) ) + continue; + + if( !obj.IsAsset() ) + continue; + + if( obj.IsFolder() ) + { + string[] folderContents = AssetDatabase.FindAssets( "t:SceneAsset", new string[] { AssetDatabase.GetAssetPath( obj ) } ); + if( folderContents == null ) + continue; + + for( int i = 0; i < folderContents.Length; i++ ) + scenesToSearch.Add( AssetDatabase.GUIDToAssetPath( folderContents[i] ) ); + } + else if( obj is SceneAsset ) + scenesToSearch.Add( AssetDatabase.GetAssetPath( obj ) ); + } + } + else if( ( searchParameters.searchInScenes & SceneSearchMode.AllScenes ) == SceneSearchMode.AllScenes ) + { + // Get all scenes from the Assets folder + string[] sceneGuids = AssetDatabase.FindAssets( "t:SceneAsset" ); + for( int i = 0; i < sceneGuids.Length; i++ ) + scenesToSearch.Add( AssetDatabase.GUIDToAssetPath( sceneGuids[i] ) ); + } + else + { + if( ( searchParameters.searchInScenes & SceneSearchMode.OpenScenes ) == SceneSearchMode.OpenScenes ) + { + // Get all open (and loaded) scenes + for( int i = 0; i < SceneManager.sceneCount; i++ ) + { + Scene scene = SceneManager.GetSceneAt( i ); + if( scene.IsValid() && scene.isLoaded ) + scenesToSearch.Add( scene.path ); + } + } + + bool searchInScenesInBuildTickedAll = ( searchParameters.searchInScenes & SceneSearchMode.ScenesInBuildSettingsAll ) == SceneSearchMode.ScenesInBuildSettingsAll; + if( searchInScenesInBuildTickedAll || ( searchParameters.searchInScenes & SceneSearchMode.ScenesInBuildSettingsTickedOnly ) == SceneSearchMode.ScenesInBuildSettingsTickedOnly ) + { + // Get all scenes in build settings + EditorBuildSettingsScene[] scenesTemp = EditorBuildSettings.scenes; + for( int i = 0; i < scenesTemp.Length; i++ ) + { + if( ( searchInScenesInBuildTickedAll || scenesTemp[i].enabled ) ) + scenesToSearch.Add( scenesTemp[i].path ); + } + } + } + + // In Play mode, only open scenes can be searched + if( isInPlayMode ) + { + HashSet openScenes = new HashSet(); + for( int i = 0; i < SceneManager.sceneCount; i++ ) + { + Scene scene = SceneManager.GetSceneAt( i ); + if( scene.IsValid() && scene.isLoaded ) + openScenes.Add( scene.path ); + } + + List skippedScenes = new List( scenesToSearch.Count ); + scenesToSearch.RemoveWhere( ( path ) => + { + if( !openScenes.Contains( path ) ) + { + skippedScenes.Add( path ); + return true; + } + + return false; + } ); + + if( skippedScenes.Count > 0 ) + { + StringBuilder sb = Utilities.stringBuilder; + sb.Length = 0; + sb.Append( "Can't search unloaded scenes while in play mode, skipped " ).Append( skippedScenes.Count ).AppendLine( " scene(s):" ); + for( int i = 0; i < skippedScenes.Count; i++ ) + sb.Append( "- " ).AppendLine( skippedScenes[i] ); + + Debug.Log( sb.ToString() ); + } + } + + // Initialize data used by search functions + InitializeSearchFunctionsData( searchParameters ); + + // Initialize the nodes of searched asset(s) + foreach( Object obj in objectsToSearchSet ) + searchedUnityObjects.Add( obj.GetInstanceID(), PopReferenceNode( obj ) ); + + // Progressbar values + int searchProgress = 0; + int searchTotalProgress = scenesToSearch.Count; + if( isInPlayMode && searchParameters.searchInScenes != SceneSearchMode.None ) + searchTotalProgress++; // DontDestroyOnLoad scene + + if( searchParameters.showDetailedProgressBar ) + searchTotalProgress += projectSettingsToSearch.Length; + + // Don't search assets if searched object(s) are all scene objects as assets can't hold references to scene objects + if( searchParameters.searchInAssetsFolder && assetsToSearchSet.Count > 0 ) + { + currentSearchResultGroup = new SearchResultGroup( "Project Window (Assets)", SearchResultGroup.GroupType.Assets ); + + // Get the paths of all assets that are to be searched + IEnumerable assetPaths; + if( searchParameters.searchInAssetsSubset == null || searchParameters.searchInAssetsSubset.Length == 0 ) + { + string[] allAssetPaths = AssetDatabase.GetAllAssetPaths(); + assetPaths = allAssetPaths; + + if( searchParameters.showDetailedProgressBar ) + searchTotalProgress += allAssetPaths.Length; + } + else + { + folderContentsSet.Clear(); + + foreach( Object obj in searchParameters.searchInAssetsSubset ) + { + if( obj == null || obj.Equals( null ) ) + continue; + + if( !obj.IsAsset() ) + continue; + + if( obj.IsFolder() ) + folderContentsSet.UnionWith( Utilities.EnumerateFolderContents( obj ) ); + else + folderContentsSet.Add( AssetDatabase.GetAssetPath( obj ) ); + } + + assetPaths = folderContentsSet; + + if( searchParameters.showDetailedProgressBar ) + searchTotalProgress += folderContentsSet.Count; + } + + // Calculate the path(s) of the assets that won't be searched for references + if( searchParameters.excludedAssetsFromSearch != null ) + { + foreach( Object obj in searchParameters.excludedAssetsFromSearch ) + { + if( obj == null || obj.Equals( null ) ) + continue; + + if( !obj.IsAsset() ) + continue; + + if( obj.IsFolder() ) + excludedAssetsPathsSet.UnionWith( Utilities.EnumerateFolderContents( obj ) ); + else + excludedAssetsPathsSet.Add( AssetDatabase.GetAssetPath( obj ) ); + } + } + + if( EditorUtility.DisplayCancelableProgressBar( "Please wait...", "Searching assets", 0f ) ) + throw new Exception( "Search aborted" ); + + foreach( string path in assetPaths ) + { + if( searchParameters.showDetailedProgressBar && ++searchProgress % 30 == 1 && EditorUtility.DisplayCancelableProgressBar( "Please wait...", "Searching assets", (float) searchProgress / searchTotalProgress ) ) + throw new Exception( "Search aborted" ); + + if( excludedAssetsPathsSet.Contains( path ) ) + continue; + + // If asset resides inside the Assets directory and is not a scene asset + if( path.StartsWithFast( "Assets/" ) && !path.EndsWithFast( ".unity" ) ) + { + if( !AssetHasAnyReference( path ) ) + continue; + + Object[] assets = AssetDatabase.LoadAllAssetsAtPath( path ); + if( assets == null || assets.Length == 0 ) + continue; + + for( int i = 0; i < assets.Length; i++ ) + { + // Components are already searched while searching the GameObject + if( assets[i] is Component ) + continue; + + BeginSearchObject( assets[i] ); + } + } + } + + // If a reference is found in the Project view, save the results + if( currentSearchResultGroup.NumberOfReferences > 0 ) + searchResult.Add( currentSearchResultGroup ); + } + + // Search all assets inside the ProjectSettings folder + if( projectSettingsToSearch.Length > 0 ) + { + currentSearchResultGroup = new SearchResultGroup( "Project Settings", SearchResultGroup.GroupType.ProjectSettings ); + + if( EditorUtility.DisplayCancelableProgressBar( "Please wait...", "Searching Project Settings", (float) searchProgress / searchTotalProgress ) ) + throw new Exception( "Search aborted" ); + + for( int i = 0; i < projectSettingsToSearch.Length; i++ ) + { + if( searchParameters.showDetailedProgressBar && ++searchProgress % 30 == 1 && EditorUtility.DisplayCancelableProgressBar( "Please wait...", "Searching Project Settings", (float) searchProgress / searchTotalProgress ) ) + throw new Exception( "Search aborted" ); + + Object[] assets = AssetDatabase.LoadAllAssetsAtPath( projectSettingsToSearch[i] ); + if( assets != null && assets.Length > 0 ) + { + for( int j = 0; j < assets.Length; j++ ) + BeginSearchObject( assets[j] ); + } + } + + if( currentSearchResultGroup.NumberOfReferences > 0 ) + searchResult.Add( currentSearchResultGroup ); + } + + // Search non-serializable variables for references while searching a scene in play mode + if( isInPlayMode ) + searchSerializableVariablesOnly = false; + + if( scenesToSearch.Count > 0 ) + { + // Calculate the path(s) of the scenes that won't be searched for references + HashSet excludedScenesPathsSet = new HashSet(); + if( searchParameters.excludedScenesFromSearch != null ) + { + foreach( Object obj in searchParameters.excludedScenesFromSearch ) + { + if( obj == null || obj.Equals( null ) ) + continue; + + if( !obj.IsAsset() ) + continue; + + if( obj.IsFolder() ) + { + string[] folderContents = AssetDatabase.FindAssets( "t:SceneAsset", new string[] { AssetDatabase.GetAssetPath( obj ) } ); + if( folderContents == null ) + continue; + + for( int i = 0; i < folderContents.Length; i++ ) + excludedScenesPathsSet.Add( AssetDatabase.GUIDToAssetPath( folderContents[i] ) ); + } + else if( obj is SceneAsset ) + excludedScenesPathsSet.Add( AssetDatabase.GetAssetPath( obj ) ); + } + } + + // Search scenes for references + foreach( string scenePath in scenesToSearch ) + { + if( EditorUtility.DisplayCancelableProgressBar( "Please wait...", "Searching scene: " + scenePath, (float) ++searchProgress / searchTotalProgress ) ) + throw new Exception( "Search aborted" ); + + if( string.IsNullOrEmpty( scenePath ) ) + continue; + + if( excludedScenesPathsSet.Contains( scenePath ) ) + continue; + +#if UNITY_2019_2_OR_NEWER + // Skip scenes in read-only packages (Issue #36) + // Credit: https://forum.unity.com/threads/check-if-asset-inside-package-is-readonly.900902/#post-5990822 + if( !scenePath.StartsWithFast( "Assets/" ) ) + { + var packageInfo = UnityEditor.PackageManager.PackageInfo.FindForAssetPath( scenePath ); + if( packageInfo != null && packageInfo.source != UnityEditor.PackageManager.PackageSource.Embedded && packageInfo.source != UnityEditor.PackageManager.PackageSource.Local ) + continue; + } +#endif + + SearchScene( scenePath, searchResult, searchParameters, initialSceneSetup ); + } + } + + // Search through all the GameObjects under the DontDestroyOnLoad scene (if exists) + if( isInPlayMode && searchParameters.searchInScenes != SceneSearchMode.None ) + { + if( EditorUtility.DisplayCancelableProgressBar( "Please wait...", "Searching scene: DontDestroyOnLoad", 1f ) ) + throw new Exception( "Search aborted" ); + + currentSearchResultGroup = new SearchResultGroup( "DontDestroyOnLoad", SearchResultGroup.GroupType.DontDestroyOnLoad ); + + GameObject[] rootGameObjects = GetDontDestroyOnLoadObjects(); + for( int i = 0; i < rootGameObjects.Length; i++ ) + SearchGameObjectRecursively( rootGameObjects[i] ); + + if( currentSearchResultGroup.NumberOfReferences > 0 ) + searchResult.Add( currentSearchResultGroup ); + } + + // Searching source assets last prevents some references from being excluded due to callStack.ContainsFast + if( !searchParameters.dontSearchInSourceAssets ) + { + searchingSourceAssets = true; + + foreach( Object obj in objectsToSearchSet ) + { + currentSearchedObject = obj; + SearchObject( obj ); + } + + searchingSourceAssets = false; + } + + EditorUtility.DisplayProgressBar( "Please wait...", "Post-processing search results", 1f ); + + InitializeSearchResultNodes( searchResult ); + + HashSet usedObjects = null; + if( searchResult.Count > 0 && searchParameters.calculateUnusedObjects ) + CalculateUnusedObjects( searchResult, out usedObjects ); + + // Log some c00l stuff to console + Debug.Log( "Searched " + searchedObjectsCount + " objects in " + ( EditorApplication.timeSinceStartup - searchStartTime ).ToString( "F2" ) + " seconds" ); + + return new SearchResult( true, searchResult, usedObjects, initialSceneSetup, this, searchParameters ); + } + catch( Exception e ) + { + StringBuilder sb = Utilities.stringBuilder; + sb.Length = 0; + sb.EnsureCapacity( objectsToSearchSet.Count * 50 + callStack.Count * 50 + 500 ); + + sb.AppendLine( "AssetUsageDetector Error: The following Exception is thrown during the search. Details:" ); + + Object latestUnityObjectInCallStack = AppendCallStackToStringBuilder( sb ); + + sb.AppendLine( "Searching references of: " ); + foreach( Object obj in objectsToSearchSet ) + { + if( obj ) + sb.Append( obj.name ).Append( " (" ).Append( obj.GetType() ).AppendLine( ")" ); + } + + Debug.LogError( sb.ToString(), latestUnityObjectInCallStack ); + Debug.LogException( e, latestUnityObjectInCallStack ); + + try + { + InitializeSearchResultNodes( searchResult ); + } + catch + { } + + return new SearchResult( false, searchResult, null, initialSceneSetup, this, searchParameters ); + } + finally + { + currentSearchResultGroup = null; + currentSearchedObject = null; + + EditorUtility.ClearProgressBar(); + + // If the active scene was changed during search, reset it + if( EditorSceneManager.GetActiveScene() != activeScene ) + EditorSceneManager.SetActiveScene( activeScene ); + +#if UNITY_2018_3_OR_NEWER + // If a prefab stage was open when the search was triggered, try reopening the prefab stage after the search is completed + if( !string.IsNullOrEmpty( openPrefabStageAssetPath ) ) + { +#if UNITY_2020_1_OR_NEWER + bool shouldOpenPrefabStageWithoutContext = true; + if( openPrefabStageContextObject != null && !openPrefabStageContextObject.Equals( null ) ) + { + try + { + // Try to access this method: https://github.com/Unity-Technologies/UnityCsReference/blob/73925b1711847c067e607ec8371f8e9ffe7ab65d/Editor/Mono/SceneManagement/StageManager/PrefabStage/PrefabStageUtility.cs#L61-L65 + MethodInfo prefabStageOpenerWithContext = typeof( PrefabStageUtility ).GetMethod( "OpenPrefab", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static, null, new Type[2] { typeof( string ), typeof( GameObject ) }, null ); + if( prefabStageOpenerWithContext != null ) + { + prefabStageOpenerWithContext.Invoke( null, new object[2] { openPrefabStageAssetPath, openPrefabStageContextObject } ); + shouldOpenPrefabStageWithoutContext = false; + } + } + catch { } + } + + if( shouldOpenPrefabStageWithoutContext ) +#endif + { + AssetDatabase.OpenAsset( AssetDatabase.LoadAssetAtPath( openPrefabStageAssetPath ) ); + } + } +#endif + } + } + + private void InitializeSearchResultNodes( List searchResult ) + { + for( int i = 0; i < searchResult.Count; i++ ) + { + searchResult[i].InitializeNodes( objectsToSearchSet ); + + // Remove empty search result groups + if( !searchResult[i].PendingSearch && searchResult[i].NumberOfReferences == 0 ) + searchResult.RemoveAt( i-- ); + } + } + + private void CalculateUnusedObjects( List searchResult, out HashSet usedObjectsSet ) + { + currentSearchResultGroup = new SearchResultGroup( "Unused Objects", SearchResultGroup.GroupType.UnusedObjects, false, false ); + + usedObjectsSet = new HashSet(); + HashSet usedObjectPathsSet = new HashSet(); // For assets: stores the filepaths, For scene objects: stores the topmost GameObject's instanceID + foreach( SearchResultGroup searchResultGroup in searchResult ) + { + for( int j = 0; j < searchResultGroup.NumberOfReferences; j++ ) + { + Object obj = searchResultGroup[j].UnityObject; + if( obj is Component ) + obj = ( (Component) obj ).gameObject; + + if( usedObjectsSet.Add( obj ) ) + { + string assetPath = AssetDatabase.GetAssetPath( obj ); + if( !string.IsNullOrEmpty( assetPath ) ) + usedObjectPathsSet.Add( assetPath ); + else + { + for( Transform parent = ( (GameObject) obj ).transform.parent; parent != null; parent = parent.parent ) + usedObjectPathsSet.Add( parent.gameObject.GetInstanceID().ToString() ); + } + } + } + } + + Dictionary unusedMainObjectNodes = new Dictionary( objectsToSearchSet.Count - usedObjectsSet.Count ); + Dictionary> unusedSubObjectNodes = new Dictionary>( objectsToSearchSet.Count - usedObjectsSet.Count ); + foreach( Object obj in objectsToSearchSet ) + { + // Omit components, their GameObjects are already included in search + if( obj is Component ) + continue; + + // Omit assets that are invisible in Hierarchy/Inspector + if( ( obj.hideFlags & ( HideFlags.HideInInspector | HideFlags.HideInHierarchy ) ) != HideFlags.None ) + continue; + + if( usedObjectsSet.Contains( obj ) ) + continue; + + string assetPath = AssetDatabase.GetAssetPath( obj ); + + // Omit unused sub-assets whose parent assets are used (configurable via Settings) + if( AssetUsageDetectorSettings.MarkUsedAssetsSubAssetsAsUsed && AssetDatabase.IsSubAsset( obj ) && usedObjectsSet.Contains( AssetDatabase.LoadMainAssetAtPath( assetPath ) ) ) + continue; + + // Omit meshes of an imported model asset + if( obj is Mesh && !string.IsNullOrEmpty( assetPath ) && AssetDatabase.GetMainAssetTypeAtPath( assetPath ) == typeof( GameObject ) && objectsToSearchSet.Contains( AssetDatabase.LoadMainAssetAtPath( assetPath ) ) ) + continue; + + // Omit MonoScripts whose types can't be determined + if( obj is MonoScript && ( (MonoScript) obj ).GetClass() == null ) + continue; + + GameObject searchedTopmostGameObject = null; + if( obj is GameObject ) + { + if( string.IsNullOrEmpty( assetPath ) ) + { + for( Transform parent = ( (GameObject) obj ).transform.parent; parent != null; parent = parent.parent ) + { + if( objectsToSearchSet.Contains( parent ) && !usedObjectsSet.Contains( parent.gameObject ) ) + searchedTopmostGameObject = parent.gameObject; + } + } + else + { + for( Transform parent = ( (GameObject) obj ).transform.parent; parent != null; parent = parent.parent ) + { + if( objectsToSearchSet.Contains( parent ) ) + { + searchedTopmostGameObject = parent.gameObject; + break; + } + } + } + + if( searchedTopmostGameObject && !string.IsNullOrEmpty( assetPath ) ) // Omit GameObject assets if their parent objects are already included in search + continue; + } + + // Use new ReferenceNodes in UnusedObjects search result group because we don't want these nodes to be linked to the actual ReferenceNodes in any way + // (i.e. we don't use actual ReferenceNodes of these objects (GetReferenceNode) because these may have links to other nodes in unknown circumstances) + ReferenceNode node = PopReferenceNode( obj ); + node.usedState = ReferenceNode.UsedState.Unused; + + if( string.IsNullOrEmpty( assetPath ) ) + { + if( !searchedTopmostGameObject ) + { + if( obj is GameObject ) + unusedMainObjectNodes[obj.GetInstanceID().ToString()] = node; + else + currentSearchResultGroup.AddReference( node ); + } + else // List child GameObject scene objects under their parent GameObject + { + string dictionaryKey = searchedTopmostGameObject.GetInstanceID().ToString(); + List unusedSubObjectNodesAtPath; + if( !unusedSubObjectNodes.TryGetValue( dictionaryKey, out unusedSubObjectNodesAtPath ) ) + unusedSubObjectNodes[dictionaryKey] = unusedSubObjectNodesAtPath = new List( 2 ); + + unusedSubObjectNodesAtPath.Add( node ); + } + } + else + { + if( AssetDatabase.IsMainAsset( obj ) ) + unusedMainObjectNodes[assetPath] = node; + else + { + List unusedSubObjectNodesAtPath; + if( !unusedSubObjectNodes.TryGetValue( assetPath, out unusedSubObjectNodesAtPath ) ) + unusedSubObjectNodes[assetPath] = unusedSubObjectNodesAtPath = new List( 2 ); + + unusedSubObjectNodesAtPath.Add( node ); + } + } + } + + foreach( KeyValuePair kvPair in unusedMainObjectNodes ) + { + List unusedSubAssetNodesAtPath; + if( unusedSubObjectNodes.TryGetValue( kvPair.Key, out unusedSubAssetNodesAtPath ) ) + { + currentSearchResultGroup.AddReference( kvPair.Value ); + for( int i = 0; i < unusedSubAssetNodesAtPath.Count; i++ ) + kvPair.Value.AddLinkTo( unusedSubAssetNodesAtPath[i] ); + + if( usedObjectPathsSet.Contains( kvPair.Key ) ) + kvPair.Value.usedState = ReferenceNode.UsedState.MixedCollapsed; + + unusedSubObjectNodes.Remove( kvPair.Key ); + } + else if( !usedObjectPathsSet.Contains( kvPair.Key ) ) // If a main asset has sub-assets and all of them are used, consider the main asset as used, as well (especially useful for Sprite assets) + currentSearchResultGroup.AddReference( kvPair.Value ); + else if( !AssetDatabase.Contains( (Object) kvPair.Value.nodeObject ) ) + { + currentSearchResultGroup.AddReference( kvPair.Value ); + kvPair.Value.usedState = ReferenceNode.UsedState.MixedCollapsed; + } + } + + foreach( KeyValuePair> kvPair in unusedSubObjectNodes ) // These aren't linked to any unusedMainObjectNodes, add them as root nodes to the search result group + { + foreach( ReferenceNode node in kvPair.Value ) + currentSearchResultGroup.AddReference( node ); + } + + if( currentSearchResultGroup.NumberOfReferences > 0 ) + { + for( int i = 0; i < currentSearchResultGroup.NumberOfReferences; i++ ) + currentSearchResultGroup[i].InitializeRecursively(); + + searchResult.Insert( 0, currentSearchResultGroup ); + } + } + + // Checks if object is asset or scene object and adds it to the corresponding HashSet(s) + private void AddSearchedObjectToFilteredSets( Object obj, bool expandGameObjects ) + { + if( obj == null || obj.Equals( null ) ) + return; + + objectsToSearchSet.Add( obj ); + +#if UNITY_2018_3_OR_NEWER + // When searching for references of a prefab stage object, try adding its corresponding prefab asset to the searched assets, as well + if( openPrefabStage != null && openPrefabStagePrefabAsset != null && obj is GameObject && openPrefabStage.IsPartOfPrefabContents( (GameObject) obj ) ) + { + GameObject prefabStageObjectSource = ( (GameObject) obj ).FollowSymmetricHierarchy( openPrefabStage.prefabContentsRoot, openPrefabStagePrefabAsset ); + if( prefabStageObjectSource != null ) + AddSearchedObjectToFilteredSets( prefabStageObjectSource, expandGameObjects ); + } +#endif + + bool isAsset = obj.IsAsset(); + if( isAsset ) + { + assetsToSearchSet.Add( obj ); + + string assetPath = AssetDatabase.GetAssetPath( obj ); + if( !string.IsNullOrEmpty( assetPath ) ) + { + assetsToSearchPathsSet.Add( assetPath ); + if( searchParameters.dontSearchInSourceAssets && AssetDatabase.IsMainAsset( obj ) ) + excludedAssetsPathsSet.Add( assetPath ); + } + + GameObject go = null; + if( obj is GameObject ) + go = (GameObject) obj; + else if( obj is Component ) + go = ( (Component) obj ).gameObject; + + if( go != null ) + { + Transform transform = go.transform; + bool shouldAddRootPrefabEntry = true; + for( int i = assetsToSearchRootPrefabs.Count - 1; i >= 0; i-- ) + { + Transform rootTransform = assetsToSearchRootPrefabs[i].transform; + if( transform.IsChildOf( rootTransform ) ) + { + shouldAddRootPrefabEntry = false; + break; + } + + if( rootTransform.IsChildOf( transform ) ) + assetsToSearchRootPrefabs.RemoveAt( i ); + } + + if( shouldAddRootPrefabEntry ) + assetsToSearchRootPrefabs.Add( go ); + } + } + else + { + if( obj is GameObject ) + sceneObjectsToSearchScenesSet.Add( ( (GameObject) obj ).scene.path ); + else if( obj is Component ) + sceneObjectsToSearchScenesSet.Add( ( (Component) obj ).gameObject.scene.path ); + } + + if( expandGameObjects && obj is GameObject ) + { + // If searched asset is a GameObject, include its components in the search + Component[] components = ( (GameObject) obj ).GetComponents(); + for( int i = 0; i < components.Length; i++ ) + { + if( components[i] == null || components[i].Equals( null ) ) + continue; + + objectsToSearchSet.Add( components[i] ); + + if( isAsset ) + assetsToSearchSet.Add( components[i] ); + } + } + else if( obj is Component ) + { + // Include searched components' GameObjects in the search, as well + AddSearchedObjectToFilteredSets( ( (Component) obj ).gameObject, false ); + } + } + + // Search a scene for references + private void SearchScene( string scenePath, List searchResult, Parameters searchParameters, SceneSetup[] initialSceneSetup ) + { + Scene scene = EditorSceneManager.GetSceneByPath( scenePath ); + if( isInPlayMode && !scene.isLoaded ) + return; + + bool canContainSceneObjectReference = scene.isLoaded && ( !EditorSceneManager.preventCrossSceneReferences || sceneObjectsToSearchScenesSet.Contains( scenePath ) ); + if( !canContainSceneObjectReference ) + { + bool canContainAssetReference = assetsToSearchSet.Count > 0 && ( isInPlayMode || AssetHasAnyReference( scenePath ) ); + if( !canContainAssetReference ) + return; + } + + if( !scene.isLoaded ) + { + if( searchParameters.lazySceneSearch ) + { + searchResult.Add( new SearchResultGroup( scenePath, SearchResultGroup.GroupType.Scene, true, true ) ); + return; + } + + scene = EditorSceneManager.OpenScene( scenePath, OpenSceneMode.Additive ); + } + + currentSearchResultGroup = new SearchResultGroup( scenePath, SearchResultGroup.GroupType.Scene ); + + // Search through all the GameObjects in the scene + GameObject[] rootGameObjects = scene.GetRootGameObjects(); + for( int i = 0; i < rootGameObjects.Length; i++ ) + SearchGameObjectRecursively( rootGameObjects[i] ); + + // Search through Lighting Settings (it requires changing the active scene but don't do that in play mode) + if( searchParameters.searchInSceneLightingSettings && ( !isInPlayMode || SceneManager.GetActiveScene() == scene ) ) + { + if( !isInPlayMode && EditorSceneManager.GetActiveScene() != scene ) + EditorSceneManager.SetActiveScene( scene ); + + BeginSearchObject( lightmapSettingsGetter() ); + BeginSearchObject( renderSettingsGetter() ); + } + + // If no references are found in the scene and if the scene is not part of the initial scene setup, close it + if( currentSearchResultGroup.NumberOfReferences == 0 ) + { + if( !isInPlayMode ) + { + bool sceneIsOneOfInitials = false; + for( int i = 0; i < initialSceneSetup.Length; i++ ) + { + if( initialSceneSetup[i].path == scenePath ) + { + if( !initialSceneSetup[i].isLoaded ) + EditorSceneManager.CloseScene( scene, false ); + + sceneIsOneOfInitials = true; + break; + } + } + + if( !sceneIsOneOfInitials ) + EditorSceneManager.CloseScene( scene, true ); + } + } + else + { + // Some references are found in this scene, save the results + searchResult.Add( currentSearchResultGroup ); + } + } + + // Search a GameObject and its children for references recursively + private void SearchGameObjectRecursively( GameObject go ) + { + BeginSearchObject( go ); + + Transform tr = go.transform; + for( int i = 0; i < tr.childCount; i++ ) + SearchGameObjectRecursively( tr.GetChild( i ).gameObject ); + } + + // Begin searching a root object (like a GameObject or an asset) + private void BeginSearchObject( Object obj ) + { + if( obj is SceneAsset ) + return; + + currentSearchedObject = obj; + + ReferenceNode searchResult = SearchObject( obj ); + if( searchResult != null ) + currentSearchResultGroup.AddReference( searchResult ); + } + + // Search an object for references + private ReferenceNode SearchObject( object obj ) + { + if( obj == null || obj.Equals( null ) ) + return null; + + // Avoid recursion (which leads to stackoverflow exception) using a stack (initially, I was using callStack.ContainsFast + // here but it returned false for objects that do exist in the call stack if VFX Graph window was open) + for( int i = callStack.Count - 1; i >= 0; i-- ) + { + if( callStack[i].Equals( obj ) ) + return null; + } + + bool searchingSourceAsset = searchingSourceAssets && ReferenceEquals( currentSearchedObject, obj ); + + // Hashing does not work well with structs all the time, don't cache search results for structs + if( !( obj is ValueType ) && !searchingSourceAsset ) + { + // If object was searched before, return the cached result + ReferenceNode cachedResult; + if( TryGetReferenceNode( obj, out cachedResult ) ) + return cachedResult; + } + + searchedObjectsCount++; + + ReferenceNode result; + Object unityObject = obj as Object; + if( unityObject != null ) + { + // If the Object is an asset, search it in detail only if its dependencies contain at least one of the searched asset(s) + string assetPath = null; + if( unityObject.IsAsset() ) + { + if( assetsToSearchSet.Count == 0 ) + { + searchedUnityObjects.Add( unityObject.GetInstanceID(), null ); + return null; + } + + assetPath = AssetDatabase.GetAssetPath( unityObject ); + if( excludedAssetsPathsSet.Contains( assetPath ) || !AssetHasAnyReference( assetPath ) ) + { + searchedUnityObjects.Add( unityObject.GetInstanceID(), null ); + return null; + } + } + + callStack.Add( unityObject ); + + // Search the Object in detail + Func searchFunction; + if( assetPath != null && extensionToSearchFunction.TryGetValue( Utilities.GetFileExtension( assetPath ), out searchFunction ) && AssetDatabase.IsMainAsset( unityObject ) ) + result = searchFunction( unityObject ); + else if( typeToSearchFunction.TryGetValue( unityObject.GetType(), out searchFunction ) ) + result = searchFunction( unityObject ); + else if( unityObject is Component ) + result = SearchComponent( unityObject ); + else + { + result = PopReferenceNode( unityObject ); + SearchVariablesWithSerializedObject( result ); + } + + // A prefab asset should have a link to its children because when a scene object uses a prefab and a child of that prefab uses + // a searched object, the scene object needs to appear in the search results. Since prefab assets aren't automatically linked to + // their children, we need to create that link manually + if( assetPath != null && unityObject is GameObject && AssetDatabase.IsMainAsset( unityObject ) ) + { + if( result == null ) + result = PopReferenceNode( unityObject ); + + GameObject prefabGameObject = (GameObject) unityObject; + Transform[] prefabChildren = prefabGameObject.GetComponentsInChildren( true ); + for( int i = 0; i < prefabChildren.Length; i++ ) + { + if( prefabChildren[i].gameObject != prefabGameObject ) + result.AddLinkTo( SearchObject( prefabChildren[i].gameObject ), isWeakLink: true ); + } + } + + callStack.RemoveAt( callStack.Count - 1 ); + } + else + { + // Comply with the recursive search limit + if( currentDepth >= searchParameters.searchDepthLimit ) + return null; + + callStack.Add( obj ); + currentDepth++; + + result = PopReferenceNode( obj ); + SearchVariablesWithReflection( result ); + + currentDepth--; + callStack.RemoveAt( callStack.Count - 1 ); + } + + if( result != null && result.NumberOfOutgoingLinks == 0 ) + { + PoolReferenceNode( result ); + result = null; + } + + // Cache the search result if we are skimming through a class (not a struct; i.e. objHash != null) + // and if the object is a UnityEngine.Object (if not, cache the result only if we have actually found something + // or we are at the root of the search; i.e. currentDepth == 0) + if( !( obj is ValueType ) && ( result != null || unityObject != null || currentDepth == 0 ) ) + { + if( !searchingSourceAsset ) + { + if( obj is Object ) + searchedUnityObjects.Add( unityObject.GetInstanceID(), result ); + else + searchedObjects.Add( GetNodeObjectHash( obj ), result ); + } + else if( result != null ) + { + result.CopyReferencesTo( searchedUnityObjects[unityObject.GetInstanceID()] ); + PoolReferenceNode( result ); + } + } + + return result; + } + + // Check if the asset at specified path depends on any of the references + private bool AssetHasAnyReference( string assetPath ) + { +#if ASSET_USAGE_ADDRESSABLES + if( searchParameters.addressablesSupport ) + return true; +#endif + + if( assetsToSearchPathsSet.Contains( assetPath ) ) + return true; + + if( alwaysSearchedExtensionsSet.Count > 0 && alwaysSearchedExtensionsSet.Contains( Utilities.GetFileExtension( assetPath ) ) ) + return true; + + return AssetHasAnyReferenceInternal( assetPath ); + } + + // Recursively check if the asset at specified path depends on any of the references + private bool AssetHasAnyReferenceInternal( string assetPath ) + { + CacheEntry cacheEntry; + if( !assetDependencyCache.TryGetValue( assetPath, out cacheEntry ) ) + { + cacheEntry = new CacheEntry( assetPath ); + assetDependencyCache[assetPath] = cacheEntry; + } + else if( !cacheEntry.verified ) + cacheEntry.Verify( assetPath ); + + if( cacheEntry.searchResult != CacheEntry.Result.Unknown ) + return cacheEntry.searchResult == CacheEntry.Result.Yes; + + cacheEntry.searchResult = CacheEntry.Result.No; + + string[] dependencies = cacheEntry.dependencies; + long[] fileSizes = cacheEntry.fileSizes; + for( int i = 0; i < dependencies.Length; i++ ) + { + // If a dependency was renamed (which doesn't affect the verified hash, unfortunately), + // force refresh the asset's dependencies and search it again + if( !Directory.Exists( dependencies[i] ) ) // Calling FileInfo.Length on a directory throws FileNotFoundException + { + FileInfo assetFile = new FileInfo( dependencies[i] ); + if( !assetFile.Exists || assetFile.Length != fileSizes[i] ) + { + // Although not reproduced, it is reported that this section caused StackOverflowException due to infinite loop, + // if that happens, log useful information to help reproduce the issue + if( lastRefreshedCacheEntry == cacheEntry ) + { + StringBuilder sb = Utilities.stringBuilder; + sb.Length = 0; + sb.EnsureCapacity( 1000 ); + + sb.AppendLine( "Infinite loop while refreshing a cache entry, please report it to the author." ).AppendLine(); + sb.Append( "Asset path: " ).AppendLine( assetPath ); + + for( int j = 0; j < 2; j++ ) + { + if( j == 1 ) + { + cacheEntry.Refresh( assetPath ); + dependencies = cacheEntry.dependencies; + fileSizes = cacheEntry.fileSizes; + } + + sb.AppendLine().AppendLine( j == 0 ? "Old Dependencies:" : "New Dependencies" ); + for( int k = 0; k < dependencies.Length; k++ ) + { + sb.Append( "- " ).Append( dependencies[k] ); + + if( Directory.Exists( dependencies[k] ) ) + { + sb.Append( " (Dir)" ); + if( fileSizes[k] != 0L ) + sb.Append( " WasCachedAsFile: " ).Append( fileSizes[k] ); + } + else + { + assetFile = new FileInfo( dependencies[k] ); + sb.Append( " (File) " ).Append( "CachedSize: " ).Append( fileSizes[k] ); + if( assetFile.Exists ) + sb.Append( " RealSize: " ).Append( assetFile.Length ); + else + sb.Append( " NoLongerExists" ); + } + + sb.AppendLine(); + } + } + + Debug.LogError( sb.ToString() ); + return false; + } + + cacheEntry.Refresh( assetPath ); + cacheEntry.searchResult = CacheEntry.Result.Unknown; + lastRefreshedCacheEntry = cacheEntry; + + return AssetHasAnyReferenceInternal( assetPath ); + } + } + + if( assetsToSearchPathsSet.Contains( dependencies[i] ) ) + { + cacheEntry.searchResult = CacheEntry.Result.Yes; + return true; + } + } + + for( int i = 0; i < dependencies.Length; i++ ) + { + if( AssetHasAnyReferenceInternal( dependencies[i] ) ) + { + cacheEntry.searchResult = CacheEntry.Result.Yes; + return true; + } + } + + return false; + } + + // If object was already searched, return its ReferenceNode + private bool TryGetReferenceNode( object nodeObject, out ReferenceNode referenceNode ) + { + if( nodeObject is Object ) + { + if( searchedUnityObjects.TryGetValue( ( (Object) nodeObject ).GetInstanceID(), out referenceNode ) ) + return true; + } + else if( searchedObjects.TryGetValue( GetNodeObjectHash( nodeObject ), out referenceNode ) ) + return true; + + referenceNode = null; + return false; + } + + // Get reference node for object + private ReferenceNode GetReferenceNode( object nodeObject ) + { + ReferenceNode result; + if( nodeObject is Object ) + { + int hash = ( (Object) nodeObject ).GetInstanceID(); + if( !searchedUnityObjects.TryGetValue( hash, out result ) || result == null ) + { + result = PopReferenceNode( nodeObject ); + searchedUnityObjects[hash] = result; + } + } + else + { + string hash = GetNodeObjectHash( nodeObject ); + if( !searchedObjects.TryGetValue( hash, out result ) || result == null ) + { + result = PopReferenceNode( nodeObject ); + searchedObjects[hash] = result; + } + } + + return result; + } + + // Fetch a reference node from pool + private ReferenceNode PopReferenceNode( object nodeObject ) + { + ReferenceNode node; + if( nodesPool.Count == 0 ) + node = new ReferenceNode(); + else + { + int index = nodesPool.Count - 1; + node = nodesPool[index]; + nodesPool.RemoveAt( index ); + } + + node.nodeObject = nodeObject; + return node; + } + + // Pool a reference node + private void PoolReferenceNode( ReferenceNode node ) + { + node.Clear(); + nodesPool.Add( node ); + } + + // Get a unique-ish string hash code for a plain C# object (i.e. non-UnityEngine.Object object) + private string GetNodeObjectHash( object nodeObject ) + { + return nodeObject.GetHashCode() + nodeObject.GetType().Name; + } + + // Retrieve the game objects listed under the DontDestroyOnLoad scene + private GameObject[] GetDontDestroyOnLoadObjects() + { + GameObject temp = null; + try + { + temp = new GameObject(); + Object.DontDestroyOnLoad( temp ); + Scene dontDestroyOnLoad = temp.scene; + Object.DestroyImmediate( temp ); + temp = null; + + return dontDestroyOnLoad.GetRootGameObjects(); + } + finally + { + if( temp != null ) + Object.DestroyImmediate( temp ); + } + } + + // Appends contents of callStack to StringBuilder and returns the most recent Unity object in callStack + private Object AppendCallStackToStringBuilder( StringBuilder sb ) + { + Object latestUnityObjectInCallStack = null; + if( callStack.Count > 0 ) + { + sb.AppendLine().AppendLine( "Stack contents: " ); + + for( int i = callStack.Count - 1; i >= 0; i-- ) + { + latestUnityObjectInCallStack = callStack[i] as Object; + if( latestUnityObjectInCallStack ) + { + if( !AssetDatabase.Contains( latestUnityObjectInCallStack ) ) + { + string scenePath = AssetDatabase.GetAssetOrScenePath( latestUnityObjectInCallStack ); + if( !string.IsNullOrEmpty( scenePath ) && SceneManager.GetSceneByPath( scenePath ).IsValid() ) + sb.Append( "Scene: " ).AppendLine( scenePath ); + } + + break; + } + } + + for( int i = callStack.Count - 1; i >= 0; i-- ) + { + sb.Append( i ).Append( ": " ); + + Object unityObject = callStack[i] as Object; + if( unityObject ) + sb.Append( unityObject.name ).Append( " (" ).Append( unityObject.GetType() ).AppendLine( ")" ); + else if( callStack[i] != null ) + sb.Append( callStack[i].GetType() ).AppendLine( " object" ); + else + sb.AppendLine( "<>" ); + } + + sb.AppendLine(); + } + + return latestUnityObjectInCallStack; + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/AssetUsageDetector/Editor/AssetUsageDetector.cs.meta b/Assets/Plugins/AssetUsageDetector/Editor/AssetUsageDetector.cs.meta new file mode 100644 index 00000000..8d63a0c4 --- /dev/null +++ b/Assets/Plugins/AssetUsageDetector/Editor/AssetUsageDetector.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 2c0dea52dcdb16e4e9b13f8dacc1590f +timeCreated: 1520032279 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/AssetUsageDetector/Editor/AssetUsageDetectorCache.cs b/Assets/Plugins/AssetUsageDetector/Editor/AssetUsageDetectorCache.cs new file mode 100644 index 00000000..4bb14034 --- /dev/null +++ b/Assets/Plugins/AssetUsageDetector/Editor/AssetUsageDetectorCache.cs @@ -0,0 +1,207 @@ +using System; +using System.Collections.Generic; +using System.IO; +using UnityEditor; +using UnityEngine; +using Object = UnityEngine.Object; + +namespace AssetUsageDetectorNamespace +{ + public partial class AssetUsageDetector + { + #region Helper Classes + private class CacheEntry + { + public enum Result { Unknown = 0, No = 1, Yes = 2 }; + + public string hash; + public string[] dependencies; + public long[] fileSizes; + + public bool verified; + public Result searchResult; + + public CacheEntry( string path ) + { + Verify( path ); + } + + public CacheEntry( string hash, string[] dependencies, long[] fileSizes ) + { + this.hash = hash; + this.dependencies = dependencies; + this.fileSizes = fileSizes; + } + + public void Verify( string path ) + { + string hash = AssetDatabase.GetAssetDependencyHash( path ).ToString(); + if( this.hash != hash ) + { + this.hash = hash; + Refresh( path ); + } + + verified = true; + } + + public void Refresh( string path ) + { + dependencies = AssetDatabase.GetDependencies( path, false ); + if( fileSizes == null || fileSizes.Length != dependencies.Length ) + fileSizes = new long[dependencies.Length]; + + int length = dependencies.Length; + for( int i = 0; i < length; i++ ) + { + if( !string.IsNullOrEmpty( dependencies[i] ) ) + { + FileInfo assetFile = new FileInfo( dependencies[i] ); + fileSizes[i] = assetFile.Exists ? assetFile.Length : 0L; + } + else + { + // This dependency is empty which causes issues when passed to FileInfo constructor + // Find a non-empty dependency and move it to this index + for( int j = length - 1; j > i; j--, length-- ) + { + if( !string.IsNullOrEmpty( dependencies[j] ) ) + { + dependencies[i--] = dependencies[j]; + break; + } + } + + length--; + } + } + + if( length != fileSizes.Length ) + { + Array.Resize( ref dependencies, length ); + Array.Resize( ref fileSizes, length ); + } + } + } + #endregion + + // An optimization to fetch the dependencies of an asset only once (key is the path of the asset) + private Dictionary assetDependencyCache; + private CacheEntry lastRefreshedCacheEntry; + + private string CachePath { get { return Application.dataPath + "/../Library/AssetUsageDetector.cache"; } } // Path of the cache file + + public void SaveCache() + { + if( assetDependencyCache == null ) + return; + + try + { + using( FileStream stream = new FileStream( CachePath, FileMode.Create ) ) + using( BinaryWriter writer = new BinaryWriter( stream ) ) + { + writer.Write( assetDependencyCache.Count ); + + foreach( var keyValuePair in assetDependencyCache ) + { + CacheEntry cacheEntry = keyValuePair.Value; + string[] dependencies = cacheEntry.dependencies; + long[] fileSizes = cacheEntry.fileSizes; + + writer.Write( keyValuePair.Key ); + writer.Write( cacheEntry.hash ); + writer.Write( dependencies.Length ); + + for( int i = 0; i < dependencies.Length; i++ ) + { + writer.Write( dependencies[i] ); + writer.Write( fileSizes[i] ); + } + } + } + } + catch( Exception e ) + { + Debug.LogException( e ); + } + } + + private void LoadCache() + { + if( File.Exists( CachePath ) ) + { + using( FileStream stream = new FileStream( CachePath, FileMode.Open, FileAccess.Read ) ) + using( BinaryReader reader = new BinaryReader( stream ) ) + { + try + { + int cacheSize = reader.ReadInt32(); + assetDependencyCache = new Dictionary( cacheSize ); + + for( int i = 0; i < cacheSize; i++ ) + { + string assetPath = reader.ReadString(); + string hash = reader.ReadString(); + + int dependenciesLength = reader.ReadInt32(); + string[] dependencies = new string[dependenciesLength]; + long[] fileSizes = new long[dependenciesLength]; + for( int j = 0; j < dependenciesLength; j++ ) + { + dependencies[j] = reader.ReadString(); + fileSizes[j] = reader.ReadInt64(); + } + + assetDependencyCache[assetPath] = new CacheEntry( hash, dependencies, fileSizes ); + } + } + catch( Exception e ) + { + assetDependencyCache = null; + Debug.LogWarning( "Couldn't load cache (probably cache format has changed in an update), will regenerate cache.\n" + e.ToString() ); + } + } + } + + // Generate cache for all assets for the first time + if( assetDependencyCache == null ) + { + assetDependencyCache = new Dictionary( 1024 * 8 ); + + string[] allAssets = AssetDatabase.GetAllAssetPaths(); + if( allAssets.Length > 0 ) + { + double startTime = EditorApplication.timeSinceStartup; + + try + { + for( int i = 0; i < allAssets.Length; i++ ) + { + if( i % 30 == 0 && EditorUtility.DisplayCancelableProgressBar( "Please wait...", "Generating cache for the first time (optional)", (float) i / allAssets.Length ) ) + { + EditorUtility.ClearProgressBar(); + Debug.LogWarning( "Initial cache generation cancelled, cache will be generated on the fly as more and more assets are searched." ); + break; + } + + assetDependencyCache[allAssets[i]] = new CacheEntry( allAssets[i] ); + } + + EditorUtility.ClearProgressBar(); + + Debug.Log( "Cache generated in " + ( EditorApplication.timeSinceStartup - startTime ).ToString( "F2" ) + " seconds" ); + Debug.Log( "You can always reset the cache by deleting " + Path.GetFullPath( CachePath ) ); + + SaveCache(); + } + catch( Exception e ) + { + EditorUtility.ClearProgressBar(); + Debug.LogException( e ); + } + } + } + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/AssetUsageDetector/Editor/AssetUsageDetectorCache.cs.meta b/Assets/Plugins/AssetUsageDetector/Editor/AssetUsageDetectorCache.cs.meta new file mode 100644 index 00000000..3d8d8965 --- /dev/null +++ b/Assets/Plugins/AssetUsageDetector/Editor/AssetUsageDetectorCache.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 71ea9a3fd0b82594d8130d882dbfc844 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/AssetUsageDetector/Editor/AssetUsageDetectorSearchFunctions.cs b/Assets/Plugins/AssetUsageDetector/Editor/AssetUsageDetectorSearchFunctions.cs new file mode 100644 index 00000000..e978d589 --- /dev/null +++ b/Assets/Plugins/AssetUsageDetector/Editor/AssetUsageDetectorSearchFunctions.cs @@ -0,0 +1,1962 @@ +using System; +using System.Collections.Generic; +using System.Collections; +using System.IO; +using System.Reflection; +using System.Text; +using UnityEditor; +using UnityEditor.Animations; +using UnityEngine; +using UnityEngine.UI; +#if UNITY_2017_1_OR_NEWER +using UnityEngine.U2D; +using UnityEngine.Playables; +#endif +#if UNITY_2018_2_OR_NEWER +using UnityEditor.U2D; +#endif +#if UNITY_2017_3_OR_NEWER +using UnityEditor.Compilation; +#endif +#if UNITY_2017_2_OR_NEWER +using UnityEngine.Tilemaps; +#endif +#if ASSET_USAGE_ADDRESSABLES +using UnityEngine.AddressableAssets; +#endif +using Object = UnityEngine.Object; + +namespace AssetUsageDetectorNamespace +{ + public partial class AssetUsageDetector + { + #region Helper Classes +#if UNITY_2017_3_OR_NEWER +#pragma warning disable 0649 // The fields' values are assigned via JsonUtility + [Serializable] + private struct AssemblyDefinitionReferences + { + public string reference; // Used by AssemblyDefinitionReferenceAssets + public List references; // Used by AssemblyDefinitionAssets + } +#pragma warning restore 0649 +#endif + +#if UNITY_2018_1_OR_NEWER +#pragma warning disable 0649 // The fields' values are assigned via JsonUtility + [Serializable] + private struct ShaderGraphReferences // Used by old Shader Graph serialization format + { + [Serializable] + public struct JSONHolder + { + public string JSONnodeData; + } + + [Serializable] + public class TextureHolder + { + public string m_SerializedTexture; + public string m_SerializedCubemap; + public string m_Guid; + + public string GetTexturePath() + { + string guid = ExtractGUIDFromString( !string.IsNullOrEmpty( m_SerializedTexture ) ? m_SerializedTexture : m_SerializedCubemap ); + if( string.IsNullOrEmpty( guid ) ) + guid = m_Guid; + + return string.IsNullOrEmpty( guid ) ? null : AssetDatabase.GUIDToAssetPath( guid ); + } + } + + [Serializable] + public struct PropertyData + { + public string m_Name; + public string m_DefaultReferenceName; + public string m_OverrideReferenceName; + public TextureHolder m_Value; + + public string GetName() + { + if( !string.IsNullOrEmpty( m_OverrideReferenceName ) ) + return m_OverrideReferenceName; + if( !string.IsNullOrEmpty( m_DefaultReferenceName ) ) + return m_DefaultReferenceName; + if( !string.IsNullOrEmpty( m_Name ) ) + return m_Name; + + return "Property"; + } + } + + [Serializable] + public struct NodeData + { + public string m_Name; + public string m_FunctionSource; // Custom Function node's Source field + public string m_SerializedSubGraph; // Sub-graph node + public List m_SerializableSlots; + + public string GetSubGraphPath() + { + string guid = ExtractGUIDFromString( m_SerializedSubGraph ); + return string.IsNullOrEmpty( guid ) ? null : AssetDatabase.GUIDToAssetPath( guid ); + } + } + + [Serializable] + public struct NodeSlotData + { + public TextureHolder m_Texture; + public TextureHolder m_TextureArray; + public TextureHolder m_Cubemap; + + public string GetTexturePath() + { + if( m_Texture != null ) + return m_Texture.GetTexturePath(); + if( m_Cubemap != null ) + return m_Cubemap.GetTexturePath(); + if( m_TextureArray != null ) + return m_TextureArray.GetTexturePath(); + + return null; + } + } + + public List m_SerializedProperties; + public List m_SerializableNodes; + + // String can be in one of the following formats: + // "guid":"GUID_VALUE" + // "guid": "GUID_VALUE" + // "guid" : "GUID_VALUE" + private static string ExtractGUIDFromString( string str ) + { + if( !string.IsNullOrEmpty( str ) ) + { + int guidStartIndex = str.IndexOf( "\"guid\"" ); + if( guidStartIndex >= 0 ) + { + guidStartIndex += 6; + guidStartIndex = str.IndexOf( '"', guidStartIndex ); + if( guidStartIndex > 0 ) + { + guidStartIndex++; + + int guidEndIndex = str.IndexOf( '"', guidStartIndex ); + if( guidEndIndex > 0 ) + return str.Substring( guidStartIndex, guidEndIndex - guidStartIndex ); + } + } + } + + return null; + } + } +#pragma warning restore 0649 +#endif + #endregion + + // Dictionary to quickly find the function to search a specific type with + private Dictionary> typeToSearchFunction; + // Dictionary to associate special file extensions with their search functions + private Dictionary> extensionToSearchFunction; + + // An optimization to fetch & filter fields and properties of a class only once + private readonly Dictionary typeToVariables = new Dictionary( 4096 ); + private readonly List validVariables = new List( 32 ); + + // All MonoScripts in objectsToSearchSet + private readonly List monoScriptsToSearch = new List(); + private readonly List monoScriptsToSearchTypes = new List(); + + // Path(s) of .cginc, .cg, .hlsl and .glslinc assets in assetsToSearchSet + private readonly HashSet shaderIncludesToSearchSet = new HashSet(); + +#if UNITY_2017_3_OR_NEWER + // Path(s) of the Assembly Definition Files in objectsToSearchSet (Value: files themselves) + private readonly Dictionary assemblyDefinitionFilesToSearch = new Dictionary( 8 ); +#endif + + // An optimization to fetch an animation clip's curve bindings only once + private readonly Dictionary animationClipUniqueBindings = new Dictionary( 256 ); + + private bool searchPrefabConnections; + private bool searchMonoBehavioursForScript; + private bool searchTextureReferences; +#if UNITY_2018_1_OR_NEWER + private bool searchShaderGraphsForSubGraphs; +#endif + + private bool searchSerializableVariablesOnly; + private bool prevSearchSerializableVariablesOnly; + + private BindingFlags fieldModifiers, propertyModifiers; + private BindingFlags prevFieldModifiers, prevPropertyModifiers; + + // Unity's internal function that returns a SerializedProperty's corresponding FieldInfo + private delegate FieldInfo FieldInfoGetter( SerializedProperty p, out Type t ); +#if UNITY_2019_3_OR_NEWER + private readonly FieldInfoGetter fieldInfoGetter = (FieldInfoGetter) Delegate.CreateDelegate( typeof( FieldInfoGetter ), typeof( Editor ).Assembly.GetType( "UnityEditor.ScriptAttributeUtility" ).GetMethod( "GetFieldInfoAndStaticTypeFromProperty", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static ) ); +#else + private readonly FieldInfoGetter fieldInfoGetter = (FieldInfoGetter) Delegate.CreateDelegate( typeof( FieldInfoGetter ), typeof( Editor ).Assembly.GetType( "UnityEditor.ScriptAttributeUtility" ).GetMethod( "GetFieldInfoFromProperty", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static ) ); +#endif + + private readonly Func lightmapSettingsGetter = (Func) Delegate.CreateDelegate( typeof( Func ), typeof( LightmapEditorSettings ).GetMethod( "GetLightmapSettings", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static ) ); + private readonly Func renderSettingsGetter = (Func) Delegate.CreateDelegate( typeof( Func ), typeof( RenderSettings ).GetMethod( "GetRenderSettings", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static ) ); +#if UNITY_2021_2_OR_NEWER + private readonly Func defaultReflectionProbeGetter = (Func) Delegate.CreateDelegate( typeof( Func ), typeof( RenderSettings ).GetProperty( "defaultReflection", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static ).GetGetMethod( true ) ); +#endif + +#if ASSET_USAGE_ADDRESSABLES + private readonly Func spriteAtlasPackedSpritesGetter = (Func) Delegate.CreateDelegate( typeof( Func ), typeof( SpriteAtlasExtensions ).GetMethod( "GetPackedSprites", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static ) ); + private readonly PropertyInfo assetReferenceSubObjectTypeGetter = typeof( AssetReference ).GetProperty( "SubOjbectType", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance ); +#endif + +#if ASSET_USAGE_VFX_GRAPH + private static Type vfxResourceType => typeof( Editor ).Assembly.GetType( "UnityEditor.VFX.VisualEffectResource" ) ?? Array.Find( AppDomain.CurrentDomain.GetAssemblies(), ( assembly ) => assembly.GetName().Name == "UnityEditor.VFXModule" ).GetType( "UnityEditor.VFX.VisualEffectResource" ); + private readonly Func vfxResourceGetter = (Func) Delegate.CreateDelegate( typeof( Func ), vfxResourceType.GetMethod( "GetResourceAtPath", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static ) ); + private readonly MethodInfo vfxResourceContentsGetter = vfxResourceType.GetMethod( "GetContents", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance ); + private readonly MethodInfo vfxSerializableObjectValueGetter = Array.Find( Array.Find( AppDomain.CurrentDomain.GetAssemblies(), ( assembly ) => assembly.GetName().Name == "Unity.VisualEffectGraph.Editor" ).GetType( "UnityEditor.VFX.VFXSerializableObject" ).GetMethods( BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance ), ( methodInfo ) => methodInfo.Name == "Get" && !methodInfo.IsGenericMethod ); +#endif + + private void InitializeSearchFunctionsData( Parameters searchParameters ) + { + if( typeToSearchFunction == null ) + { + typeToSearchFunction = new Dictionary>() + { + { typeof( GameObject ), SearchGameObject }, + { typeof( Material ), SearchMaterial }, + { typeof( Shader ), SearchShader }, + { typeof( MonoScript ), SearchMonoScript }, + { typeof( RuntimeAnimatorController ), SearchAnimatorController }, + { typeof( AnimatorOverrideController ), SearchAnimatorController }, + { typeof( AnimatorController ), SearchAnimatorController }, + { typeof( AnimatorStateMachine ), SearchAnimatorStateMachine }, + { typeof( AnimatorState ), SearchAnimatorState }, + { typeof( AnimatorStateTransition ), SearchAnimatorStateTransition }, + { typeof( BlendTree ), SearchBlendTree }, + { typeof( AnimationClip ), SearchAnimationClip }, + { typeof( TerrainData ), SearchTerrainData }, + { typeof( LightmapSettings ), SearchLightmapSettings }, + { typeof( RenderSettings ), SearchRenderSettings }, +#if UNITY_2017_1_OR_NEWER + { typeof( SpriteAtlas ), SearchSpriteAtlas }, +#endif + }; + } + + if( extensionToSearchFunction == null ) + { + extensionToSearchFunction = new Dictionary>() + { + { "compute", SearchShaderSecondaryAsset }, + { "cginc", SearchShaderSecondaryAsset }, + { "cg", SearchShaderSecondaryAsset }, + { "glslinc", SearchShaderSecondaryAsset }, + { "hlsl", SearchShaderSecondaryAsset }, +#if UNITY_2017_3_OR_NEWER + { "asmdef", SearchAssemblyDefinitionFile }, +#endif +#if UNITY_2019_2_OR_NEWER + { "asmref", SearchAssemblyDefinitionFile }, +#endif +#if UNITY_2018_1_OR_NEWER + { "shadergraph", SearchShaderGraph }, + { "shadersubgraph", SearchShaderGraph }, +#endif +#if ASSET_USAGE_VFX_GRAPH + { "vfx", SearchVFXGraphAsset }, + { "vfxoperator", SearchVFXGraphAsset }, + { "vfxblock", SearchVFXGraphAsset }, +#endif + }; + } + + fieldModifiers = searchParameters.fieldModifiers | BindingFlags.Instance | BindingFlags.DeclaredOnly; + propertyModifiers = searchParameters.propertyModifiers | BindingFlags.Instance | BindingFlags.DeclaredOnly; + searchSerializableVariablesOnly = !searchParameters.searchNonSerializableVariables; + + if( prevFieldModifiers != fieldModifiers || prevPropertyModifiers != propertyModifiers || prevSearchSerializableVariablesOnly != searchSerializableVariablesOnly ) + typeToVariables.Clear(); + + prevFieldModifiers = fieldModifiers; + prevPropertyModifiers = propertyModifiers; + prevSearchSerializableVariablesOnly = searchSerializableVariablesOnly; + + searchPrefabConnections = false; + searchMonoBehavioursForScript = false; + searchTextureReferences = false; +#if UNITY_2018_1_OR_NEWER + searchShaderGraphsForSubGraphs = false; +#endif +#if ASSET_USAGE_VFX_GRAPH + bool searchVFXGraphs = false; +#endif + + foreach( Object obj in objectsToSearchSet ) + { + if( obj is Texture || obj is Sprite ) + searchTextureReferences = true; + else if( obj is MonoScript ) + { + searchMonoBehavioursForScript = true; + + Type monoScriptType = ( (MonoScript) obj ).GetClass(); + if( monoScriptType != null && !monoScriptType.IsSealed ) + { + monoScriptsToSearch.Add( (MonoScript) obj ); + monoScriptsToSearchTypes.Add( monoScriptType ); + } + } + else if( obj is GameObject ) + searchPrefabConnections = true; +#if UNITY_2017_3_OR_NEWER + else if( obj is UnityEditorInternal.AssemblyDefinitionAsset ) + assemblyDefinitionFilesToSearch[AssetDatabase.GetAssetPath( obj )] = obj; +#endif +#if ASSET_USAGE_VFX_GRAPH + else if( !searchVFXGraphs && ( obj is Shader || obj is Mesh || obj.GetType().Name.StartsWithFast( "PointCache" ) || obj.GetType().Name == "ShaderGraphVfxAsset" ) ) + searchVFXGraphs = true; +#endif + } + + // We need to search for class/interface inheritance references manually because AssetDatabase.GetDependencies doesn't take that into account + if( monoScriptsToSearch.Count > 0 ) + { + alwaysSearchedExtensionsSet.Add( "cs" ); + alwaysSearchedExtensionsSet.Add( "dll" ); + } + + foreach( string path in assetsToSearchPathsSet ) + { + string extension = Utilities.GetFileExtension( path ); + if( extension == "hlsl" || extension == "cginc" || extension == "cg" || extension == "glslinc" ) + shaderIncludesToSearchSet.Add( path ); +#if UNITY_2018_1_OR_NEWER + else if( extension == "shadersubgraph" ) + searchShaderGraphsForSubGraphs = true; +#endif + } + + // AssetDatabase.GetDependencies doesn't take #include lines in shader source codes into consideration. If we are searching for references + // of a potential #include target (shaderIncludesToSearchSet), we must search all shader assets and check their #include lines manually + if( shaderIncludesToSearchSet.Count > 0 ) + { + alwaysSearchedExtensionsSet.Add( "shader" ); + alwaysSearchedExtensionsSet.Add( "compute" ); + alwaysSearchedExtensionsSet.Add( "cginc" ); + alwaysSearchedExtensionsSet.Add( "cg" ); + alwaysSearchedExtensionsSet.Add( "glslinc" ); + alwaysSearchedExtensionsSet.Add( "hlsl" ); + } + +#if UNITY_2017_3_OR_NEWER + // AssetDatabase.GetDependencies doesn't return references from Assembly Definition Files to their Assembly Definition References, + // so if we are searching for an Assembly Definition File's usages, we must search all Assembly Definition Files' references manually. + if( assemblyDefinitionFilesToSearch.Count > 0 ) + { + alwaysSearchedExtensionsSet.Add( "asmdef" ); +#if UNITY_2019_2_OR_NEWER + alwaysSearchedExtensionsSet.Add( "asmref" ); +#endif + } +#endif + +#if UNITY_2018_1_OR_NEWER + // AssetDatabase.GetDependencies doesn't work with Shader Graph assets. We must search all Shader Graph assets in the following cases: + // searchTextureReferences: to find Texture references used in various nodes and properties + // searchShaderGraphsForSubGraphs: to find Shader Sub-graph references in other Shader Graph assets + // shaderIncludesToSearchSet: to find .cginc, .cg, .glslinc and .hlsl references used in Custom Function nodes + if( searchTextureReferences || searchShaderGraphsForSubGraphs || shaderIncludesToSearchSet.Count > 0 ) + { + alwaysSearchedExtensionsSet.Add( "shadergraph" ); + alwaysSearchedExtensionsSet.Add( "shadersubgraph" ); + } +#endif + +#if ASSET_USAGE_VFX_GRAPH + if( searchTextureReferences || searchVFXGraphs ) + { + alwaysSearchedExtensionsSet.Add( "vfx" ); + alwaysSearchedExtensionsSet.Add( "vfxoperator" ); + alwaysSearchedExtensionsSet.Add( "vfxblock" ); + } +#endif + } + + private ReferenceNode SearchGameObject( object obj ) + { + GameObject go = (GameObject) obj; + ReferenceNode referenceNode = PopReferenceNode( go ); + + // Check if this GameObject's prefab is one of the selected assets + if( searchPrefabConnections ) + { +#if UNITY_2018_3_OR_NEWER + Object prefab = go; + while( prefab = PrefabUtility.GetCorrespondingObjectFromSource( prefab ) ) +#else + Object prefab = PrefabUtility.GetPrefabParent( go ); + if( prefab ) +#endif + { + if( objectsToSearchSet.Contains( prefab ) && assetsToSearchRootPrefabs.ContainsFast( prefab as GameObject ) ) + { + referenceNode.AddLinkTo( GetReferenceNode( prefab ), "Prefab object" ); + + if( searchParameters.searchRefactoring != null ) + searchParameters.searchRefactoring( new PrefabMatch( go, prefab ) ); + } + } + } + + // Search through all the components of the object + Component[] components = go.GetComponents(); + for( int i = 0; i < components.Length; i++ ) + referenceNode.AddLinkTo( SearchObject( components[i] ), isWeakLink: true ); + + return referenceNode; + } + + private ReferenceNode SearchComponent( object obj ) + { + Component component = (Component) obj; + + // Ignore Transform component (no object field to search for) + if( component is Transform ) + return null; + + ReferenceNode referenceNode = PopReferenceNode( component ); + + if( searchMonoBehavioursForScript && component is MonoBehaviour ) + { + // If a searched asset is script, check if this component is an instance of it + // Although SearchVariablesWithSerializedObject can detect these references with SerializedObject, it isn't possible when reflection is used in Play mode + MonoScript script = MonoScript.FromMonoBehaviour( (MonoBehaviour) component ); + if( objectsToSearchSet.Contains( script ) ) + { + referenceNode.AddLinkTo( GetReferenceNode( script ) ); + + if( searchParameters.searchRefactoring != null ) + searchParameters.searchRefactoring( new BehaviourUsageMatch( component.gameObject, script, component ) ); + } + } + + if( component is Animation ) + { + // Search animation clips for references + if( searchParameters.searchRefactoring == null ) + { + foreach( AnimationState anim in (Animation) component ) + referenceNode.AddLinkTo( SearchObject( anim.clip ) ); + } + else + { + AnimationClip[] clips = AnimationUtility.GetAnimationClips( component.gameObject ); + bool modifiedClips = false; + for( int i = 0; i < clips.Length; i++ ) + { + referenceNode.AddLinkTo( SearchObject( clips[i] ) ); + + if( objectsToSearchSet.Contains( clips[i] ) ) + { + searchParameters.searchRefactoring( new AnimationSystemMatch( component, clips[i], ( newValue ) => + { + clips[i] = (AnimationClip) newValue; + modifiedClips = true; + } ) ); + } + } + + if( modifiedClips ) + AnimationUtility.SetAnimationClips( (Animation) component, clips ); + } + + // Search the objects that are animated by this Animation component for references + SearchAnimatedObjects( referenceNode ); + } + else if( component is Animator ) + { + // Search animation clips for references (via AnimatorController) + RuntimeAnimatorController animatorController = ( (Animator) component ).runtimeAnimatorController; + referenceNode.AddLinkTo( SearchObject( animatorController ) ); + + if( searchParameters.searchRefactoring != null && objectsToSearchSet.Contains( animatorController ) ) + searchParameters.searchRefactoring( new AnimationSystemMatch( component, animatorController, ( newValue ) => ( (Animator) component ).runtimeAnimatorController = (RuntimeAnimatorController) newValue ) ); + + // Search the objects that are animated by this Animator component for references + SearchAnimatedObjects( referenceNode ); + } +#if UNITY_2017_2_OR_NEWER + else if( component is Tilemap ) + { + // Search the tiles for references + TileBase[] tiles = new TileBase[( (Tilemap) component ).GetUsedTilesCount()]; + ( (Tilemap) component ).GetUsedTilesNonAlloc( tiles ); + + if( tiles != null ) + { + for( int i = 0; i < tiles.Length; i++ ) + { + referenceNode.AddLinkTo( SearchObject( tiles[i] ), "Tile" ); + + if( searchParameters.searchRefactoring != null && objectsToSearchSet.Contains( tiles[i] ) ) + searchParameters.searchRefactoring( new OtherSearchMatch( component, tiles[i], ( newValue ) => ( (Tilemap) component ).SwapTile( tiles[i], (TileBase) newValue ) ) ); + } + } + } +#endif +#if UNITY_2017_1_OR_NEWER + else if( component is PlayableDirector ) + { + // Search the PlayableAsset's scene bindings for references + PlayableAsset playableAsset = ( (PlayableDirector) component ).playableAsset; + if( playableAsset != null && !playableAsset.Equals( null ) ) + { + foreach( PlayableBinding binding in playableAsset.outputs ) + { + Object bindingValue = ( (PlayableDirector) component ).GetGenericBinding( binding.sourceObject ); + referenceNode.AddLinkTo( SearchObject( bindingValue ), "Binding: " + binding.streamName ); + + if( searchParameters.searchRefactoring != null && objectsToSearchSet.Contains( bindingValue ) ) + searchParameters.searchRefactoring( new AnimationSystemMatch( component, bindingValue, ( newValue ) => ( (PlayableDirector) component ).SetGenericBinding( binding.sourceObject, newValue ) ) ); + } + } + } +#endif + else if( component is ParticleSystemRenderer ) + { + // Search ParticleSystemRenderer's custom meshes for references (at runtime, they can't be searched with reflection, unfortunately) + if( isInPlayMode && !AssetDatabase.Contains( component ) ) + { + Mesh[] meshes = new Mesh[( (ParticleSystemRenderer) component ).meshCount]; + int meshCount = ( (ParticleSystemRenderer) component ).GetMeshes( meshes ); + bool modifiedMeshes = false; + for( int i = 0; i < meshCount; i++ ) + { + referenceNode.AddLinkTo( SearchObject( meshes[i] ), "Renderer Module: Mesh" ); + + if( searchParameters.searchRefactoring != null && objectsToSearchSet.Contains( meshes[i] ) ) + { + searchParameters.searchRefactoring( new OtherSearchMatch( component, meshes[i], ( newValue ) => + { + meshes[i] = (Mesh) newValue; + modifiedMeshes = true; + } ) ); + } + } + + if( modifiedMeshes ) + ( (ParticleSystemRenderer) component ).SetMeshes( meshes, meshCount ); + } + } + else if( component is ParticleSystem ) + { + // At runtime, some ParticleSystem properties can't be searched with reflection, search them manually here + if( isInPlayMode && !AssetDatabase.Contains( component ) ) + { + ParticleSystem particleSystem = (ParticleSystem) component; + + try + { + ParticleSystem.CollisionModule collisionModule = particleSystem.collision; +#if UNITY_2020_2_OR_NEWER + for( int i = 0, j = collisionModule.planeCount; i < j; i++ ) +#else + for( int i = 0, j = collisionModule.maxPlaneCount; i < j; i++ ) +#endif + { + Transform plane = collisionModule.GetPlane( i ); + referenceNode.AddLinkTo( SearchObject( plane ), "Collision Module: Plane" ); + + if( searchParameters.searchRefactoring != null && objectsToSearchSet.Contains( plane ) ) + searchParameters.searchRefactoring( new OtherSearchMatch( collisionModule, plane, component, ( newValue ) => collisionModule.SetPlane( i, (Transform) newValue ) ) ); + } + } + catch { } + + try + { + ParticleSystem.TriggerModule triggerModule = particleSystem.trigger; +#if UNITY_2020_2_OR_NEWER + for( int i = 0, j = triggerModule.colliderCount; i < j; i++ ) +#else + for( int i = 0, j = triggerModule.maxColliderCount; i < j; i++ ) +#endif + { + Component collider = triggerModule.GetCollider( i ); + referenceNode.AddLinkTo( SearchObject( collider ), "Trigger Module: Collider" ); + + if( searchParameters.searchRefactoring != null && objectsToSearchSet.Contains( collider ) ) + searchParameters.searchRefactoring( new OtherSearchMatch( triggerModule, collider, component, ( newValue ) => triggerModule.SetCollider( i, (Component) newValue ) ) ); + } + } + catch { } + +#if UNITY_2017_1_OR_NEWER + try + { + ParticleSystem.TextureSheetAnimationModule textureSheetAnimationModule = particleSystem.textureSheetAnimation; + for( int i = 0, j = textureSheetAnimationModule.spriteCount; i < j; i++ ) + { + Sprite sprite = textureSheetAnimationModule.GetSprite( i ); + referenceNode.AddLinkTo( SearchObject( sprite ), "Texture Sheet Animation Module: Sprite" ); + + if( searchParameters.searchRefactoring != null && objectsToSearchSet.Contains( sprite ) ) + searchParameters.searchRefactoring( new OtherSearchMatch( textureSheetAnimationModule, sprite, component, ( newValue ) => textureSheetAnimationModule.SetSprite( i, (Sprite) newValue ) ) ); + } + } + catch { } +#endif + +#if UNITY_5_5_OR_NEWER + try + { + ParticleSystem.SubEmittersModule subEmittersModule = particleSystem.subEmitters; + for( int i = 0, j = subEmittersModule.subEmittersCount; i < j; i++ ) + { + ParticleSystem subEmitterSystem = subEmittersModule.GetSubEmitterSystem( i ); + referenceNode.AddLinkTo( SearchObject( subEmitterSystem ), "Sub Emitters Module: ParticleSystem" ); + + if( searchParameters.searchRefactoring != null && objectsToSearchSet.Contains( subEmitterSystem ) ) + searchParameters.searchRefactoring( new OtherSearchMatch( subEmittersModule, subEmitterSystem, component, ( newValue ) => subEmittersModule.SetSubEmitterSystem( i, (ParticleSystem) newValue ) ) ); + } + } + catch { } +#endif + } + } + + SearchVariablesWithSerializedObject( referenceNode ); + return referenceNode; + } + + private ReferenceNode SearchMaterial( object obj ) + { + const string TEXTURE_PROPERTY_PREFIX = "m_SavedProperties.m_TexEnvs["; + + Material material = (Material) obj; + ReferenceNode referenceNode = PopReferenceNode( material ); + + // We used to search only the shader and the Texture properties in this function but it has changed for 2 major reasons: + // 1) Materials can store more than these references now. For example, HDRP materials can have references to other HDRP materials + // 2) It wasn't possible to search Texture properties that were no longer used by the shader + // Thus, we are searching every property of the material using SerializedObject + SearchVariablesWithSerializedObject( referenceNode ); + + // Post-process the found results and convert links that start with TEXTURE_PROPERTY_PREFIX to their readable names + SerializedObject materialSO = null; + for( int i = referenceNode.NumberOfOutgoingLinks - 1; i >= 0; i-- ) + { + List linkDescriptions = referenceNode[i].descriptions; + for( int j = linkDescriptions.Count - 1; j >= 0; j-- ) + { + int texturePropertyPrefixIndex = linkDescriptions[j].IndexOf( TEXTURE_PROPERTY_PREFIX ); + if( texturePropertyPrefixIndex >= 0 ) + { + texturePropertyPrefixIndex += TEXTURE_PROPERTY_PREFIX.Length; + int texturePropertyEndIndex = linkDescriptions[j].IndexOf( ']', texturePropertyPrefixIndex ); + if( texturePropertyEndIndex > texturePropertyPrefixIndex ) + { + int texturePropertyIndex; + if( int.TryParse( linkDescriptions[j].Substring( texturePropertyPrefixIndex, texturePropertyEndIndex - texturePropertyPrefixIndex ), out texturePropertyIndex ) ) + { + if( materialSO == null ) + materialSO = new SerializedObject( material ); + + string propertyName = materialSO.FindProperty( "m_SavedProperties.m_TexEnvs.Array.data[" + texturePropertyIndex + "].first" ).stringValue; + if( material.HasProperty( propertyName ) ) + linkDescriptions[j] = "[Property: " + propertyName + "]"; + else if( searchParameters.searchUnusedMaterialProperties ) + { + // Move unused references to the end of the list so that used references come first + linkDescriptions.Add( "[Property (UNUSED): " + propertyName + "]" ); + linkDescriptions.RemoveAt( j ); + } + else + linkDescriptions.RemoveAt( j ); + } + } + } + } + + if( linkDescriptions.Count == 0 ) // All shader properties were unused and we weren't searching for unused material properties + referenceNode.RemoveLink( i ); + } + + // At runtime, Textures assigned to clone materials can't be searched with reflection, search them manually here + if( searchTextureReferences && isInPlayMode && !AssetDatabase.Contains( material ) ) + { + Shader shader = material.shader; + int shaderPropertyCount = ShaderUtil.GetPropertyCount( shader ); + for( int i = 0; i < shaderPropertyCount; i++ ) + { + if( ShaderUtil.GetPropertyType( shader, i ) == ShaderUtil.ShaderPropertyType.TexEnv ) + { + string propertyName = ShaderUtil.GetPropertyName( shader, i ); + Texture assignedTexture = material.GetTexture( propertyName ); + if( objectsToSearchSet.Contains( assignedTexture ) ) + { + referenceNode.AddLinkTo( GetReferenceNode( assignedTexture ), "Shader property: " + propertyName ); + + if( searchParameters.searchRefactoring != null ) + searchParameters.searchRefactoring( new OtherSearchMatch( material, assignedTexture, ( newValue ) => material.SetTexture( propertyName, (Texture) newValue ) ) ); + } + } + } + } + + return referenceNode; + } + + // Searches default Texture values assigned to shader properties, as well as #include references in shader source code + private ReferenceNode SearchShader( object obj ) + { + Shader shader = (Shader) obj; + ReferenceNode referenceNode = PopReferenceNode( shader ); + + if( searchTextureReferences ) + { + ShaderImporter shaderImporter = AssetImporter.GetAtPath( AssetDatabase.GetAssetPath( shader ) ) as ShaderImporter; + if( shaderImporter != null ) + { + int shaderPropertyCount = ShaderUtil.GetPropertyCount( shader ); + for( int i = 0; i < shaderPropertyCount; i++ ) + { + if( ShaderUtil.GetPropertyType( shader, i ) == ShaderUtil.ShaderPropertyType.TexEnv ) + { + string propertyName = ShaderUtil.GetPropertyName( shader, i ); + Texture defaultTexture = shaderImporter.GetDefaultTexture( propertyName ); +#if UNITY_2018_1_OR_NEWER + if( !defaultTexture ) + defaultTexture = shaderImporter.GetNonModifiableTexture( propertyName ); +#endif + + if( objectsToSearchSet.Contains( defaultTexture ) ) + { + referenceNode.AddLinkTo( GetReferenceNode( defaultTexture ), "Default Texture: " + propertyName ); + + if( searchParameters.searchRefactoring != null ) + searchParameters.searchRefactoring( new AssetImporterDefaultValueMatch( shaderImporter, defaultTexture, propertyName, null ) ); + } + } + } + } + } + + // Search shader source code for #include references + if( shaderIncludesToSearchSet.Count > 0 ) + SearchShaderSourceCodeForCGIncludes( referenceNode ); + + return referenceNode; + } + + // Searches .compute, .cginc, .cg, .hlsl and .glslinc assets for #include references + private ReferenceNode SearchShaderSecondaryAsset( object obj ) + { + if( shaderIncludesToSearchSet.Count == 0 ) + return null; + + ReferenceNode referenceNode = PopReferenceNode( obj ); + SearchShaderSourceCodeForCGIncludes( referenceNode ); + return referenceNode; + } + + // Searches class/interface inheritances and default UnityEngine.Object values assigned to script variables + private ReferenceNode SearchMonoScript( object obj ) + { + MonoScript script = (MonoScript) obj; + Type scriptType = script.GetClass(); + if( scriptType == null || ( !scriptType.IsSubclassOf( typeof( MonoBehaviour ) ) && !scriptType.IsSubclassOf( typeof( ScriptableObject ) ) ) ) + return null; + + ReferenceNode referenceNode = PopReferenceNode( script ); + + // Check for class/interface inheritance references + for( int i = monoScriptsToSearch.Count - 1; i >= 0; i-- ) + { + if( monoScriptsToSearchTypes[i] != scriptType && monoScriptsToSearchTypes[i].IsAssignableFrom( scriptType ) ) + referenceNode.AddLinkTo( GetReferenceNode( monoScriptsToSearch[i] ), monoScriptsToSearchTypes[i].IsInterface ? "Implements interface" : "Extends class" ); + } + + MonoImporter scriptImporter = AssetImporter.GetAtPath( AssetDatabase.GetAssetPath( script ) ) as MonoImporter; + if( scriptImporter != null ) + { + VariableGetterHolder[] variables = GetFilteredVariablesForType( scriptType ); + for( int i = 0; i < variables.Length; i++ ) + { + if( variables[i].isSerializable && !variables[i].IsProperty ) + { + Object defaultValue = scriptImporter.GetDefaultReference( variables[i].Name ); + if( objectsToSearchSet.Contains( defaultValue ) ) + { + referenceNode.AddLinkTo( GetReferenceNode( defaultValue ), "Default variable value: " + variables[i].Name ); + + if( searchParameters.searchRefactoring != null ) + searchParameters.searchRefactoring( new AssetImporterDefaultValueMatch( scriptImporter, defaultValue, variables[i].Name, variables ) ); + } + } + } + } + + return referenceNode; + } + + private ReferenceNode SearchAnimatorController( object obj ) + { + RuntimeAnimatorController controller = (RuntimeAnimatorController) obj; + ReferenceNode referenceNode = PopReferenceNode( controller ); + + if( controller is AnimatorController ) + { + AnimatorControllerLayer[] layers = ( (AnimatorController) controller ).layers; + for( int i = 0; i < layers.Length; i++ ) + { + if( objectsToSearchSet.Contains( layers[i].avatarMask ) ) + { + referenceNode.AddLinkTo( GetReferenceNode( layers[i].avatarMask ), layers[i].name + " Mask" ); + + if( searchParameters.searchRefactoring != null ) + searchParameters.searchRefactoring( new AnimationSystemMatch( layers[i], layers[i].avatarMask, controller, ( newValue ) => layers[i].avatarMask = (AvatarMask) newValue ) ); + } + + referenceNode.AddLinkTo( SearchObject( layers[i].stateMachine ) ); + } + } + else + { + if( controller is AnimatorOverrideController ) + { + RuntimeAnimatorController parentController = ( (AnimatorOverrideController) controller ).runtimeAnimatorController; + if( objectsToSearchSet.Contains( parentController ) ) + { + referenceNode.AddLinkTo( GetReferenceNode( parentController ) ); + + if( searchParameters.searchRefactoring != null ) + searchParameters.searchRefactoring( new AnimationSystemMatch( controller, parentController, ( newValue ) => ( (AnimatorOverrideController) controller ).runtimeAnimatorController = (RuntimeAnimatorController) newValue ) ); + } + + if( searchParameters.searchRefactoring != null ) + { + List> overrideClips = new List>( ( (AnimatorOverrideController) controller ).overridesCount ); + ( (AnimatorOverrideController) controller ).GetOverrides( overrideClips ); + bool modifiedOverrideClips = false; + for( int i = overrideClips.Count - 1; i >= 0; i-- ) + { + if( objectsToSearchSet.Contains( overrideClips[i].Value ) ) + { + searchParameters.searchRefactoring( new AnimationSystemMatch( controller, overrideClips[i].Value, ( newValue ) => + { + overrideClips[i] = new KeyValuePair( overrideClips[i].Key, (AnimationClip) newValue ); + modifiedOverrideClips = true; + } ) ); + } + } + + if( modifiedOverrideClips ) + ( (AnimatorOverrideController) controller ).ApplyOverrides( overrideClips ); + } + } + + AnimationClip[] animClips = controller.animationClips; + for( int i = 0; i < animClips.Length; i++ ) + referenceNode.AddLinkTo( SearchObject( animClips[i] ) ); + } + + return referenceNode; + } + + private ReferenceNode SearchAnimatorStateMachine( object obj ) + { + AnimatorStateMachine animatorStateMachine = (AnimatorStateMachine) obj; + ReferenceNode referenceNode = PopReferenceNode( animatorStateMachine ); + + ChildAnimatorStateMachine[] stateMachines = animatorStateMachine.stateMachines; + for( int i = 0; i < stateMachines.Length; i++ ) + referenceNode.AddLinkTo( SearchObject( stateMachines[i].stateMachine ), "Child State Machine" ); + + ChildAnimatorState[] states = animatorStateMachine.states; + for( int i = 0; i < states.Length; i++ ) + referenceNode.AddLinkTo( SearchObject( states[i].state ) ); + + if( searchMonoBehavioursForScript ) + { + StateMachineBehaviour[] behaviours = animatorStateMachine.behaviours; + for( int i = 0; i < behaviours.Length; i++ ) + { + MonoScript script = MonoScript.FromScriptableObject( behaviours[i] ); + if( objectsToSearchSet.Contains( script ) ) + { + referenceNode.AddLinkTo( GetReferenceNode( script ) ); + + if( searchParameters.searchRefactoring != null ) + searchParameters.searchRefactoring( new BehaviourUsageMatch( animatorStateMachine, script, behaviours[i] ) ); + } + } + } + + return referenceNode; + } + + private ReferenceNode SearchAnimatorState( object obj ) + { + AnimatorState animatorState = (AnimatorState) obj; + ReferenceNode referenceNode = PopReferenceNode( animatorState ); + + referenceNode.AddLinkTo( SearchObject( animatorState.motion ), "Motion" ); + + if( searchParameters.searchRefactoring != null && animatorState.motion as AnimationClip && objectsToSearchSet.Contains( animatorState.motion ) ) + searchParameters.searchRefactoring( new AnimationSystemMatch( animatorState, animatorState.motion, ( newValue ) => animatorState.motion = (Motion) newValue ) ); + + if( searchMonoBehavioursForScript ) + { + StateMachineBehaviour[] behaviours = animatorState.behaviours; + for( int i = 0; i < behaviours.Length; i++ ) + { + MonoScript script = MonoScript.FromScriptableObject( behaviours[i] ); + if( objectsToSearchSet.Contains( script ) ) + { + referenceNode.AddLinkTo( GetReferenceNode( script ) ); + + if( searchParameters.searchRefactoring != null ) + searchParameters.searchRefactoring( new BehaviourUsageMatch( animatorState, script, behaviours[i] ) ); + } + } + } + + return referenceNode; + } + + private ReferenceNode SearchAnimatorStateTransition( object obj ) + { + // Don't search AnimatorStateTransition objects, it will just return duplicate results of SearchAnimatorStateMachine + return PopReferenceNode( obj ); + } + + private ReferenceNode SearchBlendTree( object obj ) + { + BlendTree blendTree = (BlendTree) obj; + ReferenceNode referenceNode = PopReferenceNode( blendTree ); + + ChildMotion[] children = blendTree.children; + for( int i = 0; i < children.Length; i++ ) + { + referenceNode.AddLinkTo( SearchObject( children[i].motion ), "Motion" ); + + if( searchParameters.searchRefactoring != null && children[i].motion as AnimationClip && objectsToSearchSet.Contains( children[i].motion ) ) + searchParameters.searchRefactoring( new AnimationSystemMatch( blendTree, children[i].motion, ( newValue ) => children[i].motion = (Motion) newValue ) ); + } + + return referenceNode; + } + + private ReferenceNode SearchAnimationClip( object obj ) + { + AnimationClip clip = (AnimationClip) obj; + ReferenceNode referenceNode = PopReferenceNode( clip ); + + // Get all curves from animation clip + EditorCurveBinding[] objectCurves = AnimationUtility.GetObjectReferenceCurveBindings( clip ); + for( int i = 0; i < objectCurves.Length; i++ ) + { + // Search through all the keyframes in this curve + ObjectReferenceKeyframe[] keyframes = AnimationUtility.GetObjectReferenceCurve( clip, objectCurves[i] ); + bool modifiedKeyframes = false; + for( int j = 0; j < keyframes.Length; j++ ) + { + referenceNode.AddLinkTo( SearchObject( keyframes[j].value ), "Keyframe: " + keyframes[j].time ); + + if( searchParameters.searchRefactoring != null && objectsToSearchSet.Contains( keyframes[j].value ) ) + { + searchParameters.searchRefactoring( new AnimationSystemMatch( clip, keyframes[j].value, ( newValue ) => + { + keyframes[j].value = newValue; + modifiedKeyframes = true; + } ) ); + } + } + + if( modifiedKeyframes ) + AnimationUtility.SetObjectReferenceCurve( clip, objectCurves[i], keyframes ); + } + + // Get all events from animation clip + AnimationEvent[] events = AnimationUtility.GetAnimationEvents( clip ); + bool modifiedEvents = false; + for( int i = 0; i < events.Length; i++ ) + { + referenceNode.AddLinkTo( SearchObject( events[i].objectReferenceParameter ), "AnimationEvent: " + events[i].time ); + + if( searchParameters.searchRefactoring != null && objectsToSearchSet.Contains( events[i].objectReferenceParameter ) ) + { + searchParameters.searchRefactoring( new AnimationSystemMatch( clip, events[i].objectReferenceParameter, ( newValue ) => + { + events[i].objectReferenceParameter = newValue; + modifiedEvents = true; + } ) ); + } + } + + if( modifiedEvents ) + AnimationUtility.SetAnimationEvents( clip, events ); + + return referenceNode; + } + + // TerrainData's properties like tree/detail/layer definitions aren't exposed to SerializedObject so use reflection instead + private ReferenceNode SearchTerrainData( object obj ) + { + ReferenceNode referenceNode = PopReferenceNode( obj ); + SearchVariablesWithReflection( referenceNode ); + return referenceNode; + } + + private ReferenceNode SearchLightmapSettings( object obj ) + { + ReferenceNode referenceNode = PopReferenceNode( obj ); + + referenceNode.AddLinkTo( SearchObject( LightmapSettings.lightProbes ), "Light Probes" ); + + LightmapData[] lightmaps = LightmapSettings.lightmaps; + if( lightmaps != null ) + { + for( int i = 0; i < lightmaps.Length; i++ ) + referenceNode.AddLinkTo( SearchObject( lightmaps[i] ), "Lightmap" ); + } + + SearchVariablesWithSerializedObject( referenceNode, true ); + return referenceNode; + } + + private ReferenceNode SearchRenderSettings( object obj ) + { + ReferenceNode referenceNode = PopReferenceNode( obj ); + +#if UNITY_2021_2_OR_NEWER + referenceNode.AddLinkTo( SearchObject( defaultReflectionProbeGetter() ), "Default Reflection Probe" ); +#else + referenceNode.AddLinkTo( SearchObject( ReflectionProbe.defaultTexture ), "Default Reflection Probe" ); +#endif + SearchVariablesWithSerializedObject( referenceNode, true ); + return referenceNode; + } + +#if UNITY_2017_1_OR_NEWER + private ReferenceNode SearchSpriteAtlas( object obj ) + { + SpriteAtlas spriteAtlas = (SpriteAtlas) obj; + ReferenceNode referenceNode = PopReferenceNode( spriteAtlas ); + + SerializedObject spriteAtlasSO = new SerializedObject( spriteAtlas ); + if( spriteAtlas.isVariant ) + { + SerializedProperty masterAtlasProperty = spriteAtlasSO.FindProperty( "m_MasterAtlas" ); + Object masterAtlas = masterAtlasProperty.objectReferenceValue; + if( objectsToSearchSet.Contains( masterAtlas ) ) + { + referenceNode.AddLinkTo( SearchObject( masterAtlas ), "Master Atlas" ); + + if( searchParameters.searchRefactoring != null ) + searchParameters.searchRefactoring( new SerializedPropertyMatch( spriteAtlas, masterAtlas, masterAtlasProperty ) ); + } + } + + SerializedProperty packables = spriteAtlasSO.FindProperty( "m_EditorData.packables" ); + if( packables != null ) + { + for( int i = 0, length = packables.arraySize; i < length; i++ ) + { + SerializedProperty packedSpriteProperty = packables.GetArrayElementAtIndex( i ); + Object packedSprite = packedSpriteProperty.objectReferenceValue; + SearchSpriteAtlas( referenceNode, packedSprite ); + + if( searchParameters.searchRefactoring != null && objectsToSearchSet.Contains( packedSprite ) ) + searchParameters.searchRefactoring( new SerializedPropertyMatch( spriteAtlas, packedSprite, packedSpriteProperty ) ); + } + } +#if UNITY_2018_2_OR_NEWER + else + { + Object[] _packables = spriteAtlas.GetPackables(); + if( _packables != null ) + { + for( int i = 0; i < _packables.Length; i++ ) + SearchSpriteAtlas( referenceNode, _packables[i] ); + } + } +#endif + + return referenceNode; + } + + private void SearchSpriteAtlas( ReferenceNode referenceNode, Object packedAsset ) + { + if( packedAsset == null || packedAsset.Equals( null ) ) + return; + + referenceNode.AddLinkTo( SearchObject( packedAsset ), "Packed Texture" ); + + if( packedAsset is Texture ) + { + // Search the Texture's sprites if the Texture asset isn't included in the "SEARCHED OBJECTS" list (i.e. user has + // added only a Sprite sub-asset of the Texture to the list, not the Texture asset itself). Otherwise, references to + // both the Texture and its sprites will be found which can be considered as duplicate references + if( AssetDatabase.IsMainAsset( packedAsset ) && !assetsToSearchSet.Contains( packedAsset ) ) + { + Object[] textureSubAssets = AssetDatabase.LoadAllAssetRepresentationsAtPath( AssetDatabase.GetAssetPath( packedAsset ) ); + for( int i = 0; i < textureSubAssets.Length; i++ ) + { + if( textureSubAssets[i] is Sprite ) + referenceNode.AddLinkTo( SearchObject( textureSubAssets[i] ), "Packed Texture" ); + } + } + } + else if( packedAsset.IsFolder() ) + { + // Search all Sprites in the folder + string[] texturesInFolder = AssetDatabase.FindAssets( "t:Texture2D", new string[] { AssetDatabase.GetAssetPath( packedAsset ) } ); + if( texturesInFolder != null ) + { + for( int i = 0; i < texturesInFolder.Length; i++ ) + { + string texturePath = AssetDatabase.GUIDToAssetPath( texturesInFolder[i] ); + TextureImporter textureImporter = AssetImporter.GetAtPath( texturePath ) as TextureImporter; + if( textureImporter != null && textureImporter.textureType == TextureImporterType.Sprite ) + { + // Search the Texture and its sprites + SearchSpriteAtlas( referenceNode, AssetDatabase.LoadMainAssetAtPath( texturePath ) ); + } + } + } + } + } +#endif + +#if UNITY_2017_3_OR_NEWER + // Find references from an Assembly Definition File to its Assembly Definition References + private ReferenceNode SearchAssemblyDefinitionFile( object obj ) + { + if( assemblyDefinitionFilesToSearch.Count == 0 ) + return null; + + AssemblyDefinitionReferences assemblyDefinitionFile = JsonUtility.FromJson( ( (TextAsset) obj ).text ); + ReferenceNode referenceNode = PopReferenceNode( obj ); + + if( !string.IsNullOrEmpty( assemblyDefinitionFile.reference ) ) + { + if( assemblyDefinitionFile.references == null ) + assemblyDefinitionFile.references = new List( 1 ) { assemblyDefinitionFile.reference }; + else + assemblyDefinitionFile.references.Add( assemblyDefinitionFile.reference ); + } + + if( assemblyDefinitionFile.references != null ) + { + for( int i = 0; i < assemblyDefinitionFile.references.Count; i++ ) + { +#if UNITY_2019_1_OR_NEWER + string assemblyPath = CompilationPipeline.GetAssemblyDefinitionFilePathFromAssemblyReference( assemblyDefinitionFile.references[i] ); +#else + string assemblyPath = CompilationPipeline.GetAssemblyDefinitionFilePathFromAssemblyName( assemblyDefinitionFile.references[i] ); +#endif + if( !string.IsNullOrEmpty( assemblyPath ) ) + { + Object searchedAssemblyDefinitionFile; + if( assemblyDefinitionFilesToSearch.TryGetValue( assemblyPath, out searchedAssemblyDefinitionFile ) ) + referenceNode.AddLinkTo( GetReferenceNode( searchedAssemblyDefinitionFile ), "Referenced Assembly" ); + } + } + } + + return referenceNode; + } +#endif + +#if UNITY_2018_1_OR_NEWER + // Searches Shader Graph assets for references + private ReferenceNode SearchShaderGraph( object obj ) + { + if( !searchTextureReferences && !searchShaderGraphsForSubGraphs && shaderIncludesToSearchSet.Count == 0 ) + return null; + + ReferenceNode referenceNode = PopReferenceNode( obj ); + + // Shader Graph assets are JSON files, they must be crawled manually to find references + string graphJson = File.ReadAllText( AssetDatabase.GetAssetPath( (Object) obj ) ); + if( graphJson.IndexOf( "\"m_ObjectId\"", 0, Mathf.Min( 200, graphJson.Length ) ) >= 0 ) + { + // New Shader Graph serialization format is used: https://github.com/Unity-Technologies/Graphics/pull/222 + // Iterate over all these occurrences: "guid\": \"GUID_VALUE\" (\" is used instead of " because it is a nested JSON) + IterateOverValuesInString( graphJson, new string[] { "\"guid\\\"" }, '"', ( guid ) => + { + if( guid.Length > 1 ) + { + if( guid[guid.Length - 1] == '\\' ) + guid = guid.Substring( 0, guid.Length - 1 ); + + string referencePath = AssetDatabase.GUIDToAssetPath( guid ); + if( !string.IsNullOrEmpty( referencePath ) && assetsToSearchPathsSet.Contains( referencePath ) ) + { + Object reference = AssetDatabase.LoadMainAssetAtPath( referencePath ); + if( objectsToSearchSet.Contains( reference ) ) + referenceNode.AddLinkTo( GetReferenceNode( reference ), "Used in graph" ); + } + } + } ); + + if( shaderIncludesToSearchSet.Count > 0 ) + { + // Iterate over all these occurrences: "m_FunctionSource": "GUID_VALUE" (this one is not nested JSON) + IterateOverValuesInString( graphJson, new string[] { "\"m_FunctionSource\"" }, '"', ( guid ) => + { + string referencePath = AssetDatabase.GUIDToAssetPath( guid ); + if( !string.IsNullOrEmpty( referencePath ) && assetsToSearchPathsSet.Contains( referencePath ) ) + { + Object reference = AssetDatabase.LoadMainAssetAtPath( referencePath ); + if( objectsToSearchSet.Contains( reference ) ) + referenceNode.AddLinkTo( GetReferenceNode( reference ), "Used in node: Custom Function" ); + } + } ); + } + } + else + { + // Old Shader Graph serialization format is used. Although we could use the same search method as the new serialization format (which + // is potentially faster), this alternative search method yields more information about references + ShaderGraphReferences shaderGraph = JsonUtility.FromJson( graphJson ); + + if( shaderGraph.m_SerializedProperties != null ) + { + for( int i = shaderGraph.m_SerializedProperties.Count - 1; i >= 0; i-- ) + { + string propertyJSON = shaderGraph.m_SerializedProperties[i].JSONnodeData; + if( string.IsNullOrEmpty( propertyJSON ) ) + continue; + + ShaderGraphReferences.PropertyData propertyData = JsonUtility.FromJson( propertyJSON ); + if( propertyData.m_Value == null ) + continue; + + string texturePath = propertyData.m_Value.GetTexturePath(); + if( string.IsNullOrEmpty( texturePath ) || !assetsToSearchPathsSet.Contains( texturePath ) ) + continue; + + Texture texture = AssetDatabase.LoadAssetAtPath( texturePath ); + if( objectsToSearchSet.Contains( texture ) ) + referenceNode.AddLinkTo( GetReferenceNode( texture ), "Default Texture: " + propertyData.GetName() ); + } + } + + if( shaderGraph.m_SerializableNodes != null ) + { + for( int i = shaderGraph.m_SerializableNodes.Count - 1; i >= 0; i-- ) + { + string nodeJSON = shaderGraph.m_SerializableNodes[i].JSONnodeData; + if( string.IsNullOrEmpty( nodeJSON ) ) + continue; + + ShaderGraphReferences.NodeData nodeData = JsonUtility.FromJson( nodeJSON ); + if( !string.IsNullOrEmpty( nodeData.m_FunctionSource ) ) + { + string customFunctionPath = AssetDatabase.GUIDToAssetPath( nodeData.m_FunctionSource ); + if( !string.IsNullOrEmpty( customFunctionPath ) && assetsToSearchPathsSet.Contains( customFunctionPath ) ) + { + Object customFunction = AssetDatabase.LoadMainAssetAtPath( customFunctionPath ); + if( objectsToSearchSet.Contains( customFunction ) ) + referenceNode.AddLinkTo( GetReferenceNode( customFunction ), "Used in node: " + nodeData.m_Name ); + } + } + + if( searchShaderGraphsForSubGraphs ) + { + string subGraphPath = nodeData.GetSubGraphPath(); + if( !string.IsNullOrEmpty( subGraphPath ) && assetsToSearchPathsSet.Contains( subGraphPath ) ) + { + Object subGraph = AssetDatabase.LoadMainAssetAtPath( subGraphPath ); + if( objectsToSearchSet.Contains( subGraph ) ) + referenceNode.AddLinkTo( GetReferenceNode( subGraph ), "Used as Sub-graph" ); + } + } + + if( nodeData.m_SerializableSlots == null ) + continue; + + for( int j = nodeData.m_SerializableSlots.Count - 1; j >= 0; j-- ) + { + string nodeSlotJSON = nodeData.m_SerializableSlots[j].JSONnodeData; + if( string.IsNullOrEmpty( nodeSlotJSON ) ) + continue; + + string texturePath = JsonUtility.FromJson( nodeSlotJSON ).GetTexturePath(); + if( string.IsNullOrEmpty( texturePath ) || !assetsToSearchPathsSet.Contains( texturePath ) ) + continue; + + Texture texture = AssetDatabase.LoadAssetAtPath( texturePath ); + if( objectsToSearchSet.Contains( texture ) ) + referenceNode.AddLinkTo( GetReferenceNode( texture ), "Used in node: " + nodeData.m_Name ); + } + } + } + } + + return referenceNode; + } +#endif + +#if ASSET_USAGE_VFX_GRAPH + private ReferenceNode SearchVFXGraphAsset( object obj ) + { + ReferenceNode referenceNode = PopReferenceNode( obj ); + + object vfxResource = vfxResourceGetter( AssetDatabase.GetAssetPath( (Object) obj ) ); + foreach( Object vfxResourceContent in (Object[]) vfxResourceContentsGetter.Invoke( vfxResource, null ) ) + referenceNode.AddLinkTo( SearchObject( vfxResourceContent ) ); + + return referenceNode; + } +#endif + + // Find references from an Animation/Animator component to the objects that it animates + private void SearchAnimatedObjects( ReferenceNode referenceNode ) + { + GameObject root = ( (Component) referenceNode.nodeObject ).gameObject; + AnimationClip[] clips = AnimationUtility.GetAnimationClips( root ); + for( int i = 0; i < clips.Length; i++ ) + { + AnimationClip clip = clips[i]; + if( !clip ) + continue; + + bool isClipUnique = true; + for( int j = i - 1; j >= 0; j-- ) + { + if( clips[j] == clip ) + { + isClipUnique = false; + break; + } + } + + if( !isClipUnique ) + continue; + + EditorCurveBinding[] uniqueBindings; + if( !animationClipUniqueBindings.TryGetValue( clip, out uniqueBindings ) ) + { + // Calculate all the "unique" paths that the animation clip's curves have + // Both float curves (GetCurveBindings) and object reference curves (GetObjectReferenceCurveBindings) are checked + List _uniqueBindings = new List( 2 ); + EditorCurveBinding[] bindings = AnimationUtility.GetCurveBindings( clip ); + for( int j = 0; j < bindings.Length; j++ ) + { + string bindingPath = bindings[j].path; + if( string.IsNullOrEmpty( bindingPath ) ) // Ignore the root animated object + continue; + + bool isBindingUnique = true; + for( int k = _uniqueBindings.Count - 1; k >= 0; k-- ) + { + if( bindingPath == _uniqueBindings[k].path ) + { + isBindingUnique = false; + break; + } + } + + if( isBindingUnique ) + _uniqueBindings.Add( bindings[j] ); + } + + bindings = AnimationUtility.GetObjectReferenceCurveBindings( clip ); + for( int j = 0; j < bindings.Length; j++ ) + { + string bindingPath = bindings[j].path; + if( string.IsNullOrEmpty( bindingPath ) ) // Ignore the root animated object + continue; + + bool isBindingUnique = true; + for( int k = _uniqueBindings.Count - 1; k >= 0; k-- ) + { + if( bindingPath == _uniqueBindings[k].path ) + { + isBindingUnique = false; + break; + } + } + + if( isBindingUnique ) + _uniqueBindings.Add( bindings[j] ); + } + + uniqueBindings = _uniqueBindings.ToArray(); + animationClipUniqueBindings[clip] = uniqueBindings; + } + + string clipName = clip.name; + for( int j = 0; j < uniqueBindings.Length; j++ ) + referenceNode.AddLinkTo( SearchObject( AnimationUtility.GetAnimatedObject( root, uniqueBindings[j] ) ), "Animated via clip: " + clipName ); + } + } + + // Search #include references in shader source code + private void SearchShaderSourceCodeForCGIncludes( ReferenceNode referenceNode ) + { + string shaderPath = AssetDatabase.GetAssetPath( (Object) referenceNode.nodeObject ); + + // Iterate over all these occurrences: #include "INCLUDE_REFERENCE" or #include_with_pragmas "INCLUDE_REFERENCE" + IterateOverValuesInString( File.ReadAllText( shaderPath ), new string[] { "#include ", "#include_with_pragmas " }, '"', ( include ) => + { + bool isIncludePotentialReference = shaderIncludesToSearchSet.Contains( include ); + if( !isIncludePotentialReference ) + { + // Get absolute path of the #include + include = Path.GetFullPath( Path.Combine( Path.GetDirectoryName( shaderPath ), include ) ); + + int trimStartLength = Directory.GetCurrentDirectory().Length + 1; // Convert absolute path to a Project-relative path + if( include.Length > trimStartLength ) + { + include = include.Substring( trimStartLength ).Replace( '\\', '/' ); + isIncludePotentialReference = shaderIncludesToSearchSet.Contains( include ); + } + } + + if( isIncludePotentialReference ) + { + Object cgShader = AssetDatabase.LoadMainAssetAtPath( include ); + if( objectsToSearchSet.Contains( cgShader ) ) + referenceNode.AddLinkTo( GetReferenceNode( cgShader ), "Used with #include" ); + } + } ); + } + + // Search through variables of an object with SerializedObject + private void SearchVariablesWithSerializedObject( ReferenceNode referenceNode, bool forceUseSerializedObject = false ) + { + Object unityObject = (Object) referenceNode.nodeObject; + if( !isInPlayMode || unityObject.IsAsset() || forceUseSerializedObject ) + { +#if ASSET_USAGE_ADDRESSABLES + // See: https://github.com/yasirkula/UnityAssetUsageDetector/issues/29 + if( searchParameters.addressablesSupport && unityObject.name == "Deprecated EditorExtensionImpl" ) + return; +#endif + + SerializedObject so = new SerializedObject( unityObject ); + SerializedProperty iterator = so.GetIterator(); + SerializedProperty iteratorVisible = so.GetIterator(); + if( iterator.Next( true ) ) + { + bool iteratingVisible = iteratorVisible.NextVisible( true ); +#if UNITY_2018_3_OR_NEWER + bool searchPrefabOverridesOnly = searchParameters.hideReduntantPrefabVariantLinks && unityObject.IsAsset() && PrefabUtility.GetCorrespondingObjectFromSource( unityObject ) != null; +#endif + bool enterChildren; + do + { + // Iterate over NextVisible properties AND the properties that have corresponding FieldInfos (internal Unity + // properties don't have FieldInfos so we are skipping them, which is good because search results found in + // those properties aren't interesting and mostly confusing) + bool shouldMoveVisibleIterator = iteratingVisible && SerializedProperty.EqualContents( iterator, iteratorVisible ); + bool isVisible = shouldMoveVisibleIterator || iterator.type == "Array"; + if( !isVisible ) + { + Type propFieldType; + isVisible = fieldInfoGetter( iterator, out propFieldType ) != null; + } + + if( !isVisible ) + enterChildren = false; +#if UNITY_2018_3_OR_NEWER + else if( searchPrefabOverridesOnly && !iterator.prefabOverride ) + enterChildren = false; +#endif + else + { + Object propertyValue; + ReferenceNode searchResult; + switch( iterator.propertyType ) + { + case SerializedPropertyType.ObjectReference: + propertyValue = iterator.objectReferenceValue; + searchResult = SearchObject( PreferablyGameObject( propertyValue ) ); + enterChildren = false; + break; + case SerializedPropertyType.ExposedReference: + propertyValue = iterator.exposedReferenceValue; + searchResult = SearchObject( PreferablyGameObject( propertyValue ) ); + enterChildren = false; + break; +#if UNITY_2019_3_OR_NEWER + case SerializedPropertyType.ManagedReference: + object managedReferenceValue = GetRawSerializedPropertyValue( iterator ); + propertyValue = managedReferenceValue as Object; + searchResult = SearchObject( PreferablyGameObject( managedReferenceValue ) ); + enterChildren = false; + break; +#endif + case SerializedPropertyType.Generic: +#if ASSET_USAGE_ADDRESSABLES + if( searchParameters.addressablesSupport && iterator.type.StartsWithFast( "AssetReference" ) && GetRawSerializedPropertyValue( iterator ) is AssetReference assetReference ) + { + propertyValue = GetAddressablesAssetReferenceValue( assetReference ); + searchResult = SearchObject( PreferablyGameObject( propertyValue ) ); + enterChildren = false; + } + else +#endif +#if ASSET_USAGE_VFX_GRAPH + if( vfxSerializableObjectValueGetter != null && iterator.type == "VFXSerializableObject" && GetRawSerializedPropertyValue( iterator ) is object vfxSerializableObject ) + { + object vfxSerializableObjectValue = vfxSerializableObjectValueGetter.Invoke( vfxSerializableObject, null ); + propertyValue = vfxSerializableObjectValue as Object; + searchResult = SearchObject( PreferablyGameObject( vfxSerializableObjectValue ) ); + enterChildren = false; + } + else +#endif + { + propertyValue = null; + searchResult = null; + enterChildren = true; + } + + break; + default: + propertyValue = null; + searchResult = null; + enterChildren = false; + break; + } + + if( searchResult != null && searchResult != referenceNode ) + { + string propertyPath = iterator.propertyPath; + + // m_RD.texture is a redundant reference that shows up when searching sprites + if( !propertyPath.EndsWithFast( "m_RD.texture" ) ) + { + referenceNode.AddLinkTo( searchResult, "Variable: " + propertyPath.Replace( ".Array.data[", "[" ) ); // "arrayVariable.Array.data[0]" becomes "arrayVariable[0]" + + if( searchParameters.searchRefactoring != null && objectsToSearchSet.Contains( propertyValue ) ) + searchParameters.searchRefactoring( new SerializedPropertyMatch( unityObject, propertyValue, iterator ) ); + } + } + } + + if( shouldMoveVisibleIterator ) + iteratingVisible = iteratorVisible.NextVisible( enterChildren ); + } while( iterator.Next( enterChildren ) ); + + return; + } + } + + // Use reflection algorithm as fallback + SearchVariablesWithReflection( referenceNode ); + } + + // Search through variables of an object with reflection + private void SearchVariablesWithReflection( ReferenceNode referenceNode ) + { + // Get filtered variables for this object + VariableGetterHolder[] variables = GetFilteredVariablesForType( referenceNode.nodeObject.GetType() ); + for( int i = 0; i < variables.Length; i++ ) + { + // When possible, don't search non-serializable variables + if( searchSerializableVariablesOnly && !variables[i].isSerializable ) + continue; + + try + { + object variableValue = variables[i].Get( referenceNode.nodeObject ); + if( variableValue == null || variableValue.Equals( null ) ) + continue; + + // Values stored inside ICollection objects are searched using IEnumerable, + // no need to have duplicate search entries + if( !( variableValue is ICollection ) ) + { +#if ASSET_USAGE_ADDRESSABLES + if( searchParameters.addressablesSupport && variableValue is AssetReference ) + { + variableValue = GetAddressablesAssetReferenceValue( (AssetReference) variableValue ); + if( variableValue == null || variableValue.Equals( null ) ) + continue; + } +#endif + + ReferenceNode searchResult = SearchObject( PreferablyGameObject( variableValue ) ); + if( searchResult != null && searchResult != referenceNode ) + { + referenceNode.AddLinkTo( searchResult, ( variables[i].IsProperty ? "Property: " : "Variable: " ) + variables[i].Name ); + + if( searchParameters.searchRefactoring != null && objectsToSearchSet.Contains( variableValue as Object ) ) + searchParameters.searchRefactoring( new ReflectionMatch( referenceNode.nodeObject, (Object) variableValue, variables[i].variable ) ); + } + } + + if( variableValue is IEnumerable && !( variableValue is Transform ) ) + { + // If the field is IEnumerable (possibly an array or collection), search through members of it + // Note that Transform IEnumerable (children of the transform) is not iterated + int index = 0; + List foundReferences = null; + foreach( object element in (IEnumerable) variableValue ) + { + ReferenceNode searchResult = SearchObject( PreferablyGameObject( element ) ); + if( searchResult != null && searchResult != referenceNode ) + { + referenceNode.AddLinkTo( searchResult, string.Concat( variables[i].IsProperty ? "Property: " : "Variable: ", variables[i].Name, "[", index + "]" ) ); + + if( searchParameters.searchRefactoring != null && objectsToSearchSet.Contains( element as Object ) ) + { + if( foundReferences == null ) + foundReferences = new List( 2 ) { (Object) element }; + else if( !foundReferences.Contains( (Object) element ) ) + foundReferences.Add( (Object) element ); + } + } + + index++; + } + + if( foundReferences != null ) + { + for( int j = foundReferences.Count - 1; j >= 0; j-- ) + searchParameters.searchRefactoring( new ReflectionMatch( referenceNode.nodeObject, foundReferences[j], variableValue ) ); + } + } + } + catch( UnassignedReferenceException ) { } + catch( MissingReferenceException ) { } + catch( MissingComponentException ) { } + catch( NotImplementedException ) { } + catch( Exception e ) + { + // Unknown exceptions usually occur when variableValue is an IEnumerable and its enumerator throws an unhandled exception in MoveNext or Current + StringBuilder sb = Utilities.stringBuilder; + sb.Length = 0; + sb.EnsureCapacity( callStack.Count * 50 + 1000 ); + + sb.Append( "Skipped searching " ).Append( referenceNode.nodeObject.GetType().FullName ).Append( "." ).Append( variables[i].Name ).AppendLine( " because it threw exception:" ).Append( e ).AppendLine(); + + Object latestUnityObjectInCallStack = AppendCallStackToStringBuilder( sb ); + Debug.LogWarning( sb.ToString(), latestUnityObjectInCallStack ); + } + } + } + + // Get filtered variables for a type + private VariableGetterHolder[] GetFilteredVariablesForType( Type type ) + { + VariableGetterHolder[] result; + if( typeToVariables.TryGetValue( type, out result ) ) + return result; + + // This is the first time this type of object is seen, filter and cache its variables + // Variable filtering process: + // 1- skip Obsolete variables + // 2- skip primitive types, enums and strings + // 3- skip common Unity types that can't hold any references (e.g. Vector3, Rect, Color, Quaternion) + // + // P.S. IsIgnoredUnityType() extension function handles steps 2) and 3) + + validVariables.Clear(); + + // Filter the fields + if( fieldModifiers != ( BindingFlags.Instance | BindingFlags.DeclaredOnly ) ) + { + Type currType = type; + while( currType != typeof( object ) ) + { + FieldInfo[] fields = currType.GetFields( fieldModifiers ); + for( int i = 0; i < fields.Length; i++ ) + { + FieldInfo field = fields[i]; + + // Skip obsolete fields + if( Attribute.IsDefined( field, typeof( ObsoleteAttribute ) ) ) + continue; + + // Skip primitive types + if( field.FieldType.IsIgnoredUnityType() ) + continue; + +#if UNITY_2021_2_OR_NEWER + // "ref struct"s can't be accessed via reflection + if( field.FieldType.IsByRefLike ) + continue; +#endif + + // Additional filtering for fields: + // 1- Ignore "m_RectTransform", "m_CanvasRenderer" and "m_Canvas" fields of Graphic components + string fieldName = field.Name; + if( typeof( Graphic ).IsAssignableFrom( currType ) && + ( fieldName == "m_RectTransform" || fieldName == "m_CanvasRenderer" || fieldName == "m_Canvas" ) ) + continue; + + VariableGetVal getter = field.CreateGetter( type ); + if( getter != null ) + validVariables.Add( new VariableGetterHolder( field, getter, searchSerializableVariablesOnly ? field.IsSerializable() : true ) ); + } + + currType = currType.BaseType; + } + } + + if( propertyModifiers != ( BindingFlags.Instance | BindingFlags.DeclaredOnly ) ) + { + Type currType = type; + while( currType != typeof( object ) ) + { + PropertyInfo[] properties = currType.GetProperties( propertyModifiers ); + for( int i = 0; i < properties.Length; i++ ) + { + PropertyInfo property = properties[i]; + + // Skip obsolete properties + if( Attribute.IsDefined( property, typeof( ObsoleteAttribute ) ) ) + continue; + + // Skip primitive types + if( property.PropertyType.IsIgnoredUnityType() ) + continue; + +#if UNITY_2021_2_OR_NEWER + // "ref struct"s can't be accessed via reflection + if( property.PropertyType.IsByRefLike ) + continue; +#endif + + // Skip properties without a getter function + MethodInfo propertyGetter = property.GetGetMethod( true ); + if( propertyGetter == null ) + continue; + + // Skip indexer properties + if( property.GetIndexParameters().Length > 0 ) + continue; + + // No need to check properties with 'override' keyword + if( propertyGetter.GetBaseDefinition().DeclaringType != propertyGetter.DeclaringType ) + continue; + + string propertyName = property.Name; + + // Ignore "gameObject", "transform", "rectTransform" and "attachedRigidbody" properties of components to get more useful results + if( typeof( Component ).IsAssignableFrom( currType ) && ( propertyName == "gameObject" || + propertyName == "transform" || propertyName == "attachedRigidbody" || propertyName == "rectTransform" ) ) + continue; + // Ignore "canvasRenderer" and "canvas" properties of Graphic components to get more useful results + else if( typeof( Graphic ).IsAssignableFrom( currType ) && + ( propertyName == "canvasRenderer" || propertyName == "canvas" ) ) + continue; + // Prevent accessing properties of Unity that instantiate an existing resource (causing memory leak) + else if( typeof( MeshFilter ).IsAssignableFrom( currType ) && propertyName == "mesh" ) + continue; + // Same as above + else if( ( propertyName == "material" || propertyName == "materials" ) && + ( typeof( Renderer ).IsAssignableFrom( currType ) || typeof( Collider ).IsAssignableFrom( currType ) || +#if !UNITY_2019_3_OR_NEWER +#pragma warning disable 0618 + typeof( GUIText ).IsAssignableFrom( currType ) || +#pragma warning restore 0618 +#endif + typeof( Collider2D ).IsAssignableFrom( currType ) ) ) + continue; + // Ignore certain Material properties that are already searched via SearchMaterial function (also, if a material doesn't have a _Color or _BaseColor + // property and its "color" property is called, it logs an error to the console, so this rule helps avoid that scenario, as well) + else if( ( propertyName == "color" || propertyName == "mainTexture" ) && typeof( Material ).IsAssignableFrom( currType ) ) + continue; + // Ignore "parameters" property of Animator since it doesn't contain any useful data and logs a warning to the console when Animator is inactive + else if( typeof( Animator ).IsAssignableFrom( currType ) && propertyName == "parameters" ) + continue; + // Ignore "spriteAnimator" property of TMP_Text component because this property adds a TMP_SpriteAnimator component to the object if it doesn't exist + else if( propertyName == "spriteAnimator" && currType.Name == "TMP_Text" ) + continue; + // Ignore "meshFilter" property of TextMeshPro and TMP_SubMesh components because this property adds a MeshFilter component to the object if it doesn't exist + else if( propertyName == "meshFilter" && ( currType.Name == "TextMeshPro" || currType.Name == "TMP_SubMesh" ) ) + continue; + // Ignore "users" property of TerrainData because it returns the Terrains in the scene that use that TerrainData. This causes issues with callStack because TerrainData + // is already in callStack when Terrains are searched via "users" property of it and hence, Terrain->TerrainData references for that TerrainData can't be found in scenes + // (this is how callStack works, it prevents searching an object if it's already in callStack to avoid infinite recursion) + else if( propertyName == "users" && typeof( TerrainData ).IsAssignableFrom( currType ) ) + continue; + else + { + VariableGetVal getter = property.CreateGetter(); + if( getter != null ) + validVariables.Add( new VariableGetterHolder( property, getter, searchSerializableVariablesOnly ? property.IsSerializable() : true ) ); + } + } + + currType = currType.BaseType; + } + } + + result = validVariables.ToArray(); + + // Cache the filtered fields + typeToVariables.Add( type, result ); + + return result; + } + + // Credit: http://answers.unity.com/answers/425602/view.html + // Returns the raw System.Object value of a SerializedProperty + private object GetRawSerializedPropertyValue( SerializedProperty property ) + { + object result = property.serializedObject.targetObject; + string[] path = property.propertyPath.Replace( ".Array.data[", "[" ).Split( '.' ); + for( int i = 0; i < path.Length; i++ ) + { + string pathElement = path[i]; + + int arrayStartIndex = pathElement.IndexOf( '[' ); + if( arrayStartIndex < 0 ) + result = GetFieldValue( result, pathElement ); + else + { + string variableName = pathElement.Substring( 0, arrayStartIndex ); + + int arrayEndIndex = pathElement.IndexOf( ']', arrayStartIndex + 1 ); + int arrayElementIndex = int.Parse( pathElement.Substring( arrayStartIndex + 1, arrayEndIndex - arrayStartIndex - 1 ) ); + result = GetFieldValue( result, variableName, arrayElementIndex ); + } + } + + return result; + } + + // Credit: http://answers.unity.com/answers/425602/view.html + private object GetFieldValue( object source, string fieldName ) + { + if( source == null ) + return null; + + FieldInfo fieldInfo = null; + Type type = source.GetType(); + while( fieldInfo == null && type != typeof( object ) ) + { + fieldInfo = type.GetField( fieldName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly ); + type = type.BaseType; + } + + if( fieldInfo != null ) + return fieldInfo.GetValue( source ); + + PropertyInfo propertyInfo = null; + type = source.GetType(); + while( propertyInfo == null && type != typeof( object ) ) + { + propertyInfo = type.GetProperty( fieldName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly | BindingFlags.IgnoreCase ); + type = type.BaseType; + } + + if( propertyInfo != null ) + return propertyInfo.GetValue( source, null ); + + if( fieldName.Length > 2 && fieldName.StartsWith( "m_", StringComparison.OrdinalIgnoreCase ) ) + return GetFieldValue( source, fieldName.Substring( 2 ) ); + + return null; + } + + // Credit: http://answers.unity.com/answers/425602/view.html + private object GetFieldValue( object source, string fieldName, int arrayIndex ) + { + IEnumerable enumerable = GetFieldValue( source, fieldName ) as IEnumerable; + if( enumerable == null ) + return null; + + if( enumerable is IList ) + return ( (IList) enumerable )[arrayIndex]; + + IEnumerator enumerator = enumerable.GetEnumerator(); + for( int i = 0; i <= arrayIndex; i++ ) + enumerator.MoveNext(); + + return enumerator.Current; + } + +#if ASSET_USAGE_ADDRESSABLES + private Object GetAddressablesAssetReferenceValue( AssetReference assetReference ) + { + Object result = assetReference.editorAsset; + if( !result ) + return null; + + string subObjectName = assetReference.SubObjectName; + if( !string.IsNullOrEmpty( subObjectName ) ) + { + if( result is SpriteAtlas ) + { + Sprite[] packedSprites = spriteAtlasPackedSpritesGetter( (SpriteAtlas) result ); + if( packedSprites != null ) + { + for( int i = 0; i < packedSprites.Length; i++ ) + { + if( packedSprites[i] && packedSprites[i].name == subObjectName ) + return packedSprites[i]; + } + } + } + else + { + Type subObjectType = (Type) assetReferenceSubObjectTypeGetter.GetValue( assetReference, null ) ?? typeof( Object ); + Object[] subAssets = AssetDatabase.LoadAllAssetRepresentationsAtPath( AssetDatabase.GetAssetPath( result ) ); + for( int k = 0; k < subAssets.Length; k++ ) + { + if( subAssets[k] && subAssets[k].name == subObjectName && subObjectType.IsAssignableFrom( subAssets[k].GetType() ) ) + return subAssets[k]; + } + } + } + + return result; + } +#endif + + // Iterates over all occurrences of specific key-value pairs in string + // Example1: #include "VALUE" valuePrefix=#include, valueWrapperChar=" + // Example2: "guid": "VALUE" valuePrefix="guid", valueWrapperChar=" + private void IterateOverValuesInString( string str, string[] valuePrefixes, char valueWrapperChar, Action valueAction ) + { + for( int i = 0; i < valuePrefixes.Length; i++ ) + { + string valuePrefix = valuePrefixes[i]; + int valueStartIndex, valueEndIndex = 0; + while( true ) + { + valueStartIndex = str.IndexOf( valuePrefix, valueEndIndex ); + if( valueStartIndex < 0 ) + break; + + valueStartIndex = str.IndexOf( valueWrapperChar, valueStartIndex + valuePrefix.Length ); + if( valueStartIndex < 0 ) + break; + + valueStartIndex++; + valueEndIndex = str.IndexOf( valueWrapperChar, valueStartIndex ); + if( valueEndIndex < 0 ) + break; + + if( valueEndIndex > valueStartIndex ) + valueAction( str.Substring( valueStartIndex, valueEndIndex - valueStartIndex ) ); + } + } + } + + // If obj is Component, switches to its GameObject + private object PreferablyGameObject( object obj ) + { + Component component = obj as Component; + return ( component != null && !component.Equals( null ) ) ? component.gameObject : obj; + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/AssetUsageDetector/Editor/AssetUsageDetectorSearchFunctions.cs.meta b/Assets/Plugins/AssetUsageDetector/Editor/AssetUsageDetectorSearchFunctions.cs.meta new file mode 100644 index 00000000..fc1cd02d --- /dev/null +++ b/Assets/Plugins/AssetUsageDetector/Editor/AssetUsageDetectorSearchFunctions.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 93aaae685d4c3db44baeb91a0296855e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/AssetUsageDetector/Editor/AssetUsageDetectorSettings.cs b/Assets/Plugins/AssetUsageDetector/Editor/AssetUsageDetectorSettings.cs new file mode 100644 index 00000000..6dc943af --- /dev/null +++ b/Assets/Plugins/AssetUsageDetector/Editor/AssetUsageDetectorSettings.cs @@ -0,0 +1,298 @@ +using UnityEditor; +using UnityEngine; + +namespace AssetUsageDetectorNamespace +{ + public static class AssetUsageDetectorSettings + { + private static readonly GUILayoutOption GL_WIDTH_60 = GUILayout.Width( 60f ); + + #region Colors + private static Color? m_settingsHeaderColor = null; + public static Color SettingsHeaderColor + { + get { if( m_settingsHeaderColor == null ) m_settingsHeaderColor = GetColor( "AUD_SettingsHeaderTint", Color.cyan ); return m_settingsHeaderColor.Value; } + set { if( m_settingsHeaderColor == value ) return; m_settingsHeaderColor = value; SetColor( "AUD_SettingsHeaderTint", value ); } + } + + private static Color? m_searchResultGroupHeaderColor = null; + public static Color SearchResultGroupHeaderColor + { + get { if( m_searchResultGroupHeaderColor == null ) m_searchResultGroupHeaderColor = GetColor( "AUD_ResultGroupHeaderTint", Color.cyan ); return m_searchResultGroupHeaderColor.Value; } + set { if( m_searchResultGroupHeaderColor == value ) return; m_searchResultGroupHeaderColor = value; SetColor( "AUD_ResultGroupHeaderTint", value ); } + } + + private static Color? m_rootRowsBackgroundColor = null; + public static Color RootRowsBackgroundColor + { + get { if( m_rootRowsBackgroundColor == null ) m_rootRowsBackgroundColor = GetColor( "AUD_RootRowsTint", EditorGUIUtility.isProSkin ? new Color( 0f, 1f, 1f, 0.15f ) : new Color( 0f, 1f, 1f, 0.25f ) ); return m_rootRowsBackgroundColor.Value; } + set { if( m_rootRowsBackgroundColor == value ) return; m_rootRowsBackgroundColor = value; SetColor( "AUD_RootRowsTint", value ); } + } + + private static Color? m_rootRowsBorderColor = null; + public static Color RootRowsBorderColor + { + get { if( m_rootRowsBorderColor == null ) m_rootRowsBorderColor = GetColor( "AUD_RootRowsBorderColor", EditorGUIUtility.isProSkin ? new Color( 0.15f, 0.15f, 0.15f, 1f ) : new Color( 0.375f, 0.375f, 0.375f, 1f ) ); return m_rootRowsBorderColor.Value; } + set { if( m_rootRowsBorderColor == value ) return; m_rootRowsBorderColor = value; SetColor( "AUD_RootRowsBorderColor", value ); } + } + + private static Color? m_mainReferencesBackgroundColor = null; + public static Color MainReferencesBackgroundColor + { + get { if( m_mainReferencesBackgroundColor == null ) m_mainReferencesBackgroundColor = GetColor( "AUD_MainRefRowsTint", EditorGUIUtility.isProSkin ? new Color( 0f, 0.35f, 0f, 1f ) : new Color( 0.25f, 0.75f, 0.25f, 1f ) ); return m_mainReferencesBackgroundColor.Value; } + set { if( m_mainReferencesBackgroundColor == value ) return; m_mainReferencesBackgroundColor = value; SetColor( "AUD_MainRefRowsTint", value ); } + } + + private static Color? m_selectedRowsParentTint = null; + public static Color SelectedRowParentsTint + { + get { if( m_selectedRowsParentTint == null ) m_selectedRowsParentTint = GetColor( "AUD_SelectedRowParentsTint", EditorGUIUtility.isProSkin ? new Color( 0.36f, 0.36f, 0.18f, 1f ) : new Color( 0.825f, 0.825f, 0.55f, 1f ) ); return m_selectedRowsParentTint.Value; } + set { if( m_selectedRowsParentTint == value ) return; m_selectedRowsParentTint = value; SetColor( "AUD_SelectedRowParentsTint", value ); } + } + + private static Color? m_selectedRowOccurrencesColor = null; + public static Color SelectedRowOccurrencesColor + { + get { if( m_selectedRowOccurrencesColor == null ) m_selectedRowOccurrencesColor = GetColor( "AUD_SelectedRowOccurrencesTint", EditorGUIUtility.isProSkin ? new Color( 0f, 0.3f, 0.75f, 1f ) : new Color( 0.25f, 0.75f, 1f, 1f ) ); return m_selectedRowOccurrencesColor.Value; } + set { if( m_selectedRowOccurrencesColor == value ) return; m_selectedRowOccurrencesColor = value; SetColor( "AUD_SelectedRowOccurrencesTint", value ); } + } + + private static Color? m_treeLinesColor = null; + public static Color TreeLinesColor + { + get { if( m_treeLinesColor == null ) m_treeLinesColor = GetColor( "AUD_TreeLinesColor", EditorGUIUtility.isProSkin ? new Color( 0.65f, 0.65f, 0.65f, 1f ) : new Color( 0.375f, 0.375f, 0.375f, 1f ) ); return m_treeLinesColor.Value; } + set { if( m_treeLinesColor == value ) return; m_treeLinesColor = value; SetColor( "AUD_TreeLinesColor", value ); } + } + + private static Color? m_highlightedTreeLinesColor = null; + public static Color HighlightedTreeLinesColor + { + get { if( m_highlightedTreeLinesColor == null ) m_highlightedTreeLinesColor = GetColor( "AUD_HighlightTreeLinesColor", Color.cyan ); return m_highlightedTreeLinesColor.Value; } + set { if( m_highlightedTreeLinesColor == value ) return; m_highlightedTreeLinesColor = value; SetColor( "AUD_HighlightTreeLinesColor", value ); } + } + + private static Color? m_searchMatchingTextColor = null; + public static Color SearchMatchingTextColor + { + get { if( m_searchMatchingTextColor == null ) m_searchMatchingTextColor = GetColor( "AUD_SearchTextColor", Color.red ); return m_searchMatchingTextColor.Value; } + set { if( m_searchMatchingTextColor == value ) return; m_searchMatchingTextColor = value; SetColor( "AUD_SearchTextColor", value ); ForEachAssetUsageDetectorWindow( ( window ) => window.OnSettingsChanged( highlightedSearchTextColorChanged: true ) ); } + } + + private static Color? m_tooltipDescriptionTextColor = null; + public static Color TooltipDescriptionTextColor + { + get { if( m_tooltipDescriptionTextColor == null ) m_tooltipDescriptionTextColor = GetColor( "AUD_TooltipUsageTextColor", EditorGUIUtility.isProSkin ? new Color( 0f, 0.9f, 0.9f, 1f ) : new Color( 0.9f, 0f, 0f, 1f ) ); return m_tooltipDescriptionTextColor.Value; } + set { if( m_tooltipDescriptionTextColor == value ) return; m_tooltipDescriptionTextColor = value; SetColor( "AUD_TooltipUsageTextColor", value ); ForEachAssetUsageDetectorWindow( ( window ) => window.OnSettingsChanged( tooltipDescriptionsColorChanged: true ) ); } + } + #endregion + + #region Size Adjustments + private static float? m_extraRowHeight = null; + public static float ExtraRowHeight + { + get { if( m_extraRowHeight == null ) m_extraRowHeight = EditorPrefs.GetFloat( "AUD_ExtraRowHeight", 0f ); return m_extraRowHeight.Value; } + set { if( m_extraRowHeight == value ) return; m_extraRowHeight = value; EditorPrefs.SetFloat( "AUD_ExtraRowHeight", value ); ForEachAssetUsageDetectorWindow( ( window ) => window.OnSettingsChanged() ); } + } + #endregion + + #region Other Settings + private static bool? m_showRootAssetName = null; + public static bool ShowRootAssetName + { + get { if( m_showRootAssetName == null ) m_showRootAssetName = EditorPrefs.GetBool( "AUD_ShowRootAssetName", true ); return m_showRootAssetName.Value; } + set { if( m_showRootAssetName == value ) return; m_showRootAssetName = value; EditorPrefs.SetBool( "AUD_ShowRootAssetName", value ); } + } + + private static bool? m_pingClickedObjects = null; + public static bool PingClickedObjects + { + get { if( m_pingClickedObjects == null ) m_pingClickedObjects = EditorPrefs.GetBool( "AUD_PingClickedObj", true ); return m_pingClickedObjects.Value; } + set { if( m_pingClickedObjects == value ) return; m_pingClickedObjects = value; EditorPrefs.SetBool( "AUD_PingClickedObj", value ); } + } + + private static bool? m_selectClickedObjects = null; + public static bool SelectClickedObjects + { + get { if( m_selectClickedObjects == null ) m_selectClickedObjects = EditorPrefs.GetBool( "AUD_SelectClickedObj", false ); return m_selectClickedObjects.Value; } + set { if( m_selectClickedObjects == value ) return; m_selectClickedObjects = value; EditorPrefs.SetBool( "AUD_SelectClickedObj", value ); } + } + + private static bool? m_selectDoubleClickedObjects = null; + public static bool SelectDoubleClickedObjects + { + get { if( m_selectDoubleClickedObjects == null ) m_selectDoubleClickedObjects = EditorPrefs.GetBool( "AUD_SelectDoubleClickedObj", true ); return m_selectDoubleClickedObjects.Value; } + set { if( m_selectDoubleClickedObjects == value ) return; m_selectDoubleClickedObjects = value; EditorPrefs.SetBool( "AUD_SelectDoubleClickedObj", value ); } + } + + private static bool? m_markUsedAssetsSubAssetsAsUsed = null; + public static bool MarkUsedAssetsSubAssetsAsUsed + { + get { if( m_markUsedAssetsSubAssetsAsUsed == null ) m_markUsedAssetsSubAssetsAsUsed = EditorPrefs.GetBool( "AUD_MarkUsedAssetsSubAssetsAsUsed", true ); return m_markUsedAssetsSubAssetsAsUsed.Value; } + set { if( m_markUsedAssetsSubAssetsAsUsed == value ) return; m_markUsedAssetsSubAssetsAsUsed = value; EditorPrefs.SetBool( "AUD_MarkUsedAssetsSubAssetsAsUsed", value ); } + } + + private static bool? m_showUnityTooltip = null; + public static bool ShowUnityTooltip + { + get { if( m_showUnityTooltip == null ) m_showUnityTooltip = EditorPrefs.GetBool( "AUD_ShowUnityTooltip", false ); return m_showUnityTooltip.Value; } + set { if( m_showUnityTooltip == value ) return; m_showUnityTooltip = value; EditorPrefs.SetBool( "AUD_ShowUnityTooltip", value ); } + } + + private static bool? m_showCustomTooltip = null; + public static bool ShowCustomTooltip + { + get { if( m_showCustomTooltip == null ) m_showCustomTooltip = EditorPrefs.GetBool( "AUD_ShowCustomTooltip", true ); return m_showCustomTooltip.Value; } + set { if( m_showCustomTooltip == value ) return; m_showCustomTooltip = value; EditorPrefs.SetBool( "AUD_ShowCustomTooltip", value ); ForEachAssetUsageDetectorWindow( ( window ) => window.OnSettingsChanged() ); } + } + + private static float? m_customTooltipDelay = null; + public static float CustomTooltipDelay + { + get { if( m_customTooltipDelay == null ) m_customTooltipDelay = EditorPrefs.GetFloat( "AUD_CustomTooltipDelay", 0.7f ); return m_customTooltipDelay.Value; } + set { if( m_customTooltipDelay == value ) return; m_customTooltipDelay = value; EditorPrefs.SetFloat( "AUD_CustomTooltipDelay", value ); } + } + + private static bool? m_showTreeLines = null; + public static bool ShowTreeLines + { + get { if( m_showTreeLines == null ) m_showTreeLines = EditorPrefs.GetBool( "AUD_ShowTreeLines", true ); return m_showTreeLines.Value; } + set { if( m_showTreeLines == value ) return; m_showTreeLines = value; EditorPrefs.SetBool( "AUD_ShowTreeLines", value ); } + } + + private static bool? m_applySelectedRowParentsTintToRootRows = null; + public static bool ApplySelectedRowParentsTintToRootRows + { + get { if( m_applySelectedRowParentsTintToRootRows == null ) m_applySelectedRowParentsTintToRootRows = EditorPrefs.GetBool( "AUD_SelectedRowParentsTintAtRoot", true ); return m_applySelectedRowParentsTintToRootRows.Value; } + set { if( m_applySelectedRowParentsTintToRootRows == value ) return; m_applySelectedRowParentsTintToRootRows = value; EditorPrefs.SetBool( "AUD_SelectedRowParentsTintAtRoot", value ); } + } + #endregion + +#if UNITY_2018_3_OR_NEWER + [SettingsProvider] + public static SettingsProvider CreatePreferencesGUI() + { + return new SettingsProvider( "Project/yasirkula/Asset Usage Detector", SettingsScope.Project ) + { + guiHandler = ( searchContext ) => PreferencesGUI(), + keywords = new System.Collections.Generic.HashSet() { "Asset", "Usage", "Detector" } + }; + } +#endif + +#if !UNITY_2018_3_OR_NEWER + [PreferenceItem( "Asset Usage Detector" )] +#endif + public static void PreferencesGUI() + { + float labelWidth = EditorGUIUtility.labelWidth; +#if UNITY_2018_3_OR_NEWER + EditorGUIUtility.labelWidth += 60f; +#else + EditorGUIUtility.labelWidth += 20f; +#endif + + EditorGUI.BeginChangeCheck(); + + ShowRootAssetName = AssetUsageDetectorWindow.WordWrappingToggleLeft( "Show Root Asset's Name For Sub-Assets (Requires Refresh)", ShowRootAssetName ); + + EditorGUILayout.Space(); + + PingClickedObjects = AssetUsageDetectorWindow.WordWrappingToggleLeft( "Ping Clicked Objects", PingClickedObjects ); + SelectClickedObjects = AssetUsageDetectorWindow.WordWrappingToggleLeft( "Select Clicked Objects", SelectClickedObjects ); + SelectDoubleClickedObjects = AssetUsageDetectorWindow.WordWrappingToggleLeft( "Select Double Clicked Objects", SelectDoubleClickedObjects ); + + EditorGUILayout.Space(); + + MarkUsedAssetsSubAssetsAsUsed = AssetUsageDetectorWindow.WordWrappingToggleLeft( "Hide unused sub-assets in \"Unused Objects\" list if their parent assets are used (Requires Refresh)", MarkUsedAssetsSubAssetsAsUsed ); + + EditorGUILayout.Space(); + + ShowUnityTooltip = AssetUsageDetectorWindow.WordWrappingToggleLeft( "Show Unity Tooltip", ShowUnityTooltip ); + ShowCustomTooltip = AssetUsageDetectorWindow.WordWrappingToggleLeft( "Show Custom Tooltip", ShowCustomTooltip ); + EditorGUI.indentLevel++; + CustomTooltipDelay = FloatField( "Delay", CustomTooltipDelay, 0.7f ); + EditorGUI.indentLevel--; + TooltipDescriptionTextColor = ColorField( "Tooltip Descriptions Text Color", TooltipDescriptionTextColor, EditorGUIUtility.isProSkin ? new Color( 0f, 0.9f, 0.9f, 1f ) : new Color( 0.9f, 0f, 0f, 1f ) ); + + EditorGUILayout.Space(); + + ExtraRowHeight = Mathf.Max( 0f, FloatField( "Extra Row Height", ExtraRowHeight, 0f ) ); + + EditorGUILayout.Space(); + + SettingsHeaderColor = ColorField( "Settings Header Color", SettingsHeaderColor, Color.cyan ); + SearchResultGroupHeaderColor = ColorField( "Group Header Color", SearchResultGroupHeaderColor, Color.cyan ); + RootRowsBackgroundColor = ColorField( "Root Rows Background Color", RootRowsBackgroundColor, EditorGUIUtility.isProSkin ? new Color( 0f, 1f, 1f, 0.15f ) : new Color( 0f, 1f, 1f, 0.25f ) ); + RootRowsBorderColor = ColorField( "Root Rows Border Color", RootRowsBorderColor, EditorGUIUtility.isProSkin ? new Color( 0.15f, 0.15f, 0.15f, 1f ) : new Color( 0.375f, 0.375f, 0.375f, 1f ) ); + MainReferencesBackgroundColor = ColorField( "Main References Background Color", MainReferencesBackgroundColor, EditorGUIUtility.isProSkin ? new Color( 0f, 0.35f, 0f, 1f ) : new Color( 0.25f, 0.75f, 0.25f, 1f ) ); + SelectedRowParentsTint = ColorField( "Selected Row Parents Tint", SelectedRowParentsTint, EditorGUIUtility.isProSkin ? new Color( 0.36f, 0.36f, 0.18f, 1f ) : new Color( 0.825f, 0.825f, 0.55f, 1f ) ); + EditorGUI.indentLevel++; + ApplySelectedRowParentsTintToRootRows = !EditorGUILayout.Toggle( "Ignore Root Rows", !ApplySelectedRowParentsTintToRootRows ); + EditorGUI.indentLevel--; + SelectedRowOccurrencesColor = ColorField( "Selected Row All Occurrences Tint", SelectedRowOccurrencesColor, EditorGUIUtility.isProSkin ? new Color( 0f, 0.3f, 0.75f, 1f ) : new Color( 0.25f, 0.75f, 1f, 1f ) ); + SearchMatchingTextColor = ColorField( "Matching Search Text Color", SearchMatchingTextColor, Color.red ); + + ShowTreeLines = AssetUsageDetectorWindow.WordWrappingToggleLeft( "Show Tree Lines", ShowTreeLines ); + EditorGUI.indentLevel++; + TreeLinesColor = ColorField( "Normal Color", TreeLinesColor, EditorGUIUtility.isProSkin ? new Color( 0.65f, 0.65f, 0.65f, 1f ) : new Color( 0.375f, 0.375f, 0.375f, 1f ) ); + HighlightedTreeLinesColor = ColorField( "Highlighted Color", HighlightedTreeLinesColor, Color.cyan ); + EditorGUI.indentLevel--; + + EditorGUIUtility.labelWidth = labelWidth; + + if( EditorGUI.EndChangeCheck() ) + ForEachAssetUsageDetectorWindow( ( window ) => window.Repaint() ); + } + + private static Color ColorField( string label, Color value, Color defaultValue ) + { + GUILayout.BeginHorizontal(); + Color result = EditorGUILayout.ColorField( label, value ); + if( GUILayout.Button( "Reset", GL_WIDTH_60 ) ) + result = defaultValue; + GUILayout.EndHorizontal(); + + return result; + } + + private static float FloatField( string label, float value, float defaultValue ) + { + GUILayout.BeginHorizontal(); + float result = EditorGUILayout.FloatField( label, value ); + if( GUILayout.Button( "Reset", GL_WIDTH_60 ) ) + result = defaultValue; + GUILayout.EndHorizontal(); + + return result; + } + + private static Color GetColor( string pref, Color defaultColor ) + { + if( EditorGUIUtility.isProSkin ) + pref += "_Pro"; + + if( !EditorPrefs.HasKey( pref ) ) + return defaultColor; + + string[] parts = EditorPrefs.GetString( pref ).Split( ';' ); + return new Color32( byte.Parse( parts[0] ), byte.Parse( parts[1] ), byte.Parse( parts[2] ), byte.Parse( parts[3] ) ); + } + + private static void SetColor( string pref, Color32 value ) + { + if( EditorGUIUtility.isProSkin ) + pref += "_Pro"; + + EditorPrefs.SetString( pref, string.Concat( value.r.ToString(), ";", value.g.ToString(), ";", value.b.ToString(), ";", value.a.ToString() ) ); + } + + private static void ForEachAssetUsageDetectorWindow( System.Action action ) + { + foreach( AssetUsageDetectorWindow window in Resources.FindObjectsOfTypeAll() ) + { + if( window ) + action( window ); + } + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/AssetUsageDetector/Editor/AssetUsageDetectorSettings.cs.meta b/Assets/Plugins/AssetUsageDetector/Editor/AssetUsageDetectorSettings.cs.meta new file mode 100644 index 00000000..7b45f1fc --- /dev/null +++ b/Assets/Plugins/AssetUsageDetector/Editor/AssetUsageDetectorSettings.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 13295073724765e45aa3b77486e515f4 +timeCreated: 1639982865 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/AssetUsageDetector/Editor/AssetUsageDetectorWindow.cs b/Assets/Plugins/AssetUsageDetector/Editor/AssetUsageDetectorWindow.cs new file mode 100644 index 00000000..eaf276ce --- /dev/null +++ b/Assets/Plugins/AssetUsageDetector/Editor/AssetUsageDetectorWindow.cs @@ -0,0 +1,812 @@ +// Asset Usage Detector - by Suleyman Yasir KULA (yasirkula@gmail.com) + +using UnityEngine; +using UnityEditor; +using System.Collections.Generic; +using System.Reflection; +using Object = UnityEngine.Object; +#if UNITY_2021_2_OR_NEWER +using PrefabStage = UnityEditor.SceneManagement.PrefabStage; +using PrefabStageUtility = UnityEditor.SceneManagement.PrefabStageUtility; +#elif UNITY_2018_3_OR_NEWER +using PrefabStage = UnityEditor.Experimental.SceneManagement.PrefabStage; +using PrefabStageUtility = UnityEditor.Experimental.SceneManagement.PrefabStageUtility; +#endif + +namespace AssetUsageDetectorNamespace +{ + public enum Phase { Setup, Processing, Complete }; + + public class AssetUsageDetectorWindow : EditorWindow, IHasCustomMenu + { + private enum WindowFilter { AlwaysReturnActive, ReturnActiveIfNotLocked, AlwaysReturnNew }; + + private const string PREFS_SEARCH_SCENES = "AUD_SceneSearch"; + private const string PREFS_SEARCH_SCENE_LIGHTING_SETTINGS = "AUD_LightingSettingsSearch"; + private const string PREFS_SEARCH_ASSETS = "AUD_AssetsSearch"; + private const string PREFS_SEARCH_PROJECT_SETTINGS = "AUD_ProjectSettingsSearch"; + private const string PREFS_DONT_SEARCH_SOURCE_ASSETS = "AUD_AssetsExcludeSrc"; + private const string PREFS_SEARCH_DEPTH_LIMIT = "AUD_Depth"; + private const string PREFS_SEARCH_FIELDS = "AUD_Fields"; + private const string PREFS_SEARCH_PROPERTIES = "AUD_Properties"; + private const string PREFS_SEARCH_NON_SERIALIZABLES = "AUD_NonSerializables"; + private const string PREFS_SEARCH_UNUSED_MATERIAL_PROPERTIES = "AUD_SearchUnusedMaterialProps"; + private const string PREFS_LAZY_SCENE_SEARCH = "AUD_LazySceneSearch"; + private const string PREFS_ADDRESSABLES_SUPPORT = "AUD_AddressablesSupport"; + private const string PREFS_CALCULATE_UNUSED_OBJECTS = "AUD_FindUnusedObjs"; + private const string PREFS_HIDE_DUPLICATE_ROWS = "AUD_HideDuplicates"; + private const string PREFS_HIDE_REDUNDANT_PREFAB_VARIANT_LINKS = "AUD_HideRedundantPVariantLinks"; + private const string PREFS_SHOW_PROGRESS = "AUD_Progress"; + + private static readonly GUIContent windowTitle = new GUIContent( "Asset Usage Detector" ); + private static readonly Vector2 windowMinSize = new Vector2( 325f, 220f ); + + private static readonly GUILayoutOption GL_WIDTH_12 = GUILayout.Width( 12f ); + + private GUIStyle lockButtonStyle; + + private readonly AssetUsageDetector core = new AssetUsageDetector(); + private SearchResult searchResult; // Overall search results + + // This isn't readonly so that it can be serialized + private List objectsToSearch = new List() { new ObjectToSearch( null ) }; + +#pragma warning disable 0649 + [SerializeField] // Since titleContent persists between Editor sessions, so should the IsLocked property because otherwise, "[L]" in title becomes confusing when the EditorWindow isn't actually locked + private bool m_isLocked; + private bool IsLocked + { + get { return m_isLocked; } + set + { + if( m_isLocked != value ) + { + m_isLocked = value; + titleContent = value ? new GUIContent( "[L] " + windowTitle.text, EditorGUIUtility.IconContent( "InspectorLock" ).image ) : windowTitle; + } + } + } +#pragma warning restore 0649 + + private Phase currentPhase = Phase.Setup; + + private bool searchInOpenScenes = true; // Scenes currently open in Hierarchy view + private bool searchInScenesInBuild = true; // Scenes in build + private bool searchInScenesInBuildTickedOnly = true; // Scenes in build (ticked only or not) + private bool searchInAllScenes = true; // All scenes (including scenes that are not in build) + private bool searchInSceneLightingSettings = true; // Window-Rendering-Lighting settings + private bool searchInAssetsFolder = true; // Assets in Project window + private bool dontSearchInSourceAssets = true; // objectsToSearch won't be searched for internal references + private bool searchInProjectSettings = true; // Player Settings, Graphics Settings etc. + + private List searchInAssetsSubset = new List() { null }; // If not empty, only these assets are searched for references + private List excludedAssets = new List() { null }; // These assets won't be searched for references + private List excludedScenes = new List() { null }; // These scenes won't be searched for references + + private int searchDepthLimit = 4; // Depth limit for recursively searching variables of objects + + private bool lazySceneSearch = true; +#if ASSET_USAGE_ADDRESSABLES + private bool addressablesSupport = false; +#endif + private bool searchNonSerializableVariables = true; + private bool searchUnusedMaterialProperties = true; + private bool calculateUnusedObjects = false; + private bool hideDuplicateRows = true; + private bool hideReduntantPrefabVariantLinks = true; + private bool noAssetDatabaseChanges = false; + private bool showDetailedProgressBar = true; + + private BindingFlags fieldModifiers, propertyModifiers; + + private SearchRefactoring searchRefactoring = null; // Its value can be assigned via ShowAndSearch + + private readonly ObjectToSearchListDrawer objectsToSearchDrawer = new ObjectToSearchListDrawer(); + private readonly ObjectListDrawer searchInAssetsSubsetDrawer = new ObjectListDrawer( "Search following asset(s) only:", false ); + private readonly ObjectListDrawer excludedAssetsDrawer = new ObjectListDrawer( "Don't search following asset(s):", false ); + private readonly ObjectListDrawer excludedScenesDrawer = new ObjectListDrawer( "Don't search in following scene(s):", false ); + + private bool drawObjectsToSearchSection = true; + + private Vector2 scrollPosition = Vector2.zero; + + private bool shouldRepositionSelf; + private Rect windowTargetPosition; + + void IHasCustomMenu.AddItemsToMenu( GenericMenu contextMenu ) + { + contextMenu.AddItem( new GUIContent( "Lock" ), IsLocked, () => IsLocked = !IsLocked ); + contextMenu.AddSeparator( "" ); + +#if UNITY_2018_3_OR_NEWER + contextMenu.AddItem( new GUIContent( "Settings" ), false, () => SettingsService.OpenProjectSettings( "Project/yasirkula/Asset Usage Detector" ) ); +#else + contextMenu.AddItem( new GUIContent( "Settings" ), false, () => + { + System.Type preferencesWindowType = typeof( EditorWindow ).Assembly.GetType( "UnityEditor.PreferencesWindow" ); + preferencesWindowType.GetMethod( "ShowPreferencesWindow", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static ).Invoke( null, null ); + + EditorWindow preferencesWindow = GetWindow( preferencesWindowType ); + if( (bool) preferencesWindowType.GetField( "m_RefreshCustomPreferences", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance ).GetValue( preferencesWindow ) ) + { + preferencesWindowType.GetMethod( "AddCustomSections", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance ).Invoke( preferencesWindow, null ); + preferencesWindowType.GetField( "m_RefreshCustomPreferences", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance ).SetValue( preferencesWindow, false ); + } + + int targetSectionIndex = -1; + System.Collections.IList sections = (System.Collections.IList) preferencesWindowType.GetField( "m_Sections", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance ).GetValue( preferencesWindow ); + for( int i = 0; i < sections.Count; i++ ) + { + if( ( (GUIContent) sections[i].GetType().GetField( "content", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance ).GetValue( sections[i] ) ).text == "Asset Usage Detector" ) + { + targetSectionIndex = i; + break; + } + } + + if( targetSectionIndex >= 0 ) + preferencesWindowType.GetProperty( "selectedSectionIndex", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance ).SetValue( preferencesWindow, targetSectionIndex, null ); + } ); +#endif + + if( currentPhase == Phase.Setup ) + { + contextMenu.AddSeparator( "" ); + contextMenu.AddItem( new GUIContent( "Refresh Sub-Assets of Searched Objects" ), false, () => + { + for( int i = objectsToSearch.Count - 1; i >= 0; i-- ) + objectsToSearch[i].RefreshSubAssets(); + } ); + } + else if( currentPhase == Phase.Complete ) + { + if( searchResult != null && searchResult.NumberOfGroups > 0 ) + { + contextMenu.AddSeparator( "" ); + contextMenu.AddItem( new GUIContent( "Collapse All" ), false, searchResult.CollapseAllSearchResultGroups ); + } + } + } + + // Shows lock button at the top-right corner + // Credit: http://leahayes.co.uk/2013/04/30/adding-the-little-padlock-button-to-your-editorwindow.html + private void ShowButton( Rect position ) + { + if( lockButtonStyle == null ) + lockButtonStyle = "IN LockButton"; + + IsLocked = GUI.Toggle( position, IsLocked, GUIContent.none, lockButtonStyle ); + } + + private static AssetUsageDetectorWindow GetWindow( WindowFilter filter ) + { + AssetUsageDetectorWindow[] windows = Resources.FindObjectsOfTypeAll(); + AssetUsageDetectorWindow window = System.Array.Find( windows, ( w ) => w && !w.IsLocked ); + if( !window ) + window = System.Array.Find( windows, ( w ) => w ); + + if( window && ( filter == WindowFilter.AlwaysReturnActive || ( !window.IsLocked && filter == WindowFilter.ReturnActiveIfNotLocked ) ) ) + { + window.Show(); + window.Focus(); + + return window; + } + + Rect? windowTargetPosition = null; + if( window ) + { + Rect position = window.position; + position.position += new Vector2( 50f, 50f ); + windowTargetPosition = position; + } + + window = CreateInstance(); + window.titleContent = windowTitle; + window.minSize = windowMinSize; + + if( windowTargetPosition.HasValue ) + { + window.shouldRepositionSelf = true; + window.windowTargetPosition = windowTargetPosition.Value; + } + + window.Show( true ); + window.Focus(); + + return window; + } + + [MenuItem( "Window/Asset Usage Detector/Active Window" )] + private static void OpenActiveWindow() + { + GetWindow( WindowFilter.AlwaysReturnActive ); + } + + [MenuItem( "Window/Asset Usage Detector/New Window" )] + private static void OpenNewWindow() + { + GetWindow( WindowFilter.AlwaysReturnNew ); + } + + // Quickly initiate search for the selected assets + [MenuItem( "GameObject/Search for References/This Object Only", priority = 49 )] + [MenuItem( "Assets/Search for References", priority = 1000 )] + private static void SearchSelectedAssetReferences( MenuCommand command ) + { + // This happens when this button is clicked via hierarchy's right click context menu + // and is called once for each object in the selection. We don't want that, we want + // the function to be called only once + if( command.context ) + { + EditorApplication.update -= CallSearchSelectedAssetReferencesOnce; + EditorApplication.update += CallSearchSelectedAssetReferencesOnce; + } + else + ShowAndSearch( Selection.objects ); + } + + [MenuItem( "GameObject/Search for References/Include Children", priority = 49 )] + private static void SearchSelectedAssetReferencesWithChildren( MenuCommand command ) + { + if( command.context ) + { + EditorApplication.update -= CallSearchSelectedAssetReferencesWithChildrenOnce; + EditorApplication.update += CallSearchSelectedAssetReferencesWithChildrenOnce; + } + else + ShowAndSearch( Selection.objects, true ); + } + + // Show the menu item only if there is a selection in the Editor + [MenuItem( "GameObject/Search for References/This Object Only", validate = true )] + [MenuItem( "GameObject/Search for References/Include Children", validate = true )] + [MenuItem( "Assets/Search for References", validate = true )] + private static bool SearchSelectedAssetReferencesValidate( MenuCommand command ) + { + return Selection.objects.Length > 0; + } + + // Quickly show the AssetUsageDetector window and initiate a search + public static void ShowAndSearch( IEnumerable searchObjects, bool? shouldSearchChildren = null ) + { + GetWindow( WindowFilter.ReturnActiveIfNotLocked ).ShowAndSearchInternal( searchObjects, null, shouldSearchChildren ); + } + + // Quickly show the AssetUsageDetector window and initiate a search + public static void ShowAndSearch( AssetUsageDetector.Parameters searchParameters, bool? shouldSearchChildren = null ) + { + if( searchParameters == null ) + { + Debug.LogError( "searchParameters can't be null!" ); + return; + } + + GetWindow( WindowFilter.ReturnActiveIfNotLocked ).ShowAndSearchInternal( searchParameters.objectsToSearch, searchParameters, shouldSearchChildren ); + } + + private static void CallSearchSelectedAssetReferencesOnce() + { + EditorApplication.update -= CallSearchSelectedAssetReferencesOnce; + SearchSelectedAssetReferences( new MenuCommand( null ) ); + } + + private static void CallSearchSelectedAssetReferencesWithChildrenOnce() + { + EditorApplication.update -= CallSearchSelectedAssetReferencesWithChildrenOnce; + SearchSelectedAssetReferencesWithChildren( new MenuCommand( null ) ); + } + + private void ShowAndSearchInternal( IEnumerable searchObjects, AssetUsageDetector.Parameters searchParameters, bool? shouldSearchChildren ) + { + if( !ReturnToSetupPhase() ) + { + Debug.LogError( "Need to reset the previous search first!" ); + return; + } + + objectsToSearch.Clear(); + if( searchObjects != null ) + { + foreach( Object obj in searchObjects ) + objectsToSearch.Add( new ObjectToSearch( obj, shouldSearchChildren ) ); + } + + if( searchParameters != null ) + { + ParseSceneSearchMode( searchParameters.searchInScenes ); + searchInSceneLightingSettings = searchParameters.searchInSceneLightingSettings; + searchInAssetsFolder = searchParameters.searchInAssetsFolder; + dontSearchInSourceAssets = searchParameters.dontSearchInSourceAssets; + searchInProjectSettings = searchParameters.searchInProjectSettings; + searchDepthLimit = searchParameters.searchDepthLimit; + fieldModifiers = searchParameters.fieldModifiers; + propertyModifiers = searchParameters.propertyModifiers; + searchNonSerializableVariables = searchParameters.searchNonSerializableVariables; + searchUnusedMaterialProperties = searchParameters.searchUnusedMaterialProperties; + searchRefactoring = searchParameters.searchRefactoring; + lazySceneSearch = searchParameters.lazySceneSearch; +#if ASSET_USAGE_ADDRESSABLES + addressablesSupport = searchParameters.addressablesSupport; +#endif + calculateUnusedObjects = searchParameters.calculateUnusedObjects; + hideDuplicateRows = searchParameters.hideDuplicateRows; + hideReduntantPrefabVariantLinks = searchParameters.hideReduntantPrefabVariantLinks; + noAssetDatabaseChanges = searchParameters.noAssetDatabaseChanges; + showDetailedProgressBar = searchParameters.showDetailedProgressBar; + + searchInAssetsSubset.Clear(); + if( searchParameters.searchInAssetsSubset != null ) + { + foreach( Object obj in searchParameters.searchInAssetsSubset ) + searchInAssetsSubset.Add( obj ); + } + + excludedAssets.Clear(); + if( searchParameters.excludedAssetsFromSearch != null ) + { + foreach( Object obj in searchParameters.excludedAssetsFromSearch ) + excludedAssets.Add( obj ); + } + + excludedScenes.Clear(); + if( searchParameters.excludedScenesFromSearch != null ) + { + foreach( Object obj in searchParameters.excludedScenesFromSearch ) + excludedScenes.Add( obj ); + } + } + + InitiateSearch(); + Repaint(); + } + + private void Awake() + { + LoadPrefs(); + } + + private void OnEnable() + { + if( currentPhase == Phase.Complete && AssetUsageDetectorSettings.ShowCustomTooltip ) + wantsMouseMove = wantsMouseEnterLeaveWindow = true; // These values aren't preserved during domain reload on Unity 2020.3.0f1 + +#if UNITY_2018_3_OR_NEWER + PrefabStage.prefabStageClosing -= ReplacePrefabStageObjectsWithAssets; + PrefabStage.prefabStageClosing += ReplacePrefabStageObjectsWithAssets; +#endif + } + + private void OnDisable() + { +#if UNITY_2018_3_OR_NEWER + PrefabStage.prefabStageClosing -= ReplacePrefabStageObjectsWithAssets; +#endif + SearchResultTooltip.Hide(); + } + + private void OnDestroy() + { + if( core != null ) + core.SaveCache(); + + SavePrefs(); + + if( searchResult != null && currentPhase == Phase.Complete ) + searchResult.RestoreInitialSceneSetup(); + } + + private void SavePrefs() + { + EditorPrefs.SetInt( PREFS_SEARCH_SCENES, (int) GetSceneSearchMode( false ) ); + EditorPrefs.SetBool( PREFS_SEARCH_SCENE_LIGHTING_SETTINGS, searchInSceneLightingSettings ); + EditorPrefs.SetBool( PREFS_SEARCH_ASSETS, searchInAssetsFolder ); + EditorPrefs.SetBool( PREFS_DONT_SEARCH_SOURCE_ASSETS, dontSearchInSourceAssets ); + EditorPrefs.SetBool( PREFS_SEARCH_PROJECT_SETTINGS, searchInProjectSettings ); + EditorPrefs.SetInt( PREFS_SEARCH_DEPTH_LIMIT, searchDepthLimit ); + EditorPrefs.SetInt( PREFS_SEARCH_FIELDS, (int) fieldModifiers ); + EditorPrefs.SetInt( PREFS_SEARCH_PROPERTIES, (int) propertyModifiers ); + EditorPrefs.SetBool( PREFS_SEARCH_NON_SERIALIZABLES, searchNonSerializableVariables ); + EditorPrefs.SetBool( PREFS_SEARCH_UNUSED_MATERIAL_PROPERTIES, searchUnusedMaterialProperties ); + EditorPrefs.SetBool( PREFS_LAZY_SCENE_SEARCH, lazySceneSearch ); +#if ASSET_USAGE_ADDRESSABLES + EditorPrefs.SetBool( PREFS_ADDRESSABLES_SUPPORT, addressablesSupport ); +#endif + EditorPrefs.SetBool( PREFS_CALCULATE_UNUSED_OBJECTS, calculateUnusedObjects ); + EditorPrefs.SetBool( PREFS_HIDE_DUPLICATE_ROWS, hideDuplicateRows ); + EditorPrefs.SetBool( PREFS_HIDE_REDUNDANT_PREFAB_VARIANT_LINKS, hideReduntantPrefabVariantLinks ); + EditorPrefs.SetBool( PREFS_SHOW_PROGRESS, showDetailedProgressBar ); + } + + private void LoadPrefs() + { + ParseSceneSearchMode( (SceneSearchMode) EditorPrefs.GetInt( PREFS_SEARCH_SCENES, (int) ( SceneSearchMode.OpenScenes | SceneSearchMode.ScenesInBuildSettingsTickedOnly | SceneSearchMode.AllScenes ) ) ); + searchInSceneLightingSettings = EditorPrefs.GetBool( PREFS_SEARCH_SCENE_LIGHTING_SETTINGS, true ); + searchInAssetsFolder = EditorPrefs.GetBool( PREFS_SEARCH_ASSETS, true ); + dontSearchInSourceAssets = EditorPrefs.GetBool( PREFS_DONT_SEARCH_SOURCE_ASSETS, true ); + searchInProjectSettings = EditorPrefs.GetBool( PREFS_SEARCH_PROJECT_SETTINGS, true ); + searchDepthLimit = EditorPrefs.GetInt( PREFS_SEARCH_DEPTH_LIMIT, 4 ); + fieldModifiers = (BindingFlags) EditorPrefs.GetInt( PREFS_SEARCH_FIELDS, (int) ( BindingFlags.Public | BindingFlags.NonPublic ) ); + propertyModifiers = (BindingFlags) EditorPrefs.GetInt( PREFS_SEARCH_PROPERTIES, (int) ( BindingFlags.Public | BindingFlags.NonPublic ) ); + searchNonSerializableVariables = EditorPrefs.GetBool( PREFS_SEARCH_NON_SERIALIZABLES, true ); + searchUnusedMaterialProperties = EditorPrefs.GetBool( PREFS_SEARCH_UNUSED_MATERIAL_PROPERTIES, true ); + lazySceneSearch = EditorPrefs.GetBool( PREFS_LAZY_SCENE_SEARCH, true ); +#if ASSET_USAGE_ADDRESSABLES + addressablesSupport = EditorPrefs.GetBool( PREFS_ADDRESSABLES_SUPPORT, false ); +#endif + calculateUnusedObjects = EditorPrefs.GetBool( PREFS_CALCULATE_UNUSED_OBJECTS, false ); + hideDuplicateRows = EditorPrefs.GetBool( PREFS_HIDE_DUPLICATE_ROWS, true ); + hideReduntantPrefabVariantLinks = EditorPrefs.GetBool( PREFS_HIDE_REDUNDANT_PREFAB_VARIANT_LINKS, true ); + showDetailedProgressBar = EditorPrefs.GetBool( PREFS_SHOW_PROGRESS, true ); + } + + private SceneSearchMode GetSceneSearchMode( bool hideOptionsInPlayMode ) + { + SceneSearchMode sceneSearchMode = SceneSearchMode.None; + if( searchInOpenScenes ) + sceneSearchMode |= SceneSearchMode.OpenScenes; + if( !hideOptionsInPlayMode || !EditorApplication.isPlaying ) + { + if( searchInScenesInBuild ) + sceneSearchMode |= searchInScenesInBuildTickedOnly ? SceneSearchMode.ScenesInBuildSettingsTickedOnly : SceneSearchMode.ScenesInBuildSettingsAll; + if( searchInAllScenes ) + sceneSearchMode |= SceneSearchMode.AllScenes; + } + + return sceneSearchMode; + } + + private void ParseSceneSearchMode( SceneSearchMode sceneSearchMode ) + { + searchInOpenScenes = ( sceneSearchMode & SceneSearchMode.OpenScenes ) == SceneSearchMode.OpenScenes; + searchInScenesInBuild = ( sceneSearchMode & SceneSearchMode.ScenesInBuildSettingsAll ) == SceneSearchMode.ScenesInBuildSettingsAll || ( sceneSearchMode & SceneSearchMode.ScenesInBuildSettingsTickedOnly ) == SceneSearchMode.ScenesInBuildSettingsTickedOnly; + searchInScenesInBuildTickedOnly = ( sceneSearchMode & SceneSearchMode.ScenesInBuildSettingsAll ) != SceneSearchMode.ScenesInBuildSettingsAll; + searchInAllScenes = ( sceneSearchMode & SceneSearchMode.AllScenes ) == SceneSearchMode.AllScenes; + } + + private void Update() + { + if( shouldRepositionSelf ) + { + shouldRepositionSelf = false; + position = windowTargetPosition; + } + } + + private void OnGUI() + { + // Make the window scrollable + scrollPosition = EditorGUILayout.BeginScrollView( scrollPosition, Utilities.GL_EXPAND_WIDTH, Utilities.GL_EXPAND_HEIGHT ); + + GUILayout.BeginVertical(); + + if( currentPhase == Phase.Processing ) + { + // If we are stuck at this phase, then we have encountered an exception + GUILayout.Label( ". . . Search in progress or something went wrong (check console) . . ." ); + + if( GUILayout.Button( "RETURN", Utilities.GL_HEIGHT_30 ) ) + { + ReturnToSetupPhase(); + GUIUtility.ExitGUI(); + } + } + else if( currentPhase == Phase.Setup ) + { + DrawObjectsToSearchSection(); + + GUILayout.Space( 10f ); + + Color c = GUI.backgroundColor; + GUI.backgroundColor = AssetUsageDetectorSettings.SettingsHeaderColor; + GUILayout.Box( "SEARCH IN", Utilities.BoxGUIStyle, Utilities.GL_EXPAND_WIDTH ); + GUI.backgroundColor = c; + + searchInAssetsFolder = WordWrappingToggleLeft( "Project window (Assets folder)", searchInAssetsFolder ); + + if( searchInAssetsFolder ) + { + GUILayout.BeginHorizontal(); + GUILayout.Space( 35f ); + GUILayout.BeginVertical(); + + searchInAssetsSubsetDrawer.Draw( searchInAssetsSubset ); + excludedAssetsDrawer.Draw( excludedAssets ); + + GUILayout.EndVertical(); + GUILayout.EndHorizontal(); + } + + GUILayout.Space( 5f ); + + dontSearchInSourceAssets = WordWrappingToggleLeft( "Don't search \"SEARCHED OBJECTS\" themselves for references", dontSearchInSourceAssets ); + searchUnusedMaterialProperties = WordWrappingToggleLeft( "Search unused material properties (e.g. normal map of a material that no longer uses normal mapping)", searchUnusedMaterialProperties ); + + Utilities.DrawSeparatorLine(); + + if( searchInAllScenes && !EditorApplication.isPlaying ) + GUI.enabled = false; + + searchInOpenScenes = WordWrappingToggleLeft( "Currently open (loaded) scene(s)", searchInOpenScenes ); + + if( !EditorApplication.isPlaying ) + { + searchInScenesInBuild = WordWrappingToggleLeft( "Scenes in Build Settings", searchInScenesInBuild ); + + if( searchInScenesInBuild ) + { + GUILayout.BeginHorizontal(); + GUILayout.Space( 35f ); + + searchInScenesInBuildTickedOnly = EditorGUILayout.ToggleLeft( "Ticked only", searchInScenesInBuildTickedOnly, Utilities.GL_WIDTH_100 ); + searchInScenesInBuildTickedOnly = !EditorGUILayout.ToggleLeft( "All", !searchInScenesInBuildTickedOnly, Utilities.GL_WIDTH_100 ); + + GUILayout.EndHorizontal(); + } + + GUI.enabled = true; + + searchInAllScenes = WordWrappingToggleLeft( "All scenes in the project", searchInAllScenes ); + } + + GUILayout.BeginHorizontal(); + GUILayout.Space( 35f ); + GUILayout.BeginVertical(); + + excludedScenesDrawer.Draw( excludedScenes ); + + GUILayout.EndVertical(); + GUILayout.EndHorizontal(); + + EditorGUI.BeginDisabledGroup( !searchInOpenScenes && !searchInScenesInBuild && !searchInAllScenes ); + searchInSceneLightingSettings = WordWrappingToggleLeft( "Scene Lighting Settings (WARNING: This may change the active scene during search)", searchInSceneLightingSettings ); + EditorGUI.EndDisabledGroup(); + + Utilities.DrawSeparatorLine(); + + searchInProjectSettings = WordWrappingToggleLeft( "Project Settings (Player Settings, Graphics Settings etc.)", searchInProjectSettings ); + + GUILayout.Space( 10f ); + + GUI.backgroundColor = AssetUsageDetectorSettings.SettingsHeaderColor; + GUILayout.Box( "SETTINGS", Utilities.BoxGUIStyle, Utilities.GL_EXPAND_WIDTH ); + GUI.backgroundColor = c; + +#if ASSET_USAGE_ADDRESSABLES + EditorGUI.BeginDisabledGroup( addressablesSupport ); +#endif + lazySceneSearch = WordWrappingToggleLeft( "Lazy scene search: scenes are searched in detail only when they are manually refreshed (faster search)", lazySceneSearch ); +#if ASSET_USAGE_ADDRESSABLES + EditorGUI.EndDisabledGroup(); + addressablesSupport = WordWrappingToggleLeft( "Addressables support (Experimental) (WARNING: 'Lazy scene search' will be disabled) (slower search)", addressablesSupport ); +#endif + calculateUnusedObjects = WordWrappingToggleLeft( "Calculate unused objects", calculateUnusedObjects ); + hideDuplicateRows = WordWrappingToggleLeft( "Hide duplicate rows in search results", hideDuplicateRows ); +#if UNITY_2018_3_OR_NEWER + hideReduntantPrefabVariantLinks = WordWrappingToggleLeft( "Hide redundant prefab variant links (when the same value is assigned to the same Component of a prefab and its variant(s))", hideReduntantPrefabVariantLinks ); +#endif + noAssetDatabaseChanges = WordWrappingToggleLeft( "I haven't modified any assets/scenes since the last search (faster search)", noAssetDatabaseChanges ); + showDetailedProgressBar = WordWrappingToggleLeft( "Update search progress bar more often (cancelable search) (slower search)", showDetailedProgressBar ); + + GUILayout.Space( 10f ); + + // Don't let the user press the GO button without any valid search location + if( !searchInAllScenes && !searchInOpenScenes && !searchInScenesInBuild && !searchInAssetsFolder && !searchInProjectSettings ) + GUI.enabled = false; + + if( GUILayout.Button( "GO!", Utilities.GL_HEIGHT_30 ) ) + { + InitiateSearch(); + GUIUtility.ExitGUI(); + } + + GUILayout.Space( 5f ); + } + else if( currentPhase == Phase.Complete ) + { + // Draw the results of the search + GUI.enabled = false; + + DrawObjectsToSearchSection(); + + if( drawObjectsToSearchSection ) + GUILayout.Space( 10f ); + + GUI.enabled = true; + + if( GUILayout.Button( "Reset Search", Utilities.GL_HEIGHT_30 ) ) + { + ReturnToSetupPhase(); + GUIUtility.ExitGUI(); + } + + if( searchResult == null ) + { + EditorGUILayout.HelpBox( "ERROR: searchResult is null", MessageType.Error ); + return; + } + else if( !searchResult.SearchCompletedSuccessfully ) + EditorGUILayout.HelpBox( "ERROR: search was interrupted, check the logs for more info", MessageType.Error ); + + if( searchResult.NumberOfGroups == 0 ) + { + GUILayout.Space( 10f ); + GUILayout.Box( "No references found...", Utilities.BoxGUIStyle, Utilities.GL_EXPAND_WIDTH ); + } + else + { + noAssetDatabaseChanges = WordWrappingToggleLeft( "I haven't modified any assets/scenes since the last search (faster Refresh)", noAssetDatabaseChanges ); + + EditorGUILayout.Space(); + + scrollPosition.y = searchResult.DrawOnGUI( this, scrollPosition.y, noAssetDatabaseChanges ); + } + } + + if( Event.current.type == EventType.MouseLeaveWindow ) + { + SearchResultTooltip.Hide(); + + if( searchResult != null ) + searchResult.CancelDelayedTreeViewTooltip(); + } + + GUILayout.EndVertical(); + + EditorGUILayout.EndScrollView(); + } + + private void DrawObjectsToSearchSection() + { + Color c = GUI.backgroundColor; + GUI.backgroundColor = AssetUsageDetectorSettings.SettingsHeaderColor; + GUILayout.Box( "SEARCHED OBJECTS", Utilities.BoxGUIStyle, Utilities.GL_EXPAND_WIDTH ); + GUI.backgroundColor = c; + + Rect searchedObjectsHeaderRect = GUILayoutUtility.GetLastRect(); + searchedObjectsHeaderRect.x += 5f; + searchedObjectsHeaderRect.yMin += ( searchedObjectsHeaderRect.height - EditorGUIUtility.singleLineHeight ) * 0.5f; + searchedObjectsHeaderRect.height = EditorGUIUtility.singleLineHeight; + + drawObjectsToSearchSection = EditorGUI.Foldout( searchedObjectsHeaderRect, drawObjectsToSearchSection, GUIContent.none, true ); + + if( drawObjectsToSearchSection ) + objectsToSearchDrawer.Draw( objectsToSearch ); + } + + public static bool WordWrappingToggleLeft( string label, bool value ) + { + GUILayout.BeginHorizontal(); + bool result = EditorGUILayout.ToggleLeft( GUIContent.none, value, GL_WIDTH_12 ); + if( GUILayout.Button( label, EditorStyles.wordWrappedLabel ) ) + { + GUI.FocusControl( null ); + result = !value; + } + GUILayout.EndHorizontal(); + + return result; + } + + private void InitiateSearch() + { + currentPhase = Phase.Processing; + + SavePrefs(); + +#if UNITY_2018_3_OR_NEWER + ReplacePrefabStageObjectsWithAssets( PrefabStageUtility.GetCurrentPrefabStage() ); +#endif + + // Start searching + searchResult = core.Run( new AssetUsageDetector.Parameters() + { + objectsToSearch = !objectsToSearch.IsEmpty() ? new ObjectToSearchEnumerator( objectsToSearch ).ToArray() : null, + searchInScenes = GetSceneSearchMode( true ), + searchInSceneLightingSettings = searchInSceneLightingSettings, + searchInAssetsFolder = searchInAssetsFolder, + searchInAssetsSubset = !searchInAssetsSubset.IsEmpty() ? searchInAssetsSubset.ToArray() : null, + excludedAssetsFromSearch = !excludedAssets.IsEmpty() ? excludedAssets.ToArray() : null, + dontSearchInSourceAssets = dontSearchInSourceAssets, + excludedScenesFromSearch = !excludedScenes.IsEmpty() ? excludedScenes.ToArray() : null, + searchInProjectSettings = searchInProjectSettings, + //fieldModifiers = fieldModifiers, + //propertyModifiers = propertyModifiers, + //searchDepthLimit = searchDepthLimit, + //searchNonSerializableVariables = searchNonSerializableVariables, + searchUnusedMaterialProperties = searchUnusedMaterialProperties, + searchRefactoring = searchRefactoring, +#if ASSET_USAGE_ADDRESSABLES + lazySceneSearch = lazySceneSearch && !addressablesSupport, + addressablesSupport = addressablesSupport, +#else + lazySceneSearch = lazySceneSearch, +#endif + calculateUnusedObjects = calculateUnusedObjects, + hideDuplicateRows = hideDuplicateRows, + hideReduntantPrefabVariantLinks = hideReduntantPrefabVariantLinks, + noAssetDatabaseChanges = noAssetDatabaseChanges, + showDetailedProgressBar = showDetailedProgressBar + } ); + + currentPhase = Phase.Complete; + + // We really don't want SearchRefactoring to affect next searches unless the search is initiated via ShowAndSearch again + searchRefactoring = null; + + if( AssetUsageDetectorSettings.ShowCustomTooltip ) + wantsMouseMove = wantsMouseEnterLeaveWindow = true; + } + +#if UNITY_2018_3_OR_NEWER + // Try replacing searched objects who are part of currently open prefab stage with their corresponding prefab assets + public void ReplacePrefabStageObjectsWithAssets( PrefabStage prefabStage ) + { + if( prefabStage == null || !prefabStage.stageHandle.IsValid() ) + return; + +#if UNITY_2020_1_OR_NEWER + GameObject prefabAsset = AssetDatabase.LoadAssetAtPath( prefabStage.assetPath ); +#else + GameObject prefabAsset = AssetDatabase.LoadAssetAtPath( prefabStage.prefabAssetPath ); +#endif + if( prefabAsset == null || prefabAsset.Equals( null ) ) + return; + + for( int i = 0; i < objectsToSearch.Count; i++ ) + { + Object obj = objectsToSearch[i].obj; + if( obj != null && !obj.Equals( null ) && obj is GameObject && prefabStage.IsPartOfPrefabContents( (GameObject) obj ) ) + { + GameObject prefabStageObjectSource = ( (GameObject) obj ).FollowSymmetricHierarchy( prefabStage.prefabContentsRoot, prefabAsset ); + if( prefabStageObjectSource != null ) + objectsToSearch[i].obj = prefabStageObjectSource; + + List subAssets = objectsToSearch[i].subAssets; + for( int j = 0; j < subAssets.Count; j++ ) + { + obj = subAssets[j].subAsset; + if( obj != null && !obj.Equals( null ) && obj is GameObject && prefabStage.IsPartOfPrefabContents( (GameObject) obj ) ) + { + prefabStageObjectSource = ( (GameObject) obj ).FollowSymmetricHierarchy( prefabStage.prefabContentsRoot, prefabAsset ); + if( prefabStageObjectSource != null ) + subAssets[j].subAsset = prefabStageObjectSource; + } + } + } + } + } +#endif + + private bool ReturnToSetupPhase() + { + if( searchResult != null && !EditorApplication.isPlaying && !searchResult.RestoreInitialSceneSetup() ) + return false; + + searchResult = null; + currentPhase = Phase.Setup; + wantsMouseMove = wantsMouseEnterLeaveWindow = false; + + SearchResultTooltip.Hide(); + + return true; + } + + internal void OnSettingsChanged( bool highlightedSearchTextColorChanged = false, bool tooltipDescriptionsColorChanged = false ) + { + if( searchResult == null ) + return; + + wantsMouseMove = wantsMouseEnterLeaveWindow = AssetUsageDetectorSettings.ShowCustomTooltip; + + for( int i = searchResult.NumberOfGroups - 1; i >= 0; i-- ) + { + if( searchResult[i].treeView != null ) + { + searchResult[i].treeView.rowHeight = EditorGUIUtility.singleLineHeight + AssetUsageDetectorSettings.ExtraRowHeight; + searchResult[i].treeView.OnSettingsChanged( highlightedSearchTextColorChanged, tooltipDescriptionsColorChanged ); + } + } + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/AssetUsageDetector/Editor/AssetUsageDetectorWindow.cs.meta b/Assets/Plugins/AssetUsageDetector/Editor/AssetUsageDetectorWindow.cs.meta new file mode 100644 index 00000000..95c1c9fd --- /dev/null +++ b/Assets/Plugins/AssetUsageDetector/Editor/AssetUsageDetectorWindow.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 271a22c69c3d96c4dbdd04cca415a840 +timeCreated: 1520032279 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/AssetUsageDetector/Editor/Enumerators.cs b/Assets/Plugins/AssetUsageDetector/Editor/Enumerators.cs new file mode 100644 index 00000000..2280128c --- /dev/null +++ b/Assets/Plugins/AssetUsageDetector/Editor/Enumerators.cs @@ -0,0 +1,130 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace AssetUsageDetectorNamespace +{ + public class EmptyEnumerator : IEnumerable, IEnumerator + { + public T Current { get { return default( T ); } } + object IEnumerator.Current { get { return Current; } } + + public void Dispose() { } + public void Reset() { } + + public bool MoveNext() + { + return false; + } + + public IEnumerator GetEnumerator() + { + return this; + } + + IEnumerator IEnumerable.GetEnumerator() + { + return this; + } + } + + public class ObjectToSearchEnumerator : IEnumerable + { + public class Enumerator : IEnumerator + { + public Object Current + { + get + { + if( subAssetIndex < 0 ) + return source[index].obj; + + return source[index].subAssets[subAssetIndex].subAsset; + } + } + + object IEnumerator.Current { get { return Current; } } + + private List source; + private int index; + private int subAssetIndex; + + public Enumerator( List source ) + { + this.source = source; + Reset(); + } + + public void Dispose() + { + source = null; + } + + public bool MoveNext() + { + if( subAssetIndex < -1 ) + { + subAssetIndex = -1; + + if( ++index >= source.Count ) + return false; + + // Skip folder assets in the enumeration, AssetUsageDetector expands encountered folders automatically + // and we don't want that to happen as source[index].subAssets already contains the folder's contents + if( !source[index].obj.IsFolder() ) + return true; + } + + List subAssets = source[index].subAssets; + if( subAssets != null ) + { + while( ++subAssetIndex < subAssets.Count && !subAssets[subAssetIndex].shouldSearch ) + continue; + + if( subAssetIndex < subAssets.Count ) + return true; + } + + subAssetIndex = -2; + return MoveNext(); + } + + public void Reset() + { + index = -1; + subAssetIndex = -2; + } + } + + private readonly List source; + + public ObjectToSearchEnumerator( List source ) + { + this.source = source; + } + + public IEnumerator GetEnumerator() + { + return new Enumerator( source ); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + public Object[] ToArray() + { + int count = 0; + foreach( Object obj in this ) + count++; + + Object[] result = new Object[count]; + int index = 0; + foreach( Object obj in this ) + result[index++] = obj; + + return result; + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/AssetUsageDetector/Editor/Enumerators.cs.meta b/Assets/Plugins/AssetUsageDetector/Editor/Enumerators.cs.meta new file mode 100644 index 00000000..498a808a --- /dev/null +++ b/Assets/Plugins/AssetUsageDetector/Editor/Enumerators.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 894047c47ce45cf40939dae24afcc72b +timeCreated: 1562079461 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/AssetUsageDetector/Editor/ListDrawer.cs b/Assets/Plugins/AssetUsageDetector/Editor/ListDrawer.cs new file mode 100644 index 00000000..d7d50dd2 --- /dev/null +++ b/Assets/Plugins/AssetUsageDetector/Editor/ListDrawer.cs @@ -0,0 +1,252 @@ +using System.Collections.Generic; +using UnityEditor; +using UnityEngine; + +namespace AssetUsageDetectorNamespace +{ + public abstract class ListDrawer + { + private readonly string label; + private readonly bool acceptSceneObjects; + + protected ListDrawer( string label, bool acceptSceneObjects ) + { + this.label = label; + this.acceptSceneObjects = acceptSceneObjects; + } + + // Exposes a list on GUI + public bool Draw( List list ) + { + bool hasChanged = false; + bool guiEnabled = GUI.enabled; + + Event ev = Event.current; + + GUILayout.BeginHorizontal(); + + GUILayout.Label( label ); + + if( guiEnabled ) + { + // Handle drag & drop references to array + // Credit: https://answers.unity.com/answers/657877/view.html + if( ( ev.type == EventType.DragPerform || ev.type == EventType.DragUpdated ) && GUILayoutUtility.GetLastRect().Contains( ev.mousePosition ) ) + { + DragAndDrop.visualMode = DragAndDropVisualMode.Copy; + if( ev.type == EventType.DragPerform ) + { + DragAndDrop.AcceptDrag(); + + Object[] draggedObjects = DragAndDrop.objectReferences; + if( draggedObjects.Length > 0 ) + { + for( int i = 0; i < draggedObjects.Length; i++ ) + { + if( draggedObjects[i] != null && !draggedObjects[i].Equals( null ) ) + { + bool replacedNullElement = false; + for( int j = 0; j < list.Count; j++ ) + { + if( IsElementNull( list[j] ) ) + { + list[j] = CreateElement( draggedObjects[i] ); + + replacedNullElement = true; + break; + } + } + + if( !replacedNullElement ) + list.Add( CreateElement( draggedObjects[i] ) ); + + hasChanged = true; + } + } + } + } + + ev.Use(); + } + else if( ev.type == EventType.ContextClick && GUILayoutUtility.GetLastRect().Contains( ev.mousePosition ) ) + { + GenericMenu contextMenu = new GenericMenu(); + contextMenu.AddItem( new GUIContent( "Clear" ), false, () => + { + list.Clear(); + list.Add( CreateElement( null ) ); + } ); + contextMenu.ShowAsContext(); + + ev.Use(); + } + + if( GUILayout.Button( "+", Utilities.GL_WIDTH_25 ) ) + list.Insert( 0, CreateElement( null ) ); + } + + GUILayout.EndHorizontal(); + + for( int i = 0; i < list.Count; i++ ) + { + T element = list[i]; + + GUI.changed = false; + GUILayout.BeginHorizontal(); + + Object prevObject = GetObjectFromElement( element ); + Object newObject = EditorGUILayout.ObjectField( "", prevObject, typeof( Object ), acceptSceneObjects ); + + if( GUI.changed ) + { + hasChanged = true; + SetObjectOfElement( list, i, newObject ); + } + + if( guiEnabled ) + { + if( GUILayout.Button( "+", Utilities.GL_WIDTH_25 ) ) + list.Insert( i + 1, CreateElement( null ) ); + + if( GUILayout.Button( "-", Utilities.GL_WIDTH_25 ) ) + { + if( element != null && !element.Equals( null ) ) + hasChanged = true; + + // Lists with no elements look ugly, always keep a dummy null variable + if( list.Count > 1 ) + list.RemoveAt( i-- ); + else + list[0] = CreateElement( null ); + } + } + + GUILayout.EndHorizontal(); + + PostElementDrawer( element ); + } + + return hasChanged; + } + + protected abstract T CreateElement( Object source ); + protected abstract Object GetObjectFromElement( T element ); + protected abstract void SetObjectOfElement( List list, int index, Object value ); + protected abstract bool IsElementNull( T element ); + protected abstract void PostElementDrawer( T element ); + } + + public class ObjectListDrawer : ListDrawer + { + public ObjectListDrawer( string label, bool acceptSceneObjects ) : base( label, acceptSceneObjects ) + { + } + + protected override Object CreateElement( Object source ) + { + return source; + } + + protected override Object GetObjectFromElement( Object element ) + { + return element; + } + + protected override void SetObjectOfElement( List list, int index, Object value ) + { + list[index] = value; + } + + protected override bool IsElementNull( Object element ) + { + return element == null || element.Equals( null ); + } + + protected override void PostElementDrawer( Object element ) + { + } + } + + public class ObjectToSearchListDrawer : ListDrawer + { + public ObjectToSearchListDrawer() : base( "Find references of:", true ) + { + } + + protected override ObjectToSearch CreateElement( Object source ) + { + return new ObjectToSearch( source ); + } + + protected override Object GetObjectFromElement( ObjectToSearch element ) + { + return element.obj; + } + + protected override void SetObjectOfElement( List list, int index, Object value ) + { + list[index].obj = value; + list[index].RefreshSubAssets(); + } + + protected override bool IsElementNull( ObjectToSearch element ) + { + return element == null || element.obj == null || element.obj.Equals( null ); + } + + protected override void PostElementDrawer( ObjectToSearch element ) + { + List subAssetsToSearch = element.subAssets; + if( subAssetsToSearch.Count > 0 ) + { + GUILayout.BeginHorizontal(); + + // 0-> all toggles off, 1-> mixed, 2-> all toggles on + bool toggleAllSubAssets = subAssetsToSearch[0].shouldSearch; + bool mixedToggle = false; + for( int j = 1; j < subAssetsToSearch.Count; j++ ) + { + if( subAssetsToSearch[j].shouldSearch != toggleAllSubAssets ) + { + mixedToggle = true; + break; + } + } + + if( mixedToggle ) + EditorGUI.showMixedValue = true; + + GUI.changed = false; + toggleAllSubAssets = EditorGUILayout.Toggle( toggleAllSubAssets, Utilities.GL_WIDTH_25 ); + if( GUI.changed ) + { + for( int j = 0; j < subAssetsToSearch.Count; j++ ) + subAssetsToSearch[j].shouldSearch = toggleAllSubAssets; + } + + EditorGUI.showMixedValue = false; + + element.showSubAssetsFoldout = EditorGUILayout.Foldout( element.showSubAssetsFoldout, "Include sub-assets in search:", true ); + + GUILayout.EndHorizontal(); + + if( element.showSubAssetsFoldout ) + { + for( int j = 0; j < subAssetsToSearch.Count; j++ ) + { + GUILayout.BeginHorizontal(); + + subAssetsToSearch[j].shouldSearch = EditorGUILayout.Toggle( subAssetsToSearch[j].shouldSearch, Utilities.GL_WIDTH_25 ); + + bool guiEnabled = GUI.enabled; + GUI.enabled = false; + EditorGUILayout.ObjectField( string.Empty, subAssetsToSearch[j].subAsset, typeof( Object ), true ); + GUI.enabled = guiEnabled; + + GUILayout.EndHorizontal(); + } + } + } + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/AssetUsageDetector/Editor/ListDrawer.cs.meta b/Assets/Plugins/AssetUsageDetector/Editor/ListDrawer.cs.meta new file mode 100644 index 00000000..555a3698 --- /dev/null +++ b/Assets/Plugins/AssetUsageDetector/Editor/ListDrawer.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 88a4a4e861026b2498a437ce1e12b054 +timeCreated: 1568758673 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/AssetUsageDetector/Editor/ObjectToSearch.cs b/Assets/Plugins/AssetUsageDetector/Editor/ObjectToSearch.cs new file mode 100644 index 00000000..24ad8ac3 --- /dev/null +++ b/Assets/Plugins/AssetUsageDetector/Editor/ObjectToSearch.cs @@ -0,0 +1,120 @@ +using System; +using System.Collections.Generic; +using UnityEditor; +using UnityEngine; +using Object = UnityEngine.Object; + +namespace AssetUsageDetectorNamespace +{ + [Serializable] + public class ObjectToSearch + { + [Serializable] + public class SubAsset + { + public Object subAsset; + public bool shouldSearch; + + public SubAsset( Object subAsset, bool shouldSearch ) + { + this.subAsset = subAsset; + this.shouldSearch = shouldSearch; + } + } + + public Object obj; + public List subAssets; + public bool showSubAssetsFoldout; + + private static HashSet currentSubAssets; + + public ObjectToSearch( Object obj, bool? shouldSearchChildren = null ) + { + this.obj = obj; + RefreshSubAssets( shouldSearchChildren ); + } + + public void RefreshSubAssets( bool? shouldSearchChildren = null ) + { + if( subAssets == null ) + subAssets = new List(); + else + subAssets.Clear(); + + if( currentSubAssets == null ) + currentSubAssets = new HashSet(); + else + currentSubAssets.Clear(); + + AddSubAssets( obj, false, shouldSearchChildren ); + currentSubAssets.Clear(); + } + + private void AddSubAssets( Object target, bool includeTarget, bool? shouldSearchChildren ) + { + if( target == null || target.Equals( null ) ) + return; + + if( !target.IsAsset() ) + { + GameObject go = target as GameObject; + if( !go || !go.scene.IsValid() ) + return; + + // If this is a scene object, add its child objects to the sub-assets list + // but don't include them in the search by default + Transform goTransform = go.transform; + Transform[] children = go.GetComponentsInChildren( true ); + for( int i = 0; i < children.Length; i++ ) + { + if( ReferenceEquals( children[i], goTransform ) ) + continue; + + subAssets.Add( new SubAsset( children[i].gameObject, shouldSearchChildren ?? false ) ); + } + } + else + { + if( !AssetDatabase.IsMainAsset( target ) || target is SceneAsset ) + return; + + if( includeTarget ) + { + if( currentSubAssets.Add( target ) ) + subAssets.Add( new SubAsset( target, shouldSearchChildren ?? true ) ); + } + else + { + // If asset is a directory, add all of its contents as sub-assets recursively + if( target.IsFolder() ) + { + foreach( string filePath in Utilities.EnumerateFolderContents( target ) ) + AddSubAssets( AssetDatabase.LoadAssetAtPath( filePath ), true, shouldSearchChildren ); + + return; + } + } + + // Find sub-asset(s) of the asset (if any) + Object[] assets = AssetDatabase.LoadAllAssetsAtPath( AssetDatabase.GetAssetPath( target ) ); + for( int i = 0; i < assets.Length; i++ ) + { + Object asset = assets[i]; + if( asset == null || asset.Equals( null ) || asset is Component || asset == target ) + continue; + +#if UNITY_2018_3_OR_NEWER + // Nested prefabs in prefab assets add an additional native object of type 'UnityEngine.PrefabInstance' to the prefab. Managed type of that native type + // is UnityEngine.Object (i.e. GetType() returns UnityEngine.Object, not UnityEngine.PrefabInstance). There are no possible references to these native + // objects so skip them (we're checking for UnityEngine.Prefab because it includes other native types like UnityEngine.PrefabCreation, as well) + if( target is GameObject && asset.GetType() == typeof( Object ) && asset.ToString().Contains( "(UnityEngine.Prefab" ) ) + continue; +#endif + + if( currentSubAssets.Add( asset ) ) + subAssets.Add( new SubAsset( asset, shouldSearchChildren ?? true ) ); + } + } + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/AssetUsageDetector/Editor/ObjectToSearch.cs.meta b/Assets/Plugins/AssetUsageDetector/Editor/ObjectToSearch.cs.meta new file mode 100644 index 00000000..787b3365 --- /dev/null +++ b/Assets/Plugins/AssetUsageDetector/Editor/ObjectToSearch.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 66d5a144a723fea40945afc069d4231d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/AssetUsageDetector/Editor/SearchRefactoring.cs b/Assets/Plugins/AssetUsageDetector/Editor/SearchRefactoring.cs new file mode 100644 index 00000000..ea2bf999 --- /dev/null +++ b/Assets/Plugins/AssetUsageDetector/Editor/SearchRefactoring.cs @@ -0,0 +1,382 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Reflection; +using UnityEditor; +using UnityEditor.SceneManagement; +using UnityEngine; +using Object = UnityEngine.Object; + +namespace AssetUsageDetectorNamespace +{ + public delegate void SearchRefactoring( SearchMatch match ); + + public abstract class SearchMatch + { + public readonly object Source; + public readonly Object Context; // Almost always equal to Source. This is the Object that needs to be dirtied (if not null) to notify Unity of changes to Value + public Object Value { get; private set; } + + protected SearchMatch( object source, Object value ) + { + Source = source; + Context = source as Object; + Value = value; + } + + protected SearchMatch( object source, Object value, Object context ) : this( source, value ) + { + Context = context; + } + + public void ChangeValue( Object newValue ) + { + if( newValue == Value ) + return; + + if( Context && ( Context.hideFlags & HideFlags.NotEditable ) == HideFlags.NotEditable ) + { + Debug.LogWarning( "Can't change value of read-only Object: " + Context, Context ); + return; + } + + try + { + bool setContextDirty; + if( ChangeValue( newValue, out setContextDirty ) ) + OnValueChanged( newValue, setContextDirty ); + } + catch( Exception e ) + { + Debug.LogException( e ); + } + } + + protected abstract bool ChangeValue( Object newValue, out bool setContextDirty ); + + public void OnValueChanged( Object newValue, bool setContextDirty = true ) + { + Value = newValue; + + if( setContextDirty ) + { + if( Context ) + { + if( AssetDatabase.Contains( Context ) ) + EditorUtility.SetDirty( Context ); + else if( !EditorApplication.isPlaying ) + { + EditorUtility.SetDirty( Context ); + + if( Context is Component ) + EditorSceneManager.MarkSceneDirty( ( (Component) Context ).gameObject.scene ); + else if( Context is GameObject ) + EditorSceneManager.MarkSceneDirty( ( (GameObject) Context ).scene ); + else + EditorSceneManager.MarkAllScenesDirty(); + } + } + else if( !EditorApplication.isPlaying ) + EditorSceneManager.MarkAllScenesDirty(); + } + } + } + + public abstract class GenericSearchMatch : SearchMatch + { + public delegate void SetterFunction( Object newValue ); + + public readonly SetterFunction Setter; + + internal GenericSearchMatch( object source, Object value, SetterFunction setter ) : base( source, value ) { Setter = setter; } + internal GenericSearchMatch( object source, Object value, Object context, SetterFunction setter ) : base( source, value, context ) { Setter = setter; } + + protected override bool ChangeValue( Object newValue, out bool setContextDirty ) + { + Setter( newValue ); + + setContextDirty = true; + return true; + } + } + + public abstract class ReadOnlySearchMatch : SearchMatch + { + internal ReadOnlySearchMatch( object source, Object value ) : base( source, value ) { } + + protected override bool ChangeValue( Object newValue, out bool setContextDirty ) + { + Debug.LogWarning( "Can't change value of " + GetType().Name ); + + setContextDirty = false; + return false; + } + } + + /// + /// - Source: Object whose SerializedProperty points to Value + /// - Value: Referenced object + /// - SerializedProperty: The SerializedProperty that points to Value + /// + public class SerializedPropertyMatch : SearchMatch + { + public readonly SerializedProperty SerializedProperty; // Next or NextVisible mustn't be called with this SerializedProperty + + internal SerializedPropertyMatch( Object source, Object value, SerializedProperty property ) : base( source, value ) { SerializedProperty = property; } + + protected override bool ChangeValue( Object newValue, out bool setContextDirty ) + { + setContextDirty = true; + + switch( SerializedProperty.propertyType ) + { + case SerializedPropertyType.ObjectReference: + SerializedProperty.objectReferenceValue = newValue; + if( SerializedProperty.objectReferenceValue != newValue ) + { + Debug.LogWarning( "Couldn't cast " + newValue.GetType() + " to " + SerializedProperty.type ); + SerializedProperty.objectReferenceValue = Value; + + return false; + } + + break; + case SerializedPropertyType.ExposedReference: + SerializedProperty.exposedReferenceValue = newValue; + if( SerializedProperty.exposedReferenceValue != newValue ) + { + Debug.LogWarning( "Couldn't cast " + newValue.GetType() + " to " + SerializedProperty.type ); + SerializedProperty.exposedReferenceValue = Value; + + return false; + } + + break; +#if UNITY_2019_3_OR_NEWER + case SerializedPropertyType.ManagedReference: SerializedProperty.managedReferenceValue = newValue; break; +#endif + } + + SerializedProperty.serializedObject.ApplyModifiedPropertiesWithoutUndo(); + return true; + } + } + + /// + /// - Source: Object whose variable points to Value + /// - Value: Referenced object + /// - Variable: FieldInfo, PropertyInfo or IEnumerable (ChangeValue may not work for all IEnumerables) + /// + public class ReflectionMatch : SearchMatch + { + public readonly object Variable; + + internal ReflectionMatch( object source, Object value, object variable ) : base( source, value ) { Variable = variable; } + + protected override bool ChangeValue( Object newValue, out bool setContextDirty ) + { + setContextDirty = true; + + if( Variable is FieldInfo ) + ( (FieldInfo) Variable ).SetValue( Source, newValue ); + else if( Variable is PropertyInfo ) + { + PropertyInfo property = (PropertyInfo) Variable; + if( !property.CanWrite ) + { + Debug.LogWarning( "Property is read-only: " + property.DeclaringType.FullName + "." + property.Name ); + return false; + } + + property.SetValue( Source, newValue, null ); + } + else if( Variable is IList ) + { + IList list = (IList) Variable; + for( int i = list.Count - 1; i >= 0; i-- ) + { + if( ReferenceEquals( list[i], Value ) ) + list[i] = newValue; + } + } + else if( Variable is IDictionary ) + { + IDictionary dictionary = (IDictionary) Variable; + bool dictionaryModified; + do + { + dictionaryModified = false; + foreach( object dictKey in dictionary.Keys ) + { + object dictValue = dictionary[dictKey]; + if( ReferenceEquals( dictKey, Value ) ) + { + dictionary.Remove( dictKey ); + if( newValue ) + dictionary[newValue] = dictValue; + + dictionaryModified = true; + break; + } + else if( ReferenceEquals( dictValue, Value ) ) + { + dictionary[dictKey] = newValue; + dictionaryModified = true; + break; + } + } + } while( dictionaryModified ); + } + else + { + Debug.LogWarning( "Can't change value of " + Variable.GetType().Name ); + return false; + } + + return true; + } + } + + /// + /// - Source: MonoImporter (for scripts) or ShaderImporter + /// - Value: Default value assigned to Source's specified variable in the Inspector + /// - Variable: The variable of Source that Value is assigned to as default value + /// - MonoScriptAllVariables: All variables of Source script if it's MonoImporter + /// + public class AssetImporterDefaultValueMatch : SearchMatch + { + public readonly string Variable; + public readonly VariableGetterHolder[] MonoScriptAllVariables; + + internal AssetImporterDefaultValueMatch( Object source, Object value, string variable, VariableGetterHolder[] monoScriptAllVariables ) : base( source, value ) + { + Variable = variable; + MonoScriptAllVariables = monoScriptAllVariables; + } + + protected override bool ChangeValue( Object newValue, out bool setContextDirty ) + { + setContextDirty = false; + + if( Source is MonoImporter ) + { + MonoImporter monoImporter = (MonoImporter) Source; + + List variableNames = new List( 8 ); + List variableValues = new List( 8 ); + + for( int i = 0; i < MonoScriptAllVariables.Length; i++ ) + { + if( MonoScriptAllVariables[i].isSerializable && !MonoScriptAllVariables[i].IsProperty ) + { + Object variableDefaultValue = monoImporter.GetDefaultReference( MonoScriptAllVariables[i].Name ); + if( variableDefaultValue == Value && MonoScriptAllVariables[i].Name == Variable ) + variableDefaultValue = newValue; + + variableNames.Add( MonoScriptAllVariables[i].Name ); + variableValues.Add( variableDefaultValue ); + } + } + + monoImporter.SetDefaultReferences( variableNames.ToArray(), variableValues.ToArray() ); + EditorApplication.delayCall += () => AssetDatabase.ImportAsset( monoImporter.assetPath ); // If code recompiles during search, it will break the search. Give it a 1 frame delay + } + else if( Source is ShaderImporter ) + { + ShaderImporter shaderImporter = (ShaderImporter) Source; + Shader shader = shaderImporter.GetShader(); + + List textureNames = new List( 16 ); + List textureValues = new List( 16 ); +#if UNITY_2018_1_OR_NEWER + List nonModifiableTextureNames = new List( 16 ); + List nonModifiableTextureValues = new List( 16 ); +#endif + + int shaderPropertyCount = ShaderUtil.GetPropertyCount( shader ); + for( int i = 0; i < shaderPropertyCount; i++ ) + { + if( ShaderUtil.GetPropertyType( shader, i ) != ShaderUtil.ShaderPropertyType.TexEnv ) + continue; + + string propertyName = ShaderUtil.GetPropertyName( shader, i ); +#if UNITY_2018_1_OR_NEWER + if( ShaderUtil.IsShaderPropertyNonModifiableTexureProperty( shader, i ) ) + { + Texture propertyDefaultValue = shaderImporter.GetNonModifiableTexture( propertyName ); + if( propertyDefaultValue == Value && propertyName == Variable ) + propertyDefaultValue = (Texture) newValue; + + nonModifiableTextureNames.Add( propertyName ); + nonModifiableTextureValues.Add( propertyDefaultValue ); + } + else +#endif + { + Texture propertyDefaultValue = shaderImporter.GetDefaultTexture( propertyName ); + if( propertyDefaultValue == Value && propertyName == Variable ) + propertyDefaultValue = (Texture) newValue; + + textureNames.Add( propertyName ); + textureValues.Add( propertyDefaultValue ); + } + } + + shaderImporter.SetDefaultTextures( textureNames.ToArray(), textureValues.ToArray() ); +#if UNITY_2018_1_OR_NEWER + shaderImporter.SetNonModifiableTextures( nonModifiableTextureNames.ToArray(), nonModifiableTextureValues.ToArray() ); +#endif + AssetDatabase.ImportAsset( shaderImporter.assetPath ); + } + else + { + Debug.LogWarning( "Can't change default value of: " + Source.GetType() ); + return false; + } + + return true; + } + } + + /// + /// - Source: Animation, Animator, AnimatorStateMachine, AnimatorState, AnimatorControllerLayer, BlendTree, PlayableDirector* or AnimationClip* + /// - Context: If Source is AnimatorControllerLayer, then its RuntimeAnimatorController. Otherwise, equal to Source + /// - Value: AnimationClip, AnimatorController or AvatarMask used in Source (*for PlayableDirector and AnimationClip, it can be any Object value) + /// + public class AnimationSystemMatch : GenericSearchMatch + { + internal AnimationSystemMatch( object source, Object value, SetterFunction setter ) : base( source, value, setter ) { } + internal AnimationSystemMatch( object source, Object value, Object context, SetterFunction setter ) : base( source, value, context, setter ) { } + } + + /// + /// - Source: GameObject, AnimatorStateMachine or AnimatorState + /// - Value: The attached behaviour's source script (C# script or DLL, i.e. MonoScript) + /// - Behaviour: The attached behaviour (MonoBehaviour or StateMachineBehaviour) + /// + public class BehaviourUsageMatch : ReadOnlySearchMatch + { + public readonly Object Behaviour; + + internal BehaviourUsageMatch( Object source, MonoScript value, Object behaviour ) : base( source, value ) { Behaviour = behaviour; } + } + + /// + /// - Source: GameObject Instance + /// - Value: Prefab of that GameObject + /// + public class PrefabMatch : ReadOnlySearchMatch + { + internal PrefabMatch( Object source, Object value ) : base( source, value ) { } + } + + /// + /// - Source: Object that references Value + /// - Value: Matched object + /// + public class OtherSearchMatch : GenericSearchMatch + { + internal OtherSearchMatch( object source, Object value, SetterFunction setter ) : base( source, value, setter ) { } + internal OtherSearchMatch( object source, Object value, Object context, SetterFunction setter ) : base( source, value, context, setter ) { } + } +} \ No newline at end of file diff --git a/Assets/Plugins/AssetUsageDetector/Editor/SearchRefactoring.cs.meta b/Assets/Plugins/AssetUsageDetector/Editor/SearchRefactoring.cs.meta new file mode 100644 index 00000000..c586f0cc --- /dev/null +++ b/Assets/Plugins/AssetUsageDetector/Editor/SearchRefactoring.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 3d15ef8bd8f7c7c4e8d228c99713b7eb +timeCreated: 1641132238 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/AssetUsageDetector/Editor/SearchResult.cs b/Assets/Plugins/AssetUsageDetector/Editor/SearchResult.cs new file mode 100644 index 00000000..e9b66413 --- /dev/null +++ b/Assets/Plugins/AssetUsageDetector/Editor/SearchResult.cs @@ -0,0 +1,1395 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.IO; +using System.Text; +using UnityEditor; +using UnityEditor.IMGUI.Controls; +using UnityEditor.SceneManagement; +using UnityEngine; +using UnityEngine.SceneManagement; +using Object = UnityEngine.Object; + +namespace AssetUsageDetectorNamespace +{ + // Custom class to hold search results + [Serializable] + public class SearchResult : IEnumerable, ISerializationCallbackReceiver + { + [Serializable] + internal class SerializableResultGroup + { + public string title; + public SearchResultGroup.GroupType type; + public bool isExpanded; + public bool pendingSearch; + public SearchResultTreeViewState treeViewState; + + public List initialSerializedNodes; + } + + [Serializable] + internal class SerializableNode + { + [Serializable] + public class SerializableLinkDescriptions + { + public List value; + } + + public string label; + public int instanceId; + public bool isUnityObject, isMainReference; + public ReferenceNode.UsedState usedState; + + public List links; + public List linkDescriptions; + public List linkWeakStates; + } + + internal class SortedEntry : IComparable + { + public readonly string assetPath, subAssetName; + public readonly bool isMainAsset; + public readonly Transform transform; + public readonly object entry; + + public SortedEntry( ReferenceNode node ) : this( node.nodeObject as Object ) + { + entry = node; + } + + public SortedEntry( ReferenceNode.Link link ) : this( link.targetNode.nodeObject as Object ) + { + entry = link; + } + + private SortedEntry( Object obj ) + { + if( obj ) + { + assetPath = AssetDatabase.GetAssetPath( obj ); + if( string.IsNullOrEmpty( assetPath ) ) + { + assetPath = null; + + if( obj is Component ) + transform = ( (Component) obj ).transform; + else if( obj is GameObject ) + transform = ( (GameObject) obj ).transform; + } + else + { + isMainAsset = AssetDatabase.IsMainAsset( ( obj is Component ) ? ( (Component) obj ).gameObject : obj ); + if( !isMainAsset ) + subAssetName = obj.name; + } + } + } + + // Sorting order: + // 1) Scene objects come first and are sorted by their absolute sibling indices in Hierarchy + // 2) Assets come later and are sorted by their asset paths (for assets sharing the same path, main assets come first and sub-assets are then sorted by their names) + // 3) Regular C# objects come last + int IComparable.CompareTo( SortedEntry other ) + { + if( this == other ) + return 0; + else if( assetPath == null ) + { + if( !transform ) + return 1; + else if( other.assetPath == null ) + return other.transform ? Utilities.CompareHierarchySiblingIndices( transform, other.transform ) : -1; + else + return -1; + } + else if( other.assetPath == null ) + return other.transform ? 1 : -1; + else + { + int assetPathComparison = EditorUtility.NaturalCompare( assetPath, other.assetPath ); + if( assetPathComparison != 0 ) + return assetPathComparison; + else if( isMainAsset ) + return -1; + else if( other.isMainAsset ) + return 1; + else + return subAssetName.CompareTo( other.subAssetName ); + } + } + } + + private bool success; // This isn't readonly so that it can be serialized + + private List result; + private SceneSetup[] initialSceneSetup; + + private AssetUsageDetector searchHandler; + private AssetUsageDetector.Parameters m_searchParameters; + + // Each TreeView in the drawn search results must use unique ids for their TreeViewItems. Otherwise, strange things happen: https://forum.unity.com/threads/multiple-editor-treeviews-selection-issue.601471/ + internal int nextTreeViewId = 1; + + private List serializedNodes; + private List serializedGroups; + private Object[] serializedUsedObjects; + + public int NumberOfGroups { get { return result.Count; } } + public SearchResultGroup this[int index] { get { return result[index]; } } + + public HashSet UsedObjects { get; private set; } + + public bool SearchCompletedSuccessfully { get { return success; } } + public bool InitialSceneSetupConfigured { get { return initialSceneSetup != null && initialSceneSetup.Length > 0; } } + public bool HasPendingLazySceneSearchResults { get { return result.Find( ( group ) => group.PendingSearch ) != null; } } + public AssetUsageDetector.Parameters SearchParameters { get { return m_searchParameters; } } + + public SearchResult( bool success, List result, HashSet usedObjects, SceneSetup[] initialSceneSetup, AssetUsageDetector searchHandler, AssetUsageDetector.Parameters searchParameters ) + { + if( result == null ) + result = new List( 0 ); + + this.success = success; + this.result = result; + this.UsedObjects = usedObjects ?? new HashSet(); + this.initialSceneSetup = initialSceneSetup; + this.searchHandler = searchHandler; + this.m_searchParameters = searchParameters; + } + + public void RemoveSearchResultGroup( SearchResultGroup searchResultGroup ) + { + result.Remove( searchResultGroup ); + } + + public void RefreshSearchResultGroup( SearchResultGroup searchResultGroup, bool noAssetDatabaseChanges ) + { + if( searchResultGroup == null ) + { + Debug.LogError( "SearchResultGroup is null!" ); + return; + } + + int searchResultGroupIndex = result.IndexOf( searchResultGroup ); + if( searchResultGroupIndex < 0 ) + { + Debug.LogError( "SearchResultGroup is not a part of SearchResult!" ); + return; + } + + if( searchResultGroup.Type == SearchResultGroup.GroupType.Scene && EditorApplication.isPlaying && !EditorSceneManager.GetSceneByPath( searchResultGroup.ScenePath ).isLoaded ) + { + Debug.LogError( "Can't search unloaded scene while in Play Mode!" ); + return; + } + + if( searchHandler == null ) + searchHandler = new AssetUsageDetector(); + + SceneSearchMode searchInScenes = m_searchParameters.searchInScenes; + Object[] searchInScenesSubset = m_searchParameters.searchInScenesSubset; + bool searchInAssetsFolder = m_searchParameters.searchInAssetsFolder; + Object[] searchInAssetsSubset = m_searchParameters.searchInAssetsSubset; + bool searchInProjectSettings = m_searchParameters.searchInProjectSettings; + bool lazySceneSearch = m_searchParameters.lazySceneSearch; + bool calculateUnusedObjects = m_searchParameters.calculateUnusedObjects; + bool _noAssetDatabaseChanges = m_searchParameters.noAssetDatabaseChanges; + + try + { + if( searchResultGroup.Type == SearchResultGroup.GroupType.Assets ) + { + m_searchParameters.searchInScenes = SceneSearchMode.None; + m_searchParameters.searchInScenesSubset = null; + m_searchParameters.searchInProjectSettings = false; + } + else if( searchResultGroup.Type == SearchResultGroup.GroupType.ProjectSettings ) + { + m_searchParameters.searchInScenes = SceneSearchMode.None; + m_searchParameters.searchInScenesSubset = null; + m_searchParameters.searchInAssetsFolder = false; + m_searchParameters.searchInAssetsSubset = null; + m_searchParameters.searchInProjectSettings = true; + } + else if( searchResultGroup.Type == SearchResultGroup.GroupType.Scene ) + { + m_searchParameters.searchInScenes = SceneSearchMode.None; + m_searchParameters.searchInScenesSubset = new Object[1] { AssetDatabase.LoadAssetAtPath( searchResultGroup.ScenePath ) }; + m_searchParameters.searchInAssetsFolder = false; + m_searchParameters.searchInAssetsSubset = null; + m_searchParameters.searchInProjectSettings = false; + } + else if( searchResultGroup.Type == SearchResultGroup.GroupType.DontDestroyOnLoad ) + { + m_searchParameters.searchInScenes = (SceneSearchMode) 1024; // A unique value to search only the DontDestroyOnLoad scene + m_searchParameters.searchInScenesSubset = null; + m_searchParameters.searchInAssetsFolder = false; + m_searchParameters.searchInAssetsSubset = null; + m_searchParameters.searchInProjectSettings = false; + } + else + { + Debug.LogError( "Can't refresh group: " + searchResultGroup.Type ); + return; + } + + m_searchParameters.lazySceneSearch = false; + m_searchParameters.calculateUnusedObjects = result.Find( ( group ) => group.Type == SearchResultGroup.GroupType.UnusedObjects ) != null; + m_searchParameters.noAssetDatabaseChanges = noAssetDatabaseChanges; + + // Make sure the AssetDatabase is up-to-date + AssetDatabase.SaveAssets(); + + SearchResult searchResult = searchHandler.Run( m_searchParameters ); + if( !searchResult.success ) + { + EditorUtility.DisplayDialog( "Error", "Couldn't refresh, check console for more info.", "OK" ); + return; + } + + if( searchResult.result != null ) + { + SearchResultGroup newSearchResultGroup = searchResult.result.Find( ( group ) => group.Title == searchResultGroup.Title ); + if( newSearchResultGroup != null ) + result[searchResultGroupIndex] = newSearchResultGroup; + else + searchResultGroup.Clear(); + + UsedObjects.UnionWith( searchResult.UsedObjects ); + + SearchResultGroup unusedObjectsSearchResultGroup = result.Find( ( group ) => group.Type == SearchResultGroup.GroupType.UnusedObjects ); + if( unusedObjectsSearchResultGroup != null ) + { + SearchResultGroup newUnusedObjectsSearchResultGroup = searchResult.result.Find( ( group ) => group.Type == SearchResultGroup.GroupType.UnusedObjects ); + if( newUnusedObjectsSearchResultGroup == null ) + { + // UnusedObjects search result group doesn't exist in 2 cases: + // - When there are no search results found (NumberOfGroups == 0) + // - When all searched objects are referenced (NumberOfGroups > 0) + if( searchResult.result.Count > 0 ) + unusedObjectsSearchResultGroup.Clear(); + } + else + { + // NOTE: We can process UnusedObjects graphs iteratively (instead of recursively) because for the time being, these graphs have a maximum depth of 1 + bool unusedObjectsGraphChanged = false; + HashSet newUnusedObjectsSet = new HashSet(); + for( int i = newUnusedObjectsSearchResultGroup.NumberOfReferences - 1; i >= 0; i-- ) + { + ReferenceNode node = newUnusedObjectsSearchResultGroup[i]; + newUnusedObjectsSet.Add( node.UnityObject ); + + for( int j = node.NumberOfOutgoingLinks - 1; j >= 0; j-- ) + newUnusedObjectsSet.Add( node[j].targetNode.UnityObject ); + } + + for( int i = unusedObjectsSearchResultGroup.NumberOfReferences - 1; i >= 0; i-- ) + { + ReferenceNode node = unusedObjectsSearchResultGroup[i]; + bool parentNodeRemoved = false; + Object obj = node.UnityObject; + if( !obj || !newUnusedObjectsSet.Contains( obj ) ) + { + unusedObjectsSearchResultGroup.RemoveReference( i ); + unusedObjectsGraphChanged = parentNodeRemoved = true; + } + + bool hasUnusedSubObjects = false, hasUsedSubObjects = false; + bool hadSubObjects = node.NumberOfOutgoingLinks > 0; + for( int j = 0; j < node.NumberOfOutgoingLinks; j++ ) + { + if( node[j].targetNode.usedState == ReferenceNode.UsedState.Used ) // User has explicitly displayed this used child object/sub-asset in the TreeView + continue; + + Object _obj = node[j].targetNode.UnityObject; + if( newUnusedObjectsSet.Contains( _obj ) ) + { + hasUnusedSubObjects = true; + + if( parentNodeRemoved ) + unusedObjectsSearchResultGroup.AddReference( node[j].targetNode ); + } + else if( !parentNodeRemoved ) + { + node.RemoveLink( j-- ); + unusedObjectsGraphChanged = hasUsedSubObjects = true; + } + } + + if( !parentNodeRemoved ) + { + // When all sub-assets of a main asset are used, consider the main asset as used, as well + if( !hasUnusedSubObjects && hadSubObjects && AssetDatabase.IsMainAsset( obj ) ) + { + unusedObjectsSearchResultGroup.RemoveReference( i ); + unusedObjectsGraphChanged = true; + } + + if( hasUsedSubObjects && node.usedState == ReferenceNode.UsedState.Unused ) + node.usedState = ReferenceNode.UsedState.MixedCollapsed; + } + } + + if( unusedObjectsGraphChanged && unusedObjectsSearchResultGroup.treeView != null ) + { + unusedObjectsSearchResultGroup.treeView.SetSelection( new int[0], TreeViewSelectionOptions.FireSelectionChanged ); + unusedObjectsSearchResultGroup.treeViewState.preSearchExpandedIds = null; + unusedObjectsSearchResultGroup.treeView.Reload(); + unusedObjectsSearchResultGroup.treeView.ExpandAll(); + } + } + + if( unusedObjectsSearchResultGroup.NumberOfReferences == 0 ) + result.Remove( unusedObjectsSearchResultGroup ); + } + } + } + finally + { + m_searchParameters.searchInScenes = searchInScenes; + m_searchParameters.searchInScenesSubset = searchInScenesSubset; + m_searchParameters.searchInAssetsFolder = searchInAssetsFolder; + m_searchParameters.searchInAssetsSubset = searchInAssetsSubset; + m_searchParameters.searchInProjectSettings = searchInProjectSettings; + m_searchParameters.lazySceneSearch = lazySceneSearch; + m_searchParameters.calculateUnusedObjects = calculateUnusedObjects; + m_searchParameters.noAssetDatabaseChanges = _noAssetDatabaseChanges; + } + } + + public float DrawOnGUI( EditorWindow window, float scrollPosition, bool noAssetDatabaseChanges ) + { + for( int i = 0; i < result.Count; i++ ) + { + scrollPosition = result[i].DrawOnGUI( this, window, scrollPosition, noAssetDatabaseChanges ); + + if( i < result.Count - 1 ) + GUILayout.Space( 10f ); + } + + return scrollPosition; + } + + public int IndexOf( SearchResultGroup searchResultGroup ) + { + return result.IndexOf( searchResultGroup ); + } + + public void CollapseAllSearchResultGroups() + { + for( int i = 0; i < result.Count; i++ ) + result[i].Collapse(); + } + + public void CancelDelayedTreeViewTooltip() + { + for( int i = 0; i < result.Count; i++ ) + { + if( result[i].treeView != null ) + result[i].treeView.CancelDelayedTooltip(); + } + } + + // Returns if RestoreInitialSceneSetup will have any effect on the current scene setup + public bool IsSceneSetupDifferentThanCurrentSetup() + { + if( initialSceneSetup == null ) + return false; + + SceneSetup[] sceneFinalSetup = EditorSceneManager.GetSceneManagerSetup(); + if( initialSceneSetup.Length != sceneFinalSetup.Length ) + return true; + + for( int i = 0; i < sceneFinalSetup.Length; i++ ) + { + bool sceneIsOneOfInitials = false; + for( int j = 0; j < initialSceneSetup.Length; j++ ) + { + if( sceneFinalSetup[i].path == initialSceneSetup[j].path ) + { + if( sceneFinalSetup[i].isLoaded != initialSceneSetup[j].isLoaded ) + return true; + + sceneIsOneOfInitials = true; + break; + } + } + + if( !sceneIsOneOfInitials ) + return true; + } + + return false; + } + + // Close the scenes that were not part of the initial scene setup + // Returns true if initial scene setup is restored successfully + public bool RestoreInitialSceneSetup() + { + if( initialSceneSetup == null || initialSceneSetup.Length == 0 ) + return true; + + if( EditorApplication.isPlaying ) + return false; + + if( !IsSceneSetupDifferentThanCurrentSetup() ) + return true; + + StringBuilder sb = Utilities.stringBuilder; + sb.Length = 0; + + sb.AppendLine( "Restore initial scene setup?" ); + for( int i = 0; i < initialSceneSetup.Length; i++ ) + sb.AppendLine().Append( "- " ).Append( initialSceneSetup[i].path ); + + switch( EditorUtility.DisplayDialogComplex( "Asset Usage Detector", sb.ToString(), "Yes", "Cancel", "Leave it as is" ) ) + { + case 1: return false; + case 2: return true; + } + + if( !EditorSceneManager.SaveCurrentModifiedScenesIfUserWantsTo() ) + return false; + + for( int i = 0; i < initialSceneSetup.Length; i++ ) + { + Scene scene = EditorSceneManager.GetSceneByPath( initialSceneSetup[i].path ); + if( !scene.isLoaded ) + scene = EditorSceneManager.OpenScene( initialSceneSetup[i].path, initialSceneSetup[i].isLoaded ? OpenSceneMode.Additive : OpenSceneMode.AdditiveWithoutLoading ); + + if( initialSceneSetup[i].isActive ) + EditorSceneManager.SetActiveScene( scene ); + } + + SceneSetup[] sceneFinalSetup = EditorSceneManager.GetSceneManagerSetup(); + for( int i = 0; i < sceneFinalSetup.Length; i++ ) + { + bool sceneIsOneOfInitials = false; + for( int j = 0; j < initialSceneSetup.Length; j++ ) + { + if( sceneFinalSetup[i].path == initialSceneSetup[j].path ) + { + sceneIsOneOfInitials = true; + break; + } + } + + if( !sceneIsOneOfInitials ) + EditorSceneManager.CloseScene( EditorSceneManager.GetSceneByPath( sceneFinalSetup[i].path ), true ); + } + + for( int i = 0; i < initialSceneSetup.Length; i++ ) + { + if( !initialSceneSetup[i].isLoaded ) + EditorSceneManager.CloseScene( EditorSceneManager.GetSceneByPath( initialSceneSetup[i].path ), false ); + } + + initialSceneSetup = null; + return true; + } + + // Assembly reloading; serialize nodes in a way that Unity can serialize + // Credit: https://docs.unity3d.com/Manual/script-Serialization-Custom.html + void ISerializationCallbackReceiver.OnBeforeSerialize() + { + if( result == null ) + return; + + if( serializedGroups == null ) + serializedGroups = new List( result.Count ); + else + serializedGroups.Clear(); + + if( serializedNodes == null ) + serializedNodes = new List( result.Count * 16 ); + else + serializedNodes.Clear(); + + Dictionary nodeToIndex = new Dictionary( result.Count * 16 ); + for( int i = 0; i < result.Count; i++ ) + serializedGroups.Add( result[i].Serialize( nodeToIndex, serializedNodes ) ); + + if( serializedUsedObjects == null || serializedUsedObjects.Length != UsedObjects.Count ) + serializedUsedObjects = new Object[UsedObjects.Count]; + + UsedObjects.CopyTo( serializedUsedObjects ); + } + + // Assembly reloaded; deserialize nodes to construct the original graph + void ISerializationCallbackReceiver.OnAfterDeserialize() + { + if( serializedGroups == null || serializedNodes == null || serializedUsedObjects == null ) + return; + + if( result == null ) + result = new List( serializedGroups.Count ); + else + result.Clear(); + + List allNodes = new List( serializedNodes.Count ); + for( int i = 0; i < serializedNodes.Count; i++ ) + allNodes.Add( new ReferenceNode() ); + + for( int i = 0; i < serializedNodes.Count; i++ ) + allNodes[i].Deserialize( serializedNodes[i], allNodes ); + + for( int i = 0; i < serializedGroups.Count; i++ ) + { + result.Add( new SearchResultGroup( serializedGroups[i].title, serializedGroups[i].type, serializedGroups[i].isExpanded, serializedGroups[i].pendingSearch ) ); + result[i].Deserialize( serializedGroups[i], allNodes ); + } + + if( UsedObjects == null ) + UsedObjects = new HashSet( serializedUsedObjects ); + else + UsedObjects.UnionWith( serializedUsedObjects ); + + serializedNodes.Clear(); + serializedGroups.Clear(); + serializedUsedObjects = null; + } + + IEnumerator IEnumerable.GetEnumerator() { return ( (IEnumerable) result ).GetEnumerator(); } + IEnumerator IEnumerable.GetEnumerator() { return ( (IEnumerable) result ).GetEnumerator(); } + } + + // Custom class to hold the results for a single scene or Assets folder + public class SearchResultGroup : IEnumerable + { + public enum GroupType { Assets = 0, Scene = 1, DontDestroyOnLoad = 2, ProjectSettings = 3, UnusedObjects = 4 }; + + private readonly List references = new List(); + + internal SearchResultTreeView treeView; + internal SearchResultTreeViewState treeViewState; + private Rect lastTreeViewRect; + private SearchField treeViewSearchField; + + public string Title { get; private set; } + public GroupType Type { get; private set; } + public string ScenePath { get; private set; } + public bool IsExpanded { get; private set; } + public bool PendingSearch { get; private set; } + + public int NumberOfReferences { get { return references.Count; } } + public ReferenceNode this[int index] { get { return references[index]; } } + + public SearchResultGroup( string title, GroupType type, bool isExpanded = true, bool pendingSearch = false ) + { + Title = title.StartsWith( "" ) ? title : string.Concat( "", title, "" ); + ScenePath = type != GroupType.Scene ? null : ( title.StartsWith( "" ) ? title.Substring( 3, title.Length - 7 ) : title ); + Type = type; + IsExpanded = isExpanded; + PendingSearch = pendingSearch; + } + + public void AddReference( ReferenceNode node ) + { + references.Add( node ); + } + + public void RemoveReference( int index ) + { + references.RemoveAt( index ); + } + + // Removes all nodes + public void Clear() + { + PendingSearch = false; + + references.Clear(); + + treeView = null; + treeViewState = null; + treeViewSearchField = null; + } + + public void Collapse() + { + IsExpanded = false; + } + + // Initializes commonly used variables of the nodes + public void InitializeNodes( HashSet objectsToSearchSet ) + { + List _references = new List( references ); + references.Clear(); + + // Reverse the links of the search results graph so that the root ReferenceNodes are the searched objects + Dictionary reverseGraphNodes = new Dictionary( references.Count * 16 ); + for( int i = 0; i < _references.Count; i++ ) + _references[i].CreateReverseGraphRecursively( this, references, reverseGraphNodes, objectsToSearchSet ); + + // Remove weak links if they aren't ultimately connected to a non-weak link + HashSet visitedNodes = new HashSet(); + for( int i = references.Count - 1; i >= 0; i-- ) + references[i].RemoveRedundantLinksRecursively( visitedNodes ); + + // When a GameObject is a root node, then any components of that GameObject that are also root nodes should omit their links to the + // GameObject's node because otherwise, search results are filled with redundant 'GameObject->Its Component' references + HashSet rootGameObjectNodes = new HashSet(); + for( int i = references.Count - 1; i >= 0; i-- ) + { + if( references[i].nodeObject as GameObject ) + rootGameObjectNodes.Add( references[i] ); + } + + for( int i = references.Count - 1; i >= 0; i-- ) + { + ReferenceNode node = references[i]; + Component component = node.nodeObject as Component; + if( component ) + { + for( int j = node.NumberOfOutgoingLinks - 1; j >= 0; j-- ) + { + if( ReferenceEquals( node[j].targetNode.nodeObject, component.gameObject ) && rootGameObjectNodes.Contains( node[j].targetNode ) ) + { + node.RemoveLink( j ); + break; + } + } + } + } + + // Remove root nodes that don't have any outgoing links + for( int i = references.Count - 1; i >= 0; i-- ) + { + if( references[i].NumberOfOutgoingLinks == 0 ) + references.RemoveAt( i ); + } + + // Sort root nodes + if( references.Count > 1 ) + { + SearchResult.SortedEntry[] sortedEntries = new SearchResult.SortedEntry[references.Count]; + for( int i = references.Count - 1; i >= 0; i-- ) + sortedEntries[i] = new SearchResult.SortedEntry( references[i] ); + + Array.Sort( sortedEntries ); + + for( int i = 0; i < sortedEntries.Length; i++ ) + references[i] = (ReferenceNode) sortedEntries[i].entry; + } + + for( int i = references.Count - 1; i >= 0; i-- ) + { + references[i].SortLinks(); // Sort immediate links of the root nodes + references[i].InitializeRecursively(); + } + } + + // Draw the results found for this container + public float DrawOnGUI( SearchResult searchResult, EditorWindow window, float scrollPosition, bool noAssetDatabaseChanges ) + { + Event ev = Event.current; + Color c = GUI.backgroundColor; + + float headerHeight = EditorGUIUtility.singleLineHeight * 2f; + float refreshButtonWidth = 100f; + + GUI.backgroundColor = AssetUsageDetectorSettings.SearchResultGroupHeaderColor; + + Rect headerRect = EditorGUILayout.GetControlRect( false, headerHeight ); + float width = headerRect.width; + headerRect.width = headerHeight; + if( GUI.Button( headerRect, IsExpanded ? "v" : ">" ) ) + { + IsExpanded = !IsExpanded; + if( ev.alt && treeView != null ) + { + if( !IsExpanded ) + treeView.CollapseAll(); + else + treeView.ExpandAll(); + } + + window.Repaint(); + GUIUtility.ExitGUI(); + } + + headerRect.x += headerHeight; + headerRect.width = width - ( searchResult != null ? ( refreshButtonWidth + headerHeight ) : headerHeight ); + + if( GUI.Button( headerRect, Title, Utilities.BoxGUIStyle ) ) + { + if( ev.button != 1 ) + { + if( Type == GroupType.Scene ) + { + // If the container (scene, usually) is left clicked, highlight it on Project view + SceneAsset sceneAsset = AssetDatabase.LoadAssetAtPath( ScenePath ); + if( sceneAsset ) + { + if( AssetUsageDetectorSettings.PingClickedObjects ) + EditorGUIUtility.PingObject( sceneAsset ); + if( AssetUsageDetectorSettings.SelectClickedObjects ) + Selection.activeObject = sceneAsset; + } + } + } + else + { + GenericMenu contextMenu = new GenericMenu(); + + if( searchResult != null ) + contextMenu.AddItem( new GUIContent( "Hide" ), false, () => searchResult.RemoveSearchResultGroup( this ) ); + + if( references.Count > 0 && treeView != null ) + { + if( contextMenu.GetItemCount() > 0 ) + contextMenu.AddSeparator( "" ); + + if( Type != GroupType.UnusedObjects ) + { + contextMenu.AddItem( new GUIContent( "Expand Direct References Only" ), false, () => + { + treeView.ExpandDirectReferences(); + IsExpanded = true; + } ); + + contextMenu.AddItem( new GUIContent( "Expand Main References Only" ), false, () => + { + treeView.ExpandMainReferences(); + IsExpanded = true; + } ); + } + + if( !string.IsNullOrEmpty( treeViewState.searchTerm ) && treeViewState.searchMode == SearchResultTreeView.SearchMode.ReferencesOnly ) + { + contextMenu.AddItem( new GUIContent( "Expand Matching Search Results Only" ), false, () => + { + treeView.ExpandMatchingSearchResults(); + IsExpanded = true; + } ); + } + + contextMenu.AddItem( new GUIContent( "Expand All" ), false, () => + { + treeView.ExpandAll(); + IsExpanded = true; + } ); + + contextMenu.AddItem( new GUIContent( "Collapse All" ), false, () => + { + treeView.CollapseAll(); + IsExpanded = true; + } ); + + if( searchResult != null && searchResult.NumberOfGroups > 1 && !string.IsNullOrEmpty( treeViewState.searchTerm ) ) + { + if( contextMenu.GetItemCount() > 0 ) + contextMenu.AddSeparator( "" ); + + contextMenu.AddItem( new GUIContent( "Apply Search to All Results" ), false, () => + { + for( int i = 0; i < searchResult.NumberOfGroups; i++ ) + { + if( searchResult[i].treeView == null ) + continue; + + string previousSearchTerm = searchResult[i].treeViewState.searchTerm ?? ""; + SearchResultTreeView.SearchMode previousSearchMode = searchResult[i].treeViewState.searchMode; + + searchResult[i].treeViewState.searchTerm = treeViewState.searchTerm ?? ""; + searchResult[i].treeViewState.searchMode = treeViewState.searchMode; + + if( treeViewState.searchTerm != previousSearchTerm || treeViewState.searchMode != previousSearchMode ) + searchResult[i].treeView.RefreshSearch( previousSearchTerm ); + } + } ); + } + } + +#if UNITY_2022_2_OR_NEWER + int loadedSceneCount = SceneManager.loadedSceneCount; +#else + int loadedSceneCount = EditorSceneManager.loadedSceneCount; +#endif + if( Type == GroupType.Scene && !EditorApplication.isPlaying && loadedSceneCount > 1 ) + { + // Show context menu when SearchResultGroup's header is right clicked + Scene scene = EditorSceneManager.GetSceneByPath( ScenePath ); + if( scene.isLoaded ) + { + if( contextMenu.GetItemCount() > 0 ) + contextMenu.AddSeparator( "" ); + + contextMenu.AddItem( new GUIContent( "Close Scene" ), false, () => + { + if( !scene.isDirty || EditorSceneManager.SaveModifiedScenesIfUserWantsTo( new Scene[1] { scene } ) ) + EditorSceneManager.CloseScene( scene, true ); + } ); + } + } + + contextMenu.ShowAsContext(); + } + } + + if( searchResult != null ) + { + bool guiEnabled = GUI.enabled; + GUI.enabled = Type != GroupType.UnusedObjects; + + headerRect.x += width - ( refreshButtonWidth + headerHeight ); + headerRect.width = refreshButtonWidth; + if( GUI.Button( headerRect, "Refresh" ) ) + { + searchResult.RefreshSearchResultGroup( this, noAssetDatabaseChanges ); + GUIUtility.ExitGUI(); + } + + GUI.enabled = guiEnabled; + } + + GUI.backgroundColor = c; + + if( IsExpanded ) + { + if( PendingSearch ) + GUILayout.Box( "Lazy Search: this scene potentially has some references, hit Refresh to find them", Utilities.BoxGUIStyle ); + else if( references.Count == 0 ) + GUILayout.Box( ( Type == GroupType.UnusedObjects ) ? "No unused objects left..." : "No references found...", Utilities.BoxGUIStyle ); + else + { + if( Type == GroupType.UnusedObjects ) + { + if( searchResult != null && searchResult.HasPendingLazySceneSearchResults ) + EditorGUILayout.HelpBox( "Some scene(s) aren't searched yet (lazy scene search). Refreshing those scene(s) will automatically update this list.", MessageType.Warning ); + + if( searchResult != null && searchResult.SearchParameters.dontSearchInSourceAssets && searchResult.SearchParameters.objectsToSearch.Length > 1 ) + EditorGUILayout.HelpBox( "'Don't search \"SEARCHED OBJECTS\" themselves for references' is enabled, some of these objects might be used by \"SEARCHED OBJECTS\".", MessageType.Warning ); + + if( !AssetUsageDetectorSettings.MarkUsedAssetsSubAssetsAsUsed ) + EditorGUILayout.HelpBox( "'Hide unused sub-assets in \"Unused Objects\" list if their parent assets are used' is disabled, unused sub-assets' parent assets might be used.", MessageType.Warning ); + + EditorGUILayout.HelpBox( "Although no references to these objects are found, they might still be used somewhere (e.g. via Resources.Load). If you intend to delete these objects, consider creating a backup of your project first.", MessageType.Info ); + } + + if( treeView == null ) + { + bool isFirstInitialization = ( treeViewState == null ); + if( isFirstInitialization ) + treeViewState = new SearchResultTreeViewState(); + + // This isn't inside isFirstInitialization because SearchResultTreeViewState might have been initialized by + // Unity's serialization system after a domain reload + bool shouldUpdateInitialTreeViewNodeId = ( treeViewState.initialNodeId == 0 && searchResult != null ); + if( shouldUpdateInitialTreeViewNodeId ) + treeViewState.initialNodeId = searchResult.nextTreeViewId; + + treeView = new SearchResultTreeView( treeViewState, references, ( Type == GroupType.UnusedObjects ) ? SearchResultTreeView.TreeType.UnusedObjects : SearchResultTreeView.TreeType.Normal, searchResult != null ? searchResult.UsedObjects : null, searchResult != null && searchResult.SearchParameters.hideDuplicateRows, searchResult != null && searchResult.SearchParameters.hideReduntantPrefabVariantLinks, true ); + + if( isFirstInitialization ) + { + if( Type != GroupType.UnusedObjects ) + treeView.ExpandMainReferences(); + else + treeView.ExpandAll(); + } + + if( shouldUpdateInitialTreeViewNodeId ) + searchResult.nextTreeViewId = treeViewState.finalNodeId; + } + + if( treeViewSearchField == null ) + { + treeViewSearchField = new SearchField() { autoSetFocusOnFindCommand = false }; + treeViewSearchField.downOrUpArrowKeyPressed += () => treeView.SetFocusAndEnsureSelectedItem(); // Not assigning SetFocusAndEnsureSelectedItem directly in case treeView's value changes + } + + Rect searchFieldRect = EditorGUILayout.GetControlRect( false, EditorGUIUtility.singleLineHeight ); + string previousSearchTerm = treeViewState.searchTerm ?? ""; + SearchResultTreeView.SearchMode previousSearchMode = treeViewState.searchMode; + treeViewState.searchTerm = treeViewSearchField.OnToolbarGUI( new Rect( searchFieldRect.x, searchFieldRect.y, searchFieldRect.width - 100f, searchFieldRect.height ), treeViewState.searchTerm ) ?? ""; + treeViewState.searchMode = (SearchResultTreeView.SearchMode) EditorGUI.EnumPopup( new Rect( searchFieldRect.xMax - 100f, searchFieldRect.y, 100f, searchFieldRect.height ), treeViewState.searchMode ); + if( treeViewState.searchTerm != previousSearchTerm || treeViewState.searchMode != previousSearchMode ) + treeView.RefreshSearch( previousSearchTerm ); + + KeyCode pressedKeyboardNavigationKey = KeyCode.None; + bool treeViewKeyboardNavigation = false; + if( ev.type == EventType.KeyDown ) + { + pressedKeyboardNavigationKey = ev.keyCode; + switch( pressedKeyboardNavigationKey ) + { + case KeyCode.UpArrow: + case KeyCode.DownArrow: + case KeyCode.LeftArrow: + case KeyCode.RightArrow: + case KeyCode.PageUp: + case KeyCode.PageDown: + case KeyCode.Home: + case KeyCode.End: + case KeyCode.F: treeViewKeyboardNavigation = true; break; + } + + SearchResultTooltip.Hide(); + } + else if( ( ev.type == EventType.ValidateCommand || ev.type == EventType.ExecuteCommand ) && ev.commandName == "Find" && treeView.HasFocus() ) + { + if( ev.type == EventType.ExecuteCommand ) + { + treeViewSearchField.SetFocus(); + + // Framed rect padding: Top = 2, Bottom = 2 + the first element in the TreeView + scrollPosition = FrameRectInScrollView( scrollPosition, new Vector2( searchFieldRect.y - 2f, searchFieldRect.yMax + EditorGUIUtility.singleLineHeight + 2f ), window.position.height ); + window.Repaint(); + + SearchResultTooltip.Hide(); + } + + ev.Use(); + } + else if( ev.type == EventType.ScrollWheel ) + SearchResultTooltip.Hide(); + + bool isFirstRowSelected = false, isLastRowSelected = false, isSelectedRowExpanded = false, canExpandSelectedRow = false; + if( treeViewKeyboardNavigation && treeView.HasFocus() && treeView.HasSelection() ) + treeView.GetRowStateWithId( treeViewState.lastClickedID, out isFirstRowSelected, out isLastRowSelected, out isSelectedRowExpanded, out canExpandSelectedRow ); + + Rect treeViewRect = EditorGUILayout.GetControlRect( false, treeView.totalHeight ); + if( ev.type == EventType.Repaint ) + { + lastTreeViewRect = treeViewRect; + +#if !UNITY_2018_2_OR_NEWER + // TreeView calls RowGUI for all rows instead of only the visible rows on early Unity versions which leads to performance issues. Do manual row culling on those versions + // Credit: https://github.com/Unity-Technologies/UnityCsReference/blob/a048de916b23331bf6dfe92c4a6c205989b83b4f/Editor/Mono/GUI/TreeView/TreeViewGUI.cs#L273-L276 + float topPixel = scrollPosition - treeViewRect.y; + float heightInPixels = window.position.height; + treeView.visibleRowTop = (int) Mathf.Floor( topPixel / treeView.rowHeight ); + treeView.visibleRowBottom = treeView.visibleRowTop + (int) Mathf.Ceil( heightInPixels / treeView.rowHeight ); +#endif + } + + treeView.OnGUI( treeViewRect ); + + if( treeViewKeyboardNavigation && treeView.HasFocus() && treeView.HasSelection() ) + { + Rect targetTreeViewRowRect; + if( treeView.GetRowRectWithId( treeViewState.lastClickedID, out targetTreeViewRowRect ) ) + { + // Allow keyboard navigation between different SearchResultGroups' TreeViews + Rect targetTreeViewRect = lastTreeViewRect; + if( !ev.control && !ev.command && !ev.shift ) + { + if( isFirstRowSelected && ( pressedKeyboardNavigationKey == KeyCode.UpArrow || pressedKeyboardNavigationKey == KeyCode.PageUp || pressedKeyboardNavigationKey == KeyCode.Home || ( pressedKeyboardNavigationKey == KeyCode.LeftArrow && !isSelectedRowExpanded ) ) ) + { + int searchResultGroupIndex = searchResult.IndexOf( this ); + for( int i = searchResultGroupIndex - 1; i >= 0; i-- ) + { + if( !searchResult[i].PendingSearch && searchResult[i].IsExpanded && searchResult[i].references.Count > 0 ) + { + searchResult[i].treeView.SetFocus(); + + targetTreeViewRect = searchResult[i].lastTreeViewRect; + targetTreeViewRowRect = searchResult[i].treeView.SelectLastRowAndReturnRect(); + + break; + } + } + } + else if( isLastRowSelected && ( pressedKeyboardNavigationKey == KeyCode.DownArrow || pressedKeyboardNavigationKey == KeyCode.PageDown || pressedKeyboardNavigationKey == KeyCode.End || ( pressedKeyboardNavigationKey == KeyCode.RightArrow && !canExpandSelectedRow ) ) ) + { + int searchResultGroupIndex = searchResult.IndexOf( this ); + for( int i = searchResultGroupIndex + 1; i < searchResult.NumberOfGroups; i++ ) + { + if( !searchResult[i].PendingSearch && searchResult[i].IsExpanded && searchResult[i].references.Count > 0 ) + { + searchResult[i].treeView.SetFocus(); + + targetTreeViewRect = searchResult[i].lastTreeViewRect; + targetTreeViewRowRect = searchResult[i].treeView.SelectFirstRowAndReturnRect(); + + break; + } + } + } + } + + // When key event isn't automatically used by the focused TreeView (happens when its search results are empty), if we navigate to + // a new TreeView, key event will be consumed by that TreeView and hence, keyboard navigation will occur twice + if( ev.type != EventType.Used ) + ev.Use(); + + float scrollTop = targetTreeViewRect.y + targetTreeViewRowRect.y; + float scrollBottom = targetTreeViewRect.y + targetTreeViewRowRect.yMax; + + scrollPosition = FrameRectInScrollView( scrollPosition, new Vector2( scrollTop, scrollBottom ), window.position.height ); + window.Repaint(); + } + } + } + } + + return scrollPosition; + } + + // Frame selection (it isn't handled automatically when using an external scroll view) + // Credit: https://github.com/Unity-Technologies/UnityCsReference/blob/d0fe81a19ce788fd1d94f826cf797aafc37db8ea/Editor/Mono/GUI/TreeView/TreeViewController.cs#L1329-L1351 + private float FrameRectInScrollView( float scrollPosition, Vector2 rectBounds, float windowHeight ) + { + return Mathf.Clamp( scrollPosition, rectBounds.y - windowHeight, rectBounds.x ); + } + + // Serialize this result group + internal SearchResult.SerializableResultGroup Serialize( Dictionary nodeToIndex, List serializedNodes ) + { + SearchResult.SerializableResultGroup serializedResultGroup = new SearchResult.SerializableResultGroup() + { + title = Title, + type = Type, + isExpanded = IsExpanded, + pendingSearch = PendingSearch, + treeViewState = treeViewState + }; + + if( references != null ) + { + serializedResultGroup.initialSerializedNodes = new List( references.Count ); + + for( int i = 0; i < references.Count; i++ ) + serializedResultGroup.initialSerializedNodes.Add( references[i].SerializeRecursively( nodeToIndex, serializedNodes ) ); + } + + return serializedResultGroup; + } + + // Deserialize this result group from the serialized data + internal void Deserialize( SearchResult.SerializableResultGroup serializedResultGroup, List allNodes ) + { + treeViewState = serializedResultGroup.treeViewState; + + if( serializedResultGroup.initialSerializedNodes != null ) + { + for( int i = 0; i < serializedResultGroup.initialSerializedNodes.Count; i++ ) + references.Add( allNodes[serializedResultGroup.initialSerializedNodes[i]] ); + } + } + + IEnumerator IEnumerable.GetEnumerator() { return ( (IEnumerable) references ).GetEnumerator(); } + IEnumerator IEnumerable.GetEnumerator() { return ( (IEnumerable) references ).GetEnumerator(); } + } + + // Custom class to hold an object in the path to a reference as a node + public class ReferenceNode + { + internal enum UsedState { Unused, MixedCollapsed, MixedExpanded, Used }; + + public class Link + { + public readonly ReferenceNode targetNode; + public readonly List descriptions; + public bool isWeakLink; // Weak links can be omitted from search results if this ReferenceNode isn't referenced by any other node + + public Link( ReferenceNode targetNode, string description, bool isWeakLink ) + { + this.targetNode = targetNode; + this.descriptions = string.IsNullOrEmpty( description ) ? new List() : new List( 1 ) { description }; + this.isWeakLink = isWeakLink; + } + + public Link( ReferenceNode targetNode, List descriptions, bool isWeakLink ) + { + this.targetNode = targetNode; + this.descriptions = descriptions; + this.isWeakLink = isWeakLink; + } + } + + // Unique identifier is used while serializing the node + private static int uid_last = 0; + private readonly int uid; + + public string Label { get; private set; } + public bool IsMainReference { get; private set; } // True: if belongs to a scene search result group, then it's an object in that scene. If belongs to the assets search result group, then it's an asset + + internal object nodeObject; + private int? instanceId; // instanceId of the nodeObject if it is a Unity object, null otherwise + public Object UnityObject { get { return instanceId.HasValue ? EditorUtility.InstanceIDToObject( instanceId.Value ) : null; } } + + private readonly List links = new List( 2 ); + public int NumberOfOutgoingLinks { get { return links.Count; } } + public Link this[int index] { get { return links[index]; } } + + internal UsedState usedState; + + public ReferenceNode() + { + uid = uid_last++; + usedState = UsedState.Used; + } + + // Add a one-way connection to another node + public void AddLinkTo( ReferenceNode nextNode, string description = null, bool isWeakLink = false ) + { + if( nextNode != null && nextNode != this ) + { + if( !string.IsNullOrEmpty( description ) ) + description = "[" + description + "]"; + + // Avoid duplicate links + for( int i = 0; i < links.Count; i++ ) + { + if( links[i].targetNode == nextNode ) + { + if( !string.IsNullOrEmpty( description ) && !links[i].descriptions.Contains( description ) ) + links[i].descriptions.Add( description ); + + links[i].isWeakLink &= isWeakLink; + return; + } + } + + links.Add( new Link( nextNode, description, isWeakLink ) ); + } + } + + public void RemoveLink( int index ) + { + links.RemoveAt( index ); + } + + public bool RemoveLink( ReferenceNode nextNode ) + { + for( int i = links.Count - 1; i >= 0; i-- ) + { + if( links[i].targetNode == nextNode ) + { + links.RemoveAt( i ); + return true; + } + } + + return false; + } + + public void SortLinks() + { + if( links.Count > 1 ) + { + SearchResult.SortedEntry[] sortedEntries = new SearchResult.SortedEntry[links.Count]; + for( int i = links.Count - 1; i >= 0; i-- ) + sortedEntries[i] = new SearchResult.SortedEntry( links[i] ); + + Array.Sort( sortedEntries ); + + for( int i = 0; i < sortedEntries.Length; i++ ) + links[i] = (Link) sortedEntries[i].entry; + } + } + + public void CopyReferencesTo( ReferenceNode other ) + { + other.links.Clear(); + other.links.AddRange( links ); + } + + // Clear this node so that it can be reused later + public void Clear() + { + nodeObject = null; + links.Clear(); + } + + public void InitializeRecursively() + { + if( Label != null ) // Already initialized + return; + + Object unityObject = nodeObject as Object; + if( unityObject != null ) + { + instanceId = unityObject.GetInstanceID(); + Label = unityObject.name + " (" + unityObject.GetType().Name + ")"; + + if( AssetUsageDetectorSettings.ShowRootAssetName && unityObject.IsAsset() && !AssetDatabase.IsMainAsset( unityObject ) ) + { + string mainAssetName = Path.GetFileNameWithoutExtension( AssetDatabase.GetAssetPath( unityObject ) ); + if( unityObject.name != mainAssetName ) + Label += " "; + } + } + else if( nodeObject != null ) + { + instanceId = null; + Label = nodeObject.GetType() + " object"; + } + else + { + instanceId = null; + Label = "<>"; + } + + nodeObject = null; // Don't hold Object reference, allow Unity to GC used memory + + for( int i = 0; i < links.Count; i++ ) + links[i].targetNode.InitializeRecursively(); + } + + public ReferenceNode CreateReverseGraphRecursively( SearchResultGroup searchResultGroup, List reverseGraphRoots, Dictionary reverseGraphNodes, HashSet objectsToSearchSet ) + { + ReferenceNode result; + if( !reverseGraphNodes.TryGetValue( this, out result ) ) + { + reverseGraphNodes[this] = result = new ReferenceNode() { nodeObject = nodeObject }; + + Object obj = nodeObject as Object; + if( obj && objectsToSearchSet.Contains( obj ) ) + reverseGraphRoots.Add( result ); + //else // When 'else' is uncommented, 'Don't search "Find referenced of" themselves for references" option simply does nothing. I am not entirely sure if commenting it out will have any side effects, so fingers crossed? + { + for( int i = 0; i < links.Count; i++ ) + { + ReferenceNode linkedNode = links[i].targetNode.CreateReverseGraphRecursively( searchResultGroup, reverseGraphRoots, reverseGraphNodes, objectsToSearchSet ); + linkedNode.links.Add( new Link( result, links[i].descriptions, links[i].isWeakLink ) ); + } + } + + if( obj ) + { + if( obj is Component ) + obj = ( (Component) obj ).gameObject; + + switch( searchResultGroup.Type ) + { + case SearchResultGroup.GroupType.Assets: result.IsMainReference = obj.IsAsset() && ( obj is GameObject || ( obj.hideFlags & ( HideFlags.HideInInspector | HideFlags.HideInHierarchy ) ) == HideFlags.None ); break; + case SearchResultGroup.GroupType.ProjectSettings: result.IsMainReference = obj.IsAsset() && AssetDatabase.GetAssetPath( obj ).StartsWith( "ProjectSettings/" ); break; + case SearchResultGroup.GroupType.Scene: + case SearchResultGroup.GroupType.DontDestroyOnLoad: + { + if( obj is GameObject ) + { + Scene scene = ( (GameObject) obj ).scene; + if( scene.IsValid() ) + result.IsMainReference = ( searchResultGroup.Type == SearchResultGroup.GroupType.Scene ) ? scene.path == searchResultGroup.ScenePath : scene.name == "DontDestroyOnLoad"; + } + + break; + } + } + } + } + + return result; + } + + public void RemoveRedundantLinksRecursively( HashSet visitedNodes ) + { + if( !visitedNodes.Add( this ) ) + return; + + List stack = null; + for( int i = links.Count - 1; i >= 0; i-- ) + { + if( !links[i].isWeakLink ) + continue; + + if( links[i].targetNode.links.Count == 0 ) + links.RemoveAt( i ); + else + { + if( stack == null ) + stack = new List( 2 ); + else + stack.Clear(); + + if( !links[i].targetNode.CheckForNonWeakLinksRecursively( stack ) ) + links.RemoveAt( i ); + } + } + + for( int i = links.Count - 1; i >= 0; i-- ) + links[i].targetNode.RemoveRedundantLinksRecursively( visitedNodes ); + } + + private bool CheckForNonWeakLinksRecursively( List stack ) + { + if( stack.Contains( this ) || links.Count == 0 ) + return false; + + for( int i = links.Count - 1; i >= 0; i-- ) + { + if( !links[i].isWeakLink ) + return true; + } + + stack.Add( this ); + + for( int i = links.Count - 1; i >= 0; i-- ) + { + if( links[i].targetNode.CheckForNonWeakLinksRecursively( stack ) ) + return true; + } + + stack.RemoveAt( stack.Count - 1 ); + + return false; + } + + // Serialize this node and its connected nodes recursively + internal int SerializeRecursively( Dictionary nodeToIndex, List serializedNodes ) + { + int index; + if( nodeToIndex.TryGetValue( this, out index ) ) + return index; + + SearchResult.SerializableNode serializedNode = new SearchResult.SerializableNode() + { + label = Label, + isMainReference = IsMainReference, + instanceId = instanceId ?? 0, + isUnityObject = instanceId.HasValue, + usedState = usedState + }; + + index = serializedNodes.Count; + nodeToIndex[this] = index; + serializedNodes.Add( serializedNode ); + + if( links.Count > 0 ) + { + serializedNode.links = new List( links.Count ); + serializedNode.linkDescriptions = new List( links.Count ); + serializedNode.linkWeakStates = new List( links.Count ); + + for( int i = 0; i < links.Count; i++ ) + { + serializedNode.links.Add( links[i].targetNode.SerializeRecursively( nodeToIndex, serializedNodes ) ); + serializedNode.linkDescriptions.Add( new SearchResult.SerializableNode.SerializableLinkDescriptions() { value = links[i].descriptions } ); + serializedNode.linkWeakStates.Add( links[i].isWeakLink ); + } + } + + return index; + } + + // Deserialize this node and its links from the serialized data + internal void Deserialize( SearchResult.SerializableNode serializedNode, List allNodes ) + { + if( serializedNode.isUnityObject ) + instanceId = serializedNode.instanceId; + else + instanceId = null; + + Label = serializedNode.label; + IsMainReference = serializedNode.isMainReference; + usedState = serializedNode.usedState; + + if( serializedNode.links != null ) + { + for( int i = 0; i < serializedNode.links.Count; i++ ) + links.Add( new Link( allNodes[serializedNode.links[i]], serializedNode.linkDescriptions[i].value, serializedNode.linkWeakStates[i] ) ); + } + } + + public override int GetHashCode() + { + return uid; + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/AssetUsageDetector/Editor/SearchResult.cs.meta b/Assets/Plugins/AssetUsageDetector/Editor/SearchResult.cs.meta new file mode 100644 index 00000000..7764d6bb --- /dev/null +++ b/Assets/Plugins/AssetUsageDetector/Editor/SearchResult.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ca236e4f3c5a9f447be89f0e61e485fa +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/AssetUsageDetector/Editor/SearchResultTooltip.cs b/Assets/Plugins/AssetUsageDetector/Editor/SearchResultTooltip.cs new file mode 100644 index 00000000..97857174 --- /dev/null +++ b/Assets/Plugins/AssetUsageDetector/Editor/SearchResultTooltip.cs @@ -0,0 +1,91 @@ +using System.Reflection; +using UnityEditor; +using UnityEngine; + +namespace AssetUsageDetectorNamespace +{ + public class SearchResultTooltip : EditorWindow + { + private static SearchResultTooltip mainWindow; + private static string tooltip; + + private static GUIStyle m_style; + internal static GUIStyle Style + { + get + { + if( m_style == null ) + { + m_style = (GUIStyle) typeof( EditorStyles ).GetProperty( "tooltip", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static ).GetValue( null, null ); + m_style.richText = true; + } + + return m_style; + } + } + + public static void Show( Rect sourcePosition, string tooltip ) + { + Vector2 preferredSize = Style.CalcSize( new GUIContent( tooltip ) ) + Style.contentOffset + new Vector2( Style.padding.horizontal + Style.margin.horizontal, Style.padding.vertical + Style.margin.vertical ); + Rect preferredPosition; + + Rect positionLeft = new Rect( sourcePosition.position - new Vector2( preferredSize.x, 0f ), preferredSize ); + Rect screenFittedPositionLeft = Utilities.GetScreenFittedRect( positionLeft ); + + Vector2 positionOffset = positionLeft.position - screenFittedPositionLeft.position; + Vector2 sizeOffset = positionLeft.size - screenFittedPositionLeft.size; + if( positionOffset.sqrMagnitude <= 400f && sizeOffset.sqrMagnitude <= 400f ) + preferredPosition = screenFittedPositionLeft; + else + { + Rect positionRight = new Rect( sourcePosition.position + new Vector2( sourcePosition.width, 0f ), preferredSize ); + Rect screenFittedPositionRight = Utilities.GetScreenFittedRect( positionRight ); + + Vector2 positionOffset2 = positionRight.position - screenFittedPositionRight.position; + Vector2 sizeOffset2 = positionRight.size - screenFittedPositionRight.size; + if( positionOffset2.magnitude + sizeOffset2.magnitude < positionOffset.magnitude + sizeOffset.magnitude ) + preferredPosition = screenFittedPositionRight; + else + preferredPosition = screenFittedPositionLeft; + } + + // Don't lose focus to the previous window + EditorWindow prevFocusedWindow = focusedWindow; + + if( !mainWindow ) + { + mainWindow = CreateInstance(); + mainWindow.ShowPopup(); + } + + SearchResultTooltip.tooltip = tooltip; + mainWindow.minSize = preferredPosition.size; + mainWindow.position = preferredPosition; + mainWindow.Repaint(); + + if( prevFocusedWindow ) + prevFocusedWindow.Focus(); + } + + public static void Hide() + { + if( mainWindow ) + { + mainWindow.Close(); + mainWindow = null; + } + } + + private void OnGUI() + { + // If somehow the tooltip isn't automatically closed, allow closing it by clicking on it + if( Event.current.type == EventType.MouseDown ) + { + Hide(); + GUIUtility.ExitGUI(); + } + + GUI.Label( new Rect( Vector2.zero, position.size ), tooltip, Style ); + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/AssetUsageDetector/Editor/SearchResultTooltip.cs.meta b/Assets/Plugins/AssetUsageDetector/Editor/SearchResultTooltip.cs.meta new file mode 100644 index 00000000..06a26622 --- /dev/null +++ b/Assets/Plugins/AssetUsageDetector/Editor/SearchResultTooltip.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: c8bd4351b5024324ca5974ebcad1dde3 +timeCreated: 1639247551 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/AssetUsageDetector/Editor/SearchResultTreeView.cs b/Assets/Plugins/AssetUsageDetector/Editor/SearchResultTreeView.cs new file mode 100644 index 00000000..cbb68fa8 --- /dev/null +++ b/Assets/Plugins/AssetUsageDetector/Editor/SearchResultTreeView.cs @@ -0,0 +1,1353 @@ +using System.Collections.Generic; +using System.Globalization; +using System.Reflection; +using System.Text; +using UnityEditor; +using UnityEditor.IMGUI.Controls; +using UnityEngine; +#if UNITY_2021_2_OR_NEWER +using PrefabStage = UnityEditor.SceneManagement.PrefabStage; +using PrefabStageUtility = UnityEditor.SceneManagement.PrefabStageUtility; +#elif UNITY_2018_3_OR_NEWER +using PrefabStage = UnityEditor.Experimental.SceneManagement.PrefabStage; +using PrefabStageUtility = UnityEditor.Experimental.SceneManagement.PrefabStageUtility; +#endif + +namespace AssetUsageDetectorNamespace +{ + [System.Serializable] + public class SearchResultTreeViewState : TreeViewState + { + // - initialNodeId is serialized because we want to preserve the expanded states of the TreeViewItems after domain reload and + // it's only possible if TreeView is reconstructed with the same ids + // - finalNodeId is serialized because if the same id used for multiple TreeViewItems across multiple TreeViews, strange issues occur. + // Thus, each new TreeView will set its initialNodeId to the previous TreeView's finalNodeId + // - Each TreeViewItem's id is different even if two TreeViewItems point to the exact same ReferenceNode. That's because TreeView + // doesn't work well when some TreeViewItems share the same id (e.g. while navigating the tree with arrow keys) + public int initialNodeId, finalNodeId; + + // Not using the built-in searchString and hasSearch properties of TreeView because: + // - This search algorithm is a bit more complicated than usual, we don't flatten the tree during the search + // - If code is recompiled while searchString wasn't empty, the tree isn't rebuilt and remains empty (at least on Unity 5.6) + public string searchTerm; + public SearchResultTreeView.SearchMode searchMode = SearchResultTreeView.SearchMode.All; + public bool selectionChangedDuringSearch; + + public List preSearchExpandedIds; + } + + public class SearchResultTreeView : TreeView + { + public enum TreeType { Normal, UnusedObjects, IsolatedView }; + public enum SearchMode { SearchedObjectsOnly, ReferencesOnly, All }; + + private class ReferenceNodeData + { + public readonly TreeViewItem item; + public readonly ReferenceNode node; + public readonly ReferenceNodeData parent; + public readonly int linkIndex; + public bool isLastLink; + public bool isDuplicate; + public bool shouldExpandAfterSearch; + + private string m_tooltipText; + public string tooltipText + { + get + { + if( m_tooltipText != null ) + return m_tooltipText; + + return GetTooltipText( Utilities.stringBuilder ); + } + } + + public ReferenceNodeData( TreeViewItem item, ReferenceNode node, ReferenceNodeData parent, int linkIndex ) + { + this.item = item; + this.node = node; + this.parent = parent; + this.linkIndex = linkIndex; + } + + private string GetTooltipText( StringBuilder sb ) + { + sb.Length = 0; + sb.Append( "- " ).Append( node.Label ); + + if( parent != null ) + { + sb.Append( "\n" ); + + if( parent.node[linkIndex].descriptions.Count > 0 ) + { + List linkDescriptions = parent.node[linkIndex].descriptions; + for( int i = 0; i < linkDescriptions.Count; i++ ) + sb.Append( " " ).Append( linkDescriptions[i] ).Append( "\n" ); + } + + if( parent.m_tooltipText != null ) + sb.Append( parent.m_tooltipText ); + else // Cache parents' tooltips along the way because they'll likely be reused frequently. We need to use new StringBuilder instances for them + sb.Append( parent.GetTooltipText( new StringBuilder( 256 ) ) ); + } + + m_tooltipText = sb.ToString(); + return m_tooltipText; + } + + public void ResetTooltip() + { + m_tooltipText = null; + } + } + + private const float SEARCHED_OBJECTS_BORDER_THICKNESS = 1f; +#if UNITY_2019_3_OR_NEWER + private const float TREE_VIEW_LINES_THICKNESS = 1.5f; // There are inexplicable spaces between the vertical and horizontal lines if we don't change thickness by 0.5f on 2019.3+ +#else + private const float TREE_VIEW_LINES_THICKNESS = 2f; +#endif + private const float HIGHLIGHTED_TREE_VIEW_LINES_THICKNESS = TREE_VIEW_LINES_THICKNESS * 2f; + + private readonly new SearchResultTreeViewState state; + + private readonly List references; + private readonly List idToNodeDataLookup = new List( 128 ); + + private readonly HashSet selectedReferenceNodes = new HashSet(); + private readonly HashSet selectedReferenceNodesHierarchyIds = new HashSet(); + private readonly HashSet selectedReferenceNodesHierarchyIndirectIds = new HashSet(); + + private readonly HashSet usedObjectsSet; + + private readonly TreeType treeType; + private readonly bool hideDuplicateRows; + private readonly bool hideReduntantPrefabVariantLinks; + + private bool isSearching; + +#if !UNITY_2018_2_OR_NEWER + public int visibleRowTop = 0, visibleRowBottom = int.MaxValue; +#endif + + private readonly CompareInfo textComparer = new CultureInfo( "en-US" ).CompareInfo; + private readonly CompareOptions textCompareOptions = CompareOptions.IgnoreCase | CompareOptions.IgnoreNonSpace; + + private readonly GUIContent sharedGUIContent = new GUIContent(); + private GUIStyle foldoutLabelStyle; + private Texture2D whiteGradientTexture; + private string highlightedSearchTextColor; + + private ReferenceNodeData prevHoveredData, hoveredData; + private Rect hoveredDataRect; + + private bool isTreeViewEmpty; + private bool isLMBDown; + + private double customTooltipShowTime; + + public new float rowHeight + { + get { return base.rowHeight; } + set + { + base.rowHeight = value; +#if !UNITY_2019_3_OR_NEWER + customFoldoutYOffset = ( value - EditorGUIUtility.singleLineHeight ) * 0.5f; +#endif + } + } + + // Avoid using these properties of TreeView by mistake + [System.Obsolete] private new string searchString { get; } + [System.Obsolete] private new bool hasSearch { get; } + + public SearchResultTreeView( SearchResultTreeViewState state, List references, TreeType treeType, HashSet usedObjectsSet, bool hideDuplicateRows, bool hideReduntantPrefabVariantLinks, bool usesExternalScrollView ) : base( state ) + { + this.state = state; + this.references = references; + this.treeType = treeType; + this.hideDuplicateRows = hideDuplicateRows; + this.hideReduntantPrefabVariantLinks = hideReduntantPrefabVariantLinks; + + highlightedSearchTextColor = ""; + + rowHeight = EditorGUIUtility.singleLineHeight + AssetUsageDetectorSettings.ExtraRowHeight; + + if( treeType == TreeType.UnusedObjects ) + { + showBorder = true; + this.usedObjectsSet = usedObjectsSet; + } + + if( treeType != TreeType.IsolatedView ) + { + // Draw only the visible rows. This requires setting useScrollView to false because we are using an external scroll view: https://docs.unity3d.com/ScriptReference/IMGUI.Controls.TreeView-useScrollView.html +#if UNITY_2018_2_OR_NEWER + useScrollView = false; +#else + // In my tests, SetUseScrollView seems to have no effect unfortunately but let's keep this line in case it fixes some other issues with the external scroll view + object treeViewController = typeof( TreeView ).GetField( "m_TreeView", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance ).GetValue( this ); + treeViewController.GetType().GetMethod( "SetUseScrollView", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance ).Invoke( treeViewController, new object[1] { false } ); +#endif + } + + isSearching = !string.IsNullOrEmpty( state.searchTerm ); + + Reload(); + + if( HasSelection() ) + RefreshSelectedNodes( GetSelection() ); + } + + public void RefreshSearch( string prevSearchTerm ) + { + bool wasSearchTermEmpty = string.IsNullOrEmpty( prevSearchTerm ); + bool isSearchTermEmpty = string.IsNullOrEmpty( state.searchTerm ); + + isSearching = !isSearchTermEmpty; + + if( !wasSearchTermEmpty || !isSearchTermEmpty ) + { + Reload(); + + if( !isSearchTermEmpty ) + { + if( wasSearchTermEmpty ) + { + state.preSearchExpandedIds = new List( GetExpanded() ?? new int[0] ); + state.selectionChangedDuringSearch = false; + } + + ExpandMatchingSearchResults(); + } + else if( !wasSearchTermEmpty && state.preSearchExpandedIds != null && state.preSearchExpandedIds.Count > 0 ) + { + List expandedIds = state.preSearchExpandedIds; + HashSet expandedIdsSet = new HashSet( expandedIds ); + if( state.selectionChangedDuringSearch ) + { + IList selection = GetSelection(); + for( int i = 0; i < selection.Count; i++ ) + { + for( TreeViewItem item = GetDataFromId( selection[i] ).item; item != null; item = item.parent ) + { + if( expandedIdsSet.Add( item.id ) ) + expandedIds.Add( item.id ); + else + break; + } + } + } + + SetExpanded( state.preSearchExpandedIds ); + expandedIds.Clear(); + } + + if( HasSelection() ) + RefreshSelectedNodes( GetSelection() ); + } + } + + protected override TreeViewItem BuildRoot() + { + TreeViewItem root = new TreeViewItem { id = state.initialNodeId, depth = -1, displayName = "Root" }; + int id = state.initialNodeId + 1; + + idToNodeDataLookup.Clear(); + + List stack = new List( 8 ); + HashSet processedNodes = null; + if( hideDuplicateRows ) + { + processedNodes = new HashSet(); + for( int i = references.Count - 1; i >= 0; i-- ) + { + // Don't mark root nodes as duplicates unless we're in ReferencesOnly search mode (in which case, it's just technically unfeasible to know which root nodes will be displayed in advance) + if( !isSearching || ( state.searchMode != SearchMode.ReferencesOnly && textComparer.IndexOf( references[i].Label, state.searchTerm, textCompareOptions ) >= 0 ) ) + processedNodes.Add( references[i] ); + } + } + + for( int i = 0; i < references.Count; i++ ) + GenerateRowsRecursive( root, references[i], null, i, 0, null, stack, processedNodes, ref id ); + + isTreeViewEmpty = !root.hasChildren; + if( isTreeViewEmpty ) // May happen if all items are hidden inside HideItems function or there are no matching search results. If we don't create a dummy child, Unity throws an exception + root.AddChild( new TreeViewItem( state.initialNodeId + 1 ) ); // If we don't give it a valid id, some functions throw exceptions when there are no matching search results + else + GetDataFromId( root.children[root.children.Count - 1].id ).isLastLink = true; + + state.finalNodeId = id + 1; + + return root; + } + + private bool GenerateRowsRecursive( TreeViewItem parent, ReferenceNode referenceNode, ReferenceNodeData parentData, int siblingIndex, int depth, bool? itemForcedVisibility, List stack, HashSet processedNodes, ref int id ) + { + TreeViewItem item = new TreeViewItem( id++, depth, "" ); + ReferenceNodeData data = new ReferenceNodeData( item, referenceNode, parentData, siblingIndex ); + + bool shouldShowItem; + if( itemForcedVisibility.HasValue ) + shouldShowItem = itemForcedVisibility.Value; + else + { + if( !isSearching ) + shouldShowItem = true; + else if( state.searchMode == SearchMode.All || ( ( depth == 0 ) == ( state.searchMode == SearchMode.SearchedObjectsOnly ) ) ) + { + shouldShowItem = textComparer.IndexOf( referenceNode.Label, state.searchTerm, textCompareOptions ) >= 0; + if( !shouldShowItem && depth > 0 ) + { + List descriptions = parentData.node[siblingIndex].descriptions; + for( int i = descriptions.Count - 1; i >= 0; i-- ) + { + if( textComparer.IndexOf( descriptions[i], state.searchTerm, textCompareOptions ) >= 0 ) + { + shouldShowItem = true; + break; + } + } + } + + data.shouldExpandAfterSearch = shouldShowItem; + + if( state.searchMode == SearchMode.SearchedObjectsOnly || ( state.searchMode == SearchMode.All && shouldShowItem ) ) + itemForcedVisibility = shouldShowItem; + } + else + shouldShowItem = false; + } + + idToNodeDataLookup.Add( data ); + + // Disallow recursion (stack) because it would crash Unity + if( referenceNode.NumberOfOutgoingLinks > 0 && !stack.ContainsFast( referenceNode ) ) + { + // Add children only if hideDuplicateRows is false (processedNodes == null) or this node hasn't been seen before + if( processedNodes != null && !processedNodes.Add( referenceNode ) && depth > 0 ) // "depth > 0": Root nodes are either added to processedNodes prior to generating rows (so that they're never marked as duplicate), or they just shouldn't be trimmed + data.isDuplicate = true; + else + { + stack.Add( referenceNode ); + + // Generate child items even if they will be forced invisible so that each visible row's id is deterministic and doesn't change when some rows become invisible + for( int i = 0; i < referenceNode.NumberOfOutgoingLinks; i++ ) + shouldShowItem |= GenerateRowsRecursive( item, referenceNode[i].targetNode, data, i, depth + 1, itemForcedVisibility, stack, processedNodes, ref id ); + + stack.RemoveAt( stack.Count - 1 ); + } + } + + if( shouldShowItem ) + { + if( item.hasChildren ) + GetDataFromId( item.children[item.children.Count - 1].id ).isLastLink = true; + + parent.AddChild( item ); + return true; + } + + return false; + } + + private ReferenceNodeData GetDataFromId( int id ) + { + return idToNodeDataLookup[id - state.initialNodeId - 1]; + } + + public override void OnGUI( Rect rect ) + { + // Disallow clicking on "No matching results" text when in search mode + bool guiEnabled = GUI.enabled; + if( isTreeViewEmpty ) + GUI.enabled = false; + + // Mouse and special keyboard events are already in Used state in CommandEventHandling, so we need to process them here + Event ev = Event.current; + if( ev.type == EventType.MouseDown ) + { + if( ev.button == 0 ) + isLMBDown = true; + } + else if( ev.type == EventType.MouseUp ) + { + if( ev.button == 0 ) + isLMBDown = false; + } + else if( ev.type == EventType.MouseMove ) + hoveredData = null; + else if( ev.type == EventType.KeyDown ) + { + if( ( ev.keyCode == KeyCode.Return || ev.keyCode == KeyCode.KeypadEnter ) && HasSelection() && HasFocus() ) + { + DoubleClickedItem( state.lastClickedID ); + ev.Use(); + } + } + + base.OnGUI( rect ); + + if( prevHoveredData != hoveredData ) + { + if( AssetUsageDetectorSettings.CustomTooltipDelay > 0f ) + EditorApplication.update -= ShowTooltipDelayed; + + prevHoveredData = hoveredData; + if( hoveredData != null ) + { + if( AssetUsageDetectorSettings.CustomTooltipDelay <= 0f ) + SearchResultTooltip.Show( hoveredDataRect, hoveredData.tooltipText ); + else + { + customTooltipShowTime = EditorApplication.timeSinceStartup + AssetUsageDetectorSettings.CustomTooltipDelay; + EditorApplication.update += ShowTooltipDelayed; + } + } + else + SearchResultTooltip.Hide(); + + Repaint(); + } + + GUI.enabled = guiEnabled; + } + + protected override void RowGUI( RowGUIArgs args ) + { +#if !UNITY_2018_2_OR_NEWER + // Do manual row culling on early Unity versions + if( args.row < visibleRowTop || args.row > visibleRowBottom ) + return; +#endif + + if( isTreeViewEmpty ) + { + EditorGUI.LabelField( args.rowRect, "No matching results..." ); + return; + } + + Event ev = Event.current; + ReferenceNodeData data = GetDataFromId( args.item.id ); + Rect rect = args.rowRect; + + if( string.IsNullOrEmpty( args.item.displayName ) ) + { + Object unityObject = data.node.UnityObject; + if( unityObject ) + args.item.icon = AssetPreview.GetMiniThumbnail( unityObject ); + + StringBuilder sb = Utilities.stringBuilder; + sb.Length = 0; + + if( data.isDuplicate ) + sb.Append( "[D] " ); + + if( data.parent == null ) + { + if( treeType != TreeType.UnusedObjects ) + sb.Append( "" ); + else if( data.node.usedState == ReferenceNode.UsedState.MixedCollapsed ) + sb.Append( "[!] " ); + else if( data.node.usedState == ReferenceNode.UsedState.MixedExpanded ) + sb.Append( "[!] " ); + + if( !isSearching || state.searchMode == SearchMode.ReferencesOnly ) + sb.Append( data.node.Label ); + else + HighlightSearchTermInString( sb, data.node.Label ); + + if( treeType != TreeType.UnusedObjects ) + sb.Append( "" ); + } + else + { + List linkDescriptions = data.parent.node[data.linkIndex].descriptions; + if( linkDescriptions.Count > 0 ) + { + if( !isSearching || state.searchMode == SearchMode.SearchedObjectsOnly ) + sb.Append( data.node.Label ).Append( " " ).Append( linkDescriptions[0] ); + else + { + HighlightSearchTermInString( sb, data.node.Label ); + sb.Append( " " ); + HighlightSearchTermInString( sb, linkDescriptions[0] ); + } + + if( linkDescriptions.Count > 1 ) + { + bool shouldHighlightRemainingLinkDescriptions = false; + if( isSearching && state.searchMode != SearchMode.SearchedObjectsOnly ) + { + for( int i = linkDescriptions.Count - 1; i > 0; i-- ) + { + if( textComparer.IndexOf( linkDescriptions[i], state.searchTerm, textCompareOptions ) >= 0 ) + { + shouldHighlightRemainingLinkDescriptions = true; + sb.Append( highlightedSearchTextColor ); + + break; + } + } + } + + sb.Append( " and " ).Append( linkDescriptions.Count - 1 ).Append( " more" ); + + if( shouldHighlightRemainingLinkDescriptions ) + sb.Append( "" ); + } + + sb.Append( "" ); + } + else if( isSearching && state.searchMode != SearchMode.SearchedObjectsOnly ) + HighlightSearchTermInString( sb, data.node.Label ); + else + sb.Append( data.node.Label ); + } + + args.item.displayName = sb.ToString(); + } + + sharedGUIContent.text = args.item.displayName; + sharedGUIContent.tooltip = AssetUsageDetectorSettings.ShowUnityTooltip ? data.tooltipText : null; + sharedGUIContent.image = args.item.icon; + + if( ev.type == EventType.Repaint ) + { + if( treeType != TreeType.UnusedObjects ) + { + if( args.item.depth == 0 ) + { + Color guiColor = GUI.color; + + // Draw background + if( !args.selected ) + { + GUI.color = guiColor * ( ( AssetUsageDetectorSettings.ApplySelectedRowParentsTintToRootRows && selectedReferenceNodesHierarchyIds.Contains( args.item.id ) ) ? AssetUsageDetectorSettings.SelectedRowParentsTint : AssetUsageDetectorSettings.RootRowsBackgroundColor ); + GUI.DrawTexture( rect, EditorGUIUtility.whiteTexture, ScaleMode.StretchToFill, true, 0f ); + } + + // Draw border: https://github.com/Unity-Technologies/UnityCsReference/blob/33cbfe062d795667c39e16777230e790fcd4b28b/Editor/Mono/GUI/InternalEditorGUI.cs#L262-L275 + if( AssetUsageDetectorSettings.RootRowsBorderColor.a > 0f ) + { + GUI.color = guiColor * AssetUsageDetectorSettings.RootRowsBorderColor; + GUI.DrawTexture( new Rect( rect.x, rect.y, rect.width, SEARCHED_OBJECTS_BORDER_THICKNESS ), EditorGUIUtility.whiteTexture, ScaleMode.StretchToFill, true, 0f ); + + // Draw bottom border only if there isn't another searched object immediately below this one (otherwise, this bottom border and the following top border are drawn at the same space, resulting in darker shade for that edge) + if( data.isLastLink || ( args.item.hasChildren && IsExpanded( args.item.id ) ) ) + { + GUI.DrawTexture( new Rect( rect.x, rect.yMax - SEARCHED_OBJECTS_BORDER_THICKNESS, rect.width, SEARCHED_OBJECTS_BORDER_THICKNESS ), EditorGUIUtility.whiteTexture, ScaleMode.StretchToFill, true, 0f ); + GUI.DrawTexture( new Rect( rect.x, rect.y + 1, SEARCHED_OBJECTS_BORDER_THICKNESS, rect.height - 2f * SEARCHED_OBJECTS_BORDER_THICKNESS ), EditorGUIUtility.whiteTexture, ScaleMode.StretchToFill, true, 0f ); + GUI.DrawTexture( new Rect( rect.xMax - SEARCHED_OBJECTS_BORDER_THICKNESS, rect.y + 1, SEARCHED_OBJECTS_BORDER_THICKNESS, rect.height - 2f * SEARCHED_OBJECTS_BORDER_THICKNESS ), EditorGUIUtility.whiteTexture, ScaleMode.StretchToFill, true, 0f ); + } + else + { + GUI.DrawTexture( new Rect( rect.x, rect.y + 1, SEARCHED_OBJECTS_BORDER_THICKNESS, rect.height ), EditorGUIUtility.whiteTexture, ScaleMode.StretchToFill, true, 0f ); + GUI.DrawTexture( new Rect( rect.xMax - SEARCHED_OBJECTS_BORDER_THICKNESS, rect.y + 1, SEARCHED_OBJECTS_BORDER_THICKNESS, rect.height ), EditorGUIUtility.whiteTexture, ScaleMode.StretchToFill, true, 0f ); + } + } + + GUI.color = guiColor; + } + else + { + if( !args.selected ) + { + if( selectedReferenceNodesHierarchyIds.Contains( args.item.id ) ) + EditorGUI.DrawRect( rect, AssetUsageDetectorSettings.SelectedRowParentsTint ); + + if( data.node.IsMainReference ) + EditorGUI.DrawRect( new Rect( rect.x, rect.y, GetContentIndent( args.item ) - 1f, rect.height ), AssetUsageDetectorSettings.MainReferencesBackgroundColor ); + } + } + } + else + { + if( !args.selected && data.node.usedState == ReferenceNode.UsedState.Used ) + EditorGUI.DrawRect( new Rect( rect.x, rect.y, GetContentIndent( args.item ) - 1f, rect.height ), AssetUsageDetectorSettings.MainReferencesBackgroundColor ); + } + + if( !isLMBDown && treeType != TreeType.UnusedObjects && !args.selected && selectedReferenceNodes.Contains( data.node ) ) + { + if( !whiteGradientTexture ) + { + whiteGradientTexture = new Texture2D( 2, 1, TextureFormat.RGBA32, false ) + { + hideFlags = HideFlags.HideAndDontSave, + alphaIsTransparency = true, + filterMode = FilterMode.Bilinear, + wrapMode = TextureWrapMode.Clamp + }; + + whiteGradientTexture.SetPixels32( new Color32[2] { Color.white, new Color32( 255, 255, 255, 0 ) } ); + whiteGradientTexture.Apply( false, true ); + } + + Color guiColor = GUI.color; + GUI.color = guiColor * AssetUsageDetectorSettings.SelectedRowOccurrencesColor; + GUI.DrawTexture( new Rect( GetContentIndent( args.item ), rect.y, 125f, rect.height ), whiteGradientTexture, ScaleMode.StretchToFill, true, 0f ); + GUI.color = guiColor; + } + + if( hoveredData == data ) + EditorGUI.DrawRect( rect, new Color( 0.5f, 0.5f, 0.5f, 0.25f ) ); + + if( AssetUsageDetectorSettings.ShowTreeLines && args.item.depth > 0 ) + { + // I was using EditorGUI.DrawRect here but looking at its source code, it's more performant to call GUI.DrawTexture directly: https://github.com/Unity-Technologies/UnityCsReference/blob/e740821767d2290238ea7954457333f06e952bad/Editor/Mono/GUI/InternalEditorGUI.cs#L246-L255 + Color guiColor = GUI.color; + bool shouldHighlightTreeLine; + + Rect verticalLineRect = new Rect( rect.x + GetContentIndent( args.item.parent ) - ( foldoutWidth + TREE_VIEW_LINES_THICKNESS ) * 0.5f - 2f, rect.y, TREE_VIEW_LINES_THICKNESS, rect.height ); + Rect horizontalLineRect = new Rect( verticalLineRect.x, verticalLineRect.y + ( verticalLineRect.height - TREE_VIEW_LINES_THICKNESS ) * 0.5f, foldoutWidth + TREE_VIEW_LINES_THICKNESS - 4f, TREE_VIEW_LINES_THICKNESS ); + + for( ReferenceNodeData parentData = data.parent; parentData.parent != null; parentData = parentData.parent ) + { + if( !parentData.isLastLink ) + { + shouldHighlightTreeLine = selectedReferenceNodesHierarchyIndirectIds.Contains( parentData.item.id ); + Rect _verticalLineRect = new Rect( verticalLineRect.x - depthIndentWidth * ( args.item.depth - parentData.item.depth ), verticalLineRect.y, verticalLineRect.width, verticalLineRect.height ); + if( shouldHighlightTreeLine ) + { + _verticalLineRect.x -= ( HIGHLIGHTED_TREE_VIEW_LINES_THICKNESS - TREE_VIEW_LINES_THICKNESS ) * 0.5f; + _verticalLineRect.width = HIGHLIGHTED_TREE_VIEW_LINES_THICKNESS; + } + + GUI.color = guiColor * ( shouldHighlightTreeLine ? AssetUsageDetectorSettings.HighlightedTreeLinesColor : AssetUsageDetectorSettings.TreeLinesColor ); + GUI.DrawTexture( _verticalLineRect, EditorGUIUtility.whiteTexture, ScaleMode.StretchToFill, true, 0f ); + } + } + + bool isInSelectedReferenceNodesHierarchy = selectedReferenceNodesHierarchyIds.Contains( args.item.id ); + if( isInSelectedReferenceNodesHierarchy ) + { + horizontalLineRect.y -= ( HIGHLIGHTED_TREE_VIEW_LINES_THICKNESS - TREE_VIEW_LINES_THICKNESS ) * 0.5f; + horizontalLineRect.height = HIGHLIGHTED_TREE_VIEW_LINES_THICKNESS; + } + + GUI.color = guiColor * ( isInSelectedReferenceNodesHierarchy ? AssetUsageDetectorSettings.HighlightedTreeLinesColor : AssetUsageDetectorSettings.TreeLinesColor ); + GUI.DrawTexture( horizontalLineRect, EditorGUIUtility.whiteTexture, ScaleMode.StretchToFill, true, 0f ); + + if( data.isLastLink ) + verticalLineRect.height = ( verticalLineRect.height + TREE_VIEW_LINES_THICKNESS ) * 0.5f; + + GUI.color = guiColor * AssetUsageDetectorSettings.TreeLinesColor; + GUI.DrawTexture( verticalLineRect, EditorGUIUtility.whiteTexture, ScaleMode.StretchToFill, true, 0f ); + + bool isInSelectedReferenceNodesIndirectHierarchy = selectedReferenceNodesHierarchyIndirectIds.Contains( args.item.id ); + if( isInSelectedReferenceNodesHierarchy || isInSelectedReferenceNodesIndirectHierarchy ) + { + GUI.color = guiColor * AssetUsageDetectorSettings.HighlightedTreeLinesColor; + + if( isInSelectedReferenceNodesHierarchy && !isInSelectedReferenceNodesIndirectHierarchy ) + { + if( !data.isLastLink ) + verticalLineRect.height = ( verticalLineRect.height + HIGHLIGHTED_TREE_VIEW_LINES_THICKNESS ) * 0.5f; + else + verticalLineRect.height += ( HIGHLIGHTED_TREE_VIEW_LINES_THICKNESS - TREE_VIEW_LINES_THICKNESS ) * 0.5f; + } + + verticalLineRect.x -= ( HIGHLIGHTED_TREE_VIEW_LINES_THICKNESS - TREE_VIEW_LINES_THICKNESS ) * 0.5f; + verticalLineRect.width = HIGHLIGHTED_TREE_VIEW_LINES_THICKNESS; + + GUI.DrawTexture( verticalLineRect, EditorGUIUtility.whiteTexture, ScaleMode.StretchToFill, true, 0f ); + } + + GUI.color = guiColor; + } + + rect.xMin += GetContentIndent( args.item ); + rect.y += AssetUsageDetectorSettings.ExtraRowHeight * 0.5f; +#if !UNITY_2019_3_OR_NEWER + rect.y -= 2f; +#endif + rect.height += 4f; // Incrementing height fixes cropped icon issue on Unity 2019.2 or earlier + + if( foldoutLabelStyle == null ) + foldoutLabelStyle = new GUIStyle( DefaultStyles.foldoutLabel ) { richText = true }; + + foldoutLabelStyle.Draw( rect, sharedGUIContent, false, false, args.selected && args.focused, args.selected ); + + // The only way to support Unity's tooltips seems to be by drawing an invisible GUI.Label over our own label + if( sharedGUIContent.tooltip != null ) + { + sharedGUIContent.text = ""; + sharedGUIContent.image = null; + GUI.Label( rect, sharedGUIContent, foldoutLabelStyle ); + } + } + else if( ev.type == EventType.MouseDown ) + { + if( ev.button == 2 && rect.Contains( ev.mousePosition ) ) + { + HideItems( new int[1] { args.item.id } ); + GUIUtility.ExitGUI(); + } + } + else if( ev.type == EventType.MouseMove ) + { + if( hoveredData != data && AssetUsageDetectorSettings.ShowCustomTooltip && rect.Contains( ev.mousePosition ) ) + { + hoveredData = data; + hoveredDataRect = new Rect( GUIUtility.GUIToScreenPoint( rect.position ), new Vector2( EditorGUIUtility.currentViewWidth, 0f ) ); + } + } + } + + protected override void SelectionChanged( IList selectedIds ) + { + if( isTreeViewEmpty ) + return; + + RefreshSelectedNodes( selectedIds ); + + if( selectedIds.Count == 0 ) + return; + + if( isSearching ) + state.selectionChangedDuringSearch = true; + + Object selection, pingTarget = null; + List selectedUnityObjects = new List( selectedIds.Count ); + for( int i = 0; i < selectedIds.Count; i++ ) + { + Object obj = GetDataFromId( selectedIds[i] ).node.UnityObject; + if( obj ) + { + obj.GetObjectsToSelectAndPing( out selection, out pingTarget ); + if( selection && !selectedUnityObjects.Contains( selection ) ) + selectedUnityObjects.Add( selection ); + } + } + + if( selectedUnityObjects.Count > 0 ) + { + if( AssetUsageDetectorSettings.PingClickedObjects && pingTarget ) + EditorGUIUtility.PingObject( pingTarget ); + if( AssetUsageDetectorSettings.SelectClickedObjects || ( AssetUsageDetectorSettings.SelectDoubleClickedObjects && selectedUnityObjects.Count > 1 ) ) + Selection.objects = selectedUnityObjects.ToArray(); + } + } + + protected override void DoubleClickedItem( int id ) + { + if( isTreeViewEmpty ) + return; + + isLMBDown = false; + + Object clickedObject = GetDataFromId( id ).node.UnityObject; +#if UNITY_2018_3_OR_NEWER + if( clickedObject && clickedObject.IsAsset() ) + { + GameObject clickedPrefabRoot = null; + if( clickedObject is Component ) + clickedPrefabRoot = ( (Component) clickedObject ).transform.root.gameObject; + else if( clickedObject is GameObject ) + clickedPrefabRoot = ( (GameObject) clickedObject ).transform.root.gameObject; + + if( clickedPrefabRoot ) + { + PrefabAssetType prefabAssetType = PrefabUtility.GetPrefabAssetType( clickedPrefabRoot ); + if( prefabAssetType == PrefabAssetType.Regular || prefabAssetType == PrefabAssetType.Variant ) + { + // Try to open the prefab stage of this prefab + string assetPath = AssetDatabase.GetAssetPath( clickedPrefabRoot ); + PrefabStage openPrefabStage = PrefabStageUtility.GetCurrentPrefabStage(); +#if UNITY_2020_1_OR_NEWER + if( openPrefabStage == null || !openPrefabStage.stageHandle.IsValid() || assetPath != openPrefabStage.assetPath ) +#else + if( openPrefabStage == null || !openPrefabStage.stageHandle.IsValid() || assetPath != openPrefabStage.prefabAssetPath ) +#endif + AssetDatabase.OpenAsset( clickedPrefabRoot ); + } + } + } +#endif + + // Ping the clicked GameObject in the open prefab stage + Object selection, pingTarget; + clickedObject.GetObjectsToSelectAndPing( out selection, out pingTarget ); + + if( AssetUsageDetectorSettings.PingClickedObjects && pingTarget ) + EditorGUIUtility.PingObject( pingTarget ); + if( AssetUsageDetectorSettings.SelectDoubleClickedObjects ) + Selection.activeObject = selection; + } + + protected override void ContextClickedItem( int id ) + { + ContextClicked(); + } + + protected override void ContextClicked() + { + if( !isTreeViewEmpty && HasSelection() && HasFocus() ) + { + IList selection = SortItemIDsInRowOrder( GetSelection() ); + + bool hasAnyDuplicateRows = false, hasAnyRowWithOutgoingLinks = false, hasAnyUnusedMixedCollapsedNode = false; + for( int i = 0; i < selection.Count; i++ ) + { + ReferenceNodeData data = GetDataFromId( selection[i] ); + if( !hasAnyDuplicateRows && data.isDuplicate ) + hasAnyDuplicateRows = true; + if( !hasAnyRowWithOutgoingLinks && data.node.NumberOfOutgoingLinks > 0 ) + hasAnyRowWithOutgoingLinks = true; + if( !hasAnyUnusedMixedCollapsedNode && data.node.usedState == ReferenceNode.UsedState.MixedCollapsed ) + hasAnyUnusedMixedCollapsedNode = true; + } + + GenericMenu contextMenu = new GenericMenu(); + + if( treeType != TreeType.IsolatedView ) + contextMenu.AddItem( new GUIContent( "Hide" ), false, () => HideItems( selection ) ); + + if( treeType == TreeType.UnusedObjects ) + { + if( hasAnyUnusedMixedCollapsedNode ) + { + if( contextMenu.GetItemCount() > 0 ) + contextMenu.AddSeparator( "" ); + + contextMenu.AddItem( new GUIContent( "Show Used Children" ), false, ShowChildrenOfSelectedUnusedObjects ); + } + } + else + { + if( contextMenu.GetItemCount() > 0 ) + contextMenu.AddSeparator( "" ); + + if( hasAnyDuplicateRows ) + contextMenu.AddItem( new GUIContent( "Select First Occurrence" ), false, SelectFirstOccurrencesOfDuplicateSelection ); + + contextMenu.AddItem( new GUIContent( "Expand All Occurrences" ), false, ExpandAllSelectionOccurrences ); + } + + if( hasAnyRowWithOutgoingLinks ) + { + if( contextMenu.GetItemCount() > 0 ) + contextMenu.AddSeparator( "" ); + + contextMenu.AddItem( new GUIContent( "Show Children In New Window" ), false, ShowChildrenOfSelectionInNewWindow ); + } + + contextMenu.ShowAsContext(); + + if( Event.current != null && Event.current.type == EventType.ContextClick ) + Event.current.Use(); // It's safer to eat the event and if we don't, the context menu is sometimes displayed with a delay + } + } + + protected override void CommandEventHandling() + { + if( !isTreeViewEmpty && HasFocus() ) // There may be multiple SearchResultTreeViews. Execute the event only for the currently focused one + { + Event ev = Event.current; + if( ev.type == EventType.ValidateCommand || ev.type == EventType.ExecuteCommand ) + { + if( ev.commandName == "Delete" || ev.commandName == "SoftDelete" ) + { + if( ev.type == EventType.ExecuteCommand ) + HideItems( GetSelection() ); + + ev.Use(); + return; + } + } + } + + base.CommandEventHandling(); + } + + protected override bool CanStartDrag( CanStartDragArgs args ) + { + return true; + } + + protected override void SetupDragAndDrop( SetupDragAndDropArgs args ) + { + IList draggedItemIds = args.draggedItemIDs; + if( draggedItemIds.Count == 0 ) + return; + + List draggedUnityObjects = new List( draggedItemIds.Count ); + for( int i = 0; i < draggedItemIds.Count; i++ ) + { + Object obj = GetDataFromId( draggedItemIds[i] ).node.UnityObject; + if( obj ) + draggedUnityObjects.Add( obj ); + } + + if( draggedUnityObjects.Count > 0 ) + { + DragAndDrop.objectReferences = draggedUnityObjects.ToArray(); + DragAndDrop.StartDrag( draggedUnityObjects.Count > 1 ? "" : draggedUnityObjects[0].name ); + } + } + + public void ExpandDirectReferences() + { + List expandedIds = new List( rootItem.children.Count ); + for( int i = 0; i < rootItem.children.Count; i++ ) + expandedIds.Add( rootItem.children[i].id ); + + SetExpanded( expandedIds ); + } + + public void ExpandMainReferences() + { + List expandedIds = new List( references.Count * 12 ); + for( int i = 0; i < rootItem.children.Count; i++ ) + GetMainReferenceIdsRecursive( rootItem.children[i], expandedIds ); + + SetExpanded( expandedIds ); + } + + public void ExpandMatchingSearchResults() + { + if( state.searchMode != SearchMode.ReferencesOnly ) + return; + + List expandedIds = new List( references.Count * 12 ); + for( int i = 0; i < rootItem.children.Count; i++ ) + GetMatchingSearchResultIdsRecursive( rootItem.children[i], expandedIds ); + + SetExpanded( expandedIds ); + } + + private void ExpandAllSelectionOccurrences() + { + IList selection = GetSelection(); + if( selection.Count == 0 ) + return; + + HashSet selectedNodes = new HashSet(); + for( int i = selection.Count - 1; i >= 0; i-- ) + selectedNodes.Add( GetDataFromId( selection[i] ).node ); + + List expandedIds = new List( GetExpanded() ); + for( int i = 0; i < rootItem.children.Count; i++ ) + GetReferenceNodeOccurrenceIdsRecursive( rootItem.children[i], selectedNodes, expandedIds ); + + SetExpanded( expandedIds ); + } + + private bool GetMainReferenceIdsRecursive( TreeViewItem item, List ids ) + { + if( item.depth > 0 && GetDataFromId( item.id ).node.IsMainReference ) + return true; + + bool shouldExpand = false; + if( item.hasChildren ) + { + for( int i = 0; i < item.children.Count; i++ ) + shouldExpand |= GetMainReferenceIdsRecursive( item.children[i], ids ); + } + else + shouldExpand = true; // No main reference is encountered in this branch; expand the whole branch + + if( shouldExpand ) + ids.Add( item.id ); + + return shouldExpand; + } + + private bool GetMatchingSearchResultIdsRecursive( TreeViewItem item, List ids ) + { + bool shouldExpand = false; + if( item.hasChildren ) + { + for( int i = 0; i < item.children.Count; i++ ) + shouldExpand |= GetMatchingSearchResultIdsRecursive( item.children[i], ids ); + } + + if( shouldExpand ) + ids.Add( item.id ); + else + shouldExpand = GetDataFromId( item.id ).shouldExpandAfterSearch; + + return shouldExpand; + } + + private bool GetReferenceNodeOccurrenceIdsRecursive( TreeViewItem item, HashSet referenceNodes, List ids ) + { + bool shouldExpand = false; + if( item.hasChildren ) + { + for( int i = 0; i < item.children.Count; i++ ) + shouldExpand |= GetReferenceNodeOccurrenceIdsRecursive( item.children[i], referenceNodes, ids ); + } + + if( shouldExpand ) + { + if( !ids.Contains( item.id ) ) + ids.Add( item.id ); + + return true; + } + else + return referenceNodes.Contains( GetDataFromId( item.id ).node ); + } + + private void HideItems( IList ids ) + { + if( ids.Count > 0 ) + { + List hiddenNodes = new List( ids.Count ); + List hiddenLinks = new List( ids.Count ); + List newExpandedItemIDs = new List( 32 ); + List newSelectedItemIDs = new List( 16 ); + + for( int i = 0; i < ids.Count; i++ ) + { + ReferenceNodeData data = GetDataFromId( ids[i] ); + if( data.item.depth > 0 ) + hiddenLinks.Add( data.parent.node[data.linkIndex] ); + else + hiddenNodes.Add( data.node ); + } + + int id = state.initialNodeId + 1; + for( int i = 0; i < rootItem.children.Count; i++ ) + CalculateNewItemIdsAfterHideRecursive( rootItem.children[i], hiddenNodes, hiddenLinks, newExpandedItemIDs, newSelectedItemIDs, ref id ); + + for( int i = 0; i < ids.Count; i++ ) + { + ReferenceNodeData data = GetDataFromId( ids[i] ); + if( data.item.depth > 0 ) + { + // Can't remove by index here because if multiple sibling nodes are removed at once, the latter sibling nodes' linkIndex + // will be different than their actual sibling indices until this TreeView is refreshed + data.parent.node.RemoveLink( data.node ); + } + else + references.Remove( data.node ); + } + + SetSelection( newSelectedItemIDs ); + SetExpanded( newExpandedItemIDs ); + Reload(); + } + } + + private void CalculateNewItemIdsAfterHideRecursive( TreeViewItem item, List hiddenNodes, List hiddenLinks, List newExpandedItemIDs, List newSelectedItemIDs, ref int id ) + { + ReferenceNodeData data = GetDataFromId( item.id ); + if( hiddenNodes.Contains( data.node ) || ( data.parent != null && hiddenLinks.Contains( data.parent.node[data.linkIndex] ) ) ) + return; + + if( IsExpanded( item.id ) ) + newExpandedItemIDs.Add( id ); + if( IsSelected( item.id ) ) + newSelectedItemIDs.Add( id ); + + id++; + + if( item.hasChildren ) + { + for( int i = 0; i < item.children.Count; i++ ) + CalculateNewItemIdsAfterHideRecursive( item.children[i], hiddenNodes, hiddenLinks, newExpandedItemIDs, newSelectedItemIDs, ref id ); + } + } + + private void SelectFirstOccurrencesOfDuplicateSelection() + { + IList selection = GetSelection(); + if( selection.Count == 0 ) + return; + + HashSet selectedNodes = new HashSet(); + for( int i = selection.Count - 1; i >= 0; i-- ) + { + ReferenceNodeData data = GetDataFromId( selection[i] ); + if( data.isDuplicate ) + selectedNodes.Add( data.node ); + } + + List newSelection = new List( selection.Count ); + for( int i = 0; i < rootItem.children.Count; i++ ) + FindFirstOccurrencesOfSelectionRecursive( rootItem.children[i], selectedNodes, newSelection ); + + if( newSelection.Count > 0 ) + { + SetSelection( newSelection, TreeViewSelectionOptions.FireSelectionChanged | TreeViewSelectionOptions.RevealAndFrame ); + + if( treeType != TreeType.IsolatedView ) + EditorWindow.focusedWindow.SendEvent( new Event() { type = EventType.KeyDown, keyCode = KeyCode.F } ); // To actually frame the row when external scroll view is used + } + } + + private void FindFirstOccurrencesOfSelectionRecursive( TreeViewItem item, HashSet selectedNodes, List result ) + { + ReferenceNodeData data = GetDataFromId( item.id ); + if( !data.isDuplicate && selectedNodes.Remove( data.node ) ) + result.Add( item.id ); + + if( item.hasChildren ) + { + for( int i = 0; i < item.children.Count; i++ ) + FindFirstOccurrencesOfSelectionRecursive( item.children[i], selectedNodes, result ); + } + } + + private void ShowChildrenOfSelectedUnusedObjects() + { + IList selection = GetSelection(); + if( selection.Count == 0 ) + return; + + for( int i = selection.Count - 1; i >= 0; i-- ) + { + ReferenceNodeData data = GetDataFromId( selection[i] ); + if( data.node.usedState != ReferenceNode.UsedState.MixedCollapsed ) + continue; + + data.node.usedState = ReferenceNode.UsedState.MixedExpanded; + + Object unityObject = data.node.UnityObject; + if( !unityObject ) + continue; + + string assetPath = AssetDatabase.GetAssetPath( unityObject ); + if( string.IsNullOrEmpty( assetPath ) ) + { + foreach( Object obj in usedObjectsSet ) + { + if( obj && obj is GameObject && obj != unityObject && ( (GameObject) obj ).transform.IsChildOf( ( (GameObject) unityObject ).transform ) ) + { + ReferenceNode childNode = new ReferenceNode() { nodeObject = obj }; + childNode.InitializeRecursively(); + data.node.AddLinkTo( childNode, "USED" ); + } + } + } + else + { + foreach( Object obj in usedObjectsSet ) + { + if( obj && AssetDatabase.GetAssetPath( obj ) == assetPath ) + { + ReferenceNode childNode = new ReferenceNode() { nodeObject = obj }; + childNode.InitializeRecursively(); + data.node.AddLinkTo( childNode, "USED" ); + } + } + } + } + + Reload(); + } + + private void ShowChildrenOfSelectionInNewWindow() + { + IList selection = SortItemIDsInRowOrder( GetSelection() ); + if( selection.Count == 0 ) + return; + + List selectedNodes = new List( selection.Count ); + for( int i = 0; i < selection.Count; i++ ) + { + ReferenceNodeData data = GetDataFromId( selection[i] ); + if( data.node.NumberOfOutgoingLinks > 0 && !selectedNodes.Contains( data.node ) ) + selectedNodes.Add( data.node ); + } + + if( selectedNodes.Count > 0 ) + { + SearchResultTreeView isolatedTreeView = new SearchResultTreeView( new SearchResultTreeViewState(), selectedNodes, TreeType.IsolatedView, null, hideDuplicateRows, hideReduntantPrefabVariantLinks, false ); + isolatedTreeView.ExpandMainReferences(); + + SearchResultTreeViewIsolatedView.Show( new Vector2( EditorWindow.focusedWindow.position.width, Mathf.Max( isolatedTreeView.totalHeight, EditorGUIUtility.singleLineHeight * 5f ) + 1f ), isolatedTreeView, new GUIContent( selectedNodes[0].Label + ( selectedNodes.Count <= 1 ? "" : ( " (and " + ( selectedNodes.Count - 1 ) + " more)" ) ) ) ); + } + } + + private void RefreshSelectedNodes( IList selectedIds ) + { + selectedReferenceNodes.Clear(); + selectedReferenceNodesHierarchyIds.Clear(); + selectedReferenceNodesHierarchyIndirectIds.Clear(); + + for( int i = 0; i < selectedIds.Count; i++ ) + { + ReferenceNodeData data = GetDataFromId( selectedIds[i] ); + + selectedReferenceNodes.Add( data.node ); + selectedReferenceNodesHierarchyIds.Add( selectedIds[i] ); + + if( data.item.parent == null ) + continue; + + TreeViewItem linkItem = data.item; + for( TreeViewItem parentItem = linkItem.parent; parentItem.depth >= 0; parentItem = parentItem.parent ) + { + selectedReferenceNodesHierarchyIds.Add( parentItem.id ); + + List parentItemChildren = parentItem.children; + for( int j = 0; parentItemChildren[j] != linkItem; j++ ) + selectedReferenceNodesHierarchyIndirectIds.Add( parentItemChildren[j].id ); + + linkItem = parentItem; + } + } + } + + private void ShowTooltipDelayed() + { + if( EditorApplication.timeSinceStartup >= customTooltipShowTime ) + { + EditorApplication.update -= ShowTooltipDelayed; + + if( GetRows().Contains( hoveredData.item ) ) // Make sure that the hovered item is still a part of the tree (e.g. it might have been removed with middle mouse button) + SearchResultTooltip.Show( hoveredDataRect, hoveredData.tooltipText ); + } + } + + public void CancelDelayedTooltip() + { + EditorApplication.update -= ShowTooltipDelayed; + } + + public void GetRowStateWithId( int id, out bool isFirstRow, out bool isLastRow, out bool isExpanded, out bool canExpand ) + { + if( isTreeViewEmpty ) + { + isFirstRow = isLastRow = true; + isExpanded = canExpand = false; + + return; + } + + IList rows = GetRows(); + for( int i = 0; i < rows.Count; i++ ) + { + if( rows[i].id == id ) + { + isFirstRow = ( i <= 0 ); + isLastRow = ( i >= rows.Count - 1 ); + isExpanded = rows[i].hasChildren && IsExpanded( id ); + canExpand = rows[i].hasChildren && !IsExpanded( id ); + + return; + } + } + + isFirstRow = isLastRow = isExpanded = canExpand = false; + } + + public bool GetRowRectWithId( int id, out Rect rect ) + { + IList rows = GetRows(); + for( int i = 0; i < rows.Count; i++ ) + { + if( rows[i].id == id ) + { + rect = GetRowRect( i ); + return true; + } + } + + rect = new Rect(); + return false; + } + + public Rect SelectFirstRowAndReturnRect() + { + SetSelection( new int[1] { GetRows()[0].id }, TreeViewSelectionOptions.FireSelectionChanged ); + return GetRowRect( 0 ); + } + + public Rect SelectLastRowAndReturnRect() + { + IList rows = GetRows(); + SetSelection( new int[1] { rows[rows.Count - 1].id }, TreeViewSelectionOptions.FireSelectionChanged ); + return GetRowRect( rows.Count - 1 ); + } + + private void HighlightSearchTermInString( StringBuilder sb, string str ) + { + int prevSearchOccurrenceIndex = 0, searchOccurrenceIndex = 0; + while( ( searchOccurrenceIndex = textComparer.IndexOf( str, state.searchTerm, searchOccurrenceIndex, textCompareOptions ) ) >= 0 ) + { + sb.Append( str, prevSearchOccurrenceIndex, searchOccurrenceIndex - prevSearchOccurrenceIndex ); + sb.Append( highlightedSearchTextColor ).Append( "" ); + sb.Append( str, searchOccurrenceIndex, state.searchTerm.Length ); + sb.Append( "" ).Append( "" ); + + searchOccurrenceIndex += state.searchTerm.Length; + prevSearchOccurrenceIndex = searchOccurrenceIndex; + } + + if( prevSearchOccurrenceIndex < str.Length ) + sb.Append( str, prevSearchOccurrenceIndex, str.Length - prevSearchOccurrenceIndex ); + } + + public void OnSettingsChanged( bool resetHighlightedSearchTextColor, bool resetTooltipDescriptionsTextColor ) + { + hoveredData = null; + + if( !resetHighlightedSearchTextColor && !resetTooltipDescriptionsTextColor ) + return; + + if( resetHighlightedSearchTextColor ) + highlightedSearchTextColor = ""; + + for( int i = idToNodeDataLookup.Count - 1; i >= 0; i-- ) + { + if( isSearching && resetHighlightedSearchTextColor ) + idToNodeDataLookup[i].item.displayName = ""; + if( resetTooltipDescriptionsTextColor ) + idToNodeDataLookup[i].ResetTooltip(); + } + } + } + + public class SearchResultTreeViewIsolatedView : EditorWindow + { + private SearchResultTreeView treeView; + private bool shouldRepositionSelf = true; + + public static void Show( Vector2 preferredSize, SearchResultTreeView treeView, GUIContent title ) + { + SearchResultTreeViewIsolatedView window = CreateInstance(); + window.treeView = treeView; + window.titleContent = title; + window.Show(); + + window.minSize = new Vector2( 150f, Mathf.Min( preferredSize.y, EditorGUIUtility.singleLineHeight * 2f ) ); + window.position = new Rect( new Vector2( -9999f, -9999f ), preferredSize ); + window.Repaint(); + } + + private void OnEnable() + { + wantsMouseMove = wantsMouseEnterLeaveWindow = true; + } + + private void OnGUI() + { + if( treeView == null ) // After domain reload + Close(); + else + { + treeView.OnGUI( GUILayoutUtility.GetRect( 0f, 100000f, 0f, 100000f ) ); + + if( shouldRepositionSelf ) + { + float preferredHeight = GUILayoutUtility.GetLastRect().height; + if( preferredHeight > 10f ) + { + Vector2 size = position.size; + position = Utilities.GetScreenFittedRect( new Rect( GUIUtility.GUIToScreenPoint( Event.current.mousePosition ) + new Vector2( size.x * -0.5f, 10f ), size ) ); + + shouldRepositionSelf = false; + GUIUtility.ExitGUI(); + } + } + } + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/AssetUsageDetector/Editor/SearchResultTreeView.cs.meta b/Assets/Plugins/AssetUsageDetector/Editor/SearchResultTreeView.cs.meta new file mode 100644 index 00000000..94363a2b --- /dev/null +++ b/Assets/Plugins/AssetUsageDetector/Editor/SearchResultTreeView.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: b3903f1d3149e9b4990e49206f8255c8 +timeCreated: 1638690728 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/AssetUsageDetector/Editor/Utilities.cs b/Assets/Plugins/AssetUsageDetector/Editor/Utilities.cs new file mode 100644 index 00000000..f1c6661b --- /dev/null +++ b/Assets/Plugins/AssetUsageDetector/Editor/Utilities.cs @@ -0,0 +1,565 @@ +using System; +using System.Collections.Generic; +using System.Reflection; +using System.Text; +#if UNITY_2018_1_OR_NEWER +using Unity.Collections; +#endif +using UnityEditor; +using UnityEditor.SceneManagement; +using UnityEngine; +using UnityEngine.SceneManagement; +using Object = UnityEngine.Object; +#if UNITY_2018_3_OR_NEWER && !UNITY_2021_2_OR_NEWER +using PrefabStage = UnityEditor.Experimental.SceneManagement.PrefabStage; +using PrefabStageUtility = UnityEditor.Experimental.SceneManagement.PrefabStageUtility; +#endif + +namespace AssetUsageDetectorNamespace +{ + public static class Utilities + { + // A set of commonly used Unity types + private static readonly HashSet primitiveUnityTypes = new HashSet() + { + typeof( string ), typeof( Vector4 ), typeof( Vector3 ), typeof( Vector2 ), typeof( Rect ), + typeof( Quaternion ), typeof( Color ), typeof( Color32 ), typeof( LayerMask ), typeof( Bounds ), + typeof( Matrix4x4 ), typeof( AnimationCurve ), typeof( Gradient ), typeof( RectOffset ), + typeof( bool[] ), typeof( byte[] ), typeof( sbyte[] ), typeof( char[] ), typeof( decimal[] ), + typeof( double[] ), typeof( float[] ), typeof( int[] ), typeof( uint[] ), typeof( long[] ), + typeof( ulong[] ), typeof( short[] ), typeof( ushort[] ), typeof( string[] ), + typeof( Vector4[] ), typeof( Vector3[] ), typeof( Vector2[] ), typeof( Rect[] ), + typeof( Quaternion[] ), typeof( Color[] ), typeof( Color32[] ), typeof( LayerMask[] ), typeof( Bounds[] ), + typeof( Matrix4x4[] ), typeof( AnimationCurve[] ), typeof( Gradient[] ), typeof( RectOffset[] ), + typeof( List ), typeof( List ), typeof( List ), typeof( List ), typeof( List ), + typeof( List ), typeof( List ), typeof( List ), typeof( List ), typeof( List ), + typeof( List ), typeof( List ), typeof( List ), typeof( List ), + typeof( List ), typeof( List ), typeof( List ), typeof( List ), + typeof( List ), typeof( List ), typeof( List ), typeof( List ), typeof( List ), + typeof( List ), typeof( List ), typeof( List ), typeof( List ), +#if UNITY_2017_2_OR_NEWER + typeof( Vector3Int ), typeof( Vector2Int ), typeof( RectInt ), typeof( BoundsInt ), + typeof( Vector3Int[] ), typeof( Vector2Int[] ), typeof( RectInt[] ), typeof( BoundsInt[] ), + typeof( List ), typeof( List ), typeof( List ), typeof( List ) +#endif + }; + + private static readonly string reflectionNamespace = typeof( Assembly ).Namespace; +#if UNITY_2018_1_OR_NEWER + private static readonly string nativeCollectionsNamespace = typeof( NativeArray ).Namespace; +#endif + + private static MethodInfo screenFittedRectGetter; + + private static readonly HashSet folderContentsSet = new HashSet(); + + internal static readonly StringBuilder stringBuilder = new StringBuilder( 400 ); + + public static readonly GUILayoutOption GL_EXPAND_WIDTH = GUILayout.ExpandWidth( true ); + public static readonly GUILayoutOption GL_EXPAND_HEIGHT = GUILayout.ExpandHeight( true ); + public static readonly GUILayoutOption GL_WIDTH_25 = GUILayout.Width( 25 ); + public static readonly GUILayoutOption GL_WIDTH_100 = GUILayout.Width( 100 ); + public static readonly GUILayoutOption GL_WIDTH_250 = GUILayout.Width( 250 ); + public static readonly GUILayoutOption GL_HEIGHT_0 = GUILayout.Height( 0 ); + public static readonly GUILayoutOption GL_HEIGHT_2 = GUILayout.Height( 2 ); + public static readonly GUILayoutOption GL_HEIGHT_30 = GUILayout.Height( 30 ); + public static readonly GUILayoutOption GL_HEIGHT_35 = GUILayout.Height( 35 ); + public static readonly GUILayoutOption GL_HEIGHT_40 = GUILayout.Height( 40 ); + + private static GUIStyle m_boxGUIStyle; // GUIStyle used to draw the results of the search + public static GUIStyle BoxGUIStyle + { + get + { + if( m_boxGUIStyle == null ) + { + m_boxGUIStyle = new GUIStyle( EditorStyles.helpBox ) + { + alignment = TextAnchor.MiddleCenter, + font = EditorStyles.label.font, + richText = true + }; + + Color textColor = GUI.skin.button.normal.textColor; + m_boxGUIStyle.normal.textColor = textColor; + m_boxGUIStyle.hover.textColor = textColor; + m_boxGUIStyle.focused.textColor = textColor; + m_boxGUIStyle.active.textColor = textColor; + +#if !UNITY_2019_1_OR_NEWER || UNITY_2019_3_OR_NEWER + // On 2019.1 and 2019.2 versions, GUI.skin.button.fontSize returns 0 on some devices + // https://forum.unity.com/threads/asset-usage-detector-find-references-to-an-asset-object-open-source.408134/page-3#post-7285954 + m_boxGUIStyle.fontSize = ( m_boxGUIStyle.fontSize + GUI.skin.button.fontSize ) / 2; +#endif + } + + return m_boxGUIStyle; + } + } + + // Check if object is an asset or a Scene object + public static bool IsAsset( this object obj ) + { + return obj is Object && AssetDatabase.Contains( (Object) obj ); + } + + public static bool IsAsset( this Object obj ) + { + return AssetDatabase.Contains( obj ); + } + + // Check if object is a folder asset + public static bool IsFolder( this Object obj ) + { + return obj is DefaultAsset && AssetDatabase.IsValidFolder( AssetDatabase.GetAssetPath( obj ) ); + } + + // Returns an enumerator to iterate through all asset paths in the folder + public static IEnumerable EnumerateFolderContents( Object folderAsset ) + { + string[] folderContents = AssetDatabase.FindAssets( "", new string[] { AssetDatabase.GetAssetPath( folderAsset ) } ); + if( folderContents == null ) + return new EmptyEnumerator(); + + folderContentsSet.Clear(); + for( int i = 0; i < folderContents.Length; i++ ) + { + string filePath = AssetDatabase.GUIDToAssetPath( folderContents[i] ); + if( !string.IsNullOrEmpty( filePath ) && !AssetDatabase.IsValidFolder( filePath ) ) + folderContentsSet.Add( filePath ); + } + + return folderContentsSet; + } + + public static void GetObjectsToSelectAndPing( this Object obj, out Object selection, out Object pingTarget ) + { + if( obj == null || obj.Equals( null ) ) + { + selection = pingTarget = null; + return; + } + + if( obj is Component ) + obj = ( (Component) obj ).gameObject; + + selection = pingTarget = obj; + + if( obj.IsAsset() ) + { + if( obj is GameObject ) + { + // Pinging a prefab only works if the pinged object is the root of the prefab or a direct child of it. Pinging any grandchildren + // of the prefab doesn't work; in which case, traverse the parent hierarchy until a pingable parent is reached +#if UNITY_2018_3_OR_NEWER + Transform objTR = ( (GameObject) obj ).transform.root; + + PrefabAssetType prefabAssetType = PrefabUtility.GetPrefabAssetType( objTR.gameObject ); + if( prefabAssetType == PrefabAssetType.Regular || prefabAssetType == PrefabAssetType.Variant ) + { + string assetPath = AssetDatabase.GetAssetPath( objTR.gameObject ); + PrefabStage openPrefabStage = PrefabStageUtility.GetCurrentPrefabStage(); +#if UNITY_2020_1_OR_NEWER + if( openPrefabStage != null && openPrefabStage.stageHandle.IsValid() && assetPath == openPrefabStage.assetPath ) +#else + if( openPrefabStage != null && openPrefabStage.stageHandle.IsValid() && assetPath == openPrefabStage.prefabAssetPath ) +#endif + { + GameObject prefabStageGO = FollowSymmetricHierarchy( (GameObject) obj, ( (GameObject) obj ).transform.root.gameObject, openPrefabStage.prefabContentsRoot ); + if( prefabStageGO != null ) + { + objTR = prefabStageGO.transform; + selection = objTR.gameObject; + } + } +#if UNITY_2019_1_OR_NEWER + else if( obj != objTR.gameObject ) + selection = objTR.gameObject; +#endif + } + else if( prefabAssetType == PrefabAssetType.Model ) + { + objTR = ( (GameObject) obj ).transform; + while( objTR.parent != null && objTR.parent.parent != null ) + objTR = objTR.parent; + } +#else + Transform objTR = ( (GameObject) obj ).transform; + while( objTR.parent != null && objTR.parent.parent != null ) + objTR = objTR.parent; +#endif + + pingTarget = objTR.gameObject; + } + else if( ( obj.hideFlags & ( HideFlags.HideInInspector | HideFlags.HideInHierarchy ) ) != HideFlags.None ) + { + // Can't ping assets that are hidden from Project window (e.g. animator states of AnimatorController), ping the main asset at that path instead + pingTarget = AssetDatabase.LoadMainAssetAtPath( AssetDatabase.GetAssetPath( obj ) ); + } + else if( !AssetDatabase.IsMainAsset( obj ) && Array.IndexOf( AssetDatabase.LoadAllAssetRepresentationsAtPath( AssetDatabase.GetAssetPath( obj ) ), obj ) < 0 ) + { + // VFX Graph assets' nodes are serialized as part of the graph but they are invisible in the Project window even though their hideFlags is None (I don't know how) + pingTarget = AssetDatabase.LoadMainAssetAtPath( AssetDatabase.GetAssetPath( obj ) ); + } + } + } + + // We are passing "go"s root Transform to thisRoot parameter. If we use go.transform.root instead, when we are in prefab mode on + // newer Unity versions, it points to the preview scene at the root of the prefab stage instead of pointing to the actual root of "go" + public static GameObject FollowSymmetricHierarchy( this GameObject go, GameObject thisRoot, GameObject symmetricRoot ) + { + Transform target = go.transform; + Transform root1 = thisRoot.transform; + Transform root2 = symmetricRoot.transform; + while( root1 != target ) + { + Transform temp = target; + while( temp.parent != root1 ) + temp = temp.parent; + + Transform newRoot2; + int siblingIndex = temp.GetSiblingIndex(); + if( siblingIndex < root2.childCount ) + { + newRoot2 = root2.GetChild( siblingIndex ); + if( newRoot2.name != temp.name ) + newRoot2 = root2.Find( temp.name ); + } + else + newRoot2 = root2.Find( temp.name ); + + if( newRoot2 == null ) + return null; + + root2 = newRoot2; + root1 = temp; + } + + return root2.gameObject; + } + + // Returns -1 if t1 is above t2 in Hierarchy, 1 if t1 is below t2 in Hierarchy and 0 if they are the same object + public static int CompareHierarchySiblingIndices( Transform t1, Transform t2 ) + { + Transform parent1 = t1.parent; + Transform parent2 = t2.parent; + + if( parent1 == parent2 ) + return t1.GetSiblingIndex() - t2.GetSiblingIndex(); + + int deltaHierarchyDepth = 0; + for( ; parent1; parent1 = parent1.parent ) + deltaHierarchyDepth++; + for( ; parent2; parent2 = parent2.parent ) + deltaHierarchyDepth--; + + for( ; deltaHierarchyDepth > 0; deltaHierarchyDepth-- ) + { + t1 = t1.parent; + if( t1 == t2 ) + return 1; + } + for( ; deltaHierarchyDepth < 0; deltaHierarchyDepth++ ) + { + t2 = t2.parent; + if( t1 == t2 ) + return -1; + } + + while( t1.parent != t2.parent ) + { + t1 = t1.parent; + t2 = t2.parent; + } + + return t1.GetSiblingIndex() - t2.GetSiblingIndex(); + } + + // Check if the field is serializable + public static bool IsSerializable( this FieldInfo fieldInfo ) + { + // See Serialization Rules: https://docs.unity3d.com/Manual/script-Serialization.html + if( fieldInfo.IsInitOnly ) + return false; + +#if UNITY_2019_3_OR_NEWER + // SerializeReference makes even System.Object fields serializable + if( Attribute.IsDefined( fieldInfo, typeof( SerializeReference ) ) ) + return true; +#endif + + if( ( !fieldInfo.IsPublic || fieldInfo.IsNotSerialized ) && !Attribute.IsDefined( fieldInfo, typeof( SerializeField ) ) ) + return false; + + return IsTypeSerializable( fieldInfo.FieldType ); + } + + // Check if the property is serializable + public static bool IsSerializable( this PropertyInfo propertyInfo ) + { + return IsTypeSerializable( propertyInfo.PropertyType ); + } + + // Check if type is serializable + private static bool IsTypeSerializable( Type type ) + { + // see Serialization Rules: https://docs.unity3d.com/Manual/script-Serialization.html + if( typeof( Object ).IsAssignableFrom( type ) ) + return true; + + if( type.IsArray ) + { + if( type.GetArrayRank() != 1 ) + return false; + + type = type.GetElementType(); + + if( typeof( Object ).IsAssignableFrom( type ) ) + return true; + } + else if( type.IsGenericType ) + { + // Generic types are allowed on 2020.1 and later +#if UNITY_2020_1_OR_NEWER + if( type.GetGenericTypeDefinition() == typeof( List<> ) ) + { + type = type.GetGenericArguments()[0]; + + if( typeof( Object ).IsAssignableFrom( type ) ) + return true; + } +#else + if( type.GetGenericTypeDefinition() != typeof( List<> ) ) + return false; + + type = type.GetGenericArguments()[0]; + + if( typeof( Object ).IsAssignableFrom( type ) ) + return true; +#endif + } + +#if !UNITY_2020_1_OR_NEWER + if( type.IsGenericType ) + return false; +#endif + + return Attribute.IsDefined( type, typeof( SerializableAttribute ), false ); + } + + // Check if instances of this type should be searched for references + public static bool IsIgnoredUnityType( this Type type ) + { + if( type.IsPrimitive || primitiveUnityTypes.Contains( type ) || type.IsEnum ) + return true; + +#if UNITY_2018_1_OR_NEWER + // Searching NativeArrays for reference can throw InvalidOperationException if the collection is disposed + if( type.Namespace == nativeCollectionsNamespace ) + return true; +#endif + + // Searching assembly variables for reference throws InvalidCastException on .NET 4.0 runtime + if( typeof( Type ).IsAssignableFrom( type ) || type.Namespace == reflectionNamespace ) + return true; + + // Searching pointers or ref variables for reference throws ArgumentException + if( type.IsPointer || type.IsByRef ) + return true; + + return false; + } + + // Get function for a field + public static VariableGetVal CreateGetter( this FieldInfo fieldInfo, Type type ) + { + // Commented the IL generator code below because it might actually be slower than simply using reflection + // Credit: https://www.codeproject.com/Articles/14560/Fast-Dynamic-Property-Field-Accessors + //DynamicMethod dm = new DynamicMethod( "Get" + fieldInfo.Name, fieldInfo.FieldType, new Type[] { typeof( object ) }, type ); + //ILGenerator il = dm.GetILGenerator(); + //// Load the instance of the object (argument 0) onto the stack + //il.Emit( OpCodes.Ldarg_0 ); + //// Load the value of the object's field (fi) onto the stack + //il.Emit( OpCodes.Ldfld, fieldInfo ); + //// return the value on the top of the stack + //il.Emit( OpCodes.Ret ); + + //return (VariableGetVal) dm.CreateDelegate( typeof( VariableGetVal ) ); + + return fieldInfo.GetValue; + } + + // Get function for a property + public static VariableGetVal CreateGetter( this PropertyInfo propertyInfo ) + { + // Can't use PropertyWrapper (which uses CreateDelegate) for property getters of structs + if( propertyInfo.DeclaringType.IsValueType ) + { + return !propertyInfo.CanRead ? (VariableGetVal) null : ( obj ) => + { + try + { + return propertyInfo.GetValue( obj, null ); + } + catch + { + // Property getters may return various kinds of exceptions if their backing fields are not initialized (yet) + return null; + } + }; + } + + Type GenType = typeof( PropertyWrapper<,> ).MakeGenericType( propertyInfo.DeclaringType, propertyInfo.PropertyType ); + return ( (IPropertyAccessor) Activator.CreateInstance( GenType, propertyInfo.GetGetMethod( true ) ) ).GetValue; + } + + // Check if all open scenes are saved (not dirty) + public static bool AreScenesSaved() + { + for( int i = 0; i < SceneManager.sceneCount; i++ ) + { + Scene scene = SceneManager.GetSceneAt( i ); + if( scene.isDirty || string.IsNullOrEmpty( scene.path ) ) + return false; + } + + return true; + } + + // Returns file extension in lowercase (period not included) + public static string GetFileExtension( string path ) + { + int extensionIndex = path.LastIndexOf( '.' ); + if( extensionIndex < 0 || extensionIndex >= path.Length - 1 ) + return ""; + + stringBuilder.Length = 0; + for( extensionIndex++; extensionIndex < path.Length; extensionIndex++ ) + { + char ch = path[extensionIndex]; + if( ch >= 65 && ch <= 90 ) // A-Z + ch += (char) 32; // Converted to a-z + + stringBuilder.Append( ch ); + } + + return stringBuilder.ToString(); + } + + // Draw horizontal line inside OnGUI + public static void DrawSeparatorLine() + { + GUILayout.Space( 4f ); + GUILayout.Box( "", GL_HEIGHT_2, GL_EXPAND_WIDTH ); + GUILayout.Space( 4f ); + } + + // Restricts the given Rect within the screen's bounds + public static Rect GetScreenFittedRect( Rect originalRect ) + { + if( screenFittedRectGetter == null ) + screenFittedRectGetter = typeof( EditorWindow ).Assembly.GetType( "UnityEditor.ContainerWindow" ).GetMethod( "FitRectToScreen", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static ); + + return (Rect) screenFittedRectGetter.Invoke( null, new object[3] { originalRect, true, true } ); + } + + // Check if all the objects inside the list are null + public static bool IsEmpty( this List objectsToSearch ) + { + if( objectsToSearch == null ) + return true; + + for( int i = 0; i < objectsToSearch.Count; i++ ) + { + if( objectsToSearch[i].obj != null && !objectsToSearch[i].obj.Equals( null ) ) + return false; + } + + return true; + } + + // Check if all the objects inside the list are null + public static bool IsEmpty( this List objects ) + { + if( objects == null ) + return true; + + for( int i = 0; i < objects.Count; i++ ) + { + if( objects[i] != null && !objects[i].Equals( null ) ) + return false; + } + + return true; + } + + // Check if all the objects that are enumerated are null + public static bool IsEmpty( this IEnumerable objects ) + { + if( objects == null ) + return true; + + using( IEnumerator enumerator = objects.GetEnumerator() ) + { + while( enumerator.MoveNext() ) + { + if( enumerator.Current != null && !enumerator.Current.Equals( null ) ) + return false; + } + } + + return true; + } + + // Returns true is str starts with prefix + public static bool StartsWithFast( this string str, string prefix ) + { + int aLen = str.Length; + int bLen = prefix.Length; + int ap = 0; int bp = 0; + while( ap < aLen && bp < bLen && str[ap] == prefix[bp] ) + { + ap++; + bp++; + } + + return bp == bLen; + } + + // Returns true is str ends with postfix + public static bool EndsWithFast( this string str, string postfix ) + { + int ap = str.Length - 1; + int bp = postfix.Length - 1; + while( ap >= 0 && bp >= 0 && str[ap] == postfix[bp] ) + { + ap--; + bp--; + } + + return bp < 0; + } + + public static bool ContainsFast( this List list, T element ) + { + if( !( element is ValueType ) ) + { + for( int i = list.Count - 1; i >= 0; i-- ) + { + if( ReferenceEquals( list[i], element ) ) + return true; + } + } + else + { + for( int i = list.Count - 1; i >= 0; i-- ) + { + if( element.Equals( list[i] ) ) + return true; + } + } + + return false; + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/AssetUsageDetector/Editor/Utilities.cs.meta b/Assets/Plugins/AssetUsageDetector/Editor/Utilities.cs.meta new file mode 100644 index 00000000..2daf8acf --- /dev/null +++ b/Assets/Plugins/AssetUsageDetector/Editor/Utilities.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 52b272b7591fb90499916205261524e0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/AssetUsageDetector/Editor/VariableGetter.cs b/Assets/Plugins/AssetUsageDetector/Editor/VariableGetter.cs new file mode 100644 index 00000000..87c8fa9c --- /dev/null +++ b/Assets/Plugins/AssetUsageDetector/Editor/VariableGetter.cs @@ -0,0 +1,83 @@ +using System; +using System.Reflection; +using System.Text; +using UnityEngine; + +namespace AssetUsageDetectorNamespace +{ + // Delegate to get the value of a variable (either field or property) + public delegate object VariableGetVal( object obj ); + + // Custom struct to hold a variable, its important properties and its getter function + public struct VariableGetterHolder + { + public readonly MemberInfo variable; + public readonly bool isSerializable; + private readonly VariableGetVal getter; + + public string Name { get { return variable.Name; } } + public bool IsProperty { get { return variable is PropertyInfo; } } + + public VariableGetterHolder( FieldInfo fieldInfo, VariableGetVal getter, bool isSerializable ) + { + this.variable = fieldInfo; + this.isSerializable = isSerializable; + this.getter = getter; + } + + public VariableGetterHolder( PropertyInfo propertyInfo, VariableGetVal getter, bool isSerializable ) + { + this.variable = propertyInfo; + this.isSerializable = isSerializable; + this.getter = getter; + } + + public object Get( object obj ) + { + try + { + return getter( obj ); + } + catch( Exception e ) + { + StringBuilder sb = Utilities.stringBuilder; + sb.Length = 0; + sb.Append( "Error while getting the value of (" ).Append( IsProperty ? ( (PropertyInfo) variable ).PropertyType : ( (FieldInfo) variable ).FieldType ).Append( ") " ) + .Append( variable.DeclaringType ).Append( "." ).Append( Name ).Append( ": " ).Append( e ); + + Debug.LogError( sb.ToString() ); + return null; + } + } + } + + // Credit: http://stackoverflow.com/questions/724143/how-do-i-create-a-delegate-for-a-net-property + public interface IPropertyAccessor + { + object GetValue( object source ); + } + + // A wrapper class for properties to get their values more efficiently + public class PropertyWrapper : IPropertyAccessor where TObject : class + { + private readonly Func getter; + + public PropertyWrapper( MethodInfo getterMethod ) + { + getter = (Func) Delegate.CreateDelegate( typeof( Func ), getterMethod ); + } + + public object GetValue( object obj ) + { + try + { + return getter( (TObject) obj ); + } + catch + { + // Property getters may return various kinds of exceptions if their backing fields are not initialized (yet) + return null; + } + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/AssetUsageDetector/Editor/VariableGetter.cs.meta b/Assets/Plugins/AssetUsageDetector/Editor/VariableGetter.cs.meta new file mode 100644 index 00000000..b78cc0e8 --- /dev/null +++ b/Assets/Plugins/AssetUsageDetector/Editor/VariableGetter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9e94c83e8b850514ca0217aeff1491a6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/AssetUsageDetector/README.txt b/Assets/Plugins/AssetUsageDetector/README.txt new file mode 100644 index 00000000..f962275f --- /dev/null +++ b/Assets/Plugins/AssetUsageDetector/README.txt @@ -0,0 +1,4 @@ += Asset Usage Detector (v2.5.3) = + +Documentation: https://github.com/yasirkula/UnityAssetUsageDetector +E-mail: yasirkula@gmail.com \ No newline at end of file diff --git a/Assets/Plugins/AssetUsageDetector/README.txt.meta b/Assets/Plugins/AssetUsageDetector/README.txt.meta new file mode 100644 index 00000000..66705238 --- /dev/null +++ b/Assets/Plugins/AssetUsageDetector/README.txt.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ac528f1751f33a647a45caeff6a9344b +timeCreated: 1520032521 +licenseType: Store +TextScriptImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Demigiant.meta b/Assets/Plugins/Demigiant.meta new file mode 100644 index 00000000..f12ce495 --- /dev/null +++ b/Assets/Plugins/Demigiant.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d6986b8e9c5ff3843a835b7bbfd003d1 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Demigiant/DOTween.meta b/Assets/Plugins/Demigiant/DOTween.meta new file mode 100644 index 00000000..cbebc392 --- /dev/null +++ b/Assets/Plugins/Demigiant/DOTween.meta @@ -0,0 +1,21 @@ +fileFormatVersion: 2 +guid: a50bd9a009c8dfc4ebd88cc8101225a7 +labels: +- Tween +- Tweening +- Animation +- HOTween +- Paths +- iTween +- DFTween +- LeanTween +- Ease +- Easing +- Shake +- Punch +- 2DToolkit +- TextMeshPro +- Text +folderAsset: yes +DefaultImporter: + userData: diff --git a/Assets/Plugins/Demigiant/DOTween/DOTween.XML b/Assets/Plugins/Demigiant/DOTween/DOTween.XML new file mode 100644 index 00000000..762220e2 --- /dev/null +++ b/Assets/Plugins/Demigiant/DOTween/DOTween.XML @@ -0,0 +1,2963 @@ + + + + DOTween + + + + + Types of autoPlay behaviours + + + + No tween is automatically played + + + Only Sequences are automatically played + + + Only Tweeners are automatically played + + + All tweens are automatically played + + + + What axis to constrain in case of Vector tweens + + + + Called the first time the tween is set in a playing state, after any eventual delay + + + + Used in place of System.Func, which is not available in mscorlib. + + + + + Used in place of System.Action. + + + + + Public so it can be used by lose scripts related to DOTween (like DOTweenAnimation) + + + + + Used to separate DOTween class from the MonoBehaviour instance (in order to use static constructors on DOTween). + Contains all instance-based methods + + + + Used internally inside Unity Editor, as a trick to update DOTween's inspector at every frame + + + + Directly sets the current max capacity of Tweeners and Sequences + (meaning how many Tweeners and Sequences can be running at the same time), + so that DOTween doesn't need to automatically increase them in case the max is reached + (which might lead to hiccups when that happens). + Sequences capacity must be less or equal to Tweeners capacity + (if you pass a low Tweener capacity it will be automatically increased to match the Sequence's). + Beware: use this method only when there are no tweens running. + + Max Tweeners capacity. + Default: 200 + Max Sequences capacity. + Default: 50 + + + + This class contains a C# port of the easing equations created by Robert Penner (http://robertpenner.com/easing). + + + + + Easing equation function for a bounce (exponentially decaying parabolic bounce) easing in: accelerating from zero velocity. + + + Current time (in frames or seconds). + + + Expected easing duration (in frames or seconds). + + Unused: here to keep same delegate for all ease types. + Unused: here to keep same delegate for all ease types. + + The eased value. + + + + + Easing equation function for a bounce (exponentially decaying parabolic bounce) easing out: decelerating from zero velocity. + + + Current time (in frames or seconds). + + + Expected easing duration (in frames or seconds). + + Unused: here to keep same delegate for all ease types. + Unused: here to keep same delegate for all ease types. + + The eased value. + + + + + Easing equation function for a bounce (exponentially decaying parabolic bounce) easing in/out: acceleration until halfway, then deceleration. + + + Current time (in frames or seconds). + + + Expected easing duration (in frames or seconds). + + Unused: here to keep same delegate for all ease types. + Unused: here to keep same delegate for all ease types. + + The eased value. + + + + + Returns a value between 0 and 1 (inclusive) based on the elapsed time and ease selected + + + + + Returns a value between 0 and 1 (inclusive) based on the elapsed time and ease selected + + + + + Used to interpret AnimationCurves as eases. + Public so it can be used by external ease factories + + + + + Behaviour in case a tween nested inside a Sequence fails and is captured by safe mode + + + + If the Sequence contains other elements, kill the failed tween but preserve the rest + + + Kill the whole Sequence + + + + Log types thrown by errors captured and prevented by safe mode + + + + No logs. NOT RECOMMENDED + + + Throw a normal log + + + Throw a warning log (default) + + + Throw an error log + + + + Additional notices passed to plugins when updating. + Public so it can be used by custom plugins. Internally, only PathPlugin uses it + + + + + None + + + + + Lets the plugin know that we restarted or rewinded + + + + + OnRewind callback behaviour (can only be set via DOTween's Utility Panel) + + + + + When calling Rewind or PlayBackwards/SmoothRewind, OnRewind callbacks will be fired only if the tween isn't already rewinded + + + + + When calling Rewind, OnRewind callbacks will always be fired, even if the tween is already rewinded. + When calling PlayBackwards/SmoothRewind instead, OnRewind callbacks will be fired only if the tween isn't already rewinded + + + + + When calling Rewind or PlayBackwards/SmoothRewind, OnRewind callbacks will always be fired, even if the tween is already rewinded + + + + + Public only so custom shortcuts can access some of these methods + + + + + INTERNAL: used by DO shortcuts and Modules to set special startup mode + + + + + INTERNAL: used by DO shortcuts and Modules to set the tween as blendable + + + + + INTERNAL: used by DO shortcuts and Modules to prevent a tween from using a From setup even if passed + + + + + Used to dispatch commands that need to be captured externally, usually by Modules + + + + + Returns a Vector3 with z = 0 + + + + + Returns the 2D angle between two vectors + + + + + Returns a point on a circle with the given center and radius, + using Unity's circle coordinates (0° points up and increases clockwise) + + + + + Uses approximate equality on each axis instead of Unity's Vector3 equality, + because the latter fails (in some cases) when assigning a Vector3 to a transform.position and then checking it. + + + + + Looks for the type within all possible project assembly names + + + + NO-GC METHOD: changes the start value of a tween and rewinds it (without pausing it). + Has no effect with tweens that are inside Sequences + The new start value + If bigger than 0 applies it as the new tween duration + + + NO-GC METHOD: changes the end value of a tween and rewinds it (without pausing it). + Has no effect with tweens that are inside Sequences + The new end value + If TRUE the start value will become the current target's value, otherwise it will stay the same + + + NO-GC METHOD: changes the end value of a tween and rewinds it (without pausing it). + Has no effect with tweens that are inside Sequences + The new end value + If bigger than 0 applies it as the new tween duration + If TRUE the start value will become the current target's value, otherwise it will stay the same + + + NO-GC METHOD: changes the start and end value of a tween and rewinds it (without pausing it). + Has no effect with tweens that are inside Sequences + The new start value + The new end value + If bigger than 0 applies it as the new tween duration + + + + Struct that stores two colors (used for LineRenderer tweens) + + + + + Used for tween callbacks + + + + + Used for tween callbacks + + + + + Used for custom and animationCurve-based ease functions. Must return a value between 0 and 1. + + + + + Straight Quaternion plugin. Instead of using Vector3 values accepts Quaternion values directly. + Beware: doesn't work with LoopType.Incremental (neither directly nor if inside a LoopType.Incremental Sequence). + To use it, call DOTween.To with the plugin parameter overload, passing it PureQuaternionPlugin.Plug() as first parameter + (do not use any of the other public PureQuaternionPlugin methods): + DOTween.To(PureQuaternionPlugin.Plug(), ()=> myQuaternionProperty, x=> myQuaternionProperty = x, myQuaternionEndValue, duration); + + + + + Plug this plugin inside a DOTween.To call. + Example: + DOTween.To(PureQuaternionPlugin.Plug(), ()=> myQuaternionProperty, x=> myQuaternionProperty = x, myQuaternionEndValue, duration); + + + + INTERNAL: do not use + + + INTERNAL: do not use + + + INTERNAL: do not use + + + INTERNAL: do not use + + + INTERNAL: do not use + + + INTERNAL: do not use + + + INTERNAL: do not use + + + INTERNAL: do not use + + + + Extra non-tweening-related curve methods + + + + + Cubic bezier curve methods + + + + + Calculates a point along the given Cubic Bezier segment-curve. + + Segment start point + Start point's control point/handle + Segment end point + End point's control point/handle + 0-1 percentage along which to retrieve point + + + + Returns an array containing a series of points along the given Cubic Bezier segment-curve. + + Start point + Start point's control point/handle + End point + End point's control point/handle + Cloud resolution (min: 2) + + + + Calculates a series of points along the given Cubic Bezier segment-curve and adds them to the given list. + + Start point + Start point's control point/handle + End point + End point's control point/handle + Cloud resolution (min: 2) + + + + Main DOTween class. Contains static methods to create and control tweens in a generic way + + + + DOTween's version + + + If TRUE (default) makes tweens slightly slower but safer, automatically taking care of a series of things + (like targets becoming null while a tween is playing). + Default: TRUE + + + Log type when safe mode reports capturing an error and preventing it + + + Behaviour in case a tween nested inside a Sequence fails (and is caught by safe mode). + Default: NestedTweenFailureBehaviour.TryToPreserveSequence + + + If TRUE you will get a DOTween report when exiting play mode (only in the Editor). + Useful to know how many max Tweeners and Sequences you reached and optimize your final project accordingly. + Beware, this will slightly slow down your tweens while inside Unity Editor. + Default: FALSE + + + Global DOTween timeScale. + Default: 1 + + + If TRUE, DOTween will use Time.smoothDeltaTime instead of Time.deltaTime for UpdateType.Normal and UpdateType.Late tweens + (unless they're set as timeScaleIndependent, in which case a value between the last timestep + and will be used instead). + Setting this to TRUE will lead to smoother animations. + Default: FALSE + + + If is TRUE, this indicates the max timeStep that an independent update call can last. + Setting this to TRUE will lead to smoother animations. + Default: FALSE + + + DOTween's log behaviour. + Default: LogBehaviour.ErrorsOnly + + + Used to intercept DOTween's logs. If this method isn't NULL, DOTween will call it before writing a log via Unity's own Debug log methods. + Return TRUE if you want DOTween to proceed with the log, FALSE otherwise. + This method must return a bool and accept two parameters: + - LogType: the type of Unity log that DOTween is trying to log + - object: the log message that DOTween wants to log + + + If TRUE draws path gizmos in Unity Editor (if the gizmos button is active). + Deactivate this if you want to avoid gizmos overhead while in Unity Editor + + + If TRUE activates various debug options + + + Stores the target id so it can be used to give more info in case of safeMode error capturing. + Only active if both debugMode and useSafeMode are TRUE + + + Default updateType for new tweens. + Default: UpdateType.Normal + + + Sets whether Unity's timeScale should be taken into account by default or not. + Default: false + + + Default autoPlay behaviour for new tweens. + Default: AutoPlay.All + + + Default autoKillOnComplete behaviour for new tweens. + Default: TRUE + + + Default loopType applied to all new tweens. + Default: LoopType.Restart + + + If TRUE all newly created tweens are set as recyclable, otherwise not. + Default: FALSE + + + Default ease applied to all new Tweeners (not to Sequences which always have Ease.Linear as default). + Default: Ease.InOutQuad + + + Default overshoot/amplitude used for eases + Default: 1.70158f + + + Default period used for eases + Default: 0 + + + Used internally. Assigned/removed by DOTweenComponent.Create/DestroyInstance + + + + Must be called once, before the first ever DOTween call/reference, + otherwise it will be called automatically and will use default options. + Calling it a second time won't have any effect. + You can chain SetCapacity to this method, to directly set the max starting size of Tweeners and Sequences: + DOTween.Init(false, false, LogBehaviour.Default).SetCapacity(100, 20); + + If TRUE all new tweens will be set for recycling, meaning that when killed, + instead of being destroyed, they will be put in a pool and reused instead of creating new tweens. This option allows you to avoid + GC allocations by reusing tweens, but you will have to take care of tween references, since they might result active + even if they were killed (since they might have been respawned and are now being used for other tweens). + If you want to automatically set your tween references to NULL when a tween is killed + you can use the OnKill callback like this: + .OnKill(()=> myTweenReference = null) + You can change this setting at any time by changing the static property, + or you can set the recycling behaviour for each tween separately, using: + SetRecyclable(bool recyclable) + Default: FALSE + If TRUE makes tweens slightly slower but safer, automatically taking care of a series of things + (like targets becoming null while a tween is playing). + You can change this setting at any time by changing the static property. + Default: FALSE + Type of logging to use. + You can change this setting at any time by changing the static property. + Default: ErrorsOnly + + + + Directly sets the current max capacity of Tweeners and Sequences + (meaning how many Tweeners and Sequences can be running at the same time), + so that DOTween doesn't need to automatically increase them in case the max is reached + (which might lead to hiccups when that happens). + Sequences capacity must be less or equal to Tweeners capacity + (if you pass a low Tweener capacity it will be automatically increased to match the Sequence's). + Beware: use this method only when there are no tweens running. + + Max Tweeners capacity. + Default: 200 + Max Sequences capacity. + Default: 50 + + + + Kills all tweens, clears all cached tween pools and plugins and resets the max Tweeners/Sequences capacities to the default values. + + If TRUE also destroys DOTween's gameObject and resets its initializiation, default settings and everything else + (so that next time you use it it will need to be re-initialized) + + + + Clears all cached tween pools. + + + + + Checks all active tweens to find and remove eventually invalid ones (usually because their targets became NULL) + and returns the total number of invalid tweens found and removed. + IMPORTANT: this will cause an error on UWP platform, so don't use it there + BEWARE: this is a slightly expensive operation so use it with care + + + + + Updates all tweens that are set to . + + Manual deltaTime + Unscaled delta time (used with tweens set as timeScaleIndependent) + + + Tweens a property or field to the given value using default plugins + A getter for the field or property to tween. + Example usage with lambda:()=> myProperty + A setter for the field or property to tween + Example usage with lambda:x=> myProperty = x + The end value to reachThe tween's duration + + + Tweens a property or field to the given value using default plugins + A getter for the field or property to tween. + Example usage with lambda:()=> myProperty + A setter for the field or property to tween + Example usage with lambda:x=> myProperty = x + The end value to reachThe tween's duration + + + Tweens a property or field to the given value using default plugins + A getter for the field or property to tween. + Example usage with lambda:()=> myProperty + A setter for the field or property to tween + Example usage with lambda:x=> myProperty = x + The end value to reachThe tween's duration + + + Tweens a property or field to the given value using default plugins + A getter for the field or property to tween. + Example usage with lambda:()=> myProperty + A setter for the field or property to tween + Example usage with lambda:x=> myProperty = x + The end value to reachThe tween's duration + + + Tweens a property or field to the given value using default plugins + A getter for the field or property to tween. + Example usage with lambda:()=> myProperty + A setter for the field or property to tween + Example usage with lambda:x=> myProperty = x + The end value to reachThe tween's duration + + + Tweens a property or field to the given value using default plugins + A getter for the field or property to tween. + Example usage with lambda:()=> myProperty + A setter for the field or property to tween + Example usage with lambda:x=> myProperty = x + The end value to reachThe tween's duration + + + Tweens a property or field to the given value using default plugins + A getter for the field or property to tween. + Example usage with lambda:()=> myProperty + A setter for the field or property to tween + Example usage with lambda:x=> myProperty = x + The end value to reachThe tween's duration + + + Tweens a property or field to the given value using default plugins + A getter for the field or property to tween. + Example usage with lambda:()=> myProperty + A setter for the field or property to tween + Example usage with lambda:x=> myProperty = x + The end value to reachThe tween's duration + + + Tweens a property or field to the given value using default plugins + A getter for the field or property to tween. + Example usage with lambda:()=> myProperty + A setter for the field or property to tween + Example usage with lambda:x=> myProperty = x + The end value to reachThe tween's duration + + + Tweens a property or field to the given value using default plugins + A getter for the field or property to tween. + Example usage with lambda:()=> myProperty + A setter for the field or property to tween + Example usage with lambda:x=> myProperty = x + The end value to reachThe tween's duration + + + Tweens a property or field to the given value using default plugins + A getter for the field or property to tween. + Example usage with lambda:()=> myProperty + A setter for the field or property to tween + Example usage with lambda:x=> myProperty = x + The end value to reachThe tween's duration + + + Tweens a property or field to the given value using default plugins + A getter for the field or property to tween. + Example usage with lambda:()=> myProperty + A setter for the field or property to tween + Example usage with lambda:x=> myProperty = x + The end value to reachThe tween's duration + + + Tweens a property or field to the given value using default plugins + A getter for the field or property to tween. + Example usage with lambda:()=> myProperty + A setter for the field or property to tween + Example usage with lambda:x=> myProperty = x + The end value to reachThe tween's duration + + + Tweens a property or field to the given value using default plugins + A getter for the field or property to tween. + Example usage with lambda:()=> myProperty + A setter for the field or property to tween + Example usage with lambda:x=> myProperty = x + The end value to reachThe tween's duration + + + Tweens a property or field to the given value using a custom plugin + The plugin to use. Each custom plugin implements a static Get() method + you'll need to call to assign the correct plugin in the correct way, like this: + CustomPlugin.Get() + A getter for the field or property to tween. + Example usage with lambda:()=> myProperty + A setter for the field or property to tween + Example usage with lambda:x=> myProperty = x + The end value to reachThe tween's duration + + + Tweens only one axis of a Vector3 to the given value using default plugins. + A getter for the field or property to tween. + Example usage with lambda:()=> myProperty + A setter for the field or property to tween + Example usage with lambda:x=> myProperty = x + The end value to reachThe tween's duration + The axis to tween + + + Tweens only the alpha of a Color to the given value using default plugins + A getter for the field or property to tween. + Example usage with lambda:()=> myProperty + A setter for the field or property to tween + Example usage with lambda:x=> myProperty = x + The end value to reachThe tween's duration + + + Tweens a virtual property from the given start to the given end value + and implements a setter that allows to use that value with an external method or a lambda + Example: + To(MyMethod, 0, 12, 0.5f); + Where MyMethod is a function that accepts a float parameter (which will be the result of the virtual tween) + The action to perform with the tweened value + The value to start from + The end value to reach + The duration of the virtual tween + + + + Punches a Vector3 towards the given direction and then back to the starting one + as if it was connected to the starting position via an elastic. + This tween type generates some GC allocations at startup + A getter for the field or property to tween. + Example usage with lambda:()=> myProperty + A setter for the field or property to tween + Example usage with lambda:x=> myProperty = x + The direction and strength of the punch + The duration of the tween + Indicates how much will the punch vibrate + Represents how much (0 to 1) the vector will go beyond the starting position when bouncing backwards. + 1 creates a full oscillation between the direction and the opposite decaying direction, + while 0 oscillates only between the starting position and the decaying direction + + + Shakes a Vector3 with the given values. + A getter for the field or property to tween. + Example usage with lambda:()=> myProperty + A setter for the field or property to tween + Example usage with lambda:x=> myProperty = x + The duration of the tween + The shake strength + Indicates how much will the shake vibrate + Indicates how much the shake will be random (0 to 180 - values higher than 90 kind of suck, so beware). + Setting it to 0 will shake along a single direction and behave like a random punch. + If TRUE only shakes on the X Y axis (looks better with things like cameras). + If TRUE the shake will automatically fadeOut smoothly within the tween's duration, otherwise it will not + + + Shakes a Vector3 with the given values. + A getter for the field or property to tween. + Example usage with lambda:()=> myProperty + A setter for the field or property to tween + Example usage with lambda:x=> myProperty = x + The duration of the tween + The shake strength on each axis + Indicates how much will the shake vibrate + Indicates how much the shake will be random (0 to 180 - values higher than 90 kind of suck, so beware). + Setting it to 0 will shake along a single direction and behave like a random punch. + If TRUE the shake will automatically fadeOut smoothly within the tween's duration, otherwise it will not + + + Tweens a property or field to the given values using default plugins. + Ease is applied between each segment and not as a whole. + This tween type generates some GC allocations at startup + A getter for the field or property to tween. + Example usage with lambda:()=> myProperty + A setter for the field or property to tween + Example usage with lambda:x=> myProperty = x + The end values to reach for each segment. This array must have the same length as durations + The duration of each segment. This array must have the same length as endValues + + + + Returns a new to be used for tween groups. + Mind that Sequences don't have a target applied automatically like Tweener creation shortcuts, + so if you want to be able to kill this Sequence when calling DOTween.Kill(target) you'll have to add + the target manually; you can do that directly by using the overload instead of this one + + + + + Returns a new to be used for tween groups, and allows to set a target + (because Sequences don't have their target set automatically like Tweener creation shortcuts). + That way killing/controlling tweens by target will apply to this Sequence too. + + The target of the Sequence. Relevant only for static target-based methods like DOTween.Kill(target), + useless otherwise + + + Completes all tweens and returns the number of actual tweens completed + (meaning tweens that don't have infinite loops and were not already complete) + For Sequences only: if TRUE also internal Sequence callbacks will be fired, + otherwise they will be ignored + + + Completes all tweens with the given ID or target and returns the number of actual tweens completed + (meaning the tweens that don't have infinite loops and were not already complete) + For Sequences only: if TRUE internal Sequence callbacks will be fired, + otherwise they will be ignored + + + Flips all tweens (changing their direction to forward if it was backwards and viceversa), + then returns the number of actual tweens flipped + + + Flips the tweens with the given ID or target (changing their direction to forward if it was backwards and viceversa), + then returns the number of actual tweens flipped + + + Sends all tweens to the given position (calculating also eventual loop cycles) and returns the actual tweens involved + + + Sends all tweens with the given ID or target to the given position (calculating also eventual loop cycles) + and returns the actual tweens involved + + + Kills all tweens and returns the number of actual tweens killed + If TRUE completes the tweens before killing them + + + Kills all tweens and returns the number of actual tweens killed + If TRUE completes the tweens before killing them + Eventual IDs or targets to exclude from the killing + + + Kills all tweens with the given ID or target and returns the number of actual tweens killed + If TRUE completes the tweens before killing them + + + Kills all tweens with the given target and the given ID, and returns the number of actual tweens killed + If TRUE completes the tweens before killing them + + + Pauses all tweens and returns the number of actual tweens paused + + + Pauses all tweens with the given ID or target and returns the number of actual tweens paused + (meaning the tweens that were actually playing and have been paused) + + + Plays all tweens and returns the number of actual tweens played + (meaning tweens that were not already playing or complete) + + + Plays all tweens with the given ID or target and returns the number of actual tweens played + (meaning the tweens that were not already playing or complete) + + + Plays all tweens with the given target and the given ID, and returns the number of actual tweens played + (meaning the tweens that were not already playing or complete) + + + Plays backwards all tweens and returns the number of actual tweens played + (meaning tweens that were not already started, playing backwards or rewinded) + + + Plays backwards all tweens with the given ID or target and returns the number of actual tweens played + (meaning the tweens that were not already started, playing backwards or rewinded) + + + Plays backwards all tweens with the given target and ID and returns the number of actual tweens played + (meaning the tweens that were not already started, playing backwards or rewinded) + + + Plays forward all tweens and returns the number of actual tweens played + (meaning tweens that were not already playing forward or complete) + + + Plays forward all tweens with the given ID or target and returns the number of actual tweens played + (meaning the tweens that were not already playing forward or complete) + + + Plays forward all tweens with the given target and ID and returns the number of actual tweens played + (meaning the tweens that were not already started, playing backwards or rewinded) + + + Restarts all tweens, then returns the number of actual tweens restarted + + + Restarts all tweens with the given ID or target, then returns the number of actual tweens restarted + If TRUE includes the eventual tweens delays, otherwise skips them + If >= 0 changes the startup delay of all involved tweens to this value, otherwise doesn't touch it + + + Restarts all tweens with the given target and the given ID, and returns the number of actual tweens played + (meaning the tweens that were not already playing or complete) + If TRUE includes the eventual tweens delays, otherwise skips them + If >= 0 changes the startup delay of all involved tweens to this value, otherwise doesn't touch it + + + Rewinds and pauses all tweens, then returns the number of actual tweens rewinded + (meaning tweens that were not already rewinded) + + + Rewinds and pauses all tweens with the given ID or target, then returns the number of actual tweens rewinded + (meaning the tweens that were not already rewinded) + + + Smoothly rewinds all tweens (delays excluded), then returns the number of actual tweens rewinding/rewinded + (meaning tweens that were not already rewinded). + A "smooth rewind" animates the tween to its start position, + skipping all elapsed loops (except in case of LoopType.Incremental) while keeping the animation fluent. + Note that a tween that was smoothly rewinded will have its play direction flipped + + + Smoothly rewinds all tweens (delays excluded) with the given ID or target, then returns the number of actual tweens rewinding/rewinded + (meaning the tweens that were not already rewinded). + A "smooth rewind" animates the tween to its start position, + skipping all elapsed loops (except in case of LoopType.Incremental) while keeping the animation fluent. + Note that a tween that was smoothly rewinded will have its play direction flipped + + + Toggles the play state of all tweens and returns the number of actual tweens toggled + (meaning tweens that could be played or paused, depending on the toggle state) + + + Toggles the play state of all tweens with the given ID or target and returns the number of actual tweens toggled + (meaning the tweens that could be played or paused, depending on the toggle state) + + + + Returns TRUE if a tween with the given ID or target is active. + You can also use this to know if a shortcut tween is active for a given target. + Example: + transform.DOMoveX(45, 1); // transform is automatically added as the tween target + DOTween.IsTweening(transform); // Returns true + + The target or ID to look for + If FALSE (default) returns TRUE as long as a tween for the given target/ID is active, + otherwise also requires it to be playing + + + + Returns the total number of active tweens. + A tween is considered active if it wasn't killed, regardless if it's playing or paused + + + + + Returns the total number of active and playing tweens. + A tween is considered as playing even if its delay is actually playing + + + + + Returns a list of all active tweens in a playing state. + Returns NULL if there are no active playing tweens. + Beware: each time you call this method a new list is generated, so use it for debug only + + If NULL creates a new list, otherwise clears and fills this one (and thus saves allocations) + + + + Returns a list of all active tweens in a paused state. + Returns NULL if there are no active paused tweens. + Beware: each time you call this method a new list is generated, so use it for debug only + + If NULL creates a new list, otherwise clears and fills this one (and thus saves allocations) + + + + Returns a list of all active tweens with the given id. + Returns NULL if there are no active tweens with the given id. + Beware: each time you call this method a new list is generated + + If TRUE returns only the tweens with the given ID that are currently playing + If NULL creates a new list, otherwise clears and fills this one (and thus saves allocations) + + + + Returns a list of all active tweens with the given target. + Returns NULL if there are no active tweens with the given target. + Beware: each time you call this method a new list is generated + If TRUE returns only the tweens with the given target that are currently playing + If NULL creates a new list, otherwise clears and fills this one (and thus saves allocations) + + + + + Creates virtual tweens that can be used to change other elements via their OnUpdate calls + + + + + Tweens a virtual float. + You can add regular settings to the generated tween, + but do not use SetUpdate or you will overwrite the onVirtualUpdate parameter + + The value to start from + The value to tween to + The duration of the tween + A callback which must accept a parameter of type float, called at each update + + + + Tweens a virtual int. + You can add regular settings to the generated tween, + but do not use SetUpdate or you will overwrite the onVirtualUpdate parameter + + The value to start from + The value to tween to + The duration of the tween + A callback which must accept a parameter of type int, called at each update + + + + Tweens a virtual Vector3. + You can add regular settings to the generated tween, + but do not use SetUpdate or you will overwrite the onVirtualUpdate parameter + + The value to start from + The value to tween to + The duration of the tween + A callback which must accept a parameter of type Vector3, called at each update + + + + Tweens a virtual Color. + You can add regular settings to the generated tween, + but do not use SetUpdate or you will overwrite the onVirtualUpdate parameter + + The value to start from + The value to tween to + The duration of the tween + A callback which must accept a parameter of type Color, called at each update + + + Returns a value based on the given ease and lifetime percentage (0 to 1) + The value to start from when lifetimePercentage is 0 + The value to reach when lifetimePercentage is 1 + The time percentage (0 to 1) at which the value should be taken + The type of ease + + + Returns a value based on the given ease and lifetime percentage (0 to 1) + The value to start from when lifetimePercentage is 0 + The value to reach when lifetimePercentage is 1 + The time percentage (0 to 1) at which the value should be taken + The type of ease + Eventual overshoot to use with Back ease + + + Returns a value based on the given ease and lifetime percentage (0 to 1) + The value to start from when lifetimePercentage is 0 + The value to reach when lifetimePercentage is 1 + The time percentage (0 to 1) at which the value should be taken + The type of ease + Eventual amplitude to use with Elastic easeType + Eventual period to use with Elastic easeType + + + Returns a value based on the given ease and lifetime percentage (0 to 1) + The value to start from when lifetimePercentage is 0 + The value to reach when lifetimePercentage is 1 + The time percentage (0 to 1) at which the value should be taken + The AnimationCurve to use for ease + + + Fires the given callback after the given time. + Callback delay + Callback to fire when the delay has expired + If TRUE (default) ignores Unity's timeScale + + + + Don't assign this! It's assigned automatically when creating 0 duration tweens + + + + + Don't assign this! It's assigned automatically when setting the ease to an AnimationCurve or to a custom ease function + + + + + Allows to wrap ease method in special ways, adding extra features + + + + + Converts the given ease so that it also creates a stop-motion effect, by playing the tween at the given FPS + + FPS at which the tween should be played + Ease type + + + + Converts the given ease so that it also creates a stop-motion effect, by playing the tween at the given FPS + + FPS at which the tween should be played + AnimationCurve to use for the ease + + + + Converts the given ease so that it also creates a stop-motion effect, by playing the tween at the given FPS + + FPS at which the tween should be played + Custom ease function to use + + + + Used to allow method chaining with DOTween.Init + + + + + Directly sets the current max capacity of Tweeners and Sequences + (meaning how many Tweeners and Sequences can be running at the same time), + so that DOTween doesn't need to automatically increase them in case the max is reached + (which might lead to hiccups when that happens). + Sequences capacity must be less or equal to Tweeners capacity + (if you pass a low Tweener capacity it will be automatically increased to match the Sequence's). + Beware: use this method only when there are no tweens running. + + Max Tweeners capacity. + Default: 200 + Max Sequences capacity. + Default: 50 + + + + Behaviour that can be assigned when chaining a SetLink to a tween + + + + Pauses the tween when the link target is disabled + + + Pauses the tween when the link target is disabled, plays it when it's enabled + + + Pauses the tween when the link target is disabled, restarts it when it's enabled + + + Plays the tween when the link target is enabled + + + Restarts the tween when the link target is enabled + + + Kills the tween when the link target is disabled + + + Kills the tween when the link target is destroyed (becomes NULL). This is always active even if another behaviour is chosen + + + Completes the tween when the link target is disabled + + + Completes and kills the tween when the link target is disabled + + + Rewinds the tween (delay excluded) when the link target is disabled + + + Rewinds and kills the tween when the link target is disabled + + + + Path mode (used to determine correct LookAt orientation) + + + + Ignores the path mode (and thus LookAt behaviour) + + + Regular 3D path + + + 2D top-down path + + + 2D side-scroller path + + + + Type of path to use with DOPath tweens + + + + Linear, composed of straight segments between each waypoint + + + Curved path (which uses Catmull-Rom curves) + + + EXPERIMENTAL: Curved path (which uses Cubic Bezier curves, where each point requires two extra control points) + + + + Tweens a Vector2 along a circle. + EndValue represents the center of the circle, start and end value degrees are inside options + ChangeValue x is changeValue°, y is unused + + + + + Path control point + + + + + Path waypoints (modified by PathPlugin when setting relative end/change value or by CubicBezierDecoder) and by DOTweenPathInspector + + + + + Minimum input points necessary to create the path (doesn't correspond to actual waypoints required) + + + + + Gets the point on the path at the given percentage (0 to 1) + + The percentage (0 to 1) at which to get the point + If TRUE constant speed is taken into account, otherwise not + + + + Base interface for all tween plugins options + + + + Resets the plugin + + + + This plugin generates some GC allocations at startup + + + + + Path plugin works exclusively with Transforms + + + + + Rotation mode used with DORotate methods + + + + + Fastest way that never rotates beyond 360° + + + + + Fastest way that rotates beyond 360° + + + + + Adds the given rotation to the transform using world axis and an advanced precision mode + (like when using transform.Rotate(Space.World)). + In this mode the end value is is always considered relative + + + + + Adds the given rotation to the transform's local axis + (like when rotating an object with the "local" switch enabled in Unity's editor or using transform.Rotate(Space.Self)). + In this mode the end value is is always considered relative + + + + + Type of scramble to apply to string tweens + + + + + No scrambling of characters + + + + + A-Z + a-z + 0-9 characters + + + + + A-Z characters + + + + + a-z characters + + + + + 0-9 characters + + + + + Custom characters + + + + + Methods that extend Tween objects and allow to control or get data from them + + + + Completes the tween + + + Completes the tween + For Sequences only: if TRUE also internal Sequence callbacks will be fired, + otherwise they will be ignored + + + Flips the direction of this tween (backwards if it was going forward or viceversa) + + + Forces the tween to initialize its settings immediately + + + Send the tween to the given position in time + Time position to reach + (if higher than the whole tween duration the tween will simply reach its end) + If TRUE will play the tween after reaching the given position, otherwise it will pause it + + + Send the tween to the given position in time while also executing any callback between the previous time position and the new one + Time position to reach + (if higher than the whole tween duration the tween will simply reach its end) + If TRUE will play the tween after reaching the given position, otherwise it will pause it + + + Kills the tween + If TRUE completes the tween before killing it + + + + Forces this tween to update manually, regardless of the set via SetUpdate. + Note that the tween will still be subject to normal tween rules, so if for example it's paused this method will do nothing. + Also note that if you only want to update this tween instance manually you'll have to set it to anyway, + so that it's not updated automatically. + + Manual deltaTime + Unscaled delta time (used with tweens set as timeScaleIndependent) + + + Pauses the tween + + + Plays the tween + + + Sets the tween in a backwards direction and plays it + + + Sets the tween in a forward direction and plays it + + + Restarts the tween from the beginning + Ignored in case of Sequences. If TRUE includes the eventual tween delay, otherwise skips it + Ignored in case of Sequences. If >= 0 changes the startup delay to this value, otherwise doesn't touch it + + + Rewinds and pauses the tween + Ignored in case of Sequences. If TRUE includes the eventual tween delay, otherwise skips it + + + Smoothly rewinds the tween (delays excluded). + A "smooth rewind" animates the tween to its start position, + skipping all elapsed loops (except in case of LoopType.Incremental) while keeping the animation fluent. + If called on a tween who is still waiting for its delay to happen, it will simply set the delay to 0 and pause the tween. + Note that a tween that was smoothly rewinded will have its play direction flipped + + + Plays the tween if it was paused, pauses it if it was playing + + + Send a path tween to the given waypoint. + Has no effect if this is not a path tween. + BEWARE, this is a special utility method: + it works only with Linear eases. Also, the lookAt direction might be wrong after calling this and might need to be set manually + (because it relies on a smooth path movement and doesn't work well with jumps that encompass dramatic direction changes) + Waypoint index to reach + (if higher than the max waypoint index the tween will simply go to the last one) + If TRUE will play the tween after reaching the given waypoint, otherwise it will pause it + + + + Creates a yield instruction that waits until the tween is killed or complete. + It can be used inside a coroutine as a yield. + Example usage:yield return myTween.WaitForCompletion(); + + + + + Creates a yield instruction that waits until the tween is killed or rewinded. + It can be used inside a coroutine as a yield. + Example usage:yield return myTween.WaitForRewind(); + + + + + Creates a yield instruction that waits until the tween is killed. + It can be used inside a coroutine as a yield. + Example usage:yield return myTween.WaitForKill(); + + + + + Creates a yield instruction that waits until the tween is killed or has gone through the given amount of loops. + It can be used inside a coroutine as a yield. + Example usage:yield return myTween.WaitForElapsedLoops(2); + + Elapsed loops to wait for + + + + Creates a yield instruction that waits until the tween is killed or has reached the given position (loops included, delays excluded). + It can be used inside a coroutine as a yield. + Example usage:yield return myTween.WaitForPosition(2.5f); + + Position (loops included, delays excluded) to wait for + + + + Creates a yield instruction that waits until the tween is killed or started + (meaning when the tween is set in a playing state the first time, after any eventual delay). + It can be used inside a coroutine as a yield. + Example usage:yield return myTween.WaitForStart(); + + + + Returns the total number of loops completed by this tween + + + Returns the eventual delay set for this tween + + + Returns the eventual elapsed delay set for this tween + + + Returns the duration of this tween (delays excluded). + NOTE: when using settings like SpeedBased, the duration will be recalculated when the tween starts + If TRUE returns the full duration loops included, + otherwise the duration of a single loop cycle + + + Returns the elapsed time for this tween (delays exluded) + If TRUE returns the elapsed time since startup loops included, + otherwise the elapsed time within the current loop cycle + + + Returns the elapsed percentage (0 to 1) of this tween (delays exluded) + If TRUE returns the elapsed percentage since startup loops included, + otherwise the elapsed percentage within the current loop cycle + + + Returns the elapsed percentage (0 to 1) of this tween (delays exluded), + based on a single loop, and calculating eventual backwards Yoyo loops as 1 to 0 instead of 0 to 1 + + + Returns FALSE if this tween has been killed or is NULL, TRUE otherwise. + BEWARE: if this tween is recyclable it might have been spawned again for another use and thus return TRUE anyway. + When working with recyclable tweens you should take care to know when a tween has been killed and manually set your references to NULL. + If you want to be sure your references are set to NULL when a tween is killed you can use the OnKill callback like this: + .OnKill(()=> myTweenReference = null) + + + Returns TRUE if this tween was reversed and is set to go backwards + + + Returns TRUE if the tween is complete + (silently fails and returns FALSE if the tween has been killed) + + + Returns TRUE if this tween has been initialized + + + Returns TRUE if this tween is playing + + + Returns the total number of loops set for this tween + (returns -1 if the loops are infinite) + + + + Returns a point on a path based on the given path percentage. + Returns Vector3.zero if this is not a path tween, if the tween is invalid, or if the path is not yet initialized. + A path is initialized after its tween starts, or immediately if the tween was created with the Path Editor (DOTween Pro feature). + You can force a path to be initialized by calling myTween.ForceInit(). + + Percentage of the path (0 to 1) on which to get the point + + + + Returns an array of points that can be used to draw the path. + Note that this method generates allocations, because it creates a new array. + Returns NULL if this is not a path tween, if the tween is invalid, or if the path is not yet initialized. + A path is initialized after its tween starts, or immediately if the tween was created with the Path Editor (DOTween Pro feature). + You can force a path to be initialized by calling myTween.ForceInit(). + + How many points to create for each path segment (waypoint to waypoint). + Only used in case of non-Linear paths + + + + Returns the length of a path. + Returns -1 if this is not a path tween, if the tween is invalid, or if the path is not yet initialized. + A path is initialized after its tween starts, or immediately if the tween was created with the Path Editor (DOTween Pro feature). + You can force a path to be initialized by calling myTween.ForceInit(). + + + + + Types of loop + + + + Each loop cycle restarts from the beginning + + + The tween moves forward and backwards at alternate cycles + + + Continuously increments the tween at the end of each loop cycle (A to B, B to B+(A-B), and so on), thus always moving "onward". + In case of String tweens works only if the tween is set as relative + + + + Controls other tweens as a group + + + + + Methods that extend known Unity objects and allow to directly create and control tweens from their instances + + + + Tweens a Camera's aspect to the given value. + Also stores the camera as the tween's target so it can be used for filtered operations + The end value to reachThe duration of the tween + + + Tweens a Camera's backgroundColor to the given value. + Also stores the camera as the tween's target so it can be used for filtered operations + The end value to reachThe duration of the tween + + + Tweens a Camera's farClipPlane to the given value. + Also stores the camera as the tween's target so it can be used for filtered operations + The end value to reachThe duration of the tween + + + Tweens a Camera's fieldOfView to the given value. + Also stores the camera as the tween's target so it can be used for filtered operations + The end value to reachThe duration of the tween + + + Tweens a Camera's nearClipPlane to the given value. + Also stores the camera as the tween's target so it can be used for filtered operations + The end value to reachThe duration of the tween + + + Tweens a Camera's orthographicSize to the given value. + Also stores the camera as the tween's target so it can be used for filtered operations + The end value to reachThe duration of the tween + + + Tweens a Camera's pixelRect to the given value. + Also stores the camera as the tween's target so it can be used for filtered operations + The end value to reachThe duration of the tween + + + Tweens a Camera's rect to the given value. + Also stores the camera as the tween's target so it can be used for filtered operations + The end value to reachThe duration of the tween + + + Shakes a Camera's localPosition along its relative X Y axes with the given values. + Also stores the camera as the tween's target so it can be used for filtered operations + The duration of the tween + The shake strength + Indicates how much will the shake vibrate + Indicates how much the shake will be random (0 to 180 - values higher than 90 kind of suck, so beware). + Setting it to 0 will shake along a single direction. + If TRUE the shake will automatically fadeOut smoothly within the tween's duration, otherwise it will not + + + Shakes a Camera's localPosition along its relative X Y axes with the given values. + Also stores the camera as the tween's target so it can be used for filtered operations + The duration of the tween + The shake strength on each axis + Indicates how much will the shake vibrate + Indicates how much the shake will be random (0 to 180 - values higher than 90 kind of suck, so beware). + Setting it to 0 will shake along a single direction. + If TRUE the shake will automatically fadeOut smoothly within the tween's duration, otherwise it will not + + + Shakes a Camera's localRotation. + Also stores the camera as the tween's target so it can be used for filtered operations + The duration of the tween + The shake strength + Indicates how much will the shake vibrate + Indicates how much the shake will be random (0 to 180 - values higher than 90 kind of suck, so beware). + Setting it to 0 will shake along a single direction. + If TRUE the shake will automatically fadeOut smoothly within the tween's duration, otherwise it will not + + + Shakes a Camera's localRotation. + Also stores the camera as the tween's target so it can be used for filtered operations + The duration of the tween + The shake strength on each axis + Indicates how much will the shake vibrate + Indicates how much the shake will be random (0 to 180 - values higher than 90 kind of suck, so beware). + Setting it to 0 will shake along a single direction. + If TRUE the shake will automatically fadeOut smoothly within the tween's duration, otherwise it will not + + + Tweens a Light's color to the given value. + Also stores the light as the tween's target so it can be used for filtered operations + The end value to reachThe duration of the tween + + + Tweens a Light's intensity to the given value. + Also stores the light as the tween's target so it can be used for filtered operations + The end value to reachThe duration of the tween + + + Tweens a Light's shadowStrength to the given value. + Also stores the light as the tween's target so it can be used for filtered operations + The end value to reachThe duration of the tween + + + Tweens a LineRenderer's color to the given value. + Also stores the LineRenderer as the tween's target so it can be used for filtered operations. + Note that this method requires to also insert the start colors for the tween, + since LineRenderers have no way to get them. + The start value to tween from + The end value to reachThe duration of the tween + + + Tweens a Material's color to the given value. + Also stores the material as the tween's target so it can be used for filtered operations + The end value to reachThe duration of the tween + + + Tweens a Material's named color property to the given value. + Also stores the material as the tween's target so it can be used for filtered operations + The end value to reach + The name of the material property to tween (like _Tint or _SpecColor) + The duration of the tween + + + Tweens a Material's named color property with the given ID to the given value. + Also stores the material as the tween's target so it can be used for filtered operations + The end value to reach + The ID of the material property to tween (also called nameID in Unity's manual) + The duration of the tween + + + Tweens a Material's alpha color to the given value + (will have no effect unless your material supports transparency). + Also stores the material as the tween's target so it can be used for filtered operations + The end value to reachThe duration of the tween + + + Tweens a Material's alpha color to the given value + (will have no effect unless your material supports transparency). + Also stores the material as the tween's target so it can be used for filtered operations + The end value to reach + The name of the material property to tween (like _Tint or _SpecColor) + The duration of the tween + + + Tweens a Material's alpha color with the given ID to the given value + (will have no effect unless your material supports transparency). + Also stores the material as the tween's target so it can be used for filtered operations + The end value to reach + The ID of the material property to tween (also called nameID in Unity's manual) + The duration of the tween + + + Tweens a Material's named float property to the given value. + Also stores the material as the tween's target so it can be used for filtered operations + The end value to reach + The name of the material property to tween + The duration of the tween + + + Tweens a Material's named float property with the given ID to the given value. + Also stores the material as the tween's target so it can be used for filtered operations + The end value to reach + The ID of the material property to tween (also called nameID in Unity's manual) + The duration of the tween + + + Tweens a Material's texture offset to the given value. + Also stores the material as the tween's target so it can be used for filtered operations + The end value to reach + The duration of the tween + + + Tweens a Material's named texture offset property to the given value. + Also stores the material as the tween's target so it can be used for filtered operations + The end value to reach + The name of the material property to tween + The duration of the tween + + + Tweens a Material's texture scale to the given value. + Also stores the material as the tween's target so it can be used for filtered operations + The end value to reach + The duration of the tween + + + Tweens a Material's named texture scale property to the given value. + Also stores the material as the tween's target so it can be used for filtered operations + The end value to reach + The name of the material property to tween + The duration of the tween + + + Tweens a Material's named Vector property to the given value. + Also stores the material as the tween's target so it can be used for filtered operations + The end value to reach + The name of the material property to tween + The duration of the tween + + + Tweens a Material's named Vector property with the given ID to the given value. + Also stores the material as the tween's target so it can be used for filtered operations + The end value to reach + The ID of the material property to tween (also called nameID in Unity's manual) + The duration of the tween + + + Tweens a TrailRenderer's startWidth/endWidth to the given value. + Also stores the TrailRenderer as the tween's target so it can be used for filtered operations + The end startWidth to reachThe end endWidth to reach + The duration of the tween + + + Tweens a TrailRenderer's time to the given value. + Also stores the TrailRenderer as the tween's target so it can be used for filtered operations + The end value to reachThe duration of the tween + + + Tweens a Transform's position to the given value. + Also stores the transform as the tween's target so it can be used for filtered operations + The end value to reachThe duration of the tween + If TRUE the tween will smoothly snap all values to integers + + + Tweens a Transform's X position to the given value. + Also stores the transform as the tween's target so it can be used for filtered operations + The end value to reachThe duration of the tween + If TRUE the tween will smoothly snap all values to integers + + + Tweens a Transform's Y position to the given value. + Also stores the transform as the tween's target so it can be used for filtered operations + The end value to reachThe duration of the tween + If TRUE the tween will smoothly snap all values to integers + + + Tweens a Transform's Z position to the given value. + Also stores the transform as the tween's target so it can be used for filtered operations + The end value to reachThe duration of the tween + If TRUE the tween will smoothly snap all values to integers + + + Tweens a Transform's localPosition to the given value. + Also stores the transform as the tween's target so it can be used for filtered operations + The end value to reachThe duration of the tween + If TRUE the tween will smoothly snap all values to integers + + + Tweens a Transform's X localPosition to the given value. + Also stores the transform as the tween's target so it can be used for filtered operations + The end value to reachThe duration of the tween + If TRUE the tween will smoothly snap all values to integers + + + Tweens a Transform's Y localPosition to the given value. + Also stores the transform as the tween's target so it can be used for filtered operations + The end value to reachThe duration of the tween + If TRUE the tween will smoothly snap all values to integers + + + Tweens a Transform's Z localPosition to the given value. + Also stores the transform as the tween's target so it can be used for filtered operations + The end value to reachThe duration of the tween + If TRUE the tween will smoothly snap all values to integers + + + Tweens a Transform's rotation to the given value. + Also stores the transform as the tween's target so it can be used for filtered operations + The end value to reachThe duration of the tween + Rotation mode + + + Tweens a Transform's rotation to the given value using pure quaternion values. + Also stores the transform as the tween's target so it can be used for filtered operations. + PLEASE NOTE: DORotate, which takes Vector3 values, is the preferred rotation method. + This method was implemented for very special cases, and doesn't support LoopType.Incremental loops + (neither for itself nor if placed inside a LoopType.Incremental Sequence) + + The end value to reachThe duration of the tween + + + Tweens a Transform's localRotation to the given value. + Also stores the transform as the tween's target so it can be used for filtered operations + The end value to reachThe duration of the tween + Rotation mode + + + Tweens a Transform's rotation to the given value using pure quaternion values. + Also stores the transform as the tween's target so it can be used for filtered operations. + PLEASE NOTE: DOLocalRotate, which takes Vector3 values, is the preferred rotation method. + This method was implemented for very special cases, and doesn't support LoopType.Incremental loops + (neither for itself nor if placed inside a LoopType.Incremental Sequence) + + The end value to reachThe duration of the tween + + + Tweens a Transform's localScale to the given value. + Also stores the transform as the tween's target so it can be used for filtered operations + The end value to reachThe duration of the tween + + + Tweens a Transform's localScale uniformly to the given value. + Also stores the transform as the tween's target so it can be used for filtered operations + The end value to reachThe duration of the tween + + + Tweens a Transform's X localScale to the given value. + Also stores the transform as the tween's target so it can be used for filtered operations + The end value to reachThe duration of the tween + + + Tweens a Transform's Y localScale to the given value. + Also stores the transform as the tween's target so it can be used for filtered operations + The end value to reachThe duration of the tween + + + Tweens a Transform's Z localScale to the given value. + Also stores the transform as the tween's target so it can be used for filtered operations + The end value to reachThe duration of the tween + + + Tweens a Transform's rotation so that it will look towards the given world position. + Also stores the transform as the tween's target so it can be used for filtered operations + The position to look atThe duration of the tween + Eventual axis constraint for the rotation + The vector that defines in which direction up is (default: Vector3.up) + + + EXPERIMENTAL Tweens a Transform's rotation so that it will look towards the given world position, + while also updating the lookAt position every frame + (contrary to which calculates the lookAt rotation only once, when the tween starts). + Also stores the transform as the tween's target so it can be used for filtered operations + The position to look atThe duration of the tween + Eventual axis constraint for the rotation + The vector that defines in which direction up is (default: Vector3.up) + + + Punches a Transform's localPosition towards the given direction and then back to the starting one + as if it was connected to the starting position via an elastic. + The direction and strength of the punch (added to the Transform's current position) + The duration of the tween + Indicates how much will the punch vibrate + Represents how much (0 to 1) the vector will go beyond the starting position when bouncing backwards. + 1 creates a full oscillation between the punch direction and the opposite direction, + while 0 oscillates only between the punch and the start position + If TRUE the tween will smoothly snap all values to integers + + + Punches a Transform's localScale towards the given size and then back to the starting one + as if it was connected to the starting scale via an elastic. + The punch strength (added to the Transform's current scale) + The duration of the tween + Indicates how much will the punch vibrate + Represents how much (0 to 1) the vector will go beyond the starting size when bouncing backwards. + 1 creates a full oscillation between the punch scale and the opposite scale, + while 0 oscillates only between the punch scale and the start scale + + + Punches a Transform's localRotation towards the given size and then back to the starting one + as if it was connected to the starting rotation via an elastic. + The punch strength (added to the Transform's current rotation) + The duration of the tween + Indicates how much will the punch vibrate + Represents how much (0 to 1) the vector will go beyond the starting rotation when bouncing backwards. + 1 creates a full oscillation between the punch rotation and the opposite rotation, + while 0 oscillates only between the punch and the start rotation + + + Shakes a Transform's localPosition with the given values. + The duration of the tween + The shake strength + Indicates how much will the shake vibrate + Indicates how much the shake will be random (0 to 180 - values higher than 90 kind of suck, so beware). + Setting it to 0 will shake along a single direction. + If TRUE the tween will smoothly snap all values to integers + If TRUE the shake will automatically fadeOut smoothly within the tween's duration, otherwise it will not + + + Shakes a Transform's localPosition with the given values. + The duration of the tween + The shake strength on each axis + Indicates how much will the shake vibrate + Indicates how much the shake will be random (0 to 180 - values higher than 90 kind of suck, so beware). + Setting it to 0 will shake along a single direction. + If TRUE the tween will smoothly snap all values to integers + If TRUE the shake will automatically fadeOut smoothly within the tween's duration, otherwise it will not + + + Shakes a Transform's localRotation. + The duration of the tween + The shake strength + Indicates how much will the shake vibrate + Indicates how much the shake will be random (0 to 180 - values higher than 90 kind of suck, so beware). + Setting it to 0 will shake along a single direction. + If TRUE the shake will automatically fadeOut smoothly within the tween's duration, otherwise it will not + + + Shakes a Transform's localRotation. + The duration of the tween + The shake strength on each axis + Indicates how much will the shake vibrate + Indicates how much the shake will be random (0 to 180 - values higher than 90 kind of suck, so beware). + Setting it to 0 will shake along a single direction. + If TRUE the shake will automatically fadeOut smoothly within the tween's duration, otherwise it will not + + + Shakes a Transform's localScale. + The duration of the tween + The shake strength + Indicates how much will the shake vibrate + Indicates how much the shake will be random (0 to 180 - values higher than 90 kind of suck, so beware). + Setting it to 0 will shake along a single direction. + If TRUE the shake will automatically fadeOut smoothly within the tween's duration, otherwise it will not + + + Shakes a Transform's localScale. + The duration of the tween + The shake strength on each axis + Indicates how much will the shake vibrate + Indicates how much the shake will be random (0 to 180 - values higher than 90 kind of suck, so beware). + Setting it to 0 will shake along a single direction. + If TRUE the shake will automatically fadeOut smoothly within the tween's duration, otherwise it will not + + + Tweens a Transform's position to the given value, while also applying a jump effect along the Y axis. + Returns a Sequence instead of a Tweener. + Also stores the transform as the tween's target so it can be used for filtered operations + The end value to reach + Power of the jump (the max height of the jump is represented by this plus the final Y offset) + Total number of jumps + The duration of the tween + If TRUE the tween will smoothly snap all values to integers + + + Tweens a Transform's localPosition to the given value, while also applying a jump effect along the Y axis. + Returns a Sequence instead of a Tweener. + Also stores the transform as the tween's target so it can be used for filtered operations + The end value to reach + Power of the jump (the max height of the jump is represented by this plus the final Y offset) + Total number of jumps + The duration of the tween + If TRUE the tween will smoothly snap all values to integers + + + Tweens a Transform's position through the given path waypoints, using the chosen path algorithm. + Also stores the transform as the tween's target so it can be used for filtered operations + The waypoints to go through + The duration of the tween + The type of path: Linear (straight path), CatmullRom (curved CatmullRom path) or CubicBezier (curved with control points) + The path mode: 3D, side-scroller 2D, top-down 2D + The resolution of the path (useless in case of Linear paths): higher resolutions make for more detailed curved paths but are more expensive. + Defaults to 10, but a value of 5 is usually enough if you don't have dramatic long curves between waypoints + The color of the path (shown when gizmos are active in the Play panel and the tween is running) + + + Tweens a Transform's localPosition through the given path waypoints, using the chosen path algorithm. + Also stores the transform as the tween's target so it can be used for filtered operations + The waypoint to go through + The duration of the tween + The type of path: Linear (straight path), CatmullRom (curved CatmullRom path) or CubicBezier (curved with control points) + The path mode: 3D, side-scroller 2D, top-down 2D + The resolution of the path: higher resolutions make for more detailed curved paths but are more expensive. + Defaults to 10, but a value of 5 is usually enough if you don't have dramatic long curves between waypoints + The color of the path (shown when gizmos are active in the Play panel and the tween is running) + + + IMPORTANT: Unless you really know what you're doing, you should use the overload that accepts a Vector3 array instead. + Tweens a Transform's position via the given path. + Also stores the transform as the tween's target so it can be used for filtered operations + The path to use + The duration of the tween + The path mode: 3D, side-scroller 2D, top-down 2D + + + IMPORTANT: Unless you really know what you're doing, you should use the overload that accepts a Vector3 array instead. + Tweens a Transform's localPosition via the given path. + Also stores the transform as the tween's target so it can be used for filtered operations + The path to use + The duration of the tween + The path mode: 3D, side-scroller 2D, top-down 2D + + + Tweens a Tween's timeScale to the given value. + Also stores the Tween as the tween's target so it can be used for filtered operations + The end value to reachThe duration of the tween + + + Tweens a Light's color to the given value, + in a way that allows other DOBlendableColor tweens to work together on the same target, + instead than fight each other as multiple DOColor would do. + Also stores the Light as the tween's target so it can be used for filtered operations + The value to tween toThe duration of the tween + + + Tweens a Material's color to the given value, + in a way that allows other DOBlendableColor tweens to work together on the same target, + instead than fight each other as multiple DOColor would do. + Also stores the Material as the tween's target so it can be used for filtered operations + The value to tween toThe duration of the tween + + + Tweens a Material's named color property to the given value, + in a way that allows other DOBlendableColor tweens to work together on the same target, + instead than fight each other as multiple DOColor would do. + Also stores the Material as the tween's target so it can be used for filtered operations + The value to tween to + The name of the material property to tween (like _Tint or _SpecColor) + The duration of the tween + + + Tweens a Material's named color property with the given ID to the given value, + in a way that allows other DOBlendableColor tweens to work together on the same target, + instead than fight each other as multiple DOColor would do. + Also stores the Material as the tween's target so it can be used for filtered operations + The value to tween to + The ID of the material property to tween (also called nameID in Unity's manual) + The duration of the tween + + + Tweens a Transform's position BY the given value (as if you chained a SetRelative), + in a way that allows other DOBlendableMove tweens to work together on the same target, + instead than fight each other as multiple DOMove would do. + Also stores the transform as the tween's target so it can be used for filtered operations + The value to tween byThe duration of the tween + If TRUE the tween will smoothly snap all values to integers + + + Tweens a Transform's localPosition BY the given value (as if you chained a SetRelative), + in a way that allows other DOBlendableMove tweens to work together on the same target, + instead than fight each other as multiple DOMove would do. + Also stores the transform as the tween's target so it can be used for filtered operations + The value to tween byThe duration of the tween + If TRUE the tween will smoothly snap all values to integers + + + EXPERIMENTAL METHOD - Tweens a Transform's rotation BY the given value (as if you chained a SetRelative), + in a way that allows other DOBlendableRotate tweens to work together on the same target, + instead than fight each other as multiple DORotate would do. + Also stores the transform as the tween's target so it can be used for filtered operations + The value to tween byThe duration of the tween + Rotation mode + + + EXPERIMENTAL METHOD - Tweens a Transform's lcoalRotation BY the given value (as if you chained a SetRelative), + in a way that allows other DOBlendableRotate tweens to work together on the same target, + instead than fight each other as multiple DORotate would do. + Also stores the transform as the tween's target so it can be used for filtered operations + The value to tween byThe duration of the tween + Rotation mode + + + Punches a Transform's localRotation BY the given value and then back to the starting one + as if it was connected to the starting rotation via an elastic. Does it in a way that allows other + DOBlendableRotate tweens to work together on the same target + The punch strength (added to the Transform's current rotation) + The duration of the tween + Indicates how much will the punch vibrate + Represents how much (0 to 1) the vector will go beyond the starting rotation when bouncing backwards. + 1 creates a full oscillation between the punch rotation and the opposite rotation, + while 0 oscillates only between the punch and the start rotation + + + Tweens a Transform's localScale BY the given value (as if you chained a SetRelative), + in a way that allows other DOBlendableScale tweens to work together on the same target, + instead than fight each other as multiple DOScale would do. + Also stores the transform as the tween's target so it can be used for filtered operations + The value to tween byThe duration of the tween + + + + Completes all tweens that have this target as a reference + (meaning tweens that were started from this target, or that had this target added as an Id) + and returns the total number of tweens completed + (meaning the tweens that don't have infinite loops and were not already complete) + + For Sequences only: if TRUE also internal Sequence callbacks will be fired, + otherwise they will be ignored + + + + Completes all tweens that have this target as a reference + (meaning tweens that were started from this target, or that had this target added as an Id) + and returns the total number of tweens completed + (meaning the tweens that don't have infinite loops and were not already complete) + + For Sequences only: if TRUE also internal Sequence callbacks will be fired, + otherwise they will be ignored + + + + Kills all tweens that have this target as a reference + (meaning tweens that were started from this target, or that had this target added as an Id) + and returns the total number of tweens killed. + + If TRUE completes the tween before killing it + + + + Kills all tweens that have this target as a reference + (meaning tweens that were started from this target, or that had this target added as an Id) + and returns the total number of tweens killed. + + If TRUE completes the tween before killing it + + + + Flips the direction (backwards if it was going forward or viceversa) of all tweens that have this target as a reference + (meaning tweens that were started from this target, or that had this target added as an Id) + and returns the total number of tweens flipped. + + + + + Flips the direction (backwards if it was going forward or viceversa) of all tweens that have this target as a reference + (meaning tweens that were started from this target, or that had this target added as an Id) + and returns the total number of tweens flipped. + + + + + Sends to the given position all tweens that have this target as a reference + (meaning tweens that were started from this target, or that had this target added as an Id) + and returns the total number of tweens involved. + + Time position to reach + (if higher than the whole tween duration the tween will simply reach its end) + If TRUE will play the tween after reaching the given position, otherwise it will pause it + + + + Sends to the given position all tweens that have this target as a reference + (meaning tweens that were started from this target, or that had this target added as an Id) + and returns the total number of tweens involved. + + Time position to reach + (if higher than the whole tween duration the tween will simply reach its end) + If TRUE will play the tween after reaching the given position, otherwise it will pause it + + + + Pauses all tweens that have this target as a reference + (meaning tweens that were started from this target, or that had this target added as an Id) + and returns the total number of tweens paused. + + + + + Pauses all tweens that have this target as a reference + (meaning tweens that were started from this target, or that had this target added as an Id) + and returns the total number of tweens paused. + + + + + Plays all tweens that have this target as a reference + (meaning tweens that were started from this target, or that had this target added as an Id) + and returns the total number of tweens played. + + + + + Plays all tweens that have this target as a reference + (meaning tweens that were started from this target, or that had this target added as an Id) + and returns the total number of tweens played. + + + + + Plays backwards all tweens that have this target as a reference + (meaning tweens that were started from this target, or that had this target added as an Id) + and returns the total number of tweens played. + + + + + Plays backwards all tweens that have this target as a reference + (meaning tweens that were started from this target, or that had this target added as an Id) + and returns the total number of tweens played. + + + + + Plays forward all tweens that have this target as a reference + (meaning tweens that were started from this target, or that had this target added as an Id) + and returns the total number of tweens played. + + + + + Plays forward all tweens that have this target as a reference + (meaning tweens that were started from this target, or that had this target added as an Id) + and returns the total number of tweens played. + + + + + Restarts all tweens that have this target as a reference + (meaning tweens that were started from this target, or that had this target added as an Id) + and returns the total number of tweens restarted. + + + + + Restarts all tweens that have this target as a reference + (meaning tweens that were started from this target, or that had this target added as an Id) + and returns the total number of tweens restarted. + + + + + Rewinds all tweens that have this target as a reference + (meaning tweens that were started from this target, or that had this target added as an Id) + and returns the total number of tweens rewinded. + + + + + Rewinds all tweens that have this target as a reference + (meaning tweens that were started from this target, or that had this target added as an Id) + and returns the total number of tweens rewinded. + + + + + Smoothly rewinds all tweens that have this target as a reference + (meaning tweens that were started from this target, or that had this target added as an Id) + and returns the total number of tweens rewinded. + + + + + Smoothly rewinds all tweens that have this target as a reference + (meaning tweens that were started from this target, or that had this target added as an Id) + and returns the total number of tweens rewinded. + + + + + Toggles the paused state (plays if it was paused, pauses if it was playing) of all tweens that have this target as a reference + (meaning tweens that were started from this target, or that had this target added as an Id) + and returns the total number of tweens involved. + + + + + Toggles the paused state (plays if it was paused, pauses if it was playing) of all tweens that have this target as a reference + (meaning tweens that were started from this target, or that had this target added as an Id) + and returns the total number of tweens involved. + + + + + This class serves only as a utility class to store tween settings to apply on multiple tweens. + It is in no way needed otherwise, since you can directly apply tween settings to a tween via chaining + + + + A variable you can eventually Clear and reuse when needed, + to avoid instantiating TweenParams objects + + + Creates a new TweenParams object, which you can use to store tween settings + to pass to multiple tweens via myTween.SetAs(myTweenParms) + + + Clears and resets this TweenParams instance using default values, + so it can be reused without instantiating another one + + + Sets the autoKill behaviour of the tween. + Has no effect if the tween has already started + If TRUE the tween will be automatically killed when complete + + + Sets an ID for the tween, which can then be used as a filter with DOTween's static methods. + The ID to assign to this tween. Can be an int, a string, an object or anything else. + + + Sets the target for the tween, which can then be used as a filter with DOTween's static methods. + IMPORTANT: use it with caution. If you just want to set an ID for the tween use SetId instead. + When using shorcuts the shortcut target is already assigned as the tween's target, + so using this method will overwrite it and prevent shortcut-operations like myTarget.DOPause from working correctly. + The target to assign to this tween. Can be an int, a string, an object or anything else. + + + Sets the looping options for the tween. + Has no effect if the tween has already started + Number of cycles to play (-1 for infinite - will be converted to 1 in case the tween is nested in a Sequence) + Loop behaviour type (default: LoopType.Restart) + + + Sets the ease of the tween. + If applied to Sequences eases the whole sequence animation + Eventual overshoot or amplitude to use with Back or Elastic easeType (default is 1.70158) + Eventual period to use with Elastic easeType (default is 0) + + + Sets the ease of the tween using an AnimationCurve. + If applied to Sequences eases the whole sequence animation + + + Sets the ease of the tween using a custom ease function. + If applied to Sequences eases the whole sequence animation + + + Sets the recycling behaviour for the tween. + If TRUE the tween will be recycled after being killed, otherwise it will be destroyed. + + + Sets the update type to the one defined in DOTween.defaultUpdateType (UpdateType.Normal unless changed) + and lets you choose if it should be independent from Unity's Time.timeScale + If TRUE the tween will ignore Unity's Time.timeScale + + + Sets the type of update (default or independent) for the tween + The type of update (default: UpdateType.Normal) + If TRUE the tween will ignore Unity's Time.timeScale + + + Sets the onStart callback for the tween. + Called the first time the tween is set in a playing state, after any eventual delay + + + Sets the onPlay callback for the tween. + Called when the tween is set in a playing state, after any eventual delay. + Also called each time the tween resumes playing from a paused state + + + Sets the onRewind callback for the tween. + Called when the tween is rewinded, + either by calling Rewind or by reaching the start position while playing backwards. + Rewinding a tween that is already rewinded will not fire this callback + + + Sets the onUpdate callback for the tween. + Called each time the tween updates + + + Sets the onStepComplete callback for the tween. + Called the moment the tween completes one loop cycle, even when going backwards + + + Sets the onComplete callback for the tween. + Called the moment the tween reaches its final forward position, loops included + + + Sets the onKill callback for the tween. + Called the moment the tween is killed + + + Sets the onWaypointChange callback for the tween. + Called when a path tween reaches a new waypoint + + + Sets a delayed startup for the tween. + Has no effect on Sequences or if the tween has already started + + + If isRelative is TRUE sets the tween as relative + (the endValue will be calculated as startValue + endValue instead than being used directly). + Has no effect on Sequences or if the tween has already started + + + If isSpeedBased is TRUE sets the tween as speed based + (the duration will represent the number of units the tween moves x second). + Has no effect on Sequences, nested tweens, or if the tween has already started + + + + Methods that extend Tween objects and allow to set their parameters + + + + Sets the autoKill behaviour of the tween to TRUE. + Has no effect if the tween has already started or if it's added to a Sequence + + + Sets the autoKill behaviour of the tween. + Has no effect if the tween has already started or if it's added to a Sequence + If TRUE the tween will be automatically killed when complete + + + Sets an ID for the tween (), which can then be used as a filter with DOTween's static methods. + The ID to assign to this tween. Can be an int, a string, an object or anything else. + + + Sets a string ID for the tween (), which can then be used as a filter with DOTween's static methods. + Filtering via string is 2X faster than using an object as an ID (using the alternate obejct overload) + The string ID to assign to this tween. + + + Sets an int ID for the tween (), which can then be used as a filter with DOTween's static methods. + Filtering via int is 4X faster than via object, 2X faster than via string (using the alternate object/string overloads) + The int ID to assign to this tween. + + + Allows to link this tween to a GameObject + so that it will be automatically killed when the GameObject is destroyed. + Has no effect if the tween is added to a Sequence + The link target (unrelated to the target set via SetTarget) + + + Allows to link this tween to a GameObject and assign a behaviour depending on it. + This will also automatically kill the tween when the GameObject is destroyed. + Has no effect if the tween is added to a Sequence + The link target (unrelated to the target set via SetTarget) + The behaviour to use ( is always evaluated even if you choose another one) + + + Sets the target for the tween, which can then be used as a filter with DOTween's static methods. + IMPORTANT: use it with caution. If you just want to set an ID for the tween use SetId instead. + When using shorcuts the shortcut target is already assigned as the tween's target, + so using this method will overwrite it and prevent shortcut-operations like myTarget.DOPause from working correctly. + The target to assign to this tween. Can be an int, a string, an object or anything else. + + + Sets the looping options for the tween. + Has no effect if the tween has already started + Number of cycles to play (-1 for infinite - will be converted to 1 in case the tween is nested in a Sequence) + + + Sets the looping options for the tween. + Has no effect if the tween has already started + Number of cycles to play (-1 for infinite - will be converted to 1 in case the tween is nested in a Sequence) + Loop behaviour type (default: LoopType.Restart) + + + Sets the ease of the tween. + If applied to Sequences eases the whole sequence animation + + + Sets the ease of the tween. + If applied to Sequences eases the whole sequence animation + + Eventual overshoot to use with Back or Flash ease (default is 1.70158 - 1 for Flash). + In case of Flash ease it must be an intenger and sets the total number of flashes that will happen. + Using an even number will complete the tween on the starting value, while an odd one will complete it on the end value. + + + + Sets the ease of the tween. + If applied to Sequences eases the whole sequence animation + Eventual amplitude to use with Elastic easeType or overshoot to use with Flash easeType (default is 1.70158 - 1 for Flash). + In case of Flash ease it must be an integer and sets the total number of flashes that will happen. + Using an even number will complete the tween on the starting value, while an odd one will complete it on the end value. + + Eventual period to use with Elastic or Flash easeType (default is 0). + In case of Flash ease it indicates the power in time of the ease, and must be between -1 and 1. + 0 is balanced, 1 weakens the ease with time, -1 starts the ease weakened and gives it power towards the end. + + + + Sets the ease of the tween using an AnimationCurve. + If applied to Sequences eases the whole sequence animation + + + Sets the ease of the tween using a custom ease function (which must return a value between 0 and 1). + If applied to Sequences eases the whole sequence animation + + + Allows the tween to be recycled after being killed. + + + Sets the recycling behaviour for the tween. + If TRUE the tween will be recycled after being killed, otherwise it will be destroyed. + + + Sets the update type to UpdateType.Normal and lets you choose if it should be independent from Unity's Time.timeScale + If TRUE the tween will ignore Unity's Time.timeScale + + + Sets the type of update for the tween + The type of update (defalt: UpdateType.Normal) + + + Sets the type of update for the tween and lets you choose if it should be independent from Unity's Time.timeScale + The type of update + If TRUE the tween will ignore Unity's Time.timeScale + + + EXPERIMENTAL: inverts this tween, so that it will play from the end to the beginning + (playing it backwards will actually play it from the beginning to the end). + Has no effect if the tween has already started or if it's added to a Sequence + + + EXPERIMENTAL: inverts this tween, so that it will play from the end to the beginning + (playing it backwards will actually play it from the beginning to the end). + Has no effect if the tween has already started or if it's added to a Sequence + If TRUE the tween will be inverted, otherwise it won't + + + Sets the onStart callback for the tween, clearing any previous onStart callback that was set. + Called the first time the tween is set in a playing state, after any eventual delay + + + Sets the onPlay callback for the tween, clearing any previous onPlay callback that was set. + Called when the tween is set in a playing state, after any eventual delay. + Also called each time the tween resumes playing from a paused state + + + Sets the onPause callback for the tween, clearing any previous onPause callback that was set. + Called when the tween state changes from playing to paused. + If the tween has autoKill set to FALSE, this is called also when the tween reaches completion. + + + Sets the onRewind callback for the tween, clearing any previous onRewind callback that was set. + Called when the tween is rewinded, + either by calling Rewind or by reaching the start position while playing backwards. + Rewinding a tween that is already rewinded will not fire this callback + + + Sets the onUpdate callback for the tween, clearing any previous onUpdate callback that was set. + Called each time the tween updates + + + Sets the onStepComplete callback for the tween, clearing any previous onStepComplete callback that was set. + Called the moment the tween completes one loop cycle, even when going backwards + + + Sets the onComplete callback for the tween, clearing any previous onComplete callback that was set. + Called the moment the tween reaches its final forward position, loops included + + + Sets the onKill callback for the tween, clearing any previous onKill callback that was set. + Called the moment the tween is killed + + + Sets the onWaypointChange callback for the tween, clearing any previous onWaypointChange callback that was set. + Called when a path tween's current waypoint changes + + + Sets the parameters of the tween (id, ease, loops, delay, timeScale, callbacks, etc) as the parameters of the given one. + Doesn't copy specific SetOptions settings: those will need to be applied manually each time. + Has no effect if the tween has already started. + NOTE: the tween's target will not be changed + Tween from which to copy the parameters + + + Sets the parameters of the tween (id, ease, loops, delay, timeScale, callbacks, etc) as the parameters of the given TweenParams. + Has no effect if the tween has already started. + TweenParams from which to copy the parameters + + + Adds the given tween to the end of the Sequence. + Has no effect if the Sequence has already started + The tween to append + + + Adds the given tween to the beginning of the Sequence, pushing forward the other nested content. + Has no effect if the Sequence has already started + The tween to prepend + + + Inserts the given tween at the same time position of the last tween, callback or intervale added to the Sequence. + Note that, in case of a Join after an interval, the insertion time will be the time where the interval starts, not where it finishes. + Has no effect if the Sequence has already started + + + Inserts the given tween at the given time position in the Sequence, + automatically adding an interval if needed. + Has no effect if the Sequence has already started + The time position where the tween will be placed + The tween to insert + + + Adds the given interval to the end of the Sequence. + Has no effect if the Sequence has already started + The interval duration + + + Adds the given interval to the beginning of the Sequence, pushing forward the other nested content. + Has no effect if the Sequence has already started + The interval duration + + + Adds the given callback to the end of the Sequence. + Has no effect if the Sequence has already started + The callback to append + + + Adds the given callback to the beginning of the Sequence, pushing forward the other nested content. + Has no effect if the Sequence has already started + The callback to prepend + + + Inserts the given callback at the given time position in the Sequence, + automatically adding an interval if needed. + Has no effect if the Sequence has already started + The time position where the callback will be placed + The callback to insert + + + Changes a TO tween into a FROM tween: sets the current target's position as the tween's endValue + then immediately sends the target to the previously set endValue. + + + Changes a TO tween into a FROM tween: sets the current target's position as the tween's endValue + then immediately sends the target to the previously set endValue. + If TRUE the FROM value will be calculated as relative to the current one + + + Changes a TO tween into a FROM tween: sets the current value of the target as the endValue, + and the previously passed endValue as the actual startValue. + If TRUE sets the target to from value immediately, otherwise waits for the tween to start + If TRUE the FROM value will be calculated as relative to the current one + + + Changes a TO tween into a FROM tween: sets the tween's starting value to the given one + and eventually sets the tween's target to that value immediately. + Value to start from + If TRUE sets the target to from value immediately, otherwise waits for the tween to start + If TRUE the FROM/TO values will be calculated as relative to the current ones + + + Changes a TO tween into a FROM tween: sets the tween's starting value to the given one + and eventually sets the tween's target to that value immediately. + Alpha value to start from (in case of Fade tweens) + If TRUE sets the target to from value immediately, otherwise waits for the tween to start + If TRUE the FROM/TO values will be calculated as relative to the current ones + + + Changes a TO tween into a FROM tween: sets the tween's starting value to the given one + and eventually sets the tween's target to that value immediately. + Value to start from (in case of Vector tweens that act on a single coordinate or scale tweens) + If TRUE sets the target to from value immediately, otherwise waits for the tween to start + If TRUE the FROM/TO values will be calculated as relative to the current ones + + + Changes a TO tween into a FROM tween: sets the tween's starting value to the given one + and eventually sets the tween's target to that value immediately. + Value to start from (in case of Vector tweens that act on a single coordinate or scale tweens) + If TRUE sets the target to from value immediately, otherwise waits for the tween to start + If TRUE the FROM/TO values will be calculated as relative to the current ones + + + Sets a delayed startup for the tween. + In case of Sequences behaves the same as , + which means the delay will repeat in case of loops (while with tweens it's ignored after the first loop cycle). + Has no effect if the tween has already started + + + EXPERIMENTAL: implemented in v1.2.340. + Sets a delayed startup for the tween with options to choose how the delay is applied in case of Sequences. + Has no effect if the tween has already started + Only used by types: If FALSE sets the delay as a one-time occurrence + (defaults to this for types), + otherwise as a Sequence interval which will repeat at the beginning of every loop cycle + + + Sets the tween as relative + (the endValue will be calculated as startValue + endValue instead than being used directly). + Has no effect on Sequences or if the tween has already started + + + If isRelative is TRUE sets the tween as relative + (the endValue will be calculated as startValue + endValue instead than being used directly). + Has no effect on Sequences or if the tween has already started + + + If isSpeedBased is TRUE sets the tween as speed based + (the duration will represent the number of units the tween moves x second). + Has no effect on Sequences, nested tweens, or if the tween has already started + + + If isSpeedBased is TRUE sets the tween as speed based + (the duration will represent the number of units the tween moves x second). + Has no effect on Sequences, nested tweens, or if the tween has already started + + + Options for float tweens + If TRUE the tween will smoothly snap all values to integers + + + Options for Vector2 tweens + If TRUE the tween will smoothly snap all values to integers + + + Options for Vector2 tweens + Selecting an axis will tween the vector only on that axis, leaving the others untouched + If TRUE the tween will smoothly snap all values to integers + + + Options for Vector3 tweens + If TRUE the tween will smoothly snap all values to integers + + + Options for Vector3 tweens + Selecting an axis will tween the vector only on that axis, leaving the others untouched + If TRUE the tween will smoothly snap all values to integers + + + Options for Vector4 tweens + If TRUE the tween will smoothly snap all values to integers + + + Options for Vector4 tweens + Selecting an axis will tween the vector only on that axis, leaving the others untouched + If TRUE the tween will smoothly snap all values to integers + + + Options for Quaternion tweens + If TRUE (default) the rotation will take the shortest route, and will not rotate more than 360°. + If FALSE the rotation will be fully accounted. Is always FALSE if the tween is set as relative + + + Options for Color tweens + If TRUE only the alpha value of the color will be tweened + + + Options for Vector4 tweens + If TRUE the tween will smoothly snap all values to integers + + + Options for Vector4 tweens + If TRUE, rich text will be interpreted correctly while animated, + otherwise all tags will be considered as normal text + The type of scramble to use, if any + A string containing the characters to use for scrambling. + Use as many characters as possible (minimum 10) because DOTween uses a fast scramble mode which gives better results with more characters. + Leave it to NULL to use default ones + + + Options for Vector3Array tweens + If TRUE the tween will smoothly snap all values to integers + + + Options for Vector3Array tweens + If TRUE the tween will smoothly snap all values to integers + + + Options for ShapeCircle tweens + If TRUE the center you set in the DOTween.To method will be considered as relative + to the starting position of the target + If TRUE the tween will smoothly snap all values to integers + + + Options for Path tweens (created via the DOPath shortcut) + The eventual movement axis to lock. You can input multiple axis if you separate them like this: + AxisConstrain.X | AxisConstraint.Y + The eventual rotation axis to lock. You can input multiple axis if you separate them like this: + AxisConstrain.X | AxisConstraint.Y + + + Options for Path tweens (created via the DOPath shortcut) + If TRUE the path will be automatically closed + The eventual movement axis to lock. You can input multiple axis if you separate them like this: + AxisConstrain.X | AxisConstraint.Y + The eventual rotation axis to lock. You can input multiple axis if you separate them like this: + AxisConstrain.X | AxisConstraint.Y + + + Additional LookAt options for Path tweens (created via the DOPath shortcut). + Orients the target towards the given position. + Must be chained directly to the tween creation method or to a SetOptions + The position to look at + The eventual direction to consider as "forward". + If left to NULL defaults to the regular forward side of the transform + The vector that defines in which direction up is (default: Vector3.up) + + + Additional LookAt options for Path tweens (created via the DOPath shortcut). + Orients the target towards the given position with options to keep the Z rotation stable. + Must be chained directly to the tween creation method or to a SetOptions + The position to look at + If TRUE doesn't rotate the target along the Z axis + + + Additional LookAt options for Path tweens (created via the DOPath shortcut). + Orients the target towards another transform. + Must be chained directly to the tween creation method or to a SetOptions + The transform to look at + The eventual direction to consider as "forward". + If left to NULL defaults to the regular forward side of the transform + The vector that defines in which direction up is (default: Vector3.up) + + + Additional LookAt options for Path tweens (created via the DOPath shortcut). + Orients the target towards another transform with options to keep the Z rotation stable. + Must be chained directly to the tween creation method or to a SetOptions + The transform to look at + If TRUE doesn't rotate the target along the Z axis + + + Additional LookAt options for Path tweens (created via the DOPath shortcut). + Orients the target to the path, with the given lookAhead. + Must be chained directly to the tween creation method or to a SetOptions + The percentage of lookAhead to use (0 to 1) + The eventual direction to consider as "forward". + If left to NULL defaults to the regular forward side of the transform + The vector that defines in which direction up is (default: Vector3.up) + + + Additional LookAt options for Path tweens (created via the DOPath shortcut). + Orients the path with options to keep the Z rotation stable. + Must be chained directly to the tween creation method or to a SetOptions + The percentage of lookAhead to use (0 to 1) + If TRUE doesn't rotate the target along the Z axis + + + + Types of log behaviours + + + + Log only warnings and errors + + + Log warnings, errors and additional infos + + + Log only errors + + + + Indicates either a Tweener or a Sequence + + + + TimeScale for the tween + + + If TRUE the tween will play backwards + + + If TRUE the tween is completely inverted but without playing it backwards + (play backwards will actually play the tween in the original direction) + + + Object ID (usable for filtering with DOTween static methods). Can be anything except a string or an int + (use or for those) + + + String ID (usable for filtering with DOTween static methods). 2X faster than using an object id + + + Int ID (usable for filtering with DOTween static methods). 4X faster than using an object id, 2X faster than using a string id. + Default is -999 so avoid using an ID like that or it will capture all unset intIds + + + Tween target (usable for filtering with DOTween static methods). Automatically set by tween creation shortcuts + + + Called when the tween is set in a playing state, after any eventual delay. + Also called each time the tween resumes playing from a paused state + + + Called when the tween state changes from playing to paused. + If the tween has autoKill set to FALSE, this is called also when the tween reaches completion. + + + Called when the tween is rewinded, + either by calling Rewind or by reaching the start position while playing backwards. + Rewinding a tween that is already rewinded will not fire this callback + + + Called each time the tween updates + + + Called the moment the tween completes one loop cycle + + + Called the moment the tween reaches completion (loops included) + + + Called the moment the tween is killed + + + Called when a path tween's current waypoint changes + + + Tweeners-only (ignored by Sequences), returns TRUE if the tween was set as relative + + + + Set by SetTarget if DOTween's Debug Mode is on (see DOTween Utility Panel -> "Store GameObject's ID" debug option + + + + FALSE when tween is (or should be) despawned - set only by TweenManager + + + Gets and sets the time position (loops included, delays excluded) of the tween + + + Returns TRUE if the tween is set to loop (either a set number of times or infinitely) + + + TRUE after the tween was set in a play state at least once, AFTER any delay is elapsed + + + Time position within a single loop cycle + + + + Animates a single value + + + + Changes the start value of a tween and rewinds it (without pausing it). + Has no effect with tweens that are inside Sequences + The new start value + If bigger than 0 applies it as the new tween duration + + + Changes the end value of a tween and rewinds it (without pausing it). + Has no effect with tweens that are inside Sequences + The new end value + If bigger than 0 applies it as the new tween duration + If TRUE the start value will become the current target's value, otherwise it will stay the same + + + Changes the end value of a tween and rewinds it (without pausing it). + Has no effect with tweens that are inside Sequences + The new end value + If TRUE the start value will become the current target's value, otherwise it will stay the same + + + Changes the start and end value of a tween and rewinds it (without pausing it). + Has no effect with tweens that are inside Sequences + The new start value + The new end value + If bigger than 0 applies it as the new tween duration + + + + Used internally + + + + + Update type + + + + Updates every frame during Update calls + + + Updates every frame during LateUpdate calls + + + Updates using FixedUpdate calls + + + Updates using manual update calls + + + diff --git a/Assets/Plugins/Demigiant/DOTween/DOTween.XML.meta b/Assets/Plugins/Demigiant/DOTween/DOTween.XML.meta new file mode 100644 index 00000000..7a866b54 --- /dev/null +++ b/Assets/Plugins/Demigiant/DOTween/DOTween.XML.meta @@ -0,0 +1,4 @@ +fileFormatVersion: 2 +guid: 34192c5e0d14aee43a0e86cc4823268a +TextScriptImporter: + userData: diff --git a/Assets/Plugins/Demigiant/DOTween/DOTween.dll b/Assets/Plugins/Demigiant/DOTween/DOTween.dll new file mode 100644 index 0000000000000000000000000000000000000000..4c0bb10614d73a5b46e58df117be2e2e2729aae0 GIT binary patch literal 172032 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 ~)CFU>gFNmEmDDr()MofeLM*N!iq)bs8(sgG(U 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 + + + DOTweenEditor + + + + + Starts the update loop of tween in the editor. Has no effect during playMode. + + Eventual callback to call after every update + + + + Stops the update loop and clears the onPreviewUpdated callback. + + If TRUE also resets the tweened objects to their original state. + Note that this works by calling Rewind on all tweens, so it will work correctly + only if you have a single tween type per object and it wasn't killed + If TRUE also kills any cached tween + + + + Readies the tween for editor preview by setting its UpdateType to Manual plus eventual extra settings. + + The tween to ready + If TRUE (recommended) removes all callbacks (OnComplete/Rewind/etc) + If TRUE prevents the tween from being auto-killed at completion + If TRUE starts playing the tween immediately + + + Full major version + first minor version (ex: 2018.1f) + + + Major version + + + First minor version (ex: in 2018.1 it would be 1) + + + + Checks that the given editor texture use the correct import settings, + and applies them if they're incorrect. + + + + + Returns TRUE if setup is required + + + + + Returns TRUE if the file/directory at the given path exists. + + Path, relative to Unity's project folder + + + + + Converts the given project-relative path to a full path, + with backward (\) slashes). + + + + + Converts the given full path to a path usable with AssetDatabase methods + (relative to Unity's project folder, and with the correct Unity forward (/) slashes). + + + + + Connects to a asset. + If the asset already exists at the given path, loads it and returns it. + Otherwise, either returns NULL or automatically creates it before loading and returning it + (depending on the given parameters). + + Asset type + File path (relative to Unity's project folder) + If TRUE and the requested asset doesn't exist, forces its creation + + + + Full path for the given loaded assembly, assembly file included + + + + + Adds the given global define if it's not already present + + + + + Removes the given global define if it's present + + + + + Returns TRUE if the given global define is present in all the + or only in the given , depending on passed parameters. + + + to use. Leave NULL to check in all of them. + + + + Not used as menu item anymore, but as a utiity function + + + + diff --git a/Assets/Plugins/Demigiant/DOTween/Editor/DOTweenEditor.XML.meta b/Assets/Plugins/Demigiant/DOTween/Editor/DOTweenEditor.XML.meta new file mode 100644 index 00000000..7cec1135 --- /dev/null +++ b/Assets/Plugins/Demigiant/DOTween/Editor/DOTweenEditor.XML.meta @@ -0,0 +1,4 @@ +fileFormatVersion: 2 +guid: 2e2c6224d345d9249acfa6e8ef40bb2d +TextScriptImporter: + userData: diff --git a/Assets/Plugins/Demigiant/DOTween/Editor/DOTweenEditor.dll b/Assets/Plugins/Demigiant/DOTween/Editor/DOTweenEditor.dll new file mode 100644 index 0000000000000000000000000000000000000000..1599b4066a5a958b3446e67cddd5926fc2ed7688 GIT binary patch literal 66048 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 QuO7ac!T&$z|2hZ$7vfCwQUCw| literal 0 HcmV?d00001 diff --git a/Assets/Plugins/Demigiant/DOTween/Editor/DOTweenEditor.dll.meta b/Assets/Plugins/Demigiant/DOTween/Editor/DOTweenEditor.dll.meta new file mode 100644 index 00000000..53590f3b --- /dev/null +++ b/Assets/Plugins/Demigiant/DOTween/Editor/DOTweenEditor.dll.meta @@ -0,0 +1,22 @@ +fileFormatVersion: 2 +guid: 45d5034162d6cf04dbe46da84fc7d074 +PluginImporter: + serializedVersion: 1 + iconMap: {} + executionOrder: {} + isPreloaded: 0 + platformData: + Any: + enabled: 0 + settings: {} + Editor: + enabled: 1 + settings: + DefaultValueInitialized: true + WindowsStoreApps: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Demigiant/DOTween/Editor/Imgs.meta b/Assets/Plugins/Demigiant/DOTween/Editor/Imgs.meta new file mode 100644 index 00000000..a81ba5ff --- /dev/null +++ b/Assets/Plugins/Demigiant/DOTween/Editor/Imgs.meta @@ -0,0 +1,5 @@ +fileFormatVersion: 2 +guid: 0034ebae0c2a9344e897db1160d71b6d +folderAsset: yes +DefaultImporter: + userData: diff --git a/Assets/Plugins/Demigiant/DOTween/Editor/Imgs/DOTweenIcon.png b/Assets/Plugins/Demigiant/DOTween/Editor/Imgs/DOTweenIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..d06fc7c3e49fb705b19f50a23884e11e08fd6e89 GIT binary patch literal 1565 zcmV+&2IBdNP)pK&q+iZU-R{R_dCD)yXSsA=iKiWUaHS%xglyYZad)#h+<5;*}0 zNm4;#XNMU$Zj;|vsJ23aE-5O{$8uo1iN`?c(v%ev86gvrQJJtDUgxox^bsB@>w%Sv@Z{F3?7c1><;yj*g<&fQ;rHj}CCd5!B9uJ9iB}?8sX9 z0l}mbA`+6NSzvKr7orW|#Qq*|(_H8{K}SN-b6PMMr68BfK|728UnV4rbuENZG2Z=Z5Wu9k@Z ztFhSr_^u&Go2vR`!G?lmnDf^U%@^vc&8BfCWA&5;S^i0KcuQ?}kJ(Z3^ukf69xF;y zhTjIduJg}*jhXlo$g+|CIjkSftK3odtF^Ij{rKV$Cnn9$)I>`OWpR2BZvMLfc!?KG z`Ygj57^xT!Rkoeb;;a>--p1*pKcW45EApC=r9;lR-6-kL1bPPs&3JrJ`3>IVgWG}u zrp-R@PdWz2X;89OBJXFclQSuKH%hu+=km#Rb8S^yF>)=)yvW|npJ`O9bTXp9hsHlb znp{n43g)Eywa^bS0=L=}#fV_6`pc{T=00UOIql`_gv<&0h%GG1sFbh_*L zqP^;2G6HL$uEjx);7q^Pe;Vac1Sb6of8vi>KZaIU-M!xHLy7h)J?TTTtlXuy)v(S-r9V9I7cw) zBJ@dWbWCbJy!KBwxl~8X#1q??E z(FRaBcRnf^OG3xEWE{XiDJhYPVBV54Q*B2`fK%)r4bJp zv@(2PX=l*%^bG!@&}Ku`gi%4ta5WNM0#2BfuE7?N_gS0ljFV#0yW1U1N=~9Q$*7V9 zs*5|&bg|QQt;WLQDrER5jfAhm2W6wJag5au!96_|(2Th-DB`E<_rUdkM#GW4COG!3 z`K~-?KL;C^l|r|5RUE^pEPvtTLR^K!B04D#hpLNGOCz;*Z|Rx&7b{!rLVU{NI)eH5 zyg0@a6A$elUi>gA6@P$cWD53gSzVnTr*}j6sd4;47Sd19E6U{>QXP%UxLJ2^hjTS@ z6ZIq2+r)$@>IAiS(jN5U4r-m;p98e&wn5+}NTri*S7~M1@c0mh@Mz$FrSMzj$u5?< P00000NkvXXu0mjftl$Bl literal 0 HcmV?d00001 diff --git a/Assets/Plugins/Demigiant/DOTween/Editor/Imgs/DOTweenIcon.png.meta b/Assets/Plugins/Demigiant/DOTween/Editor/Imgs/DOTweenIcon.png.meta new file mode 100644 index 00000000..61c3ccec --- /dev/null +++ b/Assets/Plugins/Demigiant/DOTween/Editor/Imgs/DOTweenIcon.png.meta @@ -0,0 +1,47 @@ +fileFormatVersion: 2 +guid: 8da095e39e9b4df488dfd436f81116d6 +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 128 + textureSettings: + filterMode: 1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Plugins/Demigiant/DOTween/Editor/Imgs/DOTweenMiniIcon.png b/Assets/Plugins/Demigiant/DOTween/Editor/Imgs/DOTweenMiniIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..7cd74c1a26df1a45564c7a0e21c62d0ef3af2fd1 GIT binary patch literal 319 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{!3Opi<85sBugD~Uq{1quc!H=FU zjv*3LlT#WP(iF^Cl2R3(u|Mi}s1fft&-^joZ3WZ(2Ug1Y!S$8-a*li}_21XqSnvJ# z@Y+`2=i8W`Zfg*cV81TuZmqUr`JI~8M}9x(m1v%HMLo`ySuokJ?%Vq7{C4$+ST-HH z5`RuO<@s#=8XoVy+lF)YEaxg?4vAr1(jlM1>Tx0PF<0}pFUf679a{7Ee==}5`qQz? zuIUa#(3byge21?t-^6oqTDwHc&iz0s`zDdQwtGKbESsPtIM1KwqFB4+nW=frYn!|7 zvs(U9y->(A=TFZ3t)>6Hv^;B{u+A(fd3smW;eIaTDS0KOITHVv7#gf%Y$mkMJ`MCd NgQu&X%Q~loCICTRfS>>X literal 0 HcmV?d00001 diff --git a/Assets/Plugins/Demigiant/DOTween/Editor/Imgs/DOTweenMiniIcon.png.meta b/Assets/Plugins/Demigiant/DOTween/Editor/Imgs/DOTweenMiniIcon.png.meta new file mode 100644 index 00000000..c343a61a --- /dev/null +++ b/Assets/Plugins/Demigiant/DOTween/Editor/Imgs/DOTweenMiniIcon.png.meta @@ -0,0 +1,68 @@ +fileFormatVersion: 2 +guid: 61521df2e071645488ba3d05e49289ae +timeCreated: 1602317874 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Demigiant/DOTween/Editor/Imgs/Footer.png b/Assets/Plugins/Demigiant/DOTween/Editor/Imgs/Footer.png new file mode 100644 index 0000000000000000000000000000000000000000..e29d02fe18b777b1d316feb647b339803c5126de GIT binary patch literal 4409 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 literal 0 HcmV?d00001 diff --git a/Assets/Plugins/Demigiant/DOTween/Editor/Imgs/Footer.png.meta b/Assets/Plugins/Demigiant/DOTween/Editor/Imgs/Footer.png.meta new file mode 100644 index 00000000..7ca19119 --- /dev/null +++ b/Assets/Plugins/Demigiant/DOTween/Editor/Imgs/Footer.png.meta @@ -0,0 +1,47 @@ +fileFormatVersion: 2 +guid: 7051dba417b3d53409f2918f1ea4938d +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 256 + textureSettings: + filterMode: 1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Plugins/Demigiant/DOTween/Editor/Imgs/Footer_dark.png b/Assets/Plugins/Demigiant/DOTween/Editor/Imgs/Footer_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..e48db5ef7a2b83eff50d6e3b5fe9ba3bcd4a5015 GIT binary patch literal 4429 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 TqmFO~00000NkvXXu0mjf{EM6C literal 0 HcmV?d00001 diff --git a/Assets/Plugins/Demigiant/DOTween/Editor/Imgs/Footer_dark.png.meta b/Assets/Plugins/Demigiant/DOTween/Editor/Imgs/Footer_dark.png.meta new file mode 100644 index 00000000..f12a1a7d --- /dev/null +++ b/Assets/Plugins/Demigiant/DOTween/Editor/Imgs/Footer_dark.png.meta @@ -0,0 +1,47 @@ +fileFormatVersion: 2 +guid: 519694efe2bb2914788b151fbd8c01f4 +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 0 + textureType: -1 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Plugins/Demigiant/DOTween/Editor/Imgs/Header.jpg b/Assets/Plugins/Demigiant/DOTween/Editor/Imgs/Header.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4d710d719075150879b1ee76680af87791c4d3b3 GIT binary patch literal 22787 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 QE#Li`lK-oJv9mh=KQ4fgsQ>@~ literal 0 HcmV?d00001 diff --git a/Assets/Plugins/Demigiant/DOTween/Editor/Imgs/Header.jpg.meta b/Assets/Plugins/Demigiant/DOTween/Editor/Imgs/Header.jpg.meta new file mode 100644 index 00000000..26e42551 --- /dev/null +++ b/Assets/Plugins/Demigiant/DOTween/Editor/Imgs/Header.jpg.meta @@ -0,0 +1,47 @@ +fileFormatVersion: 2 +guid: 78a59ca99f8987941adb61f9e14a06a7 +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 512 + textureSettings: + filterMode: 1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Plugins/Demigiant/DOTween/Modules.meta b/Assets/Plugins/Demigiant/DOTween/Modules.meta new file mode 100644 index 00000000..24cd2ac5 --- /dev/null +++ b/Assets/Plugins/Demigiant/DOTween/Modules.meta @@ -0,0 +1,5 @@ +fileFormatVersion: 2 +guid: 143604b8bad857d47a6f7cc7a533e2dc +folderAsset: yes +DefaultImporter: + userData: diff --git a/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleAudio.cs b/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleAudio.cs new file mode 100644 index 00000000..c195b6cc --- /dev/null +++ b/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleAudio.cs @@ -0,0 +1,202 @@ +// Author: Daniele Giardini - http://www.demigiant.com +// Created: 2018/07/13 + +#if true // MODULE_MARKER +using System; +using DG.Tweening.Core; +using DG.Tweening.Plugins.Options; +using UnityEngine; +#if UNITY_5 || UNITY_2017_1_OR_NEWER +using UnityEngine.Audio; // Required for AudioMixer +#endif + +#pragma warning disable 1591 +namespace DG.Tweening +{ + public static class DOTweenModuleAudio + { + #region Shortcuts + + #region Audio + + /// Tweens an AudioSource's volume to the given value. + /// Also stores the AudioSource as the tween's target so it can be used for filtered operations + /// The end value to reach (0 to 1)The duration of the tween + public static TweenerCore DOFade(this AudioSource target, float endValue, float duration) + { + if (endValue < 0) endValue = 0; + else if (endValue > 1) endValue = 1; + TweenerCore t = DOTween.To(() => target.volume, x => target.volume = x, endValue, duration); + t.SetTarget(target); + return t; + } + + /// Tweens an AudioSource's pitch to the given value. + /// Also stores the AudioSource as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + public static TweenerCore DOPitch(this AudioSource target, float endValue, float duration) + { + TweenerCore t = DOTween.To(() => target.pitch, x => target.pitch = x, endValue, duration); + t.SetTarget(target); + return t; + } + + #endregion + +#if UNITY_5 || UNITY_2017_1_OR_NEWER + #region AudioMixer (Unity 5 or Newer) + + /// Tweens an AudioMixer's exposed float to the given value. + /// Also stores the AudioMixer as the tween's target so it can be used for filtered operations. + /// Note that you need to manually expose a float in an AudioMixerGroup in order to be able to tween it from an AudioMixer. + /// Name given to the exposed float to set + /// The end value to reachThe duration of the tween + public static TweenerCore DOSetFloat(this AudioMixer target, string floatName, float endValue, float duration) + { + TweenerCore t = DOTween.To(()=> { + float currVal; + target.GetFloat(floatName, out currVal); + return currVal; + }, x=> target.SetFloat(floatName, x), endValue, duration); + t.SetTarget(target); + return t; + } + + #region Operation Shortcuts + + /// + /// Completes all tweens that have this target as a reference + /// (meaning tweens that were started from this target, or that had this target added as an Id) + /// and returns the total number of tweens completed + /// (meaning the tweens that don't have infinite loops and were not already complete) + /// + /// For Sequences only: if TRUE also internal Sequence callbacks will be fired, + /// otherwise they will be ignored + public static int DOComplete(this AudioMixer target, bool withCallbacks = false) + { + return DOTween.Complete(target, withCallbacks); + } + + /// + /// Kills all tweens that have this target as a reference + /// (meaning tweens that were started from this target, or that had this target added as an Id) + /// and returns the total number of tweens killed. + /// + /// If TRUE completes the tween before killing it + public static int DOKill(this AudioMixer target, bool complete = false) + { + return DOTween.Kill(target, complete); + } + + /// + /// Flips the direction (backwards if it was going forward or viceversa) of all tweens that have this target as a reference + /// (meaning tweens that were started from this target, or that had this target added as an Id) + /// and returns the total number of tweens flipped. + /// + public static int DOFlip(this AudioMixer target) + { + return DOTween.Flip(target); + } + + /// + /// Sends to the given position all tweens that have this target as a reference + /// (meaning tweens that were started from this target, or that had this target added as an Id) + /// and returns the total number of tweens involved. + /// + /// Time position to reach + /// (if higher than the whole tween duration the tween will simply reach its end) + /// If TRUE will play the tween after reaching the given position, otherwise it will pause it + public static int DOGoto(this AudioMixer target, float to, bool andPlay = false) + { + return DOTween.Goto(target, to, andPlay); + } + + /// + /// Pauses all tweens that have this target as a reference + /// (meaning tweens that were started from this target, or that had this target added as an Id) + /// and returns the total number of tweens paused. + /// + public static int DOPause(this AudioMixer target) + { + return DOTween.Pause(target); + } + + /// + /// Plays all tweens that have this target as a reference + /// (meaning tweens that were started from this target, or that had this target added as an Id) + /// and returns the total number of tweens played. + /// + public static int DOPlay(this AudioMixer target) + { + return DOTween.Play(target); + } + + /// + /// Plays backwards all tweens that have this target as a reference + /// (meaning tweens that were started from this target, or that had this target added as an Id) + /// and returns the total number of tweens played. + /// + public static int DOPlayBackwards(this AudioMixer target) + { + return DOTween.PlayBackwards(target); + } + + /// + /// Plays forward all tweens that have this target as a reference + /// (meaning tweens that were started from this target, or that had this target added as an Id) + /// and returns the total number of tweens played. + /// + public static int DOPlayForward(this AudioMixer target) + { + return DOTween.PlayForward(target); + } + + /// + /// Restarts all tweens that have this target as a reference + /// (meaning tweens that were started from this target, or that had this target added as an Id) + /// and returns the total number of tweens restarted. + /// + public static int DORestart(this AudioMixer target) + { + return DOTween.Restart(target); + } + + /// + /// Rewinds all tweens that have this target as a reference + /// (meaning tweens that were started from this target, or that had this target added as an Id) + /// and returns the total number of tweens rewinded. + /// + public static int DORewind(this AudioMixer target) + { + return DOTween.Rewind(target); + } + + /// + /// Smoothly rewinds all tweens that have this target as a reference + /// (meaning tweens that were started from this target, or that had this target added as an Id) + /// and returns the total number of tweens rewinded. + /// + public static int DOSmoothRewind(this AudioMixer target) + { + return DOTween.SmoothRewind(target); + } + + /// + /// Toggles the paused state (plays if it was paused, pauses if it was playing) of all tweens that have this target as a reference + /// (meaning tweens that were started from this target, or that had this target added as an Id) + /// and returns the total number of tweens involved. + /// + public static int DOTogglePause(this AudioMixer target) + { + return DOTween.TogglePause(target); + } + + #endregion + + #endregion +#endif + + #endregion + } +} +#endif diff --git a/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleAudio.cs.meta b/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleAudio.cs.meta new file mode 100644 index 00000000..50aa010f --- /dev/null +++ b/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleAudio.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b766d08851589514b97afb23c6f30a70 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleEPOOutline.cs b/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleEPOOutline.cs new file mode 100644 index 00000000..aff12356 --- /dev/null +++ b/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleEPOOutline.cs @@ -0,0 +1,142 @@ +using UnityEngine; + +#if false || EPO_DOTWEEN // MODULE_MARKER + +using EPOOutline; +using DG.Tweening.Plugins.Options; +using DG.Tweening; +using DG.Tweening.Core; + +namespace DG.Tweening +{ + public static class DOTweenModuleEPOOutline + { + public static int DOKill(this SerializedPass target, bool complete) + { + return DOTween.Kill(target, complete); + } + + public static TweenerCore DOFloat(this SerializedPass target, string propertyName, float endValue, float duration) + { + var tweener = DOTween.To(() => target.GetFloat(propertyName), x => target.SetFloat(propertyName, x), endValue, duration); + tweener.SetOptions(true).SetTarget(target); + return tweener; + } + + public static TweenerCore DOFade(this SerializedPass target, string propertyName, float endValue, float duration) + { + var tweener = DOTween.ToAlpha(() => target.GetColor(propertyName), x => target.SetColor(propertyName, x), endValue, duration); + tweener.SetOptions(true).SetTarget(target); + return tweener; + } + + public static TweenerCore DOColor(this SerializedPass target, string propertyName, Color endValue, float duration) + { + var tweener = DOTween.To(() => target.GetColor(propertyName), x => target.SetColor(propertyName, x), endValue, duration); + tweener.SetOptions(false).SetTarget(target); + return tweener; + } + + public static TweenerCore DOVector(this SerializedPass target, string propertyName, Vector4 endValue, float duration) + { + var tweener = DOTween.To(() => target.GetVector(propertyName), x => target.SetVector(propertyName, x), endValue, duration); + tweener.SetOptions(false).SetTarget(target); + return tweener; + } + + public static TweenerCore DOFloat(this SerializedPass target, int propertyId, float endValue, float duration) + { + var tweener = DOTween.To(() => target.GetFloat(propertyId), x => target.SetFloat(propertyId, x), endValue, duration); + tweener.SetOptions(true).SetTarget(target); + return tweener; + } + + public static TweenerCore DOFade(this SerializedPass target, int propertyId, float endValue, float duration) + { + var tweener = DOTween.ToAlpha(() => target.GetColor(propertyId), x => target.SetColor(propertyId, x), endValue, duration); + tweener.SetOptions(true).SetTarget(target); + return tweener; + } + + public static TweenerCore DOColor(this SerializedPass target, int propertyId, Color endValue, float duration) + { + var tweener = DOTween.To(() => target.GetColor(propertyId), x => target.SetColor(propertyId, x), endValue, duration); + tweener.SetOptions(false).SetTarget(target); + return tweener; + } + + public static TweenerCore DOVector(this SerializedPass target, int propertyId, Vector4 endValue, float duration) + { + var tweener = DOTween.To(() => target.GetVector(propertyId), x => target.SetVector(propertyId, x), endValue, duration); + tweener.SetOptions(false).SetTarget(target); + return tweener; + } + + public static int DOKill(this Outlinable.OutlineProperties target, bool complete = false) + { + return DOTween.Kill(target, complete); + } + + public static int DOKill(this Outliner target, bool complete = false) + { + return DOTween.Kill(target, complete); + } + + public static TweenerCore DOFade(this Outlinable.OutlineProperties target, float endValue, float duration) + { + var tweener = DOTween.ToAlpha(() => target.Color, x => target.Color = x, endValue, duration); + tweener.SetOptions(true).SetTarget(target); + return tweener; + } + + public static TweenerCore DOColor(this Outlinable.OutlineProperties target, Color endValue, float duration) + { + var tweener = DOTween.To(() => target.Color, x => target.Color = x, endValue, duration); + tweener.SetOptions(false).SetTarget(target); + return tweener; + } + + public static TweenerCore DODilateShift(this Outlinable.OutlineProperties target, float endValue, float duration, bool snapping = false) + { + var tweener = DOTween.To(() => target.DilateShift, x => target.DilateShift = x, endValue, duration); + tweener.SetOptions(snapping).SetTarget(target); + return tweener; + } + + public static TweenerCore DOBlurShift(this Outlinable.OutlineProperties target, float endValue, float duration, bool snapping = false) + { + var tweener = DOTween.To(() => target.BlurShift, x => target.BlurShift = x, endValue, duration); + tweener.SetOptions(snapping).SetTarget(target); + return tweener; + } + + public static TweenerCore DOBlurShift(this Outliner target, float endValue, float duration, bool snapping = false) + { + var tweener = DOTween.To(() => target.BlurShift, x => target.BlurShift = x, endValue, duration); + tweener.SetOptions(snapping).SetTarget(target); + return tweener; + } + + public static TweenerCore DODilateShift(this Outliner target, float endValue, float duration, bool snapping = false) + { + var tweener = DOTween.To(() => target.DilateShift, x => target.DilateShift = x, endValue, duration); + tweener.SetOptions(snapping).SetTarget(target); + return tweener; + } + + public static TweenerCore DOInfoRendererScale(this Outliner target, float endValue, float duration, bool snapping = false) + { + var tweener = DOTween.To(() => target.InfoRendererScale, x => target.InfoRendererScale = x, endValue, duration); + tweener.SetOptions(snapping).SetTarget(target); + return tweener; + } + + public static TweenerCore DOPrimaryRendererScale(this Outliner target, float endValue, float duration, bool snapping = false) + { + var tweener = DOTween.To(() => target.PrimaryRendererScale, x => target.PrimaryRendererScale = x, endValue, duration); + tweener.SetOptions(snapping).SetTarget(target); + return tweener; + } + } +} +#endif diff --git a/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleEPOOutline.cs.meta b/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleEPOOutline.cs.meta new file mode 100644 index 00000000..4b8991f5 --- /dev/null +++ b/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleEPOOutline.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: e944529dcaee98f4e9498d80e541d93e +timeCreated: 1602593330 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModulePhysics.cs b/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModulePhysics.cs new file mode 100644 index 00000000..08b07006 --- /dev/null +++ b/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModulePhysics.cs @@ -0,0 +1,216 @@ +// Author: Daniele Giardini - http://www.demigiant.com +// Created: 2018/07/13 + +#if true // MODULE_MARKER +using System; +using DG.Tweening.Core; +using DG.Tweening.Core.Enums; +using DG.Tweening.Plugins; +using DG.Tweening.Plugins.Core.PathCore; +using DG.Tweening.Plugins.Options; +using UnityEngine; + +#pragma warning disable 1591 +namespace DG.Tweening +{ + public static class DOTweenModulePhysics + { + #region Shortcuts + + #region Rigidbody + + /// Tweens a Rigidbody's position to the given value. + /// Also stores the rigidbody as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + /// If TRUE the tween will smoothly snap all values to integers + public static TweenerCore DOMove(this Rigidbody target, Vector3 endValue, float duration, bool snapping = false) + { + TweenerCore t = DOTween.To(() => target.position, target.MovePosition, endValue, duration); + t.SetOptions(snapping).SetTarget(target); + return t; + } + + /// Tweens a Rigidbody's X position to the given value. + /// Also stores the rigidbody as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + /// If TRUE the tween will smoothly snap all values to integers + public static TweenerCore DOMoveX(this Rigidbody target, float endValue, float duration, bool snapping = false) + { + TweenerCore t = DOTween.To(() => target.position, target.MovePosition, new Vector3(endValue, 0, 0), duration); + t.SetOptions(AxisConstraint.X, snapping).SetTarget(target); + return t; + } + + /// Tweens a Rigidbody's Y position to the given value. + /// Also stores the rigidbody as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + /// If TRUE the tween will smoothly snap all values to integers + public static TweenerCore DOMoveY(this Rigidbody target, float endValue, float duration, bool snapping = false) + { + TweenerCore t = DOTween.To(() => target.position, target.MovePosition, new Vector3(0, endValue, 0), duration); + t.SetOptions(AxisConstraint.Y, snapping).SetTarget(target); + return t; + } + + /// Tweens a Rigidbody's Z position to the given value. + /// Also stores the rigidbody as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + /// If TRUE the tween will smoothly snap all values to integers + public static TweenerCore DOMoveZ(this Rigidbody target, float endValue, float duration, bool snapping = false) + { + TweenerCore t = DOTween.To(() => target.position, target.MovePosition, new Vector3(0, 0, endValue), duration); + t.SetOptions(AxisConstraint.Z, snapping).SetTarget(target); + return t; + } + + /// Tweens a Rigidbody's rotation to the given value. + /// Also stores the rigidbody as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + /// Rotation mode + public static TweenerCore DORotate(this Rigidbody target, Vector3 endValue, float duration, RotateMode mode = RotateMode.Fast) + { + TweenerCore t = DOTween.To(() => target.rotation, target.MoveRotation, endValue, duration); + t.SetTarget(target); + t.plugOptions.rotateMode = mode; + return t; + } + + /// Tweens a Rigidbody's rotation so that it will look towards the given position. + /// Also stores the rigidbody as the tween's target so it can be used for filtered operations + /// The position to look atThe duration of the tween + /// Eventual axis constraint for the rotation + /// The vector that defines in which direction up is (default: Vector3.up) + public static TweenerCore DOLookAt(this Rigidbody target, Vector3 towards, float duration, AxisConstraint axisConstraint = AxisConstraint.None, Vector3? up = null) + { + TweenerCore t = DOTween.To(() => target.rotation, target.MoveRotation, towards, duration) + .SetTarget(target).SetSpecialStartupMode(SpecialStartupMode.SetLookAt); + t.plugOptions.axisConstraint = axisConstraint; + t.plugOptions.up = (up == null) ? Vector3.up : (Vector3)up; + return t; + } + + #region Special + + /// Tweens a Rigidbody's position to the given value, while also applying a jump effect along the Y axis. + /// Returns a Sequence instead of a Tweener. + /// Also stores the Rigidbody as the tween's target so it can be used for filtered operations + /// The end value to reach + /// Power of the jump (the max height of the jump is represented by this plus the final Y offset) + /// Total number of jumps + /// The duration of the tween + /// If TRUE the tween will smoothly snap all values to integers + public static Sequence DOJump(this Rigidbody target, Vector3 endValue, float jumpPower, int numJumps, float duration, bool snapping = false) + { + if (numJumps < 1) numJumps = 1; + float startPosY = 0; + float offsetY = -1; + bool offsetYSet = false; + Sequence s = DOTween.Sequence(); + Tween yTween = DOTween.To(() => target.position, target.MovePosition, new Vector3(0, jumpPower, 0), duration / (numJumps * 2)) + .SetOptions(AxisConstraint.Y, snapping).SetEase(Ease.OutQuad).SetRelative() + .SetLoops(numJumps * 2, LoopType.Yoyo) + .OnStart(() => startPosY = target.position.y); + s.Append(DOTween.To(() => target.position, target.MovePosition, new Vector3(endValue.x, 0, 0), duration) + .SetOptions(AxisConstraint.X, snapping).SetEase(Ease.Linear) + ).Join(DOTween.To(() => target.position, target.MovePosition, new Vector3(0, 0, endValue.z), duration) + .SetOptions(AxisConstraint.Z, snapping).SetEase(Ease.Linear) + ).Join(yTween) + .SetTarget(target).SetEase(DOTween.defaultEaseType); + yTween.OnUpdate(() => { + if (!offsetYSet) { + offsetYSet = true; + offsetY = s.isRelative ? endValue.y : endValue.y - startPosY; + } + Vector3 pos = target.position; + pos.y += DOVirtual.EasedValue(0, offsetY, yTween.ElapsedPercentage(), Ease.OutQuad); + target.MovePosition(pos); + }); + return s; + } + + /// Tweens a Rigidbody's position through the given path waypoints, using the chosen path algorithm. + /// Also stores the Rigidbody as the tween's target so it can be used for filtered operations. + /// NOTE: to tween a rigidbody correctly it should be set to kinematic at least while being tweened. + /// BEWARE: doesn't work on Windows Phone store (waiting for Unity to fix their own bug). + /// If you plan to publish there you should use a regular transform.DOPath. + /// The waypoints to go through + /// The duration of the tween + /// The type of path: Linear (straight path), CatmullRom (curved CatmullRom path) or CubicBezier (curved with control points) + /// The path mode: 3D, side-scroller 2D, top-down 2D + /// The resolution of the path (useless in case of Linear paths): higher resolutions make for more detailed curved paths but are more expensive. + /// Defaults to 10, but a value of 5 is usually enough if you don't have dramatic long curves between waypoints + /// The color of the path (shown when gizmos are active in the Play panel and the tween is running) + public static TweenerCore DOPath( + this Rigidbody target, Vector3[] path, float duration, PathType pathType = PathType.Linear, + PathMode pathMode = PathMode.Full3D, int resolution = 10, Color? gizmoColor = null + ) + { + if (resolution < 1) resolution = 1; + TweenerCore t = DOTween.To(PathPlugin.Get(), () => target.position, target.MovePosition, new Path(pathType, path, resolution, gizmoColor), duration) + .SetTarget(target).SetUpdate(UpdateType.Fixed); + + t.plugOptions.isRigidbody = true; + t.plugOptions.mode = pathMode; + return t; + } + /// Tweens a Rigidbody's localPosition through the given path waypoints, using the chosen path algorithm. + /// Also stores the Rigidbody as the tween's target so it can be used for filtered operations + /// NOTE: to tween a rigidbody correctly it should be set to kinematic at least while being tweened. + /// BEWARE: doesn't work on Windows Phone store (waiting for Unity to fix their own bug). + /// If you plan to publish there you should use a regular transform.DOLocalPath. + /// The waypoint to go through + /// The duration of the tween + /// The type of path: Linear (straight path), CatmullRom (curved CatmullRom path) or CubicBezier (curved with control points) + /// The path mode: 3D, side-scroller 2D, top-down 2D + /// The resolution of the path: higher resolutions make for more detailed curved paths but are more expensive. + /// Defaults to 10, but a value of 5 is usually enough if you don't have dramatic long curves between waypoints + /// The color of the path (shown when gizmos are active in the Play panel and the tween is running) + public static TweenerCore DOLocalPath( + this Rigidbody target, Vector3[] path, float duration, PathType pathType = PathType.Linear, + PathMode pathMode = PathMode.Full3D, int resolution = 10, Color? gizmoColor = null + ) + { + if (resolution < 1) resolution = 1; + Transform trans = target.transform; + TweenerCore t = DOTween.To(PathPlugin.Get(), () => trans.localPosition, x => target.MovePosition(trans.parent == null ? x : trans.parent.TransformPoint(x)), new Path(pathType, path, resolution, gizmoColor), duration) + .SetTarget(target).SetUpdate(UpdateType.Fixed); + + t.plugOptions.isRigidbody = true; + t.plugOptions.mode = pathMode; + t.plugOptions.useLocalPosition = true; + return t; + } + // Used by path editor when creating the actual tween, so it can pass a pre-compiled path + internal static TweenerCore DOPath( + this Rigidbody target, Path path, float duration, PathMode pathMode = PathMode.Full3D + ) + { + TweenerCore t = DOTween.To(PathPlugin.Get(), () => target.position, target.MovePosition, path, duration) + .SetTarget(target); + + t.plugOptions.isRigidbody = true; + t.plugOptions.mode = pathMode; + return t; + } + internal static TweenerCore DOLocalPath( + this Rigidbody target, Path path, float duration, PathMode pathMode = PathMode.Full3D + ) + { + Transform trans = target.transform; + TweenerCore t = DOTween.To(PathPlugin.Get(), () => trans.localPosition, x => target.MovePosition(trans.parent == null ? x : trans.parent.TransformPoint(x)), path, duration) + .SetTarget(target); + + t.plugOptions.isRigidbody = true; + t.plugOptions.mode = pathMode; + t.plugOptions.useLocalPosition = true; + return t; + } + + #endregion + + #endregion + + #endregion + } +} +#endif diff --git a/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModulePhysics.cs.meta b/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModulePhysics.cs.meta new file mode 100644 index 00000000..0ce0d755 --- /dev/null +++ b/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModulePhysics.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: dae9aa560b4242648a3affa2bfabc365 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModulePhysics2D.cs b/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModulePhysics2D.cs new file mode 100644 index 00000000..d01f7289 --- /dev/null +++ b/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModulePhysics2D.cs @@ -0,0 +1,193 @@ +// Author: Daniele Giardini - http://www.demigiant.com +// Created: 2018/07/13 + +#if true && (UNITY_4_3 || UNITY_4_4 || UNITY_4_5 || UNITY_4_6 || UNITY_5 || UNITY_2017_1_OR_NEWER) // MODULE_MARKER +using System; +using DG.Tweening.Core; +using DG.Tweening.Plugins; +using DG.Tweening.Plugins.Core.PathCore; +using DG.Tweening.Plugins.Options; +using UnityEngine; + +#pragma warning disable 1591 +namespace DG.Tweening +{ + public static class DOTweenModulePhysics2D + { + #region Shortcuts + + #region Rigidbody2D Shortcuts + + /// Tweens a Rigidbody2D's position to the given value. + /// Also stores the Rigidbody2D as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + /// If TRUE the tween will smoothly snap all values to integers + public static TweenerCore DOMove(this Rigidbody2D target, Vector2 endValue, float duration, bool snapping = false) + { + TweenerCore t = DOTween.To(() => target.position, target.MovePosition, endValue, duration); + t.SetOptions(snapping).SetTarget(target); + return t; + } + + /// Tweens a Rigidbody2D's X position to the given value. + /// Also stores the Rigidbody2D as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + /// If TRUE the tween will smoothly snap all values to integers + public static TweenerCore DOMoveX(this Rigidbody2D target, float endValue, float duration, bool snapping = false) + { + TweenerCore t = DOTween.To(() => target.position, target.MovePosition, new Vector2(endValue, 0), duration); + t.SetOptions(AxisConstraint.X, snapping).SetTarget(target); + return t; + } + + /// Tweens a Rigidbody2D's Y position to the given value. + /// Also stores the Rigidbody2D as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + /// If TRUE the tween will smoothly snap all values to integers + public static TweenerCore DOMoveY(this Rigidbody2D target, float endValue, float duration, bool snapping = false) + { + TweenerCore t = DOTween.To(() => target.position, target.MovePosition, new Vector2(0, endValue), duration); + t.SetOptions(AxisConstraint.Y, snapping).SetTarget(target); + return t; + } + + /// Tweens a Rigidbody2D's rotation to the given value. + /// Also stores the Rigidbody2D as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + public static TweenerCore DORotate(this Rigidbody2D target, float endValue, float duration) + { + TweenerCore t = DOTween.To(() => target.rotation, target.MoveRotation, endValue, duration); + t.SetTarget(target); + return t; + } + + #region Special + + /// Tweens a Rigidbody2D's position to the given value, while also applying a jump effect along the Y axis. + /// Returns a Sequence instead of a Tweener. + /// Also stores the Rigidbody2D as the tween's target so it can be used for filtered operations. + /// IMPORTANT: a rigidbody2D can't be animated in a jump arc using MovePosition, so the tween will directly set the position + /// The end value to reach + /// Power of the jump (the max height of the jump is represented by this plus the final Y offset) + /// Total number of jumps + /// The duration of the tween + /// If TRUE the tween will smoothly snap all values to integers + public static Sequence DOJump(this Rigidbody2D target, Vector2 endValue, float jumpPower, int numJumps, float duration, bool snapping = false) + { + if (numJumps < 1) numJumps = 1; + float startPosY = 0; + float offsetY = -1; + bool offsetYSet = false; + Sequence s = DOTween.Sequence(); + Tween yTween = DOTween.To(() => target.position, x => target.position = x, new Vector2(0, jumpPower), duration / (numJumps * 2)) + .SetOptions(AxisConstraint.Y, snapping).SetEase(Ease.OutQuad).SetRelative() + .SetLoops(numJumps * 2, LoopType.Yoyo) + .OnStart(() => startPosY = target.position.y); + s.Append(DOTween.To(() => target.position, x => target.position = x, new Vector2(endValue.x, 0), duration) + .SetOptions(AxisConstraint.X, snapping).SetEase(Ease.Linear) + ).Join(yTween) + .SetTarget(target).SetEase(DOTween.defaultEaseType); + yTween.OnUpdate(() => { + if (!offsetYSet) { + offsetYSet = true; + offsetY = s.isRelative ? endValue.y : endValue.y - startPosY; + } + Vector3 pos = target.position; + pos.y += DOVirtual.EasedValue(0, offsetY, yTween.ElapsedPercentage(), Ease.OutQuad); + target.MovePosition(pos); + }); + return s; + } + + /// Tweens a Rigidbody2D's position through the given path waypoints, using the chosen path algorithm. + /// Also stores the Rigidbody2D as the tween's target so it can be used for filtered operations. + /// NOTE: to tween a Rigidbody2D correctly it should be set to kinematic at least while being tweened. + /// BEWARE: doesn't work on Windows Phone store (waiting for Unity to fix their own bug). + /// If you plan to publish there you should use a regular transform.DOPath. + /// The waypoints to go through + /// The duration of the tween + /// The type of path: Linear (straight path), CatmullRom (curved CatmullRom path) or CubicBezier (curved with control points) + /// The path mode: 3D, side-scroller 2D, top-down 2D + /// The resolution of the path (useless in case of Linear paths): higher resolutions make for more detailed curved paths but are more expensive. + /// Defaults to 10, but a value of 5 is usually enough if you don't have dramatic long curves between waypoints + /// The color of the path (shown when gizmos are active in the Play panel and the tween is running) + public static TweenerCore DOPath( + this Rigidbody2D target, Vector2[] path, float duration, PathType pathType = PathType.Linear, + PathMode pathMode = PathMode.Full3D, int resolution = 10, Color? gizmoColor = null + ) + { + if (resolution < 1) resolution = 1; + int len = path.Length; + Vector3[] path3D = new Vector3[len]; + for (int i = 0; i < len; ++i) path3D[i] = path[i]; + TweenerCore t = DOTween.To(PathPlugin.Get(), () => target.position, x => target.MovePosition(x), new Path(pathType, path3D, resolution, gizmoColor), duration) + .SetTarget(target).SetUpdate(UpdateType.Fixed); + + t.plugOptions.isRigidbody2D = true; + t.plugOptions.mode = pathMode; + return t; + } + /// Tweens a Rigidbody2D's localPosition through the given path waypoints, using the chosen path algorithm. + /// Also stores the Rigidbody2D as the tween's target so it can be used for filtered operations + /// NOTE: to tween a Rigidbody2D correctly it should be set to kinematic at least while being tweened. + /// BEWARE: doesn't work on Windows Phone store (waiting for Unity to fix their own bug). + /// If you plan to publish there you should use a regular transform.DOLocalPath. + /// The waypoint to go through + /// The duration of the tween + /// The type of path: Linear (straight path), CatmullRom (curved CatmullRom path) or CubicBezier (curved with control points) + /// The path mode: 3D, side-scroller 2D, top-down 2D + /// The resolution of the path: higher resolutions make for more detailed curved paths but are more expensive. + /// Defaults to 10, but a value of 5 is usually enough if you don't have dramatic long curves between waypoints + /// The color of the path (shown when gizmos are active in the Play panel and the tween is running) + public static TweenerCore DOLocalPath( + this Rigidbody2D target, Vector2[] path, float duration, PathType pathType = PathType.Linear, + PathMode pathMode = PathMode.Full3D, int resolution = 10, Color? gizmoColor = null + ) + { + if (resolution < 1) resolution = 1; + int len = path.Length; + Vector3[] path3D = new Vector3[len]; + for (int i = 0; i < len; ++i) path3D[i] = path[i]; + Transform trans = target.transform; + TweenerCore t = DOTween.To(PathPlugin.Get(), () => trans.localPosition, x => target.MovePosition(trans.parent == null ? x : trans.parent.TransformPoint(x)), new Path(pathType, path3D, resolution, gizmoColor), duration) + .SetTarget(target).SetUpdate(UpdateType.Fixed); + + t.plugOptions.isRigidbody2D = true; + t.plugOptions.mode = pathMode; + t.plugOptions.useLocalPosition = true; + return t; + } + // Used by path editor when creating the actual tween, so it can pass a pre-compiled path + internal static TweenerCore DOPath( + this Rigidbody2D target, Path path, float duration, PathMode pathMode = PathMode.Full3D + ) + { + TweenerCore t = DOTween.To(PathPlugin.Get(), () => target.position, x => target.MovePosition(x), path, duration) + .SetTarget(target); + + t.plugOptions.isRigidbody2D = true; + t.plugOptions.mode = pathMode; + return t; + } + internal static TweenerCore DOLocalPath( + this Rigidbody2D target, Path path, float duration, PathMode pathMode = PathMode.Full3D + ) + { + Transform trans = target.transform; + TweenerCore t = DOTween.To(PathPlugin.Get(), () => trans.localPosition, x => target.MovePosition(trans.parent == null ? x : trans.parent.TransformPoint(x)), path, duration) + .SetTarget(target); + + t.plugOptions.isRigidbody2D = true; + t.plugOptions.mode = pathMode; + t.plugOptions.useLocalPosition = true; + return t; + } + + #endregion + + #endregion + + #endregion + } +} +#endif diff --git a/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModulePhysics2D.cs.meta b/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModulePhysics2D.cs.meta new file mode 100644 index 00000000..ca9ed299 --- /dev/null +++ b/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModulePhysics2D.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 230fe34542e175245ba74b4659dae700 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleSprite.cs b/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleSprite.cs new file mode 100644 index 00000000..549fff39 --- /dev/null +++ b/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleSprite.cs @@ -0,0 +1,93 @@ +// Author: Daniele Giardini - http://www.demigiant.com +// Created: 2018/07/13 + +#if true && (UNITY_4_3 || UNITY_4_4 || UNITY_4_5 || UNITY_4_6 || UNITY_5 || UNITY_2017_1_OR_NEWER) // MODULE_MARKER +using System; +using UnityEngine; +using DG.Tweening.Core; +using DG.Tweening.Plugins.Options; + +#pragma warning disable 1591 +namespace DG.Tweening +{ + public static class DOTweenModuleSprite + { + #region Shortcuts + + #region SpriteRenderer + + /// Tweens a SpriteRenderer's color to the given value. + /// Also stores the spriteRenderer as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + public static TweenerCore DOColor(this SpriteRenderer target, Color endValue, float duration) + { + TweenerCore t = DOTween.To(() => target.color, x => target.color = x, endValue, duration); + t.SetTarget(target); + return t; + } + + /// Tweens a Material's alpha color to the given value. + /// Also stores the spriteRenderer as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + public static TweenerCore DOFade(this SpriteRenderer target, float endValue, float duration) + { + TweenerCore t = DOTween.ToAlpha(() => target.color, x => target.color = x, endValue, duration); + t.SetTarget(target); + return t; + } + + /// Tweens a SpriteRenderer's color using the given gradient + /// (NOTE 1: only uses the colors of the gradient, not the alphas - NOTE 2: creates a Sequence, not a Tweener). + /// Also stores the image as the tween's target so it can be used for filtered operations + /// The gradient to useThe duration of the tween + public static Sequence DOGradientColor(this SpriteRenderer target, Gradient gradient, float duration) + { + Sequence s = DOTween.Sequence(); + GradientColorKey[] colors = gradient.colorKeys; + int len = colors.Length; + for (int i = 0; i < len; ++i) { + GradientColorKey c = colors[i]; + if (i == 0 && c.time <= 0) { + target.color = c.color; + continue; + } + float colorDuration = i == len - 1 + ? duration - s.Duration(false) // Verifies that total duration is correct + : duration * (i == 0 ? c.time : c.time - colors[i - 1].time); + s.Append(target.DOColor(c.color, colorDuration).SetEase(Ease.Linear)); + } + s.SetTarget(target); + return s; + } + + #endregion + + #region Blendables + + #region SpriteRenderer + + /// Tweens a SpriteRenderer's color to the given value, + /// in a way that allows other DOBlendableColor tweens to work together on the same target, + /// instead than fight each other as multiple DOColor would do. + /// Also stores the SpriteRenderer as the tween's target so it can be used for filtered operations + /// The value to tween toThe duration of the tween + public static Tweener DOBlendableColor(this SpriteRenderer target, Color endValue, float duration) + { + endValue = endValue - target.color; + Color to = new Color(0, 0, 0, 0); + return DOTween.To(() => to, x => { + Color diff = x - to; + to = x; + target.color += diff; + }, endValue, duration) + .Blendable().SetTarget(target); + } + + #endregion + + #endregion + + #endregion + } +} +#endif diff --git a/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleSprite.cs.meta b/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleSprite.cs.meta new file mode 100644 index 00000000..a0c67c42 --- /dev/null +++ b/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleSprite.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 188918ab119d93148aa0de59ccf5286b +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleUI.cs b/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleUI.cs new file mode 100644 index 00000000..dc24ebf0 --- /dev/null +++ b/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleUI.cs @@ -0,0 +1,660 @@ +// Author: Daniele Giardini - http://www.demigiant.com +// Created: 2018/07/13 + +#if true && (UNITY_4_6 || UNITY_5 || UNITY_2017_1_OR_NEWER) // MODULE_MARKER + +using System; +using System.Globalization; +using UnityEngine; +using UnityEngine.UI; +using DG.Tweening.Core; +using DG.Tweening.Core.Enums; +using DG.Tweening.Plugins; +using DG.Tweening.Plugins.Options; +using Outline = UnityEngine.UI.Outline; +using Text = UnityEngine.UI.Text; + +#pragma warning disable 1591 +namespace DG.Tweening +{ + public static class DOTweenModuleUI + { + #region Shortcuts + + #region CanvasGroup + + /// Tweens a CanvasGroup's alpha color to the given value. + /// Also stores the canvasGroup as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + public static TweenerCore DOFade(this CanvasGroup target, float endValue, float duration) + { + TweenerCore t = DOTween.To(() => target.alpha, x => target.alpha = x, endValue, duration); + t.SetTarget(target); + return t; + } + + #endregion + + #region Graphic + + /// Tweens an Graphic's color to the given value. + /// Also stores the image as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + public static TweenerCore DOColor(this Graphic target, Color endValue, float duration) + { + TweenerCore t = DOTween.To(() => target.color, x => target.color = x, endValue, duration); + t.SetTarget(target); + return t; + } + + /// Tweens an Graphic's alpha color to the given value. + /// Also stores the image as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + public static TweenerCore DOFade(this Graphic target, float endValue, float duration) + { + TweenerCore t = DOTween.ToAlpha(() => target.color, x => target.color = x, endValue, duration); + t.SetTarget(target); + return t; + } + + #endregion + + #region Image + + /// Tweens an Image's color to the given value. + /// Also stores the image as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + public static TweenerCore DOColor(this Image target, Color endValue, float duration) + { + TweenerCore t = DOTween.To(() => target.color, x => target.color = x, endValue, duration); + t.SetTarget(target); + return t; + } + + /// Tweens an Image's alpha color to the given value. + /// Also stores the image as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + public static TweenerCore DOFade(this Image target, float endValue, float duration) + { + TweenerCore t = DOTween.ToAlpha(() => target.color, x => target.color = x, endValue, duration); + t.SetTarget(target); + return t; + } + + /// Tweens an Image's fillAmount to the given value. + /// Also stores the image as the tween's target so it can be used for filtered operations + /// The end value to reach (0 to 1)The duration of the tween + public static TweenerCore DOFillAmount(this Image target, float endValue, float duration) + { + if (endValue > 1) endValue = 1; + else if (endValue < 0) endValue = 0; + TweenerCore t = DOTween.To(() => target.fillAmount, x => target.fillAmount = x, endValue, duration); + t.SetTarget(target); + return t; + } + + /// Tweens an Image's colors using the given gradient + /// (NOTE 1: only uses the colors of the gradient, not the alphas - NOTE 2: creates a Sequence, not a Tweener). + /// Also stores the image as the tween's target so it can be used for filtered operations + /// The gradient to useThe duration of the tween + public static Sequence DOGradientColor(this Image target, Gradient gradient, float duration) + { + Sequence s = DOTween.Sequence(); + GradientColorKey[] colors = gradient.colorKeys; + int len = colors.Length; + for (int i = 0; i < len; ++i) { + GradientColorKey c = colors[i]; + if (i == 0 && c.time <= 0) { + target.color = c.color; + continue; + } + float colorDuration = i == len - 1 + ? duration - s.Duration(false) // Verifies that total duration is correct + : duration * (i == 0 ? c.time : c.time - colors[i - 1].time); + s.Append(target.DOColor(c.color, colorDuration).SetEase(Ease.Linear)); + } + s.SetTarget(target); + return s; + } + + #endregion + + #region LayoutElement + + /// Tweens an LayoutElement's flexibleWidth/Height to the given value. + /// Also stores the LayoutElement as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + /// If TRUE the tween will smoothly snap all values to integers + public static TweenerCore DOFlexibleSize(this LayoutElement target, Vector2 endValue, float duration, bool snapping = false) + { + TweenerCore t = DOTween.To(() => new Vector2(target.flexibleWidth, target.flexibleHeight), x => { + target.flexibleWidth = x.x; + target.flexibleHeight = x.y; + }, endValue, duration); + t.SetOptions(snapping).SetTarget(target); + return t; + } + + /// Tweens an LayoutElement's minWidth/Height to the given value. + /// Also stores the LayoutElement as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + /// If TRUE the tween will smoothly snap all values to integers + public static TweenerCore DOMinSize(this LayoutElement target, Vector2 endValue, float duration, bool snapping = false) + { + TweenerCore t = DOTween.To(() => new Vector2(target.minWidth, target.minHeight), x => { + target.minWidth = x.x; + target.minHeight = x.y; + }, endValue, duration); + t.SetOptions(snapping).SetTarget(target); + return t; + } + + /// Tweens an LayoutElement's preferredWidth/Height to the given value. + /// Also stores the LayoutElement as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + /// If TRUE the tween will smoothly snap all values to integers + public static TweenerCore DOPreferredSize(this LayoutElement target, Vector2 endValue, float duration, bool snapping = false) + { + TweenerCore t = DOTween.To(() => new Vector2(target.preferredWidth, target.preferredHeight), x => { + target.preferredWidth = x.x; + target.preferredHeight = x.y; + }, endValue, duration); + t.SetOptions(snapping).SetTarget(target); + return t; + } + + #endregion + + #region Outline + + /// Tweens a Outline's effectColor to the given value. + /// Also stores the Outline as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + public static TweenerCore DOColor(this Outline target, Color endValue, float duration) + { + TweenerCore t = DOTween.To(() => target.effectColor, x => target.effectColor = x, endValue, duration); + t.SetTarget(target); + return t; + } + + /// Tweens a Outline's effectColor alpha to the given value. + /// Also stores the Outline as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + public static TweenerCore DOFade(this Outline target, float endValue, float duration) + { + TweenerCore t = DOTween.ToAlpha(() => target.effectColor, x => target.effectColor = x, endValue, duration); + t.SetTarget(target); + return t; + } + + /// Tweens a Outline's effectDistance to the given value. + /// Also stores the Outline as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + public static TweenerCore DOScale(this Outline target, Vector2 endValue, float duration) + { + TweenerCore t = DOTween.To(() => target.effectDistance, x => target.effectDistance = x, endValue, duration); + t.SetTarget(target); + return t; + } + + #endregion + + #region RectTransform + + /// Tweens a RectTransform's anchoredPosition to the given value. + /// Also stores the RectTransform as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + /// If TRUE the tween will smoothly snap all values to integers + public static TweenerCore DOAnchorPos(this RectTransform target, Vector2 endValue, float duration, bool snapping = false) + { + TweenerCore t = DOTween.To(() => target.anchoredPosition, x => target.anchoredPosition = x, endValue, duration); + t.SetOptions(snapping).SetTarget(target); + return t; + } + /// Tweens a RectTransform's anchoredPosition X to the given value. + /// Also stores the RectTransform as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + /// If TRUE the tween will smoothly snap all values to integers + public static TweenerCore DOAnchorPosX(this RectTransform target, float endValue, float duration, bool snapping = false) + { + TweenerCore t = DOTween.To(() => target.anchoredPosition, x => target.anchoredPosition = x, new Vector2(endValue, 0), duration); + t.SetOptions(AxisConstraint.X, snapping).SetTarget(target); + return t; + } + /// Tweens a RectTransform's anchoredPosition Y to the given value. + /// Also stores the RectTransform as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + /// If TRUE the tween will smoothly snap all values to integers + public static TweenerCore DOAnchorPosY(this RectTransform target, float endValue, float duration, bool snapping = false) + { + TweenerCore t = DOTween.To(() => target.anchoredPosition, x => target.anchoredPosition = x, new Vector2(0, endValue), duration); + t.SetOptions(AxisConstraint.Y, snapping).SetTarget(target); + return t; + } + + /// Tweens a RectTransform's anchoredPosition3D to the given value. + /// Also stores the RectTransform as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + /// If TRUE the tween will smoothly snap all values to integers + public static TweenerCore DOAnchorPos3D(this RectTransform target, Vector3 endValue, float duration, bool snapping = false) + { + TweenerCore t = DOTween.To(() => target.anchoredPosition3D, x => target.anchoredPosition3D = x, endValue, duration); + t.SetOptions(snapping).SetTarget(target); + return t; + } + /// Tweens a RectTransform's anchoredPosition3D X to the given value. + /// Also stores the RectTransform as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + /// If TRUE the tween will smoothly snap all values to integers + public static TweenerCore DOAnchorPos3DX(this RectTransform target, float endValue, float duration, bool snapping = false) + { + TweenerCore t = DOTween.To(() => target.anchoredPosition3D, x => target.anchoredPosition3D = x, new Vector3(endValue, 0, 0), duration); + t.SetOptions(AxisConstraint.X, snapping).SetTarget(target); + return t; + } + /// Tweens a RectTransform's anchoredPosition3D Y to the given value. + /// Also stores the RectTransform as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + /// If TRUE the tween will smoothly snap all values to integers + public static TweenerCore DOAnchorPos3DY(this RectTransform target, float endValue, float duration, bool snapping = false) + { + TweenerCore t = DOTween.To(() => target.anchoredPosition3D, x => target.anchoredPosition3D = x, new Vector3(0, endValue, 0), duration); + t.SetOptions(AxisConstraint.Y, snapping).SetTarget(target); + return t; + } + /// Tweens a RectTransform's anchoredPosition3D Z to the given value. + /// Also stores the RectTransform as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + /// If TRUE the tween will smoothly snap all values to integers + public static TweenerCore DOAnchorPos3DZ(this RectTransform target, float endValue, float duration, bool snapping = false) + { + TweenerCore t = DOTween.To(() => target.anchoredPosition3D, x => target.anchoredPosition3D = x, new Vector3(0, 0, endValue), duration); + t.SetOptions(AxisConstraint.Z, snapping).SetTarget(target); + return t; + } + + /// Tweens a RectTransform's anchorMax to the given value. + /// Also stores the RectTransform as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + /// If TRUE the tween will smoothly snap all values to integers + public static TweenerCore DOAnchorMax(this RectTransform target, Vector2 endValue, float duration, bool snapping = false) + { + TweenerCore t = DOTween.To(() => target.anchorMax, x => target.anchorMax = x, endValue, duration); + t.SetOptions(snapping).SetTarget(target); + return t; + } + + /// Tweens a RectTransform's anchorMin to the given value. + /// Also stores the RectTransform as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + /// If TRUE the tween will smoothly snap all values to integers + public static TweenerCore DOAnchorMin(this RectTransform target, Vector2 endValue, float duration, bool snapping = false) + { + TweenerCore t = DOTween.To(() => target.anchorMin, x => target.anchorMin = x, endValue, duration); + t.SetOptions(snapping).SetTarget(target); + return t; + } + + /// Tweens a RectTransform's pivot to the given value. + /// Also stores the RectTransform as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + public static TweenerCore DOPivot(this RectTransform target, Vector2 endValue, float duration) + { + TweenerCore t = DOTween.To(() => target.pivot, x => target.pivot = x, endValue, duration); + t.SetTarget(target); + return t; + } + /// Tweens a RectTransform's pivot X to the given value. + /// Also stores the RectTransform as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + public static TweenerCore DOPivotX(this RectTransform target, float endValue, float duration) + { + TweenerCore t = DOTween.To(() => target.pivot, x => target.pivot = x, new Vector2(endValue, 0), duration); + t.SetOptions(AxisConstraint.X).SetTarget(target); + return t; + } + /// Tweens a RectTransform's pivot Y to the given value. + /// Also stores the RectTransform as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + public static TweenerCore DOPivotY(this RectTransform target, float endValue, float duration) + { + TweenerCore t = DOTween.To(() => target.pivot, x => target.pivot = x, new Vector2(0, endValue), duration); + t.SetOptions(AxisConstraint.Y).SetTarget(target); + return t; + } + + /// Tweens a RectTransform's sizeDelta to the given value. + /// Also stores the RectTransform as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + /// If TRUE the tween will smoothly snap all values to integers + public static TweenerCore DOSizeDelta(this RectTransform target, Vector2 endValue, float duration, bool snapping = false) + { + TweenerCore t = DOTween.To(() => target.sizeDelta, x => target.sizeDelta = x, endValue, duration); + t.SetOptions(snapping).SetTarget(target); + return t; + } + + /// Punches a RectTransform's anchoredPosition towards the given direction and then back to the starting one + /// as if it was connected to the starting position via an elastic. + /// Also stores the RectTransform as the tween's target so it can be used for filtered operations + /// The direction and strength of the punch (added to the RectTransform's current position) + /// The duration of the tween + /// Indicates how much will the punch vibrate + /// Represents how much (0 to 1) the vector will go beyond the starting position when bouncing backwards. + /// 1 creates a full oscillation between the punch direction and the opposite direction, + /// while 0 oscillates only between the punch and the start position + /// If TRUE the tween will smoothly snap all values to integers + public static Tweener DOPunchAnchorPos(this RectTransform target, Vector2 punch, float duration, int vibrato = 10, float elasticity = 1, bool snapping = false) + { + return DOTween.Punch(() => target.anchoredPosition, x => target.anchoredPosition = x, punch, duration, vibrato, elasticity) + .SetTarget(target).SetOptions(snapping); + } + + /// Shakes a RectTransform's anchoredPosition with the given values. + /// Also stores the RectTransform as the tween's target so it can be used for filtered operations + /// The duration of the tween + /// The shake strength + /// Indicates how much will the shake vibrate + /// Indicates how much the shake will be random (0 to 180 - values higher than 90 kind of suck, so beware). + /// Setting it to 0 will shake along a single direction. + /// If TRUE the tween will smoothly snap all values to integers + /// If TRUE the shake will automatically fadeOut smoothly within the tween's duration, otherwise it will not + public static Tweener DOShakeAnchorPos(this RectTransform target, float duration, float strength = 100, int vibrato = 10, float randomness = 90, bool snapping = false, bool fadeOut = true) + { + return DOTween.Shake(() => target.anchoredPosition, x => target.anchoredPosition = x, duration, strength, vibrato, randomness, true, fadeOut) + .SetTarget(target).SetSpecialStartupMode(SpecialStartupMode.SetShake).SetOptions(snapping); + } + /// Shakes a RectTransform's anchoredPosition with the given values. + /// Also stores the RectTransform as the tween's target so it can be used for filtered operations + /// The duration of the tween + /// The shake strength on each axis + /// Indicates how much will the shake vibrate + /// Indicates how much the shake will be random (0 to 180 - values higher than 90 kind of suck, so beware). + /// Setting it to 0 will shake along a single direction. + /// If TRUE the tween will smoothly snap all values to integers + /// If TRUE the shake will automatically fadeOut smoothly within the tween's duration, otherwise it will not + public static Tweener DOShakeAnchorPos(this RectTransform target, float duration, Vector2 strength, int vibrato = 10, float randomness = 90, bool snapping = false, bool fadeOut = true) + { + return DOTween.Shake(() => target.anchoredPosition, x => target.anchoredPosition = x, duration, strength, vibrato, randomness, fadeOut) + .SetTarget(target).SetSpecialStartupMode(SpecialStartupMode.SetShake).SetOptions(snapping); + } + + #region Special + + /// Tweens a RectTransform's anchoredPosition to the given value, while also applying a jump effect along the Y axis. + /// Returns a Sequence instead of a Tweener. + /// Also stores the RectTransform as the tween's target so it can be used for filtered operations + /// The end value to reach + /// Power of the jump (the max height of the jump is represented by this plus the final Y offset) + /// Total number of jumps + /// The duration of the tween + /// If TRUE the tween will smoothly snap all values to integers + public static Sequence DOJumpAnchorPos(this RectTransform target, Vector2 endValue, float jumpPower, int numJumps, float duration, bool snapping = false) + { + if (numJumps < 1) numJumps = 1; + float startPosY = 0; + float offsetY = -1; + bool offsetYSet = false; + + // Separate Y Tween so we can elaborate elapsedPercentage on that insted of on the Sequence + // (in case users add a delay or other elements to the Sequence) + Sequence s = DOTween.Sequence(); + Tween yTween = DOTween.To(() => target.anchoredPosition, x => target.anchoredPosition = x, new Vector2(0, jumpPower), duration / (numJumps * 2)) + .SetOptions(AxisConstraint.Y, snapping).SetEase(Ease.OutQuad).SetRelative() + .SetLoops(numJumps * 2, LoopType.Yoyo) + .OnStart(()=> startPosY = target.anchoredPosition.y); + s.Append(DOTween.To(() => target.anchoredPosition, x => target.anchoredPosition = x, new Vector2(endValue.x, 0), duration) + .SetOptions(AxisConstraint.X, snapping).SetEase(Ease.Linear) + ).Join(yTween) + .SetTarget(target).SetEase(DOTween.defaultEaseType); + s.OnUpdate(() => { + if (!offsetYSet) { + offsetYSet = true; + offsetY = s.isRelative ? endValue.y : endValue.y - startPosY; + } + Vector2 pos = target.anchoredPosition; + pos.y += DOVirtual.EasedValue(0, offsetY, s.ElapsedDirectionalPercentage(), Ease.OutQuad); + target.anchoredPosition = pos; + }); + return s; + } + + #endregion + + #endregion + + #region ScrollRect + + /// Tweens a ScrollRect's horizontal/verticalNormalizedPosition to the given value. + /// Also stores the ScrollRect as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + /// If TRUE the tween will smoothly snap all values to integers + public static Tweener DONormalizedPos(this ScrollRect target, Vector2 endValue, float duration, bool snapping = false) + { + return DOTween.To(() => new Vector2(target.horizontalNormalizedPosition, target.verticalNormalizedPosition), + x => { + target.horizontalNormalizedPosition = x.x; + target.verticalNormalizedPosition = x.y; + }, endValue, duration) + .SetOptions(snapping).SetTarget(target); + } + /// Tweens a ScrollRect's horizontalNormalizedPosition to the given value. + /// Also stores the ScrollRect as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + /// If TRUE the tween will smoothly snap all values to integers + public static Tweener DOHorizontalNormalizedPos(this ScrollRect target, float endValue, float duration, bool snapping = false) + { + return DOTween.To(() => target.horizontalNormalizedPosition, x => target.horizontalNormalizedPosition = x, endValue, duration) + .SetOptions(snapping).SetTarget(target); + } + /// Tweens a ScrollRect's verticalNormalizedPosition to the given value. + /// Also stores the ScrollRect as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + /// If TRUE the tween will smoothly snap all values to integers + public static Tweener DOVerticalNormalizedPos(this ScrollRect target, float endValue, float duration, bool snapping = false) + { + return DOTween.To(() => target.verticalNormalizedPosition, x => target.verticalNormalizedPosition = x, endValue, duration) + .SetOptions(snapping).SetTarget(target); + } + + #endregion + + #region Slider + + /// Tweens a Slider's value to the given value. + /// Also stores the Slider as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + /// If TRUE the tween will smoothly snap all values to integers + public static TweenerCore DOValue(this Slider target, float endValue, float duration, bool snapping = false) + { + TweenerCore t = DOTween.To(() => target.value, x => target.value = x, endValue, duration); + t.SetOptions(snapping).SetTarget(target); + return t; + } + + #endregion + + #region Text + + /// Tweens a Text's color to the given value. + /// Also stores the Text as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + public static TweenerCore DOColor(this Text target, Color endValue, float duration) + { + TweenerCore t = DOTween.To(() => target.color, x => target.color = x, endValue, duration); + t.SetTarget(target); + return t; + } + + /// + /// Tweens a Text's text from one integer to another, with options for thousands separators + /// + /// The value to start from + /// The end value to reach + /// The duration of the tween + /// If TRUE (default) also adds thousands separators + /// The to use (InvariantCulture if NULL) + public static TweenerCore DOCounter( + this Text target, int fromValue, int endValue, float duration, bool addThousandsSeparator = true, CultureInfo culture = null + ){ + int v = fromValue; + CultureInfo cInfo = !addThousandsSeparator ? null : culture ?? CultureInfo.InvariantCulture; + TweenerCore t = DOTween.To(() => v, x => { + v = x; + target.text = addThousandsSeparator + ? v.ToString("N0", cInfo) + : v.ToString(); + }, endValue, duration); + t.SetTarget(target); + return t; + } + + /// Tweens a Text's alpha color to the given value. + /// Also stores the Text as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + public static TweenerCore DOFade(this Text target, float endValue, float duration) + { + TweenerCore t = DOTween.ToAlpha(() => target.color, x => target.color = x, endValue, duration); + t.SetTarget(target); + return t; + } + + /// Tweens a Text's text to the given value. + /// Also stores the Text as the tween's target so it can be used for filtered operations + /// The end string to tween toThe duration of the tween + /// If TRUE (default), rich text will be interpreted correctly while animated, + /// otherwise all tags will be considered as normal text + /// The type of scramble mode to use, if any + /// A string containing the characters to use for scrambling. + /// Use as many characters as possible (minimum 10) because DOTween uses a fast scramble mode which gives better results with more characters. + /// Leave it to NULL (default) to use default ones + public static TweenerCore DOText(this Text target, string endValue, float duration, bool richTextEnabled = true, ScrambleMode scrambleMode = ScrambleMode.None, string scrambleChars = null) + { + if (endValue == null) { + if (Debugger.logPriority > 0) Debugger.LogWarning("You can't pass a NULL string to DOText: an empty string will be used instead to avoid errors"); + endValue = ""; + } + TweenerCore t = DOTween.To(() => target.text, x => target.text = x, endValue, duration); + t.SetOptions(richTextEnabled, scrambleMode, scrambleChars) + .SetTarget(target); + return t; + } + + #endregion + + #region Blendables + + #region Graphic + + /// Tweens a Graphic's color to the given value, + /// in a way that allows other DOBlendableColor tweens to work together on the same target, + /// instead than fight each other as multiple DOColor would do. + /// Also stores the Graphic as the tween's target so it can be used for filtered operations + /// The value to tween toThe duration of the tween + public static Tweener DOBlendableColor(this Graphic target, Color endValue, float duration) + { + endValue = endValue - target.color; + Color to = new Color(0, 0, 0, 0); + return DOTween.To(() => to, x => { + Color diff = x - to; + to = x; + target.color += diff; + }, endValue, duration) + .Blendable().SetTarget(target); + } + + #endregion + + #region Image + + /// Tweens a Image's color to the given value, + /// in a way that allows other DOBlendableColor tweens to work together on the same target, + /// instead than fight each other as multiple DOColor would do. + /// Also stores the Image as the tween's target so it can be used for filtered operations + /// The value to tween toThe duration of the tween + public static Tweener DOBlendableColor(this Image target, Color endValue, float duration) + { + endValue = endValue - target.color; + Color to = new Color(0, 0, 0, 0); + return DOTween.To(() => to, x => { + Color diff = x - to; + to = x; + target.color += diff; + }, endValue, duration) + .Blendable().SetTarget(target); + } + + #endregion + + #region Text + + /// Tweens a Text's color BY the given value, + /// in a way that allows other DOBlendableColor tweens to work together on the same target, + /// instead than fight each other as multiple DOColor would do. + /// Also stores the Text as the tween's target so it can be used for filtered operations + /// The value to tween toThe duration of the tween + public static Tweener DOBlendableColor(this Text target, Color endValue, float duration) + { + endValue = endValue - target.color; + Color to = new Color(0, 0, 0, 0); + return DOTween.To(() => to, x => { + Color diff = x - to; + to = x; + target.color += diff; + }, endValue, duration) + .Blendable().SetTarget(target); + } + + #endregion + + #endregion + + #region Shapes + + /// Tweens a RectTransform's anchoredPosition so that it draws a circle around the given center. + /// Also stores the RectTransform as the tween's target so it can be used for filtered operations. + /// IMPORTANT: SetFrom(value) requires a instead of a float, where the X property represents the "from degrees value" + /// Circle-center/pivot around which to rotate (in UI anchoredPosition coordinates) + /// The end value degrees to reach (to rotate counter-clockwise pass a negative value) + /// The duration of the tween + /// If TRUE the coordinates will be considered as relative to the target's current anchoredPosition + /// If TRUE the tween will smoothly snap all values to integers + public static TweenerCore DOShapeCircle( + this RectTransform target, Vector2 center, float endValueDegrees, float duration, bool relativeCenter = false, bool snapping = false + ) + { + TweenerCore t = DOTween.To( + CirclePlugin.Get(), () => target.anchoredPosition, x => target.anchoredPosition = x, center, duration + ); + t.SetOptions(endValueDegrees, relativeCenter, snapping).SetTarget(target); + return t; + } + + #endregion + + #endregion + + // █████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ + // ███ INTERNAL CLASSES ████████████████████████████████████████████████████████████████████████████████████████████████ + // █████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ + + public static class Utils + { + /// + /// Converts the anchoredPosition of the first RectTransform to the second RectTransform, + /// taking into consideration offset, anchors and pivot, and returns the new anchoredPosition + /// + public static Vector2 SwitchToRectTransform(RectTransform from, RectTransform to) + { + Vector2 localPoint; + Vector2 fromPivotDerivedOffset = new Vector2(from.rect.width * 0.5f + from.rect.xMin, from.rect.height * 0.5f + from.rect.yMin); + Vector2 screenP = RectTransformUtility.WorldToScreenPoint(null, from.position); + screenP += fromPivotDerivedOffset; + RectTransformUtility.ScreenPointToLocalPointInRectangle(to, screenP, null, out localPoint); + Vector2 pivotDerivedOffset = new Vector2(to.rect.width * 0.5f + to.rect.xMin, to.rect.height * 0.5f + to.rect.yMin); + return to.anchoredPosition + localPoint - pivotDerivedOffset; + } + } + } +} +#endif diff --git a/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleUI.cs.meta b/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleUI.cs.meta new file mode 100644 index 00000000..60d55eff --- /dev/null +++ b/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleUI.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a060394c03331a64392db53a10e7f2d1 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleUnityVersion.cs b/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleUnityVersion.cs new file mode 100644 index 00000000..fa1ac05b --- /dev/null +++ b/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleUnityVersion.cs @@ -0,0 +1,403 @@ +// Author: Daniele Giardini - http://www.demigiant.com +// Created: 2018/07/13 + +using System; +using UnityEngine; +using DG.Tweening.Core; +using DG.Tweening.Plugins.Options; +//#if UNITY_2018_1_OR_NEWER && (NET_4_6 || NET_STANDARD_2_0) +//using Task = System.Threading.Tasks.Task; +//#endif + +#pragma warning disable 1591 +namespace DG.Tweening +{ + /// + /// Shortcuts/functions that are not strictly related to specific Modules + /// but are available only on some Unity versions + /// + public static class DOTweenModuleUnityVersion + { +#if UNITY_4_3 || UNITY_4_4 || UNITY_4_5 || UNITY_4_6 || UNITY_5 || UNITY_2017_1_OR_NEWER + #region Unity 4.3 or Newer + + #region Material + + /// Tweens a Material's color using the given gradient + /// (NOTE 1: only uses the colors of the gradient, not the alphas - NOTE 2: creates a Sequence, not a Tweener). + /// Also stores the image as the tween's target so it can be used for filtered operations + /// The gradient to useThe duration of the tween + public static Sequence DOGradientColor(this Material target, Gradient gradient, float duration) + { + Sequence s = DOTween.Sequence(); + GradientColorKey[] colors = gradient.colorKeys; + int len = colors.Length; + for (int i = 0; i < len; ++i) { + GradientColorKey c = colors[i]; + if (i == 0 && c.time <= 0) { + target.color = c.color; + continue; + } + float colorDuration = i == len - 1 + ? duration - s.Duration(false) // Verifies that total duration is correct + : duration * (i == 0 ? c.time : c.time - colors[i - 1].time); + s.Append(target.DOColor(c.color, colorDuration).SetEase(Ease.Linear)); + } + s.SetTarget(target); + return s; + } + /// Tweens a Material's named color property using the given gradient + /// (NOTE 1: only uses the colors of the gradient, not the alphas - NOTE 2: creates a Sequence, not a Tweener). + /// Also stores the image as the tween's target so it can be used for filtered operations + /// The gradient to use + /// The name of the material property to tween (like _Tint or _SpecColor) + /// The duration of the tween + public static Sequence DOGradientColor(this Material target, Gradient gradient, string property, float duration) + { + Sequence s = DOTween.Sequence(); + GradientColorKey[] colors = gradient.colorKeys; + int len = colors.Length; + for (int i = 0; i < len; ++i) { + GradientColorKey c = colors[i]; + if (i == 0 && c.time <= 0) { + target.SetColor(property, c.color); + continue; + } + float colorDuration = i == len - 1 + ? duration - s.Duration(false) // Verifies that total duration is correct + : duration * (i == 0 ? c.time : c.time - colors[i - 1].time); + s.Append(target.DOColor(c.color, property, colorDuration).SetEase(Ease.Linear)); + } + s.SetTarget(target); + return s; + } + + #endregion + + #endregion +#endif + +#if UNITY_5_3_OR_NEWER || UNITY_2017_1_OR_NEWER + #region Unity 5.3 or Newer + + #region CustomYieldInstructions + + /// + /// Returns a that waits until the tween is killed or complete. + /// It can be used inside a coroutine as a yield. + /// Example usage:yield return myTween.WaitForCompletion(true); + /// + public static CustomYieldInstruction WaitForCompletion(this Tween t, bool returnCustomYieldInstruction) + { + if (!t.active) { + if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t); + return null; + } + return new DOTweenCYInstruction.WaitForCompletion(t); + } + + /// + /// Returns a that waits until the tween is killed or rewinded. + /// It can be used inside a coroutine as a yield. + /// Example usage:yield return myTween.WaitForRewind(); + /// + public static CustomYieldInstruction WaitForRewind(this Tween t, bool returnCustomYieldInstruction) + { + if (!t.active) { + if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t); + return null; + } + return new DOTweenCYInstruction.WaitForRewind(t); + } + + /// + /// Returns a that waits until the tween is killed. + /// It can be used inside a coroutine as a yield. + /// Example usage:yield return myTween.WaitForKill(); + /// + public static CustomYieldInstruction WaitForKill(this Tween t, bool returnCustomYieldInstruction) + { + if (!t.active) { + if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t); + return null; + } + return new DOTweenCYInstruction.WaitForKill(t); + } + + /// + /// Returns a that waits until the tween is killed or has gone through the given amount of loops. + /// It can be used inside a coroutine as a yield. + /// Example usage:yield return myTween.WaitForElapsedLoops(2); + /// + /// Elapsed loops to wait for + public static CustomYieldInstruction WaitForElapsedLoops(this Tween t, int elapsedLoops, bool returnCustomYieldInstruction) + { + if (!t.active) { + if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t); + return null; + } + return new DOTweenCYInstruction.WaitForElapsedLoops(t, elapsedLoops); + } + + /// + /// Returns a that waits until the tween is killed + /// or has reached the given time position (loops included, delays excluded). + /// It can be used inside a coroutine as a yield. + /// Example usage:yield return myTween.WaitForPosition(2.5f); + /// + /// Position (loops included, delays excluded) to wait for + public static CustomYieldInstruction WaitForPosition(this Tween t, float position, bool returnCustomYieldInstruction) + { + if (!t.active) { + if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t); + return null; + } + return new DOTweenCYInstruction.WaitForPosition(t, position); + } + + /// + /// Returns a that waits until the tween is killed or started + /// (meaning when the tween is set in a playing state the first time, after any eventual delay). + /// It can be used inside a coroutine as a yield. + /// Example usage:yield return myTween.WaitForStart(); + /// + public static CustomYieldInstruction WaitForStart(this Tween t, bool returnCustomYieldInstruction) + { + if (!t.active) { + if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t); + return null; + } + return new DOTweenCYInstruction.WaitForStart(t); + } + + #endregion + + #endregion +#endif + +#if UNITY_2018_1_OR_NEWER + #region Unity 2018.1 or Newer + + #region Material + + /// Tweens a Material's named texture offset property with the given ID to the given value. + /// Also stores the material as the tween's target so it can be used for filtered operations + /// The end value to reach + /// The ID of the material property to tween (also called nameID in Unity's manual) + /// The duration of the tween + public static TweenerCore DOOffset(this Material target, Vector2 endValue, int propertyID, float duration) + { + if (!target.HasProperty(propertyID)) { + if (Debugger.logPriority > 0) Debugger.LogMissingMaterialProperty(propertyID); + return null; + } + TweenerCore t = DOTween.To(() => target.GetTextureOffset(propertyID), x => target.SetTextureOffset(propertyID, x), endValue, duration); + t.SetTarget(target); + return t; + } + + /// Tweens a Material's named texture scale property with the given ID to the given value. + /// Also stores the material as the tween's target so it can be used for filtered operations + /// The end value to reach + /// The ID of the material property to tween (also called nameID in Unity's manual) + /// The duration of the tween + public static TweenerCore DOTiling(this Material target, Vector2 endValue, int propertyID, float duration) + { + if (!target.HasProperty(propertyID)) { + if (Debugger.logPriority > 0) Debugger.LogMissingMaterialProperty(propertyID); + return null; + } + TweenerCore t = DOTween.To(() => target.GetTextureScale(propertyID), x => target.SetTextureScale(propertyID, x), endValue, duration); + t.SetTarget(target); + return t; + } + + #endregion + + #region .NET 4.6 or Newer + +#if UNITY_2018_1_OR_NEWER && (NET_4_6 || NET_STANDARD_2_0) + + #region Async Instructions + + /// + /// Returns an async that waits until the tween is killed or complete. + /// It can be used inside an async operation. + /// Example usage:await myTween.WaitForCompletion(); + /// + public static async System.Threading.Tasks.Task AsyncWaitForCompletion(this Tween t) + { + if (!t.active) { + if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t); + return; + } + while (t.active && !t.IsComplete()) await System.Threading.Tasks.Task.Yield(); + } + + /// + /// Returns an async that waits until the tween is killed or rewinded. + /// It can be used inside an async operation. + /// Example usage:await myTween.AsyncWaitForRewind(); + /// + public static async System.Threading.Tasks.Task AsyncWaitForRewind(this Tween t) + { + if (!t.active) { + if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t); + return; + } + while (t.active && (!t.playedOnce || t.position * (t.CompletedLoops() + 1) > 0)) await System.Threading.Tasks.Task.Yield(); + } + + /// + /// Returns an async that waits until the tween is killed. + /// It can be used inside an async operation. + /// Example usage:await myTween.AsyncWaitForKill(); + /// + public static async System.Threading.Tasks.Task AsyncWaitForKill(this Tween t) + { + if (!t.active) { + if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t); + return; + } + while (t.active) await System.Threading.Tasks.Task.Yield(); + } + + /// + /// Returns an async that waits until the tween is killed or has gone through the given amount of loops. + /// It can be used inside an async operation. + /// Example usage:await myTween.AsyncWaitForElapsedLoops(); + /// + /// Elapsed loops to wait for + public static async System.Threading.Tasks.Task AsyncWaitForElapsedLoops(this Tween t, int elapsedLoops) + { + if (!t.active) { + if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t); + return; + } + while (t.active && t.CompletedLoops() < elapsedLoops) await System.Threading.Tasks.Task.Yield(); + } + + /// + /// Returns an async that waits until the tween is killed or started + /// (meaning when the tween is set in a playing state the first time, after any eventual delay). + /// It can be used inside an async operation. + /// Example usage:await myTween.AsyncWaitForPosition(); + /// + /// Position (loops included, delays excluded) to wait for + public static async System.Threading.Tasks.Task AsyncWaitForPosition(this Tween t, float position) + { + if (!t.active) { + if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t); + return; + } + while (t.active && t.position * (t.CompletedLoops() + 1) < position) await System.Threading.Tasks.Task.Yield(); + } + + /// + /// Returns an async that waits until the tween is killed. + /// It can be used inside an async operation. + /// Example usage:await myTween.AsyncWaitForKill(); + /// + public static async System.Threading.Tasks.Task AsyncWaitForStart(this Tween t) + { + if (!t.active) { + if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t); + return; + } + while (t.active && !t.playedOnce) await System.Threading.Tasks.Task.Yield(); + } + + #endregion +#endif + + #endregion + + #endregion +#endif + } + + // █████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ + // ███ CLASSES █████████████████████████████████████████████████████████████████████████████████████████████████████████ + // █████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ + +#if UNITY_5_3_OR_NEWER || UNITY_2017_1_OR_NEWER + public static class DOTweenCYInstruction + { + public class WaitForCompletion : CustomYieldInstruction + { + public override bool keepWaiting { get { + return t.active && !t.IsComplete(); + }} + readonly Tween t; + public WaitForCompletion(Tween tween) + { + t = tween; + } + } + + public class WaitForRewind : CustomYieldInstruction + { + public override bool keepWaiting { get { + return t.active && (!t.playedOnce || t.position * (t.CompletedLoops() + 1) > 0); + }} + readonly Tween t; + public WaitForRewind(Tween tween) + { + t = tween; + } + } + + public class WaitForKill : CustomYieldInstruction + { + public override bool keepWaiting { get { + return t.active; + }} + readonly Tween t; + public WaitForKill(Tween tween) + { + t = tween; + } + } + + public class WaitForElapsedLoops : CustomYieldInstruction + { + public override bool keepWaiting { get { + return t.active && t.CompletedLoops() < elapsedLoops; + }} + readonly Tween t; + readonly int elapsedLoops; + public WaitForElapsedLoops(Tween tween, int elapsedLoops) + { + t = tween; + this.elapsedLoops = elapsedLoops; + } + } + + public class WaitForPosition : CustomYieldInstruction + { + public override bool keepWaiting { get { + return t.active && t.position * (t.CompletedLoops() + 1) < position; + }} + readonly Tween t; + readonly float position; + public WaitForPosition(Tween tween, float position) + { + t = tween; + this.position = position; + } + } + + public class WaitForStart : CustomYieldInstruction + { + public override bool keepWaiting { get { + return t.active && !t.playedOnce; + }} + readonly Tween t; + public WaitForStart(Tween tween) + { + t = tween; + } + } + } +#endif +} diff --git a/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleUnityVersion.cs.meta b/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleUnityVersion.cs.meta new file mode 100644 index 00000000..290189f5 --- /dev/null +++ b/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleUnityVersion.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 63c02322328255542995bd02b47b0457 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleUtils.cs b/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleUtils.cs new file mode 100644 index 00000000..12a365d4 --- /dev/null +++ b/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleUtils.cs @@ -0,0 +1,167 @@ +// Author: Daniele Giardini - http://www.demigiant.com +// Created: 2018/07/13 + +using System; +using System.Reflection; +using UnityEngine; +using DG.Tweening.Core; +using DG.Tweening.Plugins.Core.PathCore; +using DG.Tweening.Plugins.Options; + +#pragma warning disable 1591 +namespace DG.Tweening +{ + /// + /// Utility functions that deal with available Modules. + /// Modules defines: + /// - DOTAUDIO + /// - DOTPHYSICS + /// - DOTPHYSICS2D + /// - DOTSPRITE + /// - DOTUI + /// Extra defines set and used for implementation of external assets: + /// - DOTWEEN_TMP ► TextMesh Pro + /// - DOTWEEN_TK2D ► 2D Toolkit + /// + public static class DOTweenModuleUtils + { + static bool _initialized; + + #region Reflection + + /// + /// Called via Reflection by DOTweenComponent on Awake + /// +#if UNITY_2018_1_OR_NEWER + [UnityEngine.Scripting.Preserve] +#endif + public static void Init() + { + if (_initialized) return; + + _initialized = true; + DOTweenExternalCommand.SetOrientationOnPath += Physics.SetOrientationOnPath; + +#if UNITY_EDITOR +#if UNITY_4_3 || UNITY_4_4 || UNITY_4_5 || UNITY_4_6 || UNITY_5 || UNITY_2017_1 + UnityEditor.EditorApplication.playmodeStateChanged += PlaymodeStateChanged; +#else + UnityEditor.EditorApplication.playModeStateChanged += PlaymodeStateChanged; +#endif +#endif + } + +#if UNITY_2018_1_OR_NEWER +#pragma warning disable + [UnityEngine.Scripting.Preserve] + // Just used to preserve methods when building, never called + static void Preserver() + { + Assembly[] loadedAssemblies = AppDomain.CurrentDomain.GetAssemblies(); + MethodInfo mi = typeof(MonoBehaviour).GetMethod("Stub"); + } +#pragma warning restore +#endif + + #endregion + +#if UNITY_EDITOR + // Fires OnApplicationPause in DOTweenComponent even when Editor is paused (otherwise it's only fired at runtime) +#if UNITY_4_3 || UNITY_4_4 || UNITY_4_5 || UNITY_4_6 || UNITY_5 || UNITY_2017_1 + static void PlaymodeStateChanged() + #else + static void PlaymodeStateChanged(UnityEditor.PlayModeStateChange state) +#endif + { + if (DOTween.instance == null) return; + DOTween.instance.OnApplicationPause(UnityEditor.EditorApplication.isPaused); + } +#endif + + // █████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ + // ███ INTERNAL CLASSES ████████████████████████████████████████████████████████████████████████████████████████████████ + // █████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ + + public static class Physics + { + // Called via DOTweenExternalCommand callback + public static void SetOrientationOnPath(PathOptions options, Tween t, Quaternion newRot, Transform trans) + { +#if true // PHYSICS_MARKER + if (options.isRigidbody) ((Rigidbody)t.target).rotation = newRot; + else trans.rotation = newRot; +#else + trans.rotation = newRot; +#endif + } + + // Returns FALSE if the DOTween's Physics2D Module is disabled, or if there's no Rigidbody2D attached + public static bool HasRigidbody2D(Component target) + { +#if true // PHYSICS2D_MARKER + return target.GetComponent() != null; +#else + return false; +#endif + } + + #region Called via Reflection + + + // Called via Reflection by DOTweenPathInspector + // Returns FALSE if the DOTween's Physics Module is disabled, or if there's no rigidbody attached +#if UNITY_2018_1_OR_NEWER + [UnityEngine.Scripting.Preserve] +#endif + public static bool HasRigidbody(Component target) + { +#if true // PHYSICS_MARKER + return target.GetComponent() != null; +#else + return false; +#endif + } + + // Called via Reflection by DOTweenPath +#if UNITY_2018_1_OR_NEWER + [UnityEngine.Scripting.Preserve] +#endif + public static TweenerCore CreateDOTweenPathTween( + MonoBehaviour target, bool tweenRigidbody, bool isLocal, Path path, float duration, PathMode pathMode + ){ + TweenerCore t = null; + bool rBodyFoundAndTweened = false; +#if true // PHYSICS_MARKER + if (tweenRigidbody) { + Rigidbody rBody = target.GetComponent(); + if (rBody != null) { + rBodyFoundAndTweened = true; + t = isLocal + ? rBody.DOLocalPath(path, duration, pathMode) + : rBody.DOPath(path, duration, pathMode); + } + } +#endif +#if true // PHYSICS2D_MARKER + if (!rBodyFoundAndTweened && tweenRigidbody) { + Rigidbody2D rBody2D = target.GetComponent(); + if (rBody2D != null) { + rBodyFoundAndTweened = true; + t = isLocal + ? rBody2D.DOLocalPath(path, duration, pathMode) + : rBody2D.DOPath(path, duration, pathMode); + } + } +#endif + if (!rBodyFoundAndTweened) { + t = isLocal + ? target.transform.DOLocalPath(path, duration, pathMode) + : target.transform.DOPath(path, duration, pathMode); + } + return t; + } + + #endregion + } + } +} diff --git a/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleUtils.cs.meta b/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleUtils.cs.meta new file mode 100644 index 00000000..ab62186c --- /dev/null +++ b/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleUtils.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7bcaf917d9cf5b84090421a5a2abe42e +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/Assets/Plugins/Demigiant/DOTween/readme.txt b/Assets/Plugins/Demigiant/DOTween/readme.txt new file mode 100644 index 00000000..37ff7ef5 --- /dev/null +++ b/Assets/Plugins/Demigiant/DOTween/readme.txt @@ -0,0 +1,29 @@ +DOTween and DOTween Pro are copyright (c) 2014-2018 Daniele Giardini - Demigiant + +// IMPORTANT!!! ///////////////////////////////////////////// +// Upgrading DOTween from versions older than 1.2.000 /////// +// (or DOTween Pro older than 1.0.000) ////////////////////// +------------------------------------------------------------- +If you're upgrading your project from a version of DOTween older than 1.2.000 (or DOTween Pro older than 1.0.000) please follow these instructions carefully. +1) Import the new version in the same folder as the previous one, overwriting old files. A lot of errors will appear but don't worry +2) Close and reopen Unity (and your project). This is fundamental: skipping this step will cause a bloodbath +3) Open DOTween's Utility Panel (Tools > Demigiant > DOTween Utility Panel) if it doesn't open automatically, then press "Setup DOTween...": this will run the upgrade setup +4) From the Add/Remove Modules panel that opens, activate/deactivate Modules for Unity systems and for external assets (Pro version only) + +// GET STARTED ////////////////////////////////////////////// + +- After importing a new DOTween update, select DOTween's Utility Panel from the "Tools/Demigiant" menu (if it doesn't open automatically) and press the "Setup DOTween..." button to activate/deactivate Modules. You can also access a Preferences Tab from there to choose default settings for DOTween. +- In your code, add "using DG.Tweening" to each class where you want to use DOTween. +- You're ready to tween. Check out the links below for full documentation and license info. + + +// LINKS /////////////////////////////////////////////////////// + +DOTween website (documentation, examples, etc): http://dotween.demigiant.com +DOTween license: http://dotween.demigiant.com/license.php +DOTween repository (Google Code): https://code.google.com/p/dotween/ +Demigiant website (documentation, examples, etc): http://www.demigiant.com + +// NOTES ////////////////////////////////////////////////////// + +- DOTween's Utility Panel can be found under "Tools > Demigiant > DOTween Utility Panel" and also contains other useful options, plus a tab to set DOTween's preferences \ No newline at end of file diff --git a/Assets/Plugins/Demigiant/DOTween/readme.txt.meta b/Assets/Plugins/Demigiant/DOTween/readme.txt.meta new file mode 100644 index 00000000..37991656 --- /dev/null +++ b/Assets/Plugins/Demigiant/DOTween/readme.txt.meta @@ -0,0 +1,4 @@ +fileFormatVersion: 2 +guid: fccfc62abf2eb0a4db614853430894fd +TextScriptImporter: + userData: diff --git a/Assets/Plugins/Demigiant/DOTweenPro.meta b/Assets/Plugins/Demigiant/DOTweenPro.meta new file mode 100644 index 00000000..076745d9 --- /dev/null +++ b/Assets/Plugins/Demigiant/DOTweenPro.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 03d09fad308b21b4eab0692dce86c883 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Demigiant/DOTweenPro/DOTweenAnimation.cs b/Assets/Plugins/Demigiant/DOTweenPro/DOTweenAnimation.cs new file mode 100644 index 00000000..41946ba8 --- /dev/null +++ b/Assets/Plugins/Demigiant/DOTweenPro/DOTweenAnimation.cs @@ -0,0 +1,884 @@ +// Author: Daniele Giardini - http://www.demigiant.com +// Created: 2015/03/12 15:55 + +using System; +using System.Collections.Generic; +using DG.Tweening.Core; +using UnityEngine; +#if true // UI_MARKER +using UnityEngine.UI; +#endif +#if true // TEXTMESHPRO_MARKER +using TMPro; +#endif + +#pragma warning disable 1591 +namespace DG.Tweening +{ + /// + /// Attach this to a GameObject to create a tween + /// + [AddComponentMenu("DOTween/DOTween Animation")] + public class DOTweenAnimation : ABSAnimationComponent + { + public enum AnimationType + { + None, + Move, LocalMove, + Rotate, LocalRotate, + Scale, + Color, Fade, + Text, + PunchPosition, PunchRotation, PunchScale, + ShakePosition, ShakeRotation, ShakeScale, + CameraAspect, CameraBackgroundColor, CameraFieldOfView, CameraOrthoSize, CameraPixelRect, CameraRect, + UIWidthHeight + } + + public enum TargetType + { + Unset, + + Camera, + CanvasGroup, + Image, + Light, + RectTransform, + Renderer, SpriteRenderer, + Rigidbody, Rigidbody2D, + Text, + Transform, + + tk2dBaseSprite, + tk2dTextMesh, + + TextMeshPro, + TextMeshProUGUI + } + + #region EVENTS - EDITOR-ONLY + + /// Used internally by the editor + public static event Action OnReset; + static void Dispatch_OnReset(DOTweenAnimation anim) { if (OnReset != null) OnReset(anim); } + + #endregion + + public bool targetIsSelf = true; // If FALSE allows to set the target manually + public GameObject targetGO = null; // Used in case targetIsSelf is FALSE + // If FALSE always uses the GO containing this DOTweenAnimation (and not the one containing the target) as DOTween's SetTarget target + public bool tweenTargetIsTargetGO = true; + + public float delay; + public float duration = 1; + public Ease easeType = Ease.OutQuad; + public AnimationCurve easeCurve = new AnimationCurve(new Keyframe(0, 0), new Keyframe(1, 1)); + public LoopType loopType = LoopType.Restart; + public int loops = 1; + public string id = ""; + public bool isRelative; + public bool isFrom; + public bool isIndependentUpdate = false; + public bool autoKill = true; + public bool autoGenerate = true; // If TRUE automatically creates the tween at startup + + public bool isActive = true; + public bool isValid; + public Component target; + public AnimationType animationType; + public TargetType targetType; + public TargetType forcedTargetType; // Used when choosing between multiple targets + public bool autoPlay = true; + public bool useTargetAsV3; + + public float endValueFloat; + public Vector3 endValueV3; + public Vector2 endValueV2; + public Color endValueColor = new Color(1, 1, 1, 1); + public string endValueString = ""; + public Rect endValueRect = new Rect(0, 0, 0, 0); + public Transform endValueTransform; + + public bool optionalBool0, optionalBool1; + public float optionalFloat0; + public int optionalInt0; + public RotateMode optionalRotationMode = RotateMode.Fast; + public ScrambleMode optionalScrambleMode = ScrambleMode.None; + public string optionalString; + + bool _tweenAutoGenerationCalled; // TRUE after the tweens have been autoGenerated + int _playCount = -1; // Used when calling DOPlayNext + + #region Unity Methods + + void Awake() + { + if (!isActive || !autoGenerate) return; + + if (animationType != AnimationType.Move || !useTargetAsV3) { + // Don't create tweens if we're using a RectTransform as a Move target, + // because that will work only inside Start + CreateTween(false, autoPlay); + _tweenAutoGenerationCalled = true; + } + } + + void Start() + { + if (_tweenAutoGenerationCalled || !isActive || !autoGenerate) return; + + CreateTween(false, autoPlay); + _tweenAutoGenerationCalled = true; + } + + void Reset() + { + Dispatch_OnReset(this); + } + + void OnDestroy() + { + if (tween != null && tween.active) tween.Kill(); + tween = null; + } + + /// + /// Creates/recreates the tween without playing it, but first rewinding and killing the existing one if present. + /// + public void RewindThenRecreateTween() + { + if (tween != null && tween.active) tween.Rewind(); + CreateTween(true, false); + } + /// + /// Creates/recreates the tween and plays it, first rewinding and killing the existing one if present. + /// + public void RewindThenRecreateTweenAndPlay() + { + if (tween != null && tween.active) tween.Rewind(); + CreateTween(true, true); + } + /// + /// Creates/recreates the tween from its target's current value without playing it, but first killing the existing one if present. + /// + public void RecreateTween() + { CreateTween(true, false); } + /// + /// Creates/recreates the tween from its target's current value and plays it, first killing the existing one if present. + /// + public void RecreateTweenAndPlay() + { CreateTween(true, true); } + // Used also by DOTweenAnimationInspector when applying runtime changes and restarting + /// + /// Creates the tween manually (called automatically if AutoGenerate is set in the Inspector) + /// from its target's current value. + /// + /// If TRUE and an existing tween was already created (and not killed), kills it and recreates it with the current + /// parameters. Otherwise, if a tween already exists, does nothing. + /// If TRUE also plays the tween, otherwise only creates it + public void CreateTween(bool regenerateIfExists = false, bool andPlay = true) + { + if (!isValid) { + if (regenerateIfExists) { // Called manually: warn users + Debug.LogWarning(string.Format("{0} :: This DOTweenAnimation isn't valid and its tween won't be created", this.gameObject.name), this.gameObject); + } + return; + } + if (tween != null) { + if (tween.active) { + if (regenerateIfExists) tween.Kill(); + else return; + } + tween = null; + } + +// if (target == null) { +// Debug.LogWarning(string.Format("{0} :: This DOTweenAnimation's target is NULL, because the animation was created with a DOTween Pro version older than 0.9.255. To fix this, exit Play mode then simply select this object, and it will update automatically", this.gameObject.name), this.gameObject); +// return; +// } + + GameObject tweenGO = GetTweenGO(); + if (target == null || tweenGO == null) { + if (targetIsSelf && target == null) { + // Old error caused during upgrade from DOTween Pro 0.9.255 + Debug.LogWarning(string.Format("{0} :: This DOTweenAnimation's target is NULL, because the animation was created with a DOTween Pro version older than 0.9.255. To fix this, exit Play mode then simply select this object, and it will update automatically", this.gameObject.name), this.gameObject); + } else { + // Missing non-self target + Debug.LogWarning(string.Format("{0} :: This DOTweenAnimation's target/GameObject is unset: the tween will not be created.", this.gameObject.name), this.gameObject); + } + return; + } + + if (forcedTargetType != TargetType.Unset) targetType = forcedTargetType; + if (targetType == TargetType.Unset) { + // Legacy DOTweenAnimation (made with a version older than 0.9.450) without stored targetType > assign it now + targetType = TypeToDOTargetType(target.GetType()); + } + + switch (animationType) { + case AnimationType.None: + break; + case AnimationType.Move: + if (useTargetAsV3) { + isRelative = false; + if (endValueTransform == null) { + Debug.LogWarning(string.Format("{0} :: This tween's TO target is NULL, a Vector3 of (0,0,0) will be used instead", this.gameObject.name), this.gameObject); + endValueV3 = Vector3.zero; + } else { +#if true // UI_MARKER + if (targetType == TargetType.RectTransform) { + RectTransform endValueT = endValueTransform as RectTransform; + if (endValueT == null) { + Debug.LogWarning(string.Format("{0} :: This tween's TO target should be a RectTransform, a Vector3 of (0,0,0) will be used instead", this.gameObject.name), this.gameObject); + endValueV3 = Vector3.zero; + } else { + RectTransform rTarget = target as RectTransform; + if (rTarget == null) { + Debug.LogWarning(string.Format("{0} :: This tween's target and TO target are not of the same type. Please reassign the values", this.gameObject.name), this.gameObject); + } else { + // Problem: doesn't work inside Awake (ararargh!) + endValueV3 = DOTweenModuleUI.Utils.SwitchToRectTransform(endValueT, rTarget); + } + } + } else +#endif + endValueV3 = endValueTransform.position; + } + } + switch (targetType) { + case TargetType.Transform: + tween = ((Transform)target).DOMove(endValueV3, duration, optionalBool0); + break; + case TargetType.RectTransform: +#if true // UI_MARKER + tween = ((RectTransform)target).DOAnchorPos3D(endValueV3, duration, optionalBool0); +#else + tween = ((Transform)target).DOMove(endValueV3, duration, optionalBool0); +#endif + break; + case TargetType.Rigidbody: +#if true // PHYSICS_MARKER + tween = ((Rigidbody)target).DOMove(endValueV3, duration, optionalBool0); +#else + tween = ((Transform)target).DOMove(endValueV3, duration, optionalBool0); +#endif + break; + case TargetType.Rigidbody2D: +#if true // PHYSICS2D_MARKER + tween = ((Rigidbody2D)target).DOMove(endValueV3, duration, optionalBool0); +#else + tween = ((Transform)target).DOMove(endValueV3, duration, optionalBool0); +#endif + break; + } + break; + case AnimationType.LocalMove: + tween = tweenGO.transform.DOLocalMove(endValueV3, duration, optionalBool0); + break; + case AnimationType.Rotate: + switch (targetType) { + case TargetType.Transform: + tween = ((Transform)target).DORotate(endValueV3, duration, optionalRotationMode); + break; + case TargetType.Rigidbody: +#if true // PHYSICS_MARKER + tween = ((Rigidbody)target).DORotate(endValueV3, duration, optionalRotationMode); +#else + tween = ((Transform)target).DORotate(endValueV3, duration, optionalRotationMode); +#endif + break; + case TargetType.Rigidbody2D: +#if true // PHYSICS2D_MARKER + tween = ((Rigidbody2D)target).DORotate(endValueFloat, duration); +#else + tween = ((Transform)target).DORotate(endValueV3, duration, optionalRotationMode); +#endif + break; + } + break; + case AnimationType.LocalRotate: + tween = tweenGO.transform.DOLocalRotate(endValueV3, duration, optionalRotationMode); + break; + case AnimationType.Scale: + switch (targetType) { +#if false // TK2D_MARKER + case TargetType.tk2dTextMesh: + tween = ((tk2dTextMesh)target).DOScale(optionalBool0 ? new Vector3(endValueFloat, endValueFloat, endValueFloat) : endValueV3, duration); + break; + case TargetType.tk2dBaseSprite: + tween = ((tk2dBaseSprite)target).DOScale(optionalBool0 ? new Vector3(endValueFloat, endValueFloat, endValueFloat) : endValueV3, duration); + break; +#endif + default: + tween = tweenGO.transform.DOScale(optionalBool0 ? new Vector3(endValueFloat, endValueFloat, endValueFloat) : endValueV3, duration); + break; + } + break; +#if true // UI_MARKER + case AnimationType.UIWidthHeight: + tween = ((RectTransform)target).DOSizeDelta(optionalBool0 ? new Vector2(endValueFloat, endValueFloat) : endValueV2, duration); + break; +#endif + case AnimationType.Color: + isRelative = false; + switch (targetType) { + case TargetType.Renderer: + tween = ((Renderer)target).material.DOColor(endValueColor, duration); + break; + case TargetType.Light: + tween = ((Light)target).DOColor(endValueColor, duration); + break; +#if true // SPRITE_MARKER + case TargetType.SpriteRenderer: + tween = ((SpriteRenderer)target).DOColor(endValueColor, duration); + break; +#endif +#if true // UI_MARKER + case TargetType.Image: + tween = ((Graphic)target).DOColor(endValueColor, duration); + break; + case TargetType.Text: + tween = ((Text)target).DOColor(endValueColor, duration); + break; +#endif +#if false // TK2D_MARKER + case TargetType.tk2dTextMesh: + tween = ((tk2dTextMesh)target).DOColor(endValueColor, duration); + break; + case TargetType.tk2dBaseSprite: + tween = ((tk2dBaseSprite)target).DOColor(endValueColor, duration); + break; +#endif +#if true // TEXTMESHPRO_MARKER + case TargetType.TextMeshProUGUI: + tween = ((TextMeshProUGUI)target).DOColor(endValueColor, duration); + break; + case TargetType.TextMeshPro: + tween = ((TextMeshPro)target).DOColor(endValueColor, duration); + break; +#endif + } + break; + case AnimationType.Fade: + isRelative = false; + switch (targetType) { + case TargetType.Renderer: + tween = ((Renderer)target).material.DOFade(endValueFloat, duration); + break; + case TargetType.Light: + tween = ((Light)target).DOIntensity(endValueFloat, duration); + break; +#if true // SPRITE_MARKER + case TargetType.SpriteRenderer: + tween = ((SpriteRenderer)target).DOFade(endValueFloat, duration); + break; +#endif +#if true // UI_MARKER + case TargetType.Image: + tween = ((Graphic)target).DOFade(endValueFloat, duration); + break; + case TargetType.Text: + tween = ((Text)target).DOFade(endValueFloat, duration); + break; + case TargetType.CanvasGroup: + tween = ((CanvasGroup)target).DOFade(endValueFloat, duration); + break; +#endif +#if false // TK2D_MARKER + case TargetType.tk2dTextMesh: + tween = ((tk2dTextMesh)target).DOFade(endValueFloat, duration); + break; + case TargetType.tk2dBaseSprite: + tween = ((tk2dBaseSprite)target).DOFade(endValueFloat, duration); + break; +#endif +#if true // TEXTMESHPRO_MARKER + case TargetType.TextMeshProUGUI: + tween = ((TextMeshProUGUI)target).DOFade(endValueFloat, duration); + break; + case TargetType.TextMeshPro: + tween = ((TextMeshPro)target).DOFade(endValueFloat, duration); + break; +#endif + } + break; + case AnimationType.Text: +#if true // UI_MARKER + switch (targetType) { + case TargetType.Text: + tween = ((Text)target).DOText(endValueString, duration, optionalBool0, optionalScrambleMode, optionalString); + break; + } +#endif +#if false // TK2D_MARKER + switch (targetType) { + case TargetType.tk2dTextMesh: + tween = ((tk2dTextMesh)target).DOText(endValueString, duration, optionalBool0, optionalScrambleMode, optionalString); + break; + } +#endif +#if true // TEXTMESHPRO_MARKER + switch (targetType) { + case TargetType.TextMeshProUGUI: + tween = ((TextMeshProUGUI)target).DOText(endValueString, duration, optionalBool0, optionalScrambleMode, optionalString); + break; + case TargetType.TextMeshPro: + tween = ((TextMeshPro)target).DOText(endValueString, duration, optionalBool0, optionalScrambleMode, optionalString); + break; + } +#endif + break; + case AnimationType.PunchPosition: + switch (targetType) { + case TargetType.Transform: + tween = ((Transform)target).DOPunchPosition(endValueV3, duration, optionalInt0, optionalFloat0, optionalBool0); + break; +#if true // UI_MARKER + case TargetType.RectTransform: + tween = ((RectTransform)target).DOPunchAnchorPos(endValueV3, duration, optionalInt0, optionalFloat0, optionalBool0); + break; +#endif + } + break; + case AnimationType.PunchScale: + tween = tweenGO.transform.DOPunchScale(endValueV3, duration, optionalInt0, optionalFloat0); + break; + case AnimationType.PunchRotation: + tween = tweenGO.transform.DOPunchRotation(endValueV3, duration, optionalInt0, optionalFloat0); + break; + case AnimationType.ShakePosition: + switch (targetType) { + case TargetType.Transform: + tween = ((Transform)target).DOShakePosition(duration, endValueV3, optionalInt0, optionalFloat0, optionalBool0, optionalBool1); + break; +#if true // UI_MARKER + case TargetType.RectTransform: + tween = ((RectTransform)target).DOShakeAnchorPos(duration, endValueV3, optionalInt0, optionalFloat0, optionalBool0, optionalBool1); + break; +#endif + } + break; + case AnimationType.ShakeScale: + tween = tweenGO.transform.DOShakeScale(duration, endValueV3, optionalInt0, optionalFloat0, optionalBool1); + break; + case AnimationType.ShakeRotation: + tween = tweenGO.transform.DOShakeRotation(duration, endValueV3, optionalInt0, optionalFloat0, optionalBool1); + break; + case AnimationType.CameraAspect: + tween = ((Camera)target).DOAspect(endValueFloat, duration); + break; + case AnimationType.CameraBackgroundColor: + tween = ((Camera)target).DOColor(endValueColor, duration); + break; + case AnimationType.CameraFieldOfView: + tween = ((Camera)target).DOFieldOfView(endValueFloat, duration); + break; + case AnimationType.CameraOrthoSize: + tween = ((Camera)target).DOOrthoSize(endValueFloat, duration); + break; + case AnimationType.CameraPixelRect: + tween = ((Camera)target).DOPixelRect(endValueRect, duration); + break; + case AnimationType.CameraRect: + tween = ((Camera)target).DORect(endValueRect, duration); + break; + } + + if (tween == null) return; + + // Created + + if (isFrom) { + ((Tweener)tween).From(isRelative); + } else { + tween.SetRelative(isRelative); + } + GameObject setTarget = GetTweenTarget(); + tween.SetTarget(setTarget).SetDelay(delay).SetLoops(loops, loopType).SetAutoKill(autoKill) + .OnKill(()=> tween = null); + if (isSpeedBased) tween.SetSpeedBased(); + if (easeType == Ease.INTERNAL_Custom) tween.SetEase(easeCurve); + else tween.SetEase(easeType); + if (!string.IsNullOrEmpty(id)) tween.SetId(id); + tween.SetUpdate(isIndependentUpdate); + + if (hasOnStart) { + if (onStart != null) tween.OnStart(onStart.Invoke); + } else onStart = null; + if (hasOnPlay) { + if (onPlay != null) tween.OnPlay(onPlay.Invoke); + } else onPlay = null; + if (hasOnUpdate) { + if (onUpdate != null) tween.OnUpdate(onUpdate.Invoke); + } else onUpdate = null; + if (hasOnStepComplete) { + if (onStepComplete != null) tween.OnStepComplete(onStepComplete.Invoke); + } else onStepComplete = null; + if (hasOnComplete) { + if (onComplete != null) tween.OnComplete(onComplete.Invoke); + } else onComplete = null; + if (hasOnRewind) { + if (onRewind != null) tween.OnRewind(onRewind.Invoke); + } else onRewind = null; + + if (andPlay) tween.Play(); + else tween.Pause(); + + if (hasOnTweenCreated && onTweenCreated != null) onTweenCreated.Invoke(); + } + + #endregion + + #region Public Methods + + #region Special + + /// + /// Returns the tweens (if generated and not killed) created by all DOTweenAnimations on this gameObject, + /// in the same order as they appear in the Inspector (top to bottom). + /// Note that a tween is generated inside the Awake call (except RectTransform tweens which are generated inside Start), + /// so this method won't return them before that + /// + public List GetTweens() + { + List result = new List(); + DOTweenAnimation[] anims = this.GetComponents(); + foreach (DOTweenAnimation anim in anims) { + if (anim.tween != null && anim.tween.active) result.Add(anim.tween); + } + return result; + } + + /// + /// Sets the animation target (which must be of the same type of the one set in the Inspector). + /// This is useful if you want to change it BEFORE this + /// creates a tween, while after that it won't have any effect. + /// Consider that a creates its tween inside its Awake (except for special tweens), + /// so you will need to sure your code runs before this object's Awake (via ScriptExecutionOrder or enabling/disabling methods) + /// + /// + /// New target for the animation (must be of the same type of the previous one) + /// If TRUE also uses tweenTarget's gameObject when settings the target-ID of the tween + /// (which is used with DOPlay/DORestart/etc to apply the same operation on all tweens that have the same target-id). + /// You should usually leave this to TRUE if you change the target. + /// + public void SetAnimationTarget(Component tweenTarget, bool useTweenTargetGameObjectForGroupOperations = true) + { + TargetType newTargetType = TypeToDOTargetType(target.GetType()); + if (newTargetType != targetType) { + Debug.LogError("DOTweenAnimation ► SetAnimationTarget: the new target is of a different type from the one set in the Inspector"); + return; + } + target = tweenTarget; + targetGO = target.gameObject; + tweenTargetIsTargetGO = useTweenTargetGameObjectForGroupOperations; + } + + #endregion + + /// + /// Plays all tweens whose target-id is the same as the one set by this animation + /// + public override void DOPlay() + { + DOTween.Play(GetTweenTarget()); + } + + /// + /// Plays backwards all tweens whose target-id is the same as the one set by this animation + /// + public override void DOPlayBackwards() + { + DOTween.PlayBackwards(GetTweenTarget()); + } + + /// + /// Plays foward all tweens whose target-id is the same as the one set by this animation + /// + public override void DOPlayForward() + { + DOTween.PlayForward(GetTweenTarget()); + } + + /// + /// Pauses all tweens whose target-id is the same as the one set by this animation + /// + public override void DOPause() + { + DOTween.Pause(GetTweenTarget()); + } + + /// + /// Pauses/unpauses (depending on the current state) all tweens whose target-id is the same as the one set by this animation + /// + public override void DOTogglePause() + { + DOTween.TogglePause(GetTweenTarget()); + } + + /// + /// Rewinds all tweens created by this animation in the correct order + /// + public override void DORewind() + { + _playCount = -1; + // Rewind using Components order (in case there are multiple animations on the same property) + DOTweenAnimation[] anims = this.gameObject.GetComponents(); + for (int i = anims.Length - 1; i > -1; --i) { + Tween t = anims[i].tween; + if (t != null && t.IsInitialized()) anims[i].tween.Rewind(); + } + // DOTween.Rewind(GetTweenTarget()); + } + + /// + /// Restarts all tweens whose target-id is the same as the one set by this animation + /// + public override void DORestart() + { DORestart(false); } + /// + /// Restarts all tweens whose target-id is the same as the one set by this animation + /// + /// If TRUE, re-evaluates the tween's start and end values from its current position. + /// Set it to TRUE when spawning the same DOTweenAnimation in different positions (like when using a pooling system) + public override void DORestart(bool fromHere) + { + _playCount = -1; + if (tween == null) { + if (Debugger.logPriority > 1) Debugger.LogNullTween(tween); return; + } + if (fromHere && isRelative) ReEvaluateRelativeTween(); + DOTween.Restart(GetTweenTarget()); + } + + /// + /// Completes all tweens whose target-id is the same as the one set by this animation + /// + public override void DOComplete() + { + DOTween.Complete(GetTweenTarget()); + } + + /// + /// Kills all tweens whose target-id is the same as the one set by this animation + /// + public override void DOKill() + { + DOTween.Kill(GetTweenTarget()); + tween = null; + } + + #region Specifics + + /// + /// Plays all tweens with the given ID and whose target-id is the same as the one set by this animation + /// + public void DOPlayById(string id) + { + DOTween.Play(GetTweenTarget(), id); + } + /// + /// Plays all tweens with the given ID (regardless of their target gameObject) + /// + public void DOPlayAllById(string id) + { + DOTween.Play(id); + } + + /// + /// Pauses all tweens that with the given ID (regardless of their target gameObject) + /// + public void DOPauseAllById(string id) + { + DOTween.Pause(id); + } + + /// + /// Plays backwards all tweens with the given ID and whose target-id is the same as the one set by this animation + /// + public void DOPlayBackwardsById(string id) + { + DOTween.PlayBackwards(GetTweenTarget(), id); + } + /// + /// Plays backwards all tweens with the given ID (regardless of their target gameObject) + /// + public void DOPlayBackwardsAllById(string id) + { + DOTween.PlayBackwards(id); + } + + /// + /// Plays forward all tweens with the given ID and whose target-id is the same as the one set by this animation + /// + public void DOPlayForwardById(string id) + { + DOTween.PlayForward(GetTweenTarget(), id); + } + /// + /// Plays forward all tweens with the given ID (regardless of their target gameObject) + /// + public void DOPlayForwardAllById(string id) + { + DOTween.PlayForward(id); + } + + /// + /// Plays the next animation on this animation's gameObject (if any) + /// + public void DOPlayNext() + { + DOTweenAnimation[] anims = this.GetComponents(); + while (_playCount < anims.Length - 1) { + _playCount++; + DOTweenAnimation anim = anims[_playCount]; + if (anim != null && anim.tween != null && anim.tween.active && !anim.tween.IsPlaying() && !anim.tween.IsComplete()) { + anim.tween.Play(); + break; + } + } + } + + /// + /// Rewinds all tweens with the given ID and whose target-id is the same as the one set by this animation, + /// then plays the next animation on this animation's gameObject (if any) + /// + public void DORewindAndPlayNext() + { + _playCount = -1; + DOTween.Rewind(GetTweenTarget()); + DOPlayNext(); + } + + /// + /// Rewinds all tweens with the given ID (regardless of their target gameObject) + /// + public void DORewindAllById(string id) + { + _playCount = -1; + DOTween.Rewind(id); + } + + /// + /// Restarts all tweens with the given ID and whose target-id is the same as the one set by this animation + /// + public void DORestartById(string id) + { + _playCount = -1; + DOTween.Restart(GetTweenTarget(), id); + } + /// + /// Restarts all tweens with the given ID (regardless of their target gameObject) + /// + public void DORestartAllById(string id) + { + _playCount = -1; + DOTween.Restart(id); + } + + /// + /// Kills all tweens with the given ID and whose target-id is the same as the one set by this animation + /// + public void DOKillById(string id) + { + DOTween.Kill(GetTweenTarget(), id); + } + /// + /// Kills all tweens with the given ID (regardless of their target gameObject) + /// + public void DOKillAllById(string id) + { + DOTween.Kill(id); + } + + #endregion + + #region Internal (also used by Inspector) + + public static TargetType TypeToDOTargetType(Type t) + { + string str = t.ToString(); + int dotIndex = str.LastIndexOf("."); + if (dotIndex != -1) str = str.Substring(dotIndex + 1); + if (str.IndexOf("Renderer") != -1 && (str != "SpriteRenderer")) str = "Renderer"; +//#if true // PHYSICS_MARKER +// if (str == "Rigidbody") str = "Transform"; +//#endif +//#if true // PHYSICS2D_MARKER +// if (str == "Rigidbody2D") str = "Transform"; +//#endif +#if true // UI_MARKER +// if (str == "RectTransform") str = "Transform"; + if (str == "RawImage" || str == "Graphic") str = "Image"; // RawImages/Graphics are managed like Images for DOTweenAnimation (color and fade use Graphic target anyway) +#endif + return (TargetType)Enum.Parse(typeof(TargetType), str); + } + + // Editor preview system + /// + /// Previews the tween in the editor. Only for DOTween internal usage: don't use otherwise. + /// + public Tween CreateEditorPreview() + { + if (Application.isPlaying) return null; + + // CHANGE: first param switched to TRUE otherwise changing an animation and replaying in editor would still play old one + CreateTween(true, autoPlay); + return tween; + } + + #endregion + + #endregion + + #region Private + + /// + /// Returns the gameObject whose target component should be animated + /// + /// + GameObject GetTweenGO() + { + return targetIsSelf ? this.gameObject : targetGO; + } + + /// + /// Returns the GameObject which should be used/retrieved for SetTarget + /// + GameObject GetTweenTarget() + { + return targetIsSelf || !tweenTargetIsTargetGO ? this.gameObject : targetGO; + } + + // Re-evaluate relative position of path + void ReEvaluateRelativeTween() + { + GameObject tweenGO = GetTweenGO(); + if (tweenGO == null) { + Debug.LogWarning(string.Format("{0} :: This DOTweenAnimation's target/GameObject is unset: the tween will not be created.", this.gameObject.name), this.gameObject); + return; + } + if (animationType == AnimationType.Move) { + ((Tweener)tween).ChangeEndValue(tweenGO.transform.position + endValueV3, true); + } else if (animationType == AnimationType.LocalMove) { + ((Tweener)tween).ChangeEndValue(tweenGO.transform.localPosition + endValueV3, true); + } + } + + #endregion + } + + public static class DOTweenAnimationExtensions + { +// // Doesn't work on Win 8.1 +// public static bool IsSameOrSubclassOf(this Type t, Type tBase) +// { +// return t.IsSubclassOf(tBase) || t == tBase; +// } + + public static bool IsSameOrSubclassOf(this Component t) + { + return t is T; + } + } +} diff --git a/Assets/Plugins/Demigiant/DOTweenPro/DOTweenAnimation.cs.meta b/Assets/Plugins/Demigiant/DOTweenPro/DOTweenAnimation.cs.meta new file mode 100644 index 00000000..a10ceea2 --- /dev/null +++ b/Assets/Plugins/Demigiant/DOTweenPro/DOTweenAnimation.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4d0390bd8b8ffd640b34fe25065ff1df +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/Assets/Plugins/Demigiant/DOTweenPro/DOTweenDeAudio.cs b/Assets/Plugins/Demigiant/DOTweenPro/DOTweenDeAudio.cs new file mode 100644 index 00000000..c9df3968 --- /dev/null +++ b/Assets/Plugins/Demigiant/DOTweenPro/DOTweenDeAudio.cs @@ -0,0 +1,9 @@ +// Author: Daniele Giardini - http://www.demigiant.com +// Created: 2015/03/27 19:02 +// +// License Copyright (c) Daniele Giardini. +// This work is subject to the terms at http://dotween.demigiant.com/license.php + + +#if false // MODULE_MARKER +#endif diff --git a/Assets/Plugins/Demigiant/DOTweenPro/DOTweenDeAudio.cs.meta b/Assets/Plugins/Demigiant/DOTweenPro/DOTweenDeAudio.cs.meta new file mode 100644 index 00000000..32c1ec84 --- /dev/null +++ b/Assets/Plugins/Demigiant/DOTweenPro/DOTweenDeAudio.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 1d1aa01bacf85c04ea18116651a7f0db +timeCreated: 1587116610 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Demigiant/DOTweenPro/DOTweenDeUnityExtended.cs b/Assets/Plugins/Demigiant/DOTweenPro/DOTweenDeUnityExtended.cs new file mode 100644 index 00000000..c9df3968 --- /dev/null +++ b/Assets/Plugins/Demigiant/DOTweenPro/DOTweenDeUnityExtended.cs @@ -0,0 +1,9 @@ +// Author: Daniele Giardini - http://www.demigiant.com +// Created: 2015/03/27 19:02 +// +// License Copyright (c) Daniele Giardini. +// This work is subject to the terms at http://dotween.demigiant.com/license.php + + +#if false // MODULE_MARKER +#endif diff --git a/Assets/Plugins/Demigiant/DOTweenPro/DOTweenDeUnityExtended.cs.meta b/Assets/Plugins/Demigiant/DOTweenPro/DOTweenDeUnityExtended.cs.meta new file mode 100644 index 00000000..9cba4ea8 --- /dev/null +++ b/Assets/Plugins/Demigiant/DOTweenPro/DOTweenDeUnityExtended.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 0a0cc3e90c4a6ea41bb14d7f35c577c3 +timeCreated: 1587116610 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Demigiant/DOTweenPro/DOTweenPro.dll b/Assets/Plugins/Demigiant/DOTweenPro/DOTweenPro.dll new file mode 100644 index 0000000000000000000000000000000000000000..e3f93244084fd71a6aeb2783fbd4d820db999307 GIT binary patch literal 15872 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 a Transform's localPosition in a spiral shape. + /// Also stores the transform as the tween's target so it can be used for filtered operations + /// The duration of the tween + /// The axis around which the spiral will rotate + /// The type of spiral movement + /// Speed of the rotations + /// Frequency of the rotation. Lower values lead to wider spirals + /// Indicates how much the tween should move along the spiral's axis + /// If TRUE the tween will smoothly snap all values to integers + public static Tweener DOSpiral( + this Transform target, float duration, Vector3? axis = null, SpiralMode mode = SpiralMode.Expand, + float speed = 1, float frequency = 10, float depth = 0, bool snapping = false + ) { + if (Mathf.Approximately(speed, 0)) speed = 1; + if (axis == null || axis == Vector3.zero) axis = Vector3.forward; + + TweenerCore t = DOTween.To(SpiralPlugin.Get(), () => target.localPosition, x => target.localPosition = x, (Vector3)axis, duration) + .SetTarget(target); + + t.plugOptions.mode = mode; + t.plugOptions.speed = speed; + t.plugOptions.frequency = frequency; + t.plugOptions.depth = depth; + t.plugOptions.snapping = snapping; + return t; + } + + #endregion + +#if true // PHYSICS_MARKER + #region Rigidbody + + /// Tweens a Rigidbody's position in a spiral shape. + /// Also stores the transform as the tween's target so it can be used for filtered operations + /// The duration of the tween + /// The axis around which the spiral will rotate + /// The type of spiral movement + /// Speed of the rotations + /// Frequency of the rotation. Lower values lead to wider spirals + /// Indicates how much the tween should move along the spiral's axis + /// If TRUE the tween will smoothly snap all values to integers + public static Tweener DOSpiral( + this Rigidbody target, float duration, Vector3? axis = null, SpiralMode mode = SpiralMode.Expand, + float speed = 1, float frequency = 10, float depth = 0, bool snapping = false + ) { + if (Mathf.Approximately(speed, 0)) speed = 1; + if (axis == null || axis == Vector3.zero) axis = Vector3.forward; + + TweenerCore t = DOTween.To(SpiralPlugin.Get(), () => target.position, target.MovePosition, (Vector3)axis, duration) + .SetTarget(target); + + t.plugOptions.mode = mode; + t.plugOptions.speed = speed; + t.plugOptions.frequency = frequency; + t.plugOptions.depth = depth; + t.plugOptions.snapping = snapping; + return t; + } + + #endregion +#endif + + #endregion + } +} diff --git a/Assets/Plugins/Demigiant/DOTweenPro/DOTweenProShortcuts.cs.meta b/Assets/Plugins/Demigiant/DOTweenPro/DOTweenProShortcuts.cs.meta new file mode 100644 index 00000000..bc6e8631 --- /dev/null +++ b/Assets/Plugins/Demigiant/DOTweenPro/DOTweenProShortcuts.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1c3190a1a1c53f449926f6d5542b4ce5 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/Assets/Plugins/Demigiant/DOTweenPro/DOTweenTextMeshPro.cs b/Assets/Plugins/Demigiant/DOTweenPro/DOTweenTextMeshPro.cs new file mode 100644 index 00000000..cdfd47dd --- /dev/null +++ b/Assets/Plugins/Demigiant/DOTweenPro/DOTweenTextMeshPro.cs @@ -0,0 +1,1037 @@ +// Author: Daniele Giardini - http://www.demigiant.com +// Created: 2015/03/27 19:02 +// +// License Copyright (c) Daniele Giardini. +// This work is subject to the terms at http://dotween.demigiant.com/license.php + + +#if true // MODULE_MARKER +using System; +using System.Globalization; +using System.Collections.Generic; +using DG.Tweening.Core; +using DG.Tweening.Plugins.Options; +using UnityEngine; +using TMPro; +using Object = UnityEngine.Object; + +namespace DG.Tweening +{ + public enum TMPSkewSpanMode + { + /// Applies the skew as-is (like normal skew works): the longer the text-span the higher the last character will be + Default, + /// Applies the skew scaled by the size of the text-span: the max skew/displacement will be the given skew factor + AsMaxSkewFactor + } + + /// + /// Methods that extend TMP_Text objects and allow to directly create and control tweens from their instances. + /// + public static class ShortcutExtensionsTMPText + { + #region Colors + + /// Tweens a TextMeshPro's color to the given value. + /// Also stores the TextMeshPro as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + public static TweenerCore DOColor(this TMP_Text target, Color endValue, float duration) + { + TweenerCore t = DOTween.To(() => target.color, x => target.color = x, endValue, duration); + t.SetTarget(target); + return t; + } + + /// Tweens a TextMeshPro's faceColor to the given value. + /// Also stores the TextMeshPro as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + public static TweenerCore DOFaceColor(this TMP_Text target, Color32 endValue, float duration) + { + TweenerCore t = DOTween.To(() => target.faceColor, x => target.faceColor = x, endValue, duration); + t.SetTarget(target); + return t; + } + + /// Tweens a TextMeshPro's outlineColor to the given value. + /// Also stores the TextMeshPro as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + public static TweenerCore DOOutlineColor(this TMP_Text target, Color32 endValue, float duration) + { + TweenerCore t = DOTween.To(() => target.outlineColor, x => target.outlineColor = x, endValue, duration); + t.SetTarget(target); + return t; + } + + /// Tweens a TextMeshPro's glow color to the given value. + /// Also stores the TextMeshPro as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + /// If TRUE will use the fontSharedMaterial instead than the fontMaterial + public static TweenerCore DOGlowColor(this TMP_Text target, Color endValue, float duration, bool useSharedMaterial = false) + { + TweenerCore t = useSharedMaterial + ? target.fontSharedMaterial.DOColor(endValue, "_GlowColor", duration) + : target.fontMaterial.DOColor(endValue, "_GlowColor", duration); + t.SetTarget(target); + return t; + } + + /// Tweens a TextMeshPro's alpha color to the given value. + /// Also stores the TextMeshPro as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + public static TweenerCore DOFade(this TMP_Text target, float endValue, float duration) + { + TweenerCore t = DOTween.ToAlpha(() => target.color, x => target.color = x, endValue, duration); + t.SetTarget(target); + return t; + } + + /// Tweens a TextMeshPro faceColor's alpha to the given value. + /// Also stores the TextMeshPro as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + public static TweenerCore DOFaceFade(this TMP_Text target, float endValue, float duration) + { + TweenerCore t = DOTween.ToAlpha(() => target.faceColor, x => target.faceColor = x, endValue, duration); + t.SetTarget(target); + return t; + } + + #endregion + + #region Other + + /// Tweens a TextMeshPro's scale to the given value (using correct uniform scale as TMP requires). + /// Also stores the TextMeshPro as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + public static TweenerCore DOScale(this TMP_Text target, float endValue, float duration) + { + Transform trans = target.transform; + Vector3 endValueV3 = new Vector3(endValue, endValue, endValue); + TweenerCore t = DOTween.To(() => trans.localScale, x => trans.localScale = x, endValueV3, duration); + t.SetTarget(target); + return t; + } + + /// + /// Tweens a TextMeshPro's text from one integer to another, with options for thousands separators + /// + /// The value to start from + /// The end value to reach + /// The duration of the tween + /// If TRUE (default) also adds thousands separators + /// The to use (InvariantCulture if NULL) + public static TweenerCore DOCounter( + this TMP_Text target, int fromValue, int endValue, float duration, bool addThousandsSeparator = true, CultureInfo culture = null + ){ + int v = fromValue; + CultureInfo cInfo = !addThousandsSeparator ? null : culture ?? CultureInfo.InvariantCulture; + TweenerCore t = DOTween.To(() => v, x => { + v = x; + target.text = addThousandsSeparator + ? v.ToString("N0", cInfo) + : v.ToString(); + }, endValue, duration); + t.SetTarget(target); + return t; + } + + /// Tweens a TextMeshPro's fontSize to the given value. + /// Also stores the TextMeshPro as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + public static TweenerCore DOFontSize(this TMP_Text target, float endValue, float duration) + { + TweenerCore t = DOTween.To(() => target.fontSize, x => target.fontSize = x, endValue, duration); + t.SetTarget(target); + return t; + } + + /// Tweens a TextMeshPro's maxVisibleCharacters to the given value. + /// Also stores the TextMeshPro as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + public static TweenerCore DOMaxVisibleCharacters(this TMP_Text target, int endValue, float duration) + { + TweenerCore t = DOTween.To(() => target.maxVisibleCharacters, x => target.maxVisibleCharacters = x, endValue, duration); + t.SetTarget(target); + return t; + } + + /// Tweens a TextMeshPro's text to the given value. + /// Also stores the TextMeshPro as the tween's target so it can be used for filtered operations + /// The end string to tween toThe duration of the tween + /// If TRUE (default), rich text will be interpreted correctly while animated, + /// otherwise all tags will be considered as normal text + /// The type of scramble mode to use, if any + /// A string containing the characters to use for scrambling. + /// Use as many characters as possible (minimum 10) because DOTween uses a fast scramble mode which gives better results with more characters. + /// Leave it to NULL (default) to use default ones + public static TweenerCore DOText(this TMP_Text target, string endValue, float duration, bool richTextEnabled = true, ScrambleMode scrambleMode = ScrambleMode.None, string scrambleChars = null) + { + TweenerCore t = DOTween.To(() => target.text, x => target.text = x, endValue, duration); + t.SetOptions(richTextEnabled, scrambleMode, scrambleChars) + .SetTarget(target); + return t; + } + + #endregion + } + + #region DOTweenTMPAnimator + + // █████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ + // ███ CLASS ███████████████████████████████████████████████████████████████████████████████████████████████████████████ + // █████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ + + /// + /// Wrapper for objects that enables per-character tweening + /// (you don't need this if instead you want to animate the whole text object). + /// It also contains various handy methods to simply deform text without animating it ;) + /// EXAMPLE: + /// DOTweenTMPAnimator animator = new DOTweenTMPAnimator(myTextMeshProTextField); + /// Tween tween = animator.DOCharScale(characterIndex, scaleValue, duration); + /// + /// + public class DOTweenTMPAnimator : IDisposable + { + static readonly Dictionary _targetToAnimator = new Dictionary(); + + /// that this animator is linked to + public TMP_Text target { get; private set; } + public TMP_TextInfo textInfo { get; private set; } + readonly List _charTransforms = new List(); + TMP_MeshInfo[] _cachedMeshInfos; + bool _ignoreTextChangedEvent; + + /// + /// Creates a new instance of the , which is necessary to animate by single characters. + /// If a already exists for the same object it will be disposed + /// (but not its tweens, those you will have to kill manually). + /// If you want to animate the whole text object you don't need this, and you can use direct DO shortcuts instead. + /// IMPORTANT: the target must have been enabled/activated at least once before you can use it with this + /// + /// The that will be linked to this animator + public DOTweenTMPAnimator(TMP_Text target) + { + if (target == null) { + Debugger.LogError("DOTweenTMPAnimator target can't be null"); + return; + } + if (!target.gameObject.activeInHierarchy) { + Debugger.LogError("You can't create a DOTweenTMPAnimator if its target is disabled"); + return; + } + // Verify that there's no other animators for the same target, and in case dispose them + if (_targetToAnimator.ContainsKey(target)) { + if (Debugger.logPriority >= 2) { + Debugger.Log(string.Format( + "A DOTweenTMPAnimator for \"{0}\" already exists: disposing it because you can't have more than one DOTweenTMPAnimator" + + " for the same TextMesh Pro object. If you have tweens running on the disposed DOTweenTMPAnimator you should kill them manually", + target + )); + } + _targetToAnimator[target].Dispose(); + _targetToAnimator.Remove(target); + } + // + this.target = target; + _targetToAnimator.Add(target, this); + Refresh(); + // Listeners + TMPro_EventManager.TEXT_CHANGED_EVENT.Add(OnTextChanged); + } + + /// + /// If a instance exists for the given target disposes it + /// + public static void DisposeInstanceFor(TMP_Text target) + { + if (!_targetToAnimator.ContainsKey(target)) return; + _targetToAnimator[target].Dispose(); + _targetToAnimator.Remove(target); + } + + /// + /// Clears and disposes of this object + /// + public void Dispose() + { + target = null; + _charTransforms.Clear(); + textInfo = null; + _cachedMeshInfos = null; + TMPro_EventManager.TEXT_CHANGED_EVENT.Remove(OnTextChanged); + } + + /// + /// Refreshes the animator text data and resets all transformation data. Call this after you change the target + /// + public void Refresh() + { + _ignoreTextChangedEvent = true; + target.ForceMeshUpdate(true); + textInfo = target.textInfo; + _cachedMeshInfos = textInfo.CopyMeshInfoVertexData(); + int totChars = textInfo.characterCount; + int totCurrent = _charTransforms.Count; + if (totCurrent > totChars) { + _charTransforms.RemoveRange(totChars, totCurrent - totChars); + totCurrent = totChars; + } + for (int i = 0; i < totCurrent; ++i) { + CharTransform c = _charTransforms[i]; + c.ResetTransformationData(); + c.Refresh(textInfo, _cachedMeshInfos); + _charTransforms[i] = c; + } + for (int i = totCurrent; i < totChars; ++i) _charTransforms.Add(new CharTransform(i, textInfo, _cachedMeshInfos)); + _ignoreTextChangedEvent = false; + } + + /// + /// Resets all deformations + /// + public void Reset() + { + int totCurrent = _charTransforms.Count; + for (int i = 0; i < totCurrent; ++i) _charTransforms[i].ResetAll(target, textInfo.meshInfo, _cachedMeshInfos); + } + + void OnTextChanged(Object obj) + { + if (_ignoreTextChangedEvent || target == null || obj != target) return; + Refresh(); + } + + bool ValidateChar(int charIndex, bool isTween = true) + { + if (textInfo.characterCount <= charIndex) { + Debugger.LogError(string.Format("CharIndex {0} doesn't exist", charIndex)); + return false; + } + if (!textInfo.characterInfo[charIndex].isVisible) { + if (Debugger.logPriority > 1) { + if (isTween) { + Debugger.Log(string.Format( + "CharIndex {0} isn't visible, ignoring it and returning an empty tween (TextMesh Pro will behave weirdly if invisible chars are included in the animation)", + charIndex + )); + } else { + Debugger.Log(string.Format("CharIndex {0} isn't visible, ignoring it", charIndex)); + } + } + return false; + } + return true; + } + + bool ValidateSpan(int fromCharIndex, int toCharIndex, out int firstVisibleCharIndex, out int lastVisibleCharIndex) + { + firstVisibleCharIndex = -1; // First visible/existing charIndex from given index + lastVisibleCharIndex = -1; // Last visible/existing charIndex backwards from given index + int charCount = textInfo.characterCount; + if (fromCharIndex >= charCount) return false; + if (toCharIndex >= charCount) toCharIndex = charCount - 1; + for (int i = fromCharIndex; i < toCharIndex + 1; ++i) { + if (!_charTransforms[i].isVisible) continue; + firstVisibleCharIndex = i; + break; + } + if (firstVisibleCharIndex == -1) return false; + for (int i = toCharIndex; i > firstVisibleCharIndex - 1; --i) { + if (!_charTransforms[i].isVisible) continue; + lastVisibleCharIndex = i; + break; + } + if (lastVisibleCharIndex == -1) return false; + return true; + } + + #region Word Setters + + /// + /// Skews a span of characters uniformly (like normal skew works in graphic applications) + /// + /// First char index of the span to skew + /// Last char index of the span to skew + /// Skew factor + /// If TRUE skews the top side of the span, otherwise the bottom one + public void SkewSpanX(int fromCharIndex, int toCharIndex, float skewFactor, bool skewTop = true) + { + int firstVisibleCharIndex, lastVisibleCharIndex; + if (!ValidateSpan(fromCharIndex, toCharIndex, out firstVisibleCharIndex, out lastVisibleCharIndex)) return; + for (int i = firstVisibleCharIndex; i < lastVisibleCharIndex + 1; ++i) { + if (!_charTransforms[i].isVisible) continue; + CharVertices v = _charTransforms[i].GetVertices(); + float skew = SkewCharX(i, skewFactor, skewTop); + } + } + + /// + /// Skews a span of characters uniformly (like normal skew works in graphic applications) + /// + /// First char index of the span to skew + /// Last char index of the span to skew + /// Skew factor + /// Skew mode + /// If TRUE skews the right side of the span, otherwise the left one + public void SkewSpanY( + int fromCharIndex, int toCharIndex, float skewFactor, + TMPSkewSpanMode mode = TMPSkewSpanMode.Default, bool skewRight = true + ){ + int firstVisibleCharIndex, lastVisibleCharIndex; + if (!ValidateSpan(fromCharIndex, toCharIndex, out firstVisibleCharIndex, out lastVisibleCharIndex)) return; + if (mode == TMPSkewSpanMode.AsMaxSkewFactor) { + CharVertices firstVisibleCharVertices = _charTransforms[firstVisibleCharIndex].GetVertices(); + CharVertices lastVisibleCharVertices = _charTransforms[lastVisibleCharIndex].GetVertices(); + float spanW = Mathf.Abs(lastVisibleCharVertices.bottomRight.x - firstVisibleCharVertices.bottomLeft.x); + float spanH = Mathf.Abs(lastVisibleCharVertices.topRight.y - lastVisibleCharVertices.bottomRight.y); + float ratio = spanH / spanW; + skewFactor *= ratio; + } + float offsetY = 0; + CharVertices prevCharVertices = new CharVertices(); + float prevCharSkew = 0; + if (skewRight) { + for (int i = firstVisibleCharIndex; i < lastVisibleCharIndex + 1; ++i) { + if (!_charTransforms[i].isVisible) continue; + CharVertices v = _charTransforms[i].GetVertices(); + float skew = SkewCharY(i, skewFactor, skewRight); + if (i > firstVisibleCharIndex) { + float prevCharW = Mathf.Abs(prevCharVertices.bottomLeft.x - prevCharVertices.bottomRight.x); + float charsDist = Mathf.Abs(v.bottomLeft.x - prevCharVertices.bottomRight.x); + offsetY += prevCharSkew + (prevCharSkew * charsDist) / prevCharW; + SetCharOffset(i, new Vector3(0, _charTransforms[i].offset.y + offsetY, 0)); + } + prevCharVertices = v; + prevCharSkew = skew; + } + } else { + for (int i = lastVisibleCharIndex; i > firstVisibleCharIndex - 1; --i) { + if (!_charTransforms[i].isVisible) continue; + CharVertices v = _charTransforms[i].GetVertices(); + float skew = SkewCharY(i, skewFactor, skewRight); + if (i < lastVisibleCharIndex) { + float prevCharW = Mathf.Abs(prevCharVertices.bottomLeft.x - prevCharVertices.bottomRight.x); + float charsDist = Mathf.Abs(v.bottomRight.x - prevCharVertices.bottomLeft.x); + offsetY += prevCharSkew + (prevCharSkew * charsDist) / prevCharW; + SetCharOffset(i, new Vector3(0, _charTransforms[i].offset.y + offsetY, 0)); + } + prevCharVertices = v; + prevCharSkew = skew; + } + } + } + + #endregion + + #region Char Getters + + /// + /// Returns the current color of the given character, if it exists and is visible. + /// + /// Character index + public Color GetCharColor(int charIndex) + { + if (!ValidateChar(charIndex)) return Color.white; + return _charTransforms[charIndex].GetColor(textInfo.meshInfo); + } + + /// + /// Returns the current offset of the given character, if it exists and is visible. + /// + /// Character index + public Vector3 GetCharOffset(int charIndex) + { + if (!ValidateChar(charIndex)) return Vector3.zero; + return _charTransforms[charIndex].offset; + } + + /// + /// Returns the current rotation of the given character, if it exists and is visible. + /// + /// Character index + public Vector3 GetCharRotation(int charIndex) + { + if (!ValidateChar(charIndex)) return Vector3.zero; + return _charTransforms[charIndex].rotation.eulerAngles; + } + + /// + /// Returns the current scale of the given character, if it exists and is visible. + /// + /// Character index + public Vector3 GetCharScale(int charIndex) + { + if (!ValidateChar(charIndex)) return Vector3.zero; + return _charTransforms[charIndex].scale; + } + + #endregion + + #region Char Setters + + /// + /// Immediately sets the color of the given character. + /// Will do nothing if the is invalid or the character isn't visible + /// + /// Character index + /// Color to set + public void SetCharColor(int charIndex, Color32 color) + { + if (!ValidateChar(charIndex)) return; + CharTransform c = _charTransforms[charIndex]; + c.UpdateColor(target, color, textInfo.meshInfo); + _charTransforms[charIndex] = c; + } + + /// + /// Immediately sets the offset of the given character. + /// Will do nothing if the is invalid or the character isn't visible + /// + /// Character index + /// Offset to set + public void SetCharOffset(int charIndex, Vector3 offset) + { + if (!ValidateChar(charIndex)) return; + CharTransform c = _charTransforms[charIndex]; + c.UpdateGeometry(target, offset, c.rotation, c.scale, _cachedMeshInfos); + _charTransforms[charIndex] = c; + } + + /// + /// Immediately sets the rotation of the given character. + /// Will do nothing if the is invalid or the character isn't visible + /// + /// Character index + /// Rotation to set + public void SetCharRotation(int charIndex, Vector3 rotation) + { + if (!ValidateChar(charIndex)) return; + CharTransform c = _charTransforms[charIndex]; + c.UpdateGeometry(target, c.offset, Quaternion.Euler(rotation), c.scale, _cachedMeshInfos); + _charTransforms[charIndex] = c; + } + + /// + /// Immediately sets the scale of the given character. + /// Will do nothing if the is invalid or the character isn't visible + /// + /// Character index + /// Scale to set + public void SetCharScale(int charIndex, Vector3 scale) + { + if (!ValidateChar(charIndex)) return; + CharTransform c = _charTransforms[charIndex]; + c.UpdateGeometry(target, c.offset, c.rotation, scale, _cachedMeshInfos); + _charTransforms[charIndex] = c; + } + + /// + /// Immediately shifts the vertices of the given character by the given factor. + /// Will do nothing if the is invalid or the character isn't visible + /// + /// Character index + /// Top left offset + /// Top right offset + /// Bottom left offset + /// Bottom right offset + public void ShiftCharVertices(int charIndex, Vector3 topLeftShift, Vector3 topRightShift, Vector3 bottomLeftShift, Vector3 bottomRightShift) + { + if (!ValidateChar(charIndex)) return; + CharTransform c = _charTransforms[charIndex]; + c.ShiftVertices(target, topLeftShift, topRightShift, bottomLeftShift, bottomRightShift); + _charTransforms[charIndex] = c; + } + + /// + /// Skews the given character horizontally along the X axis and returns the skew amount applied (based on the character's size) + /// + /// Character index + /// skew amount + /// If TRUE skews the top side of the character, otherwise the bottom one + public float SkewCharX(int charIndex, float skewFactor, bool skewTop = true) + { + if (!ValidateChar(charIndex)) return 0; + Vector3 skewV = new Vector3(skewFactor, 0, 0); + CharTransform c = _charTransforms[charIndex]; + if (skewTop) c.ShiftVertices(target, skewV, skewV, Vector3.zero, Vector3.zero); + else c.ShiftVertices(target, Vector3.zero, Vector3.zero, skewV, skewV); + _charTransforms[charIndex] = c; + return skewFactor; + } + + /// + /// Skews the given character vertically along the Y axis and returns the skew amount applied (based on the character's size) + /// + /// Character index + /// skew amount + /// If TRUE skews the right side of the character, otherwise the left one + /// If TRUE applies exactly the given , + /// otherwise modifies it based on the aspectRation of the character + public float SkewCharY(int charIndex, float skewFactor, bool skewRight = true, bool fixedSkew = false) + { + if (!ValidateChar(charIndex)) return 0; + float skew = fixedSkew ? skewFactor : skewFactor * textInfo.characterInfo[charIndex].aspectRatio; + Vector3 skewV = new Vector3(0, skew, 0); + CharTransform c = _charTransforms[charIndex]; + if (skewRight) c.ShiftVertices(target, Vector3.zero, skewV, Vector3.zero, skewV); + else c.ShiftVertices(target, skewV, Vector3.zero, skewV, Vector3.zero); + _charTransforms[charIndex] = c; + return skew; + } + + /// + /// Resets the eventual vertices shift applied to the given character via . + /// Will do nothing if the is invalid or the character isn't visible + /// + /// Character index + public void ResetVerticesShift(int charIndex) + { + if (!ValidateChar(charIndex)) return; + CharTransform c = _charTransforms[charIndex]; + c.ResetVerticesShift(target); + _charTransforms[charIndex] = c; + } + + #endregion + + #region Char Tweens + + /// Tweens a character's alpha to the given value and returns the . + /// Will return NULL if the is invalid or the character isn't visible. + /// The index of the character to tween (will throw an error if it doesn't exist) + /// The end value to reachThe duration of the tween + public TweenerCore DOFadeChar(int charIndex, float endValue, float duration) + { + if (!ValidateChar(charIndex)) return null; + TweenerCore t = DOTween.ToAlpha(() => _charTransforms[charIndex].GetColor(textInfo.meshInfo), x => { + _charTransforms[charIndex].UpdateAlpha(target, x, textInfo.meshInfo); + }, endValue, duration); + return t; + } + + /// Tweens a character's color to the given value and returns the . + /// Will return NULL if the is invalid or the character isn't visible. + /// The index of the character to tween (will throw an error if it doesn't exist) + /// The end value to reachThe duration of the tween + public TweenerCore DOColorChar(int charIndex, Color endValue, float duration) + { + if (!ValidateChar(charIndex)) return null; + TweenerCore t = DOTween.To(() => _charTransforms[charIndex].GetColor(textInfo.meshInfo), x => { + _charTransforms[charIndex].UpdateColor(target, x, textInfo.meshInfo); + }, endValue, duration); + return t; + } + + /// Tweens a character's offset to the given value and returns the . + /// Will return NULL if the is invalid or the character isn't visible. + /// The index of the character to tween (will throw an error if it doesn't exist) + /// The end value to reachThe duration of the tween + public TweenerCore DOOffsetChar(int charIndex, Vector3 endValue, float duration) + { + if (!ValidateChar(charIndex)) return null; + TweenerCore t = DOTween.To(() => _charTransforms[charIndex].offset, x => { + CharTransform charT = _charTransforms[charIndex]; + charT.UpdateGeometry(target, x, charT.rotation, charT.scale, _cachedMeshInfos); + _charTransforms[charIndex] = charT; + }, endValue, duration); + return t; + } + + /// Tweens a character's rotation to the given value and returns the . + /// Will return NULL if the is invalid or the character isn't visible. + /// The index of the character to tween (will throw an error if it doesn't exist) + /// The end value to reachThe duration of the tween + /// Rotation mode + public TweenerCore DORotateChar(int charIndex, Vector3 endValue, float duration, RotateMode mode = RotateMode.Fast) + { + if (!ValidateChar(charIndex)) return null; + TweenerCore t = DOTween.To(() => _charTransforms[charIndex].rotation, x => { + CharTransform charT = _charTransforms[charIndex]; + charT.UpdateGeometry(target, charT.offset, x, charT.scale, _cachedMeshInfos); + _charTransforms[charIndex] = charT; + }, endValue, duration); + t.plugOptions.rotateMode = mode; + return t; + } + + /// Tweens a character's scale to the given value and returns the . + /// Will return NULL if the is invalid or the character isn't visible. + /// The index of the character to tween (will throw an error if it doesn't exist) + /// The end value to reachThe duration of the tween + public TweenerCore DOScaleChar(int charIndex, float endValue, float duration) + { + return DOScaleChar(charIndex, new Vector3(endValue, endValue, endValue), duration); + } + /// Tweens a character's color to the given value and returns the . + /// Will return NULL if the is invalid or the character isn't visible. + /// The index of the character to tween (will throw an error if it doesn't exist) + /// The end value to reachThe duration of the tween + public TweenerCore DOScaleChar(int charIndex, Vector3 endValue, float duration) + { + if (!ValidateChar(charIndex)) return null; + TweenerCore t = DOTween.To(() => _charTransforms[charIndex].scale, x => { + CharTransform charT = _charTransforms[charIndex]; + charT.UpdateGeometry(target, charT.offset, charT.rotation, x, _cachedMeshInfos); + _charTransforms[charIndex] = charT; + }, endValue, duration); + return t; + } + + /// Punches a character's offset towards the given direction and then back to the starting one + /// as if it was connected to the starting position via an elastic. + /// The index of the character to tween (will throw an error if it doesn't exist) + /// The punch strength + /// The duration of the tween + /// Indicates how much will the punch vibrate per second + /// Represents how much (0 to 1) the vector will go beyond the starting size when bouncing backwards. + /// 1 creates a full oscillation between the punch offset and the opposite offset, + /// while 0 oscillates only between the punch offset and the start offset + public Tweener DOPunchCharOffset(int charIndex, Vector3 punch, float duration, int vibrato = 10, float elasticity = 1) + { + if (!ValidateChar(charIndex)) return null; + if (duration <= 0) { + if (Debugger.logPriority > 0) Debug.LogWarning("Duration can't be 0, returning NULL without creating a tween"); + return null; + } + return DOTween.Punch(() => _charTransforms[charIndex].offset, x => { + CharTransform charT = _charTransforms[charIndex]; + charT.UpdateGeometry(target, x, charT.rotation, charT.scale, _cachedMeshInfos); + _charTransforms[charIndex] = charT; + }, punch, duration, vibrato, elasticity); + } + + /// Punches a character's rotation towards the given direction and then back to the starting one + /// as if it was connected to the starting position via an elastic. + /// The index of the character to tween (will throw an error if it doesn't exist) + /// The punch strength + /// The duration of the tween + /// Indicates how much will the punch vibrate per second + /// Represents how much (0 to 1) the vector will go beyond the starting size when bouncing backwards. + /// 1 creates a full oscillation between the punch rotation and the opposite rotation, + /// while 0 oscillates only between the punch rotation and the start rotation + public Tweener DOPunchCharRotation(int charIndex, Vector3 punch, float duration, int vibrato = 10, float elasticity = 1) + { + if (!ValidateChar(charIndex)) return null; + if (duration <= 0) { + if (Debugger.logPriority > 0) Debug.LogWarning("Duration can't be 0, returning NULL without creating a tween"); + return null; + } + return DOTween.Punch(() => _charTransforms[charIndex].rotation.eulerAngles, x => { + CharTransform charT = _charTransforms[charIndex]; + charT.UpdateGeometry(target, charT.offset, Quaternion.Euler(x), charT.scale, _cachedMeshInfos); + _charTransforms[charIndex] = charT; + }, punch, duration, vibrato, elasticity); + } + + /// Punches a character's scale towards the given direction and then back to the starting one + /// as if it was connected to the starting position via an elastic. + /// The index of the character to tween (will throw an error if it doesn't exist) + /// The punch strength (added to the character's current scale) + /// The duration of the tween + /// Indicates how much will the punch vibrate per second + /// Represents how much (0 to 1) the vector will go beyond the starting size when bouncing backwards. + /// 1 creates a full oscillation between the punch scale and the opposite scale, + /// while 0 oscillates only between the punch scale and the start scale + public Tweener DOPunchCharScale(int charIndex, float punch, float duration, int vibrato = 10, float elasticity = 1) + { + return DOPunchCharScale(charIndex, new Vector3(punch, punch, punch), duration, vibrato, elasticity); + } + /// Punches a character's scale towards the given direction and then back to the starting one + /// as if it was connected to the starting position via an elastic. + /// The index of the character to tween (will throw an error if it doesn't exist) + /// The punch strength (added to the character's current scale) + /// The duration of the tween + /// Indicates how much will the punch vibrate per second + /// Represents how much (0 to 1) the vector will go beyond the starting size when bouncing backwards. + /// 1 creates a full oscillation between the punch scale and the opposite scale, + /// while 0 oscillates only between the punch scale and the start scale + public Tweener DOPunchCharScale(int charIndex, Vector3 punch, float duration, int vibrato = 10, float elasticity = 1) + { + if (!ValidateChar(charIndex)) return null; + if (duration <= 0) { + if (Debugger.logPriority > 0) Debug.LogWarning("Duration can't be 0, returning NULL without creating a tween"); + return null; + } + return DOTween.Punch(() => _charTransforms[charIndex].scale, x => { + CharTransform charT = _charTransforms[charIndex]; + charT.UpdateGeometry(target, charT.offset, charT.rotation, x, _cachedMeshInfos); + _charTransforms[charIndex] = charT; + }, punch, duration, vibrato, elasticity); + } + + /// Shakes a character's offset with the given values. + /// The index of the character to tween (will throw an error if it doesn't exist) + /// The duration of the tween + /// The shake strength + /// Indicates how much will the shake vibrate + /// Indicates how much the shake will be random (0 to 180 - values higher than 90 kind of suck, so beware). + /// Setting it to 0 will shake along a single direction. + /// If TRUE the shake will automatically fadeOut smoothly within the tween's duration, otherwise it will not + public Tweener DOShakeCharOffset(int charIndex, float duration, float strength, int vibrato = 10, float randomness = 90, bool fadeOut = true) + { + return DOShakeCharOffset(charIndex, duration, new Vector3(strength, strength, strength), vibrato, randomness, fadeOut); + } + /// Shakes a character's offset with the given values. + /// The index of the character to tween (will throw an error if it doesn't exist) + /// The duration of the tween + /// The shake strength + /// Indicates how much will the shake vibrate + /// Indicates how much the shake will be random (0 to 180 - values higher than 90 kind of suck, so beware). + /// Setting it to 0 will shake along a single direction. + /// If TRUE the shake will automatically fadeOut smoothly within the tween's duration, otherwise it will not + public Tweener DOShakeCharOffset(int charIndex, float duration, Vector3 strength, int vibrato = 10, float randomness = 90, bool fadeOut = true) + { + if (!ValidateChar(charIndex)) return null; + if (duration <= 0) { + if (Debugger.logPriority > 0) Debug.LogWarning("Duration can't be 0, returning NULL without creating a tween"); + return null; + } + return DOTween.Shake(() => _charTransforms[charIndex].offset, x => { + CharTransform charT = _charTransforms[charIndex]; + charT.UpdateGeometry(target, x, charT.rotation, charT.scale, _cachedMeshInfos); + _charTransforms[charIndex] = charT; + }, duration, strength, vibrato, randomness, fadeOut); + } + + /// Shakes a character's rotation with the given values. + /// The index of the character to tween (will throw an error if it doesn't exist) + /// The duration of the tween + /// The shake strength + /// Indicates how much will the shake vibrate + /// Indicates how much the shake will be random (0 to 180 - values higher than 90 kind of suck, so beware). + /// Setting it to 0 will shake along a single direction. + /// If TRUE the shake will automatically fadeOut smoothly within the tween's duration, otherwise it will not + public Tweener DOShakeCharRotation(int charIndex, float duration, Vector3 strength, int vibrato = 10, float randomness = 90, bool fadeOut = true) + { + if (!ValidateChar(charIndex)) return null; + if (duration <= 0) { + if (Debugger.logPriority > 0) Debug.LogWarning("Duration can't be 0, returning NULL without creating a tween"); + return null; + } + return DOTween.Shake(() => _charTransforms[charIndex].rotation.eulerAngles, x => { + CharTransform charT = _charTransforms[charIndex]; + charT.UpdateGeometry(target, charT.offset, Quaternion.Euler(x), charT.scale, _cachedMeshInfos); + _charTransforms[charIndex] = charT; + }, duration, strength, vibrato, randomness, fadeOut); + } + + /// Shakes a character's scale with the given values. + /// The index of the character to tween (will throw an error if it doesn't exist) + /// The duration of the tween + /// The shake strength + /// Indicates how much will the shake vibrate + /// Indicates how much the shake will be random (0 to 180 - values higher than 90 kind of suck, so beware). + /// Setting it to 0 will shake along a single direction. + /// If TRUE the shake will automatically fadeOut smoothly within the tween's duration, otherwise it will not + public Tweener DOShakeCharScale(int charIndex, float duration, float strength, int vibrato = 10, float randomness = 90, bool fadeOut = true) + { + return DOShakeCharScale(charIndex, duration, new Vector3(strength, strength, strength), vibrato, randomness, fadeOut); + } + /// Shakes a character's scale with the given values. + /// The index of the character to tween (will throw an error if it doesn't exist) + /// The duration of the tween + /// The shake strength + /// Indicates how much will the shake vibrate + /// Indicates how much the shake will be random (0 to 180 - values higher than 90 kind of suck, so beware). + /// Setting it to 0 will shake along a single direction. + /// If TRUE the shake will automatically fadeOut smoothly within the tween's duration, otherwise it will not + public Tweener DOShakeCharScale(int charIndex, float duration, Vector3 strength, int vibrato = 10, float randomness = 90, bool fadeOut = true) + { + if (!ValidateChar(charIndex)) return null; + if (duration <= 0) { + if (Debugger.logPriority > 0) Debug.LogWarning("Duration can't be 0, returning NULL without creating a tween"); + return null; + } + return DOTween.Shake(() => _charTransforms[charIndex].scale, x => { + CharTransform charT = _charTransforms[charIndex]; + charT.UpdateGeometry(target, charT.offset, charT.rotation, x, _cachedMeshInfos); + _charTransforms[charIndex] = charT; + }, duration, strength, vibrato, randomness, fadeOut); + } + + #endregion + + // ███ INTERNAL CLASSES ████████████████████████████████████████████████████████████████████████████████████████████████ + + struct CharVertices + { + public Vector3 bottomLeft, topLeft, topRight, bottomRight; + + public CharVertices(Vector3 bottomLeft, Vector3 topLeft, Vector3 topRight, Vector3 bottomRight) + { + this.bottomLeft = bottomLeft; + this.topLeft = topLeft; + this.topRight = topRight; + this.bottomRight = bottomRight; + } + } + + // █████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ + + // Vertices of each character are: + // 0 : bottom left, 1 : top left, 2 : top right, 3 : bottom right + struct CharTransform + { + public int charIndex; + public bool isVisible { get; private set; } // FALSE both if it's invisible or if it's a space + public Vector3 offset; + public Quaternion rotation; + public Vector3 scale; + Vector3 _topLeftShift, _topRightShift, _bottomLeftShift, _bottomRightShift; + Vector3 _charMidBaselineOffset; + int _matIndex, _firstVertexIndex; + TMP_MeshInfo _meshInfo; + + public CharTransform(int charIndex, TMP_TextInfo textInfo, TMP_MeshInfo[] cachedMeshInfos) : this() + { + this.charIndex = charIndex; + offset = Vector3.zero; + rotation = Quaternion.identity; + scale = Vector3.one; + Refresh(textInfo, cachedMeshInfos); + } + + public void Refresh(TMP_TextInfo textInfo, TMP_MeshInfo[] cachedMeshInfos) + { + TMP_CharacterInfo charInfo = textInfo.characterInfo[charIndex]; + bool isSpaceChar = charInfo.character == ' '; + isVisible = charInfo.isVisible && !isSpaceChar; + _matIndex = charInfo.materialReferenceIndex; + _firstVertexIndex = charInfo.vertexIndex; + _meshInfo = textInfo.meshInfo[_matIndex]; + Vector3[] cachedVertices = cachedMeshInfos[_matIndex].vertices; + _charMidBaselineOffset = isSpaceChar + ? Vector3.zero + : (cachedVertices[_firstVertexIndex] + cachedVertices[_firstVertexIndex + 2]) * 0.5f; + } + + public void ResetAll(TMP_Text target, TMP_MeshInfo[] meshInfos, TMP_MeshInfo[] cachedMeshInfos) + { + ResetGeometry(target, cachedMeshInfos); + ResetColors(target, meshInfos); + } + + public void ResetTransformationData() + { + offset = Vector3.zero; + rotation = Quaternion.identity; + scale = Vector3.one; + _topLeftShift = _topRightShift = _bottomLeftShift = _bottomRightShift = Vector3.zero; + } + + public void ResetGeometry(TMP_Text target, TMP_MeshInfo[] cachedMeshInfos) + { + ResetTransformationData(); + Vector3[] destinationVertices = _meshInfo.vertices; + Vector3[] cachedVertices = cachedMeshInfos[_matIndex].vertices; + destinationVertices[_firstVertexIndex + 0] = cachedVertices[_firstVertexIndex + 0]; + destinationVertices[_firstVertexIndex + 1] = cachedVertices[_firstVertexIndex + 1]; + destinationVertices[_firstVertexIndex + 2] = cachedVertices[_firstVertexIndex + 2]; + destinationVertices[_firstVertexIndex + 3] = cachedVertices[_firstVertexIndex + 3]; + _meshInfo.mesh.vertices = _meshInfo.vertices; + target.UpdateGeometry(_meshInfo.mesh, _matIndex); + } + + public void ResetColors(TMP_Text target, TMP_MeshInfo[] meshInfos) + { + Color color = target.color; + Color32[] vertexCols = meshInfos[_matIndex].colors32; + vertexCols[_firstVertexIndex] = color; + vertexCols[_firstVertexIndex + 1] = color; + vertexCols[_firstVertexIndex + 2] = color; + vertexCols[_firstVertexIndex + 3] = color; + target.UpdateVertexData(TMP_VertexDataUpdateFlags.Colors32); + } + + public Color32 GetColor(TMP_MeshInfo[] meshInfos) + { + return meshInfos[_matIndex].colors32[_firstVertexIndex]; + } + + public CharVertices GetVertices() + { + return new CharVertices( + _meshInfo.vertices[_firstVertexIndex], _meshInfo.vertices[_firstVertexIndex + 1], + _meshInfo.vertices[_firstVertexIndex + 2], _meshInfo.vertices[_firstVertexIndex + 3] + ); + } + + public void UpdateAlpha(TMP_Text target, Color alphaColor, TMP_MeshInfo[] meshInfos, bool apply = true) + { + byte alphaByte = (byte)(alphaColor.a * 255); + Color32[] vertexCols = meshInfos[_matIndex].colors32; + vertexCols[_firstVertexIndex].a = alphaByte; + vertexCols[_firstVertexIndex + 1].a = alphaByte; + vertexCols[_firstVertexIndex + 2].a = alphaByte; + vertexCols[_firstVertexIndex + 3].a = alphaByte; + if (apply) target.UpdateVertexData(TMP_VertexDataUpdateFlags.Colors32); + } + + public void UpdateColor(TMP_Text target, Color32 color, TMP_MeshInfo[] meshInfos, bool apply = true) + { + Color32[] vertexCols = meshInfos[_matIndex].colors32; + vertexCols[_firstVertexIndex] = color; + vertexCols[_firstVertexIndex + 1] = color; + vertexCols[_firstVertexIndex + 2] = color; + vertexCols[_firstVertexIndex + 3] = color; + if (apply) target.UpdateVertexData(TMP_VertexDataUpdateFlags.Colors32); + } + + public void UpdateGeometry(TMP_Text target, Vector3 offset, Quaternion rotation, Vector3 scale, TMP_MeshInfo[] cachedMeshInfos, bool apply = true) + { + this.offset = offset; + this.rotation = rotation; + this.scale = scale; + + if (!apply) return; + + Vector3[] destinationVertices = _meshInfo.vertices; + Vector3[] cachedVertices = cachedMeshInfos[_matIndex].vertices; + destinationVertices[_firstVertexIndex] = cachedVertices[_firstVertexIndex + 0] - _charMidBaselineOffset; + destinationVertices[_firstVertexIndex + 1] = cachedVertices[_firstVertexIndex + 1] - _charMidBaselineOffset; + destinationVertices[_firstVertexIndex + 2] = cachedVertices[_firstVertexIndex + 2] - _charMidBaselineOffset; + destinationVertices[_firstVertexIndex + 3] = cachedVertices[_firstVertexIndex + 3] - _charMidBaselineOffset; + Matrix4x4 matrix = Matrix4x4.TRS(this.offset, this.rotation, this.scale); + destinationVertices[_firstVertexIndex] + = matrix.MultiplyPoint3x4(destinationVertices[_firstVertexIndex + 0]) + _charMidBaselineOffset + _bottomLeftShift; + destinationVertices[_firstVertexIndex + 1] + = matrix.MultiplyPoint3x4(destinationVertices[_firstVertexIndex + 1]) + _charMidBaselineOffset + _topLeftShift; + destinationVertices[_firstVertexIndex + 2] + = matrix.MultiplyPoint3x4(destinationVertices[_firstVertexIndex + 2]) + _charMidBaselineOffset + _topRightShift; + destinationVertices[_firstVertexIndex + 3] + = matrix.MultiplyPoint3x4(destinationVertices[_firstVertexIndex + 3]) + _charMidBaselineOffset + _bottomRightShift; + _meshInfo.mesh.vertices = _meshInfo.vertices; + target.UpdateGeometry(_meshInfo.mesh, _matIndex); + } + + public void ShiftVertices(TMP_Text target, Vector3 topLeftShift, Vector3 topRightShift, Vector3 bottomLeftShift, Vector3 bottomRightShift) + { + _topLeftShift += topLeftShift; + _topRightShift += topRightShift; + _bottomLeftShift += bottomLeftShift; + _bottomRightShift += bottomRightShift; + Vector3[] destinationVertices = _meshInfo.vertices; + destinationVertices[_firstVertexIndex] = destinationVertices[_firstVertexIndex] + _bottomLeftShift; + destinationVertices[_firstVertexIndex + 1] = destinationVertices[_firstVertexIndex + 1] + _topLeftShift; + destinationVertices[_firstVertexIndex + 2] = destinationVertices[_firstVertexIndex + 2] + _topRightShift; + destinationVertices[_firstVertexIndex + 3] = destinationVertices[_firstVertexIndex + 3] + _bottomRightShift; + _meshInfo.mesh.vertices = _meshInfo.vertices; + target.UpdateGeometry(_meshInfo.mesh, _matIndex); + } + + public void ResetVerticesShift(TMP_Text target) + { + Vector3[] destinationVertices = _meshInfo.vertices; + destinationVertices[_firstVertexIndex] = destinationVertices[_firstVertexIndex] - _bottomLeftShift; + destinationVertices[_firstVertexIndex + 1] = destinationVertices[_firstVertexIndex + 1] - _topLeftShift; + destinationVertices[_firstVertexIndex + 2] = destinationVertices[_firstVertexIndex + 2] - _topRightShift; + destinationVertices[_firstVertexIndex + 3] = destinationVertices[_firstVertexIndex + 3] - _bottomRightShift; + _meshInfo.mesh.vertices = _meshInfo.vertices; + target.UpdateGeometry(_meshInfo.mesh, _matIndex); + _topLeftShift = _topRightShift = _bottomLeftShift = _bottomRightShift = Vector3.zero; + } + } + } + + #endregion +} +#endif diff --git a/Assets/Plugins/Demigiant/DOTweenPro/DOTweenTextMeshPro.cs.meta b/Assets/Plugins/Demigiant/DOTweenPro/DOTweenTextMeshPro.cs.meta new file mode 100644 index 00000000..613cdbcb --- /dev/null +++ b/Assets/Plugins/Demigiant/DOTweenPro/DOTweenTextMeshPro.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8fb0d65aa5b048649a3a785b82b8f8db +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/Assets/Plugins/Demigiant/DOTweenPro/DOTweenTk2d.cs b/Assets/Plugins/Demigiant/DOTweenPro/DOTweenTk2d.cs new file mode 100644 index 00000000..0c57bfef --- /dev/null +++ b/Assets/Plugins/Demigiant/DOTweenPro/DOTweenTk2d.cs @@ -0,0 +1,247 @@ +// Author: Daniele Giardini - http://www.demigiant.com +// Created: 2014/10/27 15:59 +// +// License Copyright (c) Daniele Giardini. +// This work is subject to the terms at http://dotween.demigiant.com/license.php + +#if false // MODULE_MARKER +using DG.Tweening.Core; +using DG.Tweening.Plugins.Options; +using UnityEngine; + +namespace DG.Tweening +{ + /// + /// Methods that extend 2D Toolkit objects and allow to directly create and control tweens from their instances. + /// + public static class ShortcutExtensionsTk2d + { + #region Sprite + + /// Tweens a 2D Toolkit Sprite's dimensions to the given value. + /// Also stores the Sprite as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + public static TweenerCore DOScale(this tk2dBaseSprite target, Vector3 endValue, float duration) + { + TweenerCore t = DOTween.To(() => target.scale, x => target.scale = x, endValue, duration); + t.SetTarget(target); + return t; + } + /// Tweens a Sprite's dimensions to the given value. + /// Also stores the Sprite as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + public static TweenerCore DOScaleX(this tk2dBaseSprite target, float endValue, float duration) + { + TweenerCore t = DOTween.To(() => target.scale, x => target.scale = x, new Vector3(endValue, 0, 0), duration); + t.SetOptions(AxisConstraint.X) + .SetTarget(target); + return t; + } + /// Tweens a Sprite's dimensions to the given value. + /// Also stores the Sprite as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + public static TweenerCore DOScaleY(this tk2dBaseSprite target, float endValue, float duration) + { + TweenerCore t = DOTween.To(() => target.scale, x => target.scale = x, new Vector3(0, endValue, 0), duration); + t.SetOptions(AxisConstraint.Y) + .SetTarget(target); + return t; + } + /// Tweens a Sprite's dimensions to the given value. + /// Also stores the Sprite as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + public static TweenerCore DOScaleZ(this tk2dBaseSprite target, float endValue, float duration) + { + TweenerCore t = DOTween.To(() => target.scale, x => target.scale = x, new Vector3(0, 0, endValue), duration); + t.SetOptions(AxisConstraint.Z) + .SetTarget(target); + return t; + } + + /// Tweens a 2D Toolkit Sprite's color to the given value. + /// Also stores the Sprite as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + public static TweenerCore DOColor(this tk2dBaseSprite target, Color endValue, float duration) + { + TweenerCore t = DOTween.To(() => target.color, x => target.color = x, endValue, duration); + t.SetTarget(target); + return t; + } + + /// Tweens a 2D Toolkit Sprite's alpha color to the given value. + /// Also stores the Sprite as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + public static TweenerCore DOFade(this tk2dBaseSprite target, float endValue, float duration) + { + TweenerCore t = DOTween.ToAlpha(() => target.color, x => target.color = x, endValue, duration); + t.SetTarget(target); + return t; + } + + /// Tweens a 2D Toolkit Sprite's color using the given gradient + /// (NOTE 1: only uses the colors of the gradient, not the alphas - NOTE 2: creates a Sequence, not a Tweener). + /// Also stores the image as the tween's target so it can be used for filtered operations + /// The gradient to useThe duration of the tween + public static Sequence DOGradientColor(this tk2dBaseSprite target, Gradient gradient, float duration) + { + Sequence s = DOTween.Sequence(); + GradientColorKey[] colors = gradient.colorKeys; + int len = colors.Length; + for (int i = 0; i < len; ++i) { + GradientColorKey c = colors[i]; + if (i == 0 && c.time <= 0) { + target.color = c.color; + continue; + } + float colorDuration = i == len - 1 + ? duration - s.Duration(false) // Verifies that total duration is correct + : duration * (i == 0 ? c.time : c.time - colors[i - 1].time); + s.Append(target.DOColor(c.color, colorDuration).SetEase(Ease.Linear)); + } + s.SetTarget(target); + return s; + } + + #endregion + + #region tk2dSlicedSprite + + /// Tweens a 2D Toolkit SlicedSprite's dimensions to the given value. + /// Also stores the SlicedSprite as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + public static TweenerCore DOScaleDimensions(this tk2dSlicedSprite target, Vector2 endValue, float duration) + { + TweenerCore t = DOTween.To(() => target.dimensions, x => target.dimensions = x, endValue, duration); + t.SetTarget(target); + return t; + } + /// Tweens a SlicedSprite's dimensions to the given value. + /// Also stores the SlicedSprite as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + public static TweenerCore DOScaleDimensionsX(this tk2dSlicedSprite target, float endValue, float duration) + { + TweenerCore t = DOTween.To(() => target.dimensions, x => target.dimensions = x, new Vector2(endValue, 0), duration); + t.SetOptions(AxisConstraint.X) + .SetTarget(target); + return t; + } + /// Tweens a SlicedSprite's dimensions to the given value. + /// Also stores the SlicedSprite as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + public static TweenerCore DOScaleDimensionsY(this tk2dSlicedSprite target, float endValue, float duration) + { + TweenerCore t = DOTween.To(() => target.dimensions, x => target.dimensions = x, new Vector2(0, endValue), duration); + t.SetOptions(AxisConstraint.Y) + .SetTarget(target); + return t; + } + + #endregion + + #region TextMesh + + /// Tweens a 2D Toolkit TextMesh's dimensions to the given value. + /// Also stores the TextMesh as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + public static TweenerCore DOScale(this tk2dTextMesh target, Vector3 endValue, float duration) + { + TweenerCore t = DOTween.To(() => target.scale, x => target.scale = x, endValue, duration); + t.SetTarget(target); + return t; + } + /// Tweens a 2D Toolkit TextMesh's dimensions to the given value. + /// Also stores the TextMesh as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + public static TweenerCore DOScaleX(this tk2dTextMesh target, float endValue, float duration) + { + TweenerCore t = DOTween.To(() => target.scale, x => target.scale = x, new Vector3(endValue, 0, 0), duration); + t.SetOptions(AxisConstraint.X) + .SetTarget(target); + return t; + } + /// Tweens a 2D Toolkit TextMesh's dimensions to the given value. + /// Also stores the TextMesh as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + public static TweenerCore DOScaleY(this tk2dTextMesh target, float endValue, float duration) + { + TweenerCore t = DOTween.To(() => target.scale, x => target.scale = x, new Vector3(0, endValue, 0), duration); + t.SetOptions(AxisConstraint.Y) + .SetTarget(target); + return t; + } + /// Tweens a 2D Toolkit TextMesh's dimensions to the given value. + /// Also stores the TextMesh as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + public static TweenerCore DOScaleZ(this tk2dTextMesh target, float endValue, float duration) + { + TweenerCore t = DOTween.To(() => target.scale, x => target.scale = x, new Vector3(0, 0, endValue), duration); + t.SetOptions(AxisConstraint.Z) + .SetTarget(target); + return t; + } + + /// Tweens a 2D Toolkit TextMesh's color to the given value. + /// Also stores the TextMesh as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + public static TweenerCore DOColor(this tk2dTextMesh target, Color endValue, float duration) + { + TweenerCore t = DOTween.To(() => target.color, x => target.color = x, endValue, duration); + t.SetTarget(target); + return t; + } + + /// Tweens a 2D Toolkit TextMesh's alpha color to the given value. + /// Also stores the TextMesh as the tween's target so it can be used for filtered operations + /// The end value to reachThe duration of the tween + public static TweenerCore DOFade(this tk2dTextMesh target, float endValue, float duration) + { + TweenerCore t = DOTween.ToAlpha(() => target.color, x => target.color = x, endValue, duration); + t.SetTarget(target); + return t; + } + + /// Tweens a 2D Toolkit TextMesh's color using the given gradient + /// (NOTE 1: only uses the colors of the gradient, not the alphas - NOTE 2: creates a Sequence, not a Tweener). + /// Also stores the image as the tween's target so it can be used for filtered operations + /// The gradient to useThe duration of the tween + public static Sequence DOGradientColor(this tk2dTextMesh target, Gradient gradient, float duration) + { + Sequence s = DOTween.Sequence(); + GradientColorKey[] colors = gradient.colorKeys; + int len = colors.Length; + for (int i = 0; i < len; ++i) { + GradientColorKey c = colors[i]; + if (i == 0 && c.time <= 0) { + target.color = c.color; + continue; + } + float colorDuration = i == len - 1 + ? duration - s.Duration(false) // Verifies that total duration is correct + : duration * (i == 0 ? c.time : c.time - colors[i - 1].time); + s.Append(target.DOColor(c.color, colorDuration).SetEase(Ease.Linear)); + } + s.SetTarget(target); + return s; + } + + /// Tweens a tk2dTextMesh's text to the given value. + /// Also stores the tk2dTextMesh as the tween's target so it can be used for filtered operations + /// The end string to tween toThe duration of the tween + /// If TRUE (default), rich text will be interpreted correctly while animated, + /// otherwise all tags will be considered as normal text + /// The type of scramble mode to use, if any + /// A string containing the characters to use for scrambling. + /// Use as many characters as possible (minimum 10) because DOTween uses a fast scramble mode which gives better results with more characters. + /// Leave it to NULL (default) to use default ones + public static TweenerCore DOText(this tk2dTextMesh target, string endValue, float duration, bool richTextEnabled = true, ScrambleMode scrambleMode = ScrambleMode.None, string scrambleChars = null) + { + TweenerCore t = DOTween.To(() => target.text, x => target.text = x, endValue, duration); + t.SetOptions(richTextEnabled, scrambleMode, scrambleChars) + .SetTarget(target); + return t; + } + + #endregion + } +} +#endif diff --git a/Assets/Plugins/Demigiant/DOTweenPro/DOTweenTk2d.cs.meta b/Assets/Plugins/Demigiant/DOTweenPro/DOTweenTk2d.cs.meta new file mode 100644 index 00000000..c909f96c --- /dev/null +++ b/Assets/Plugins/Demigiant/DOTweenPro/DOTweenTk2d.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b590cd7c24ffa5d4faa5b6fa993cccad +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/Assets/Plugins/Demigiant/DOTweenPro/Editor.meta b/Assets/Plugins/Demigiant/DOTweenPro/Editor.meta new file mode 100644 index 00000000..7f8b8b48 --- /dev/null +++ b/Assets/Plugins/Demigiant/DOTweenPro/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d6597f2437dfeb64fa50fd7a98c07c97 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Demigiant/DOTweenPro/Editor/DOTweenAnimationInspector.cs b/Assets/Plugins/Demigiant/DOTweenPro/Editor/DOTweenAnimationInspector.cs new file mode 100644 index 00000000..0e7d0d74 --- /dev/null +++ b/Assets/Plugins/Demigiant/DOTweenPro/Editor/DOTweenAnimationInspector.cs @@ -0,0 +1,750 @@ +// Author: Daniele Giardini - http://www.demigiant.com +// Created: 2015/03/12 16:03 + +using System; +using System.Collections.Generic; +using System.IO; +using DG.DemiEditor; +using DG.DOTweenEditor.Core; +using DG.DOTweenEditor.UI; +using DG.Tweening; +using DG.Tweening.Core; +using UnityEditor; +using UnityEngine; +using DOTweenSettings = DG.Tweening.Core.DOTweenSettings; +#if true // UI_MARKER +using UnityEngine.UI; +#endif +#if true // TEXTMESHPRO_MARKER + using TMPro; +#endif + +namespace DG.DOTweenEditor +{ + [CustomEditor(typeof(DOTweenAnimation))] + public class DOTweenAnimationInspector : ABSAnimationInspector + { + enum FadeTargetType + { + CanvasGroup, + Image + } + + enum ChooseTargetMode + { + None, + BetweenCanvasGroupAndImage + } + + static readonly Dictionary _AnimationTypeToComponent = new Dictionary() { + { DOTweenAnimation.AnimationType.Move, new[] { +#if true // PHYSICS_MARKER + typeof(Rigidbody), +#endif +#if true // PHYSICS2D_MARKER + typeof(Rigidbody2D), +#endif +#if true // UI_MARKER + typeof(RectTransform), +#endif + typeof(Transform) + }}, + { DOTweenAnimation.AnimationType.Rotate, new[] { +#if true // PHYSICS_MARKER + typeof(Rigidbody), +#endif +#if true // PHYSICS2D_MARKER + typeof(Rigidbody2D), +#endif + typeof(Transform) + }}, + { DOTweenAnimation.AnimationType.LocalMove, new[] { typeof(Transform) } }, + { DOTweenAnimation.AnimationType.LocalRotate, new[] { typeof(Transform) } }, + { DOTweenAnimation.AnimationType.Scale, new[] { typeof(Transform) } }, + { DOTweenAnimation.AnimationType.Color, new[] { + typeof(Light), +#if true // SPRITE_MARKER + typeof(SpriteRenderer), +#endif +#if true // UI_MARKER + typeof(Image), typeof(Text), typeof(RawImage), typeof(Graphic), +#endif + typeof(Renderer), + }}, + { DOTweenAnimation.AnimationType.Fade, new[] { + typeof(Light), +#if true // SPRITE_MARKER + typeof(SpriteRenderer), +#endif +#if true // UI_MARKER + typeof(Image), typeof(Text), typeof(CanvasGroup), typeof(RawImage), typeof(Graphic), +#endif + typeof(Renderer), + }}, +#if true // UI_MARKER + { DOTweenAnimation.AnimationType.Text, new[] { typeof(Text) } }, +#endif + { DOTweenAnimation.AnimationType.PunchPosition, new[] { +#if true // UI_MARKER + typeof(RectTransform), +#endif + typeof(Transform) + }}, + { DOTweenAnimation.AnimationType.PunchRotation, new[] { typeof(Transform) } }, + { DOTweenAnimation.AnimationType.PunchScale, new[] { typeof(Transform) } }, + { DOTweenAnimation.AnimationType.ShakePosition, new[] { +#if true // UI_MARKER + typeof(RectTransform), +#endif + typeof(Transform) + }}, + { DOTweenAnimation.AnimationType.ShakeRotation, new[] { typeof(Transform) } }, + { DOTweenAnimation.AnimationType.ShakeScale, new[] { typeof(Transform) } }, + { DOTweenAnimation.AnimationType.CameraAspect, new[] { typeof(Camera) } }, + { DOTweenAnimation.AnimationType.CameraBackgroundColor, new[] { typeof(Camera) } }, + { DOTweenAnimation.AnimationType.CameraFieldOfView, new[] { typeof(Camera) } }, + { DOTweenAnimation.AnimationType.CameraOrthoSize, new[] { typeof(Camera) } }, + { DOTweenAnimation.AnimationType.CameraPixelRect, new[] { typeof(Camera) } }, + { DOTweenAnimation.AnimationType.CameraRect, new[] { typeof(Camera) } }, +#if true // UI_MARKER + { DOTweenAnimation.AnimationType.UIWidthHeight, new[] { typeof(RectTransform) } }, +#endif + }; + +#if false // TK2D_MARKER + static readonly Dictionary _Tk2dAnimationTypeToComponent = new Dictionary() { + { DOTweenAnimation.AnimationType.Scale, new[] { typeof(tk2dBaseSprite), typeof(tk2dTextMesh) } }, + { DOTweenAnimation.AnimationType.Color, new[] { typeof(tk2dBaseSprite), typeof(tk2dTextMesh) } }, + { DOTweenAnimation.AnimationType.Fade, new[] { typeof(tk2dBaseSprite), typeof(tk2dTextMesh) } }, + { DOTweenAnimation.AnimationType.Text, new[] { typeof(tk2dTextMesh) } } + }; +#endif +#if true // TEXTMESHPRO_MARKER + static readonly Dictionary _TMPAnimationTypeToComponent = new Dictionary() { + { DOTweenAnimation.AnimationType.Color, new[] { typeof(TextMeshPro), typeof(TextMeshProUGUI) } }, + { DOTweenAnimation.AnimationType.Fade, new[] { typeof(TextMeshPro), typeof(TextMeshProUGUI) } }, + { DOTweenAnimation.AnimationType.Text, new[] { typeof(TextMeshPro), typeof(TextMeshProUGUI) } } + }; +#endif + + static readonly string[] _AnimationType = new[] { + "None", + "Move", "LocalMove", + "Rotate", "LocalRotate", + "Scale", + "Color", "Fade", +#if true // UI_MARKER + "Text", +#endif +#if false // TK2D_MARKER + "Text", +#endif +#if true // TEXTMESHPRO_MARKER + "Text", +#endif +#if true // UI_MARKER + "UIWidthHeight", +#endif + "Punch/Position", "Punch/Rotation", "Punch/Scale", + "Shake/Position", "Shake/Rotation", "Shake/Scale", + "Camera/Aspect", "Camera/BackgroundColor", "Camera/FieldOfView", "Camera/OrthoSize", "Camera/PixelRect", "Camera/Rect" + }; + static string[] _animationTypeNoSlashes; // _AnimationType list without slashes in values + static string[] _datString; // String representation of DOTweenAnimation enum (here for caching reasons) + + DOTweenAnimation _src; + DOTweenSettings _settings; + bool _runtimeEditMode; // If TRUE allows to change and save stuff at runtime + bool _refreshRequired; // If TRUE refreshes components data + int _totComponentsOnSrc; // Used to determine if a Component is added or removed from the source + bool _isLightSrc; // Used to determine if we're tweening a Light, to set the max Fade value to more than 1 +#pragma warning disable 414 + ChooseTargetMode _chooseTargetMode = ChooseTargetMode.None; +#pragma warning restore 414 + + static readonly GUIContent _GuiC_selfTarget_true = new GUIContent( + "SELF", "Will animate components on this gameObject" + ); + static readonly GUIContent _GuiC_selfTarget_false = new GUIContent( + "OTHER", "Will animate components on the given gameObject instead than on this one" + ); + static readonly GUIContent _GuiC_tweenTargetIsTargetGO_true = new GUIContent( + "Use As Tween Target", "Will set the tween target (via SetTarget, used to control a tween directly from a target) to the \"OTHER\" gameObject" + ); + static readonly GUIContent _GuiC_tweenTargetIsTargetGO_false = new GUIContent( + "Use As Tween Target", "Will set the tween target (via SetTarget, used to control a tween directly from a target) to the gameObject containing this animation, not the \"OTHER\" one" + ); + + #region MonoBehaviour Methods + + void OnEnable() + { + _src = target as DOTweenAnimation; + _settings = DOTweenUtilityWindow.GetDOTweenSettings(); + + onStartProperty = base.serializedObject.FindProperty("onStart"); + onPlayProperty = base.serializedObject.FindProperty("onPlay"); + onUpdateProperty = base.serializedObject.FindProperty("onUpdate"); + onStepCompleteProperty = base.serializedObject.FindProperty("onStepComplete"); + onCompleteProperty = base.serializedObject.FindProperty("onComplete"); + onRewindProperty = base.serializedObject.FindProperty("onRewind"); + onTweenCreatedProperty = base.serializedObject.FindProperty("onTweenCreated"); + + // Convert _AnimationType to _animationTypeNoSlashes + int len = _AnimationType.Length; + _animationTypeNoSlashes = new string[len]; + for (int i = 0; i < len; ++i) { + string a = _AnimationType[i]; + a = a.Replace("/", ""); + _animationTypeNoSlashes[i] = a; + } + } + + void OnDisable() + { + DOTweenPreviewManager.StopAllPreviews(); + } + + override public void OnInspectorGUI() + { + base.OnInspectorGUI(); + + GUILayout.Space(3); + EditorGUIUtils.SetGUIStyles(); + + bool playMode = Application.isPlaying; + _runtimeEditMode = _runtimeEditMode && playMode; + + GUILayout.BeginHorizontal(); + EditorGUIUtils.InspectorLogo(); + GUILayout.Label(_src.animationType.ToString() + (string.IsNullOrEmpty(_src.id) ? "" : " [" + _src.id + "]"), EditorGUIUtils.sideLogoIconBoldLabelStyle); + // Up-down buttons + GUILayout.FlexibleSpace(); + if (GUILayout.Button("▲", DeGUI.styles.button.toolIco)) UnityEditorInternal.ComponentUtility.MoveComponentUp(_src); + if (GUILayout.Button("▼", DeGUI.styles.button.toolIco)) UnityEditorInternal.ComponentUtility.MoveComponentDown(_src); + GUILayout.EndHorizontal(); + + if (playMode) { + if (_runtimeEditMode) { + + } else { + GUILayout.Space(8); + GUILayout.Label("Animation Editor disabled while in play mode", EditorGUIUtils.wordWrapLabelStyle); + if (!_src.isActive) { + GUILayout.Label("This animation has been toggled as inactive and won't be generated", EditorGUIUtils.wordWrapLabelStyle); + GUI.enabled = false; + } + if (GUILayout.Button(new GUIContent("Activate Edit Mode", "Switches to Runtime Edit Mode, where you can change animations values and restart them"))) { + _runtimeEditMode = true; + } + GUILayout.Label("NOTE: when using DOPlayNext, the sequence is determined by the DOTweenAnimation Components order in the target GameObject's Inspector", EditorGUIUtils.wordWrapLabelStyle); + GUILayout.Space(10); + if (!_runtimeEditMode) return; + } + } + + Undo.RecordObject(_src, "DOTween Animation"); + Undo.RecordObject(_settings, "DOTween Animation"); + +// _src.isValid = Validate(); // Moved down + + EditorGUIUtility.labelWidth = 110; + + if (playMode) { + GUILayout.Space(4); + DeGUILayout.Toolbar("Edit Mode Commands"); + DeGUILayout.BeginVBox(DeGUI.styles.box.stickyTop); + GUILayout.BeginHorizontal(); + if (GUILayout.Button("TogglePause")) _src.tween.TogglePause(); + if (GUILayout.Button("Rewind")) _src.tween.Rewind(); + if (GUILayout.Button("Restart")) _src.tween.Restart(); + GUILayout.EndHorizontal(); + if (GUILayout.Button("Commit changes and restart")) { + _src.tween.Rewind(); + _src.tween.Kill(); + if (_src.isValid) { + _src.CreateTween(); + _src.tween.Play(); + } + } + GUILayout.Label("To apply your changes when exiting Play mode, use the Component's upper right menu and choose \"Copy Component\", then \"Paste Component Values\" after exiting Play mode", DeGUI.styles.label.wordwrap); + DeGUILayout.EndVBox(); + } else { + GUILayout.BeginHorizontal(); + bool hasManager = _src.GetComponent() != null; + EditorGUI.BeginChangeCheck(); + _settings.showPreviewPanel = hasManager + ? DeGUILayout.ToggleButton(_settings.showPreviewPanel, "Preview Controls", styles.custom.inlineToggle) + : DeGUILayout.ToggleButton(_settings.showPreviewPanel, "Preview Controls", styles.custom.inlineToggle, GUILayout.Width(120)); + if (EditorGUI.EndChangeCheck()) { + EditorUtility.SetDirty(_settings); + DOTweenPreviewManager.StopAllPreviews(); + } + if (!hasManager) { + if (GUILayout.Button(new GUIContent("Add Manager", "Adds a manager component which allows you to choose additional options for this gameObject"))) { + _src.gameObject.AddComponent(); + } + } + GUILayout.EndHorizontal(); + } + + // Preview in editor + bool isPreviewing = _settings.showPreviewPanel ? DOTweenPreviewManager.PreviewGUI(_src) : false; + + EditorGUI.BeginDisabledGroup(isPreviewing); + // Choose target + GUILayout.BeginHorizontal(); + _src.isActive = EditorGUILayout.Toggle(new GUIContent("", "If unchecked, this animation will not be created"), _src.isActive, GUILayout.Width(14)); + EditorGUI.BeginChangeCheck(); + EditorGUI.BeginChangeCheck(); + _src.targetIsSelf = DeGUILayout.ToggleButton( + _src.targetIsSelf, _src.targetIsSelf ? _GuiC_selfTarget_true : _GuiC_selfTarget_false, + new Color(1f, 0.78f, 0f), DeGUI.colors.bg.toggleOn, new Color(0.33f, 0.14f, 0.02f), DeGUI.colors.content.toggleOn, + null, GUILayout.Width(47) + ); + bool innerChanged = EditorGUI.EndChangeCheck(); + if (innerChanged) { + _src.targetGO = null; + GUI.changed = true; + } + if (_src.targetIsSelf) GUILayout.Label(_GuiC_selfTarget_true.tooltip); + else { + using (new DeGUI.ColorScope(null, null, _src.targetGO == null ? Color.red : Color.white)) { + _src.targetGO = (GameObject)EditorGUILayout.ObjectField(_src.targetGO, typeof(GameObject), true); + } + _src.tweenTargetIsTargetGO = DeGUILayout.ToggleButton( + _src.tweenTargetIsTargetGO, _src.tweenTargetIsTargetGO ? _GuiC_tweenTargetIsTargetGO_true : _GuiC_tweenTargetIsTargetGO_false, + GUILayout.Width(131) + ); + } + bool check = EditorGUI.EndChangeCheck(); + if (check) _refreshRequired = true; + GUILayout.EndHorizontal(); + + GameObject targetGO = _src.targetIsSelf ? _src.gameObject : _src.targetGO; + + if (targetGO == null) { + // Uses external target gameObject but it's not set + if (_src.targetGO != null || _src.target != null) { + _src.targetGO = null; + _src.target = null; + GUI.changed = true; + } + } else { + GUILayout.BeginHorizontal(); + DOTweenAnimation.AnimationType prevAnimType = _src.animationType; +// _src.animationType = (DOTweenAnimation.AnimationType)EditorGUILayout.EnumPopup(_src.animationType, EditorGUIUtils.popupButton); + GUI.enabled = GUI.enabled && _src.isActive; + _src.animationType = AnimationToDOTweenAnimationType(_AnimationType[EditorGUILayout.Popup(DOTweenAnimationTypeToPopupId(_src.animationType), _AnimationType)]); + _src.autoGenerate = DeGUILayout.ToggleButton(_src.autoGenerate, new GUIContent("AutoGenerate", "If selected, the tween will be generated at startup (during Start for RectTransform position tween, Awake for all the others)")); + if (_src.autoGenerate) { + _src.autoPlay = DeGUILayout.ToggleButton(_src.autoPlay, new GUIContent("AutoPlay", "If selected, the tween will play automatically")); + } + _src.autoKill = DeGUILayout.ToggleButton(_src.autoKill, new GUIContent("AutoKill", "If selected, the tween will be killed when it completes, and won't be reusable")); + GUILayout.EndHorizontal(); + if (prevAnimType != _src.animationType) { + // Set default optional values based on animation type + _src.endValueTransform = null; + _src.useTargetAsV3 = false; + switch (_src.animationType) { + case DOTweenAnimation.AnimationType.Move: + case DOTweenAnimation.AnimationType.LocalMove: + case DOTweenAnimation.AnimationType.Rotate: + case DOTweenAnimation.AnimationType.LocalRotate: + case DOTweenAnimation.AnimationType.Scale: + _src.endValueV3 = Vector3.zero; + _src.endValueFloat = 0; + _src.optionalBool0 = _src.animationType == DOTweenAnimation.AnimationType.Scale; + break; + case DOTweenAnimation.AnimationType.UIWidthHeight: + _src.endValueV3 = Vector3.zero; + _src.endValueFloat = 0; + _src.optionalBool0 = _src.animationType == DOTweenAnimation.AnimationType.UIWidthHeight; + break; + case DOTweenAnimation.AnimationType.Color: + case DOTweenAnimation.AnimationType.Fade: + _isLightSrc = targetGO.GetComponent() != null; + _src.endValueFloat = 0; + break; + case DOTweenAnimation.AnimationType.Text: + _src.optionalBool0 = true; + break; + case DOTweenAnimation.AnimationType.PunchPosition: + case DOTweenAnimation.AnimationType.PunchRotation: + case DOTweenAnimation.AnimationType.PunchScale: + _src.endValueV3 = _src.animationType == DOTweenAnimation.AnimationType.PunchRotation ? new Vector3(0, 180, 0) : Vector3.one; + _src.optionalFloat0 = 1; + _src.optionalInt0 = 10; + _src.optionalBool0 = false; + break; + case DOTweenAnimation.AnimationType.ShakePosition: + case DOTweenAnimation.AnimationType.ShakeRotation: + case DOTweenAnimation.AnimationType.ShakeScale: + _src.endValueV3 = _src.animationType == DOTweenAnimation.AnimationType.ShakeRotation ? new Vector3(90, 90, 90) : Vector3.one; + _src.optionalInt0 = 10; + _src.optionalFloat0 = 90; + _src.optionalBool0 = false; + _src.optionalBool1 = true; + break; + case DOTweenAnimation.AnimationType.CameraAspect: + case DOTweenAnimation.AnimationType.CameraFieldOfView: + case DOTweenAnimation.AnimationType.CameraOrthoSize: + _src.endValueFloat = 0; + break; + case DOTweenAnimation.AnimationType.CameraPixelRect: + case DOTweenAnimation.AnimationType.CameraRect: + _src.endValueRect = new Rect(0, 0, 0, 0); + break; + } + } + if (_src.animationType == DOTweenAnimation.AnimationType.None) { + _src.isValid = false; + if (GUI.changed) EditorUtility.SetDirty(_src); + return; + } + + if (_refreshRequired || prevAnimType != _src.animationType || ComponentsChanged()) { + _refreshRequired = false; + _src.isValid = Validate(targetGO); + // See if we need to choose between multiple targets +#if true // UI_MARKER + if (_src.animationType == DOTweenAnimation.AnimationType.Fade && targetGO.GetComponent() != null && targetGO.GetComponent() != null) { + _chooseTargetMode = ChooseTargetMode.BetweenCanvasGroupAndImage; + // Reassign target and forcedTargetType if lost + if (_src.forcedTargetType == DOTweenAnimation.TargetType.Unset) _src.forcedTargetType = _src.targetType; + switch (_src.forcedTargetType) { + case DOTweenAnimation.TargetType.CanvasGroup: + _src.target = targetGO.GetComponent(); + break; + case DOTweenAnimation.TargetType.Image: + _src.target = targetGO.GetComponent(); + break; + } + } else { +#endif + _chooseTargetMode = ChooseTargetMode.None; + _src.forcedTargetType = DOTweenAnimation.TargetType.Unset; +#if true // UI_MARKER + } +#endif + } + + if (!_src.isValid) { + GUI.color = Color.red; + GUILayout.BeginVertical(GUI.skin.box); + GUILayout.Label("No valid Component was found for the selected animation", EditorGUIUtils.wordWrapLabelStyle); + GUILayout.EndVertical(); + GUI.color = Color.white; + if (GUI.changed) EditorUtility.SetDirty(_src); + return; + } + +#if true // UI_MARKER + // Special cases in which multiple target types could be used (set after validation) + if (_chooseTargetMode == ChooseTargetMode.BetweenCanvasGroupAndImage && _src.forcedTargetType != DOTweenAnimation.TargetType.Unset) { + FadeTargetType fadeTargetType = (FadeTargetType)Enum.Parse(typeof(FadeTargetType), _src.forcedTargetType.ToString()); + DOTweenAnimation.TargetType prevTargetType = _src.forcedTargetType; + _src.forcedTargetType = (DOTweenAnimation.TargetType)Enum.Parse(typeof(DOTweenAnimation.TargetType), EditorGUILayout.EnumPopup(_src.animationType + " Target", fadeTargetType).ToString()); + if (_src.forcedTargetType != prevTargetType) { + // Target type change > assign correct target + switch (_src.forcedTargetType) { + case DOTweenAnimation.TargetType.CanvasGroup: + _src.target = targetGO.GetComponent(); + break; + case DOTweenAnimation.TargetType.Image: + _src.target = targetGO.GetComponent(); + break; + } + } + } +#endif + + GUILayout.BeginHorizontal(); + _src.duration = EditorGUILayout.FloatField("Duration", _src.duration); + if (_src.duration < 0) _src.duration = 0; + _src.isSpeedBased = DeGUILayout.ToggleButton(_src.isSpeedBased, new GUIContent("SpeedBased", "If selected, the duration will count as units/degree x second"), DeGUI.styles.button.tool, GUILayout.Width(75)); + GUILayout.EndHorizontal(); + _src.delay = EditorGUILayout.FloatField("Delay", _src.delay); + if (_src.delay < 0) _src.delay = 0; + _src.isIndependentUpdate = EditorGUILayout.Toggle("Ignore TimeScale", _src.isIndependentUpdate); + _src.easeType = EditorGUIUtils.FilteredEasePopup("Ease", _src.easeType); + if (_src.easeType == Ease.INTERNAL_Custom) { + _src.easeCurve = EditorGUILayout.CurveField(" Ease Curve", _src.easeCurve); + } + _src.loops = EditorGUILayout.IntField(new GUIContent("Loops", "Set to -1 for infinite loops"), _src.loops); + if (_src.loops < -1) _src.loops = -1; + if (_src.loops > 1 || _src.loops == -1) + _src.loopType = (LoopType)EditorGUILayout.EnumPopup(" Loop Type", _src.loopType); + _src.id = EditorGUILayout.TextField("ID", _src.id); + + bool canBeRelative = true; + // End value and eventual specific options + switch (_src.animationType) { + case DOTweenAnimation.AnimationType.Move: + case DOTweenAnimation.AnimationType.LocalMove: + GUIEndValueV3(targetGO, _src.animationType == DOTweenAnimation.AnimationType.Move); + _src.optionalBool0 = EditorGUILayout.Toggle(" Snapping", _src.optionalBool0); + canBeRelative = !_src.useTargetAsV3; + break; + case DOTweenAnimation.AnimationType.Rotate: + case DOTweenAnimation.AnimationType.LocalRotate: + bool isRigidbody2D = DOTweenModuleUtils.Physics.HasRigidbody2D(_src); + if (isRigidbody2D) GUIEndValueFloat(); + else { + GUIEndValueV3(targetGO); + _src.optionalRotationMode = (RotateMode)EditorGUILayout.EnumPopup(" Rotation Mode", _src.optionalRotationMode); + } + break; + case DOTweenAnimation.AnimationType.Scale: + if (_src.optionalBool0) GUIEndValueFloat(); + else GUIEndValueV3(targetGO); + _src.optionalBool0 = EditorGUILayout.Toggle("Uniform Scale", _src.optionalBool0); + break; + case DOTweenAnimation.AnimationType.UIWidthHeight: + if (_src.optionalBool0) GUIEndValueFloat(); + else GUIEndValueV2(); + _src.optionalBool0 = EditorGUILayout.Toggle("Uniform Scale", _src.optionalBool0); + break; + case DOTweenAnimation.AnimationType.Color: + GUIEndValueColor(); + canBeRelative = false; + break; + case DOTweenAnimation.AnimationType.Fade: + GUIEndValueFloat(); + if (_src.endValueFloat < 0) _src.endValueFloat = 0; + if (!_isLightSrc && _src.endValueFloat > 1) _src.endValueFloat = 1; + canBeRelative = false; + break; + case DOTweenAnimation.AnimationType.Text: + GUIEndValueString(); + _src.optionalBool0 = EditorGUILayout.Toggle("Rich Text Enabled", _src.optionalBool0); + _src.optionalScrambleMode = (ScrambleMode)EditorGUILayout.EnumPopup("Scramble Mode", _src.optionalScrambleMode); + _src.optionalString = EditorGUILayout.TextField(new GUIContent("Custom Scramble", "Custom characters to use in case of ScrambleMode.Custom"), _src.optionalString); + break; + case DOTweenAnimation.AnimationType.PunchPosition: + case DOTweenAnimation.AnimationType.PunchRotation: + case DOTweenAnimation.AnimationType.PunchScale: + GUIEndValueV3(targetGO); + canBeRelative = false; + _src.optionalInt0 = EditorGUILayout.IntSlider(new GUIContent(" Vibrato", "How much will the punch vibrate"), _src.optionalInt0, 1, 50); + _src.optionalFloat0 = EditorGUILayout.Slider(new GUIContent(" Elasticity", "How much the vector will go beyond the starting position when bouncing backwards"), _src.optionalFloat0, 0, 1); + if (_src.animationType == DOTweenAnimation.AnimationType.PunchPosition) _src.optionalBool0 = EditorGUILayout.Toggle(" Snapping", _src.optionalBool0); + break; + case DOTweenAnimation.AnimationType.ShakePosition: + case DOTweenAnimation.AnimationType.ShakeRotation: + case DOTweenAnimation.AnimationType.ShakeScale: + GUIEndValueV3(targetGO); + canBeRelative = false; + _src.optionalInt0 = EditorGUILayout.IntSlider(new GUIContent(" Vibrato", "How much will the shake vibrate"), _src.optionalInt0, 1, 50); + _src.optionalFloat0 = EditorGUILayout.Slider(new GUIContent(" Randomness", "The shake randomness"), _src.optionalFloat0, 0, 90); + _src.optionalBool1 = EditorGUILayout.Toggle(new GUIContent(" FadeOut", "If selected the shake will fade out, otherwise it will constantly play with full force"), _src.optionalBool1); + if (_src.animationType == DOTweenAnimation.AnimationType.ShakePosition) _src.optionalBool0 = EditorGUILayout.Toggle(" Snapping", _src.optionalBool0); + break; + case DOTweenAnimation.AnimationType.CameraAspect: + case DOTweenAnimation.AnimationType.CameraFieldOfView: + case DOTweenAnimation.AnimationType.CameraOrthoSize: + GUIEndValueFloat(); + canBeRelative = false; + break; + case DOTweenAnimation.AnimationType.CameraBackgroundColor: + GUIEndValueColor(); + canBeRelative = false; + break; + case DOTweenAnimation.AnimationType.CameraPixelRect: + case DOTweenAnimation.AnimationType.CameraRect: + GUIEndValueRect(); + canBeRelative = false; + break; + } + + // Final settings + if (canBeRelative) _src.isRelative = EditorGUILayout.Toggle(" Relative", _src.isRelative); + + // Events + AnimationInspectorGUI.AnimationEvents(this, _src); + } + EditorGUI.EndDisabledGroup(); + + if (GUI.changed) EditorUtility.SetDirty(_src); + } + + #endregion + + #region Methods + + // Returns TRUE if the Component layout on the src gameObject changed (a Component was added or removed) + bool ComponentsChanged() + { + int prevTotComponentsOnSrc = _totComponentsOnSrc; + _totComponentsOnSrc = _src.gameObject.GetComponents().Length; + return prevTotComponentsOnSrc != _totComponentsOnSrc; + } + + // Checks if a Component that can be animated with the given animationType is attached to the src + bool Validate(GameObject targetGO) + { + if (_src.animationType == DOTweenAnimation.AnimationType.None) return false; + + Component srcTarget; + // First check for external plugins +#if false // TK2D_MARKER + if (_Tk2dAnimationTypeToComponent.ContainsKey(_src.animationType)) { + foreach (Type t in _Tk2dAnimationTypeToComponent[_src.animationType]) { + srcTarget = targetGO.GetComponent(t); + if (srcTarget != null) { + _src.target = srcTarget; + _src.targetType = DOTweenAnimation.TypeToDOTargetType(t); + return true; + } + } + } +#endif +#if true // TEXTMESHPRO_MARKER + if (_TMPAnimationTypeToComponent.ContainsKey(_src.animationType)) { + foreach (Type t in _TMPAnimationTypeToComponent[_src.animationType]) { + srcTarget = targetGO.GetComponent(t); + if (srcTarget != null) { + _src.target = srcTarget; + _src.targetType = DOTweenAnimation.TypeToDOTargetType(t); + return true; + } + } + } +#endif + // Then check for regular stuff + if (_AnimationTypeToComponent.ContainsKey(_src.animationType)) { + foreach (Type t in _AnimationTypeToComponent[_src.animationType]) { + srcTarget = targetGO.GetComponent(t); + if (srcTarget != null) { + _src.target = srcTarget; + _src.targetType = DOTweenAnimation.TypeToDOTargetType(t); + return true; + } + } + } + return false; + } + + DOTweenAnimation.AnimationType AnimationToDOTweenAnimationType(string animation) + { + if (_datString == null) _datString = Enum.GetNames(typeof(DOTweenAnimation.AnimationType)); + animation = animation.Replace("/", ""); + return (DOTweenAnimation.AnimationType)(Array.IndexOf(_datString, animation)); + } + int DOTweenAnimationTypeToPopupId(DOTweenAnimation.AnimationType animation) + { + return Array.IndexOf(_animationTypeNoSlashes, animation.ToString()); + } + + #endregion + + #region GUI Draw Methods + + void GUIEndValueFloat() + { + GUILayout.BeginHorizontal(); + GUIToFromButton(); + _src.endValueFloat = EditorGUILayout.FloatField(_src.endValueFloat); + GUILayout.EndHorizontal(); + } + + void GUIEndValueColor() + { + GUILayout.BeginHorizontal(); + GUIToFromButton(); + _src.endValueColor = EditorGUILayout.ColorField(_src.endValueColor); + GUILayout.EndHorizontal(); + } + + void GUIEndValueV3(GameObject targetGO, bool optionalTransform = false) + { + GUILayout.BeginHorizontal(); + GUIToFromButton(); + if (_src.useTargetAsV3) { + Transform prevT = _src.endValueTransform; + _src.endValueTransform = EditorGUILayout.ObjectField(_src.endValueTransform, typeof(Transform), true) as Transform; + if (_src.endValueTransform != prevT && _src.endValueTransform != null) { +#if true // UI_MARKER + // Check that it's a Transform for a Transform or a RectTransform for a RectTransform + if (targetGO.GetComponent() != null) { + if (_src.endValueTransform.GetComponent() == null) { + EditorUtility.DisplayDialog("DOTween Pro", "For Unity UI elements, the target must also be a UI element", "Ok"); + _src.endValueTransform = null; + } + } else if (_src.endValueTransform.GetComponent() != null) { + EditorUtility.DisplayDialog("DOTween Pro", "You can't use a UI target for a non UI object", "Ok"); + _src.endValueTransform = null; + } +#endif + } + } else { + _src.endValueV3 = EditorGUILayout.Vector3Field("", _src.endValueV3, GUILayout.Height(16)); + } + if (optionalTransform) { + if (GUILayout.Button(_src.useTargetAsV3 ? "target" : "value", EditorGUIUtils.sideBtStyle, GUILayout.Width(44))) _src.useTargetAsV3 = !_src.useTargetAsV3; + } + GUILayout.EndHorizontal(); +#if true // UI_MARKER + if (_src.useTargetAsV3 && _src.endValueTransform != null && _src.target is RectTransform) { + EditorGUILayout.HelpBox("NOTE: when using a UI target, the tween will be created during Start instead of Awake", MessageType.Info); + } +#endif + } + + void GUIEndValueV2() + { + GUILayout.BeginHorizontal(); + GUIToFromButton(); + _src.endValueV2 = EditorGUILayout.Vector2Field("", _src.endValueV2, GUILayout.Height(16)); + GUILayout.EndHorizontal(); + } + + void GUIEndValueString() + { + GUILayout.BeginHorizontal(); + GUIToFromButton(); + _src.endValueString = EditorGUILayout.TextArea(_src.endValueString, EditorGUIUtils.wordWrapTextArea); + GUILayout.EndHorizontal(); + } + + void GUIEndValueRect() + { + GUILayout.BeginHorizontal(); + GUIToFromButton(); + _src.endValueRect = EditorGUILayout.RectField(_src.endValueRect); + GUILayout.EndHorizontal(); + } + + void GUIToFromButton() + { + if (GUILayout.Button(_src.isFrom ? "FROM" : "TO", EditorGUIUtils.sideBtStyle, GUILayout.Width(90))) _src.isFrom = !_src.isFrom; + GUILayout.Space(16); + } + + #endregion + } + + // █████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ + // ███ INTERNAL CLASSES ████████████████████████████████████████████████████████████████████████████████████████████████ + // █████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ + + [InitializeOnLoad] + static class Initializer + { + static Initializer() + { + DOTweenAnimation.OnReset += OnReset; + } + + static void OnReset(DOTweenAnimation src) + { + DOTweenSettings settings = DOTweenUtilityWindow.GetDOTweenSettings(); + if (settings == null) return; + + Undo.RecordObject(src, "DOTweenAnimation"); + src.autoPlay = settings.defaultAutoPlay == AutoPlay.All || settings.defaultAutoPlay == AutoPlay.AutoPlayTweeners; + src.autoKill = settings.defaultAutoKill; + EditorUtility.SetDirty(src); + } + } +} diff --git a/Assets/Plugins/Demigiant/DOTweenPro/Editor/DOTweenAnimationInspector.cs.meta b/Assets/Plugins/Demigiant/DOTweenPro/Editor/DOTweenAnimationInspector.cs.meta new file mode 100644 index 00000000..d2d7eee1 --- /dev/null +++ b/Assets/Plugins/Demigiant/DOTweenPro/Editor/DOTweenAnimationInspector.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e0203fd81362bab4d842d87ad09ee76e +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/Assets/Plugins/Demigiant/DOTweenPro/Editor/DOTweenPreviewManager.cs b/Assets/Plugins/Demigiant/DOTweenPro/Editor/DOTweenPreviewManager.cs new file mode 100644 index 00000000..e6079795 --- /dev/null +++ b/Assets/Plugins/Demigiant/DOTweenPro/Editor/DOTweenPreviewManager.cs @@ -0,0 +1,263 @@ +// Author: Daniele Giardini - http://www.demigiant.com +// Created: 2015/03/12 16:03 + +using System; +using System.Collections.Generic; +using DG.DemiEditor; +using DG.DemiLib; +using DG.Tweening; +using DG.Tweening.Core; +using UnityEditor; +using UnityEditorInternal; +using UnityEngine; +using Object = UnityEngine.Object; + +namespace DG.DOTweenEditor +{ + public static class DOTweenPreviewManager + { + static bool _previewOnlyIfSetToAutoPlay = true; + static readonly Dictionary _AnimationToTween = new Dictionary(); + static readonly List _TmpKeys = new List(); + + #region Public Methods & GUI + + /// + /// Returns TRUE if its actually previewing animations + /// + public static bool PreviewGUI(DOTweenAnimation src) + { + if (EditorApplication.isPlaying) return false; + + Styles.Init(); + + bool isPreviewing = _AnimationToTween.Count > 0; + bool isPreviewingThis = isPreviewing && _AnimationToTween.ContainsKey(src); + + // Preview in editor + GUI.backgroundColor = isPreviewing + ? new DeSkinColor(new Color(0.49f, 0.8f, 0.86f), new Color(0.15f, 0.26f, 0.35f)) + : new DeSkinColor(Color.white, new Color(0.13f, 0.13f, 0.13f)); + GUILayout.BeginVertical(Styles.previewBox); + DeGUI.ResetGUIColors(); + GUILayout.BeginHorizontal(); + GUILayout.Label("Preview Mode - Experimental", Styles.previewLabel); + _previewOnlyIfSetToAutoPlay = DeGUILayout.ToggleButton( + _previewOnlyIfSetToAutoPlay, + new GUIContent("AutoPlay only", "If toggled only previews animations that have AutoPlay turned ON"), + Styles.btOption + ); + GUILayout.EndHorizontal(); + GUILayout.Space(1); + // Preview - Play + GUILayout.BeginHorizontal(); + EditorGUI.BeginDisabledGroup( + isPreviewingThis || src.animationType == DOTweenAnimation.AnimationType.None + || !src.isActive || _previewOnlyIfSetToAutoPlay && !src.autoPlay + ); + if (GUILayout.Button("► Play", Styles.btPreview)) { + if (!isPreviewing) StartupGlobalPreview(); + AddAnimationToGlobalPreview(src); + } + EditorGUI.EndDisabledGroup(); + EditorGUI.BeginDisabledGroup(isPreviewing); + if (GUILayout.Button("► Play All on GameObject", Styles.btPreview)) { + if (!isPreviewing) StartupGlobalPreview(); + DOTweenAnimation[] anims = src.gameObject.GetComponents(); + foreach (DOTweenAnimation anim in anims) AddAnimationToGlobalPreview(anim); + } + if (GUILayout.Button("► Play All in Scene", Styles.btPreview)) { + if (!isPreviewing) StartupGlobalPreview(); + DOTweenAnimation[] anims = Object.FindObjectsOfType(); + foreach (DOTweenAnimation anim in anims) AddAnimationToGlobalPreview(anim); + } + EditorGUI.EndDisabledGroup(); + GUILayout.EndHorizontal(); + // Preview - Stop + GUILayout.BeginHorizontal(); + EditorGUI.BeginDisabledGroup(!isPreviewingThis); + if (GUILayout.Button("■ Stop", Styles.btPreview)) { + if (_AnimationToTween.ContainsKey(src)) StopPreview(_AnimationToTween[src].tween); + } + EditorGUI.EndDisabledGroup(); + EditorGUI.BeginDisabledGroup(!isPreviewing); + if (GUILayout.Button("■ Stop All on GameObject", Styles.btPreview)) { + StopPreview(src.gameObject); + } + if (GUILayout.Button("■ Stop All in Scene", Styles.btPreview)) { + StopAllPreviews(); + } + EditorGUI.EndDisabledGroup(); + GUILayout.EndHorizontal(); + if (isPreviewing) { + int playingTweens = 0; + int completedTweens = 0; + int pausedTweens = 0; + foreach (KeyValuePair kvp in _AnimationToTween) { + Tween t = kvp.Value.tween; + if (t.IsPlaying()) playingTweens++; + else if (t.IsComplete()) completedTweens++; + else pausedTweens++; + } + GUILayout.Label("Playing Tweens: " + playingTweens, Styles.previewStatusLabel); + GUILayout.Label("Completed Tweens: " + completedTweens, Styles.previewStatusLabel); +// GUILayout.Label("Paused Tweens: " + playingTweens); + } + GUILayout.EndVertical(); + + return isPreviewing; + } + +#if !(UNITY_4_3 || UNITY_4_4 || UNITY_4_5 || UNITY_4_6 || UNITY_5) + public static void StopAllPreviews(PlayModeStateChange state) + { + StopAllPreviews(); + } +#endif + + public static void StopAllPreviews() + { + _TmpKeys.Clear(); + foreach (KeyValuePair kvp in _AnimationToTween) { + _TmpKeys.Add(kvp.Key); + } + StopPreview(_TmpKeys); + _TmpKeys.Clear(); + _AnimationToTween.Clear(); + + DOTweenEditorPreview.Stop(); +#if UNITY_4_3 || UNITY_4_4 || UNITY_4_5 || UNITY_4_6 || UNITY_5 + UnityEditor.EditorApplication.playmodeStateChanged -= StopAllPreviews; +#else + UnityEditor.EditorApplication.playModeStateChanged -= StopAllPreviews; +#endif +// EditorApplication.playmodeStateChanged -= StopAllPreviews; + + InternalEditorUtility.RepaintAllViews(); + } + +#endregion + +#region Methods + + static void StartupGlobalPreview() + { + DOTweenEditorPreview.Start(); +#if UNITY_4_3 || UNITY_4_4 || UNITY_4_5 || UNITY_4_6 || UNITY_5 + UnityEditor.EditorApplication.playmodeStateChanged += StopAllPreviews; +#else + UnityEditor.EditorApplication.playModeStateChanged += StopAllPreviews; +#endif +// EditorApplication.playmodeStateChanged += StopAllPreviews; + } + + static void AddAnimationToGlobalPreview(DOTweenAnimation src) + { + if (!src.isActive) return; // Ignore sources whose tweens have been set to inactive + if (_previewOnlyIfSetToAutoPlay && !src.autoPlay) return; + + Tween t = src.CreateEditorPreview(); + _AnimationToTween.Add(src, new TweenInfo(src, t, src.isFrom)); + // Tween setup + DOTweenEditorPreview.PrepareTweenForPreview(t); + } + + static void StopPreview(GameObject go) + { + _TmpKeys.Clear(); + foreach (KeyValuePair kvp in _AnimationToTween) { + if (kvp.Key.gameObject != go) continue; + _TmpKeys.Add(kvp.Key); + } + StopPreview(_TmpKeys); + _TmpKeys.Clear(); + + if (_AnimationToTween.Count == 0) StopAllPreviews(); + else InternalEditorUtility.RepaintAllViews(); + } + + static void StopPreview(Tween t) + { + TweenInfo tInfo = null; + foreach (KeyValuePair kvp in _AnimationToTween) { + if (kvp.Value.tween != t) continue; + tInfo = kvp.Value; + _AnimationToTween.Remove(kvp.Key); + break; + } + if (tInfo == null) { + Debug.LogWarning("DOTween Preview ► Couldn't find tween to stop"); + return; + } + if (tInfo.isFrom) { + int totLoops = tInfo.tween.Loops(); + if (totLoops < 0 || totLoops > 1) { + tInfo.tween.Goto(tInfo.tween.Duration(false)); + } else tInfo.tween.Complete(); + } else tInfo.tween.Rewind(); + tInfo.tween.Kill(); + EditorUtility.SetDirty(tInfo.animation); // Refresh views + + if (_AnimationToTween.Count == 0) StopAllPreviews(); + else InternalEditorUtility.RepaintAllViews(); + } + + // Stops while iterating inversely, which deals better with tweens that overwrite each other + static void StopPreview(List keys) + { + for (int i = keys.Count - 1; i > -1; --i) { + DOTweenAnimation anim = keys[i]; + TweenInfo tInfo = _AnimationToTween[anim]; + if (tInfo.isFrom) { + int totLoops = tInfo.tween.Loops(); + if (totLoops < 0 || totLoops > 1) { + tInfo.tween.Goto(tInfo.tween.Duration(false)); + } else tInfo.tween.Complete(); + } else tInfo.tween.Rewind(); + tInfo.tween.Kill(); + EditorUtility.SetDirty(anim); // Refresh views + _AnimationToTween.Remove(anim); + } + } + +#endregion + + // █████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ + // ███ INTERNAL CLASSES ████████████████████████████████████████████████████████████████████████████████████████████████ + // █████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ + + class TweenInfo + { + public DOTweenAnimation animation; + public Tween tween; + public bool isFrom; + public TweenInfo(DOTweenAnimation animation, Tween tween, bool isFrom) + { + this.animation = animation; + this.tween = tween; + this.isFrom = isFrom; + } + } + + static class Styles + { + static bool _initialized; + + public static GUIStyle previewBox, previewLabel, btOption, btPreview, previewStatusLabel; + + public static void Init() + { + if (_initialized) return; + + _initialized = true; + + previewBox = new GUIStyle(GUI.skin.box).Clone().Padding(1, 1, 0, 3) + .Background(DeStylePalette.squareBorderCurved_darkBorders).Border(7, 7, 7, 7); + previewLabel = new GUIStyle(GUI.skin.label).Clone(10, FontStyle.Bold).Padding(1, 0, 3, 0).Margin(3, 6, 0, 0).StretchWidth(false); + btOption = DeGUI.styles.button.bBlankBorderCompact.MarginBottom(2).MarginRight(4); + btPreview = EditorStyles.miniButton.Clone(Format.RichText); + previewStatusLabel = EditorStyles.miniLabel.Clone().Padding(4, 0, 0, 0).Margin(0); + } + } + } +} diff --git a/Assets/Plugins/Demigiant/DOTweenPro/Editor/DOTweenPreviewManager.cs.meta b/Assets/Plugins/Demigiant/DOTweenPro/Editor/DOTweenPreviewManager.cs.meta new file mode 100644 index 00000000..53780cce --- /dev/null +++ b/Assets/Plugins/Demigiant/DOTweenPro/Editor/DOTweenPreviewManager.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 22292a5f27a9a644ba9e6ad1bf863531 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/Assets/Plugins/Demigiant/DOTweenPro/Editor/DOTweenProEditor.dll b/Assets/Plugins/Demigiant/DOTweenPro/Editor/DOTweenProEditor.dll new file mode 100644 index 0000000000000000000000000000000000000000..f0960f0fd9eaa6397231c46e66259f994242fcda GIT binary patch literal 35840 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 literal 0 HcmV?d00001 diff --git a/Assets/Plugins/Demigiant/DOTweenPro/Editor/DOTweenProEditor.dll.meta b/Assets/Plugins/Demigiant/DOTweenPro/Editor/DOTweenProEditor.dll.meta new file mode 100644 index 00000000..62ab8c09 --- /dev/null +++ b/Assets/Plugins/Demigiant/DOTweenPro/Editor/DOTweenProEditor.dll.meta @@ -0,0 +1,22 @@ +fileFormatVersion: 2 +guid: a6402d4311c862b4eb1325590d6466af +PluginImporter: + serializedVersion: 1 + iconMap: {} + executionOrder: {} + isPreloaded: 0 + platformData: + Any: + enabled: 0 + settings: {} + Editor: + enabled: 1 + settings: + DefaultValueInitialized: true + WindowsStoreApps: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Demigiant/DemiLib.meta b/Assets/Plugins/Demigiant/DemiLib.meta new file mode 100644 index 00000000..f64ed7dd --- /dev/null +++ b/Assets/Plugins/Demigiant/DemiLib.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 850df4432f9159e489886bbe9d4efcad +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Demigiant/DemiLib/Core.meta b/Assets/Plugins/Demigiant/DemiLib/Core.meta new file mode 100644 index 00000000..668043f3 --- /dev/null +++ b/Assets/Plugins/Demigiant/DemiLib/Core.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 253019635dee9784c8da8657c105dbcc +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Demigiant/DemiLib/Core/DemiLib.dll b/Assets/Plugins/Demigiant/DemiLib/Core/DemiLib.dll new file mode 100644 index 0000000000000000000000000000000000000000..61b68998bf5599ab724de8d06fa9686f326ccd08 GIT binary patch literal 13312 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 literal 0 HcmV?d00001 diff --git a/Assets/Plugins/Demigiant/DemiLib/Core/Editor/DemiEditor.dll.meta b/Assets/Plugins/Demigiant/DemiLib/Core/Editor/DemiEditor.dll.meta new file mode 100644 index 00000000..aa20ddfe --- /dev/null +++ b/Assets/Plugins/Demigiant/DemiLib/Core/Editor/DemiEditor.dll.meta @@ -0,0 +1,22 @@ +fileFormatVersion: 2 +guid: 202f9ddaf2c1a8a429504f7f3cd7b84f +PluginImporter: + serializedVersion: 1 + iconMap: {} + executionOrder: {} + isPreloaded: 0 + platformData: + Any: + enabled: 0 + settings: {} + Editor: + enabled: 1 + settings: + DefaultValueInitialized: true + WindowsStoreApps: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scenes/MainMenu.unity b/Assets/Scenes/MainMenu.unity index 139060ba..226de678 100644 --- a/Assets/Scenes/MainMenu.unity +++ b/Assets/Scenes/MainMenu.unity @@ -122,6 +122,84 @@ NavMeshSettings: debug: m_Flags: 0 m_NavMeshData: {fileID: 0} +--- !u!1 &12413216 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 12413217} + - component: {fileID: 12413219} + - component: {fileID: 12413218} + m_Layer: 5 + m_Name: PanelBG + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &12413217 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 12413216} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 126336757} + - {fileID: 651480213} + - {fileID: 1011777847} + m_Father: {fileID: 1211240241} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 1} + m_AnchorMax: {x: 0.5, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 240, y: 250} + m_Pivot: {x: 0.5, y: 1} +--- !u!114 &12413218 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 12413216} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: -1323277974, guid: c6ad05d85b74fc540b9566c9f27609f8, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &12413219 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 12413216} + m_CullTransparentMesh: 1 --- !u!1 &23012387 GameObject: m_ObjectHideFlags: 0 @@ -318,7 +396,7 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 28831448} m_CullTransparentMesh: 1 ---- !u!1 &40575405 +--- !u!1 &34805428 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -326,155 +404,44 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 40575406} - - component: {fileID: 40575408} - - component: {fileID: 40575407} + - component: {fileID: 34805429} + - component: {fileID: 34805432} + - component: {fileID: 34805431} + - component: {fileID: 34805430} m_Layer: 5 - m_Name: MusicIcon + m_Name: BuyButton m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &40575406 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 40575405} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 1896578657} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0.5} - m_AnchorMax: {x: 0, y: 0.5} - m_AnchoredPosition: {x: 53.5475, y: -2.4033} - m_SizeDelta: {x: 186.1993, y: 186.9266} - m_Pivot: {x: 0, y: 0.5} ---- !u!114 &40575407 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 40575405} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Sprite: {fileID: 2112707985, guid: 1a63ea6d0777fc44b9edb3a4a9dee39b, type: 3} - m_Type: 0 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!222 &40575408 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 40575405} - m_CullTransparentMesh: 1 ---- !u!1 &120710489 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 120710490} - m_Layer: 5 - m_Name: SettingsScreen - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 0 ---- !u!224 &120710490 +--- !u!224 &34805429 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 120710489} + m_GameObject: {fileID: 34805428} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: - - {fileID: 1653671848} - - {fileID: 164583073} - m_Father: {fileID: 624775560} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!1 &164583072 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 164583073} - - component: {fileID: 164583076} - - component: {fileID: 164583075} - - component: {fileID: 164583074} - m_Layer: 5 - m_Name: CrossButton - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &164583073 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 164583072} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 120710490} + - {fileID: 505193141} + m_Father: {fileID: 859392248} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0} m_AnchorMax: {x: 0.5, y: 0} - m_AnchoredPosition: {x: -5.2, y: 194.79} - m_SizeDelta: {x: 232, y: 232} + m_AnchoredPosition: {x: 0, y: -33.549103} + m_SizeDelta: {x: 184.7591, y: 86.943} m_Pivot: {x: 0.5, y: 0} ---- !u!114 &164583074 +--- !u!114 &34805430 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 164583072} + m_GameObject: {fileID: 34805428} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} @@ -508,41 +475,17 @@ MonoBehaviour: m_SelectedTrigger: Selected m_DisabledTrigger: Disabled m_Interactable: 1 - m_TargetGraphic: {fileID: 164583075} + m_TargetGraphic: {fileID: 34805431} m_OnClick: m_PersistentCalls: - m_Calls: - - m_Target: {fileID: 1295747848} - m_TargetAssemblyTypeName: UnityEngine.GameObject, UnityEngine - m_MethodName: SetActive - m_Mode: 6 - m_Arguments: - m_ObjectArgument: {fileID: 0} - m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine - m_IntArgument: 0 - m_FloatArgument: 0 - m_StringArgument: - m_BoolArgument: 1 - m_CallState: 2 - - m_Target: {fileID: 120710489} - m_TargetAssemblyTypeName: UnityEngine.GameObject, UnityEngine - m_MethodName: SetActive - m_Mode: 6 - m_Arguments: - m_ObjectArgument: {fileID: 0} - m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine - m_IntArgument: 0 - m_FloatArgument: 0 - m_StringArgument: - m_BoolArgument: 0 - m_CallState: 2 ---- !u!114 &164583075 + m_Calls: [] +--- !u!114 &34805431 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 164583072} + m_GameObject: {fileID: 34805428} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} @@ -556,7 +499,7 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Sprite: {fileID: -752724412, guid: 1a63ea6d0777fc44b9edb3a4a9dee39b, type: 3} + m_Sprite: {fileID: -636975818, guid: c6ad05d85b74fc540b9566c9f27609f8, type: 3} m_Type: 0 m_PreserveAspect: 0 m_FillCenter: 1 @@ -566,15 +509,15 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &164583076 +--- !u!222 &34805432 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 164583072} + m_GameObject: {fileID: 34805428} m_CullTransparentMesh: 1 ---- !u!1 &282693410 +--- !u!1 &40575405 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -582,43 +525,42 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 282693411} - - component: {fileID: 282693413} - - component: {fileID: 282693412} + - component: {fileID: 40575406} + - component: {fileID: 40575408} + - component: {fileID: 40575407} m_Layer: 5 - m_Name: PanelBG + m_Name: MusicIcon m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &282693411 +--- !u!224 &40575406 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 282693410} + m_GameObject: {fileID: 40575405} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 647566282} - m_Father: {fileID: 1852085631} + m_Children: [] + m_Father: {fileID: 1896578657} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.5, y: 0.5} - m_AnchorMax: {x: 0.5, y: 0.5} - m_AnchoredPosition: {x: 0, y: 94.07959} - m_SizeDelta: {x: 855, y: 885} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &282693412 + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: 53.5475, y: -2.4033} + m_SizeDelta: {x: 186.1993, y: 186.9266} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &40575407 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 282693410} + m_GameObject: {fileID: 40575405} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} @@ -632,7 +574,7 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Sprite: {fileID: -1303976239, guid: c6ad05d85b74fc540b9566c9f27609f8, type: 3} + m_Sprite: {fileID: 2112707985, guid: 1a63ea6d0777fc44b9edb3a4a9dee39b, type: 3} m_Type: 0 m_PreserveAspect: 0 m_FillCenter: 1 @@ -642,15 +584,15 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &282693413 +--- !u!222 &40575408 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 282693410} + m_GameObject: {fileID: 40575405} m_CullTransparentMesh: 1 ---- !u!1 &307522012 +--- !u!1 &76796529 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -658,42 +600,46 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 307522013} - - component: {fileID: 307522015} - - component: {fileID: 307522014} + - component: {fileID: 76796530} + - component: {fileID: 76796532} + - component: {fileID: 76796531} m_Layer: 5 - m_Name: Logo + m_Name: PanelBG m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &307522013 +--- !u!224 &76796530 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 307522012} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_GameObject: {fileID: 76796529} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 1 - m_Children: [] - m_Father: {fileID: 1295747849} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1217494644} + - {fileID: 729371663} + - {fileID: 1146867878} + - {fileID: 1708467052} + m_Father: {fileID: 517469375} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.5, y: 0.5} - m_AnchorMax: {x: 0.5, y: 0.5} - m_AnchoredPosition: {x: 0, y: 329.47156} - m_SizeDelta: {x: 820.9949, y: 479.3384} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &307522014 + m_AnchorMin: {x: 0.5, y: 1} + m_AnchorMax: {x: 0.5, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 240, y: 250} + m_Pivot: {x: 0.5, y: 1} +--- !u!114 &76796531 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 307522012} + m_GameObject: {fileID: 76796529} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} @@ -707,7 +653,7 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Sprite: {fileID: -1071601717, guid: 667ad1e31f7749b4ab8e2a0290ef71a7, type: 3} + m_Sprite: {fileID: -1323277974, guid: c6ad05d85b74fc540b9566c9f27609f8, type: 3} m_Type: 0 m_PreserveAspect: 0 m_FillCenter: 1 @@ -717,15 +663,15 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &307522015 +--- !u!222 &76796532 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 307522012} + m_GameObject: {fileID: 76796529} m_CullTransparentMesh: 1 ---- !u!1 &315029014 +--- !u!1 &120710489 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -733,47 +679,82 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 315029015} - - component: {fileID: 315029017} - - component: {fileID: 315029016} + - component: {fileID: 120710490} m_Layer: 5 - m_Name: Banner + m_Name: SettingsScreen m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &315029015 + m_IsActive: 0 +--- !u!224 &120710490 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 315029014} + m_GameObject: {fileID: 120710489} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 1 + m_ConstrainProportionsScale: 0 m_Children: - - {fileID: 1045624783} - - {fileID: 702120856} - m_Father: {fileID: 1653671848} + - {fileID: 1653671848} + - {fileID: 164583073} + m_Father: {fileID: 624775560} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.5, y: 1} - m_AnchorMax: {x: 0.5, y: 1} - m_AnchoredPosition: {x: 0, y: 143.65884} - m_SizeDelta: {x: 783.5229, y: 241.6589} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &126336756 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 126336757} + - component: {fileID: 126336759} + - component: {fileID: 126336758} + m_Layer: 5 + m_Name: CoinRewardText + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &126336757 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 126336756} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 12413217} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: -0.0000076293945, y: -19.6445} + m_SizeDelta: {x: 0, y: 43.1598} m_Pivot: {x: 0.5, y: 1} ---- !u!114 &315029016 +--- !u!114 &126336758 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 315029014} + m_GameObject: {fileID: 126336756} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} @@ -784,25 +765,84 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Sprite: {fileID: -184041502, guid: 1a63ea6d0777fc44b9edb3a4a9dee39b, type: 3} - m_Type: 0 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!222 &315029017 + m_text: 1200 + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 5da2ee26a9d0b024dafba9acbda5519e, type: 2} + m_sharedMaterial: {fileID: 7937037986802887748, guid: 5da2ee26a9d0b024dafba9acbda5519e, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4278190080 + m_fontColor: {r: 0, g: 0, b: 0, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 36.95 + m_fontSizeBase: 36 + m_fontWeight: 400 + m_enableAutoSizing: 1 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &126336759 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 315029014} + m_GameObject: {fileID: 126336756} m_CullTransparentMesh: 1 ---- !u!1 &365282213 +--- !u!1 &140418460 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -810,47 +850,82 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 365282214} - - component: {fileID: 365282215} + - component: {fileID: 140418461} m_Layer: 5 - m_Name: Slider + m_Name: CoinPackage2 m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &365282214 +--- !u!224 &140418461 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 365282213} + m_GameObject: {fileID: 140418460} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 1 + m_ConstrainProportionsScale: 0 m_Children: - - {fileID: 28831449} - - {fileID: 1846836819} - - {fileID: 1119538049} - m_Father: {fileID: 1052043021} + - {fileID: 685256878} + m_Father: {fileID: 2129530803} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 1, y: 0.5} - m_AnchorMax: {x: 1, y: 0.5} - m_AnchoredPosition: {x: -77.2, y: -8.5} - m_SizeDelta: {x: 430, y: 80} - m_Pivot: {x: 1, y: 0.5} ---- !u!114 &365282215 + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 269, y: 0} + m_SizeDelta: {x: 251, y: 285} + m_Pivot: {x: 0, y: 1} +--- !u!1 &164583072 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 164583073} + - component: {fileID: 164583076} + - component: {fileID: 164583075} + - component: {fileID: 164583074} + m_Layer: 5 + m_Name: CrossButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &164583073 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 164583072} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 120710490} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0} + m_AnchorMax: {x: 0.5, y: 0} + m_AnchoredPosition: {x: -5.2, y: 194.79} + m_SizeDelta: {x: 232, y: 232} + m_Pivot: {x: 0.5, y: 0} +--- !u!114 &164583074 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 365282213} + m_GameObject: {fileID: 164583072} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 67db9e8f0e2ae9c40bc1e2b64352a6b4, type: 3} + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} m_Name: m_EditorClassIdentifier: m_Navigation: @@ -881,61 +956,118 @@ MonoBehaviour: m_SelectedTrigger: Selected m_DisabledTrigger: Disabled m_Interactable: 1 - m_TargetGraphic: {fileID: 1258592539} - m_FillRect: {fileID: 1153888469} - m_HandleRect: {fileID: 1258592538} - m_Direction: 0 - m_MinValue: 0 - m_MaxValue: 1 - m_WholeNumbers: 0 - m_Value: 0.177 - m_OnValueChanged: + m_TargetGraphic: {fileID: 164583075} + m_OnClick: m_PersistentCalls: - m_Calls: [] ---- !u!1 &483958581 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 483958582} - - component: {fileID: 483958584} - - component: {fileID: 483958583} + m_Calls: + - m_Target: {fileID: 1295747848} + m_TargetAssemblyTypeName: UnityEngine.GameObject, UnityEngine + m_MethodName: SetActive + m_Mode: 6 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 1 + m_CallState: 2 + - m_Target: {fileID: 120710489} + m_TargetAssemblyTypeName: UnityEngine.GameObject, UnityEngine + m_MethodName: SetActive + m_Mode: 6 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!114 &164583075 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 164583072} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: -752724412, guid: 1a63ea6d0777fc44b9edb3a4a9dee39b, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &164583076 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 164583072} + m_CullTransparentMesh: 1 +--- !u!1 &282693410 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 282693411} + - component: {fileID: 282693413} + - component: {fileID: 282693412} m_Layer: 5 - m_Name: CashBG + m_Name: PanelBG m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &483958582 +--- !u!224 &282693411 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 483958581} + m_GameObject: {fileID: 282693410} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 1967508764} + m_Children: + - {fileID: 647566282} + - {fileID: 2129530803} + m_Father: {fileID: 1852085631} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} - m_AnchoredPosition: {x: 27.7702, y: 0} - m_SizeDelta: {x: 428.5405, y: 87} + m_AnchoredPosition: {x: 0, y: 94.07959} + m_SizeDelta: {x: 855, y: 885} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &483958583 +--- !u!114 &282693412 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 483958581} + m_GameObject: {fileID: 282693410} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} @@ -949,7 +1081,7 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Sprite: {fileID: 610410479, guid: 667ad1e31f7749b4ab8e2a0290ef71a7, type: 3} + m_Sprite: {fileID: -1303976239, guid: c6ad05d85b74fc540b9566c9f27609f8, type: 3} m_Type: 0 m_PreserveAspect: 0 m_FillCenter: 1 @@ -959,15 +1091,15 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &483958584 +--- !u!222 &282693413 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 483958581} + m_GameObject: {fileID: 282693410} m_CullTransparentMesh: 1 ---- !u!1 &537811941 +--- !u!1 &307522012 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -975,42 +1107,42 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 537811942} - - component: {fileID: 537811944} - - component: {fileID: 537811943} + - component: {fileID: 307522013} + - component: {fileID: 307522015} + - component: {fileID: 307522014} m_Layer: 5 - m_Name: BG + m_Name: Logo m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &537811942 +--- !u!224 &307522013 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 537811941} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_GameObject: {fileID: 307522012} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 + m_ConstrainProportionsScale: 1 m_Children: [] - m_Father: {fileID: 624775560} + m_Father: {fileID: 1295747849} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 329.47156} + m_SizeDelta: {x: 820.9949, y: 479.3384} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &537811943 +--- !u!114 &307522014 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 537811941} + m_GameObject: {fileID: 307522012} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} @@ -1024,7 +1156,7 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Sprite: {fileID: 21300000, guid: 3df25e3269dafb442a01aafc7879d433, type: 3} + m_Sprite: {fileID: -1071601717, guid: 667ad1e31f7749b4ab8e2a0290ef71a7, type: 3} m_Type: 0 m_PreserveAspect: 0 m_FillCenter: 1 @@ -1034,15 +1166,15 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &537811944 +--- !u!222 &307522015 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 537811941} + m_GameObject: {fileID: 307522012} m_CullTransparentMesh: 1 ---- !u!1 &544798141 +--- !u!1 &315029014 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -1050,43 +1182,44 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 544798142} - - component: {fileID: 544798144} - - component: {fileID: 544798143} + - component: {fileID: 315029015} + - component: {fileID: 315029017} + - component: {fileID: 315029016} m_Layer: 5 - m_Name: BarBG + m_Name: Banner m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &544798142 +--- !u!224 &315029015 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 544798141} + m_GameObject: {fileID: 315029014} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 + m_ConstrainProportionsScale: 1 m_Children: - - {fileID: 825963821} - m_Father: {fileID: 1843431698} + - {fileID: 1045624783} + - {fileID: 702120856} + m_Father: {fileID: 1653671848} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.5, y: 0.5} - m_AnchorMax: {x: 0.5, y: 0.5} - m_AnchoredPosition: {x: -6.0038, y: 0} - m_SizeDelta: {x: 479.7925, y: 40.9579} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &544798143 + m_AnchorMin: {x: 0.5, y: 1} + m_AnchorMax: {x: 0.5, y: 1} + m_AnchoredPosition: {x: 0, y: 143.65884} + m_SizeDelta: {x: 783.5229, y: 241.6589} + m_Pivot: {x: 0.5, y: 1} +--- !u!114 &315029016 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 544798141} + m_GameObject: {fileID: 315029014} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} @@ -1100,7 +1233,7 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Sprite: {fileID: 1928913513, guid: 667ad1e31f7749b4ab8e2a0290ef71a7, type: 3} + m_Sprite: {fileID: -184041502, guid: 1a63ea6d0777fc44b9edb3a4a9dee39b, type: 3} m_Type: 0 m_PreserveAspect: 0 m_FillCenter: 1 @@ -1110,15 +1243,15 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &544798144 +--- !u!222 &315029017 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 544798141} + m_GameObject: {fileID: 315029014} m_CullTransparentMesh: 1 ---- !u!1 &559579066 +--- !u!1 &365282213 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -1126,93 +1259,7016 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 559579068} - - component: {fileID: 559579067} - m_Layer: 0 - m_Name: Directional Light + - component: {fileID: 365282214} + - component: {fileID: 365282215} + m_Layer: 5 + m_Name: Slider m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!108 &559579067 -Light: +--- !u!224 &365282214 +RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 559579066} + m_GameObject: {fileID: 365282213} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 1 + m_Children: + - {fileID: 28831449} + - {fileID: 1846836819} + - {fileID: 1119538049} + m_Father: {fileID: 1052043021} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0.5} + m_AnchorMax: {x: 1, y: 0.5} + m_AnchoredPosition: {x: -77.2, y: -8.5} + m_SizeDelta: {x: 430, y: 80} + m_Pivot: {x: 1, y: 0.5} +--- !u!114 &365282215 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 365282213} m_Enabled: 1 - serializedVersion: 10 - m_Type: 1 - m_Shape: 0 - m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} - m_Intensity: 1 - m_Range: 10 - m_SpotAngle: 30 - m_InnerSpotAngle: 21.80208 - m_CookieSize: 10 - m_Shadows: - m_Type: 2 - m_Resolution: -1 - m_CustomResolution: -1 - m_Strength: 1 - m_Bias: 0.05 - m_NormalBias: 0.4 - m_NearPlane: 0.2 - m_CullingMatrixOverride: - e00: 1 - e01: 0 - e02: 0 - e03: 0 - e10: 0 - e11: 1 - e12: 0 - e13: 0 - e20: 0 - e21: 0 - e22: 1 - e23: 0 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - m_UseCullingMatrixOverride: 0 - m_Cookie: {fileID: 0} - m_DrawHalo: 0 - m_Flare: {fileID: 0} + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 67db9e8f0e2ae9c40bc1e2b64352a6b4, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1258592539} + m_FillRect: {fileID: 1153888469} + m_HandleRect: {fileID: 1258592538} + m_Direction: 0 + m_MinValue: 0 + m_MaxValue: 1 + m_WholeNumbers: 0 + m_Value: 0.177 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!1 &397313190 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 397313191} + - component: {fileID: 397313193} + - component: {fileID: 397313192} + m_Layer: 5 + m_Name: BuyPrice + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &397313191 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 397313190} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1708467052} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 2.2533} + m_SizeDelta: {x: -76.615, y: -36.0531} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &397313192 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 397313190} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: 7.99$ + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 38.7 + m_fontSizeBase: 24 + m_fontWeight: 400 + m_enableAutoSizing: 1 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 1 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &397313193 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 397313190} + m_CullTransparentMesh: 1 +--- !u!1 &433532452 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 433532453} + - component: {fileID: 433532455} + - component: {fileID: 433532454} + m_Layer: 5 + m_Name: CoinImage (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &433532453 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 433532452} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 685256878} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 50, y: 0} + m_SizeDelta: {x: 100, y: 100} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &433532454 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 433532452} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: -1598796203, guid: c6ad05d85b74fc540b9566c9f27609f8, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &433532455 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 433532452} + m_CullTransparentMesh: 1 +--- !u!1 &443354260 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 443354261} + - component: {fileID: 443354263} + - component: {fileID: 443354262} + m_Layer: 5 + m_Name: CoinRewardText + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &443354261 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 443354260} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1378775077} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: -0.0000076293945, y: -19.6445} + m_SizeDelta: {x: 0, y: 43.1598} + m_Pivot: {x: 0.5, y: 1} +--- !u!114 &443354262 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 443354260} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: 1200 + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 5da2ee26a9d0b024dafba9acbda5519e, type: 2} + m_sharedMaterial: {fileID: 7937037986802887748, guid: 5da2ee26a9d0b024dafba9acbda5519e, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4278190080 + m_fontColor: {r: 0, g: 0, b: 0, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 36.95 + m_fontSizeBase: 36 + m_fontWeight: 400 + m_enableAutoSizing: 1 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &443354263 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 443354260} + m_CullTransparentMesh: 1 +--- !u!1 &483958581 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 483958582} + - component: {fileID: 483958584} + - component: {fileID: 483958583} + m_Layer: 5 + m_Name: CashBG + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &483958582 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 483958581} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1967508764} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 27.7702, y: 0} + m_SizeDelta: {x: 428.5405, y: 87} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &483958583 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 483958581} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 610410479, guid: 667ad1e31f7749b4ab8e2a0290ef71a7, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &483958584 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 483958581} + m_CullTransparentMesh: 1 +--- !u!1 &505193140 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 505193141} + - component: {fileID: 505193143} + - component: {fileID: 505193142} + m_Layer: 5 + m_Name: BuyPrice + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &505193141 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 505193140} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 34805429} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 2.2533} + m_SizeDelta: {x: -76.615, y: -36.0531} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &505193142 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 505193140} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: 7.99$ + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 38.7 + m_fontSizeBase: 24 + m_fontWeight: 400 + m_enableAutoSizing: 1 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 1 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &505193143 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 505193140} + m_CullTransparentMesh: 1 +--- !u!1 &517469374 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 517469375} + m_Layer: 5 + m_Name: CoinPackage4 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &517469375 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 517469374} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 76796530} + m_Father: {fileID: 2129530803} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 0, y: -328} + m_SizeDelta: {x: 251, y: 285} + m_Pivot: {x: 0, y: 1} +--- !u!1 &525242349 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 525242350} + - component: {fileID: 525242352} + - component: {fileID: 525242351} + m_Layer: 5 + m_Name: CoinRewardText + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &525242350 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 525242349} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 685256878} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: -0.0000076293945, y: -19.6445} + m_SizeDelta: {x: 0, y: 43.1598} + m_Pivot: {x: 0.5, y: 1} +--- !u!114 &525242351 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 525242349} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: 1200 + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 5da2ee26a9d0b024dafba9acbda5519e, type: 2} + m_sharedMaterial: {fileID: 7937037986802887748, guid: 5da2ee26a9d0b024dafba9acbda5519e, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4278190080 + m_fontColor: {r: 0, g: 0, b: 0, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 36.95 + m_fontSizeBase: 36 + m_fontWeight: 400 + m_enableAutoSizing: 1 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &525242352 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 525242349} + m_CullTransparentMesh: 1 +--- !u!1 &537811941 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 537811942} + - component: {fileID: 537811944} + - component: {fileID: 537811943} + m_Layer: 5 + m_Name: BG + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &537811942 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 537811941} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 624775560} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &537811943 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 537811941} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 3df25e3269dafb442a01aafc7879d433, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &537811944 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 537811941} + m_CullTransparentMesh: 1 +--- !u!1 &544798141 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 544798142} + - component: {fileID: 544798144} + - component: {fileID: 544798143} + m_Layer: 5 + m_Name: BarBG + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &544798142 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 544798141} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 825963821} + m_Father: {fileID: 1843431698} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -6.0038, y: 0} + m_SizeDelta: {x: 479.7925, y: 40.9579} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &544798143 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 544798141} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 1928913513, guid: 667ad1e31f7749b4ab8e2a0290ef71a7, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &544798144 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 544798141} + m_CullTransparentMesh: 1 +--- !u!1 &559579066 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 559579068} + - component: {fileID: 559579067} + m_Layer: 0 + m_Name: Directional Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &559579067 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 559579066} + m_Enabled: 1 + serializedVersion: 10 + m_Type: 1 + m_Shape: 0 + m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} + m_Intensity: 1 + m_Range: 10 + m_SpotAngle: 30 + m_InnerSpotAngle: 21.80208 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_CullingMatrixOverride: + e00: 1 + e01: 0 + e02: 0 + e03: 0 + e10: 0 + e11: 1 + e12: 0 + e13: 0 + e20: 0 + e21: 0 + e22: 1 + e23: 0 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + m_UseCullingMatrixOverride: 0 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingLayerMask: 1 + m_Lightmapping: 4 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} + m_UseBoundingSphereOverride: 0 + m_UseViewFrustumForShadowCasterCull: 1 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!4 &559579068 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 559579066} + serializedVersion: 2 + m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} + m_LocalPosition: {x: 0, y: 3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} +--- !u!1 &624775556 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 624775560} + - component: {fileID: 624775559} + - component: {fileID: 624775558} + - component: {fileID: 624775557} + m_Layer: 5 + m_Name: Canvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &624775557 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 624775556} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 +--- !u!114 &624775558 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 624775556} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 1 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 1080, y: 1920} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 1 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 + m_PresetInfoIsWorld: 0 +--- !u!223 &624775559 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 624775556} + m_Enabled: 1 + serializedVersion: 3 m_RenderMode: 0 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_VertexColorAlwaysGammaSpace: 0 + m_AdditionalShaderChannelsFlag: 25 + m_UpdateRectTransformForStandalone: 0 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!224 &624775560 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 624775556} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0, y: 0, z: 0} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 537811942} + - {fileID: 120710490} + - {fileID: 1295747849} + - {fileID: 1852085631} + - {fileID: 3188961330051606762} + - {fileID: 805359303} + - {fileID: 2114865119} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0} +--- !u!1 &647566281 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 647566282} + - component: {fileID: 647566284} + - component: {fileID: 647566283} + m_Layer: 5 + m_Name: RedBanner + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &647566282 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 647566281} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 716151036} + - {fileID: 656091917} + m_Father: {fileID: 282693411} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 1} + m_AnchorMax: {x: 0.5, y: 1} + m_AnchoredPosition: {x: 0, y: 113.1} + m_SizeDelta: {x: 719.8101, y: 222.6837} + m_Pivot: {x: 0.5, y: 1} +--- !u!114 &647566283 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 647566281} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: -2080922092, guid: c6ad05d85b74fc540b9566c9f27609f8, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &647566284 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 647566281} + m_CullTransparentMesh: 1 +--- !u!1 &651480212 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 651480213} + - component: {fileID: 651480215} + - component: {fileID: 651480214} + m_Layer: 5 + m_Name: CoinImage + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &651480213 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 651480212} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 12413217} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0.1605, y: -1.2404022} + m_SizeDelta: {x: 134.8, y: 121.2522} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &651480214 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 651480212} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 643645707, guid: c6ad05d85b74fc540b9566c9f27609f8, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &651480215 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 651480212} + m_CullTransparentMesh: 1 +--- !u!1 &656091916 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 656091917} + - component: {fileID: 656091919} + - component: {fileID: 656091918} + m_Layer: 5 + m_Name: ShopText + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &656091917 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 656091916} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 647566282} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0} + m_AnchorMax: {x: 0.5, y: 1} + m_AnchoredPosition: {x: 37, y: 31} + m_SizeDelta: {x: 228.2, y: -94.5646} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &656091918 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 656091916} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: SHOP + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 5da2ee26a9d0b024dafba9acbda5519e, type: 2} + m_sharedMaterial: {fileID: 7937037986802887748, guid: 5da2ee26a9d0b024dafba9acbda5519e, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 72 + m_fontSizeBase: 36 + m_fontWeight: 400 + m_enableAutoSizing: 1 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &656091919 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 656091916} + m_CullTransparentMesh: 1 +--- !u!1 &685256877 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 685256878} + - component: {fileID: 685256880} + - component: {fileID: 685256879} + m_Layer: 5 + m_Name: PanelBG + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &685256878 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 685256877} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 525242350} + - {fileID: 1095039394} + - {fileID: 433532453} + - {fileID: 1917365541} + m_Father: {fileID: 140418461} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 1} + m_AnchorMax: {x: 0.5, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 240, y: 250} + m_Pivot: {x: 0.5, y: 1} +--- !u!114 &685256879 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 685256877} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: -1323277974, guid: c6ad05d85b74fc540b9566c9f27609f8, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &685256880 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 685256877} + m_CullTransparentMesh: 1 +--- !u!1 &693894143 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 693894144} + - component: {fileID: 693894146} + - component: {fileID: 693894145} + m_Layer: 5 + m_Name: Position + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &693894144 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 693894143} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 3872224433570044647} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -0.824, y: -146.07776} + m_SizeDelta: {x: 110, y: 110} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &693894145 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 693894143} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: 1 + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 5da2ee26a9d0b024dafba9acbda5519e, type: 2} + m_sharedMaterial: {fileID: 7937037986802887748, guid: 5da2ee26a9d0b024dafba9acbda5519e, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 72 + m_fontSizeBase: 36 + m_fontWeight: 400 + m_enableAutoSizing: 1 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &693894146 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 693894143} + m_CullTransparentMesh: 1 +--- !u!1 &696602053 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 696602054} + - component: {fileID: 696602056} + - component: {fileID: 696602055} + m_Layer: 5 + m_Name: CoinRewardText + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &696602054 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 696602053} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 859392248} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: -0.0000076293945, y: -19.6445} + m_SizeDelta: {x: 0, y: 43.1598} + m_Pivot: {x: 0.5, y: 1} +--- !u!114 &696602055 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 696602053} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: 1200 + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 5da2ee26a9d0b024dafba9acbda5519e, type: 2} + m_sharedMaterial: {fileID: 7937037986802887748, guid: 5da2ee26a9d0b024dafba9acbda5519e, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4278190080 + m_fontColor: {r: 0, g: 0, b: 0, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 36.95 + m_fontSizeBase: 36 + m_fontWeight: 400 + m_enableAutoSizing: 1 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &696602056 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 696602053} + m_CullTransparentMesh: 1 +--- !u!1 &701830710 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 701830711} + - component: {fileID: 701830714} + - component: {fileID: 701830713} + - component: {fileID: 701830712} + m_Layer: 5 + m_Name: BuyButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &701830711 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 701830710} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1454142816} + m_Father: {fileID: 1616145757} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0} + m_AnchorMax: {x: 0.5, y: 0} + m_AnchoredPosition: {x: 0, y: -33.549103} + m_SizeDelta: {x: 184.7591, y: 86.943} + m_Pivot: {x: 0.5, y: 0} +--- !u!114 &701830712 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 701830710} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 701830713} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &701830713 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 701830710} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: -636975818, guid: c6ad05d85b74fc540b9566c9f27609f8, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &701830714 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 701830710} + m_CullTransparentMesh: 1 +--- !u!1 &702120855 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 702120856} + - component: {fileID: 702120858} + - component: {fileID: 702120857} + m_Layer: 5 + m_Name: SettingText + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &702120856 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 702120855} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 315029015} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 20.308012, y: 22.986588} + m_SizeDelta: {x: 294.4129, y: 107.7269} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &702120857 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 702120855} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Settings + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 5da2ee26a9d0b024dafba9acbda5519e, type: 2} + m_sharedMaterial: {fileID: 7937037986802887748, guid: 5da2ee26a9d0b024dafba9acbda5519e, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 72 + m_fontSizeBase: 36 + m_fontWeight: 400 + m_enableAutoSizing: 1 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &702120858 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 702120855} + m_CullTransparentMesh: 1 +--- !u!1 &716151035 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 716151036} + - component: {fileID: 716151038} + - component: {fileID: 716151037} + m_Layer: 5 + m_Name: Cart + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &716151036 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 716151035} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 647566282} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: 143, y: 35.465378} + m_SizeDelta: {x: 106.3706, y: 81.6774} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &716151037 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 716151035} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 430588942, guid: c6ad05d85b74fc540b9566c9f27609f8, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &716151038 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 716151035} + m_CullTransparentMesh: 1 +--- !u!1 &729371662 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 729371663} + - component: {fileID: 729371665} + - component: {fileID: 729371664} + m_Layer: 5 + m_Name: CoinImage + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &729371663 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 729371662} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 76796530} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 134.8, y: 121.2522} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &729371664 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 729371662} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 643645707, guid: c6ad05d85b74fc540b9566c9f27609f8, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &729371665 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 729371662} + m_CullTransparentMesh: 1 +--- !u!1 &794466103 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 794466104} + - component: {fileID: 794466106} + - component: {fileID: 794466105} + m_Layer: 5 + m_Name: Coin + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &794466104 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 794466103} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.56677, y: 0.56677, z: 0.56677} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1967508764} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: 60.5, y: 0} + m_SizeDelta: {x: 162, y: 162} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &794466105 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 794466103} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: -1468440732, guid: 667ad1e31f7749b4ab8e2a0290ef71a7, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &794466106 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 794466103} + m_CullTransparentMesh: 1 +--- !u!1 &805359302 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 805359303} + - component: {fileID: 805359305} + - component: {fileID: 805359304} + m_Layer: 5 + m_Name: Mockup + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &805359303 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 805359302} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 624775560} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 1080, y: 1920} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &805359304 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 805359302} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0.43137255} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 338cb1790dbe33749bdd0eab190a6803, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &805359305 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 805359302} + m_CullTransparentMesh: 1 +--- !u!1 &825963820 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 825963821} + - component: {fileID: 825963823} + - component: {fileID: 825963822} + m_Layer: 5 + m_Name: BarFill + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &825963821 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 825963820} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 544798142} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: -1.0499725, y: -1.3999996} + m_SizeDelta: {x: -2.1000583, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &825963822 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 825963820} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: -1134826220, guid: 667ad1e31f7749b4ab8e2a0290ef71a7, type: 3} + m_Type: 3 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 0 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &825963823 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 825963820} + m_CullTransparentMesh: 1 +--- !u!1 &837762185 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 837762186} + - component: {fileID: 837762188} + - component: {fileID: 837762187} + m_Layer: 5 + m_Name: BuyPrice + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &837762186 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 837762185} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 847754261} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 2.2533} + m_SizeDelta: {x: -76.615, y: -36.0531} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &837762187 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 837762185} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: 7.99$ + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 38.7 + m_fontSizeBase: 24 + m_fontWeight: 400 + m_enableAutoSizing: 1 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 1 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &837762188 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 837762185} + m_CullTransparentMesh: 1 +--- !u!1 &847754260 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 847754261} + - component: {fileID: 847754264} + - component: {fileID: 847754263} + - component: {fileID: 847754262} + m_Layer: 5 + m_Name: BuyButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &847754261 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 847754260} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 837762186} + m_Father: {fileID: 1378775077} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0} + m_AnchorMax: {x: 0.5, y: 0} + m_AnchoredPosition: {x: 0, y: -33.549103} + m_SizeDelta: {x: 184.7591, y: 86.943} + m_Pivot: {x: 0.5, y: 0} +--- !u!114 &847754262 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 847754260} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 847754263} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &847754263 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 847754260} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: -636975818, guid: c6ad05d85b74fc540b9566c9f27609f8, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &847754264 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 847754260} + m_CullTransparentMesh: 1 +--- !u!1 &859392247 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 859392248} + - component: {fileID: 859392250} + - component: {fileID: 859392249} + m_Layer: 5 + m_Name: PanelBG + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &859392248 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 859392247} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 696602054} + - {fileID: 1391942702} + - {fileID: 885772604} + - {fileID: 34805429} + m_Father: {fileID: 1502680483} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 1} + m_AnchorMax: {x: 0.5, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 240, y: 250} + m_Pivot: {x: 0.5, y: 1} +--- !u!114 &859392249 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 859392247} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: -1323277974, guid: c6ad05d85b74fc540b9566c9f27609f8, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &859392250 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 859392247} + m_CullTransparentMesh: 1 +--- !u!1 &877599030 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 877599033} + - component: {fileID: 877599032} + - component: {fileID: 877599031} + m_Layer: 0 + m_Name: EventSystem + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &877599031 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 877599030} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3} + m_Name: + m_EditorClassIdentifier: + m_SendPointerHoverToParent: 1 + m_HorizontalAxis: Horizontal + m_VerticalAxis: Vertical + m_SubmitButton: Submit + m_CancelButton: Cancel + m_InputActionsPerSecond: 10 + m_RepeatDelay: 0.5 + m_ForceModuleActive: 0 +--- !u!114 &877599032 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 877599030} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3} + m_Name: + m_EditorClassIdentifier: + m_FirstSelected: {fileID: 0} + m_sendNavigationEvents: 1 + m_DragThreshold: 10 +--- !u!4 &877599033 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 877599030} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &885354674 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 885354675} + - component: {fileID: 885354677} + - component: {fileID: 885354676} + m_Layer: 5 + m_Name: CoinImage + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &885354675 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 885354674} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1616145757} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -15.2, y: 0} + m_SizeDelta: {x: 100, y: 100} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &885354676 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 885354674} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: -1598796203, guid: c6ad05d85b74fc540b9566c9f27609f8, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &885354677 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 885354674} + m_CullTransparentMesh: 1 +--- !u!1 &885772603 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 885772604} + - component: {fileID: 885772606} + - component: {fileID: 885772605} + m_Layer: 5 + m_Name: CoinImage (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &885772604 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 885772603} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 859392248} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0.5} + m_AnchorMax: {x: 1, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 132, y: 132} + m_Pivot: {x: 1, y: 0.5} +--- !u!114 &885772605 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 885772603} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: -918197646, guid: c6ad05d85b74fc540b9566c9f27609f8, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &885772606 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 885772603} + m_CullTransparentMesh: 1 +--- !u!1 &901140415 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 901140416} + - component: {fileID: 901140418} + - component: {fileID: 901140417} + m_Layer: 5 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &901140416 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 901140415} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 23012388} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &901140417 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 901140415} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Save + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 5da2ee26a9d0b024dafba9acbda5519e, type: 2} + m_sharedMaterial: {fileID: 7937037986802887748, guid: 5da2ee26a9d0b024dafba9acbda5519e, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 72 + m_fontSizeBase: 24 + m_fontWeight: 400 + m_enableAutoSizing: 1 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &901140418 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 901140415} + m_CullTransparentMesh: 1 +--- !u!1 &1011777846 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1011777847} + - component: {fileID: 1011777850} + - component: {fileID: 1011777849} + - component: {fileID: 1011777848} + m_Layer: 5 + m_Name: BuyButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1011777847 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1011777846} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 2137987663} + m_Father: {fileID: 12413217} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0} + m_AnchorMax: {x: 0.5, y: 0} + m_AnchoredPosition: {x: 0, y: -33.549103} + m_SizeDelta: {x: 184.7591, y: 86.943} + m_Pivot: {x: 0.5, y: 0} +--- !u!114 &1011777848 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1011777846} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1011777849} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &1011777849 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1011777846} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: -636975818, guid: c6ad05d85b74fc540b9566c9f27609f8, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1011777850 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1011777846} + m_CullTransparentMesh: 1 +--- !u!1 &1020845098 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1020845099} + - component: {fileID: 1020845101} + - component: {fileID: 1020845100} + m_Layer: 5 + m_Name: Tick + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1020845099 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1020845098} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1727736101} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 9.1672, y: 6.134796} + m_SizeDelta: {x: 72.389, y: 66.6739} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1020845100 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1020845098} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: -1130963600, guid: 1a63ea6d0777fc44b9edb3a4a9dee39b, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1020845101 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1020845098} + m_CullTransparentMesh: 1 +--- !u!1 &1033533884 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1033533885} + - component: {fileID: 1033533887} + - component: {fileID: 1033533886} + m_Layer: 5 + m_Name: Position + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1033533885 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1033533884} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 8946041516820998889} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -3.1, y: -136.5} + m_SizeDelta: {x: 110, y: 110} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1033533886 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1033533884} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: 2 + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 5da2ee26a9d0b024dafba9acbda5519e, type: 2} + m_sharedMaterial: {fileID: 7937037986802887748, guid: 5da2ee26a9d0b024dafba9acbda5519e, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 72 + m_fontSizeBase: 36 + m_fontWeight: 400 + m_enableAutoSizing: 1 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &1033533887 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1033533884} + m_CullTransparentMesh: 1 +--- !u!1 &1045624782 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1045624783} + - component: {fileID: 1045624785} + - component: {fileID: 1045624784} + m_Layer: 5 + m_Name: SettingIcon + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1045624783 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1045624782} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.52677673, y: 0.52677673, z: 0.52677673} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 315029015} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: 125.11, y: 23.3} + m_SizeDelta: {x: 199.9642, y: 192.9725} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &1045624784 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1045624782} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: -637297471, guid: 1a63ea6d0777fc44b9edb3a4a9dee39b, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1045624785 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1045624782} + m_CullTransparentMesh: 1 +--- !u!1 &1052043020 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1052043021} + m_Layer: 5 + m_Name: SoundVolume + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1052043021 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1052043020} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1727447450} + - {fileID: 365282214} + m_Father: {fileID: 1653671848} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 147} + m_SizeDelta: {x: 951, y: 173.5} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &1095039393 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1095039394} + - component: {fileID: 1095039396} + - component: {fileID: 1095039395} + m_Layer: 5 + m_Name: CoinImage + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1095039394 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1095039393} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 685256878} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -50, y: 0} + m_SizeDelta: {x: 100, y: 100} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1095039395 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1095039393} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: -1598796203, guid: c6ad05d85b74fc540b9566c9f27609f8, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1095039396 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1095039393} + m_CullTransparentMesh: 1 +--- !u!1 &1102335810 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1102335811} + - component: {fileID: 1102335813} + - component: {fileID: 1102335812} + m_Layer: 5 + m_Name: CashText + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1102335811 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1102335810} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1967508764} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 64.5, y: 0} + m_SizeDelta: {x: 244.7501, y: 50} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1102335812 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1102335810} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: 999999 + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4278190080 + m_fontColor: {r: 0, g: 0, b: 0, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 44.75 + m_fontSizeBase: 36 + m_fontWeight: 400 + m_enableAutoSizing: 1 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &1102335813 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1102335810} + m_CullTransparentMesh: 1 +--- !u!1 &1109681750 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1109681751} + - component: {fileID: 1109681754} + - component: {fileID: 1109681753} + - component: {fileID: 1109681752} + m_Layer: 5 + m_Name: PlayButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1109681751 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1109681750} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1844700870} + m_Father: {fileID: 1295747849} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0} + m_AnchorMax: {x: 0.5, y: 0} + m_AnchoredPosition: {x: 0, y: 168} + m_SizeDelta: {x: 665.0861, y: 312.6064} + m_Pivot: {x: 0.5, y: 0} +--- !u!114 &1109681752 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1109681750} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1109681753} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &1109681753 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1109681750} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: -1560240640, guid: 667ad1e31f7749b4ab8e2a0290ef71a7, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1109681754 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1109681750} + m_CullTransparentMesh: 1 +--- !u!1 &1119538048 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1119538049} + m_Layer: 5 + m_Name: Handle Slide Area + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1119538049 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1119538048} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1258592538} + m_Father: {fileID: 365282214} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -20, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &1146867877 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1146867878} + - component: {fileID: 1146867880} + - component: {fileID: 1146867879} + m_Layer: 5 + m_Name: CoinImage (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1146867878 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1146867877} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 76796530} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0.5} + m_AnchorMax: {x: 1, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 134.8, y: 121.2522} + m_Pivot: {x: 1, y: 0.5} +--- !u!114 &1146867879 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1146867877} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 643645707, guid: c6ad05d85b74fc540b9566c9f27609f8, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1146867880 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1146867877} + m_CullTransparentMesh: 1 +--- !u!1 &1153888468 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1153888469} + - component: {fileID: 1153888471} + - component: {fileID: 1153888470} + m_Layer: 5 + m_Name: Fill + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1153888469 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1153888468} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1846836819} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 10, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1153888470 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1153888468} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 2113023272, guid: 1a63ea6d0777fc44b9edb3a4a9dee39b, type: 3} + m_Type: 3 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 0 + m_FillAmount: 0.177 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1153888471 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1153888468} + m_CullTransparentMesh: 1 +--- !u!1 &1208146638 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1208146639} + - component: {fileID: 1208146641} + - component: {fileID: 1208146640} + m_Layer: 5 + m_Name: BuyPrice + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1208146639 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1208146638} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1917365541} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 2.2533} + m_SizeDelta: {x: -76.615, y: -36.0531} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1208146640 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1208146638} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: 7.99$ + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 38.7 + m_fontSizeBase: 24 + m_fontWeight: 400 + m_enableAutoSizing: 1 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 1 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &1208146641 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1208146638} + m_CullTransparentMesh: 1 +--- !u!1 &1211240240 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1211240241} + m_Layer: 5 + m_Name: CoinPackage3 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1211240241 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1211240240} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 12413217} + m_Father: {fileID: 2129530803} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 538, y: 0} + m_SizeDelta: {x: 251, y: 285} + m_Pivot: {x: 0, y: 1} +--- !u!1 &1217494643 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1217494644} + - component: {fileID: 1217494646} + - component: {fileID: 1217494645} + m_Layer: 5 + m_Name: CoinRewardText + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1217494644 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1217494643} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 76796530} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: -0.0000076293945, y: -19.6445} + m_SizeDelta: {x: 0, y: 43.1598} + m_Pivot: {x: 0.5, y: 1} +--- !u!114 &1217494645 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1217494643} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: 1200 + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 5da2ee26a9d0b024dafba9acbda5519e, type: 2} + m_sharedMaterial: {fileID: 7937037986802887748, guid: 5da2ee26a9d0b024dafba9acbda5519e, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4278190080 + m_fontColor: {r: 0, g: 0, b: 0, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 36.95 + m_fontSizeBase: 36 + m_fontWeight: 400 + m_enableAutoSizing: 1 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &1217494646 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1217494643} + m_CullTransparentMesh: 1 +--- !u!1 &1258592537 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1258592538} + - component: {fileID: 1258592540} + - component: {fileID: 1258592539} + m_Layer: 5 + m_Name: Handle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1258592538 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1258592537} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1119538049} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.177, y: 0} + m_AnchorMax: {x: 0.177, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 85.2919, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1258592539 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1258592537} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: -1333466350, guid: 1a63ea6d0777fc44b9edb3a4a9dee39b, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1258592540 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1258592537} + m_CullTransparentMesh: 1 +--- !u!1 &1266691139 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1266691140} + - component: {fileID: 1266691142} + - component: {fileID: 1266691141} + m_Layer: 5 + m_Name: CoinImage + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1266691140 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1266691139} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1378775077} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 3.0546, y: -4.147705} + m_SizeDelta: {x: 132.6866, y: 132.69} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1266691141 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1266691139} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: -918197646, guid: c6ad05d85b74fc540b9566c9f27609f8, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1266691142 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1266691139} + m_CullTransparentMesh: 1 +--- !u!1 &1295747848 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1295747849} + m_Layer: 5 + m_Name: MainScreen + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &1295747849 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1295747848} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1604735174} + - {fileID: 307522013} + - {fileID: 1109681751} + - {fileID: 1967508764} + - {fileID: 1843431698} + m_Father: {fileID: 624775560} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &1376502210 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1376502211} + - component: {fileID: 1376502214} + - component: {fileID: 1376502213} + - component: {fileID: 1376502212} + m_Layer: 5 + m_Name: SwitchBG + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1376502211 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1376502210} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1581919511} + m_Father: {fileID: 1896578657} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0.5} + m_AnchorMax: {x: 1, y: 0.5} + m_AnchoredPosition: {x: -71, y: -4} + m_SizeDelta: {x: 266.3007, y: 113.8385} + m_Pivot: {x: 1, y: 0.5} +--- !u!114 &1376502212 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1376502210} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1376502213} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &1376502213 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1376502210} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 257160919, guid: 1a63ea6d0777fc44b9edb3a4a9dee39b, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1376502214 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1376502210} + m_CullTransparentMesh: 1 +--- !u!1 &1378775076 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1378775077} + - component: {fileID: 1378775079} + - component: {fileID: 1378775078} + m_Layer: 5 + m_Name: PanelBG + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1378775077 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1378775076} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 443354261} + - {fileID: 1266691140} + - {fileID: 847754261} + m_Father: {fileID: 1569081698} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 1} + m_AnchorMax: {x: 0.5, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 240, y: 250} + m_Pivot: {x: 0.5, y: 1} +--- !u!114 &1378775078 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1378775076} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: -1323277974, guid: c6ad05d85b74fc540b9566c9f27609f8, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1378775079 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1378775076} + m_CullTransparentMesh: 1 +--- !u!1 &1391942701 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1391942702} + - component: {fileID: 1391942704} + - component: {fileID: 1391942703} + m_Layer: 5 + m_Name: CoinImage + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1391942702 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1391942701} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 859392248} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 132, y: 132} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &1391942703 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1391942701} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: -918197646, guid: c6ad05d85b74fc540b9566c9f27609f8, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1391942704 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1391942701} + m_CullTransparentMesh: 1 +--- !u!1 &1425801117 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1425801118} + - component: {fileID: 1425801120} + - component: {fileID: 1425801119} + m_Layer: 5 + m_Name: Position + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1425801118 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1425801117} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 6149721200587309550} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -0.5, y: -139.93924} + m_SizeDelta: {x: 80.1447, y: 80.1447} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1425801119 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1425801117} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: 3 + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 5da2ee26a9d0b024dafba9acbda5519e, type: 2} + m_sharedMaterial: {fileID: 7937037986802887748, guid: 5da2ee26a9d0b024dafba9acbda5519e, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 68.65 + m_fontSizeBase: 36 + m_fontWeight: 400 + m_enableAutoSizing: 1 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &1425801120 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1425801117} + m_CullTransparentMesh: 1 +--- !u!1 &1432874018 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1432874019} + - component: {fileID: 1432874021} + - component: {fileID: 1432874020} + m_Layer: 5 + m_Name: CoinRewardText + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1432874019 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1432874018} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1616145757} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: -0.0000076293945, y: -19.6445} + m_SizeDelta: {x: 0, y: 43.1598} + m_Pivot: {x: 0.5, y: 1} +--- !u!114 &1432874020 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1432874018} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: 1200 + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 5da2ee26a9d0b024dafba9acbda5519e, type: 2} + m_sharedMaterial: {fileID: 7937037986802887748, guid: 5da2ee26a9d0b024dafba9acbda5519e, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4278190080 + m_fontColor: {r: 0, g: 0, b: 0, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 36.95 + m_fontSizeBase: 36 + m_fontWeight: 400 + m_enableAutoSizing: 1 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &1432874021 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1432874018} + m_CullTransparentMesh: 1 +--- !u!1 &1443059154 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1443059157} + - component: {fileID: 1443059156} + - component: {fileID: 1443059155} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &1443059155 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1443059154} + m_Enabled: 1 +--- !u!20 &1443059156 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1443059154} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_Iso: 200 + m_ShutterSpeed: 0.005 + m_Aperture: 16 + m_FocusDistance: 10 + m_FocalLength: 50 + m_BladeCount: 5 + m_Curvature: {x: 2, y: 11} + m_BarrelClipping: 0.25 + m_Anamorphism: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: -1 m_CullingMask: serializedVersion: 2 - m_Bits: 4294967295 - m_RenderingLayerMask: 1 - m_Lightmapping: 4 - m_LightShadowCasterMode: 0 - m_AreaSize: {x: 1, y: 1} - m_BounceIntensity: 1 - m_ColorTemperature: 6570 - m_UseColorTemperature: 0 - m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} - m_UseBoundingSphereOverride: 0 - m_UseViewFrustumForShadowCasterCull: 1 - m_ShadowRadius: 0 - m_ShadowAngle: 0 ---- !u!4 &559579068 -Transform: + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &1443059157 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1443059154} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1, z: -10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1454142815 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1454142816} + - component: {fileID: 1454142818} + - component: {fileID: 1454142817} + m_Layer: 5 + m_Name: BuyPrice + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1454142816 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1454142815} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 701830711} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 2.2533} + m_SizeDelta: {x: -76.615, y: -36.0531} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1454142817 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1454142815} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: 7.99$ + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 38.7 + m_fontSizeBase: 24 + m_fontWeight: 400 + m_enableAutoSizing: 1 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 1 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &1454142818 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1454142815} + m_CullTransparentMesh: 1 +--- !u!1 &1502680482 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1502680483} + m_Layer: 5 + m_Name: CoinPackage6 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1502680483 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1502680482} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 859392248} + m_Father: {fileID: 2129530803} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 538, y: -328} + m_SizeDelta: {x: 251, y: 285} + m_Pivot: {x: 0, y: 1} +--- !u!1 &1554919879 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1554919880} + - component: {fileID: 1554919882} + - component: {fileID: 1554919881} + m_Layer: 5 + m_Name: CheckBoxText + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1554919880 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1554919879} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1653671848} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0} + m_AnchorMax: {x: 0.5, y: 0} + m_AnchoredPosition: {x: 16.6525, y: 130.36465} + m_SizeDelta: {x: 455.3732, y: 70.745} + m_Pivot: {x: 0.5, y: 0} +--- !u!114 &1554919881 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1554919879} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Agree with terms and Policies + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 5da2ee26a9d0b024dafba9acbda5519e, type: 2} + m_sharedMaterial: {fileID: 7937037986802887748, guid: 5da2ee26a9d0b024dafba9acbda5519e, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4278190080 + m_fontColor: {r: 0, g: 0, b: 0, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 32.3 + m_fontSizeBase: 36 + m_fontWeight: 400 + m_enableAutoSizing: 1 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &1554919882 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1554919879} + m_CullTransparentMesh: 1 +--- !u!1 &1568707452 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1568707453} + - component: {fileID: 1568707455} + - component: {fileID: 1568707454} + m_Layer: 5 + m_Name: Title + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1568707453 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1568707452} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 2114865119} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 1} + m_AnchorMax: {x: 0.5, y: 1} + m_AnchoredPosition: {x: 0, y: -84.3} + m_SizeDelta: {x: 750, y: 234} + m_Pivot: {x: 0.5, y: 1} +--- !u!114 &1568707454 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1568707452} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 662419875, guid: 40b5595732a0e224680c1f680953d775, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1568707455 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1568707452} + m_CullTransparentMesh: 1 +--- !u!1 &1569081697 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1569081698} + m_Layer: 5 + m_Name: CoinPackage5 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1569081698 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1569081697} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1378775077} + m_Father: {fileID: 2129530803} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 269, y: -328} + m_SizeDelta: {x: 251, y: 285} + m_Pivot: {x: 0, y: 1} +--- !u!1 &1581919510 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1581919511} + - component: {fileID: 1581919513} + - component: {fileID: 1581919512} + m_Layer: 5 + m_Name: SwitchHandle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1581919511 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1581919510} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1376502211} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -100, y: 1} + m_SizeDelta: {x: 137.4667, y: 135.9561} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1581919512 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1581919510} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: -1415735947, guid: 1a63ea6d0777fc44b9edb3a4a9dee39b, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1581919513 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1581919510} + m_CullTransparentMesh: 1 +--- !u!1 &1604735173 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1604735174} + - component: {fileID: 1604735177} + - component: {fileID: 1604735176} + - component: {fileID: 1604735175} + m_Layer: 5 + m_Name: SettingsButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1604735174 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1604735173} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 1 + m_Children: [] + m_Father: {fileID: 1295747849} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: -12, y: -15} + m_SizeDelta: {x: 195, y: 189} + m_Pivot: {x: 1, y: 1} +--- !u!114 &1604735175 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1604735173} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1604735176} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 120710489} + m_TargetAssemblyTypeName: UnityEngine.GameObject, UnityEngine + m_MethodName: SetActive + m_Mode: 6 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 1 + m_CallState: 2 + - m_Target: {fileID: 1295747848} + m_TargetAssemblyTypeName: UnityEngine.GameObject, UnityEngine + m_MethodName: SetActive + m_Mode: 6 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!114 &1604735176 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1604735173} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 512344220, guid: 667ad1e31f7749b4ab8e2a0290ef71a7, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1604735177 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1604735173} + m_CullTransparentMesh: 1 +--- !u!1 &1616145756 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1616145757} + - component: {fileID: 1616145759} + - component: {fileID: 1616145758} + m_Layer: 5 + m_Name: PanelBG + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1616145757 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1616145756} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1432874019} + - {fileID: 885354675} + - {fileID: 701830711} + m_Father: {fileID: 1630643143} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 1} + m_AnchorMax: {x: 0.5, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 240, y: 250} + m_Pivot: {x: 0.5, y: 1} +--- !u!114 &1616145758 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1616145756} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: -1323277974, guid: c6ad05d85b74fc540b9566c9f27609f8, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1616145759 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1616145756} + m_CullTransparentMesh: 1 +--- !u!1 &1630643142 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1630643143} + m_Layer: 5 + m_Name: CoinPacakge1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1630643143 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1630643142} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1616145757} + m_Father: {fileID: 2129530803} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 251, y: 285} + m_Pivot: {x: 0, y: 1} +--- !u!1 &1653671847 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1653671848} + - component: {fileID: 1653671850} + - component: {fileID: 1653671849} + m_Layer: 5 + m_Name: Panel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1653671848 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1653671847} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 1 + m_Children: + - {fileID: 315029015} + - {fileID: 1052043021} + - {fileID: 1896578657} + - {fileID: 23012388} + - {fileID: 1554919880} + - {fileID: 1727736101} + m_Father: {fileID: 120710490} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 78.93727} + m_SizeDelta: {x: 986.5769, y: 902.4554} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1653671849 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1653671847} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: -147694649, guid: 1a63ea6d0777fc44b9edb3a4a9dee39b, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1653671850 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1653671847} + m_CullTransparentMesh: 1 +--- !u!1 &1674621262 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1674621263} + - component: {fileID: 1674621266} + - component: {fileID: 1674621265} + - component: {fileID: 1674621264} + m_Layer: 5 + m_Name: CrossButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1674621263 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1674621262} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1852085631} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0} + m_AnchorMax: {x: 0.5, y: 0} + m_AnchoredPosition: {x: -5.5994, y: 236.108} + m_SizeDelta: {x: 208, y: 208} + m_Pivot: {x: 0.5, y: 0} +--- !u!114 &1674621264 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1674621262} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1674621265} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &1674621265 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1674621262} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: -1253242827, guid: c6ad05d85b74fc540b9566c9f27609f8, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1674621266 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1674621262} + m_CullTransparentMesh: 1 +--- !u!1 &1688123566 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1688123567} + - component: {fileID: 1688123570} + - component: {fileID: 1688123569} + - component: {fileID: 1688123568} + m_Layer: 5 + m_Name: CashAddButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1688123567 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1688123566} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1967508764} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0.5} + m_AnchorMax: {x: 1, y: 0.5} + m_AnchoredPosition: {x: 29.6, y: 1.9000015} + m_SizeDelta: {x: 94, y: 94} + m_Pivot: {x: 1, y: 0.5} +--- !u!114 &1688123568 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1688123566} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1688123569} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &1688123569 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1688123566} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: -1225918769, guid: 667ad1e31f7749b4ab8e2a0290ef71a7, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1688123570 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1688123566} + m_CullTransparentMesh: 1 +--- !u!1 &1708467051 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1708467052} + - component: {fileID: 1708467055} + - component: {fileID: 1708467054} + - component: {fileID: 1708467053} + m_Layer: 5 + m_Name: BuyButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1708467052 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1708467051} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 397313191} + m_Father: {fileID: 76796530} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0} + m_AnchorMax: {x: 0.5, y: 0} + m_AnchoredPosition: {x: 0, y: -33.549103} + m_SizeDelta: {x: 184.7591, y: 86.943} + m_Pivot: {x: 0.5, y: 0} +--- !u!114 &1708467053 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1708467051} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1708467054} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &1708467054 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1708467051} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: -636975818, guid: c6ad05d85b74fc540b9566c9f27609f8, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1708467055 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1708467051} + m_CullTransparentMesh: 1 +--- !u!1 &1719028163 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1719028164} + - component: {fileID: 1719028166} + - component: {fileID: 1719028165} + m_Layer: 5 + m_Name: EnergyIcon + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1719028164 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1719028163} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.70000005, y: 0.70000005, z: 0.70000005} + m_ConstrainProportionsScale: 1 + m_Children: [] + m_Father: {fileID: 1843431698} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: -14.2, y: -5.8} + m_SizeDelta: {x: 101, y: 120} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &1719028165 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1719028163} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: -913397601, guid: 667ad1e31f7749b4ab8e2a0290ef71a7, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1719028166 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1719028163} + m_CullTransparentMesh: 1 +--- !u!1 &1727447449 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1727447450} + - component: {fileID: 1727447452} + - component: {fileID: 1727447451} + m_Layer: 5 + m_Name: VolumeIcon + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1727447450 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1727447449} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 1 + m_Children: [] + m_Father: {fileID: 1052043021} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: 47.330414, y: -4.7713} + m_SizeDelta: {x: 196.9117, y: 197.6809} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &1727447451 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1727447449} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: -772468077, guid: 1a63ea6d0777fc44b9edb3a4a9dee39b, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1727447452 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1727447449} + m_CullTransparentMesh: 1 +--- !u!1 &1727736100 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1727736101} + - component: {fileID: 1727736104} + - component: {fileID: 1727736103} + - component: {fileID: 1727736102} + m_Layer: 5 + m_Name: CheckBoxButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1727736101 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1727736100} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1020845099} + m_Father: {fileID: 1653671848} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0} + m_AnchorMax: {x: 0.5, y: 0} + m_AnchoredPosition: {x: -272, y: 117.38} + m_SizeDelta: {x: 90.723, y: 90.7214} + m_Pivot: {x: 0.5, y: 0} +--- !u!114 &1727736102 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1727736100} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1727736103} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &1727736103 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1727736100} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 73206232, guid: 1a63ea6d0777fc44b9edb3a4a9dee39b, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1727736104 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1727736100} + m_CullTransparentMesh: 1 +--- !u!1 &1790501017 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1790501018} + - component: {fileID: 1790501020} + - component: {fileID: 1790501019} + m_Layer: 5 + m_Name: BadgeYellow + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1790501018 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1790501017} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 2114865119} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 410.27} + m_SizeDelta: {x: 291, y: 374} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1790501019 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1790501017} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 1616187056, guid: 40b5595732a0e224680c1f680953d775, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1790501020 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1790501017} + m_CullTransparentMesh: 1 +--- !u!1 &1843431697 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1843431698} + m_Layer: 5 + m_Name: Energy + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1843431698 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1843431697} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 544798142} + - {fileID: 1719028164} + m_Father: {fileID: 1295747849} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 57.399902, y: -134.6001} + m_SizeDelta: {x: 520, y: 100} + m_Pivot: {x: 0, y: 1} +--- !u!1 &1844700869 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1844700870} + - component: {fileID: 1844700872} + - component: {fileID: 1844700871} + m_Layer: 5 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &1844700870 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1844700869} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1109681751} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 60.991318, y: 2.0792847} + m_SizeDelta: {x: -335.4525, y: -223.1731} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1844700871 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1844700869} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: PLAY + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 108.3 + m_fontSizeBase: 24 + m_fontWeight: 400 + m_enableAutoSizing: 1 + m_fontSizeMin: 18 + m_fontSizeMax: 108.3 + m_fontStyle: 1 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &1844700872 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1844700869} + m_CullTransparentMesh: 1 +--- !u!1 &1846836818 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1846836819} + m_Layer: 5 + m_Name: Fill Area + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1846836819 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1846836818} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1153888469} + m_Father: {fileID: 365282214} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.25} + m_AnchorMax: {x: 1, y: 0.75} + m_AnchoredPosition: {x: -5, y: 0} + m_SizeDelta: {x: -20, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &1852085630 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1852085631} + m_Layer: 5 + m_Name: Shop + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &1852085631 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1852085630} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 282693411} + - {fileID: 1674621263} + m_Father: {fileID: 624775560} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &1896578656 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1896578657} + m_Layer: 5 + m_Name: Music + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1896578657 +RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 559579066} - serializedVersion: 2 - m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} - m_LocalPosition: {x: 0, y: 3, z: 0} + m_GameObject: {fileID: 1896578656} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 0} - m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} ---- !u!1 &624775556 + m_Children: + - {fileID: 40575406} + - {fileID: 1376502211} + m_Father: {fileID: 1653671848} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: -52.73481} + m_SizeDelta: {x: 951, y: 173.5} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &1917365540 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -1220,105 +8276,120 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 624775560} - - component: {fileID: 624775559} - - component: {fileID: 624775558} - - component: {fileID: 624775557} + - component: {fileID: 1917365541} + - component: {fileID: 1917365544} + - component: {fileID: 1917365543} + - component: {fileID: 1917365542} m_Layer: 5 - m_Name: Canvas + m_Name: BuyButton m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!114 &624775557 -MonoBehaviour: +--- !u!224 &1917365541 +RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 624775556} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IgnoreReversedGraphics: 1 - m_BlockingObjects: 0 - m_BlockingMask: - serializedVersion: 2 - m_Bits: 4294967295 ---- !u!114 &624775558 + m_GameObject: {fileID: 1917365540} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1208146639} + m_Father: {fileID: 685256878} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0} + m_AnchorMax: {x: 0.5, y: 0} + m_AnchoredPosition: {x: 0, y: -33.549103} + m_SizeDelta: {x: 184.7591, y: 86.943} + m_Pivot: {x: 0.5, y: 0} +--- !u!114 &1917365542 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 624775556} + m_GameObject: {fileID: 1917365540} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} m_Name: m_EditorClassIdentifier: - m_UiScaleMode: 1 - m_ReferencePixelsPerUnit: 100 - m_ScaleFactor: 1 - m_ReferenceResolution: {x: 1080, y: 1920} - m_ScreenMatchMode: 0 - m_MatchWidthOrHeight: 1 - m_PhysicalUnit: 3 - m_FallbackScreenDPI: 96 - m_DefaultSpriteDPI: 96 - m_DynamicPixelsPerUnit: 1 - m_PresetInfoIsWorld: 0 ---- !u!223 &624775559 -Canvas: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1917365543} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &1917365543 +MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 624775556} + m_GameObject: {fileID: 1917365540} m_Enabled: 1 - serializedVersion: 3 - m_RenderMode: 0 - m_Camera: {fileID: 0} - m_PlaneDistance: 100 - m_PixelPerfect: 0 - m_ReceivesEvents: 1 - m_OverrideSorting: 0 - m_OverridePixelPerfect: 0 - m_SortingBucketNormalizedSize: 0 - m_VertexColorAlwaysGammaSpace: 0 - m_AdditionalShaderChannelsFlag: 25 - m_UpdateRectTransformForStandalone: 0 - m_SortingLayerID: 0 - m_SortingOrder: 0 - m_TargetDisplay: 0 ---- !u!224 &624775560 -RectTransform: + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: -636975818, guid: c6ad05d85b74fc540b9566c9f27609f8, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1917365544 +CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 624775556} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0, y: 0, z: 0} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 537811942} - - {fileID: 120710490} - - {fileID: 1295747849} - - {fileID: 1852085631} - - {fileID: 805359303} - m_Father: {fileID: 0} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0, y: 0} ---- !u!1 &647566281 + m_GameObject: {fileID: 1917365540} + m_CullTransparentMesh: 1 +--- !u!1 &1937551981 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -1326,44 +8397,42 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 647566282} - - component: {fileID: 647566284} - - component: {fileID: 647566283} + - component: {fileID: 1937551982} + - component: {fileID: 1937551984} + - component: {fileID: 1937551983} m_Layer: 5 - m_Name: RedBanner + m_Name: WhiteItem m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &647566282 +--- !u!224 &1937551982 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 647566281} + m_GameObject: {fileID: 1937551981} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 716151036} - - {fileID: 656091917} - m_Father: {fileID: 282693411} + m_Children: [] + m_Father: {fileID: 2114865119} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.5, y: 1} - m_AnchorMax: {x: 0.5, y: 1} - m_AnchoredPosition: {x: 0, y: 113.1} - m_SizeDelta: {x: 719.8101, y: 222.6837} - m_Pivot: {x: 0.5, y: 1} ---- !u!114 &647566283 + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 77.3} + m_SizeDelta: {x: 794, y: 126} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1937551983 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 647566281} + m_GameObject: {fileID: 1937551981} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} @@ -1377,7 +8446,7 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Sprite: {fileID: -2080922092, guid: c6ad05d85b74fc540b9566c9f27609f8, type: 3} + m_Sprite: {fileID: 1931590350, guid: 40b5595732a0e224680c1f680953d775, type: 3} m_Type: 0 m_PreserveAspect: 0 m_FillCenter: 1 @@ -1387,15 +8456,92 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &647566284 +--- !u!222 &1937551984 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 647566281} + m_GameObject: {fileID: 1937551981} m_CullTransparentMesh: 1 ---- !u!1 &656091916 +--- !u!1 &1967508763 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1967508764} + m_Layer: 5 + m_Name: Cash + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1967508764 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1967508763} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 483958582} + - {fileID: 1102335811} + - {fileID: 1688123567} + - {fileID: 794466104} + m_Father: {fileID: 1295747849} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: -1.8999023, y: -37.5} + m_SizeDelta: {x: 472.1017, y: 100} + m_Pivot: {x: 0, y: 1} +--- !u!1 &2114865118 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2114865119} + m_Layer: 5 + m_Name: LeaderBoard + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &2114865119 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2114865118} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1568707453} + - {fileID: 1790501018} + - {fileID: 1937551982} + m_Father: {fileID: 624775560} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &2129530802 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -1403,133 +8549,65 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 656091917} - - component: {fileID: 656091919} - - component: {fileID: 656091918} + - component: {fileID: 2129530803} + - component: {fileID: 2129530804} m_Layer: 5 - m_Name: ShopText + m_Name: CoinLayout m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &656091917 +--- !u!224 &2129530803 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 656091916} + m_GameObject: {fileID: 2129530802} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 647566282} + m_Children: + - {fileID: 1630643143} + - {fileID: 140418461} + - {fileID: 1211240241} + - {fileID: 517469375} + - {fileID: 1569081698} + - {fileID: 1502680483} + m_Father: {fileID: 282693411} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.5, y: 0} - m_AnchorMax: {x: 0.5, y: 1} - m_AnchoredPosition: {x: 37, y: 31} - m_SizeDelta: {x: 228.2, y: -94.5646} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: -21} + m_SizeDelta: {x: 790, y: 611} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &656091918 +--- !u!114 &2129530804 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 656091916} + m_GameObject: {fileID: 2129530802} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Script: {fileID: 11500000, guid: 8a8695521f0d02e499659fee002a26c2, type: 3} m_Name: m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_text: SHOP - m_isRightToLeft: 0 - m_fontAsset: {fileID: 11400000, guid: 5da2ee26a9d0b024dafba9acbda5519e, type: 2} - m_sharedMaterial: {fileID: 7937037986802887748, guid: 5da2ee26a9d0b024dafba9acbda5519e, type: 2} - m_fontSharedMaterials: [] - m_fontMaterial: {fileID: 0} - m_fontMaterials: [] - m_fontColor32: - serializedVersion: 2 - rgba: 4294967295 - m_fontColor: {r: 1, g: 1, b: 1, a: 1} - m_enableVertexGradient: 0 - m_colorMode: 3 - m_fontColorGradient: - topLeft: {r: 1, g: 1, b: 1, a: 1} - topRight: {r: 1, g: 1, b: 1, a: 1} - bottomLeft: {r: 1, g: 1, b: 1, a: 1} - bottomRight: {r: 1, g: 1, b: 1, a: 1} - m_fontColorGradientPreset: {fileID: 0} - m_spriteAsset: {fileID: 0} - m_tintAllSprites: 0 - m_StyleSheet: {fileID: 0} - m_TextStyleHashCode: -1183493901 - m_overrideHtmlColors: 0 - m_faceColor: - serializedVersion: 2 - rgba: 4294967295 - m_fontSize: 72 - m_fontSizeBase: 36 - m_fontWeight: 400 - m_enableAutoSizing: 1 - m_fontSizeMin: 18 - m_fontSizeMax: 72 - m_fontStyle: 0 - m_HorizontalAlignment: 2 - m_VerticalAlignment: 512 - m_textAlignment: 65535 - m_characterSpacing: 0 - m_wordSpacing: 0 - m_lineSpacing: 0 - m_lineSpacingMax: 0 - m_paragraphSpacing: 0 - m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 - m_wordWrappingRatios: 0.4 - m_overflowMode: 0 - m_linkedTextComponent: {fileID: 0} - parentLinkedComponent: {fileID: 0} - m_enableKerning: 1 - m_enableExtraPadding: 0 - checkPaddingRequired: 0 - m_isRichText: 1 - m_parseCtrlCharacters: 1 - m_isOrthographic: 1 - m_isCullingEnabled: 0 - m_horizontalMapping: 0 - m_verticalMapping: 0 - m_uvLineOffset: 0 - m_geometrySortingOrder: 0 - m_IsTextObjectScaleStatic: 0 - m_VertexBufferAutoSizeReduction: 0 - m_useMaxVisibleDescender: 1 - m_pageToDisplay: 1 - m_margin: {x: 0, y: 0, z: 0, w: 0} - m_isUsingLegacyAnimationComponent: 0 - m_isVolumetricText: 0 - m_hasFontAssetChanged: 0 - m_baseMaterial: {fileID: 0} - m_maskOffset: {x: 0, y: 0, z: 0, w: 0} ---- !u!222 &656091919 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 656091916} - m_CullTransparentMesh: 1 ---- !u!1 &702120855 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 0 + m_StartCorner: 0 + m_StartAxis: 0 + m_CellSize: {x: 251, y: 285} + m_Spacing: {x: 18, y: 43} + m_Constraint: 0 + m_ConstraintCount: 2 +--- !u!1 &2137987662 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -1537,42 +8615,42 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 702120856} - - component: {fileID: 702120858} - - component: {fileID: 702120857} + - component: {fileID: 2137987663} + - component: {fileID: 2137987665} + - component: {fileID: 2137987664} m_Layer: 5 - m_Name: SettingText + m_Name: BuyPrice m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &702120856 +--- !u!224 &2137987663 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 702120855} + m_GameObject: {fileID: 2137987662} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] - m_Father: {fileID: 315029015} + m_Father: {fileID: 1011777847} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.5, y: 0.5} - m_AnchorMax: {x: 0.5, y: 0.5} - m_AnchoredPosition: {x: 20.308012, y: 22.986588} - m_SizeDelta: {x: 294.4129, y: 107.7269} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 2.2533} + m_SizeDelta: {x: -76.615, y: -36.0531} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &702120857 +--- !u!114 &2137987664 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 702120855} + m_GameObject: {fileID: 2137987662} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} @@ -1586,10 +8664,10 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_text: Settings + m_text: 7.99$ m_isRightToLeft: 0 - m_fontAsset: {fileID: 11400000, guid: 5da2ee26a9d0b024dafba9acbda5519e, type: 2} - m_sharedMaterial: {fileID: 7937037986802887748, guid: 5da2ee26a9d0b024dafba9acbda5519e, type: 2} + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} m_fontSharedMaterials: [] m_fontMaterial: {fileID: 0} m_fontMaterials: [] @@ -1613,13 +8691,13 @@ MonoBehaviour: m_faceColor: serializedVersion: 2 rgba: 4294967295 - m_fontSize: 72 - m_fontSizeBase: 36 + m_fontSize: 38.7 + m_fontSizeBase: 24 m_fontWeight: 400 m_enableAutoSizing: 1 m_fontSizeMin: 18 m_fontSizeMax: 72 - m_fontStyle: 0 + m_fontStyle: 1 m_HorizontalAlignment: 2 m_VerticalAlignment: 512 m_textAlignment: 65535 @@ -1637,165 +8715,53 @@ MonoBehaviour: m_enableKerning: 1 m_enableExtraPadding: 0 checkPaddingRequired: 0 - m_isRichText: 1 - m_parseCtrlCharacters: 1 - m_isOrthographic: 1 - m_isCullingEnabled: 0 - m_horizontalMapping: 0 - m_verticalMapping: 0 - m_uvLineOffset: 0 - m_geometrySortingOrder: 0 - m_IsTextObjectScaleStatic: 0 - m_VertexBufferAutoSizeReduction: 0 - m_useMaxVisibleDescender: 1 - m_pageToDisplay: 1 - m_margin: {x: 0, y: 0, z: 0, w: 0} - m_isUsingLegacyAnimationComponent: 0 - m_isVolumetricText: 0 - m_hasFontAssetChanged: 0 - m_baseMaterial: {fileID: 0} - m_maskOffset: {x: 0, y: 0, z: 0, w: 0} ---- !u!222 &702120858 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 702120855} - m_CullTransparentMesh: 1 ---- !u!1 &716151035 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 716151036} - - component: {fileID: 716151038} - - component: {fileID: 716151037} - m_Layer: 5 - m_Name: Cart - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &716151036 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 716151035} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 647566282} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0.5} - m_AnchorMax: {x: 0, y: 0.5} - m_AnchoredPosition: {x: 143, y: 35.465378} - m_SizeDelta: {x: 106.3706, y: 81.6774} - m_Pivot: {x: 0, y: 0.5} ---- !u!114 &716151037 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 716151035} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Sprite: {fileID: 430588942, guid: c6ad05d85b74fc540b9566c9f27609f8, type: 3} - m_Type: 0 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!222 &716151038 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 716151035} - m_CullTransparentMesh: 1 ---- !u!1 &794466103 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 794466104} - - component: {fileID: 794466106} - - component: {fileID: 794466105} - m_Layer: 5 - m_Name: Coin - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &794466104 -RectTransform: + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &2137987665 +CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 794466103} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0.56677, y: 0.56677, z: 0.56677} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 1967508764} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0.5} - m_AnchorMax: {x: 0, y: 0.5} - m_AnchoredPosition: {x: 60.5, y: 0} - m_SizeDelta: {x: 162, y: 162} - m_Pivot: {x: 0, y: 0.5} ---- !u!114 &794466105 + m_GameObject: {fileID: 2137987662} + m_CullTransparentMesh: 1 +--- !u!114 &86669823378570626 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 794466103} + m_GameObject: {fileID: 6329351691133065142} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} + m_Color: {r: 1, g: 1, b: 1, a: 0.44705883} m_RaycastTarget: 1 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Sprite: {fileID: -1468440732, guid: 667ad1e31f7749b4ab8e2a0290ef71a7, type: 3} + m_Sprite: {fileID: 21300000, guid: ff7a408f0a445984f8901ce781a8d735, type: 3} m_Type: 0 m_PreserveAspect: 0 m_FillCenter: 1 @@ -1805,72 +8771,35 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &794466106 +--- !u!222 &131018002305641368 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 794466103} + m_GameObject: {fileID: 7504354048190083025} m_CullTransparentMesh: 1 ---- !u!1 &805359302 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 805359303} - - component: {fileID: 805359305} - - component: {fileID: 805359304} - m_Layer: 5 - m_Name: Mockup - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &805359303 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 805359302} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 624775560} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.5, y: 0.5} - m_AnchorMax: {x: 0.5, y: 0.5} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 956.2563, y: 1894} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &805359304 +--- !u!114 &260420655146032396 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 805359302} + m_GameObject: {fileID: 798348268578372097} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 0.5019608} + m_Color: {r: 1, g: 1, b: 1, a: 1} m_RaycastTarget: 1 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Sprite: {fileID: 21300000, guid: c8a48c844a4a04b43a5c26632f5b9268, type: 3} + m_Sprite: {fileID: 662419875, guid: 40b5595732a0e224680c1f680953d775, type: 3} m_Type: 0 m_PreserveAspect: 0 m_FillCenter: 1 @@ -1880,58 +8809,191 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &805359305 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 805359302} - m_CullTransparentMesh: 1 ---- !u!1 &825963820 -GameObject: +--- !u!114 &315217695334726574 +MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 825963821} - - component: {fileID: 825963823} - - component: {fileID: 825963822} - m_Layer: 5 - m_Name: BarFill - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &825963821 -RectTransform: + m_GameObject: {fileID: 4637163662770834346} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: 12334 + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 27.2 + m_fontSizeBase: 36 + m_fontWeight: 400 + m_enableAutoSizing: 1 + m_fontSizeMin: 14.5 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!114 &436060365470654632 +MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 825963820} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 544798142} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: -1.0499725, y: -1.3999996} - m_SizeDelta: {x: -2.1000583, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &825963822 + m_GameObject: {fileID: 9197767621754864405} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: 12334 + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 27.2 + m_fontSizeBase: 36 + m_fontWeight: 400 + m_enableAutoSizing: 1 + m_fontSizeMin: 14.5 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!114 &463992417916777483 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 825963820} + m_GameObject: {fileID: 1146114320936056661} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} @@ -1945,25 +9007,46 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Sprite: {fileID: -1134826220, guid: 667ad1e31f7749b4ab8e2a0290ef71a7, type: 3} - m_Type: 3 + m_Sprite: {fileID: 1981311008, guid: 40b5595732a0e224680c1f680953d775, type: 3} + m_Type: 0 m_PreserveAspect: 0 m_FillCenter: 1 - m_FillMethod: 0 + m_FillMethod: 4 m_FillAmount: 1 m_FillClockwise: 1 m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &825963823 +--- !u!222 &503623586353167092 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 825963820} + m_GameObject: {fileID: 8950198485781367200} m_CullTransparentMesh: 1 ---- !u!1 &877599030 +--- !u!224 &528626935175085956 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 997826619586568907} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1145879705990377755} + - {fileID: 8120531799563461673} + m_Father: {fileID: 3188961330051606762} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0.000044823, y: -190.29999} + m_SizeDelta: {x: 1080, y: 1491.5898} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &557147155529408582 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -1971,67 +9054,25 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 877599033} - - component: {fileID: 877599032} - - component: {fileID: 877599031} - m_Layer: 0 - m_Name: EventSystem + - component: {fileID: 8419866729458327092} + - component: {fileID: 1181891631303899086} + - component: {fileID: 6083117394399969524} + m_Layer: 5 + m_Name: Image m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!114 &877599031 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 877599030} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3} - m_Name: - m_EditorClassIdentifier: - m_SendPointerHoverToParent: 1 - m_HorizontalAxis: Horizontal - m_VerticalAxis: Vertical - m_SubmitButton: Submit - m_CancelButton: Cancel - m_InputActionsPerSecond: 10 - m_RepeatDelay: 0.5 - m_ForceModuleActive: 0 ---- !u!114 &877599032 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 877599030} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3} - m_Name: - m_EditorClassIdentifier: - m_FirstSelected: {fileID: 0} - m_sendNavigationEvents: 1 - m_DragThreshold: 10 ---- !u!4 &877599033 -Transform: +--- !u!222 &591885643858129198 +CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 877599030} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 0} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &901140415 + m_GameObject: {fileID: 1146114320936056661} + m_CullTransparentMesh: 1 +--- !u!1 &637605457992042315 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -2039,42 +9080,42 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 901140416} - - component: {fileID: 901140418} - - component: {fileID: 901140417} + - component: {fileID: 5349940132968692874} + - component: {fileID: 4581989795419718254} + - component: {fileID: 2443837337558876478} + - component: {fileID: 1406664459727492874} m_Layer: 5 - m_Name: Text (TMP) + m_Name: Scrollbar Vertical m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &901140416 -RectTransform: +--- !u!1 &680034625499312354 +GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 901140415} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 23012388} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &901140417 + serializedVersion: 6 + m_Component: + - component: {fileID: 1747626110193711133} + - component: {fileID: 4107686922165955877} + - component: {fileID: 5733033281134111201} + m_Layer: 5 + m_Name: Content + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &746451838940782253 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 901140415} + m_GameObject: {fileID: 2470003456031229316} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} @@ -2088,7 +9129,7 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_text: Save + m_text: LeaderBoard m_isRightToLeft: 0 m_fontAsset: {fileID: 11400000, guid: 5da2ee26a9d0b024dafba9acbda5519e, type: 2} m_sharedMaterial: {fileID: 7937037986802887748, guid: 5da2ee26a9d0b024dafba9acbda5519e, type: 2} @@ -2115,14 +9156,14 @@ MonoBehaviour: m_faceColor: serializedVersion: 2 rgba: 4294967295 - m_fontSize: 72 - m_fontSizeBase: 24 + m_fontSize: 80.2 + m_fontSizeBase: 65 m_fontWeight: 400 m_enableAutoSizing: 1 m_fontSizeMin: 18 - m_fontSizeMax: 72 + m_fontSizeMax: 108.3 m_fontStyle: 0 - m_HorizontalAlignment: 2 + m_HorizontalAlignment: 1 m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 @@ -2157,15 +9198,189 @@ MonoBehaviour: m_hasFontAssetChanged: 0 m_baseMaterial: {fileID: 0} m_maskOffset: {x: 0, y: 0, z: 0, w: 0} ---- !u!222 &901140418 +--- !u!1 &798348268578372097 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5791384924259239046} + - component: {fileID: 7798862641103379981} + - component: {fileID: 260420655146032396} + m_Layer: 5 + m_Name: Title + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!222 &874380761738790931 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3384776166402557714} + m_CullTransparentMesh: 1 +--- !u!1 &997826619586568907 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 528626935175085956} + m_Layer: 5 + m_Name: Bottom + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &1071540397392566083 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1145879705990377755} + m_Layer: 5 + m_Name: Pedestals + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &1097430707938715602 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5610676131985386183} + - component: {fileID: 2924084756772901270} + - component: {fileID: 8431159124448418817} + - component: {fileID: 7999982976484535055} + m_Layer: 5 + m_Name: Viewport + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1145879705990377755 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1071540397392566083} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 3872224433570044647} + - {fileID: 6149721200587309550} + - {fileID: 8946041516820998889} + m_Father: {fileID: 528626935175085956} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 1} + m_AnchorMax: {x: 0.5, y: 1} + m_AnchoredPosition: {x: -0.000030518, y: -211.26001} + m_SizeDelta: {x: 1080, y: 422.51} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &1146114320936056661 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1721820769082356339} + - component: {fileID: 591885643858129198} + - component: {fileID: 463992417916777483} + m_Layer: 5 + m_Name: Image + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!222 &1181891631303899086 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 557147155529408582} + m_CullTransparentMesh: 1 +--- !u!114 &1406664459727492874 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 637605457992042315} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2a4db7a114972834c8e4117be1d82ba3, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 6895122971663629854} + m_HandleRect: {fileID: 7590745602688418613} + m_Direction: 2 + m_Value: 0 + m_Size: 1 + m_NumberOfSteps: 0 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!222 &1432212496330545962 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 901140415} + m_GameObject: {fileID: 5719200284800581842} m_CullTransparentMesh: 1 ---- !u!1 &1020845098 +--- !u!1 &1442121233320013631 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -2173,42 +9388,148 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1020845099} - - component: {fileID: 1020845101} - - component: {fileID: 1020845100} + - component: {fileID: 6149721200587309550} + - component: {fileID: 3917684456391163803} + - component: {fileID: 6698527437318130830} + - component: {fileID: 5995147594332303578} m_Layer: 5 - m_Name: Tick + m_Name: 2nd m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &1020845099 +--- !u!222 &1494487355296019803 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2470003456031229316} + m_CullTransparentMesh: 1 +--- !u!1 &1604885170654416396 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6405750163862218890} + - component: {fileID: 5939701950637671906} + - component: {fileID: 7229894358202064413} + m_Layer: 5 + m_Name: AvatarPicture + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1610181445485560085 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1020845098} + m_GameObject: {fileID: 2622107514652308689} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] - m_Father: {fileID: 1727736101} + m_Father: {fileID: 8301229671545223574} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} - m_AnchoredPosition: {x: 9.1672, y: 6.134796} - m_SizeDelta: {x: 72.389, y: 66.6739} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 100, y: 100} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1020845100 +--- !u!1 &1628212735781591258 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7908368764916350329} + - component: {fileID: 5625572056408286163} + - component: {fileID: 7570351248279651149} + - component: {fileID: 6438779806906087076} + m_Layer: 5 + m_Name: Scroll View + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1721820769082356339 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1146114320936056661} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 6405750163862218890} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 1, y: -6.6} + m_SizeDelta: {x: 120, y: 120} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &1747626110193711133 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 680034625499312354} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 5610676131985386183} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 1} +--- !u!1 &1748742745168518370 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3188961330051606762} + - component: {fileID: 8933557623444557051} + - component: {fileID: 7481815995319858448} + - component: {fileID: 2280375978144475388} + - component: {fileID: 6330872947842685056} + - component: {fileID: 3467639516214727882} + - component: {fileID: 6418597961389360341} + m_Layer: 5 + m_Name: LeaderboardsPopup + m_TagString: + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1872020314069923374 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1020845098} + m_GameObject: {fileID: 8793223514687652065} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} @@ -2222,7 +9543,7 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Sprite: {fileID: -1130963600, guid: 1a63ea6d0777fc44b9edb3a4a9dee39b, type: 3} + m_Sprite: {fileID: -1607866603, guid: 40b5595732a0e224680c1f680953d775, type: 3} m_Type: 0 m_PreserveAspect: 0 m_FillCenter: 1 @@ -2232,59 +9553,131 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &1020845101 -CanvasRenderer: +--- !u!114 &1971496900547256871 +MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1020845098} - m_CullTransparentMesh: 1 ---- !u!1 &1045624782 -GameObject: + m_GameObject: {fileID: 3694136963135273964} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: d1a254d145eb8a14ca793fd3035c8b0c, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!224 &2000930026608204176 +RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1045624783} - - component: {fileID: 1045624785} - - component: {fileID: 1045624784} - m_Layer: 5 - m_Name: SettingIcon - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1045624783 + m_GameObject: {fileID: 3694136963135273964} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 8920417142473391069} + m_Father: {fileID: 3872224433570044647} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0} + m_AnchorMax: {x: 0.5, y: 0} + m_AnchoredPosition: {x: 4, y: 154.9} + m_SizeDelta: {x: 141, y: 32} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &2127333613745618497 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8950198485781367200} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe7a6c08caa987c438eef91a7a0fc0d3, type: 3} + m_Name: + m_EditorClassIdentifier: + pedestalNumber: 3 + scoreText: {fileID: 4404033343624500367} + profilePic: {fileID: 1872020314069923374} + nameText: {fileID: 9071939939645621796} +--- !u!114 &2280375978144475388 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1748742745168518370} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: df3ac59bdfef626ba9cf312eb790f208, type: 3} + m_Name: + m_EditorClassIdentifier: + animator: {fileID: 3467639516214727882} + openClip: {fileID: 7400000, guid: 9d7af72f6b764e78a819c8a855ccf8d4, type: 2} + closeClip: {fileID: 7400000, guid: 772dcd83a8024cf287b4687b015f93ce, type: 2} + isOpen: 0 + closeOnEsc: 0 + onClose: + m_PersistentCalls: + m_Calls: [] + onOpen: + m_PersistentCalls: + m_Calls: [] + ChooseModePanel: {fileID: 0} +--- !u!222 &2309847881077098563 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4279917104551126868} + m_CullTransparentMesh: 1 +--- !u!224 &2391405159297781086 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1045624782} + m_GameObject: {fileID: 6329351691133065142} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0.52677673, y: 0.52677673, z: 0.52677673} + m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] - m_Father: {fileID: 315029015} + m_Father: {fileID: 3188961330051606762} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0.5} - m_AnchorMax: {x: 0, y: 0.5} - m_AnchoredPosition: {x: 125.11, y: 23.3} - m_SizeDelta: {x: 199.9642, y: 192.9725} - m_Pivot: {x: 0, y: 0.5} ---- !u!114 &1045624784 + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 1081, y: 1920} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &2443837337558876478 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1045624782} - m_Enabled: 1 + m_GameObject: {fileID: 637605457992042315} + m_Enabled: 0 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} m_Name: @@ -2297,8 +9690,8 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Sprite: {fileID: -637297471, guid: 1a63ea6d0777fc44b9edb3a4a9dee39b, type: 3} - m_Type: 0 + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 m_PreserveAspect: 0 m_FillCenter: 1 m_FillMethod: 4 @@ -2307,15 +9700,7 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &1045624785 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1045624782} - m_CullTransparentMesh: 1 ---- !u!1 &1052043020 +--- !u!1 &2470003456031229316 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -2323,36 +9708,33 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1052043021} + - component: {fileID: 4735665654017139821} + - component: {fileID: 1494487355296019803} + - component: {fileID: 746451838940782253} m_Layer: 5 - m_Name: SoundVolume + m_Name: Text (TMP) m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &1052043021 -RectTransform: +--- !u!114 &2568540576067986084 +MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1052043020} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 1727447450} - - {fileID: 365282214} - m_Father: {fileID: 1653671848} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.5, y: 0.5} - m_AnchorMax: {x: 0.5, y: 0.5} - m_AnchoredPosition: {x: 0, y: 147} - m_SizeDelta: {x: 951, y: 173.5} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!1 &1102335810 + m_GameObject: {fileID: 5920942482959527649} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe7a6c08caa987c438eef91a7a0fc0d3, type: 3} + m_Name: + m_EditorClassIdentifier: + pedestalNumber: 1 + scoreText: {fileID: 315217695334726574} + profilePic: {fileID: 6083117394399969524} + nameText: {fileID: 6749075303465759337} +--- !u!1 &2579048446944810908 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -2360,42 +9742,39 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1102335811} - - component: {fileID: 1102335813} - - component: {fileID: 1102335812} + - component: {fileID: 8120531799563461673} m_Layer: 5 - m_Name: CashText + m_Name: Leaderboard m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1102335811 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1102335810} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 1967508764} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.5, y: 0.5} - m_AnchorMax: {x: 0.5, y: 0.5} - m_AnchoredPosition: {x: 64.5, y: 0} - m_SizeDelta: {x: 244.7501, y: 50} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1102335812 + m_IsActive: 1 +--- !u!1 &2622107514652308689 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1610181445485560085} + - component: {fileID: 4028466762835096197} + - component: {fileID: 6034158462949042132} + m_Layer: 5 + m_Name: Image + m_TagString: + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &2846011981180441491 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1102335810} + m_GameObject: {fileID: 4279917104551126868} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} @@ -2409,17 +9788,17 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_text: 999999 + m_text: Royl m_isRightToLeft: 0 - m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} - m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontAsset: {fileID: 11400000, guid: 5da2ee26a9d0b024dafba9acbda5519e, type: 2} + m_sharedMaterial: {fileID: 7937037986802887748, guid: 5da2ee26a9d0b024dafba9acbda5519e, type: 2} m_fontSharedMaterials: [] m_fontMaterial: {fileID: 0} m_fontMaterials: [] m_fontColor32: serializedVersion: 2 - rgba: 4278190080 - m_fontColor: {r: 0, g: 0, b: 0, a: 1} + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} m_enableVertexGradient: 0 m_colorMode: 3 m_fontColorGradient: @@ -2436,8 +9815,8 @@ MonoBehaviour: m_faceColor: serializedVersion: 2 rgba: 4294967295 - m_fontSize: 44.75 - m_fontSizeBase: 36 + m_fontSize: 38.15 + m_fontSizeBase: 20.2 m_fontWeight: 400 m_enableAutoSizing: 1 m_fontSizeMin: 18 @@ -2454,7 +9833,7 @@ MonoBehaviour: m_charWidthMaxAdj: 0 m_enableWordWrapping: 1 m_wordWrappingRatios: 0.4 - m_overflowMode: 0 + m_overflowMode: 1 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 @@ -2478,60 +9857,71 @@ MonoBehaviour: m_hasFontAssetChanged: 0 m_baseMaterial: {fileID: 0} m_maskOffset: {x: 0, y: 0, z: 0, w: 0} ---- !u!222 &1102335813 +--- !u!222 &2924084756772901270 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1102335810} + m_GameObject: {fileID: 1097430707938715602} m_CullTransparentMesh: 1 ---- !u!1 &1109681750 -GameObject: +--- !u!222 &3089592200160199827 +CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1109681751} - - component: {fileID: 1109681754} - - component: {fileID: 1109681753} - - component: {fileID: 1109681752} - m_Layer: 5 - m_Name: PlayButton - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1109681751 + m_GameObject: {fileID: 3768516472094189317} + m_CullTransparentMesh: 1 +--- !u!224 &3188961330051606762 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1109681750} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_GameObject: {fileID: 1748742745168518370} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: - - {fileID: 1844700870} - m_Father: {fileID: 1295747849} + - {fileID: 7795106251941810256} + - {fileID: 5791384924259239046} + - {fileID: 528626935175085956} + - {fileID: 8301229671545223574} + - {fileID: 2391405159297781086} + m_Father: {fileID: 624775560} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.5, y: 0} - m_AnchorMax: {x: 0.5, y: 0} - m_AnchoredPosition: {x: 0, y: 168} - m_SizeDelta: {x: 665.0861, y: 312.6064} - m_Pivot: {x: 0.5, y: 0} ---- !u!114 &1109681752 + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &3290230295543346823 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7795106251941810256} + - component: {fileID: 5526517941096837039} + - component: {fileID: 3754722601061921717} + m_Layer: 5 + m_Name: Top + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!114 &3361381837364374251 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1109681750} + m_GameObject: {fileID: 8824953543665984307} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} @@ -2548,9 +9938,9 @@ MonoBehaviour: m_Colors: m_NormalColor: {r: 1, g: 1, b: 1, a: 1} m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_PressedColor: {r: 0.7843137, g: 0.7843137, b: 0.7843137, a: 1} m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_DisabledColor: {r: 0.7843137, g: 0.7843137, b: 0.7843137, a: 0.5019608} m_ColorMultiplier: 1 m_FadeDuration: 0.1 m_SpriteState: @@ -2562,88 +9952,62 @@ MonoBehaviour: m_NormalTrigger: Normal m_HighlightedTrigger: Highlighted m_PressedTrigger: Pressed - m_SelectedTrigger: Selected + m_SelectedTrigger: Highlighted m_DisabledTrigger: Disabled m_Interactable: 1 - m_TargetGraphic: {fileID: 1109681753} + m_TargetGraphic: {fileID: 4229214337198962808} m_OnClick: m_PersistentCalls: - m_Calls: [] ---- !u!114 &1109681753 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1109681750} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Sprite: {fileID: -1560240640, guid: 667ad1e31f7749b4ab8e2a0290ef71a7, type: 3} - m_Type: 0 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!222 &1109681754 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1109681750} - m_CullTransparentMesh: 1 ---- !u!1 &1119538048 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1119538049} - m_Layer: 5 - m_Name: Handle Slide Area - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1119538049 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1119538048} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 1258592538} - m_Father: {fileID: 365282214} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: -20, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!1 &1153888468 + m_Calls: + - m_Target: {fileID: 2280375978144475388} + m_TargetAssemblyTypeName: + m_MethodName: Close + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 + - m_Target: {fileID: 0} + m_TargetAssemblyTypeName: + m_MethodName: Play + m_Mode: 3 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 + - m_Target: {fileID: 0} + m_TargetAssemblyTypeName: + m_MethodName: PlayBackButton + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 + - m_Target: {fileID: 6418597961389360341} + m_TargetAssemblyTypeName: LeaderboardUIScreen, Assembly-CSharp + m_MethodName: OnClose + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!1 &3384776166402557714 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -2651,42 +10015,42 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1153888469} - - component: {fileID: 1153888471} - - component: {fileID: 1153888470} + - component: {fileID: 3401715980404993378} + - component: {fileID: 874380761738790931} + - component: {fileID: 6749075303465759337} m_Layer: 5 - m_Name: Fill + m_Name: NameText m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &1153888469 +--- !u!224 &3401715980404993378 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1153888468} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_GameObject: {fileID: 3384776166402557714} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] - m_Father: {fileID: 1846836819} + m_Father: {fileID: 3872224433570044647} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 10, y: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: -1.2281} + m_SizeDelta: {x: 221.375, y: 55.3438} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1153888470 +--- !u!114 &3416664224428966726 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1153888468} + m_GameObject: {fileID: 8337526333926663540} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} @@ -2700,68 +10064,70 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Sprite: {fileID: 2113023272, guid: 1a63ea6d0777fc44b9edb3a4a9dee39b, type: 3} - m_Type: 3 + m_Sprite: {fileID: 21300000, guid: d1a254d145eb8a14ca793fd3035c8b0c, type: 3} + m_Type: 0 m_PreserveAspect: 0 m_FillCenter: 1 - m_FillMethod: 0 - m_FillAmount: 0.177 + m_FillMethod: 4 + m_FillAmount: 1 m_FillClockwise: 1 m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &1153888471 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1153888468} - m_CullTransparentMesh: 1 ---- !u!1 &1258592537 -GameObject: +--- !u!95 &3467639516214727882 +Animator: + serializedVersion: 5 m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1258592538} - - component: {fileID: 1258592540} - - component: {fileID: 1258592539} - m_Layer: 5 - m_Name: Handle - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1258592538 -RectTransform: + m_GameObject: {fileID: 1748742745168518370} + m_Enabled: 1 + m_Avatar: {fileID: 0} + m_Controller: {fileID: 9100000, guid: 3daaf3704a3b4865b42d6050afc0a129, type: 2} + m_CullingMode: 0 + m_UpdateMode: 0 + m_ApplyRootMotion: 0 + m_LinearVelocityBlending: 0 + m_StabilizeFeet: 0 + m_WarningMessage: + m_HasTransformHierarchy: 1 + m_AllowConstantClipSamplingOptimization: 1 + m_KeepAnimatorStateOnDisable: 0 + m_WriteDefaultValuesOnDisable: 0 +--- !u!222 &3518025845360783247 +CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1258592537} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 1119538049} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.177, y: 0} - m_AnchorMax: {x: 0.177, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 85.2919, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1258592539 + m_GameObject: {fileID: 4637163662770834346} + m_CullTransparentMesh: 1 +--- !u!1 &3694136963135273964 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2000930026608204176} + - component: {fileID: 5147716085093562657} + - component: {fileID: 1971496900547256871} + m_Layer: 5 + m_Name: ScoreBG + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!114 &3754722601061921717 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1258592537} + m_GameObject: {fileID: 3290230295543346823} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} @@ -2775,7 +10141,7 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Sprite: {fileID: -1333466350, guid: 1a63ea6d0777fc44b9edb3a4a9dee39b, type: 3} + m_Sprite: {fileID: 21300000, guid: 95e4e9236a73b474bba55d4c96a69409, type: 3} m_Type: 0 m_PreserveAspect: 0 m_FillCenter: 1 @@ -2785,15 +10151,7 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &1258592540 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1258592537} - m_CullTransparentMesh: 1 ---- !u!1 &1295747848 +--- !u!1 &3768516472094189317 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -2801,39 +10159,68 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1295747849} + - component: {fileID: 5903304234731413043} + - component: {fileID: 3089592200160199827} + - component: {fileID: 8509113260832753955} m_Layer: 5 - m_Name: MainScreen + m_Name: Icon m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1295747849 + m_IsActive: 0 +--- !u!222 &3842016894974005871 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9197767621754864405} + m_CullTransparentMesh: 1 +--- !u!224 &3848434020715499350 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1295747848} + m_GameObject: {fileID: 7504354048190083025} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1.00032, y: 1.00032, z: 1.00032} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 8026882825163135342} + m_Father: {fileID: 6149721200587309550} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0} + m_AnchorMax: {x: 0.5, y: 0} + m_AnchoredPosition: {x: 4, y: 138.5} + m_SizeDelta: {x: 141, y: 32} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &3872224433570044647 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5920942482959527649} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: - - {fileID: 1604735174} - - {fileID: 307522013} - - {fileID: 1109681751} - - {fileID: 1967508764} - - {fileID: 1843431698} - m_Father: {fileID: 624775560} + - {fileID: 6173620580924332831} + - {fileID: 3401715980404993378} + - {fileID: 2000930026608204176} + - {fileID: 693894144} + m_Father: {fileID: 1145879705990377755} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 41.4771} + m_SizeDelta: {x: 325, y: 418} m_Pivot: {x: 0.5, y: 0.5} ---- !u!1 &1376502210 +--- !u!1 &3910370871158584232 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -2841,212 +10228,162 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1376502211} - - component: {fileID: 1376502214} - - component: {fileID: 1376502213} - - component: {fileID: 1376502212} + - component: {fileID: 3958252574042169815} m_Layer: 5 - m_Name: SwitchBG + m_Name: Sliding Area m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &1376502211 +--- !u!222 &3917684456391163803 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1442121233320013631} + m_CullTransparentMesh: 1 +--- !u!224 &3958252574042169815 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1376502210} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_GameObject: {fileID: 3910370871158584232} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: - - {fileID: 1581919511} - m_Father: {fileID: 1896578657} + - {fileID: 7590745602688418613} + m_Father: {fileID: 5349940132968692874} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 1, y: 0.5} - m_AnchorMax: {x: 1, y: 0.5} - m_AnchoredPosition: {x: -71, y: -4} - m_SizeDelta: {x: 266.3007, y: 113.8385} - m_Pivot: {x: 1, y: 0.5} ---- !u!114 &1376502212 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1376502210} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Navigation: - m_Mode: 3 - m_WrapAround: 0 - m_SelectOnUp: {fileID: 0} - m_SelectOnDown: {fileID: 0} - m_SelectOnLeft: {fileID: 0} - m_SelectOnRight: {fileID: 0} - m_Transition: 1 - m_Colors: - m_NormalColor: {r: 1, g: 1, b: 1, a: 1} - m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} - m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} - m_ColorMultiplier: 1 - m_FadeDuration: 0.1 - m_SpriteState: - m_HighlightedSprite: {fileID: 0} - m_PressedSprite: {fileID: 0} - m_SelectedSprite: {fileID: 0} - m_DisabledSprite: {fileID: 0} - m_AnimationTriggers: - m_NormalTrigger: Normal - m_HighlightedTrigger: Highlighted - m_PressedTrigger: Pressed - m_SelectedTrigger: Selected - m_DisabledTrigger: Disabled - m_Interactable: 1 - m_TargetGraphic: {fileID: 1376502213} - m_OnClick: - m_PersistentCalls: - m_Calls: [] ---- !u!114 &1376502213 -MonoBehaviour: + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -20, y: -20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &3986781068102481986 +CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1376502210} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Sprite: {fileID: 257160919, guid: 1a63ea6d0777fc44b9edb3a4a9dee39b, type: 3} - m_Type: 0 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!222 &1376502214 + m_GameObject: {fileID: 7228771785041086013} + m_CullTransparentMesh: 1 +--- !u!222 &4028466762835096197 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1376502210} - m_CullTransparentMesh: 1 ---- !u!1 &1443059154 -GameObject: + m_GameObject: {fileID: 2622107514652308689} + m_CullTransparentMesh: 0 +--- !u!224 &4056225210829074065 +RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1443059157} - - component: {fileID: 1443059156} - - component: {fileID: 1443059155} - m_Layer: 0 - m_Name: Main Camera - m_TagString: MainCamera - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!81 &1443059155 -AudioListener: + m_GameObject: {fileID: 8753920188017403380} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 1 + m_Children: + - {fileID: 8324889243000454218} + m_Father: {fileID: 8946041516820998889} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 1} + m_AnchorMax: {x: 0.5, y: 1} + m_AnchoredPosition: {x: -1, y: -113} + m_SizeDelta: {x: 120, y: 120} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &4096312046140920670 +CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1443059154} - m_Enabled: 1 ---- !u!20 &1443059156 -Camera: + m_GameObject: {fileID: 5530420962751641433} + m_CullTransparentMesh: 1 +--- !u!114 &4107686922165955877 +MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1443059154} + m_GameObject: {fileID: 680034625499312354} m_Enabled: 1 - serializedVersion: 2 - m_ClearFlags: 1 - m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} - m_projectionMatrixMode: 1 - m_GateFitMode: 2 - m_FOVAxisMode: 0 - m_Iso: 200 - m_ShutterSpeed: 0.005 - m_Aperture: 16 - m_FocusDistance: 10 - m_FocalLength: 50 - m_BladeCount: 5 - m_Curvature: {x: 2, y: 11} - m_BarrelClipping: 0.25 - m_Anamorphism: 0 - m_SensorSize: {x: 36, y: 24} - m_LensShift: {x: 0, y: 0} - m_NormalizedViewPortRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 - near clip plane: 0.3 - far clip plane: 1000 - field of view: 60 - orthographic: 0 - orthographic size: 5 - m_Depth: -1 - m_CullingMask: - serializedVersion: 2 - m_Bits: 4294967295 - m_RenderingPath: -1 - m_TargetTexture: {fileID: 0} - m_TargetDisplay: 0 - m_TargetEye: 3 - m_HDR: 1 - m_AllowMSAA: 1 - m_AllowDynamicResolution: 0 - m_ForceIntoRT: 0 - m_OcclusionCulling: 1 - m_StereoConvergence: 10 - m_StereoSeparation: 0.022 ---- !u!4 &1443059157 -Transform: + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 26 + m_Bottom: 0 + m_ChildAlignment: 4 + m_Spacing: 21.49 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 1 + m_ChildControlWidth: 0 + m_ChildControlHeight: 0 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!224 &4218099631219653145 +RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1443059154} - serializedVersion: 2 + m_GameObject: {fileID: 8524890883894783598} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 1, z: -10} + m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] - m_Father: {fileID: 0} + m_Father: {fileID: 6297160936045475414} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1554919879 + m_AnchorMin: {x: 1, y: 0.5} + m_AnchorMax: {x: 1, y: 0.5} + m_AnchoredPosition: {x: -50.5, y: -0.7949896} + m_SizeDelta: {x: 75.97, y: 30.41} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &4229214337198962808 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8824953543665984307} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: dee9445eca1072d479f52ea7f8867812, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &4279917104551126868 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -3054,42 +10391,23 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1554919880} - - component: {fileID: 1554919882} - - component: {fileID: 1554919881} + - component: {fileID: 7786521503106438674} + - component: {fileID: 2309847881077098563} + - component: {fileID: 2846011981180441491} m_Layer: 5 - m_Name: CheckBoxText + m_Name: NameText m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &1554919880 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1554919879} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 1653671848} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.5, y: 0} - m_AnchorMax: {x: 0.5, y: 0} - m_AnchoredPosition: {x: 16.6525, y: 130.36465} - m_SizeDelta: {x: 455.3732, y: 70.745} - m_Pivot: {x: 0.5, y: 0} ---- !u!114 &1554919881 +--- !u!114 &4404033343624500367 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1554919879} + m_GameObject: {fileID: 8524890883894783598} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} @@ -3103,17 +10421,17 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_text: Agree with terms and Policies + m_text: 12334 m_isRightToLeft: 0 - m_fontAsset: {fileID: 11400000, guid: 5da2ee26a9d0b024dafba9acbda5519e, type: 2} - m_sharedMaterial: {fileID: 7937037986802887748, guid: 5da2ee26a9d0b024dafba9acbda5519e, type: 2} + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} m_fontSharedMaterials: [] m_fontMaterial: {fileID: 0} m_fontMaterials: [] m_fontColor32: serializedVersion: 2 - rgba: 4278190080 - m_fontColor: {r: 0, g: 0, b: 0, a: 1} + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} m_enableVertexGradient: 0 m_colorMode: 3 m_fontColorGradient: @@ -3130,14 +10448,14 @@ MonoBehaviour: m_faceColor: serializedVersion: 2 rgba: 4294967295 - m_fontSize: 32.3 + m_fontSize: 27.2 m_fontSizeBase: 36 m_fontWeight: 400 m_enableAutoSizing: 1 - m_fontSizeMin: 18 + m_fontSizeMin: 14.5 m_fontSizeMax: 72 m_fontStyle: 0 - m_HorizontalAlignment: 2 + m_HorizontalAlignment: 1 m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 @@ -3172,15 +10490,274 @@ MonoBehaviour: m_hasFontAssetChanged: 0 m_baseMaterial: {fileID: 0} m_maskOffset: {x: 0, y: 0, z: 0, w: 0} ---- !u!222 &1554919882 +--- !u!222 &4581989795419718254 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1554919879} + m_GameObject: {fileID: 637605457992042315} m_CullTransparentMesh: 1 ---- !u!1 &1581919510 +--- !u!1 &4637163662770834346 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8920417142473391069} + - component: {fileID: 3518025845360783247} + - component: {fileID: 315217695334726574} + m_Layer: 5 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &4735665654017139821 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2470003456031229316} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 5791384924259239046} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: -2.9331055, y: 43.923096} + m_SizeDelta: {x: -361.7755, y: -138.2065} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &4794763745870527910 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8753920188017403380} + m_Enabled: 0 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 6491ca13a9741c6429b67b710c0ddc83, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &5147716085093562657 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3694136963135273964} + m_CullTransparentMesh: 1 +--- !u!222 &5321775283089179903 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6329351691133065142} + m_CullTransparentMesh: 1 +--- !u!224 &5349940132968692874 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 637605457992042315} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 3958252574042169815} + m_Father: {fileID: 7908368764916350329} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 20, y: -17} + m_Pivot: {x: 1, y: 1} +--- !u!222 &5526517941096837039 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3290230295543346823} + m_CullTransparentMesh: 1 +--- !u!1 &5530420962751641433 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8498960607485967627} + - component: {fileID: 4096312046140920670} + - component: {fileID: 9071939939645621796} + m_Layer: 5 + m_Name: NameText + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5610676131985386183 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1097430707938715602} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1747626110193711133} + m_Father: {fileID: 7908368764916350329} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -17, y: 0} + m_Pivot: {x: 0, y: 1} +--- !u!222 &5625572056408286163 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1628212735781591258} + m_CullTransparentMesh: 1 +--- !u!114 &5687352433085520774 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5920942482959527649} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 1616187056, guid: 40b5595732a0e224680c1f680953d775, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &5719200284800581842 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7590745602688418613} + - component: {fileID: 1432212496330545962} + - component: {fileID: 6895122971663629854} + m_Layer: 5 + m_Name: Handle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &5733033281134111201 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 680034625499312354} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalFit: 0 + m_VerticalFit: 1 +--- !u!224 &5791384924259239046 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 798348268578372097} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 4735665654017139821} + - {fileID: 5903304234731413043} + m_Father: {fileID: 3188961330051606762} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 758.95557} + m_SizeDelta: {x: 844.8002, y: 263.5776} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &5903304234731413043 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3768516472094189317} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 5791384924259239046} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -270, y: -2.2} + m_SizeDelta: {x: 107, y: 85} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &5920942482959527649 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -3188,42 +10765,78 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1581919511} - - component: {fileID: 1581919513} - - component: {fileID: 1581919512} + - component: {fileID: 3872224433570044647} + - component: {fileID: 7027640999519409487} + - component: {fileID: 5687352433085520774} + - component: {fileID: 2568540576067986084} m_Layer: 5 - m_Name: SwitchHandle + m_Name: 1st m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &1581919511 -RectTransform: +--- !u!222 &5939701950637671906 +CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1581919510} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 1376502211} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.5, y: 0.5} - m_AnchorMax: {x: 0.5, y: 0.5} - m_AnchoredPosition: {x: -100, y: 1} - m_SizeDelta: {x: 137.4667, y: 135.9561} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1581919512 + m_GameObject: {fileID: 1604885170654416396} + m_CullTransparentMesh: 1 +--- !u!114 &5995147594332303578 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1581919510} + m_GameObject: {fileID: 1442121233320013631} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe7a6c08caa987c438eef91a7a0fc0d3, type: 3} + m_Name: + m_EditorClassIdentifier: + pedestalNumber: 2 + scoreText: {fileID: 436060365470654632} + profilePic: {fileID: 463992417916777483} + nameText: {fileID: 2846011981180441491} +--- !u!114 &6034158462949042132 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2622107514652308689} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &6083117394399969524 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 557147155529408582} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} @@ -3231,13 +10844,13 @@ MonoBehaviour: m_EditorClassIdentifier: m_Material: {fileID: 0} m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 0 + m_RaycastTarget: 1 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Sprite: {fileID: -1415735947, guid: 1a63ea6d0777fc44b9edb3a4a9dee39b, type: 3} + m_Sprite: {fileID: -327468578, guid: 40b5595732a0e224680c1f680953d775, type: 3} m_Type: 0 m_PreserveAspect: 0 m_FillCenter: 1 @@ -3247,15 +10860,70 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &1581919513 -CanvasRenderer: +--- !u!224 &6149721200587309550 +RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1581919510} - m_CullTransparentMesh: 1 ---- !u!1 &1604735173 + m_GameObject: {fileID: 1442121233320013631} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 6405750163862218890} + - {fileID: 7786521503106438674} + - {fileID: 3848434020715499350} + - {fileID: 1425801118} + m_Father: {fileID: 1145879705990377755} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -330, y: 62.989} + m_SizeDelta: {x: 300, y: 375} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &6173620580924332831 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7228771785041086013} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 1 + m_Children: + - {fileID: 8419866729458327092} + m_Father: {fileID: 3872224433570044647} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 1} + m_AnchorMax: {x: 0.5, y: 1} + m_AnchoredPosition: {x: -3.1, y: -114.1} + m_SizeDelta: {x: 120, y: 120} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &6297160936045475414 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8337526333926663540} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1.00032, y: 1.00032, z: 1.00032} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 4218099631219653145} + m_Father: {fileID: 8946041516820998889} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0} + m_AnchorMax: {x: 0.5, y: 0} + m_AnchoredPosition: {x: 4, y: 138.8} + m_SizeDelta: {x: 141, y: 32} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &6329351691133065142 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -3263,111 +10931,172 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1604735174} - - component: {fileID: 1604735177} - - component: {fileID: 1604735176} - - component: {fileID: 1604735175} + - component: {fileID: 2391405159297781086} + - component: {fileID: 5321775283089179903} + - component: {fileID: 86669823378570626} m_Layer: 5 - m_Name: SettingsButton + m_Name: BG m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1604735174 + m_IsActive: 0 +--- !u!225 &6330872947842685056 +CanvasGroup: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1748742745168518370} + m_Enabled: 1 + m_Alpha: 1 + m_Interactable: 1 + m_BlocksRaycasts: 0 + m_IgnoreParentGroups: 0 +--- !u!224 &6405750163862218890 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1604735173} + m_GameObject: {fileID: 1604885170654416396} m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 1 - m_Children: [] - m_Father: {fileID: 1295747849} + m_Children: + - {fileID: 1721820769082356339} + m_Father: {fileID: 6149721200587309550} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 1, y: 1} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: -12, y: -15} - m_SizeDelta: {x: 195, y: 189} - m_Pivot: {x: 1, y: 1} ---- !u!114 &1604735175 + m_AnchorMin: {x: 0.5, y: 1} + m_AnchorMax: {x: 0.5, y: 1} + m_AnchoredPosition: {x: -2.6, y: -103.8} + m_SizeDelta: {x: 120, y: 120} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &6418597961389360341 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1604735173} + m_GameObject: {fileID: 1748742745168518370} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Script: {fileID: 11500000, guid: 55aae5a6257107a44b1b3e7aaa35a195, type: 3} m_Name: m_EditorClassIdentifier: - m_Navigation: - m_Mode: 3 - m_WrapAround: 0 - m_SelectOnUp: {fileID: 0} - m_SelectOnDown: {fileID: 0} - m_SelectOnLeft: {fileID: 0} - m_SelectOnRight: {fileID: 0} - m_Transition: 1 - m_Colors: - m_NormalColor: {r: 1, g: 1, b: 1, a: 1} - m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} - m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} - m_ColorMultiplier: 1 - m_FadeDuration: 0.1 - m_SpriteState: - m_HighlightedSprite: {fileID: 0} - m_PressedSprite: {fileID: 0} - m_SelectedSprite: {fileID: 0} - m_DisabledSprite: {fileID: 0} - m_AnimationTriggers: - m_NormalTrigger: Normal - m_HighlightedTrigger: Highlighted - m_PressedTrigger: Pressed - m_SelectedTrigger: Selected - m_DisabledTrigger: Disabled - m_Interactable: 1 - m_TargetGraphic: {fileID: 1604735176} - m_OnClick: + lbItemPrefab: {fileID: 5850781625971850372, guid: 88afb99e58a715640befe7148c6e92c6, type: 3} + lbItemSelfPrefab: {fileID: 3156808416426534223, guid: 67cb11c0d1417534e985eb7be1f6edf5, type: 3} + content: {fileID: 1747626110193711133} + _lbPedestalItems: + - {fileID: 2568540576067986084} + - {fileID: 5995147594332303578} + - {fileID: 2127333613745618497} +--- !u!114 &6438779806906087076 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1628212735781591258} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Content: {fileID: 1747626110193711133} + m_Horizontal: 0 + m_Vertical: 1 + m_MovementType: 1 + m_Elasticity: 0.1 + m_Inertia: 1 + m_DecelerationRate: 0.135 + m_ScrollSensitivity: 1 + m_Viewport: {fileID: 5610676131985386183} + m_HorizontalScrollbar: {fileID: 0} + m_VerticalScrollbar: {fileID: 1406664459727492874} + m_HorizontalScrollbarVisibility: 2 + m_VerticalScrollbarVisibility: 0 + m_HorizontalScrollbarSpacing: -3 + m_VerticalScrollbarSpacing: -3 + m_OnValueChanged: m_PersistentCalls: - m_Calls: - - m_Target: {fileID: 120710489} - m_TargetAssemblyTypeName: UnityEngine.GameObject, UnityEngine - m_MethodName: SetActive - m_Mode: 6 - m_Arguments: - m_ObjectArgument: {fileID: 0} - m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine - m_IntArgument: 0 - m_FloatArgument: 0 - m_StringArgument: - m_BoolArgument: 1 - m_CallState: 2 - - m_Target: {fileID: 1295747848} - m_TargetAssemblyTypeName: UnityEngine.GameObject, UnityEngine - m_MethodName: SetActive - m_Mode: 6 - m_Arguments: - m_ObjectArgument: {fileID: 0} - m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine - m_IntArgument: 0 - m_FloatArgument: 0 - m_StringArgument: - m_BoolArgument: 0 - m_CallState: 2 ---- !u!114 &1604735176 + m_Calls: [] +--- !u!114 &6440002834781727084 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8950198485781367200} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: -1572243905, guid: 40b5595732a0e224680c1f680953d775, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &6459730673229792163 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7228771785041086013} + m_Enabled: 0 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: -327468578, guid: 40b5595732a0e224680c1f680953d775, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &6511473269630573483 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8793223514687652065} + m_CullTransparentMesh: 1 +--- !u!114 &6698527437318130830 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1604735173} + m_GameObject: {fileID: 1442121233320013631} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} @@ -3381,7 +11110,7 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Sprite: {fileID: 512344220, guid: 667ad1e31f7749b4ab8e2a0290ef71a7, type: 3} + m_Sprite: {fileID: 1965810598, guid: 40b5595732a0e224680c1f680953d775, type: 3} m_Type: 0 m_PreserveAspect: 0 m_FillCenter: 1 @@ -3391,65 +11120,103 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &1604735177 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1604735173} - m_CullTransparentMesh: 1 ---- !u!1 &1653671847 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1653671848} - - component: {fileID: 1653671850} - - component: {fileID: 1653671849} - m_Layer: 5 - m_Name: Panel - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1653671848 -RectTransform: +--- !u!114 &6749075303465759337 +MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1653671847} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 1 - m_Children: - - {fileID: 315029015} - - {fileID: 1052043021} - - {fileID: 1896578657} - - {fileID: 23012388} - - {fileID: 1554919880} - - {fileID: 1727736101} - m_Father: {fileID: 120710490} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.5, y: 0.5} - m_AnchorMax: {x: 0.5, y: 0.5} - m_AnchoredPosition: {x: 0, y: 78.93727} - m_SizeDelta: {x: 986.5769, y: 902.4554} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1653671849 + m_GameObject: {fileID: 3384776166402557714} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Ento + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 5da2ee26a9d0b024dafba9acbda5519e, type: 2} + m_sharedMaterial: {fileID: 7937037986802887748, guid: 5da2ee26a9d0b024dafba9acbda5519e, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 47.4 + m_fontSizeBase: 20.2 + m_fontWeight: 400 + m_enableAutoSizing: 1 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 1 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!114 &6895122971663629854 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1653671847} - m_Enabled: 1 + m_GameObject: {fileID: 5719200284800581842} + m_Enabled: 0 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} m_Name: @@ -3462,8 +11229,8 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Sprite: {fileID: -147694649, guid: 1a63ea6d0777fc44b9edb3a4a9dee39b, type: 3} - m_Type: 0 + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 m_PreserveAspect: 0 m_FillCenter: 1 m_FillMethod: 4 @@ -3472,15 +11239,23 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &1653671850 +--- !u!222 &6956822004160894945 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1653671847} + m_GameObject: {fileID: 8824953543665984307} + m_CullTransparentMesh: 0 +--- !u!222 &7027640999519409487 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5920942482959527649} m_CullTransparentMesh: 1 ---- !u!1 &1688123566 +--- !u!1 &7228771785041086013 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -3488,87 +11263,53 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1688123567} - - component: {fileID: 1688123570} - - component: {fileID: 1688123569} - - component: {fileID: 1688123568} + - component: {fileID: 6173620580924332831} + - component: {fileID: 3986781068102481986} + - component: {fileID: 6459730673229792163} m_Layer: 5 - m_Name: CashAddButton + m_Name: AvatarPicture m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &1688123567 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1688123566} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 1967508764} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 1, y: 0.5} - m_AnchorMax: {x: 1, y: 0.5} - m_AnchoredPosition: {x: 29.6, y: 1.9000015} - m_SizeDelta: {x: 94, y: 94} - m_Pivot: {x: 1, y: 0.5} ---- !u!114 &1688123568 +--- !u!114 &7229894358202064413 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1688123566} - m_Enabled: 1 + m_GameObject: {fileID: 1604885170654416396} + m_Enabled: 0 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} m_Name: m_EditorClassIdentifier: - m_Navigation: - m_Mode: 3 - m_WrapAround: 0 - m_SelectOnUp: {fileID: 0} - m_SelectOnDown: {fileID: 0} - m_SelectOnLeft: {fileID: 0} - m_SelectOnRight: {fileID: 0} - m_Transition: 1 - m_Colors: - m_NormalColor: {r: 1, g: 1, b: 1, a: 1} - m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} - m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} - m_ColorMultiplier: 1 - m_FadeDuration: 0.1 - m_SpriteState: - m_HighlightedSprite: {fileID: 0} - m_PressedSprite: {fileID: 0} - m_SelectedSprite: {fileID: 0} - m_DisabledSprite: {fileID: 0} - m_AnimationTriggers: - m_NormalTrigger: Normal - m_HighlightedTrigger: Highlighted - m_PressedTrigger: Pressed - m_SelectedTrigger: Selected - m_DisabledTrigger: Disabled - m_Interactable: 1 - m_TargetGraphic: {fileID: 1688123569} - m_OnClick: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] ---- !u!114 &1688123569 + m_Sprite: {fileID: 21300000, guid: 9c963c49b2bf6c2408edcacbaae98200, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &7481815995319858448 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1688123566} + m_GameObject: {fileID: 1748742745168518370} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} @@ -3582,7 +11323,7 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Sprite: {fileID: -1225918769, guid: 667ad1e31f7749b4ab8e2a0290ef71a7, type: 3} + m_Sprite: {fileID: 21300000, guid: 7fee049f2ce6b13489377767baad0bbe, type: 3} m_Type: 0 m_PreserveAspect: 0 m_FillCenter: 1 @@ -3592,73 +11333,46 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &1688123570 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1688123566} - m_CullTransparentMesh: 1 ---- !u!1 &1719028163 +--- !u!1 &7504354048190083025 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1719028164} - - component: {fileID: 1719028166} - - component: {fileID: 1719028165} - m_Layer: 5 - m_Name: EnergyIcon - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1719028164 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1719028163} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0.70000005, y: 0.70000005, z: 0.70000005} - m_ConstrainProportionsScale: 1 - m_Children: [] - m_Father: {fileID: 1843431698} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0.5} - m_AnchorMax: {x: 0, y: 0.5} - m_AnchoredPosition: {x: -14.2, y: -5.8} - m_SizeDelta: {x: 101, y: 120} - m_Pivot: {x: 0, y: 0.5} ---- !u!114 &1719028165 + serializedVersion: 6 + m_Component: + - component: {fileID: 3848434020715499350} + - component: {fileID: 131018002305641368} + - component: {fileID: 7888988806631880698} + m_Layer: 5 + m_Name: ScoreBG + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!114 &7570351248279651149 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1719028163} + m_GameObject: {fileID: 1628212735781591258} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} + m_Color: {r: 1, g: 1, b: 1, a: 0} m_RaycastTarget: 1 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Sprite: {fileID: -913397601, guid: 667ad1e31f7749b4ab8e2a0290ef71a7, type: 3} - m_Type: 0 + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 m_PreserveAspect: 0 m_FillCenter: 1 m_FillMethod: 4 @@ -3667,58 +11381,86 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &1719028166 +--- !u!224 &7590745602688418613 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5719200284800581842} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 3958252574042169815} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &7609703665625641745 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1719028163} + m_GameObject: {fileID: 8753920188017403380} m_CullTransparentMesh: 1 ---- !u!1 &1727447449 -GameObject: +--- !u!224 &7786521503106438674 +RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1727447450} - - component: {fileID: 1727447452} - - component: {fileID: 1727447451} - m_Layer: 5 - m_Name: VolumeIcon - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1727447450 + m_GameObject: {fileID: 4279917104551126868} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1.00032, y: 1.00032, z: 1.00032} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 6149721200587309550} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -0.3305, y: -13.2} + m_SizeDelta: {x: 172.2484, y: 44.5333} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &7795106251941810256 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1727447449} + m_GameObject: {fileID: 3290230295543346823} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 1 + m_ConstrainProportionsScale: 0 m_Children: [] - m_Father: {fileID: 1052043021} + m_Father: {fileID: 3188961330051606762} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0.5} - m_AnchorMax: {x: 0, y: 0.5} - m_AnchoredPosition: {x: 47.330414, y: -4.7713} - m_SizeDelta: {x: 196.9117, y: 197.6809} - m_Pivot: {x: 0, y: 0.5} ---- !u!114 &1727447451 + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 1.2497559, y: 0} + m_SizeDelta: {x: 2.5, y: 200} + m_Pivot: {x: 0.5, y: 1} +--- !u!222 &7798862641103379981 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 798348268578372097} + m_CullTransparentMesh: 1 +--- !u!114 &7888988806631880698 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1727447449} + m_GameObject: {fileID: 7504354048190083025} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} @@ -3732,7 +11474,7 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Sprite: {fileID: -772468077, guid: 1a63ea6d0777fc44b9edb3a4a9dee39b, type: 3} + m_Sprite: {fileID: 21300000, guid: d1a254d145eb8a14ca793fd3035c8b0c, type: 3} m_Type: 0 m_PreserveAspect: 0 m_FillCenter: 1 @@ -3742,15 +11484,135 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &1727447452 +--- !u!224 &7908368764916350329 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1628212735781591258} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 5610676131985386183} + - {fileID: 5349940132968692874} + m_Father: {fileID: 8120531799563461673} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 11.378, y: 18.5} + m_SizeDelta: {x: 1057.2, y: 793.97} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &7978439345004707343 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1727447449} + m_GameObject: {fileID: 8337526333926663540} m_CullTransparentMesh: 1 ---- !u!1 &1727736100 +--- !u!114 &7999982976484535055 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1097430707938715602} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ShowMaskGraphic: 0 +--- !u!224 &8026882825163135342 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9197767621754864405} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 3848434020715499350} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0.5} + m_AnchorMax: {x: 1, y: 0.5} + m_AnchoredPosition: {x: -50.5, y: -0.7949896} + m_SizeDelta: {x: 75.97, y: 30.41} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &8120531799563461673 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2579048446944810908} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 7908368764916350329} + m_Father: {fileID: 528626935175085956} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -0.0025167, y: -72.84} + m_SizeDelta: {x: 1080, y: 833.9} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &8273856533194255613 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8524890883894783598} + m_CullTransparentMesh: 1 +--- !u!224 &8301229671545223574 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8824953543665984307} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1610181445485560085} + m_Father: {fileID: 3188961330051606762} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0} + m_AnchorMax: {x: 0.5, y: 0} + m_AnchoredPosition: {x: 0, y: 220} + m_SizeDelta: {x: 179, y: 140} + m_Pivot: {x: 0.5, y: 0} +--- !u!224 &8324889243000454218 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8793223514687652065} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 4056225210829074065} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 120, y: 120} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &8337526333926663540 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -3758,88 +11620,91 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1727736101} - - component: {fileID: 1727736104} - - component: {fileID: 1727736103} - - component: {fileID: 1727736102} + - component: {fileID: 6297160936045475414} + - component: {fileID: 7978439345004707343} + - component: {fileID: 3416664224428966726} m_Layer: 5 - m_Name: CheckBoxButton + m_Name: ScoreBG m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1727736101 + m_IsActive: 0 +--- !u!224 &8419866729458327092 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1727736100} + m_GameObject: {fileID: 557147155529408582} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 1020845099} - m_Father: {fileID: 1653671848} + m_Children: [] + m_Father: {fileID: 6173620580924332831} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.5, y: 0} - m_AnchorMax: {x: 0.5, y: 0} - m_AnchoredPosition: {x: -272, y: 117.38} - m_SizeDelta: {x: 90.723, y: 90.7214} - m_Pivot: {x: 0.5, y: 0} ---- !u!114 &1727736102 + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: -2} + m_SizeDelta: {x: 120, y: 120} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &8431159124448418817 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1727736100} + m_GameObject: {fileID: 1097430707938715602} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} m_Name: m_EditorClassIdentifier: - m_Navigation: - m_Mode: 3 - m_WrapAround: 0 - m_SelectOnUp: {fileID: 0} - m_SelectOnDown: {fileID: 0} - m_SelectOnLeft: {fileID: 0} - m_SelectOnRight: {fileID: 0} - m_Transition: 1 - m_Colors: - m_NormalColor: {r: 1, g: 1, b: 1, a: 1} - m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} - m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} - m_ColorMultiplier: 1 - m_FadeDuration: 0.1 - m_SpriteState: - m_HighlightedSprite: {fileID: 0} - m_PressedSprite: {fileID: 0} - m_SelectedSprite: {fileID: 0} - m_DisabledSprite: {fileID: 0} - m_AnimationTriggers: - m_NormalTrigger: Normal - m_HighlightedTrigger: Highlighted - m_PressedTrigger: Pressed - m_SelectedTrigger: Selected - m_DisabledTrigger: Disabled - m_Interactable: 1 - m_TargetGraphic: {fileID: 1727736103} - m_OnClick: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] ---- !u!114 &1727736103 + m_Sprite: {fileID: 10917, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!224 &8498960607485967627 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5530420962751641433} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1.00032, y: 1.00032, z: 1.00032} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 8946041516820998889} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -2.3936, y: -11.5607} + m_SizeDelta: {x: 185.6433, y: 46.4108} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &8509113260832753955 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1727736100} + m_GameObject: {fileID: 3768516472094189317} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} @@ -3853,7 +11718,7 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Sprite: {fileID: 73206232, guid: 1a63ea6d0777fc44b9edb3a4a9dee39b, type: 3} + m_Sprite: {fileID: 21300000, guid: 51493f452804e0149a3098e5000e5c3e, type: 3} m_Type: 0 m_PreserveAspect: 0 m_FillCenter: 1 @@ -3863,15 +11728,25 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &1727736104 -CanvasRenderer: +--- !u!1 &8524890883894783598 +GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1727736100} - m_CullTransparentMesh: 1 ---- !u!1 &1843431697 + serializedVersion: 6 + m_Component: + - component: {fileID: 4218099631219653145} + - component: {fileID: 8273856533194255613} + - component: {fileID: 4404033343624500367} + m_Layer: 5 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &8753920188017403380 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -3879,36 +11754,35 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1843431698} + - component: {fileID: 4056225210829074065} + - component: {fileID: 7609703665625641745} + - component: {fileID: 4794763745870527910} m_Layer: 5 - m_Name: Energy + m_Name: AvatarPicture m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &1843431698 -RectTransform: +--- !u!1 &8793223514687652065 +GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1843431697} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 544798142} - - {fileID: 1719028164} - m_Father: {fileID: 1295747849} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 57.399902, y: -134.6001} - m_SizeDelta: {x: 520, y: 100} - m_Pivot: {x: 0, y: 1} ---- !u!1 &1844700869 + serializedVersion: 6 + m_Component: + - component: {fileID: 8324889243000454218} + - component: {fileID: 6511473269630573483} + - component: {fileID: 1872020314069923374} + m_Layer: 5 + m_Name: Image + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &8824953543665984307 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -3916,42 +11790,93 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1844700870} - - component: {fileID: 1844700872} - - component: {fileID: 1844700871} + - component: {fileID: 8301229671545223574} + - component: {fileID: 6956822004160894945} + - component: {fileID: 4229214337198962808} + - component: {fileID: 3361381837364374251} m_Layer: 5 - m_Name: Text (TMP) - m_TagString: Untagged + m_Name: BackBtn + m_TagString: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 0 ---- !u!224 &1844700870 +--- !u!224 &8920417142473391069 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1844700869} + m_GameObject: {fileID: 4637163662770834346} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] - m_Father: {fileID: 1109681751} + m_Father: {fileID: 2000930026608204176} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 60.991318, y: 2.0792847} - m_SizeDelta: {x: -335.4525, y: -223.1731} + m_AnchorMin: {x: 1, y: 0.5} + m_AnchorMax: {x: 1, y: 0.5} + m_AnchoredPosition: {x: -50.5, y: -0.7949896} + m_SizeDelta: {x: 75.97, y: 30.41} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1844700871 +--- !u!222 &8933557623444557051 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1748742745168518370} + m_CullTransparentMesh: 0 +--- !u!224 &8946041516820998889 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8950198485781367200} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 4056225210829074065} + - {fileID: 8498960607485967627} + - {fileID: 6297160936045475414} + - {fileID: 1033533885} + m_Father: {fileID: 1145879705990377755} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 334.32275, y: 59.9366} + m_SizeDelta: {x: 307.8558, y: 384.8198} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &8950198485781367200 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8946041516820998889} + - component: {fileID: 503623586353167092} + - component: {fileID: 6440002834781727084} + - component: {fileID: 2127333613745618497} + m_Layer: 5 + m_Name: 3rd + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &9071939939645621796 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1844700869} + m_GameObject: {fileID: 5530420962751641433} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} @@ -3965,10 +11890,10 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_text: PLAY + m_text: Wlkr m_isRightToLeft: 0 - m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} - m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontAsset: {fileID: 11400000, guid: 5da2ee26a9d0b024dafba9acbda5519e, type: 2} + m_sharedMaterial: {fileID: 7937037986802887748, guid: 5da2ee26a9d0b024dafba9acbda5519e, type: 2} m_fontSharedMaterials: [] m_fontMaterial: {fileID: 0} m_fontMaterials: [] @@ -3992,13 +11917,13 @@ MonoBehaviour: m_faceColor: serializedVersion: 2 rgba: 4294967295 - m_fontSize: 108.3 - m_fontSizeBase: 24 + m_fontSize: 39.75 + m_fontSizeBase: 20.2 m_fontWeight: 400 m_enableAutoSizing: 1 m_fontSizeMin: 18 - m_fontSizeMax: 108.3 - m_fontStyle: 1 + m_fontSizeMax: 72 + m_fontStyle: 0 m_HorizontalAlignment: 2 m_VerticalAlignment: 512 m_textAlignment: 65535 @@ -4010,7 +11935,7 @@ MonoBehaviour: m_charWidthMaxAdj: 0 m_enableWordWrapping: 1 m_wordWrappingRatios: 0.4 - m_overflowMode: 0 + m_overflowMode: 1 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 @@ -4034,124 +11959,7 @@ MonoBehaviour: m_hasFontAssetChanged: 0 m_baseMaterial: {fileID: 0} m_maskOffset: {x: 0, y: 0, z: 0, w: 0} ---- !u!222 &1844700872 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1844700869} - m_CullTransparentMesh: 1 ---- !u!1 &1846836818 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1846836819} - m_Layer: 5 - m_Name: Fill Area - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1846836819 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1846836818} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 1153888469} - m_Father: {fileID: 365282214} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0.25} - m_AnchorMax: {x: 1, y: 0.75} - m_AnchoredPosition: {x: -5, y: 0} - m_SizeDelta: {x: -20, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!1 &1852085630 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1852085631} - m_Layer: 5 - m_Name: Shop - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1852085631 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1852085630} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 282693411} - m_Father: {fileID: 624775560} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!1 &1896578656 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1896578657} - m_Layer: 5 - m_Name: Music - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1896578657 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1896578656} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 40575406} - - {fileID: 1376502211} - m_Father: {fileID: 1653671848} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.5, y: 0.5} - m_AnchorMax: {x: 0.5, y: 0.5} - m_AnchoredPosition: {x: 0, y: -52.73481} - m_SizeDelta: {x: 951, y: 173.5} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!1 &1967508763 +--- !u!1 &9197767621754864405 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -4159,37 +11967,16 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1967508764} + - component: {fileID: 8026882825163135342} + - component: {fileID: 3842016894974005871} + - component: {fileID: 436060365470654632} m_Layer: 5 - m_Name: Cash + m_Name: Text (TMP) m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &1967508764 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1967508763} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 483958582} - - {fileID: 1102335811} - - {fileID: 1688123567} - - {fileID: 794466104} - m_Father: {fileID: 1295747849} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: -1.8999023, y: -37.5} - m_SizeDelta: {x: 472.1017, y: 100} - m_Pivot: {x: 0, y: 1} --- !u!1660057539 &9223372036854775807 SceneRoots: m_ObjectHideFlags: 0 diff --git a/Assets/Scripts/GameConstants.cs b/Assets/Scripts/GameConstants.cs new file mode 100644 index 00000000..18eecc9c --- /dev/null +++ b/Assets/Scripts/GameConstants.cs @@ -0,0 +1,22 @@ + +public class GameConstants +{ + + public static string LevelCompletedStatsKey = "LevelsCompleted"; + public static string NameEnteredCheckKey = "IsNameEntered"; + public static string AvatarSelectedCheckKey = "AvatarSelected"; + public static string AvatarSelectedIndex = "AvatarSelectedIndex"; + public static string DisplayNameKey = "DisplayName"; + + //#region MyRegion + + //public static string Ach_CompleteEasyLevelKey = "Completed_Easy_Level"; + //public static string Ach_CompleteMediumLevelKey = "Completed_Medium_Level"; + //public static string Ach_CompleteHardLevelKey = "Completed_Hard_Level"; + //public static string Ach_CompleteExpertLevelKey = "Completed_Expert_Level"; + //public static string Ach_CompleteAdvanceLevelKey = "Completed_Advance_Level"; + //public static string Ach_WatchedAds = "Watched_Ads"; + //public static string Ach_RotatedPipes = "Rotated_Pipes"; + + //#endregion +} diff --git a/Assets/Scripts/GameConstants.cs.meta b/Assets/Scripts/GameConstants.cs.meta new file mode 100644 index 00000000..acc4069a --- /dev/null +++ b/Assets/Scripts/GameConstants.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 662feaf73b5eb5c489c549b4b7d6aa0f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HingeJointBreakReceiver.cs b/Assets/Scripts/HingeJointBreakReceiver.cs similarity index 100% rename from Assets/HingeJointBreakReceiver.cs rename to Assets/Scripts/HingeJointBreakReceiver.cs diff --git a/Assets/HingeJointBreakReceiver.cs.meta b/Assets/Scripts/HingeJointBreakReceiver.cs.meta similarity index 100% rename from Assets/HingeJointBreakReceiver.cs.meta rename to Assets/Scripts/HingeJointBreakReceiver.cs.meta diff --git a/Assets/LoadingManager.cs b/Assets/Scripts/LoadingManager.cs similarity index 100% rename from Assets/LoadingManager.cs rename to Assets/Scripts/LoadingManager.cs diff --git a/Assets/LoadingManager.cs.meta b/Assets/Scripts/LoadingManager.cs.meta similarity index 100% rename from Assets/LoadingManager.cs.meta rename to Assets/Scripts/LoadingManager.cs.meta diff --git a/Assets/ObstacleColliderSetter.cs b/Assets/Scripts/ObstacleColliderSetter.cs similarity index 100% rename from Assets/ObstacleColliderSetter.cs rename to Assets/Scripts/ObstacleColliderSetter.cs diff --git a/Assets/ObstacleColliderSetter.cs.meta b/Assets/Scripts/ObstacleColliderSetter.cs.meta similarity index 100% rename from Assets/ObstacleColliderSetter.cs.meta rename to Assets/Scripts/ObstacleColliderSetter.cs.meta diff --git a/Assets/ObstacleInstantiator.cs b/Assets/Scripts/ObstacleInstantiator.cs similarity index 100% rename from Assets/ObstacleInstantiator.cs rename to Assets/Scripts/ObstacleInstantiator.cs diff --git a/Assets/ObstacleInstantiator.cs.meta b/Assets/Scripts/ObstacleInstantiator.cs.meta similarity index 100% rename from Assets/ObstacleInstantiator.cs.meta rename to Assets/Scripts/ObstacleInstantiator.cs.meta diff --git a/Assets/Scripts/PlayFab.meta b/Assets/Scripts/PlayFab.meta new file mode 100644 index 00000000..aa2d49b2 --- /dev/null +++ b/Assets/Scripts/PlayFab.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 453bc752dfaa0b84386c214d328a07fe +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/PlayFab/PlayFabInit.cs b/Assets/Scripts/PlayFab/PlayFabInit.cs new file mode 100644 index 00000000..f92e1d8b --- /dev/null +++ b/Assets/Scripts/PlayFab/PlayFabInit.cs @@ -0,0 +1,109 @@ +using System.Collections; +using System.Collections.Generic; +using PlayFab; +using PlayFab.ClientModels; +using UnityEngine; +using UnityEngine.SceneManagement; + +public class PlayFabInit : MonoBehaviour +{ + public string playFabTitleId = "7D3B9"; // Replace with your PlayFab Title ID + void Start() + { + + if (string.IsNullOrEmpty(PlayFabSettings.TitleId)) + { + PlayFabSettings.TitleId = playFabTitleId; + } + Login(); + } + + void Login() + { + var request = new LoginWithCustomIDRequest + { + CustomId = SystemInfo.deviceUniqueIdentifier, + CreateAccount = true, + // InfoRequestParameters = new GetPlayerCombinedInfoRequestParams + // { + // GetPlayerProfile = true, // This will include player profile data in the login response + // ProfileConstraints = new PlayerProfileViewConstraints + // { + // ShowDisplayName = true, + // ShowAvatarUrl = true, + // ShowCreated = true + // } + // } + }; + + PlayFabClientAPI.LoginWithCustomID(request, OnLoginSuccess, OnLoginFailure); + } + + private void OnLoginSuccess(LoginResult result) + { + Debug.Log("Login successful!"); + GetPlayerProfile(); + GetCustomUserData(); + } + + private void GetCustomUserData() + { + GetPlayerProfileWithUserData(); + } + + public void GetPlayerProfileWithUserData() + { + var request = new GetPlayerCombinedInfoRequest + { + PlayFabId = PlayFabSettings.staticPlayer.PlayFabId, // Use the logged-in player's PlayFab ID + InfoRequestParameters = new GetPlayerCombinedInfoRequestParams + { + GetUserData = true // This will include User Data like AvatarID in the response + } + }; + + PlayFabClientAPI.GetPlayerCombinedInfo(request, OnGetCombinedInfoSuccess, OnGetCombinedInfoFailure); + } + + private void OnGetCombinedInfoSuccess(GetPlayerCombinedInfoResult result) + { + var userData = result.InfoResultPayload.UserData; + PlayFabManager.Instance.playFabUserDataManager.myCustomData = userData; + } + + private void OnGetCombinedInfoFailure(PlayFabError error) + { + Debug.LogError("Failed to get combined player info: " + error.GenerateErrorReport()); + } + + public void GetPlayerProfile() + { + var request = new GetPlayerProfileRequest + { + PlayFabId = PlayFabSettings.staticPlayer.PlayFabId, + ProfileConstraints = new PlayerProfileViewConstraints + { + ShowDisplayName = true, // Allowed by your title settings + // Do not request AvatarUrl or other fields, since they are disallowed + } + }; + + PlayFabClientAPI.GetPlayerProfile(request, OnGetProfileSuccess, OnGetProfileFailure); + } + + private void OnGetProfileFailure(PlayFabError obj) + { + Debug.LogError("Couldn't Fetch Player Profile " + obj.GenerateErrorReport()); + } + + private void OnGetProfileSuccess(GetPlayerProfileResult obj) + { + Debug.Log("Player profile fetching successful"); + PlayFabManager.Instance.playFabUserDataManager.myProfile = obj.PlayerProfile; + } + + private void OnLoginFailure(PlayFabError error) + { + Debug.LogError("Login failed: " + error.GenerateErrorReport()); + } +} diff --git a/Assets/Scripts/PlayFab/PlayFabInit.cs.meta b/Assets/Scripts/PlayFab/PlayFabInit.cs.meta new file mode 100644 index 00000000..7964b0b7 --- /dev/null +++ b/Assets/Scripts/PlayFab/PlayFabInit.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 90da569ce88767e4b924f823046b79de +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/PlayFab/PlayFabLeaderboards.cs b/Assets/Scripts/PlayFab/PlayFabLeaderboards.cs new file mode 100644 index 00000000..33fe3ddc --- /dev/null +++ b/Assets/Scripts/PlayFab/PlayFabLeaderboards.cs @@ -0,0 +1,100 @@ +using System; +using System.Collections.Generic; +using PlayFab; +using PlayFab.ClientModels; +using UnityEngine; + +public class PlayFabLeaderboards : MonoBehaviour +{ + public static string DisplayName; + public void UpdateLevelsCompleted(int levelsCompleted) + { + var request = new UpdatePlayerStatisticsRequest + { + Statistics = new List + { + new StatisticUpdate + { + StatisticName = GameConstants.LevelCompletedStatsKey, + Value = levelsCompleted + } + } + }; + PlayFabClientAPI.UpdatePlayerStatistics(request, OnStatisticsUpdateSuccess, OnStatisticsUpdateFailure); + } + + public void UpdateLevelCompletionTime(string tier, int levelNumber, int completionTimeInSeconds) + { + string statisticName = $"{tier}_Level_{levelNumber}_Time"; + + var request = new UpdatePlayerStatisticsRequest + { + Statistics = new List + { + new StatisticUpdate + { + StatisticName = statisticName, + Value = completionTimeInSeconds + } + } + }; + + PlayFabClientAPI.UpdatePlayerStatistics(request, OnStatisticsUpdateSuccess, OnStatisticsUpdateFailure); + } + + + private void OnStatisticsUpdateSuccess(UpdatePlayerStatisticsResult result) + { + Debug.Log("Successfully updated player statistics!"); + } + + private void OnStatisticsUpdateFailure(PlayFabError error) + { + Debug.LogError("Failed to update player statistics: " + error.GenerateErrorReport()); + } + + public void GetLeaderboardByKey(string key,Action> onSuccess, Action onFailure) + { + var request = new GetLeaderboardRequest + { + StatisticName = key, + StartPosition = 0, + MaxResultsCount = 1 + }; + + PlayFabClientAPI.GetLeaderboard(request, result => onSuccess(result.Leaderboard), onFailure); + } + + public void GetLeaderboard(Action> onSuccess, Action onFailure) + { + var request = new GetLeaderboardRequest + { + StatisticName = GameConstants.LevelCompletedStatsKey, + StartPosition = 0, + MaxResultsCount = 10 + }; + + PlayFabClientAPI.GetLeaderboard(request, result => onSuccess(result.Leaderboard), onFailure); + } + public void SetDisplayName(string displayName) + { + var request = new UpdateUserTitleDisplayNameRequest + { + DisplayName = displayName + }; + + PlayFabClientAPI.UpdateUserTitleDisplayName(request, OnDisplayNameUpdateSuccess, OnDisplayNameUpdateFailure); + DisplayName = displayName; + } + + private void OnDisplayNameUpdateSuccess(UpdateUserTitleDisplayNameResult result) + { + Debug.Log("Display name set successfully: " + result.DisplayName); + } + + private void OnDisplayNameUpdateFailure(PlayFabError error) + { + Debug.LogError("Failed to set display name: " + error.GenerateErrorReport()); + } + +} \ No newline at end of file diff --git a/Assets/Scripts/PlayFab/PlayFabLeaderboards.cs.meta b/Assets/Scripts/PlayFab/PlayFabLeaderboards.cs.meta new file mode 100644 index 00000000..1a5d5606 --- /dev/null +++ b/Assets/Scripts/PlayFab/PlayFabLeaderboards.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4bc7571c5c74ec64bbf41fa0372397c0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/PlayFab/PlayFabManager.cs b/Assets/Scripts/PlayFab/PlayFabManager.cs new file mode 100644 index 00000000..7d7605de --- /dev/null +++ b/Assets/Scripts/PlayFab/PlayFabManager.cs @@ -0,0 +1,48 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using PlayFab; +using PlayFab.ClientModels; +using UnityEngine; + +public class PlayFabManager : MonoBehaviour +{ + public static PlayFabManager Instance { get; private set; } + public PlayFabInit playFabInit; + public List avatarImages; + public PlayFabLeaderboards playFabLeaderboards; + public PlayFabUserData playFabUserDataManager; + private int myAvatarIndex + { + get + { + if (playFabUserDataManager.myCustomData != null && playFabUserDataManager.myCustomData.ContainsKey("AvatarID")) + { + return int.Parse(playFabUserDataManager.myCustomData["AvatarID"].Value); + } + + return 0; + } + } + + public Sprite myDisplayPicture => avatarImages[myAvatarIndex]; + private void Awake() + { + if (Instance != null && Instance != this) + { + Destroy(this); + } + else + { + Instance = this; + DontDestroyOnLoad(gameObject); + } + + playFabInit = gameObject.AddComponent(); + playFabLeaderboards = gameObject.AddComponent(); + playFabUserDataManager = gameObject.AddComponent(); + } + + + +} diff --git a/Assets/Scripts/PlayFab/PlayFabManager.cs.meta b/Assets/Scripts/PlayFab/PlayFabManager.cs.meta new file mode 100644 index 00000000..92f4b3f8 --- /dev/null +++ b/Assets/Scripts/PlayFab/PlayFabManager.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 030889e21ff6da2419967c5df4aa3fd2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/PlayFab/PlayFabUserData.cs b/Assets/Scripts/PlayFab/PlayFabUserData.cs new file mode 100644 index 00000000..830c1d96 --- /dev/null +++ b/Assets/Scripts/PlayFab/PlayFabUserData.cs @@ -0,0 +1,52 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using PlayFab; +using PlayFab.ClientModels; +using UnityEngine; + +public class PlayFabUserData : MonoBehaviour +{ + + public PlayerProfileModel myProfile; + public Dictionary myCustomData; + + public void GetPlayerUserData(string playfabID, Action> onCallback, Action onFallback) + { + var request = new GetPlayerCombinedInfoRequest + { + PlayFabId = playfabID, // Use the logged-in player's PlayFab ID + InfoRequestParameters = new GetPlayerCombinedInfoRequestParams + { + GetUserData = true // This will include User Data like AvatarID in the response + } + }; + + PlayFabClientAPI.GetPlayerCombinedInfo(request, result => onCallback(result.InfoResultPayload.UserData), result=>onFallback(result.ErrorMessage)); + } + + public void GetPlayerAvatarImage(string playfabID, Action onCallback, Action onFallback) + { + var request = new GetPlayerCombinedInfoRequest + { + PlayFabId = playfabID, // Use the logged-in player's PlayFab ID + InfoRequestParameters = new GetPlayerCombinedInfoRequestParams + { + GetUserData = true // This will include User Data like AvatarID in the response + } + }; + + PlayFabClientAPI.GetPlayerCombinedInfo(request, result => + { + if (result.InfoResultPayload.UserData != null && result.InfoResultPayload.UserData.ContainsKey("AvatarID")) + { + Sprite dp = PlayFabManager.Instance.avatarImages[ + int.Parse(result.InfoResultPayload.UserData["AvatarID"].Value)]; + onCallback(dp); + } + else + onCallback(PlayFabManager.Instance.avatarImages[0]); + }, result=>onFallback(result.ErrorMessage)); + } + +} diff --git a/Assets/Scripts/PlayFab/PlayFabUserData.cs.meta b/Assets/Scripts/PlayFab/PlayFabUserData.cs.meta new file mode 100644 index 00000000..4a54ea7b --- /dev/null +++ b/Assets/Scripts/PlayFab/PlayFabUserData.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ee4dea21bf118984281a95b0829061bd +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Popup.cs b/Assets/Scripts/Popup.cs new file mode 100644 index 00000000..f271a019 --- /dev/null +++ b/Assets/Scripts/Popup.cs @@ -0,0 +1,115 @@ +/* +http://www.cgsoso.com/forum-211-1.html + +CG搜搜 Unity3d 每日Unity3d插件免费更新 更有VIP资源! + +CGSOSO 主打游戏开发,影视设计等CG资源素材。 + +插件如若商用,请务必官网购买! + +daily assets update for try. + +U should buy the asset from home store if u use it in your project! +*/ + +using UnityEngine; +using UnityEngine.Events; + +namespace MS +{ + public class Popup : MonoBehaviour + { + public static Popup current; + + [Header("Anim Setting")] + public Animator animator; + + public AnimationClip openClip; + + public AnimationClip closeClip; + + [Header("Popup Setting")] + public bool isOpen; + + public bool closeOnEsc; + + private bool isPlaying; + + public UnityEvent onClose; + + public UnityEvent onOpen; + public GameObject ChooseModePanel; + public void isTimerSetter(bool isTimer) + { + //GamePlayManager.isTimerLevel = isTimer; + } + + private void Start() + { + AnimationEvent animationEvent = new AnimationEvent(); + animationEvent.functionName = "onStopAnim"; + animationEvent.time = openClip.length; + openClip.AddEvent(animationEvent); + AnimationEvent animationEvent2 = new AnimationEvent(); + animationEvent2.functionName = "onStopAnim"; + animationEvent2.time = openClip.length; + closeClip.AddEvent(animationEvent2); + if (isOpen) + { + Open(); + } + else + { + Close(); + } + } + + [ContextMenu("Open")] + public void Open(bool onEnd = false) + { + if (!isPlaying && !isOpen) + { + current = this; + isOpen = true; + isPlaying = true; + animator.Play(openClip.name); + if (onEnd) + { + onOpen.Invoke(); + } + } + } + + [ContextMenu("Close")] + public void Close(bool onEnd = false) + { + if (!isPlaying && isOpen) + { + isPlaying = true; + animator.Play(closeClip.name); + isOpen = false; + if (onEnd) + { + onClose.Invoke(); + } + } + } + + [ContextMenu("Open")] + public void Open() + { + Open(onEnd: false); + } + + [ContextMenu("Close")] + public void Close() + { + Close(onEnd: false); + } + + public void onStopAnim() + { + isPlaying = false; + } + } +} diff --git a/Assets/Scripts/Popup.cs.meta b/Assets/Scripts/Popup.cs.meta new file mode 100644 index 00000000..60e7eee8 --- /dev/null +++ b/Assets/Scripts/Popup.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: df3ac59bdfef626ba9cf312eb790f208 +timeCreated: 1613767614 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF.asset b/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF.asset index c7b0771e..39628f9c 100644 --- a/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF.asset +++ b/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF.asset @@ -2,43 +2,85 @@ %TAG !u! tag:unity3d.com,2011: --- !u!21 &2180264 Material: - serializedVersion: 6 + serializedVersion: 8 m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_Name: LiberationSans SDF Material - m_Shader: {fileID: 4800000, guid: fe393ace9b354375a9cb14cdbbc28be4, type: 3} - m_ShaderKeywords: + m_Shader: {fileID: 4800000, guid: 68e6db2ebdc24f95958faec2be5558d6, type: 3} + m_Parent: {fileID: 0} + m_ModifiedSerializedProperties: 0 + m_ValidKeywords: [] + m_InvalidKeywords: [] m_LightmapFlags: 1 m_EnableInstancingVariants: 0 m_DoubleSidedGI: 0 m_CustomRenderQueue: -1 stringTagMap: {} disabledShaderPasses: [] + m_LockedProperties: m_SavedProperties: serializedVersion: 3 m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _Cube: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _FaceTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} - _MainTex: m_Texture: {fileID: 28684132378477856} m_Scale: {x: 1, y: 1} m_Offset: {x: 0, y: 0} + - _OutlineTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Ints: [] m_Floats: + - _Ambient: 0.5 + - _Bevel: 0.5 + - _BevelClamp: 0 + - _BevelOffset: 0 + - _BevelRoundness: 0 + - _BevelWidth: 0 + - _BumpFace: 0 + - _BumpOutline: 0 - _ColorMask: 15 + - _CullMode: 0 + - _Diffuse: 0.5 - _FaceDilate: 0 + - _FaceUVSpeedX: 0 + - _FaceUVSpeedY: 0 + - _GlowInner: 0.05 + - _GlowOffset: 0 + - _GlowOuter: 0.05 + - _GlowPower: 0.75 - _GradientScale: 10 + - _LightAngle: 3.1416 - _MaskSoftnessX: 0 - _MaskSoftnessY: 0 - _OutlineSoftness: 0 + - _OutlineUVSpeedX: 0 + - _OutlineUVSpeedY: 0 - _OutlineWidth: 0 - _PerspectiveFilter: 0.875 + - _Reflectivity: 10 - _ScaleRatioA: 0.9 - - _ScaleRatioB: 1 + - _ScaleRatioB: 0.73125 - _ScaleRatioC: 0.73125 - _ScaleX: 1 - _ScaleY: 1 - _ShaderFlags: 0 - _Sharpness: 0 + - _SpecularPower: 2 - _Stencil: 0 - _StencilComp: 8 - _StencilOp: 0 @@ -56,9 +98,16 @@ Material: - _WeightNormal: 0 m_Colors: - _ClipRect: {r: -32767, g: -32767, b: 32767, a: 32767} + - _EnvMatrixRotation: {r: 0, g: 0, b: 0, a: 0} - _FaceColor: {r: 1, g: 1, b: 1, a: 1} + - _GlowColor: {r: 0, g: 1, b: 0, a: 0.5} + - _MaskCoord: {r: 0, g: 0, b: 32767, a: 32767} - _OutlineColor: {r: 0, g: 0, b: 0, a: 1} + - _ReflectFaceColor: {r: 0, g: 0, b: 0, a: 1} + - _ReflectOutlineColor: {r: 0, g: 0, b: 0, a: 1} + - _SpecularColor: {r: 1, g: 1, b: 1, a: 1} - _UnderlayColor: {r: 0, g: 0, b: 0, a: 0.5} + m_BuildTextureStacks: [] --- !u!114 &11400000 MonoBehaviour: m_ObjectHideFlags: 0 @@ -73,18 +122,19 @@ MonoBehaviour: m_EditorClassIdentifier: hashCode: 231247347 material: {fileID: 2180264} - materialHashCode: -1183942120 + materialHashCode: 198912371 m_Version: 1.1.0 m_SourceFontFileGUID: e3265ab4bf004d28a9537516768c1c75 - m_SourceFontFile_EditorRef: {fileID: 12800000, guid: e3265ab4bf004d28a9537516768c1c75, - type: 3} + m_SourceFontFile_EditorRef: {fileID: 12800000, guid: e3265ab4bf004d28a9537516768c1c75, type: 3} m_SourceFontFile: {fileID: 0} m_AtlasPopulationMode: 0 m_FaceInfo: + m_FaceIndex: 0 m_FamilyName: Liberation Sans m_StyleName: Regular m_PointSize: 86 m_Scale: 1 + m_UnitsPerEM: 0 m_LineHeight: 98.8916 m_AscentLine: 77.853516 m_CapLine: 59 @@ -115,6 +165,7 @@ MonoBehaviour: m_Height: 0 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 4 m_Metrics: m_Width: 9 @@ -129,6 +180,7 @@ MonoBehaviour: m_Height: 59 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 5 m_Metrics: m_Width: 25 @@ -143,6 +195,7 @@ MonoBehaviour: m_Height: 19 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 6 m_Metrics: m_Width: 48 @@ -157,6 +210,7 @@ MonoBehaviour: m_Height: 59 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 7 m_Metrics: m_Width: 47 @@ -171,6 +225,7 @@ MonoBehaviour: m_Height: 70 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 8 m_Metrics: m_Width: 70 @@ -185,6 +240,7 @@ MonoBehaviour: m_Height: 61 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 9 m_Metrics: m_Width: 53 @@ -199,6 +255,7 @@ MonoBehaviour: m_Height: 61 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 10 m_Metrics: m_Width: 8 @@ -213,6 +270,7 @@ MonoBehaviour: m_Height: 19 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 11 m_Metrics: m_Width: 24 @@ -227,6 +285,7 @@ MonoBehaviour: m_Height: 80 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 12 m_Metrics: m_Width: 24 @@ -241,6 +300,7 @@ MonoBehaviour: m_Height: 80 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 13 m_Metrics: m_Width: 31 @@ -255,6 +315,7 @@ MonoBehaviour: m_Height: 30 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 14 m_Metrics: m_Width: 42 @@ -269,6 +330,7 @@ MonoBehaviour: m_Height: 43 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 15 m_Metrics: m_Width: 10 @@ -283,6 +345,7 @@ MonoBehaviour: m_Height: 20 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 16 m_Metrics: m_Width: 23 @@ -297,6 +360,7 @@ MonoBehaviour: m_Height: 7 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 17 m_Metrics: m_Width: 10 @@ -311,6 +375,7 @@ MonoBehaviour: m_Height: 9 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 18 m_Metrics: m_Width: 24 @@ -325,6 +390,7 @@ MonoBehaviour: m_Height: 63 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 19 m_Metrics: m_Width: 42 @@ -339,6 +405,7 @@ MonoBehaviour: m_Height: 61 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 20 m_Metrics: m_Width: 38 @@ -353,6 +420,7 @@ MonoBehaviour: m_Height: 59 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 21 m_Metrics: m_Width: 40 @@ -367,6 +435,7 @@ MonoBehaviour: m_Height: 60 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 22 m_Metrics: m_Width: 42 @@ -381,6 +450,7 @@ MonoBehaviour: m_Height: 61 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 23 m_Metrics: m_Width: 45 @@ -395,6 +465,7 @@ MonoBehaviour: m_Height: 59 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 24 m_Metrics: m_Width: 42 @@ -409,6 +480,7 @@ MonoBehaviour: m_Height: 60 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 25 m_Metrics: m_Width: 41 @@ -423,6 +495,7 @@ MonoBehaviour: m_Height: 61 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 26 m_Metrics: m_Width: 40 @@ -437,6 +510,7 @@ MonoBehaviour: m_Height: 59 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 27 m_Metrics: m_Width: 42 @@ -451,6 +525,7 @@ MonoBehaviour: m_Height: 61 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 28 m_Metrics: m_Width: 40 @@ -465,6 +540,7 @@ MonoBehaviour: m_Height: 61 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 29 m_Metrics: m_Width: 10 @@ -479,6 +555,7 @@ MonoBehaviour: m_Height: 45 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 30 m_Metrics: m_Width: 10 @@ -493,6 +570,7 @@ MonoBehaviour: m_Height: 57 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 31 m_Metrics: m_Width: 42 @@ -507,6 +585,7 @@ MonoBehaviour: m_Height: 43 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 32 m_Metrics: m_Width: 42 @@ -521,6 +600,7 @@ MonoBehaviour: m_Height: 29 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 33 m_Metrics: m_Width: 42 @@ -535,6 +615,7 @@ MonoBehaviour: m_Height: 43 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 34 m_Metrics: m_Width: 42 @@ -549,6 +630,7 @@ MonoBehaviour: m_Height: 60 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 35 m_Metrics: m_Width: 74 @@ -563,6 +645,7 @@ MonoBehaviour: m_Height: 74 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 36 m_Metrics: m_Width: 57 @@ -577,6 +660,7 @@ MonoBehaviour: m_Height: 59 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 37 m_Metrics: m_Width: 46 @@ -591,6 +675,7 @@ MonoBehaviour: m_Height: 59 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 38 m_Metrics: m_Width: 55 @@ -605,6 +690,7 @@ MonoBehaviour: m_Height: 61 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 39 m_Metrics: m_Width: 51 @@ -619,6 +705,7 @@ MonoBehaviour: m_Height: 59 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 40 m_Metrics: m_Width: 47 @@ -633,6 +720,7 @@ MonoBehaviour: m_Height: 59 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 41 m_Metrics: m_Width: 43 @@ -647,6 +735,7 @@ MonoBehaviour: m_Height: 59 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 42 m_Metrics: m_Width: 57 @@ -661,6 +750,7 @@ MonoBehaviour: m_Height: 61 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 43 m_Metrics: m_Width: 48 @@ -675,6 +765,7 @@ MonoBehaviour: m_Height: 59 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 44 m_Metrics: m_Width: 9 @@ -689,6 +780,7 @@ MonoBehaviour: m_Height: 59 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 45 m_Metrics: m_Width: 36 @@ -703,6 +795,7 @@ MonoBehaviour: m_Height: 60 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 46 m_Metrics: m_Width: 50 @@ -717,6 +810,7 @@ MonoBehaviour: m_Height: 59 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 47 m_Metrics: m_Width: 39 @@ -731,6 +825,7 @@ MonoBehaviour: m_Height: 59 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 48 m_Metrics: m_Width: 59 @@ -745,6 +840,7 @@ MonoBehaviour: m_Height: 59 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 49 m_Metrics: m_Width: 48 @@ -759,6 +855,7 @@ MonoBehaviour: m_Height: 59 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 50 m_Metrics: m_Width: 59 @@ -773,6 +870,7 @@ MonoBehaviour: m_Height: 61 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 51 m_Metrics: m_Width: 46 @@ -787,6 +885,7 @@ MonoBehaviour: m_Height: 59 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 52 m_Metrics: m_Width: 59 @@ -801,6 +900,7 @@ MonoBehaviour: m_Height: 76 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 53 m_Metrics: m_Width: 52 @@ -815,6 +915,7 @@ MonoBehaviour: m_Height: 59 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 54 m_Metrics: m_Width: 51 @@ -829,6 +930,7 @@ MonoBehaviour: m_Height: 61 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 55 m_Metrics: m_Width: 50 @@ -843,6 +945,7 @@ MonoBehaviour: m_Height: 59 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 56 m_Metrics: m_Width: 50 @@ -857,6 +960,7 @@ MonoBehaviour: m_Height: 60 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 57 m_Metrics: m_Width: 57 @@ -871,6 +975,7 @@ MonoBehaviour: m_Height: 59 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 58 m_Metrics: m_Width: 85 @@ -885,6 +990,7 @@ MonoBehaviour: m_Height: 59 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 59 m_Metrics: m_Width: 56 @@ -899,6 +1005,7 @@ MonoBehaviour: m_Height: 59 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 60 m_Metrics: m_Width: 54 @@ -913,6 +1020,7 @@ MonoBehaviour: m_Height: 59 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 61 m_Metrics: m_Width: 49 @@ -927,6 +1035,7 @@ MonoBehaviour: m_Height: 59 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 62 m_Metrics: m_Width: 18 @@ -941,6 +1050,7 @@ MonoBehaviour: m_Height: 80 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 63 m_Metrics: m_Width: 24 @@ -955,6 +1065,7 @@ MonoBehaviour: m_Height: 63 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 64 m_Metrics: m_Width: 18 @@ -969,6 +1080,7 @@ MonoBehaviour: m_Height: 80 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 65 m_Metrics: m_Width: 38 @@ -983,6 +1095,7 @@ MonoBehaviour: m_Height: 31 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 66 m_Metrics: m_Width: 51 @@ -997,6 +1110,7 @@ MonoBehaviour: m_Height: 6 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 67 m_Metrics: m_Width: 19 @@ -1011,6 +1125,7 @@ MonoBehaviour: m_Height: 13 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 68 m_Metrics: m_Width: 45 @@ -1025,6 +1140,7 @@ MonoBehaviour: m_Height: 47 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 69 m_Metrics: m_Width: 40 @@ -1039,6 +1155,7 @@ MonoBehaviour: m_Height: 63 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 70 m_Metrics: m_Width: 38 @@ -1053,6 +1170,7 @@ MonoBehaviour: m_Height: 47 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 71 m_Metrics: m_Width: 40 @@ -1067,6 +1185,7 @@ MonoBehaviour: m_Height: 63 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 72 m_Metrics: m_Width: 42 @@ -1081,6 +1200,7 @@ MonoBehaviour: m_Height: 47 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 73 m_Metrics: m_Width: 25 @@ -1095,6 +1215,7 @@ MonoBehaviour: m_Height: 62 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 74 m_Metrics: m_Width: 40 @@ -1109,6 +1230,7 @@ MonoBehaviour: m_Height: 64 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 75 m_Metrics: m_Width: 38 @@ -1123,6 +1245,7 @@ MonoBehaviour: m_Height: 62 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 76 m_Metrics: m_Width: 9 @@ -1137,6 +1260,7 @@ MonoBehaviour: m_Height: 62 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 77 m_Metrics: m_Width: 17 @@ -1151,6 +1275,7 @@ MonoBehaviour: m_Height: 80 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 78 m_Metrics: m_Width: 40 @@ -1165,6 +1290,7 @@ MonoBehaviour: m_Height: 62 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 79 m_Metrics: m_Width: 9 @@ -1179,6 +1305,7 @@ MonoBehaviour: m_Height: 62 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 80 m_Metrics: m_Width: 64 @@ -1193,6 +1320,7 @@ MonoBehaviour: m_Height: 46 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 81 m_Metrics: m_Width: 38 @@ -1207,6 +1335,7 @@ MonoBehaviour: m_Height: 46 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 82 m_Metrics: m_Width: 42 @@ -1221,6 +1350,7 @@ MonoBehaviour: m_Height: 47 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 83 m_Metrics: m_Width: 40 @@ -1235,6 +1365,7 @@ MonoBehaviour: m_Height: 64 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 84 m_Metrics: m_Width: 40 @@ -1249,6 +1380,7 @@ MonoBehaviour: m_Height: 64 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 85 m_Metrics: m_Width: 23 @@ -1263,6 +1395,7 @@ MonoBehaviour: m_Height: 46 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 86 m_Metrics: m_Width: 38 @@ -1277,6 +1410,7 @@ MonoBehaviour: m_Height: 47 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 87 m_Metrics: m_Width: 23 @@ -1291,6 +1425,7 @@ MonoBehaviour: m_Height: 56 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 88 m_Metrics: m_Width: 38 @@ -1305,6 +1440,7 @@ MonoBehaviour: m_Height: 46 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 89 m_Metrics: m_Width: 43 @@ -1319,6 +1455,7 @@ MonoBehaviour: m_Height: 45 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 90 m_Metrics: m_Width: 63 @@ -1333,6 +1470,7 @@ MonoBehaviour: m_Height: 45 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 91 m_Metrics: m_Width: 43 @@ -1347,6 +1485,7 @@ MonoBehaviour: m_Height: 45 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 92 m_Metrics: m_Width: 41 @@ -1361,6 +1500,7 @@ MonoBehaviour: m_Height: 63 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 93 m_Metrics: m_Width: 35 @@ -1375,6 +1515,7 @@ MonoBehaviour: m_Height: 45 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 94 m_Metrics: m_Width: 27 @@ -1389,6 +1530,7 @@ MonoBehaviour: m_Height: 80 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 95 m_Metrics: m_Width: 8 @@ -1403,6 +1545,7 @@ MonoBehaviour: m_Height: 80 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 96 m_Metrics: m_Width: 27 @@ -1417,6 +1560,7 @@ MonoBehaviour: m_Height: 80 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 97 m_Metrics: m_Width: 44 @@ -1431,6 +1575,7 @@ MonoBehaviour: m_Height: 11 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 98 m_Metrics: m_Width: 0 @@ -1445,6 +1590,7 @@ MonoBehaviour: m_Height: 0 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 99 m_Metrics: m_Width: 10 @@ -1459,6 +1605,7 @@ MonoBehaviour: m_Height: 59 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 100 m_Metrics: m_Width: 38 @@ -1473,6 +1620,7 @@ MonoBehaviour: m_Height: 60 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 101 m_Metrics: m_Width: 45 @@ -1487,6 +1635,7 @@ MonoBehaviour: m_Height: 60 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 102 m_Metrics: m_Width: 40 @@ -1501,6 +1650,7 @@ MonoBehaviour: m_Height: 40 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 103 m_Metrics: m_Width: 50 @@ -1515,6 +1665,7 @@ MonoBehaviour: m_Height: 59 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 104 m_Metrics: m_Width: 8 @@ -1529,6 +1680,7 @@ MonoBehaviour: m_Height: 80 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 105 m_Metrics: m_Width: 40 @@ -1543,6 +1695,7 @@ MonoBehaviour: m_Height: 69 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 106 m_Metrics: m_Width: 25 @@ -1557,6 +1710,7 @@ MonoBehaviour: m_Height: 8 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 107 m_Metrics: m_Width: 61 @@ -1571,6 +1725,7 @@ MonoBehaviour: m_Height: 61 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 108 m_Metrics: m_Width: 32 @@ -1585,6 +1740,7 @@ MonoBehaviour: m_Height: 33 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 109 m_Metrics: m_Width: 42 @@ -1599,6 +1755,7 @@ MonoBehaviour: m_Height: 34 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 110 m_Metrics: m_Width: 42 @@ -1613,6 +1770,7 @@ MonoBehaviour: m_Height: 24 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 111 m_Metrics: m_Width: 23 @@ -1627,6 +1785,7 @@ MonoBehaviour: m_Height: 7 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 112 m_Metrics: m_Width: 61 @@ -1641,6 +1800,7 @@ MonoBehaviour: m_Height: 61 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 113 m_Metrics: m_Width: 50 @@ -1655,6 +1815,7 @@ MonoBehaviour: m_Height: 4 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 114 m_Metrics: m_Width: 24 @@ -1669,6 +1830,7 @@ MonoBehaviour: m_Height: 24 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 115 m_Metrics: m_Width: 43 @@ -1683,6 +1845,7 @@ MonoBehaviour: m_Height: 52 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 116 m_Metrics: m_Width: 27 @@ -1697,6 +1860,7 @@ MonoBehaviour: m_Height: 36 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 117 m_Metrics: m_Width: 27 @@ -1711,6 +1875,7 @@ MonoBehaviour: m_Height: 37 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 118 m_Metrics: m_Width: 19 @@ -1725,6 +1890,7 @@ MonoBehaviour: m_Height: 13 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 119 m_Metrics: m_Width: 43 @@ -1739,6 +1905,7 @@ MonoBehaviour: m_Height: 63 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 120 m_Metrics: m_Width: 40 @@ -1753,6 +1920,7 @@ MonoBehaviour: m_Height: 70 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 121 m_Metrics: m_Width: 10 @@ -1767,6 +1935,7 @@ MonoBehaviour: m_Height: 10 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 122 m_Metrics: m_Width: 16 @@ -1781,6 +1950,7 @@ MonoBehaviour: m_Height: 18 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 123 m_Metrics: m_Width: 24 @@ -1795,6 +1965,7 @@ MonoBehaviour: m_Height: 35 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 124 m_Metrics: m_Width: 29 @@ -1809,6 +1980,7 @@ MonoBehaviour: m_Height: 33 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 125 m_Metrics: m_Width: 42 @@ -1823,6 +1995,7 @@ MonoBehaviour: m_Height: 34 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 126 m_Metrics: m_Width: 67 @@ -1837,6 +2010,7 @@ MonoBehaviour: m_Height: 59 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 127 m_Metrics: m_Width: 68 @@ -1851,6 +2025,7 @@ MonoBehaviour: m_Height: 59 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 128 m_Metrics: m_Width: 66 @@ -1865,6 +2040,7 @@ MonoBehaviour: m_Height: 60 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 129 m_Metrics: m_Width: 43 @@ -1879,6 +2055,7 @@ MonoBehaviour: m_Height: 60 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 130 m_Metrics: m_Width: 57 @@ -1893,6 +2070,7 @@ MonoBehaviour: m_Height: 74 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 131 m_Metrics: m_Width: 57 @@ -1907,6 +2085,7 @@ MonoBehaviour: m_Height: 74 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 132 m_Metrics: m_Width: 57 @@ -1921,6 +2100,7 @@ MonoBehaviour: m_Height: 75 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 133 m_Metrics: m_Width: 57 @@ -1935,6 +2115,7 @@ MonoBehaviour: m_Height: 75 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 134 m_Metrics: m_Width: 57 @@ -1949,6 +2130,7 @@ MonoBehaviour: m_Height: 72 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 135 m_Metrics: m_Width: 57 @@ -1963,6 +2145,7 @@ MonoBehaviour: m_Height: 75 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 136 m_Metrics: m_Width: 82 @@ -1977,6 +2160,7 @@ MonoBehaviour: m_Height: 59 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 137 m_Metrics: m_Width: 55 @@ -1991,6 +2175,7 @@ MonoBehaviour: m_Height: 78 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 138 m_Metrics: m_Width: 47 @@ -2005,6 +2190,7 @@ MonoBehaviour: m_Height: 74 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 139 m_Metrics: m_Width: 47 @@ -2019,6 +2205,7 @@ MonoBehaviour: m_Height: 74 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 140 m_Metrics: m_Width: 47 @@ -2033,6 +2220,7 @@ MonoBehaviour: m_Height: 75 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 141 m_Metrics: m_Width: 47 @@ -2047,6 +2235,7 @@ MonoBehaviour: m_Height: 72 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 142 m_Metrics: m_Width: 19 @@ -2061,6 +2250,7 @@ MonoBehaviour: m_Height: 74 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 143 m_Metrics: m_Width: 19 @@ -2075,6 +2265,7 @@ MonoBehaviour: m_Height: 74 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 144 m_Metrics: m_Width: 28 @@ -2089,6 +2280,7 @@ MonoBehaviour: m_Height: 75 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 145 m_Metrics: m_Width: 25 @@ -2103,6 +2295,7 @@ MonoBehaviour: m_Height: 72 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 146 m_Metrics: m_Width: 58 @@ -2117,6 +2310,7 @@ MonoBehaviour: m_Height: 59 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 147 m_Metrics: m_Width: 48 @@ -2131,6 +2325,7 @@ MonoBehaviour: m_Height: 75 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 148 m_Metrics: m_Width: 59 @@ -2145,6 +2340,7 @@ MonoBehaviour: m_Height: 75 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 149 m_Metrics: m_Width: 59 @@ -2159,6 +2355,7 @@ MonoBehaviour: m_Height: 75 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 150 m_Metrics: m_Width: 59 @@ -2173,6 +2370,7 @@ MonoBehaviour: m_Height: 76 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 151 m_Metrics: m_Width: 59 @@ -2187,6 +2385,7 @@ MonoBehaviour: m_Height: 76 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 152 m_Metrics: m_Width: 59 @@ -2201,6 +2400,7 @@ MonoBehaviour: m_Height: 73 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 153 m_Metrics: m_Width: 40 @@ -2215,6 +2415,7 @@ MonoBehaviour: m_Height: 39 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 154 m_Metrics: m_Width: 63 @@ -2229,6 +2430,7 @@ MonoBehaviour: m_Height: 65 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 155 m_Metrics: m_Width: 50 @@ -2243,6 +2445,7 @@ MonoBehaviour: m_Height: 75 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 156 m_Metrics: m_Width: 50 @@ -2257,6 +2460,7 @@ MonoBehaviour: m_Height: 75 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 157 m_Metrics: m_Width: 50 @@ -2271,6 +2475,7 @@ MonoBehaviour: m_Height: 76 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 158 m_Metrics: m_Width: 50 @@ -2285,6 +2490,7 @@ MonoBehaviour: m_Height: 73 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 159 m_Metrics: m_Width: 54 @@ -2299,6 +2505,7 @@ MonoBehaviour: m_Height: 74 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 160 m_Metrics: m_Width: 46 @@ -2313,6 +2520,7 @@ MonoBehaviour: m_Height: 59 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 161 m_Metrics: m_Width: 44 @@ -2327,6 +2535,7 @@ MonoBehaviour: m_Height: 63 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 162 m_Metrics: m_Width: 45 @@ -2341,6 +2550,7 @@ MonoBehaviour: m_Height: 64 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 163 m_Metrics: m_Width: 45 @@ -2355,6 +2565,7 @@ MonoBehaviour: m_Height: 64 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 164 m_Metrics: m_Width: 45 @@ -2369,6 +2580,7 @@ MonoBehaviour: m_Height: 63 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 165 m_Metrics: m_Width: 45 @@ -2383,6 +2595,7 @@ MonoBehaviour: m_Height: 62 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 166 m_Metrics: m_Width: 45 @@ -2397,6 +2610,7 @@ MonoBehaviour: m_Height: 60 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 167 m_Metrics: m_Width: 45 @@ -2411,6 +2625,7 @@ MonoBehaviour: m_Height: 71 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 168 m_Metrics: m_Width: 71 @@ -2425,6 +2640,7 @@ MonoBehaviour: m_Height: 47 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 169 m_Metrics: m_Width: 38 @@ -2439,6 +2655,7 @@ MonoBehaviour: m_Height: 64 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 170 m_Metrics: m_Width: 42 @@ -2453,6 +2670,7 @@ MonoBehaviour: m_Height: 64 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 171 m_Metrics: m_Width: 42 @@ -2467,6 +2685,7 @@ MonoBehaviour: m_Height: 64 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 172 m_Metrics: m_Width: 42 @@ -2481,6 +2700,7 @@ MonoBehaviour: m_Height: 63 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 173 m_Metrics: m_Width: 42 @@ -2495,6 +2715,7 @@ MonoBehaviour: m_Height: 60 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 174 m_Metrics: m_Width: 19 @@ -2509,6 +2730,7 @@ MonoBehaviour: m_Height: 63 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 175 m_Metrics: m_Width: 19 @@ -2523,6 +2745,7 @@ MonoBehaviour: m_Height: 63 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 176 m_Metrics: m_Width: 29 @@ -2537,6 +2760,7 @@ MonoBehaviour: m_Height: 62 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 177 m_Metrics: m_Width: 25 @@ -2551,6 +2775,7 @@ MonoBehaviour: m_Height: 59 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 178 m_Metrics: m_Width: 42 @@ -2565,6 +2790,7 @@ MonoBehaviour: m_Height: 64 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 179 m_Metrics: m_Width: 38 @@ -2579,6 +2805,7 @@ MonoBehaviour: m_Height: 61 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 180 m_Metrics: m_Width: 42 @@ -2593,6 +2820,7 @@ MonoBehaviour: m_Height: 64 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 181 m_Metrics: m_Width: 42 @@ -2607,6 +2835,7 @@ MonoBehaviour: m_Height: 64 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 182 m_Metrics: m_Width: 42 @@ -2621,6 +2850,7 @@ MonoBehaviour: m_Height: 63 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 183 m_Metrics: m_Width: 42 @@ -2635,6 +2865,7 @@ MonoBehaviour: m_Height: 62 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 184 m_Metrics: m_Width: 42 @@ -2649,6 +2880,7 @@ MonoBehaviour: m_Height: 60 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 185 m_Metrics: m_Width: 43 @@ -2663,6 +2895,7 @@ MonoBehaviour: m_Height: 39 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 186 m_Metrics: m_Width: 50 @@ -2677,6 +2910,7 @@ MonoBehaviour: m_Height: 49 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 187 m_Metrics: m_Width: 38 @@ -2691,6 +2925,7 @@ MonoBehaviour: m_Height: 64 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 188 m_Metrics: m_Width: 38 @@ -2705,6 +2940,7 @@ MonoBehaviour: m_Height: 64 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 189 m_Metrics: m_Width: 38 @@ -2719,6 +2955,7 @@ MonoBehaviour: m_Height: 63 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 190 m_Metrics: m_Width: 38 @@ -2733,6 +2970,7 @@ MonoBehaviour: m_Height: 60 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 191 m_Metrics: m_Width: 41 @@ -2747,6 +2985,7 @@ MonoBehaviour: m_Height: 81 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 192 m_Metrics: m_Width: 40 @@ -2761,6 +3000,7 @@ MonoBehaviour: m_Height: 80 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 193 m_Metrics: m_Width: 41 @@ -2775,6 +3015,7 @@ MonoBehaviour: m_Height: 77 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 1997 m_Metrics: m_Width: 0 @@ -2789,6 +3030,7 @@ MonoBehaviour: m_Height: 0 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 1998 m_Metrics: m_Width: 0 @@ -2803,6 +3045,7 @@ MonoBehaviour: m_Height: 0 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 1999 m_Metrics: m_Width: 0 @@ -2817,6 +3060,7 @@ MonoBehaviour: m_Height: 0 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 2000 m_Metrics: m_Width: 0 @@ -2831,6 +3075,7 @@ MonoBehaviour: m_Height: 0 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 2001 m_Metrics: m_Width: 0 @@ -2845,6 +3090,7 @@ MonoBehaviour: m_Height: 0 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 2002 m_Metrics: m_Width: 0 @@ -2859,6 +3105,7 @@ MonoBehaviour: m_Height: 0 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 2003 m_Metrics: m_Width: 0 @@ -2873,6 +3120,7 @@ MonoBehaviour: m_Height: 0 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 2004 m_Metrics: m_Width: 0 @@ -2887,6 +3135,7 @@ MonoBehaviour: m_Height: 0 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 2005 m_Metrics: m_Width: 0 @@ -2901,6 +3150,7 @@ MonoBehaviour: m_Height: 0 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 2006 m_Metrics: m_Width: 0 @@ -2915,6 +3165,7 @@ MonoBehaviour: m_Height: 0 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 2007 m_Metrics: m_Width: 0 @@ -2929,6 +3180,7 @@ MonoBehaviour: m_Height: 0 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 2008 m_Metrics: m_Width: 0 @@ -2943,6 +3195,7 @@ MonoBehaviour: m_Height: 0 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 2009 m_Metrics: m_Width: 4 @@ -2957,6 +3210,7 @@ MonoBehaviour: m_Height: 65 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 2010 m_Metrics: m_Width: 20 @@ -2971,6 +3225,7 @@ MonoBehaviour: m_Height: 70 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 2011 m_Metrics: m_Width: 21 @@ -2985,6 +3240,7 @@ MonoBehaviour: m_Height: 70 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 2012 m_Metrics: m_Width: 21 @@ -2999,6 +3255,7 @@ MonoBehaviour: m_Height: 70 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 2013 m_Metrics: m_Width: 48 @@ -3013,6 +3270,7 @@ MonoBehaviour: m_Height: 6 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 2014 m_Metrics: m_Width: 48 @@ -3027,6 +3285,7 @@ MonoBehaviour: m_Height: 6 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 2015 m_Metrics: m_Width: 86 @@ -3041,6 +3300,7 @@ MonoBehaviour: m_Height: 6 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 2016 m_Metrics: m_Width: 86 @@ -3055,6 +3315,7 @@ MonoBehaviour: m_Height: 6 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 2017 m_Metrics: m_Width: 22 @@ -3069,6 +3330,7 @@ MonoBehaviour: m_Height: 62 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 2018 m_Metrics: m_Width: 51 @@ -3083,6 +3345,7 @@ MonoBehaviour: m_Height: 15 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 2019 m_Metrics: m_Width: 9 @@ -3097,6 +3360,7 @@ MonoBehaviour: m_Height: 19 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 2020 m_Metrics: m_Width: 9 @@ -3111,6 +3375,7 @@ MonoBehaviour: m_Height: 19 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 2021 m_Metrics: m_Width: 9 @@ -3125,6 +3390,7 @@ MonoBehaviour: m_Height: 19 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 2022 m_Metrics: m_Width: 9 @@ -3139,6 +3405,7 @@ MonoBehaviour: m_Height: 19 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 2023 m_Metrics: m_Width: 23 @@ -3153,6 +3420,7 @@ MonoBehaviour: m_Height: 19 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 2024 m_Metrics: m_Width: 23 @@ -3167,6 +3435,7 @@ MonoBehaviour: m_Height: 19 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 2025 m_Metrics: m_Width: 23 @@ -3181,6 +3450,7 @@ MonoBehaviour: m_Height: 19 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 2026 m_Metrics: m_Width: 22 @@ -3195,6 +3465,7 @@ MonoBehaviour: m_Height: 19 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 2027 m_Metrics: m_Width: 38 @@ -3209,6 +3480,7 @@ MonoBehaviour: m_Height: 68 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 2028 m_Metrics: m_Width: 38 @@ -3223,6 +3495,7 @@ MonoBehaviour: m_Height: 68 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 2029 m_Metrics: m_Width: 24 @@ -3237,6 +3510,7 @@ MonoBehaviour: m_Height: 23 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 2030 m_Metrics: m_Width: 64 @@ -3251,6 +3525,7 @@ MonoBehaviour: m_Height: 9 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 2031 m_Metrics: m_Width: 21 @@ -3265,6 +3540,7 @@ MonoBehaviour: m_Height: 63 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 2032 m_Metrics: m_Width: 21 @@ -3279,6 +3555,7 @@ MonoBehaviour: m_Height: 63 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 2033 m_Metrics: m_Width: 20 @@ -3293,6 +3570,7 @@ MonoBehaviour: m_Height: 70 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 2034 m_Metrics: m_Width: 20 @@ -3307,6 +3585,7 @@ MonoBehaviour: m_Height: 70 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 2035 m_Metrics: m_Width: 20 @@ -3321,6 +3600,7 @@ MonoBehaviour: m_Height: 70 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 2036 m_Metrics: m_Width: 0 @@ -3335,6 +3615,7 @@ MonoBehaviour: m_Height: 0 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 2037 m_Metrics: m_Width: 82 @@ -3349,6 +3630,7 @@ MonoBehaviour: m_Height: 61 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 2038 m_Metrics: m_Width: 12 @@ -3363,6 +3645,7 @@ MonoBehaviour: m_Height: 22 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 2039 m_Metrics: m_Width: 26 @@ -3377,6 +3660,7 @@ MonoBehaviour: m_Height: 22 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 2040 m_Metrics: m_Width: 35 @@ -3391,6 +3675,7 @@ MonoBehaviour: m_Height: 22 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 2041 m_Metrics: m_Width: 23 @@ -3405,6 +3690,7 @@ MonoBehaviour: m_Height: 34 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 2042 m_Metrics: m_Width: 23 @@ -3419,6 +3705,7 @@ MonoBehaviour: m_Height: 34 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 2043 m_Metrics: m_Width: 28 @@ -3433,6 +3720,7 @@ MonoBehaviour: m_Height: 59 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 2044 m_Metrics: m_Width: 35 @@ -3447,6 +3735,7 @@ MonoBehaviour: m_Height: 5 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 2045 m_Metrics: m_Width: 44 @@ -3461,6 +3750,7 @@ MonoBehaviour: m_Height: 59 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 2046 m_Metrics: m_Width: 10 @@ -3475,6 +3765,7 @@ MonoBehaviour: m_Height: 62 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 2047 m_Metrics: m_Width: 20 @@ -3489,6 +3780,7 @@ MonoBehaviour: m_Height: 70 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 2048 m_Metrics: m_Width: 20 @@ -3503,6 +3795,7 @@ MonoBehaviour: m_Height: 70 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 2049 m_Metrics: m_Width: 22 @@ -3517,6 +3810,7 @@ MonoBehaviour: m_Height: 70 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 2050 m_Metrics: m_Width: 22 @@ -3531,6 +3825,7 @@ MonoBehaviour: m_Height: 70 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 2051 m_Metrics: m_Width: 22 @@ -3545,6 +3840,7 @@ MonoBehaviour: m_Height: 70 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 2052 m_Metrics: m_Width: 20 @@ -3559,6 +3855,7 @@ MonoBehaviour: m_Height: 70 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 2075 m_Metrics: m_Width: 47 @@ -3573,6 +3870,7 @@ MonoBehaviour: m_Height: 61 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 2090 m_Metrics: m_Width: 70 @@ -3587,6 +3885,7 @@ MonoBehaviour: m_Height: 33 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 - m_Index: 2179 m_Metrics: m_Width: 52 @@ -3601,6 +3900,7 @@ MonoBehaviour: m_Height: 51 m_Scale: 1 m_AtlasIndex: 0 + m_ClassDefinitionType: 0 m_CharacterTable: - m_ElementType: 1 m_Unicode: 32 @@ -4605,6 +4905,8 @@ MonoBehaviour: m_AtlasTextures: - {fileID: 28684132378477856} m_AtlasTextureIndex: 0 + m_IsMultiAtlasTexturesEnabled: 0 + m_ClearDynamicDataOnBuild: 0 m_UsedGlyphRects: - m_X: 0 m_Y: 0 @@ -7791,15 +8093,21 @@ Texture2D: Hash: 00000000000000000000000000000000 m_ForcedFallbackFormat: 4 m_DownscaleFallback: 0 + m_IsAlphaChannelOptional: 0 serializedVersion: 2 m_Width: 1024 m_Height: 1024 m_CompleteImageSize: 1048576 + m_MipsStripped: 0 m_TextureFormat: 1 m_MipCount: 1 m_IsReadable: 0 + m_IsPreProcessed: 0 + m_IgnoreMipmapLimit: 0 + m_MipmapLimitGroupName: m_StreamingMipmaps: 0 m_StreamingMipmapsPriority: -92 + m_VTOnly: 0 m_AlphaIsTransparency: 0 m_ImageCount: 1 m_TextureDimension: 2 @@ -7813,9 +8121,11 @@ Texture2D: m_WrapW: 0 m_LightmapFormat: 0 m_ColorSpace: 0 + m_PlatformBlob: image data: 1048576 _typelessdata: 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040607090b0d0f101112121313131212100f0e0c0a08060603000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000407090a1313131313131313130e0d0b08030000000000000000000000000000000000000002070a0c0d1313131313131313130b0a0805000000000000000000000000000000000000000000000000000000000000050a0d0f10131313131313130e0d0b0803000000000000000000000000000000000000000000000004080a0a13131313131313131313131313131313131313131313131313131313131313131313131313131313130a09070400000000000000000000000000000000000000000006060606060600000000000000000000000000000000000000000000020507080c0f1112131211100c080806020000000000000000000000030607090d1011121312110e0a070604010000000000000000000000000000000000000000000000000000000000000000000000000606060606060000000000000000000000000000000000000000000000000000000000010507070c0f1112131312100c08080602000000000000000000000000000000000000000000000000000000000000000000030608091313131313120707050100000000000000000000000000000000000000000000000000000000000105070713131313130c0b09060100000000000000000000000000000000000000000000000000000000000306080913131313131207070501000000000000000000000000000000000000000000000000000000000105070713131313130c0b09060100000000000000000000000000000000000004080a0a0b0b0b0b0b0b0b07060401000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030607090b0d0f1111121313121211100f0d0a0807050200000000000000000000000000000000000000000000000000000000000000000003080c0e0e131313131313130f0e0c09040000000000000000000000000000000000000000000000000000000000000003070b0d0e131313131313130e0e0c0803000000000000000000000003080c0e0e131313131313130f0e0c09040000000000000000000000000000000000000000000000000000000000000003070b0d0e131313131313130e0e0c080300000000000000000000000000000000000000000000040613131313131313131312110e09040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000205070c10131315171a1c1d1e1e1f20201f1f1e1d1c1b19171513120f0b06060401000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050b101316172020202020202020201b1a18140f080100000000000000000000000000000000070e1317191a202020202020202020181715110c060000000000000000000000000000000000000000000000000000030a10161a1c1d202020202020201b1a18140f080100000000000000000000000000000000000000050b101416172020202020202020202020202020202020202020202020202020202020202020202020202020202020171614100b0500000000000000000000000000000106090b0c131313131313080705020000000000000000000000000000000002090e111414181c1e1f201f1e1c191514120e090300000000000000060b101213161a1d1e1f201e1d1b171413110d0701000000000000000000000000000000000000000000000000000000000000030608091313131313130b0a0805000000000000000000000000000000000000000000000002080d111314191c1e1f201f1e1c191514120e09030000000000000000000000000000000000000000000000000000000000040a0f12151520202020201f1413110d08020000000000000000000000000000000000000000000000000002080d1113142020202020191815120d060000000000000000000000000000000000000000000000000000040a0f12151520202020201f1413110d080200000000000000000000000000000000000000000000000002080d1113142020202020191815120d06000000000000000000000000000000050b10141617181818181818181413110d07010000000000000000000001030405060606060504040200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000104060b10121315171a1c1d1e1f1f201f1f1e1d1b19171514120e0906030000000000000000000000000000000000000000000000000000000001090f14181a1b202020202020201c1b191510090200000000000000000000000000000000000000000000000000000001080e1317191a202020202020201b1a18140f09010000000000000001090f14181a1b202020202020201c1b191510090200000000000000000000000000000000000000000000000000000001080e1317191a202020202020201b1a18140f0901000000000000000000000000000000000001070c10132020202020202020201f1d1a150f0800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000104090e1214181c1f20222426282a2a2b2c2c2c2c2c2b2a2927262422201f1c171413110d0705020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080f161c2022232d2d2d2d2d2d2d2d2d282724201a130b0200000000000000000000000000010a12191f2326272d2d2d2d2d2d2d2d2d2424211d171009000000000000000000000000000000000000000000000000040d151c2126292a2d2d2d2d2d2d2d2727241f1a130b0200000000000000000000000000000000000810171c2023242d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2423201c161008000000000000000000000000060d1215181920202020201f1514120e090300000000000000000000000002080e141a1e202125292a2b2c2c2b292622211e1a150e0903000000020a11171c1f2023272a2b2c2c2b2a282420201d18130c07000000000000000000000000000000000000000000000000000000030a0f121515202020202020181715110c060000000000000000000000000000000000000002080d13191e202125292b2c2d2c2b292622211e1a150e09030000000000000000000000000000000000000000000000000000060e151b1f21222c2d2d2d2d2c21201d19130c040000000000000000000000000000000000000000000000050c13191d20212d2d2d2d2d2524221e181109010000000000000000000000000000000000000000000000060e151b1f21222c2d2d2d2d2c21201d19130c0400000000000000000000000000000000000000000000050c13191d20212d2d2d2d2d2524221e181109010000000000000000000000000810171c2023242525252525252520201d18130c0400000000030607090b0e0f1112121313121211100f0d0a0807050200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001070d1113171c1f20222426292a2b2b2c2c2c2b2b2a28262422211e1a1312100c0600000000000000000000000000000000000000000000000000030b131a202427282d2d2d2d2d2d2d292825211b140c0300000000000000000000000000000000000000000000000000020b12191f2326272d2d2d2d2d2d2d282724201a130b030000000000030b131a202427282d2d2d2d2d2d2d292825211b140c0300000000000000000000000000000000000000000000000000020b12191f2326272d2d2d2d2d2d2d282724201a130b03000000000000000000000000000000030b12181c1f2d2d2d2d2d2d2d2d2c2c2a2620191209000000000000000000000000000000000000000000000000000000000000000000000000000000000001070d11141a1e2123282c2d2f31333537373838393939383837353433302e2d2b282221201d1814120e0904000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008111921272c2f303939393939393939393433302b251d140b010000000000000000000000000a141c242a2f323339393939393939393931302d28221b120900000000000000000000000000000000000000000000030d161f262d323536393939393939393433302b251d140b0000000000000000000000000000000008111a22282d30313939393939393939393939393939393939393939393939393939393939393939393939393939393939302f2c28211a1108000000000000000000010911181e2224252d2d2d2d2d2c22211e1a140d0600000000000000000000050d14191f252a2d2e3235373839383736322f2e2b26201a150e0600070c141c23282b2d303336383939383734312d2c29241d18120b03000000000000000000000000000000000000000000000000060e151a1f21222c2d2d2d2d2d2424211d1710090000000000000000000000000000000000050c13191e252a2d2e3235373939393836332e2d2b261f1a150e0600000000000000000000000000000000000000000000000006101820262b2e2f3939393939382e2d29251e160e04000000000000000000000000000000000000000000050e161e252a2d2e393939393932312e29231b13090000000000000000000000000000000000000000000006101820262b2e2f3939393939382e2d29251e160e040000000000000000000000000000000000000000050e161e252a2d2e393939393932312e29231b1309000000000000000000000008121a22282d3031313131313131312d2c29241d160d0405060b10121316181a1c1d1f1f20201f1f1e1d1b19171514120e0906030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003090e13181d2023282b2d2f3133353737383939393837373533312e2d2a26201f1c17110d0802000000000000000000000000000000000000000000010b151d252b303435393939393939393534312c261e150c000000000000000000000000000000000000000000000000000b141d242b303334393939393939393534302b251d150b01000000010b151d252b303435393939393939393534312c261e150c000000000000000000000000000000000000000000000000000b141d242b303334393939393939393534302b251d150b0100000000000000000000000000030d151d23292c3939393939393939393836312b241b1208000000000000000000000000000000000000000000000000000000000000000000000000000003090e13181d20262a2d2e34383a3c3e40424344454546464645454342413f3d3b3938332d2d2c2924201e1a14100c070100000000000000000000000000000000000000000000000000000000000000000000000000000000000000050f19232b33383c3d46464646464646464641403c362f261d1308000000000000000000000007121c262e353b3f404646464646464646463e3d39342c241b10060000000000000000000000000000000000000000000a151f2831383e42434646464646464641403c362f261d0f05000000000000000000000000000005101a232c33393c3d46464646464646464646464646464646464646464646464646464646464646464646464646464646463d3c38332c231a1005000000000000000009131b23292e31323939393939392e2d2a261f180f060000000000000000080e171e252a30363a3b3f424445464544433f3b3a37312b2620180f0b12181e262e34383a3c40434445464544413d3a39352f28231c150c050000000000000000000000000000000000000000000006101820262b2e2f39393939393931302d28221a1209000000000000000000000000000000070e161e252a3036393a3f424445464645433f3b3a37312b2620180f0900000000000000000000000000000000000000000000040e18222a31373a3c4646464646453a3935302820160c0200000000000000000000000000000000000000020c1620283036394646464646463f3e3a342d251b11060000000000000000000000000000000000000000040e18222a31373a3c4646464646453a3935302820160c02000000000000000000000000000000000000020c1620283036394646464646463f3e3a342d251b110600000000000000000005101a242c33393c3d3e3e3e3e3e3e3e3a39352f281f160b1113171c1f20222527292a2b2c2c2d2c2b2b2a28262422211e1a1312100c06000000000000000000000000000000000000000000000000000000000000000000000000000000000000040a0f151a1d24292c2e34383a3c3e404244444546464545444342403d3b3a36312d2c28231c19130d08020000000000000000000000000000000000000009131d272f373c40414646464646464642413d3730271e0e050000000000000000000000000000000000000000000000030d1d262e363c3f414646464646464641403c372f271d130900000009131d272f373c40414646464646464642413d3730271e0e050000000000000000000000000000000000000000000000030d1d262e363c3f414646464646464641403c372f271d1309000000000000000000000000010b151f272f343846464646464646464645423d352d24190f04000000000000000000000000000000000000000000000000000000000000000000000001070c141a1d24292c31363a3b404546484a4d4f505151525353525251504f4e4c4a4846443f3d3a39352f2d2a251f1d18120e090300000000000000000000000000000000000000000000000000000000000000000000000000000000000b16212b353d44484a5353535353535353534e4c4841382f251a0f03000000000000000000020e19242e3840474b4d5353535353535353534b49453e362c22170c000000000000000000000000000000000000000005101c26313a43494e50535353535353534e4c4841382f21170d03000000000000000000000000000b17222c363e44494a53535353535353535353535353535353535353535353535353535353535353535353535353535353534a48443e352c21160b0000000000000006111b252d343a3e3f4646464646463b3a36312921180b0200000000000008111a202930363b4246474b4f51525352514f4c4847423c37312a211b151c232830383f4446494d5051525351504e4a4745403a342e271e170e050000000000000000000000000000000000000000030e18222a31373a3c4646464646463e3d39342c241a0e0500000000000000000000000000071019202830363a4146474c4f51525352514f4c4847423c37312a211b12090100000000000000000000000000000000000000000a15202a343c4347485353535353524746413a32281e13080000000000000000000000000000000000000008131e28323a41465353535353534c4a463f372d23180d01000000000000000000000000000000000000000a15202a343c4347485353535353524746413a32281e130800000000000000000000000000000000000008131e28323a41465353535353534c4a463f372d23180d0100000000000000000b17222c363e44494a4b4b4b4b4b4b4b4745403a31281d191d2023282b2d2f3234363738393939393837373533312e2d2a26201f1c17110d08020000000000000000000000000000000000000000000000000000000000000000000000000000070c151b20262b2f35393a3f4446484a4d4f5051525253525251504e4c4a4846423d3a38342e29251e19140d050000000000000000000000000000000000030f1a252f3941484d4e535353535353534f4d4942393020170d02000000000000000000000000000000000000000000010b151f2e3840474c4d535353535353534e4d4841392f251a0f0300030f1a252f3941484d4e535353535353534f4d4942393020170d02000000000000000000000000000000000000000000010b151f2e3840474c4d535353535353534e4d4841392f251a0f03000000000000000000000007121d2731394045535353535353535353524e473f352b20150900000000000000000000000000000000000000000000000000000000000000000000030b12181f252a2f35393b4246484b51535557595b5d5d5e5f5f5f5f5f5e5d5c5a59575553504a4a4745413b3a36302c29241d1a140f0a03000000000000000000000000000000000000000000000000000000000000000000000000000004101c27333d474f54566060606060606060605b58534a41362b20140400000000000000000007131f2a35404a52575a606060606060606060575550483e34281d1101000000000000000000000000000000000000000a16212d38434c545a5d606060606060605a58534a4133291f140900000000000000000000000004101c28333e48505557606060606060606060606060606060606060606060606060606060606060606060606060606060606057554f473e33281c10040000000000010d18232d373f464a4c5353535353524846423b33291d140a000000000008111a232c323b41464d5254585c5d5e5f5f5e5c5955534d47423c332d241e272e343e424a5053565a5d5e5f5f5e5d5b5753514b444039302920170f05000000000000000000000000000000000000000a15202a343c4347485353535353534b49453e362c20170d020000000000000000000000071119222b323a41464c5254585c5e5f605f5e5c5955534d47423c332d241b130900000000000000000000000000000000000000030f1b26313c464e53555f606060605f54524c443a3025190c030000000000000000000003030303030303010d1925303a444c525f6060606060585651493f34291e1206000000000000000000000000000000000000030f1b26313c464e53555f606060605f54524c443a3025190c0300000000000000000003030303030303010d1925303a444c525f6060606060585651493f34291e12060000000000000004101c28333e485055575858585858585853514b433a2f2625292d2e34383a3c3e414244454546464545444342403d3b3a36312d2c28231c19130d080200000000000000000000000000000000000000000000000000000000000000000000030b121820262b31373a4145474a50535557595c5d5e5e5f5f5f5e5e5d5b595755534d4946443f3835302a251e170e08020000000000000000000000000000000814202b37414b53595b606060606060605c59544b4232291f140900000000000000000000000000000000000000000007121d2731404a52585a606060606060605b59534b41372b201408000814202b37414b53595b606060606060605c59544b4232291f140900000000000000000000000000000000000000000007121d2731404a52585a606060606060605b59534b41372b20140800000000000000000000000c18232f39434b515f606060606060605f5e5951473d31261a0e010000000000000000000000000000000000000000000000000000000000000000060d151d232930363a4045474d5355545c60626466686a6a6b6b6c6c6c6b6b6a6867666361605b545654514b4846423b39352f2a251f1a150e08020000000000000000000000000000000000000000000000000000000000000000000000000713202c38444f5960636c6c6c6c6c6c6c6c6c67645c53483c3020150a0000000000000000000a17232f3b47525c63666c6c6c6c6c6c6c6c6c64615a5045392d1d1207000000000000000000000000000000000000000d1a26323e49545e66696c6c6c6c6c6c6c67645c53453b30251a0e0200000000000000000000000814202d3944505a61646c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6361594f44382c201407000000000006121e29343f4951565860606060605f55534d453b2f261b1106000000050f1a232c353e444c52575e6165686a6b6c6b6a6965625f57534d453f372d27303940444f545c606366696b6c6c6b6a6764605d55514a423b322921170b020000000000000000000000000000000000030f1a26313c464e53555f6060606060575550483e32291e130800000000000000000000050e19232b343d444c52565e6165686a6c6c6c6b6966615f57534d453e362d251b110800000000000000000000000000000000000006121f2b37434e585f626c6c6c6c6c6b615e564c4135291e150b00000000000004080a0a1010101010101010111d2a36414c565e6c6c6c6c6c6c65625b51463a2e22150900000000000000000000000000000000000006121f2b37434e585f626c6c6c6c6c6b615e564c4135291e150b000000000004080a0a1010101010101010111d2a36414c565e6c6c6c6c6c6c65625b51463a2e221509000000000000000814202d3944505a616464646464646464605d554b41382d3035393a3f4446494b4d4f5052525353525251504e4c4a4846423d3a38342e29251e19140d050000000000000000000000000000000000000000000000000000000000000000070c151d232831373c42474b5154545c60626466686a6a6b6c6c6c6b6a6a686664615f575653504a46413a3630292019130d0500000000000000000000000000000c1824303c48535d64686c6c6c6c6c6c6c68655d54443b3025190e0000000000000000000000000000000000000000000c18232f3943525c64676c6c6c6c6c6c6c68645d53483c3024180c000c1824303c48535d64686c6c6c6c6c6c6c68655d54443b3025190e0000000000000000000000000000000000000000000c18232f3943525c64676c6c6c6c6c6c6c68645d53483c3024180c0000000000000000000004101c2934404b555c6c6c6c6c6c6c6c6c6c6a63594e42362a1d1104000000000000000000000000000000000000000000000000000000000000030a11171f272f343b42464b5153575f6165666d6f71737576777878797979787876757472706e6c666663605d5554524d4745403936312b262019140d0500000000000000000000000000000000000000000000000000000000000000000000000916222f3c4854606b70797979797979797979746e64584c3c32261b0f0300000000000000000c1926323f4b57636e73797979797979797979716c615549392f23180c000000000000000000000000000000000000000f1c2935424e5a66707679797979797979746e64574d42362a1f140900000000000000000000000a1623303c4955616c707979797979797979797979797979797979797979797979797979797979797979797979797979797979706b6155483c2f23160900000000000915222e3a46515b62656c6c6c6c6c6c615f574d41382d22170b0300030d17212c353e474f565e61696e7275777879787776726e69625f5751493f373039424a515961666d6f7376777879787774706d67605c544d443b33291d140a000000000000000000000000000000000006121f2b37434e585f626c6c6c6c6c6c64615a50443a3025190e040000000000000000020d17202b353d464f565e61686d7275777879797876726e69625f5750483f372d23190d0400000000000000000000000000000000000815212e3a47535f6a6f7979797979786d685e52463d30271c1207000000050b101416171d1d1d1d1d1d1d1d1d202d3946525e68767979797979726d62564a3e312418080100000000000000000000000000000000000815212e3a47535f6a6f7979797979786d685e52463d30271c12070000050b101416171d1d1d1d1d1d1d1d1d202d3946525e68767979797979726d62564a3e31241808010000000000000a1623303c4955616c70717171717171716d675d53493f383a4146474a505355585a5c5d5e5f5f605f5e5e5d5b595755534d4946443f3835302a251e170e080200000000000000000000000000000000000000000000000000000000000810191e272e343c43474d53555d6064666d6f7173757777787979787877767573706e696763605c54524c46413b322a251e170e06000000000000000000000000000e1a2734404d59646f7479797979797979756f65564d42362a1c11060000000000000000000000000000000000000004101c2934404b55646e7479797979797979746f64594d4034271a0e000e1a2734404d59646f7479797979797979756f65564d42362a1c11060000000000000000000000000000000000000004101c2934404b55646e7479797979797979746f64594d4034271a0e0000000000000000000006131f2c3845515c67767979797979797979756a5e5245382c1f12060000000000000000000000000000000000000000000000000000000000040c151c2328313940454d52555d6065696e7276797b7d80828384848586868585848382817f7d7b797673706d6765615e5753514b46423b37312a251e170e07000000000000000000000000000000000000000000000000000000000000000000030f1b27333f495363707d868686868686868686807467584e43372b1f12060000000000000005111e2a36424d576673808686868686868686867e7164554b4034291c1004000000000000000000000000000000000000101d2a3643505d697682868686868686868074695e52463b30251a0e02000000000000000000000a1724313d4a5764707d86868686868686868686868686868686868686868686868686868686868686868686868686868686867d7063574a3d3024170a00000000000b1824313e4a56626d727979797979796e695f53493f33271f14090009141f29333e474f5961686e747b7e828485868584827f7b756e69625b51493f39424b545c606c70787c80838485868483817d7a726d665e564d453b2f261c1106000000000000000000000000000000000815212e3a47535f6a6f797979797979716c61564c41362a20160c020000000000000009141f29333d474f5960686d747a7f828485868584827f7b756e69625a51493f352b1f160c01000000000000000000000000000000000915222f3c4855626f7c8786868686857a6d61594f42392e23180c03000810171c202324292929292929292929292e3a4754616d7a86868686867f7265584c3f322519130c04000000000000000000000000000000000915222f3c4855626f7c8786868686857a6d61594f42392e23180c030810171c202324292929292929292929292e3a4754616d7a86868686867f7265584c3f322519130c0400000000000a1724313d4a5764707e7e7e7e7e7e7e7e796d655b504443484c5254545c60626567696a6b6c6c6c6c6b6a6a686664615f575653504a46413a3630292019130d0500000000000000000000000000000000000000000000000000000009111a222a303940454e53575f62676d7175797b7d8082838485858685858483817f7d7b7874706d66615e56524c443e36302920180f070000000000000000000000000e1b2835414e5b687481868686868686868175695e5246382d22170b0000000000000000000000000000000000000006131f2c3845515c677480868686868686868174685b4e4135281b0e000e1b2835414e5b687481868686868686868175695e5246382d22170b0000000000000000000000000000000000000006131f2c3845515c677480868686868686868174685b4e4135281b0e000000000000000000000714202d3a4753606d798686868686868687796c5f5346392c20130600000000000000000000000000000000000000000000000000000000060d161e262e343d434b51575e61676d72777b7f8286888a8c8e909091929292929291908f8d8c8a888583807d7a76726e6964605d55534d47433c36302920191007000000000000000000000000000000000000000000000000000000000000000005121f2b3744505b6574818d939393939393939184786a5f53473b2e211508000000000000000714202d3a46525e69778390939393939393938e8275675c5145382c1f13060000000000000000000000000000000000000a1723303d4a5663707d89959393939392867b6e61574d42362a1f1409000000000000000000000a1724313d4a5764707d8a9393939393939393939393939393939393939393939393939393939393939393939393939393938a7d7063574a3d3024170a00000000000c1925323f4c5865727f8686868686867b6e655b50443b31251a0e050e1a25313b454f59616b707a81878b8f90919292918f8c88827b726d625b5147404b545c666d757d84898d9091929291908e8a857f786e695e574d42382d22170b010000000000000000000000000000000915222f3c4855626f7b8786868686867e71685e52463e32281e1308000000000000020e1a25303b454f59606b6f7a81868b8f91929392918f8c87827b716c625b51473d31281d1307000000000000000000000000000000000815212e3a47535f6a73808d9693978e81746b60544a4034281f140908111a21282d303136363636363636363636363a4754616d7a879393938b7f7265584c3f3229241e160d040000000000000000000000000000000815212e3a47535f6a73808d9693978e81746b60544a4034281f1409111a21282d303136363636363636363636363a4754616d7a879393938b7f7265584c3f3229241e160d04000000000a1724303d4a5763707d868b8b8b8b8b8b81776c605a504e54565e6165666d6f7174757778787979787877767573706e696763605c54524c46413b322a251e170e060000000000000000000000000000000000000000000000000009121b232c343c424b51585f62696e747a7d8185888a8c8f9091919292929191908e8c8a8884807d79736d68615e565046413a322a2119100700000000000000000000000916232f3c4956626f7c89959393939392867b6e61544a3f33281c0f030000000000000000000000000000000000000714202d3a4753606d7985929393939395897c6f6356493c30231609000916232f3c4956626f7c89959393939392867b6e61544a3f33281c0f030000000000000000000000000000000000000714202d3a4753606d7985929393939395897c6f6356493c30231609000000000000000000000714202d3a4753606d7a8693939393939286796c5f5346392c201306000000000000000000000000000000000000000000000000000000060f171f2830383f444f555c60696e737a7f84888b8f929897999b9d9d9e9e9f9f9f9e9e9d9b9a99969892908c8986827f7b76716d67615e57534e46413b322b22190f04000000000000000000000000000000000000000000000000000000000000000613202d394653606c7884919e9f9f9f9f9fa196887c6f6255483c3025190d010000000000000814212e3b4754616e7b8795a09f9f9f9f9f9f9285796d6053473a2d22170b0000000000000000000000000000000000000916222f3c4854606b7683909da79fa3998d8074695e52463b3025190e020000000000000000000a1724313d4a5764707d8a979f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f968a7d7063574a3d3024170a00000000000613202d394653606c7782909893988f82776c60574d42362a20170d121e2a36424d57616b707d868e939a9b9d9e9d9d9d9c98948f877f726d62594f45515c666d78818a9196999c9e9d9d9e9d9a98928c837b6e695e544a3f33281d12070000000000000000000000000000000815212e3a47535f6a737f8c95939392857a6d615a50443a3024190d04000000000005111e2a36424d57606b6f7d858d92999b9d9c9b9c9e9c9a938f867e726d62594f433a2f24180d0100000000000000000000000000000006121f2b37434e58606d7984919e9f93887d6f665c51443b31261a0d101a232c33393c3d4343434343434343434343434754616d7a87949f988b7f7265584c3f39352f281f160c01000000000000000000000000000006121f2b37434e58606d7984919e9f93887d6f665c51443b31261a0d1a232c33393c3d4343434343434343434343434754616d7a87949f988b7f7265584c3f39352f281f160c010000000a16232f3c4855616b727f8c93979797938d80736c6158586062686d7175797c7e8082838585868685858483817f7d7b7874706d66615e56524c443e36302920180f07000000000000000000000000000000000000000000000009121b242d353e464e545c606a6f757b81868a8e929797999b9d9d9e9f9f9f9e9d9d9b999796918d8985807a746e68615a524c443c332b22191007000000000000000000000915222e3b4854606a7783909daa9fa3998c7f73665b5044382b1f1409000000000000000000000000000000000006121f2b37434e5864717e8a97a29f9f9d9083776b6054483b2f221509000915222e3b4854606a7783909daa9fa3998c7f73665b5044382b1f1409000000000000000000000000000000000006121f2b37434e5864717e8a97a29f9f9d9083776b6054483b2f221509000000000000000000000714202d3a4753606d7a86939f9f9f9f9286796c5f5346392c2013060000000000000000000000000000000000000000000000000000050e172129313a424a505960676d737b80858b9195989c9fa3a39f9d9b9a999898989898999b9c9d9fa3a29f9c9999928f8b87837e79746e69625f58524c443d342b21160a000000000000000000000000000000000000000000000000000000000000000916232f3c4956626f7c8996a1adacacacb2a8998c7f7266564c41362a1d1105000000000004101c2834404b5465717e8b98a7b1acacacaea2988a7d7063544a3f33281c0f0300000000000000000000000000000000000714202c38444f5963707d8a959fabab9f92867b6e61564d42362a1f14080000000000000000000a1724313d4a5764707d8a97a3acacb2acaba6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a3968a7d7063574a3d3024170a000000000005121f2b3744505b656e7b86929f9f948b7e72695e53463f32291f1414212d3a46535e69707d8692989f9d9b9691909192999f9e99928b7f726b60554e58606d78818e939ea09e9892909091979d9f9f9590847b6e665b5044392f23180c00000000000000000000000000000006121f2b37434e58606d78839099a1978e81756c61564c4135291f160c01000000000714202d3a46525e696f7d8691979f9f9892908e8f91979f9f98928b7f726b60554b4035291d1307000000000000000000000000000000030f1b26313c45515d67707d8a939e9a9183786d60574d42362a1f1617212c353e44494a5050505050505050505050505054616d7a8794a0988b7f726558504745413a31281e13080000000000000000000000000000030f1b26313c45515d67707d8a939e9a9183786d60574d42362a1f16212c353e44494a5050505050505050505050505054616d7a8794a0988b7f726558504745413a31281e13080000000714202c38444f59636d74818e959fa59c928a7e716a60626a6f757a7e8285888b8d8f9091929293929191908e8c8a8884807d79736d68615e565046413a322a2119100700000000000000000000000000000000000000000007101b242d363e474f585f666d737c82878e92989b9ea2a9a6a8aaa8a7a6a6a6a7a8a9a8a6a8a19e9a97928c86807a716c615e564d453c342b22190e0500000000000000000007131f2c38434e5865727e8b98a2aeab9e9184786c6053463b30251a0e00000000000000000000000000000000000814212e3a47535f6a7683909ca9aea2988b7f7265594f43382c1f13070007131f2c38434e5865727e8b98a2aeab9e9184786c6053463b30251a0e00000000000000000000000000000000000814212e3a47535f6a7683909ca9aea2988b7f7265594f43382c1f1307000000000000000000000714202d3a4753606d7a8693a0acac9f9286796c5f5346392c20130600000000000000000000000000000000000000000000000000030d172029333b434c545c606b707980868d92979da0a29f9b989892908e8d8c8c8b8b8b8c8d8e8f919299979a9d9fa39f9c9a938f8b85807b756e6a615e564e463d32271b0f03000000000000000000000000000000000000000000000000000000000006121e2b37424d576673808d99a8b1acaaacaea99d908376685e5246392d201306000000000006131f2c3845515c6675828f9ba8b0aba9abb0aa9a8e8174665b5044382b1f1206000000000000000000000000000000000004101c27333d4855616b7783909da7aea3988d8074695e52463b3025190e0200000000000000000a1724313d4a5764707d8a97a3b0b2a8a19e9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a968a7d7063574a3d3024170a0000000000030f1b27333f49535f69727f8c959f9f92867b6e615a50443b3025191f2c38434e58616e7b869298a29c938e88848384868c9299a39f93887d6f675c535f6a73808d939ea197928b858483858990959fa0969083786c60554b4034291c10040000000000000000000000000000030f1a26313c44515c666f7c87929f9e938a7d70685d52453d31281d130700000007131f2c38434f59616e7b859298a19a938c86838282858a9297a29f93877d70675d51453a2f24180d010000000000000000000000000000000a15202935404b55616b75818e98a0958c7f72695f53463e31281e1c28333e474f55575c5c5c5c5c5c5c5c5c5c5c5c5c5c616d7a8794a0988b7f72655c5c54524c433a2f24190d0100000000000000000000000000000a15202935404b55616b75818e98a0958c7f72695f53463e31281e28333e474f55575c5c5c5c5c5c5c5c5c5c5c5c5c5c616d7a8794a0988b7f72655c5c54524c433a2f24190d01000004101c28333e47515b606d79839096a1a49f92867c6f6a6f767c81868b8f9298989a9c9d9e9f9f9f9f9e9d9d9b999796918d8985807a746e68615a524c443c332b2219100700000000000000000000000000000000000000050e19222d363e485059616a6f7980878f93999fa3aaabaaaaa29f9d9b9a9a999a9a9b9d9fa2aaa9aba9a19e98928d857e756d685f574e463c342a20170c030000000000000000030f1b27323d4754606d7a85929facaca1968a7d7063574d42362a1c110600000000000000000000000000000004101c2934404b55626e7b88949fabac9f92867a6d6054473d32271b0f0300030f1b27323d4754606d7a85929facaca1968a7d7063574d42362a1c110600000000000000000000000000000004101c2934404b55626e7b88949fabac9f92867a6d6054473d32271b0f03000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000000000000000000000000000000020b151f29323b454d565d666d747d848c92999fa29f9c98928f8b88858381807f7f7e7e7f7f8081828486888a8d9092999b9ea19f9c98928d86817c746e6860584e43382c1f130700000000000000000000000000000000000000000000000000000000000814212e3a47535f697784919daaa7a09d9fa2aa9f93867a6d6154473a2e23170c00000000000713202d3a4653606d7985929faca69f9c9fa6ab9e9285796c605346392d20130a0000000000000000000000000000000000000b16212c38444f5964707d8a95a0acaa9f92867b6e61564d41362a1e140800000000000000000a1724313d4a5764707d8a97a3b0aca196918d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8a7d7063574a3d3024170a0000000000000b17222d38414d57606d78839099a2988f82766c62564d41362a20222e3b4854606a75828f98a29c918c817b7876777a7f87929aa49a9184796d6056626e7c87929fa19791857e797776787c838f949f9f958b7f72675c5145382c1f13060000000000000000000000000000000a15202834404a54606a73808d96a09e91857a6d60594f433a2f24180d0300000915222f3b4854606b75828f97a19f9388807a767576797e859297a2999184796d60554b4035291d1104000000000000000000000000000000040c18242f39434f59616e7b85929f9f92867b6e615a50433a2f24202d39444f5961646969696969696969696969696969696d7a8794a0988b7f72696969605d564c4135291d11040000000000000000000000000000040c18242f39434f59616e7b85929f9f92867b6e615a50433a2f242d39444f5961646969696969696969696969696969696d7a8794a0988b7f72696969605d564c4135291d11040000000b17212c353f45515c676e7a849198a2a39891857b747c82898e92999c9fa2aaa7a8aaa8a8a7a6a6a7a8a9a8a6a8a19e9a97928c86807a716c615e564d453c342b22190e050000000000000000000000000000000000020d17202b343e48505a616b707c838c92999fa4abaca7a09d999892908f8d8d8d8d8d8f909298989c9fa4abaaa29f97928a827a6e6960584e463c32291e150b0000000000000000000a16202c3945515d6774818e9aa7b1a89b8f8275695e5246382e23170b00000000000000000000000000000006131f2c3845515c6774808d9aa6b0a79b8e8174685d5245392b21160a0000000a16202c3945515d6774818e9aa7b1a89b8f8275695e5246382e23170b00000000000000000000000000000006131f2c3845515c6774808d9aa6b0a79b8e8174685d5245392b21160a00000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000000000000000000000000000000a141d27313a444d575f686d78808991969fa39e9b948f8a85827e7b7977757373727171727273747677797b7e8083868a8e92979b9fa29f99928e87817a6f6a6054483b2e22150900000000000000000000000000000000000000000000000000000000000815222f3b4855626e7b8895a0aca095909298a2a4998a7e7164544a3f34281c1003000000000a1723303d4a5663707d8998a2a99f9490949faba197897c6f6356493c31261b0f03000000000000000000000000000000000005101c28333e4653606c7883909da7aea3988d8074685e52463b3025190e02000000000000000a1724313d4a5764707d8a97a3b0ab9e91848080808080808080808080808080808080808080808080808080808080808080807c6e6255483b2f22150800000000000006111b262f3c44505c666f7c86929f9f948b7e71685e52463e32292834404b54626f7c89939e9f948c7f746e696a686d737e88939fa0968b7f72655e6875828f99a39e91857b716d676a6a6f78828f98a29f9285796d6053473a2e23170b000000000000000000000000000000030c18232e39424e58606d7984919aa1978e81746b60554b4035291f150b0105111e2a36414c56636f7c89939e9e938b7e736d6868666d717c85929fa1968c8073675d5145392c2013070000000000000000000000000000000007121d27313e46525e69727f8b959f988f82756c61554c41352923303c4955616c70767676767676767676767676767676767a8794a0988b7f767676766d685d5245392c20130600000000000000000000000000000007121d27313e46525e69727f8b959f988f82756c61554c413529303c4955616c70767676767676767676767676767676767a8794a0988b7f767676766d685d5245392c20130600000005101a232834404b555e686f7c86929aa4a197908381878f949b9fa3abacaaaba39f9d9c9b9a999a9a9b9d9fa2aaa9aba9a19e98928d857e756d685f574e463c342a20170c030000000000000000000000000000000009141f29323d46505a626c717d8690959fa3ababa49f9b95908c898584828180808081828385888b8f93999fa2aaa9a19e938f847b6f6a60584e443b30271d1207000000000000000004111d2935414b55626f7c88959fabac9f92877b6e61544a3f34281c100300000000000000000000000000000714202d3a4753606d7985929eabaca095897c6f63564c413529190f0400000004111d2935414b55626f7c88959fabac9f92877b6e61544a3f34281c100300000000000000000000000000000714202d3a4753606d7985929eabaca095897c6f63564c413529190f0400000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000000000000000000000000000006111c262f39434c565f696e7a828d929ea0a09d938e88827d7975716e6c666867666565656565666869666d6e7174767a7d81858a8e92989ea19f99928e867c6f6256493c2f2316090000000000000000000000000000000000000000000000000000000005111e2a36414c5666727f8c99a7aa9d908386929fab9b8e8175665c5044382c1f120600000005121e2a36424d576774808d9aaaa1979083909ca9a99a8d807367584e43372b1f12060000000000000000000000000000000000000b161f2b3744505b65717e8a95a0acaa9f92867b6e61564c41362a1e14080a0a0a0a0a0a0a0a1724313d4a5764707d8a97a3b0a99c8f827673737373737373737373737373737373737373737373737373737373737373736e6a5f53473a2e211408000000000000000a141d28343f4a545f6a737f8c95a09f92857b6e615a50443a302c3845515c6674818e9aa59c9082786c615f575d616c74818d99a49d9083776a616d7a86929fa0958a7d7069605c5860666e7b86929fa2978a7e7164544a3f34281c100300000000000000000000000000000007121c27303c45515c676f7d88939f9d93897d70675d51453d31271d12070714202d3946525e6875828f9ca59b8e81756c615d565c606a717e8b96a09f92857a6d6053473a2f24180c00000000000000000000000000000000010b151f2a36424d56606c788390999e948a7e71675d51453c3026313d4a5764707d8283838383838383838383838383838383909ca99e9184838383827a6d6054473a2d211407000000000000000000000000000000010b151f2a36424d56606c788390999e948a7e71675d51453c30313d4a5764707d8283838383838383838383838383838383909ca99e9184838383827a6d6054473a2d21140700000000081118232e39434c565f6a717e88939fa5a095908d93999fa6acaaa8a09d999992908f8e8d8d8d8d8f909298989c9fa4abaaa29f97928a827a6e6960584e463c32291e150b000000000000000000000000000000030d1925303b444e58626c717e879298a0a7afa79f99938e88837f7c79777574737373747577797c7f83878d92989ea5ada59e9691857c6f6a5f564c42392e23180c0300000000000000010d18242f3a47535f6a7683909da9afa3998c7f73665c5044382b1f14090a0a0a0a0a0a0a0a0a0a0a0a0a0a121f2b37434e5864717e8b97a2adaa9d9083776b6054443a2f24190700000000010d18242f3a47535f6a7683909da9afa3998c7f73665c5044382b1f14090a0a0a0a0a0a0a0a0a0a0a0a0a0a121f2b37434e5864717e8b97a2adaa9d9083776b6054443a2f2419070000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000000000000000000000000000b17222d38424b555e686e7b838f949da49c969189817c76706d666561605b545a5959585858595a5b545c60626467676d7174797d81868c91969da09e9285796d6053473a2d201407000000000000000000000000000000000000000000000000000000000714202d3946525e687683909da9a79a8d80828f9ca99f9285796d6053463a2d2013090000000714212d3a46535f697784919daa9e91857e8a97a8aa9e9184776a5f53473a2e211509000000000000000000000000000000000000030f1b27333f4953606c7884919da8aea3988d8074685e52463b3025191616161616161616161724313d4a5764707d8a97a3b0a99c8f82766967676767676767676767676767676767676767676767676767676767676767625f584e43372b1f120600000000000000020b17232e38424e58606d78839099a2978f82756c61564c41362d3a4653606d7985929fa2988a7d70655b534d5259616e7b87939f9f95887b6f65727e8b99a39d9184786c6057514e545e6874818d9aa99c8f8276665c5044382b1f1206000000000000000000000000000000000b151e2934404b55606b74808d96a19e9184796d60594f43392f24180c0814212e3b4754616e7a86929f9f94887b6e615a524c5058606c7884919da2978b7e7164554b4035291d100400000000000000000000000000000000030d1925303b44505b666f7c87929f9e91847a6d60584e42382e323f4b5865727e8b8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f90949faba096918f8f8f877a6d6154473a2e21140700000000000000000000000000000000030d1925303b44505b666f7c87929f9e91847a6d60584e42382e3f4b5865727e8b8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f90949faba096918f8f8f877a6d6154473a2e211407000000000007121d27303b444e58616c73808c939ea7a09d9a9fa4abaca59e9b96918c898684828180808081828385888b8f93999fa2aaa9a19e938f847b6f6a60584e443b30271d120700000000000000000000000000010b151f2a36424d56606a717e889299a2aaafa49c959087817c77726f6d6668676766676768666c6f72767b80868e939fa3aaa8a09792867c6f685e544b403428201509000000000000000007131d2b37434e5864717e8b97a2adab9e9184786d6053463b31251a16161616161616161616161616161616212e3a47535f6a7683909ca9aea2988b7f7265594f4332281e1308000000000007131d2b37434e5864717e8b97a2adab9e9184786d6053463b31251a16161616161616161616161616161616212e3a47535f6a7683909ca9aea2988b7f7265594f4332281e13080000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000000000000000000000000030f1c28333f4a545d676d7a8491959fa39f928d847d756f6a64605c545553504a4d4c4c4b4b4c4c4d4e4a51535557555d6064666d70757a7f848a9095978c7f72675d5145392c1f1306000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a87939faca7978a7e7f8c99aba297897c6f6356493c31251a0e0200000815222e3b4855616e7b8896a0a89b8e827a8796a0aca096887b6f6255483c31251a0e020000000000000000000000000000000000000b17222d3844505b66717e8a96a0acaa9f92867a6e61564c41362a232323232323232323232324313d4a5764707d8a97a3b0a99c8f8276695c5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a55534e463c31261a0f02000000000000000006111c26303c44515c666f7c87929f9e938a7e71685e52463e323c4956626f7c8997a29f9285796d6053494246535f697683909da7988b7f726875828f9bab998c8073655b5045424d5663707c8998a39f9285796d6053463a2d20130700000000000000000000000000000000030c18232f39434f59606d7984919ea1968d80746b60554b4035291e150b1825323e4b5865717e8b99a39c908376695f53464144505b65727f8c99a99c8f8276675d5145392c1f1306000000000000000000000000000000000009141f28333f4a545f6a74808d96a1978d80746a60544a3f34323f4b5865727e8b989c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9fa6b0a8a09e9c9c94877a6d6154473a2e211407000000000000000000000000000000000009141f28333f4a545f6a74808d96a1978d80746a60544a3f343f4b5865727e8b989c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9fa6b0a8a09e9c9c94877a6d6154473a2e2114070000000000000b151e29323c46505a606c77818e96a0acaaa7acafa7a09d938e89847f7c7a777575747373747577797c7f83878d92989ea5ada59e9691857c6f6a5f564c42392e23180c0300000000000000000000000007121d27313946525e696f7c86929aa3ababa39f928d837c756f6a6662605c545a5a5a5a5a545b606265696e747b818a9298a2a9a9a19891847a6e665c51453c31261a0e0500000000000000010f1b26323c4753606d7985929fabada1968a7d7063574d42362a23232323232323232323232323232323232934404b55626e7b88949fabac9f92867a6d6054473d3221160c010000000000010f1b26323c4753606d7985929fabada1968a7d7063574d42362a23232323232323232323232323232323232934404b55626e7b88949fabac9f92867a6d6054473d3221160c010000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000000000000000000000005101a232b3844505b666d79839096a0a299928b8079706b625f5853514b4846443f40403f3e3e3f3f4041404446484b4c5154545c6063686d72797e838a91857a6d60554b4035291d100400000000000000000000000000000000000000000000000000000004111d2935414c5565727e8b9aa4aca095877a7d8999a3a9998d807366574d42362a1e12050004101d2935404b5565727f8b98a8a9988b7f7784919daaa8998c7f7366574d42362a1e120500000000000000000000000000000000000006111b28333f4a54606d7884919ea8aea2988d8073685e52463a30303030303030303030303030313d4a5764707d8a97a3b0a99c8f8276695c4f4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4847433c332a201509000000000000000000000a141e2834404a545f6a73808d95a09e92857a6d615a50443a3f4b5865727e8b98a99c8f8276665c504138424d576673808d99a69b8e8174677784919eab96897d706353493f3b4653606d7986929fa298887b6e6255483b2f221508000000000000000000000000000000000007121d27313d45515d67707d89939e9f93887d6f675d51453d30271c121d2935414c566875828e9bab998c7f7266574d42353f4953626e7b8897a29f92867a6d6053473a2d2014070000000000000000000000000000000000020b17222d38424e58606d7984919e9f93877c6f665c50443b303f4b5865727e8b98a9a49f969393939393939393939394979ea8a39b98939393877a6d6154473a2e2114070000000000000000000000000000000000020b17222d38424e58606d7984919e9f93877c6f665c50443b3f4b5865727e8b98a9a49f969393939393939393939394979ea8a39b98939393877a6d6154473a2e211407000000000000030c17202a343e44505b656d7a84919daab6b4b3a9a0959189817c7773706d6769686766676768666c6f72767b80868e939fa3aaa8a09792867c6f685e544b4034282015090000000000000000000000000c18232f3943505a616e7b859198a3acaca399928b80786f6a625f585653504a4e4d4d4d4e4a505355575e61696e757e869297a2aaaaa1969082786d60574e42372b21170b00000000000000000a151f2c3845515d6774808d9aa6b0a89c8f8275695e5346382e3030303030303030303030303030303030303845515c6774808d9aa6b0a79b8e8174685d5245392c201304000000000000000a151f2c3845515d6774808d9aa6b0a89c8f8275695e5346382e3030303030303030303030303030303030303845515c6774808d9aa6b0a79b8e8174685d5245392c201304000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000000000000000000000000b17212a36424d57606c78818f959fa29892877e736d676059534e46454040434546464544423f3b3a373134383a3b3e4145474a5053565d60666d71787e847f73675d5143392f24180c000000000000000000000000000000000000000000000000000000000613202c3945515d6776828f9cacaa9d9184777a86929faa9d908477695e53463a2d2114070006131f2c3945515d6776828f9ca9a197887c74818d9aa7aa9d908377695e53463a2d211408000000000000000000000000000000000000000b17222d3844505c66717e8b96a1acaa9f92867a6e61564c413d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4a5764707d8a97a3b0a99c8f8276695c4f43404040404040404040404040404040404040404040404040404040403b3a37312a21180e0300000000000000000000020c18232e39424e58606d79839199a1978e81756c61564c41414e5b6774818e9aa79a8d807467544a3f2f3e4b5764717e8a97a49d9083776d7a86939fa399877b6e6154473b3845515c677784909daa978a7e7164574b3e3124180b0000000000000000000000000000000000010b151f2935404b55616b74818e97a19a9184796d60584e42392e2318202d3946525d687884919ea996897c706356493d31394653606c7985929fa398897c6f6356493c3023160900000000000000000000000000000000000006111c262f3c45515d67707d8a949e999083786d60574d42363f4b5865727e8b97a19a938a86868686868686868686878c97a39b918b868686867a6d6154473a2e21140700000000000000000000000000000000000006111c262f3c45515d67707d8a949e999083786d60574d423f4b5865727e8b97a19a938a86868686868686868686878c97a39b918b868686867a6d6154473a2e2114070000000000000008131e28313a46535e696f7d86929facb9b9ada29791837d75706b6663605d555b5a5a5a5a545b606265696e747b818a9298a2a9a9a19891847a6e665c51453c31261a0e050000000000000000000004101c2934404b55616c76828f97a1aaafa49a92877e736d665f58534e4946443f41404040413f4446484d53565e616c717c859298a2aca89f948d80736a5f53473e33281c10040000000000000004101d2935404b55626e7b88949fabac9f93877b6e61544a3f3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4753606d7985929eabaca095897c6f63564c4135291d11040000000000000004101d2935404b55626e7b88949fabac9f93877b6e61544a3f3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4753606d7985929eabaca095897c6f63564c4135291d1104000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000000000000000000000004101c28333a46525e69727f8b939ea39992867d716c605c554f47434446494d5051525352514f4c4847433c37332d2f2f35393a3f44464c52545c60656c7179796d60554b4131271f1911060000000000000000000000000000000000000000000000000000000714212d3a4754606d7a86929faca79a8d81747683909da9a095877b6e6154483b2f24180c000714202d3a4753606d7a86929fab9e928579717e8a97a7aca095877b6e6154483b3025190d0100000000000000000000000000000000000006111c28343f4a54606d7984919ea8aea2988d8073685e52494949494949494949494949494949494a5764707d8a97a3b0a99c8f8276695c4f43363434343434343434343434343434343434343434343434343434342f2e2b2620180f0600000000000000000000000007121c27303c45515c676f7c87939f9e938a7e70685d5246434f5c6976828f9ca5988b7f7265584c3f2e3c4956636f7c8996a29f9285786f7b889aa49f9286796c6053463934404b556975828f9ca5998c7f7266594c3f3326190c000000000000000000000000000000000000030d18242f3a434f59606d7a85919ea0968d80736a60544a4034281e212e3a4754616d7a8796a1a297877a6d6054473a2d3744505b6576828f9caa988b7f7265584c3f3225190c000000000000000000000000000000000000000a141d2935414b55616c75828f98a0958b7f72695e52463e3a4754616d7a85919a93867d797979797979797979797a8794a0988b7f7979797976685e5246392d201307000000000000000000000000000000000000000a141d2935414b55616c75828f98a0958b7f72695e52463e4754616d7a85919a93867d797979797979797979797a8794a0988b7f7979797976685e5246392d201307000000000000010d19242f3a43505a616e7b859299a3aebbb8ab9e92857a706b6360595653514b4e4d4d4d4e4a505355575e61696e757e869297a2aaaaa1969082786d60574e42372b21170b0000000000000000000006131f2c3845515c67707d8a949fa9b0a69f93887e716c605c544e47433c3a38342e3433342d3338393c42464d525a616a6f7c86929aa4afa69f92877b6e62594f44392d20150a00000000000000000c18242f3947535f6a7683909ca9afa4998c8073665c504949494949494949494949494949494949494949494e5864717e8b97a2adaa9d9083776b6054443a2f24190d0100000000000000000c18242f3947535f6a7683909ca9afa4998c8073665c504949494949494949494949494949494949494949494e5864717e8b97a2adaa9d9083776b6054443a2f24190d01000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000000000000000000000714202c38444f59616e7b86929fa59f92877d706b615a514b4344495053565a5c5e5f5f5f5e5c5955534e46443f382f27343c424a5053565b5d5f5f5b60666c6d675c51454039312b2317110a0200000000000000000000000000000000000000000000000004101c2834404b5464717e8a99a3aea7978a7e7173808d99aba7988b7f7265554b4035291d10040a1724303d4a5763707d8a98a3a89b8f82756e7a8795a0aca7988b7f7265564c4135291d1105000000000000000000000000000000000000000b17232e3844515c66727e8b96a1adaa9f92867a6d615656565656565656565656565656565656565764707d8a97a3b0a99c8f8276695c4f433629272727272727272727272727272727272727272727272727272722211f1a150e0600000000000000000000000000000b151e2834404b55606a73808d96a09e91857a6d61594f43505d6a7683909da4978a7e7164574b3e313b4855616e7b8894a19f9286796f7c8996ac9e918578655b5044372e414e5b6774818e9aa6998d8073665a4d4033271a0d0000000000000000000000000000000000000007131d28313d45525d68717e8a939e9f92877c6f665c51443c3026232f3c4956626f7c8995a89f928578685d5245392c333f49536774818e9aa79a8d8174675a4e4134271b0e00000000000000000000000000000000000000020b18242f3a43505a616e7b86929f9f92867b6e61594f433946525e68707d88939a92857a6e656c6c6c6c6c6c6d7a8794a0988b7f726c6c6c6c5e564c41362a1d110500000000000000000000000000000000000000020b18242f3a43505a616e7b86929f9f92867b6e61594f4346525e68707d88939a92857a6e656c6c6c6c6c6c6d7a8794a0988b7f726c6c6c6c5e564c41362a1d110500000000000004111d2935414c55626c76828f97a1abb5afacada2978e81776c605a504947454042414040413f4446484d53565e616c717c859298a2aca89f948d80736a5f53473e33281c1004000000000000000003101c28343f4a54606d7984919ea6b0aa9e948c7f736c625a504a423c37322d2c282327272722282b2d31363b42465058606a707e88939fa8aea3998f82766c6155493c31261b0f000000000000000007121d2b37434e5864717e8a97a1adab9e9184796d6056565656565656565656565656565656565656565656565f6a7683909ca9aea2988b7f7265594f4332281e130800000000000000000007121d2b37434e5864717e8a97a1adab9e9184796d6056565656565656565656565656565656565656565656565f6a7683909ca9aea2988b7f7265594f4332281e130800000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000000000000000000000a16232f3c4855616b75828f98a29d938b7e716b60595045414950535b606366696b6c6c6c6b6866625f58535049413d333d464e545b6063676a6b6c6c6b696663605c54514b433d3528221c140b02000000000000000000000000000000000000000000000006131f2c3845515c6675818e9babaca095877a6e707d8999a3a89c8f8275675d5145392c1f1306121f2b37434e586774818d9aaaa8988b7f72687784919daaa99c8f8376685e5246392d2013070000000000000000000000000000000000000006111c2834404a54606d7984919ea9aea2988d8073686363636363636363636363636363636363636364707d8a97a3b0a99c8f8276695c4f4336291c1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1514120f0903000000000000000000000000000000030c18232e39434e58606d7984919aa1978e81746b61564c515e6a7784919da3978a7d7064574a3d313b4754616e7a8794a1a399867a707d8a96a39e9184776b5e493f3334414d5a6774808d9aa79a8d8174675a4e4134271b0e000000000000000000000000000000030608090d0c161f2935414c56616c75818f97a2999083786d60584e42382e23313e4a5764717d8a97a49d9084776a564c4135292d404c5966737f8c99a69c8f8276695c4f4336291c10000000000000000000000006060606060606060007131d28313e46535e69727f8c95a0988e81756b61554b40414c56616b74808d95978f82776c6058606060616d7a8794a0988b7f726560605f524c443a3025190d010000000000000000000000000000020608080c0e07131d28313e46535e69727f8c95a0988e81756b61554b414c56616b74808d95978f82776c6058606060616d7a8794a0988b7f726560605f524c443a3025190d010000000000000613202c3945515d67717e8b949fa9b3aba39fa3a99e938c80736c61584e453b352f3433342d3338393c42464d525a616a6f7c86929aa4afa69f92877b6e62594f44392d20150a000000000000000006121f2b3844505c66727f8c96a0acaea2988f82776c605a50443f38302b26201f1c171a1a1a171c1f20252a30363e464e58616c73808d96a1acab9f948a7d7064584e43372b1d120700000000000000010f1a26313c4653606d7985929eacada1968a7d70646363636363636363636363636363636363636363636363636e7b88949fabac9f92867a6d6054473d3221160c01000000000000000000010f1a26313c4653606d7985929eacada1968a7d70646363636363636363636363636363636363636363636363636e7b88949fabac9f92867a6d6054473d3221160c0100000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000000000000000000007131f2c38434f5963707d8a949ea1978e81746c62594f47444c535b60656c6f7376787979787775726e6a64605b534e443f464e585f666c707477787979777673706d66605d554f4740332d261d140a00000000000000000000000000000000000000000000000713202d3a4653606d7985929fabaa9d908477686d7a86929fac9f92867a6d6053473a2d20140a15212e3a47535f6a7884919eaba196887b6e6774818d9aabac9f92867a6d6154473a2f24180c00000000000000000000000000000000000000000c18232e3945515c66727f8b97a1adaa9f92867a707070707070707070707070707070707070707070707d8a97a3b0a99c8f8276695c4f4336291c100d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0808060200000000000000000000000000000000000007121d27303d45515d67707d88939f9e938a7d70685d52515e6b7884919ea3968a7d7063574a3d303a4754616d7a8794a0a194877a717d8a97a49d9184776a5e51442d34404d5a6773808d9aa69b8e8175685b4e4235281b0f00000000000000000000000000040a0f1315161a1d1f1924303a44505a616e7a85929ea0958c7f736a5f544a3f3428323f4b5865727e8b98a59c8f8376695c50432f24323e4b5865717e8b98a49d9083776a5d5044372a1d1100000000000002060a0c0d131313131313131313130c161f2a36424d57606d788390999e938a7d70675d51453c444f59606d79839098948c7f726a60554b54616d7a8794a0988b7f726558535346413a32281e13080000000000000000000000000003090e121415191b1d1e161f2a36424d57606d788390999e938a7d70675d5145444f59606d79839098948c7f726a60554b54616d7a8794a0988b7f726558535346413a32281e130800000000000004111d2935414c55606d7a85929ea6b0aaa2999299a1a59c928a7e716a60574d43392f26272722282b2d31363b42465058606a707e88939fa8aea3998f82766c6155493c31261b0f00000000000000000713202d3a4653606d7884919ea8b2a99f92867b6e655b50483e342e261e1b1312100c060d060b0f12131a1f252a343d46505a606d7984919ea8b0a69c8f83766a5f5347392e23180c000000000000000009151f2c3845515c6673808d9aa4afa99c8f82757070707070707070707070707070707070707070707070707074808d9aa6b0a79b8e8174685d5245392c201304000000000000000000000009151f2c3845515c6673808d9aa4afa99c8f82757070707070707070707070707070707070707070707070707074808d9aa6b0a79b8e8174685d5245392c2013040000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000000000000000000000915222f3b4854606b7683909da69e91857a6d605a5047454d565e656c71787c80838485868584827f7b77716c65605850494e58606a6f787d81838586858483807c78726d67605952443f382f261c1106000000000000000000000000000000000000000000030f1b27333f495363707d8a98a2aeaa9a8d807367677683909ca9a3988a7d7063574a3d31261b0f15222f3c4855626f7b8896a1ab9e9184786a64717d8a99a3afa3998b7e7164554b4035291d10040000000000000000000000000000000000000007121c2834404b54606d7985919ea9aea2988e817c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7f8c99a6b2a99c8f8276695c4f4336291c1003010101010101010101010101010101010101010101010100000000000000000000000000000000000000000000000b151e2935404b55606b74818d96a19e91847a6d60594f5e6a7784919da3978a7d7064574a3d313b4754616e7a8794a1aa93877a707d8a96a39e9184776b5e51442f34414d5a6774808d9aa79a8e8174675b4e4134281b0e0000000000000000000000040a0f151b1f212226292b2c2c28323e46525e68717e8b949e9f92877c6f665c50443c2f33404c5966737f8c99a69c8f8275695c4f423629313e4b5764717e8a97a49e9184786b5e5145382b1e120000000000070d121619192020202020202020202020201a25313b44505c666f7c87939f9e9184796d60584e413d45515c676f7c86929f92867c6f675d5154616d7a8794a0988b7f7265584c3f3936302820160c020000000000000000000000060c11151a1e212226282a2b2c2c25313b44505c666f7c87939f9e9184796d60584e4145515c676f7c86929f92867c6f675d5154616d7a8794a0988b7f7265584c3f3936302820160c020000000000000613202c3945515d67737f8c97a2adaea29892869196a1a49f92867c6f695e554b41382d2217171c1f20252a30363e464e58616c73808d96a1acab9f948a7d7064584e43372b1d120700000000000005111e2a36414c5664707d8a96a1adada1978c7f72695e53493f3628231c140c0a060300000000000306090e1419222b343e45515d67717e8a96a0acab9f94887c6f62544b4034281c10040000000000000004101c2834404b54616e7b87939facac9f93877d7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7d85929fabaca095897c6f63564c4135291d1104000000000000000000000004101c2834404b54616e7b87939facac9f93877d7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7d85929fabaca095897c6f63564c4135291d11040000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000000000000000005111e2a36424d56636f7c89959f9f958a7e71685d5248434d575e686d777e84898d8f91929292918f8c88837e786f6a605b5354606a6f7c83898e9092929291908c89847f796f6b635c504a42382d22171007000000000000000000000000000000000000000005121f2b3744505b6574818e9aaaaea398897d70636673808c99a9aa9a8d817467584e43372b1f121d2935414c5666727f8c99a8ac9b8e817468606d7a86929facab9b8f8275675d5145382c1f130600000000000000000000000000000000000000000c18232e3945515d67727f8c97a1adaa9d938e898989898989898989898989898989898989898989898c919ca8b5a99c8f8276695c4f4336291c100300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030c18242f39434f59606d7984919ea1968e81746b60555d6a7783909da4978a7d7164574a3e313b4855616e7b8894a1a2988679707c8996a39e9184786b564c413534414e5b6774818e9aa69a8d8073675a4d4034271a0d00000000000000000000070e151b20262b2e2f3336383939393736414c56626c76828f98a2999083786d60574d41382d404d596673808c99a69b8e8275685b4f423528313d4a5764707d8a97a39e9285786b5f5245382c1f12000000010a12191e2325262d2d2d2d2d2d2d2d2d2d2d2d2d2d28343f4a54606a74808d97a1968d80736a5f53493f404b555f6a727f8b94999184796d605a54616d7a8794a0988b7f7265584c3f322a251e160e050000000000000000000002090e171d1f262b2e2f3235373839393938343f4a54606a74808d97a1968d80736a5f5349404b555f6a727f8b94999184796d605a54616d7a8794a0988b7f7265584c3f322a251e160e05000000000000000714212d3a4754606d7a85929fa9b3a99f92867c849198a2a29891847b6e675d53493f332722190f12131a1f252a343d46505a606d7984919ea8b0a69c8f83766a5f5347392e23180c0000000000000714202d3946525e6876828f9ca8b2ab9e9185796d60574d41382d2417110a02000000000000000000000002091019222935404b55606c7884919dabb0a69a8e8174665c5145382c1f130600000000000000000c18232e3946535f6976828f9ca9afa499938a89898989898989898989898989898989898989898989898989899297a2adaa9d9084776b6054443a2f24190d010000000000000000000000000c18232e3946535f6976828f9ca9afa499938a89898989898989898989898989898989898989898989898989899297a2adaa9d9084776b6054443a2f24190d010000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000000000000000000714202d3a46525e6975828f9ba79d9083766c61564c414b555e696e7a828b9196999c9e9f9f9f9e9b9995908a837c726c655c5c666f7c8690959a9d9e9f9f9e9c9996918b847d736e605b544a3f332822190c02000000000000000000000000000000000000000613202d394653606c7885919eabac9f9286796d60636f7c8997a2ab9e9184786a5f53473a2e2115202c3945525d687683909ca9a49a8a7e71645d687683909ca9ac9f9285796d6053473a2e23170b000000000000000000000000000000000000000007121d2935404b55606d7985929ea9afa59d9a96969696969696969696969696969696969696969696999ca3adb5a99c8f8276695c4f4336291c100c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0706040000000000000000000000000000000000000000000000000007121d27313d45515d67707d89939d9d93897d70675d5c6976838f9ca4988b7e7165584b3e323c4855626f7b8895a29f9285796f7c8895a99f928578685d52453935424e5b6875818e9ba6998c807366594d4033261a0d00000000000000000109101920272b32373b3c40434546464544423e44505a616e7b86929f9f958c7f72695f53493f33404d5a6673808d99a69b8e8174685b4e413528303d4a5663707d8996a39f9285786c5f5245392c1f120000000a131c232a2f32333939393939393939393939393939392e38424e58606d7a85919e9f92877c6f655b50443a434e58626d75828f97968e81746c6157616d7a8794a0988b7f7265584c3f322519130c0500000000000000000000050d141a22282d31373a3b3f414445454646454441424e58606d7a85919e9f92877c6f655b5044434e58626d75828f97968e81746c6157616d7a8794a0988b7f7265584c3f322519130c050000000000000006121e2b37424d5765727e8b97a2adada1978c7f727c86929aa4a1969083796d655b50443e342b20170d090e1419222b343e45515d67717e8a96a0acab9f94887c6f62544b4034281c100400000000000814212e3b4754616e7a87939facafa3998c7f72675d51453b2f261b1206000000000000000000000000000000071018242f3944505b66727e8b99a3aeac9f9285796d6053463a2d201308000000000000000007121d2a36424d5764707d8a96a1adaba49f9796969696969696969696969696969696969696969696969696969fa2a9aea2988b7f7265594f4332281e13080000000000000000000000000007121d2a36424d5764707d8a96a1adaba49f9796969696969696969696969696969696969696969696969696969fa2a9aea2988b7f7265594f4332281e1308000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000000000000000000814212e3b4754616e7b87939fa1968a7e71645a504445515d676e7b848f949ea0a8a39f9c9a999a9b9e9f9d9590877f776d66606d79849198a0a79f9d979595989c9f9e96918780746c665b50443f342b1e140a00000000000000000000000000000000000000091623303c4956636f7c8997a1ada99c8f8276675d606d7985929faba196887b6f6255483c302419212d3a4754606d7a86929fac9f93877a6e615666737f8c99a8aea2988a7d7064544a3f34281c100300000000000000000000000000000000000000000c18242f3945515d67727f8c97a2adafa9a7a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a6a8adb5b5a99c8f8276695c4f4336291c1919191919191919191919191919191919191919191313100c070000000000000000000000000000000000000000000000010b151f2935414b55606b74818e97a19e9184796d60596875818e9ba6998c807366594d40313d4a5763707d8a96a39e9184776e7a8797a1a298877a6d6054473a36424d57697683909cac988b7e7265584b3f3225180c00000000000000010a131b222b32373c4347494d5052525352514e4b4746535e69727f8b949f9f92867b6e655b50443b404d5a6673808d99a69b8e8174685b4e413528303d4a5663707d8996a39f9285786c5f5245392c1f12000007121c252e353b3e4046464646464646464646464646464646464645525d68717e8a949f999083776c60564c413c46515b616d7a85919a938a7e71695e616d7a8794a0988b7f7265584c3f322519080200000000000000000000060f171f252a34393c4247484c4e505152535252514e4c48525d68717e8a949f999083776c60564c4146515b616d7a85919a938a7e71695e616d7a8794a0988b7f7265584c3f322519080200000000000000000814212e3a47535f697683909da9b3ab9e9185796d717e88939fa59f958e81776c605a50463c32291f150b02091019222935404b55606c7884919dabb0a69a8e8174665c5145382c1f130600000000030f1b27333f495364717e8b9aa4afac9f92867a6e61554b4033291d140a000000000000000000000000000000000007121d28333f4a54616d7a86929facaea298897d706356493d2f24190d0100000000000000000e1a26313b4653606d7984919eabb5afaca3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3abadb3ac9f92867a6d6054473d3221160c0100000000000000000000000000000e1a26313b4653606d7984919eabb5afaca3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3abadb3ac9f92867a6d6054473d3221160c01000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000000000000000004101d2935404b5565727e8b99a49e9184786d605346434e58606d798391969fa6a49f9992908e8d8d8e91969a9f99928c81786d66717e8a96a0a89f95908a88898b8f949da099938c81786c605b51463d30261c1106000000000000000000000000000000000006121f2b37434e586773808d9aa9b2a8988c7f7265555c6675828f9ba8a8998c7f7266564c4135291d27333f495364717d8a99a3aa9d908377685e55626f7c8896a1adaa9b8e8174665c5044382b1f1206000000000000000000000000000000000000000007121d2935404b55606d7a85929faab3b5b4b1acaa9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9fa3a6abb4b5a99c8f8276695c4f43362926262626262626262626262626262626262626262626201f1c18120b0300000000000000000000000000000000000000000000030d18242f3a434f59606d7a84919ea1968d80746b6066727f8c99ab9b8e817568574d42373f4a5465727f8b98a59b8f8275697885929eaa95887c6f6255493c3a46535e697885919ea49a897c6f6256493c2f231609000000000000000a131c252d343c43474e5355595c5e5f5f5f5d5b5853514d57606c77829098a3989082776c60574d42404d596673808c99a69b8e8175685b4e423528303d4a5763707d8a96a39e9285786b5f5245382c1f1200020d19232e3740464b4c535353535353535353535353535353535353534c56616c76828f989f948b7e71685e52463d3f46525e68707d88939f92857b6e66616d7a8794a0988b7f7265584c3f3225190c00000000000000000000060f18212930363e45494d5355595b5d5e5f5f5f5e5d5b58555356616c76828f989f948b7e71685e52463f46525e68707d88939f92857b6e66616d7a8794a0988b7f7265584c3f3225190c0000000000000000000815222f3b4855626e7b88959fabafa3998c7f73676c73808c939ea79e938c7f736c61584e443b31271d120700071018242f3944505b66727e8b99a3aeac9f9285796d6053463a2d2013080000000005121f2b3744505b6575818e9bacb6a99c8f8276685e5243392f21170b020000000000000000000000000000000000010b17222d3846525d6875828f9ca8b4aa9a8d807367564c4135291d1104000000000000000009141f2c3844505c6673808c99a3afbbb9b1acaa9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9fa7a9afb8bab1a79b8e8174685d5245392c20130400000000000000000000000000000009141f2c3844505c6673808c99a3afbbb9b1acaa9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9fa7a9afb8bab1a79b8e8174685d5245392c20130400000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000000000000000613202c3945515d6775828f9ca8998c7f72665c50444854606a74808d95a0a8a499938d87838180808184888d92989f938e81786c74818e9ba8a09690837d7b7c7e828991969f9f938e81746d62584e42382e23170b01000000000000000000000000000000000815212e3a47535f6a7784919eaaaca196887c6f62555465717e8b98a7a99c908376685d5246392d202b3744505b6574818e9babaa9a8d80736756535f6a7884919eabab9e9285796d6053463a2d20130a0000000000000000000000000000000000000000010d18242f3945515d6773808c98a2aebab1a7a09d93939393939393939393939393939393939393979aa2abb5a99c8f8276695c4f433633333333333333333333333333333333333333333333332d2c28231d150c030000000000000000000000000000000000000000010407131d28313d45525d68707d8a939e9f93887d6f6763707d8a99a39e918478695f53473f44505c6675818e9ba9998c7f736976838f9ca5988b7f7265574d423f4854616e7b8796a19f93867a6d6053473a2d20140700000000000008121c252e373f464e54585f6266696b6c6c6c6a6864605d55515b656e7b86929f9f948b7f72695e5346404c5966737f8c99a69b8f8275685c4f423529313e4a5764717d8a97a49e9184786b5e5145382b1e120006121e2a3540495157596060606060606060606060606060606060606060605a616e7b86929f9e92857a6d61594f4239414c56616b74808d95979083786d616d7a8794a0988b7f7265584c3f3225190c000000000000000000030d18212a333b42465055575f6265686a6b6c6c6c6b6a6865615f575a616e7b86929f9e92857a6d61594f42414c56616b74808d95979083786d616d7a8794a0988b7f7265584c3f3225190c0000000000000000030f1c28333f4a5465727f8b98a7b1ac9f92867b6e61606c77818e95a0a59f93887e716a60564d43392f231812080007121d28333f4a54616d7a86929facaea298897d706356493d2f24190d010000000613202d394653606c7885929eabb3a9988b7f7265564c4131271d0f050000000000000000000000000000000000000006111c2935414c5665727f8b98aab4aa9d918477685d5245392c201306000000000000000003101c28343f4a54616e7b87929facb9b1a7a0939393939393939393939393939393939393939393939b9ea5afb8aca095897c6f63564c4135291d110400000000000000000000000000000003101c28343f4a54616e7b87929facb9b1a7a0939393939393939393939393939393939393939393939b9ea5afb8aca095897c6f63564c4135291d110400000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000000000000000714202d3a4753606d7a86929fa096887b6e62544a414d56626f7c87939fa7a4999387807a7674737375777b80868e939f938c807376838f9ca99e918478706e6f71767d848f949f9d938b7f726a60544a3f34281d1207000000000000000000000000000000000915222f3c4855626f7b8896a0acab9e9184786a5f5354616e7b8795a0ac9f92867a6d6154473a2d222d394653606c7885929eaba298897d7063564e586774818e9aaaada197897c706356493d32261b0f03000000000000000000000000000000000000000007121d2935414c55606d7a85929faab4aca09591868686868686868686868686868686868686868a909aa6b5a99c8f8276695c4f433f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3a38342e271e150b00000000000000000000000000000000000001080d111314161f2935414c56616c75818e97a19a9184796d616d7a86929fa196887b6e6259504a4e56606d7985919ea197897d706673808d99a79c8f8275695f544d4a505b65717e8b98a99d908377675d5145392c2013060000000000040e1a242e374049515860626a6f7376787979787775716d67605c555f69727f8c959f9f92867b6e615a50444b5865727e8b98a59c8f8276695c4f432f24313e4b5864717e8b97a49d9083776a5d5044372a1d11000a16232f3b46515b63666c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6b69727f8c95a0978e81746b60544b403a444f59606d79839098958c80736b6d7a8794a0988b7f7265584c3f3225190c0000000000000000010b151f2a333c454d525a6164696e72747778787979787774726e6963605f69727f8c95a0978e81746b60544b40444f59606d79839098958c80736b6d7a8794a0988b7f7265584c3f3225190c000000000000000006121f2b3844505b6676828f9ca9b5a99c8f8276685e5b656d79839097a1a49a92867c6f685e554b403429241a1006010b17222d3846525d6875828f9ca8b4aa9a8d807367564c4135291d11040000000815222e3b4855616e7b8897a1adada197887b6e6255483b3022150b0000000000000000000000000000000000000000000d1924303c4855626f7b8898a2aeaca095877a6d6054473a2d2114070000000000000000000c17232e3846525e6975828f9ca8b2aca095898686868686868686868686868686868686868686868e939ea9b4aa9d9084776b6054443a2f24190d01000000000000000000000000000000000c17232e3846525e6975828f9ca8b2aca095898686868686868686868686868686868686868686868e939ea9b4aa9d9084776b6054443a2f24190d0100000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000000000000000a1724303d4a5763707d8a98a39e9184776a5f534246525e6875828f99a4a89f93877e746d6867666768696e737a818b929893887d7783909da5988c7f72666262656b707a828f959f9f92877c6f665c5044392f24180d00000000000000000000000000000005121e2a36424d5766737f8c99a8b2aa9a8d807467584e525e697783909daaa3998a7e7164544a3f33282f3c4956626f7c8997a1ab9f9285796d60534a5764707d8a98a3aea99a8d807467584e43372b1f13060000000000000000000000000000000000000000010d19242f3a45525d6873808d98a2aeaa9d9184777979797979797979797979797979797979797e8a97a3b0a99c8f8276695c4f4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4645403930271d120700000000000000000000000000000001070c13191d20212428242f3a444f59616d7a85929ea0968d80736a6876828f9ca89a8d80746b605b54585f68707d8a97a19e9185796d626f7b8895a09f93877b6e665e57545c606d7683909da4998c7f7266554b4035291d110400000000020c16202c364049525b626a6f767c80838585868584817e7a736d675e57606d78839099a2988f82766c62564d4a5764717d8a97a49d9083776a554b403529323f4c5965727f8c98a59c8f8276695c4f4336291c10000c1925323e4b57636d737979797979797979797979797979797979797979797978736d7883919a9e93897d70665c51453c3d45515c676f7c86929f93877d706d7a8794a0988b7f7265584c3f3225190c000000000000000007121d27313c464e575e616c71777b7f8183848586858584817f7b76706b60606d7883919a9e93897d70665c51453d45515c676f7c86929f93877d706d7a8794a0988b7f7265584c3f3225190c00000000000000000613202d394653606c7985929facb3a9988b7f726556535d676e7b859198a3a29891847a6e675c514540362c22180e0506111c2935414c5665727f8b98aab4aa9d918477685d5245392c2013060000000a1724303d4a5763707d8a96a9b3ab9e928578695f53473a2e2114030000000000000000000000000000000000000000000813202d394653606c7985929facb1a795897c6f6256493c2f23160900000000000000000006111c2a36424d5763707d8a96a1acaa9d9083797979797979797979797979797979797979797979818e9ba7aea2988b7f7265594f4332281e1308000000000000000000000000000000000006111c2a36424d5763707d8a96a1acaa9d9083797979797979797979797979797979797979797979818e9ba7aea2988b7f7265594f4332281e13080000000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000000000000000c1926333f4c5966727f8c99aa9a8d807467584e434754616e7b86929faba1968c7f736c615e565a5a575f61686d757e86929891857a83909ca3968a7d706354565960686d79839096a1999083786d60554b4035291c110600000000000000000000000000000714202d3a46525e697783909daaaea298897d7063564a4d566673808d99a9ab9b8e8175665b5044382b36414c566673808c99a9ab9b8e8275665c514753606d7a86929facab9e9184786a5f53473b2e21150900000000000000000000000000000000000000000008131e2935414c56616d7a86929faaaca0958a7d706c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c707d8a97a3b0a99c8f8276695c595959595959595959595959595959595959595959595959595953514b43392e23180c0000000000000000000000000000030b12181e24292c2d31353738323e46525e68717e8a939e9f93877c6f67717e8a95a09f92877d716c6667676a6e7a84919ea2988d8073665f6a7783909da4998f82786e696767666d727f8b959f9f93877b6e6154483b2f24180d010000000008131e28323e48525b636d727c82888c8f91929292908e8b857f796e695e5c666f7c87929f9f948b7e71685e524956626f7c8995a99e918578675d5145392c34404d5a6773808d9aa69a8e8174675b4e4134281b0e000d192633404c5966737f868686868686868686868686868686868686868686868578666f7d88939f9d9184796d60574d4237404b555f6a727f8b94999184796d7a8794a0988b7f7265584c3f3225190c00000000000000000c18242f39434e585f696e767e83888c8e909192929291908e8b87827d746d67666f7d88939f9d9184796d60574d42404b555f6a727f8b94999184796d7a8794a0988b7f7265584c3f3225190c00000000000000000815222f3b4855626e7b8898a2aeada197887b6e62554b555e696f7c86929fa4a1969083796d605b51483e342a20170c030d1924303c4855626f7b8898a2aeaca095877a6d6054473a2d2114070000000c1926323f4c5965727f8c98a5b2a99c8f837669574d42372b1e120600000000000000000000000000000000000000000006121f2b3844505b667783909daab1a4978b7e7164584b3e3125180b000000000000000000000e1a25303b4653606c7884919eabaca095897c6f6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6d7a86929facac9f92867a6d6054473d3221160c010000000000000000000000000000000000000e1a25303b4653606c7884919eabaca095897c6f6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6d7a86929facac9f92867a6d6054473d3221160c010000000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000000000000030f1b27333f49536874818e9bab978a7e7164574b3f4c5965727f8c99a3ab9e9184796d605a524c4d4d4d53565e616c717d8692978d80828f9ca396897c706356494f565d676e7a84919ea0958b7f72675d5145382d22170b00000000000000000000000000000815212e3b4854616e7b87939facab9f9285796d6053464956636f7c8997a1ab9e9285796c605346392d3946525e687783909daaa4998b7e7164544b45515d6776828f9ca9aca196887c6f6255493c31261a0e020000000000000000000000000000000000000000010d1924303a46525e6873808d98a3aea79c9083766b606060606060606060606060606064707d8a97a3b0a99c8f827669666666666666666666666666666666666666666666666666666666605c554b4034281c1004000000000000000000000000060d151d24292f35393a3e4144454645414c56616c75828f97a2999183796d6d7984919da39992857e78757474767b839096a19f92867b6e615864717d8a949e9f948f827b76747475797f87929fa1978e8174695e52463a2d1d130700000000010d1924303a44505a636e737f878f94999c9e9e9d9e9d9b98928c837b6e695e5f6a73808c95a09f92857b6e615a5054616d7a8797a1a197867a6d6053473a2d35414c566875828f9bac998c7f7266594c3f3326190c000d192633404c5966737f8c93939393939393939393939393939393939393939185786b6b74818e97a0968c7f73695f53463e39434e58626d75828f97968d80747a8794a0988b7f7265584c3f3225190c0000000000000004101d2935404b555f6a6e7b838a9095989b9c9a989898999c9b9a938f8981796d676b74818e97a0968c7f73695f53463e434e58626d75828f97968d80747a8794a0988b7f7265584c3f3225190c00000000000000000b1824313e4b5764717e8a97aab4ab9e928578695f53474d57606a717e8a929ca59f958e81756d635a50463c32291e150b0813202d394653606c7985929facb1a795897c6f6256493c2f2316090000000e1b2834414e5b6774818e9aa7b3a79a8d8074675a4d4131261a0e02000000000000000000000000000000000000000000030f1c28333f4a546875818e9ba8b3a6998d8073665a4d4033271a0d0000000000000000000009141f2b3844505b66727f8c99a3aea79a8d8174675c606060606060606060606060605765717e8b98a2aea79b8e8174685d5245392c2013040000000000000000000000000000000000000009141f2b3844505b66727f8c99a3aea79a8d8174675c606060606060606060606060605765717e8b98a2aea79b8e8174685d5245392c201304000000000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000000000000005121f2b3744505b657783909da499887c6f625549424d566875828f9baba9998c7f73675c514641404042474c525a626b707d8792928785919ea3968a7d7063574a434c555e68707d8a939e9f9285796d60544a3f33281c0f0300000000000000000000000004111d2935414c5665727f8b9aa4afab9b8e8275665c51444653606d7985929eaba197897c6f6356493c303a4754616d7a87939fac9f93867a6d615447404b5565727e8b98a7b1a8998c807366574d42362a1e120500000000000000000000000000000000000000000008131e2a36414c56616e7a86929fabab9f94897c6f63574e535353535353535353535764707d8a97a3b0a99c8f8276727272727272727272727272727272727272727272727272727272726d675c5145382c1f13060000000000000000000000060f181f272f353a4145474a4e505253525150505a616e7a85929fa0958d80736a707d89919fa297928a8482808183879095a09e938c7f72695e55616c75828f95a09f948f8783818082858b9299a29892857a6d61574d42362a1e0c010000000005111d2935414c56616c73808c92999f9f9992919091979c9e9f9590847b6e675c606d79839099a2978f82756c6156525e687885919ea995897c6f6256493c303946525d687784919ea49a897d7063564a3d3023170a000d192633404c5966737f8c999999999999999da0a7a9a29f999999999999999185786b616d7a85929e9f92867b6e615a50443a3c46515b616d7a85919a93887d7a8794a0988b7f7265584c3f3225190c0000000000000006131f2c3945515d676e7c8490959d9d9993908d8b8b8b8d8f92999f9c938e82796d616d7a85929e9f92867b6e615a50443c46515b616d7a85919a93887d7a8794a0988b7f7265584c3f3225190c00000000000000000d1a2633404d596673808c99a6b3a99c8f827669574d42454e58616c73808d939ea79e938c7f736c61584e443b30271d1207121f2b3844505b667783909daab1a4978b7e7164584b3e3125180b000000101c2936434f5c6976828f9ca9b2a5998c7f7266594c3f3326190900000000000000000000000000000000000000000000000b17222d404d5a6773808d9aa6b3a89b8e8175685b4f4235281c0f00000000000000000000030f1c28333f4a54616e7a86929facab9f9285796d60535353535353535353535353535f697683909caaaca095897c6f63564c4135291d110400000000000000000000000000000000000000030f1c28333f4a54616e7a86929facab9f9285796d60535353535353535353535353535f697683909caaaca095897c6f63564c4135291d1104000000000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000000000000000613202d394653606c7985929f9f93867a6d60534746525e697885919eaba297887b6e62554b40363031373a41465059616b727f8b93929197a1a4978b7e7164584b3e434c56616c75828f9ba2978b7f72665b5044382b1f12060000000000000000000000000713202c3945525d6876828f9cacafa3998a7e7164544a4044505c6675818e9baba9998c807366574d42363f4a5464717e8b9aa4a99d908376685e52463b4854616e7b8795a0acaa9d908377695f53463a2d211408000000000000000000000000000000000000000000020d1925303a46525e6874808d99a3aea69b8f82756a5f534746464646464646464a5764707d8a97a3b0aa9d91847f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f796d6053463a2d20130700000000000000000000060f18212a313940454c5254575b5d5e5f5f5e5d59565e68717e8b949e9f92877c6f6b737f8c93999e9f97918e8d8e90939aa09e938e81786d6056505a616e7a8390959e9f9993908e8d8e92979f9f9892867d70685e52453b30251a0e00000000000713202d3946525d68717e8a929fa198928b86848385888f949da0969083796d605c666f7c87939f9e938a7e71685e52566975828f9ca5988b7f7265574d42363b4754616d7a86939f9f93867a6d6154473a2e211407000d192633404c5966737f8c8c8c8c8c8c8c8c9095a0a297928c8c8c8c8c8c8c8c85786b5d68717e8b949f988f82766c61564c41353f46525e68707d88939a91847a8794a0988b7f7265584c3f3225190c00000000000004111d2935414c55606d798391969f9b938e8783807f7e7f8082878f949e9d948e81746a68717e8b949f988f82766c61564c413f46525e68707d88939a91847a8794a0988b7f7265584c3f3225190c00000000000000010e1b2834414e5b6774818e9aa7b4a79a8d8174675a4e413d46505a606c77818f95a0a59f93887e706a5f564c43392e2318110f1c28333f4a546875818e9ba8b3a6998d8073665a4d4033271a0d000000101d2a3643505d697683909ca9b1a4978a7e7164574b3e3124180b0000000000000000000000000000000000000000000000061926323f4c5965727f8c98a5b2a89c8f8275695c4f4236291c0f00000000000000000000000b17222d3846525e6875828e9ba8ada2978a7e7164574d42464646464646463f4a54626e7b88949fabaa9d9084776b6054443a2f24190d0100000000000000000000000000000000000000000b17222d3846525e6875828e9ba8ada2978a7e7164574d42464646464646463f4a54626e7b88949fabaa9d9084776b6054443a2f24190d01000000000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000000000000000714212d3a4754606d7a8798a29e918478675c51454754616e7a8797a1ab9e928578695f5343392f25262b30363e474f59626d74818e979ea1a9a6998c7f7366594c403b444f59626f7c88949e9e9184786c605346392d22170b0000000000000000000000000714212d3a4754606d7a86929facac9f92867a6d6054473a3f4a5464717e8a99a3aa9d908377695e52463a44505c6675828e9baca8998c7f7366564c413a46535e697783909daaaca095887b6e6155483b3025190d0100000000000000000000000000000000000000000008131e2a36414c56616e7b86929fabac9f93877b6e62564d423639393939393d4a5764707d8a97a3b0aca096918c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c877a6d6054473a2d211407000000000000000000030c18212a333c434b51565d6064686a6b6c6c6b69666260626c76828f98a2999083786d6d737f878f94989b9d9b9a9a9d9c9996918a81786d665c5046525e686e7a838b92979a9c9c9a9a9b9d9b9a938e867d706b60564c4133291f14090000000004111d2935414c56616d7a85929ea19792867f7a7776787c828d929d9f958c7f73685e606a73808d96a09e92857a6d61595965727f8c98a79c8f8275695e524641444f5964717e8a9aa49d908377685e5246392d20130700091623303c4956636f7d808080808080808083909d9f928580808080808080807f726556626c76828f989f948a7e71685d52453d36414c56616b74808d95958c808c99a5988b7f7265584c3f3225190c0000000000000613202c3945515d6773808d95a09b918c817b767372717273767b828f939e9f93877c6f626c76828f989f948a7e71685d52453d414c56616b74808d95958c808c99a5988b7f7265584c3f3225190c0000000000000003101c2936434f5c6976828f9ca9b2a5988c7f7265594c3f343e44505b656d79839097a1a49a92867c6f685e554b403428231a1017222d404d5a6773808d9aa6b3a89b8e8275685b4f4235281c0f020000111e2a3744515d6a7783909daab0a3968a7d7063574a3d3024170a00000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4b1a99c908376695d5043362a1d10000000000000000000000006111c2a36414c5663707d8996a0aca99c8f8276695e5246382d393939393844505c6673808d99a6aea2988b7f7265594f4332281e130800000000000000000000000000000000000000000006111c2a36414c5663707d8996a0aca99c8f8276695e5246382d393939393844505c6673808d99a6aea2988b7f7265594f4332281e130800000000000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000000000000000815212e3b4854616e7b8794aa9d9083776a554b404955626f7c8895a9a99c8f837669574d4231271d1a1e252a353e47515b616d7a85929ea7b1a79a8e8174675b4e41323e47535f6a75828f9ca096897d7063544a3f33281c0f030000000000000000000004101c2934404b5564717e8b99a3afa99c8f8376685d5245393a4754606d7a86929faca095877b6e6154473b4653606d7985929faba196887c6f6255493c36424d576673808d99a9b1a7988c7f7265564c41362a1d1105000000000000000000000000000000000000000000020e1925303b46525e6974818d99a3afa49a8e8174695e52463a2f242d2d313d4a5764707d8a97a3b0b2a8a09d99999999999999999999999999999999999999999999999999999993877a6d6054473a2d2114070000000000000000000b151e2a333c454d555d60686d7174777879787776736f6c65616e7b86929fa0958c7f736a6d727c82888b8f9091929291908d89847d756d665c544a414c565e686d787e85898d9091929291908f8b87817b706b60594f443a3021170d02000000000713202c3945525d6873808d97a19e92857c726d676a6a6f77808d95a09f92867a6e6158606d7984919aa1978e81756b6155616e7b88959f9f92867b6e615a524d5056606b75828f9ca4998c7f7366564c4135291d1105000915222f3b4854606b6f7373737373737374818e9b9e91847873737373737373726d62575a626e7b86929f9e91857a6d60584e42383a444f59606d798390989285929fa5988b7f7265584c3f3225190c0000000000000714212d3a4754606d7a85929f9e948c7f746e696765656566696e78818f98a39a8e817566626e7b86929f9e91857a6d60584e423a444f59606d798390989285929fa5988b7f7265584c3f3225190c0000000000000004111d2a3744505d6a7783909daab1a4978a7e7164574b3e31333f49535d676e7b859299a3a29891847a6e675c51453f352c22181926323f4c5965727f8c98a5b2a89c8f8275695c4f4236291c0f030000111e2b3844515e6b7784919eaaafa396897c706356493d3023160a00000000000000000000000000000000000000000000000b1824313e4b5764717e8a97a4b1aa9d9083776a5d5044372a1d110000000000000000000000000d1925303b4854606b7784919daaac9f93877b6e6153493f33272d2d2d3a4653606d7984919eabac9f92867a6d6054473d3221160c01000000000000000000000000000000000000000000000d1925303b4854606b7784919daaac9f93877b6e6153493f33272d2d2d3a4653606d7984919eabac9f92867a6d6054473d3221160c0100000000000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000000000000000815222f3b4855626e7b8895a19c8f8376695c5043495663707c8996a3a89b8e8175685b4e423128150e1319232c353f46525d68717e8a95a0aca99c90837669574d423637434e5864707d8a97a29a8e8174665b5044382b1f12060000000000000000000006131f2c3845515c6775828f9babb1a7988b7f7265564c41353945525d687683909ca9a7988b7e7165544b40495663707c8997a2ab9e9184786a5f53473b313c4956636f7c8997a1ada99c908376685e5246392d2013070000000000000000000000000000000000000000000008141e2a36424d57616e7b87929fabac9f92867b6e61564c4135291d24313d4a5764707d8a97a3b0bab2acaaa5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a093877a6d6054473a2d211407000000000000000007121d27303c454e575f676d737a7e81838586858483807c78706b69727e8b949f9f92867c6f666a6f757b7f82848586858483807c79706c605c544a423b444c565e666d72797d80838485868584827e7b746e6860594f473d32281e0f0500000000000714212d3a4754606d7a86929f9f958a7e716a605d585f656d7883919da3988d8073665c5d67707d88939f9e938a7d70675d5f697683909da3998e81756c615e565b60686f7d87939f9f93877b6e6155483b3025190d01000713202c38444f5960636666666666666874818e9b9e9184786b66666666666665625b51535f6973808c96a0978d80746a60544a3f343d45515c676f7c8692989298a2a5988b7f7265584c3f3225190c0000000000000b1825323e4b5865717e8b989e9c8f82756d615e57585858575e666e7b86929f9e9285796d606973808c96a0978d80746a60544a3f3d45515c676f7c8692989298a2a5988b7f7265584c3f3225190c0000000000000004111e2b3744515e6a7784919daab0a3968a7d7063574a3d302d38414b555e696f7d87929fa4a1969083796d605b51473e342a201725323e4b5865717e8b98a4b1a99c908376695d5043362a1d10030000121f2b3845525e6b7885919eabafa296897c6f6356493c3023160900000000000000000000000000000000000000000000000a1724313d4a5764707d8a97a3b0aa9e9184776b5e5144382b1e1100000000000000000000000008141e2c38444f5965727f8c98a3aea4998c7f73655b5044372b1f2a36414c5663707d8a97a1ada79b8e8174685d5245392c201304000000000000000000000000000000000000000000000008141e2c38444f5965727f8c98a3aea4998c7f73655b5044372b1f2a36414c5663707d8a97a1ada79b8e8174685d5245392c2013040000000000000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000000000000000916232f3c4956626f7c8995a29c8f8275695c4f424a5764707d8a97a3a79a8e8174675b4e4134281b0e08111a232935414c56616c7783909da8ab9f928578695e52463a323c4653606d7985929e9e9285796c605346392d201306000000000000000000000714202d3a4753606d7985929facaca095887b6e6155483b3035414c5666727f8c99a8a89b8f8275665c51454d576673808d99a9aa9a8d817467584e43372d394653606c7985929eabac9f93867a6d6154473a2f24180d01000000000000000000000000000000000000000000020e1a25303b46535e6974818e99a3aea3998d8073685d5245392e2324313d4a5764707d8a97a3b0b8b0aaa99f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f93877a6d6054473a2d21140700000000000000000c18232e39424e575f696e7980868a8e9091929291908c89837d746c6c77828f98a2999083786d6062696e7275777879787776736f6d66615a504a4238323b444c545c60676d707376777879787775716e69615e564f473d352b20160c000000000004101d2935404b5565727e8b98a29d9083766c6158514e535c66707d8a97a19e9185796d6055606b74818e96a19e91847a6d605964717e8a95a09e938b7e736e6869666c707a84919aa3998f8275695f53463a2d1e13080000030f1b27323d474f545659595959595b6874818e9b9e9184786b5e5959595959595751494d57606d7984919e9f93877c6f665c50443b34404b555f6a727f8b949fa2aaa5988b7f7265584c3f3225190c0000000000000e1b2835414e5b6874818e909192897c6f635b524d4c4b4c4d545e6976828f9ca297887b6e61606d7984919e9f93877c6f665c50443b404b555f6a727f8b949fa2aaa5988b7f7265584c3f3225190c0000000000000005121e2b3845515e6b7884919eabafa396897c706356493d30262f3a434d57606b717e8b929da69f958e81756d635a50463c32291e24313e4b5764717e8a97a4b1aa9d9083776a5d5044372a1d11040000121f2b3845525e6b7884919eabafa296897c6f6356493c3023160900000000000000000000000000000000000000000000000b1724313e4a5764717d8a97a4b0aa9d9184776a5e5144372b1e1100000000000000000000000002101c27333d4754616d7a86929facab9e9184786c6053463a2f242d3946525e6875828f9ba9aca095897c6f63564c4135291d1104000000000000000000000000000000000000000000000002101c27333d4754616d7a86929facab9e9184786c6053463a2f242d3946525e6875828f9ba9aca095897c6f63564c4135291d11040000000000000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000000000000000a1623303d495663707c8996a39b8e8275685b4f424b5764717e8a97a4a79a8d8074675a4d4134271a0e0008111924303a44505a64717e8a96a1aca297877b6e6154473b2e3845515c6674818e9ba197897c6f6356493c30231608000000000000000000030f1c28333f4a5463707d8a98a2aeaa9d908477695f53463a2d303c4855626f7b8896a1ac9f9285796d605346535e697784909daaa2988a7d7063574a3d322b3844505b6674818e9babafa4998b7e7165554b4035291d10040000000000000000000000000000000000000000000009141f2a36424d57616e7b87929fabab9f92857a6d60554b40342824313d4a5764707d8a97a3b0b0a69f9c93939393939393939393939393939393939393939393939393939393877a6d6054473a2d2114070000000000000004101c2834404b545f6a6e7b848c92989b9d9e9d9d9e9c9995908980776c6e7b86929f9f958c7f72695f5f6165686a6b6c6c6b696663605c5450443f383029323a424a50555c606367696b6c6c6b6a6865615e57524d443d352b23190e04000000000006131f2c3945515d6776828f9ca8988b7f72655a5045414a54606d7985919ea197897c70635659606d7a84919ea1968e81746b60606c78839098a39b908b807b777576797d849196a09f92877c6e62574d42362a1e0c020000000b16212b353d4448494d4d4d4d4e5b6874818e9b9e9184786b5e514d4d4d4d4c4a463f45515c67707d89939e999083786d60574d423639434e58626d75828f97a19f9f988b7f7265584c3f3225190c0000000000000c1926323f4c5965727f8283848586786d605346423f3e3f424d576773808d9aa995897c6f625c67707d89939e999083786d60574d4239434e58626d75828f97a19f9f988b7f7265584c3f3225190c0000000000000005121f2c3845525f6b7885929eabafa296897c6f6356493c302328313b454f59626c73808d949ea79e938c7f726c61584e443a302724313d4a5764707d8a97a3b0aa9e9184776b5e5144382b1e11050000111e2b3844515e6b7784919eaab0a396897d7063564a3d3023170a00000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1a99d9083766a5d5043372a1d10000000000000000000000000000b16202d3946525d6875818e9ba7aca096897c7063554b4135292e3a4754616d7a86929facaa9d9084776b6054443a2f24190d010000000000000000000000000000000000000000000000000b16202d3946525d6875818e9ba7aca096897c7063554b4135292e3a4754616d7a86929facaa9d9084776b6054443a2f24190d010000000000000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000000000000091623303c4956636f7c8996a29b8f8275685c4f424a5763707d8a96a3a79a8e8174675b4e4134281b07000008131e28323e4653606d7984919eaba9978a7d7064574a3d2d34404b5464717e8a97a8998c7f7266594c3f2f24190d01000000000000000006121f2b3844505b6674818e9baab3a9998d807366574d42362a2e3a47535f6a7884919eaba298897d7063564954616e7b8795a0ac9f9286796d6053473a2d28333f4a5464717d8a99a3aeab9c8f8275675d5145392c20130600000000000000000000000000000000000000000000020e1a25313b46535f6975818e99a4aea2988c7f72675c5145382d22313d4a5764707d8a97a3b0aa9f948f86868686868686868686868686868686868686868686868686868686867a6d6054473a2d2114070000000000000006131f2c3845515c666e7c8591969f9f9c9791909092989fa09d928d81786c727f8c959f9f92867b6e665b55585c5d5e5f5f5e5d5a5653504a423e342e26202930383f444b5153565a5d5e5f5f5e5d5c5854524d46413b322b231911080000000000000714202d3a4753606d7a86929fa196877a6e6154473e3944505c6674818d9aa9998d80736654515d67707d8a939e9f93887d70675d666f7c869299a29b928d86838283858a9196a09d938c80736a5f53453b31261a0e00000000040f19232b32383b3c404040414e5b6874818e9b9e9184786b5e51454040403f3e3a34404b55606b75818e97a0958c7f72695e52463e313c46515b616d7a85919a9393938b7f7265584c3f3225190c0000000000000c1825313e4a57636d7275767778796d665c5044383030363f4c5966727f8c99ab96897d706355606b75818e97a0958c7f72695e52463e3c46515b616d7a85919a9393938b7f7265584c3f3225190c0000000000000005121f2b3845525e6b7885919eabafa296897c6f6356493c30231f29333d47505a606c78828f95a0a59f93887e706a5f564c42392e23313e4a5764717d8a97a4b0aa9d9184776a5e5144372b1e11040000111e2a3744515d6a7784909daab0a3978a7d7064574a3d3124170a00000000000000000000000000000000000000000000000c1825323f4b5865727e8b98a5b1a99c8f8276695c504336291d100000000000000000000000000005111d2935414c56636f7c8995a0aca89b8e8174675d5145392c37434e5865727f8b99a3aea2988b7f7265594f4332281e13080000000000000000000000000000000000000000000000000005111d2935414c56636f7c8995a0aca89b8e8174675d5145392c37434e5865727f8b99a3aea2988b7f7265594f4332281e1308000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000000000000000916232f3c4956626f7c8995a29c8f8275695c4f42495663707c8996a3a89b8e8175685b4e422e23180c0000020c16202c3844505c6673808d99a9a6998c807366544a3f332e3a4754616d7a8796a19b8f827568564c4135291d110400000000000000000613202d394653606c7985929eabada197897c6f6256493c31262b37434e586774808d9aaaaa9a8d807367574d5565727e8b98a7a89c8f8275675d5145382c222d3a4754606d7a86929facac9f92867a6d6053473a2e23170c000000000000000000000000000000000000000000000009141f2b37424d57626e7b87939facaa9e9184796d6053493f3327313d4a5764707d8a97a3b0a99c8f82797979797979797979797979797979797979797979797979797979797976685d5245392c20130700000000000004111d2935414c56606d79849197a19e949089858384858b9297a29d938c7f726c78839098a3989083786c60574d4f5152535251504d4946443f383028231c171e262e34394045474a4d5051525352514f4b4846423b3630292019110800000000000000091623303c4956636f7c8998a39e918478685e524639343f4a5464717e8b97ac9c908376665b5055616b75818e97a19a9184796d60606a717e8792989f9d9992908f8f91979ea09d938e81786d60584e4333291f1409000000000007111921272c2f30333335414e5b6874818e9b9e9184786b5e514538333332312e2e39434f59616d7a85929f9f92867b6e61594f4339343f46525e68707d8786868686867f7265584c3f3225190c0000000000000916222e3a46515b636568696b676d675c544a3f41414142464e586673808d99a399887c6f625559616d7a85929f9f92867b6e61594f43393f46525e68707d8786868686867f7265584c3f3225190c0000000000000005111e2b3844515e6b7784919eaab0a396897d7063564a3d302317212b353f44505b666d79839197a2a49a92867c6f685e544b403428313e4b5864717e8b97a4b1aa9d9084776a5d5144372a1e11040000101d2a3643505d697683909ca9b1a5988b7e7265584b3f3225180700000000000000000000000000000000000000000000000d1a2633404d596673808c99a6b3a89b8f8275685c4f4235291c0f00000000000000000000000000010d1924303a4854606b7783909daaac9f92857a6d6054473c313b4754606a7783909dabac9f92867a6d6054473d3221160c0100000000000000000000000000000000000000000000000000010d1924303a4854606b7783909daaac9f92857a6d6054473c313b4754606a7783909dabac9f92867a6d6054473d3221160c01000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000000000000000915222f3c4855626f7b8895ab9c908376695d50434955626f7c8895a9a99c8f837669554b4034281c1004000004101c28343f4a54626f7c8996a1a99c8f8276665b5044382d3946525e687884919e9e918578685d5245392c2013070000000000000000091623303c4956636f7c8997a1adab9e9185786c605346392d2026313d4a5663707d8998a2aa9d918477695e535c6775828f9ca8a7988b7e7265554b403529202c3945515d6776828f9ca9aea3988a7d7164544a3f34281c100300000000000000000000000000000000000000000000030e1a26313c47535f6a75818e9aa4ada1978b7e71655b5044372b313d4a5764707d8a97a3b0a99c8f82766c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c5d564c4135291d11040000000000000613202c3945525d68737f8c96a09e938e827c787677797e859298a29f92867b6e6e7b86929f9f948b7f72695f53493f4546454443403c3a38342e261e17110c151c23282f34383a3d40434445464544423e3b3a36302a251f170e0800000000000000000c1925323f4c5865727f8b98aa9b8f827568564d41362e3b4855626e7b889aa49f9285796c60534f59616d7a85929ea0968d80746a60616c717e868e92999b9d9d9c9c9e9c9a96918a81786d665c50463c3121180d03000000000000070f161b202223262835414e5b6874818e9b9e9184786b5e5145382b2626251d27303d46525e68717e8b949f988f82756c61554b403536414c56616b70797979797979726d62564a3e3124180b00000000000006121e2a353f495157595b5d555c605c554b474e4e4e4e4d52575f6a76838f9c9f92867a6d6054525e68717e8b949f988f82756c61554b4036414c56616b70797979797979726d62564a3e3124180b0000000000000004111e2a3744515d6a7784909daab0a3978a7d7064574a3d312417192328333f4a545d676e7b859299a3a29891847a6d665c51453f35323f4b5865727e8b98a5b1a99d9083766a5d5043372a1d100400000f1c2835424f5b6875818e9ba8b3a6998c807366594d402f23180c00000000000000000000000000000000000000000000010e1b2834414e5b6774818e9aa7b4a79a8e8174675b4e4134281b0e000000000000000000000000000008131e2c38434f5965727f8b98a2aea2988b7e7165574d4237404b55626f7c8895a0aca79b8e8174685d5245392c20130400000000000000000000000000000000000000000000000000000008131e2c38434f5965727f8b98a2aea2988b7e7165574d4237404b55626f7c8895a0aca79b8e8174685d5245392c20130400000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000000000000000714212e3a4754616d7a8799a49d9184776a564c414754606d7a8797a1ab9e918478675c5145382c1f13060000000c17232e394653606c7884919eab9f9285796c605346392d36414c566975828f9ca197877a6d6054473a2d2114070000000000000006121f2b37434e586773808d9aa9b3aa9a8e8174655b5044372b1f202d3a4653606d7985929faca095877b6e6154606d7985929faca095877b6e6154483b2f241d2935414c5565727f8b98a7b1aa9b8e8175665c5044382c1f1206000000000000000000000000000000000000000000000009141f2b37434e58626f7c87939faca99d9184786c6053463d32313d4a5764707d8a97a3b0a99c8f8276696060606060606060606060606060606060606060606060606060605f524c443a2f24190d010000000000000714212d3a4754606d7a86929fa1978e81786f6a6a676d717c86929fa2988e81746a727f8c95a09f92867b6e655b50443b3039383633302d2c28231c150c06030a11171d23292c2d303436383939383735322e2d2a251f19140d050000000000000000000e1b2734414e5a6774818d9aa69a8d8073675a4d40302d3a4653606d7986939fa298877b6e615448525e68717e8a939e9f93877c6f675c616c717b81868b8f9192929291908d89847d746d665c544a3f342a200f060000000000000000040b0f1315161b2835414e5b6874818e9b9e9184786b5e5145382b1e1918151e2a36414c56606c778390999e938a7d70675d51453c2f3a444f5961636c6c6c6c6c6c65625b51463a2e221509000000000000010d18232d373f464a4c4f504b5153514c52545a5a5a5b575e61696f7c87929f9c8f8376675d514c56606c778390999e938a7d70675d51453c3a444f5961636c6c6c6c6c6c65625b51463a2e2215090000000000000003101d2a3643505d697683909ca9b1a5988b7e7265584b3f3225181017222d38424c555f69707d87929fa4a1969082786d605b51473e34404d596673808c99a6b3a89c8f8275695c4f4236291c0f0300000d1a2734404d5a6773808d9aa6b3a89b8e817568554b4034291c100400000000000000000000000000000000000000000005121e2a36424d576976838f9ca9b2a5988c7f7265594c3f3226190c0000000000000000000000000000020f1b27323d4754606d7a86929facaa9c908376695f53473845515c6774808d9aa7aca095897c6f63564c4135291d1104000000000000000000000000000000000000000000000000000000020f1b27323d4754606d7a86929facaa9c908376695f53473845515c6774808d9aa7aca095897c6f63564c4135291d110400000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000000000000000613202d394653606c7986939f9f928578685d524545515d677885919eab9f9386796d6053463a2d20130800000006121f2b3744505b6575818e9ba8a298887b6f6255483c2f30404d5a6673808d99a995887c6f6255493c2f221609000000000000000815212e3b47535f6a7784919eaaaea2988a7d706453493f33271b1f2c3845515c6775828f9baca7988b7e72655463707d8998a2aa9d908377695e52463a2d1d19242f3b4855616e7b8895a0acab9f9285796d6053463a2d20130a0000000000000000000000000000000000000000000000030f1a26313c47535f6a75828f9ba6aca0968a7d7064594f4438313d4a5764707d8a97a3b0a99c8f8276695c53535353535353535353535353535353535353535353535353535345413a32281e130800000000000004101c2934404b5565717e8b98a29e92857a6d6660585c606a717e8b96a19f92857a6d6d78839099a2988f82776c60574d42362a2b2a2723201f1c17110a03000000060c12181c1f2023272a2b2c2c2b2a292521201e1a140e0802000000000000000000000f1c2936424f5c6975828f9ca5988c7f7265594c3f322c3845515c667885929eaa96897c706356494c56616c75828f97a2999183796d605a61696e757b7f82848586858583807c78706c605c544b42382e22180e00000000000000000000000307090e1b2835414e5b6874818e9b9e9184786b5e5145382b1e120b0c1925303a44505b656f7c87929f9e9184796d60584e4138323d474f5556606060606060585651493f34291e12060000000000000007111c252d353a3e3f42434045474c565d616767676869696e727b8491999e938a7d7063554b44505b656f7c87929f9e9184796d60584e41383d474f5556606060606060585651493f34291e120600000000000000020f1c2835424f5b6875828e9ba8b3a6998c807366594d402f23180c111c262f3a434d57606b727f8b929da69f948e81746d63594f463c414e5b6774818e9aa7b4a79a8e8174675b4e4134281b0e0100000c1925323f4c5865727f8b98abb5aa9d908477675c5145382c1f13060000000000000000000000000000000000000000000714212d3a46535f697885929fabb4aa968a7d7063574a3d3024170a0000000000000000000000000000000a16202c3945515d6774818e9aa7ab9f94887b6e62544a3f4653606d7985929fabaa9d9084776b6054443a3024190d01000000000000000000000000000000000000000000000000000000000a16202c3945515d6774818e9aa7ab9f94887b6e62544a3f4653606d7985929fabaa9d9084776b6054443a3024190d0100000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000000000000006121f2b3844505b667884919ea297877a6d605447414c556976838f9ca9a499897c6f6356493c3025190d000000030f1b27333f495365727e8b98acaa988b7e7265584b3f30323f4b5865727e8b98a3978a7d7064574a3d3124170a000000000000000915222f3c4855626f7c8896a0acac9f9286796d6053473a2d22171c2834404b5565717e8b9aa4a89c8f8275665c6774808d9aaaa9998d807366574d42362a1e14212d3a46535f697784919daaada297897d706356493d32271b0f0300000000000000000000000000000000000000000000000915202b37434e58626f7c88949eaaa89d9083766b6054483c313d4a5764707d8a97a3b0a99c8f8276695c4f464646464646464646464646464646464646464646464646464639352f2820160c0100000000000006131f2c3845515c677683909ca9998c7f73675d544e5157606d7984919ea2988b7e71666f7c87929f9f948b7e72695e52463e32291f1a161312100c0600000000000001070c101314171a1d1e1f201f1e1c181514120e0902000000000000000000000000111d2a3744505d6a7783909da4978a7d7164574a3e312834404b546a7783909da4978a7d7164574a44505a616e7b85929fa0958c80736a5f575f61696e727577787979787673706c65615a514b423930261c0f0600000000000000000000000000020e1b2835414e5b6874818e9b9e9184786b5e5145382b1e120008131e27333f49535f6a73808d96a0968d80736a5f53493f33353d44484a5353535353534c4a463f372d23180d0100000000000000000a131c232a2e3132352f343946525d686d7474747475777b7f8591969e938e81746b6155433f49535f6a73808d96a0968d80736a5f53493f333d44484a5353535353534c4a463f372d23180d0100000000000000010d1a2734404d5a6773808d9aa6b3a89b8e817568554b4034291c100a141d28313b454f59626d74808d949fa69d938c7f726b61584e44424d57697683909ca9b2a6998c7f7366594c403326190d000000091623303c4956636f7c8999a4afac9f9286796d6053473a2d22170b0000000000000000000000000000000000000000000815222e3b4855616e7b8897a2adaea298887b6e6155483b2e22150800000000000000000000000000000004111d2935414c55626f7c88959faba6998d8073665c50444d5764717e8a97a2ada2988b7f7265594f4332281e1308000000000000000000000000000000000000000000000000000000000004111d2935414c55626f7c88959faba6998d8073665c50444d5764717e8a97a2ada2988b7f7265594f4332281e13080000000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000000000000030f1c28333f4a546976838f9ca995897c6f625649404d5a6673808d99aaab998c7f7266564c41362a1c11060000000b17222d3c4956626f7c899aa4a89b8e817568564c4136313d4a5764707d8a97a3988b7f7265584c3f3225190c00000000000005121e2a36424d5766737f8c99a8b2ac9c8f8275675d5145382c1b1118232e3b4754616e7a87939fac9f9285796d60697784919daaa197897c6f6256493c30251a121e2a36424d576673808d99a9b3a99a8d807467584e43372b1f13060000000000000000000000000000000000000000000000030f1b26313c4754606a75828f9ca6ab9f95897c6f63584e43373d4a5764707d8a97a3b0a99c8f8276695c4f43393939393939393939393939393939393939393939393939392c29241e160d04000000000000000714202d3a4753606d7986929fa197887b6f62554b4245515c6674818d9aaa9b8e8174686a73808c95a09f92867b6e615a50443b3025190e07060300000000000000000000000406070a0d1011121312110f0b080705020000000000000000000000000000121e2b3845515e6b7884919ea3968a7d7063574a3d30232e43505d697683909ca5988b7e7265584b3f46525e69717e8b949f9f92877c6f665c53575e6165686a6c6c6c6b696763605b535045403930271e140a0000000000000000000000000205070e1b2835414e5b6874818e9b9e9184786b5e5145382b1e1205020b17222d38414e58606d7984919e9f92877c6f655b50443b3033383c3d4646464646463f3e3a342d251b1106000000000000000000010a11181e22252628232e3a4754616d7a808181818284878c929796918b81796d60594f4438414e58606d7984919e9f92877c6f655b50443b33383c3d4646464646463f3e3a342d251b11060000000000000000000c1925323f4c5865727f8b98abb5aa9d908477675c5145382c1f13060b161f2a333d47515b606d78828f96a0a59f93877d706a5f564c47535f697885929eabb4aa978a7e7164574b3e3124180b0000000714202d3a4753606d7a86939facaea399897d706353493f33271b0f030000000000000000000000000000000000000004111d2935414c5565717e8b98a9b3ac9f9285786d6053463a2d201307000000000000000000000000000000010d19242f3a47545f6a7783909da9ab9e9184796d605346525e6976828f9ca9ac9f92867a6d6054473d3221160c020000000000000000000000000000000000000000000000000000000000010d19242f3a47545f6a7783909da9ab9e9184796d605346525e6976828f9ca9ac9f92867a6d6054473d3221160c020000000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000000000000000b17222d414e5b6774818e9aa4978b7e7164584b3e495663707c8998a2a99c8f8276685e5246382d22170b0000000614202d3a4753606d7a86939faa9e918477685e5246392f3c4956626f7c8995a2998c7f7266594c3f3326190c0000000000000714212d3a46535e697783909daaafa49a8b7e7165554b4035291d0a14202d3946525e687783909daaa298897c70636e7b8796a0ab9e9285796c605346392d20130e1a26313c4956636f7c8997a1adab9e9184786a6054473b2e2215090000000000000000000000000000000000000000000000000a15202b37434e58626f7c89949faba79c8f82756a5f53473b3d4a5764707d8a97a3b0a99c8f8276695c4f43362d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d201d19130c0400000000000000000916232f3c4956626f7c8999a39e9285796c6053463a404a5464717d8a97ac9d90847767606d79839099a2988f82766c62564d41362a20170c0200000000000000000000000000000000010305060605040200000000000000000000000000000000000000121f2c3845525f6b7885929ea396897c706356493d302936434f5c6976828f9ca5988c7f7265594c3f424d56626c76828f98a2999083786d60584e5254585c5e5f5f5f5e5d5a56535049413e342e271e150c020000000000000000000002090e1114141b2835414e5b6874818e9b9e9184786b5e5145382b1e12050006111b262f3c45515d67707d8a939e999083776c60564c41362a2c2f3039393939393932312e29231b1309000000000000000000000000070d121618191c212e3b4854616e7b878d8d8e8f9193938f8d89847e756d675c51473e2f3c45515d67707d8a939e999083776c60564c41362c2f3039393939393932312e29231b130900000000000000000000091623303c4956636f7c8999a4afac9f9286796d6053473a2d22170b040d18212b353f44505c666d7a849197a2a49992867c6f685e544b55626e7b8897a2adaea298887b6f6255483c2f2215090000000613202c3945515d677784909daab4ab9a8d8073655b5044372b1f140a000000000000000000000000000000000000010c13202c3945515d6775828e9ba8b5a89c8f8275665c5044382b1f12060000000000000000000000000000000008131e2b37434e5865717e8b97a2ada1968a7d7063564c54616e7b87939faca79b8e8174685d5245392c2013040000000000000000000000000000000000000000000000000000000000000008131e2b37434e5865717e8b97a2ada1968a7d7063564c54616e7b87939faca79b8e8174685d5245392c201304000000000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000000000000000061825323f4b5865727e8b98aa9a8d817467564c414653606d7986929fac9f92867a6e61544a3f33281d1207000006131f2c3945515d677885919eaba096877a6e6154473b2f3c4955626f7c8895a2998c807366594d4033261a0d0000000000000815212e3b4854616e7b8795a0acac9f93877a6e6154473b2f24180c111e2a36414c5666737f8c99a9aa998d807366717e8b97a8ab9b8e8174665b5044382b1f120913202d3a4653606d7985929eabada196887c6f6255493c31261a0e020000000000000000000000000000000000000000000000040f1b27323c4854606a76828f9ca6ac9f93877c6f62574d423d4a5764707d8a97a3b0a99c8f8276695c4f433629202020202020202020202020202020202020202020201413110d08010000000000000000000b1825323e4b5865717e8b98ab9c908376655b5044373b4855626e7b889aa49f9286796d60666f7c87929f9e948b7e71685e52463e32291e130800000000000000000000000000000000000000000000000000000000000000000000000000000000000000121f2c3945525f6c7885929fa296897c6f6356493c302935424f5c6875828f9ba6998c7f7366594c403b44505a616e7b86929fa0958c7f726a5f544a484c4f5152535252504d4946443f382f28231d150c0300000000000000000000050d14191e2021272835414e5b6874818e9b9e9184786b5e5145382b1e120500000a141d2935404b55616b75818e989f958b7e72685e52463d302723232d2d2d2d2d2d2524221e18110901000000000000000000000000000106090c0c15212e3b4854616e7b87949a9b9c9e938682807d78716c605c554b40352935404b55616b75818e989f958b7e72685e52463d3027232d2d2d2d2d2d2524221e18110901000000000000000000000714202d3a4753606d7a86939facaea399897d706353493f33271b0f03060f192328343f4a545d686e7b859299a3a29891847a6d665c515665717e8b98a9b3ac9f9285796d6053463a2d20130700000004101d2935404b556773808d9aa9b3ab9e9184786c6053463c2f261b1106000000000000000000000000000000000007131d28333f4a54606d7a86929facb1a7988b7f7265544a3f34281c100300000000000000000000000000000000010f1b26323c4753606d7985929faba99b8e8275685d525966737f8c99a4aca095897c6f63564c4135291d110400000000000000000000000000000000000000000000000000000000000000010f1b26323c4753606d7985929faba99b8e8275685d525966737f8c99a4aca095897c6f63564c4135291d1104000000000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000000000000000916222f3c4955626f7c8898a29d908377685d524545515c6775828e9ba8a3998b7f72665b5044392e23180f060004101d2935404b556a7784909daaa8978a7d7064574a3d2f3b4855626e7b8895a19a8d8074675a4d4134271a0e000000000005111d2a36414c5665727f8b98a7b1a99d908376685e5246392d1d12070e1925303c4955626f7c8896a1a99d9083766774818e9ba7a3998a7d7164544a3f33281c0f06121f2b3844505c6674818e9babb2a8998c807366574d42372b1e12060000000000000000000000000000000000000000000000000a15202c38434e5863707d89949faba49a8e8174695e52463d4a5764707d8a97a3b0a99c8f8276695c4f4336291c1313131313131313131313131313131313131313130707040100000000000000000000000d1a2633404d596673808c99a69b8e81746853493f333a4653606d7986939fa399887b6e61606a73808d96a09f92857b6e615a50443a3025190e04000000000000000000000000000000000000000000000000000000000000000000000000000000000000121f2c3945525f6c7885929fa295897c6f6256493c2f2935424f5c6875828f9ba6998c7f7366594c40323f46535e69727f8b949f9f92867c6e665b50443f42444546464543403d3937332d261d18120b0300000000000000000000050e171f252a2d2e342d35414e5b6874818e9b9e9184786b5e5145382b1e12050000020b18242f39434f59616e7b85929f9f92857a6e61594f43392e2318202020202020191815120d06000000000000000000000000000000060b0f12131c212e3b4854616e7b8793939495989a9285817d756e685e574d43392e242f39434f59616e7b85929f9f92857a6e61594f43392e23182020202020191815120d060000000000000000000000000613202c3945515d677784909daab5ab9a8d8073655b5044372b1f140a00071117232e38424c565f69707d87929fa5a0969082786d605b5d6875828f9ca8b5a99c908376665c5044382b1f1206000000010d18242f3d495663707c8997a1adaca196897d7063584e41382d22170f06000000000000000000000000000000071118242f3844505b66717e8b98a2aeaca095887b6e6155483b2e23170b0000000000000000000000000000000000000a151f2c3945515d6774808d9aa6ac9f92867a6d6154606b7784919eabaa9d9084776b6054443a3024190d0100000000000000000000000000000000000000000000000000000000000000000a151f2c3945515d6774808d9aa6ac9f92867a6d6154606b7784919eabaa9d9084776b6054443a3024190d01000000000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000000000000000713202d3a4653606d7985929f9f93867a6d605447404b5563707d8996a1ab9e9184786c60554b4034282118100b09111d2a36414c566a7784919daaa69a8d807367554b40343b4855616e7b8894a19a8d8174675a4e4134271b0e00000000000713202d3946525e6876838f9ca9b2a8998c7f7266564c41362a1e0b010815222e3b47545f6a7884919eab9f92867a6d7784919eaa9f92867a6d6054473a2d22170b03101c28343f4a5464717d8a99a3aeaa9d908477695f53473a2d211408000000000000000000000000000000000000000000000000040f1b27323d4854606b7683909ca7ac9f92867b6e61564c414a5764707d8a97a3b0a99c8f8276695c4f4336291c100d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0a0a08040000000000000000000e1a2734414d5a6774808d9aa69a8d8073675a4d402d3845515c677885929fab95887c6f6258606d79849199a2978f82756c61564c41362a20160c020000000000000000000000000000000000000000000000000000000000000000000000000000000000121f2c3845525f6b7885929ea296897c6f6356493c302936434f5c6976828f9ca5998c7f7266594c3f3336424d57606c78839098a3989083786c60574d41382d393939383634302d2b27221b140b070000000000000000000000020d17202930363a3b413a38414e5b6874818e9b9e9184786b5e5145382b1e120500000007121d27313e46525e68727f8b959f978e81756b60554b4034281f1509131313130c0b0906010000000000000000000000000000020a11171c1f2028232e3b4854616e7b86868687898c9195928e89827a6e695e544a40342827313e46525e68727f8b959f978e81756b60554b4034281f15091313130c0b0906010000000000000000000000000004111d2935404b556773808d9aa9b3ab9e9184786c6053463c2f261b11060006111c26303a444d57606b727f8b939da69f948e81746d62606d7a86929facb2a8998c7f7266544a3f34281c1003000000000713202d3a4653606d7985929eacb2a89c8f82756a5f53493f332721180f0802000000000000000000000003091119232935404b55606c7884919daab3a99d908477695f53463a2d1c110600000000000000000000000000000000000004101d2935404b55626f7b88949faba3998b7e726557636f7c8996a0aca2988b7f7265594f4332281e130800000000000000000000000000000000000000000000000000000000000000000004101d2935404b55626f7b88949faba3998b7e726557636f7c8996a0aca2988b7f7265594f4332281e130800000000000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000000000000000006121f2c3844515c6676828f9ca4998a7d7164554b404653606c7884919ea8a0968a7d71675c51453d332a221c18181a222d3946525e687885929eaba99d908376675c5145383c4955626f7c8895a2998d8073665a4d4033271a0d00000000000714212e3a4754616d7a86929facaca096887b6f6255483c3025190d0006131f2b37434e586774818e9aaaa399897d707b8796a0a99c8f8276675d5145392c1c1106000b17232e3a4754606d7a86929facaca095887b6e6155483b3025190d010000000000000000000000000000000000000000000000000a16212c38444f5963707d89959faba3998d8073685d52454a5764707d8a97a3b0a99c8f8276695c4f4336291c1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a171614100b05000000000000000e1b2835414e5b6874818e9ba6998d8073665a4d403334404b556b7885919ea396897c7063565c676f7c87939f9e938a7e71685e52463e32281e13080000000000000000000000000000000000000000000000000000000000000000000000000000000000121f2b3845525e6b7885919ea396897d7063564a3d30293643505c6976838f9ca5988b7f7265584c3f32313b44505b666e7b86929f9f958b7f72695f53493f33272c2c2b2a2723201f1b17110a0200000000000000000000000009141f29323b4246474d4745404e5b6874818e9b9e9184786b5e5145382b1e1205000000010b151f2a36414d56606c788390999e93897d70675c51453c31261a0e04060606000000000000000000000000000000000000020b141c22282b2d352e343a46535e69767979797a7c7f848c9399948f847b6e665c5144382c1f2a36414d56606c788390999e93897d70675c51453c31261a0e040606000000000000000000000000000000000000010d18242f3d495663707c8997a1adaca196897d7063584e41382d22170f06000a151e28323c454f59626d74818e949fa69d938c7f726b66727f8b98a3aeaca096887c6f6255493c2e23170b000000000006121f2c3844505c6673808d9aa4afaa9e94887c6f655b50443d332a2219140e09060400000100000406090e141a232b353d45515d67717e8a95a0acada2978b7e7265574d42362a1e0a00000000000000000000000000000000000000000c18242f3947535f6a7683909ca9ab9d908376695f6774818e9aa8ac9f92867a6d6054473d3221160c02000000000000000000000000000000000000000000000000000000000000000000000c18242f3947535f6a7683909ca9ab9d908376695f6774818e9aa8ac9f92867a6d6054473d3221160c0200000000000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000000000000000004101c2834404a5465727f8c98a79b8e8175675c514544505b66727f8c96a1a89e9184796d60594f453c342c272524262a343c4754616d7a86939facac9f9286796d6053473a3d495663707c8996a3998c7f7266594c3f3326190c0000000004101d2935404b5564717e8b99a3afaa9e9184776a5f53473a2e1e140800030f1b26323d4a5763707d8a98a2ab998c80737e8a97a8a8988c7f7265554c4135291d0a00000613202c3945515d6776828f9ca9b1a7988c7f7265564c41362a1e110500000000000000000000000000000000000000000000000004101b27323d4854606b7683909da7ab9f92857a6d60554b4a5764707d8a97a3b0a99c8f8276695c4f4336292727272727272727272727272727272727272727272727272423201c1710080000000000000f1c2835424f5b6875828e9ba6998c7f7366594c40332e44515e6b7784919ea3968a7d70635755606b74808d96a09e92857a6d615a50443a3024190d0400000000000000000000000000000000000000000000000000000000000000000000000000000000111e2a3744515d6a7784909da3978a7d7064574a3d312a3743505d6a7683909da4978b7e7164584b3e3128333f4a545f6a737f8c95a09f92867b6e655b50443b30251a1f1d1a1613120f0b0600000000000000000000000000020e1925303b444d52545a53514b4e5b6874818e9b9e9184786b5e5145382b1e120500000000030d1925303b44505b666f7c87929f9e9184796d60574d42372b20160c0200000000000000000000000000000000000000000a141d262d33383942434045464d575e6c6c666d6d6f72787f87939f969083786d6053463c312625303b44505b666f7c87929f9e9184796d60574d42372b20160c0200000000000000000000000000000000000000000713202d3a4653606d7985929eacb2a89c8f82756a5f53493f332721180f08030c16202a333d47515b606d78828f96a0a59f93877d706d7984919eaab4aa9d9184776a5f53473b2e1c1106000000000003101c28343f4a54616e7b87939fabb0a69c9083776c60584e453c342a251e1a1312100c070e070c1013131a1f262a353d47505a606d7984919ea7b1a99f9285796d6053473b31261a0e000000000000000000000000000000000000000007121d2b37434e5864717e8a97a1ab9f95887b6e616d7985929faba79b8e8174685d5245392c201304000000000000000000000000000000000000000000000000000000000000000000000007121d2b37434e5864717e8a97a1ab9f95887b6e616d7985929faba79b8e8174685d5245392c2013040000000000000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000000000000000000c18232e3b4855616e7b88959f9f9285796d6053473f4a54606d7984919ea6a0968c7f736b60574e463f3833313131363d46505a64717e8a9aa4afaea399897c6f6356493c3d4a5764707d8a97a3988b7f7265584c3f3225190c0000000006131f2c3945515d6775828f9babb3a99a8d807467584e43372b1f0d0200000a14202d3a4753606d7986929fa99c908376818d9aa7a096887b6e6155483b2f24190d000004111d2935414c5565727f8b98a7b1a99c908376685e5246392d201407000000000000000000000000000000000000000000000000000b16212c38444f5963707d8a95a0aba2988c7f72675c514a5764707d8a97a3b0a99c8f8276695c4f43363434343434343434343434343434343434343434343434343431302d28221a110800000000000f1b2835424e5b6875818e9ba6998c807366594d40333845525e6b7885919ea396897c7063564f59606d7984919ea1978e81756c61564c4135291f160c01000000000000000000000000000000000000000000000000000000000000000000000000000000101d293643505c6976838f9ca4988b7e7165584b3e322935414c566b7784919eac968a7d7063574a3d30222d38424e57606d78839099a2988f82776c60574d42362a20170d0d0a06050300000000000000000000000000000005111e2a36424d565e6167605c554e5b6874818e9b9e9184786b5e5145382b1e1205000000000008141f28333f4a545f6a73808d96a0968c8073695f53473e32281e13080000000000000000000000000000000000000006111c262f383f44464f504b51535452535f605c606162666c727f8b95a0958c7f7265574e42372b1f28333f4a545f6a73808d96a0968c8073695f53473e32281e1308000000000000000000000000000000000000000006121f2c3844505c6673808d9aa4afaa9e94887c6f655b50443d332a2219140e090e18212c353f44515c666d7a849198a2a49992867c717e8b96a0acaea3988c7f7265584e43372b1f0a000000000000000c17232e3846535f6975828e99a3afab9f948b7f726a60574e463e36302a25201f1c181b1a1b181c1f20262b31363f474f59616c74808d96a1adada2978d8073675d5145392a1f14090000000000000000000000000000000000000000010f1a26313c4653606d7985929eaca7998c7f7366717d8a98a2aca095897c6f63564c4135291d11040000000000000000000000000000000000000000000000000000000000000000000000010f1a26313c4653606d7985929eaca7998c7f7366717d8a98a2aca095897c6f63564c4135291d11040000000000000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000000000000000000714212d3a46535f697783909da2988a7e7164584e4345515c67717e8b949fa89f92877d70695f585048443f3e3e3f42464f58616c7683909cacaab0ab998c7f7266594c3f3f4c5865727f8b98a4978b7e7164584b3e3125180b000000000714202d3a4753606d7a86929facada297897c706356493d31261a0f00000006131f2c3845515d6775828f9ca89f92867983909daa9d918477695f53473a2d1e13080000010d19242f3b4855616e7b8895a0acac9f93867a6e6154473b2f24180d0100000000000000000000000000000000000000000000000004101c27333d4855616b7783909da7aa9e9285796d60544a5764707d8a97a3b0a99c8f8276695c4f4340404040404040404040404040404040404040404040404040403d3c39332c231a1005000000000e1b2734414e5a6774818d9aa69a8d8073675a4d40343744505b657885929ea295897c6f625649515d67707d89939d9e938a7d70685d52453e31281e13080000000000000000000000000000000000000000000000000000000000000000000000000000000f1b2835424e5b6875818e9ba6998c7f7366594c402e2c3945525d687985929fa49a887b6f6255483c2f22262f3c44505c666f7c87929f9f948b7e71695e52463e32291e1308000000000000000000000000000000000000000714202d3a46525e696e746d675f585b6874818e9b9e9184786b5e5145382b1e12050000000000020b17222d38424e58606d7984919e9f92867b6e625a50443a3024190c030000000000000000000000000000000000000b17222d38424a50535b5d555c60605d564c4a505354545b606c7883909d9e9184786a5f53473a2e21222d38424e58606d7984919e9f92867b6e625a50443a3024190c030000000000000000000000000000000000000003101c28343f4a54616e7b87939fabb0a69c9083776c60584e453c342a251e1a1312101a232834404a545e686f7c869299a4a29891847b85929ea8b2aa9f92867a6d6154473c32261b0f0000000000000006111c2a36424d57626e7b87929fa8b0a69f92877c6f695f585046413b36312d2c282327272723282c2d31373b42465159606b717e8a929da8b1a79f92857a6d61554b4035291d10040000000000000000000000000000000000000000000a151f2c3845515c6773808d9aa4aa9d9184776a75828e9baaaa9d9084776b6054443a3024190d010000000000000000000000000000000000000000000000000000000000000000000000000a151f2c3845515c6773808d9aa4aa9d9184776a75828e9baaaa9d9084776b6054443a3024190d010000000000000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000000000000000005121e2b37424d5765727f8c98a39c9083766a605447404b55606c77828f97a2a39992857b6f6a625a554f4c4b4b4c4d5359606a707d8a949f9b9ea6a89b8f827568574d42404b546774818e9aa896897c6f6356493c3023160900000003101c28343f4a5464707d8a98a2aeab9f9285796d6053463a2d20130a00000004101d2935404b5565727e8b98a7a3988a7d87939fa99a8d807367574d42372b1e0c010000000814212d3a46535f697784919daaafa4998b7e7165554b4135291d1104000000000000000000000000000000000000000000000000000b16212c38444f5964707d8a95a0aca1978b7e72665b505764707d8a97a3b0a99c8f8276695c4f4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4a49443e362c22170b000000000d1a2734404d5a6773808d9aa69a8e8174675b4e4130394653606c7986929fa895887b6e6255484b55606b74818e96a19e91857a6d60594f433a2f24190d0400000000000000000000000000000000000000000000000000000000000000000000000000000d1a2633404d596673808c99a69a8e817467544b40342d3a4754606d7a8798a29f93867a6d6053473a2d201d28343f4a545f6a73808d95a09f92857b6e615a50443a3025190e040000000000000000000000000000000000000814212e3b4754616e7b80796f6a605b6874818e9b9e9184786b5e5145382b1e120500000000000006111c262f3c45515d67707d8a939e988f82766c61564c4135291e150a0000000000000000000000000000000000030f1c28333f4a545b6068696b676d6d685d52454446474a505b6573808c99a196887b6e6255483b2f221c262f3c45515d67707d8a939e988f82766c61564c4135291e150a00000000000000000000000000000000000000000c17232e3846535f6975828e99a3afab9f948b7f726a60574e463e36302a25201f1c1818232e39424c565f6a707d87939fa5a09691859297a1adaea2988d8074685e5246392a20150a00000000000000000e1a26313b47535f6974808d96a0abaea39991857b6e6a615a524c46423c3a38342e3434342e34383a3c42474d535b626b707d86929fa4aeaaa0958b7f72685e5243392f24180d0100000000000000000000000000000000000000000004101c2834404b55616e7b87939faca095887b6f7985929faca3988b7f7265594f4332281e13080000000000000000000000000000000000000000000000000000000000000000000000000004101c2834404b55616e7b87939faca095887b6f7985929faca3988b7f7265594f4332281e1308000000000000000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000000000000000000020e1a26313c4754616d7a86929f9f94887c6f62584e4244505b656e7b859299a4a19791857c716c63615959585758575f616b707c869299938f939eab9e928578695f534745515c667683909da196877a6d6054473a2d21140700000006121f2c3844505c6674818e9baab4ab9b8e8175665c5044382c1f1206000000000c18242f3b4754616e7b8795a0aa9c8f838f99a4a297897c706356493d31261a0e0000000005121e2a36424d576673808d99a9b3ab9c8f8275675d5145392c2013070000000000000000000000000000000000000000000000000005101c28333e4653606c7883909da8a99e9184786c60555764707d8a97a3b0a99c8f8276695c5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a575550483e33281c10040000000c1926323f4c5965727f8c98a59c8f827669564c41363b4754616e7a8799a3a196877a6d605447434f59606d7a84919ea1978e81746b61554c4135291f160c01000000000000000000000000000000000000000000000000000000000000000000000000000a1724313d4a5764707d8a97a89d908376665c514538303d495663707c8996aa9e918477675d5145392c1f17232e38424e58606d79849199a2988f82756c61564c41362a20160c0200000000000000000000000000000000000815212e3b4854616e7b87837c726c656874818e9b9e9184786b5e5145382b1e1205000000000000000a141d2935404b55616c75828f989f948a7e71685d52453d30261c11060000000000000000000000000000000006121f2b3844505b666c75767778797a6d60544b403a3a3f495364717e8b97a8978a7d7164574a3e3124141d2935404b55616c75828f989f948a7e71685d52453d30261c11060000000000000000000000000000000000000006111c2a36424d57626e7b87929fa8b0a69f92877c6f695f585046413b36312d2c2823272727303a444e58616b727f8c939ea7a0989298a1a9b1a79f92867a6e61564c41362a1e1105000000000000000009141f2b37424d57606d79849199a4afaba19791847c706c615e56534d494644404141414141404546494d53575f616d727d869298a2aeaca2989083786c60564c4131281d120700000000000000000000000000000000000000000000000c18232e3946535f6976828f9ca9a7998c7f737d8a98a2ac9f92867a6d6054473d3221160c0200000000000000000000000000000000000000000000000000000000000000000000000000000c18232e3946535f6976828f9ca9a7998c7f737d8a98a2ac9f92867a6d6054473d3221160c02000000000000000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000000000000000000000914202d3946525e6874818e9aa49b8f82756a60544a3f49535e69717e87939fa3a19791867e76706b686564646567696e747d8592989387828f9baaa197887b6e6255484653606d7985929f9e918478675d5145392c2013060000000713202d3a4653606d7985929eabaea3998a7e7164544a3f34281c1003000000000714202d3a46525e697783909daa9f948f949fab9f9285796d6053463a2d20130900000000020e1a26313c4956636f7c8997a1adac9f92867a6d6054473a2e23180c00000000000000000000000000000000000000000000000000000b161f2b3744505b65717e8a95a0aca0968a7d7064626264707d8a97a3b0a99c8f827669676767676767676767676767676767676767676767676767676767676764615a5044392d2014080000000a1723303d4a5663707d8996a89e918477685e5246393c4956626f7c8995ab9e918478685d52453d45515d67707d8a939e9e938a7d70675d51453d31281d1207000000000000000000000000000000000000000000000000000000000000000000000000000815212e3b4854616e7b8796a09f9286796d6053463c36414c5665727f8c98ab9b8e817568554b4035291d111c26303c45515c676f7c87939f9e948a7e71685e52463e32281e130800000000000000000000000000000000000815212e3b4854616e7b8790867f776e6974818e9b9e9184786b5e5145382b1e120500000000000000020b18242f3a43505a616e7b86929f9e92857a6d60594f42382e23170c030000000000000000000000000000000613202d394653606c7881838485868275665c5145403f414a5464717e8b97a4988b7e7165584b3e32251818242f3a43505a616e7b86929f9e92857a6d60594f42382e23170c03000000000000000000000000000000000000000e1a26313b47535f6974808d96a0abaea39991857b6e6a615a524c46423c3a38342e34343430353c464f59636d74818e959faaa29fa2aab3aaa0958c7f72685e52443a3025190d010000000000000000030e1a26313c45515d676f7d87939fa4aea9a19691867e756e68615e575653514a4e4e4d4e4e4b515356575f62696e767f879298a2aaafa49a92867c6f665b50443a301f160c01000000000000000000000000000000000000000000000007121d2b37424d5764717d8a97a1aa9d908377818e9baaa79b8e8174685d5245392c20130400000000000000000000000000000000000000000000000000000000000000000000000000000007121d2b37424d5764717d8a97a1aa9d908377818e9baaa79b8e8174685d5245392c20130400000000000000000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000000000000000000005111d2935414c56626f7c87939f9f93877c6f665b5044414d57616c727f8b919fa3a198928b827d78757271717274777b81879297978e817d8998a3a9978b7e7164584b4a5463707d8a98a29c8f827569554c4135291d11040000000a1623303d495663707d8997a2adac9f92867a6d6054473a2e23170c000000000005111e2a36424d576673808c99a9a69f9c9fa6ab9b8e8275665c5044382c1f120600000000000913202d394653606c7985929eabaea3988a7d7164544a4034281c100400000000000000000000000000000000000000000000000000030f1b27333f4953606c7884919da8a89c9083766e6e6e6e707d8a97a3b0a99c8f8276737373737373737373737373737373737373737373737373737373737373706c6155493c3023160a0000000714212e3a4754616d7a8796a0a096877a6d61544740414d5765727f8c98ac9c8f827569564c4135414c55616b75818e97a19e91847a6d60594f43392f24180d030000000000000000000000000000000000000000000000000000000000000000000000000714202d3a46525e697784919ea398897d7063584e433f46525e6876828f9ca3998b7e7164584b3e2f24180c151e2834404b55606b74808d96a19e92857a6d615a50443a3024190d04000000000000000000000000000000000815212e3b4854616e7b8798928c827b7174818e9b9e9184786b5e5145382b1e1205000000000000000007131d28313e46525e69727f8c95a0978e81746b60544a3f34281f140900000000000000000000000000000006121f2b3844505b6677849091929285796d6058514a4c4b515b6673808d99a9978a7d7164574a3e312417131d28313e46525e69727f8c95a0978e81746b60544a3f34281f14090000000000000000000000000000000000000009141f2b37424d57606d79849199a4afaba19791847c706c615e56534d49464440414141414241464749505b606d79839098a2aeacaeb4aea2989083786d60564c4132291e13080000000000000000000009151f2935404b55606b727f8b929da4ada9a198928a817a746e696562605c545b5a5a5a5b545c606266696e747b828b9299a2aaaea39f93887e706a5f544a3f32291e0d04000000000000000000000000000000000000000000000000000e1a26313c4653606d7984919eaba095887b85929faba095897c6f63564c4135291d1104000000000000000000000000000000000000000000000000000000000000000000000000000000000e1a26313c4653606d7984919eaba095887b85929faba095897c6f63564c4135291d110400000000000000000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000000000000000000010d1925303a47535f6a75828f9aa49a9083786c60564c4145505a626d737f8a9298a0a29f948f8984817f7e7e7f8083878e92999992857b7986929fa79a8e817467564c505c6674818e9aa7988c7f7265594c3f2f24190d01000006131f2b37434e586774808d9aa9b3a99c8f8276675d5145392c1c11060000000000020e1a25303c4955626f7c8897a1adaba9abafa4998b7e7164544a3f34281c1003000000000006121f2b3844505b6674818e9babb4aa9b8e8175665c5144382c1f120600000000000000000000000000000000000000000000000000000b17222d3844505b66717e8b96a0ab9f948a7d7b7b7b7b7b7f8b98a5b1ab9e9184808080808080808080808080808080808080808080808080808080808080807e7064574a3d3124170a0000000713202d3946525e687784919ea8978a7e71645b514b4c535f6976828f9ca49a8c7f7266594c3f2f3a434f59616d7a85919ea1968e81746b60554b4035291f150b01000000000000000000000000000000000000000000000000000000000000000000000005121e2a36424d576773808d9aa69b8e81746a5f554e4a5059616d7a86929f9f92867a6d6154473a2e2114070c18232e39434f59606d7984919ea1978e81756c61564c4135291f160c010000000000000000000000000000000815212e3b4854616e7b879298948f857e74818e9b9e9184786b5e5145382b1e12050000000000000000010c161f2a36424d57606d788390999f93887c6f665c50443b31251a0d040000000000000000000000000000030f1c28333f4a546774818e9a9f978b7e716a605c5459555d606c7884919da297897c6f6356493c3023160c161f2a36424d57606d788390999f93887c6f665c50443b31251a0d04000000000000000000000000000000000000030e1a26313c45515d676f7d87939fa4aea9a19691867e756e68615e575653514a4e4e4d4e4f4c5254535b60636b6f7a85929facb8bab2a89f92867c6f665c50443b3020170d0200000000000000000000030d18242f3a434f59626d74808d929ca3adaaa29f938e86807b76726f6d6669686767676869666d6f72777b81868f949fa3ababa39f918c7f726c61584e42382d20170d000000000000000000000000000000000000000000000000000009141f2c3844505c6673808c99a4a79c8f828f97a2aa9d9084776b6054443a3024190d010000000000000000000000000000000000000000000000000000000000000000000000000000000009141f2c3844505c6673808c99a4a79c8f828f97a2aa9d9084776b6054443a3024190d0100000000000000000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000000000000000000000008131e2b37434e58626f7c87939f9f958b7f72685e53493f48515b636d737e8691969fa39f9c96918e8c8b8a8b8d9093999f9993877d707683909ca99d918477685d5253606d7985919ea095887b6e6155483b2e2215080000000815222e3b4754606a7884919eabb1a7988b7f7265554c4135291d0a000000000000000913202d394653606c7884919eabb8b6b9ac9f93867a6d6154473a2e23170c000000000000030f1c28333f4a5464717d8a99a3aeab9f9285796d6053463a2d22170b000000000000000000000000000000000000000000000000000006111b28333f4a54606d7884919ea8a69a8f8a88888888888b919ba7b3aca196918d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8074675a4e4134271b0e01000005111d2a36414c566673808c99a59d9083766d605c55565e656e7b87939f9f93877b6e6154483b2e313e46525d68717e8a939e9d93897d70675d51453d31271d12070000000000000000000000000000000000000000000000000000000000000000000000020e1a25303c4855626f7c88949f9f92867c6f676058545c606b73808d99a39c8f8275685e5246392d20130707121d27303d45515d67707d89939d9e938a7d70685d52453d31281d13070000000000000000000000000000000613202d394653606c787f86909597928a81818e9b9e9184786b5e5145382b1e1205000000000000000000040d1a25303b44505c666f7c87939f9a9083786d60574d42362a1f160c0100000000000000000000000000000b17222d3c4956626f7c89949f9f92857c716d66666666676d737f8c96a09f9285796d6053463a2d2013070d1a25303b44505c666f7c87939f9a9083786d60574d42362a1f160c0100000000000000000000000000000000000009151f2935404b55606b727f8b929da4ada9a198928a817a746e696562605c545b5a5a5b5c565d6163656c70757d839098a2aebab9aca0968a7e716a5f544a3f32291e0e0500000000000000000000000007131d28313d47515b606c77808c919ea1a9aea59e98928d87837f7c79777674747474747677797c7f83888e92999fa6aea8a199928b7f736d635a50463c2f261c0e05000000000000000000000000000000000000000000000000000003101c28343f4a54616e7b87939fac9e948f949ea9a3988b7f7265594f4332281e1308000000000000000000000000000000000000000000000000000000000000000000000000000000000003101c28343f4a54616e7b87939fac9e948f949ea9a3988b7f7265594f4332281e13080000000000000000000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000000000000000000000020f1b26323c47535f6a74818e97a29f92857a6d655b50443f49515b636c717c848c92989ea1a19e9b989797989a9d9f9f9791877e716b73808c99a09f93867a6d61545b65717e8a97a19d918477695f53473a2d2114080000000916222f3c4955626f7c8896a1adaca095877b6e6154483b2f24190d0000000000000005121f2b3744505b6574818e9aaab4bfb6a99c908376685e5246392d1c1106000000000000000b17222d3a4754606d7a86929facada297897d706353493f33271b0f0300000000000000000000000000000000000000000000000000000b17222d3844505c66717e8b96a1aca19a969595959595989ba3adb8b2a8a19e9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a8d8174675a4e4134271b0e010000010d1925303b4855626e7b88939e9f958b7f736d676767686d77828f99a49c908376695e53463a2d2935414c56616c75818e97a19e9184796d60594f43392f24180c0400000000000000000000000000000000000000000000000000000000000000000000000915212e3b47535f6a76828f9aa3999083796f6a6867666d717d87929f9f94897d7063564c41362a1e1105000b151e2935404b55606b74818e97a19e91857a6d60594f433a2f24180d04000000000000000000000000000006121f2b3844505b666c727c838c9299938e8e939e9e9184786b5e5145382b1e12050000000000000000000009141f28343f4a54606a74808d97a0958c7f72695e53463e31281d130700000000000000000000000000000615222e3b4754606a76828f98a29792857e7975737273757a8088939fa1978d8074665c5144382c1f120609141f28343f4a54606a74808d97a0958c7f72695e53463e31281d1307000000000000000000000000000000000000030d18242f3a434f59626d74808d929ca3adaaa29f938e86807b76726f6d6669686767676869686d7073787d82899095a0aab4b4b7aa9e9184796d605b51473e342a20160c030000000000000000000000010c161f2b353f44505b656c747f8a92979ea6acaaa29f9a93908c898684828181808181828486898c90959a9fa3ababa49f9691877e736d635b51473e342a1d140a000000000000000000000000000000000000000000000000000000000c17232e3846535e6975828f9ca8a69e9c9ea6ac9f92867a6d6054473d3221160c020000000000000000000000000000000000000000000000000000000000000000000000000000000000000c17232e3846535e6975828f9ca8a69e9c9ea6ac9f92867a6d6054473d3221160c020000000000000000000000000000000000000000000000000000000104000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060503000000000000000000000000000000000000000a15202b37434e58616d7a85929fa2978f81776c605a50464049515a616a6f797f868c9196999c9d9e9f9f9e9c9a98928d857d716c63707d899994949a8a7d706355606c7883909da3998c807366574d42372b1e1206000005121e2a36424d576673808c99a8b2aa9d908377695e53463a2d1e130800000000000000030f1b27333f495364707d8a98a2aeacb2a8998c7f7266564c41362a1d0a00000000000000000613202c3945515d6776828f9ca9b3a99a8d8174655b5044372b1f1205000000000000000000000000000000000000000000000000000006111c28343f4a54606d7984919ea8aba5a3a1a1a1a1a1a5a7adacacacb2acaba6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a69a8d8174675a4e4134271b0e010000000814212e3a47535f6975818e98a29f92877f79757474767a818f949f9e93897d7063574d42362a24303a44505a616d7a85929ea0968d80746b60554b40352920150a000000000000000000000000000000000000000000000000000000000000000000000006121f2b37434e58626f7c87939f9f9590837c77757475797e869299a2988f82766b6054443a3025190d0100030c18242f39434f59606d7a84919ea1978e81746b60554b40352921160a0000000000000000000000000000030f1c28333f4a545b606a6e787f8690959b9b9ea59e9184786b5e5145382b1e120500000000000000000000030b17232e38424e58606d7a84919e9f92867b6e615a50433a2f24180d010000000000000000000000000006131f2b37434e58616e7b869298a097928b8582807f8082858d939aa19892857a6d61544a4034281c1004030b17232e38424e58606d7a84919e9f92867b6e615a50433a2f24180d0100000000000000000000000000000000000007131d28313d47515b606c77808c919ea1a9aea59e98928d87837f7c797776747474747576777a7d8084898e939da0a7afaaa8abaca0968e81746d62594f463c32281e150b000000000000000000000000040d192327333f49535b606d737d858f949da0a7acaca49f9c989892918f8e8d8d8d8e8f919298999d9fa7acaca69f99938d847d716c635b51493f352c22180b020000000000000000000000000000000000000000000000000000000006111c2a36424d5763707d8a96a1acaaa8aab0a79b8e8174685d5245392c2013040000000000000000000000000000000000000000000000000000000000000000000000000000000000000006111c2a36424d5763707d8a96a1acaaa8aab0a79b8e8174685d5245392c201304000000000000000000000000000000000000000000000000000004090e11131314202d3a4753606d7a8693a0acac9f9286796c5f5346392c201312110f0c070100000000000000000000000000000000040f1b26323c46525e68717e8b949e9e938c80736c61584f474048505860676d737b8084898c8f9192929291908d8a85807a706b61606d798787878787878073665d67707d8a95a09f92867b6e6154483c31261a0e0200000714212d3a46535f697784909d9f9fa9998c807366574d42362a1e120500000000000000000b17222d3a4753606d7a86929f9f9f9fa196887b6f6255483c3025190d000000000000000004111d2935414b5565727f8b98a79f9f9e9184786c605346392d2013060000000000000000000000000000000000000000000000000000000b17232e3844515c66727e8b96a19f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9a8d8174675a4e4134271b0e0100000006121e2b37424d57616e7b859298a299928c8582818182868f939e9f958e81756b6054453b31251e28323e46525e68717e8a949e9f93887d6f675d51453d32271b0f0300000000000000000000000000000000000000000000000000000000000000000000030f1b26323c4754606a74808d949e9f95908983818082848b9298a29992857b6e61594f4432291e130800000007121d28313d45525d68707d8a939e9d93897d70675d51453d32271b0f0300000000000000000000000000000b17222d38424a50585f666d727c838c9299a0a79e9184786b5e5145382b1e1205000000000000000000000006111c26303d45515d67717e8a949e988f82756c61554b4035291d110400000000000000000000000000030f1b27323d46535f69707d8691969e9f97928e8c8c8d8f92989f9f9691867d6f685e5242392e23180c000006111c26303d45515d67717e8a949e988f82756c61554b4035291d1104000000000000000000000000000000000000010c161f2b353f44505b656c747f8a92979ea6acaaa29f9a93908c898684828181808182838487898c91969b9ea5acaba59e9b9ea1a89d938c7f726b61584e443a30271c1207000000000000000000000000071017222d384149505b636b707b828990959c9fa4acaca9aaa39f9d9c9b9a9a9a9b9c9d9fa3aaaaababa39f9b948f878079706b625a514940372e231a10060000000000000000000000000000000000000000000000000000000000000e1a25313b4653606c7884919e9f9f9f9f9fa095897c6f63564c4135291d110400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e1a25313b4653606c7884919e9f9f9f9f9fa095897c6f63564c4135291d110400000000000000000000000000000000000000000000000000080f151a1d1f2020202d3a4753606d7a86939f9f9f9f9286796c5f5346392c20201f1e1c18130c05000000000000000000000000000000000a15202a36414c56626d76828f97a19f93887e716a60594f473f464e555c60696e73797c7f82848586858583817d79736d6860595d67757a7a7a7a7a7a796d60606d7984919ea49a8e8174695e53463a2a1f15090000000815222e3b4855616e7b88959393939396897c6f6256493c31251a0e02000000000000000006131f2c3945515d6775828f93939393939184786a5f53473a2e1e13080000000000000000010d18242f3b4854616e7b87959393939396897c6f6256493c2f23160900000000000000000000000000000000000000000000000000000006111c2834404a54606d7984919393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393938d8174675a4e4134271b0e01000000020e1a26313c46525e69707d8692989f9f98928f8d8d8f92999e9f9590837a6d61594f4433291f16202a36414c56616c75828f97a29a9184796d60584e43372b1f130600000000000000000000000000000000000000000000000000000000000000000000000a15202b37434e58606d78828e939da09d95908e8d8e91969f9f9792877d70695f53473d3320170d02000000010c161f2935414c56616c75818e97a19e9184796d60594f44382c1f1307000000000000000000000000000006111c262f383f444e545c606a6f788087909593939184786b5e5145382b1e12050000000000000000000000000a141e2935414c55616c75828f9893948a7d70675d5145392c20130600000000000000000000000000000a15202a36424d57606b707c848c9196999c9b9999999b9d9a97928d847d6f6b60564c4130271c12070000000a141e2935414c55616c75828f9893948a7d70675d5145392c20130600000000000000000000000000000000000000040d192327333f49535b606d737d858f949da0a7acaca49f9c989892918f8e8d8d8e8f8f919696999ea1a8aaaca69f9c938e9196a1a59f93877d706a5f564c42392e2318110800000000000000000000000006111b262f383f44515961696e757d83898f939a9c9fa2aaa7a8aaa9a7a7a7a7a7a9a9a8a6a9a29e9b99928e88827c746d676059504840372e251c11080000000000000000000000000000000000000000000000000000000000000009141f2b3844505b66737f8c999393939393939084776b6054443a3024190d01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009141f2b3844505b66737f8c999393939393939084776b6054443a3024190d0100000000000000000000000000000000000000000000000009121a20262a2c2d2d2d2d3a4753606d7a8693939393939286796c5f5346392d2d2d2c2b28241e170f07000000000000000000000000000000040d1925303a44505a616e7b859299a39a92867c6f6b6159504641434b51565e61666d6f737677787979787674706d67615d564f555d686d6d6d6d6d6d6d67616b74808d96a19f93877c6f62574d42362a180e030000000c1926323f4c5965727f8686868686868684786c605346392d20130900000000000000000004101d2935404b5565727f86868686868686807467584e43372b1f12060000000000000000000714212d3a46535e697783868686868686868073665a4d4033271a0d000000000000000000000000000000000000000000000000000000000c18232e3945515c67727f86868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868074675a4e4134271b0e01000000000915202a36424d56616b707d868e92999b9d9b9a9a9c9d9a97928b837a6d685d52473d3321170e1925303a44505a616e7b85929393968d80736a6054473b2e2215080000000000000000000000000000000000000000000000000000000000000000000000040f1b27323d44515c666d79818a9195999c9d9b9a9b9e9c99928e857d706b61574d42352b210e050000000000040d19242f3a44505a616d7a85929393968d80746b6054483b2f2215090000000000000000000000000000000a141d262d333c424a50585f666d737c838686868684786b5e5145382b1e1205000000000000000000000000020c19242f3a43505a616e7b8686868686847a6d6053473a2d2014070000000000000000000000000000040e1a26313b454f59606a6f797f848a8d8f9192929291908d8a8580796f6b60594f443a301e150b00000000020c19242f3a43505a616e7b8686868686847a6d6053473a2d2014070000000000000000000000000000000000000000071017222d384149505b636b707b828990959c9fa4acaca9aaa39f9d9c9b9a9a9a9b9c9ea0a8a6abacaba39f9b94908981849198a2a49992867c6e685e544a40342823190b020000000000000000000000000a141d262d3340474f575e616b70777d82878b8f9298989a9b9d9e9e9f9f9f9e9d9d9b999797928e8a86817c766f6a605d554f473e362e251c130a0000000000000000000000000000000000000000000000000000000000000000030f1c28333f4a54616e7a8786868686868686867f7265594f4332281e1308000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1c28333f4a54616e7a8786868686868686867f7265594f4332281e130800000000000000000000000000000000000000000000000008121b242b323639393939393a4753606d798686868686868687796c5f5346393939393837342f2921190f0500000000000000000000000000000008131e29323f46525e69707d87929fa29892857d706b625a524c4440454d52545c606366696a6b6c6c6b696764605c55524c444c565d61616161616160606a707d88939fa2978e81756a5f53453b31251a06000000000b1825313e4a57626d7279797979797979786c655b5044372b1f1205000000000000000000000c18242f394a56626d7279797979797979746e6458463c31261b0f0300000000000000000005121e2a36424d5767717779797979797979736e63584b3f3226190c0000000000000000000000000000000000000000000000000000000007121c2834404b55626d727979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979746e64584c3f33261a0d0000000000030e1925303b444f59616b707a81868b8e9091929291908d8a857f786d685e564c41352b210f08131e29323e46525e69717e8686868686877c6f6256493c2f2316090000000000000000000000000000000000000000000000000000000000000000000000000a16202834404a545c676d747d84898d8f91929292918f8c87817b706b61594f453b3123190f0000000000000008131e28323e46525e68717e8686868686887c6f6356493c30231609000000000000000000000000000000020b141c222830383f444e545c606a6f77797979797872685c5043372a1d11040000000000000000000000000008131e28313e46535f696e7979797979786d675d5145392c20130600000000000000000000000000000009141f29333d474f5860676d72787d8082848586858483807e79736d6760594f473d32281e0c03000000000008131e28313e46535f696e7979797979786d675d5145392c20130600000000000000000000000000000000000000000006111b262f383f44515961696e757d83898f939a9c9fa2aaa7a8aaa9a7a7a7a7a8a9aaa8a6aaa29f9c99928f89837d757c86929aa4a29891847a6d665c51443f352b1d140a000000000000000000000000020b141b2227353e454d525960636b70757b7e8285888b8d8f9091929292929191908e8c8a8885817e7a746f6a626058514b433d352d241c130a010000000000000000000000000000000000000000000000000000000000000000000b17222d3846525e686e797979797979797979726d6256473d32261e140a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b17222d3846525e686e797979797979797979726d6256473d3220160c020000000000000000000000000000000000000000000000040f1a242d363d4245464646464545515c67767979797979797979756a5e523e454646464544403a332b21170c010000000000000000000000000000020d17202a36424d56606b727f8b929ca29792867d716c615e5650474242464a505356595c5e5f5f5f5e5d5a5753514b46413a444c5254545454545960696f7c86929aa49f92857b6e61584e4333291f1409000000000916222e3a46515b62656c6c6c6c6c6c6c6b605b53493f33271b0f030000000000000000000007121d2e3a45515b62656c6c6c6c6c6c6c67645c5247342a20150a00000000000000000000020e1a25313b45555f676a6c6c6c6c6c6c6c66635c52473b2f23170a00000000000000000000000000000000000000000000000000000000000c18232e3943515b62656c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c67645c52473c3024170b00000000000009141f29323e474f5960686e747a7e81838485858483817d79726d665e564c443a3023190f020d17202a36424d57626c717979797979796f6a6054473b2e221508000000000000000000000000000000000000000000000000000000000000000000000000040c18232e39424b555c606c70777c80838485868584827f7b756e6961594f473e332a1f110700000000000000010c16202a36414c56616c717979797979796f6b6054483b2f22150900000000000000000000000000000000020a11171e262e343c424a51585f626a6c6c6c6c6b6860564b3f33271b0f0200000000000000000000000000010c161f2a36424d575f616c6c6c6c6c6b605d554b4035291d1104000000000000000000000000000000030d17212b353d464e555c60666d70737677787978787674716d67605d554f473d352b20160c000000000000010c161f2a36424d575f616c6c6c6c6c6b605d554b4035291d1104000000000000000000000000000000000000000000000a141d262d3340474f575e616b70777d82878b8f9298989a9b9d9e9e9f9f9f9f9e9d9c9a9898928f8b86827d76706b707e88939fa5a0968f82786d605b51473d2f261b1106000000000000000000000000020a1117232c333b42464f54596063696e7276797c7e808283848585868585848382807d7b7975716d68625f58544e45403a312b231b120a010000000000000000000000000000000000000000000000000000000000000000000006111c2a36414d565e616c6c6c6c6c6c6c6c6c65625b51443f3830261c110600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006111c2a36414d565e616c6c6c6c6c6c6c6c6c65625b5146342b210e040000000000000000000000000000000000000000000000000915202b363f484e5253535353514a4b555c6c6c6c6c6c6c6c6c6c6a6359464b5253535352504c453d33291e1307000000000000000000000000000000050e1925303b444f59626d73808d929da29892877e756d68615a534e47433f4446494c4f5152535252504e4a4745403935323a414647474d535b626b707b859198a29e948b7e71685e52463c3121170d030000000006121e29353f49515759606060606060605e53504941382d22170b000000000000000000000001111d29343f48515658606060606060605a58524a413622180e04000000000000000000000009141f2933434d555b5d606060606060605a58524a40352a1f1307000000000000000000000000000000000000000000000000000000000007121d27303f4951565860606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060605a58524a41362b1f1408000000000000020d17202c353e474f565e61686e717577787979787674706d67605c544c443a32281e110700050e1a25303b45505a62656c6c6c6c6c6c6260584e43372b1f13060000000000000000000000000000000000000000000000000000000000000000000000000007121c273039434b515a61646b6f7376787979797775726e69615e574f473e352c21180e000000000000000000040d1925303a44505a61646c6c6c6c6c6c6360594f44382c1f1307000000000000000000000000000000000000060c141c2328303940444e54555d606060605e5c564e443a2f23170b000000000000000000000000000000040d1a26313b454d53555f606060605e53514b433a2f24180d0100000000000000000000000000000000060f19232b343d434b51545c606366696b6c6c6c6b6a6764605d55514b433d342b23190e0400000000000000040d1a26313b454d53555f606060605e53514b433a2f24180d0100000000000000000000000000000000000000000000020b141b2227353e454d525960636b70757b7e8285888b8d8f9091929293929291908f8d8b8885827e7a75706b63616c737f8c939ea79f948d80746d62594f41382d22170b000000000000000000000000000006111a202930363d44484f54565e6165666d6f7174757778787979787877767573716f6d6664605d56534e47433d352f281f191109000000000000000000000000000000000000000000000000000000000000000000000000000e1925303b444d52545f606060606060606060605f5e504a42382e23170b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b17232e38424a505e5f606060606060606060585651493f3422190f000000000000000000000000000000000000000000000000000e1a26323d4851595e606060605e575550515f606060606060605f5e595053585f6060605f5c574f453a2f24180c0000000000000000000000000000000009141f29323d47515b636e74808d929fa299928b817a706c625f57534e4745413c4043444546464543413d3a383435393a3d43474c52575f626d727d859197a1a0958f82756c62564d41342a200f050000000000010d18232d373f464a4c535353535353535246443f382f261b11060000000000000000000000010c18232d363f454a4b535353535353534e4c4741382f241006000000000000000000000000030d1721323b434a4f51535353535353534d4b4740382e24190e020000000000000000000000000000000000000000000000000000000000000b151e2d373f464a4c53535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353534e4c4741382f241a0e0300000000000000050e1a232c353d444c52565e6164686a6b6c6c6b6a6763605d55504a423a322820160c00000009141f29333f4850565860606060605f56544e463d32271b0f0300000000000000000000000000000000000000000000000000000000000000000000000000000b151e2730394045505559606366696b6c6c6c6b6965615e57524d453e352c231a0f060000000000000000000008131e29323e4850555760606060606056544f473d32271b0f0300000000000000000000000000000000000000020a11171e272e343c434749515353535351504b443c32281d12070000000000000000000000000000000009141f29333b4246485253535353514745403a31281d1307000000000000000000000000000000000000081119222b303940454a5053575a5c5e5f5f5f5e5d5a5753514b45413a312b2219110700000000000000000009141f29333b4246485253535353514745403a31281d1307000000000000000000000000000000000000000000000000020a1117232c333b42464f54596063696e7276797c7e808283848585868685848382807e7c7975726e686360595a636d75818e95999999928b7f726b6053493f33271b0f030000000000000000000000000000080e171f252a33383d44484d535f605c60626567686a6b6b6c6c6c6b6a6a68666462605c605f534d47433c383229241d160d07000000000000000000000000000000000000000000000000000000000000000000000000000008141f29323b41464753534d545b60666c6c6c6c6c6a5c544a3f34281c10030000000000000000000000000000000000000000000000000000000000000000000000000000000000000003101c28343f4a545c6a6c6c6c6c6c66605b544d4c4a463f372d23130c04000000000000000000000000000000000000000000000000111d2a36424e59636b6c6c6c6c6b64615a534d53535353535353534d535b60656c6c6c6c6b6861574c4034281c0f00000000000000000000000000000000020d17202b353f49525c646e74808c9399a29f938e857d756e6a625f5854524c49474540413f3e3e3d3d3e3f3f404045474a4e53565e61696e767e879297a1a1969083796d605a50443b3022180e0000000000000007111b252d353a3e3f46464646464646453937332d261d140a0000000000000000000000000006111b242d343a3d3f4646464646464641403c362f261d130000000000000000000000000000050f202932393f434446464646464646403f3b352e261c120800000000000000000000000000000000000000000000000000000000000000030c1b252d343a3e3f4646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646413f3c362f261d130800000000000000000008111a232c323b41464c5254585b5d5e5f5f5e5d5a5753514b443f38302820160e04000000020d17202d363f454a4b5353535353534947433d342b20150a000000000000000000000000000000000000000000000000000000000000000000000000000000030c151e272e343e44494f54565a5c5e5f5f5f5e5c5954524d46423b332c231a11080000000000000000000000020d17202c363e45494b5353535353534948443d352b21160a00000000000000000000000000000000000000000000060c151c232832373b3c444646464645433f3a322a20160c0100000000000000000000000000000000030d17212931363a3b4646464646453a39352f281f160c01000000000000000000000000000000000000000810191e272e34383f44464a4d505152535251504d4a47454039352f281f19100700000000000000000000030d17212931363a3b4646464646453a39352f281f160c01000000000000000000000000000000000000000000000000000006111a202930363d44484f54565e6165666d6f7174757778787979797878777573716f6d6665615e56544f515b606d79838c8c8c8c8c8c867d70655b5044372b1f1205000000000000000000000000000000050d141a21272c36424d575e6c6c6c6c6c6c6c6a665f5f5f5f5f5e5e66696c6c6c6c6c6c6c5e574d42362b272018130c04000000000000000000000000000000000000000000000000000000000000000000000000000001070e17202930363b424651575f666c72797979797975665c5044382b1f12060000000000000000000000000000000000000000000000000000000000000000000000000000000000000006121f2b3844505c66757979797979726c665f575146423b3229251e160e070100000000000000000000000000000000000000000000131f2c3945525e6b757979797978706c615f57514b434646424b51575f656c71787979797873685c5044372b1e110000000000000000000000000000000000050e19232d37404a525c646e737f8792979f9e97928a827b756f6a65605d565653514b4d4c4b4b4a4a4b4b4c4d4b515357585f62686d737b828b9299a19f9791847a6e675d51483e32291f100600000000000000000a131b23292e313239393939393939382d2b27221b140b02000000000000000000000000000009121b23292e3132393939393939393433302b241d140b0100000000000000000000000000000e1720272e3336373939393939393933322f2a241c140a00000000000000000000000000000000000000000000000000000000000000000009131b23292e313239393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393433302b241d140b010000000000000000000008111a202930363b4146474b4e5051525251504e4a47454039342e261e160e040000000000050e1b242d343a3d3e4646464646463c3b37322b22190f0400000000000000000000000000000000000000000000000000000000000000000000000000000000030c151d232833393d4348494d5051525352514f4c4846423b363029211a110800000000000000000000000000050e1b242c34393d3e4646464646463c3b38322b23190f040000000000000000000000000000000000000000000000030b121820262b2e2f37393939393837332f2820180f05000000000000000000000000000000000000060f171f262a2d2e3939393939382d2c29241d160d04000000000000000000000000000000000000000000070c151d23282e34383a3d4043444546454543413e3a38352f29241d160d07000000000000000000000000060f171f262a2d2e3939393939382d2c29241d160d0400000000000000000000000000000000000000000000000000000000080e171f252a33383d44484d5254545c60626567686a6b6b6c6c6c6c6b6a69676562605c5454524c484445515c676e7b808080808080807f786c605346392d2013060000000000000000000000000000000002090e16212d3a46535e69767979797979797771665b5253525a66707679797979797976695e53463a2d21160d07010000000000000000000000000000000000000000000000000000000000000000000000000000040c1318202830353e444d525b62696e787f8686868687796d6053463a2d201307000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d7987868686867f786e69625b524d443e3530282018130c0400000000000000000000000000000000000000000013202d394653606c7987868686847d756e69605c554f46454f545c60696e777e8586868685786b5f5245382c1f1200000000000000000000000000000000000007111b252e38414a525c646d727d8590949fa19e938f87817c76716d686663605d555a59585757575858595a555d6063676a6f747a80868f949fa39e9590857c6e685e554c41362d20170d000000000000000000010a11181e2225262d2d2d2d2d2d2d2b201f1b17110a02000000000000000000000000000000000911181d2224252d2d2d2d2d2d2d2726241f1a130b02000000000000000000000000000000050e161c2227292a2d2d2d2d2d2d2d2726231f19120a02000000000000000000000000000000000000000000000000000000000000000000010911181e2225252d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2726241f1a130b02000000000000000000000000080e171e252a3036393b3e42444546464543413d3a39352f28231c150c040000000000000009121b22292e31323939393939392f2e2b2720191007000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b121822282d32383b3c40434546464644423f3b3a36302a251f170f0800000000000000000000000000000009121b22282d3031393939393939302f2c27211911070000000000000000000000000000000000000000000000000000070c151b1f22222a2d2d2d2d2b2a27231d160f060000000000000000000000000000000000000000060d141a1e21222c2d2d2d2d2b20201d18130c040000000000000000000000000000000000000000000000030b12181c23282b2d30333638393939383734312d2c29241d18130c040000000000000000000000000000060d141a1e21222c2d2d2d2d2b20201d18130c04000000000000000000000000000000000000000000000000000000000000050d141a21272c33383b4246474a505355585a5c5d5e5f5f605f5f5e5d5c5a585553504a4746413b38404b555e696e73737373737373726c655b5044372b1f12050000000000000000000000000000000000000815212e3b4854616e7b86868686868683776a5d50464f5c6976828686868686867b6e6154483b2e211508000000000000000000000000000000000000000000000000000000000000000000000000000000070d161d2429323a414650565e616d727b828c929992877e71665c5044382b1f12060000000000000000000000000000000000000000000000000000000000000000000000000000000000000006121f2b3844505c66717e879399928c827b726d615e565046413a3229241d160d0700000000000000000000000000000000000000000b1825313e4b5864717e889396918a827b736d67615953525960666d737b828b929792877e7064574a3d3124170a0000000000000000000000000000000000000009131c262f38414a525b626b707b828c92989e9e99928e88837e7a76726f6d67696766656464646465666769676d7074777c81868d92999fa19e938e837b6e6a5f564d433a2f241b0e050000000000000000000000070d12161819202020202020201f13120f0b0600000000000000000000000000000000000000060c11151718202020202020201b1a17140e08010000000000000000000000000000000000040b11161a1d1e202020202020201a1917130e0800000000000000000000000000000000000000000000000000000000000000000000000000070d1216181920202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020201b1a17140e08010000000000000000000000000000050d14191e252a2d2e313537383939383734302d2c29241d17110a030000000000000000000911181d2124252d2d2d2d2d2c23221f1b150f07000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070c171c21272c2f303336383939393836322e2d2a251f1a140d0500000000000000000000000000000000000910171d2124242d2d2d2d2d2d23221f1b160f0700000000000000000000000000000000000000000000000000000000040a0f1315161e202020201e1d1b17120c050000000000000000000000000000000000000000000003090e1214151f202020201e1413110d07010000000000000000000000000000000000000000000000000000070c11171c1f202427292b2c2c2c2b2a2724201f1d18120d07010000000000000000000000000000000003090e1214151f202020201e1413110d0701000000000000000000000000000000000000000000000000000000000000000002090e161c21272c30363a3b3f4446494b4d4f5051525253535251504f4d4b4946443f3b3936302f39434d565e616666666666666665605b53493f33271b0f030000000000000000000000000000000000000815212e3b4854616e7b87939393939083776a5d50444f5c6976828f93939393877b6e6154483b2e21150800000000000000000000000000000000000000000000000000000000000000000000000000000710191f282f353e444c525a61696e767f8690949a93877e716c61544a3f34281c10030000000000000000000000000000000000000000000000000000000000000000000000000000000000000003101c28343f4a54616c717e87939a9490867f766e69615a524c443e352f281f191007000000000000000000000000000000000000000a1724303d4956626c717f8b919e948f868079706b615f5d606b6f797f868f949f93887e716c6155493c3023160a00000000000000000000000000000000000000010a141d262f384049515961696e787f868f949c9f9f9b94908b86837f7c7a77757472717170707172727376787a7d8084888e92989fa39f97928b81796e695f574e443b31281e1209000000000000000000000000000106090b0c1313131313131312060503000000000000000000000000000000000000000000000105090b0c131313131313130e0d0b0803000000000000000000000000000000000000000000060b0e1011131313131313130d0c0a07020000000000000000000000000000000000000000000000000000000000000000000000000000000106090b0c13131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313130e0d0b0803000000000000000000000000000000000002080e14191e202125282a2b2c2c2b2a2724201f1d18120c06000000000000000000000000060c111517182020202020201615130f0a040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050b10161b1f222327292b2c2c2c2b292621201e1a140e090300000000000000000000000000000000000000060c111517182020202020201615130f0a040000000000000000000000000000000000000000000000000000000000000003060809111313131312110f0b0701000000000000000000000000000000000000000000000000000205070813131313131207060401000000000000000000000000000000000000000000000000000000000000060b101213171a1d1e1f201f1e1d1a171413100c070100000000000000000000000000000000000000000205070813131313131207060401000000000000000000000000000000000000000000000000000000000000000000000000050b10161c1f252a2d2e34383a3c3e414244454546464645454442403e3c3a38342e2d2a2527313b444d5254595959595959595953504941382d22170b000000000000000000000000000000000000000815212e3b4854616e7b87949f9f9d9083776a5d50444f5c6976828f9c9f9f94877b6e6154483b2e21150800000000000000000000000000000000000000000000000000000000000000000000000000040f19222b313a41454f565e616c717b828b92989a93887e716c615a5042382e23170b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b17232e3842505a616c717e88939a98928b827b716c615e564f45413a312b22190f040000000000000000000000000000000000000815212d3945505a626d727f8b919c98928c847d756e69686d747c838c92989c918b7f726c625a5044392d2014080000000000000000000000000000000000000000020b141d262e373f474f575e666d727b828990949b9f9f9c9992908c89868482807f7e7e7d7d7e7e7f808284868a8d91969b9fa39f99938d857e756d675e574e453c32291f160c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080e111414181b1d1e1f1f1e1d1b171413100c070100000000000000000000000000000105090b0b13131313131309080603000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040a0f1315161a1d1e1f201f1e1c191514120e0903000000000000000000000000000000000000000000000005080a0b1313131313130909070300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000306070a0d101112131212100e0b070604000000000000000000000000000000000000000000000000000000060606060605000000000000000000000000000000000000000000000000000000000000000000000000000000000000050b1014191e2023282c2d2f3234353738383939393938373634322f2d2c2823201e191f29323b4246474d4d4d4d4d4d4d4c46443f382f261b1106000000000000000000000000000000000000000815212e3b4854616e7b8794a1aa9d9083776a5d50444f5c6976828f9ca9a194877b6e6154483b2e211508000000000000000000000000000000000000000000000000000000000000000000000000000a16212b343d434b515961686d757e858f949f9f93887f716c625a50483e30261c110600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006111c26303e48505a626c717f88939f9f948f857e756d686159514b433d342b21160a00000000000000000000000000000000000005111d29343e48505a626d727f8c929c9f96918a827b73717a818891959f9d928c7f736d625a50483e33281c1004000000000000000000000000000000000000000000020b141c252d353e454d545c60696e757c83898f93999da09f9c999992918f8d8c8b8a8a8a8b8b8c8d8f91939a9a9ea0a19e99928e87817a716c605d554d453c332a20170d040000000000000000000000000000050a0d0f10101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100f0d0a0500000000000000000000000002080d101213131313131313090806030000000000000000000000000000000000000000000000010407071213131313131313131313120f0a0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020507080b0f1112131312100e0a07060400000000000000000000000000000000000000000000060606060606000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030709090d1012131313110f0c08070502000000000000000000000000000000000000000000000000000000000006060606060600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040607090b0d0f1111121313121111100d0b08060603000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002090e1114171c1f20222527292a2b2c2c2d2c2c2b2a29272522201f1c1714110d17202930363a3b404040404040403f3937332d261d140a00000000000000000000000000000000000000000815212e3b4854616e7b8794a1a99d9083776a5d50444f5c6976828f9ca9a194877b6e6154483b2e211508000000000000000000000000000000000000000000000000000000000000000000000000030f1b27323d464e555d606b707a818a92979f9b918b7f726d625a50483e362c1e140a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a141e2c363e48505a626d727f8b919b9e97928a817a706b605d554e463d32271b0f030000000000000000000000000000000000000c17222d363f48515b636d737f8c929ca09e948f867f7d848d939aa09d938d80736d635b51483e362c22170b0000000000000000000000000000000000000000000000020a131b232c333b424a50575f616b6f767c82878c9196989c9fa29f9d9c9a99989797979798999a9c9e9fa39f9c9997918c86817c746d68625a514b433b332a21180e0500000000000000000000000000030a1016191c1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1c1916100a03000000000000000000060d14191c1f1f2020202020201515120f0a030000000000000000000000000000000000000001080d1113141f202020202020202020201e1b161009010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000104070c10121316181a1c1d1e1f1f201f1e1d1c1a181513120f0b060300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030607090b0d0f1111121313121211100f0d0a08070502000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000205060c10121316181a1c1d1e1f1f20201f1e1d1c1a18161312100c0605050e171f252a2d2e33333333333333322d2b27221b140b0200000000000000000000000000000000000000000815212e3b4854616e7b87949c9c9c9083776a5d50444f5c6976828f9c9c9c94877b6e6154483b2e21150800000000000000000000000000000000000000000000000000000000000000000000000007131f2c38434e5860676d747d858e939fa29b918b7f726d625a50483f362d241a0c020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020c1a242d363f48505a626d727f8b919ba29f938e857d746d6760584e43382c1f130700000000000000000000000000000000000006101b242d363f49515b636d73808d929da49e98928c8a91969fa49e938e81746e645b51493f362d241a10050000000000000000000000000000000000000000000000000109111a212930383f444d535960636b6f757b7f84888c8f929797999b9c9d9e9f9f9f9f9e9d9d9b99979992908c8884807a746f6a615d5650454039312920180f0600000000000000000000000000040d151c21262929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292926211c150d04000000000000000810181f25292b2c2d2d2d2d2d2d22211f1b150e060000000000000000000000000000000000040c13191d20212b2d2d2d2d2d2d2d2d2d2d2b27211b130a0100000000000000000000000000000000000000000000000000000000000000030506090c0e1011121313131211100e0b090605030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030506090c0e1011121313131211100e0b090605030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010507070b0d0f111213131312110f0d0b07070501000000000000000000020608080c0f1112131312110f0c080705020000000000000000000000000000000000000000000000000000000001080d1113181c1f20222527292a2b2c2c2c2c2b2a29272422201f1c1712100c06000000000000000000000000000000000000000000000000000000000000000000000000000000000000000104060b10121315171a1c1d1e1f1f201f1f1e1d1b19171514120e0906030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030607090b0e0f1112121313131212110f0d0b0907060300000000050d14191e20212626262626262626201f1b17110a020000000000000000000000000000000000000000000815212e3b4854616e7b878f8f8f8f8f83776a5d50444f5c6976828f8f8f8f8f877b6e6154483b2e2115080000000000000000000000000000000000000000000000000000000000000000000000000915222e3b4854606a6f79818a91979ea39c918c7f726d625b51483f362d241b12080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008121b242d363f48515b626d727f8c919ca39e97918a81796f6a6054483b2e2215090000000000000000000000000000000000000009121b242d373f49525b636e74808d929da5a39f99979ea1a69e948e81786c605c524940372d241b1108000000000000000000000000000000000000000000000000000000080f171e262e343b42464f54596063696e73777b7f8285888a8c8e8f9192929292929191908f8d8b8886837f7c78736e68625f58524c443f352f271f170e0600000000000000000000000000030d161f262d3235363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363635322d261f160d03000000000006101a222a303538393939393939392f2e2b2620181006000000000000000000000000000000040d161e24292c2d383939393939393939393937332c251c13090000000000000000000000000000000000000000000000000000000003060b0f121315181b1d1e1f2020201f1e1c1a181513120f0b0603000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003060b0f121315181b1d1e1f2020201f1e1c1a181513120f0b060300000000000000000000000000000000000000000000000000000000000000000000000000000000000004080d111314171a1c1e1f1f20201f1e1c1a171413110d08040100000000030a0f121415191c1e1f20201f1e1c191514120e090300000000000000000000000000000000000000000000000003090e13191d2023282c2d2f31333637383839393838373634312f2d2b28221f1c17110d0802000000000000000000000000000000000000000000000000000000000000000000000000000001070d1113171c1f20222426292a2b2b2c2c2c2b2b2a28262422211e1a1312100c060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010204050506060606050403010000000000000000000002090e1114141a1a1a1a1a1a1a1913120f0b0600000000000000000000000000000000000000000000000814212e3b4754616e7a8283838383828074675a4e414d5a6673808283838383827a6e6154473b2e2114080000000000000000000000000000000000000000000000000000000000000000000000000916232f3c4956626f7c848e9393939393918c7f726d625b51493f362d241b120900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009121b242d363f49515b626d727f8c9193939393938e847c6f6256493c2f231609000000000000000000000000000000000000000009121b252d374049525c646e74808d939da59f9f9f9fa79f948f82786d665b504a40372e251b12090000000000000000000000000000000000000000000000000000000000050c141c232831363d44484f54575e61666a6e7276797b7e80818384858586868584848382807e7c7a76726f6c65615e56534e46413a3229241d150d0500000000000000000000000000000a151f2831383e424343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343423e3831281f150a00000000020d18222c343b4144464646464646463c3a37312a22180e0300000000000000000000000000010c1620282f35393a4546464646464646464646433e372e251b100500000000000000000000000000000000000000000000000000060b1012171b1f20222527292b2c2c2d2c2c2b29272522201f1b17120f0b0600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060b1012171b1f20222527292b2c2c2d2c2c2b29272522201f1b17120f0b060000000000000000000000000000000000000000000000000000000000000000000000000001070c1013191d20212427292a2c2c2d2c2c2b29272421201d1913100d0701060b0f151a1f212226292b2c2c2c2c2a282621211e1a140d05000000000000000000000000000000000000000000030a0f151a1e24292c2e34383a3c3e4042444445464645444443403e3b3938332d2c28231c19130d08010000000000000000000000000000000000000000000000000000000000000000000003090e13181d2023282b2d2f3133353737383939393837373533312e2d2a26201f1c17110d0802000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020507080d0d0d0d0d0d0d0c060503000000000000000000000000000000000000000000000000000714202d3946525e686e767676767676746e64584c404b58636e737676767676766e685e5246392d2014070000000000000000000000000000000000000000000000000000000000000000000000010e1b2734414e5a67748186868686868686867f736d635b51493f372d241b1209000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009121b242d373f49515b636d737f86868686868686868174675a4e4134271b0e01000000000000000000000000000000000000000009131c252e37404a525c606c77818e93939393939393959082796d665c544a3f382e251c130900000000000000000000000000000000000000000000000000000000000000020a11171f262a32383d44484d5354575f6265666c6f717375767778797979787877767573716f6d676662605b53524c47433c3530282018120b03000000000000000000000000000005101c26313a42494e50505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050504e49423a31261c100500000008141f2a343e464d51525353535353534847433c342a20150a0000000000000000000000000008131e28323a41454752535353535353535353534f4940372c21160a0000000000000000000000000000000000000000000002080d11171c1f22272b2d2f323436373939393938373634322f2d2b27221f1c17110d08020000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080d11171c1f22272b2d2f323436373939393938373634322f2d2b27221f1c17110d0802000000000000000000000000000000000000000000000000000000000000000000060b12181d1f252a2d2e313336373839393939373634312e2d2a25201d18120d11171b1f262b2e2f323537393939393735322e2d2a251f170f0500000000000000000000000000000000000000060b151a1f262b2f35393a404446494b4d4f50515252535251504f4d4b4846443f3a38342e29241e19130c0400000000000000000000000000000000000000000000000000000000000000040a0f151a1d24292c2e34383a3c3e404244444546464545444342403d3b3a36312d2c28231c19130d0802000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005111e2a36414c565e6169696969696967645c52473c47525c6366696969696969615e564c41362a1e11050000000000000000000000000000000000000000000000000000000000000000000000010d1a2733404c58646e747979797979797979736d635b51493f372d251b12090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009121b252d373f49515b636d737979797979797979746e64584c4033271a0d010000000000000000000000000000000000000000010a131c252e384044505b656c7881868686868686868683796d675d544a42382d261c130a01000000000000000000000000000000000000000000000000000000000000000000060b141a21272c32383b4246484e5355545b6062646668696a6b6c6c6c6c6b6a6a68666462605d555553504946413b373229241e160e07010000000000000000000000000000000a16212d38424c545a5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5a544c42382d21160a0000000d1925303b4650585d5f60606060606055534e463c31261b0f030000000000000000000000030c19242f3a444c52545e6060606060606060605f5a52493e33271b0f000000000000000000000000000000000000000001070d13191c23282b2d3337393c3f41434445464646454443413e3c3937332d2b28221c19130d070100000000000000000000000000000000000000000000000000000000000000000000000000000001070d13191c23282b2d3337393c3f41434445464646454443413e3c3937332d2b28221c19130d07010000000000000000000000000000000000000000000000000000000000020a11171d24292c3036393a3e40424445464646454442403e3a3936302c29241d191b22272b31373a3b3f42444546464544423f3b3a36312921170d0300000000000000000000000000000000020a111720262b31373a4145474a515355585a5c5d5e5f5f5f5f5e5d5c5a575553504a46443f38353029241e160d070000000000000000000000000000000000000000000000000000000000070c151b20262b2f35393a3f4446484a4d4f5051525253525251504e4c4a4846423d3a38342e29251e19140d0500000000000000000000000000000000000000000000000000000000000000010407070a0d10111213131211100d0b07070501000000000000000000000000000000010406070a0d0f11121213131211100e0c0908060300000000000000000000000000000000000000000000000000000000000000000000000000010d1925303b444c52545c5c5c5c5c5c5a58524a4136404a52585a5c5c5c5c5c5c54524c443b3025190d010000000000000000000000000000000000000000000000000000000000000000000000000b1824303c48535c64676c6c6c6c6c6c6c6c66635b51493f372d251b130900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009131b252d373f49515b63666c6c6c6c6c6c6c6c67645c53483c3024180b00000000000000000000000000000000000000000000010a131c2627333f49535b666c757979797979797979776d675d554b42392f261c140a01000000000000000000000000000000000000000000000000000000000000000000000003090e161b21272c31363a3c4247484a50535557595b5c5e5f5f5f5f5f5e5e5d5c5a585553514b4946443f3836302b262019130c0400000000000000000000000000000000000d1926323e49545e666969696969696969696969696969696969696969696969696969696969696969696969696969696969696969696969696969696969696969696969696969696969696969696969696969696969696969696969696969665e54493e3226190d000000101c2935414d5862696c6c6c6c6c6c6c625f584e43372b1f120600000000000000000000000b151e2935414c565d606b6c6c6c6c6c6c6c6c6c6c645a4f43372b1e1200000000000000000000000000000000000000040c13181e24292e34383a3f4446484b4e50515253535352514f4d4b4846443f3938332d29241e18130c0400000000000000000000000000000000000000000000000000000000000000000000000000040c13181e24292e34383a3f4446484b4e50515253535352514f4d4b4846443f3938332d29241e18130c04000000000000000000000000000000000000000000000000000000060c141c23282f35393a4146474a4d4f515252535352514f4d4a4746413a39352f2924262d33373c4347484c4f5152535352514f4c4846423b33291f1409000000000000000000000000000000060c141c232831373c42474c5154545c60626466696a6b6b6c6c6b6b6a69676462605b5453504a45413a352f281f18120b0300000000000000000000000000000000000000000000000000030b121820262b31373a4145474a50535557595c5d5e5e5f5f5f5e5e5d5b595755534d4946443f3835302a251e170e080200000000000000000000000000000000000000000000000000000002080d111314171a1d1e1f201f1f1e1c1a181413110d0803000000000000000000000003080d111314171a1c1e1f1f201f1f1e1d1b181615130f0a0602000000000000000000000000000000000000000000000000000000000000000000000008141e29323b4146475050505050504e4c4741382f3840474b4d5050505050504746413b32291e1408000000000000000000000000000000000000000000000000000000000000000000000000000814202b36414a53585a60606060606060605957514940372e251b1309000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000109131b252e37404951575960606060606060605a58534a41362b2014080000000000000000000000000000000000000000000000010a1417222d38414a545b60686c6c6c6c6c6c6c6c6a605d554c433930271d140a020000000000000000000000000000000000000000000000000000000000000000000000000000040a0f161b1f252a2d31373a3b3f4446484b4d4e505152525353525151504f4d4b494745403c3937332d2a251e1b150d08020000000000000000000000000000000000000f1c2935424e5a6670767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767670665a4e4235291c0f000000121f2b3844515d697479797979797979766a5f53473a2e2115080000000000000000000007121d27303945525d686d78797979797979797979766c5f5346392d2013000000000000000000000000000000000001070d161d24293035383f444649505355585a5c5e5f5f605f5f5e5c5a585553504946443f38353029241d160d080200000000000000000000000000000000000000000000000000000000000000000001070d161d24293035383f444649505355585a5c5e5f5f605f5f5e5c5a585553504946443f38353029241d160d0802000000000000000000000000000000000000000000000000070f181e262e34394045474c5254575a5c5d5f5f605f5f5e5c5a5754524c47454039352f2f383f44464e5355595c5e5f5f5f5f5d5b5954534d453b31251a0e0200000000000000000000000000070f181e262e343c43474d53555d6064666d6f71737577777879797877777673716e6c6663605c54524c45413a3128231d150c040000000000000000000000000000000000000000000000070c151d232831373c42474b5154545c60626466686a6a6b6c6c6c6b6a6a686664615f575653504a46413a3630292019130d0500000000000000000000000000000000000000000000000003090e13191d202124272a2b2c2c2c2c2b29272421201d1913100c0600000000000000060b0f13191d20212426292a2b2c2c2c2b2b29272522211f1b15120e0903000000000000000000000000000000000000000000000000000000000000000000020d1720293036393b43434343434341403c362f262e353b3f404343434343433b3936302920170d0200000000000000000000000000000000000000000000000000000000000000000000000000030f1a252f3841484c4e53535353535353534c4b4640372e251c1309010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010a131c252e3740464b4c53535353535353534e4c4841382f251a0f030000000000000000000000000000000000000000000000000006111b262f38424a50535b60606060606060605d54514c433a31271e150b020000000000000000000000000000000000000000000000000000000000000000000000000000000000040a0f141a1e21262b2e2d3338393c3e40424344454646464545444342403e3c3a39352f2d2b27221b19140f0a040000000000000000000000000000000000000000101d293643505c6976828383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838276695c504336291d10000000131f2c3946525f6c79868686868686867c6f6255483c2f221509000000000000000000000c18232e39424f59606d7a85868686868686868686796c605346392d201300000000000000000000000000000000040c13181f282f353a41454a5053535b60626567696a6c6c6c6c6b6a69676562605b5353504a45413a352f281f19130c0400000000000000000000000000000000000000000000000000000000000000040c13181f282f353a41454a5053535b60626567696a6c6c6c6c6b6a69676562605b5353504a45413a352f281f19130c0400000000000000000000000000000000000000000000071019212a30383f444b5153565e616466696a6b6c6c6c6c6a696764615e5653514b45413a3c41495053585f6265686a6c6c6c6c6a6865615e574d42362a1e1205000000000000000000000000081019212a30383f444e53575f62676d7175797c7e8082838485858685848382807e7b7974706d66605d56524c433d342e271e160e050000000000000000000000000000000000000000000810191e272e343c43474d53555d6064666d6f7173757777787979787877767573706e696763605c54524c46413b322a251e170e0600000000000000000000000000000000000000000000060e141a1e24292c2d3134363738393938383634312e2d29251f1c17110a03000000020a11171b1f24292c2d313335373839393938383634322f2e2b26211e1a150e09030000000000000000000000000000000000000000000000000000000000000000050e171e252a2d2e3636363636363433302b241d242a2f32333636363636362e2d2a251e170e0500000000000000000000000000000000000000000000000000000000000000000000000000000008131d262f363c40414646464646464646403e3b352e251c130a0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010a131c252e353b3e40464646464646464641403c362f261d13080000000000000000000000000000000000000000000000000000000a141d262f383f44464e5353535353535353504745413a31281f150c03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003090e12151a1e2122282b2d2f313335363738393939393837373533312f2d2c2924201f1b17110e08020000000000000000000000000000000000000000000013202d394653606c79868f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f86796c605346392d2013000000131f2c3946525f6c79859293939393887b6f6255483c2f22150900000000000000000005101c2834404b54606b74818e979393939393939386796c605346392d2013000000000000000000000000000000070d161d2429313a40454c52545c6063656c6f727476777879797978777674716f6c6563605b54524c45413a3129241e160e070000000000000000000000000000000000000000000000000000000000070d161d2429313a40454c52545c6063656c6f727476777879797978777674716f6c6563605b54524c45413a3129241e160e070000000000000000000000000000000000000000071019232b333b424a50555d6065686d717375777879797978777573716d6865605d55524c44464e535b60646a6e727577787979787775726e695e53463a2d211407000000000000000000000008111a222b333c424a50585f62696e747a7e8185888b8d8f90919292929291908f8d8a8885817d79736d68605d564f454039302820160e050000000000000000000000000000000000000009111a222a303940454e53575f62676d7175797b7d8082838485858685858483817f7d7b7874706d66615e56524c443e36302920180f070000000000000000000000000000000000000000060f181f262b3035393a3d404344454646454443403e3a3935302c28231c150c0802070b141b22272b2f35393a3d40424445454646454443413f3c3b37322e2b26201a150e060000000000000000000000000000000000000000000000000000000000000000050d14191e20212929292929292726241f1a13191f23262729292929292921201e19140d0500000000000000000000000000000000000000000000000000000000000000000000000000000000010b141d252b303334393939393939393933322f2a231c130a01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010a131c232a2f323339393939393939393433302b251d140b01000000000000000000000000000000000000000000000000000000020b141d262d333839424646464646464646443a39352f281f160d0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000205090e1214171c1f2022242628292b2c2c2c2c2c2b2b2a2927252220201d1813120f0b060000000000000000000000000000000000000000000000000013202d394653606c7986939c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9386796c605346392d2013000000131f2c3946525f6c7985929f9f9f95887b6f6255483c2f2215090000000000000000050e1b242c3845515c666f7c88939fa99f9f9f9f9f9386796c605346392d201300000000000000000000000000000810191f282f353e434b51565d60666d7074787b7e81838485868686858482807e7b7874706c66605d56514b433e353028201910080000000000000000000000000000000000000000000000000000000810191f282f353e434b51565d60666d7074787b7e81838485868686858482807e7b7874706c66605d56514b433e35302820191008000000000000000000000000000000000000050e19222b353d454d545c60676d72767a7e80828485858686858482807d7a76726d67605d565050585f656c71767b7f82848586868584827f7b6e6154483b2e2115080000000000000000000007111a232b343d454d545c606a6e757b81868a8e929897999c9d9e9e9f9f9e9e9d9c9a9797928e8985807a736d686059514b423a322820170e05000000000000000000000000000000000009121b232c343c424b51585f62696e747a7d8185888a8c8f9091919292929191908e8c8a8884807d79736d68615e565046413a322a211910070000000000000000000000000000000000020a1117212a31373a4145474a4d505152535252514f4d4b4746413a38342e261e19130d12181d262d33373a4145474a4d4f51525253525251504e4b4947433c3a37312b2620180f06000000000000000000000000000000000000000000000000000000000000000002080d1114141d1d1d1d1d1d1b1a17140e080e1317191a1d1d1d1d1d1d1414110d0802000000000000000000000000000000000000000000000000000000000000000000000000000000000000020b131a202427272d2d2d2d2d2d2d2d2625231e19120a010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010a12191e2325262d2d2d2d2d2d2d2d272724201a130b020000000000000000000000000000000000000000000000000000000000020b141c22282b2d353939393939393939372d2c29241e160d040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000206060b0f121315181a1b1d1e1f1f20201f1e1e1d1c1a18161413110d07050300000000000000000000000000000000000000000000000000000013202d394653606c7986939f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9386796c605346392d2013000000131f2c3946525f6c7985929faca295887b6f6255483c2f22150900000000000000020c16202b37424d57606d7983919aa4afacacacac9f9386796c605346392d20130000000000000000000000000009111a222b313a41454f555d60686d73797d8185888b8d8f919292939292918f8d8b8885817d78726d68605d555046413a322b221a11090000000000000000000000000000000000000000000000000009111a222b313a41454f555d60686d73797d8185888b8d8f919292939292918f8d8b8885817d78726d68605d555046413a322b221a110900000000000000000000000000000000020d17202b343d474f575f666d72797e83878a8d8f909292939292918f8d8a86837e79736d68605b5a626a6e787d83888c8f9192929292908e8c8275685b4f4235281c0f000000000000000000050f19232b353d464e575f666d727c81878e92999b9fa2aaa6a8aaa9a8a7a7a8a9aaa9a6a9a29e9a97928d85807a706b605c544c443a322920170c0300000000000000000000000000000009121b242d353e464e545c606a6f757b81868a8e929797999b9d9d9e9f9f9f9e9d9d9b999796918d8985807a746e68615a524c443c332b22191007000000000000000000000000000000020b141b2227333c42464c5254575a5d5e5f5f5f5f5e5c5a5754524c46443f38302a251e171d24292f383f44464c515457595c5d5e5f5f5f5e5e5c5a5855534e4847423c37312a2117110a020000000000000000000000000000000000000000000000000000000000000000010507081010101010100e0d0b08030002070a0c0d1010101010100807050100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001080f14181a1b2020202020202020191916120d07000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070d1216191920202020202020201b1a18140f080100000000000000000000000000000000000000000000000000000000000000020a11171c1f20282d2d2d2d2d2d2d2d2a21201d19130c040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030606090b0d0f101112131313121211100f0d0b090706040100000000000000000000000000000000000000000000000000000000000013202d394653606c798693939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939386796c605346392d2013000000131f2c3946525f6c7985929faca295887b6f6255483c2f2215090000000000000008131e28323a47535f69737f8c95a0acb6b8b9beac9f9386796c605346392d201300000000000000000000000009121b232c343d434b515961676d737a7f848a8e92979899969494989298949496999897918e89847f7a736d67615a524c443d342c231b1209000000000000000000000000000000000000000000000009121b232c343d434b515961676d737a7f848a8e92979899969494989298949496999897918e89847f7a736d67615a524c443d342c231b120900000000000000000000000000000008141e29323d464f5960696e787f858b90939a999c9d9e9f9f9f9f9d9c9a9992908b85807a726c65636c717c838a9095989b9d9f9f9f9f9d9b8e8275685b4f4235281c0f0000000000000000030d17212b353d474f5860696e787f868e93999fa3ababaca8a9a29e9d9b9b9a9b9c9d9fa3aaa9aba9a19e98928c857d736d665d564c443a32291e150a000000000000000000000000000007101b242d363e474f585f666d737c82878e92989b9ea2a9a6a8aaa8a7a6a6a6a7a8a9a8a6a8a19e9a97928c86807a716c615e564d453c342b22190e0500000000000000000000000000000a141d262d333f454d53565d606467696a6b6c6c6b6b696764615e5653504a423e36302920272f353e41495053555d606466686a6b6c6c6c6b6b696765625f5855534e47423c3328221c140b020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003080b0d0e13131313131313130d0c0a0602000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002060a0c0d13131313131313130e0d0b08030000000000000000000000000000000000000000000000000000000000000000000000060b0f12131b20202020202020201d1413110d08010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013202d394653606c798686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686796c605346392d2013000000131f2c3946525f6c7985929faca295887b6f6255483c2f221509000000000000030d1925303a44505a616e7b86929fa7afacabadb3ac9f9386796c605346392d2013000000000000000000000009121b242d353e464e555d606c707980868c91969a97918e8c8988878685868788898c8f91979a96918c868079706c615d564e463e352d241b120900000000000000000000000000000000000000000009121b242d353e464e555d606c707980868c91969a97918e8c8988878685868788898c8f91979a96918c868079706c615d564e463e352d241b120900000000000000000000000000020e1925303b444e58606b6f7b838b92979c9fa4a9a19e9c9a9a999a9c9ea1a39f9c97928d857e776e6d737e8690959d9fa7a8aba49f9f9f9f9b8e8275685b4f4235281c0f00000000000000010b151f29333d474f59606a6f7b838c92999fa4abadaaa29f9b979792908f8e8e8e8f909298989d9fa7acaaa29f97918880786d685e564c443a30261c1106000000000000000000000000050e19222d363e485059616a6f7980878f93999fa3aaabaaaaa29f9d9b9a9a999a9a9b9d9fa2aaa9aba9a19e98928d857e756d685f574e463c342a20170c0300000000000000000000000006111b262f383f4451575f61686d7073767778797978777673716d6864605c545046413a322a313940454f535b6064676d707375777878797978777674726f6a67625f57534d453f332d261d140b0200000000000000000000000000000000000002080d10121313131313131313131313131313131313131313131313121211100e0b09070604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000306060f131313131313131311070604010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030608090c0f111213131211100e0c0a07060401000000000000000000000000000000000000000000000000000000000013202d3946535f6c767979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979766c5f5346392d2013000000131f2c3946525f6c7985929faca295887b6f6255483c2f2215090000000000010b151f2a36414c56626c76828f98a3aca49f9ea1a9b39f9386796c605346392d20130000000000000000000007111b242d363e474f5860676d747d848c929897928d8985827f7d7b7a7979797a7b7d7f8285898d929798928c857d756d6860584f473f362d241b11070000000000000000000000000000000000000007111b242d363e474f5860676d747d848c929897928d8985827f7d7b7a7979797a7b7d7f8285898d929798928c857d756d6860584f473f362d241b110700000000000000000000000005111e2a36414c56606a6f7d8590959ea1a9a29e9997928f8e8d8d8d8f9197999ea1a29f97928b827a747f8b92989fa7a9a19e999993929292998e8275685b4f4235281c0f0000000000000007121d27313b454f59606b707c8590959fa3abaea9a19e98928e8a87858382818181828386888b90959b9fa4aca9a19a938d837a6d685e564c42382e23170d0400000000000000000000020d17202b343e48505a616b707c838c92999fa4abaca7a09d999892908f8d8d8d8d8d8f909298989c9fa4abaaa29f97928a827a6e6960584e463c32291e150b0000000000000000000000000b17222d384149505b62696e747a7d808384858685858482807e7a76716d66615a524c443b333a434b515961656c71757a7d80828485858685858483817e7c78746e6a625f5751443f382f261d140a0000000000000000000000000000000000060d14191c1f1f202020202020202020202020202020202020202020201f1e1e1c1a18161413100c070501000000000000000000000000000000000000000000000000000000000003080c0e0e131313131313130f0e0c09040000000000000000000000000000000000000000000000000000000000000003070b0d0e131313131313130e0e0c080300000000000000000000000000000000000000000000000000000000000000000001040707090c0e101111121313121211100f0d0b0907060300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040a0f131516191c1e1f1f201f1e1d1b19161413110d0801000000000000000000000000000000000000000000000000000000121e2b37434f5a646c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c645a4f43372b1e12000000131f2c3946525f6c7985929faca295887b6f6255483c2f221509000000000007121d27313946525e68717e8b949faaa49a939297a1ad9f9386796c605346392d2013000000000000000000060f19232d363e485059616a6f79818a919797918b85817c797572706e6d6d666d6d6e707275797c81858b919697918a817a6f6a615951483f362d23190f060000000000000000000000000000000000060f19232d363e485059616a6f79818a919797918b85817c797572706e6d6d666d6d6e707275797c81858b919697918a817a6f6a615951483f362d23190f0600000000000000000000000714202d3946525e686f7c869297a0a7a49d97928c888582818080808285888c91969ea1a29f948f84818c919fa3aaa39f97928d898685858687898275685b4f4235281c0f000000000000000c18242f39434d57606b707d8692979fa7aeaba39f96918b86817e7b7876757474757677797c7f83888e939a9fa7aca49f9590837a6d685e544a3f34281f160c0100000000000000000009141f29323d46505a626c717d8690959fa3ababa49f9b95908c898584828180808081828385888b8f93999fa2aaa9a19e938f847b6f6a60584e443b30271d120700000000000000000000030f1b27333f49535b606d727b81868a8d909192929292918f8d8a86837e78716c615e564d453c444c555d606c70787d82868a8c8f909192929291918f8d8b8884807b756e69625b504a42382f261b11060000000000000000000000000000000810181f25292b2c2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2c2c2b2a29272523201f1c1813110d08020000000000000000000000000000000000000000000000000001090f14181a1b202020202020201c1b191510090200000000000000000000000000000000000000000000000000000001080e1317191a202020202020201b1a18140f0901000000000000000000000000000000000000000000000000000000000206080d11131416181a1c1e1e1f1f201f1f1e1d1b1a18161312100b060603000000000000000000000000000000000000000000000000000000000000000000000000060a0e1011131313131313100f0d0a05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001070c10151b1f222226292a2b2c2c2b2b2a28252321201d19130c0400000000000000000000000000000000000000000000000000000f1b27333e49525a5f60606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060605f5a52493e33271b0f000000131f2c3946525f6c7985929faca295887b6f6255483c2f22150900000000020b18232f39434f59616d7a85929ea6a99f938785929eab9f9386796c605346392d20130000000000000000030c18212b353e48505a626b707c848e9398928c857f7974706c6666636161605c6061616366666c7074797f848b9298938e857c706b625b51483e352b21180c03000000000000000000000000000000030c18212b353e48505a626b707c848e9398928c857f7974706c6666636161605c6061616366666c7074797f848b9298938e857c706b625b51483e352b21180c0300000000000000000007131f2c38444f59616e7a859198a2a9a39f928d85807b78757473737475787b7f848b91969ea59f96918d929ca4a9a199928c85807c797878797a7d7e7164574a3e3124170b00000000000004101d2935404b555e69707d879298a2a9b1a8a099928c847f7a75716e696a6868676869666d6f72767b818790959da4afa79f9590837a6d665c50443e31281d13070000000000000000030d1925303b444e58626c717e879298a0a7afa79f99938e88837f7c79777574737373747577797c7f83878d92989ea5ada59e9691857c6f6a5f564c42392e23180c030000000000000000040f19232b3744505b656c747f868d92989a9c9d9e9f9f9e9e9c9a9992908a847e756d685f574e464c565d676d747d838a8f9299999b9d9e9f9f9f9e9e9c9a9896918d87817b726d605b544a41382d22170b040000000000000000000000000006101a222a30353839393939393939393939393939393939393939393939393838373634322f2d2c2923201d19130f0a0300000000000000000000000000000000000000000000030b131a202427282d2d2d2d2d2d2d292825211b140c0300000000000000000000000000000000000000000000000000020b12191f2326272d2d2d2d2d2d2d282724201a130b0300000000000000000000000000000000000000000000000000040a0f1214191d2021232527292a2b2c2c2c2c2b2b2a28272522201f1c1715120f0a050200000000000000000000000000000000000000000000000000000000000000040b11161a1d1e2020202020201d1c1916100a030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b12181d1f272b2e2f3235373839393837363532302d2c29241e160d04000000000000000000000000000000000000000000000000000a16212c3740494f535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353534f4940372c21160a000000131f2c3946525f6c7985929faca295887b6f6255483c2f221509000000000a141d2934404b55606b74818e97a1ada1978e8183909da99f9386796c605346392d201300000000000000000b151e2a333d47505a626c717d8691969490867f79726d6763605b54565554535053545556545b6063676d72797f858f949791867d726d625a50473d332a1e150a0000000000000000000000000000000b151e2a333d47505a626c717d8691969490867f79726d6763605b54565554535053545556545b6063676d72797f858f949791867d726d625a50473d332a1e150a0000000000000000000915222f3b4854606b75818e97a1aaa399928a8079736e69696767666769696e73797f848e939fa3a19e9a9da4a8a09691877f79736f6d67666c6e70716c6155493c3023170a000000000005101a232c3945515d676e7b859299a2aab1a79f9691878079726d6764615e575c5b5b5b545c6062656a6e747c838d929fa3aba7a0959082786d60594f433a2f24180d02000000000000010b151f2a36424d56606a717e889299a2aaafa49c959087817c77726f6d6668676766676768666c6f72767b80868e939fa3aaa8a09792867c6f685e544b40342820150900000000000000000b16212c38444f59606c77818b92999fa2aaa9a8a09e9c9b9c9d9fa29f9c96918a827a6e695f584e555d686d79818a90959c9fa3aba39f9e9c9b9c9d9ea1a9a8a19e99938e867f746c665b53493f332720150a000000000000000000000000020d18222c343b4144464646464646464646464646464646464646464646464645454443413e3c3a38342f2d29241e1a150f0a0400000000000000000000000000000000000000010b151d252b303435393939393939393534312c261e150c000000000000000000000000000000000000000000000000000b141d242b303334393939393939393534302b251d150b0100000000000000000000000000000000000000000000070c10151a1f2124292c2d303234363738383939393838373533322f2d2b2823211f1b15120e090300000000000000000000000000000000000000000000000000000000050d151c2227292a2d2d2d2d2d2d292926211c150d04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070d151d24292c32373b3c3f4244454646454443413f3d3a39352f281f160c0100000000000000000000000000000000000000000000000005101b252e373e4346464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646433e372e251b1005000000131f2c3946525f6c7985929faca295887b6f6255483c2f22150900000006111b262f3845515c67707d89939ea9a69e91857a84919daa9f9386796c605346392d20130000000000000007121d27303c454f59626c717e879298938c827b726d67605c5553504a4d505152535352514e4a5053555c60676d727b828b929892877f726c61594f453c30261c11060000000000000000000000000007121d27303c454f59626c717e879298938c827b726d67605c5553504a4a484746444647484a4a5053555c60676d727b828b929892877f726c61594f453c30261c11060000000000000005111d2a36414c56636f7c89939ea9a59f92877e746d67625f575b5a5a5a575f62666d7279818c9299a3aba7a9aca09691847c736d6762605c5b60616364615a5045392d21140800000000000b16212b37434e58606d79839097a1abb1a79f9590847c736d67605d5554524d4f4e4e4e4a505355585f626a6f78808a9299a3aba79f948d80736b61554b4035291f140900000000000007121d27313946525e696f7c86929aa3ababa39f928d837c756f6a6662605c545a5a5a5a5a545b606265696e747b818a9298a2a9a9a19891847a6e665c51453c31261a0e0500000000000003101b27323b4854606b73808c939fa3aba9a19e9896918f8f8f909297989d9f9e938f847b6e6a5f565d676d7a838e939da0a7a59e9b999291908f8f909297979c9fa6a49f98928b81786c655b50443c32261b0f05000000000000000000000008141f2a343e464d5152535353535353535353535353535353535353535353535251514f4d4b494745403a3935302b26201b150c0700000000000000000000000000000000000009131d272f373c40414646464646464642413d3730271e0e050000000000000000000000000000000000000000000000030d1d262e363c3f414646464646464641403c372f271d13090000000000000000000000000000000000000000070c12181c1f262b2e2f35393a3c3f414344444546464545444342403e3c3a38342e2e2b26211e1a140f0a0400000000000000000000000000000000000000000000000000040d171f272e3336373939393939393635322d261f160d03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010a10191f272f35383c4347494c4f515252535251504e4c494745413a31281e13080000000000000000000000000000000000000000000000000009131c252c33373939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393937332c251c130900000000131f2c3946525f6c7985929faca295887b6f6255483c2f2215090000000b17222d38414e58606d7984919ea5aa9e948a7e7885919eab9f9386796c605346392d2013000000000000000c18232e39434d57606b717e8b929992887f786e69605d55514b5153575a5c5e5f5f5f5f5d5b5854524d51555c60696e767f879298928b7e716b60574e42382e23170c030000000000000000000000000c18232e39434d57606b717e8b929992887f786e69605d55514b514f4b443b3a3a383a3a3b3d3f44464b51555c60696e767f879298928b7e716b60574e42382e23170c030000000000000713202d3946525e6875828f9ca5ab9e938b7e716c605d55534d4e4d4d4d4d53545c60676d757f87929facb4b7aa9e91847b6f6a605d55535150535456575550483e33281c11050000000004101c27333a47535f6a74808d95a0a9b2a89f9590837a6f6a605c55514b484642424141423f4446494e53585f666d737e879299a4afa69f93887d70675d51453b30251a0e0200000000000c18232f3943505a616e7b859198a3acaca399928b80786f6a625f585653504a4e4d4d4d4e4a505355575e61696e757e869297a2aaaaa1969082786d60574e42372b21170b0000000000000713202c38444f5963707d88939fa5aea69f97918c87848382828385888b90959d9e9691857c6e685e606d798390959da5a8a09d938f8a86848382828385878b8f949da0a7a29f938e81776c60584e43372b21160b00000000000000000000000d1925303b4650585d5f6060606060606060606060606060606060606060605f5f5e5d5c5a585653514b4746413a37312b262018120b03000000000000000000000000000000030f1a252f3941484d4e535353535353534f4d4942393020170d02000000000000000000000000000000000000000000010b151f2e3840474c4d535353535353534e4d4841392f251a0f030000000000000000000000000000000000030b12181c23282c31373a3b414547494b4d4f5151525253525251504e4d4b4946443f3c3a37312d2a251f1b160f0a0400000000000000000000000000000000000000000000000b151f2931393f424446464646464643423e3831281f150a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020b131c222b31394045474e5455595c5d5e5f5f5e5e5d5b585654514c433a2f24190d01000000000000000000000000000000000000000000000000010a131b21272b2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2b27211b130a0100000000131f2c3946525f6c7985929faca295887b6f6255483c2f2215090000040f1b27333f49535f6a73808c96a0aca2988f82757985929fac9f9386796c605346392d201300000000000004101c2834404b555f69707d87929892877e726c665f57514d53555c606467696b6c6c6c6b6a6865615e57544f51575e616d727d86929792877d706a5f544a3f3428201509000000000000000000000004101c2834404b555f69707d87929892877e726c665f57606060605e5c564e44392d2c2d2e323f49515759606060575e616d727d86929792877d706a5f544a3f34282015090000000000000714212e3a4754616d7a86929faca3998e81756d625a514b47424140404142474b51555e69707c86929facb8b0a3968a7d70696058514b46454446474a4a49453e362c22170c00000000000714202c38444f59626e7c87929fa7b1aaa1969083796d685f58514b45413b3a363035342e34383a3c43474e545c606c717e87939fa5afa49a9185796d60574d42362a1e11050000000004101c2934404b55616c76828f97a1aaafa49a92877e736d665f58534e4946443f41404040413f4446484d53565e616c717c859298a2aca89f948d80736a5f53473e33281c100400000000000916222f3b4854606b7683909aa4afa89f948f847f7a7776757676787b7f838990959c9791847a6d666c75818f959fa7a79f959189827e7a7776757676787b7e828990959ea5a59d938c7f736a5f53473d33271c100400000000000000000003101c2935414d5862696c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6b6b6a69676562605c5554524c47433c373228231d150c0700000000000000000000000000000814202b37414b53595b606060606060605c59544b4232291f140900000000000000000000000000000000000000000007121d2731404a52585a606060606060605b59534b41372b20140800000000000000000000000000000001070c151d23282e34383c4347484c525456585a5c5d5e5f5f5f5f5e5e5d5b5a585553504a4847433c3a36312b27201b150d0802000000000000000000000000000000000000000006111c27313b434a4f51535353535353504e49423a31261c1005000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010b141c252e343d434b515358606265686a6b6c6c6b6a69686563605d554c4135291d110400000000000000000000000000000000000000000000000000010910161b1e202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020201e1b161009010000000000131f2c3946525f6c7985929faca295887b6f6255483c2f22150900040d1a232b3744505b656f7c87929fa8a79f92867b6e7986939fac9f9386796c605346392d20130000000000050f1a232c3845515c676e7b85929992867d716c605b544d51575f61676d70737677787979787775726e69636059524d525b626b707c85929892857c6e665c50443c31261a0f04000000000000000000050f1a232c3845515c676e7b85929992867d716c605b63666c6c6c6c6b6760564b3f331f25303b44515b62656c6c6c6c6c67646b707c85929892857c6e665c50443c31261a0f0400000000000b1825313e4b5864717e8b99a3ac9f92867b6e625a504540393731343331373c45515c676e7b859299a3aeabaea99c9083786c60564c413a3838393b3d3e3c39332c241a100500000000000916232f3c4855616b76828f99a3afaea39891847a6d675e564e454039352f2d2a25282823282c2d31373c424a505a616c727f8b939ea8aca1978c8073695e52463a2d2014070000000006131f2c3845515c67707d8a949fa9b0a69f93887e716c605c544e47433c3a38342e3433342d3338393c42464d525a616a6f7c86929aa4afa69f92877b6e62594f44392d20150a00000000000a1623303d495663707c89949facaca0958f827a726d686968696a696e72767d838c929f968f82786d717e8b939ea7a79f9590837d75716d676968696a696e71767d838e939ea5a59f92877c6f62594f44382c20140700000000000000000005121f2b3844515d697479797979797979797979797979797979797979797979797878777674716f6d6764615d56534e47433c342e271e191008000000000000000000000000000c1824303c48535d64686c6c6c6c6c6c6c68655d54443b3025190e0000000000000000000000000000000000000000000c18232f3943525c64676c6c6c6c6c6c6c68645d53483c3024180c0000000000000000000000000000030b12181e272e34394044464e5355565d60636567696a6b6b6c6c6c6b6b6a68666562605c5455534e4846423b37322b262019130c04000000000000000000000000000000000000000a16222e39434d555b5d6060606060605c5a544c42382d21160a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009131c262e3740464f555d60656a6f7275777879797877767472706d675d5145392c201306000000000000000000000000000000000000000000000000000000050a0f1213131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313120f0a0500000000000000131f2c3946525f6c7985929faca295887b6f6255483c2f221509010c161f2a36414c56606c77839099a3aba0958c7f726d7a879aa4af9f9386796c605346392d201300000000000b16212b37434e58606d7983919792877d706b615a504d555c60696e74797d8082848586868584817f7b76706b605d564e5159606a6f7c8692979083786d60584e43372b21160a0000000000000000000b16212b37434e58606d7983919792877d706b615a636d72797979797772675c4f43372a2a36414d56626d727979797979746e646a6f7c8692979083786d60584e43372b21160a00000000000e1b2834414e5b6774818e9aaba99c8f8276695f53483f352f2b262727313c46515b606d79839097a1aaa29fa2aa9f948b7e71685e52463c322b2d2e3031302d28221a1208000000000005121e2a36424d5763707d89949fabb2a89f92867c6f685e554c443c342e2924201e1a1b1b171c1f20262b30383f44505a626d75818e96a0aca79f92867b6e6154473b2e21140800000003101c28343f4a54606d7984919ea6b0aa9e948c7f736c625a504a423c37322d2c282327272722282b2d31363b42465058606a707e88939fa8aea3998f82766c6155493c31261b0f0000000004101d2935404b556774808d9aa6b0a99d91837a6d68615e565c5c575f61656b7078808b9399948c7f737a85929fa5aba095908279706b64605d555c5c565e61646b7079818e939ea8a3999083776b6054483c2f22160900000000000000000006131f2c3946525f6c79868686868686868686868686868686868686868686868685848482807e7c7975716d68625f58534e454039302a221a11090000000000000000000000000e1a2734404d59646f7479797979797979756f65564d42362a1c11060000000000000000000000000000000000000004101c2934404b55646e7479797979797979746f64594d4034271a0e00000000000000000000000000040d151d2329303940454a5153585f6266686d6f7274767777787979787877767573716f6d6666625f5854534d47433d373129241e160e060000000000000000000000000000000000010e1a27333f4a555f676a6c6c6c6c6c6c69665e54493e3226190d010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007101b252e384049515960676d71777c7f8284858586858483817f7d796d6054473a2d21140700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000131f2c3946525f6c7985929faca295887b6f6255483c2f22150907121d28313946525e68727e8b949faba3999083786d6e7a8794a1b69f9386796c605346392d20130000000004101c27333a47535f6a73808c95928b7f726b6159504d575e676d737b81858a8d8f9192929292908e8b87827d756d685f584e4f58606a707e8793958c7f726a5f53473d32271b0f040000000000000004101c27333a47535f6a73808c95928b7f726b61595966727f8686868684776b5e51443826303846525e68727f8686868686817467606a707e8793958c7f726a5f53473d32271b0f0400000000101d2a3743505d6a7683909da9a5988c7f7265574d423629241d1a242f39434e58626d74818e959fa9a29892989fa69e92857a6d61584e43372b2021232423211c1710080000000000000714212d3a46535e6975828f9ca6b0aca0968c7f736a60564c433a3228231d1814120e09060c1012131a1e262e343e48515b606d7984919ea09d95908a807366594d4033261a0d00000006121f2b3844505c66727f8c96a0acaea2988f82776c605a50443f38302b26201f1c171a1a1a171c1f20252a30363e464e58616c73808d96a1acab9f948a7d7064584e43372b1d120700000006131f2c3945515d677784909daaada1978a7d70675e56524c4f4f4d53555960666d737e87939f92867b7f8c97a2ada39990837a6d67605954514c4f4f4d52545960676d78818f96a0a49f95897d7063564a3d3023170a00000000000000000006131f2c3946525f6c7985929393939393939393939393939393939393939399929291908f8d8b8985827e7a756f6a625f58514b433c342c231b120900000000000000000000000e1b2835414e5b687481868686868686868175695e5246382d22170b0000000000000000000000000000000000000006131f2c3845515c677480868686868686868174685b4e4135281b0e000000000000000000000000050e161f272f343d434b51545c60646a6e72767a7c7e808284848585868585848381807e7c7976736f6a66615e57544e47433c3530282017110a0200000000000000000000000000000003101d2936424f5b6771777979797979797670665a4e4235291c0f03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030c19222d37404a525b636b6f797e84888c8f909192929191908e8b897f7266594c3f3326190c0000000000000000000000000003080c0e0e131313131313130f0e0c09040000000000000000000000000000000000000000000000000000000000000003070b0d0e131313131313130e0e0c0803000000000000000000000000000000000000000000000000000000000406070b0e11121313131313130c0c0a0602000000000000131f2c3946525f6c7985929faca295887b6f6255483c2f2215090b18242f39434f59616e7a85929fa6a89f92877c6f666e7b8894a1ac9f9386796c605346392d2013000000000714202c38444f59626f7c8792968e81746d62594f4d575e696e7980868d92989a9c9b999898999b9b9a938f89827a6f6a5f574d4e58616c737f8c9592867c6e62594f43382c20150a000000000000000714202c38444f59626f7c8792968e81746d62594f5966727f8c93939184776b5e5144382e38424f59616e7b8692939391857a6d6058616c737f8c9592867c6e62594f43382c20150a00000000121f2b3845525e6b7885919eaba295897c6f6256493c31231817202935404b555f6a727f8b939da7a298928590949fa1978e81746a5f53473c32261b17171714110c05000000000000000815212e3b4854616e7b87939facb2a89d9184796d60584e443a31292018120d0705020000000306090c151c2328363f45515d676f7d899395908a837e776c605346392d2013060000000713202d3a4653606d7884919ea8b2a99f92867b6e655b50483e342e261e1b1312100c060d060b0f12131a1f252a343d46505a606d7984919ea8b0a69c8f83766a5f5347392e23180c0000000714202d3a4753606d7a86939facab9e9285786c60554c464142434246484f545c606c727f8b9398908385929ea9ab9f92877c6f685d554f47454142434246474f555d666d7984919b9a93908c8276695c4f4336291c1003000000000000000006131f2c3946525f6c7985929f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9fa39f9e9e9d9c9a9898928f8b86817c756f6a605c554e463e352d241b1209000000000000000000000916232f3c4956626f7c89959393939392867b6e61544a3f33281c0f030000000000000000000000000000000000000714202d3a4753606d7985929393939395897c6f6356493c302316090000000000000000000000050f172028313940454f555c60666d71777b7f8386898b8d8f9091929292929191908e8d8b8885827f7c77736e69626058534e46413a3228221c140b03000000000000000000000000000004111e2a3744515d6a77838686868686868276695c504336291d10030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a151e2b343f49525c646d737c848b9095989b9d9e9f9f9e9d9c9b988c7f7266594c3f3326190c000000000000000000000001090f14181a1b202020202020201c1b191510090200000000000000000000000000000000000000000000000000000001080e1317191a202020202020201b1a18140f0901000000000000000000000000000000000000000000000001070c101314171b1e1f202020202020191816120d070000000000131f2c3946525f6c7985929faca295887b6f6255483c2f22150a141d2935404b55616b75818e97a2aca1968d80746a626f7b8895a2ac9f9386796c605346392d2013000000000916232f3c4855606b768390999184796d605b514b555e696e7b838d92999f9c96918e8c8b8b8c8e92979e9c938f847c6f695f564c505a606d788390988f82766b6054483d32271b0f000000000000000916232f3c4855606b768390999184796d605b514c5966727f8c999e9184776b5e514438343f4a54606b75818e989e948a7e71685d525a606d788390988f82766b6054483d32271b0f00000000131f2c3946525f6c7985929faca194887b6e6155483b2e22151f29333b45515d676f7c86929fa5a49a92867b829099a39f93877c6f62584e43372b20150a0a0805000000000000000005121e2a36424d576673808d99a4afaca0968a7e71665c51463c32281f170e0700000000000000000000030a1117242935414b55606b75818e8a837d78706c655b5044372b1f1205000005111e2a36414c5664707d8a96a1adada1978c7f72695e53493f3628231c140c0a060300000000000306090e1419222b343e45515d67717e8a96a0acab9f94887c6f62544b4034281c100400000815212e3b4854616e7b879aa4afa89b8f8275655b50433a363031363a3d424a515a626d75818e9794909297a1ada3998d80736a5f564c433d39352f30363a3d434b545d67707d8a8e8b87837f7c6f6255493c2f22160900000000000000000006131f2c3946525f6c7985929facacacada7a5a5a5a5a5a5a5a5a5a5a5a5a5a5a6a6a7aaa9a7aaa29f9b99928e87827c736d675f584f473f362d241b10070000000000000000000915222e3b4854606a7783909daa9fa3998c7f73665b5044382b1f1409000000000000000000000000000000000006121f2b37434e5864717e8a97a29f9f9d9083776b6054483b2f22150900000000000000000000050e172129323a434b515960676d72797e83888c909399989a9c9d9e9e9f9f9f9e9e9d9b999898928f8c8884807b756f6a625f58524c443d332d261d150c040000000000000000000000000004111e2a3744515d6a778490939393938f8376695c504336291d1003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006111c26303d46515b646e737f8791969da0a7a8aaa8a4a2a0a0a0a1998c7f7266594c3f3326190c00000000000000000000030b131a202427282d2d2d2d2d2d2d292825211b140c0300000000000000000000000000000000000000000000000000020b12191f2326272d2d2d2d2d2d2d282724201a130b03000000000000000000000000000000000000000000060b12181c1f2024282a2b2c2d2d2d2d2d2625221e18120a01000000131f2c3946525f6c7985929faca295887b6f6255483c2f2215111c262f3845515d67707d8a939ea9a59e9184796d60626f7c8895a2ac9f9386796c605346392d201300000007131f2c38434f5963707d899593897d70675d5145515d676e7b8490959f9f948f898481807e7e7f82858a91969e9691857b6e685d5245505c666f7c879294897c6f63584e43372b1c1106000000000007131f2c38434f5963707d899593897d70675d51494c5966727f8c999e9184776b5e5144383844505c666f7d89939e988f82756c61564c505c666f7c879294897c6f63584e43372b1c110600000013202c3946535f6c7986929faca093877a6d6054473a2d211a25303b45505a606d79839199a3a59f93887e707c87929fa49a8f82756a5f53473c32261b0f01000000000000000000000714212d3a46535f697784919eabb5ab9d9184786c60544b40342b20160d0500000000000000000000000000061218242f3a434f59616e7b837e78716c65605b53493f33271b0f0300000714202d3946525e6876828f9ca8b2ab9e9185796d60574d41382d2417110a02000000000000000000000002091019222935404b55606c7884919dabb0a69a8e8174665c5145382c1f130600000916222f3c4955626f7c8895acb6a79a8d81746753493f312a25262a2d30394044515b616d7a85929f9c9ea1a9ac9f92867a6d61584e433a312c2924252a2d3139424b55606c7783827e7a76736f6a6054473b2e22150800000000000000000006131f2c3946525f6c7985929facb8ada39c9898989898989898989898989898999a9b9d9fa3aaaaacaba39f9a938f8780796f6a615950483f362d22190f05000000000000000007131f2c38434e5865727e8b98a2aeab9e9184786c6053463b30251a0e00000000000000000000000000000000000814212e3a47535f6a7683909ca9aea2988b7f7265594f43382c1f1307000000000000000000030d172029333b444c555c606b6f797f848b9095999c9fa4aba7a9a9a8a7a6a6a7a7a8a9a8a6aaa29f9c9995918c87817c766f6a615d564f443f382f271e160d0400000000000000000000000004111e2a3744515d6a7784909d9f9f9c8f8376695c504336291d100300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c17232e38424e58626d73808c9299a0a8acaaa39f9b979594939394958c7f7266594c3f3326190c000000000000000000010b151d252b303435393939393939393534312c261e150c000000000000000000000000000000000000000000000000000b141d242b303334393939393939393534302b251d150b01000000000000000000000000000000000000020a11171d23292c2d3134373839393939393933322f2a231c130a000000131f2c3946525f6c7985929faca295887b6f6255483c2f221517222d38424e58606d7984919ea5a99e938a7d70675d626f7c8995a2ac9f9386796c605346392d20130000000915222f3b4854606b7683909a8e81756b60554b4e58606d798390969f99928b827c78747372727375797e848e939d9791847a6d605a504a545f6a74808d988f82766a605447382e23170c00000000000915222f3b4854606b7683909a8e81756b60554b414c5966727f8c999e9184776b5e514436414c56606d7883909d9f92867b6e615a50444a545f6a74808d988f82766a605447382e23170c000000121f2c3945525f6c7885929faba194877a6e6154473b2e21202a36424d57616c74818e95a0a89e938c7f736c74808d97a29f93877c6f62584e43372b1e1308000000000000000000000815222e3b4855616e7b8896a0acafa3998c7f72665b5042392e22190e0500000000000000000000000000000007131d28313d46535f696e77716c65605b53504941382d22170b0000000814212e3b4754616e7a87939facafa3998c7f72675d51453b2f261b1206000000000000000000000000000000071018242f3944505b66727e8b99a3aeac9f9285796d6053463a2d2013080000091623303c4956636f7c8996a2afa69a8d8073675a4d403025191a1e21272e343f46525e6873808c99a3abadb3a89c8f8275685e52463c3128201d19191e2027303944505b656c7675716d68666260584e43372b1f130600000000000000000006131f2c3946525f6c7985929facb8a79c918c8b8b8b8b8b8b8b8b8b8b8b8b8b8c8d8e909298999da0a7aaaca49f99928d837c706b625a50483e342b21170d0300000000000000030f1b27323d4754606d7a85929facaca1968a7d7063574d42362a1c110600000000000000000000000000000004101c2934404b55626e7b88949fabac9f92867a6d6054473d32271b0f030000000000000000010b151f29333b454d565d676d747c848c91969da0a7a9aca8a9a19e9c9b9a9a999a9a9b9d9fa2a9a6aaa9a7a09d99928e89827c746d686059504a423930281f160c01000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003101c28343f4a54606a727f8b929fa3abaca49f98928e8b8887868687898b7f7266594c3f3326190c00000000000000000009131d272f373c40414646464646464642413d3730271e0e050000000000000000000000000000000000000000000000030d1d262e363c3f414646464646464641403c372f271d13090000000000000000000000000000000000030b141b22272f34383a3e4144454646464646463f3e3a352e251c12070000131f2c3946525f6c7985929faca295887b6f6255483c2f22151c28333f4a545f6a73808d96a1aca2978e81756b6155626f7c8995a2ac9f9386796c605346392d2013000004101c2934404b55636f7c899493877c6f62594f4754606a74808d95a09892877e766f6c6566656566666d7179818e939d968e81756c61554b4e58616e7b869294897c6f62544a3f34281c100300000004101c2934404b55636f7c899493877c6f62594f433f4c5966727f8c999e9184776b5e51443846525e68727f8b959f958b7f72695e53483e424e58616e7b869294897c6f62544a3f34281c10030000111e2b3844515e6b7784919eaaa295887c6f6255493c2f2428323a46525e69707e8a939da8a0958e81776c606d7a85929fa49a8f82756a5f53473a2f24190d010000000000000000000c1825323f4b5865727e8b98a8b2ac9f92867a6e61544a3f30271d100700000000000000000000000000000000010c161f2a36424d575f616a64605b535049443f382f261b11060000030f1b27333f495364717e8b9aa4afac9f92867a6e61554b4033291d140a000000000000000000000000000000000007121d28333f4a54616d7a86929facaea298897d706356493d2f24190d01000916222f3c4955626f7c8895aab4a79b8e817468564c41362a24201d191c232a36414c56616e7a86929facb9b3a9978a7e7164564c41342a1f161d1d1d1d151e27333f49535b606a6864615e5655544e463c32271b0f0300000000000000000006131f2c3946525f6c7985929facb2a5988c7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f80818386888c91959c9ea6acaba39f9591867d716c625a50463d33291f140900000000000000000a16202c3945515d6774818e9aa7b1a89b8f8275695e5246382e23170b00000000000000000000000000000006131f2c3845515c6774808d9aa6b0a79b8e8174685d5245392b21160a00000000000000000007121d27313b454d575e686d79808791959ea1a8acaaa29f9b979791908e8d8d8d8d8e8f909297979a9ea0a8ababa39f9b948f87817a706b605b544b433a31281d1307000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000000000000000000000000000000000000000000000000000000000001040707121f2c3844505c666f7c87929fa4afaaa39a938d86817e7b7a797a7a7c7e7d6f6356493c302316090000000000000000030f1a252f3941484d4e535353535353534f4d4942393020170d02000000000000000000000000000000000000000000010b151f2e3840474c4d535353535353534e4d4841392f251a0f03000000000000000000000000000000030c151d262d33394045474a4e51525353535353534c4b463f372e23180d0200131f2c3946525f6c7985929faca295887b6f6255483c2f221a242b3844505b666f7c87929fa8a69f92857a6e615956626f7c8995a2ac9f9386796c605346392d2013000006131f2c3845515c6775818e9b8f82756a5f53474d57626f7c87939f9f92867d716c62605b535858545c60676d77818e959e938a7e71675d5146525e6974818d9a8e8174665c5044382c1f120600000006131f2c3845515c6775818e9b8f82756a5f53473d3f4c5966727f8c999e9184776b5e5144424e58616d7a85929f999083786c60574d42363c46525e6974818d9a8e8174665c5044382c1f12060000101d293643505c6976838f9ca9a4978b7e7164564c413529303a44505a616e7b85929ea5a3989183796d655d6873808d98a39f93877c6f62564c4135291d1104000000000000000004101d2935404b556875828f9ba8b5a99c908376685e5242382d1e150b000000000000000000000000000000000000040d1a26313b454d53555d57535049443f38332d261d140a00000005121f2b3744505b6575818e9bacb6a99c8f8276685e5243392f21170b020000000000000000000000000000000000010b17222d3846525d6875828f9ca8b4aa9a8d807367564c4135291d1104000814212e3b4754616e7a8798a2aeaa9d908377685e52463c352f2c2924272625303a46525e6876828f9ca9b6ada197877b6e6154483b302a2a2a2a2a2a2a2a2a222d38414950535d5b5854524c4947433c342b20150a0000000000000000000006131f2c3946525f6c7985929facada093877a7272727272727272727272727273737477797c8084898f949da0a7afa7a09892877e716c61584e453b30251a0d040000000000000004111d2935414b55626f7c88959fabac9f92877b6e61544a3f34281c100300000000000000000000000000000714202d3a4753606d7985929eabaca095897c6f63564c413529190f040000000000000000040e18242f39434d575e696e7a828d9399a0a8ada8a19e98928e8a878583818180808081828385878a8d9196999ea1a9aca69f99928d847d736c665c554b433a2f24180d010000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000000000000000000000000000000000000000000000000000000000000000000000000000000206080d1113141d2935404b55606d78839099a3aeaba3989288817a75716f6d6d6d6e6f716f6b6054483b2f22150900000000000000000814202b37414b53595b606060606060605c59544b4232291f140900000000000000000000000000000000000000000007121d2731404a52585a606060606060605b59534b41372b2014080000000000000000000000000000000b151e272f383f444b5153575b5d5e5f6060606060595751493f352a1e120600131f2c3946525f6c7985929faca295887b6f6255483c2f221f2a36424d57606c78839099a3ab9f948b7e71685e5256626f7c8995a2ac9f9386796c605346392d201300000714202d3a4753606d79859296897c6f63584e46535f6975828f9a9f948b7f726b615a5350494b4b4b51555d656d78839099999184796d6053474d56616e7b88959285796d6053463a2d2013070000000714202d3a4753606d79859296897c6f63584e43353f4c5966727f8c999e9184776b5e513f4a54606a74818e979f92877c6f665b50453b3136424d56616e7b88959285796d6053463a2d20130700000d1a2633404d596673808c99a9a79b8e8174685d52453b3136414c56616c75828f97a2a59f92867c6f675d56616e7a86929fa49a8e8174685d5245392c20150a000000000000000006131f2c3845515d677884919eabb6ac998c7f7266564c412f261c0c030000000000000000000000000000000000000009141f29333b424648504a46443f38332d27221b140b020000000613202d394653606c7885929eabb3a9988b7f7265564c4131271d0f050000000000000000000000000000000000000006111c2935414c5665727f8b98aab4aa9d918477685d5245392c201306000714202d3a46525e697885929fabac9f92867a6e61584e45403a39352f3433333236414c566673808c99a6b3ab9e928578695e53463a3737373737373737373737372f383f4446504f4b4746413c3b37322b2620180f0600000000000000000006131f2c3946525f6c7985929facada093877a6d656565656565656565656565666768666d6f73777c828990959fa4acaaa299928b7e716a60574d42362a1f160c01000000000000010d18242f3a47535f6a7683909da9afa3998c7f73665c5044382b1f14090a0a0a0a0a0a0a0a0a0a0a0a0a0a121f2b37434e5864717e8b97a2adaa9d9083776b6054443a2f2419070000000000000000020c16202935404b555e696e7b8390949fa4abaaa29f96918b86817e7b78767574737374747577787b7d8084888d92979ea1a8aba39f96918780786d675d554b4035291d11040000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000000000000000000000000000000000000000000000000000000000000000000000000003090e1214191d2021242c3945515d67727f8b95a0abafa39992867d746d6864626160606162656360594f43382c1f130700000000000000000c1824303c48535d64686c6c6c6c6c6c6c68655d54443b3025190e0000000000000000000000000000000000000000000c18232f3943525c64676c6c6c6c6c6c6c68645d53483c3024180c000000000000000000000000000007121d273039414950555c6064676a6b6c6c6c6c6c6c66635b51463a2f22160a00131f2c3946525f6c7985929faca295887b6f6255483c2f2228313a46525e69727f8b959faba3999082776c60564c56626f7c8995a2ac9f9386796c605346392d201300000a1724313d4a5764707d8a989184786c6053464855616e7b88949e9c9083786c60595046443f3f3f40454b535c666e7b878e8a86827c6f62554846535f6976839097897d7063564a3d2f23180c0000000a1724313d4a5764707d8a989184786c6053463c313f4c5966727f8c999e9184776b5e5144505b666f7c87939f968d80736a5f544a3f3329303b46535f6976839097897d7063564a3d2f23180c00000a1723303d4a5663707d8997a1ac9f92867a6d60574d43393946525e68717e8a949ea89e938b7f726a5f55525e6874818d9aa49f92867a6d6054473d32271b0f03000000000000000714202d3a4753606d7a86939facafa49a897c6f6356493c3023140a0000000000000000000000000000000000000000030d17212931363a3b443e3937332d27221b17110a02000000000815222e3b4855616e7b8897a1adada197887b6e6255483b3022150b0000000000000000000000000000000000000000000d1924303c4855626f7b8898a2aeaca095877a6d6054473a2d2114070005111e2a36424d566976828f9caaafa3998c80736a5f58514b4745414240403f3f3f3e4a5764717d8a97a4b0a99c8f827669574d4244444444444444444444444444444444444444444444444444443b3a37312a21180e03000000000000000006131f2c3946525f6c7985929facada093877a6d605858585858585858585858595a545c6062666b6f767c838d939aa3ababa39f92867c6f695e52463e31281d13070000000000000007131d2b37434e5864717e8b97a2adab9e9184786d6053463b31251a16161616161616161616161616161616212e3a47535f6a7683909ca9aea2988b7f7265594f4332281e1308000000000000000008131e28323a45515d676e7b8491959fa6afa7a098928c847f7a75716e6969686767666767686a696e7173777b80858b91969fa2aaa9a199938c81796d675d5145392c2013060000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000000000000000000000000000000000000000000000000000000000000000000000060c10151a1e2124292c2d30333f4a54606d7985929ea7b1a79f92877d706b615e565554535354565856544f473d32271b0f0300000000000000000e1a2734404d59646f7479797979797979756f65564d42362a1c11060000000000000000000000000000000000000004101c2934404b55646e7479797979797979746f64594d4034271a0e00000000000000000000000000040d18232e39434b535b60676d71747778797979797979726d63574b3e3225180c00131f2c3946525f6c7985929faca295887b6f6255483c2f242f3a43505a616e7b86929fa7a89f92867c6e655b504956626f7c8995a2ac9f9386796c605346392d20130004111d2935414c566874818e9a8d8073655b50444b5566737f8c99a096897d70665b50473e37332d2e3439414a545f697380827e7a766f6a5f5347424d5765727f8c988d817467554b4034291c10040004111d2935414c566874818e9a8d8073655b504437333f4c5966727f8c999e9184776b5e514c56606c7883909a9e9184796d60584e42382d212a36424d5765727f8c988d817467554b4034291c1004000713202d3a4653606d7985929eaaa2988c7f72695f554b43424f59616d7a85929ea6a1968f81756d62584e4c56616e7b87939fa2988b7f7265584e43372b1f1306000000000000000915222f3c4855626f7b889aa4afac9f93867a6d6054473a2d211407000000000000000000000000000000000000000000060f171f262a2d2e37312d2b27221b17110b060000000000000a1724303d4a5763707d8a96a9b3ab9e928578695f53473a2e2114030000000000000000000000000000000000000000000813202d394653606c7985929facb1a795897c6f6256493c2f23160900020e1925303f4b5865727e8b98a2aeab9f92867c6f6a605d5554524c4e4d4d4c4c4b4b4b5663707c8996a3afa79b8e8174685b505050505050505050505050505050505050505050505050505050504847433c332a201509000000000000000006131f2c3946525f6c7985929facada093877a6d60544c4c4c4c4c4c4c4c4c4c4c4d4a5053555960636a6f7980889299a3abaea39891857b6e615a50433a2f24180d00000000000000010f1b26323c4753606d7985929fabada1968a7d7063574d42362a23232323232323232323232323232323232934404b55626e7b88949fabac9f92867a6d6054473d3221160c0100000000000000010d1925303a44505a606d79839096a0a8b0a69e9591867f79726d6764615e575b5a5a5a5a5b5c575e6164676a6e73797e848c92989fa7aba49f938e82796d6053473a2d2014070000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d100300000000000000000000000000000000000000000000000000000000000000000000030a11171c1f262b2e2f35393a3d4044505b66727f8b97a1adaca0958c7f736b6159524c4847464747494b4948433d352b21160a0000000000000000000e1b2835414e5b687481868686868686868175695e5246382d22170b0000000000000000000000000000000000000006131f2c3845515c677480868686868686868174685b4e4135281b0e000000000000000000000000010c161f2834404b555c656c71797d8184858686868686867f7266594c3f3326190c00131f2c3946525f6c7985929faca295887b6f6255483c2f2935414c55616c75828f98a2aca0968c80736a5f53494956626f7c8995a2ac9f9386796c605346392d2013000713202c3945525d6877849199897c6f62534945515d677683909d9e9184786c60544a3f352b272223282f38424d57636e7375716d68625f584e433b4854616e7b8797908477675c5145382c1f1306000713202c3945525d6877849199897c6f6253493f33333f4c5966727f8c999e9184776b5e53535d68717e8b959e93897d70675d51463c2f261c26313b4854616e7b8797908477675c5145382c1f13060006131f2c3845515c6773808c98a2aa9f92867b6e675d554c4a54616b75818e97a1a59e91847a6d605b514646535f697683909caa9d9083776a6054473b2e221509000000000000000b1724313e4a5764717d8a97acb6aa9e918477675d5145392c20130600000000000000000000000000000000000000000000060d141a1e21222a24201f1b17110b0600000000000000000c1926323f4c5965727f8c98a5b2a99c8f837669574d42372b1e120600000000000000000000000000000000000000000006121f2b3844505b667783909daab1a4978b7e7164584b3e3125180b00000914212d3a4754606d7a85929fa7aea29891847c726d6763605d565b5a59595858585857626f7c8995a2afa79a8d8074675d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d55534e463c31261a0f020000000000000006131f2c3946525f6c7985929facada093877a6d6054473f3f3f3f3f3f3f3f3f40403f4446494f545860676d737e879299a3aeaaa1978f82766c61554b4135291d1207000000000000000a151f2c3845515d6774808d9aa6b0a89c8f8275695e5346382e3030303030303030303030303030303030303845515c6774808d9aa6b0a79b8e8174685d5245392c201304000000000000000005111d2935414c56626d75818e959fa8b0a69e948f837b726d66605d5554534d4e4e4d4d4d4e4f4d525457585f62666d71797f8690959ea5afa59e948d8073665a4d4033271a0d0000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000000000000000000000000000000000000000000000000000000000000003090c151c23282c31373a3b4145474a4d4e53606c7884919ea9b1a79d9083786c60594f46413c3a3a3a3b3c3e3c3b38322b23190f040000000000000000000916232f3c4956626f7c89959393939392867b6e61544a3f33281c0f030000000000000000000000000000000000000714202d3a4753606d7985929393939395897c6f6356493c3023160900000000000000000000000007131d28313a45515c676d777e848a8e909192999393938c7f7266594c3f3326190c00131f2c3946525f6c7985929faca295887b6f6255483c2f303845515d67707d8a939eaaa49a9184796d60584e414956626f7c8995a2ac9f9386796c605346392d2013000714212d3a4754606d7a87969286796d6053464753606d7a86939f998d8073655b5042382d231b17181d26303b45525c63666864615d56534e463c3a46535e697885919286796d6053473a2d201407000714212d3a4754606d7a87969286796d6053463a2d333f4c5966727f8c999e9184776b606060606d7a85929e978e81746b60554b40342a1d14212d3a46535e697885919286796d6053473a2d2014070004101c2834404b55616e7a86929fa6a2989083796d675e56515c66707d8a939ea99e938a7d70685d52493f424d5765717e8b98a3a095897c6f6256493c31261a0e020000000000000c1926323f4c5965727f8c98a5b2a99c8f837669554b4135291d1104000000000000000000000000000000000000000000000003090e1214151d1713120f0b06000000000000000000000e1b2834414e5b6774818e9aa7b3a79a8d8074675a4d4131261a0e02000000000000000000000000000000000000000000030f1c28333f4a546875818e9ba8b3a6998d8073665a4d4033271a0d00000713202c3945525d68737f8c95a0a8aaa19691867f7974706d6869686766666565656464646f7c8995a2afa6998c7f736a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a625f584e43372b1f12060000000000000006131f2c3946525f6c7985929facada093877a6d6054473a3232323232323232332e34383a3d43484e555c606c717e87929fa5afa99f948a7e71675d5145392e23180c0000000000000004101d2935404b55626e7b88949fabac9f93877b6e61544a3f3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4753606d7985929eabaca095897c6f63564c4135291d110400000000000000000713202d3946525e68717e8b939ea7b1a79e948f82796e69605c54514b484642424140404141424246484a4e53545c60666d727b838f939ea8afa69a8d8074675a4d4134271a0e0000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d100300000000000000000000000000000000000000000000000000000000000000050d141a1e262e34383c4247484c525457595b5563707d8996a0acab9f95897d70665b504745403a37322d2e2f32302f2c2721191007000000000000000000000915222e3b4854606a7783909daa9fa3998c7f73665b5044382b1f1409000000000000000000000000000000000006121f2b37434e5864717e8a97a29f9f9d9083776b6054483b2f2215090000000000000000000000010d18242f3a43515b606d79818b91969a9d9e9fa39f9f998c7f7266594c3f3326190c00131f2c3946525f6c7985929faca295887b6f6255483c2e38424e58606d7a84919ea6a99f93887d70675c51463c4956626f7c8995a2ac9f9386796c605346392d2013000a1623303d495663707d8996908377665c51454956626f7c8999a4978a7d706453493f2f261c0f0b0b151e2a33404a5257595b5754524c47433c3436424d576976828f99897c6f6256493c2f231609000a1623303d495663707d8996908377665c5145382c333f4c5966727f8c999e9184776d6d6d6d6d74808d979e92857a6d61594f433b322920171e2a36424d576976828f99897c6f6256493c2f23160900000c18232e3946525e68727f8b949fa89f958f82796e68615a606d7884919ea5a1978e81756b61564c41373b4754606d7a86929fa79a8d807467574d42372b1e12060000000000000d192633404c5966737f8c99a6b2a89b8e8175685b4e422f24180d010000000000000000000000000000000000000000000000000002050708110b060503000000000000000000000000101c2936434f5c6976828f9ca9b2a5998c7f7266594c3f3326190900000000000000000000000000000000000000000000000b17222d404d5a6773808d9aa6b3a89b8e8175685b4f4235281c0f000004111d2935414c56606d79839096a0a7a8a198928c85807d7a787675737372727271717171707c8995a2afa5988c7f777777777777777777777777777777777777777777777777777777777777776e6a5f53473a2e2114080000000000000006131f2c3946525f6c7985929facada093877a6d6054473a2d252525252525252623282c2d32383d434b515a616c727f8b939ea9b0a69e91847a6d60544b4034281c1004000000000000000c18242f3947535f6a7683909ca9afa4998c8073665c504949494949494949494949494949494949494949494e5864717e8b97a2adaa9d9083776b6054443a2f24190d010000000000000006121f2b37434e58616d7a85929ea5afa9a0958f82796d675f57514a45403b3a3631343433343430363a3b3e43474b51545c60696e79818f96a0aca79a8d8074675a4d4134271a0e0000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000000000000000000000000000000000000000000000000000000000080f171f252a30383f44464d5355565d60636668696775818e9ba8b2aa9d9083776b605b5353514b47433c3731292423221f1b160f07000000000000000000000007131f2c38434e5865727e8b98a2aeab9e9184786c6053463b30251a0e00000000000000000000000000000000000814212e3a47535f6a7683909ca9aea2988b7f7265594f43382c1f1307000000000000000000000004111d2935414b55626d75818e939ea1a8aaa29f9c9998988c7f7266594c3f3326190c00131f2c3946525f6c7985929faca295887b6f6255483c343f4a54606a74808d96a1ada1978e81746b60554b403c4956626f7c8995a2ac9f9386796c605346392d2013000c1925323f4c5865727f8b988e817467544b404b5864717e8b97a398877b6e6154473b2d21140a00030c18212e3840474b4d4f4b4746413a37322a31404d596673808c988b7e7165584b3e3225180b000c1925323f4c5865727f8b988e817467544b403428333f4c5966727f8c999e9184797a7a7a7a7a7c87929f978b7e7168605b544d443b32291d1a2531404d596673808c988b7e7165584b3e3225180b000007121d2a36414c56606c78829096a1a79e948f837a716c6268727f8c96a0a69e91857a6d61594f443a303945525d6875828f9bac9e918477695f53473a2e2114080000000000000d1a2734404d5a6773808d9aa6b3a79a8d8074675a4d4134271a070000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000101d2a3643505d697683909ca9b1a4978a7e7164574b3e3124180b0000000000000000000000000000000000000000000000061926323f4c5965727f8c98a5b2a89c8f8275695c4f4236291c0f0000010d19242f3a45515c666e7b8490959fa3aaa29f97928d898784838180807f7f7e7e7e7e7d7d7f8c98a5b2ab9e9184838383838383838383838383838383838383838383838383838383838383837c6e6255483b2f2215080000000000000006131f2c3946525f6c7985929facada093877a6d6054473a2d2119191919191919171c1f20272c30394045505a626d74818e97a1adada1968c7f73665c5145382c1f14090000000000000007121d2b37434e5864717e8a97a1adab9e9184796d6056565656565656565656565656565656565656565656565f6a7683909ca9aea2988b7f7265594f4332281e130800000000000000000815212e3a47535f6a74818e97a2adada2979083796d675d554d444039352f2d2a252727272728252a2d2e31373940454b51575f676d7884919eaaa79a8d8074675a4d4134271a0e0000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d100300000000000000000000000000000000000000000000000000000000020a121a212931363e424a5053575f6266686d70737576777986929facb1a4988b7e716e6c6564605d55534e47433c352f281f180f0a04000000000000000000000000030f1b27323d4754606d7a85929facaca1968a7d7063574d42362a1c110600000000000000000000000000000004101c2934404b55626e7b88949fabac9f92867a6d6054473d32271b0f0300000000000000000000000613202c3945515d67727f8b939ea5ada49d98928f8d8c8b8b7f7266594c3f3326190c00131f2c3946525f6c7985929faca295887b6f6255483c3844505c666f7c87939fa9a69e92857a6d60594f43393c4956626f7c8995a2ac9f9386796c605346392d2013000d1a2733404d5a6673808d998c7f7366594c404c5966727f8c999f928579695e52463a2d2014020000060f1c262e353b3f40423e3a3935302b2625323e4b5865717e8b988c7f7266594c3f3326190c000d1a2733404d5a6673808d998c7f7366594c402e23333f4c5966727f8c99a096918686868686868892999e92857c78716c665e564d443b2f261b25323e4b5865717e8b988c7f7266594c3f3326190c0000000d1925303b44505b666e7b849197a1a69e9590857e756f6d7a85929fa89f948a7e71685d52473e322935414c5664717e8a9aa4a096887b6e6255483b2f2215080000000000000e1b2734414e5a6774818d9aa7b3a69a8d8073675a4d4034271a0d0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111e2a3744515d6a7783909daab0a3968a7d7063574a3d3024170a00000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4b1a99c908376695d5043362a1d1000000008131e2834404b545e696e7b838d92999fa2a9a29e9a9696918f8e8d8c8c8b8b8b8b8a8a8a8c919ba7b4ada19691909090909090909090909090909090909090909090909090909090909090887c6f6255493c2f2216090000000000000006131f2c3946525f6c7985929facada093877a6d6054473a2d21140c0c0c0c0c060c1012131b1e272e343e47515b606d7985919ea7b1a99e9185796d6053463b31251a0e02000000000000010f1a26313c4653606d7985929eacada1968a7d70646363636363636363636363636363636363636363636363636e7b88949fabac9f92867a6d6054473d3221160c010000000000000005111d2935414c56626f7c87939fa9b0a69f92857b6e675d554b433c342e2924211e1a1b1a1a1a1b1a1e2021262b2e343940454d555c667784909daaa79a8d8074675a4d4134271a0e0000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000000000000000000000000000000000000000000000000000020b141c242c333b424650545c6065696e73777a7d80818384869298a2aeb3a69a8d807d7b7975716d67625f58534e454039312a211a1108000000000000000000000000000a16202c3945515d6774818e9aa7b1a89b8f8275695e5246382e23170b00000000000000000000000000000006131f2c3845515c6774808d9aa6b0a79b8e8174685d5245392b21160a0000000000000000000000000714212d3a4754606d7a85929fa6ada39c928d8682807f7f7f7c6f6255493c2f22160900131f2c3946525f6c7985929faca295887b6f6255483c424d57606d78839099a4aa9e948a7e71685d52473d303c4956626f7c8995a2ac9f9386796c605346392d2013000e1b2734414e5a6774818d988b7e7265584b404d5a6773808d9a9e9185786b574d42362a1e11050000000a131c242a2f323335312e2d29241e1b24313e4a5764717d8a978d8073665a4d4033271a0d000e1b2734414e5a6774818d988b7e7265584b3f3226333f4c5966727f8c99a8a09e939393939393959fa3a1979289847e786e685e564d41382d2224313e4a5764717d8a978d8073665a4d4033271a0d00000008141e28333f4a545e696e7b8591969fa69f97918a827c76808d97a2a3998f82766c61564c41352c242f3a4754616d7a87939fa1988c7f7265594c3f3226190c0000000000000e1b2835414e5b6874818e9ba7b3a6998c807366594d4033261a0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111e2b3844515e6b7784919eaaafa396897c706356493d3023160a00000000000000000000000000000000000000000000000b1824313e4b5764717e8a97a4b1aa9d9083776a5d5044372a1d11000000010c18232e39424d575e696e7980878e92989b9ea1a9a8a19e9c9b9a999998989897979797989ba3adb8b2a8a19e9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d95887b6e6255483b2f2215080000000000000006131f2c3946525f6c7985929facada093877a6d6054473a2d21140700000000000003060a0c151d2328353f45515d67717e8b95a0acada1978b7e7164574d42362a1e12050000000000000009151f2c3845515c6673808d9aa4afa99c8f82757070707070707070707070707070707070707070707070707074808d9aa6b0a79b8e8174685d5245392c20130400000000000000000713202d3946525e6874818e9aa4afab9f948b7e71695e554b433a3128231c1814120e090d0d0e090e1214151a1d23282e343c434b546a7784909daaa79a8d8074675a4d4134271a0e0000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000000000000000000000000020b141c262e363e454d535a61666d71767b8084868a8c8e90919298a2aab4b5a89d928d8a8885817e7a756f6a625f58514b433c332c231a120800000000000000000000000004111d2935414b55626f7c88959fabac9f92877b6e61544a3f34281c100300000000000000000000000000000714202d3a4753606d7985929eabaca095897c6f63564c413529190f04000000000000000000000004101c2934404b5565727f8b98a2aea79c918c807a75737272726f6a5f54473b2e22150800131f2c3946525f6c7985929faca295887b6f6255483c46535f69727f8c95a0aba2988f82766c61564c41352f3c4956626f7c8995a2ac9f9386796c605346392d2013000f1b2835424e5b6875818e978a7e7164574b414d5a6774808d9a9d9184776a5e514430251a0e02000000010a12191f232626282421201d19131723303d4a5663707d89968d8174675a4e4134271b0e000f1b2835424e5b6875818e978a7e7164574b3e3126333f4c5966727f8c99a8a09393939393939393939496999e96918b827a6e685e53493f332723303d4a5663707d89968d8174675a4e4134271b0e000000020b17222d38424d575f696f7c8490949fa3a19e948f888287929fa99f92877c6e625a50443a3028232d3946525e687783909997928e8376695c504336291d100300000000000e1b2835414e5b6874818e9ba7b3a6998d8073665a4d4033271a0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000121f2b3845525e6b7885919eabafa296897c6f6356493c3023160900000000000000000000000000000000000000000000000a1724313d4a5764707d8a97a3b0aa9e9184776b5e5144382b1e110000000007121d27303b454d575e676d747b81868b8e929796989a9b9c9d9d9d9e9e9e9e9e9f9f9f9fa4acb6c0b6aea9a79f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9fa8aaaaaaaaab94887b6e6155483b2e2215080000000000000006131f2c3946525f6c7985929facada093877a6d6054473a2d211407000000000000000000030b1218232935414b55606c7883909da9b3a99d908377695e53463a2d2114060000000000000004101c2834404b54616e7b87939facac9f93877d7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7d85929fabaca095897c6f63564c4135291d110400000000000000000714212e3a4754616d7a86929facb0a69c9082766c62574d433930281f18120d07050c111517181c1c1c1c1c1c1c181d23283144515d6a7784909daaa79a8d8074675a4d4134271a0e0000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d100300000000000000000000000000000000000000000000000000000a141c262e38404850575e616c71787e83888d90939a999b9c9e9fa2aab4b1b2aea49d9a9797928e8b86817c756f6a605d554e463e352c241a11080000000000000000000000010d18242f3a47535f6a7683909da9afa3998c7f73665c5044382b1f14090a0a0a0a0a0a0a0a0a0a0a0a0a0a121f2b37434e5864717e8b97a2adaa9d9083776b6054443a2f24190700000000000000000000000006131f2c3845515c677683909daaaca0958c7f746d6866656565625f584e43372b1f130600131f2c3946525f6c7985929faca295887b6f62554844505a616e7b86929fa7a79f92867b6e615a50443a302f3c4956626f7c8995a2ac9f9386796c605346392d2013000f1c2935424f5c6875828f978a7d7064574a414e5a6774818d9a9d9184776a5e51442f24180d0100000000040c13181d2020201d1814120f0916232f3c4956626f7c89958e8175685b4e4235281b0f000f1c2935424f5c6875828f978a7d7064574a3d3126333f4c5966727f8c99a09689868686868686868687898d92989e948f847a6e655b5044372b232f3c4956626f7c89958e8175685b4e4235281b0f0000000006111c262f3b454d575f6a6f7a828d92999fa69e9c948f9299a3a2978d80746a5f534b454039342e2a36414c566673808d8c8985817e7064574a3d3124170a0000000000000e1b2734414e5a6774818d9aa7b3a69a8d8073675a4d4034271a0d0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000121f2b3845525e6b7884919eabafa296897c6f6356493c3023160900000000000000000000000000000000000000000000000b1724313e4a5764717d8a97a4b0aa9d9184776a5e5144372b1e1100000000000b151e29333b454d555d60696e747a7e8285888a8c8d8e8f9090919191919192929292939aa4afbbaea49d9a93939393939393939393939393939393939393939393939b9ea5afafa499877a6d6154473a2e2114070000000000000003131f2c3946525f6c7985929facada093877a6d6054473a2d21140c0c0c0c0c0c0c0c07060400071118242f3a44505b65717e8b97a2adab9f95877b6e6154483b2e23170c00000000000000000c18232e3946535f6976828f9ca9afa499938a89898989898989898989898989898989898989898989898989899297a2adaa9d9084776b6054443a2f24190d010000000000000005111e2a36424d5666727f8c98a3aeab9f94897c6f635a50453b31271e160d07000911181d212425292929292929292929292a3744515d6a7784909daaa79a8d8074675a4d4134271a0e0000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000000000000000000000009121c262e38404a525a61696e767e848b9095999d9fa4aca8a9a8a6a5a4a4a4a5a6a8aaa6a9a19e9b98928e88827c736d675f584f473e362c231a1007000000000000000000000007131d2b37434e5864717e8b97a2adab9e9184786d6053463b31251a16161616161616161616161616161616212e3a47535f6a7683909ca9aea2988b7f7265594f4332281e13080000000000000000000000000714202d3a4753606d7986929facac9d9083786c605d5659585855544e463c32261b0f0300131f2c3946525f6c7985929faca295887b6f6255484c56616c76828f98a2aba0958c7f72695e53483e32282f3c4956626f7c8995a2ac9f9386796c605346392d2013000f1b2835424e5b6875818e978a7e7164574b404d5a6773808d9a9e9184786b554b4035291d1004000000080d161d24292c2d2c2924211f1a151723303d4a5663707d89968d8174675a4e4134271b0e000f1b2835424e5b6875818e978a7e7164574b3e3126333f4c5966727f8c999e918479797979797979797a7c808590959f969082776c6053463c3126303d4a5663707d89968d8174675a4e4134271b0e00000000000a141d29333c454e585f686d78808790959ea0a69e9c9fa3ab9f92857a6d65605c54514b443f3830303d495663707d83807c7874706c6155493c3023160a0000000000000d1a2734404d5a6773808d9aa6b3a79a8d8174675a4e4134271b090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111e2b3844515e6b7784919eaab0a396897d7063564a3d3023170a00000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1a99d9083766a5d5043372a1d100000000000030c172129333b434b51575f62686d7175787b7d7f808283838484848485858585858687939facb9a99d928d86868686868686868686868686868686868686868686868e939eaaac9f9386796c605346392d2013060000000000040a0f131f2c3946525f6c7985929facada093877a6d6054473a2d211919191919191919191313100c0707131d27333f4953606d7985929fabb1a7988b7e7265544a3f34281c10030000000000000007121d2a36424d5764707d8a96a1adaba49f9796969696969696969696969696969696969696969696969696969fa2a9aea2988b7f7265594f4332281e130800000000000000000714202d3a46525e697784909daab4aa9c9083766b6054483f33291f150c040009121b22292e313236363636363636363636363744515d6a7784909daaa79a8d8074675a4d4134271a0e0000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d100300000000000000000000000000000000000000000000000006101b242e38404a525c636c717b838a91969d9fa7aaacaba39f9d9b999897979898999b9d9fa3ababaaa29f9b948f8780796e6a615950483e352c22180d0400000000000000000000010f1b26323c4753606d7985929fabada1968a7d7063574d42362a23232323232323232323232323232323232934404b55626e7b88949fabac9f92867a6d6054473d3221160c010000000000000000000000000916232f3c4956626f7c8999a3aea49a8b7e71665b524c4c4c4c4947433c342a20150a0000131f2c3946525f6c7985929faca295887b6f625548525d68717e8a949faaa4999083786d60574d42362c232f3c4956626f7c8995a2ac9f9386796c605346392d2013000e1b2734414e5a6774818d988b7f7265584c404d596673808c999f928578675d5145392c20130600000811191f282f35393a39352f2e2b26201824313e4a5764717d8a978d8073665a4d4033271a0d000e1b2734414e5a6774818d988b7f7265584c3f3226333f4c5966727f8c999e9184776c6c6c6c6c666c6d6f737b8390969f948b7e7165574d42372b313e4a5764717d8a978d8073665a4d4033271a0d0000000000020b17202a333c464e565e666d737c838b91969ea1a9acafaa9d90837d77716d66605d55504a423d353b4854606b7077736f6c656461594f44392d2014080000000000000d192633404c5966737f8c99a6b2a89b8f8275685c4f4230251a0e0200000000000000000000000000000000000000000000000000000102030000000000000000000000000000000000111e2a3744515d6a7784909daab0a3978a7d7064574a3d3124170a00000000000000000000000000000000000000000000000c1825323f4b5865727e8b98a5b1a99c8f8276695c504336291d100000000000040d161e2429313940454d53565d606468696e707274757676777777787878787879797c8995a2afa79a8d807979797979797979797979797979797979797979797979818e9ba8ab9e928578665b5044382b1f120600000000070e151b1f222c3946525f6c7985929facada093877a6d6054473a2d26262626262626262626201f1c18120b0b17222d3845515d6774818e9aabb5a89c8f8275665c5044382c1f120600000000000000000e1a26313b4653606d7984919eabb5afaca3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3abadb3ac9f92867a6d6054473d3221160c0100000000000000000814212e3b4754616e7b8795a0acaea2988a7e7164594f44362d21170d030006111b242d343a3d3e43434343434343434343434344515d6a7784909daaa79a8d8074675a4d4134271a0e0000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000000000000000000030c18222d36404a525c646e737e8590949da0a8abaaa29f9b9992908e8c8b8b8a8b8b8c8e9092999a9ea1a9aca69e99928d837c706b615a50473e342a1f160c01000000000000000000000a151f2c3845515d6774808d9aa6b0a89c8f8275695e5346382e3030303030303030303030303030303030303845515c6774808d9aa6b0a79b8e8174685d5245392c201304000000000000000000000000000a1724313d4a5764707d8a97abac9f93867a6d61544a413f3f3f3c3b37322a22190e040000131f2c3946525f6c7985929faca295887b6f62554f59606d7a85929ea6a89f93877c6f665c50453b3124232f3c4956626f7c8995a2ac9f9386796c605346392d2013000d1a2733404d5a6673808d998c7f7366594c404b5865727e8b989f93867a6d6053473a2d20140900030d19232b313a40454745403b3a37312a2125323e4b5865717e8b988c7f7266594c3f3326190c000d1a2733404d5a6673808d998c7f7366594c402e23333f4c5966727f8c999e9184776b606060605b606163696e7a84919e9d908377695f53463a2d323e4b5865717e8b988c7f7266594c3f3326190c000000000000050e18212a343c444c545c606a6f787e848b9297a1adb8aca0959089837e79726d67605c544f45403a444f5960636a6662605b53554f473e33281c10040000000000000b1825313e4b5864717e8b97a4b1a99d9083766a574d42362a1e1105000000000000000000000000000000000000000000000003080c0e0e0f0b07070401000000000000000000000000101d2a3643505d697683909ca9b1a5988b7e7265584b3f3225180700000000000000000000000000000000000000000000000d1a2633404d596673808c99a6b3a89b8f8275685c4f4235291c0f00000000010c161f282f35393a3e3f42474c525458575f6163656768696a6a6a6b6b6b6b6b6c6c6f7c8995a2afa89b8e82756c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c7783909daaa99d9083766a544a3f33281c0f0300000007101920262b2e2f3946525f6c7985929facada093877a6d6054473a33333333333333333333332d2c28231d150c111b2935404b5564717d8a99a3afac9f9285796d6053463a2d201307000000000000000009141f2c3844505c6673808c99a3afbbb9b1acaa9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9fa7a9afb8bab1a79b8e8174685d5245392c2013040000000000000000000b1825323e4b5865717e8b98a7b1ac9f9285796d6053473d32201b0f0500010c18222d363f454a4b4f4f4f4f4f4f4f4f4f4f4f4f4f515d6a7784909daaa79a8d8074675a4d4134271a0e0000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d100300000000000000000000000000000000000000000000000b151e2a343f48525c646e73808a92979fa6aca9a29f98928e8a868381807f7e7e7e7f80818386898d92979ea0a8aba39f9591867d716c61594f463c31281e13080000000000000000000004101d2935404b55626e7b88949fabac9f93877b6e61544a3f3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4753606d7985929eabaca095897c6f63564c4135291d1104000000000000000000000000000b1825313e4b5864717e8b97a4ab9e918478685e5242382f32322f2e2b2620191007000000131f2c3946525f6c7985929faca295887b6f625554606b74818e97a1ada1968d80746a60544a3f33291f232f3c4956626f7c8995a2ac9f9386796c605346392d2013000c1925323f4c5865727f8b988e817468554b404a5663707d8996a49a897c6f6356493c30251a0e090c151f2b353d434b5153514b4847433c332f2633404d596673808c988b7e7165584b3e3225180b000c1925323f4c5865727f8b988e817468554b403428333f4c5966727f8c999e9184776b5e53534a505354565e68727e8b9aa095887b6e6155483b2e33404d596673808c988b7e7165584b3e3225180b00000000000000060f18222a323a424b51585f666c71787e85929eabadaba7a09d95908b847f79726d666059514b433d474f54565d595653504949443e352c21170b000000000000000a1723303d4a5663707d8996aab4ab9f928578695e52463a2d20140700000000000000000000000000000000000000000001090f14181a1b1c181413110d0805010000000000000000000f1c2835424f5b6875818e9ba8b3a6998c807366594d402f23180c00000000000000000000000000000000000000000000010e1b2834414e5b6774818e9aa7b4a79a8e8174675b4e4134281b0e0000000008131e28313a4145474b4c4d4e4f5052504d535557595a5b5c5d5d5e5e5e5e5e5f5f626f7c8995a2afa99c908376655b60606060606060606060606060606060605e697885929faba79b8e8174685b4e412d22170b000000040e19222a32373b3c3f46525f6c7985929facada093877a6d6054473f3f3f3f3f3f3f3f3f3f3f3f3a38342e271e150c18242f3a4754606d7a86929facaea298887b6e6255483b2f221508000000000000000003101c28343f4a54616e7b87929facb9b1a7a0939393939393939393939393939393939393939393939b9ea5afb8aca095897c6f63564c4135291d1104000000000000000004101d2935404b556875828e9ba8b5a89b8f8275675d5145392c1f1309000005111d29343f485056585c5c5c5c5c5c5c5c5c5c5c5c5c5c5d6a7784909daaa79a8d8074675a4d4134271a0e0000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000000000000000007121d27303c46505a646e73808d929fa2a9aea59e97928c86817d7a77757372717171727375777a7d81858b91969fa3aba7a09892877e716b61584e433a2f24190c03000000000000000000000c18242f3947535f6a7683909ca9afa4998c8073665c504949494949494949494949494949494949494949494e5864717e8b97a2adaa9d9083776b6054443a2f24190d01000000000000000000000000000c1925323f4c5865727f8b98a5a99c8f827669564c412f26252522221f1b150e0700000000131f2c3946525f6c7985929faca295887b6f62555c666f7d88939fa9a59e9184796d60584e42382e2117232f3c4956626f7c8995a2ac9f9386796c605346392d2013000a1623303d495663707d8996908377675c51454754616e7a8796a1988b7f7265574d42362a201a19191e27313d474f555d605d5555534e4641382a36424d576976828f99897c6f6256493c2f231609000a1623303d495663707d8996908377675c5145382c333f4c5966727f8c999e9184776b5e51463f4446474d56616d7a87939f978a7e7164574b3e3136424d576976828f99897c6f6256493c2f23160900000000000000000610182029303940454e545b60666d7a85929fa9a19e989ea0a09d97918c857f78706b605d554e463d444849514d4946443f3839332c231a1005000000000000000815222e3b4855616e7b8898a2aeada297877b6e6154473b2e21140a0000000000000000000000000000000000000000030b131a20242728292521201d1913110d0802000000000000000d1a2734404d5a6773808d9aa6b3a89b8e817568554b4034291c100400000000000000000000000000000000000000000005121e2a36424d576976838f9ca9b2a5988c7f7265594c3f3226190c000000010d19242f3a434c525457595a5b5c5d5e5d5a54484a4c4d4f5050515151515252525663707d8996a3b0ab9e9285796c605353535353535353535353535353535354616e7b8798a2aeaa988c7f7265594c3f322619060000000a15202a343c4347494c4c525f6c7985929facada093877a6d60544c4c4c4c4c4c4c4c4c4c4c4c4c4645403930271d1213202c3945525d687783909daab4aa978a7d7064574a3d3124170a0000000000000000000c17232e3846525e6975828f9ca8b2aca095898686868686868686868686868686868686868686868e939ea9b4aa9d9084776b6054443a2f24190d01000000000000000006131f2c3845515d677884919eabb5ab988b7e7265554b4035291d100400000915212e3a45505a62656969696969696969696969696969696a7784909daaa79a8d8074675a4d4134271a0e0000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000000000000000000000000000000000000000000c18232e39434e58626c73808d929ca4adaaa39f938e857f7a75706d67686665646465656668676d7074797e848c9299a1a9aaa29992877d706a5f554c4135291e150a0000000000000000000007121d2b37434e5864717e8a97a1adab9e9184796d6056565656565656565656565656565656565656565656565f6a7683909ca9aea2988b7f7265594f4332281e130800000000000000000000000000000c1925323f4c5865727f8b98a5a89b8e8275685b4f42302814191615130f0a040000000000131f2c3946525f6c7985929faca295887b6f6257606d7984919aa4a99e938a7d70675d51463c30261c16232f3c4956626f7c8995a2ac9f9386796c605346392d2013000714212d3a4754606d7a87969286796d60534646525e687884919e9c8f8275695e52463c332a262524293039434f5960676d6765625f58534a41363a46535f697885919286796d6053473a2d201407000714212d3a4754606d7a87969286796d6053463a2d333f4c5966727f8c999e9184776b5e51443338393b46525d687784919e998c7f7366594c40333a46535f697885919286796d6053473a2d201407000000000000000000060e171e272e343c424a505b66727f8c98a2a197918c91969d9fa19e97918b837d746d675f584f473d3b3d44403c3937332d2d28211a110800000000000000000613202d394653606c7985929facb3a9968a7d7063574a3d31261b0f01000000000000000000000000000000000000000b151d252b30343536312d2c2924201d19130c070100000000000c1925323f4c5865727f8b98abb5aa9d908477675c5145382c1f13060000000000000000000000000000000000000000000714212d3a46535f697885929fabb4aa968a7d7063574a3d3024170a00000004111d2935414c565d6064656668696a6b69665e54423f414243434444444545454a5764717d8a97a4b0ada297887b6f625548464646464646464646464646414c5665717e8b98aaaea298897c6f6256493c2f2316090000030f1b26323c464e54555959595f6c7985929facada093877a6d60595959595959595959595959595953514b43392e2318111d2935414c566875818e9ba8b2a5998c7f7266594c3f3326190c00000000000000000006111c2a36424d5763707d8a96a1acaa9d9083797979797979797979797979797979797979797979818e9ba7aea2988b7f7265594f4332281e13080000000000000000000714202d3a4753606d7986939facaea399887b6f6255483c2f24180c0000000b1724313d4a56626c71767676767676767676767676767676767784909daaa79a8d8074675a4d4134271a0e0000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d100300000000000000000000000000000000000000000004101c2834404b555f6a717e8b929da4aeaaa298928b817a736d6863605d5559585857585859555d6063676d717980879197a0a8aba39992867c6f675d51453d30261c1106000000000000000000010f1a26313c4653606d7985929eacada1968a7d70646363636363636363636363636363636363636363636363636e7b88949fabac9f92867a6d6054473d3221160c0100000000000000000000000000000c1925323f4c5865727f8b98a5a79b8e8174685b4e4135281b0e0908060300000000000000131f2c3946525f6c7985929faca195887b6e625f69737f8c95a0aca2978e81756b61554b40342b1e1516232f3c4956626f7c8995a2ac9f9386796c605346392d2013000713202c3945525d6877849199897c6f635349414d566774818e9a9f92877b6e61584e453c3631322f353a424b55606b707a76726e6a645c53483c3b4855616e7b8897908477675c5145382c1f1306000713202c3945525d6877849199897c6f6353493f33333f4c5966727f8c999e9184776b5e5144382e2e35414c566a7683909d9a8d8073675a4d40343b4855616e7b8897908477675c5145382c1f130600000000000000000000050c151d23282f394653606c7884919eaa9e91857f848a90959c9fa19e95918981796e6a60594f463c3237332f2d2b27221b1c17100800000000000000000006121f2b3844505b667683909ca9b3a79a8d807467584e43372b1e1308000000000000000000000000000000000000060f1d272f373c4041423e3a39352f2d29251e18120b0300000000091623303c4956636f7c8999a4afac9f9286796d6053473a2d22170b0000000000000000000000000000000000000000000815222e3b4855616e7b8897a2adaea298887b6e6155483b2e2215080000000613202c3945525d686d71727374757778767066544b403435363737373838383f4b5865727e8b98a5b1b3a9988b7f7265594f42392e393939393939392d3945525d6875828e9ba8ac9f9285796d6053463a2d201307000006131f2b37434e585f62666666666c7985929facada093877a6d666666666666666666666666666666605c554b4034281c1019242f404d596673808c99a6b3a79b8e8174685b4e4135281b0e000000000000000000000e1a25303b4653606c7884919eabaca095897c6f6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6d7a86929facac9f92867a6d6054473d3221160c010000000000000000000916222f3c4955626f7c889aa4afac9f9286796d6053463a2d2013070000000b1825323e4b5865717e828282828282828282828282828282828286929faca79a8d8074675a4d4134271a0e0000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d100300000000000000000000000000000000000000000006131f2c3845515c676f7c86929fa4aeaaa29892867e756d68605d5654514b4d4c4b4b4b4c4d4b5153555c60676d737d859196a0a8aba29891847a6d60594f42382e23170c0000000000000000000009151f2c3845515c6673808d9aa4afa99c8f82757070707070707070707070707070707070707070707070707074808d9aa6b0a79b8e8174685d5245392c2013040000000000000000000000000000000c1925323f4c5865727f8b98a5a79b8e8174685b4e4135281b0e0200000000000000000000131f2c3946525f6c7985929faca194887b6e61626e7b86929fa8a69f92857b6e61594f433a2f22190c16232f3c4956626f7c8995a2ac9f9386796c605346392d20130004111d2935414c566875818e9a8d8074655b5044495663707d8996a0998d80736a5f574e4642403f3f41454c545d67707d86837f7b746e64584c40424d5765727f8c988e817467554b4034291c10040004111d2935414c566875818e9a8d8074655b504437333f4c5966727f8c999e9184776b5e51443b3b3b3c44505c667783909d998d8073665a4d4037424d5765727f8c988e817467554b4034291c10040000000000000000000000030b121b27333f4953636f7c8996a1a3998c7f73787d83898f949da0a09d938e847c706b60584e443b302523201f1b1711100b0500000000000000000000030f1c28333f4a546774808d9aaab4aa9d9184776a5f53473a2f24190b0200000000000000000000000000000000030e18212f3941484d4e4f4b4745413a39353029241d150d030000000714202d3a4753606d7a86939facaea399897d706353493f33271b0f030000000000000000000000000000000000000004111d2935414c5565717e8b98a9b3ac9f9285786d6053463a2d2013070000000714212d3a4754606d7a7e7f80818283858276665c5145382f2c2924262a2d37434e586774818e9aa7b4b7aa9d9083776b60544b40352f2b2623282b2f38414c56606d7a85929faca99b8e8275665c5144382c1f120600000815222e3b47545f6a6f72727272727985929facada093877a727272727272727272727272727272726d675c5145382c1f131824313e4b5764717e8a97a4b1a89c8f8275695c4f4236291c0f0000000000000000000009141f2b3844505b66727f8c99a3aea79a8d8174675c606060606060606060606060605765717e8b98a2aea79b8e8174685d5245392c201304000000000000000000000b1824313e4b5764717e8a97acb6aa9d908477665c5144382c1f12060000010d1a2734404d5a6773808d8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f9298a2aea79a8d8074675a4d4134271a0e0000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000000000000000000000000000000000000004111d2935414c56606d79839198a2aeaea39892867d716c615e56524c474541403f3e3e3e3f404045474b51555c606b6f7b849196a1abaaa0968e81746b60544a3f34281c110600000000000000000004101c2834404b54616e7b87939facac9f93877d7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7d85929fabaca095897c6f63564c4135291d11040000000000000000000000000000000c1925323f4c5865727f8b98a5a79b8e8174685b4e4135281b0e0200000000000000000000131f2c3946525f6c7985929faca194877a6e616c76828f98a3ab9f948b7e72685e52473e31281d100916232f3c4956626f7c8995a2ac9f9386796c605346392d201300010d19242f3d4a5764707d8a989184786c6053464653606c7884919e9f92877c6f695f58534d4d4c4c4c51565d666d7983918f8c888174675a4e4147535f6977839097897d7063564a3d2f23180c0000010d19242f3d4a5764707d8a989184786c6053463c323f4c5966727f8c999e9184776b5e5148484848494e56606d7985929f988b7f7265584c3f3a47535f6977839097897d7063564a3d2f23180c0000000000000000000000000005121f2b3744505b6574808d9aa89f92867a6e6c70767c828991959fa39d9691867d706a5f564c41362a2113120f0b0600000000000000000000000000000b17222d3d4a5763707d8a98a2aeaca095887c6f62564c4135291d140a000000000000000000000000000000000915202a33414b53595b5c5854524c4746413a352f271f150b0100000613202c3945515d677784909daab4ab9a8d8073655b5044372b1f140a000000000000000000000000000000000000010c13202c3945515d6775828e9ba8b5a89c8f8275665c5044382b1f12060000000714212d3a4754606d7a878c8d8e8f909186796d60544a403a39352f31363a3f47535f6a7783909daab6b8aca095897d70665c5145413a37312e34383b424a525e68727f8c98a2ada1978a7d7164544a4034281c100400000916222f3c4955626f7c7f7f7f7f7f7f86929facb3a6998c807f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f796d6053463a2d20131724303d4a5763707d8a96a3b0a99c908376695d5043362a1d1000000000000000000000030f1c28333f4a54616e7a86929facab9f9285796d60535353535353535353535353535f697683909caaaca095897c6f63564c4135291d1104000000000000000000000c1926333f4c5966727f8c99a5b2a99c8f827669544a4034281c10040000010d1a2734404d5a6773808d9a9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9fa2aab4a79a8d8074675a4d4134271a0e0000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d100300000000000000000000000000000000000000000713202c3945525d68727f8c95a0aaafa59f92867d706b625a524c45413a39352f32313132322f35383a40454b515960696e7b849199a3aea89e93897d70665c5044382d22170b000000000000000000000c18232e3946535f6976828f9ca9afa499938a89898989898989898989898989898989898989898989898989899297a2adaa9d9084776b6054443a2f24190d010000000000000000000000000000000c1925323f4c5865727f8b98a5a79b8e8174685b4e4135281b0e0200000000000000000000131f2c3946525f6c7985929faca094877a6d68717e8b949faaa3999083776c60564d41352c1f160c0916232f3c4956626f7c8995a2ac9f9386796c605346392d201300000813202d3a4653606d79859296897c7063584e44505b66717e8b959f9991847b6f6a615f57595859555d60686d78818e959c93877c6f625548424d57616e7b88959285796d6053463a2d2013070000000813202d3a4653606d79859296897c7063584e43373f4c5966727f8c999e9184776b5e545454545556585f68707d8a98a298897d7063564a3d424d57616e7b88959285796d6053463a2d201307000000000000000000000000000613202d394653606c7884919eac9b8f82756860646b6f767d838c9299a2a09892867c6f685e52463d32271b1003000000000000000000000000000000000614202d3a4753606d7985929facb1a79a8d8073685d52453b2f261b1106000000000000000000000000000006101a26313c45535d64686964605d5654524c45403931271d1207000004101d2935404b556773808d9aa9b3ab9e9184786c6053463c2f261b1106000000000000000000000000000000000007131d28333f4a54606d7a86929facb1a7988b7f7265544a3f34281c10030000000613202c3945515d67778390999b9c9d988a7d71665b514b4745404343424648505a626f7b8895a0acb8bcb1a79d9083796d605b524c464242413f44464d545b616d7a85919eaaa99e9184796d6053463a2e23180c0000000c1925323f4c5865727f8b8c8c8c8c8c9299a3aeb4a89c928c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c877a6d6054473a2d21141623303d495663707c8996a3afaa9d9083776a5d5044372a1d1100000000000000000000000b17222d3846525e6875828e9ba8ada2978a7e7164574d42464646464646463f4a54626e7b88949fabaa9d9084776b6054443a2f24190d01000000000000000000000d1a2633404d596673808c99a6b3a79a8e8174675b4e412e23180c000000010d1a2734404d5a6773808d9aa6a9a9a9a9a9a9a9a9a9a9a9a9a9a9acaeb4aca79a8d8074675a4d4134271a0e0000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000000000004111d2935404b55606d7a85929fa7b1a99d938b7e716b60595046413a352f2c2924252524252524292c2e343940454f575e696f7c87929fa7afa59d9183786d60544a3f33281c0f0300000000000000000007121d2a36424d5764707d8a96a1adaba49f9796969696969696969696969696969696969696969696969696969fa2a9aea2988b7f7265594f4332281e1308000000000000000000000000000000000c1925323f4c5865727f8b98a5a79b8e8174685b4e4135281b0e0200000000000000000000131f2c3946525f6c7985929faca093867a6d6d7a85929ea6a89f92867c6e655b50443b30231a0d040916232f3c4956626f7c8995a2ac9f9386796c605346392d2013000006131f2c3845515c6775818e9b8f82756a6054474a54606c78839098a09691847c746e696766656567676d727a828e939e958d80746a5f534746535e6974818e9a8e8174665c5044382c1f120600000006131f2c3845515c6775818e9b8f82756a6054473e3f4c5966727f8c999e9184776b61616161616162656a6f7a84919e9f9285796d6053463a46535e6974818e9a8e8174665c5044382c1f1206000000000000000000000000000815222f3b4855626e7b8896a1a49a8b7e7164565960636b70787f879297a2a29891847a6e61594f44382c1e13080000000000000000000000000000000006131f2c3845515c6775828f9ba8b2ab9f92857a6d60574d41382d2217110a020000000000000000000001081018222b37424e57646f7475716d6865615e56514b43392f24180c0000010d18242f3d495663707c8997a1adaca196897d7063584e41382d22170f06000000000000000000000000000000071118242f3844505b66717e8b98a2aeaca095887b6e6155483b2e23170b0000000004111d2935414c556673808d99a3a8aa9d9083786c605d5553514b50504d53555a626c74818e9aa7b1b6b4b6aca0958d80736d605d56534d4e4e4a5053575e666c75828f97a1ada1978c7f73665c5145382c1c12070000000c1925323f4c5865727f8b98999999999fa3abb4b9ada49c99999999999999999999999999999993877a6d6054473a2d211416222f3c4955626f7c8895a2afaa9e9184776b5e5144382b1e11000000000000000000000006111c2a36414c5663707d8996a0aca99c8f8276695e5246382d393939393844505c6673808d99a6aea2988b7f7265594f4332281e130800000000000000000000000e1a2734414d5a6774808d9aa7b3a69a8d8073675a4d4034271a07000000010d1a2734404d5a6773808d9a9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9a8d8074675a4d4134271a0e0000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000000000000000000000000000000000000613202c3945515d6773808d97a2adada1978e81746c61594f473e36302924201d181918181819181d1f23282f343d454d57606a727f8c95a0acaca0958b7e71665b5044382b1f1308000000000000000000000e1a26313b4653606d7984919eabb5afaca3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3abadb3ac9f92867a6d6054473d3221160c01000000000000000000000000000000000c1925323f4c5865727f8b98a5a79b8e8174685b4e4135281b0e0200000000000000000000131f2c3946525f6c7985929faca39986796d75818e97a2aca0968c80736a5f53493f32291f1108000916232f3c4956626f7c8995a2ac9f9386796c605346392d2013000004101c2834404b55636f7c899494887c6f62594f44505b666e7b869298a0969187807b777473727273767a7f858f939e969083796d60584e434e58616e7b869294897c6f62544a3f34281c100300000004101c2834404b55636f7c899494887c6f62594f443f4c5966727f8c999e9184776e6e6e6e6e6e6e6f72757c839096a0978d8074665c5145434e58616e7b869294897c6f62544a3f34281c1003000000000000000000000000000b1825323e4b5865717e8b98a89f93877a6d61544f545960666d737d859297a2a1968f82756b6054483a2f24190d0100000000000000000000000000000004101c2934404b5563707d8a96a1acaea2988c7f73695e53493f3327221b140b090603000001000205080d1319222a343c47535f6a7481827e7a76716d68605d554b4035291d100400000713202d3a4653606d7985929eacb2a89c8f82756a5f53493f332721180f0802000000000000000000000003091119232935404b55606c7884919daab3a99d908477695f53463a2d1c110600000000010d19242f3b4854616e7b86929fa9ab9f958c7f736d6762605d555d5d575f61656d717e8a939da9afa9a7a9aba79c928c7f746d68615f575b5b545c6062696e78808d949ea9a59e9184796d60544b4034281c0b000000000c1925323f4c5865727f8b98a5a5a5a5acaeb4bdbfb6ada8a6a5a5a5a5a5a5a5a5a5a5a5a5a5a093877a6d6054473a2d211416222f3c4955626f7c8895a2afab9e9184786b5e5145382b1e120000000000000000000000000d1925303b4854606b7784919daaac9f93877b6e6153493f33272d2d2d3a4653606d7984919eabac9f92867a6d6054473d3221160c0100000000000000000000000e1b2834414e5b6774818e9aa7b3a6998c807366594d4033261a0d000000010d1a2734404d5a6773808d939393939393939393939393939393939393939393938d8074675a4d4134271a0e0000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000000000000000000000000000000000000714202d3a4753606d7a85929fa9b2a89e91857a6d605a50473d352a251e1913110d070b0b0b070c1013181d2329333b454e58606d7883909da7b1a79e9184786c6053463a3024190d0100000000000000000009141f2c3844505c6673808c99a3afbbb9b1acaa9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9fa7a9afb8bab1a79b8e8174685d5245392c20130400000000000000000000000000000000000c1925323f4c5865727f8b98a5a79b8e8174685b4e4135281b0e0200000000000000000000131f2c3946525f6c7985929fac9f928679707d89939ea9a59d9184796d60584e41382d20170d00000916232f3c4956626f7c8995a2ac9f9386796c605346392d20130000000c18232e394854606b76828f9c8f82756c61564c4a545f69707d8692979f99928d888481807f7f8082868b91979e9691847b6e675c51464b55606a74818d998f82766a605442382e23170c00000000000c18232e394854606b76828f9c8f82756c61564c414c5966727f8c999e91847b7b7b7b7b7b7b7b7c7e82879095a09892857a6d61544b404b55606a74818d998f82766a605442382e23170c00000000000000000000000000010e1b2834414e5b6774818e9aa79e918477685e5246484f545c606b707c85929fa59e93897d7063564c4135291d1104000000000000000000000000000000000c18232f394653606c7884919ea8b2aa9f92867b6e655b50443e332d261d1a1312100b060e090e1214191e2429343c46505a626e7b878f8b86827e7a766d675d5145392c1f1306000006121f2c3844505c6673808d9aa4afaa9e94887c6f655b50443d332a2219140e09060400000100000406090e141a232b353d45515d67717e8a95a0acada2978b7e7265574d42362a1e0a0000000000000814212d3a46535e6974818e97a1aba79c918c8079736f6d676a6a6a6a696e71777e87929fa5afa59d9b9c9fa6a49c918c807a726e6969686768666d6f747b828d929da6a69e938a7e71675d5142392e23180c000000000c1925323f4c5865727f8b989f9f9f9fa0aeb4bcb9b0a8a2a09f9f9f9f9f9f9f9f9f9f9f9f9f9f93877a6d6054473a2d211416232f3c4956626f7c8995a2afaa9d9184776a5e5144372b1e1100000000000000000000000008141e2c38444f5965727f8c98a3aea4998c7f73655b5044372b1f2a36414c5663707d8a97a1ada79b8e8174685d5245392c2013040000000000000000000000000f1c2835424f5b6875818e9ba8b2a5998c7f7266594c3f3326190c000000010d1a2734404d5a6773808686868686868686868686868686868686868686868686868074675a4d4134271a0e0000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d100300000000000000000000000000000000000006121e2b37424d5765717e8b98a2aeaca0968b7e71685d52483e352b2319130d08040100000000000004070c12182129333d44505c66707d89959fabaca0968a7d7064564c4135291d110400000000000000000003101c28343f4a54616e7b87929facb9b1a7a0939393939393939393939393939393939393939393939b9ea5afb8aca095897c6f63564c4135291d110400000000000000000000000000000000000c1925323f4c5865727f8b98a5a79b8e8174685b4e4135281b0e0200000000000000000000131f2c3946525f6c7985929fac9f9285797984919ea5a99d93897d70675c51463c2f261b0e0500000916232f3c4956626f7c8995a2ac9f9386796c605346392d201300000007121d2c38434f5963707d8994948a7d70685d52454d57606b707d858f949c9f9a95918e8c8b8c8d8f92989e9c938e847b6e695f554b45515c676f7c879394897c6f63584e4330261c1106000000000007121d2c38434f5963707d8994948a7d70685d52454c5966727f8c99a196918787878787878788898b8f93999e9691867d6f685d524245515c676f7c879394897c6f63584e4330261c11060000000000000000000000000004111d2a3744505d6a7783909da89b8e827568564c413d424a5159606a707d8a939ea69c8f8276685d5245392c2013070000000000000000000000000000000007121f2b3844505b66727f8b96a1acaea2988f82776c605a50443f382f2b26201f1c171b1a1b1a1e2124292f353e464e58626c75828f9999928f8b8682796d6053473a2d201407000003101c28343f4a54616e7b87939fabb0a69c9083776c60584e453c342a251e1a1312100c070e070c1013131a1f262a353d47505a606d7984919ea7b1a99f9285796d6053473b31261a0e00000000000005121e2a36424d57616e7b859299a3aba39c928d84807c7a7877767677787b7e838b9299a3aea69d938e90949fa6a39c928d857f7b777675747576797c80868f949da4a69f948e81746c61554b4030271d1207000000000c1925323f4c5865727f8b939393939393a2aab4b3a89e9693939393939393939393939393939393877a6d6054473a2d21141623303d495663707c8996a3afaa9d9083776a5d5044372a1d1100000000000000000000000002101c27333d4754616d7a86929facab9e9184786c6053463a2f242d3946525e6875828f9ba9aca095897c6f63564c4135291d11040000000000000000000000000f1b2835424e5b6875818e9ba8b2a6998c7f7366594c403326190d000000000d1926333f4c58646e73797979797979797979797979797979797979797979797979746e64584c3f33261a0d0000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000000000814212e3a47535f697683909daab4aa9e9184786d60564c41362d2319110802000000000000000000000001070f172128343f4a54606b7783909daab2a89b8f8275685d5245392c201307000000000000000000000c17232e3846525e6975828f9ca8b2aca095898686868686868686868686868686868686868686868e939ea9b4aa9d9084776b6054443a2f24190d0100000000000000000000000000000000000c1925323f4c5865727f8b98a5a79b8e8174685b4e4135281b0e0200000000000000000000131f2c3946525f6c7985929fab9e918578808d96a0aca1978e81746b60554b40342a1d140a0000000916232f3c4956626f7c8995a2ac9f9386796c605346392d2013000000000f1b27323d4854606b7682909991847a6d605b51484f59606b707b828a8f939a9a9d9a9998989a9c9a99928f8981796e695f574d47505a606d798491988f82766b6054463d321e150a000000000000000f1b27323d4854606b7682909991847a6d605b514c5966727f8c99a8a19e949494949494949495989c9a97928d847d6f6b60564c47505a606d798491988f82766b6054463d321e150a000000000000000000000000000004101d2935404b556b7885919ea6998c807366594d40303940444f58616b75818e9ba99f92867a6d6054473a2d21140700000000000000000000000000000000030f1c28333f4a54606d7984919ea6b0aa9e948c7f726c615a5049413c37312d2b2823272728252a2d2f353a41454f585f6a717e8b939ea39f9c998f8275675d5145392c1f13060000000c17232e3846535f6975828e99a3afab9f948b7f726a60574e463e36302a25201f1c181b1a1b181c1f20262b31363f474f59616c74808d96a1adada2978d8073675d5145392a1f1409000000000000020e1a25313b46525e69707d879299a1a9a49c96918d8986858483838485888b90959fa3aba59d948e818390949da5a49d97928c8884828181828385898d92989ea6a49f948f82796d605a5043392f1e150b00000000000c1925323f4c5865727f8686868686868998a2aeafa2968c87868686868686868686868686868686867a6d6054473a2d21141824313e4b5764717e8a97a4b1a99c8f8376695c504336291d10000000000000000000000000000b16202d3946525d6875818e9ba7aca096897c7063554b4135292e3a4754616d7a86929facaa9d9084776b6054443a2f24190d010000000000000000000000000e1b2834414e5b6774818e9aa7b3a6998d8073665a4d4033271a0d000000000b17232f3b47525c64676c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c67645c52473c3023170b0000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000000000815222f3b4855626e7b88959fabaea3988b7e72665c50443a2f241b1107000000000000000000000000000000050f17232e38424f5964717e8a98a2aeac9f92867a6d6054473a2d2114080000000000000000000006111c2a36424d5763707d8a96a1acaa9d9083797979797979797979797979797979797979797979818e9ba7aea2988b7f7265594f4332281e13080000000000000000000000000000000000000c1925323f4c5865727f8b98a5a79b8e8174685b4e4135281b0e0200000000000000000000131f2c3946525f6c7985929faa9d91847b87929fa8a69e92857a6d61594f43392e22180b020000000916232f3c4956626f7c8995a2ac9f9386796c605346392d2013000000000a16212c38444f59626f7c8692978e81746d625a50474f5960696e767d83878b8e909192929291908e8b86827c756d675f574d474f59626c73808d9592867c6e62594f44342b200c03000000000000000a16212c38444f59626f7c8692978e81746d625a505966727f8c9393939393939393939399929291908d8a8580796f6b60594f474f59626c73808d9592867c6e62594f44342b200c03000000000000000000000000000006131f2c3945515d677986929fa5988b7f7265584c3f322e343d464f59626f7c8997a2a3998a7d7164574a3e3124170b00000000000000000000000000000000000b17222d3845515c67717e8b949ea9b0a69f92877e716c605b534d47423c3a38342e34343531363a3b41454c5159616a6f7c86929fa5aea99f93877c6f62554b4035291d100400000006111c2a36424d57626e7b87929fa8b0a69f92877c6f695f585046413b36312d2c282327272723282c2d31373b42465159606b717e8a929da8b1a79f92857a6d61554b4035291d10040000000000000009141f2a36424d57606b717e8792979fa2a8a19e999a9391909090919297989da0a7a8a19e938e82797a828e939da0a8a19e9996918f8e8e8f9092989a9fa3a7a09a938d82796d675d51483e31281d0c0300000000000b1824313e4a56626d7279797979797986929facada093877a7979797979797979797979797979797976685d5245392c20131926333f4c5966727f8c99a5b2a79b8e8174685b4e4135281b0e0000000000000000000000000005111d2935414c56636f7c8995a0aca89b8e8174675d5145392c37434e5865727f8b99a3aea2988b7f7265594f4332281e1308000000000000000000000000000e1b2734414e5a6774818d9aa7b3a79a8d8074675a4d4134271a080000000007131f2b36404a52585a6060606060606060606060606060606060606060606060605a58524a40362b1f13070000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000000030f1c28333f4a5465727f8b98a7b1ac9f92867a6d60544a3f32281e1209000000000000000000000000000000000006111c26303d4753606d7a85929facaea3998b7e7164584b3e3025190e02000000000000000000000e1a25303b4653606c7884919eabaca095897c6f6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6d7a86929facac9f92867a6d6054473d3221160c010000000000000000000000000000000000000c1925323f4c5865727f8b98a5a79b8e8174685b4e4135281b0e0200000000000000000000131f2c3946525f6c7985929faa9d9083839099a3aa9f948a7e71685d52473d30271d0f06000000000916232f3c4956626f7c8995a2ac9f9386796c605346392d20130000000004101c27333d47535f6a737f8c95938c7f726c615950444f575f616b70767b7e8183858586858583817e7a756f6a605d554d445059606b717e8b92958c7f736a5f53473d3222190f000000000000000004101c27333d47535f6a737f8c95938c7f726c61595966727f86868686868686868686868686858483807d79736d6760594f445059606b717e8b92958c7f736a5f53473d3222190f0000000000000000000000000000000714202d3a4753606d7a8699a3a4978b7e7164584b3e312328343e4653606c7985929fab998c7f7266594c3f3326190c000000000000000000000000000000000006111c2834404b55616c75828f97a2abafa39992877e726c655f57534d4946443f41414141424246484c52555d606b707c859298a2aeada2978f82756a5f5343392f24180c00000000000e1a26313b47535f6974808d96a0abaea39991857b6e6a615a524c46423c3a38342e3434342e34383a3c42474d535b626b707d86929fa4aeaaa0958b7f72685e5243392f24180d0100000000000000030e1a25303b454f59626c717d858d92989d9fa4aca49f9e9d9d9d9d9ea1a9aba49f9c96918a81786d6d78818991959c9fa3a8a09e9c9b9a9b9c9fa2aaa39f9b95908880786d675d554b40362c1f160c0000000000000915222e3a46515b62656c6c6c6c6c7985929facada093877a6d6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c5d564c4135291d111c2934404b556774818e9aa7b3a6998c807366594d4033261a0d00000000000000000000000000010d1924303a4854606b7783909daaac9f92857a6d6054473c313b4754606a7783909dabac9f92867a6d6054473d3221160c01000000000000000000000000000d1a2733404d5a6673808d99a6b3a89b8e8175685b4e422f24190d01000000020e19242e3840474c4d5353535353535353535353535353535353535353535353534d4c4740382f24190e030000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000000000000000000000000000000006121f2b3844505b6675828f9ba8b5a89b8f8275685d5242382e20160c000000000000000000000000000000000000000a15202c3945515d6775828e9ba8b4ab9b8e817468564c41362a1e11050000000000000000000009141f2b3844505b66727f8c99a3aea79a8d8174675c606060606060606060606060605765717e8b98a2aea79b8e8174685d5245392c201304000000000000000000000000000000000000000c1925323f4c5865727f8b98a5a79b8e8174685b4e4135281b0e0200000000000000000000131f2c3946525f6c7985929fac9f928790959faba2988f82766c61564c41352b1e150b00000000000916232f3c4956626f7c8995a2ac9f9386796c605346392d201300000000000b16212b37434e58606d7883909793887e716b625a514a4d53596163696e71747678797979787674716d68626058514b4a505a616b707d8792979083786d60584e43352b2110070000000000000000000b16212b37434e58606d7883909793887e716b625a636d727979797979797979797979797978777673716d67605d554f4a505a616b707d8792979083786d60584e43352b2110070000000000000000000000000000000613202d394653606c7986929fa5988b7e7265584b3f3025212b3744505b657784909da79a8d8074675a4d4134271a0e0100000000000000000000000000000000000c18232e3943505a616e7b859299a3afaba39992877f776e69615f575553504a4e4e4d4e4f4d5354565d60676d747d859297a1aaaea49e92857b6e61584e4331271d1207000000000009141f2b37424d57606d79849199a4afaba19791847c706c615e56534d494644404141414141404546494d53575f616d727d869298a2aeaca2989083786c60564c4131281d120700000000000000000009141f29333d47505a626b6f7a80868c90939a999b9d9e9e9f9f9f9e9d9c9a9993908b847d746d66666d747d848a8f92999a9c9d9e9f9f9f9e9d9b9998928f89837d746d665d554c43392f241a0d0400000000000006121e29343f49515658606060606c7985929facada093877a6d6060606060606060606060606060605f524c443a2f2419131f2c3845515c677783909daab4aa988b7e7165584b3e3225180b000000000000000000000000000008131e2c38434f5965727f8b98a2aea2988b7e7165574d4237404b55626f7c8895a0aca79b8e8174685d5245392c20130400000000000000000000000000000c1825323f4b5865727e8b98a5b1a99c8f837669554c4135291d11040000000008121c262e363b3f40464646464646464646464646464646464646464646464646413f3c362f261d1208000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d100300000000000000000000000000000000000613202d394653606c7885929fabb2a9988b7e7165564c4130261c0d040000000000000000000000000000000000000004101d2935404b5565717e8b98aab3ab9e918478685e5246392d20140700000000000000000000030f1c28333f4a54616e7a86929facab9f9285796d60535353535353535353535353535f697683909caaaca095897c6f63564c4135291d1104000000000000000000000000000000000000000c1925323f4c5865727f8b98a5a79b8e8174685b4e4135281b0e0200000000000000000000131f2c3946525f6c7985929faca39992999fa7a79f92867b6e615a50443a3023190c0300000000000916232f3c4956626f7c8995a2ac9f9386796c605346392d20130000000000050f1a26313c44505c666e7b85929992867d716c605c544e464f55575e6165676a6b6c6c6c6b6a6765615e56544e454e545c606c717d86929992857b6e665c50463c3123190f00000000000000000000050f1a26313c44505c666e7b85929992867d716c605c63666c6c6c6c6c6c6c6c6c6c6c6c6c6b6b696764605c55514b4e545c606c717d86929992857b6e665c50463c3123190f0000000000000000000000000000000005121f2b3744505b657885929ea6998c807366564c41362e2e2e3844505b667784909da79a8d8074675a4d4134271a0e01000000000000000000000000000000000007121d27303e46525e69707d87929fa4acaba399938c827b746e696562605c545b5a5a5b5c575e6164686d737a808a9297a1a9afa59d928a7e70695e52463c321f150b010000000000030e1a26313c45515d676f7d87939fa4aea9a19691867e756e68615e575653514a4e4e4d4e4e4b515356575f62696e767f879298a2aaafa49a92867c6f665b50443a301f160c01000000000000000000030d17212c353f48505960686d737a7f83878a8c8e90919192929292908f8d8a86837e79706c605c5c606b70787d82868a8d8f919292929292908f8c8986827d776f6b605c544c433a31271d120800000000000000010d18232d373f464a4c5353535f6c7985929facada093877a6d6054535353535353535353535353535345413a32281e1314202d3a4753606d7986929facaea298887c6f6255493c2f2216090000000000000000000000000000020f1b27323d4754606d7a86929facaa9c908376695f53473845515c6774808d9aa7aca095897c6f63564c4135291d110400000000000000000000000000000a1724313d4a5764707d8a97abb5ab9e918478675d5145392c20130600000000010a141c242b2f33343939393939393939393939393939393939393939393939393433302b241d140b01000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d100300000000000000000000000000000000000815222f3b4855626e7b8897a2adada197877b6e6154483b2f21140a0000000000000000000000000000000000000000010d18242f3b4855616e7b8898a2aeada196877a6e6154473b2e21140800000000000000000000000b17222d3846525e6875828e9ba8ada2978a7e7164574d42464646464646463f4a54626e7b88949fabaa9d9084776b6054443a2f24190d01000000000000000000000000000000000000000c1926323f4c5965727f8c98a5a79b8e8174685b4e4135281b0e0200000000000000000000131f2c3946525f6c7985929facaba39fa3ababa0958c7f72695f53483e32281e11070000000000000916232f3c4956626f7c8995a2ac9f9386796c605346392d20130000000000000a152028343f4a545f696f7d87929892877e736d665f58524c484d5254585b5d5e5f5f5f5e5d5b5854524c474b51575f666d737e87929892877d6f695f544a3f342a20110700000000000000000000000a152028343f4a545f696f7d87929892877e736d665f586060606060606060606060605f5f5e5d5a5753514b4b51575f666d737e87929892877d6f695f544a3f342a20110700000000000000000000000000000000030f1b27333f49536a7784909da99c8f8276685e52463f3b3b3b404653606c7985929fac998c7f7266594c3f3326190c000000000000000000000000000000000000000b151e2a36424d56606b717f8b939aa3ababa49f948f86817b76726f6d6668686767686869696e71757a7f858d929ea2a9afa59e938d80746c61574d42342a200d030000000000000009151f2935404b55606b727f8b929da4ada9a198928a817a746e696562605c545b5a5a5a5b545c606266696e747b828b9299a2aaaea39f93887e706a5f544a3f32291e0d040000000000000000000000050f1a232d363f474f565d60686e72767b7d7f82838485858685858482807d7a76716d66615a51515960666c71767a7d80828485858685858382807d7a75706b636059514a423a31281f150b00000000000000000006111b252d343a3e3f4646525f6c7985929facada093877a6d6054474646464646464646464646464639352f282016101d2935404b5563707d8a99a3aeac9f9285796d6053463a2d2013070000000000000000000000000000000a16202c3945515d6774818e9aa7ab9f94887b6e62544a3f4653606d7985929fabaa9d9084776b6054443a3024190d0100000000000000000000000000000916222f3c4955626f7c8899a3aeaca196877a6d6054473a2d2114080000000000020a12191f2326272d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2726231f19120b0200000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d100300000000000000000000000000000000000a1724313d4a5764707d8a97a9b3ab9e918578695e53463a2d2114020000000000000000000000000000000000000000000714212d3a46535f697885929fabb2a896897d7063564a3d3023170a000000000000000000000006111c2a36414c5663707d8996a0aca99c8f8276695e5246382d393939393844505c6673808d99a6aea2988b7f7265594f4332281e1308000000000000000000000000000000000003060809192633404c5966737f8c99a6a79b8e8174685b4e4135281b0e0200000000000000000000131f2c3946525f6c7985929facb5afacafafa4999083786d60574d42362c20160c000000000000000916232f3c4956626f7c8995a2ac9f9386796c605346392d2013000000000000030c17232e38424d57606b717e8a9299928b80786f6a605d56524c46474b4e505252535252504e4b47464b51555d606a6e787f889299928a7e716b60574d42382e22180e000000000000000000000000030c17232e38424d57606b717e8a9299928b80786f6a605d56524c5353535353535353535251504d4a474b51555d606a6e787f889299928a7e716b60574d42382e22180e0000000000000000000000000000000000000b17222d414e5a6774818d9aa99f92867a6d6159504a4847484b515b636f7c8998a2a49a8a7e7164574b3e3124180b00000000000000000000000000000000000000030c1925303b444f59626d727f889299a1a8afa69f99928e88837f7c797775747474747576787b7e82868c92979da4adaba39f938e81786d605a50453b3022180e0000000000000000030d18242f3a434f59626d74808d929ca3adaaa29f938e86807b76726f6d6669686767676869666d6f72777b81868f949fa3ababa39f918c7f726c61584e42382d20170d0000000000000000000000000008111b242d353d444c52565e6165696e71737577777879797978777573716e6864605c545044454f545b6064686d717376777879797978777573706d67636059544f44403930281f160d030000000000000000000009131b23292e31323946525f6c7985929facada093877a6d6054473a3939393939393939393939392c29241e160e19222c3945515d6774818e9aabb4a99c908376665c5044382c1f120600000000000000000000000000000004111d2935414c55626f7c88959faba6998d8073665c50444d5764717e8a97a2ada2988b7f7265594f4332281e13080000000000000000000000000000000713202d3a4653606d7986929facb2a896897c6f6356493c3025190e00000000000001080e1317191a20202020202020202020202020252728292622211f1a20201a1a17130e08010000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d100300000000000000000000000000000000000c1926333f4c5966727f8c99a5b2a99c8f827669574d42362a1e120500000000000000000000000000000000000000000005121e2b37424d576a7683909da9b2a5988c7f7265594c3f3226190c0000000000000000000000000d1925303b4854606b7784919daaac9f93877b6e6153493f33272d2d2d3a4653606d7984919eabac9f92867a6d6054473d3221160c01000000000000000000000000000000040a0f1315161a2734404d5a6773808d9aa6a79b8e8174685b4e4135281b0e0200000000000000000000131f2c3946525f6c7985929facb8bbb9b2a89f93877c6f665c50453b31241a0e04000000000003050916232f3c4956626f7c8995a2ac9f9386796c605346392d20130000000000000006111c26303c454f59616c717e879298928d837c736d68605d5653514a4a484847464748484a4a5053555d60676d737b838c939892877e716c61594f453c30261c0f060000000000000000000000000006111c26303c454f59616c717e879298928d837c736d68605d5653514a4a484847464748484a4a5053555d60676d737b838c939892877e716c61594f453c30261c0f06000000000000000000000000000000000000061724313d4a5764707d8a97a2a3988d80736b605c54555455555c606d75828f9caa9f93877a6e6154473b2e211408000000000000000000000000000000000000000009141f29323d47505a626d727e8791969ea5acaba39f9a95908c8885848281818081828385878b8f92989fa2a9ada8a099928d81786d665c50483e33291f100600000000000000000007131d28313d47515b606c77808c919ea1a9aea59e98928d87837f7c79777674747474747677797c7f83888e92999fa6aea8a199928b7f736d635a50463c2f261c0e05000000000000000000000000000009121b232b323a41454c5254565e616466686a6b6b6c6c6c6b6a696764615e5653514a423e3d424a5053565e616467696a6b6c6c6c6b6a686663605d55554f48433d342e271e160d040000000000000000000000010911181e22242c3946525f6c7985929facada093877a6d6054473a2d2d2d2d2d2d2d2d2d2d2d2d201d19130e17202935404b55606d7985929fabb1a7988c7f7265544a3f34281c1003000000000000000000000000000000010d19242f3a47545f6a7783909da9ab9e9184796d605346525e6976828f9ca9ac9f92867a6d6054473d3221160c0200000000000000000000000000000006131f2c3845515c677783909daab2a6998c7f7366564d41362a1c11060000000000000002070b0d0d131313131313131313151e252c31343536322f2e2b26201f1c18120b0300000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d100300000000000000000000000000000000000e1b2834414e5b6774818e9aa7b3a69a8d8073675a4d4031251a0e02000000000000000000000000000000000000000000020e1a2631414e5b6874818e9ba7b3a79a8d8074675a4d4134271a0e00000000000000000000000008141e2c38444f5965727f8c98a3aea4998c7f73655b5044372b1f2a36414c5663707d8a97a1ada79b8e8174685d5245392c201304000000000000000000000000000000070f151b1f2222262b38434e586875828f9ba8a79a8d8074675a4d4134271a0e0100000000000000000000131f2c3946525f6c7985929facacacacada1968d80746a60544a3f33291f120900010407070c10121316232f3c4956626f7c8995a2ac9f9386796c605346392d201300000000000000000a151e2a333d47505a626c717d869196959087807a736d6863605c54575554545354545557545c6063676d727a7f8690959691867d716c625a50473d332a1e150a0000000000000000000000000000000a151e2a333d47505a626c717d869196959087807a736d6863605c54575554545354545557545c6063676d727a7f8690959691867d716c625a50473d332a1e150a000000000000000000000000000000000000000714202d3a4753606d7a85929ea89f93887d726d666362616263676d737f8b949ea69d908376685e5246392d2014070000000000000000000000000000000000000000020d17202b353f48515b626c717d848e939da0a7abaca79f9d989892908f8e8d8d8e8f909298979c9fa3aaada9a29f96918780786c665c544a3f362c21170d00000000000000000000010c161f2b353f44505b656c747f8a92979ea6acaaa29f9a93908c898684828181808181828486898c90959a9fa3ababa49f9691877e736d635b51473e342a1d140a00000000000000000000000000000000091119202830353b4146474d525457595b5d5e5e5f5f5f5f5d5c5a5754524c46444039302f383f44464c5254575a5c5e5f5f5f5f5f5d5c595653514b48443d383228231c150c040000000000000000000000000000060d12151f2c3946525f6c7985929facada093877a6d6054473a2d212020202020202020201413110d0f182029323b45515d67727e8b97a2adab9f95887b6e6155483b2e23170c000000000000000000000000000000000008131e2b37434e5865717e8b97a2ada1968a7d7063564c54616e7b87939faca79b8e8174685d5245392c2013040000000000000000000000000000000004101c2834404b556774818e9aabb5a99c908376685e5246382e23170c0100000000000000000000010606060606060008111e272f373d4042433f3b3a37312d2c29231d150d04000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000000101c2936434f5c6976828f9ca9b2a5988c7f7265594c3f322619090000000000000000000000000000000000000000000000091a2733404d5a6673808d99a6b3a89b8e8175685b4f4235281c0f00000000000000000000000002101c27333d4754616d7a86929facab9e9184786c6053463a2f242d3946525e6875828f9ba9aca095897c6f63564c4135291d1104000000000000000000000000000007101920272b2e2f31363e4754606a7885919eabaa998c7f7266594c3f3326190c0000000000000000000000131f2c3946525f6c7985929f9f9f9f9fa59e9184796d60584e42382e21170d02080d111314181c1f201f232f3c4956626f7c89959f9f9f9386796c605346392d20130000000000000000030c18212b353e48505a626b707c848e9399928d85807a75706d666664626160606061626466666d70757a7f858c9298938e847c706b625a50483e352b21180c03000000000000000000000000000000030c18212b353e48505a626b707c848e9399928d85807a75706d666664626160606061626466666d70757a7f858c9298938e847c706b625a50483e352b21180c03000000000000000000000000000000000000000613202c3945515d67727f8c96a1a49a92877f7873706e6e6e7073798088939fa69f948a7e7164564d41362a1e1105000000000000000000000000000000000000000000050e19232d363f49515a626b6f7a818990959c9fa6a9aca9aaa29f9d9b9b9a9a9b9b9c9fa2aaa8acaaa9a19e97928c847c736c665b544a42382e241a0f050000000000000000000000040d192327333f49535b606d737d858f949da0a7acaca49f9c989892918f8e8d8d8d8e8f919298999d9fa7acaca69f99938d847d716c635b51493f352c22180b020000000000000000000000000000000000070e161e24293036393b4246474a4c4f50515252535252514f4d4a4746413b38342e27262d33383a4146474a4d4f515252535252504f4d4a4745403a38332c272118120b03000000000000000000000000000000000106131f2c3946525f6c7985929facada093877a6d6054473a2d21141313131313131313060b0f151a212a323b444e58606d7984919ea9b2a89d908376695f53463a2d1c11060000000000000000000000000000000000010f1b26323c4753606d7985929faba99b8e8275685d525966737f8c99a4aca095897c6f63564c4135291d110400000000000000000000000000000000000c18232e3e4a5764717e8a99a3afac9f93877b6e61544a3f34281d13070000000000000000000000000000000000040e1a232f3941484d4f504c4847433d3a38342f271f160e040000000000000000000001040606111e2a3744515d6a7784909daaa99c8f8376695c504336291d10060000000000000000000000000000000000101d2a3743505d6a7683909da9b1a4978a7e7164574b3e3124180b00000000000000000000000000000000000000000000000c1925323f4c5865727f8b98a5b2a99c908376695d5043362a1d10000000000000000000000000000b16202d3946525d6875818e9ba7aca096897c7063554b4135292e3a4754616d7a86929facaa9d9084776b6054443a2f24190d0100000000000000000000000000040f19222b32373b3c3f4246505a626f7c8997a1ada298897d7063564a3d3023170a0000000000000000000000131f2c3946525f6c798692939393939393938a7d70675d51463d30261c0f080d13191d202125292b2c2c292f3c4956626f7c89939393939386796c605346392d2013000000000000000000060f19232c363f485059616a6f7a818a919697928c86817d797673706f6e6d6c6d6e6f707376797d81858c929796918a817a6f6a615950483f362c23190f060000000000000000000000000000000000060f19232c363f485059616a6f7a818a919697928c86817d797673706f6e6d6c6d6e6f707376797d81858c929796918a817a6f6a615950483f362c23190f06000000000000000000000000000000000000000004111d2935404b55606d79849197a1a399928b84807d7b7a7b7d80858d939aa4a0968f82766c6155443b3025190e020000000000000000000000000000000000000000000008111b242d373f48505960686d757d83898f94989c9fa3aba7a8aaa8a7a7a7a7a8a9a9a7a5a8a09e9a97918c8580796f6b605b544a423830261c110800000000000000000000000000071017222d384149505b636b707b828990959c9fa4acaca9aaa39f9d9c9b9a9a9a9b9c9d9fa3aaaaababa39f9b948f878079706b625a514940372e231a100600000000000000000000000000000000000000040c13191e252a2d30363a3b3e4042444445464646454442403e3b3936302c28231c1c22282b3036393a3e40434445464646454442403d3a39352f2c27211b160c070000000000000000000000000000000000000006131f2c3946525f6c7985929facada093877a6d6054473a2d21140c0c0c0c0d090e1114171b1f262b333b444c56606a73808c96a1adada1968a7e7164574d42362a1e0a000000000000000000000000000000000000000a151f2c3945515d6774808d9aa6ac9f92867a6d6154606b7784919eabaa9d9084776b6054443a3024190d0100000000000000000000000000000000000714212d3a4754606d7a86929facafa4998c7f72665c50443a2f24181007000000000000000000000000000000030c16202c35414b53595b5c5955534e4a47454039312820160c020000000000000004090e111213131e2a3744515d6a7784909daaa99c8f8376695c504336291d13130807050200000000000000000000000000111e2a3744515d6a7783909daab0a3968a7d7063574a3d3024170a00000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1aa9d9083776a5d5044372a1d110000000000000000000000000005111d2935414c56636f7c8995a0aca89b8e8174675d5145392c37434e5865727f8b99a3aea2988b7f7265594f4332281e130800000000000000000000000000000a15202b343c4347494c4d5359616c75818e9ba9aa9f92867a6d6054473a2d2114070000000000000000000000131f2c3946525f6c7986868686868686868681756c61554b40342b1e150c13191e24292c2d323638393836323c4956626f7c86868686868686796c605346392d20130000000000000000000007111a242d363f474f5860686d747d848c929898928e8a8582807d7b7b7a797a7b7b7d8082858a8e929898928c847d746d675f584f473f362d241a11070000000000000000000000000000000000000007111a242d363f474f5860686d747d848c929898928e8a8582807d7b7b7a797a7b7b7d8082858a8e929898928c847d746d675f584f473f362d241a1107000000000000000000000000000000000000000000010d18242f3a45515d676e7c8592979fa39f96918c89888788898d91979fa49d9691847b6e615a504532291f140800000000000000000000000000000000000000000000000009121b252d363f474f565e616b70787d82878b909299989a9c9d9e9f9f9f9e9e9d9c9b999696918d89857f7a736d676059504a42382f261e140a00000000000000000000000000000006111b262f383f44515961696e757d83898f939a9c9fa2aaa7a8aaa9a7a7a7a7a7a9a9a8a6a9a29e9b99928e88827c746d676059504840372e251c110800000000000000000000000000000000000000000002080d14191e20252a2d2e31333537383839393938373634312e2d2a251f1c181211171c1f252a2d2e313436373839393938373533302d2c29241d1c160f0a04000000000000000000000000000000000000000006131f2c3946525f6c7985929facada093877a6d6054473a2d211919191919191a191e2022272b31373e454d565e686f7c87929fa8b1a79e9184786d6053463b31261a0e0000000000000000000000000000000000000004101d2935404b55626f7b88949faba3998b7e726557636f7c8996a0aca2988b7f7265594f4332281e13080000000000000000000000000000000000000713202c3945525d6876838f9ca9b3ab9e9184796d60554b4035292219100903000000000000000000000000040c151e28323d47535d65686965625f585653514b433a32281e1308000000000000080f151a1d1f2020202a3744515d6a7784909d9f9f9c8f8376695c504336292020201514120e09030000000000000000000000121e2b3845515e6b7884919eabafa396897c706356493d3023160a00000000000000000000000000000000000000000000000b1824313e4b5764717e8a97a4b1aa9d9184776a5e5144372b1e1100000000000000000000000000010d1924303a4854606b7783909daaac9f92857a6d6054473c313b4754606a7783909dabac9f92867a6d6054473d3221160c0100000000000000000000000000030f1b27323c464e545559575f616b707e8a939eaaa3988e8174675d5145392c2013060000000000000000000000121f2b3844515d6974797979797979797979756f65594f433a342e261e191e252a3035393a3f43454645433f3a4754606a6f79797979797979766c5f5346392d2013000000000000000000000009121b242d353e464e565d606b70797f858c91969a97928f8d8a888787868787888a8c8f92979a96918c857f79706b605d554e463d352d241b120900000000000000000000000000000000000000000009121b242d353e464e565d606b70797f858c91969a97928f8d8a888787868787888a8c8f92979a96918c857f79706b605d554e463d352d241b1209000000000000000000000000000000000000000000000007131d2935404b555f6a6f7d858f949c9fa09e999695949596999ea19f9b938e847b6e695e52483e3320170d020000000000000000000000000000000000000000000000000009131b242d353d444c525960656c70767b7f8386898b8d8f9091929292929190908e8c8a8784807c79726d67605d554f443f382f261d140c02000000000000000000000000000000000a141d262d3340474f575e616b70777d82878b8f9298989a9b9d9e9e9f9f9f9e9d9d9b999797928e8a86817c766f6a605d554f473e362e251c130a00000000000000000000000000000000000000000000000002080e1114191e20212426282a2b2b2c2c2c2c2a29272421201e1914100c07060b0f13191d20212427292b2c2c2c2c2c2a29262320201d1813100b050000000000000000000000000000000000000000000006131f2c3946525f6c7985929facada093877a6d6054473a2d2525252525262627252a2d2d33373c434750575f686e7a849199a3afaa9f958b7e71665c504438291f140900000000000000000000000000000000000000000c18242f3947535f6a7683909ca9ab9d908376695f6774818e9aa8ac9f92867a6d6054473d3221160c0200000000000000000000000000000000000004111d2935414c5664717e8a97a1adaca0968b7e71675d51453e342b221a140e09060400000101000205060c10161e27303a444f59656f7576726e6a6763605c554c443a3025190d010000000009121920262a2c2c2d2d2d3744515d6a778490939393938f8376695c5043362d2d2d2d22211e1a140e0600000000000000000000121f2c3845525f6b7885929eabafa296897c6f6356493c3023160900000000000000000000000000000000000000000000000a1724313d4a5764707d8a97a3b0aa9e9184776b5e5144382b1e11000000000000000000000000000008131e2c38434f5965727f8b98a2aea2988b7e7165574d4237404b55626f7c8895a0aca79b8e8174685d5245392c201304000000000000000000000000000006131f2b37434e5860626567696e747d86929fa5a49f92867b6e61554c4135291d11040000000000000000000000101c2935414d5862696c6c6c6c6c6c6c6c6c68655d535246443f383026252a30363a4145474b4f525352504c47454e5860626c6c6c6c6c6c6c6c645a4f43372b1e1200000000000000000000000009121b232c343c434c525961676d737a7f84898e91979899979594939393949597999897918e89847f7a736d676159514c433c342c231b1209000000000000000000000000000000000000000000000009121b232c343c434c525961676d737a7f84898e91979899979594939393949597999897918e89847f7a736d676159514c433c342c231b1209000000000000000000000000000000000000000000000000010c18242f39434e58606b6f7b828a8f94979a9d9e9e9f9f9e9d9a99928f89817a6e695e574d42362c220e0500000000000000000000000000000000000000000000000000000109121b232b323a41464f535b6063696e7276797c7f8182848585868685848483817f7d7b7773706d66605d55514b433d332d261d140b020000000000000000000000000000000000020b141b2227353e454d525960636b70757b7e8285888b8d8f9091929292929191908e8c8a8885817e7a746f6a626058514b433d352d241c130a0100000000000000000000000000000000000000000000000000000205090e11141417191c1d1e1f1f201f1f1e1c1a171414110d08040000000003080d111314171a1c1e1f1f201f1f1d1c1a171413110d070100000000000000000000000000000000000000000000000006131f2c3946525f6c7985929facada093877a6d6054473a32323232323232333430363a3b3f44464e535a61696e7a839096a1abaea3989083786c60544a3f34281c1003000000000000000000000000000000000000000007121d2b37434e5864717e8a97a1ab9f95887b6e616d7985929faba79b8e8174685d5245392c20130400000000000000000000000000000000000000010d19242f3a4653606d7985929ea9b2a89e9184796d605a50463d342a251f1a1313100c070e0e080e1114171c1f283039424c56606b7581837f7b7774706d675e564c4135291d110500000008121b242b313638393939393844515d6a77838686868686868276695c504337393939392e2d2b261f180f06000000000000000000121f2b3845525e6b7884919eabafa296897c6f6356493c3023160900000000000000000000000000000000000000000000000b1724313e4a5764717d8a97a4b0aa9d9184776a5e5144372b1e110000000000000000000000000000020f1b27323d4754606d7a86929facaa9c908376695f53473845515c6774808d9aa7aca095897c6f63564c4135291d110400000000000000000000000000000815222e3b4754606a6f7274777b81879298a2a39f928c7f72695f53433a2f24190d0100000000000000000000000d1925303b4650585d5f60606060606060605b5e60605f53504a42382e30363a41464c5254585c5e5f5f5c5853514b4e5456606060606060605f5a52493e33271b0f0000000000000000000000000009111a222b313a41454f555d60686d72787d8185888b8d8f919292939292918f8d8b8885817d78726d68605d554f45413a312a221a11090000000000000000000000000000000000000000000000000009111a222b313a41454f555d60686d72787d8185888b8d8f919292939292918f8d8b8885817d78726d68605d554f45413a312a221a1109000000000000000000000000000000000000000000000000000007121d27313c464f5960696e777d82888b8e909192929291908d8b86827d746d685e574d453b30241a100000000000000000000000000000000000000000000000000000000000091019202830363d41495053575e6165676d6f7274757778787979787877767472706e696763605c54514c45403a3128221c140b0200000000000000000000000000000000000000020a1117232c333b42464f54596063696e7276797c7e808283848585868585848382807d7b7975716d68625f58544e45403a312b231b120a01000000000000000000000000000000000000000000000000000000000000020507080b0d0f11111213131312110f0d0b080705010000000000000000010507070b0d10111213131312110f0d0a07060401000000000000000000000000000000000000000000000000000006131f2c3946525f6c7985929facada093877a6d6054473f3f3f3f3f3f3f3f404042424647495053585f626c717b839095a0a8afa59f92867c6f655b5042382e23170c000000000000000000000000000000000000000000010f1a26313c4653606d7985929eaca7998c7f7366717d8a98a2aca095897c6f63564c4135291d1104000000000000000000000000000000000000000008131f2c3845515c6773808c97a1adada1968d80746c61584e463e36302a26201f1c181b1a1b1b191e2023282c313a424a545d68707d898f8c8884807d796d685e5246392d2013070000040f19242d353d424546464646453d4f5b6771777979797979797670665a4e3b44464646463b3a37312a21180e030000000000000000111e2b3844515e6b7784919eaab0a396897d7063564a3d3023170a00000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1a99d9083766a5d5043372a1d100000000000000000000000000000000a16202c3945515d6774818e9aa7ab9f94887b6e62544a3f4653606d7985929fabaa9d9084776b6054443a3024190d0100000000000000000000000000000916222f3c4955626f7c7f8084888e9299a29f99928c80746d63574d4231281e130800000000000000000000000008141f2a343e464d51525353535353535761686b6c6c6c605c544a3f353a41464c52565d6065696b6c6b6965605c554e474953535353535353534f4940372c21160a00000000000000000000000000000810191f282f353e434b51565d60666c7074787b7e80828485858685858482807e7b7874706c66605d56514b433e352f281f1910080000000000000000000000000000000000000000000000000000000810191f282f353e434b51565d60666c7074787b7e80828485858685858482807e7b7874706c66605d56514b433e352f281f191008000000000000000000000000000000000000000000000000000000010b151f2a343d474f575e656c70767b7e8183848586858483817e7b756f6b605d564d453b33291f1208000000000000000000000000000000000000000000000000000000000000070e161e252a2f383f44464d5354555c60636567696a6b6c6c6c6b6b6a69686663615e575653504a45413a352f281f17110a020000000000000000000000000000000000000000000006111a202930363d44484f54565e6165666d6f7174757778787979787877767573716f6d6664605d56534e47433d352f281f1911090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006131f2c3946525f6c7985929facada093877a6d60544c4c4c4c4c4c4c4c4c4c4d4e4d5254535b60636a6e757e859195a0a7afa59d938b7f726a5f53493f30261c1106000000000000000000000000000000000000000000000a151f2c3845515c6773808d9aa4aa9d9184776a75828e9baaaa9d9084776b6054443a3024190d01000000000000000000000000000000000000000004101c2834404b55606d7a85929ea7b1a89d928a7e706a60585046423b36312d2c282327272728252a2d2e34383e434c545c666d7a84919c9896918d89857a6d6154473a2e21140700000915202b353f474e5253535353514948555f676a6c6c6c6c6c6c69665e54474851535353534846423c332a1f14090000000000000000111e2a3744515d6a7784909daab0a3978a7d7064574a3d3124170a00000000000000000000000000000000000000000000000c1825323f4b5865727e8b98a5b1a99c8f8276695c504336291d1000000000000000000000000000000004111d2935414c55626f7c88959faba6998d8073665c50444d5764717e8a97a2ada2988b7f7265594f4332281e13080000000000000000000000000000000e1a2734414d5a6774808c8d90959b9fa098928e877f746e645b51453c311f160c01000000000000000000000000020d18222c343b4144464646464646505c6873787979796d665c504441454c52565e61686d727678797876726d675f584e464646464646464646433e372e251b1005000000000000000000000000000000070d161e2429313a40454c52545b6063656c6e717476777879797978777674716e6c6563605b54524c4540393129241e160d070000000000000000000000000000000000000000000000000000000000070d161e2429313a40454c52545b6063656c6e717476777879797978777674716e6c6563605b54524c4540393129241e160d070000000000000000000000000000000000000000000000000000000000030d18222b353d454d535b6063696e71747677787978777674716e69636059524c433b332921170d0000000000000000000000000000000000000000000000000000000000000000050c13191d262d33373b4246484b515356585a5c5d5e5f5f5f5f5e5d5d5b595754534d4946443f38352f29241d160d0600000000000000000000000000000000000000000000000000080e171f252a33383d44484d5254545c60626567686a6b6b6c6c6c6b6a6a68666462605c5454524c47433c383229241d160d07000000000000000000000000000000000000000004080a0b1313131313131311110e0b060100000000000000000004090e11121313131313131313070705010000000000000000000000060b0e1011131313131313130a0a0804000000000000000000000000000000000000000006131f2c3946525f6c7985929facada093877a6d6058585858585858585859595a5b565e6164656c70757c828a9297a0a8afa59e938e81746d62584e41382d1e150a000000000000000000000000000000000000000000000004101c2834404b55616e7b87939faca095887b6f7985929faca3988b7f7265594f4332281e1308000000000000000000000000000000000000000000000c18232e3945525d68727f8c959faaaea49f92867c6f6a625a524d46423c3a38342e343434353036393b3f444650565d666d78828f96a0a8a09e988d8074685e5246392d20130700000e1a26313d4751595e5f6060605e56544f555b5d6060606060605c5a544d53555d6060606055534d453c31261a0e0200000000000000101d2a3643505d697683909ca9b1a5988b7e7265584b3f3225180700000000000000000000000000000000000000000000000d1a2733404d5a6673808d99a6b3a89b8f8275685c4f4235291c0f000000000000000000000000000000010d19242f3a47545f6a7783909da9ab9e9184796d605346525e6976828f9ca9ac9f92867a6d6054473d3221160c020000000000000000000000000000000e1a2734414d5a6774808d9a9da0a7a0969186817b726d645c53493f332a1f0d04000000000000000000000000000006101a222a303538393939393945525e6b7885868686786d60534a4c51565e61686d737a7f82858685837f796f6a5f584e42382e393939393937332c251c13090000000000000000000000000000000000040c13191f282f353a41454a5053535b60626567696a6b6c6c6c6b6a69676562605b5353504a45413a352f281f19130c0400000000000000000000000000000000000000000000000000000000000000040c13191f282f353a41454a5053535b60626567696a6b6c6c6c6b6a69676562605b5353504a45413a352f281f19130c0400000000000000000000000000000000000000000000000000000000000000060f19232b333b41495053575f6164676a6b6b6c6c6b6a6764615e57544f45413a312921170f0500000000000000000000000000000000000000000000000000000000000000000002080b141b22272b31363a3b404547494c4e4f5152525353525151504e4c4a4846423d3a38342e29241e18130c04000000000000000000000000000000000000000000000000000000050d141a21272c33383b4246474a505355585a5c5d5e5f5f5f5f5e5e5d5b59575553504a4745413a37312b272018130c0400000000000000000000000000000000000000050c11141717202020202020201e1d1b17120c0400000000000000080f151a1d1f20202020202020201413110d080200000000000000040b11171a1d1e20202020202020171614100b0500000000000000000000000000000000000006131f2c3946525f6c7985929facada093877a6d656565656565656565656566676869696e7074787d81878f939ea1a9aca49f938e81786d605b51463c2f261b0c030000000000000000000000000000000000000000000000000c18232e3946535f6976828f9ca9a7998c7f737d8a98a2ac9f92867a6d6054473d3221160c020000000000000000000000000000000000000000000007121d2935414c56606d78839098a2acaea29892857c716c615e57534d494645404141414141424146474a50535a61686d78818e949fa8b0a69f92857a6d61564c4135291d11050000111d2a36424e59636a6c6c6c6c6b636059514a51535353535353504e50575f626a6c6c6c6c6c5f574d42372b1e1205000000000000000f1b2835424e5b6875818e9ba8b3a6998c807366594d402f24180c00000000000000000000000000000000000000000000020e1b2835414e5b6874818e9ba7b4a79a8e8174675b4e4134281b0e0000000000000000000000000000000008131e2b37434e5865717e8b97a2ada1968a7d7063564c54616e7b87939faca79b8e8174685d5245392c201304000000000000000000000000000000000e1a2734414d5a6774808d9aa5a9aa9e91847d78716c605d554b43392f24180c050000000000000000000000000000000810181f25292b2c2d2d2d3643505d6976839098897c6f635a56555d60686d737a80858b8f9192928f8b847c6f6a5f544a3f34282d2d2d2d2b27211b130a0100000000000000000000000000000000000001080d161d24292f35383f444649505355585a5c5e5f5f605f5f5e5c5a585553504946443f38352f29241d160d080100000000000000000000000000000000000000000000000000000000000000000001080d161d24292f35383f444649505355585a5c5e5f5f605f5f5e5c5a585553504946443f38352f29241d160d080100000000000000000000000000000000000000000000000000000000000000000007111920292f383f44464d5355585b5d5e5f5f5f5e5d5a5854524d48443d352f281f170f05000000000000000000000000000000000000000000000000000000000000000000000000020a11171b1f252a2d2f34383a3c3f4142444545464645454443413f3d3b3a36312d2c28231c19130d0701000000000000000000000000000000000000000000000000000000000002090e161c21272c30363a3b3f4446494b4d4f5051525253525251504f4d4a4846443f3a39352f2b26201b160d0701000000000000000000000000000000000000000810171c2123242d2d2d2d2d2d2d2b2a27231d160e06000000000009121920262a2c2c2d2d2d2d2d2d2d21201d19130c050000000000050e161d22272a2a2d2d2d2d2d2d2d2423201c171008000000000000000000000000000000000006131f2c3946525f6c7985929facada093877a72727272727272727272727273737576787a7d8184898e93999ea6ada8a19a938c81786d665c50493f342a1d140a0000000000000000000000000000000000000000000000000007121d2b37424d5764717d8a97a1aa9d908377818e9baaa79b8e8174685d5245392c2013040000000000000000000000000000000000000000000000000d19242f3a44505c666e7b86929aa4afaaa29792867e756e69615f575653514b4e4e4d4e4e4f4c5254545c60646c717a828e939ea6b0a89f948c7f72685e52443a3025190d010000121f2c3845525e6a757979797978706b605c544d4546464646434b515a61696e777979797976695f53463a2d211407000000000000000d1a2734404d5a6773808d9aa6b3a89b8e817568554b4035291d100400000000000000000000000000000000000000000005121e2b37424d57697683909ca9b2a5988c7f7265594c3f3226190c00000000000000000000000000000000010f1b26323c4753606d7985929faba99b8e8275685d525966737f8c99a4aca095897c6f63564c4135291d1104000000000000000000000000000000000e1a2734414d5a6774808d95999c9fa096918a847e756d675d554b40352921160b00000000000000000000000000000000060d14191c1f1f20202834414e5b6774818e9a8e81756c656364676d737a80868d92989c9e9f9e9c9691857c6f665c5044382b1f2020201e1b16100901000000000000000000000000000000000000000000040c13181e24292d3338393f4446484b4d4f515252535252514f4d4b4846443f3938332d29241e18120c0400000000000000000000000000000000000000000000000000000000000000000000000000040c13181e24292d3338393f4446484b4d4f515252535252514f4d4b4846443f3938332d29241e18120c04000000000000000000000000000000000000000000000000000000000000000000000000070e171d262d33373b4246484b4e505152535251504e4b4746423b383229241e160d05000000000000000000000000000000000000000000000000000000000000000000000000000000060b0f141a1e2123292c2d303234363738393939383837363533302e2d2a25201f1c17110d0801000000000000000000000000000000000000000000000000000000000000000000050b10161c1f252a2d2e34383a3c3e414244454546464545444342403e3c3a38342e2c29241e1b150f0a04000000000000000000000000000000000000000008121a22282d3031393939393939393837332e2820180e0400000008121b242b31363839393939393939392e2d2a251e160e05000000040e1720272e3336373939393939393931302d28221a11080000000000000000000000000000000006131f2c3946525f6c7985929facb2a5988c7f7f7f7f7f7f7f7f7f7f7f7f7f7f80818385878a8d91969b9fa4ababa39f9691887f776d665c544a3f372d22180b0200000000000000000000000000000000000000000000000000000e1a26313c4653606d7984919eaba095887b85929faba095897c6f63564c4135291d110400000000000000000000000000000000000000000000000008131e28343f4a545f69717e88939fa3afa9a298928b827b746e696662605c545b5a5a5a5b5c565e6164666d71767e848f949ea5afaaa1968f82786c60564c4132281e130800000013202c3946535f6c7987868686847d736d665f575146413e454d555c606c717b83868686867b6e6155483b2e221508000000000000000c1825323f4b5865727e8b98abb5aa9d908477675d5145392c1f13060000000000000000000000000000000000000000000714212d3a46535f697885929fabb4aa968a7d7063574a3d3024170a00000000000000000000000000000000000a151f2c3945515d6774808d9aa6ac9f92867a6d6154606b7784919eabaa9d9084776b6054443a3024190d01000000000000000000000000000000000e1a2734414d5a67748087898c90949da09e96918a81796d675d51453d33271c10030000000000000000000000000000000002080d101213131825323f4b5865727e8b98938b7f75717071747a80858d92989fa2aaa4a3a5a8a1979083786d6053463a2f24190d13120f0a0500000000000000000000000000000000000000000000000001070d13191c22282b2d3337393b3e41434445464646454443413e3b3937332d2b28221c19130d070100000000000000000000000000000000000000000000000000000000000000000000000000000001070d13191c22282b2d3337393b3e41434445464646454443413e3b3937332d2b28221c19130d07010000000000000000000000000000000000000000000000000000000000000000000000000000050b141b22272b31363a3b3e4143444546454443413e3b3a36302c272119130c0400000000000000000000000000000000000000000000000000000000000000000000000000000000000003090e1214181c1f20232527292a2b2c2c2c2c2b2a2a28262421211e1a1312100c060000000000000000000000000000000000000000000000000000000000000000000000000000050b1014191e2023282c2d2f3234353738383939393837373533312f2d2b2823201d19130f0a0400000000000000000000000000000000000000000005101a242c33393c3e4646464646464644433f39322a20160c0100040f19242d353d42454646464646464646463936302820160c0200000b16202932393f4344464646464646463d3c39332c231a100500000000000000000000000000000006131f2c3946525f6c7985929facb8a79c918c8b8b8b8b8b8b8b8b8b8b8b8c8c8d8e909297979a9ea1a8acaba39f99928d847d736c655c544a42382e241b100600000000000000000000000000000000000000000000000000000009141f2c3844505c6673808c99a4a79c8f828f97a2aa9d9084776b6054443a3024190d01000000000000000000000000000000000000000000000000010b17232e38424d57616c727f8c919fa3abaaa39f938f86817b76726f6d66696867676768686a686e7174797d838a91969fa6afa9a19891847a6d665b50443a3020160c020000000b1825323e4b5865717e8b9296918780786e69625b524c4550575f676d747e869095948d8074695f53463a2d211407000000000000000916232f3c4956626f7c8999a3afac9f92867a6d6053473a2d22170b0000000000000000000000000000000000000000000815222e3b4855616e7b8898a2aeaea298887b6e6155483b2e221508000000000000000000000000000000000004101d2935404b55626f7b88949faba3998b7e726557636f7c8996a0aca2988b7f7265594f4332281e130800000000000000000000000000000000000713202d3a4653606d787b7c7f838990959fa09d938e82796d60594f44382c1f1409000000000000000000000000000000000000000305060815222f3b4855626e7b88959b918b827e7d7e81858c92989fa2a29f9a9796989c9f9f958a7d7164554c4135291d110405020000000000000000000000000000000000000000000000000000000001080d11171c1f22272b2d2f323436373839393938373634322f2d2b27221f1c17110d08010000000000000000000000000000000000000000000000000000000000000000000000000000000000000001080d11171c1f22272b2d2f323436373839393938373634322f2d2b27221f1c17110d08010000000000000000000000000000000000000000000000000000000000000000000000000000000000020a11171b1f262a2d2e31343738383939383734312e2d2a251f1b160d08010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000205070c10131416191b1c1e1f1f20201f1e1e1d1b19171514120e09060300000000000000000000000000000000000000000000000000000000000000000000000000000000000002090e1114171c1f20222527292a2b2c2c2c2c2b2b2a28262422201f1c1713110d080100000000000000000000000000000000000000000000000c17222c363e45494a53535353535353514f4b443c32281d1206000915202b353f474e5253535353535353535346413a32281e13080006111d27323b444a4f51535353535353534a49443e362c22170b00000000000000000000000000000006131f2c3946525f6c7985929facb8ada39c98989898989898989898989898999a9b9c9ea1a9a7aba9a8a19e99928e87817a706b605b534a423930261c12090000000000000000000000000000000000000000000000000000000003101c28343f4a54616e7b87939fac9e948f949ea9a3988b7f7265594f4332281e1308000000000000000000000000000000000000000000000000000006111c26303c45505a636d737f8b9299a1a8aea59e98928d87837f7c79777674747474747577787a7d81848a90949ea1a9afa8a19792867c6f685e544a3f32281e0e04000000000b1724313d4a56626d73808c9399938d837b726d615e56515a61696e79818a9298958f82786d60574d42372b1e1205000000000000000714202d3a4753606d7a86929facafa399897d7063544a3f33281c0f030000000000000000000000000000000000000004111d2935414c5665727e8b98aab3ab9f9285786c605346392d2013060000000000000000000000000000000000000c18242f3947535f6a7683909ca9ab9d908376695f6774818e9aa8ac9f92867a6d6054473d3221160c02000000000000000000000000000000000006121f2b3844505c666d6e6f72767c838f949fa59e948e81746b6054483b31251a0e020000000000000000000000000000000000000000000814212e3a47535f6a7784919d9b948f8b898a8d92989fa2a29f98928d8a898b90949c9c8f8276675d5145392c201306000000000000000000000000000000000000000000000000000000000000000000060b0f12171b1f20222527292b2c2c2d2c2c2b29272522201f1b17120f0b0600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060b0f12171b1f20222527292b2c2c2d2c2c2b29272522201f1b17120f0b0600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060b0f141a1e212225282a2b2c2c2c2b2a272521201e1a140f0b04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040607090c0e0f1112121313121211100e0c0a0807050200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000205060c10121316181a1c1d1e1f1f201f1f1e1d1c1a17151312100b06040100000000000000000000000000000000000000000000000004111c28333e48505557606060606060605e5c564e44392e23170b010e1a26313d4751595e5f606060606060605f524c443a3025190d010b17222e39444d555b5d60606060606060575550483e33281c1004000000000000000000000000000006131f2c3946525f6c7985929facacacada7a5a5a5a5a5a5a5a5a5a5a5a5a5a6a6a8a9a8a6aba39f9c9996918c87817b746d6761595049413930271e140a0000000000000000000000000000000000000000000000000000000000000c17232e3846535e6975828f9ca8a69e9c9ea6ac9f92867a6d6054473d3221160c020000000000000000000000000000000000000000000000000000000a141e2a333e48515b636d737f8791969fa4acaaa29f9a93908c898684828181808181828385878a8e91979c9fa6adaca59d9691857c6f6a60564c42382d20160c00000000000915212e3a45505a636e74818e939f9590867e756d68605c606c717b838e939f969083796d665c50453c31261a0e020000000000000006131f2c3945515d677783909daab5ab9a8d8073665b5044382b1f140a000000000000000000000000000000000000010c13202c3945525d6875828f9ba8b5a89b8f8275665b5044382b1f120600000000000000000000000000000000000007121d2b37434e5864717e8a97a1ab9f95887b6e616d7985929faba79b8e8174685d5245392c20130400000000000000000000000000000000000003101c28343f4a545c606162666b6f79828f97a1a69d93897d7063574d42362a1e120500000000000000000000000000000000000000000006121e2b37424e5765727e8b95a09e9c9896979a9fa2a39f98928c85817e7d7e838c929f92867a6d6054473a2d211407000000000000000000000000000000000000000000000000000000000000000000000003060b0f121315181a1c1e1f1f201f1f1e1c1a181513120f0b0603000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003060b0f121315181a1c1e1f1f201f1f1e1c1a181513120f0b0603000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003090e121415181b1d1e1f201f1e1d1b181414110e090200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030607090b0e0f1112121313121211100f0d0b09070603000000000000000000000000000000000000000000000000000000000814212d3945505a61646c6c6c6c6c6c6c6b6760564b3f33271b0e04111d2a36424e59636a6c6c6c6c6c6c6c6c6c5e564c41362a1d11050e1a27333f4a555f676a6c6c6c6c6c6c6c64615a5044392d201408000000000000000000000000000006131f2c3946525f6c7985929f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9fa39f9f9e9d9c9b99979992908c89847f7b746e69605d554f443f382f271e150c0200000000000000000000000000000000000000000000000000000000000006111c2a36424d5763707d8a96a1acaaa8aab0a79b8e8174685d5245392c20130400000000000000000000000000000000000000000000000000000000020c18212c363f49515b636d727d848e939a9fa6acaca49f9d999992918f8e8d8d8d8e8f909298979a9ea1a9abaca7a09d938e847c6f6a60584e443a2f261c0e05000000000005111d29343f48525b606d78818f959f98928b827a706b676d747e8690959d9891847b6e675d544a3f332a1f1409000000000000000004101d2935404b556673808d99a9b3ab9e9184786c6053463d2f261c1106000000000000000000000000000000000008131e28343f4a54606d7a86929facb1a7988b7e7265544a3f33281c0f03000000000000000000000000000000000000010f1a26313c4653606d7985929eaca7998c7f7366717d8a98a2aca095897c6f63564c4135291d1104000000000000000000000000000000000000000b17232e38424a505354565960676d7a85919eaba59c8f8276695e53463a2d211407000000000000000000000000000000000000000000020e1a26313c4653606c78839097a1a8a4a3a4aaa29f98928d86807a74717072767f8c94998a7d7063574a3d3024170a0000000000000000000000000000000000000000000000000000000000000000000000000000030506080b0e1011121313131211100e0b080605030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030506080b0e1011121313131211100e0b0806050300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020507080b0e101112131211100e0b0807050200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001040613131313131313130d0c0a070200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1723303c4955616c71797979797979797772675c4f43372a1d1106121f2c3845525e6a75797979797979797976685e5246392d201307101d2a36434f5b67717779797979797979706c6155493c3023160a000000000000000000000000000006131f2c3946525f6c798592939393939393939393939393939393939398929291918f8e8d8b8886837f7c78736e69615f57514c433e332d261d150c0300000000000000000000000000000000000000000000000000000000000000000e1a25313b4653606c7884919e9f9f9f9f9fa095897c6f63564c4135291d11040000000000000000000000000000000000000000000000000000000000060f1a242d374049515b626b6f7a818790949b9fa3ababa9aba39f9d9c9b9a9a9a9b9b9d9fa2aaa7ababaca49f9c959189817a6e6a60584e463d32281d140a000000000000010c18222d364044505c666d79829095a09f938f857d746f79818a9298a09992867c6f695e554b42382e21180e030000000000000000000c18242f3c4956636f7c8997a1adada196897d7063584e42382d22170f06000000000000000000000000000000081119242f3844505c66727e8b98a3aeaca095877b6e6154483b2d22170b00000000000000000000000000000000000000000a151f2c3845515c6773808d9aa4aa9d9184776a75828e9baaaa9d9084776b6054443a3024190d010000000000000000000000000000000000000006111c2630383f444647494f555e68727f8c99a3ab9f94877b6e6154483b2e2115080000000000000000000000000000000000000000000009151f2b3844505b666f7c8591969c9f9f9e9c98928d86807a736d686463656d76828f998d8073665a4d4033271a0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001070d111320202020202020201a1917130e0700000000000000000000000000000000000000000000000000000000000000000000000000000000000002080c101212131313131313131306040000000000000000000000000000000000000000000000000000000000000000000000000b1724313e4a5764717e8686868686868684776b5e5144382b1e110613202c3946535f6c7987868686868686867a6d6154473a2e211407111e2a3744515d6a7783868686868686867e7064574a3d3124170a000000000000000000000000000006131f2c3946525f6c798686868686868686868686868686868686868686858585848381807e7c7976736f6c65615e57534d45413a3127221b140b0300000000000000000000000000000000000000000000000000000000000000000009141f2b3844505b66737f8c999393939393939084776b6054443a3024190d0100000000000000000000000000000000000000000000000000000000000008121c252e374048515960686d757c83898e92999b9fa2a9a6a8a9a9a7a7a7a7a7a8aaa9a8a6aaa29f9c9a938f89847d746d685f584e463d342b20160b020000000000000006111b2428343f4a545d676d7a839196a19e979188807b838e929fa29f93877d706a5f574d433a30261c0f06000000000000000000000713202d3a4653606d7985919eabb2a89c8f82766a60544a3f3328211810080200000000000000000000000309111a232935414c56606d7884919eaab3a99d908377695e53463a2d1c1106000000000000000000000000000000000000000004101c2834404b55616e7b87939faca095887b6f7985929faca3988b7f7265594f4332281e13080000000000000000000000000000000000000000000a141e262e34383a3b3d434c56606d7a86929faca6978a7e7164574b3e3124180b00000000000000000000000000000000000000000000030f1c28333f4a545f6a6f7c848c909292918f8b86807b746e68605d56565b64707d8a998f8275685c4f4235291c0f0200000000000000000000000000050a0d0f10101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100f0d0a05000000000000000000000000000000000000000000000105090b0b131313131309090703000000000000000003070b0d0e1313131311100e0a0600000306080913131313100f0d09040004090e111213131313130a090704000000000000000000000000000000000003080b0d0e13131313070604000000000000000005090d0f1013131312110f0c07010000000000000000000000000000000000000000000000000000000000000000040c13181d202d2d2d2d2d2d2d2d2626231f19120a01000000000000000000000000000000000000000000000000000000000000000000000000000000060d13181c1e1f202020202020202013100c07010000000000000000000000000000000000000000000000000000000000000000000b1724313e4a5764717d8a93939393939184776b5e5144382b1e110613202c3946535f6c7986929393939393877a6d6154473a2e211407111e2a3744515d6a77849093939393938a7d7064574a3d3124170a000000000000000000000000000005121f2b3844515d6974797979797979797979797979797979797979797979787877767573716f6d666662605b53534d47423c352f281f17110a0200000000000000000000000000000000000000000000000000000000000000000000030f1c28333f4a54616e7a8786868686868686867f7265594f4332281e130800000000000000000000000000000000000000000000000000000000000000000a131c252e363f474f565d606a6f767c81868b8e929797999b9c9e9e9f9f9f9e9e9d9d9b999798928f8b87827d78706b605d564e463c342b22190e05000000000000000000091217232e38424b555d686e7b849197a2a19a938d8890959da59d928b7f726b61584e453b31281e140a000000000000000000000006121f2b3844505c6673808d99a4afaa9f94897c6f665b50443d332a2219140e09060400000100000406090e151a232b353d45525d68717e8b96a0acada1978b7e7165574d42362a1e0a000000000000000000000000000000000000000000000c18232e3946535f6976828f9ca9a7998c7f737d8a98a2ac9f92867a6d6054473d3221160c02000000000000000000000000000000000000000000020c141c23282b2d2e313a45525d687783909daaa6998d8073665a4d4033271a0d00000000000000000000000000000000000000000000000b17222d38424e585f6a6f797f83858684827f7a736e69615e56524c4a54606d7987868683776a5e5144372b1e11040000000000000000000000030a1016191c1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1c1916100a0300000000000000000000000000000000000000060c1115171820202020201615130f0a040000000001080e13171a1a202020201e1d1a16110b0a0f131516202020201c1b1915100a0f151a1d1f2020202020171614100b050000000000000000000000000001080e14171a1b202020201413100c0701000000020a1015191c1c2020201f1e1b18130c05000000000000000000000000000000000000000000000000000000000000040d161d24292c393939393939393933322f2a241c130a00000000000000000000000000000000000000000000000000000000000000000000000000000710181f24282b2c2d2d2d2d2d2d2d2d1f1c18120b0300000000000000000000000000000000000000000000000000000000000000000b1724313e4a5764717d8a979f9f9f9e9184776b5e5144382b1e110613202c3946535f6c7986929f9f9f9f94877a6d6154473a2e211407111e2a3744515d6a7784909d9f9f9f978a7d7064574a3d3124170a000000000000000000000000000003101c2935414d5862696c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6b6a6968666462605c545653504946423b373129241e160d06000000000000000000000000000000000000000000000000000000000000000000000000000b17222d3846525e686e797979797979797979726d6256473d3220160c020000000000000000000000000000000000000000000000000000000000000000010a131c242d353d444c525860626a6f757a7e8285888a8d8e909192929292929191908e8c8a8985827f7b75706c656059524c433c332b22191007000000000000000000000006111c263039434c565e696f7c859299a3a49f9a959da0a79e948d80746d62594f463c33291f160c02000000000000000000000003101c28343f4a54616e7b87939fabb0a69d9083786c60594f453c342a251f1a1312100c070e070c1013131a1f262b353d47505a606d7a84919ea8b2a99e9285796d6053473b31251a0e0000000000000000000000000000000000000000000007121d2b37424d5764717d8a97a1aa9d908377818e9baaa79b8e8174685d5245392c2013040000000000000000000000000000000000000000000000020a11171c1f20212935414c566774818e9aa7a79a8d8174675a4e4134271b0e010000000000000000000000000000000000000000000006111c262f3c464e585f676d727678797876726d68615e56524c454145515d67757979797771675b4f43362a1d100400000000000000000000040d151c21262929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292926211c150d0400000000000000000000000000000000000911181d2124252d2d2d2d2d23221f1b160f070000020b12191f2326272d2d2d2d2a2927221c15151b1f22232d2d2d2d292825211b141920262a2c2c2d2d2d2d2423201c1610080000000000000000000000020b131a1f2426272d2d2d2c201f1d18120b0300040c141b212528292d2d2d2b2a28231e170f0600000000000000000000000000000000000000000000000000000000010c161f282f35394646464646464646403f3b352e261c120700000000000000000000000000000000000000000000000000000000000000000000000006101922293035383939393939393939392c29231d150d03000000000000000000000000000000000000000000000000000000000000000b1724313e4a5764717d8a97a4acaa9e9184776b5e5144382b1e110613202c3946535f6c7986929facaca094877a6d6154473a2e211407111e2a3744515d6a7784909daaaca3978a7d7064574a3d3124170a0000000000000000000000000000000d1925303b4650585d5f606060606060606060606060606060606060605f5f5e5e5c5b5a585553514b4946443f3836312b261f19130c04000000000000000000000000000000000000000000000000000000000000000000000000000006111c2a36414d565e616c6c6c6c6c6c6c6c6c65625b5146342b210e0400000000000000000000000000000000000000000000000000000000000000000000010a121b232b323a41454e54586062686d7175797b7e80818384858586858584848381807e7c7975726e6963605b534f45413a312a21191007000000000000000000000000000a141e27313a444d575f6a707d879299a49f9f9f9fa9a0958f82786d605b51473e342a21170d04000000000000000000000000000b17232e3846535e6975818e99a3aeab9f958b7f726b60574e463e36302a25201f1c181b1a1b181c1f20262b31373f474f59626c74818e97a1adada1978d8073675c514538291f140900000000000000000000000000000000000000000000000e1a26313c4653606d7984919eaba095887b85929faba095897c6f63564c4135291d110400000000000000000000000000000000000000000000000000060b10121319242f404d5a6673808d99a6a79b8e8174685b4e4135281b0e0200000000000000000000000000000000000000000000000a141d2a343c464e555d6065696c6c6b6965615e56524d46413b35414b555d6b6c6c6c6a675f564b3f33271b0e02000000000000000000030d161f262d3235363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363635322d261f160d0300000000000000000000000000000009121b22292e31323939393939302f2c2721191007010b141d242b303334393939393736332e271f20272b2e2f393939393635312c261e242b3136383939393939302f2c28211a1108000000000000000000010b141d242b303334393939392d2c29241d150d030c161e262d3235363939393837342f2921180f0000000000000000000000000000000000000000000000000000000007131d28313a404553535353535353534d4b4740382e24190e0200000000000000000000000000000000000000000000000000000000000000000000020d18222b343b414445464646464646464638342f271f150b010000000000000000000000000000000000000000000000000000000000000b1724313e4a5764717d8a97a4b0aa9e9184776b5e5144382b1e110613202c3946535f6c7986929facada094877a6d6154473a2e211407111e2a3744515d6a7784909daab0a3978a7d7064574a3d3124170a00000000000000000000000000000008141f2a343e464d51525353535353535353535353535353535353535352525251504e4d4b494645403c3937332d2a251f1a150d0801000000000000000000000000000000000000000000000000000000000000000000000000000000000e1925303b444d52545f6060606060606060585651493f3422190f00000000000000000000000000000000000000000000000000000000000000000000000000091119202830353d43474e54565e6164656c6e717375767778797979787877767573716f6d6665615f57535049413d352f281f180f070000000000000000000000000000020c151f28323b454e58606b717e8793939393939393969083796d665c50493f352c22190f05000000000000000000000000000006111c2a36424d57616e7b86929fa8b1a79f92877d6f6a5f585046413b36312d2c282327272723282c2d31373c42475159606b717e8b939da9b1a79e92857a6d61554b4034291c1004000000000000000000000000000000000000000000000009141f2c3844505c6673808c99a4a79c8f828f97a2aa9d9084776b6054443a3024190d010000000000000000000000000000000000000000000000000000000306081926323f4c5965727f8c98a5a79b8e8174685b4e4135281b0e020000000000000000000000000000000000000000000000020b18222a343c434b5154595d5f5f5e5c5854524c46423b36302f3a434b515e6060605e5b564d44392e22170b000000000000000000000a151f2831383e424343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343423e3831281f150a000000000000000000000000000006111b242d343a3d3e46464646463c3b38322b23190f08121d262f363c3f414646464644423f3931292b32373b3c4646464643413d3830282d353d424546464646463d3c38332c231a1005000000000000000008131d262f363c4041464646463a39352f271f150b141e2830383e41434646464544403a332a210f050000000000000000000000000000000000000000000000000000010d18242f3a434b515f606060606060605957524a40352a1f13070000000000000000000000000000000000000000000000000000000000000000000008131f29343d464c5152535353535353535345403931271d12070000000000000000000000000000000000000000000000000000000000000b1724313e4a5764717d8a97a4acaa9e9184776b5e5144382b1e110613202c3946535f6c7986929facaca094877a6d6154473a2e211407111e2a3744515d6a7784909daaaca3978a7d7064574a3d3124170a000000000000000000000000000000020d18222c343b41444646464646464646464646464646464646464646464545444342403e3c3a38342e2d2b27221b1a140e090300000000000000000000000000000000000000000000000000000000000000000000000000000000000008141f29323b4146475353535353535353534c4a463f372d2310070000000000000000000000000000000000000000000000000000000000000000000000000000070e161e242932373d43484c5254535b6062646668696b6b6c6c6c6b6b6a6a68666462605c5455534d46443f382f29241e160d0600000000000000000000000000000000030d162029333c464f59616c727f8686868686868686847b6e675d544a3f372d231a1007000000000000000000000000000000000e1a25313b46535f6973808d96a0abaea39991857c6f6a615a524d46423c3a38342e3434342e34383a3c42474d535b626b707d86929fa5afaa9f958b7e71685e5243392f23180c00000000000000000000000000000000000000000000000003101c28343f4a54616e7b87939fac9e948f949ea9a3988b7f7265594f4332281e13080000000000000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b98a5a79b8e8174685b4e4135281b0e02000000000000000000000000000000000000000000000000061018222a313a4145474c50525352504c4746413a36302a2528313a414547535353514f4b443b32281d110600000000000000000005101c26313a42494e50505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050504e49423a31261c1005000000000000000000000000010c18222d363f454a4b53535353534948433d352b21160e19242f3840474c4d53535353514f4a433b31343d434749535353534f4e49423a30353f474e5253535353534a48443e352c21160b00000000000000030e1a242f3841474c4e535353534745403931271d121b26303a42494e4f53535352504c453c3321170d030000000000000000000000000000000000000000000000000004111d2935404b555d6c6c6c6c6c6c6c6c66635c52473b2f23170a000000000000000000000000000000000000000000000000000000000000000000000c1824303b464f575d5f606060606060605f514b43392f23180c0000000000000000000000000000000000000000000000000000000000000b1724313e4a5764717d8a979f9f9f9e9184776b5e5144382b1e110613202c3946535f6c7986929f9f9f9f94877a6d6154473a2e211407111e2a3744515d6a7784909d9f9f9f978a7d7064574a3d3124170a0000000000000000000000000000000006101a222a303538393939393939393939393939393939393939393939393837363533312f2d2c2823201f1b17110e09030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020d1720293036393b4646464646464646463f3e3a342d251b1100000000000000000000000000000000000000000000000000000000000000000000000000000000040c131920272b32383a41464749505355575a5b5d5e5f5f5f5f5f5e5e5d5b59575653514a4846423b37332d261d19130c04000000000000000000000000000000000000040e17212a343d47505a626d727979797979797979786e695e554b42382e251b1108000000000000000000000000000000000009141f2a36424d57606d79849199a3afaba19791857c716c615e56534d494644404141414141404546494e53575f616d727d869298a3aeaba2989083776c60564c4131271d1207000000000000000000000000000000000000000000000000000c17232e3846535e6975828f9ca8a69e9c9ea6ac9f92867a6d6054473d3221160c020000000000000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b98a5a79b8e8174685b4e4135281b0e02000000000000000000000000000000000000000000000000000610181f282f35393a3f43454645433f3a3936302a251f191f282f35393a46464644433f39322920160b000000000000000000000a16212d38424c545a5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5a544c42382d21160a00000000000000000000000005111d29343f48505658606060606056544f473d32271b131f2b36404a52585a606060605d5b554d43393d464e5456606060605c5a544c42333d4751595e5f6060606057554f473e33281c100400000000000008141f2b36414a52585a6060605f5e514b43392f2418212d38424c545a5c6060605e5c574f4533291f1409000000000000000000000000000000000000000000000000000613202c3945515d677679797979797979736e63574b3f3226190c00000000000000000000000000000000000000000000000000000000000000000003101c2835414c5761696c6c6c6c6c6c6c6c6c5c554b4034291c100400000000000000000000000000000000000000000000000000000000000b1724313e4a5764717d8a93939393939184776b5e5144382b1e110613202c3946535f6c7986929393939393877a6d6154473a2e211407111e2a3744515d6a77849093939393938a7d7064574a3d3124170a00000000000000000000000000000000000810181f25292b2c2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2c2c2b2b2928272522201f1c1813120f0b06000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050e171f252a2d2e39393939393939393932312e29231b1309000000000000000000000000000000000000000000000000000000000000000000000000000000000002080d151b21272c3035393a3f4446484b4d4e505152525352525151504e4d4b494644403b3a36312b27221b140b08010000000000000000000000000000000000000000050f18222b353e48515b62656c6c6c6c6c6c6c6c6b615e574d433a30261c1309000000000000000000000000000000000000030e1a26313b45515d676f7c87929fa4aea9a19791867e756e68615e575653514a4e4e4d4e4e4b515356575f62696e767f879298a2aaafa39992857c6e655b50443a301f150b010000000000000000000000000000000000000000000000000006111c2a36424d5763707d8a96a1acaaa8aab0a79b8e8174685d5245392c201304000000000000000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b98a5a79b8e8174685b4e4135281b0e020000000000000000000000000000000000000000000000000000060d161d24292c2d323639393836322e2d2a251e19140d161d24292c2d3939393736332e2820170e04000000000000000000000d1926323e49545e666969696969696969696969696969696969696969696969696969696969696969696969696969696969696969696969696969696969696969696969696969696969696969696969696969696969696969696969696969665e54493e3226190d0000000000000000000000000915212e3a45505a62656c6c6c6c6c6360594f43382c1f1723303c47525c64676c6c6c6c6a675f554a3f434e5860626c6c6c6c69655e54453b424e59636a6c6c6c6c6c6361594f44382c2014070000000000000b1724303c47525c64676c6c6c6c6a5d554b4035291d25323e49545e66696c6c6c6b686157453b31251a0e020000000000000000000000000000000000000000000000000714202d3a4753606d7986868686868686807366594d4033261a0d00000000000000000000000000000000000000000000000000000000000000000005121e2b3844515d6973787979797979797976675c5145382c1f130600000000000000000000000000000000000000000000000000000000000b1724313e4a5764717e8686868686868684776b5e5144382b1e110613202c3946535f6c7987868686868686867a6d6154473a2e211407111e2a3744515d6a7783868686868686867e7064574a3d3124170a000000000000000000000000000000000000060d14191c1f1f202020202020202020202020202020202020201f1f1f1e1d1b1a18161313100c070503000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050d14191e20212c2d2d2d2d2d2d2d2d2524221e1811090100000000000000000000000000000000000000000000000000000000000000000000000000000000000000040a0f161b1e25292d2d3337393b3e40424344454646464545444342403e3c3a38342e2d2a261f1b17110a020000000000000000000000000000000000000000000000061019232c363f4951565860606060606060605e54524d453b31281e140a010000000000000000000000000000000000000009141f2935404b55606a717e8b929ca4afa9a198928a817b746e696562605c545b5a5a5a5b545c6063666a6e747b828b9299a2aaaca49f92877d706a5f53493f32281e0d030000000000000000000000000000000000000000000000000003090e1a25313b4653606c7884919e9f9f9f9f9fa095897c6f63564c4135291d1109030000000000000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b98a5a79b8e8174685b4e4135281b0e02000000000000000000000000000000000000000000000000000000040c13181d2021262a2c2c2b292521201d19130e09040c13181d20212d2d2d2b2a27221d160e0500000000000000000000000f1c2935424e5a6670767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767670665a4e4235291c0f0000000000000000000000000b1724313d4a56626c7179797979796f6b6054483b2f221a26333f4c58646e74797979797771675b4f424754606a6f79797979767065574d4245525e6a757979797979706b6155483c2f2316090000000000000d1a2633404c58646e747979797975675d5145392c1f2835414e5a667076797979787368574d42362a1e12050000000000000000000000000000000000000000000000000714202d3a4753606d7a8693939393938c807366594d4033261a0d00000000000000000000000000000000000000000000000000000000000000000006121f2c3945525f6c788586868686868686796d6053473a2d20140700000000000000000000000000000000000000000000000000000000000a1723303c4955616c71797979797979797772675c4f43372a1d1106121f2c3845525e6a75797979797979797976685e5246392d201307101d2a36434f5b67717779797979797979706c6155493c3023160a0000000000000000000000000000000000000002080d1012131313131313131313131313131313131313131313121211100f0d0b09070604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080e111414202020202020202020191816120d060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040a0f13191d2022272b2d2f313335363838393939383837373533312f2d2c2823211e1a140f0b06000000000000000000000000000000000000000000000000000007111a242d373f464a4c5353535353535353524846423b33291f160c020000000000000000000000000000000000000000030c18242f39434e58626d73808d929fa4acaaa29f938e86807b76726f6d6669686767676869666d6f72777b81868f949fa3ababa39a938c7f726b61584e41382d20160c00000000000000000000000000000000000000000000000000050d141a1e212b3844505b66737f8c999393939393939084776b6054443a30241e1a140d0500000000000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b98a5a79b8e8174685b4e4135281b0e020000000000000000000000000000000000000000000000000000000001070d111314191d1f201f1d191413110d0802000001070d1113142020201e1d1b17110b04000000000000000000000000101d293643505c6976828383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838276695c504336291d100000000000000000000000000b1825323e4b5865717e86868686867d6f6356493c30231a2734414d5a6774808686868683776a5d51404b55626f7c868686868276695e534646535f6c7987868686867d7063574a3d3024170a0000000000010e1b2734414e5a67748086868687796d6053473a2d202936434f5c6976828686868578695e53463a2d2114070000000000000000000000000000000000000000000000000714202d3a4753606d7a86939f9f9f998c807366594d4033261a0d00000000000000000000000000000000000000000000000000000000000000000006121f2c3945525f6c7885929393939393867a6d6053473a2d20140700000000000000000000000000000000000000000000000000000000000814212d3945505a61646c6c6c6c6c6c6c6b6760564b3f33271b0e04111d2a36424e59636a6c6c6c6c6c6c6c6c6c5e564c41362a1d11050e1a27333f4a555f676a6c6c6c6c6c6c6c64615a5044392d201408000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020507081313131313131313130c0b090601000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080d1113171b1f20222427282a2b2c2c2c2c2c2b2b2a28262423201f1c1814120e0903000000000000000000000000000000000000000000000000000000000008121b252d343a3e3f4646464646464646453b3a36302921170d040000000000000000000000000000000000000000000007121d27313d46505a636e73808c939aa1a9aea59e98928d87837f7c79777674747474747677797c7f83888e92999fa6afa8a09992887f726d62594f463c2f261b0e04000000000000000000000000000000000000000000000000050f171f252a2d2e333f4a54616e7a8786868686868686867f7265594f43322e2d2a251f170f05000000000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b98a5a79b8e8174685b4e4135281b0e02000000000000000000000000000000000000000000000000000000000000010406070c10121312100c070705010000000000000104060713131311100e0b06000000000000000000000000000013202d394653606c79868f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f86796c605346392d20130000000000000000000000000b1825323e4b5865717e8b939393897c6f6356493c30231a2734414d5a6774808d93939084776a5d5145515d6774818e939393877b6e61544a3f535f6c79869293938a7d7063574a3d3024170a0000000000000b1825313e4b5864717e8b9399897c6f6356493c30232633404d596673808c9397877b6e6154483b2e2115070000000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0aca6998c807366594d4033261a0d00000000000000000000000000000000000000000000000000000000000000000006121f2c3945525f6c7885929f9f9f9f93867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000004111c28333e48505557606060606060605e5c564e44392e23170b010e1a26313d4751595e5f606060606060605f524c443a3025190d010b17222e39444d555b5d60606060606060575550483e33281c1004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000105060b0f121315181a1b1d1e1f1f201f1f1e1e1d1b1a18161312100c070502000000000000000000000000000000000000000000000000000000000000000009131b23292e31323939393939393939382e2d2a251f170f050000000000000000000000000000000000000000000000010b151f2b343f48525c646e737f8892979ea5acaaa29f9a93908c898684828181808181828486898c90959b9fa3ababa39f9691877e726d635b51473e332a1d140a000000000000000000000000000000000000000000000000030d17212931363a3b464646525e686e797979797979797979726d62564746463b3a36312921170d030000000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b98a5a79b8e8174685b4e4135281b0e02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013202d394653606c7986939c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9386796c605346392d20130000000000000000000000000b1825323e4b5865717e8b989f96897c6f6356493c30231a2734414d5a6774808d9a9d9084776a5d514753606d7a85929fa4998c8073665c5044535f6c7986929f968a7d7063574a3d3024170a0000000000000915222f3c4855626f7b8898988c7f7265594c3f302424303d4a5763707d8a96978a7e7164574a3e2e23180c0000000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d00000000000000000000000000000000000000000000000000000000000000000006121f2c3945525f6c7885929fabaca093867a6d6053473a2d2014070000000000000000000000000000000000000000000000000000000000000c17222c363e45494a53535353535353514f4b443c32281d1206000915202b353f474e5253535353535353535346413a32281e13080006111d27323b444a4f51535353535353534a49443e362c22170b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003060809131313131312070705010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000105090b0b1313131313130d0d0b07070b0d0d1313131313130b0b09050100000000000000000000000000000000000000000000000000000000000000000000030506080b0d0f101112131313121211100f0d0b09070604000000000000000000000000000000000000000000000000000000000000000000000000010911181e2224252d2d2d2d2d2d2d2d2b21201e1a140d0500000000000000000000000000000000000000000000000000030d19222d36404a525c646d727d858f939da0a7acaca49f9c989892918f8e8d8d8d8e8f919299999da0a7acaca49f99928d847d716c635b51493f352c21180b0200000000000000000000000000000000000000000000000009141f29333b4246485353534d565e616c6c6c6c6c6c6c6c6c65625b515353534846423b33291f14090000000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b98a5a79b8e8174685b4e4135281b0e02000000000000000000000000000000000000000000000000000000000000000003070b0d0e13131313131312100d0a06050300000000000000000000000000000000000000000000000000000013202d394653606c7986939f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9386796c605346392d20130000000000000000000000000b1825323e4b5865717e8b98a296897c6f6356493c30231a2734414d5a6774808d9a9d9084776a5d514e5764717e8b98a2ab9e9184796d605346535f6c7986929f968a7d7063574a3d3024170a0000000000000613202d394653606c7985929b8e817568564c413529212e3a4754616d7a87969a8d807467544b4034281c100400000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d00000000000000000000000000000000000000000000000000000000000000000006121f2c3945525f6c7885929fabada093867a6d6053473a2d20140700000000000000000000000000000000000000000000000000000000000005101a242c33393c3e4646464646464644433f39322a20160c0100040f19242d353d42454646464646464646463936302820160c0200000b16202932393f4344464646464646463d3c39332c231a100500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040a0f12151520202020201f1413110d0802000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060c111517182020202020201a1917131317191a202020202020181715110c060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060d1216181920202020202020201f1514120e090200000000000000000000000000000000000000000000000000000007101b242e38404a525b636b707a828990959c9fa4abaca9aaa39f9d9c9b9a9a9a9b9c9d9fa3abaaababa39f9a938f8780796f6b615a51493f372d231a0f06000000000000000000000000000000000000000000000000020e1a25313b454d535f6060606060605d5f60606060606060605c6060606060605f534d453b31251a0e0200000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b98a5a79b8e8174685b4e4135281b0e0200000000000000000000000000000000000000000000000000000000000001080e13171a1a20202020201f1e1d1a1613120f0b060000000000000000000000000000000000000000000000000013202d394653606c798693939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939386796c605346392d20130000000000000000000000000b1825323e4b5865717e8b98a296897c6f6356493c30231a2734414d5a6774808d9a9d9084776a5d51535f6a7683909caaa9a1978a7d7064574d535f6c7986929f968a7d7063574a3d3024170a00000000000006121f2b3844505b6676838f9c918477685d5246392d202d3946525e687884919d908376665c5145382c1f130600000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d00000000000000000000000000000000000000000000000000000000000000000006121f2c3945525f6c7885929fabada093867a6d6053473a2d2014070000000000000000000000000000000000000000000000000000000000000008121a22282d3031393939393939393837332e2820180e0400000008121b242b31363839393939393939392e2d2a251e160e05000000040e1720272e3336373939393939393931302d28221a110800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060e151b1f21222c2d2d2d2d2c21201d19130c04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000911181d2124252d2d2d2d2d2d2726231f1f2326272d2d2d2d2d2d2524211d1811090000000000000000000000000000000000000000000000020608080b0e1011121313131312100f0d0a0706040100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000106090b0c1313131313131313120807050200000000000000000000000000000000000000000000000000000000000009121c262e384049515961686e757d83898f93999c9fa2aaa7a8aaa9a7a7a7a7a7a9a9a8a6a9a19e9b99928e87827c736d67605950483f372d251b11080000000000000000000000000000000000000000000000000005121e2a36424d575e6c6c6c6c6c6c6c6a665f55535353545e66696c6c6c6c6c6c6c5e574d42362a1e120500000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b98a5a79b8e8174685b4e4135281b0e020000000000000000000000000000000000000000000000000000000000020b12191f2326272d2d2d2d2d2c2b2a2723201f1b17110a02000000000000000000000000000000000000000000000013202d394653606c798686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686796c605346392d20130000000000000000000000000b1825323e4b5865717e8b98a296897c6f6356493c30231a2734414d5a6774808d9a9d9084776a5d4a54626e7b88949f9f9c9f9c8f8276695e53535f6c7986929f968a7d7063574a3d3024170a000000000000030f1c28333f4a546773808d9a96877a6d6154473a2e212a36414c566875818e9b9286796d6053463a2d20130700000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d00000000000000000000000000000000000000000000000000000000000000000006121f2c3945525f6c7885929fabada093867a6d6053473a2d20140700000000000000000000000000000000000000000000000000000000000000000810171c2123242d2d2d2d2d2d2d2b2a27231d160e06000000000009121920262a2c2c2d2d2d2d2d2d2d21201d19130c050000000000050e161d22272a2a2d2d2d2d2d2d2d2423201c1710080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006101820262b2e2f3939393939382e2d29251e160e04000000000000000000000000000000000000000000000000000000000000000000000000000000000009121b22292e313239393939393934332f2b2b2f333439393939393932312e29221b1209000000000000000000000000000000000000000306090f121415181a1c1e1f1f20201f1e1d1c19171413100d0704000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a141c262e373f474f565e616b70777d82878b8f9298989a9b9d9e9e9f9f9f9e9d9d9b999797928e8a86817b756f6a605d554f473e362d251c130900000000000000000000000000000000000000000000000000000714212d3a46535e69767979797979797771665b4f464e5a66707679797979797976695e53463a2d21140700000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b98a5a79b8e8174685b4e4135281b0e0200000000000000000000000000000000000000000000000000000000010b141d242b303334393939393939383734302d2b27221b140b080000000000000000000000000000000000000000000013202d3946535f6c767979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979766c5f5346392d20130000000000000000000000000b1825323e4b5865717e8b98a296897c6f6356493c30231a2734414d5a6774808d9a9d9084776a5d515c6673808d9a9f948f949f93877b6e61544a5f6c7986929f968a7d7063574a3d3024170a000000000000000b17222d3e4a5764717d8a9796897d7063564a3d302325303f4c5965727f8c9898897c6f6256493c2f23160800000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d00000000000000000000000000000000000000000000000000000000000000000006121f2c3945525f6c7885929fabada093867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000000050c11141717202020202020201e1d1b17120c0400000000000000080f151a1d1f20202020202020201413110d080200000000000000040b11171a1d1e20202020202020171614100b0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040e18222a31373a3c4646464646453a3935302820160c0200000000000000000000000000000000000000000000000000000000000000000000000000000006111b242d343a3d3e464646464646403f3b36363b3f404646464646463e3d3a342d241b110600000000000000000000000000000000040a0f13151a1f21222527292a2c2c2d2c2c2b2a28262320201d1813100c0700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000406070a0d0f11121313131212100e0c0906060300000000000000000000000000000000000000000000000000000000000000020a141c252e353d444c525960636b70757b7e8285888b8d8f9091929292929191908e8c8a8885817d7a746e6a626058514b433d352c241c130a0100000000000000000000000000000000000000000000000000000815212e3b4854616e7b86868686868683776a5d50444f5c6976828686868686867b6e6154483b2e21150800000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b98a5a79b8e8174685b4e4135281b0e020000000000000000000000000000000000000000000000000000000008121d262f363c3f414646464646464543403d3937332d261d1a110a010000000000000000000000000000000000000000121e2b37434f5a646c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c645a4f43372b1e120000000000000000000000000b1825323e4b5865717e8b98a296897c6f6356493c30231a2734414d5a6774808d9a9d9084776a5d53606d7985929e978f828f99998c8073665c505f6c7986929f968a7d7063574a3d3024170a000000000000000615212e3b4854616e7b8797998c7f7366594c40302523303c4956636f7c8999988b7f7265584c3f3025190d01060606000000000000000000000000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d00000000000000000000000000000000000000000000000000000000000000000006121f2c3945525f6c7885929fabada093867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000000000004080a0b1313131313131311110e0b060100000000000000000004090e11121313131313131313070705010000000000000000000000060b0e1011131313131313130a0a08040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a15202a343c4347485353535353524746413a32281e13080000000000000000000000000000000000000000000000000000000000000000000000000000010c18222d363f454a4b5353535353534d4c474040474c4d5353535353534b4a453f362d22180c0100000000000000000000000000040a0f151b1f21262b2e2f32343637383939393938373533302d2c29241f1c18120c0700000000000000000000000000000000000000000000000000000000000000000000000000000001070c10131416191c1d1f1f20201f1e1d1b191613120f0b06000000000000000000000000000000000000000000000000000000000000020a131c232c323b41464f54596063686e7276797c7e808283848585868585848382807d7b7974716d68625f58544e454039312b231a120a010000000000000000000000000000000000000000000000000000000815212e3b4854616e7b87939393939083776a5d50444f5c6976828f93939393877b6e6154483b2e21150800000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b98a5a79b8e8174685b4e4135281b0709080603000000000000000000000000000000000000000000000000030e19242f3840474c4d53535353535251504d4946443f382f2b231c130a01000000000000000000000000000000000000000f1b27333e49525a5f60606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060605f5a52493e33271b0f0000000000000000000000000b1825323e4b5865717e8b98a296897c6f6356493c30231a2734414d5a6774808d9a9d9084776a5d5764707d8a979e92857a86929e9184796d60535f6c7986929f968a7d7063574a3d3024170a000000000000030714212d3a46535e697885929b8f827568574d42362a202d3a4753606d7a86929b8e817568564c41362a1d11131313130b0b09050100000000000000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d00000000000000000000000000000000000000000000000000000000000000000006121f2c3945525f6c7885929fabada093867a6d6053473a2d2014070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1b26313c464e53555f606060605f54524c443a3025190c030000000000000000000000000000000000000000000000000000000000000000000000000005111d29343f485056586060606060605a58524a4a52585a606060606060585650483f34291d1105000000000000000000000001070d161b20262b2e31373a3b3e4143444546464646454342403d3a39352f2c28231d18120b030000000000000000000000000000000000000000000000000000000000000000000000040a0f12181c1f202326282a2b2c2c2c2c2b2a282523201f1c17110f0a0300000000000000000000000000000000000000000000000000000000010a111a202930363d44484f54565e6165666d6f7174757778787979787877767573716f6d6664605d56534e47433c352f271f19110800000000000000000000000000000000000000000000000000000000000815212e3b4854616e7b87949f9f9d9083776a5d50444f5c6976828f9c9f9f94877b6e6154483b2e21150800000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b98a5a89b8e8275685b4f422f2418191615130f0a040000000000000000000000000000000000000000000007131f2b36404a52585a60606060605f5e5d5a56535049413d352e251c130a000000000000000000000000000000000000000a16212c3740494f535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353534f4940372c21160a0000000000000000000000000b1825323e4b5865717e8b98a296897c6f6356493c30231a2734414d5a6774808d9a9d9084776a5d5e6975828f9c9a8d8075828f9b978a7d7064575f6c7986929f968a7d7063574a3d3024170a0000000001090f14181e2a36424d576975828f9c918578695e52463a2d202c3845515d677783909d918477685e5246392d202020202020181715110c06000000000000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d00000000000000000000000000000000000000000000000000000000000000000006121f2c3945525f6c7885929fabada093867a6d6053473a2d2014070000000000000000000000000000000000000000000000000000000000000000000000000000000000060b0e1111131313131313131308070502000000000000000000000105090b0c13131313131313130f0e0c08040000000000000000000000000000000000000000000000000004090c0e0f131313131313130c0b09060100000000000000000000000000000004090c0e0f1313131313131310060503000000000000000006121f2b37434e585f626c6c6c6c6c6b615e564c4135291e150b000000000000000000000000000000000000000000000000000000000000000000000000000915212e3a45505a62656c6c6c6c6c6c67645c52525c64676c6c6c6c6c6c65625a50453a2e21150900000000000000000000040c131820272b32373b3c4347484b4d4f51525253535251504f4c4a4745403a38342e28231c150c070000000000000000000000000000000000000000000000000000000000000000040a0f161b1d23292c2d303335373839393939383635322f2d2b28221c1b150e090300000000000000000000000000000000000000000000000000000000080e171e252a32383d44484d5254545c60626567686a6b6b6c6c6c6b6a6a68666462605c5454524c47433c373229241d150d070000000000000000000000000000000000000000000000000000000000000815212e3b4854616e7b8794a1aa9d9083776a5d50444f5c6976828f9ca9a194877b6e6154483b2e21150800000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b98a5a99c8f827669554b403529252522221f1b150e070000000000000000000000000000000000000000000b1723303c47525c64676c6c6c6c6c6c6b6a6763605b534f473f372e251c100700000000000000000000000000000000000005101b252e373e4346464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646433e372e251b10050000000000000000000000000b1825323e4b5865717e8b98a296897c6f6356493c30231a2734414d5a6774808d9a9d9084776a53616e7b87939f95887c707d8a979c8f8276695e5f6c7986929f968a7d7063574a3d3024170a000000030b131a2024272531404c5966737f8c9997877b6e6154483b2e2d2935404b556774818d9a96877a6d6154473a2e2d2d2d2d2d2d2524211d1811090000000000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d00000000000000000000000000000000000000000000000000000000000000000006121f2c3945525f6c7885929fabada093867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000000000000000000040b12171b1d1e20202020202020201514120e090300000000000000060c1115171820202020202020201b1b18140f090100000000000000000000000000000000000000000002091015191b1c20202020202020191816120d0700000000000000000000000002091015191b1c202020202020201c13120f0b060000000000000815212e3a47535f6a6f7979797979786d685e52463d30271c12070000000000000000000000000000000000000000000000000000000000000000000000000b1724313d4a56626c71797979797979736e645858646e73797979797979716c62564a3d3124170b000000000000000000060d161d242932383c4347494e5355585a5c5d5f5f605f5f5e5d5b595653514b46454039342e271e191009010000000000000000000000000000000000000000000000000000000000060b151b21272c2f34383a3d40424445464646454543413f3c3938332d2b26201a150b0600000000000000000000000000000000000000000000000000000000050d141921272c33383b4146474a505355585a5c5d5e5f5f5f5f5e5e5d5b59575553504a4745413a37312b272018120b03000000000000000000000000000000000000000000000000000000000000000815212e3b4854616e7b8794a1a99d9083776a5d50444f5c6976828f9ca9a194877b6e6154483b2e21150800000000000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4aa9e918477675d5145392f32322f2e2b262019100700000000000000000000000000000000000000000d1a26333f4c58646e74797979797979787673706c656059514940372e22190f0400000000000000000000000000000000000009131c252c33373939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393937332c251c1309000000000000000000000000000b1825323e4b5865717e8b98a296897c6f6356493c30231a2734414d5a6774808d9a9d9084776a5b65737f8c999d9083766d7985919e93877b6e615f6c7986929f968a7d7063574a3d3024170a0000010b151d252b303435393d4a5763707d8a96978a7d7064574a3d2d39392f3e4b5864717e8b97968a7d7063574a3d2d39393939393932312e29221b120900000000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d00000000000000000000000000000000000000000000000000000000000000000006121f2c3945525f6c7885929fabada093867a6d6053473a2d2014070000000000000000000000000000000000000000000000000000000000000000000000000000060e161d23272a2b2d2d2d2d2d2d2d2d22211e1a140e0600000000000911181d2224252d2d2d2d2d2d2d2d282724201a130b0300000000000000000000000000000000000000030c141b212528292d2d2d2d2d2d2d2625221e18110901000000000000000000030c141b212528292d2d2d2d2d2d2d29201f1b17110a02000000000915222f3c4855626f7c8786868686857a6d61594f42392e23180c0300000000000000000000000000000000000000000000000000000000000000000000000b1825323e4b5865717e8686868686868073675a5a6773808686868686867e7165584b3e3225180b0000000000000000060f181f282f353d43474e5355585f626567696a6b6c6c6c6c6b6a686663605d5553514b444039302b221b130b020000000000000000000000000000000000000000000000000000020a111720262b323839404547494c4f50525253535251504e4c4946443f3837312b262017110a0200000000000000000000000000000000000000000000000000000002080e161c21272c3036393b3f4446494b4d4f5051525253525251504f4d4a4846443f3a39352f2b26201b150c070100000000000000000000000000000000000000000000000000000000000000000815212e3b4854616e7b87949c9c9c9083776a5d50444f5c6976828f9c9c9c94877b6e6154483b2e21150800000000000000000000000000000000000000000000000000000b1724313e4a5764717d8a97acac9f93867a6d605347403f3f3f3c3b37322a22190e04000000000000000000000000000000000000000e1a2734414d5a6774808686868686858483807d78706b635b514940342b20160a000000000000000000000000000000000000010a131b21272b2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2b27211b130a01000000000000000000000000000b1825323e4b5865717e8b98a296897c6f6356493c30231a2734414d5a6774808d9a9d9084776a606c7884919e988b7e716673808d9a998c8073665c6c7986929f968a7d7063574a3d3024170a000009131d272f373c404146464754616d7a8796998d80736653493f46464646464855626e7b8898998c807366544a3f464646464646463e3d3a342d241b1106000000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d00000000000000000000000000000000000000000000000000000000000000000006121f2c3945525f6c7885929fabada093867a6d6053473a2d20140700000000000000000000000000000000000000000000000000000000000000000000000000000e1820282e33363839393939393939392e2d2b261f180f0600000009121b23292e313239393939393939393534312c251d150b000000000000000000000000000000000000020c151e252c3134353939393939393932312e29231b13090000000000000000000c151e262c31343539393939393939362d2b27221b140b020000000815212e3a47535f6a73808d9693978e81746b60544a4034281f140900000000000000000000000000000000000000000000000000000000000000000000000b1825323e4b5865717e8b939393938d8073675a5a6773808d939393938b7e7165584b3e3225180b00000000000000061018212a313a40454e54585f62676a6e71747677787979797978767573706d6764605c54514a423d342d251d140b01000000000000000000000000000000000000000000000000040b141c222832373d43484b515356595b5d5e5f5f5f5f5e5d5b585653504a47433c373127221b140b0300000000000000000000000000000000000000000000000000000000050b10161c1f252a2d2e34383a3c3e414244454546464545444342403e3c3a38342e2c29241e1a150f0a04000000000000000000000000000000000000000000000000000000000000000000000815212e3b4854616e7b878f8f8f8f8f83776a5d50444f5c6976828f8f8f8f8f877b6e6154483b2e21150800000000000000000000000000000000000000000000000000000a1623303d495663707c899aa4afa4998a7e71645b514b4c4c4c4947433c342a20150a000000000000000000000000000000000000000e1a2734414d5a6774808d939393989291908d89837d726d635b51463d32271b0f04000000000000000000000000000000000000010910161b1e202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020201e1b1610090100000000000000000000000000000b1825323e4b5865717e8b98a296897c6f6356493c30231a2734414d5a6774808d9a9d9084776a63707d89969f92857a6d626f7b88959e9184796d606c7986929f968a7d7063574a3d3024170a00030f1a252f3941484d4e535353525e687884919c8f8276655b505353535353535353606c7985929c8f8276665b5053535353535353534b4a453f362d22180c010000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d00000000000000000000000000000000000000000000000000000000000000000006121f2c3945525f6c7885929fabada093867a6d6053473a2d20140700000000000000000000000000000000000000000000000000000000000000000000000000060f202a32393f434446464646464646463b3a37312a21180e030006111b242d343a3d3f464646464646464642403d372f271d0b02000000000000000000000000000000000009141e2730373d4142464646464646463f3e3a352d251b0f060000000000000008121e2730373d414246464646464646433937332d261d140a00000006121f2b37434e58606d7984919e9f93887d6f665c51443b31261a0d04000000000000000000000000000000000000000000000000000000000000000000000b1825323e4b5865717e8b989f9f9a8d8073675a5a6773808d9a9f9f988b7e7165584b3e3225180b000000000000050e18222a333c434b515860626a6f74787b7e80828485858686858483827f7d7a76716d66605c544e463f372e261d130a0000000000000000000000000000000000000000000000040d161d262d333c43474f54555c606366686a6b6c6c6c6c6b69686562605b54534e47423c332d261d150d030000000000000000000000000000000000000000000000000000000000050b1014191e2023282c2d2f3234353738383939393837373533312f2d2b2823201d19130f0a030000000000000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a8283838383828074675a4e414d5a6673808283838383827a6e6154473b2e21140800000000000000000000000000000000000000000000000000000714212d3a4754606d7a86939facab9c9083766d605d5559585855544e463c32261b0f030000000000000000000000000000000000000e1a2734414d5a6774808d9a9f9fa29f9e9d9a9590887f726d63584e43372b20150a0000000000000000000000000000000000000000050a0f1213131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313120f0a05000000000000000000000000000000000b1825323e4b5865717e8b98a296897c6f6356493c30231a2734414d5a6774808d9a9d9084776a6875818e9b9a8e8174675f6a7683909d978a7d70646c7986929f968a7d7063574a3d3024170a000814202b37414b53595b60606060566875828e9b9285796c606060606060606060605b6576838f9c9285796c60606060606060606060585650483f34291d11050000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d00000000000000000000000000000000000000000000000000000000000000000006121f2c3945525f6c7885929fabada093867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000000000000030d1821323c444b4f5153535353535353534846423c332a1f1409010c18232d363f454a4b53535353535353534e4d4841392f1d140a0000000000000000000000000000000004101b25303942494d4f535353535353534c4a463f372d21180b020000000000050e1a24303942494d4f535353535353534f46443f382f261b11060000030f1b26313c45515d67707d8a939e9a9183786d60574d42362a1f160c010000000000000000000000000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b0000000000020b17202a343c454d555d606a6f767c8084888b8d8f90929293929291908e8c8986827e79726d666058514940382e251c1108000000000000000000000000000000000000000000030c161f282f383f444e54596063676d707375777879797978787674726f6c66625f58534d443f382f271f150d0300000000000000000000000000000000000000000000000000000000000002080e1114171c1f20222527292a2b2c2c2c2c2b2b2a28262422201f1c1713110d080100000000000000000000000000000000000000000000000000000000000000000000000000000714202d3946525e686e767676767676746e64584c404b58636e737676767676766e685e5246392d20140700000000000000000000000000000000000000000000000000000713202c3945525d687784919dabab9f948b7f736d6766656565625f584e43372b1f13060000000000000000000000000000000000000e1a2734414d5a6774808d98989a9c9fa3aba7a09a938c7f726a6054473d32271b0f0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a296897c6f6356493c30231a2734414d5a6774808d9a9d9084776a6d7a86929f95897c6f635865727e8b989c8f8276696c7986929f968a7d7063574a3d3024170a000c1824303c48535d64686c6c6c6c6c6c727f8c9897887b6e6c6c6c6c6c6c6c6c6c6c6c6c73808d9998887b6f6c6c6c6c6c6c6c6c6c6c65625a50453a2e2115090000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d00000000000000000000000000000000000000000000000000000000000000000006121f2c3945525f6c7885929fabada093867a6d6053473a2d20140700000000000000000000000000000000000000000000000000000000000000000000000009141f2933444e565c5e606060606060606055534d453c31261a0e05111d29343f4851565860606060606060605b59534b412f261b11060000000000000000000000000000000915212c37424b53595c60606060606060595651493f332a1d140a00000000020d17202c36424b54595c606060606060605c53504941382d22170b0000000a15202935404b55616b75818e98a0958c7f72695f53463e31281e13080000000000000000000000000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b00000000000a141d29333c464e575f676d747c82888d9196989a9c9d9e9f9f9f9f9e9d9b9999928f8a847f786f6a625b524a40372e231a0e0500000000000000000000000000000000000000000b151e283139424a50585f626b6f75797d7f828385858686858483817f7c79746f6a625f575049413931271f150b01000000000000000000000000000000000000000000000000000000000000000205060c10121316181a1c1d1e1f1f201f1f1e1d1c1a17151312100b0604010000000000000000000000000000000000000000000000000000000000000000000000000000000005111e2a36414c565e6169696969696967645c52473c47525c6366696969696969615e564c41362a1e1105000000000000000000000000000000000000000000000000000004111d2935414c566673808d99a3afa69f9388807a75737272726f6a5f54473b2e2215080000000000000000000000000000000000000e1a2734414d5a6774808b8b8c8d9092999ea5aca49f92877c6f62584e43372b1f130600000000000000000000000000000000000000000000000000000000000000000000000000000000060b0e101113131313131313110605030000000000000000000000000000000000000000000000000000000000000000000000000001040707131313131313131308070502000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a296897c6f6356493c30231a2734414d5a6774808d9a9d9084776a727f8b989d9184776b6054606d7a86929f93877b6e6c7986929f968a7d7063574a3d3024170a000e1a2734404d59646f74797979797979797d8996978a7e79797979797979797979797979797e8a97988b7e7979797979797979797979716c62564a3d3124170b0000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d00000000000000000000000000000000000000000000000000000000000000000006121f2c3945525f6c7885929fabada093867a6d6053473a2d2014070000000000000000000000000000000000000000000000000000000000000000000000020e1a26313b455660676b6c6c6c6c6c6c6c6c6c5f574d42372b1e120915222e3a45515b62656c6c6c6c6c6c6c6c68655d5341382d22170b0000000000000000000000000000000c1925313d49535d65686c6c6c6c6c6c6c65625b51453c2f261c110600000008141e29323e48545d65686c6c6c6c6c6c6c69605b53493f33271b0f030000040c18242f39434f59616e7b85929f9f92867b6e615a50433a2f24190c0200000000000000000000000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b0000000006111b262f3b454e585f696e7981878f949a9ea1a8a7a9aaaaaaa9a9aaaba9a8aba39f9c97918c847c726d645c524940362c20170c0200000000000000000000000000000000000007121d273039434b545b606a6f767c8185898c8e90919292929291908e8b8985817c756e69605b534b433931271d12070000000000000000000000000000000000000000000000000000000000000000000000030607090b0e0f1112121313121211100f0d0b090706030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010d1925303b444c52545c5c5c5c5c5c5a58524a4136404a52585a5c5c5c5c5c5c54524c443b3025190d010000000000000000000000000000000000000000000000000000010d1924303b4854616e7b87929fa7afa49a938d8582807f7f7f7c6f6255493c2f221609000000000000000000000000000000000000091623303c4956636f7d7f7f7f8083868f939ea5afa3999083766a6054473b2e2215070000000000000000000000000000000000000000000000000000000000000000000000000000040b11171b1d1e202020202020201e13120f0b0600000000000000000000000000000000000000000000000000000000000000000002080d11131420202020202020201514120e090300000000000000000000000000000000000000000b1825323e4b5865717e8b98a296897c6f6356493c30231a2734414d5a6774808d9a9d9084776a7783909d998c7f726559515d6774818e9a998c8073667986929f968a7d7063574a3d3024170a000e1b2835414e5b68748186868686868686898f999a908a86868686868686868686868686868a909a9b908b86868686868686868686867e7165584b3e3225180b0000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d00000000000000000000000000000000000000000000000000000000000000000006121f2c3945525f6c7885929fabada093867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000000000005121e2a36424d57677277797979797979797976695f53463a2d21140b1724313d4a56626d727979797979797979756f6553493f33271b0f0300000000000000000000000000020e1b2834414d59656f7579797979797979726d62574d42382d22170b0200050e1925303b44505a656f7579797979797979766c655b5044372b1f120500000007121d27313e46525e69727f8b959f988f82756c61554c4135291e140a00000000000000000000000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b000000000b17222d38414d575f6a6f7b848e939a9fa6abacaaaaa39f9e9d9c9c9d9ea1a9a7acaca9a19e9691877f746e645b52483e32291e13080000000000000000000000000000000000040d18232e39434b555d666c737c83898e9298999b9d9e9f9f9f9f9e9c9b9897918d88827b736c655d554b43392f24180e0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008141e29323b4146475050505050504e4c4741382f3840474b4d5050505050504746413b32291e1408000000000000000000000000000000000000000000000000000000000814212d3a46535e6974808d959fa7aca49f98928f8d8c8b8b7f7266594c3f3326190c0000000000000000000000000000000000000915222f3b4854606b6f72727273767b818e939ea9ab9f95897c6f6256493c2e23180c00000000000000000000000000000000000000000000000000000000000000000000000000050e161d22272a2b2d2d2d2d2d2d2d2b201f1b17110a02000000000000000000000000000000000000000000000000000000000000040c13191d20212d2d2d2d2d2d2d2d22211e1a140e06000000000000000000000000000000000000020b1825323e4b5865717e8b98a296897c6f6356493c30231a2734414d5a6774808d9a9d9084776f7c88959f92867a6d61544b55626f7c89959e9184796d7986929f968a7d7063574a3d3024170a000e1b2835414e5b6874818e9393939393939699a1a29a979393939393939393939393939393979aa2a29b98939393939393939393938b7e7165584b3e3225180b0000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d00000000000000000000000000000000000000000000000000000000000000000006121f2c3945525f6c7885929fabada093867a6d6053473a2d20140700000000000000000000000000000000000000000000000000000000000000000000000714212d3a46535f69778486868686868686867b6e6155483b2e2215091825323f4b5865727f86868686868686868175655b5044372b1f120500000000000000000000000000020f1c2935424f5c687582868686868686867f72695f544a3f33281d140a020c17202a36414c56616c75818686868686868682796c605346392d201306000000010b151f2a36424d56606c788390999e948a7e71675d51453c30261c1106000000000000000000000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b000000030f1b27333f49535e696f7c8591969fa4acaca7a09d98989291908f90909197979b9fa2aaada8a099928c80746e635a50443a3025190d03000000000000000000000000000000010c161f2834404b555d676d78808790949b9fa2a9a29e9c9b9a9a9b9d9fa3a9a19e9a948f877f776d675d554b40352920170d02000000000000000000000000000000000000000000000000000000000000000000030607090b0d0f1111121313121211100f0d0a08070502000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020d1720293036393b43434343434341403c362f262e353b3f404343434343433b3936302920170d020000000000000000000000000000000000000000000000000000000005121e2a36424d57606d798390959fa2aaaaa29f9b9998988c7f7266594c3f3326190c00000000000000000000000000000000000007131f2c38434f59606365656567696e78818e97a1ada79a8d807467554b4034281c10040000000000000000000000000000000000000000000000000000000000000000000000000e1720282e33363739393939393939382d2b27221b140b0200000000000000000000000000000000000000000000000000000000040e161e24292c3939393939393939392e2d2b261f180f0600000000000000000000000000010507070f0f1825323e4b5865717e8b98a296897c6f6356493c30231a2734414d5a6774808d9a9d90847774808d9a9b8e8275685e524754606a7783909d978a7d707986929f968a7d7063574a3d3024170a000e1b2835414e5b6874818e9b9f9f9f9f9f9fa0acafa6a49f9f9f9f9f9f9f9f9f9f9f9f9f9f9fa0a3a8a6a49f9f9f9f9f9f9f9f9f988b7e7165584b3e3225180b0000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d00000000000000000000000000000000000000000000000000000000000000000000121f2c3945525f6c7885929fabada093867a6d6053473a2d20140700000000000000000000000000000000000000000000000000000000000000000000000815222e3b4855616e7b88969393939393938b7e7165584b3e31261a121e2a36424d576875818e9393939393939285786c605346392d20130800000000000000000000000000000714212e3a4754616d7a85919393939392867b6e665b50443c2f261c1108131e29323a46525e68717e8a939393939392857a6e655b5044372b1f120500000000030d1925303b44505b666f7c87929f9e91847a6d60584e42382e23170b020000000000000000000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b00000005121f2b3744505b656e7b849197a0a8afa7a09d95908b8885848383838485878a8e92989fa3ababa39f928c80736c61564c41362a1f140900000000000000000000000000000008131e28313a45515c676d79828d92999fa6a39f9a97928f8e8d8e8e9092989b9fa3a69e99928c82796d675d51453f32291e140800000000000000000000000000000000000000000000000000000000000104060b10121315171a1c1d1e1f1f201f1f1e1d1b19171514120e09060300000000000000000000000000000000000000000000000000000000000000000000000000000000000000050e171e252a2d2e3636363636363433302b241d242a2f32333636363636362e2d2a251e170e050000000000000000000000000000000000000000000000000000000000020e1a25313b45515c676d7a838c92989b9d9e9fa39f9f998c7f7266594c3f3326190c000000000000000000000000000000000000030f1b27323d474f5456585859575e666d7a85929eabaa9d908377675c5145382c1f130600000000000000000000000000000000000000000000000000000000000000000000000711202932393f434446464646464646443937332d261d140a000000000000000000000000000000000000000000000000000000020c1620283035394646464646464646463b3a37312a21180e030000000000000000000002080d1113141c1c1c25323e4b5865717e8b98a296897c6f6356493c30231c2734414d5a6774808d9a9d9084777985929e96897d7063564c434e5865727e8b989c8f82767986929f968a7d7063574a3d3024170a000e1b2835414e5b6874818e93939393939393939fa3a59d9b939393939393939393939393939394979ea49d9a9393939393939393938b7e7165584b3e3225180b0000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d000000000000000000000000000000000000000000000000000000000000000000030d152c3945525f6c7885929fabada093867a6d6053473a2d2014070000000000000000000000000000000000000000000000000000000000000000000003101c28343f4a5465727e8b98a89f9f9f9f9b8e817568574d42372b1e14212d3a46535f697884919e9f9f9f9fa197887c6f6255493c2f24190d01000000000000000000000000000713202d3946525e68707d8a929da8a2989083786c60574d42382d22170e1925303a44505a616e7a85929ea5a89d938a7d70685e53493f33271b0f03000000000009141f28333f4a545f6a74808d96a1978d80746a60544a3f34281f14090000000000000000000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b000004101c2834404a54606c77828f96a1a9aea49d959189837f7c797777767677787a7d81868c9299a0a8afa49c928a7e70685e52463b31251a0e0000000000000000000000000000010d19242f3a43505a606d79828f949fa3a7a099928e898583818181828386898e92999fa7a39f948f82796d605b51443b3025190e02000000000000000000000000000000000000000000000000000001070d1113171c1f20222426292a2b2b2c2c2c2b2b2a28262422211e1a1312100c06000000000000000000000000000000000000000000000000000000000000000000000000000000000000050d14191e20212929292929292726241f1a13191f23262729292929292921201e19140d050000000000000000000000000000000000000000000000000000000000000009141f2934404b555e686d7980858b8e909192999393938c7f7266594c3f3326190c000000000000000000000000000000000000000a16212b353d4348494c4c4c4d545d6873808c99abac9f9286796d6053463a2d20130700000000000000000000000000000000000000000000000000000000000000000000050f1923323b444b4f51535353535353535146443f382f261b1106000000000000000000000000000000000000000000000000000008131e28323a41455353535353535353534846423c332a1f1409000000000000000000040c13191d202128282828323e4b5865717e8b98a296897c6f6356493c3028282834414d5a6774808d9a9d9084777d8a979e9184786c6053463d4754606d7a86929f93877b7986929f968a7d7063574a3d3024170a000e1b2835414e5b68748186868686868686868692999d938e8686868686868686868686868686878c979d928d868686868686868686867e7165584b3e3225180b0000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d0000000000000000000000000000000000000000000000000000000000000000010b151f2935414c566c7885929fabada093867a6d6053473a2d20160c0200000000000000000000000000000000000000000000000000000000000000000006121f2c3844505c6675828f9ba8acabacab9e918578695f53473a2e2115222e3b4855616e7b8896a1adacaaaca9998c7f7366564c4135291d11040000000000000000000000000005111d2a36414c56616b74808d96a0aa9f948b7f72695f544a3f33281d16202a36414c56616c75818f97a1aba0968e81746c61564d41382d22170b000000000000020b17222d38424e58606d7984919e9f93877c6f665c50443b30251a0d0300000000000000000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b000006121f2c3844515c66717e8b949fa9afa59d928d837d77726f6d666a69696a696e70747a80879196a0a8aea49e92857a6d61574d42362a1c11060000000000000000000000000004111d2935414c56616c74818e949ea6a69f959087817c79767474747577797d818790959ea5a69e948e81756d62564c41362a1e140800000000000000000000000000000000000000000000000003090e13181d2023282b2d2f3133353737383939393837373533312e2d2a26201f1c17110d08020000000000000000000000000000000000000000000000000000000000000000000000000000000002080d1114141d1d1d1d1d1d1b1a17140e080e1317191a1d1d1d1d1d1d1414110d08020000000000000000000000000000000000000000000000000000000000000000030c18232f39434c565e676d737a7e8184858686868686867f7266594c3f3326190c00000000000000000000000000000000000000040f19232b32383b3c3f3f3f424c56626f7c8899a3aea399877a6e6154473b2e211408000000000000000000000000000000000000000000000000000000000000000000000b16212b35444d565b5e606060606060605e53504941382d22170b00000000000000000000000000000000000000000000000000010d1924303a444c525f606060606060606055534d453c31261a0e0200000000000000040e161e24292d2e35353535353e4b5865717e8b98a296897c6f6356493c3535353535414d5a6774808d9a9d908477828e9b9a8c8073665b50443945515d6774818e9a998d807986929f968a7d7063574a3d3024170a000e1a2734404d59646f7479797979797979797987929b8e8179797979797979797979797979797a87969a8d8079797979797979797979716c62564a3d3124170b0000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d000000000000000000000000000000000000000000000000000000000000000007121d27313945525d687885929fabada093867a6d6053473e32281e13080000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d7985929fa8a19ea1a8a197887b6e6255483b2f221825313e4b5864717e8b97a8a8a09ea0a89c908376685d5245392c20130700000000000000000000000000010d1925303a444f59606d79849199a3a69f92867b6e665b50443c2f261e28323a46525e68717e8a939ea9a3999184796d605a50443b2f261b11060000000000000006111c262f3c45515d67707d8a949e999083786d60574d42362a1f150b01000000000000000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b00000713202d3a4653606d7984919ea6b0a79d938d8079706b6562605c545c5d565e6164686d737c849196a0aaada2978e8174695e5346382e23170b000000000000000000000000000613202c3945525d68717e8a939da6a89f948f837c746f6c6668676768666d70757c838f939ea7a69e938b7f72685e52463b3025190d01000000000000000000000000000000000000000000040a0f151a1d24292c2e34383a3c3e404244444546464545444342403d3b3a36312d2c28231c19130d080200000000000000000000000000000000000000000000000000000000000000000000000000000000010507081010101010100e0d0b08030002070a0c0d10101010101008070501000000000000000000000000000000000000000000000000000000000000000000000007121d27313a444c555d60686d71747778797979797979726d63574b3e3225180c000000000000000000000000000000000000000007101921272c2f3032322f3a4653606d7986929facab95887b6f6255483c2f22150900000000000000000000000000000000000000000000000000000000000000000004101c27323d47565f676a6c6c6c6c6c6c6c6b605b53493f33271b0f0300000000000000000000000000000000000000000000000004111d2935414c565d6c6c6c6c6c6c6c6c6c6c5f574d42372b1e1205000000000000020c1620283035393a4242424242424b5865717e8b98a296897c6f635649424242424242414d5a6774808d9a9d90837a86929f93877b6e61544a3f35414c55626f7c89959e91847886929f968a7d7063574a3d3024170a000c1824303c48535d64686c6c6c6c6c6c6c677783909d918477686c6c6c6c6c6c6c6c6c6c6c687784919d908377676c6c6c6c6c6c6c6c65625a50453a2e2115090000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d00000000000000000000000000000000000000000000000000000000000000030c18242f39434f59606d7a86929facaea194877b6e615a50443a3024190d030000000000000000000000000000000000000000000000000000000000000000091623303c4956636f7c8998a2a1969196a1a9988b7e7265584b3f31261e2a36424d576874818e9ba9a0969196a09f92867a6d6054473a2d21140a000000000000000000000000000008131e28323e45515d676f7c87929fa6a2989083786c60574d42382d25303a44505a616d7a85929ea5a69f92877c6f675d51483e32291d140a0000000000000000000a141d2935414b55616c75828f98a0958b7f72695e52463e31271d1207000000000000000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b00030f1c28333f4a5464717d8a96a1acaca0958e81746d6760595553514a50504d5254565d606a6f7b849198a2aea99f92867b6e61544a3f34281c1003000000000000000000000004111d2935414c55606d7a85929ea5aca0968f82796e6a62605b545a5b545c60636a6e78818f959faba59f92857a6e61564c41362a1e11050000000000000000000000000000000000000000070c151b20262b2f35393a3f4446484a4d4f5051525253525251504e4c4a4846423d3a38342e29251e19140d05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010b151f29323a434b51565d6064686a6b6c6c6c6c6c6c66635b51463a2f22160a000000000000000000000000000000000000000000070f161b1f222325252c3844515c667784919daaa296897c6f6356493c302316090000000000000000000000000000000000000000000000000000000000000000000713202c38444f5967717779797979797979776c655b5044372b1f14090000000000000000000000000000000000000000000000000713202c3945525d6876797979797979797976695f53463a2d21140700000000000008131e28323a4146474f4f4f4f4f4f4f5865717e8b98a296897c6f63564f4f4f4f4f4f4f484d5a6774808d9a9d90837e8b989c8f8276695e5342382f3a4754606a7783909d978a7d86929f968a7d7063574a3d3024170a000814202b37414b53595b606060606060556774818d9a96877a6d61606060606060606060566875818e9b9286796d6060606060606060585650483f34291d11050000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d000000000000000000000000000000000000000000000000000000000000000a151e2935404b55606b74818e98a3aeb5a89c8f82756c61564c4135291f150b0100000000000000000000000000000000000000000000000000000000000005111d2935414c566673808c99aa9e9184919eaa9b8e817568584e43372b202d3a46525e697784919ea1979184919ea3998a7d7164574a3e31261b0f0300000000000000000000000000020c16202935404b55606a737f8c949faa9f948b7f72695f544a3f332935414c56616c75818e97a1aa9f948c7f736a60554b40362c20170b02000000000000000000020b18242f3a43505a616e7b86929f9f92867b6e61594f43392f24180b020000000000000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b0006121f2b3844505b6675828f9ba8b1a89d9083786d605c554f4946444043434246474c52585f696e7b86929fa8afa3998d8073665c5044382b1f120600000000000000000000000613202c3945515d6773808d97a1ada69e91847a6d675f5853504a4e4e4b5153585f666d79839099a3ada2978d8174685e5246392d201409000000000000000000000000000000000000030b121820262b31373a4145474a50535557595c5d5e5e5f5f5f5e5e5d5b595755534d4946443f3835302a251e170e080200000000000000000000000000000000000000000000000000000000000000000000000000000000000002080c1012121313131313131313060400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030d172029313940454c5254585b5d5e5f6060606060595751493f352a1e120600000000000000000000000000000000000000000000040a0f131516191c2834404a546a7683909da9a296897c6f6356493c302316090000000000000000000000000000000000000000000000000000000000000000000916222f3b4854606b77838686868686868684776c6053463b30251a0e0000000000000000000000000000000000000000000000000714212d3a4754606d7a86868686868686867b6e6155483b2e2215080000000000010d1924303a444c52545b5b5b5b5b5b5b5b65717e8b98a296897c6f635b5b5b5b5b5b5b5b54535a6774808d9a9d918483909c978a7e7164574d422f2b37434e5865727f8b989b8e8187929f968a7d7063574a3d3024170a00030f1a252f3941484d4e5353535353535864717e8b97968a7d70635753535353535353535865727f8b9899897c6f63565353535353534b4a453f362d22180c010000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d00000000000000000000000000000000000000000000000000000000000006111c26303845515d67707d89939daab4b9aa9e948a7e71685d52463d31271d12070000000000000000000000000000000000000000000000000000000000000713202d3946525d687683909da8988c7f8c98a29e9185786a5f53473a2e212e3b4754616e7b8796a09e9285808c99ab9a8e817467584e43372b1f12060000000000000000000000000000050e18242f39434e58606d78839098a2a69f92867b6e665b50443c323a46525e68707e8a939ea9a2989083786d60584e43392f231a0e05000000000000000000000007131d28313e46535e69727f8c95a0988e81756b61554b4035291d140a0000000000000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b000613202d394653606c7985929fabaca095897d70665c514b433d3a38342e30363a3b41454e565e69727f8b96a0acab9e9185796d6053463a2d20130700000000000000000000000714212d3a4754606d7a85929fa9aa9e94897d70685d554e46443f41414045464e545c676f7c87929faca99f92867a6e6154473c31261a0e0200000000000000000000000000000000070c151d232831373c42474b5154545c60626466686a6a6b6c6c6c6b6a6a686664615f575653504a46413a3630292019130d0500000000000000000000000000000000000000000000000000000000000000000000000000000000060d13181c1e1f202020202020202013100c07010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050e171f272f353a4145474b4e51525353535353534c4b463f372e23180d02000000000000000000000000000000000000000000000000030709090c18232e43505c6976838f9ca9a296897c6f6356493c30231609000000000000000000000000000000000000000000000000000000000000000005111e2a36414c5663707d8995939393939396897d7063574d42362a1c110600000000000000000000000000000000000000000000000714202d3a4753606d7a86939393939393877b6e6154483b2e211508000000000005111d2935414c565d61686868686868686868717e8b98a296897c6f686868686868686868615e576774808d9a9f928690949e9285796d6053463b3127323d4754606d7a86929f928588939f968a7d7063574a3d3024170a000009131d272f373c404146464646464855626e7b8897998d807366544a3f46464646464956626f7c8998988c7f7265594c46464646463e3d3a342d241b1106000000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d0000000000000000000000000000000000000000000000000000000000020b17232e38424e58606d7984919ea5afafacafa69e92857a6d61594f43392f24180c0300000000000000000000000000000000000000000000000000000000000714212e3a4754616d7a86939fa096877a85929fa197887b6e6255483b2d22313e4b5764717e8a97a89b8f827d8a96a89e9184786a5f53473a2e21150700000000000000000000000000000007121d27313c44505c666e7b86929fa5a2989083786c60574d423a44505a616d7a85919ea5a59f92867b6e665c50463d31281d1108000000000000000000000000010c161f2a36424d57606d788390999e938a7d70675d51453c2f261b110600000000000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b000815222f3b4855626e7b8897a2adaa9d9184776b60544a4039312d2c2823252a2d30353c444d57606c7884919eaaada197897c6f6356493c302316090000000000000000000005111e2a36424d5765727f8b98a2aea99c8f82756b60564c433c38332d2e34383c424b555f6a74818e9ba8aea3988c7f7266574d42372b1e12050000000000000000000000000000000810191e272e343c43474d53555d6064666d6f7173757777787979787877767573706e696763605c54524c46413b322a251e170e0600000000000000000000000000000000000000000000000000000000000000000000000000000710181f24282b2c2d2d2d2d2d2d2d2d1f1c18120b030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050d151d24293035393a3e4144454646464646463f3e3a352e251c12070000000000000000000000000000000000000000000000000000000000071d293643505c6976838f9ca9a296897c6f6356493c3023160900000000000000000000000000000000000000000000000000000000000000000713202d3946525e6875818e9ba89f9f9fa89b8f8275695e5246382e23170b00000000000000000000000000000000000000000000000713202d3a4653606d79869aa49f9f9f94877a6e6154473b2e21140800000000000713202d3946525d686d757575757575757575757e8b98a296897c757575757575757575756e695e6774808d9aa29892989f9a8d8074665c51453829202c3945525d6874818e9b9892939aa4968a7d7063574a3d3024170a0000010b151d252b30343539393939394653606c7985929c8f8376665c5044383939393a4653606d7986929b8e827568574d423639393932312e29221b120900000000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d00000000000000000000000000000000000000000000000000000000000a141d28343f4a54606a73808d96a0acaca49fa4aca1978e81746b60554b4035291e150a00000000000000000000000000000000000000000000000000000000000b1724313e4a5764717e8a99a49e918477828f9ca9988b7e726553493f332a36414c566774818d9aaa988b7f7a8796a0a196887c6f6255483c2f24180d010000000000000000000000000000010b151f28343f4a545f69717e8b939ea99f948b7f72695f544a414c56616c75818e97a1a89e938b7e71695f544a3f342b1f160c0000000000000000000000000000040d1a25313b44505c666f7c87939f9e9184796d60584e41382d22170b02000000000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b000a1724303d4a5763707d8a96a9b3a69a8d807367594f42382f27201f1c18191e202429323b44505b65737f8c99a9a6a9998c807366594d4033261a0d000000000000000000000714202d3a46525e697683909daaada196897d7063594f433a312b282223282c3039434e58626f7c8895a0acaa9d908477695f53463a2d211407000000000000000000000000000009111a222a303940454e53575f62676d7175797b7d8082838485858685858483817f7d7b7874706d66615e56524c443e36302920180f0700000000000000000000000000000000000000000000000000000000000000000000000006101922293035383939393939393939392c29231d150d030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b12181e24292c2d3135373839393939393933322f2a231c130a000000000000000000000000000000000000000000000000000000000003101d293643505c6976838f9ca9a296897c6f6356493c3023160900000000000000000000000000000000000000000000000000000000000000030f1c28333f4a54616d7a86929facacacacac9f92877b6e61544a3f34281c10030000000000000000000000000000000000000000000006121f2c3844515c667986939facaca094877a6d6154473a2e21140700000000000714212e3a4754616d7a8182828282828282828183909da99c8f82828282828282828282817b6e616774808d9aaaa29fa29f95887b6f62544b4034281d2935414c56626f7c8995a09f9fa4ac968a7d7063574a3d3024170a000000030b131a202427282d2d2d2b3744505b6576828f9c9285796d6053463a2d2d2c3844515c667683909c918478695e52463a2d2d2d2524211d1811090000000000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d0707040100000000000000000000000000000000000000000000000006111b262f3844505c666f7c87929fa8a69f9a939aa4a99d93897d70675d51453c30261c110600000000000000000000000000000000000000000000000000000006121f2b37434e586774818e9aab9b8e81757f8c99a99b8e8275655b5044372d3946525e687784919da298887c7784919ea9998c7f7266554b4035291d1104000000000000000000000000000000030d17232e38424d57626c75828f97a1a69f92867b6e665b5045525d68707d8a939ea9a1968e81756c62574d42382e22190d0400000000000000000000000000000009141f28343f4a54606a74808d97a1968d80736a5f53493f33271e1308000000000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b000b1825323e4b5865717e8b98a4b1a4978a7e7164574b3e30261d1512100c0e1114192027333f4953616e7b88979a9998978f8276695c4f4336291c10030000000000000000000814212e3b4754616e7b87959fabab9e9184786c6053463d31281f1c17181c1f27313c47535f6a7784919daaaca095887b6e6155483b2e2215060000000000000000000000000009121b232c343c424b51585f62696e747a7d8185888a8c8f9091919292929191908e8c8a8884807d79736d68615e565046413a322a2119100700000000000000000000000000000000000000000000000000000000000000000000020d18222b343b414445464646464646464638342f271f150b01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001070c13191d202125282a2b2c2d2d2d2d2d2625221e18120a01000000000000000000000000000000000000000000000000000000000003101d293643505c6976838f9ca9a296897c6f6356493c302316090000000000000000000000000000000000000000000000000000000000000006121f2b3844505b66727f8c99a3aeaaa8aaafa3998c7f73665c5044382b1f14090000000000000000000000000000000000000000000004101c2834404a5f6c7986929facada093867a6d6053473a2d20140700000000000815212e3b4854616e7b878e8e8e8e8e8e8e8e8e90959fab9f948f8e8e8e8e8e8e8e8e8e887c6f626774808d9aa7aeacaa9d9083766a5f5342392e2319242f3a4754606a7783909daaacafa3968a7d7063574a3d3024170a0000000001090f14181a1b20201b27333f495366737f8c9998887c6f6255493c2f222834404a546773808d9a96877b6e6154473b2e212020201b1a17140e08010000000000000000060c1114202d3a4753606d7a8693a0ada6998c807366594d4033261a1a1413110d0801000000000000000000000000000000000000000000000b17222d38414d57606d78839099a3ab9f948f87939fa8a59e9184796d60584e42382e23170c0300000000000000000000000000000000000000000000000000000814212e3a47535f6a7884919eab988c7f727c8897a29e9285796c605346392e3a4754616d7a8795a09f92857974818e9ba79c8f8376675d5145392c2013060000000000000000000000000000000006111c26303b45505a616d7a85919ea4a2989083786c60574f59606d7a84919ea5a49a91847a6d615a50453b30261c100700000000000000000000000000000000030c17232e38424e58606d7a85919e9f92877c6f655b50443a3025190c030000000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b000c1925323f4c5865727f8b98a5afa396897c706356493d3023140b0604000205080e17222d3846535f6978858e8d8c8c8b8a85786b5e5245382b1f12050000000000000000000b1824313e4b5764717e8a97a7b1a79a8e8174665b5044382b1f160f0b0c10151f2b37434e586773808d9aa6b1a7988b7e7165584b3e2d22170b00000000000000000000000009121b242d353e464e545c606a6f757b81868a8e929797999b9d9d9e9f9f9f9e9d9d9b999796918d8985807a746e68615a524c443c332b2219100700000000000000000000000000000000000000000000000000000000000000000008131f29343d464c5152535353535353535345403931271d12070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080d111314181b1e1f202020202020191816120d070000000000000000000000000000000000000000000000000000000000000003101d293643505c6976838f9ca9a296897c6f6356493c30231609000000000000000000000000000000000000000000000000000000000000000613202d394653606c7884919eaba69e9c9ea6ab9e9184786d6053463b31261a0e00000000000000000000000000000000000000000000000c18232e46525f6c7985929facaca09386796d6053463a2d20130700000000000815212e3b4854616e7b87949b9b9b9b9b9b9b9b9d9fa79fa69f9c9b9b9b9b9b9b9b9b95887c6f626774808d9a9f9f9fa2988b7e7165584e4330271d131e2b38434e5865727f8b98a29f9f9f968a7d7063574a3d3024170a0000000000010911181e2225252d222d3d4a5663707d899a988b7f7265584c3f3025232e3e4a5764717d8a97978a7d7164574a3e2e232d2d2d2726241f1a130b020000000000000910171d21202d3a4753606d7a8693a0ada6998c807366594d403326262621201d19130c040000000000000000000000000000000000000000040f1b27333f49535f69727f8c95a0aba3998f82808c96a0aca0968d80736a5f544a3f34281f140900000000000000000000000000000000000000000000000000000815222f3b4855626e7b8896a1a399897c6f7985929fa197887b6f6255483c2d3e4a5764717d8a97a89c8f8276717e8b98a89f92867a6d6053473a2d20140900000000000000000000000000000000000a141e29333f46525e68707d8a929da89f948b7f72695f56616b74818e97a1a79f93887d70685d52483e33291e140a00000000000000000000000000000000000006111c26303d45525d68717e8a949f999083776c60564c41362a1e150b0000000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b000c1825323f4b5865727e8b98a5afa295897c6f6256493c2f23160600000000000006111b2a36424d576673808180807f7e7d7d706356493d3023160a000000000000000000010e1b2834414e5b6774818e9aa7b4aa978a7e7164544a3f3328190d040000040d1b26323d4a5764707d8a97aab4a79b8e81746853493f33271b0f030000000000000000000007101b242d363e474f585f666d737c82878e92989b9ea2a9a6a8aaa8a7a6a6a6a7a8a9a8a6a8a19e9a97928c86807a716c615e564d453c342b22190e0500000000000000000000000000000000000000000000000000000000000000000c1824303b464f575d5f606060606060605f514b43392f23180c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010407070b0e11121313131313130c0c0a0602000000000000000000000000000000000000000000000000000000000000000003101d293643505c6976838f9ca9a296897c6f6356493c3023160900000000000000000000000000000000000000000000000000000000000005121e2a36424d5763707d8a96a0ab9e948f949eaaa1968a7d7064574d42362a1c120700000000000000000000000000000000000000000000071f2c3845525f6b7885929eabaea3998679665c5145382c1f130600000000000815212e3b4854616e7b8793939393939393939393939393939393939393939393939393887c6f626774808d939393939392857a6d6054473c3121150f1b27323d4754606d7a869293939393938a7d7063574a3d3024170a000000000009131b23292e31323939393a4754606d7a86939b8e817568564d42363939393b4854616e7b87969a8d807367544a3f34393939393433302b241d140b010000000009121b22282d30313a4753606d7a8693a0ada6998c807366594d40333333332d2c29241e160d04000000000000000000000000000000000000040e1a242b3744505b656e7b86929fa7a89f92867c7984919ea5a89f92877c6f665c50443c31261a0e0500000000000000000000000000000000000000000000000004101c2934404b5565727f8c98a89f9286796d75828f9ba9988b7f726553493f35414c566774808d9aaa998c7f726e7b8896a1a3998a7d7064574a3d31261a0e0200000000000000000000000000000000020c18212a36414c56616b74818d96a0a69f92867b6e665d68707d8a939ea9a0958d80736b60564c41362d21180c02000000000000000000000000000000000000000a151e2935414c56616c76828f989f948b7e71685e52463d30271d120700000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b000b1724313e4a5764717d8a97a4b0a396897d7063564a3d2d22170b010000000000000e1a26313b4b58636e73757473727170706b6054483b2f22160900000000000000000005111e2a36414c566a7683909da9aea298887b6e6155483b2d221708000000000a15212e3b4854616e7b8798a2aeaa9d908377655b5044372b1f1205000000000000000000050e19222d363e485059616a6f7980878f93999fa3aaabaaaaa29f9d9b9a9a999a9a9b9d9fa2aaa9aba9a19e98928d857e756d685f574e463c342a20170c0300000000000000000000000000000000000000000000000000000000000003101c2835414c5761696c6c6c6c6c6c6c6c6c5c554b4034291c1004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003101d293643505c6976838f9ca9a296897c6f6356493c302316090000000000000000000000000000000000000000000000000000000000000714202d3a46525e6975828f9ba8a3998f828f98a2a89c8f8276695f5346392e23180c00000000000000000000000000000000000000000005121f2b3845525e6b7885919eabac9f9286796c5f4b4034281c100400000000000815212e3b4854616e7b8686868686868686868686868686868686868686868686868686867c6f62677480868686868686868174675d5145392c20130a16202c3945525d687481868686868686867d7063574a3d3024170a0000000007111b252d343a3e3f4646464645525d687784919d918478695e5246464646464646525e697884919c908376665c50444646464646413f3c362f261d130800000006101b242c34393d3e404753606d7a8693a0ada6998c807366594d40404040403a39352f2820160c0100000000000000000000000000000000020c16202a36424d56606c77828f98a3aca0968c8073707d8a939eaaa3999083786d60574d42372b20170d02000000000000000000000000000000000000000000000006131f2c3845515c6776828f9ca99c90837667727f8b98a99b8f8275655b50443945525d687783909da298897c6f697884919eab9a8d817467574e42372b1e12060000000000000000000000000000000000060f1925303a444f59606d79849199a3a2989083786c606d7a84919ea5a3989083796d60594f443a30241b0f060000000000000000000000000000000000000000030c19242f3a43505a616e7b86929f9e92857a6d61594f42392e23180c03000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b000a1623303d495663707c8996a8b1a4978b7e7164544a3f33281d120700000000000009141f2f3b47525c63666867666564646360594f44382c2013070000000000000000000713202d3946525e687885929fabac9f9285796c605346392d201306000000000714212d3a46535e697985929facac9f9285796c605346392d2013060000000000000000020d17202b343e48505a616b707c838c92999fa4abaca7a09d999892908f8d8d8d8d8d8f909298989c9fa4abaaa29f97928a827a6e6960584e463c32291e150b00000000000000000000000000000000000000000000000000000000000005121e2b3844515d6973787979797979797976675c5145382c1f1306000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003060809131313131313060400000000000000000000000000000000000000000000000000000000000000000000000003101d293643505c6976838f9ca9a296897c6f6356493c30231609000000000000000000000000000000000000000000000000000000000003101c28343f4a54616e7b87929fac9f92877a85929fab9f93877b6e61544a4034281c1004000000000000000000000000000000000000000005121e2b3845515e6b7884919eabac9f9285796c5f52462e23180c0000000000000714202d3a46525e6976797979797979797979797979797979797979797979797979797979766a5f646e7479797979797979746f64554b4135291d1104111d2935414c56646f7479797979797979706b6155483c2f231609000000010d18232d373f464a4c53535353534c566774818e9a96877b6e6154535353535353534d576875828f9b9285796d60535353535353534e4c4741382f241a0e0300000c17222c363e45494b4d4d53606d7a8693a0ada6998c807366594d4d4d4d4d4d4745413a32281e13080000000000000000000000000000000008131e28323a46525e69717e8b949faaa59e9184796d6b75818e98a2aba0958c7f72695f53463f32291e140800000000000000000000000000000000000000000000000714202d3a4753606d7986929fab998d8073666f7b8897a19e9285796c6053463a4754606d7a86939f9f9286796d6875818e9ba89e9184786a5f53473a2e21140700000000000000000000000000000000000008131e28323e45515d676f7c87929fa79f948b7f726b74818e96a1a69f92867c6f675c51473d32281e12090000000000000000000000000000000000000000000008131e28313e46535f69727f8c95a0978e81746b60544b4034281f1409000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b000814212e3b4754616e7a8795a0aca79a8e8174665b5044392f2318110a020000000003131f2a35404a52585a5b5a5959585756544f473d32271b10040000000000000000000714212e3a4754616d7a8798a2aeaa9d918477665b5044382b1f12060000000005121e2a36424d576a7784919daaaea298877a6e6154473b2e211408000000000000000009141f29323d46505a626c717d8690959fa3ababa49f9b95908c898584828180808081828385888b8f93999fa2aaa9a19e938f847b6f6a60584e443b30271d1207000000000000000000000000000000000000000000000000000000000006121f2c3945525f6c788586868686868686796d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030a0f12151520202020202013100c070100000000000000000000000000000000000000000000000000000000000000000003101d293643505c6976838f9ca9a296897c6f6356493c30231609000000000000000000000000000000000000000000000000000000000006121f2c3844505c6673808c99a3ab9c8f8276818e9ba9a4998d8073665c5144382c1f1509000000000000000000000000000000000000000005111e2b3844515e6b7784919eaaab9f9285786c5f5245392c1f0700000000000005121e2a36424d575e6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c625f585c64676c6c6c6c6c6c6c67645d53433a2f24180d010d19242f3a43535d64686c6c6c6c6c6c6c6361594f44382c20140700000006121e29343f495156586060606060606065717e8b98978a7d71646060606060606060606065727f8c9898887c6f62606060606060605a58524a41362b1f14080005111d28343e48505557595959606d7a8693a0ada6998c8073665959595959595954524c443a2f24190d010000000000000000000000000000030d1924303a44505a616e7b85929fa6a99e93897d7067616e7b86929fa7a79f92867b6e615a50443b3025190d04000000000000000000000000000000000000000000000a1723303d4a5663707d8998a2a3998a7d70636a7885919ea297887c6f6255483d4a5763707d8a99a49c8f82766665717e8b98a8a196887b6e6255483b2f24180c000000000000000000000000000000000000020c16202935404b55606a737f8c959fa69f92867b707d89939da89f948b7f726a5f554b40352b20160c0000000000000000000000000000000000000000000000010c161f2a36424d57606d7883919a9e93897d70665c51453c31261a0d040000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b000714202d3a46525e697784919dacab9e9184786c60554b403429221c140b05000000020e19242e3840474b4d4e4d4d4c4b4a4948443d352b21160b000000000000000000000915222f3c4855626f7b8895aab4a99c8f837669544a3f33281c0f0300000000020e1a2531434f5c6976828f9ca9b4aa95887b6f6255483c2f22150900000000000000030d1925303b444e58626c717e879298a0a7afa79f99938e88837f7c79777574737373747577797c7f83878d92989ea5ada59e9691857c6f6a5f564c42392e23180c030000000000000000000000000000000000000000000000000000000006121f2c3945525f6c7885929393939393867a6d6053473a2d2014070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060e151b1f21222d2d2d2d2d2d1f1c18120b03000000000000000000000000000000000000000000000000000000000000000003101d293643505c6976838f9ca9a296897c6f6356493c3023160900000000000000000000000000000000000000000000000000000000000713202d3a4653606d7984919eaba3998b7e717d8a97a2ab9e9285796d6053463c31261a0e010000000000000000000000000000000000000004111e2b3744515e6a7784919daaab9e9185786b5e5245382b1f12050000000000020e1a25303b454d525f60606060606060606060606060606060606060606060606060606055534e52585a606060606060605b59534b4131281d13070008131e2831414b53595b6060606060606057554f473e33281c10040000000916222e3a46515b62656c6c6c6c6c6c6c6c6f7b88989a8d80736c6c6c6c6c6c6c6c6c6c6c6c6f7c8999988b7e726c6c6c6c6c6c6c6c67645c52473c3024170b000815212d3945505a6164666666666d7a8693a0ada6998c80736666666666666666605d564c4135291d110400000000000000000000000000010b151f2935414c56616c75828f97a2ada2978e81756b605e69727f8c95a0aca2988f82766c62564c41362a1f160c01000000000000000000000000000000000000000005111e2a36414d566773808d9aaa9f92867a6d606875818e9ba9988b7f7265544a404b556773808d9aaa998c7f7366616e7b8896a1a8988b7f7265554b4035291d1004000000000000000000000000000000000000050e18242f39434e58606d78839098a2a29890827a84919ea5a2978f82776c60584e43392e23190e04000000000000000000000000000000000000000000000000040d1a26313b44515c666f7d88939f9d9184796d60574d42372b20160c0100000000000000000000000000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b0005111e2a36424d566774808d9aa4ada1968a7e71675c51453f332d261d170e0600000008121c262e353b3f404241403f3e3d3d3b38322b23190f04000000000000000000000a1723303d4a5663707d8996a3b0a89b8e8275685b4f422d22170b000000000000091c2835424f5b6875828e9ba8b0a396897d7063564a3d3023170a000000000000010b151f2a36424d56606a717e889299a2aaafa49c959087817c77726f6d6668676766676768666c6f72767b80868e939fa3aaa8a09792867c6f685e544b4034282015090000000000000000000000000000000000000000000000000000000006121f2c3945525f6c7885929f9f9f9f93867a6d6053473a2d2014070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006101820262b2e2f3939393939392c29231d150d030000000000000000000000000000000000000000000000000000000000000003101d293643505c6976838f9ca9a296897c6f6356493c302316090000000000000000000000000000000000000000000000000000000005121e2a36424d5764707d8a96a1ac9f92867a6d7985929faba1978a7e7164574d42372b1d12070000000000000000000000000000000000000004111d2a3744505d6a7783909daaab9e9184786b5e5145382b1e120500000000000009141f29333b424648535353535353535353535353535353535353535353535353535353494743474c4d535353535353534e4c4841382f1f160c0100010c161f2f3941484d4e535353535353534a48443e352c21160b000000000b1825313e4a56626d727979797979797979797885929d908379797979797979797979797979797986929b8e81797979797979797979746e64584c3f33261a0d000a1724303d4955616c7173737373737a8693a0ada6998c807373737373737373736d685d5245392c2013070000000000000000000000000007121d27313945525d68717e8a939ea9a69f92857a6d615957606d7883909aa4aa9f948b7e71685e52463e31281e130800000000000000000000000000000000000000000714202d3946525e687784909daa9d908377675d65717e8b98a89b8f8275665b5045515d677683909da298897c6f635f697884919ea99c8f8276675d5145382c1f13060000000000000000000000000000000000000007121d27313d44505c666e7b86929fa69f9490849196a1a59e92857b6e655b50463c30271d1108000000000000000000000000000000000000000000000000000009141f2834404a54606b74818e97a0968c7f73695f53463e32281e130800000000000000000000000000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b00020e1925303b4855626e7b87939faaa99e9184796d605a50443f382f292017110a0300000a141c242a2f3233353433323131302f2c272119110700000000000000000000000a1724313d4a5764707d8a97a3b0a79a8e8174675b4e4134281b060000000000010e1b2834414e5b6774818e9aa7b0a3978a7d7064574a3d3124170a00000000000007121d27313946525e696f7c86929aa3ababa39f928d837c756f6a6662605c545a5a5a5a5a545b606265696e747b818a9298a2a9a9a19891847a6e665c51453c31261a0e0500000000000000000000000000000000000000000000000000000006121f2c3945525f6c7885929fabaca093867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030e18222a31373a3c46464646464638342f271f150b0100000000000000000000000000000000000000000000000000000000000003101d293643505c6976838f9ca9a296897c6f6356493c30231609000000000000000000000000000000000000000000000000000000000714212d3a46535f6976828f9ca8ab9c8f82766874818e9ba9a99c8f8276695f5347392f23180c0000000000000000000000000000000000000004101d2a3743505d6a7683909da9aa9e9184776b5e5144382b1e1105000000000000020d17212930363a3b4646464646464646464646464646464646464646464646464646463c3b373c3f414646464646464641403c362f261d0d04000000040d1d272f373c4041464646464646463d3c38332c231a1005000000000c1925323f4c5865727f868686868686868686868a989f95908686868686868686868686868686868b999e938e8686868686868686868074675a4e4134271b0e000b1824313e4b5764717e8080808080808d99a6b3a99c90828080808080808080807a6d6054473a2d211407000000000000000000000000030c18242f39434f59606d7a85919ea5ab9f948b7e71685e52505c666f7c87939fa9a69f92857a6e61594f433a2f24190c03000000000000000000000000000000000000000814212e3b4754616e7a8795a0ac9a8d80736755616e7b8796a19f9285796c60534753606d7a86929f9f9285796d60576874818e9ba79f9286796d6053473a2d20140900000000000000000000000000000000000000010b151f28343f4a545f69717e8b939ea69f969196a0a89d938a7e71695e53493f342a1e150b000000000000000000000000000000000000000000000000000000030c18232e39424f59616d7a85929e9f92867b6e615a50443a2f24190c02000000000000000000000000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b00000914212e3a47535f6a75828f98a3aca0968d80746c625a504a423b3228231c150c0500020a12191f2326272827262625242322201b160f070000000000000000000000000b1824313e4b5764717e8a97a4b1a79a8d8174675a4e4134271b0e0100000000010e1b2734414e5a6774818d9aa7b0a4978a7d7164574a3e3124170b0000000000000c18232f3943505a616e7b859198a3acaca399928b80786f6a625f585653504a4e4d4d4d4e4a505355575e61696e757e869297a2aaaaa1969082786d60574e42372b21170b00000000000000000000000000000000000000000000000000000006121f2c3945525f6c7885929fabada093867a6d6053473a2d2014070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a15202a343c43474853535353535345403931271d120700000000000000000000000000000000000000000000000000000000000003101d293643505c6976838f9ca9a296897c6f6356493c3023160900000000000000000000000000000000000000000000000000000004101c2834404b54616e7b87939faca3998b7e7165707d8a97a2ab9f94887b6e62554b4034291c100400000000000000000000000000000000000003101d2a3643505d697683909ca9aa9d9184776a5e5144372b1e110400000000000000050f171f252a2d2e3939393939393939393939393939393939393939393939393939392f2e2b303334393939393939393433302b251d140b00000000000b151d252b30343539393939393939302f2c28211a110800000000000c1925323f4c5865727f8b93939393939393939394a2a79f9d9393939393939393939393939393939fa3a59e9b93939393939393938d8174675a4e4134271b0e00101c2936434f5c6976828c8c8c8c8c8d929ca8b4ab9f94908c8c8c8c8c8c8c8c877b6e6154483b2e2115080000000000000000000000000a151e2935404b55606b74818e97a1ada3999083776c60564c4a54606b74818e97a1ada2978e81756c61554c4135291e150b000000000000000000000000000000000000030f1b27333f495364717e8b97a7a49a8a7d7064575e697884919ea297887c6f62554a5663707d8999a39c8f8276665c5864717e8b97a8a3988a7d7063574a3d31261a0e0200000000000000000000000000000000000000030d17232e38424d57626c75828f97a1a8a09ea0a8a0968e81746c61564d41382d22180c030000000000000000000000000000000000000000000000000000000007121c27303d46525d68717e8b949f988f82766c61564c4135291e140a000000000000000000000000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b000006121f2b37434e58626f7c86929fa6a89d928b7e716c605b544d443d342e261e170e070000080e1317191a1b1a1a191817161613100b04000000000000000000000000000b1825313e4b5864717e8b97a4b1a79a8d8074675a4d4134271a0e0100000000010e1a2734414d5a6774808d9aa7b1a4978b7e7164584b3e3125180b000000000004101c2934404b55616c76828f97a1aaafa49a92877e736d665f58534e4946443f41404040413f4446484d53565e616c717c859298a2aca89f948d80736a5f53473e33281c1004000000000000000000000000000000000000000000000000000006121f2c3945525f6c7885929fabada093867a6d6053473a2d2014070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1b26313c464e535560606060605f514b43392f23180c00000000000000000000000000000000000000000000000000000000000003101d293643505c6976838f9ca9a296897c6f6356493c3023160900000000000000000000000000000000000000000000000000000006131f2c3845515c6673808d9aa4ac9f92867a6d606d7985929faba69a8d8073675c5145382c1f150a00000000000000000000000000000000000003101d293643505c6976838f9ca9aa9d9084776a5d5144372a1e11040000000000000000050d141a1e20212d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d22211f2326272d2d2d2d2d2d2d282724201a130b020000000000030b131a202427282d2d2d2d2d2d2d2423201c1610080000000000000c1925323f4c5865727f8b989f9f9f9f9f9f9f9f9faaacaba99f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9faaacaaa89f9f9f9f9f9f9f9a8d8174675a4e4134271b0e00101c2936434f5c6976828f99999999999ca4aeb9b0a69f9c9999999999999994877b6e6154483b2e211508000000000000000000000006111c26303845515d67707d89939da9a89f92877c6f655b5044424f59616d7a85929ea6a99e938a7d70675d51453d30271d1207000000000000000000000000000000000005121f2b3744505b6575818e9ba89f93867a6d6154576774818e9aa9988b7f7265544b556673808c99aa998c7f72665454616e7b8796a1aa9a8d807467574d42362a1e1205000000000000000000000000000000000000000006111c26303c45505a616d7a85929eabacaaaca3999184796d605a50443b2f261b10060000000000000000000000000000000000000000000000000000000000000b151e2935414c56626c76828f989f948a7e71685d52453d30261c11060000000000000000000000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b0000020f1a26313c47535f6a727f8c949fa7a49f93877e736c665e564f443f38302920191109000002070a0c0d0f0e0d0c0b0a0a0907040000000000000000000000000000000b1824313e4b5764717e8a97a4b1a79a8d8174675a4e4134271b0e0100000000010e1b2734414e5a6774818d9aa7b1a4978a7e7164574b3e3124180b000000000006131f2c3845515c67707d8a949fa9b0a69f93887e716c605c544e47433c3a38342e3433342d3338393c42464d525a616a6f7c86929aa4afa69f92877b6e62594f44392d20150a000000000000000000000000000000000000000000000000000006121f2c3945525f6c7885929fabada093867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006121f2b37434e585f626c6c6c6c6c6c5c554b4034291c1004000000000000000000000000000000000000000000000000000000000003101d293643505c6976838f9ca9a396897d7063564a3d302317080806020000000000000000000000000000000000000000000000000713202d3a4653606d7985929eacaa9c8f8275685d6674818e9ba9ab9e9285796d6053473c31261b0f01000000000000000000000000000000000003101c2936434f5c6976828f9ca9a99d9083766a5d5043372a1d100400000000000000000002090e121415202020202020202020202020202020202020202020202020202020161513171a1a202020202020201b1a18140f08010000000000000001090f14181a1b20202020202020171614100b05000000000000000c1925323f4c5865727f8b939393939393939393939da0a7a09393939393939393939393939393939393a0a79f9d939393939393938d8174675a4e4134271b0e00101c2936434f5c6976828f9c9f9f9fa0a2a7afb9b6aea8a69f9f9f9f9f9f9f94877b6e6154483b2e21150800000000000000000000020b17232e38424e58606d7984919ea5aca1968d80736a5f53493f3d46525e68717e8b949faba59e91847a6d60594f43392e23180b02000000000000000000000000000000000613202d394653606c7885929eaa9d908477685d525764717e8a97a79b8f8275665b515c677683909ca298897c6f6356535e697884919eaa9d918477695f53463a2d2114070000000000000000000000000000000000000000000a141e2a333f46525e68707d8a99a3aeb7ac9f92877c6f675d51483e32291d140a00000000000000000000000000000000000000000000000000000000000000030c1924303a44505a626e7b86929f9e91857a6d60584e42382e23170b0300000000000000000000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b0000000a15202b37434e58606c78828f959fa6a499938b80786e686159504a423b322b231b1209000000000000020100000000000000000000000000000000000000000000000a1724313d4a5764707d8a97a3b0a79a8e8174675b4e4134281b0e0100000000010e1b2834414e5b6774818e9aa7b0a3978a7d7064574a3d3124170a0000000003101c28343f4a54606d7984919ea6b0aa9e948c7f736c625a504a423c37322d2c282327272722282b2d31363b42465058606a707e88939fa8aea3998f82766c6155493c31261b0f000000000000000000000000000000000000000000000000000006121f2c3945525f6c7885929fabada093867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000000000000000000000003060b0f15212e3a47535f6a76797979797976675c5145382c1f130e090603000000000000000000000000000000000000000000000000000003101c2936434f5c6976828f9ca9a4978a7d7164574a3e2f24191514120e090300000000000000000000000000000000000000000006121f2b37434e5864717e8a97a1ada3988b7e71645663707d8a97a1ada2978b7e7164584e43372b1d13070000000000000000000000000000000000020f1c2935424f5c6875828f9ba8a99c908376695d5043362a1d10030000000000000000000000020507081313131313131313131313131313131313131313131313131313130908060b0d0e131313131313130e0e0b0803000000000000000000000003080c0e0e131313131313130a0907040000000000000000000c1925323f4c5865727f86868686868686868686868995a0958986868686868686868686868686868689959f958986868686868686868074675a4e4134271b0e00101c2936434f5c6976828f9393939393969da7b2aea49c999393939393939393877b6e6154483b2e211508000000000000000000000a141d28343f4a54606a73808d96a0aca59e9184796d60584e413835414c56606c77829099a3ada1968d80746b60554b4034281d140a000000000000000000000000000000000916222f3c4955626f7c8897a1a79a8d817467564c54616e7a8795a09f9285796c6053606d7986929f9f9285796d60534d576874818e9ba7a096887b6e6155483b2e23180c00000000000000000000000000000000000000000008131e28323a45515c666e7b86929facb7ab9e91847a6d605a50443b2f261b1106000000000000000000000000000000000000000000000000000000000000000008131e28323e47535f6973808c96a0978d80746a60544a3f34281f140900000000000000000000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b000000030f1a26313c44505b666d79838f949da5a49f928d827a706b605c544d443d352d241b12090000000000000000000000000000000000000000000000000000000000000a1723303d4a5663707d8996a3b0a89b8e8175685b4e4235281b090000000000020f1b2835424e5b6875818e9ba8b0a3968a7d7063574a3d3024170a0000000006121f2b3844505c66727f8c96a0acaea2988f82776c605a50443f38302b26201f1c171a1a1a171c1f20252a30363e464e58616c73808d96a1acab9f948a7d7064584e43372b1d12070000000000000000000000000000000000000000000000000006121f2c3945525f6c7885929fabada093867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000000000000000000060b1012171b1f222f3c4855626f7c8686868686796d6053473a2d201e1a15130f0a04000000000000000000000000000000000000000000000000020f1c2935424f5c6875828f9ba8a6998c7f7366554b4135292422211e1a150e0600000000000000000000000000000000000000000814212e3a47535f6a7683909ca9ac9f92867a6d6054606d7985929eaba99d9083766a5f53473a2f24180d0100000000000000000000000000000000020f1c2835424f5b6875828e9ba8a99c8f8376695c504336291d10030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1825313e4a56626d72797979797979797979797983909d918479797979797979797979797979797983909d90837979797979797979746e64584c3f33261a0d00101c2936434f5c6976828686868686868b96a2aea89c928c8686868686868686867b6e6154483b2e21150800000000000000000006111b262f3844505c666f7c87929fa8aa9e938a7d70675d51463c2f303a44505b656f7c87929fa8a89f93887d6f675c51453c2f261c1106000000000000000000000000000004111d2935404b5566727f8c99a9a8978a7d7164574a525e687784919da297887c6f625663707c8998a39c8f8276665c514b5864717e8b97a8a8988b7e7265544b4034281c100400000000000000000000000000000000000000050f19242f3a444f59606d79839099a3acaaaca1968e81746c61564d41382d22170c0300000000000000000000000000000000000000000000000000000000000000020c16202b37424d57606d7984919e9f93877c6f665c50443b30251a0d04000000000000000000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b000000000a152028333f4a545d676d79828e939fa3a49c948f857d736d665e564f473e362d241b110800000000000000000000000000000000000000000000000000000000000916222f3c4955626f7c8895aab4a99c8f8276695c4f4330251a0e0200000000030f1c2936424f5c6975828f9ca8b5ab95897c6f6256493c2f231609000000000713202d3a4653606d7884919ea8b2a99f92867b6e655b50483e342e261e1b1312100c060d060b0f12131a1f252a343d46505a606d7984919ea8b0a69c8f83766a5f5347392e23180c0000000000000000000000000000000000000000000000000006121f2c3945525f6c7885929fabada093867a6d6053473a2d20140700000000000000000000000000000000000000000000000000000000000000000000000001080d11171c1f22272b2d2f3c4855626f7b88939393867a6d6053473a2e2d2a25211f1b15100b0500000000000000000000000000000000000000000000010e1b2734414e5a6774818d9aa7a89b8f8275675d51453c352f2f2e2b2620180f0600000000000000000000000000000000000004101d2935404b55626e7b88949faba89b8e8175685d525c6674808d9aa7ab9f95887c6f62554b4035291d110400000000000000000000000000000000020f1b2835424e5b6875818e9ba8a99c8f8276695c4f4336291c100300000000000000060b0e10111313131313130f0e0c0904000000000000000000000003070b0d0e13131313131312110f0c0701000000000000000000000004080a0b1313131313131308070502000000000000000000000000000000000000000916222e3a46515b62656c6c6c6c6c6c6c6c6c6c74818d9a93867a6d6c6c6c6c6c6c6c6c6c6c6c6c74818e9a9286796d6c6c6c6c6c6c67645c52473c3024170b000f1c2835414e5a6670767979797979798693a0ada6998c8079797979797979797976695e53463a2d2114070000000000000000000b17222d38414d57606d78839099a3aea2988e81756b61554b40342a27333f49535f6a73808d96a1ada49a9184796d60584e42382d22170b03000000000000000000000000000613202c3945515d6776838f9ca9a096877a6e6154474c566774808d9aa9988b7f72655466737f8c99aa998c7f7266544a4854616e7b8796a0a89c8f8275665c5145382c1f1306000000000000000000000000000000000000020b17212935414c56606b73808d95a0a7a09da0a79d938a7e70685e53493f33271e150b0000000000000000000000000000000000000000000000000000000000000000040e1a26313c45515c67707d89939e999083786d60574d42362a1f160c010000000000000000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b00000000030b17222d38424b555d676d78818b9298a0a69f97928880786e69605950483f362d231a0e04000000000000000000000000000000000000000000000000000000000814212e3b4754616e7b8798a3aeaa9d9084776a574d42362a1e12050000000005111d2935414c566a7783909daaafa399877b6e6154483b2e21150800000005111e2a36414c5664707d8a96a1adada1978c7f72695e53493f3628231c140c0a060300000000000306090e1419222b343e45515d67717e8a96a0acab9f94887c6f62544b4034281c100400000000000000000000000000000000000000000000000006121f2c3945525f6c7885929fabada093867a6d6053473a2d2014070000000000000000000000000000000000000000000000000000000000000000000000060b13191c23282b2d3337393b3e4855626f7b88959f93867a6d6053473e3b3a36312e2b26201c170e09030000000000000000000000000000000000000000000c1825323f4b5865727e8b98a6ac9f92857a6d60574d45413f3b3a37312a21180e03000000000000000000000000000000000006131f2c3945515d6774808d9aa6aca096897d7063564c54626f7b88959faba79a8d8174675d5145392c20150a00000000000000000000000000000000020e1b2835414e5b6874818e9ba7a89c8f8275695c4f4236291c0f030000000000040b12171b1d1e2020202020201c1b19150f09020000000000000001080e13171a1a2020202020201f1e1b18130c050000000000000000050c11141717202020202020201514120e0903000000000000000000000000000000000006121e29343f4951565860606060606060606064717e8b979a897d70636060606060606060606065717e8b9899897c6f6360606060605a58524a41362b1f1408000d1925323d49545e66696c6c6c6c6d7a8693a0ada6998c80736c6c6c6c6c6c6c6c6c5e574d42362a1e12050000000000000000040f1b27333f49535f69727f8c95a0aba79f92857b6e61594f43392f22222d38414e58606d7984919ea6aca0958c80736a5f544a3f33281f1409000000000000000000000000000714202d3a4753606d7a86929faa9d918477685e52464a5764707d8a99a49b8f8275655c6676828f9ca298897c6f62564946525e697784919eaa9f9285796d6053463a2d2013090000000000000000000000000000000000000a141d29333b45525d68707d87939fa69f959095a0a59e92857a6e655b50443c30271d120700000000000000000000000000000000000000000000000000000000000000000915202834404b55606b75818e97a0958c7f72695e52463e31281d12070000000000000000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b000000000006111c262f3a434b555d666d747f8691969ea5a19a938d827b706b615a50483f352b20160c020000000000000000000000000000000000000000000000000000000713202d3a4653606d7986929facab9f928578695e52463a2d201407000000000713202d3946525d687885929eabac9f9286796d6053463a2d2013070000000714202d3946525e6876828f9ca8b2ab9e9185796d60574d41382d2417110a02000000000000000000000002091019222935404b55606c7884919dabb0a69a8e8174665c5145382c1f130600000000000000000000000000000000000000000000000006121f2c3945525f6c7885929fabada093867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000000020a11171e24292e34383a3f4446484b4d55626f7b8895a093867a6d60534d4a4846423c3b37322d28221a150e0600000000000000000000000000000000000000000815222f3b4855626e7b88949faba2988b7f72695f57514c4c4847423c332a20150900000000000000000000000000000000000714202d3a4753606d7985929fabab9e9184786c605346535f6a7683909daaab9f92857a6d6053473d32271b0f01000000000000000000000000000000010e1b2834414e5b6774818e9aa7a89b8e8275685b4f4235281c0f0200000000050e161d23272a2b2d2d2d2d2d2d282825201b140c030000000000020b12191f2326272d2d2d2d2d2d2b2b28241e170f060000000000000810171c2123242d2d2d2d2d2d2d22211e1a140e0600000000000000000000000000000000010d18232d373f464a4c535353535353535355626e7b8897998c7f736659535353535353535355626f7b8898988c7f726559535353534e4c4741382f241a0e03000915212c38424c545a5c606060606d7a8693a0ada6998c807366606060606060605f534d453b31251a0e0200000000000000040e1a242b3744505b656e7b86929fa7ab9f958b7f72695e52473e31271d1b262f3c45515d67707d8a949eaaa89f92877c6f665b50443b31251a0e040000000000000000000000000a1724303d4a5763707d8a99a3a79a8e817467564c414754606d7a86939f9e9285796c606d7985929f9f9285796d605346424d576774818e9aa7a298897d706356493d30251a0e020000000000000000000000000000000006111c262f3b45505a606d7a849199a49f9490849096a1a1978f82776c60584e43392e23180e0400000000000000000000000000000000000000000000000000000000000000030c18232e39434f59616d7a85929f9f92867b6e61594f43392f24180b0200000000000000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b0000000000000a141d28313a434b545c606d727c848e939fa2a49f9490857d716c625a50473d32281e130800000000000000000000000000000000000000000000000000000006121f2b3844505c667784909daaaea298877b6e6154483b2e21150a000000000714212e3a4754616d7a8797a1adaa9e918477665c5145382c1f13060000000814212e3b4754616e7a87939facafa3998c7f72675d51453b2f261b1206000000000000000000000000000000071018242f3944505b66727e8b99a3aeac9f9285796d6053463a2d20130800000000000000000000000000000000000000000000000006121f2c3945525f6c7885929fabada093867a6d6053473a2d2014070000000000000000000000000000000000000000000000000000000000000000040b141b22272f35383f444649505355585a5c626f7b8895a093867a6d605b5a5754534d4947433c39332b261f180f09000000000000000000000000000000000000000814212e3a47535f697683909ca5aa9f92857b6e69605d555855534d453c31261a0e0200000000000000000000000000000006131f2b37434e5865717e8b97a2ada3998c7f72655b50444e5865717e8b98a2aea2988b7e7165584e43372b1e1308000000000000000000000000000000010e1a2734414d5a6774808d9aa7a89b8e8175685b4e4235281b0f02000000040e1720282e3336373939393939393534312c251e150c02000000010b141d242b3033343939393939393837342f2921180f050000000008121a22282d3031393939393939392e2d2b261f180f060000000000000000000000000000000007111b252d343a3e3f4646464646464647535f697885929c8f827569574d4246464646464653606c7985929b8e827568564d424646413f3c362f261d1308000005101b26303a42494e4f535353606d7a8693a0ada6998c807366595353535353534846423b33291f140900000000000000020c16202a36424d57606c77829098a3aea3999083786c60564d42352c1f15141d2935404b55616c75828f98a2aea3999083786c60574d42362a20160c020000000000000000000005121e2a36424d576774808d9aaba8978a7e7164574b3e45525d687783909da297887c6f626f7c8998a29c8f8276665c50443e4b5764717e8a97a8aa9a8d807367574d42362a1e1205000000000000000000000000000000030d17222d38424d57616c75818e96a1a39890827a84919ea59f948b7f726a5f554b40342820160c020000000000000000000000000000000000000000000000000000000000000007121d27303d46525e68717e8b949f988f82756c61554b4035291d140a00000000000000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b000000000000020b161f28313a424a515b626a6f7a818b9298a0a69f9792877e716c62594f443a3025190d03000000000000000000000000000000000000000000000000000003101c28343f4a546875818e9ba8b3aa978a7d7064574a3d32271b0d04000001081623303d495663707c8996a9b3a89c8f827569544b4034281c10040000030f1b27333f495364717e8b9aa4afac9f92867a6e61554b4033291d140a000000000000000000000000000000000007121d28333f4a54616d7a86929facaea298897d706356493d2f24190d01000000000000000000000000000000000000000000000006121f2c3945525f6c7885929fabada093867a6d6053473a2d20140700000000000000000000000000000000000000000000000000000000000000050d161d262d333a41454a5053535b60626467686a6f7b8895a093867a6d6a686664615e5755534e49443e37312a211a120a01000000000000000000000000000000000006121e2b37424d5763707d89939ea6a29891847b736d676665625f574d42372b1e12060000000000000000000000000000000815212e3b47535f6a7683909da9ac9f92867b6e6153493f4753606d7a85929facaa9d9083776a6054473a2f24190d010000000000000000000000000000010d1a2734404d5a6773808d9aa6a79b8e8174685b4e4135281b0e020000000b16202932393f434446464646464642413d3730271e140900000008121d262f363c3f414646464646464544403a332b21170c01000005101a242c33393c3e464646464646463b3a37312a21180e030000000000000000000000000000000009131b23292e313239393939393937424d576975828f9c928578695f53473a3939393844505b6676838f9c918478695e52463a393433302b241d140b010000000a141e2830383d4143464753606d7a8693aab4a6998d8073665a4d46464646463b3a36312921170d030000000000000008131e28323a46525e69727e8b949faaa89f92877c6f665b50443b30231a0d0b18242f3943505a616e7b86929fa8ab9f958b7f72695e53463e32281e1308000000000000000000000714212d3a46535e697784919eaaa196877b6e6154483b414c566673808d99a9988b7f7266727f8c99aa998c7f7266544a3f3b4754616e7b8796a0aa9d908477695e52463a2d2014060000000000000000000000000000010b151f28333f4a545e69717e8a939ea79f92867b707d89939ea69f92867c6f675c51453d32281e130800000000000000000000000000000000000000000000000000000000000000000b151e2a36414c56606c778390999e938a7d70675d51453c2f261b1106000000000000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b00000000000000040d161f2830394044515860676d757e8691969fa7a19992887e716b60564c4135291f15090000000000000000000000000000000000000000000000000000000b17232e3f4b5865727e8b98a8b2a69a8d807367584e43372b1f15100c090e131e2a36414c5666727f8c99a5b3aa998c7f7366594c402e23180c00000005121f2b3744505b6575818e9bacb6a99c8f8276685e5243392f21170b020000000000000000000000000000000000010b17222d3846525d6875828f9ca8b4aa9a8d807367564c4135291d1104000000000000000000000000000000000000000000000006121f2c3945525f6c7885929fabada093867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000000050e171f282f383f444c51545c6063656c6e71747576787c8895a093867978777573716e6967625f58555047423c332c241c130a0000000000000000000000000000000000020e1a26313c4854606b74818e949da5a09691857f7a7673726e695f53473a2e211408000000000000000000000000000004111d2935414c55626f7c88959faba99b8f8275685e52413845515d6774818e9ba7aca095897c6f62564c4135291d11040000000000000000000000000000000d1a2733404d5a6673808d99a6a79a8e8174675b4e4134281b0e01000006121d28323b444b4f515353535353534f4d48423930251b0f0400030e19242f3840474c4d53535353535352504c453d33291e130700000c17222c363e45494a535353535353534846423c332a1f140900000000000000000000000000000000010911181e2225252d2d2d2d2d2631404c5966737f8c9997887b6e6255483b2f2d28333f4a546673808d9996877a6e6154473b2e2726241f1a130b0200000000020c161e262c3235363a4653606d798698a3aea79a8d81746753493f36393a3c3a38342f271f150b01000000000000030d1924303a44505a616e7b85929fa6ada1968d80746a5f544a3f32291f110807121d28313e46535f69737f8c95a0aca79f92867b6e615a50443a3025190d040000000000000000000815212e3b4854616e7b8796a0ab9e918478695e53463a3d4a5663707d8999a39b8e82756675828f9ca298897c6f6256493c3a46525e697784919daaa095877b6e6154483b2e23170c000000000000000000000000000007121d27313944505b666e7b85929fa5a0958c7f726b75818e97a1a3989083796d60594f443a3025190f0600000000000000000000000000000000000000000000000000000000000000030c1925303a44505b656f7c87929f9e9184796d60584e41382d22170b020000000000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b0000000000000000040d161e272e343f464e555d606c717c8490959fa7a39a92877d70685e52463c31261a0e0000000000000000000000000000000000000000000000000000000615222f3c4855626f7b8896a0acaa9d9184776a6054473c31271f1c181b1a1e242d3946525e6876838f9ca9aea298897c706356493d302316070000000613202d394653606c7885929eabb3a9988b7f7265564c4131271d0f050000000000000000000000000000000000000006111c2935414c5665727f8b98aab4aa9d918477685d5245392c201306000000000000000000000000000000000000000000000006121f2c3945525f6c7885929fabada093867a6d6053473a2d2014070000000000000000000000000000000000000000000000000000000000040e172029313a414950555d60666d7075797b7e8082838486929fac9f9286858382807d7b77736f6a64615a534d453e362d251c120900000000000000000000000000000000000915202c38444f59606d79828e939c9fa097928c8683807f7b6e6255483b2f22150800000000000000000000000000000613202c3945515d6774818e9aa7ada1968a7d7063564d4135404b55636f7c8995a0aca79b8e8174685d5245392c20160a0000000000000000000000000000000d1a2633404d596673808c99a6a79a8d8074675a4d4134271a0e0100000b17232e39444d565b5e6060606060605b59534b42372c2015090007131f2b36404a52585a6060606060605e5c574f453a2f24180c0004111c28333e485055576060606060606055534d453c31261a0e020000000000000000000000000000000000070d12161819202020202023303d4a5663707d8999978b7e7164584b3e2f24222d3d4a5764707d8a97978a7d7064574a3d2e231717140e0801000000000000040c141b2125282c3845515c667986929faca89b8f8275655b5046424547484745403931271d12070000000000010b151f2935414c56616c75828f98a2aea69e9184796d60584e42382d20170d00010c161f2a36424d57606d7984919da5aea2988f82756c61564c4135291f160c010000000000000003101c28343f4a5465727e8b98a8a79b8e817468574d42363a4753606d7a86929f9e9285786c7985929f9f9285796d6053463a36424d566774818e9aa7a7988b7e7165544a3f34281c1003000000000000000000000000050e18242f39434e58606c78829097a2a3999083786d616d7a85929ea6a0958d80736b60564c41352921180c030000000000000000000000000000000000000000000000000000000000000008131e27333f49535f6a73808d96a0968d80736a5f53493f33271e14080000000000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b000000000000000000040c151c2328343c434c515a626a6f7a839095a0a9a39992857a6d61574d42372b1b110600000000000000000000000000000000000000000000000000000815212e3a47535f6a7784919eabaca095887c6f62584e4339312c282327262b2f35414c56616d7a86929facab9f9285796d6053463a2d2013070000000815222e3b4855616e7b8897a1adada197887b6e6255483b3022150b0000000000000000000000000000000000000000000d1924303c4855626f7b8898a2aeaca095877a6d6054473a2d211407000000000000000000000000000000000000000000000006121f2c3945525f6c7885929fabada093867a6d6053473a2d20140700000000000000000000000000000000000000000000000000000000020b162029323b434b535b60676d73797d8285888b8d8f90919298a3aea3989291908e8d8a8784807c76706c625f5750483f372d241b10060000000000000000000000000000000003101c27333d45515c676d7981898f939aa29f9992908d8b7f7265584c3f3225190c00000000000000000000000000000714212d3a4754606d7a85929facac9e9184796d6053463b303a4854606b7784919dabac9f92867a6d6054473d32271b0f0200000000000000000000000000000c1926333f4c5966727f8c99a5a69a8d8073675a4d4034271a0d0100020e1b27333f4b565f676a6c6c6c6c6c6c68655d53483d3125190c000b1723303c47525c64676c6c6c6c6c6c6b6861574c4034281b0f030814212d3945505a61646c6c6c6c6c6c6c6c5f574d42372b1e12050000000000000000000000000000000000000106090b0c1313131314212d3a4754606d7a86939a8d817467554b403529212e3a4754616d7a8796998d807366544a3f34281c100303000000000000000000020a1015191c2834404b546b7885929eabab9e9184786c6056534d51545553514b43392f23180c000000000007121d27313945525d68717e8a939eaaaa9e948a7d70675d51463c2f261c0e050000040d1a26313b45515c66707d89939ea9aa9e948a7e71685e52463d31281d12070000000000000006121f2c3844505c6675828f9ba8a9988b7e7165584b3e313945515d677683909ca197887b6f7b8897a29c8f8276665c504438303e4b5764717e8a97a8a89b8e8275665c5044382c1f12060000000000000000000000020c17202935404b555f6a727f8c949fa89f92877c6f665e68717e8a949ea79f93887d70685e52463f332a1e150a00000000000000000000000000000000000000000000000000000000000000020b17222d38414e58606d7984919e9f92877c6f655b50443b3025190c0300000000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b00000000000000000000030b1218222b313a414550585f686d79839097a1aba1978e8174695f5347382d22170b000000000000000000000000000000000000000000000000000006121f2b37434e586673808d99a3afa89b8e81756a5f554b433c38342e3431373a4145525d68737f8c99a3afa79b8e8175675c5145382c1f13060000000a1724303d4a5763707d8a96a9b3ab9e928578695f53473a2e2114030000000000000000000000000000000000000000000813202d394653606c7985929facb1a795897c6f6256493c2f231609000000000000000000000000000000000000000000000006121f2c3945525f6c7885929fabada093867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000a141d28323b444d555d656c717a80858a8e9297979a9b9d9e9fa3aab4aaa39f9e9d9b999796918d88837d766e69615a51493f362d22180b02000000000000000000000000000000000b16212834404b555d676d747d82889297a2a39f9c988b7f7265584c3f3225190c0000000000000000000000000007131f2c38434f5965727e8b98a2aea49a8d8073665c5044382c38434f5965727f8c99a3aea2988b7f7265594f44382c1e130800000000000000000000000000000c1926323f4c5965727f8c98a5a6998d8073665a4d4033271a0d000004101d2a36434f5b677177797979797979756f65594d4134281b0e020d1a26333f4c58646e747979797979797873685c5044372b1e11050a1723303c4955616c717979797979797976695f53463a2d21140700000000000000000000000000000000000000000000000606060613202c3945515d677784909d908377675d5145382c202d3946525e687884919c908376665c5044382c1f120600000000000000000000000005090c18232e43505d6a7683909da9ada196897d7068615f575d6062605c554b4034291c1004000000030c18242f39434f59606d7a85919ea6aea2988f82756c61554b40342a1d140a0000000009141f2834404b54606b75818e97a2ada69e92857a6d61594f43392f24180c030000000000000713202d3a4653606d7985929faba197887b6e6155483b2e35404b556673808c99a9978b7e717e8b97a9998c7f7266544a3f342e3b4754616e7a8795a0ab9f9285796d6053463a2d201308000000000000000000000008131e29323a45515d676f7c87929fa6a0968d80736a5f56616c75828f98a2a49a91857a6d615a50453c30261c11060000000000000000000000000000000000000000000000000000000000000006111b262f3c45515d67707d8a939e999083776c60564c41362a1e150b00000000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b0000000000000000000000000710191f282f353f464e565d676e7a85929ea6a99f93877b6e6253493f33271b0f0300000000000000000000000000000000000000000000000000030f1a26313c4854616e7b87929faaac9f92877c6f675d554e46454041414142474c515b606d7a85929eabaca095897d7063554b4034281c10040000000c1926323f4c5965727f8c98a5b2a99c8f837669574d42372b1e120600000000000000000000000000000000000000000006121f2b3844505b667783909daab1a4978b7e7164584b3e3125180b000000000000000000000000000000000000000000000006121f2c3945525f6c7885929fabada093867a6d6053473a2d20140700000000000000000000000000000000000000000000000000000006111b262f3a444d565e676d777e858d91979b9ea2a9a7a8a5a4a4a6acb3aba5a3a4a5a7a6a8a09d9a95908a827b716c635b51483f342a1d140a0000000000000000000000000000000006111c262f3b444d575e666d72797e85929faba8a5988b7f7265584c3f3225190c000000000000000000000000000a15222f3b4854606b7783909daaac9f93877b6e61544a3f3428323d4754616d7a86929facaa9d9184776b6054483a3025190d00000000000000000000000000000c1925323f4c5865727f8b98a5a6998c807366594d4033261a0d000004111e2b3744515e6a77848686868686868175685b4f4235281c0f020e1a2734414d5a67748086868686868685786b5e5245382b1f12050b1724313e4a5764717e868686868686867b6e6155483b2e221508000000000000000000000000000000000000000000000000000004111d2935414c556774818e9a92867a6d6053473a2d202a36414c566875818e9b9285796d6053463a2d2013070000000000000000000000000000071a2734414d5a6774808d9aa9b2a89d91837a726e696c676d6f6d675c5145382c1f13060000000b151e2935404b55606b74818e97a1ada79f92867b6e615a50433a2f22190b0200000000030c18232e39424f59616e7a85929fa7ada1978e81746b60554b4035291e150a000000000000091623303c4956636f7c8997a2ab9e918578695f53463a2d2f3c4956636f7c8998a29a8e8174818d9aa298897c6f6256493c2e2d3946525e687784919daaa297897c6f6356493c3025190d01000000000000000000060f1925303a444f59606d79839199a3a49a9184796d6058505a616e7b86929fa7a1978f81756c62574d42382e23170d04000000000000000000000000000000000000000000000000000000000000000a141d2935404b55616b75818e989f958b7e72685e52463d30271d1207000000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b00000000000000000000000000070d161e2429343c444c555e68707d8a949faba49a8d8174655b5044372b1f120500000000000000000000000000000000000000000000000000000a15212d3a46535e6975818e98a3aea3999083796d675f5853514b4e4e4e4d53555d606d74818e97a1ada69d9083776b605443392e23180c000000000e1b2834414e5b6774818e9aa7b3a79a8d8074675a4d4131261a0e02000000000000000000000000000000000000000000030f1c28333f4a546875818e9ba8b3a6998d8073665a4d4033271a0d000000000000000000000000000000000000000000000006121f2c3945525f6c7885929fabada093867a6d6053473a2d2014070000000000000000000000000000000000000000000000000000000b17222d38414c565e696e79828b91979ea1a9aba8a19e9b9997989ba2aba1999697989b9ea0a8aaa79f9d948f867e726d635a50463c2f261b11060000000000000000000000000000000b17222d38424d565e696e787f858b9297a29f9c98958b7f7265584c3f3225190c00000000000000000000000006111b2935414c56636f7c8995a0aca99c8f8276695f5342382e232d3946525e6875828e9ba8aca095897c6f63564c41362a1b1106000000000000000000000000000c1825323f4b5865727e8b98a5a6998c7f7366594c403326190d000004111e2b3744515e6a778491939393938e8275685b4f4235281c0f020e1a2734414d5a6774808d939393939185786b5e5245382b1f12050b1724313e4a5764717d8a9393939393887b6e6155483b2e2215080000000000000000000000000000000000000000000000000000010d19242f3e4b5865717e8b9899897c6f6356493c302325303f4c5865727f8b9898887c6f6255493c2f22160800000000000000000000000000000b1724313e4a5764717d8a97a1adaca09591847f7b7978797a7c796d6053473a2d201407000007121c27303945515d67707d89939da9aba0958c7f72695e53483e31281d100700000000000007121d27303d46525e68727f8b959faba99e93897d70675d51453d30261c11060000000005111d2935414c566673808c99a9a89b8e817568574d42372b2d3a4653606d7985929f9d90847783909d9f9285796d6053463a2d2a36414c566774818d9aa7a9998d807366564c41362a1e11050000000000000000030c18212a36414c56616b74808d95a0a89f93887d6f675c5146535e69727f8b959fa99e938b7e71695f544a3f34281f160c01000000000000000000000000000000000000000000000000000000000000020b18242f39434f59616e7b85929f9f92857a6e61594f43392e23180c030000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b0000000000000000000000000000040c1319222a323a434d56616c7683909cabac9e9285786c605346392d201306000000000000000000000000000000000000000000000000000005121e2a36424d57616e7b86929fa6aba0958f82796f6a63605c555b5a5b575f62676d747f8c939ea9a99f948a7d7064594f4430271d120700000000101c2936434f5c6976828f9ca9b2a5998c7f7266594c3f3326190900000000000000000000000000000000000000000000000b17222d404d5a6773808d9aa6b3a89b8e8175685b4f4235281c0f000000000000000000000000000000000000000000000000121f2c3945525f6c7885929fabada093867a6d6053473a2d2014070000000000000000000000000000000000000000000000000000030f1b27333f49535d686e7b838f949ea1a9a9a19e9996918e8c8b8b909ba5998f898a8c8e9196999ea1a9a69f98928a7f726c62584e41382d22170b0000000000000000000000000000030f1c28333f4a545e696e7b838c92979f9f99938f8b88877f7265584c3f3225190c0000000000000000000000000b17222d3946525d6875818e9ba7ada1978a7e7164574d4230261c2a36414c5663707d8996a1ada79b8e8175685e5246382d22170b000000000000000000000000000b1825323e4b5865717e8b98a4a5988c7f7265594c3f3226190c000004111e2b3744515e6a7784919d9f9f9b8e8275685b4f4235281c0f020e1a2734414d5a6774808d9a9f9f9e9185786b5e5245382b1f12050b1724313e4a5764717d8a979f9f9f94887b6e6155483b2e2215080000000000000000000000000000000000000000000000000000000815222f3b4855626e7b8897988c7f7265594c3f3025232f3c4956626f7c8998988b7e7265584b3f3024190d01000000000000000000000000000713202d3a4653606d7985929ea6b0a7a096918b8886858687877b6e6154483b2e21150800000c18232e39424e58606d7984919ea5afa4999083786d60574d42362c1f160c00000000000000000b151e2a36414c56606c78839099a4afa59e9184796d60584e42382e23170c000000000713202d3946525d687683909da9a9988b7e7265584b3f31262c3844515c6676828f9c9f93867a86929f9c8f8275665c5044382b25303e4a5764717d8a97a7aa9d908377685e5246392d20140600000000000000000b151e2a333c46525e68707d8a929da8a1968d80746b60554b424d57606c78839099a3a59f92867b6e665c50443d31281e13080000000000000000000000000000000000000000000000000000000000000007121d27313e46525e68727f8b959f978e81756b60554b4034281f15090000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b000000000000000000000000000000010810182028313b44505a64717e8a99a3ada197887c6f6255493c2f2216090000000000000000000000000000000000000000000000000000020e1a25313b46535f69737f8c949fa7a79f948f837c75706d676867676869696e737a818c919ca5aaa1978f82766c6155473d331e150b0000000000101d2a3643505d697683909ca9b1a4978a7e7164574b3e3124180b0000000000000000000000000000000000000000000000061926323f4c5965727f8c98a5b2a89c8f8275695c4f4236291c0f0000000000000000000000000000000000000000000000030d152c3945525f6c7885929fabada093867a6d6053473a2d20140700000000000000000000000000000000000000000000000000010c161f2b3744505b656d7a8490959fa6aaa29f96918c8884817f7e7e8b98a396897d7d7f8184888c91979fa3aaa29f918b7e716a5f53493f33271b0f030000000000000000000000000006121f2b3844505b666e7b8490959ea19d948f87827e7c7a786c605346392d2013060000000000000000000000030f1b27333f4953616d7a86929facab9e9285796d6053463b31201925303a4653606c7884919eabac9f92867a6d6153493f33271b0f030000000000000000000000000b1824313e4b5764717e8a97a4a5988b7f7265584c3f3225190c000004111e2b3744515e6a7784919daaa89b8e8275685b4f4235281c0f020e1a2734414d5a6774808d9aa7ab9e9185786b5e5245382b1f12050b1724313e4a5764717d8a97a4aca194887b6e6155483b2e2215080000000000000000000000000000000000000000000000000000000613202d394653606c7985929b8e827568574d42362a202d3a4653606d7986929b8e817468564c4135291d11040000000000000000000000000006131f2c3845515c67737f8c949fa6ada8a19e989992929299877b6e6154483b2e2115080004101c2834404a54606a73808d96a09fa99f93877c6f665c50453b31241a0d040000000000000000030c1925303b44505b666f7c87939fa99fa1968d80736a60544a3f34281c10030000000714212e3a4754616d7a86939faca197887b6f6255483c2f222834404a5466727f8c99a4998c7f8c99a3998c7f7266544a3f3428212e3a4754616d7a8795a0ac9f93877a6e6154473b2d22170b0000000000000007121c27303c45515b616d7a85919ea4a59e9184796d60594f433b44505b666f7c86929fa7a2989083786d60594f433a2f24190f05000000000000000000000000000000000000000000000000000000000000010b151f2a36414d56606c788390999e93897d70675c51453c31261a0e0400000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b0000000000000000000000000000000000060e161f29323e4753606d7a86929f9fa9988b7e7265584b3f3225180c00000000000000000000000000000000000000000000000000000009141f2a36424d57606d78828f959fa7a69f959087817d79777574747476787b80858e939ca3aaa29892857b6e615a5044352b210c030000000000111e2a3744515d6a7783909daab0a3968a7d7063574a3d3024170a00000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4b1a99c908376695d5043362a1d1000000000000000000000000000000000000000000000010b151f2935414c566c7885929fabada093867a6d6053473a2d20160c0200000000000000000000000000000000000000000000000008131e2935414c56606c77828f96a0a7a8a198928c84807b787572717b8895a0938679717274777b80848d9299a2aaa39f92867c6f655b5044372b1f130800000000000000000000000003101c28343f4a54606c788390969fa79d938e827b75726f6e6c665b5044382b1f1206000000000000000000000005121f2b3744505b65727f8c98a3aea79a8d8074675c5145382c1f131f2b3844505b6673808c99a4aea3988c7f72655b5044372b1f14080000000000000000000000000b1724313e4a5764717d8a97a4a5988b7e7265584b3f3225180c000004111e2b3744515e6a7784919daaa89b8e8275685b4f4235281c0f020e1a2734414d5a6774808d9aa7ab9e9185786b5e5245382b1f12050b1724313e4a5764717d8a97a4aea194887b6e6155483b2e22150800000000000000000000000000000000000000000000000000000005121f2b3744505b6576828f9c918478695e52463a2d202c3845515c667683909d918477685d5245392c2013070000000000000000000000000004101c2834404b55606d78828f949ea1a8a9aaaba39f9f9f94877b6e6154483b2e2115080006121f2c3844515c666f7c879293939393978d80746a60544a3f33291f11080000000000000000000008141e28333f4a54606a74808d979393939392877c6f665c5044382c1f12060000000b1724313e4a5764717d8a99a4ab9e9285796c605346392d20232e3c4955626f7c8897a29e9184919ea298897c6f6256493c2e23202d3946525e687784909daaa49a8b7e7164544a3f33281c0f030000000000040d18232e39424d57626d75828f97a1a99e938a7d70675d51473d333f4a545f6a73808c95a0aa9f958c80736b60554c41352921170b02000000000000000000000000000000000000000000000000000000000000030d1925303b44505b666f7c87929f9e9184796d60574d42372b20160c02000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b000000000000000000000000000000000000040d17202c3945515d67778490939393938c807366594d4033261a0d000000000000000000000000000000000000000000000000000000030e1a26313b44505c666d7a8390959da5a7a099938e898683828181818385888c92979da5a7a09892867d70695e52483e3323190f000000000000111e2b3844515e6b7784919eaaafa396897c706356493d3023160a00000000000000000000000000000000000000000000000b1824313e4b5764717e8a97a4b1aa9d9083776a5d5044372a1d110000000000000000000000000000000000000000000007121d27313945525d687885929fabada093867a6d6053473e32281e13080000000000000000000000000000000000000000000000010d19242f3946525e68727f8c949ea8a8a19691867f79736e6968666f7b8895a093867a6d6568696e737980879298a2aea3999083786c6053463a2f24190d01000000000000000000000006121f2b3844505c66727f8b959fa89f958e81786e69656261605b544a3f33281c0f0300000000000000000000000613202d394653606c7884919daaab9f95887c6f62554b4034281c101c28333f4a54616e7b87939facaa9e9184786c6053463b3025190e0000000000000000000000000a1724313d4a5764707d8a97a3a4988b7e7165584b3e3225180b000004111e2b3744515e6a7784919daaa89b8e8275685b4f4235281c0f020e1a2734414d5a6774808d9aa7ab9e9185786b5e5245382b1f12050b1724313e4a5764717d8a97a4aea194887b6e6155483b2e221508000000000000000000000000000000000000000000000000000000030f1b27333f49536673808c9396877b6e6154483b2e212834404b546774808d9393867a6d6054473a2d21140700000000000000000000000000000c18232e3944505c666d7a828c91969a9c9e9f9f9f9f9e94877b6e6154483b2e211508000713202d3a4653606d798386868686868686857a6d60584e42382e21170d0000000000000000000000020b17222d38424e58606d7a858686868686868683796d6053463a2d201307000006121f2b37434e586774818e9aaba89b8f8275655b5044372b1f202d394653606c7985929fa1969196a19f9285796d6053463a2d201e2a36414c566774818d9aacac9b8e8175665b5044382b1f120600000000010c161f2834404a545f69727e8b949ea9a1978e81756b61554b41352d38424e58606d79839199a4a79f92877d6f675d51453e33291d140a0000000000000000000000000000000000000000000000000000000000000008141f28333f4a545f6a73808d96a0968c8073695f53473e32281e1308000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b0000000000000000000000000000000000000005111d2935404b556976828686868686868174675b4e4134281b0e0100000000000000000000000000000000000000000000000000000009141f28343f4a545e686d7a838e929d9fa7a49f9b9892908e8e8d8e8f9197999ea1a9a29e9590867d706b60574d42362c221108000000000000121f2b3845525e6b7885919eabafa296897c6f6356493c3023160900000000000000000000000000000000000000000000000a1724313d4a5764707d8a97a3b0aa9e9184776b5e5144382b1e11000000000000000000000000000000000000000000030c18242f39434f59606d7a86929facaea194877b6e615a50443a3024190d030000000000000000000000000000000000000000000004111d2935414c55616d7a86929fa6aba19691847c726d66615f57626f7b8895a093867a6d60575f61676d737d86929fa5ab9f958a7d7064554c4135291d110400000000000000000000000713202d3a4653606d7884919ea7a89d9083786d665f57555453504a42382d22170b000000000000000000000005111e2a36414c5663707d8996a0acaa9d9083766a5f5343392e23180c17222d3846535e6976828f9ca9aca096897d7063564d41362a1c110600000000000000000000000a1724303d4a5763707d8a96a3a4978b7e7164584b3e3125180b000004111e2b3744515e6a7784919daaa89b8e8275685b4f4235281c0f020e1a2734414d5a6774808d9aa7ab9e9185786b5e5245382b1f12050b1724313e4a5764717d8a97a4aea194887b6e6155483b2e221508000000000000000000000000000000000000000000000000000000000b17222d3d4a5763707d868686867d7164574a3e3124232e3e4b5764717e868686867d7063564a3d3023170a000000000000000000000000000007121d28343f4a545e686d787f848a8d9091929292929190877b6e6154483b2e2115080006121f2c3844515c666d7779797979797979786d685d52463d30261c0f0500000000000000000000000006111c262f3c45525d686d7879797979797979776d665c5044382c1f120600000814212e3a47535f6a7884919eaba9988b7f726553493f33271b1f2b3844505b6675828f9ba8a19ea1a89c8f8275665c5044382b1f1925303e4a5764717d8a9aa4ab9e9285796c605346392d2013080000000008131e28313a44515c666e7b86929fa6a69e92857a6d61594f433a2f262f3c45515c666f7c87939fa8a39991847a6d605a50453b2f261c1106000000000000000000000000000000000000000000000000000000000000020b17222d38424e58606d7984919e9f92867b6e625a50443a3024190c030000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b00000000000000000000000000000000000000010d18242f3a4e5a667076797979797979746f64584c4033271a0d01000000000000000000000000000000000000000000000000000000030b17232e38424c565e686d79818990959b9fa2aaa39f9d9b9a9a9b9c9ea1a9a49f9c97928c837b706b60594f453b30241a1000000000000000121f2b3845525e6b7884919eabafa296897c6f6356493c3023160900000000000000000000000000000000000000000000000b1724313e4a5764717d8a97a4b0aa9d9184776a5e5144372b1e110000000000000000000000000000000000000000000a151e2935404b55606b74818e98a3aeb5a89c8f82756c61564c4135291f150b010000000000000000000000000000000000000000000613202c3945515d6773808d98a2aea49991847b6e6a605c545355626f7b8895a093867a6d605353555d606b707d8a939ea9a79c8f8276675d5145392c20130600000000000000000000000a1623303d495663707c8996a1aca096897d70665c544d494746443f382f261c110600000000000000000000000714202d3946525e6875828e9ba8aea2988b7e7165584e4330271d1207111c2a36424d5764717e8a97a1ada89b8f8275685e5246382e23170b00000000000000000000000a1723303d4a5663707d8996a3a4978a7d7164574a3e3124170b000004111e2b3744515e6a7784919daaa89b8e8275685b4f4235281c0f020e1a2734414d5a6774808d9aa7ab9e9185786b5e5245382b1f12050b1724313e4a5764717d8a97a4aea194887b6e6155483b2e221508000000000000000000000000000000000000000000000000000000000616232f3c4855616b7079797979716c6155493c302323303d4955616c7179797979706b6055483c2f2316090000000000000000000000000000000c17232e38424c565e666c72797d808384858686858483817a6d6054473a2d2114070004101c2834404a545c606a6c6c6c6c6c6c6c6b605d564c41342b1e150a00000000000000000000000000000a141d2935414c565d606b6c6c6c6c6c6c6c6a605c544a3f34281c100300000815222f3b4855626e7b8896a1ada297887c6f6255493c2d22171c28333f4a5465727f8b98a9acabaca9988c7f7265544a3f34281c14212e3a4754616d7a86939faca197897c6f6256493c3024190d010000010d19242f3a434f59606d78839098a2a99e948a7e71685e52473e31281d2834404b54606b74808d96a1aba0968e81746c61574d42382d22170b0000000000000000000000000000000000000000000000000000000000000006111c262f3c45515d67707d8a939e988f82766c61564c4135291e150a0000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b000000000000000000000000000000000000000007131d323e49545e66696c6c6c6c6c6c67645c53483c3024180b000000000000000000000000000000000000000000000000000000000006111c26303a444c565e676d747c83898e9298999b9d9e9f9f9f9f9e9d9b999993908b857f786e6960594f473d33291f120800000000000000111e2b3844515e6b7784919eaab0a396897d7063564a3d3023170a00000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1a99d9083766a5d5043372a1d10000000000000000000000000000000000000000006111c26303845515d67707d89939daab4b9aa9e948a7e71685d52463d31271d12070000000000000000000000000000000000000000000714212d3a4754606d7a85929faaab9f93877d6f695f58514b4855626f7b8895a093867a6d6053474b5159616b74818e9ba8ac9f92867a6d6054473a2d21140700000000000000000000000d192633404c5966737f8c99a8aa9d9184776b60544a423c3b3938332d261d140a0000000000000000000000030f1c28333f4a54616e7a86929facac9f92857a6d6053473c3120150b000e1a25313b4653606d7985929eabac9f92867b6e61544a3f34281c100300000000000000000000091623303c4956636f7c8996a2a3978a7d7064574a3d3124170a000004111e2b3744515e6a7784919daaa89b8e8275685b4f4235281c0f020e1a2734414d5a6774808d9aa7ab9e9185786b5e5245382b1f12050b1724313e4a5764717d8a97a4aea194887b6e6155483b2e221508000000000000000000000000000000000000000000000000000000000714202c38444f5961636c6c6c6c64615a5044392d21212d3945505a61646c6c6c6c6360594f44382c20140700000000000000000000000000000006111c26303a444c545b60666d70737677787979787876746d685d5245392c20130700000c18232e39424a51535d606060606060605e54524c433a2f22190c030000000000000000000000000000020b19242f3a434c52545e606060606060605d53504a42382e23170c000004101c2834404b5565727f8b98a89f9f9285796c605346392d201317222d3b4855626e7b8897a19f9f9fa297887c6f6255493c2e231713202d3946525e687784909d9fa9998c7f7366564c4135291d1105000004111d2935414c55606b73808d959f9fa2978f82756c61564c41352c1f18232e39424f59606d7984919ea5a89e938a7e71695e544a3f33281c0f03000000000000000000000000000000000000000000000000000000000000000a141d2935404b55616c75828f989f948a7e71685d52453d30261c110600000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b00000000000000000000000000000000000000000115212d38424c545a5c6060606060605b58534a41362b2014080000000000000000000000000000000000000000000000000000000000000a141e28323a444c555c606b6f777d8185898c8e90919292929291908f8d8a86837e79726d665f574f473d352b20170d0000000000000000111e2a3744515d6a7784909daab0a3978a7d7064574a3d3124170a00000000000000000000000000000000000000000000000c1825323f4b5865727e8b98a5b1a99c8f8276695c504336291d1000000000000000000000000000000000000000020b17232e38424e58606d7984919ea5afafacafa69e92857a6d61594f43392f24180c0300000000000000000000000000000000000000030f1b27333f495364717e8a98a2aca3998d80746b60574e45404855626f7b8895a093867a6d60534740454f59626f7c8896a0aca3998a7d7063574a3d3024170a00000000000000000000020f1b2835424e5b6875818e9ba8a79a8e817467594f4239302e2d2b28221c140b02000000000000000000000006121f2b3844505b66737f8c99a3aea79a8e8174675d5145392c2013030009141f2c3845515c6674808d9aa7afa3998c7f73665c5044382b1f1409000000000000000000000916232f3c4956626f7c8995a2a3968a7d7063574a3d3024170a000004111e2b3744515e6a7784919daaa89b8e8275685b4f4235281c0f020e1a2734414d5a6774808d9aa7ab9e9185786b5e5245382b1f12050b1724313e4a5764717d8a97a4aea194887b6e6155483b2e2215080000000000000000000000000000000000000000000000000000000004101c28333e474f555760606060575550483e33281c1d28333e485055576060606056554f473d33271c1004000000000000000000000000000000000a151e29323a424a50545c606467696b6c6c6c6c6b6967605d564c4135291d1104000007121c2730394044465153535353535353524745413a31281e10070000000000000000000000000000000008131e28313a41454752535353535353535146443f3830261c1106000006131f2c3845515c6775828f939393938f8275665b5044382b1f1214212e3a47535f6a78859193939393939285796d6053463a2d2013111d2935414c566774808d93939393908376685d5246392d20130700000613202c3945515d676f7d87939393939392857b6e615a50443a30231a121d27303d45515d67707d8a939393939392857b6e665b5044382b1f120600000000000000000000000000000000000000000000000000000000000000020b18242f3a43505a616e7b86929f9e92857a6d60594f42382e23170c03000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b00000000000000000000000000000000000000000a15202a343c4347495353535353535353534f4940372c21160a000000000000000000000000000000000000000000000000000000000000020c162029323a434b515960636b7075797c7f82838485868685858382807d7a76726d67605c544d453d352b23190e050000000000000000101d2a3643505d697683909ca9b1a5988b7e7265584b3f3225180700000000000000000000000000000000000000000000000d1a2633404d596673808c99a6b3a89b8f8275685c4f4235291c0f000000000000000000000000000000000000000a141d28343f4a54606a73808d96a0acaca49fa4aca1978e81746b60554b4035291e150a0000000000000000000000000000000000000005121f2b3744505b6574818e9b9ea09f92867b6e61594f453c3c4855626f7b8895a093867a6d6053473a3e47535f6a7784919eaaab988c7f7265594c3f3226190c00000000000000000000030f1c2936424f5c6975828f9ca8a4988b7e7165584b3e302721201f1c17110a020000000000000000000000000613202d394653606c7884919eabaca095897c6f62554b4035291d11040004101c2834404b54626f7c88959fabab9e9184786d6053463b31251a0e000000000000000000000916222f3c4955626f7c8895a2a396897d7063564a3d3023170a000004111e2b3744515e6a7784919daaa89b8e8275685b4f4235281c0f020e1a2734414d5a6774808d9aa7ab9e9185786b5e5245382b1f12050b1724313e4a5764717d8a97a4aea194887b6e6155483b2e22150800000000000000000000000000000000000000000000000000000000000b16212c353e44484a535353534a49443e362c221717222c363e45494b535353534a48443d352c21160b0000000000000000000000000000000000030c1720292f383f444a5053575a5d5e5f5f5f5f5e5d5b54524c443a2f24190d010000000b151e272e34383a4446464646464646453a39352f281f160c0000000000000000000000000000000000010c161f282f35393a4546464646464646443a38342e261e150a0000000713202d3a4653606d79868686868686867f7266544a3f33281c0f121f2b37434e58687581868686868686868275665c5044382b1f120d1925303d4a5764707e868686868686877a6d6154473a2e21140700000714212d3a4754606d7a84868686868686867f71695e52483e32281e110b151e2935414b55616b75818686868686868682796c605346392d201306000000000000000000000000000000000000000000000000000000000000000007131d28313e46525e69727f8c95a0978e81746b60544a3f34281f1409000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b00000000000000000000000000000000000000030f1b26323c464e535560606060606060605f5a52493e33271b0f02000000000000000000000000000000000000000000000000000000000000050e172029313940454f54596063676d70727576787879797878777573706d6865605d55504a423c332b231911070000000000000000000f1c2835424f5b6875818e9ba8b3a6998c807366594d402f23180c00000000000000000000000000000000000000000000010e1b2834414e5b6774818e9aa7b4a79a8e8174675b4e4134281b0e00000000000000000000000000000000000006111b262f3844505c666f7c87929fa8a69f9a939aa4a99d93897d70675d51453c30261c11060000000000000000000000000000000000000613202d394653606c78858b8e9196968f8275695e53473d333c4855626f7b8895a093867a6d6053473a37434e586976828f9ca9a69a8d8073675a4d4034271a0d0000000000000000000003101d293643505c6976838f9ca9a3978a7d7064574a3d31241513120f0b060000000000000000000000000005121e2a36424d5763707d8a96a1acaa9d9083776a6054433a2f24180d0100000c18232e3947535f6a7683909daaada1968a7d7063574d42362a1c12070000000000000000000915222f3c4855626f7b8895a2a396897c706356493d3023160a000004111e2b3744515e6a7784919daaa89b8e8275685b4f4235281c0f020e1a2734414d5a6774808d9aa7ab9e9185786b5e5245382b1f12050b1724313e4a5764717d8a97a4aea194887b6e6155483b2e221508000000000000000000000000000000000000000000000000000000000005101a232c33383c3d464646463e3c39332c241a10101a242c33393d3e464646463d3c38332c231a0f05000000000000000000000000000000000000050e171d262d33383f44464a4d50515253535251504e4745413a32281e130800000000030c151c23282c2d3739393939393939382d2c29241e160d04000000000000000000000000000000000000040d161e24292c2d3839393939393939372d2c28231c150c0300000006131f2c3845515c676d79797979797979726d635742382d22170b0f1a26313c4d59656f7579797979797979757065544a3f34281c10081623303c4955616c707979797979797975685d5246392d20130700000613202c3945515d676d7879797979797979716d62574d42362c20160c030c18242f3a434f59656f7579797979797979766c665b5044382b1f12060000000000000000000000000000000000000000000000000000000000000000010c161f2a36424d57606d788390999f93887c6f665c50443b31251a0d040000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b0000000000000000000000000000000000000006131f2b37434e585f626c6c6c6c6c6c6c6c6c645a4f43372b1e120500000000000000000000000000000000000000000000000000000000000000050e171f272f343d43484f54555c606366686a6b6c6c6c6c6b6a686664615e5653514b4c4841382f21191108000000000000000000000d1a2734404d5a6773808d9aa6b3a89b8e817568554b4034291c100400000000000000000000000000000000000000000005121e2a36424d576976838f9ca9b2a5988c7f7265594c3f3226190c0000000000000000000000000000000000000b17222d38414d57606d78839099a3ab9f948f87939fa8a59e9184796d60584e42382e23170c0300000000000000000000000000000000000613202d394653606c777c7e8184878a8b7e7165574d42352f3c4855626f7b8895a093867a6d6053473a32414e5b6874818e9ba7a79a8d8174675a4e4134271b0e0000000000000000000003101d293643505c6976838f9ca9a396897c706356493d3023160a06030000000000000000000000000000000714202d3a46525e6975828f9ca8aea3988b7f7265584e4331281d130700000007121d2b37434e5865717e8b98a2aea89c8f8275695e5346392e23180c0000000000000000000815222f3b4855626e7b8895a1a295897c6f6256493c2f231609000004111e2b3744515e6a7784919daaa89b8e8275685b4f4235281c0f020e1a2734414d5a6774808d9aa7ab9e9185786b5e5245382b1f12050b1724313e4a5764717d8a97a4aea194887b6e6155483b2e22150800000000000000000000000000000000000000000000000000000000000008111a21282c2f303939393931302d28221a120808121a22282d303139393939302f2c27211a11080000000000000000000000000000000000000000050b141c22282e34383a3d404344454646454543413a39352f2820160c010000000000030b12181c1f202a2d2d2d2d2d2d2d2b21201d19130c040000000000000000000000000000000000000000040c13191d20212b2d2d2d2d2d2d2d2a201f1c17110a030000000004101c2834404b555c606c6c6c6c6c6c6c66635b51462f261c11060a1520313d48535d65686c6c6c6c6c6c6c69655d5442382e23170b0814202d3944505a61646c6c6c6c6c6c6c6b5d564c4135291d1105000004111d2935414c555d606b6c6c6c6c6c6c6c65625a50453b30241a0e040007131d28313e47535d65686c6c6c6c6c6c6c69605b544a3f33281c0f03000000000000000000000000000000000000000000000000000000000000000000040d1a25303b44505c666f7c87939f9a9083786d60574d42362a1f160c0100000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b000000000000000000000000000000000000000815212e3b47535f6a767979797979797979766c5f5346392d2013060000000000000000000000000000000000000000000000000000000000000000050d1925303b444c525f6060606060605d5d5e5f5f5f5f5e5d5c5a6060606060605a58534a41362b201408000000000000000000000c1925323f4c5865727f8b98abb5aa9d908477675c5145382c1f13060000000000000000000000000000000000000000000714212d3a46535f697885929fabb4aa968a7d7063574a3d3024170a0000000000000000000000000000000000040f1b27333f49535f69727f8c95a0aba3998f82808c96a0aca0968d80736a5f544a3f34281f1409000000000000000000000000000000000005121f2b3744505b656c6f7274777a7d807a6e6154473b312f3c4855626f7b8895a093867a6d6053473a35414b556875828e9ba8a69a8d8073675a4d4034271a0d0000000000000000000003101d293643505c6976838f9ca9a296897c6f6356493c302316090000000000000000000000000000000003101c28343f4a54616e7b87929facac9f92867a6d6154473d3221160c01000000000f1b26313c4754606d7a85929facac9f93877b6e61544a4034281c100400000000000000000815212e3b4854616e7b87949f9f95887c6f6255493c2f221609000004111e2b3744515e6a7784919daaa89b8e8275685b4f4235281c0f020e1a2734414d5a6774808d9aa7ab9e9185786b5e5245382b1f12050b1724313e4a5764717d8a97a4aea194887b6e6155483b2e221508000000000000000000000000000000000000000000000000000000000000000810161c2023242d2d2d2d2423211c17100800000810171d2123242d2d2d2d2323201c160f0800000000000000000000000000000000000000000000020a11171c23282c2d31343638393939393836342d2c29241e160d040000000000000000070c1012131e202020202020201f1413110d08010000000000000000000000000000000000000000000001080d1113141f202020202020201e1312100c06000000000000000c18232e39434b51535f606060606060595751493f351d140a000314202c37414b53595b606060606060605c5a544b4230261c110604101c28333e485055576060606060606054524c443a3024190d010000010d19242f3a434c51545e60606060606060585650483f33291f12080000010c161f2c35414b53595b606060606060605c53504a42382d22170b000000000000000000000000000000000000000000000000000000000000000000000009141f28343f4a54606a74808d97a0958c7f72695e53463e31281d130700000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b000000000000000000000000000000000000000916222f3c4955626f7c8686868686868686796c605346392d201306000000000000000000000000000000000000000000000000000000000000000005111e2a36414c565e6c6c6c6c6c6c6c6a675f555353524f5960636c6c6c6c6c6c67645c53483c3024180b00000000000000000000091623303c4956636f7c8999a4afac9f9286796d6053473a2d22170b0000000000000000000000000000000000000000000815222e3b4855616e7b8897a2adaea298887b6e6155483b2e22150800000000000000000000000000000000040e1a242b3744505b656e7b86929fa7a89f92867c7984919ea5a89f92877c6f665c50443c31261a0e0500000000000000000000000000000000030f1b27333f49535b60626568686d70736e685e524639292f3c4855626f7b8895a093867a6d6053473a3a45515d677683909da9a5998c7f7266594c3f3326190c0000000000000000000003101d293643505c6976838f9ca9a296897c6f6356493c302316090000000000000000000000000000000006121f2c3844505c6673808c99a3afa89b8e8175685e5246392d20130400000000000a15202c3945515d6774818e9ba7afa4998d8073665c5144382c1f150900000000000000000814212e3b4754616e7a8793939393887b6f6255483c2f221509000004111e2b3744515e6a7784919daaa89b8e8275685b4f4235281c0f020e1a2734414d5a6774808d9aa7ab9e9185786b5e5245382b1f12050b1724313e4a5764717d8a97a4aea194887b6e6155483b2e2215080000000000000000000000000000000000000000000000000000000000000000050b1014161720202020171614100b0500000000060c1114171820202020171614100b0500000000000000000000000000000000000000000000000000060b11171c1f2024272a2b2c2c2c2c2b2a2821201d19130c0400000000000000000000000406071113131313131313120706040100000000000000000000000000000000000000000000000000000104060712131313131313131107060300000000000000000007121d273039404546525353535353534c4a463f372d230b0200040f1a252f3941484d4e535353535353534f4d494239301e140a00000b17222c363e44494a535353535353534746413a32281e13080000000008131e28313a41454751535353535353534b4a453f362d20170d00000000040d1a232f3941484d4e535353535353535046443f382f261c11060000000000000000000000000000000000000000000000000000000000000000000000030b17232e38424e58606d7a84919e9f92867b6e615a50433a2f24180d01000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b000000000000000000000000000000000000000916222f3c4955626f7c8893939393939386796c605346392d20130600000000000000000000000000000000000000000000000000000000000000000714202d3946525e68767979797979797771675b4f464854606b70797979797979746e64584c4033271a0d010000000000000000000714202d3a4753606d7a86939facaea399897d706353493f33271b0f030000000000000000000000000000000000000004111d2935414c5565717e8b98a9b3ac9f9285786d6053463a2d201307000000000000000000000000000000020c16202a36424d56606c77828f98a3aca0968c8073707d8a939eaaa3999083786d60574d42372b20170d02000000000000000000000000000000000b17222d38414950535558565d616366615e564c41362a2f3c4855626f7b8895a093867a6d6053473e444d57606d7a86929faca9988b7e7165584b3e3225180b0000000000000000000003101d293643505c6976838f9ca9a296897c6f6356493c30231609000000000000000000000000000000000713202d3a4653606d7984919eabaca096897d7063564c4135291d1105000000000004111d2935414b55636f7c8995a0acab9e9185796d6053463c31261a0e00000000000000000714212e3a4754616d7a8686868686867b6e6255483b2f221508000004111e2b3744515e6a7784919daaa89b8e8275685b4f4235281c0f020e1a2734414d5a6774808d9aa7ab9e9185786b5e5245382b1f12050b1724313e4a5764717d8a97a4aea194887b6e6155483b2e221508000000000000000000000000000000000000000000000000000000000000000000000407090a131313130b0a0804000000000000000005080a0b131313130a0907040000000000000000000000000000000000000000000000000000000000060c101213171a1d1e1f20201f1e1d1b1413110d080100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b151e272e34383a464646464646463f3e3a352d251c1100000009131d272f373d40424646464646464642413d3730271e0c02000005101a242c33393c3d464646464646463a3935302820160c0200000000010c161f282f35393a45464646464646463e3d3a342d241b0e05000000000008111d272f373d404246464646464646433938332d261d140a0000000000000000000000000000000000000000000000000000000000000000000000000006111c26303d45515d67717e8a949e988f82756c61554b4035291d1104000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b000000000000000000000000000000000000000916222f3c4955626f7c88959f9f9f9f9386796c605346392d20130600000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a86868686868683776a5d5144495663707d8686868686868074675a4e4134271b0e010000000000000000000613202c3945515d677784909daab4ab9a8d8073655b5044372b1f140a000000000000000000000000000000000000010c13202c3945515d6775828e9ba8b5a89c8f8275665c5044382b1f120600000000000000000000000000000008131e28323a46525e69717e8b949faaa59e9184796d6b75818e98a2aba0958c7f72695f53463f32291e14080000000000000000000000000000000006111b262f383f4446494b4c5254575954524c443b30252f3c4855626f7b8895a093867a6d605347464f565f69727f8b98a3ada197887c6f6255493c2f2216090000000000000000000003101d293643505c6976838f9ca9a296897c6f6356493c3023160900000000000000000000000000000005121e2b37424d5764717d8a97a1adab9e9184786c6053463a3025190d010000000000010d18242f3a4854606b7784919dabada1978a7d7164574d42372b1d1207000000000000000713202d3946525e687679797979797976695f53473a2e211408000004111e2b3744515e6a7784919daaa89b8e8275685b4f4235281c0f020e1a2734414d5a6774808d9aa7ab9e9185786b5e5245382b1f12050b1724313e4a5764717d8a97a4aea194887b6e6155483b2e221508000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000306070a0d10111213131212100e0707040100000000000000000000000000000000000000000000000001040707131313131313130d0c0a0702000000000000000000000000000000000000000000000000000000000000000000000000000000000000030c151d23282c2d3939393939393933312e2a231c130a000000020b151d252c313435393939393939393634312c261e150c0000000008111a22282d3031393939393939392e2d29241e160e04000000000000040d161e24292c2d383939393939393932312e29221b1209000000000000000b151d252c31343539393939393939362d2b28221c140b0200000000000000000000000000000000000000000000000000000000000000000000000000000a141e2935414c55616c75828f9893948a7d70675d5145392c201306000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b000000000000000000000000000000000000000916222f3c4955626f7c8895a2acac9f9386796c605346392d20130600000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a87939393939084776a5d5144495663707c89939393938d8174675a4e4134271b0e0100000000000000000004101d2935404b556773808d9aa9b3ab9e9184786c6053463c2f261b1106000000000000000000000000000000000007131d28333f4a54606d7a86929facb1a7988b7f7265544a3f34281c10030000000000000000000000000000030d1924303a44505a616e7b85929fa6a99e93897d7067616e7b86929fa7a79f92867b6e615a50443b3025190d04000000000000000000000000000000000a141d262d3337393c3f4146474a4d4746413b3229222f3c4855626f7b8895a093867a6d605350535961686e7b85929eaaac9e9285786c605346392d2013060000000000000000000003101d293643505c6976838f9ca9a296897c6f6356493c302316090000000000000000000000000000000714212d3a46535f6976828f9ca9afa3998c7f73655b504437281e13080000000000000007131d2c38434f5965727f8c99a3aea99c8f8276695f5347392e23180c0000000000000005111d2a36414c565e6c6c6c6c6c6c6c6c5f574d42372b1e1206000004111e2b3744515e6a7784919daaa89b8e8275685b4f4235281c0f020e1a2734414d5a6774808d9aa7ab9e9185786b5e5245382b1f12050b1724313e4a5764717d8a97a4aea194887b6e6155483b2e221508000000000002080d10121313131313131313070704010000000000000000000000000000000000000000000000000002070b0d0d13131313131313130f0e0c090400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001080d111314202020202020201a1916130d07000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b12181c1f202c2d2d2d2d2d2d2625221e18110a0100000000030b131a202527282d2d2d2d2d2d2d292825211b140c0300000000000810171c2023242d2d2d2d2d2d2d21201d19130c040000000000000000040c13191d20212b2d2d2d2d2d2d2d2524211d1811090000000000000000030b131a202527282d2d2d2d2d2d2d29201f1c17110a02000000000000000000000000000000000000000000000000000000000000000000000000000000020c19242f3a43505a616e7b8686868686847a6d6053473a2d201407000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b000000000000000000000000000000000000000916222f3c4955626f7c8895a2acac9f9386796c605346392d20130600000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a87949f9f9d9084776a5d5144495663707c89969f9f9a8d8174675a4e4134271b0e01000000000000000000010d18242f3d495663707c8997a1adaca196897d7063584e41382d22170f06000000000000000000000000000000071118242f3844505b66717e8b98a2aeaca095887b6e6155483b2e23170b0000000000000000000000000000010b151f2935414c56616c75828f97a2ada2978e81756b605e69727f8c95a0aca2988f82766c62564c41362a1f160c01000000000000000000000000000000020b141b22272b2d2f3035393a3d403b3936302920232f3c4855626f7b8895a093867a6d60545c60636b707a839197a1ada49a8e8175655b5044372b1f12050000000000000000000003101d293643505c6976838f9ca9a296897c6f6356493c30231609000000000000000000000000000004101c2834404b55616e7b87939facac9f92867b6e6153493f3327160c0200000000000000010f1b27323d4754616d7a86929facac9f93877b6e61554b4034281c1004000000000000010d1925303a444c525f60606060606055534d453c31261a0e02000004111e2b3744515e6a7784919daaa89b8e8275685b4f4235281c0f020e1a2734414d5a6774808d9aa7ab9e9185786b5e5245382b1f12050b1724313e4a5764717d8a97a4aea194887b6e6155483b2e22150800000000060d14191c1f1f202020202020201413110d080100000000000000000000000000000000000000000001080e1317191a20202020202020201c1b191510090200000000000000000000000000000000000000000000000000010507070b0e101212131312110f0d0a07060400000000000000000000000000000000000000000000000000040c13191d202d2d2d2d2d2d2d2d2625231e19120a01000000000000000000000000000000000000000000000000000000000000000000000000000000000000070c1013131f202020202020191816120d070000000000000002090f14181b1b202020202020201c1b191510090200000000000000050b10141617202020202020201413110d08020000000000000000000001080d1113141e20202020202020181715110c060000000000000000000002090f14181b1b202020202020201d13120f0b0600000000000000000000000000000000000000000000000000000000000000000000000000000000000008131e28313e46535f696e7979797979786d675d5145392c201306000b1825323e4b5865717e8b989f9f9a8d8073675a5a6773808d9a9f9f988b7e7165584b3e3225180b000000000000000000000000000000000000000916222f3c4955626f7c88959f9f9f9f9386796c605346392d20130600000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a8794a1aa9d9084776a5d5144495663707c8996a3a79a8d8174675a4e4134271b0e01000000000000000000000713202d3a4653606d7985929eacb2a89c8f82756a5f53493f332721180f0802000000000000000000000003091119232935404b55606c7884919daab3a99d908477695f53463a2d1c1106000000000000000000000000000007121d27313945525d68717e8a939ea9a69f92857a6d615957606d7883909aa4aa9f948b7e71685e52463e31281e130800000000000000000000000000000000020a11171b1f202224292d2e30332e2d2a25292c2e343c4855626f7b8895a093867a6d6063666d70767d859195a0a9a89f93877c6f6253493f33271b0f030000000000000000000003101d293643505c6976838f9ca9a296897c6f6356493c30231609000000000000000000000000000006131f2c3845515c6773808d9aa4afa99c8f8275695e5241382d2217040000000000000000000a16202d3946525e6875828e9ba8afa49a8d8073675c5145382c1f150a0000000000000008131e28323a4146535353535353534847423c332b23190f04000004111e2b3744515e6a7784919daaa89b8e8275685b4f4235281c0f020e1a2734414d5a6774808d9aa7ab9e9185786b5e5245382b1f12050b1724313e4a5764717d8a97a4aea194887b6e6155483b2e2215080000000810181f25292b2c2d2d2d2d2d2d2d2d201d19130c0400000000000000000000000000000000000000020a12191f2326272d2d2d2d2d2d2d2d292825211b140c030000000000000000000000000000000000000000000003080d111314181b1d1e1f20201f1e1c1a171413100c0701000000000000000000000000000000000000000000040d161e24292c393939393939393933322f2a241c130a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040607131313131313130c0c0906010000000000000000000004080c0e0f131313131313130f0f0c0904000000000000000000000004080a0a131313131313130707050100000000000000000000000000000104060712131313131313130b0b0905010000000000000000000000000004080c0e0f13131313131313100606030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010c161f2a36424d575f616c6c6c6c6c6b605d554b4035291d1104000b1825323e4b5865717e8b939393938d8073675a5a6773808d939393938b7e7165584b3e3225180b000000000000000000000000000000000000000916222f3c4955626f7c8893939393939386796c605346392d20130600000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a8794a1a99d9084776a5d5144495663707c8996a3a79a8d8174675a4e4134271b0e010000000000000000000006121f2c3844505c6673808d9aa4afaa9e94887c6f655b50443d332a2219140e09060400000100000406090e141a232b353d45515d67717e8a95a0acada2978b7e7265574d42362a1e0a0000000000000000000000000000030c18242f39434f59606d7a85919ea5ab9f948b7e71685e52505c666f7c87939fa9a69f92857a6e61594f433a2f24190c030000000000000000000000000000000000060b0f121316191d2021242621272c2f35393a3f444855626f7b8895a093867a6d6d7074797d828a9297a0a7aaa1968e81756a5f5341382d22170b000000000000000000000003101d293643505c6976838f9ca9a296897c6f6356493c3023160900000000000000000000000000000713202d3a4653606d7985929eacada1978a7d7064564d422f261b110600000000000000000005111d2a36414c5663707d8a96a1adac9e9285796d6053463c31261b0f01000000000007131e29333d454c5052535353535353534948443d352b21160b000004111e2b3744515e6a7784919daaa89b8e8275685b4f4235281c0f020e1a2734414d5a6774808d9aa7ab9e9185786b5e5245382b1f12050b1724313e4a5764717d8a97a4aea194887b6e6155483b2e221508000006101a222a3035383939393939393939392c29241e160d040000000000000000000000000000000000000a141c242b2f333439393939393939393534312c261e150c0200000000000000000000000000000000000000060b0f13191d20212427292b2c2c2c2c2b292724201f1d18120f0a04000000000000000000000000000000000000010c1620282f35394646464646464646403f3b352e251c1207000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040d1a26313b454d53555f606060605e53514b433a2f24180d01000b1825323e4b5865717e8686868686868073675a5a6773808686868686867e7165584b3e3225180b000000000000000000000000000000000000000916222f3c4955626f7c8686868686868686796c605346392d20130600000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a87949c9c9c9084776a5d5144495663707c89969c9c9a8d8174675a4e4134271b0e010000000000000000000003101c28343f4a54616e7b87939fabb0a69c9083776c60584e453c342a251e1a1312100c070e070c1013131a1f262a353d47505a606d7984919ea7b1a99f9285796d6053473b31261a0e00000000000000000000000000000a151e2935404b55606b74818e97a1ada3999083776c60564c4a54606b74818e97a1ada2978e81756c61554c4135291e150b00000000000000000000000000000000000000030506080d11131821272c33383a4145474a505356626f7b8895a093867976797d81858a8f949ea1a9a9a29891847a6e61584e432f261b1106000000000000000000000003101d293643505c6976838f9ca9a296897c6f6356493c302316090000000000000000000000000006121f2b37434e5864717e8a97a1adac9e9184796d6053463b3020140a00000000000000000000010d1925303a4653606c7884919eacada1978a7e7164584e43372b1d120700000000000c18242f3a454f575c5e6060606060606056544f473d32271b10040004111e2b3744515e6a7784919daaa89b8e8275685b4f4235281c0f020e1a2734414d5a6774808d9aa7ab9e9185786b5e5245382b1f12050b1724313e4a5764717d8a97a4aea194887b6e6155483b2e22150800020d18222c343b414446464646464646464639352f2820160c010000000000000000000000000000000006101c262e363b3f40464646464646464642413d3730271e14090000000000000000000000000000000000020a11171b1f252a2d2e3134363839393938383633302d2c29241d1b150e09030000000000000000000000000000000008131e28323a414553535353535353534d4b4740372e24190d0200000000000000000000000000000000000000000000000000000000000000000000000000000002080d10121313131313131313131313131313131313131313131313121211100e0b090706040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000306131313131313131308070502000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009141f29333b4246485253535353514745403a31281d130700000b1724313d4a56626c71797979797979736e645858646e73797979797979716c62564a3d3124170b000000000000000000000000000000000000000815212e3b47535f6a767979797979797979766c5f5346392d20130600000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a878f8f8f8f8f84776a5d5144495663707c898f8f8f8f8d8174675a4e4134271b0e0100000000000000000000000c17232e3846535f6975828e99a3afab9f948b7f726a60574e463e36302a25201f1c181b1a1b181c1f20262b31363f474f59616c74808d96a1adada2978d8073675d5145392a1f14090000000000000000000000000006111c26303845515d67707d89939da9a89f92877c6f655b5044424f59616d7a85929ea6a99e938a7d70675d51453d30271d1207000000000000000000000000000000000000000000050d161d242932383d44484c5154545c6063666f7b8895a2998c7f8285898d91979c9fa6aca69f9792867c6f685e52463c311d140a00000000000000000000000003101d293643505c6976838f9ca9a296897c6f6356493c30231609000000000000000000000000000815212e3a47535f6a7683909ca9afa49a8d8073665c5044382c1f1202000000000000000000000008131f2b3844505b6673808c9aa4afa99c9083766a5f5347392f24180d01000000030f1b2834404c5761686b6c6c6c6c6c6c6c6360594f44382c2013070004111e2b3744515e6a7784919daaa89b8e8275685b4f4235281c0f020e1a2734414d5a6774808d9aa7ab9e9185786b5e5245382b1f12050b1724313e4a5764717d8a97a4aea194887b6e6155483b2e2215080008141f2a343e464d5152535353535353535345413a32281e1308000000000000000000000000000000020b18222e3840474c4d53535353535353534f4d49423930261b1004000000000000000000000000000000060b141b22272b3036393a3e414345454646454442403d3a38352f2b27201a140d050000000000000000000000000000010d19242f3a444c525f606060606060605957524940352a1e13070000000000000000000000000000000000000000000000000000000000000000000000000000060d14191c1f1f202020202020202020202020202020202020202020201f1e1e1c1a18161413100c070501000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060c101220202020202020201514120e0903000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030d17212931363a3b4646464646453a39352f281f160c0100000915212e3a45505a62656c6c6c6c6c6c67645c52525c64676c6c6c6c6c6c65625a50453a2e2115090000000000000000000000000000000000000006131f2b37434e585f626c6c6c6c6c6c6c6c6c645a4f43372b1e120500000000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8283838383838174675b4e414855626f7c8283838383827f7265584c3f3225190c00000000000000000000000006111c2a36424d57626e7b87929fa8b0a69f92877c6f695f585046413b36312d2c282327272723282c2d31373b42465159606b717e8a929da8b1a79f92857a6d61554b4035291d1004000000000000000000000000020b17232e38424e58606d7984919ea5aca1968d80736a5f53493f3d46525e68717e8b949faba59e91847a6d60594f43392e23180b0200000000000000000000000000000000000000050f171f282f353d43484f54555d6064666d6f73767c8895a29c918c8f92989a9ea1a9aca8a09d948f857d6f6a60564c41342a200b0200000000000000000000000003101d293643505c6976838f9ca9a296897c6f6356493c3023160900000000000000000000000004101d2935404b55626f7c88949fabac9f93877b6e61544a3f34281c10030000000000000000000000030f1c28333f4a54616e7b87939facab9f94887c6f62554b4035291d100400000005111e2b3744505c68737879797979797979706b6054483b2f2216090004111e2b3744515e6a7784919daaa89b8e8275685b4f4235281c0f020e1a2734414d5a6774808d9aa7ab9e9185786b5e5245382b1f12050b1724313e4a5764717d8a97a4aea194887b6e6155483b2e221508000d1925303b4650585d5f606060606060605f524c443a2f24190d0100000000000000000000000000000a141d2a34404a52585a60606060606060605c59544b42372c21150900000000000000000000000000020a11171d262d33373a4146474b4e505152535352514f4d4a4745403937322a251f170f080000000000000000000000000004111d2935414c565d6c6c6c6c6c6c6c6c66635b52473b2f23160a000000000000000000000000000000000000000000000000000000000000000000000000000810181f25292b2c2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2c2c2b2a29272523201f1c1813110d08020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030a11171c1f2d2d2d2d2d2d2d2d21211e1a140d05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060f171f262a2d2e3939393939382d2c29241d160d0400000005111d29343f485056586060606060605a58524a4a52585a606060606060585650483f34291d110500000000000000000000000000000000000000030f1b26323c464e535560606060606060605f5a52493e33271b0f0200000000000000000000000000000000000000000000000000000000000000000713202c3945525d686d767676767676746f64584c4047535f6a6f767676767676726d62564a3e3125180b000000000000000000000000000e1a26313b47535f6974808d96a0abaea39991857b6e6a615a524c46423c3a38342e3434342e34383a3c42474d535b626b707d86929fa4aeaaa0958b7f72685e5243392f24180d010000000000000000000000000a141d28343f4a54606a73808d96a0aca59e9184796d60584e413835414c56606c77829099a3ada1968d80746b60554b4034281d140a000000000000000000000000000000000000050e172129313940454f54596063676d7175797c808387929faca39c999c9fa2aaabaca49f9c96918a827b6f6b60584e443b3022180e0000000000000000000000000003101d293643505c6976838f9ca9a296897c6f6356493c302316090000000000000000000000000613202c3945515d6774808d9aa6b0a99c8f8276695f5342382e23170c000000000000000000000000000b17222d3846535e6976828f9ca9b0a69a8d8074675d5145392c20150a00000005121f2b3845525e6b7885868686868686867d706356493d3023160a0004111e2b3744515e6a7784919daaa89b8e8275685b4f4235281c0f020e1a2734414d5a6774808d9aa7ab9e9185786b5e5245382b1f07000b1724313e4a5764717d8a97a4aea194887b6e6155483b2e22150800101c2935414d5862696c6c6c6c6c6c6c6c6c5d564c4135291d11040000000000000000000000000006111c262f3c46525c64676c6c6c6c6c6c6c6c68655d54493d3125190c000000000000000000000000030b141b22272f383f44464c5254575a5c5e5f5f5f5f5e5c5a5753514b47433d363129211a120a0100000000000000000000000713202c3945525d687679797979797979736d63574b3f3225190c00000000000000000000000000000000000000000000000000000000000000000000000006101a222a30353839393939393939393939393939393939393939393939393838373634322f2d2c2923201d19130f0a030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030c151c23282c39393939393939392e2d2a251f170f05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060d141a1e21222c2d2d2d2d2b20201d18130c0400000000010c18222d363f454a4b5353535353534d4c474040474c4d5353535353534b4a453f362d22180c0100000000000000000000000000000000000000000a15202a343c4347495353535353535353534f4940372c21160a00000000000000000000000000000000000000000000000000000000000000000004111d2935414c565d6069696969696967645c53483c434e585f6269696969696965625b51463a2e2216090000000000000000000000000009141f2b37424d57606d79849199a4afaba19791847c706c615e56534d494644404141414141404546494d53575f616d727d869298a2aeaca2989083786c60564c4131281d120700000000000000000000000006111b262f3844505c666f7c87929fa8aa9e938a7d70675d51463c2f303a44505b656f7c87929fa8a89f93887d6f675c51453c2f261c110600000000000000000000000000000000030c172029333b434b515960636b70757a7e8285898c909299a3afada7a5a9aaaba39f9c9a93908a847e766e6960594f463c32291e10060000000000000000000003070909101d293643505c6976838f9ca9a296897c6f6356493c302316090000000000000000000000000714202d3a4753606d7985929fabada2978a7e7164574d4230261c11060000000000000000000000000006111c2a36424d5764717e8a97a1adab9f9285796d6053473c32271b0f01000005121f2b3845525e6b7885919393939393897c706356493d3023160a0004111e2b3744515e6a7784919daaa89b8e8275685b4f4235281c0f020e1a2734414d5a6774808d9aa7ab9e9185786b5e52452f24180c000b1724313e4a5764717d8a97a4aea194887b6e6155483b2e22150800121f2b3844515d6974797979797979797976685d5245392c201307000000000000000000000000000b17222d38424e58646e737979797979797979756f65594d4134281b0e0200000000000000000000030c151d262d333d41495053565e616467696b6c6c6c6b6b696663605d55544e46423b332c241c130a01000000000000000000000714212d3a4754606d7a86868686868686807366594d4033261a0d0000000000000000000000000000000000000000000000000000000000000000000000020d18222c343b4144464646464646464646464646464646464646464646464645454443413e3c3a38342f2d29241e1a150f0a040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a151e262e343846464646464646463b3a36312921170d0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003090e1214151f202020201e1413110d070100000000000006111b242d343a3d3e464646464646403f3b36363b3f404646464646463e3d3a342d241b1106000000000000000000000000000000000000000000040e18222a32373b3c464646464646464646433e372e251b1005000000000000000000000000000000000000000000000000000000000000000000010d1924303a444c52545c5c5c5c5c5c5b58534a41363c464e53555c5c5c5c5c5c585651493f34291e120600000000000000000000000000030e1a26313c45515d676f7d87939fa4aea9a19691867e756e68615e575653514a4e4e4d4e4e4b515356575f62696e767f879298a2aaafa49a92867c6f665b50443a301f160c010000000000000000000000000b17222d38414d57606d78839099a3aea2988e81756b61554b40342a27333f49535f6a73808d96a1ada49a9184796d60584e42382d22170b030000000000000000000000000000000b151e29333b454d555d606b6f767d81868a8e9298999d9fa3abb5aca6a8a09e9a9992908c87837e78716c615e574f473d342b20170d000000000000000000040a0f131516191c28333f4a546a7683909da9a296897c6f6356493c30231609000000000000000000000006131f2b37434e5865717e8b97a2adab9f9285796d6053473b3120150a0000000000000000000000000000000e1a25313b4653606d7985929eabaea2988b7e7165584e43372b1e1308000005121f2b3845525e6b7885919e9f9f9f96897c706356493d3023160a0004111e2b3744515e6a7784919daaa89b8f8275685c4f4235291c08000e1a2734414d5a6774808d9aa7ab9e9285786b554b4035291d10040b1724313e4a5764717d8a97a4aea194887b6e6155483b2e22150800131f2c3946525f6c7986868686868686867a6d6054473a2d211407000000000000000000000000030f1c28333f4a545f6a738086868686868686868275685c4f4235291c0f02000000000000000000020c151e272f383f444e535b6063686d7174767878797978777573706d67626058534d453e362e251c130a000000000000000000000714212d3a4754606d7a8793939393938c807366594d4033261a0d000000000000000000000000000000000000000000000000000000000000000000000008141f2a343e464d5152535353535353535353535353535353535353535353535251514f4d4b494745403a3935302b26201b150c070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006111c2630383f4453535353535353534846423b33291f14090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020507081313131313120706040100000000000000000009121b22292e313239393939393934332f2b2b2f333439393939393932312e29221b1209000000000000000000000000000000000000000000000006101820262b2e2f39393939393939393937332c251c1309000000000000000000000000000000000000000000000000000000000000000000000008131e28323a4145475050505050504e4c4841382f343c4347485050505050504c4a463f372d23180d01000000000000000000000000000009151f2935404b55606b727f8b929da4ada9a198928a817a746e696562605c545b5a5a5a5b545c606266696e747b828b9299a2aaaea39f93887e706a5f544a3f32291e0d04000000000000000000000000040f1b27333f49535f69727f8c95a0aba79f92857b6e61594f43392f22222d38414e58606d7984919ea6aca0958c80736a5f544a3f33281f1409000000000000000000000000000007121c27303b454d575e676d747c83898e92989b9fa2aaa9a8aab0aca29a9796918e8a86837f7b76716d66615a524d453d352b22190e050000000000000000070f161b1f222325252b3844505b667784909daaa296897c6f6356493c3023160900000000000000000000000815222e3b4754606a7783909da9b1a79a8d8074675c5145382c1f130300000000000000000000000000000009141f2c3845515c6774808d9aa7b1aa9d9083776a6054473a2f24190d010005121f2b3845525e6b7885919eabaca396897c706356493d3023160a0004111e2b3744515e6a7784919daaa99c8f8376695c50433025190e020e1a2734414d5a6774808d9aa7ac9f928679675d5145392c1f13060b1724313e4a5764717d8a97a4aea194887b6e6155483b2e22150800131f2c3946525f6c7985929393939393877a6d6054473a2d2114070000000000000000000000030d1a232b3844505b666f7c8792939393939392857b6e6154473b2e211408000000000000000000000a141e2730394149505860656c70767a7e818384858686858482807d79746f6a615e57504840372e251c12090000000000000000000714212d3a4754606d7a87939f9f9f998c807366594d4033261a0d00000000000000000000000000000000000000000000000000000000000000000000000d1925303b4650585d5f6060606060606060606060606060606060606060605f5f5e5d5c5a585653514b4746413a37312b262018120b0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c17232e38424a505f606060606060605f534d453b31251a0e02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000911181d2124252d2d2d2d2d2d2726231f1f2326272d2d2d2d2d2d2524211d18110900000000000000000000000000000000000000000000000000060e151b1f21222d2d2d2d2d2d2d2d2d2b27211b130a010000000000000000000000000000000000000000000000000000000000000000000000020c1620283035393a43434343434341403c362f262a32373b3c4343434343433f3e3a342d251b1107000000000000000000000000000000030d18242f3a434f59626d74808d929ca3adaaa29f938e86807b76726f6d6669686767676869666d6f72777b81868f949fa3ababa39f918c7f726c61584e42382d20170d000000000000000000000000040e1a242b3744505b656e7b86929fa7ab9f958b7f72695e52473e31271d1b262f3c45515d67707d8a949eaaa89f92877c6f665b50443b31251a0e04000000000000000000000000000c18232e39424d575e696e79818990959b9fa3aaaaa8a19e9c9ea6a69a908a8784817d7a76726e6964605c545046423b332b23191007000000000000000007101921272c2f30323230394653606c7985929faca295887c6f6255493c2f2216090000000000000000000004111d2935414c56626f7c88959fabab9f95887c6f62554b4034291c100400000000000000000000000000000004101c2834404b55626f7c88959fabab9f95887c6f62564c4135291d11040005121f2b3845525e6b7885919eabaca396897c706356493d3023160a0004111e2b3744515e6a7784919daaaa9d9083776a564c41362a1e11050e1a2734414d5a6774808d9aa7afa399867a6d6053473a2d2014070b1724313e4a5764717d8a97a4aea194887b6e6155483b2e22150800131f2c3946525f6c7985929f9f9f9f93877a6d6054473a2d21140700000000000000000000010b151f2a36414c56606c78839099a39faa9e948b7e71685e5246392d20140700000000000000000006111c263039424a535b606a6f787d82868a8d8f9192929292918f8d8a86817c756e69615a524a40372e241b0f0600000000000000000714212d3a4754606d7a8793a0aca6998c807366594d4033261a0d0000000000000000000000000000000000000000000000000000000000000000000000101c2935414d5862696c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6b6b6a69676562605c5554524c47433c373228231d150c0700000000000000000000000000000000000000000000000000000000000000000000000000000000000003101c28343f4a545c6c6c6c6c6c6c6c6c6c5e574d42362a1e12050000000000000000000000000001070b0f111213131313131313080705020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060c111517182020202020201a1917131317191a202020202020181715110c06000000000000000000000000000000000000000000000000000000040a0f1315162020202020202020201e1b1610090100000000000000000000000000000000000000000000000000000000000000000000000000040e161e24292c2d3636363636363433302b251d20262b2e2f36363636363632312e29231b1309000000000000000000000000000000000007131d28313d47515b606c77808c919ea1a9aea59e98928d87837f7c79777674747474747677797c7f83888e92999fa6aea8a199928b7f736d635a50463c2f261c0e050000000000000000000000020c16202a36424d57606c77829098a3aea3999083786c60564d42352c1f15141d2935404b55616c75828f98a2aea3999083786c60574d42362a20160c02000000000000000000000004101c2834404a545e696e7b838e939d9fa7aca7a09d9996918f949ea4978a7e7b7774716d6865615e5753504a423e363029211911070000000000000000040f19232b32383b3c3f3f3f424b55626e7b8898a2aea894877b6e6154483b2e211508000000000000000000000613202c3945525d6874818e9aa79faa9d9083766a5f5343392f23180c00000000000000000000000000000000000c18232e3947535f6a7683909daa9fa79a8e8174685d5245392c2013060005121f2b3845525e6b7885919e9f9f9f96897c706356493d3023160a0004111e2b3744515e6a7784919daaab9e918578685e5246392d2014070e1b2834414e5b6774818e9aa7b5ab94887b6e6155483b2e2215090b1825313e4b5864717e8b97a4aea194887b6e6155483b2e22150800131f2c3946525f6c7985929facaca093877a6d6054473a2d2114070000000000000000000007121d27313946525e68727f8b959fabaea2988f82766c62564d41362a1e11050000000000000000030d17232e38424a545c656c737c838a8f93999a9c9e9f9f9f9e9e9c9998928e89827b716c635c524940362d22180b02000000000000000714212d3a4754606d7a8793a0ada6998c807366594d4033261a0d0000000000000000000000000000000000000000000000000000000000000000000000121f2b3844515d697479797979797979797979797979797979797979797979797878777674716f6d6764615d56534e47433c342e271e191008000000000000000000000000000000000000000000000000000000000000000000000000000000000006121f2c3844505c66767979797979797976695e53463a2d211407000000000000000000000000050c12171b1d1e202020202020201514120e0903000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000105090b0b1313131313130d0d0b07070b0d0d1313131313130b0b09050100000000000000000000000000000000000000000000000000000000000003060809131313131313131313120f0a0500000000000000000000000000000000000000000000000000000000000000000000000000000000040c13191d2021292929292929282724201a13151b1f21222929292929292525221e181109010000000000000000000000000000000000010c161f2b353f44505b656c747f8a92979ea6acaaa29f9a93908c898684828181808181828486898c90959a9fa3ababa49f9691877e736d635b51473e342a1d140a00000000000000000000000008131e28323a46525e69727e8b949faaa89f92877c6f665b50443b30231a0d0b18242f3943505a616e7b86929fa8ab9f958b7f72695e53463e32281e1308000000000000000000000006121f2c3844515c666e7b8490959da5aba49f9b95908c8884828f9ca09386796e696764605d5654534d46443f38302a251f170f070000000000000000000a16212b353d4348494c4c4c4d525d67727f8c99aaaca096867a6d6053473a2d201407000000000000000000000714212d3a4754606d7a869293939393988b7e7165584e4331271d1207000000000000000000000000000000000007121d2b37434e5865717e8b989393939392867a6d6054473a2d2114070005121f2b3845525e6b7885919393939393897c706356493d3023160a0004111e2b3744515e6a7784919daaada197877a6e6154473b2e23180b0f1b2835424e5b6875818e9ba8b0a3978a7d7064574a3d31261a0d0c1825323f4b5865727e8b98a5aea194887b6e6155483b2e22150800131f2c3946525f6c7985929facada093877a6d6054473a2d211407000000000000000000020b18242f39434f59616e7a85929fa7b0a69f92867b6e615a50443b3025190e0200000000000000010b151f28343f4a545c666d77808890959c9fa4aba8a5a3a2a2a3a5a8aaa39f9b938f867e736e635b52483e342a1d140a000000000000000714212d3a4754606d7a8793a0ada6998c807366594d4033261a0d0000000000000000000000000000000000000000000000000000000000000000000000131f2c3946525f6c79868686868686868686868686868686868686868686868685848482807e7c7975716d68625f58534e454039302a221a1109000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d78868686868686867b6e6154483b2e2115080000000000000000000000060f161d23272a2b2d2d2d2d2d2d2d22211e1a140e060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080d1113141d1d1d1d1d1d1b1a18140f080a0f1215151d1d1d1d1d1d191816120d070000000000000000000000000000000000000000040d192327333f49535b606d737d858f949da0a7acaca49f9c989892918f8e8d8d8d8e8f919298999d9fa7acaca69f99938d847d716c635b51493f352c22180b020000000000000000000000030d1924303a44505a616e7b85929fa6ada1968d80746a5f544a3f32291f110807121d28313e46535f69737f8c95a0aca79f92867b6e615a50443a3025190d0400000000000000000005111e2a36414c56606d78829096a0a7a8a099938e88837f7b787c8895a093867a6d60565754524c4846423b38342e261e1a140d05020000000000000000030f1b27323d474f5456585859575e616d7984919eabaa9e918477675d5145392c201306000000000000000000000c1925323f4c5865727f8686868686868686796d6054473c3121150b010000000000000000000000000000000000000f1b26313c4754606d7986868686868686867f7265584b3f3225180c0005121f2b3845525e6b7885868686868686867d706356493d3023160a0004111e2b3744515e6a7784919daab3a9968a7d7063554b4034281d14111c2935424f5c6875828f9ba8b3a6998c807366584e43372b1f16111926323f4c5965727f8c98a5b5ab94877a6e6154473b2e21140800131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000000000000000a141d2935404b55606b75818e97a2adaa9f948b7e72695e52483e32291f1408000000000000000007121d27313944505c666d78818c939a9fa7a9a29f9b9896959596989b9fa2aaa59e98928a80736e635a50463c2f261b11060000000000000714212d3a4754606d7a8793a0ada6998c807366594d4033261a0d0000000000000000000000000000000000000000000000000000000000000000000000131f2c3946525f6c7985929393939393939393939393939393939393939399929291908f8d8b8985827e7a756f6a625f58514b433c342c231b12090000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d79869393939393877b6e6154483b2e21150800000000000000000000050f1820282f333738393939393939392e2d2b261f180f06000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020608080b0e1011121313121211100d0b0807050200000000000000000000000000000000000000000000000000000000000000000000000000000000010406070a0e10111213131212100e0b080806020000000000000000000000000000000000000000000000000000000000000000000000010407071010101010100e0d0b08030000030608091010101010100c0b09060100000000000000000000000000000000000000000000071017222d384149505b636b707b828990959c9fa4acaca9aaa39f9d9c9b9a9a9a9b9c9d9fa3aaaaababa39f9b948f878079706b625a514940372e231a10060000000000000000000000010b151f2935414c56616c75828f98a2aea69e9184796d60584e42382d20170d00010c161f2a36424d57606d7984919da5aea2988f82756c61564c4135291f160c0100000000000000000713202d3946525e6873808d949fa8a7a0969187817c77726e6f7b8895a093867a6d60534a4745413b3a36312b2823201f1b1714110e090200000000000007131f2c38434f59606365656667696e75808d96a1aca89b8e817568554b4035291d1104000000000000000000000b1824313e4a56626d7279797979797979796d675d5145392c201303000000000000000000000000000000000000000a15202c3945515d676d7979797979797979726d62564a3d3124180b0005111e2b3744505c68737879797979797979706b6054483b2f2216090004111e2b3744515e6a7784919daab4a79a8d8074675c51453a2f26201d1e2b37424d576a7783909daab6a99d9083766a5f53473c3128201e1d27333f49536774808d9aa7aea399877a6d6054473a2d21140700131f2c3946525f6c7985929facada093877a6d6054473a2d211407000000000000000006111b262f3845515d67707d89939ea9aea2988f82776c60574d42362d20170d0200000000000000000c18232f39434f59606d78818e939fa4aaa29f97928e8b898888898b8e92989fa3aaa29f928c80736c61584e41382d22170b0000000000000714212d3a4754606d7a8793a0ada6998c807366594d4033261a0d0604020000000000000000000000000000020506060503000000000000000000000000131f2c3946525f6c7985929f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9fa39f9e9e9d9c9a9898928f8b86817c756f6a605c554e463e352d241b120900000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d7986939f9f9f94877b6e6154483b2e211508000000000000000000010c16202a323a3f4345464646464646463b3a37312a21180e0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000205090e121415181b1d1e1f20201f1f1e1c1a181514120e090502000000000000000000000000000000000000000000000000000000000000000000000001080d111314171a1c1e1f20201f1e1d1b181514120e09040100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006111b262f383f44515961696e757d83898f939a9c9fa2aaa7a8aaa9a7a7a7a7a7a9a9a8a6a9a29e9b99928e88827c746d676059504840372e251c110800000000000000000000000007121d27313945525d68717e8a939eaaaa9e948a7d70675d51463c2f261c0e050000040d1a26313b45515c66707d89939ea9aa9e948a7e71685e52463d31281d120700000000000000000714212e3a4754616d7a86929fa6aaa09590847c756f6a66626f7b8895a093867a6d6053473a3935302d2e3633312e2d2b2722201e19140d0500000000000915222f3b4854606b6f72727273767b818d929da8aca1968a7d7064574a3d2f24180d01000000000000000000000915222e3a46515b62656c6c6c6c6c6c6c6c605d554b4135291d11040000000000000000000000000000000000000004111d2935414b555d606c6c6c6c6c6c6c6c65625b51463a2e22150900030f1b2834404c5761686b6c6c6c6c6c6c6c6360594f44382c2013070004111e2b3744515e6a7784919daab7ab9f9285796d60564c42382f2c292a2d3a47535f697885929fabb8ab9f95887b6e62584e4339312d2a2a2d3744505b6576828f9ca9ac9f928679685d5245392c20130600131f2c3946525f6c7985929facada093877a6d6054473a2d21140700000000000000000b17222d38414e58606d7984919ea5afa79f92867b6e655b50453b30241b0e05000000000000000004101c2934404b55606b73808d939ea5a7a098928c85817e7c7c7c7d7f82868d9299a1a8a49c928b7e716a5f53493f33271c110600000000000714212d3a4754606d7a8793a0ada6998c807366594d4033261a1312110f0b0706040100000000000306070b0f11131312100d0a09070400000000000000131f2c3946525f6c7985929facacacada7a5a5a5a5a5a5a5a5a5a5a5a5a5a5a6a6a7aaa9a7aaa29f9b99928e87827c736d675f584f473f362d241b1007000000000000000000000000000000000000000606060606060606060606060606060606060713202d3a4653606d798693a0aca194877b6e6154483b2e21150800000000000000000007121d28323c444b5051535353535353534846423c332a1f140900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080e11151a1e21222528292b2c2c2c2c2b2b29272522211e1a14120e090200000000000000000000000000000000000000000000000000000000000000050b1013191d20212427292b2c2c2c2c2b2a282522211e1a15110d070100000000000000000000000000000000000000000000000000000000000000000000000406070a0d0f11121313131212100e0c09060603000000000000000000000000000000000000000000000000000000000000000a141d262d3340474f575e616b70777d82878b8f9298989a9b9d9e9e9f9f9f9e9d9d9b999797928e8a86817c766f6a605d554f473e362e251c130a000000000000000000000000030c18242f39434f59606d7a85919ea6aea2988f82756c61554b40342a1d140a0000000009141f2834404b54606b75818e97a2ada69e92857a6d61594f43392f24180c0300000000000004111d2935414c566673808c98a2aea29890837a6f6a625f58626f7b8895a093867a6d6053473a2d30363a3b43403e3b3937332d2d2a251f170e0500000000091623303c4956636f7d7f7f7f8083868e939da4aea59e9184786d6053463a2d201307000000000000000000000006121e29343f49515658606060606060605f54514b433a2f24180d0100000000000000000000000000000000000000010d18242f3a434b51545f60606060606060585651493f34291d120600000c18242f3a454f575c5e6060606060606056544f473d32271b10040004111e2b3744515e6a7784919daab7ada2978b7e71685e544a423c3935363a3f4a54616e7b8898a2aeb5afa79a8d80746a5f554b433d393636393d4653606c7985919eabaa9e9184776b564c4135291d110400131f2c3946525f6c7985929facada093877a6d6054473a2d21140700000000000000030f1b27333f49535f6a73808d96a0acaa9f958c7f72695f53493f33291f120900000000000000000006131f2c3845515c67707d88939fa5a7a09590857f797572706f6f7072757a80869196a1a9a49f92867c6e655b5044382e23170c00000000000714212d3a4754606d7a8793a0ada6998c807366594d4033261f201f1e1b181413110d080100060b101213171c1e1f201e1d1a171613100b050000000000131f2c3946525f6c7985929facb8ada39c9898989898989898989898989898999a9b9d9fa3aaaaacaba39f9a938f8780796f6a615950483f362d22190f050000000000000000000000000000000306071313131313131313131313131313131313131313202d3a4653606d798693a0aca194877b6e6154483b2e2115080906010000000000000b17232f3a444e565c5e6060606060606055534d453c31261a0e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080d14191e20262b2e2f323436383939393938373634322e2d2b26201e1a140e0902000000000000000000000000000000000000000000000000000000040a0f161c1e24292c2d3134363839393939383634322e2d2b26201d18130c060000000000000000000000000000000000000000000000000000000000000001070c10131416191c1d1f1f20201f1e1d1b191613120f0b060000000000000000000000000000000000000000000000000000000000020b141b2227353e454d525960636b70757b7e8285888b8d8f9091929292929191908e8c8a8885817e7a746f6a626058514b433d352d241c130a010000000000000000000000000b151e2935404b55606b74818e97a1ada79f92867b6e615a50433a2f22190b0200000000030c18232e39424f59616e7a85929fa7ada1978e81746b60554b4035291e150a0000000000000713202c3945525d687783909daaab9f92857b6e6860585355626f7b8895a093867a6d6053473a333b4246474f4d4a4846443f3b3a36302920170d020000000e1a2734414d5a6774808b8b8c8d8f92999ea5aca59e938a7e71665c5044382b1f12060000000000000000000000010d18232d373f464a4c53535353535353524745413a31281d130700000000000000000000000000000000000000000007131d28313a41454752535353535353534b4a463f372d23180d01000007131e29333d454c5052535353535353534948443d352b21160b000004111e2b3744515e6a7784919daab1a7a09d92857a6d665b544e474541424648505b66727f8c98aab4aba49f9d92877c6f675d554f4746414146474e58626f7c8997a1ada99c8f8276695c4f432f24190d0100131f2c3946525f6c7985929facada093877a6d6054473a2d211407000000000000030c19232b3744505b656e7c87929fa8aea3989083786c60574d41382d21170d00000000000000000004111d2935414c55606d7984919aa4a9a09590837b726d67656362626365686d737c849197a1aba2989083786c60544a3f34281c1003000000000714212d3a4754606d7a8793a0ada6998c807366594d40332b2c2c2c2b282521201d19130d0a11171c1f2024282b2c2c2b2a272322201c160f0800000000131f2c3946525f6c7985929facb8a79c918c8b8b8b8b8b8b8b8b8b8b8b8b8b8c8d8e909298999da0a7aaaca49f99928d837c706b625a50483e342b21170d03000000000000000000000000060b1012132020202020202020202020202020202020202020202d3a4653606d798693a0aca194877b6e6154483b2e21191815120d0600000000000f1b27333f4b5660686b6c6c6c6c6c6c6c6c5f574d42372b1e12050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040c13191f252a2d31373a3b3e41434445464645454443403e3b3a37312d2a251f1a140d0500000000000000000000000000000000000000000000000000060b151b21272c2f35393a3d414344454646454543413e3b3a37312c29241d17110a03000000000000000000000000000000000000000000000000000000040a0f12181c1f202326282a2b2c2c2c2c2b2a282523201f1c17110f0a03000000000000000000000000000000000000000000000000000000020a1117232c333b42464f54596063696e7276797c7e808283848585868585848382807d7b7975716d68625f58544e45403a312b231b120a0100000000000000000000000007121c27303945515d67707d89939da9aba0958c7f72695e53483e31281d100700060000000007121d27303d46525e68727f8b959faba99e93897d70675d51453d30261c110600000000000714212d3a4754606d7a86939facaa998c8073695e564e4855626f7b8895a093867a6d6053473a3b454d52545c5a57555350494746423b32291f14090000000e1a2734414d5a6774808d98999a9c9fa3aba8a19e938e81756c61544a3f34281c100300000000000000000000000006111b252d343a3e3f46464646464646463a39352f281f160c01000000000000000000000000000000000000000000010c161f282f35393a46464646464646463f3d3a342d251b1106000000010c17212b333a404445464646464646463d3b38322b23190f04000004111e2b3744515e6a7784919daaaca09590958e81786c665f5854524c4d53555a606c7883909daaafa4999390959083796d67605954524c4c525458606a74818e9aa9b3aa998d8073665a4d4033271a080000131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000000000b151e2a36414c56606c77829099a3aea79f92867b6e665b50453b2f261b0f050000000000000000000613202c3945515d67737f8c96a1aca29790837a6e69605d5556555556565d606a6f7b859199a3aa9f948b7e71665c5044382c1f1509000000000714212d3a4754606d7a8793a0ada6998c807366594d4036383939393735322d2c29241e19141c23282b2d3135383939383633302f2c2721191108000000131f2c3946525f6c7985929facb2a5988c7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f80818386888c91959c9ea6acaba39f9591867d716c625a50463d33291f140900000000000000000000020a11171c1f202c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2d3a4653606d798693a0aca194877b6e6154483b2e2c2524221e18110901000000111d2a3743505c6872787979797979797976695f53463a2d21140700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080e161e25293036393c4247484b4e50515253535252514f4d4b4846423c3a36302a251f170f0800000000000000000000000000000000000000000000020a111720262b33383a4145474a4d4f515253535251504e4b4847423c39352f28231c150c05000000000000000000000000000000000000000000000000040a0f161b1d23292c2d303335373839393939383635322f2d2b28221c1b150e090300000000000000000000000000000000000000000000000000000006111a202930363d44484f54565e6165666d6f7174757778787979787877767573716f6d6664605d56534e47433d352f281f19110900000000000000000000000000000c18232e39424e58606d7984919ea5afa4999083786d60574d42362c1f160c1313130c060603000b151e2a36414c56606c78839099a4afa59e9184796d60584e42382e23170c00000000000916232f3c4956626f7c8999a4aea298887b6e62574d444855626f7b8895a093867a6d6053473a424d575e6169666461605b5354524d443b3025190e0200000e1a2734414d5a6774808d9a9f9fa29f9e9d9a96918b81786d605a5042382e23170b000000000000000000000000000009131b23292e313239393939393939392d2c29241d160d040000000000000000000000000000000000000000000000040d161d24292c2d393939393939393932312e29231b13090000000000050f1821292f34373839393939393939302f2c272119110700000004111e2b3744515e6a7784919daaaa9d908490938e81786e6a64605d56575f61646c727f8b95a0acac9f93878390958f82796f6b64615e56565e61646a6f7c87929facaea298897d7063564a3d3023170a0000131f2c3946525f6c7985929facada093877a6d6054473a2d211407000000000007121d27303946525e68717e8b949fababa0958c7f726a5f544a3f332a1d140a000000000000000000000714212d3a4754606d7a85929fa8a89f92857b6e685e57514b4949494a4c52585f696f7d87929faaa69e9184786d6053463c31261a0e020000000714212d3a4754606d7a8793a0ada6998c807366594d40434445464544423e3a39352f2a251e262e34383a3e424446464543403d3c38332b23190f050000131f2c3946525f6c7985929facada093877a7272727272727272727272727273737477797c8084898f949da0a7afa7a09892877e716c61584e453b30251a0d040000000000000000020c141c23282b2d393939393939393939393939393939393939393939393a4653606d798693a0aca194877b6e6154483b393932312e29231b1309000000121e2b3845515e6b7884868686868686867b6e6155483b2e2215080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020a121a202830353b4146474e5355585b5c5e5f5f5f5f5e5e5c5a5855534d4846423b363029211a120a0200000000000000000000000000000000000000030b141b222732373d44484c5254575a5c5e5f5f5f5f5e5d5b5855534d4745413a342e261e170f0700000000000000000000000000000000000000000000060b151b21272c2f34383a3d40424445464646454543413f3c3938332d2b26201a150b06000000000000000000000000000000000000000000000000000000080e171f252a33384851595e6060605c60626567686a6b6b6c6c6c6b6a6a68666462605c6060605f5c574f453a29241d160d07000000000000000000000000000004101c2834404a54606a73808d96a09fa99f93877c6f665c50453b31241a20202020201913120f0b060c1925303b44505b666f7c87939fa99fa1968d80736a60544a3f34281c1003000000000a1724303d4a5763707d8a96abab9f9285796c6053463c4855626f7b8895a093867a6d6053473a46525e696e7673716e6c6567615e564d42362a1e110500000e1a2734414d5a6774808d939393989291908d8a847e746d665c51483e30261c11060000000000000000000000000000010911181e2224252d2d2d2d2d2d2d2c21201d18130c0400000000000000000000000000000000000000000000000000040c13181d20212c2d2d2d2d2d2d2d2524221d18110901000000000000060f171e24282b2b2d2d2d2d2d2d2d2322201b160f070000000005111e2b3844515e6b7784919eaaa4978b7e8491938e827c75716d686b6b696e71767e87929fa7b1a79c8f827b8692948f837c75716e686b6b686d70757c859299a3afaa9f9285796d6053463a2d2013070000131f2c3946525f6c7985929facada093877a6d6054473a2d21140700000000000c18232e39424f59616d7a85929ea6aea3999083786d60574e42382d21180b0200000000000000000007131f2c38434f5965727f8c98a2aca0968b7f72695f564d45403d3c3c3d41454e57606b74808d98a2aca1968a7e7164574d42372b1e12060000000714212d3a4754606d7a8793a0ada6998c807366594d4c5051525352514e4b4745413a36302a30383f44464a4f51525351504d4a48443d352b21160b0000131f2c3946525f6c7985929facada093877a6d656565656565656565656565666768666d6f73777c828990959fa4acaaa299928b7e716a60574d42362a1f160c01000000000000000a141e262e34383a46464646464646464646464646464646464646464646464653606d798693a0aca194877b6e6154484646463f3e3a342d251b11060000121e2b3845515e6b7884919393939393887b6e6155483b2e22150800000000000000000000000000000000000000000000000000000000000000000000000000000000000000020b141c242c323a41464d5254575f626567696b6c6c6c6c6b6a696765615f5754524d46423b332c241c140a020000000000000000000000000000000000030c151d262d333c43474f54565d606467696b6c6c6c6c6b696765615f5754514b443f3830292119100700000000000000000000000000000000000000020a111720262b323839404547494c4f50525253535251504e4c4946443f3837312b262017110a020000000000000000000000000000000000000000000000000000050d141a2136424e59636b6c6c6c6c6b64615a5c5d5e5f5f5f5f5e5e5d5b535b60656c6c6c6c6b6861574c403428130c0400000000000000000000000000000006121f2c3844515c666f7c879293939393978d80746a60544a3f33291f202c2d2d2d2c26201f1c17110a141e28333f4a54606a74808d979393939392877c6f665c5044382c1f1206000000000b1824313e4b5764717e8a97a4aa9e918477655b50443c4855626f7b8895a093867a6d6053473b4754616e7b82807d7b7976746e695e52463a2d20140700000e1a2734414d5a6774808686868686858483807d79716c605c544a40362c1e140a0000000000000000000000000000000000060d12151819202020202020201f1413110d070100000000000000000000000000000000000000000000000000000001070d1113141f20202020202020181815120d06000000000000000000050c13181b1e1f20202020202020161613100b04000000000005111e2b3844515e6b7784919eaaa3978a7d7d8992948f86817d7a797778797b7e838b9299a3afaba0958a7e737f8c94959087827e7a797878797a7d82889297a1abaea3988d8074665c5145382c1f13060000131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000004101c2834404b54606b74818e97a1ada79f92877c6f665c50453c2f261c0f06000000000000000000000915222f3b4854606b7784919eaaab9e9184786d60574d443b352f2f2f30353c454f59616d7a86929faca89d908376695f53473a2d2114080000000714212d3a4754606d7a8793a0ada6998c8073665956595c5e5f5f5f5e5b5854524c46413a333c424a5053575b5e5f5f5e5d5a56544f473d33271c100400131f2c3946525f6c7985929facada093877a6d605858585858585858585858595a545c6062666b6f767c838d939aa3ababa39f92867c6f695e52463e31281d130700000000000006111c2630383f444653535353535353535353535353535353535353535353535353606d798693a0aca194877b6e6154535353534c4a463f372d23180d0100121e2b3845515e6b7884919e9f9f9f94887b6e6155483b2e221508000000000000000000000000000000000000000000000000000000000000000000000000000000000000010b141d262e363e444c52565e61666a6e717476777879797878777673716e6966615e57524d453e362e261c140a00000000000000000000000000000000030c151e272f383f444e54596063686d7074767778797978787674716e6965605d55504a423b332b221910070000000000000000000000000000000000040b141c222832373d43484b515356595b5d5e5f5f5f5f5e5d5b585653504a47433c373127221b140b03000000000000000000000000000000000000000000000000000002091f2c3945525e6b757979797978706c615f57514b525352524b51575f656c71787979797873685c5044372b1e11000000000000000000000000000000000713202d3a4653606d798386868686868686857a6d60584e42382e282b383939393939332d2b28221c140b17222d38424e58606d7a858686868686868683796d6053463a2d201307000000000b1824313e4b5764717e8a97a4ab9e918578665c50443c4855626f7b8895a093867a6d605347424e5865717e8b8d8a888583807b6e6154473b2e21140800000d1a26333f4c58646e74797979797979787774706d66625a514a42392e241a0c020000000000000000000000000000000000000106090b0c131313131313131307060401000000000000000000000000000000000000000000000000000000000000000104060713131313131313130c0b090601000000000000000000000001070c0f1112131313131313130a0907040000000000000005121e2b3845515e6b7884919eaba3968a7d73808d9499928e8a8785848585888b90959fa3abaea3999183786d78828f959a938f8b8786848485878a8e939aa1a9afa59f92867b6e61544b4034281c10040000131f2c3946525f6c7985929facada093877a6d6054473a2d211407000000040e1a242c3845515c66707d89939ea9aba0958c80736a5f544a3f332a1d140a0000000000000000000000091623303c4956636f7c8996a0aca3998b7f72665c50453b32292422222429333d46525d6874808d9aa8ab9f95887b6e6155483b3025190d0100000714212d3a4754606d7a8793a0ada6998c807366606366696b6c6c6c6a6865605d56524c443e454d545c6064686b6c6c6b69666360594f44382c20130700131f2c3946525f6c7985929facada093877a6d60544c4c4c4c4c4c4c4c4c4c4c4d4a5053555960636a6f7980889299a3abaea39891857b6e615a50433a2f24180d0000000000000b17232e38424a50535f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f606d798693a0aca194877b6e615f5f5f5f5f585651493f34291e120600121e2b3845515e6b7884919eabaca194887b6e6155483b2e22150800000000000000000000000000000000000000000000000000000000000000000000000000000000000009131d262f38404850565e61686e73777b7e81838485868685858482807e7b77736e69615e57504840382e261c13090000000000000000000000000000000a151e273039414950585f626b70757a7d808284858686858483817e7b77726d67605c544d453d342b22190f05000000000000000000000000000000040d161d262d333c43474f54555c606366686a6b6c6c6c6c6b69686562605b54534e47423c332d261d150d03000000000000000000000000000000000000000000000000000613202d394653606c7987868686847d756e69605c554f46454f545c60696e777e8586868685786b5f5245382c1f120500000000000000000000000000000006121f2c3844515c666d7779797979797979786d685d52463d302e34384546464646463f3938332d261d18111c262f3c45525d686d7879797979797979776d665c5044382c1f1206000000000a1723303d4a5663707d8996a9ac9f9286796d6053463e4855626f7b8895a093867a6d6053474b54606a76838f9997989290857a6d6053473a2d20140700000b1723303c47525c64676c6c6c6c6c6c6b6a6764605c545044403930271c1208000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005121f2b3845525e6b7885919eaba396897c7078828f949f9b97989291919298979d9fa7aeaaa29f92877d70666d7a8390959f9c97999291919298979b9fa4acaca49f938c7f72695e5342392e23180c000000131f2c3946525f6c7985929facada093877a6d6054473a2d21140b0b0b0b0c16202b37424d57606d7984919da5afa3999083796d60584e42382e21180b020000000000000000000005121e2a36424d576774808d9aa8ac9f92867a6d61544a3f33292018161619212935414c56626f7c8895a0aca7998c807366564c4135291d110500000714212d3a4754606d7a8793a0ada6998c8073656c6f7376777879787775716d68615e5650484d575f666d7175777979787673706b6054483c2f22160900131f2c3946525f6c7985929facada093877a6d6054473f3f3f3f3f3f3f3f3f40403f4446494f545860676d737e879299a3aeaaa1978f82766c61554b4135291d12070000000003101c28343f4a545c6a6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6d798693a0aca194877b6e6c6c6c6c6c6c65625b51463a2e22150900121e2b3845515e6b7884919eabaea194887b6e6155483b2e221508000000000000000000000000000000000000000000000000000000000000000000000000000000000007101b252f38404a525a61686d747b8084888b8e8f919292929291918f8d8b8884807b746e69615a524a40382e251b0f060000000000000000000000000006111c263039424a535b606a6f767d82868a8d8f919292929291908e8b88847f7a726d665e574e463d342b21170b0200000000000000000000000000030c161f282f383f444e54596063676d707375777879797978787674726f6c66625f58534d443f382f271f150d03000000000000000000000000000000000000000000000000000b1825313e4b5864717e889396918a827b736d67615953525960666d737b828b929792877e7064574a3d3124170a0000000000000000000000000000000004101c2834404a545c606a6c6c6c6c6c6c6c6b605d564c413430383f445253535353534c46443f382f2a2119141d2935414c565d606b6c6c6c6c6c6c6c6a605c544a3f34281c1003000000000815222e3b4855616e7b8897a1ada399897d70635a50474855626f7b8895a093867a6d60534c535c666f7c89949faaa29b8e8175675d5145382c1f1306000007131f2b36404a52585a60606060605f5e5d5a5753514b423f342e271e150b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020507080a0d0e10111212131313131211100f0d0b090706040000000000000000000000000000000000000000000000000000000000000000000000000000000000000004101d2935404b556c7885929f9f9f95887c6f6d79828d939a9fa29f9e9e9fa3aaa9a9aba39f98928a7f726b60686d7a838d939a9fa39f9e9e9fa2aaa8a9aba49f9a938c81776c60574d4230271d1207000000131f2c3946525f6c7985929facada093877a6d6054473a2d211818181818181e28323a47535f69737f8c96a0aca89f92877c6f665c51463c30261c0f0600000000000000000000000714212d3a46535e697784919eaaa99c8f8276685e5242382e21170d07080f1924303a47535f6a7784919daaaa9d908377685e5246392d20130700000714212d3a4754606d7a8793a0ada6998c807370787c7f838485868584817e7a746d68615a51575f696e787e828485868483807d7063564a3d3023170a00131f2c3946525f6c7985929facada093877a6d6054473a3232323232323232332e34383a3d43484e555c606c717e87929fa5afa99f948a7e71675d5145392e23180c0000000006121f2b3844505c6674797979797979797979797979797979797979797979797979797979788693a0aca194877b79797979797979726d62564a3e3124180b00121e2b3845515e6b7884919eabaea194887b6e6155483b2e22150800000000000000000000000000000000000000000000000000000000000000000000000000000000030c19222d37404a525c636c717a81868c9196989a9c9e9f9f9f9f9e9d9c9a9895918d86817b716c645c524a40372d21180e030000000000000000000000040e17232e38424a545c656c727c82898f92999a9c9e9f9f9f9f9e9c9a9895908b857f786e6960584e463d33291d140a000000000000000000000000000b151e283139424a50585f626b6f75797d7f828385858686858483817f7c79746f6a625f575049413931271f150b010000000000000000000000000000000000000000000000000a1724303d4956626c717f8b919e948f868079706b615f5d606b6f797f868f949f93887e716c6155493c3023160a00000000000000000000000000000000000c18232e39424a51535d606060606060605e54524c433a2f38424a505e5f6060605f5953504a423b332a251f19242f3a434c52545e606060606060605d53504a42382e23170c00000000000613202d394653606c7985929eabab9b8f82756c615a544e55626f7b8895a093867a6d6053565d656d7983909da6aca0958a7d7064554b4035291d10040000030e19242f3840474c4d53535353535251504d4a464540393028231c150c03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000406090e12141517191b1d1e1f1f2020201f1f1e1d1c1a18161312100c0705020000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3945515d6779869293939393887b6e676d7880878f93999b9d9e9f9f9f9e9c9a99928e867e726d62595e686d7980878e92999a9c9e9f9f9f9e9d9a99938e877f746c655b50453b311e150b00000000131f2c3946525f6c7985929facada093877a6d6054473a2d2424242424242424303a44505a616e7b86929fa8aca0968d80736a60544b40342a1e150a0000000000000000000000000815212e3b4854616e7b8796a0acab988c7f7265564c4130261c0f06000008131e2b37434e586774808d9aa7ac9f93867a6d6154473a2e21140700000714212d3a4754606d7a8793a0ada6998c80747d83898c8f91929292918e8b86807a706c635b5e696e7b838a8e91929291908d86796c5f5346392c201300131f2c3946525f6c7985929facada093877a6d6054473a2d252525252525252623282c2d32383d434b515a616c727f8b939ea9b0a69e91847a6d60544b4034281c10040000000713202d3a4653606d78868686868686868686868686868686868686868686868686868686868a95a1b9ac9f9286868686868686867f7265584c3f3225190c00121e2b3845515e6b7884919eabaea194887b6e6155483b2e221508000000000000000000000000000000000000000000000000000000000000000000000000000000000a151e2b343f49525c646e737e858d92999da0a8a9a29f9d9c9b9c9d9fa2aaa7a09d99928e857e736e645c52493f332a1f140900000000000000000000020c162028343f4a545c666d777f8790949b9fa3aba7a3a2a1a1a2a4a8a7a7a09d97928b837b6f6a60584e453b2f261b1106000000000000000000000007121d273039434b545b606a6f767c8185898c8e90919292929291908e8b8985817c756e69605b534b433931271d12070000000000000000000000000000000000000000000000000815212d3945505a626d727f8b919c98928c847d756e69686d747c838c92989c918b7f726c625a5044392d201408000000000000000000000000000000000007121c2730394044465153535353535353524745413a31343f4a545c6a6c6c6c6c6c66605b544d453f363029201e28313a41454752535353535353535146443f3830261c1106000000000005121f2b3744505b6574818e9ba6aa9e938a7e716c62605857626f7b8895a093867a6d605c60686d77818e95a0aca79d9184786c605346392f24180c0000000008121d262f363c3f414646464646464544413d3a38342e271e18120b03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001070c1013141a1e2121242628292a2b2c2c2d2c2c2c2b2a29272522201f1c1814120e0903000000000000000000000000000000000000000000000000000000000000000000000000000714202d3a4753606d79868686868686867a6d61666d737c82878b8e909192929291908d8a86817b716c625b51565e676d737c81868a8d909192929291908e8a87817c736d605b53493f33291f0c0300000000131f2c3946525f6c7985929facada093877a6d6054473a31313131313131313135414c56616c76828f98a3aea49a9184796d60584e42392e22180c030000000000000000000000000b1825313e4b5864717e8b97a8aea399887c6f6255493c3022140a000000020f1b26323d4a5763707d8a96a8afa4998a7d7064574a3d3124170700000714212d3a4754606d7a8793a0ada6998c80808a9095999c9e9f9f9f9d9b98928d857e736d63616e7b8590959b9e9f9f9e9c9286796c5f5346392c201300131f2c3946525f6c7985929facada093877a6d6054473a2d2119191919191919171c1f20272c30394045505a626d74818e97a1adada1968c7f73665c5145382c1f14090000000713202d3a4653606d798692929292929292929292929292929292929292929292929292929298a3aebaaea399929292929292928b7f7265584c3f3225190c00121e2b3845515e6b7884919eabaea194887b6e6155483b2e22150800000000000000000000000000000000000000000000000000000000000000000000000000000006111c26303d46515b646e74808a92979fa3a9a19e999792908f8f8f909298989d9fa7a39f97928a80736e635b51453b31261a0e0400000000000000000008131e28323a44505c666d78818c92999fa6a9a19e9a9795949596979b9fa2a9a9a29f9590857c6f6a60574d41382d22170b01000000000000000000040d18232e39434b555d666c737c83898e9298999b9d9e9f9f9f9f9e9c9b9897918d88827b736c655d554b43392f24180e05000000000000000000000000000000000000000000000005111d29343e48505a626d727f8c929c9f96918a827b73717a818891959f9d928c7f736d625a50483e33281c10040000000000000000000000000000000000000b151e272e34383a4446464646464646453a39352f2b3844505c66757979797979726c665f575146423b3229251f282f35393a4546464646464646443a38342e261e150a000000000000030f1b27333f4953626f7c89949ea9a59f92877e756f6a6764626f7b8895a093867a6d65676d717a818e939da7a99f958a7e71665b5044382b1d120700000000010b141d242b303334393939393939383734312d2c28231d150c07000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003090e12181d1f20252a2d2e31333536373839393939393838373534322f2d2c2823211e1a140f0b0600000000000000000000000000000000000000000000000000000000000000000000000613202c3945515d67767979797979797976685e5c606a6f757a7e8183858586858483817e7a746e69615a51494c555c606a6f757a7e8183848586858483817e7b756f6a635b504941382d21170d0000000000131f2c3946525f6c7985929facada093877a6d6054473e3e3e3e3e3e3e3e3e3e3e45525d68717e8a949faaa89f93887d6f675d51463d30271d1006000000000000000000000000010e1a2734414d5a6774808d9aa7ac9f9286796d6053463a2d201307000000000a14212e3b4754616e7a8796a1adab998d8073665a4d402f24180c00000714212d3a4754606d7a8793a0adab9f92858d929da0a7aaa39f9e9e9fa2a39f97928a7f736d6975828e97a0a7aaacaaa29f9286796c5f5346392c201300131f2c3946525f6c7985929facada093877a6d6054473a2d21140c0c0c0c0c060c1012131b1e272e343e47515b606d7985919ea7b1a99e9185796d6053463b31251a0e0200000713202d3a4653606d7986939f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9fa3aab4bfb4aba39f9f9f9f9f9f988b7f7265584c3f3225190c00121e2b3845515e6b7884919eabaea194887b6e6155483b2e2215080000000000000000000000000000000000000000000000000000000000000000000000000000000c17232e38424f59626d74808d929ea1a9a39f97918c8885838282838385888b90959ea1a8a29f928d80736d62574d42362a20160a0000000000000000010d1924303a44505a606d78818e939fa3a9a29f97918d8a888788898b8e92979fa2aaa79f9792867c6f695e53493f33271d12070000000000000000010c161f2834404b555d676d78808790949b9fa2a9a29e9c9b9a9a9b9d9fa3a9a19e9a948f877f776d675d554b40352920170d0200000000000000000000000000000000000000000000000c17222d363f48515b636d737f8c929ca09e948f867f7d848d939aa09d938d80736d635b51483e362c22170b00000000000000000000000000000000000000030c151c23282c2d3739393939393939382d2c29242d3a4653606d7987868686867f786e69625b524d443e3530282024292c2d3839393939393939372d2c28231c150c03000000000000000b17222d384854606a75828f97a2aaa399928b827c7773716e6f7b8895a093867a6f7175797e848e939da5aba2979083786c60544a3f33281c0b010000000000020b12191f2326272d2d2d2d2d2c2b2a2724201f1c18120b030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080e151a1d24292c2d31363a3b3d4041434445454646464645444342403e3c3a38342e2d2a261f1b17110a0200000000000000000000000000000000000000000000000000000000000000000004101d2935404b555d6c6c6c6c6c6c6c6c6c5e5651586062686d71747678797978787674716d67615e5750483f434b51585f62686d71747678787978777674716e69625f5851443f382f261b0f050000000000131f2c3946525f6c7985929facada093877a6d60544b4b4b4b4b4b4b4b4b4b4b4b4f59606d7a85929ea6aca1968d80746b60554b40342b1e150b0000000000000000000000000004111d2935414c55697683909ca9aa9d908377665c5144382c1f1206000000000714202d3946525e687884919eaba99c8f827669554b4035291d1004000714212d3a4754606d7a8793a0adada29792979da49f9c97989291919298969a9f9f918c7f726e7b87939fa9b1a7a09d98929286796c5f5346392c201300131f2c3946525f6c7985929facada093877a6d6054473a2d21140700000000000003060a0c151d2328353f45515d67717e8b95a0acada1978b7e7164574d42362a1e120500000713202d3a4653606d798693a0acacacaca49f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9fa0a1a6aeb8b1a9a3a19f9f9f9f9f988b7f7265584c3f3225190c00121e2b3845515e6b7884919eabaea194887b6e6155483b2e221508000000000000000000000000000000000000000000000000000000000000000000000000000003101c28343f4a54606b727f8c929ca4aaa299928c84807b787675757677797b7f838a91969fa6a49c928b7f72695f53463d32271b0f030000000000000005111d2935414c56616c74808d939ea5a7a097928b85807d7b7b7b7c7e81858c9298a0a7a9a29891857b6e655b5044392f24180c000000000000000008131e28313a45515c676d79828d92999fa6a39f9a97928f8e8d8e8e9092989b9fa3a69e99928c82796d675d51453f32291e1408000000000000000000000000000000000000000000000006101b242d363f49515b636d73808d929da49e98928c8a91969fa49e938e81746e645b51493f362d241a10050000000000000000000000000000000000000000030b12181c1f202a2d2d2d2d2d2d2d2b21201d1f2b3844505c66717e879399928c827b726d615e565046413a3229241d20212b2d2d2d2d2d2d2d2a201f1c17110a03000000000000000006111b2c38434e58616e7b859298a2a9a39f948f8984807e7b7a7c8895a194877a7c7e82858b91969ea5aaa29992857b6e665b5042382d22170b0000000000000001080e13171a1a20202020201f1e1d1a171313100c070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050d14191f262b2f35383a3e4246484a4c4e50515252535353525251504f4d4b494644403b3a36312b27221b140b070100000000000000000000000000000000000000000000000000000000000000010d18242f39434b515f606060606060605f524c454e54565e6165686a6b6c6c6c6b696764605d55534d453e363940454e53565d606467696b6c6c6c6b6a6764615e57534e4640332d261d140a000000000000131f2c3946525f6c7985929facada093877a6d605757575757575757575757575754606b74818e97a1ada59e9184796d60594f43392f22190c04000000000000000000000000000613202c3945515d677885929eaba89b8e827568544a4034281c10040000000005111e2a36414c566976838f9ca9ab9e918578675d5145382c1f1306000714212d3a4754606d7a8793a0adb3a9a29fa2a19e948f8b8786858485878a8d92979f93887e727e8b99a4afaba0959088858686796c5f5346392c201300131f2c3946525f6c7985929facada093877a6d6054473a2d211407000000000000000000030b1218232935414b55606c7883909da9b3a99d908377695e53463a2d21140600000713202d3a4653606d798693a5afaca29a979393939393939393939393939393939393939393959ca6b1a99f97949393939393938b7f7265584c3f3225190c00121e2b3845515e6b7884919eabaea194887b6e6155483b2e221508000000000000000000000000000000000000000000000000000000000000000000000000000006121f2c3844505c666f7c87929fa4aba29892878079736f6a6a696869656c6e72777d848f949fa6a49f92867b6e61584e43382b1f1306000000000000000713202d3946525d68717e8a929da5a79f9590857f7974706f6e6e6f7175797f869195a0a7aaa1978f82776c60554b4035291d1004000000000000010d19242f3a43505a606d79828f949fa3a7a099928e898583818181828386898e92999fa7a39f948f82796d605b51443b3025190e02000000000000000000000000000000000000000000000009121b242d373f49525b636e74808d929da5a39f99979ea1a69e948e81786c605c524940372d241b11080000000000000000000000000000000000000000000000070c1012131e202020202020201f1413111c28343f4a54616c717e87939a9490867f766e69615a524c443e352f281f191f202020202020201e1312100c0600000000000000000000000f1b27323d46525e69707d8692979ea5a69e9c95918d8a888786929fac978d87898b8e92979ea1a8a8a09892877e70695f544a3f2f261c110600000000000000000003070b0d0e13131313131312110e0a070604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060e171e252a3137394045474a4d535457595b5c5d5e5f5f605f5f5f5e5d5c5a585553514a4846423b37332d261d18120c040000000000000000000000000000000000000000000000000000000000000007121d283139404553535353535353535346413c43474c5254585b5d5e5f5f5f5e5d5a5754514c46423b332c2e343c43474c5254575a5d5e5f5f5f5e5d5b5754524d47433c3427221b140b02000000000000131f2c3946525f6c7985929facada093877a6d646464646464646464646464646464666f7c88939fa9a89d93897d70675d51473d3129241e160e060000000000000000000000000714212d3a4754606d7a8797a2ada6998c807366594d402e23180c0000000000010d192530414e5a6774818d9aa7ada197867a6d6053473a2d201407000714212d3a4754606d7a8793a0adbcb3ada9a1979289827e7b797878797a7d81858d929992857b818e9babafa49990837c79797b6e6255483b2f22150800131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000000000000000000071118242f3a44505b65717e8b97a2adab9f95877b6e6154483b2e23170c00000713202d3a4653606d7986939ea8a69a908a86868686868686868686868686868686868686868a95a1ada3978d87868686868686867f7265584c3f3225190c00121e2b3845515e6b7884919eabaea194887b6e6155483b2e2215080000000000000000000000000000000000000000000000000000000000000000000000000003101c28343f4a54606d78839099a3afa39992867d736d67625f585c5c535b6061656c707a828f949fa9a2988f82766a6054473b2e22150800000000000005121e2a36424d57616d7a85929ea4a99f9590837b726d66646261626364676d727b839095a0aaa99f948b7e71675d5145382c1f140900000000000004111d2935414c56616c74818e949ea6a69f959087817c79767474747577797d818790959ea5a69e948e81756d62564c41362a1e140800000000000000000000000000000000000000000000000009121b252d374049525c646e74808d939da59f9f9f9fa79f948f82786d665b504a40372e251b1209000000000000000000000000000000000000000000000000000004060711131313131313131207060b17232e3842505a616c717e88939a98928b827b716c615e564f45413a312b22190f13131313131311070603000000000000000000000000000a16212a36424d57606b707d858e939d9fa7a7a09d9a9795989298a3ae9f979495989b9fa2a9aaa29f9691867d706c61574d42382d1d140a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020a1117202930363c42474b515357575e61646668696a6b6c6c6c6c6c6b6b6a68676562605c5455534d46443f382f29241d160d05000000000000000000000000000000000000000000000000000000000000010c161f282f3539464646464646464646393632373a4146474b4e505252535251504e4b4745413a36312921232831373a4145474b4e505152535251504e4b4746423b37312a2217110a0200000000000000131f2c3946525f6c7985929facada093877a71717171717171717171717171717171717883909aa4ada1968e81746b60554e48443d35302820180f0600000000000000000000000915222f3c4855626f7c8895a9b3a4988b7e7165584b3e32251807000000000000081926333f4c5966727f8c99a5b2a995887b6e6255483b2f221508000714212d3a4754606d7a8793a0adbab9ada19792857d76716e696b6b676d70747a808792978e81828f9ca9ac9f93877b6f6a6c6e695f53473a2e21140800131f2c3946525f6c7985929facada093877a6d6054473a2d21140700000000000000000000000007131d27333f4953606d7985929fabb1a7988b7e7265544a3f34281c10030006121f2b3844505c6675818e96a1a4978a7e79797979797979797979797979797979797979788693a0aca194877b79797979797979726d62564a3e3125180b00121e2b3845515e6b7884919eabaea194887b6e6155483b2e2215080000000000000000000000000000000000000000000000000000000000000000000000000006121f2c3844505c66727f8b95a0aba89f92877d706b605d55534e4f4f495053555a61686d79829097a1a49f94897c6f6256493c2f2316090000000000000714212d3a46535e6974818d97a1ada19790837a6e69605c5455545556555c60696e7a839098a2aea69e9184796d6053473b31261a0e0200000000000613202c3945525d68717e8a939da6a89f948f837c746f6c6668676768666d70757c838f939ea7a69e938b7f72685e52463b3025190d0100000000000000000000000000000000000000000000000009131c252e37404a525c606c77818e93939393939393959082796d665c544a3f382e251c1309000000000000000000000000000000000000000000000000000000000000040606060606060605000006111c26303e48505a626c717f88939f9f948f857e756d686159514b433d342b21160a00060606060400000000000000000000000000000000040e1a25303b454f59606b707b818a90959a9ea1a8a6a4aaa39fa3aab4a8a3a1a2a4a8aba49f9c98928c847c706b615a50453b2f261c0b0200000000000000000000000306080909090909090909090909090909090909090909090909090909090909090909090909090909090909090806030000000000000000000000000000020b141c2228323b41464d53555d606468696e70737476777878797979797877767573716f6d6665615f57535049413d352f281f170f06000000000000000000000000000000000000000000000000000000000000040d161d24292c39393939393939392e2d2a272b3036393a3e4143454646454543413e3a39352f2a251f171820262b2f35393a3e4143454546454443413e3b3a36302b2620181006000000000000000000131f2c3946525f6c7985929facb1a4988b7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e808d95a0acab9e91847a6d67625f58544f45413a322a21181006000000000000000000000a1724303d4a5763707d8a96a3b0a3978a7d7064574a3d3124170a0000000000000b1825313e4b5864717e8b97a4b0a3968a7d7063574a3d3024170a000714212d3a4754606d7a8793a0adbcb1a79e92857c706b64615e57555d6063686d747e8692938e86929faca99d908376695f60625f574d42372b1e120600131f2c3946525f6c7985929facada093877a6d6054473a2d211407000000000000000000000000010b17222d3845515d6774818e9aabb5a89c8f8275665c5044382c1f12060003101c28343f4a54606d7a84919ea59f92867b6e666c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6d798693a0aca194877b6e6c6c6c6c6c6c65625b51463a2e22160900121e2b3845515e6b7884919eabaea194887b6e6155483b2e221508000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d7984919ea7ada1968d80736b6059514b474342423f44464850565d676d7a85929b9993908c8275685c4f4235291c0f020000000004101d2935404b55616e7b86929fa9a69e92857a6e685e57514b484848494b51575e686e7b86929fa9ada1968b7e7165574d42362a1e12050000000004111d2935414c55606d7a85929ea5aca0968f82796e6a62605b545a5b545c60636a6e78818f959faba59f92857a6e61564c41362a1e1105000000000000000000000000000000000000000000000000010a131c252e384044505b656c7881868686868686868683796d675d544a42382d261c130a010000000000000000000000000000000000000000000000000000000000000000000000000000000000000a141e2c363e48505a626d727f8b919b9e97928a817a706b605d554e463d32271b0f030000000000000000000000000000000000000000000009141f29333d474f5960696e757d83888d9196979a9b9d9e9fa3aab4aaa29f9e9c9b9999938f8b857f796f6a615950483e33291d140a00000000000000000000040a0f121515161616161616161616161616161616161616161616161616161616161616161616161616161616161515120f0a030000000000000000000000020b141d262d333e444c52575f62676d7174787b7d7f81838485858686868585848382807e7c7976726e6964605b534f454039312921170f06000000000000000000000000000000000000000000000000000000000000040c12181d202d2d2d2d2d2d2d2d21201d1b1e252a2d2e32353738393939383634312d2c29241e1a140d0c151a1e24292c2d31343638393939383734312e2d2a251f1b150e0600000000000000000000131f2c3946525f6c7985929facb8a69b908b8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8d929da7b1a79a8e817b77746f6a636059524c443c332a22180f050000000000000000000b1825313e4b5864717e8b97a4afa295897c6f6256493c2f2316090000000000000a1723303d4a5663707d8996a3b0a4978b7e7164584b3e3125180b000714212d3a4754606d7a8793a0adb8ab9f958a7e716a605954524d4b5154565d616c707d8793989298a3aea79a8d817467575355534d453c31261a0e0200131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000000000000000000000006111b2935404b5564717d8a99a3afac9f9285796d6053463a2d20130700000b17232e3845525d68707d89939da2989083796d6059606060606060606060606060606d798693a0aca194877b6e616060606060585651493f34291e120600121e2b3845515e6b7884919eabaea194887b6e6155483b2e22150802020202020202020202020202020202020202020202020000000000000000000000000004101d2935404b5564717d8a96a1acaa9e9184796d60594f45403937312d3337393e444c555e68717e8b8e8a86837f7c6f6255483c2f221509000000000006131f2c3945515d6774818d99a3ab9f948a7e71685e564d45403c3b3b3c40454d565f69727f8b97a1ada99d908377695f53463a2d211407000000000613202c3945515d6773808d97a1ada69e91847a6d675f5853504a4e4e4b5153585f666d79839099a3ada2978d8174685e5246392d20140900000000000000000000000000000000000000000000000000010a131c2627333f49535b666c757979797979797979776d675d554b42392f261c140a0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000020c1a242d363f48505a626d727f8b919ba29f938e857d746d6760584e43382c1f130700000000000000000000000000000000000000000000030d17212b353d474f575e616b70767c8084878a8d8f90919298a3aea2989291908e8c8986837e79726d6660584f473e362c21170b02000000000000000000060e151b1f21222323232323232323232323232323232323232323232323232323232323232323232323232323232322211f1a150e06000000000000000000000a141d262f383f4450565e61696e74797d8184878a8c8e8f909192929392929291908f8d8b8886837f7b76706c656059514b433b332921170d0400000000000000000000000000000000000000000000000000000000000001070d101320202020202020201413110f13191e202125282a2b2c2c2c2b2a272421201d19130e0903030a0f13191d202124272a2b2c2c2c2b2a282421201e1a140f0a030000000000000000000000131f2c3946525f6c7985929facb8aca29b9897979797979797979797979797979797979a9da4aeb5a99d938e8784817c76706b605d564e463c342a21170b0200000000000000000c1926323f4c5965727f8c98a5aea195887b6e6255483b2f2215080000000000000916232f3c4956626f7c8995a2afa5988b7f7265584c3f3225190c000714212d3a4754606d7a8793a0adb6aa9d9083776c61584f4846424145474c525a616b73808d969fa3aab4a5998c7f7266594c4847423c332a2015090000131f2c3946525f6c7985929facada093877a6d6054473a2d21140700000000000000000000000000000c18242f3a4754606d7a86929facaea298887b6e6255483b2f221508000006111c2935414c56606b74818e96a1a0958d80746b60564c53535353535353535353606d798693a0aca194877b6e6154535353534c4a463f372d23180d0100121e2b3845515e6b7884919eabaea194887b6e6155483b2e22150f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0b0a08040000000000000000000613202c3945515d6775828f9ba8aea3988b7e71675d51473d352f2b2622272b2d323a434c56606d7883817e7a76736f6a5f53473b2e21150800000000000714202d3a4753606d7985929faba89c8f82766c61564c433b342e2e2f2f343b444d57606d7985919eababa095887b6e6155483b2e221508000000000714212d3a4754606d7a85929fa9aa9e94897d70685d554e46443f41414045464e545c676f7c87929faca99f92867a6e6154473c31261a0e0200000000000000000000000000000000000000000000000000010a1417222d38414a545b60686c6c6c6c6c6c6c6c6a605d554c433930271d140a0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008121b242d363f48515b626d727f8c919ca39e97918a81796f6a6054483b2e2215090000000000000000000000000000000000000000000000050f19232b353d454d525961636a6f74787b7d8082838486929fac9f92868483827f7c7a76716d67605c544e463e352c231a0f0600000000000000000006101820262b2e2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2e2b2620181006000000000000000006111b262f38424a505a61686e747b81858a8e919697999b9c9d9e9f9f9f9f9f9e9e9d9b9a9898928f8c87827d78706b605d554d453b33291f160c0100000000000000000000000000000000000000000000000000000000000000010406131313131313131307070502080d111314181b1d1f1f201f1e1d1b181413110d08010000000001080d111314181b1d1e1f201f1e1d1b181414110e090200000000000000000000000000131f2c3946525f6c7985929facb8b4aca6a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a7a9aeaeafafa59d9a96918d88837d746d685f584e463c33291d140a00000000000000000d1a2733404d5a6673808d99a6ada194877a6e6154473b2e2114080000000000000815222f3b4855626e7b8895a1aea6998c807366594d4033261a0d000714212d3a4754606d7a8793a0adb3a9988b7f72655a50463d3a3635393a41465059606d7984919eabb4b2a5988b7f7265584c3f3a37312a21180e030000131f2c3946525f6c7985929facada093877a6d6054473a2d21140700000000000000000000000000000713202c3945525d687783909daab4aa978a7d7064574a3d3124170a0000000d19242f3a444f59606d7984919aa49f93887d70685d5245464646464646464653606d798693a0aca194877b6e6154484646463f3e3a342d251b11070000121e2b3845515e6b7884919eabaea194887b6e6155483b2e221b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b171714110c05000000000000000714202d3a4753606d7a86929facac9f92867a6d60554b403529241d1a171b1f2028313a44515c666d7775716d6866625f584e43372b1f12060000000004101c2834404b5564717e8b98a2aca096897d70635a50443b31282321222329323c44515c6673808c99aab1a7988b7e7265584b3f3225180800000005111e2a36424d5765727f8b98a2aea99c8f82756b60564c433c38332d2e34383c424b555f6a74818e9ba8aea3988c7f7266574d42372b1e120500000000000000000000000000000000000000000000000000000006111b262f38424a50535b60606060606060605d54514c433a31271e150b02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009121b242d363f49515b626d727f8c9193939393938e847c6f6256493c2f231609000000000000000000000000000000000000000000000000071119232b333b42464f55585f6267696e71737576787c8895a093867977767572706d6764605d55514b423d342c231a1108000000000000000000040e18222a31373a3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3a37312a22180e03000000000000040d17222d38414a545b606c717a81878d92989b9ea1a8a6a7a8a7a5a4a3a3a3a3a4a5a6a8a6aaa39f9c9a938f8a837d746d675e574d453b31281d13070000000000000000000000000000000000000000000000000000000000000000000006060606060606060000000000010507070b0e101213131212100e0b070604010000000000000000010406070b0e101212131211100e0b08070502000000000000000000000000000000131f2c3946525f6c7985929facb8b0a8a2a09f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9fa0a1a2a5a7aba8a09e9a949089817a6e6a5f584e453b2f261c1106000000000000000e1a2734414d5a6774808d9aa7ada093877a6d6054473a2d2114070000000000000815212e3b4854616e7b8794a1aea69a8d8073675a4d4034271a0d000714212d3a4754606d7a8793a0adada197877a6e6154473e342d2a292c30353e45515c67727f8c99a3aeb2a5988b7f7265584c3f322b2620180f06000000131f2c3946525f6c7985929facada093877a6d6054473a2d211407000000000000000000000000000004111d2935414c566875818e9ba8b2a5998c7f7266594c3f3326190c00000008131e28323d45515d67707d88939fa49a91847a6d60594f443a303939393a4653606d798693a0aca194877b6e6154483b393932312e29231b1309000000121e2b3845515e6b7884919eabaea194887b6e6155483b2e28282828282828282828282828282828282828282828282828282423211c1710080000000000000a1723303d4a5663707d8998a3aea89b8e8275675d51433a2f23181d1d1d1d1d161f2834404a545c606a6864615e5655534e463c32261b0f030000000006131f2c3845515c6775828f9caaaa9d9184776b6054483e32291f18151518202834404a54626f7b8898a2aea89b8e8175685b4e423025190d0100000714202d3a46525e697683909daaada196897d7063594f433a312b282223282c3039434e58626f7c8895a0acaa9d908477695f53463a2d211407000000000000000000000000000000000000000000000000000000000a141d262f383f44464e5353535353535353504745413a31281f150c030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009121b242d373f49515b636d737f86868686868686868174675a4e4134271b0e01000000000000000000000000000000000000000000000000071119202930363e44484e5355575e616467686a6f7b8895a093867a6d69686663605d5553514b454039302b221a1108000000000000000000000a15202a343c434748494949494949494949494949494949494949494949494949494949494949494949494949494949494847433c342a20150a0000000000010c161f27333f49535b666c747e858e92999fa2aaaba9a8a19e9c9a9897979696979798999c9e9fa4acaca49f9c95908981796e695f574d433a2f24180d040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000131f2c3946525f6c7985929facb8a89e969393939393939393939393939393939393939393939495989b9ea1a9aaa69f9c938e847c6f6a5f574d42382d22170b000000000000000e1b2734414e5a6774818d9aa7ada093867a6d6053473a2d2014070000000000000814212e3b4754616e7a8794a1ada79a8d8174675a4e4134271b0e000714212d3a4754606d7a8793a0adab9e918578685e5246392c221e1d20242934404b55616e7a86929facb2a5988b7f7265584c3f32251a150e0600000000131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000000000000000000000000010d19242f404d596673808c99a6b3a79b8e8174685b4e4135281b0e000000010c16202935404b55606b74808d96a0a1968e81746b61564c4135292d2d3a4653606d798693a0aca194877b6e6154483b2e2d2525221e18110901000000121e2b3845515e6b7884919eabaea194887b6e6155483b35353535353535353535353535353535353535353535353535353531302d28221a120800000000000d1a2733404d5a6673808d99aab4aa978b7e7164554c4131282a2a2a2a2a2a2a2a2a232e39424a51535d5b5754524c4847433c342a20150a00000000000713202d3a4653606d7985929facab998c7f7366594f44362c20170d07070e18232e394653606c7985929fabaa9d9184776a564c41362a1d110500000814212e3b4754616e7b87959fabab9e9184786c6053463d31281f1c17181c1f27313c47535f6a7784919daaaca095887b6e6155483b2e22150600000000000000000000000000000000000000000000000000000000020b141d262d333839424646464646464646443a39352f281f160d0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009121b252d373f49515b636d737979797979797979746e64584c4033271a0d0100000000000000000000000000000000000000000000000000070e171f252a33383c4347484d5254575a5c626f7b8895a093867a6d605b595653514b47454039342e271e19100800000000000000000000030f1b26313c464e53555656565656565656565656565656565656565656565656565656565656565656565656565656565655534e463c31261a0f030000000007131d28313a44505b656c78808a92979fa3abaaa69f9c9896918f8d8b8a8a89898a8a8b8d8f91939a9c9fa4aca7a09d938e837b6e695f554b41352921160a000000000000000000050a0d0f101313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313100f0d0a050000000000000000000000000104060712131313130908060300000000000000000000000000131f2c3946525f6c7985929facb8a2968c87868686868686868686868686868686868686868787898b8e92979da0a7aba59d9691857c6f695e544a3f33281d12070000000000000e1b2834414e5b6774818e9aa7aca09386796d6053463a2d2013070000000000000714212e3a4754616d7a8794a0ada79a8e8174675b4e4134281b0e000714212d3a4754606d7a8793a0ada99c8f827669564d41362a1a12111319232f3946525e687683909da9b2a5988b7f7265584c3f32251909030000000000131f2c3946525f6c7985929facada093877a6d6054473a2d211407000000000000000000000000000000081824313e4b5764717e8a97a4b1a89c8f8275695c4f4236291c0f00000000040d18242f3a434f59606d79849199a39d938a7d70685e52463e32292d3a4653606d798693a0aca194877b6e6154483b2e21191816120d070000000000121e2b3845515e6b7884919eabaea194887b6e615548424242424242424242424242424242424242424242424242424242423e3c39332c241a100500000004101c2834404b546976828f9ca9aea398887b6f6255483c2f3737373737373737373737373039404446514e4b4746413c3b37322a261f180f06000000000a1723303d4a5663707d8998a2aea399897c706356493d32231a0e05000007121f2b3844505b6676838f9ca9ac9f928579685e5246392d20130700000b1824313e4b5764717e8a97a7b1a79a8e8174665b5044382b1f160f0b0c10151f2b37434e586773808d9aa6b1a7988b7e7165584b3e2d22170b0000000000000000000000000000000000000000000000000000000000020b141c22282b2d353939393939393939372d2c29241e160d04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009131b252d373f49515b63666c6c6c6c6c6c6c6c67645c53483c3024180b000000000000000000000000000000000000000000000000000000050d141a21282c31373a3c4246484a4d55626f7b88959f93867a6d60534c494745403a39352f28231d150c07000000000000000000000006121f2b37434e585f6262626262626262626262626262626262626262626262626262626262626262626262626262626262625f584e43372b1f1206000000010d18242f3a434f59606c77818d929fa2a9ada59e9b948f8b888482807f7e7d7d7d7d7e7e808284878b8f939a9ea6aca59d9590847b6e675d51453d32271b0f03000000000000030a1016191c1d20202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020201d1c1916100a03000000000000000001070d1113141f202020201515120f0a040000000000000000000000131f2c3946525f6c7985929facada093877a797979797979797979797979797979797979797a7b7c7e81858a90959fa3aba8a19792857b6e665b5044392e23180c0000000000000e1b2835414e5b6874818e9ba7aca09386796d6053463a2d2013070000000000000714212d3a4754606d7a8793a0ada79b8e8174685b4e4135281b0e000714212d3a4754606d7a8793a0ada89b8e8175685b4e423025190f0408121d2a36414c566774818d9aa7b2a5988b7f7265584c3f3225190c000000000000131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000000000000000000000000000a1724303d4a5763707d8a96a3b0a99c908276695d5043362a1d10000000000007131d28313d45515d676f7c87929fa59e91857a6d615a50443b302d3a4653606d798693a0aca194877b6e6154483b2e211508090601000000000000121e2b3845515e6b7884919eabaea194887b6e61554e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4a49453e362c22170c00000006131f2c3845515c667884919eabac9f9286796d6053464444444444444444444444444444444444444444444444444444443b3a36312a21180e030000000d192633404c5966737f8c99aaac9f92867a6d6053473a2d201407000000030f1c28333f4a546874818e9ba7aea298877a6d6154473a2e21140700010e1b2834414e5b6774818e9aa7b4aa978a7e7164544a3f3328190d040000040d1b26323d4a5764707d8a97aab4a79b8e81746853493f33271b0f030000000000000000000000000000000000000000000000000000000000020a11171c1f20282d2d2d2d2d2d2d2d2a21201d19130c040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000109131b252e37404951575960606060606060605a58534a41362b2014080000000000000000000000000000000000000000000000000000000002090e161c20262b2e30363a3b3e4855626f7b88939393867a6d6053473d3a39352f2c29241d18120b030000000000000000000000000815212e3a47535f6a6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6a5f53473a2e21150800000004111d2935414b55616b73808d939da4ada9a29f938e88827e7b78757472717070707071727375777b7e82878f939fa2aaa7a0969183796d60594f43382c1f14090000000000040d151c212629292d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d292926211c150d04000000000000040c13181d20202b2d2d2d2d22211f1b150e0600000000000000000000131f2c3946525f6c7985929facada093877a6d6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c666c6d6e6f7274797e838c9299a3aba9a1978f82786c60554b4034281c100400000000000e1b2834414e5b6774818e9aa7aca09386796d6053463a2d2013070000000000000714212e3a4754616d7a8794a0ada79a8e8174675b4e4134281b0e000714212d3a4754606d7a8793a0ada79a8d8174675a4e4134271b0801010d1925303e4b5864717e8b97a4b1a5988b7f7265584c3f3225190c000000000000131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000000000000000000000000000a1623303d495663707c8996a3afaa9d9083776a5d5044372a1d110000000000010c161f2935404b55606a73808d95a0a1978e81756c61564c41362d3a4653606d798693a0aca194877b6e6154483b2e211508000000000000000000121e2b3845515e6b7884919eabaea194887b6e615b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b575550483e33281c110400000713202d3a4653606d7986939facaa9d908477665c50505050505050505050505050505050505050505050505050505050504846423b332a1f1409000004101d2935404b556975828f9ca8aa9d918477675d5145392c201306000000000b17222d414d5a6774808d9aa7b4aa94887b6e6155483b2e2215080005111e2a36414c566a7683909da9aea298887b6e6155483b2d221708000000000a15212e3b4854616e7b8798a2aeaa9d908377655b5044372b1f120500000000000000000000000000000000000000000000000000000000000000060b0f12131b20202020202020201d1413110d08010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010a131c252e3740464b4c53535353535353534e4c4841382f251a0f03000000000000000000000000000000000000000000000000000000000000050b10151b1f21252a2d2f3c4855626f7c8686868686796d6053473a2d2c2924201d18120c0700000000000000000000000000000915222f3c4855626f7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c6f6255483c2f2215090000000613202c3945515d67707d8a929ca5aea9a197928a817c76726e69696765646463636464656669696e72767c828a9298a2aaa8a0958e81746b6054483c31261a0e02000000030d161f262d32353639393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393635322d261f160d0300000000040d161d24292c2d38393939392f2e2b2620181006000000000000000000131f2c3946525f6c7985929facada093877a6d606060606060606060606060606060605b6060616265666d71787f879299a3afa99f948b7f72675c5145382c1f130700000000000e1b2734414e5a6774818d9aa7ada093867a6d6053473a2d2014070000000000000814212e3b4754616e7a8794a1ada79a8d8174675a4e4134271b0e000714212d3a4754606d7a8793a0ada69a8d8073675a4d4034271a0d0100081724303d4a5763707d8a96a3b0a5988b7f7265584c3f3225190c000000000000131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000000000000000000000000000916222f3c4955626f7c8895a2afaa9e9184776b5e5144382b1e11000000000000040d18242f39434e58606d79839099a39e938a7e71685e52463e333a4653606d798693a0aca194877b6e6154483b2e211508000000000000000000121e2b3845515e6b7884919eabaea194887b6e6868686868686868686868686868686868686868686868686868686868686864615a5045392d21140800000815212e3b4854616e7b879aa4afa99c90837669545d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d55534d453b31261a0e020006131f2c3845515d677884919eaba99d9083766a554b4035291d110400000000061a2633404d596673808c99a6aea295887b6f6255483c2f221509000713202d3946525e687885929fabac9f9285796c605346392d201306000000000714212d3a46535e697985929facac9f9285796c605346392d2013060000000000000000000000000000000000000000000000000000000000000000000306060f131313131313131311070604010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010a131c252e353b3e40464646464646464641403c362f261d1308000000000000000000000000000000000000000000000000000000000000000000040a0f12151a1e212e3a47535f6a76797979797976675c5145382c201d1813100d0701000000000000000000000000000000111e2a3744515d6a77848989898989898989898989898989898989898989898989898989898989898989898989898989898983766a5d5043372a1d10000004101d2935404b55606d7984919ea4aeaaa19791857e756f6a65615f575a58575756565757585a565e61656a6f757e869298a2aea89e93897c6f63574d42372b1e12050000000a151f2831383e4243464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464643423e3831281f150a000000010c161f282f35393a45464646463c3b37322a22180e040000000000000000131f2c3946525f6c7985929facada093877a6d6054535353535353535353535353534a5053545456545c60666d737e87929fa7b0a69e9185796d6053463a2f24180d01000000000e1a2734414d5a6774808d9aa7ada093877a6d6054473a2d2114070000000000000815212e3b4854616e7b8794a1aea79a8d8074675a4d4134271a0e000714212d3a4754606d7a8793a0ada69a8d8073675a4d4034271a0d0100091623303c4956636f7c8996a2afa5988b7f7265584c3f3225190c000000000000131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000000000000000000000000000916222f3c4955626f7c8895a2afab9e9184786b5e5145382b1e120000000000000007121d27313d45515c666f7c87929fa59e92857a6e615a50453b3a4653606d798693a0aca194877b6e6154483b2e211508000000000000000000121e2b3845515e6b7884919eabaea194887b7575757575757575757575757575757575757575757575757575757575757575716c6155493c3023170a00000916232f3c4956626f7c8995acb6a89c8f82756a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a615f574d42362a1e1205000714202d3a4753606d7a86939faca89c8f8275695c4f422f24180d01000000000d1a2733404d5a6673808d99a6afa295887c6f6255493c2f221609000714212e3a4754616d7a8798a2aeaa9d918477665b5044382b1f12060000000005121e2a36424d576a7784919daaaea298877a6e6154473b2e2114080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010a131c232a2f323339393939393939393433302b251d140b0100000000000000000000000000000000000000000000000000000000000000000000000306090e121f2b37434e585f626c6c6c6c6c6c5c554b4034291c110d0704010000000000000000000000000000000000111e2a3744515d6a77849095959595959595959595959595959595959595959595959595959595959595959595959595959083766a5d5043372a1d10000006131f2c3945515d67737f8c96a1adaea29891857b716c625f5855534d4d4c4b4a4a4a4a4b4b4d4d5254585f626c707c86929fa7afa59c8f8276695f53463a2d211407000005101c26313a42494e505353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353504e49423a31261c1005000007131d28313a40454752535353534847433c342a20150a0000000000000000131f2c3946525f6c7985929facada093877a6d6054474646464646464646464646463f44464748494b51545c606c727e8b959fabada1978b7e7165554b4135291d1104000000000d1a2733404d5a6673808d99a6ada194877a6e6154473b2e2114080000000000000815222f3b4855626e7b8895a1aea6998d8073665a4d4033271a0d000714212d3a4754606d7a8793a0ada69a8d8073675a4d4034271a0d01000815222f3b4855626e7b8895a1aea5988b7f7265584c3f3225190c000000000000131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000000000000000000000000000916232f3c4956626f7c8995a2afaa9d9183776a5e5144372b1e1100000000000000010b151f2834404b545f6a737f8c959fa1978f82756c62574d423a4653606d798693a0aca194877b6e6154483b2e211508000000000000000000121e2b3845515e6b7884919eabb5a89b8f8281818181818181818181818181818181818181818181818181818181818181817e7164574a3e3124170b00000a1623303d495663707c8996a3afa89b8e8177777777777777777777777777777777777777777777777777777777777777776e695f53463a2d211407000915222f3c4855626f7b889aa4afa89b8e8275685b4f422d22170b00000000000e1b2834414e5b6774818e9aa7b4ab95887b6e6255483b2f221508000915222f3c4855626f7b8895aab4a99c8f837669544a3f33281c0f0300000000020e1a2531434f5c6976828f9ca9b4aa95887b6f6255483c2f2215090000000000000000000000000000000000000000000000000000000000030607090b0d0f1111121313121211100f0d0a080705020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010a12191e2325262d2d2d2d2d2d2d2d272724201a130b02000000000000000000000000000000000000000000000000000000000000000000000000000000030f1b26313c464e535560606060605f514b43392f23180c010000000000000000000000000000000000000000111e2a3744515d6a7784909da2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a29d9083766a5d5043372a1d1000000714202d3a4753606d7985929ea8b1a79f92867c6f69615a534e484642413f3e3d3d3d3d3e3f404246474e535a616a717e8b959fabac9f93877b6e6155483b2e22150800000a16212d38424c545a5c60606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060605c5a544c42382d21160a00010d18242f3a434b51535e6060606055534e463c32261b0f0400000000000000131f2c3946525f6c7985929facada093877a6d6054473a393939393939393939392d3338393a3b3c40454a505a606c7883909da9b3a99d908376675d5145392c201306000000000c1926333f4c5966727f8c99a5aea195887b6e6255483b2f2215080000000000000916222f3c4955626f7c8895a2afa5988c7f7265594c3f3226190c000714212d3a4754606d7a8793a0ada69a8d8073675a4d4034271a0d01000815222e3b4855616e7b8894a1aea5988b7f7265584c3f3225190c000000000000131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000000000000000000000000000a1623303d495663707c8996a3afaa9d9083776a5d5044372a1d110000000000000000030d18232e39424e58606d78839098a39e948b7e71695e52463f4653606d798693a0aca194877b6e6154483b2e211508000000000000000000121e2b3845515e6b7884919eabb7aa9e938f8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8c807366594d4033261a0d00000a1724303d4a5763707d8a96a3b0ab9e928583838383838383838383838383838383838383838383838383838383838383837b6e6155483b2e221508000a1724303d4a5763707d8a96acb6a89c8f827569544a3f33281c0f0300000004111d2935414c566875828e9ba8aea399877a6e6154473b2e211408000a1723303d4a5663707d8996a3b0a89b8e8275685b4f422d22170b000000000000091c2835424f5b6875828e9ba8b0a396897d7063564a3d3023170a000000000000000000000000000000000000000000000000000104060b10121315171a1c1d1e1f1f201f1f1e1d1b19171514120e09060300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070d1216191920202020202020201b1a18140f080100000000000000000000000000000000000000000000000000000000000000000000000000000000000a15202a343c43474853535353535345403931271d1207000000000000000000000000000000000000000000111e2a3744515d6a7784909d9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9d9083766a5d5043372a1d100004101c2834404b5464717e8a97a2acaca0958b7e726a5f575047433c3a3631323131303031313230363a3c43475058616c7683909da9afa49a8c7f7265594c3f3226190700000d1926323e49545e66696c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c69665e54493e3226190d0004111d2935404b555d606b6c6c6c6c625f584e43372b20150a00000000000000131f2c3946525f6c7985929facada093877a6d6054473a2d2d2d2d2d2d2d2d2d2d22282b2d2d2e2e34383f44505b65707d8997a2adac9f92867a6d6054473a2d211407000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f2316090000000000000a1623303d495663707c8996a3afa4988b7e7165584b3e3225180b000714212d3a4754606d7a8793a0ada69a8d8073675a4d4034271a0d01000815222e3b4855616e7b8894a1aea5988b7f7265584c3f3225190c000000000000131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000000000000000000000000000b1824313e4b5764717e8a97a4b1a99c8f8276695c504336291d1000000000000000000007121d27303c44505c666f7c86929fa69f92857b6e615b51454653606d798693a0aca194877b6e6154483b2e211508000000000000000000121e2b3845515e6b7884919eabb7afa59e9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b998c807366594d4033261a0d00000a1724313d4a5764707d8a97a3b0ada1979290909090909090909090909090909090909090909090909090909090909090887b6e6255483b2f221508000b1825313e4b5864717e8b97a4b1a99d908376665b5044382b1f130a0603060a13202c3945525d687784919daaac9f9286796c605346392d201306000a1724313d4a5764707d8a97a3b0a79a8e8174675b4e4134281b060000000000010e1b2834414e5b6774818e9aa7b0a3978a7d7064574a3d3124170a000000000000000000000000000000000000000000000001070d1113171c1f20222426292a2b2b2c2c2c2b2b2a28262422211e1a1312100c0600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002060a0c0d13131313131313130e0d0b080300000000000000000000000000000000000000000000000000000000000000000000000000000000000000030e18222a31373a3c46464646464638342f271f150b01000000000000000000000000000000000000000000111e2a3744515d6a77839093939393939393939393939393939393939393939393939393939393939393939393939393939083766a5d5043372a1d100006131f2c3845515c6675828f9a9c9fa29d9083786d60584e453e37322d2a262524242323242425252a2d32373e46505a64717e8b97aab3ac9c8f8275695c4f422f24180c00000f1c2935424e5a66707679797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797670665a4e4235291c0f000613202c3945515d676d78797979796f6a5f53473d32271b0f00000000000000131f2c3946525f6c7985929facada093877a6d6054473a2d212020202020202020171c1f20212123282e343f4953606d7985929eabafa3998a7d7063574a3d3024170a000000000b1724313e4a5764717d8a97a4b0a3968a7d7063574a3d3024170a0000000000000b1724313e4a5764717d8a97a4b0a3978a7d7064574a3d3124170a000714212d3a4754606d7a8793a0ada69a8d8073675a4d4034271a0d01000815222e3b4855616e7b8894a1aea5988b7f7265584c3f3225190c000000000000131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000000000000000000000000000c1926333f4c5966727f8c99a5b2a79b8e8174685b4e4135281b0e000000000000000000000b151e28343f4a545f6a727f8c949fa2978f82766d62574d4653606d798693a0aca194877b6e6154483b2e211508000000000000000000121e2b3845515e6b7884919eabb7b8afaaa8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a6998c807366594d4033261a0d00000a1724313d4a5764707d8a97a3b0b3a9a19e9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d94887b6e6155483b2e221508000c1926323f4c5965727f8c98a5b2ab9e9285796c6053463a30241b14121012141c26303a4754606d7a86939facaa9d918477655b5044372b1f1205000b1824313e4b5764717e8a97a4b1a79a8d8174675a4e4134271b0e0100000000010e1b2734414e5a6774818d9aa7b0a4978a7d7164574a3e3124170b00000000000000000000000000000000000000000003090e13181d2023282b2d2f3133353737383939393837373533312e2d2a26201f1c17110d0802000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006101820262b2e2f3939393939392c29231d150d0300000000000000000000000000000000000000000000111e2a3744515d6a77838686868686868686868686868686868686868686868686868686868686868686868686868686868683766a5d5043372a1d10000713202d3a4653606d79868b8d909298988a7e71665c50463c332b26211e1a1918171717171818191e20262b343e4754616e7b8798a2aeaa9e9184776b554b4035291d100400101d293643505c69768386868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868276695c504336291d10000714202d3a4753606d7a85868686877c6f62584e43372b1d1207000000000000131f2c3946525f6c7985929facada093877a6d6054473a2d2114131313131313130b0f12131415181c232d3844505c6675828e9ba8b5ab998c7f7266594c3f3326190c000000000916232f3c4956626f7c8995aab4a4978b7e7164584b3e3125180b0000000000000c1925323f4c5865727f8b98a5b4aa95887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada69a8d8073675a4d4034271a0d01000815222e3b4855616e7b8894a1aea5988b7f7265584c3f3225190c000000000000131f2c3946525f6c7985929facada093877a6d6054473a2d211407000000000000000000000000000004101c2934404b556774818e9aa7b3a6998c807366594d4033261a0d00000000000000000000030c17232e38424e58606c78839098a29f948b7f72695f544a53606d798693a0aca194877b6e6154483b2e211508000000000000000000121e2b3845515e6b7884919eabb7b1a9a3a19f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f998c807366594d4033261a0d00000a1723303d4a5663707d8996a3b0b8b0aba99f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9fa9aaaaaaaaaa94877a6e6154473b2e211408000d1a2733404d5a6673808d99a6b3ada297887c6f62564c41352d26201f1c1f20262e38424e5864707d8a9aa4afa89b8e81756853493f33271b0f03000b1825313e4b5864717e8b97a4b1a79a8d8074675a4d4134271a0e0100000000010e1a2734414d5a6774808d9aa7b1a4978b7e7164584b3e3125180b00000000000000000000000000000000000000040a0f151a1d24292c2e34383a3c3e404244444546464545444342403d3b3a36312d2c28231c19130d08020000000000000000000000000000000000000000000000000000000000000000000000000000000000040607090c0e1011121313131211100f0d0b0807050200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060e151b1f21222d2d2d2d2d2d1f1c18120b030000000000000000000000000000000000000000000000101d2936424f5b677177797979797979797979797979797979797979797979797979797979797979797979797979797979797671665b4e4236291c10000613202d394653606c777c7e808385888b867a6d60544a3f342a211b15120e090b0a0a0a0a0b090e11151b222d3a46525e697885929fabac9f928679675d5145392c1f130600101d293643505c6976838f9393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393938f8276695c504336291d10000613202c3945515d67717e8b959a8f82756a605447392e23180c000000000000131f2c3946525f6c7985929facada093877a6d6054473a2d2114070606060606000003060607070c111b28343f4a546673808d99a6b3a69a8d8073675a4d4034271a0d010000000814212e3b4754616e7a8798a3aea6998c7f7366594c40332619090000000000000d1a2733404d5a6673808d99a6aea298877a6d6154473a2e211407000714212d3a4754606d7a8793a0ada69a8d8073675a4d4034271a0d01000815222e3b4855616e7b8894a1aea5988b7f7265584c3f3225190c000000000000131f2c3946525f6c7985929facada093877a6d6054473a2d211407000000000000000000000000000006131f2c3845515c677783909daab4aa988b7e7165584b3e3225180b000000000000000000000006111c26303c44505b666e7b86929fa69f92867b6e665b5053606d798693a0aca194877b6e6154483b2e211508000000000000000000121e2b3845515e6b7884919eabb7a99f9894939393939393939393939393939393939393939393939393939393939393938c807366594d4033261a0d0000091623303c4956636f7c8996a2afb0a69f9c9393939393939393939393939393939393939393939393939c9ea6b0aea398877a6d6054473a2d211407000e1a2734414d5a6774808d9aa7b3b3a9998c8073685d52463f382f2d2b282b2d30383f4a545f6a76828f9cacb0a6988b7e7265584b3f2d22170b00000b1824313e4b5764717e8a97a4b1a79a8d8174675a4e4134271b0e0100000000010e1b2734414e5a6774818d9aa7b1a4978a7e7164574b3e3124180b000000000000000000000000000000000000070c151b20262b2f35393a3f4446484a4d4f5051525253525251504e4c4a4846423d3a38342e29251e19140d050000000000000000000000000000000000000000000000000000000000000000000000000004070c10121316191b1d1e1f1f201f1f1e1d1b19171414110e0806030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030a0f12151520202020202013100c07010000000000000000000000000000000000000000000000000e1a27333f4a555f676a6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6a665f554a3e32261a0d0005121f2b3744505b656c6f717476797b7e7e71675d5142382e22180f0a0502000000000000000002050b111e2a36424d566b7884919eabafa399867a6d6053473a2d20140700101d293643505c6976838f918b86868686868686868686868686868686868686868686868686868686868686868686868686868686868686868b918f8376695c504336291d100004111d2935404b55606d7883909d94897c6f62544b4034281c10040000000000131f2c3946525f6c7985929facada093877a6d6054473a2d211407000000000000000000000000000b17232e3f4c5965727f8c98a5b2a79a8e8174675b4e4134281b0e010000000613202d394653606c7985929faca79b8e8174685b4e4131261a0e020000000003101c28343f4a546875828e9ba8ac9f928579685e5246392d201307000714212d3a4754606d7a8793a0ada69a8d8073675a4d4034271a0d01000815222e3b4855616e7b8894a1aea5988b7f7265584c3f3225190c000000000000131f2c3946525f6c7985929facada093877a6d6054473a2d21140700000000000000000000000000000714202d3a4753606d7986929facaea298887c6f6255493c2f2216090000000000000000000000000a151e28333f4a545f69727f8b949fa2989082786c605753606d798693a0aca194877b6e6154483b2e211508000000000000000000121e2b3845515e6b7884919eabb7a3988d888686868686868686868686868686868686868686868686868686868686868686807366594d4033261a0d00000815222f3b4855626e7b8895a9b3ab9f948f8686868686868686868686868686868686868686868686868f949eaaac9f928579675d5145392c201306000e1b2734414e5a6774818d9aa7b4b8ab9f92857a6d615b5049413c393834383a3d424a505c666e7c87939facab9f94877b6e6154483b2e21150600000a1724313d4a5764707d8a97a3b0a79a8e8174675b4e4134281b0e0100000000010e1b2834414e5b6774818e9aa7b0a3978a7d7064574a3d3124170a00000000000000000000000000000000030b121820262b31373a4145474a50535557595c5d5e5e5f5f5f5e5e5d5b595755534d4946443f3835302a251e170e0802000000000000000000000000000000000000000000000000000000000000000001070c1013181c1f20232527292b2b2c2d2c2c2b2a28262421201e1915120f0a0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000306080913131313131306040000000000000000000000000000000000000000000000000000000a16222e39434d555b5d606060606060606060606060606060606060606060606060606060606060606060606060606060605d5b554d43382d22160a00030f1b27333f49535b60626467666c6e71716c62554b4030261c100600000000000000010507090e12161c222c3845515c677885919eabaea399877a6d6054473a2d21140700101d293643505c6976838f8b7f79797979797979797979797979797979797979797979797979797979797979797979797979797979797979797f8b8f8376695c504336291d1000010d18242f3a44505c66717e8a979a8e8174665c5145382c1f13060000000000131f2c3946525f6c7985929facada093877a6d6054473a2d21140700000000000000000000000104091925323f4c5865727f8b98a5b2a89b8e8175685b4e4235281b0f0200000005121f2b3744505b657783909daaa99c90837669574d42362a1e12050000000006121f2c3844505c667783909daaa99d9083766a564c4135291d1105000714212d3a4754606d7a8793a0ada69a8d8073675a4d4034271a0d01000815222e3b4855616e7b8894a1aea5988b7f7265584c3f3225190c000000000000131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000000000000000000000007101d2935404b5563707d8a99a3aeac9f9285796d6053463a2d201307000000000000000000000000030c17222d38424d57606c77828f98a29f948c7f726a5f54606d798693a0aca194877b6e6154483b2e211508000000000000000000121e2b3845515e6b7884919eabaea194887b7979797979797979797979797979797979797979797979797979797979797979736e63574b3f3226190c00000714212d3a4754606d7a8797a2ada99c8f82797979797979797979797979797979797979797979797979828f9ca9ab9e9184786b554b4135291d1104000e1b2834414e5b6774818e9aa7b4b3ada2988d81746d605b534e4846443f4446484e545c606d7883909aa4afa79c8f8376695e52463a2d20140700000a1723303d4a5663707d8996a3b0a89b8e8175685b4e4235281b090000000000020f1b2835424e5b6875818e9ba8b0a3968a7d7063574a3d3024170a000000000000000000000000000000070c151d232831373c42474b5154545c60626466686a6a6b6c6c6c6b6a6a686664615f575653504a46413a3630292019130d05000000000000000000000000000000000000000000000000000000000003090e12181d1f23282c2d3032343638383939393838373533312e2d2a25211f1b150f0b0600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006111c27313b434a4f5153535353535353535353535353535353535353535353535353535353535353535353535353535353504e4a433a31271c110500000b17222d38414950535558545b60626465625a50433a2f1e140a00000000020507080d1113141a1e21272c343c4653606d7986929facac9f928679675d5145392c20130600101d293643505c6976838f8b7f726c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c727f8b8f8376695c504336291d10000007131d28343f4a54606d7985929e9285796d6053463a2d2013070000000000131f2c3946525f6c7985929facada093877a6d6054473a2d21140c0c0c0c0c0c0c0c0c0c0c070d10151c28333f4a546673808c99a6b3a79a8e8174675b4e4134281b0e01000000030f1b27333f49536874818e9ba7ab9f928578695f53463a2d211407000000000713202d3a4653606d7986929faca79a8e8174675b4e413025190d01000714212d3a4754606d7a8793a0ada69a8d8073675a4d4034271a0d01000815222e3b4855616e7b8894a1aea5988b7f7265584c3f3225190c000000000000131f2c3946525f6c7985929facada093877a6d6054473a2d211407000000000000000000000000050e19222c3945515d6774818e9aabb4a99c908376665c5044382c1f12060000000000000000000000000006111c262f3c44505b656e7b86929fa69f92867b6e665c606d798693a0aca194877b6e6154483b2e211508000000000000000000121e2b3845515e6b7884919eabaea194887b6e6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c66635c52473b2f23170a00000613202c3945515d677885929eabaa9d9184776c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c667784919eaaa99c8f8376695c50432f24180d01000e1b2834414e5b6774818e9aa7b3a9a19e9e928b7f726c655f585553504a5053555860666d74808d959facaba0958a7d7164574d42362a1e120500000916222f3c4955626f7c8895aab4a99c8f8276695c4f4330251a0e0200000000030f1c2936424f5c6975828f9ca8b5ab95897c6f6256493c2f23160900000000000000000000000000000810191e272e343c43474d53555d6064666d6f7173757777787979787877767573706e696763605c54524c46413b322a251e170e06000000000000000000000000000000000000000000000000000001070c141a1d24292c2e34383a3c3f4143444546464645444342403e3b3936302e2b261f1c17110a020000000000000000000000000000000000000000000000000000000000000000000000000000040607090c0e1011121313131211100f0d0b0807050200000000000000000000000000000000000000000000000000000b151f2931393f42444646464646464646464646464646464646464646464646464646464646464646464646464646464643423e3831281f150a00000006111b262f383f4446484b4a50535558585650483f31281d0c02030506090e121415191d2021262b2d33383e464e58636f7c8999a3afab9e9185786b554b4135291d110400101d293643505c6976838f8b7f72656060606060606060606060606060606060606060606060606060606060606060606060606060606065727f8b8f8376695c504336291d100000010b17232e3845515c6673808d99978a7d7063574a3d302417070000000000131f2c3946525f6c7985929facada093877a6d6054473a2d211919191919191919191919191a181d20262b3844505b6674818e9ba7b3a6998d8073665a4d4033271a0d00000000000b17222d3f4c5965727f8c98aaada297887b6e6155483b2e23180c000000000915222f3c4855626f7b8898a3aea9988b7e7265584b3f3225180800000714212d3a4754606d7a8793a0ada69a8d8073675a4d4034271a0d01000815222e3b4855616e7b8894a1aea5988b7f7265584c3f3225190c000000000000131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000000000000000000060e17202935404b55606d7985929fabb1a7988c7f7265544a3f34281c100300000000000000000000000000000a141d27333f49535e69717e8b949ea3989083786d60606d798693a0aca194877b6e6154483b2e211508000000000000000000121e2b3845515e6b7884919eabaea194887b6e616060606060606060606060606060606060606060606060606060606060605957524a40352a1f1307000004111d2935414c55697683909ca9ab9f928578695f606060606060606060606060606060606060606d7986929faca79a8d8174675a4e4134271b0700000e1b2734414e5a6774818d9aa7ada19792919692877f776f6a6562605b545c6062656a6f78808d929ca7afa4999083786c6053463b30251a0e0200000814212e3b4754616e7b8798a3aeaa9d9084776a574d42362a1e12050000000005111d2935414c566a7783909daaafa399877b6e6154483b2e2115080000000000000000000000000009111a222a303940454e53575f62676d7175797b7d8082838485858685858483817f7d7b7874706d66615e56524c443e36302920180f07000000000000000000000000000000000000000000000000030b12181f252a2f35393a404446494c4e5051525253525251504e4c4a4746413c3a37312b28221c140b070000000000000000000000000000000000000000000000000000000000000000000004070c10121316191b1d1e1f1f201f1f1e1d1b19171414110e0806030000000000000000000000000000000000000000000000040d171f272e333637393939393939393939393939393939393939393939393939393939393939393939393939393939393736322d271f160d03000000000a141d262d3337393c3e3f4446484b4b4a453f362d1f160c0b0f1213151a1e2121252a2d2e31373a3d44485058606a74818e9babb5a99d9083766a5d50432f24180d0100101d293643505c6976838f8b7f72655853535353535353535353535353535353535353535353535353535353535353535353535353535865727f8b8f8376695c504336291d1000000006111c2834404b54626f7c88979a8d8073675a4d402e23180c0000000000131f2c3946525f6c7985929facada093877a6d6054473a2d252525252525252525252525262624292c31373f4a54606c7985919eabb3a9988b7e7165584b3e3225180b00000000000616232f3c4956626f7c8998a2aea9978b7e7164544b4034281c1004000004101d2935404b5565727e8b98aaada197887c6f6255483c2f22150900000714212d3a4754606d7a8793a0ada69a8d8073675a4d4034271a0d01000815222e3b4855616e7b8894a1aea5988b7f7265584c3f3225190c000000000000131f2c3946525f6c7985929facada093877a6d6054473a2d211407000000000000000000030a0f182029323b45515d67727e8b97a2adab9f95887b6e6155483b2e23170c000000000000000000000000000000020b17222d38414d57626c75828f97a29f958c7f736a606d798693a0aca194877b6e6154483b2e211508000000000000000000121e2b3845515e6b7884919eabaea194887b6e615553535353535353535353535353535353535353535353535353535353534d4b4740382e24190e020000010d19242f414d5a6774808d9aabaea298887b6e61555353535353535353535353535353535355626f7c8899a3afa9988b7e7265584b3f3225180c00000e1a2734414d5a6774808d9aa7ab9e9285849199928c827c76726e6c666b666d6e72767c828d929ca4aea69f93877c6f655b504437291f14090000000713202d3a4653606d7986929facab9f928578695e52463a2d201407000000000713202d3946525d687885929eabac9f9286796d6053463a2d20130700000000000000000000000009121b232c343c424b51585f62696e747a7d8185888a8c8f9091919292929191908e8c8a8884807d79736d68615e565046413a322a2119100700000000000000000000000000000000000000000000060d151d24293136394045474a515356585a5c5e5e5f605f5f5e5d5b595754524c4847433c38332d261d18120b03000000000000000000000000000000000000000000000000000000000001070c1013181c1f20232527292b2b2c2d2c2c2b2a28262421201e1915120f0a0300000000000000000000000000000000000000000000050d151c2227292a2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2a2926221c150d040000000000020b141b22272b2d2f2d3338393b3e3e3d3a342d241b1114171b1f2022252a2d2e3036393a3d4246484f545a616a6f7c87939facb2a8998d8073665a4d4033271a070000101d293643505c6976838f8b7f7265584c4646464646464646464646464646464646464646464646464646464646464646464646464c5865727f8b8f8376695c504336291d10000000000c18232e394653606c7985929c90837669544b4034281c100400000000131f2c3946525f6c7985929facada093877a6d6054473a3232323232323232323232323232332f35393c4347505b66707d8997a1adada297887c6f6255493c2f22160900000000000713202d3a4653606d7985929faba79b8e8174665c5145382c1f160c06060c141f2c3845515d6775828e9ba8ab9e9285786c605346392d20130600000714212d3a4754606d7a8793a0ada69a8d8073675a4d4034271a0d01000815222e3b4855616e7b8894a1aea5988b7f7265584c3f3225190c000000000000131f2c3946525f6c7985929facada093877a6d6054473a2d21140700000000000205060b0f151a212a323b444e58606d7984919ea9b2a89d908376695f53463a2d1c11060000000000000000000000000000000006111b262f3b45505a616e7b85929fa59f92877c6f666d798693a0aca194877b6e6154483b2e211508000000000000000000121e2b3845515e6b7884919eabaea194887b6e61554846464646464646464646464646464646464646464646464646464646403f3b352e261c120700000000081724313e4a5764717d8a99a3afaa988b7e7165574d42464646464646464646464646424d5765727f8c98abada297887b6f6255483c2f22150900000d1a2734404d5a6773808d9aa6ab9e92857d89929f948f88827e7b79787778797b7f828990949da4aea69e938d80736b6053493f3327170d0300000006121f2b3844505c667784909daaaea298877b6e6154483b2e21150a000000000714212e3a4754616d7a8797a1adaa9e918477665c5145382c1f1306000000000000000000000009121b242d353e464e545c606a6f757b81868a8e929797999b9d9d9e9f9f9f9e9d9d9b999796918d8985807a746e68615a524c443c332b2219100700000000000000000000000000000000000000000910181f272f353b42464b5153545c60636567696b6b6c6c6c6b6b6a686664615e5655534e46443f382f28231d150c05000000000000000000000000000000000000000000000000000003090e12181d1f23282c2d3032343638383939393838373533312e2d2a25211f1b150f0b06000000000000000000000000000000000000000000040b11161a1d1e202020202020202020202020202020202020202020202020202020202020202020202020202020201d1c1a16110a0300000000000000020a11171b1f202222282b2d2f3132312e29221b191e2022272b2d2f31363a3b3e4146474a4d53555960636c717c859199a4afaca096897d706356493d3023160a0000101d293643505c6976838f8b7f7265584c3f393939393939393939393939393939393939393939393939393939393939393939393f4c5865727f8b8f8376695c504336291d1000000915202b353f4744505b6575828f9b918578665c5145382c1f130600000000131f2c3946525f6c7985929facada093877a6d6054473f3f3f3f3f3f3f3f3f3f3f3f3f3f3f40414045474e535b606c7883909da9b3ac9e9285796c605346392d201306000000000006121f2b3844505c6675828f9caaab9e9285796d6053463d31281e171515171e28313a4753606d7985929facaa9b8e8175655b5044372b1f120500000714212d3a4754606d7a8793a0ada69a8d8073675a4d4034271a0d01000815222e3b4855616e7b8894a1aea5988b7f7265584c3f3225190c000000000000131f2c3946525f6c7985929facada093877a6d6054473a2d21140c0c0c0c0d090e1114171b1f262b333b444c56606a73808c96a1adada1968a7e7164574d42362a1e0a0000000000000000000000000000000000000a141d29333f46525e69717e8a939ea3999083796d6d798693a0aca194877b6e6154483b2e211508000000000000000000121e2b3845515e6b7884919eabaea194887b6e6155483b39393939393939393939393939393939393939393939393939393933322f2a241c130a00000000000714212e3a4754616d7a86929faca89b8e8275695e53463d313939393939393939303946525e6976828f9ca9ab9e9285786c605346392d20130600000d192633404c5966737f8c99a6ab9f928578808d939f9c948f8b888685848586888b8f949c9fa6aca49d948f81786c60594f41382d2217050000000003101c28343f4a546875818e9ba8b3aa978a7d7064574a3d32271b0d04000001081623303d495663707c8996a9b3a89c8f827569544b4034281c10040000000000000000000007101b242d363e474f585f666d737c82878e92989b9ea2a9a6a8aaa8a7a6a6a6a7a8a9a8a6a8a19e9a97928c86807a716c615e564d453c342b22190e0500000000000000000000000000000000000009121b222a313940454d53555d6065666d6f72747677787979797877767573716e6867625f5853504a423d342e271e170e05000000000000000000000000000000000000000000000001070c141a1d24292c2e34383a3c3f4143444546464645444342403e3b3936302e2b261f1c17110a0200000000000000000000000000000000000000060e151b1f21222323232323232323232323232323232323232323232323232323232323232323232323232323232322211f1a150e06000000000000000000060b0f121315171c1f2022252524211d1d20252a2d2d3337393c3f4246484b4c525457575f61656b70767e859197a1abb1a79d9184786c605346392d2013060000101d293643505c6976838f8b7f7265584c3f322d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d323f4c5865727f8b8f8376695c504336291d1000010e1a26313d4751595e5f6673808c999786796d6053463a2d20130700000000131f2c3946525f6c7985929facada093877a6d60544c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4d4d4b5153585f626d737f8c959fabafa49a8d8174665b5044382b1f1206000000000003101c28343f4a5464717e8b98a3ada2978a7d7064594f433a30282322222227303a434f5964717e8a98a2aea2988a7d706453493f33271b0f0300000714212d3a4754606d7a8793a0ada69a8d8073675a4d4034271a0d01000815222e3b4855616e7b8894a1aea5988b7f7265584c3f3225190c000000000000131f2c3946525f6c7985929facada093877a6d6054473a2d211919191919191a191e2022272b31373e454d565e686f7c87929fa8b1a79e9184786d6053463b31261a0e000000000000000000000000000000000000020b17212a36424d56616c75818f97a1a0958c80736d798693a0aca194877b6e6154483b2e211508000000000000000000121e2b3845515e6b7884919eabaea194887b6e6155483b2e2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2626231f19120a0100000000000713202d3946525d6876828f9ca9ac9f92867b6e61584e433b322c292424292c3139424d57616e7b86929faca89b8e8174655b5044372b1f120500000c1825323f4b5865727e8b98a5ac9f92867977818c939a9f9c989993929192939a989c9fa6aba8a09d928d82796d665b50463d2f261b110600000000000b17232e3f4b5865727e8b98a8b2a69a8d807367584e43372b1f15100c090e131e2a36414c5666727f8c99a5b3aa998c7f7366594c402e23180c00000000000000000000050e19222d363e485059616a6f7980878f93999fa3aaabaaaaa29f9d9b9a9a999a9a9b9d9fa2aaa9aba9a19e98928d857e756d685f574e463c342a20170c030000000000000000000000000000000009121b242c343c434b51575e61676d7175797c7f81838485858685858483817f7d7a77736f6a64605b544f454039302920170f05000000000000000000000000000000000000000000030b12181f252a2f35393a404446494c4e5051525253525251504e4c4a4746413c3a37312b28221c140b07000000000000000000000000000000000006101820262b2e2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2e2b262018100600000000000000000000030506060b0f12131518181b1e25292d3036393b3f4446484b4d535457565e616467696e72777d828a9297a1a9b3aa9f958b7e71665b5044382b1f12060000101d293643505c6976838f8b7f7265584c3f322520202020202020202020202020202020202020202020202020202020202025323f4c5865727f8b8f8376695c504336291d100004111d2a36424e59636a6c6c727f8b9894877a6e6154473b2e21140800000000131f2c3946525f6c7985929facada093877a6d605858585858585858585858585858585859595a555d60646a6e767f8c919ca7b1a99f93877c6f62544a3f33281c0f030000000000000b17232e3a4754606d7a86929faca99c9083766b60554b423a342e2f2e2d333a424b55616b7683909daaab9f9285796d6053473a2d22170b0000000714212d3a4754606d7a8793a0ada69a8d8073675a4d4034271a0d01000815222e3b4855616e7b8894a1aea5988b7f7265584c3f3225190c000000000000131f2c3946525f6c7985929facada093877a6d6054473a2d2525252525262627252a2d2d33373c434750575f686e7a849199a3afaa9f958b7e71665c504438291f140900000000000000000000000000000000000000050f1925303b44505a616d7a85929ea59f92877c6f798693a0aca194877b6e6154483b2e211508000000000000000000121e2b3845515e6b7884919eabaea194887b6e6155483b2e22202020202020202020202020202020202020202020202020201a1917130e070000000000000005111d2935414c5664717e8b96a1ada3998d80746a60564d443e39352f2f35383c434b545e6973808d99a3aca096897d706353493f33271b0f0300000b1824313e4b5764717e8a97a4aea399867a6d74808891969d9fa49f9e9e9e9fa4aca9a7a79f9d95918980786d675c544a3f342b1d140a0000000000000615222f3c4855626f7b8896a0acaa9d9184776a6054473c31271f1c181b1a1e242d3946525e6876838f9ca9aea298897c706356493d30231607000000000000000000020d17202b343e48505a616b707c838c92999fa4abaca7a09d999892908f8d8d8d8d8d8f909298989c9fa4abaaa29f97928a827a6e6960584e463c32291e150b00000000000000000000000000000008121b242d363e464e555d60696e74797e8285898b8d8f91919293929291908e8c8a8784807c76716c666059514b433b332921170e0500000000000000000000000000000000000000060d151d24293136394045474a515356585a5c5e5e5f605f5f5e5d5b595754524c4847433c38332d261d18120b030000000000000000000000000000040e18222a31373a3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3a37312a22180e03000000000000000000000000000003060b141a20262b3035393b4146474950535558575e616467686d7074777b7f84898f949fa2a9b2aaa2989083786d60544a3f33281c0f030000101d293643505c6976838f8b7f7265584c3f322519131313131313131313131313131313131313131313131313131313131925323f4c5865727f8b8f8376695c504336291d100006121f2c3845525e6a757979797e8a9795887b6e6255483b2f22150800000000131f2c3946525f6c7985929facada093877a6d656565656565656565656565656565656565666768676d71757b828c919ca4adaba2978e81756a5f5342382d22170b000000000000000613202c3945515d6775818e9ba6ab9f94897d70675d544c443f3c3b3b3c3f444b545d67707d89959faba4998d8174675c5145382c1b11060000000714212d3a4754606d7a8793a0ada69a8d8073675a4d4034271a0d01000815222e3b4855616e7b8894a1aea5988b7f7265584c3f3225190c000000000000131f2c3946525f6c7985929facada093877a6d6054473a32323232323232333430363a3b3f44464e535a61696e7a839096a1abaea3989083786c60544a3f34281c1003000000000000000000000000000000000000000009141f29323e46525e68707e8a939ea399908378798693a0aca194877b6e6154483b2e211508000000000000000000121e2b3845515e6b7884919eabaea194887b6e6155483b2e22151313131313131313131313131313131313131313131313130d0c0a07020000000000000000010d1924303a4653606d7984919ea7ab9f92877c6f685e564f47454141414045474e555c666e7b86929faba89e9184786c605346392d22170b0000000a1623303d495663707c8996abb5ab94877b6e6e737d848a9095989b9d9e9f9f9f9e9c9a9895908a847d736d665c554b42382d22190b020000000000000815212e3a47535f6a7784919eabaca095887c6f62584e4339312c282327262b2f35414c56616d7a86929facab9f9285796d6053463a2d20130700000000000000000009141f29323d46505a626c717d8690959fa3ababa49f9b95908c898584828180808081828385888b8f93999fa2aaa9a19e938f847b6f6a60584e443b30271d12070000000000000000000000000006101a242d363f4850585f676d737b80858b8f9298989a9c9e9e9f9f9f9e9e9d9b999795908d88837e786f6b605c554d453b332920170c0300000000000000000000000000000000000910181f272f353b42464b5153545c60636567696b6b6c6c6c6b6b6a686664615e5655534e46443f382f28231d150c05000000000000000000000000000a15202a343c434748494949494949494949494949494949494949494949494949494949494949494949494949494949494847433c342a20150a00000000000000000000000000020a11171f262a32373a4146474c5254535b60626568696e7174777a7d8084888c91959c9fa6adafa9a19892867b6e665c5142382d22170b000000101d293643505c6976838f8b7f7265584c3f3225190c06060606060606060606060606060606060606060606060606060c1925323f4c5865727f8b8f8376695c504336291d10000613202c3946535f6c798786868a909a95887b6f6255483c2f22150900000000131f2c3946525f6c7985929facada093877a72727272727272727272727272727272727272737475777a7d82878f949ca3adaba39992857b6e61584e432f261c11060000000000000004111d2935414c55626f7c88949faba69e9184796d665d56504a494848494950555d666d7984919ea7aa9f93877b6e61554b4034291c0a000000000714212d3a4754606d7a8793a0ada69a8d8073675a4d4034271a0d01000815222e3b4855616e7b8894a1aea5988b7f7265584c3f3225190c000000000000131f2c3946525f6c7985929facada093877a6d6054473f3f3f3f3f3f3f3f404042424647495053585f626c717b839095a0a8afa59f92867c6f655b5042382e23170c000000000000000000000000000000000000000000020d17202a36414c56616c75818e96a1a0958b7e788693a0aca194877b6e6154483b2e211508000000000000000000121e2b3845515e6b7884919eabaea194887b6e6155483b2e2215080606060606060606060606060606060606060606060606000000000000000000000000000008131f2c3845515c67727f8b95a0aba39991847a6e68615954514c4e4e4b5153575f676d78839098a2aca0968b7f72665b5044382b1b11060000000815222e3b4855616e7b8899a3afa295897c6f626b6f797e83888b8e909192929291908e8b87837e78706b605c544b43392f261c10070000000000000006121f2b37434e586673808d99a3afa89b8e81756a5f554b433c38342e3431373a4145525d68737f8c99a3afa79b8e8175675c5145382c1f13060000000000000000030d1925303b444e58626c717e879298a0a7afa79f99938e88837f7c79777574737373747577797c7f83878d92989ea5ada59e9691857c6f6a5f564c42392e23180c030000000000000000000000030c18222c363f48505a616a6f7980868d92979c9fa2aaa7a9a8a7a6a6a6a7a8a9a8a6a7a09d9a94908a837c746d675e574d453b32291e150a0000000000000000000000000000000009121b222a313940454d53555d6065666d6f72747677787979797877767573716e6867625f5853504a423d342e271e170e050000000000000000000000030f1b26313c464e53555656565656565656565656565656565656565656565656565656565656565656565656565656565655534e463c31261a0f030000000000000000000000040b141c222831363c43474c5254565e6164656c6f7275787b7e8184868a8d9196989da0a8abb0aba59e9791867d6f695f544a402f261c1106000000101d293643505c6976838f8b7f7265584c3f3225190c00000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b8f8376695c504336291d10000613202c3946535f6c79869293979aa295887c6f6255493c2f22160900000000131f2c3946525f6c7985929facb2a5988c7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f80808284868a8f92999fa6adaaa29992877d70695e52463c321d140a0000000000000000010d19242f3a47535f6a76828f99a3aca0968f82786d68605c5456555555535b60676d78818f96a0aca2988e8175695f5343392f23180c000000000714212d3a4754606d7a8793a0ada69a8d8073675a4d4034271a0d01000815222e3b4855616e7b8894a1aea5988b7f7265584c3f3225190c000000000000131f2c3946525f6c7985929facada093877a6d60544c4c4c4c4c4c4c4c4c4c4d4e4d5254535b60636a6e757e859195a0a7afa59d938b7f726a5f53493f30261c110600000000000000000000000000000000000000000000050e1925303a44505a606d7a84919ea59e91847a8793a0ada194877b6e6154483b2e211508000000000000000000121e2b3845515e6b7884919eabaea194887b6e6155483b2e2215080000000000000000000000000000000000000000000000000000000000000000000000000004101c2834404b55606d78839099a3aba09690837a706b64605d555b5b555d60636a6e79818e959faaa49a9184796d60544a3f33281c0a000000000713202d3a4653606d7986929faca4978a7d716460666d71777b7f8183858586858483817e7b76716d666059504a423930271d140a0000000000000000030f1a26313c4854616e7b87929faaac9f92877c6f675d554e46454041414142474c515b606d7a85929eabaca095897d7063554b4034281c100400000000000000010b151f2a36424d56606a717e889299a2aaafa49c959087817c77726f6d6668676766676768666c6f72767b80868e939fa3aaa8a09792867c6f685e544b40342820150900000000000000000000000b151e2a343e48505a626c717c848c92989fa2a9aca8a8a09e9c9a9a999a9a9b9d9fa3ababaaa69f9c95908781796e695e574d443b30261c1106000000000000000000000000000009121b242c343c434b51575e61676d7175797c7f81838485858685858483817f7d7a77736f6a64605b544f454039302920170f050000000000000000000006121f2b37434e585f6262626262626262626262626262626262626262626262626262626262626262626262626262626262625f584e43372b1f120600000000000000000000040d161d262d333b42464e53565e6165686e7175787c7e8184878a8e91939a9a9da0a8aaacaeaca69f9c938e857c6f6b60574d42392e1d140a00000000101d293643505c6976838f8b7f7265584c3f3225190c00000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b8f8376695c504336291d10000613202c3946535f6c7986929fa4a6a295887c6f6255493c2f22160900000000131f2c3946525f6c7985929facb8a79c918c8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8c8c8d8e9193999c9fa3abaca69f9892877e716b61564d42342a200b0200000000000000000008131e2b37434e58626e7c87929fa7a89e948f827a716d66646262616264656c7079818f939ea8a69f92867b6e61574d4231271d1207000000000714212d3a4754606d7a8793a0ada69a8d8073675a4d4034271a0d01000815222e3b4855616e7b8894a1aea5988b7f7265584c3f3225190c000000000000131f2c3946525f6c7985929facada093877a6d6058585858585858585859595a5b565e6164656c70757c828a9297a0a8afa59e938e81746d62584e41382d1e150a00000000000000000000000000000000000000000000000008131e29323e45525d68707d8a939da1978c808c99a6aea194877b6e6154483b2e211508000000000000000000121e2b3845515e6b7884919eabaea194887b6e6155483b2e22150801010101010101010101010101010101010101010101010100000000000000000000000000000c18232e3944515c666f7c87929fa4a8a09590847d76716d6769676869676d70757b838e939ea7a59f93887d70665c5142382d22170b0000000006121f2c3844505c667784919eaaa5998c7f7266545c6064696e72747778797979787674716e6964605c544f443f3830271e150b020000000000000000000a15212d3a46535e6975818e98a3aea3999083796d675f5853514b4e4e4e4d53555d606d74818e97a1ada69d9083776b605443392e23180c000000000000000007121d27313946525e696f7c86929aa3ababa39f928d837c756f6a6662605c545a5a5a5a5a545b606265696e747b818a9298a2a9a9a19891847a6e665c51453c31261a0e0500000000000000000007121d27303c46505a626c717e8691969fa2aaaba39f9b9796918f8e8d8d8d8d8f9092999a9ea1a9aba79f9a938d837b6e695e564c42382e23170c0400000000000000000000000008121b242d363e464e555d60696e74797e8285898b8d8f91919293929291908e8c8a8784807c76716c666059514b433b332921170e050000000000000000000815212e3a47535f6a6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6a5f53473a2e211508000000000000000000030c161f282f383f444d53585f62686d72767a7e8185888b8e9196979a9d9fa4acaaacafacaba39f9b948f89817a6f6a60594f453b30271c0b0200000000101d293643505c6976838f8b7f7265584c3f3225190c00000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b8f8376695c504336291d10000613202c3946535f6c7986929facafa295887c6f6255493c2f22160900000000131f2c3946525f6c7985929facb8ada39c9898989898989898989898989898989898989898999a9b9d9fa4abacaba7a09d9490867e716c62594f443b3022180e00000000000000000000010f1b26323c47535f6a73808d959fa8a69e948f847e7974716f6e6e6f7173787d848f939ea5a79f948c7f72695e53453c311f150b01000000000714212d3a4754606d7a8793a0ada69a8d8073675a4d4034271a0d01000815222e3b4855616e7b8894a1aea5988b7f7265584c3f3225190c000000000000131f2c3946525f6c7985929facada093877a6d656565656565656565656566676869696e7074787d81878f939ea1a9aca49f938e81786d605b51463c2f261b0c03000000000000000000000000000000000000000000000000020c17202935414c56616b74818e96a19f9285929fabaea194877b6e6154483b2e211508000000000000000000121e2b3845515e6b7884919eabaea194887b6e6155483b2e22150d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0a0907040000000000000000000007121d2834404a54606a727f8c929ca4a7a096918a827d7a7775747475767a7d818790959ea5a59e938d80736b60544b402f261c11060000000003101c28343f4a546875828f9ba8a89b8e817568565153575f6165686a6b6c6c6c6b696765615e5753504a423d342e261e150c070100000000000000000005121e2a36424d57616e7b86929fa6aba0958f82796f6a63605c555b5a5b575f62676d747f8c939ea9a99f948a7d7064594f4430271d120700000000000000000c18232f3943505a616e7b859198a3acaca399928b80786f6a625f585653504a4e4d4d4d4e4a505355575e61696e757e869297a2aaaaa1969082786d60574e42372b21170b0000000000000000000c18232e39424e58616c717f8a9298a0a8aba49f99928e8a8784828180808081828486898d92979ea1a8aca49f9590847b6e685e544a3f342820150a000000000000000000000006101a242d363f4850585f676d737b80858b8f9298989a9c9e9e9f9f9f9e9e9d9b999795908d88837e786f6b605c554d453b332920170c0300000000000000000915222f3c4855626f7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c6f6255483c2f2215090000000000000000000a151e283139424a50575f616a6f757a7f83868b8e9297989b9ea1a8a7aaacafacaaaba39f9c99928e89827c756d6860584f473d33291e150b0000000000101d293643505c6976838f8b7f7265584c3f3225190c00000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b8f8376695c504336291d10000613202c3946535f6c7986929facaca295887c6f6255493c2f22160900000000131f2c3946525f6c7985929facacacada7a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a6a7a8aaa9a7a9a19e9a95908a837b706c625a50473e32291f100600000000000000000000000a15202b37434e58606d78839096a0a8a69e96918b85817e7c7b7b7c7e80848a91969ea5a7a0958f82776c60574d42332a1f0d0300000000000714212d3a4754606d7a8793a0ada69a8d8073675a4d4034271a0d01000815222e3b4855616e7b8894a1aea5988b7f7265584c3f3225190c000000000000131f2c3946525f6c7985929facada093877a72727272727272727272727273737576787a7d8184898e93999ea6ada8a19a938c81786d665c50493f342a1d140a0000000000000000000000000000000000000000000000000000050e1924303a444f59606d7984919aa2989298a2aeaea194877b6e6154483b2e211508000000000000000000121e2b3845515e6b7884919eabaea194887b6e6155483b2e221a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a171614100b050000000000000000000c18232e39424e58626d73808c929ea1a8a19e948f8a8683828181828386898e93999fa7a39f938f81786d60594f42392e1d140a0000000000000c17232e404c5966737f8c99abaa9d908477685d52464d5355585b5d5e5f5f5f5e5d5b5854534d46443f3830282321201d18130c040000000000000000020e1a25313b46535f69737f8c949fa7a79f948f837c75706d676867676869696e737a818c919ca5aaa1978f82766c6155473d331e150b000000000000000004101c2934404b55616c76828f97a1aaafa49a92877e736d665f58534e4946443f41404040413f4446484d53565e616c717c859298a2aca89f948d80736a5f53473e33281c10040000000000000004101c2834404b545f6a717e87939fa2aaa9a199938e86827e7a777574737373747577797c80858b91969da5afa79f9691847a6e665c50443c32261b0f04000000000000000000030c18222c363f48505a616a6f7980868d92979c9fa2aaa7a9a8a7a6a6a6a7a8a9a8a6a7a09d9a94908a837c746d675e574d453b32291e150a0000000000000000111e2a3744515d6a77848989898989898989898989898989898989898989898989898989898989898989898989898989898983766a5d5043372a1d10000000000000000006111c263039434b545b60696e757c81868b9093999b9ea1a9a8abadafaca9a6a8a09d9a99928f8b86817c766f6b605d564e463d352b21180c030000000000101d293643505c6976838f8b7f7265584c3f3225190c00000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b8f8376695c504336291d10000613202c3946535f6c7986929f9f9f9f95887c6f6255493c2f22160900000000131f2c3946525f6c7985929f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9fa39f9f9e9d9c9a9897928e89837e766e69615a50483f352c20170d000000000000000000000000040f1a26313c44505c666e7b8491969ea6a9a19e97918e8b898888888a8d91969ea0a8a59e9590837a6d655b50453b3121180e0000000000000714212d3a4754606d7a8793a0ada69a8d8073675a4d4034271a0d01000815222e3b4855616e7b8894a1aea5988b7f7265584c3f3225190c000000000000131f2c3946525f6c7985929facb2a5988c7f7f7f7f7f7f7f7f7f7f7f7f7f7f80818385878a8d91969b9fa4ababa39f9691887f776d665c544a3f372d22180b0200000000000000000000000000000000000000000000000000000008131e28323e45515d67707d88939fa29fa2aab4aea194877b6e6154483b2e211508000000000000000000121e2b3845515e6b7884919eabaea194887b6e6155483b2e2727272727272727272727272727272727272727272727272727272423201c161008000000000000000007121c27303d46515b646e73808a92979fa3a69f9c9992908f8e8e8f9092989b9fa4a69f99928c81786d665c50473d30271d0b02000000000000061724303d4a5763707d8a99a3ac9f93867a6d6054474246484c4e505252535251504e4b4846423c3b3937332d302d2c29241d160d04000000000000000009141f2a36424d57606d78828f959fa7a69f959087817d79777574747476787b80858e939ca3aaa29892857b6e615a5044352b210c03000000000000000006131f2c3845515c67707d8a949fa9b0a69f93887e716c605c544e47433c3a38342e3433342d3338393c42464d525a616a6f7c86929aa4afa69f92877b6e62594f44392d20150a0000000000000006131f2c3845515c666f7c869299a4aea8a0979187817b75716d6869676766676768676d7073797e848e939fa4aca8a0969083786d60584e43372b20150a0000000000000000000b151e2a343e48505a626c717c848c92989fa2a9aca8a8a09e9c9a9a999a9a9b9d9fa3ababaaa69f9c95908781796e695e574d443b30261c110600000000000000111e2a3744515d6a77849095959595959595959595959595959595959595959595959595959595959595959595959595959083766a5d5043372a1d1000000000000000020c17232e38424b555d666c727b82888e92999c9fa4ababadaeaca9aba39f9d9a9795918d8a86837e7a756f6b636059524c443c342b23190f06000000000000101d293643505c6976838f8b7f7265584c3f3225190c00000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b8f8376695c504336291d10000613202c3946535f6c7986929393939393887c6f6255493c2f22160900000000131f2c3946525f6c7985929393939393939393939393939393939393939393939393939399929291908f8d8b8885817d77716c615f5750483f362d231a0e05000000000000000000000000000a152028343f4a545e696e7b848f939ea1a8a9a19e9a9795959495979a9ea0a8a8a19e938e837a6e685e53493f33291f0f060000000000000714212d3a4754606d7a8793a0ada69a8d8073675a4d4034271a0d01000815222e3b4855616e7b8894a1aea5988b7f7265584c3f3225190c000000000000131f2c3946525f6c7985929facb8a79c918c8b8b8b8b8b8b8b8b8b8b8b8c8c8d8e909297979a9ea1a8acaba39f99928d847d736c655c544a42382e241b100600000000000000000000000000000000000000000000000000000000020c16202935414b55606b74808d96a0abaeb4bcaea194877b6e6154483b2e211508000000000000000000121e2b3845515e6b7884919eabaea194887b6e6155483b34343434343434343434343434343434343434343434343434343434302f2c28211a110800000000000000000b151e2b343f49525c646e737e858e92999ea1a8a39f9d9c9a9b9c9d9fa3a9a29f9b948f877f776d665c544a3f352c1e150b000000000000000714212d3a4754606d7a86929faca4998a7d7063544b403a3b3f4144454646464543413e3d4347494846443f3f3c3a39352f281f160c0100000000000000030e1a26313b44505c666d7a8390959da5a7a099938e898683828181818385888c92979da5a7a09892867d70695e52483e3323190f000000000000000003101c28343f4a54606d7984919ea6b0aa9e948c7f736c625a504a423c37322d2c282327272722282b2d31363b42465058606a707e88939fa8aea3998f82766c6155493c31261b0f00000000000004111d2935414b55606d79839098a3aba9a09691857d746e6964615d565b5a5a5a5a555c6063666d7179818b939aa4afa89f958c80736a5f54473d32271b0f010000000000000007121d27303c46505a626c717e8691969fa2aaaba39f9b9796918f8e8d8d8d8d8f9092999a9ea1a9aba79f9a938d837b6e695e564c42382e23170c04000000000000111e2a3744515d6a7784909da2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a29d9083766a5d5043372a1d10000000000000000a141e28343f4a545d676d787f868f939b9fa3abacafaca9aaa29f9c999992908d8a8784817d7a76726d68636059544f45413a322b2219110700000000000000101d293643505c6976838f8b7f7265584c3f3225190c00000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b8f8376695c504336291d10000613202c3946535f6c7987868686868686867c6f6255493c2f22160900000000131f2c3946525f6c79868686868686868686868686868686868686868686868686868686868685858482807e7b7874706b64615a534d453e362d241b11080000000000000000000000000000030c17232e38424d565e696e7a828a91969d9fa7a7a7a4a2a1a1a2a4a6a7a7a09d96918a81796e685e564c41382d21170d000000000000000714212d3a4754606d7a8793a0aca69a8d8073675a4d4034271a0d01000815222e3b4855616e7b8894a1aca5988b7f7265584c3f3225190c000000000000131f2c3946525f6c7985929facb8ada39c98989898989898989898989898999a9b9c9ea1a9a7aba9a8a19e99928e87817a706b605b534a423930261c1209000000000000000000000000000000000000000000000000000000000000040e18242f3a434f59606d79849199a4afbbb9aea194877b6e6154483b2e211508000000000000000000121e2b3845515e6b7884919eabaea194887b6e61554840404040404040404040404040404040404040404040404040404040403d3c38332c231a100500000000000000030c19222d37404a525c636c717a81868d9196989b9c9e9f9f9f9f9e9d9b9997928e89827c736c655c544b42382e231a0c03000000000000000613202c3945515d677683909ca9ab9a8e8174665c5145382e323537383939393836313d464e5456555350494b494745413a31281d1307000000000000000009141f28343f4a545e686d7a838e929d9fa7a49f9b9892908e8e8d8e8f9197999ea1a9a29e9590867d706b60574d42362c221108000000000000000006121f2b3844505c66727f8c96a0acaea2988f82776c605a50443f38302b26201f1c171a1a1a171c1f20252a30363e464e58616c73808d96a1acab9f948a7d7064584e43372b1d120700000000000613202c3945515d67737f8c95a0aaada19791847b706b615e5754524c4e4d4d4d4e4b5153545c60676d747f88939fa5afa79f92877c6f62584e43372b1d1207000000000000000c18232e39424e58616c717f8a9298a0a8aba49f99928e8a8784828180808081828486898d92979ea1a8aca49f9590847b6e685e544a3f342820150a000000000000111e2a3744515d6a7784909d9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9d9083766a5d5043372a1d1000000000000006111c26303844505c666d79828c92989ea5acaeabaca49f9d9998928f8c898683807d7a7774716d6865615e56544f48443d353028201910070000000000000000101d293643505c6976838f8b7f7265584c3f3225190c00000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b8f8376695c504336291d100006121f2c3845525e6a757979797979797979766a6054473b2e22150800000000121f2b3844515d697479797979797979797979797979797979797979797979797979797979797978777674716f6c65636059555046423c332c241b12090000000000000000000000000000000006111c26303b444d575e686d757e848b9095979a9c9e9e9f9f9f9e9c9a9895908b847e756d675e564c443a2f261b0f05000000000000000714212d3a4754606d7a87939f9f9f9a8d8073675a4d4034271a0d01000815222e3b4855616e7b88949f9f9f988b7f7265584c3f3225190c000000000000131f2c3946525f6c7985929facacacada7a5a5a5a5a5a5a5a5a5a5a5a5a5a6a6a8a9a8a6aba39f9c9996918c87817b746d6761595049413930271e140a000000000000000000000000000000000000000000000000000000000000000007131d28313d45515d676f7c87939fa7b1acaca194877b6e6154483b2e211508000000000000000000121e2b3845515e6b7884919eabaea194887b6e61554d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4a48443e352c21160b000000000000000007101b252e38404a525a61686d747b8084888b8e90919292929291908e8c8985817c766f6a605b534b423930261c1108000000000000000004111d2935414b5566737f8c99a7ab9e9285796d6053463e3128282a2b2c2c2c242f39434e58606261605b53585654514b433a2f24180d0100000000000000030b17232e38424c565e686d79818990959b9fa2aaa39f9d9b9a9a9b9c9ea1a9a49f9c97928c837b706b60594f453b30241a100000000000000000000713202d3a4653606d7884919ea8b2a99f92867b6e655b50483e342e261e1b1312100c060d060b0f12131a1f252a343d46505a606d7984919ea8b0a69c8f83766a5f5347392e23180c00000000000714212d3a4754606d7a85929fa7b0a69e92857b6e696059524d47464141404040414045464b51555d606d727f8b939ea9afa3998f82766a605447392f24180c00000000000004101c2834404b545f6a717e87939fa2aaa9a199938e86827e7a777574737373747577797c80858b91969da5afa79f9691847a6e665c50443c32261b0f040000000000111e2a3744515d6a77839093939393939393939393939393939393939393939393939393939393939393939393939393939083766a5d5043372a1d100000000000000b17232e38424f59606d78828f949fa3aaafaca7a09d9a93908c8985827f7c7a7673706d686764605d5654524c48433d383229241e160e07000000000000000000101d293643505c6976838f8b7f7265584c3f3225190c00000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b8f8376695c504336291d100004111d2a36424e59636a6c6c6c6c6c6c6c6c6260584e43372b1f130600000000101c2935414d5862696c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6b6a69676562605b53544f49453e37312a211a12090000000000000000000000000000000000000a151e29323b454d565d606c71797e83878a8d8f9192929292918f8d8b87837e79716c605d554c443b32281d140a00000000000000000714212d3a4754606d7a8793939393938d8073675a4d4034271a0d01000815222e3b4855616e7b8893939393938b7f7265584c3f3225190c000000000000131f2c3946525f6c7985929f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9fa39f9f9e9d9c9b99979992908c89847f7b746e69605d554f443f382f271e150c020000000000000000000000000000000000000000000000000000000000000000010c161f2935404b55606b73808d95a09f9f9f9f94877b6e6154483b2e211508000000000000000000121e2b3845515e6b7884919eabaea194887b6e615a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a57554f473e33281c1004000000000000000009131c262e38404850565e61696e73787c7e818384858686858583817f7c79746f6a625f585049413930271e150a000000000000000000010d18242f3b4855616e7b88959faba1978a7e71645a50433a2f241d151f141c2935404b55606a6f6e6c65676563605d554b4135291d1104000000000000000006111c26303a444c565e676d747c83898e9298999b9d9e9f9f9f9f9e9d9b999993908b857f786e6960594f473d33291f1208000000000000000005111e2a36414c5664707d8a96a1adada1978c7f72695e53493f3628231c140c0a060300000000000306090e1419222b343e45515d67717e8a96a0acab9f94887c6f62544b4034281c100400000006131f2b37434e5866727f8c97a2adaa9e948a7d70695f574f46423b3935303433342e34383a40454b515b626d74818e97a1adab9e94897c6f62554b4035291d1004000000000006131f2c3845515c666f7c869299a4aea8a0979187817b75716d6869676766676768676d7073797e848e939fa4aca8a0969083786d60584e43372b20150a0000000000111e2a3744515d6a77838686868686868686868686868686868686868686868686868686868686868686868686868686868683766a5d5043372a1d10000000000003101c28343f4a54616b74818e949ea6aeafa7a09d95908b8783807c797673706d676764615e565754524c4746413a38322c272119130c0400000000000000000000101d293643505c6976838f8b7f7265584c3f3225190c00000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b8f8376695c504336291d1000010e1a26313d4751595e5f6060606060606055544e463c32271b0f03000000000d1925303b4650585d5f6060606060606060606060606060606060606060606060606060605f5f5e5d5c5a585553504948443d39342b261f180f0800000000000000000000000000000000000000030c172029333b444c525a61676d71767a7e818284858686858483817e7b77716d67615a514b433b322920160b0200000000000000000714212d3a4754606d7a868686868686868073675a4d4034271a0d01000815222e3b4855616e7b868686868686867f7265584c3f3225190c000000000000131f2c3946525f6c798592939393939393939393939393939393939398929291918f8e8d8b8886837f7c78736e69615f57514c433e332d261d150c0300000000000000000000000000000000000000000000000000000000000000000000040d18242f39434f59606d798390999393939393877b6e6154483b2e211508000000000000000000121e2b3845515e6b7884919eabaea194887b6e67676767676767676767676767676767676767676767676767676767676767676361594f44382c2014070000000000000000010a141c262e363e444c52575e61666a6f7274767878797978787675726f6d66626058534e443f382f271e150c03000000000000000000000714212d3a46535f697683909da8a99d9083766c61554b40352e27222222262d3845515d676f7c7b797674726f6d675d5145392c2013060000000000000000000a141e28323a444c555c606b6f777d8185898c8e90919292929291908f8d8a86837e79726d665f574f473d352b20170d0000000000000000000714202d3946525e6876828f9ca8b2ab9e9185796d60574d41382d2417110a02000000000000000000000002091019222935404b55606c7884919dabb0a69a8e8174665c5145382c1f13060000000815222e3b4754606a7884919ea9b1a79c8f82756c61574d453d36302d292427272723282c2e343a4145515b606d7a85929eaab0a69b8e8275675d5145392c1f13060000000004111d2935414b55606d79839098a3aba9a09691857d746e6964615d565b5a5a5a5a555c6063666d7179818b939aa4afa89f958c80736a5f54473d32271b0f0100000000101d2936424f5b677177797979797979797979797979797979797979797979797979797979797979797979797979797979797671665b4e4236291c10000000000006121f2b3844505c66707d89939da6b0aca49f959089837f7b76736f6d666663605d555754524c4a4745413a3936302c27211b160d08020000000000000000000000101d293643505c6976838f8b7f7265584c3f3225190c00000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b8f8376695c504336291d1000000915202b353f474e5253535353535353534947433c342b20150a000000000008141f2a343e464d5152535353535353535353535353535353535353535353535353535353535252514f4d4b4846443f3838332d28221a140e06000000000000000000000000000000000000000000050e172129323a414550555c6064686e7174767778797978787674716e6965605d555045403a312920170e040000000000000000000713202c3945525d687679797979797979736e64584c3f3326190d00000714212d3a46535f697679797979797979726d62564a3e3124180b000000000000131f2c3946525f6c798686868686868686868686868686868686868686858585848381807e7c7976736f6c65615e57534d45413a3127221b140b0300000000000000000000000000000000000000000000000000000000000000000000000007121d27313d45515c676f7c86868686868686867b6e6154483b2e211508000000000000000000121e2b3845515e6b7884919eabaea194887b737373737373737373737373737373737373737373737373737373737373737373706b6155483c2f231609000000000000000000020a131c242c323b41464d5254585f626568696b6c6c6c6c6b6a686663605c54544e4e4c4841382f1d150c03000000000000000000000005121e2a36424d5764717e8b96a1ab9f958a7d70675d51454039302f2e2f2f38404b55606d7986888583817e7c796d6054473a2d211407000000000000000000020c162029323a434b515960636b7075797c7f82838485868685858382807d7a76726d67605c544d453d352b23190e050000000000000000000814212e3b4754616e7a87939facafa3998c7f72675d51453b2f261b1206000000000000000000000000000000071018242f3944505b66727e8b99a3aeac9f9285796d6053463a2d2013080000000916222f3c4955626f7c8896a1acaca095897c6f625a50453b332a25201d191a1a1a181c1f23282f353f45515d67727f8b98a2aeac9f9286796d6053473a2d201406000000000613202c3945515d67737f8c95a0aaada19791847b706b615e5754524c4e4d4d4d4e4b5153545c60676d747f88939fa5afa79f92877c6f62584e43372b1d1207000000000e1a27333f4a555f676a6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6a665f554a3e32261a0d00000000000713202d3a4653606d7883909da5afafa49a938c837d77726e686663605c545653514b4a4746413e3a3935302d2a251e1b17151312100b0600010000000000000000101d293643505c6976838f8b7f7265584c3f3225190c00000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b8f8376695c504336291d100000040f19242d353d424546464646464646463c3b37322b22190f040000000000020d18222c343b4144464646464646464646464646464646464646464646464646464646464646454443413e3c3937332d2c27211d170e09030000000000000000000000000000000000000000000000050f1720282f353e434b5153565e616467696b6b6c6c6c6b696765615e5753514b433e352f281f170e050000000000000000000004111d2935414c565d6c6c6c6c6c6c6c6c67645c52473b2f23170b000005121e2b37424d575f6c6c6c6c6c6c6c6c65625b51463a2e221509000000000000121f2b3844515d6974797979797979797979797979797979797979797979787877767573716f6d666662605b53534d47423c352f281f17110a0200000000000000000000000000000000000000000000000000000000000000000000000000010b151f2834404b55606a6f797979797979797976695e53463a2d211407000000000000000000121e2b3845515e6b7884919eabb4a79a8e818080808080808080808080808080808080808080808080808080808080808080807d7063574a3d3024170a00000000000000000000020e1925303b444c525f6060606060605d5d5e5f5f5f5f5e5d5b596060606060605a58534a41362b2014080000000000000000000000020e1a26313b4653606d7984919ea7a79e9184796d605b514b423d3c3b3c3d424a515d67717e8b9892908e8b897e7164574b3e3124180b00000000000000000000050e172029313940454f54596063676d70727576787879797878777573706d6865605d55504a423c332b23191107000000000000000000030f1b27333f495364717e8b9aa4afac9f92867a6e61554b4033291d140a000000000000000000000000000000000007121d28333f4a54616d7a86929facaea298897d706356493d2f24190d0100000d1a2633404d596673808c99a8b2aa9d9083776a6054483e332a211a14110d080d070c1013181d242935414c55606d7985929fabaea2988a7d7164574a3e2e23170b000000000714212d3a4754606d7a85929fa7b0a69e92857b6e696059524d47464141404040414045464b51555d606d727f8b939ea9afa3998f82766a605447392f24180c000000000a16222e39434d555b5d606060606060606060606060606060606060606060606060606060606060606060606060606060605d5b554d43382d22160a0000000003101c28343f4a5464717e8a95a0acaea49f93888078706b65615e565653514a494745403d3a3936302d2c292424242b29262422201f1c1711110c0600000000000000101d293643505c6976838f8b7f7265584c3f3225190c00000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b8f8376695c504336291d1000000008121b242b31363839393939393939392f2e2b27201910070000000000000006101a222a30353839393939393939393939393939393939393939393939393939393939393938373634322f2d2b27221b1c16110c060000000000000000000000000000000000000000000000000000050d161e242931394045474c5254575a5c5e5f5f5f5f5e5c5a5854524d474540393129241d160d050000000000000000000000010d19242f3a444c525f606060606060605a58524a40362b1f13070000020e1a26313c454d535560606060606060585651493f34291e1206000000000000101c2935414d5862696c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6b6a6968666462605c545653504946423b373129241e160d0600000000000000000000000000000000000000000000000000000000000000000000000000000000030d18232e39434e5860626c6c6c6c6c6c6c6c6c5e574d42362a1e1205000000000000000000121e2b3845515e6b7884919eabb7a99d938e8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8073665a4d4033271a0d0000000000000000000005111e2a36414c565e6c6c6c6c6c6c6c6a675f555353524f5960636c6c6c6c6c6c67645c53483c3024180b00000000000000000000000009141f2c3844515c66727f8b95a0aca1968e81756e605c544f4a4948494a4e545b606d7984919e9f9d9a92857a6d6053473a2d2014070000000000000000000000050e171f272f343d43484f54555c606366686a6b6c6c6c6c6b6a686664615e5653514b443f38302a211911080000000000000000000005121f2b3744505b6575818e9bacb6a99c8f8276685e5243392f21170b020000000000000000000000000000000000010b17222d3846525d6875828f9ca8b4aa9a8d807367564c4135291d11040005111e2a36424d576976838f9ca9b5ab998c7f7366584e43362c21180f0905010000000004070c1319242f3a45515d6774818e9aa7b4aa9b8e817468544a3f34281c1003000006131f2b37434e5866727f8c97a2adaa9e948a7d70695f574f46423b3935303433342e34383a40454b515b626d74818e97a1adab9e94897c6f62554b4035291d100400000006111c27313b434a4f5153535353535353535353535353535353535353535353535353535353535353535353535353535353504e4a433a31271c11050000000006121f2b3844505c6675828f9ca7b1aa9d928b7e736d66605954524d494644403d3a39352f2e2d2a252120282d3031383533312f2d2b28231c1d181109000000000000101d293643505c6976838f8b7f7265584c3f3225190c00000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b8f8376695c504336291d100000000009121920262a2c2c2d2d2d2d2d2d2d22221f1b150f070000000000000000000810181f25292b2c2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2c2c2b2a29272522201f1b1711100b050000000000000000000000000000000000000000000000000000000000040c13191f272f34383b4146474b4e4f515253535251504e4b4846423b38352f271f18130c040000000000000000000000000008131e28323a414553535353535353534d4c4740382e24190e0200000009141f2a333c424648535353535353534c4a463f372d23180d010000000000000d1925303b4650585d5f606060606060606060606060606060606060605f5f5e5e5c5b5a585553514b4946443f3836312b261f19130c0400000000000000000000000000000000000000000000000000000000000000000000000000000000000007121d27303c464e54555f606060606060605f534d453b31251a0e02000000000000000000121e2b3845515e6b7884919eabb7afa59d9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a998d8073665a4d4033271a0d000000000000000000000714202d3946525e68767979797979797771675b4f464854606b70797979797979746e64584c4033271a0d01000000000000000000000004101c2834404a54606d7883919aa4a89e938c80746d6660595755555556585f666c75818e96a1aca3998e8174675d5145392c201306000000000000000000000000050d151d232932383d44484b515356595b5d5e5f5f5f5f5e5d5c5a5754524c47454039342e261e180f0800000000000000000000000613202d394653606c7885929eabb3a9988b7f7265564c4131271d0f050000000000000000000000000000000000000006111c2935414c5665727f8b98aab4aa9d918477685d5245392c201306000714202d3a46525e697885929eabafa399897c6f6256493d32231a0f060000000000000000000108131e2935404b5564707d8a97a9b3aa9d908377665c5044382b1f120600000815222e3b4754606a7884919ea9b1a79c8f82756c61574d453d36302d292427272723282c2e343a4145515b606d7a85929eaab0a69b8e8275675d5145392c1f1306000000000b151f2931393f42444646464646464646464646464646464646464646464646464646464646464646464646464646464643423e3831281f150a00000000000713202d3a4653606d7985929facaea3988d80746c605c544f4746413c3a38342e2d2c292421201d19242c34393d3e4442403e3b3a38342e2e29231b12090000000000101d293643505c6976838f8b7f7265584c3f3225190c00000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b8f8376695c504336291d100000000000080f151a1d1f20202020202020201615130f0a040000000000000000000000060d14191c1f1f202020202020202020202020202020202020202020202020202020201f1f1e1c1a181513120f0b0600000000000000000000000000000000000000000000000000000000000000000001080d151d23292c3036393b3e414344454646454543413e3b3a36302c29241d150d07010000000000000000000000000000010c1620282f35394646464646464646403f3b362e261c120800000000030e18212a31373a3b464646464646463f3e3a342d251b11060000000000000008141f2a343e464d51525353535353535353535353535353535353535352525251504e4d4b494645403c3937332d2a251f1a150d080100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b151e2b343c43474953535353535353534846423b33291f140900000000000000000000121e2b3845515e6b7884919eabacacafa9a7a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6998d8073665a4d4033271a0d000000000000000000000814212e3b4754616e7a86868686868683776a5d5144495663707d8686868686868074675a4e4134271b0e010000000000000000000000000c18232e3944515c66707d88939fa6a59c928c8079706b666462616263666a6f78808d939ea9a89f92877b6e62554b4035291d100400000000000000000000000000030b121821272c323839404546494c4f50515253535252504f4d4a4746413a39352f28231c150c060000000000000000000000000815222e3b4855616e7b8897a1adada197887b6e6255483b3022150b0000000000000000000000000000000000000000000d1924303c4855626f7b8898a2aeaca095877a6d6054473a2d211407000814212e3b4754616e7b8797a2adac9f92867a6d6053473a2d2014070000000000000000000000010d18242f3b4754616e7a8797a1adac9f9286796d6053463a2d20130700000916222f3c4955626f7c8896a1acaca095897c6f625a50453b332a25201d191a1a1a181c1f23282f353f45515d67727f8b98a2aeac9f9286796d6053473a2d20140600000000040d171f272e333637393939393939393939393939393939393939393939393939393939393939393939393939393939393736322d271f160d0300000000000815222f3b4855626e7b8898a2aeac9f92867a6d615a504a423d3936302d2c282320201d18141317222c363e45494b514f4d4a4846443f383a342d241b110600000000101d293643505c6976838f8b7f7265584c3f3225190c00000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b8f8376695c504336291d1000000000000004090e1112131313131313131309080603000000000000000000000000000002080d10121313131313131313131313131313131313131313131313131313131313131211100e0b0906050300000000000000000000000000000000000000000000000000000000000000000000000000030b12181c1f252a2d2e3134363838393939383634322e2d2a251f1d18120b030000000000000000000000000000000000040d161e24292c393939393939393934332f2b241c140a010000000000060f181f262b2d2e3939393939393932312e29231b13090000000000000000020d18222c343b41444646464646464646464646464646464646464646464545444342403e3c3a38342e2d2b27221b1a140e090300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030c19222b32373b3c46464646464646463b3a36312921170d0300000000000000000000121e2b3845515e6b7884919e9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f998d8073665a4d4033271a0d000000000000000000000814212e3b4754616e7a87939393939084776a5d5144495663707c89939393938d8174675a4e4134271b0e0100000000000000000000000007121c2834404a54606b73808d949fa7a49c928d837d7773706f6e6f7072767c828d929da5aaa1968d8174695f5343392f24180d01000000000000000000000000000001070c161b21272c2e34383a3d3f42434545464645454442403d3a3936302c29241d17110a03000000000000000000000000000a1724303d4a5763707d8a96a9b3ab9e928578695f53473a2e2114030000000000000000000000000000000000000000000813202d394653606c7985929facb1a795897c6f6256493c2f231609000916232f3c4956626f7c8995a9b3aa9e918477675d5145382c1f13060000000000000000000000000714202d3946525e687885919eabaea398887b6e6255483b2f22150800000d1a2633404d596673808c99a8b2aa9d9083776a6054483e332a211a14110d080d070c1013181d242935414c55606d7985929fabaea2988a7d7164574a3e2e23170b0000000000050d151c2227292a2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2a2926221c150d040000000000000a1723303d4a5663707d8996aab4a89c8f8275685e52443f38302d2a25201f1c181413100d07111d28343e485055575e5c59575553504a4a453f362d23180c01000000101d293643505c6976838f8b7f7265584c3f3225190c00000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b8f8376695c504336291d10000000000000000001040606060606060606060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001070c1014191e20212427292b2c2c2c2c2b29272521201e1a14100c070100000000000000000000000000000000000000040c13191d202d2d2d2d2d2d2d2d2726231f19120a0200000000000000060e141a1e21222d2d2d2d2d2d2d2524221e1811090100000000000000000006101a222a303538393939393939393939393939393939393939393939393837363533312f2d2c2823201f1b17110e09030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007101920272b2e2f39393939393939392e2d2a251f170f050000000000000000000000121e2b3845515e6b7884919393939393939393939393939393939393939393939393939393939393939393939393939393938d8073665a4d4033271a0d000000000000000000000814212e3b4754616e7a87949f9f9d9084776a5d5144495663707c89969f9f9a8d8174675a4e4134271b0e01000000000000000000000000000c18232e39424f59606d788290959fa7a49d95908984807d7c7b7c7d7f838890949da4aaa39891847a6d61574d4231281d12070000000000000000000000000000000000040a0f161b1d23282c2d30333537383939393938373533312e2d2a251f1d18120c060000000000000000000000000000000c1926323f4c5965727f8c98a5b2a99c8f837669574d42372b1e120600000000000000000000000000000000000000000006121f2b3844505b667783909daab1a4978b7e7164584b3e3125180b000a1723303d4a5663707d8996a3b0a99c90837669554b4035291d100400000000000000000000000005111e2a36414c566a7683909da9b4aa96897c6f6356493c302316090005111e2a36424d576976838f9ca9b5ab998c7f7366584e43362c21180f0905010000000004070c1319242f3a45515d6774818e9aa7b4aa9b8e817468544a3f34281c10030000000000040b11161a1d1e202020202020202020202020202020202020202020202020202020202020202020202020202020201d1c1a16110a03000000000000000b1724313e4a5764717d8a97a4b0a6998d807366564c41342e26201e191312100c070604010815212d3945505a61646b68666462605c545651483f34291d1105000000101d293643505c6976838f8b7f7265584c3f3225190c00000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b8f8376695c504336291d100000000000000000000000000000000000000000000000000000000000000000000004090e1112131313131313131313060400000000000000000000000000000000000000000000000004080a0a1313131313131313130e0e0b080300000000000000000000000000000000000000000000000000000000000004080e111414181b1c1e1f20201f1e1d1b181514120e0904000000000000000000000000000000000000000000000001080d111314202020202020201a1917130e080100000000000000000003090e12141520202020202020191815120d060000000000000000000000000810181f25292b2c2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2c2c2b2b2928272522201f1c1813120f0b060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070e151b1f22222c2d2d2d2d2d2d2d21211e1a140d05000000000000000000000000121e2b3845515e6b788486868686868686868686868686868686868686868686868686868686868686868686868686868686868073665a4d4033271a0d000000000000000000000814212e3b4754616e7a8794a1aa9d9084776a5d5144495663707c8996a3a79a8d8174675a4e4134271b0e010000000000000000000000000007121c27303d44505c666d7a8390959da5a7a09d95918d8a888888898c90959c9fa6a9a19892867c6f685e52453c311f160c0100000000000000000000000000000000000000040b1012181c1f202326282a2b2c2c2c2c2b2a29272421201d1913100c0701000000000000000000000000000000000e1b2834414e5b6774818e9aa7b3a79a8d8074675a4d4131261a0e02000000000000000000000000000000000000000000030f1c28333f4a546875818e9ba8b3a6998d8073665a4d4033271a0d000b1724313e4a5764717d8a97a4b0a89b8f8275685c4f422f24180c00000000000000000000000000010d192530424f5c6875828f9ba8b0a3968a7d7063574a3d3024170a000714202d3a46525e697885929eabafa399897c6f6256493d32231a0f060000000000000000000108131e2935404b5564707d8a97a9b3aa9d908377665c5044382b1f120600000000000000060a0e10111313131313131313131313131313131313131313131313131313131313131313131313131313131310100d0a050000000000000000000b1724313e4a5764717d8a97a4b0a5998c7f7266594c3f30231c15110e080807070808090e131925303d4955616c71777573716e6d6665625b51453a2e221509000000101d293643505c6976838f8b7f7265584c3f3225190c00000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b8f8376695c504336291d10000000000000000000000000000000000000000000000000000000000000000000080f151a1d1f20202020202020202013100c070100000000000000000000000000000000000000050b101416172020202020202020201b1a18140f0901000000000000000000000000000000000000000000000000000000000000020507080b0e10111213131212100e0b0807050200000000000000000000000000000000000000000000000000000001040707131313131313130d0d0b07020000000000000000000000000002050708131313131313130c0b0906010000000000000000000000000000060d14191c1f1f202020202020202020202020202020202020201f1f1f1e1d1b1a18161313100c0705030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040a0f13151620202020202020201514120e090300000000000000000000000000111d2a3743505c6872787979797979797979797979797979797979797979797979797979797979797979797979797979797979736e63584b3f3226190c000000000000000000000814212e3b4754616e7a8794a1a99d9084776a5d5144495663707c8996a3a79a8d8174675a4e4134271b0e0100000000000000000000000000000b151e28343f4a545d686d7a838e939ea0a8a8a09d999795949596999d9fa7aba49f9792867e706a60564c41332a1f0d040000000000000000000000000000000000000000000000070c10131316191c1d1e1f20201f1f1d1c1a171413110d080400000000000000000000000000000000000000101c2936434f5c6976828f9ca9b2a5998c7f7266594c3f3326190900000000000000000000000000000000000000000000000b17222d404d5a6773808d9aa6b3a89b8e8175685b4f4235281c0f000b1825313e4b5864717e8b97a4b1a89b8e8275685b4f4235281c070000000000000000000000000000081b2835414e5b6874818e9ba7b0a4978a7d7164574a3e3124170b000814212e3b4754616e7b8797a2adac9f92867a6d6053473a2d2014070000000000000000000000010d18242f3b4754616e7a8797a1adac9f9286796d6053463a2d2013070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1724303d4a5763707d8a96abb5a69a8d807367544b403428201c1816151514141515171a1e242b37434e5864717e8482807d7b7977726d62564a3d3124170b000000101d293643505c6976838f8b7f7265584c3f3225190c00000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b8f8376695c504336291d10000000000000000000000000000000000000000000000000000000000000000009121920262a2c2c2d2d2d2d2d2d2d2d1f1c18120b0300000000000000000000000000000000000810171c2023242d2d2d2d2d2d2d2d2d282724201a130b020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080d1012131313131313131313131313131313131313131313121211100f0d0b090706040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030608091313131313131313080705020000000000000000000000000000000f1b27333f4b5660686b6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c66635c52473b2f23170a000000000000000000000814212e3b4754616e7a87949c9c9c9084776a5d5144495663707c89969c9c9a8d8174675a4e4134271b0e010000000000000000000000000000030c17232e38424c565e686d79818991969d9fa4aca6a3a2a1a2a3a5a8a9a29f99938e857c706c61584e443a3021180e00000000000000000000000000000000000000000000000000000406070a0c0f10121213131212110f0d0a07070501000000000000000000000000000000000000000000101d2a3643505d697683909ca9b1a4978a7e7164574b3e3124180b0000000000000000000000000000000000000000000000061926323f4c5965727f8c98a5b2a89c8f8275695c4f4236291c0f000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2834414e5b6774818e9aa7b1a4978b7e7164584b3e3125180b000916232f3c4956626f7c8995a9b3aa9e918477675d5145382c1f13060000000000000000000000000714202d3946525e687885919eabaea398887b6e6255483b2f221508000000000000000000000000000000000000000000000105090b0b1313131313131313120706030000000000000000000000000000000000000000000000000000000916222f3c4955626f7c8899a4afa89b8e8275665c51453a322c29232322212121212223252a2f353f47535f6a76828f8f8c8a8886837e7265584b3f3225180c000000101d293643505c6976838f8b7f7265584c3f3225190c00000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b8f8376695c504336291d100000000000000000000000000000000000000000000000000000000000000008121b242b3136383939393939393939392c29231d150d0300000000000000000000000000000008121a22282d30313939393939393939393533302b251d140b010000000000000000000000000000000000000000000000000000000003090d1012131313131313131313060300000000000000000000000000000000000000000000000000000000000000000004080c0e0f13131313131313131313131313131313131313131313131313131313131313131313131313130f0e0c080400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b17232f3a444e565c5e60606060606060606060606060606060606060606060606060606060606060606060606060606060605a58524a40362a1f1307000000000000000000000814212e3b4754616e7a878f8f8f8f8f84776a5d5144495663707c898f8f8f8f8d8174675a4e4134271b0e0100000000000000000000000000000006111c26303a444c565e676d747d848a90939a9a9c9e9f9f9f9e9d9b9997928d87817a6f6a615a50463c32281e0f060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111e2a3744515d6a7783909daab0a3968a7d7063574a3d3024170a00000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4b1a99c908376695d5043362a1d10000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000a1723303d4a5663707d8996a3b0a99c90837669554b4035291d100400000000000000000000000005111e2a36414c566a7683909da9b4aa96897c6f6356493c30231609000000000000000000000000000000000000000000060c1115171820202020202020201f1312100c06000000000000000000000000000000000000000000000000000714202d3a4753606d7a86939facab9f9285796d60564c443d38342f2f2f2e2d2e2e2f3031363a4145515b626f7c87939b999798928a7e7164574b3e3124180b000000101d293643505c6976838f8b7f7265584c3f3225190c00000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b8f8376695c504336291d10000000000000000000000000000000000000000000000000000000000000040f19242d353d424546464646464646464638342f271f150b010000000000000000000000000006101a242c33393c3d46464646464646464641403c362f261d1309000000000000000000000000000000000000000000000000000000070e14191d1f20202020202020202012100c06000000000000000000000000000000000000000000000000000000000002090f14181b1c20202020202020202020202020202020202020202020202020202020202020202020202020201c1b18140f0902000000000000000000000000000000000000000000000000000000040607090c0e1011121313131211100f0d0b0807050200000000000000000000000000000000000000000000000000000000000000000000000000000000000000040607090c0e1011121313131211100e0b080705020000000000000000000000000000000000000000000000000007121d28323c444b505153535353535353535353535353535353535353535353535353535353535353535353535353535353534d4b4740382e24190e02000000000000000000000714212d3a4754606d7a8283838383838174675b4e414855626f7c8283838383827f7265584c3f3225190c00000000000000000000000000000000000a151e28323a444c555c606b70787e83878b8d909192929291908f8c8985817c746d68605850483e342b20160c000000000000000000000000000000000000000000000000000000000000000306060808080808080605030000000000000000000000000000000000000000000000000000111e2b3844515e6b7784919eaaafa396897c706356493d3023160a00000000000000000000000000000000000000000000000b1824313e4b5764717e8a97a4b1aa9d9083776a5d5044372a1d11000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000b1724313e4a5764717d8a97a4b0a89b8f8275685c4f422f24180c00000000000000000000000000010d192530424f5c6875828f9ba8b0a3968a7d7063574a3d3024170a00000000000000000000000000000000000000000911171d2124252d2d2d2d2d2d2d2d2b201f1c17110a03000000000000000000000000000000000000000000000006131f2c3945515d677683909dabada2978a7e71685e564f4745403e3c3b3b3a3a3b3b3d3f42464c515a626d76828f99a4a6aa9f92857a6d6053473a2d201407000000101d293643505c6976838f8b7f7265584c3f3225190c00000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b8f8376695c504336291d100000000000000000000000000000000000000000000000000000000000000915202b353f474e5253535353535353535345403931271d1207000000000000000000000000050e18222c363e44494a5353535353535353534e4c4841392f251a0f03000000000000000000000000000000000000000000000000000811191f25292b2c2d2d2d2d2d2d2d2d1f1c17110a030000000000000000000000000000000000000000000000000000030c131a202527282d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d282725201a130c03000000000000000000000000000000000000000000000004070c10121316191b1d1e1f1f201f1f1e1d1b19171414110e0806030000000000000000000000000000000000000000000000000000000000000000000000000003070c10131416191b1d1e1f1f201f1f1e1c1a181514120e09050200000000000000000000000000000000000000000000010c16202a323a3f43454646464646464646464646464646464646464646464646464646464646464646464646464646464646403f3b362e261c120800000000000000000000000713202c3945525d686d767676767676746f64584c4047535f6a6f767676767676726d62564a3e3125180b0000000000000000000000000000000000030c162029323a434b515960666d71767b7e8183848586858484827f7d79746f6a615e564e463e362c22190e050000000000000000000000000000000000000000000000000000000000060b0f121314141414141413120f0b06000000000000000000000000000000000000000000000000121f2b3845525e6b7885919eabafa296897c6f6356493c3023160900000000000000000000000000000000000000000000000a1724313d4a5764707d8a97a3b0aa9e9184776b5e5144382b1e11000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000b1825313e4b5864717e8b97a4b1a89b8e8275685b4f4235281c070000000000000000000000000000081b2835414e5b6874818e9ba7b0a4978a7d7164574a3e3124170b0000000000000000000000000000000000000009121b22292e31323939393939393939382d2c28231c150c030000000000000000000000000000000000000000000004101d2935404b5566737f8c99a3aea99e91857a6d68605953514b4b494848474748484a4b4d53555d606c727f8c949fabaea3998d8074675d5145392c201306000000101d293643505c6976838f8b7f7265584c3f3225190c00000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b8f8376695c504336291d100000000000000000000000000000000000000000000000000000000000000e1a26313d4751595e5f606060606060605f514b43392f23180c0000000000000000000000030c17202a343e485055576060606060606060605b59534b41362b20140800000000000000000000000000000000000000000000000007111a232a3135383939393939393939392c28231c150c03000000000000000000000000000000000000000000000000020c151e252c31343539393939393939393939393939393939393939393939393939393939393939393939393939393534312c251e150c020000000000000000000000000000000000000001070c1013181c1f20232527292b2b2c2d2c2c2b2a28262421201e1915120f0a03000000000000000000000000000000000000000000000000000000000000000000060b1012181d1f202325282a2b2b2c2d2c2c2a29272521211e1a14110e0902000000000000000000000000000000000000000000050f1820282f333738393939393939393939393939393939393939393939393939393939393939393939393939393939393933322f2a241c140a00000000000000000000000004111d2935414c565d6069696969696967645c53483c434e585f6269696969696965625b51463a2e221609000000000000000000000000000000000000040d172029303940454f545c6064686e7174767878797878777573706d67625f58524c443d342c241a100700000000000000000000000000000000000000000000000000000000020a11171c1f20212121212121201f1b17110a0200000000000000000000000000000000000000000000121f2b3845525e6b7884919eabafa296897c6f6356493c3023160900000000000000000000000000000000000000000000000b1724313e4a5764717d8a97a4b0aa9d9184776a5e5144372b1e11000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2834414e5b6774818e9aa7b1a4978b7e7164584b3e3125180b00000000000000000000000000000000000006111b242d343a3d3e4646464646464646453a38342e261e150a00000000000000000000000000000000000000000000000c18242f3b4754616e7a86929fa8ada19790827a6f6b63605c5557565554545454555658575e61676d747e88939fa6b0a89f92867b6e61554b4035291d1004000000101d293643505c6976838f8b7f7265584c3f3225190c00000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b8f8376695c504336291d10000000000000000000000000000000000000000000000000000000000000111d2a36424e59636a6c6c6c6c6c6c6c6c6c5c554b4034291c1004000000000000000000000b151e29323c46505a61646c6c6c6c6c6c6c6c6c68645d53483c3024180b0000000000000000000000000000000000000000000000030e19232c353c414546464646464646464638342e261e150a00000000000000000000000000000000000000000000000009131e272f373d4042464646464646464646464646464646464646464646464646464646464646464646464646464642403d372f271e1309000000000000000000000000000000000003090e12181d1f23282c2d3032343638383939393838373533312e2d2a25211f1b150f0b060000000000000000000000000000000000000000000000000000000000020a11171c1f24292c2d30323437373839393938373634312e2d2a25201e19140e09020000000000000000000000000000000000000000060f161d23272a2b2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2726231f19120a02000000000000000000000000010d1924303a444c52545c5c5c5c5c5c5b58534a41363c464e53555c5c5c5c5c5c585651493f34291e120600000000000000000000000000000000000000050e171e272e343d424a5053565e616567696b6c6c6c6b6a686663605c55534e46413a322b221a110800000000000000000000000000000000000000000000000000000000020b141c22282b2d2e2e2e2e2e2e2d2b27221b140b02000000000000000000000000000000000000000000111e2b3844515e6b7784919eaab0a396897d7063564a3d3023170a00000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1a99d9083766a5d5043372a1d10000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0000000000000000000000000000000000010c17222d363f454a4b53535353535353535246443f3830261c1106000000000000000000000000000000000000000000000714202d3946525e6874808d96a1aaa99f9490847c76706d67666462626160616162636567696e737a818b939aa4afaaa1968d8074695e5343392f24180d01000000101d293643505c6976838f8b7f7265584c3f3225190c06060606060606060606060606060606060606060606060606060c1925323f4c5865727f8b8f8376695c504336291d10000000000000000000000000000000000000000000000000000000000000121f2c3845525e6a75797979797979797976675c5145382c1f130600000000000000000007121c27303a444e58616c70797979797979797979746f64594c4033271a0e010000000000000000000000000000000000000000000009141f2a353e474d51535353535353535353443f3830261c110600000000000000000000000000000000000000000000040f1a252f3941484d4f53535353535353535353535353535353535353535353535353535353535353535353535353534f4d4841392f251a0f04000000000000000000000000000001070c141a1d24292c2e34383a3c3f4143444546464645444342403e3b3936302e2b261f1c17110a020000000000000000000000000000000000000000000000000003090c141c23282b2f35383a3c3f41434445464646454443413e3b3a36312d2a251f1a140d050000000000000000000000000000000000000000050c12171b1d1e20202020202020202020202020202020202020202020202020202020202020202020202020202020201a1917130e0800000000000000000000000000000008131e28323a4145475050505050504e4c4841382f343c4347485050505050504c4a463f372d23180d010000000000000000000000000000000000000000050c151d232830383f44464d5254585a5d5e5f5f5f5e5d5c595653514b47433c3630292019100800000000000000000000000000000000000000000000000000000000000a141d262d3338393b3b3b3b3b3b3937332d261d140a000000000000000000000000000000000000000000111e2a3744515d6a7784909daab0a3978a7d7064574a3d3124170a00000000000000000000000000000000000000000000000c1825323f4b5865727e8b98a5b1a99c8f8276695c504336291d10000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000000000000000000000000000000000005111d29343f4850565860606060606060605e53504a42382e23170c0000000000000000000000000000000000000000000005111e2a36414c56606d7a849198a2aaa69f969189827d797573716f6e6e6d6d6e6e707274777b80858e939fa4acaba3989184796d60574d4231281d120700000000101d293643505c6976838f8b7f7265584c3f322519131313131313131313131313131313131313131313131313131313131925323f4c5865727f8b8f8376695c504336291d1000000000000000000104060606060606060606000000000000000000000013202c3946535f6c798786868686868686796d6053473a2d2014070000000000000000081118232e39424c565f6a707e8786868686868686868174685b4e4135281b0e02000000000000000000000000000000000000000000010d1925313c4750585e5f606060606060605f504a42382e23170c000000000000000000000000000000000000000000000814202c37414b53595b60606060606060606060606060606060606060606060606060606060606060606060606060605b59534b41372c20140800000000000000000000000000030b12181f252a2f35393a404446494c4e5051525253525251504e4c4a4746413c3a37312b28221c140b070000000000000000000000000000000000000000000000060d141a1e262e34383a404547494c4e50515252535252514f4d4b4846423b3a36302a251f170e07010000000000000000000000000000000000000001070b0f111213131313131313131313131313131313131313131313131313131313131313131313131313131313130d0c0a070200000000000000000000000000000000020c1620283035393a43434343434341403c362f262a32373b3c4343434343433f3e3a342d251b110700000000000000000000000000000000000000000000030b12181e262e34383b4146474b4e505152535251514f4c4a4645403937322a251e170e07000000000000000000000000000000000000000000000000000000000006111c262f383f444647474747474746443f382f261b11060000000000000000000000000000000000000000101d2a3643505d697683909ca9b1a5988b7e7265584b3f3225180700000000000000000000000000000000000000000000000d1a2633404d596673808c99a6b3a89b8f8275685c4f4235291c0f000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b00000000000000000000000000000000000915212e3a45505a62656c6c6c6c6c6c6c6c6b605c544a3f34281c1003000000000000000000000000000000000000000000020e1925303b45525d686f7c869298a0a8a8a09e948f8a8582807e7c7b7b7a7a7b7b7d7e8084878d92979da5afaaa29992867c6f675d51453b311f160c0100000000101d293643505c6976838f8b7f7265584c3f322520202020202020202020202020202020202020202020202020202020202025323f4c5865727f8b8f8376695c504336291d1000000000000004090e11121313131313131313090806030000000000000013202c3946535f6c7986929393939393867a6d6053473a2d20140700000000000000060f19232834404a545e686f7c86929a93939393968f82786d6053463a2d2013070000000000000000000000000000000000000000000004101d2935414d58626a6c6c6c6c6c6c6c6c6c5c544a3f34281c10030000000000000000000000000000000000000000000c1825313d48535d65686c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c68655d53483d3125180c000000000000000000000000060d151d24293136394045474a515356585a5c5e5e5f605f5f5e5d5b595754524c4847433c38332d261d18120b030000000000000000000000000000000000000000070f181f262a30383f44464b515356585b5d5e5e5f605f5f5d5c5a5854534d4746423b3630292018120b03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040e161e24292c2d3636363636363433302b251d20262b2e2f36363636363632312e29231b130900000000000000000000000000000000000000000000000000070c151c23282c3036393b3e414345454645454442403d3a38342e2b262019130d050000000000000000000000000000000000000000000000000000000000000b17222d38424a505354545454545453504941382d22170b00000000000000000000000000000000000000000f1c2835424f5b6875818e9ba8b3a6998c807366594d402f23180c00000000000000000000000000000000000000000000010e1b2834414e5b6774818e9aa7b4a79a8e8174675b4e4134281b0e000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b00000000000000000000000000000000000b1724313d4a56626c717979797979797979786d665c5044382c1f13080000000000000000000000000000000000000000000008141e2935414c56606a707d8691969fa3aba69f9c98928f8c8a89888787878788898b8d9195999fa2a9aba69f9892877e706a60554b4133291f0d040000000000101d293643505c6976838f8b7f7265584c3f322d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d323f4c5865727f8b8f8376695c504336291d100000000000080f151a1d1f20202020202020201615130f0a04000000000013202c3946535f6c7986929f9f9f9f93867a6d6053473a2d201407000000000000040d18212b353d44515c666d7a849198a29f9fa19791847a6d665c5144382c1f12060000000000000000000000000000000000000000000005121f2b3845515e6a74797979797979797976665c5044382c1f12060000000000000000000000000000000000000000000e1b2734404d59656f757979797979797979797979797979797979797979797979797979797979797979797979797979756f65594d4034271b0e00000000000000000000000910181f272f353b42464b5153545c60636567696b6b6c6c6c6b6b6a686664615e5655534e46443f382f28231d150c05000000000000000000000000000000000000081019212931363e424a5053555d606365676a6a6b6c6c6c6b6a696764615e5754524d46423b3329241d150d040000000000000000000000000000000000000000000000000000000000020608080b0e1011121313121211100d0b0807050200000000000000000000000000000000000000000000000000000000000000000000000000040c13191d2021292929292929282724201a13151b1f21222929292929292525221e181109010000000000000000000000000000000000000000000000000000030a11171c1f252a2d2e3234363839393938373533302d2c28231d1b150d0802000000000000000000000000000000000000000000000000000000000000030f1c28333f4a545b60616161616161605b53493f33271b0f03000000000000000000000000000000000000000d1a2734404d5a6773808d9aa6b3a89b8e817568554b4034291c100400000000000000000000000000000000000000000005121e2a36424d576976838f9ca9b2a5988c7f7265594c3f3226190c000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0000000000000000000000000000000005121e2a36424d5765717e868686868686868685786d6053463a3025190d01000000000000000000000000000000000000000000020d19242f3a434e58606b707c848d92999fa2aaaaa29f9c99979595949394949596989a9da0a8abaaa79f9d948f857d706c61584e433a2f21170d000000000000101d293643505c6976838f8b7f7265584c3f393939393939393939393939393939393939393939393939393939393939393939393f4c5865727f8b8f8376695c504336291d100000000009121920262a2c2c2d2d2d2d2d2d2d22221f1b150f070000000013202c3946535f6c7986929facaca093867a6d6053473a2d2014070000000000020b161f2a333d47515b606d78829096a1aaaea39992857b6e685d544a4034281c1004000000000000000000000000000000000000000000000613202c3946535f6c798686868686868686786d6053463a2d2013070000000000000000000000000000000000000000000f1c2835424f5b68758286868686868686868686868686868686868686868686868686868686868686868686868686868175685b4f4235281c0f0000000000000000000009121b222a313940454d53555d6065666d6f72747677787979797877767573716e6867625f5853504a423d342e271e170e050000000000000000000000000000000008111a222b333b424650545c6063676d6f727476777879797978777674716e6966615e56524d453f352f271f160d04000000000000000000000000000000000000000000000000000205090e121415181b1d1e1f20201f1f1e1c1a181514120e090502000000000000000000000000000000000000000000000000000000000000000000000002080d1113141d1d1d1d1d1d1b1a18140f080a0f1215151d1d1d1d1d1d191816120d07000000000000000000000000000000000000000000000000000000000000060c1014191e202125272a2b2c2c2c2b2a292623201f1c18120f0a04000000000000000000000000000000000000000000000000000000000000000006121f2b3844505b666c6e6e6e6e6e6e6c655b5044372b1f1205000000000000000000000000000000000000000c1925323f4c5865727f8b98abb5aa9d908477675c5145382c1f13060000000000000000000000000000000000000000000714212d3a46535f697885929fabb4aa968a7d7063574a3d3024170a000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000000000000000000000000000000000714212d3a46535e69768390939393939393978a7d7063564c4135291d11050000000000000000000000000000000000000000000008131e28313c464f59606a6f7980878e92989b9fa2aaa6a6a4a2a1a1a0a0a1a1a3a5a7a7aca49f9d9995908a827b706b615a50463d31281d0f05000000000000101d293643505c6976838f8b7f7265584c4646464646464646464646464646464646464646464646464646464646464646464646464c5865727f8b8f8376695c504336291d1000000008121b242b31363839393939393939392f2e2b272019100700000013202c3946535f6c7986929facada093867a6d6053473a2d20140700000000000a141d28313c454f59626d74818e949fa8aea49f92877d6f695f564c42392e23180c00000000000000000000000000000000000000000000000613202c3946535f6c798692939393939386796d6053463a2d2013070000000000000000000000000000000000000000000f1c2835424f5b6875828e9393939393939393939393939393939393939393939393939393939393939393939393938e8175685b4f4235281c0f00000000000000000009121b242c343c434b51575e61676d7175797c7f81838485858685858483817f7d7a77736f6a64605b544f454039302920170f050000000000000000000000000000060f1a232c343d454d535a61666d7075797c7f81838485858685858482807e7b77736e69615e575145403931281f160c030000000000000000000000000000000000000000000002080e11151a1e21222528292b2c2c2c2c2b2b29272522211e1a14120e09020000000000000000000000000000000000000000000000000000000000000000000000010407071010101010100e0d0b08030000030608091010101010100c0b09060100000000000000000000000000000000000000000000000000000000000000000003080e111414181b1d1e1f201f1e1e1c19171313100c0700000000000000000000000000000000000000000000000000000000000000000000000613202d394653606c787a7a7a7a7a7a776c605346392d20130600000000000000000000000000000000000000091623303c4956636f7c8999a4afac9f9286796d6053473a2d22170b0000000000000000000000000000000000000000000815222e3b4855616e7b8897a2adaea298887b6e6155483b2e221508000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000000000000000000000000000000000815212e3b4854616e7b87939f9f9f9f9fa99b8f8275685e5246392d20150a00000000000000000000000000000000000000000000010c161f2b343d474f585f676d737b81868b8f9298989a9b9d9e9f9f9f9f9f9f9e9d9c9a989a93908d88837d766e69615950483e342b1f160c00000000000000101d293643505c6976838f8b7f72655853535353535353535353535353535353535353535353535353535353535353535353535353535865727f8b8f8376695c504336291d100000040f19242d353d424546464646464646463c3b37322b22190f04000013202c3946535f6c7986929facada093867a6d6053473a2d2014070000000006111c262f3a434d57606b727f8b939da6afa59c928b7e716b60574d443a30271c120700000000000000000000000000000000000000000000000613202c3946535f6c7986929f9f9f9f9386796d6053463a2d2013070000000000000000000000000000000000000000000f1c2835424f5b6875828e9b9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9b8e8275685b4f4235281c0f000000000000000008121b242d363e464e555d60696e74797e8285898b8d8f91919293929291908e8c8a8784807c76716c666059514b433b332921170e05000000000000000000000000030d18212c353e464e575f616c70787d8185898b8e90919192939292908f8d8b87847f7b746e69625b514b433a31281e150b000000000000000000000000000000000000000002080d14191e20262b2e2f323436383939393938373634322e2d2b26201e1a140e090200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020507080b0e101212131212110f0d0a070604000000000000000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a8787878787877a6d6154473a2e211407000000000000000000000000000000000000000714202d3a4753606d7a86939facaea399897d706353493f33271b0f030000000000000000000000000000000000000004111d2935414c5565717e8b98a9b3ac9f9285786d6053463a2d201307000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b00000000000000000000000000000007131f2c38434e5866737f8c9aa4afaca8aaac9f92867a6d6154473c32261b0f0000000000000000000000000000000000000000000000040d19222b353d464e555d60696e747a7e8285888b8d8f909192929292929291908f8d8c898683807c76706c615f574f473e362c22190d0400000000000000101d293643505c6976838f8b7f72656060606060606060606060606060606060606060606060606060606060606060606060606060606065727f8b8f8376695c504336291d1000000915202b353f474e5253535353535353534947433c342b20150a000013202c3946535f6c7986929facada093867a6d6053473a2d201407000000071017222d38424c555f69707d87929fa5afa79e938d80736c61594f453c32281e150b0000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaca09386796d6053463a2d2013070000000000000000000000000000000000000000000f1c2835424f5b6875828e9ba8acacb2adaba5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a59b8e8275685b4f4235281c0f0000000000000006101a242d363f4850585f676d737b80858b8f9298989a9c9e9e9f9f9f9e9e9d9b999795908d88837e786f6b605c554d453b332920170c0300000000000000000000010b151f2a333e474f5860696e767d84898e9298989a9d9d9e9f9f9f9e9d9c9a9795918c86817b726d605d554b433a30271d1207000000000000000000000000000000000000040c13191f252a2d31373a3b3e41434445464645454443403e3b3a37312d2a251f1a140d05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010507070c0f0e0c0904000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a8794949494877a6d6154473a2e211407000000000000000000000000000000000000000613202c3945515d677784909daab4ab9a8d8073655b5044372b1f140a000000000000000000000000000000000000010c13202c3945515d6775828e9ba8b5a89c8f8275665c5044382b1f1206000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0000000000000000000000000000000915222e3b4854606a7784919eaca49f9b9ea5a3998b7f7265584e43372b1c12070000000000000000000000000000000000000000000000071019232b343c434b51575f61676d7175797c7e80828384858586868585848482817f7d7a77736f6a64615a534d453e352c241a10070000000000000000101d293643505c6976838f8b7f726c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c727f8b8f8376695c504336291d1000010e1a26313d4751595e5f6060606060606055544e463c32271b0f030013202c3946535f6c7986929facada093867a6d6053473a2d2014070000050e192228333f4a545d676e7b859299a3afa89f958e81776c605a50473d332a20160c030000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaca09386796d6053463a2d2013070000000000000000000000000000000000000000000f1c2835424f5b6875818e9babb5b2a8a19e98989898989898989898989898989898989898989898989898989898988e8275685b4f4235281c0f000000000000030c18222c363f48505a616a6f7980868d92979c9fa2aaa7a9a8a7a6a6a6a7a8a9a8a6a7a09d9a94908a837c746d675e574d453b32291e150a0000000000000000000007121d27313c454f59616a6f7b828a91969b9fa2aaa7a7a5a3a2a2a3a4a5a8a7a7a09d99928e867f756d675d554b42392e23180c0300000000000000000000000000000000080e161e25293036393c4247484b4e50515253535252514f4d4b4846423c3a36302a251f170f0800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080d111314191c1b19150f090200000000000000000000000000000000000000030613131313131313130d0c0a07020000000000000000000000000003060809131313131313130b0b09050100000000000000000000000000000000000000000000000814212e3b4754616e7a8794a1a094877a6d6154473a2e2114070000000000000000000000000000000000000004101d2935404b556773808d9aa9b3ab9e9184786c6053463c2f261b1106000000000000000000000000000000000007131d28333f4a54606d7a86929facb1a7988b7f7265544a3f34281c1003000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000000000000000000000000000004101c2834404b54626f7c8996a0a49a938e939eab9d9083776a5f5347392e23180c000000000000000000000000000000000000000000000000071119222a313940454d53555d6065666d6f71737576777879797979787877757472706d6866625f58555046423b332c231a1208000000000000000000101d293643505c6976838f8b7f79797979797979797979797979797979797979797979797979797979797979797979797979797979797979797f8b8f8376695c504336291d100004111d2a36424e59636a6c6c6c6c6c6c6c6c6260584e43372b1f13060013202c3946535f6c7986929facada093867a6d6053473a2d20140700030d17202b343d44505b666d79839197a2abaaa1969083796d655b50483e352b21180e04000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaca09386796d6053463a2d2013070000000000000000000000000000000000000000000d1a2734404d5a6773808d99a3aeada196918b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8175685b4f4235281c0f0000000000000b151e2a343e48505a626c717c848c92989fa2a9aca8a8a09e9c9a9a999a9a9b9d9fa3ababaaa69f9c95908781796e695e574d443b30261c11060000000000000000000c18242f39434d57616b707c858f949ea0a8aca8a19e9a989695959697989c9fa2aaaba39f98928b81796d675d544b4034281e150b0000000000000000000000000000020a121a202830353b4146474e5355585b5c5e5f5f5f5f5e5e5c5a5855534d4846423b363029211a120a020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040a0f13191d202126292825201b140c0300000000000000000000000000000000060c101220202020202020201a1917130e0800000000000000000000040a0f13151620202020202020181715110c06000000000000000000000000000000000000000000000814212e3b4754616e7a8794a1a094877a6d6154473a2e21140700000000000000000000000000000000000000010d18242f3d495663707c8997a1adaca196897d7063584e41382d22170f06000000000000000000000000000000071118242f3844505b66717e8b98a2aeaca095887b6e6155483b2e23170b00000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000000000000000000000000000006131f2c3845515c6674818d9aa89f9388828e9baaa095887c6f62544a4034281c10040000000000000000000000000000000000000000000000000710181f282f353b42464c5154545c60626567686a6b6c6c6c6c6c6c6b6a69676563605d5655534e49443e36312a211a110800000000000000000000101d293643505c6976838f918b86868686868686868686868686868686868686868686868686868686868686868686868686868686868686868b918f8376695c504336291d100006121f2c3845525e6a757979797979797979766a6054473b2e2215080013202c3946535f6c7986929facada093867a6d6053473a2d201407010b151f29333d46505a606c78828f95a0a9aba29891847a6e675c53493f362d23190f0600000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaca09386796d6053463a2d2013070000000000000000000000000000000000000000000815212e3b4854616e7b86929faaab9e91847f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7d7063564a3d3023170a000000000007121d27303c46505a626c717e8691969fa2aaaba39f9b9796918f8e8d8d8d8d8f9092999a9ea1a9aba79f9a938d837b6e695e564c42382e23170c040000000000000004101d2935404b555f69707d8692979fa6aca69f9c96918e8b898988898a8c8f92989ea1a8aaa29f938f83796d665c51453d30271c1207000000000000000000000000020b141c242c323a41464d5254575f626567696b6c6c6c6c6b6a696765615f5754524d46423b332c241c140a020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001070c10161b1e25292d2e333534312c251e150c0200000000000000000000000000030a11171c1f2d2d2d2d2d2d2d2d2726231f19120a0200000000000000070f161b1f22232d2d2d2d2d2d2d2524211d1811090000000000000000000000000000000000000000000814212e3b4754616e7a8794a1a094877a6d6154473a2e21140700000000000000000000000000000000000000000713202d3a4653606d7985929eacb2a89c8f82756a5f53493f332721180f0802000000000000000000000003091119232935404b55606c7884919daab3a99d908477695f53463a2d1c110600000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b00000000000000000000000000000713202d3a4653606d7985929eaa9d90837d8998a2a79a8d8074665c5144382c1f130800000000000000000000000000000000000000000000000000060d161d242931363a4145474a505355585a5c5d5e5f5f5f5f5f5f5e5d5c5a595654524c4847433c39332a261f180f080000000000000000000000101d293643505c6976828f9393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393938f8376695c504336291d10000613202c3946535f6c7987868686868686867c6f6255493c2f2216090013202c3946535f6c7986929facada093867a6d6053473a2d20140707121d27313b454e58616c73808d949ea7afa39992867c6f685e554b41382d241b11070000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaca09386796d6053463a2d2013070000000000000000000000000000000000000000000714212d3a46535e6974818e98a2ada196887c7272727272727272727272727272727272727272727272727272727272706b6054483c2f22160900000000000c18232e39424e58616c717f8a9298a0a8aba49f99928e8a8784828180808081828486898d92979ea1a8aca49f9590847b6e685e544a3f342820150a0000000000000006131f2c3845515d676e7b869298a1a9aaa29f948f8984817e7d7c7c7c7d7f82868b91969da4aea59e958f82786d60594f42392e23180c0000000000000000000000010b141d262e363e444c52565e61666a6e717476777879797878777673716e6966615e57524d453e362e261c140a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003090e12181d1f272b3035393a3f42413d3730271e1409000000000000000000000000030c151c23282c393939393939393933322f2a241c140a00000000000007101920272b2e2f3939393939393932312e29221b120900000000000000000000000000000000000000000814212e3b4754616e7a8794a1a094877a6d6154473a2e211407000000000000000000000000000000000000000006121f2c3844505c6673808d9aa4afaa9e94887c6f655b50443d332a2219140e09060400000100000406090e141a232b353d45515d67717e8a95a0acada2978b7e7265574d42362a1e0a0000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0000000000000000000000000005111d2935414c5664707d8a97a2a9998c807885929fab9e9285796d6053463a3025190d0100000000000000000000000000000000000000000000000000040c12181f262a2f35393a3f4446494b4d4f505152525353525251514f4e4c4a4745413c3b37322d28221a140e06000000000000000000000000101d293643505c69768286868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868376695c504336291d10000613202c3946535f6c7986929393939393887c6f6255493c2f2216090013202c3946535f6c7986929facada093867a6d6053473a2d2014071118242f39434d57606a717e8b929ca6aea49f92877d706a5f564c43392f261b1209000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaca09386796d6053463a2d20130700000000000000000000000000000000000000000005121e2a36424d57616e7b86929fa8a89c8f82766c6565656565656565656565656565656565656565656565656565656360594f44382c2014070000000004101c2834404b545f6a717e87939fa2aaa9a199938e86827e7a777574737373747577797c80858b91969da5afa79f9691847a6e665c50443c32261b0f04000000000004111d2935414b55606d79839098a2aaa9a198928a827c787472706f6f70717275797e848d929fa4aba79f948d80746b60544a4034281c10040000000000000000000009131d262f38404850565e61686e73777b7e81838485868685858482807e7b77736e69615e57504840382e261c13090000000000000000000000000000000000000000000000000000000000000000000000000000000000060c10151a1d24292c32383a4146474c4f4d49423930251b0f0400000000000000000000000a151e262e34384646464646464646403f3b362e261c120800000000040f19222b32383b3c464646464646463e3d3a342d241b1106000000000000000000000000000000000000000814212e3b4754616e7a8794a1a094877a6d6154473a2e211407000000000000000000000000000000000000000003101c28343f4a54616e7b87939fabb0a69c9083776c60584e453c342a251e1a1312100c070e070c1013131a1f262a353d47505a606d7984919ea7b1a99f9285796d6053473b31261a0e0000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000000000000000000000000000713202d3946525e6875828f9ba9a197897c75828e9baba1978a7d7064564c41362a1e1105000000000000000000000000000000000000000000000000000001070d141a1e24292c2e34383a3c3e40424344454646464645454442413f3d3a3935302e2b26201c170e0903000000000000000000000000000f1c2935424e5a66707679797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797670665a4e4235291c0f000613202c3946535f6c7986929f9f9f9f95887c6f6255493c2f2216090013202c3946535f6c7986929facada093867a6d6053473a2d2014101a232935404b555e696f7c86929fa4aea69d928b7f726b61584e443b31271d140a00000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaca09386796d6053463a2d201307000000000000000000000000000000000000000000020e1a25313b46525e6973808c96a0ac9f948b7e716a5f5658585858585858585858585858585858585858585858585856544f473d33271c10040000000006131f2c3845515c666f7c869299a4aea8a0979187817b75716d6869676766676768676d7073797e848e939fa4aca8a0969083786d60584e43372b20150a00000000000613202c3945515d67737f8c95a0aaaba19792867e766f6c6565636262636465676d7279808b9399a4afa69d92897d70665c5144382c1f150a00000000000000000007101b252f38404a525a61686d747b8084888b8e8f919292929291918f8d8b8884807b746e69615a524a40382e251b0f060000000000000000000000000000000000000000000000000000000000000000000000000002090e11171c1f262b2f35393d43474c5254595c59534b42372c2015090000000000000000000006111c2630383f4453535353535353534d4b4740382e24190e020000000a16202b343d434749535353535353534b4a453f362d22180c010000000000000000000000000000000000000814212e3b4754616e7a8794a1a094877a6d6154473a2e2114070000000000000000000000000000000000000000000c17232e3846535f6975828e99a3afab9f948b7f726a60574e463e36302a25201f1c181b1a1b181c1f20262b31363f474f59616c74808d96a1adada2978d8073675d5145392a1f14090000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000000000000000000000000000714212e3a4754616d7a86929fab9e928579717e8b99a3a99b8f8275685e5246392d20150a0000000000000000000000000000000000000000000000000000000003090e13191d2023282c2d2f32343537383939393939393837363432302d2c2924211f1b15100b050000000000000000000000000000000d1926323e49545e66696c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c69665e54493e3226190d000613202c3946535f6c7986929facaca295887c6f6255493c2f2216090013202c3946535f6c7986929facada093867a6d6053473a2d201418222c353e45515d676e7b859198a3aea79e948d80746d62594f463c32291f150b0200000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaca09386796d6053463a2d2013070000000000000000000000000000000000000000000009141f2a36424d57606d7984919aa4a69f92867c6e685d554b4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4a48443d352b21160b0000000004111d2935414b55606d79839098a3aba9a09691857d746e6964615d565b5a5a5a5a555c6063666d7179818b939aa4afa89f958c80736a5f54473d32271b0f01000000000714212d3a4754606d7a85929fa7afa49992857c716c63605b535656555657555c60676d747f87939fa6aea49d9184796d6053463c31261b0f0300000000000000030c19222d37404a525c636c717a81868c9196989a9c9e9f9f9f9f9e9d9c9a9895918d86817b716c645c524a40372d21180e0300000000000000000000000000000000000000000000000000000000000000000001040b1014191c23282c3137394045474e54565e616668655d53493d3125190c000000000000000000000c17232e38424a505f606060606060605a58524a40362a1f13070000030f1b27323d464e545660606060606060585650483f34291d11050000000000000002050708080808080808080814212e3b4754616e7a8794a1a094877a6d6154473a2e21140808080808080808080705020000000000000000000006111c2a36424d57626e7b87929fa8b0a69f92877c6f695f585046413b36312d2c282327272723282c2d31373b42465159606b717e8a929da8b1a79f92857a6d61554b4035291d10040000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b00000000000000000000000006121e2b37424d5765727f8b99a3ab9b8e81756d7a86929fac9f92867a6d6154473c32271b0f00000000000000000000000000000000000000000000000000000000000001080d1113171c1f20222527292a2b2c2c2c2c2c2c2b2a2927262321201d1915120f0a0400000000000000000000000000000000000a16212d38424c545a5c60606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060605c5a544c42382d21160a000613202c3946535f6c7986929facaca295887c6f6255493c2f2216090013202c3946535f6c7986929facada093867a6d6053473a2d2016202a343e47515b606d79839097a1aaa9a0958f82786d605b51473d342a20170d030000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaca09386796d6053463a2d20130700000000000000000000000000000000000000000000030e1a25303b45515d67707d88939fa6a29891847a6d675c544b423f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3d3c38332b231a0f05000000000613202c3945515d67737f8c95a0aaada19791847b706b615e5754524c4e4d4d4d4e4b5153545c60676d747f88939fa5afa79f92877c6f62584e43372b1d120700000005111e2a36424d5766727f8c97a2adaa9f93877d706a615a5350494a4949494a4b51555c606d73808c949fabaca0958b7e7164584e43372b1f1206000000000000000a151e2b343f49525c646e737e858d92999da0a8a9a29f9d9c9b9c9d9fa2aaa7a09d99928e857e736e645c52493f332a1f14090000000000000000000000000000000000000000000000000000000000000001080d11161c1f252a2e34383c42474b5153586062686d72756f65594d4134281b0e00000000000000000003101c28343f4a545c6c6c6c6c6c6c6c6c66635c52473b2f23170a000006131f2b38434e5860626c6c6c6c6c6c6c65625a50453a2e211509000000000002090e121415151515151515151515212e3b4754616e7a8794a1a094877a6d6154473a2e211515151515151515151514120e09020000000000000000000e1a26313b47535f6974808d96a0abaea39991857b6e6a615a524c46423c3a38342e3434342e34383a3c42474d535b626b707d86929fa4aeaaa0958b7f72685e5243392f24180d010000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0000000000000000000000000814212e3a47535f697683909daba3998a7e716875828f9caba3998c7f7265584e43372b1d1207000000000000000000000000000000000000000000000000000000000000000104060c10121316181a1c1d1e1f1f20201f1f1e1e1c1b19171413110d0806030000000000000000000000000000000000000005101c26313a42494e505353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353504e49423a31261c1005000613202c3946535f6c7986929f9f9f9f95887c6f6255493c2f2216090013202c3946535f6c7986929facada093867a6d6053473a2d201e28323c464f59636d75818e959fa9aaa1979083796d665c50493f352c22180e05000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaca09386796d6053463a2d201307000000000000000000000000000000000000000000000009141f2935404b55606b73808d949fa8a0968f82796d665c544b433a323232323232323232323232323232323232302f2c27211a110800000000000714212d3a4754606d7a85929fa7b0a69e92857b6e696059524d47464141404040414045464b51555d606d727f8b939ea9afa3998f82766a605447392f24180c0000000714202d3a46525e697784909da9a8a2988d80746b60585046443f3d3c3c3d3e40454b515b606d7882909ca6b0a89d9083776a5f53473a2e21150600000000000006111c26303d46515b646e74808a92979fa3a9a19e999792908f8f8f909298989d9fa7a39f97928a80736e635b51453b31261a0e0400000000000000000000000000000000000000000000000000000000040a0f13191d20272c3036383f44464e53555d60656a6f747a7f8175685c4f4235291c0f00000000000000000006121f2c3844505c667679797979797979736e63584b3f3226190c00000815222e3b4754606a6f79797979797979716c62564a3d3124170b00000000050d141a1e2021212121212121212121212e3b4754616e7a8794a1a094877a6d6154473a2e2121212121212121212121201e1a140d05000000000000000009141f2b37424d57606d79849199a4afaba19791847c706c615e56534d494644404141414141404546494d53575f616d727d869298a2aeaca2989083786c60564c4131281d1207000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0000000000000000000000030f1b27333f4953626e7b88959fac9f92867a6d64717e8b99a3ab9d9083776a605447392e23180c0000000000000000000000000000000000000000000000000000000000000000000000030607090b0d0f101112131313131212110f0e0c0a0707040100000000000000000000000000000000000000000000000a151f2831383e4243464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464643423e3831281f150a00000613202c3946535f6c7986929393939393887c6f6255493c2f2216090013202c3946535f6c7986929facada093867a6d6053473a2d2026303a444e58616b727f8c939ea7aca29891857b6e675d544a3f372d231a100600000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaca09386796d6053463a2d2013070000000000000000000000000000000000000000000000020c18242f39434f59606d78829096a0a89f948f82786d665d554c443b332b2525252525252525252525252525252322201c160f08000000000006131f2b37434e5866727f8c97a2adaa9e948a7d70695f574f46423b3935303433342e34383a40454b515b626d74818e97a1adab9e94897c6f62554b4035291d100400000814212e3b4754616e7b8795989a9b9c92857a6d61594f463e37332d2f2f302e34394045505c666f7c88949fabaca095887b6f6255483c2d22170b0000000000000c17232e38424f59626d74808d929ea1a9a39f97918c8885838282838385888b90959ea1a8a29f928d80736d62574d42362a20160a0000000000000000000000000000000000000000000000000001070c10151b1e24292c33383b42464a5053575f62676d71777c81868c83776a5d5144372a1e110000000000000000000713202d3a4653606d78868686868686868073665a4d4033271a0d00000916232f3c4956626f7c868686868686867e7165584b3e3225180b000000050f171f252a2d2e2e2e2e2e2e2e2e2e2e2e2e3b4754616e7a8794a1a094877a6d6154473a2e2e2e2e2e2e2e2e2e2e2e2e2d2a251f170f0500000000000000030e1a26313c45515d676f7d87939fa4aea9a19691867e756e68615e575653514a4e4e4d4e4e4b515356575f62696e767f879298a2aaafa49a92867c6f665b50443a301f160c01000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000000000000000000000005121f2b3744505b6573808d99a7ac9c8f837668606d7a86929faca095887c6f62554b4034281c100400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030d161f262d32353639393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393635322d261f160d0300000613202c3946535f6c7987868686868686867c6f6255493c2f2216090013202c3946535f6c7986929facada093867a6d6053473a2d232e38424c565f6a707d87939fa5afa49a92867c6f695e554b42382e251b11080000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaca09386796d6053463a2d20130700000000000000000000000000000000000000000000000007121d27313d44505c666d7a849197a1a69e948f81786d675d564d453d3528231c141919191919191919191919171614100b050000000000000815222e3b4754606a7884919ea9b1a79c8f82756c61574d453d36302d292427272723282c2e343a4145515b606d7a85929eaab0a69b8e8275675d5145392c1f130600000b1825323e4b5865717e888a8b8d8e908e8174685e52473d342b272223222323282f343f4a545f6a76828f9cacb1a7998c7f736653493f33271b0f030000000003101c28343f4a54606b727f8c929ca4aaa299928c84807b787675757677797b7f838a91969fa6a49c928b7f72695f53463d32271b0f030000000000000000000000000000000000000000000003090e12181c1f262b2f35393d44484d52545c60646a6e74797e83898e929084776a5d5144372a1e110000000000000000000713202d3a4653606d798693939393938d8073665a4d4033271a0d00000916232f3c4956626f7c8993939393938b7e7165584b3e3225180b0000020d17212930363a3b3b3b3b3b3b3b3b3b3b3b3b3b4754616e7a8794a1a094877a6d6154473b3b3b3b3b3b3b3b3b3b3b3b3b3a36302921170d020000000000000009151f2935404b55606b727f8b929da4ada9a198928a817a746e696562605c545b5a5a5a5b545c606266696e747b828b9299a2aaaea39f93887e706a5f544a3f32291e0d0400000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b00000000000000000000000613202d394653606c7884919eaba49a8b7f72655d6875828f9caaa79a8d8074675c5145382c1f14080000000000000000000000000000000000020507080c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0b0906010000000000000000040d151c212629292d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d292926211c150d0400000006121f2c3845525e6a757979797979797979766a6054473b2e2215080013202c3946535f6c7986929facada093867a6d6053473a2d28343f4a545e686f7c869299a4afa59f93887e706a60574d433a30261c1309000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaca09386796d6053463a2d201307000000000000000000000000000000000000000000000000010b151f28343f4a545e686e7b859298a2a69e938f82796d685f574f473e342e261e160d0c0c0c0c0c0c0c0c0c0a09070400000000000000000916222f3c4955626f7c8896a1acaca095897c6f625a50453b332a25201d191a1a1a181c1f23282f353f45515d67727f8b98a2aeac9f9286796d6053473a2d20140600000714212d3a4754606d797c7d7f808183847d7063564c41352b221b17161616181d232e38424e5864717d8a9aa4afa99c8f8276655b5044372b1f12050000000006121f2c3844505c666f7c87929fa4aba29892878079736f6a6a696869656c6e72777d848f949fa6a49f92867b6e61584e43382b1f13060000000000000000000000000000000000000000060b0f141a1d23292c32373a4145474f54565e61666d71767b80858b90959b9d9084776a5d5144372a1e110000000000000000000713202d3a4653606d7986939f9f9f998d8073665a4d4033271a0d00000916232f3c4956626f7c89959f9f9f988b7e7165584b3e3225180b000009141f29333b4246484848484848484848484848484854616e7a8794a1a094877a6d6154484848484848484848484848484846423b33291f140900000000000000030d18242f3a434f59626d74808d929ca3adaaa29f938e86807b76726f6d6669686767676869666d6f72777b81868f949fa3ababa39f918c7f726c61584e42382d20170d0000000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0000000000000000000004101d2935404b5563707d8996a1ac9f93877b6e615664717e8a98a2ab9e9285796d6053463b3025190e02000000000000000000000000000003090e12141519191919191919191919191919191919191919191919191919191919191919191919191919191919191919191919191919191816120d070000000000000000030a1016191c1d20202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020201d1c1916100a030000000004111d2a36424e59636a6c6c6c6c6c6c6c6c6260584e43372b1f13060013202c3946535f6c7986929facada093867a6d6053473a2d353d44505c666d7a849198a2aba69d938c7f726c61584e453b31281e140a01000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaca09386796d6053463a2d20130700000000000000000000000000000000000000000000000000030d17232e38424c565f696f7c869299a3a59e948f827a6e69605950443f38302820180f07000000000000000000000000000000000000000d1a2633404d596673808c99a8b2aa9d9083776a6054483e332a211a14110d080d070c1013181d242935414c55606d7985929fabaea2988a7d7164574a3e2e23170b00000613202c3945515d676d6f707273757678706b6054443a30231a0f0b0609070c121c26303c4754616d7a86939facab9f9285796c605346392d20130600000003101c28343f4a54606d78839099a3afa39992867d736d67625f585c5c535b6061656c707a828f949fa9a2988f82766a6054473b2e221508000000000000000000000000000000000002080d11171c1f262a2f34383c43474c5254596063696e73797d82888d92979da0a79d9084776a5d5144372a1e110000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2aca4988b7e7165584b3e3225180b00020e1a25303b454d52545454545454545454545454545454616e7a8794a1a094877a6d61545454545454545454545454545454524d453b30251a0e020000000000000007131d28313d47515b606c77808c919ea1a9aea59e98928d87837f7c79777674747474747677797c7f83888e92999fa6aea8a199928b7f736d635a50463c2f261c0e050000000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0000000000000000000006131f2c3945515d6774818e9ba8ab9c908376695e53606d7a86929faca2978a7d7164564d41362a1e110500000000000000000000000000060d141a1e2122262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262525221e181109010000000000000000050a0d0f101313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313100f0d0a05000000000000010e1a26313d4751595e5f6060606060606055544e463c32271b0f030013202c3946535f6c7986929facada093867a6d6053473f383d47515b606d78828f96a0aaa89f948e81746d635a50463c33291f160c0200000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaca09386796d6053463a2d201307000000000000000000000000000000000000000000000000000006111c26303a444d57606a707d879298a2a69e9490847b6f6b625a504a423a322a21191106000000000000000000000000000000000005111e2a36424d576976838f9ca9b5ab998c7f7366584e43362c21180f0905010000000004070c1319242f3a45515d6774818e9aa7b4aa9b8e817468544a3f34281c10030004111d2935414c555d606264656768696b6360594f4432291e110800000000010a14202d3946525e687784919daaaea298877a6e6154473b2e21140800000006121f2c3844505c66727f8b95a0aba89f92877d706b605d55534e4f4f495053555a61686d79829097a1a49f94897c6f6256493c2f231609000000000000000000000000000001040a0f13191c22282b3136394045474e53565d60656b70757b80848a8f949a9fa2a7a09d979083776a5d5144372a1e110000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b0005121e2a36424d575e616161616161616161616161616161616e7a8794a1a094877a6d616161616161616161616161616161615e574d42362a1e120500000000000000010c161f2b353f44505b656c747f8a92979ea6acaaa29f9a93908c898684828181808181828486898c90959a9fa3ababa49f9691877e736d635b51473e342a1d140a000000000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000000000000000000000714202d3a4753606d7985929faba3998b7f726557515d6775818e9ba9a99c8f8275685e5246392d20160a000000000000000000000000060f181f262a2d2e3232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232312e29231b13090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000915202b353f474e5253535353535353534947433c342b20150a000013202c3946535f6c7986929facada093867a6d6059504a42454f59626d74808d949fa8a9a0968f82786d605b51483e342b21170d040000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaca09386796d6053463a2d2013070000000000000000000000000000000000000000000000000000000a151e29323c454e58616b707d869298a2a69f9691857d716c605c544c443c332b2317110a020000000000000000000000000000000714202d3a46525e697885929eabafa399897c6f6256493d32231a0f060000000000000000000108131e2935404b5564707d8a97a9b3aa9d908377665c5044382b1f120600010d19242f3a434c51545557585a5b5d5e56544f473d3320170d00000000000005111d2a36414c566875828e9ba8b3aa95897c6f6256493c2f2316090000000713202d3a4653606d7984919ea7ada1968d80736b6059514b474342423f44464850565d676d7a85929b9993908c8275685c4f4235291c0f02000000000000000000000001070d11161b1e252a2d33383b42464b5153585f62686d72777d82868c91969c9fa6a39f9b95908b857f7366594c403326190d0000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b000714202d3a46525e696e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e7a8794a1a094877a6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e695e52463a2d2014070000000000000000040d192327333f49535b606d737d858f949da0a7acaca49f9c989892918f8e8d8d8d8e8f919298999d9fa7acaca69f99938d847d716c635b51493f352c22180b02000000000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b00000000000000000005111e2a36414d5664717e8a98a2ac9f92867a6e61544b5563707d8a97a1ac9f92867b6e6154473d32271b0f0100000000000000000000030d18212931363a3b3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3e3a342d251b110700000000000000000000000000000000000000000000000000000000050a0d0f101313131313130f0f0d0904000000000000000000000000000000000000000000000000000000000000040f19242d353d424546464646464646463c3b37322b22190f04000013202c3946535f6c7986929facaea194887b706b605b544c4d57606b727f8b929da6aba19791847a6d665c51493f362c22190f05000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaca09386796d6053463a2d201307000000000000000000000000000000000000000000000000000000030c17202a333d464f59616b707d869298a1a8a09792877e746d665d564d453d3527221b140b0300000000000000000000000000000814212e3b4754616e7b8797a2adac9f92867a6d6053473a2d2014070000000000000000000000010d18242f3b4754616e7a8797a1adac9f9286796d6053463a2d201307000008131e28313a414547494a4c4d4e50514948443d352b210e05000000000000010d192530414e5b6774818e9aa7b0a3968a7d7063574a3d3024170a000004101d2935404b5564717d8a96a1acaa9e9184796d60594f45403937312d3337393e444c555e68717e8b8e8a86837f7c6f6255483c2f22150900000000000000000000040a0f13181d20272c3036383f44464d53555c60646a6f747a7f84898f92999ea1a9a19e99928e89837e79736d63574b3e3225180c0000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b000815212e3b4854616e7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7c8995a2a295887c7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b6e6154483b2e211508000000000000000000071017222d384149505b636b707b828990959c9fa4acaca9aaa39f9d9c9b9a9a9a9b9c9d9fa3aaaaababa39f9b948f878079706b625a514940372e231a100600000000000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0000000000000000000714202d3946525e6876828f9caaab9c8f8276685e524653606d7985929eaba3998c7f7266584e43372b1d12070000000000000000000009141f29333b4246484c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4a463f372d23180d0100000000000000000000000000000000000000000000000000030a11161a1c1d2020202020201c1b1915100902000000000000000000000000000000000000000000000000000000000008121b242b31363839393939393939392f2e2b272019100700000013202c3946535f6c7986929facb8ab9e92857d736c665e56555f69707d87929fa4aea39992857b6e685d544a40372e241a100700000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaca09386796d6053463a2d20130700000000000000000000000000000000000000000000000000000000050e18212b343e474f59616b707d8691969fa7a199928b80786d685f574f473f332d261d150c03000000000000000000000000000916232f3c4956626f7c8995a9b3aa9e918477675d5145382c1f13060000000000000000000000000714202d3946525e687885919eabaea398887b6e6255483b2f2215080000010c161f282f35393a3c3d3f404243453d3b38332b23190f0000000000000000081a2733404d5a6673808d99a6b0a4978a7d7164574a3e3124170b00000613202c3945515d6775828f9ba8aea3988b7e71675d51473d352f2b2622272b2d323a434c56606d7883817e7a76736f6a5f53473b2e2115080000000000000000070c10151b1d24292c32383a41464a5053575f61676d71767c81868b91959b9fa3a69f9c96918c86817c77716d67635b51463b2f22160a0000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b00121f2b3845525e6b788487878787878787878787878787878787898e99a4a4988e888787878787878787878787878787878784786b5e5245382b1f120000000000000000000006111b262f383f44515961696e757d83898f939a9c9fa2aaa7a8aaa9a7a7a7a7a7a9a9a8a6a9a29e9b99928e88827c746d676059504840372e251c11080000000000000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0000000000000000000814212e3b4754616e7b86929faca3998b7e7165564c44515c6674818d9aa8ab9d9184776a605447392f23180c000000000000000000020e1a26313b454d535559595959595959595959595959595959595959595959595959595959595959595959595959595959595959595959595959585651493f34291e1206000000000000000000000000000000000000000000000000040d151c2226292a2d2d2d2d2d2d292825211b140c03000000000000000000000000000000000000000000000000000000000009121920262a2c2c2d2d2d2d2d2d2d22221f1b150f070000000013202c3946535f6c7986929facb9ada197928780786d68605d676e7b859299a3aea49f92877d6f695f564c42392e251c12080000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaca09386796d6053463a2d2013070000000000000000000000000000000000000000000000000000000000060f19222c353e474f59606b6f7c8490959ea5a39f928d827a6e69605950443f382f271e150d040000000000000000000000000a1723303d4a5663707d8996a3b0a99c90837669554b4035291d100400000000000000000000000005111e2a36414c566a7683909da9b4aa96897c6f6356493c30231609000000040d161e24292c2d2f313234353638302f2c272119110700000000000000000d1a2633404d596673808c99a6b1a4978a7e7164574b3e3124180b00000714202d3a4753606d7a86929facac9f92867a6d60554b403529241d1a171b1f2028313a44515c666d7775716d6866625f584e43372b1f1206000000000000030b12181c1f262b2f35393d43484c52545b6063696e73797e83888e92989da0a8a29f9a94908a847f7a756f6b65605d55514940352a1e12060000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b00121f2b3845525e6b7885919494949494949494949494949494949599a0aaaaa098959494949494949494949494949494949184786b5e5245382b1f1200000000000000000000000a141d262d3340474f575e616b70777d82878b8f9298989a9b9d9e9e9f9f9f9e9d9d9b999797928e8a86817c766f6a605d554f473e362e251c130a000000000000000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000000000000000006131f2b37434e5865727f8c99a3ac9f92867a6d615447404a54636f7c8996a1aca095897c6f62554b4034291c1004000000000000000005121e2a36424d575f616565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565625b51463a2e2216090000000000000000000000000000000000000000000000030d161f272d3235363939393939393635312c261e150c020000000000000000000000000000000000000000000000000000000000080f151a1d1f20202020202020201615130f0a04000000000013202c3946535f6c7986929facb9b3a9a199938c827a6f6a656d79839097a1aba59c928b7e716b60574d443a30271c130a000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaca09386796d6053463a2d20130700000000000000000000000000000000000000000000000000000000000007101a232c353e474f59606a6f7a838f939fa4a49d948f847b706b625a5049413930271f160d0400000000000000000000000b1724313e4a5764717d8a97a4b0a89b8f8275685c4f422f24180c00000000000000000000000000010d192530424f5c6875828f9ba8b0a3968a7d7063574a3d3024170a00000000040c13191d202122242527282a2b252423211c170d0801000000000000000e1b2734414e5a6774818d9aa7b0a4978a7d7164574a3e3124170b00000a1723303d4a5663707d8998a3aea89b8e8275675d51433a2f23181d1d1d1d1d161f2834404a545c606a6864615e5655534e463c32261b0f030000000000030c151c23282c31373a4045474f54565e61666c70767b80858b90959a9fa2a8a09e98928e88837e79736e6863605953514b4340372e23190d020000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b00121f2b3845525e6b7885919ea1a1a1a1a1a1a1a1a1a1a1a1a1a1a2a4aab2b2aaa4a2a1a1a1a1a1a1a1a1a1a1a1a1a1a19e9185786b5e5245382b1f120000000000000000000000020b141b2227353e454d525960636b70757b7e8285888b8d8f9091929292929191908e8c8a8885817e7a746f6a626058514b433d352d241c130a01000000000000000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b00000000000000000815212e3b47535f6a7783909dabaa9c8f8275685e5246394653606c7884919eaba89a8d8174675c5145382c1f140900000000000000000714212d3a46535f696e72727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272726d62564a3e3125180b00000000000000000000000000000000000000000000000a151f2831383e424346464646464642413d3730271e140900000000000000000000000000000000000000000000000000000000000004090e11121313131313131313090806030000000000000013202c3946535f6c7986929facb9bab2aba49f948f847c726c77818f95a0a9a79e938c80736c61594f453c32281e150b01000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaca09386796d6053463a2d2013070000000000000000000000000000000000000000000000000000000000000008111a232c353d474f585f686e79818c939aa2a69f9691857d716c605b534a423931281f160d04000000000000000000000b1825313e4b5864717e8b97a4b1a89b8e8275685b4f4235281c070000000000000000000000000000081b2835414e5b6874818e9ba7b0a4978a7d7164574a3e3124170b000000000008121a22282d303132323232323231302d282219130c04000000000006121e2b37424d576875828f9ba8b4aa96897d7063564a3d3023170a00000d1a2733404d5a6673808d99aab4aa978b7e7164554c4131282a2a2a2a2a2a2a2a2a232e39424a51535d5b5754524c4847433c342a20150a0000000000000b151e272e34383c43474b5153596063686d72787d82878d92979d9fa7a49f9c96918b86817c76716d66615e56544f47454039312e251c1207000000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b00121f2b3845525e6b7885919e9f9f9f9f9f9f9f9f9f9f9f9f9f9fa1a3a8b0b0a8a3a09f9f9f9f9f9f9f9f9f9f9f9f9f9f9e9185786b5e5245382b1f12000000000000000000000000020a1117232c333b42464f54596063696e7276797c7e808283848585868585848382807d7b7975716d68625f58544e45403a312b231b120a0100000000000000000000000b1825313e4b5864717e8b97a4aca89b8e8175685b4e4235281b0f08040000000000000000000003050e1b2734414e5a6774818d9aa7aca4978b7e7164584b3e3125180b000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0000000000000003101c28343f4a54626f7c8895a0aca3988b7e7164564c413744505b6573808d9aa7ab9f9285796d6053473b30251a0e02000000000000000815222e3b4855616e7b7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7265584c3f3225190c0000000000000000000000000000000000000000000005111c27313a434a4e505353535353534f4d49423930261b1004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013202c3946535f6c7986929facb9b2a8a09da09f9691877f76808c939ea7a89f958e81776c605a50473d332a20160c0300000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaca09386796d6053463a2d201307000000000000000000000000000000000000000000000000000000000000000008111a232b353d464e565e676d7780889298a0a8a09792877e736c655c544b433a31281f160c030000000000000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2834414e5b6774818e9aa7b1a4978b7e7164584b3e3125180b0000000005101a242c33393c3e3f3f3f3f3f3f3e3c393329241e16100c0709060b1117232d3a47535f697884919eabaea398887b6e6155483b2e2215080004101c2834404b546976828f9ca9aea398887b6f6255483c2f3737373737373737373737373039404446514e4b4746413c3b37322a261f180f060000000007121c2730394044464e53555d60656b6f757a7f848a8f939a9ea1a9a29e99938f89847f7a746f6a64605c54524c48433d39352f271f1c130a00000000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b00121f2b3845525e6b78849193939393939393939393939393939394979ea8a89e97949393939393939393939393939393939185786b5e5245382b1f12000000000000000000000000000006111a202930363d44484f54565e6165666d6f7174757778787979787877767573716f6d6664605d56534e47433d352f281f191109000000000000000000000000000b1825313e4b5864717e8b979f9f9f9b8e8175685b4e4235281b1614100b05000000000000060b0f12131b2734414e5a6774818d9a9f9f9f978b7e7164584b3e3125180b000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0000000000000006121f2b3844505c6673808d9aa7ac9f92867a6d6054473a333f4953626f7c8895a0aca2978a7e7164574d42362a1e1205000000000000000a1724303d4a5763707d8a8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c86796c5f5346392c2013000000000000000000000000000000000000000000000a16222d38434c545a5d6060606060605c5a544c42372c2115090000000000000000000000000000000000000000000000000000000105090b0b13131313070604000000000000000000000000000013202c3946535f6c7986929facb9aca0969196a0a199928c838c929ca5aaa1969083796d655b50483e352b21180e040000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaca09386796d6053463a2d201307000000000000000000000000000000000000000000000000000000000000000000081119232b343c444d555d656c737e8691969fa6a299928b80776d665d554b433a31281e150a0000000000000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000000000b17222c363e44494a4b4b4b4b4b4b4a49453e352f281f1c18171616171b222935404b55616e7b8896a1acac9f9286796d6053463a2d2013070006131f2c3845515c667884919eabac9f9286796d6053464444444444444444444444444444444444444444444444444444443b3a36312a21180e030000000c18232e39424a5153585f62676d72777c81868c91969c9fa4a7a09d97928d87827d78726d68625f5853504a46413b38322c29241d150d0a0100000000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b00121f2b3845525e6b788486868686868686868686868686868686878c97a3a3978c878686868686868686868686868686868684786b5e5245382b1f12000000000000000000000000000000080e171f2f3a454f575c5e60605f545c60626567686a6b6b6c6c6c6b6a6a68666462605c5454524c47433c383229241d160d0700000000000000000000000000000b1825313e4b5864717e8b93939393938e8175685b4e42352b2423201c170e09030000020a11171b1f20252c34414e5a6774818d93939393938b7e7164584b3e3125180b000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000000000000000713202d3a4653606d7985919eabaa9b8f8275675d5145392d3847535f6a7784909daaa99c8f8276695e52463a2d20160a000000000000000a1724303d4a5763707d8a96989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989286796c5f5346392c2013000000000000000000000000000000000000000000010d1a26323e4a545e66696c6c6c6c6c6c69655e54493d3125190d0000000000000000000000000000000000000000000000000000060c111517182020201f1413100c0701000000000000000000000013202c3946535f6c7986929facb7aa9d91849196a0a39f9490949ca4aba29891847a6d675c53493f362d23190f06000000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaca09386796d6053463a2d20130700000000000000000000000000000000000000000000000000000000000000000000071019222a323b434b535b606c707c848f949da4a39f928d81786d675d554b433a30261c110600000000000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b00000004101c28333e4850555758585858585857555045413a312c282323222322282d333d45515d67727f8c99a8b2a99d908376665c5144382c1f1206000713202d3a4653606d7986939facaa9d908477665c50505050505050505050505050505050505050505050505050505050504846423b332a1f1409000004101c2834404a545c60646a6f747a7e83898e92999ea1a8a39f9b95908b85807b75706c65605d56534e46443f3836302c271f1d18120b03000000000000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b00111e2a3743505c687278797979797979797979797979797979797a8794a1a094877a797979797979797979797979797979797872685c5043372a1e11000000000000000000000000000000000f1b2834404c5761686b6c6c6c605c5455585a5c5d5e5f5f565d6065696b6c6b6965605c554e463c37312b272018130c040000000000000000000000000000000b1825313e4b5864717e868686868686868175685b4e42393831302d28221a140c07070b141b22272b2d323939414e5a677480868686868686867e7164584b3e3125180b000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f06060403010000000000000203060e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b00000000000004111d2935414c5563707d8a97a1ada2988a7e7164554c41352b37434e5866737f8c99a7ac9f93877b6e6154483d32271b0f010000000000000a1724303d4a5763707d8a969f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9286796c5f5346392c2013000000000000000000000000000000000000000000030f1c2935424e5a6670767979797979797570655a4d4135281b0f020000000000000000000000000000000000000000000000000911181d2124252d2d2d2c201f1c18120b030000000000000000000013202c3946535f6c7986929facaea194877b849196a1a69f9c9fa6afa39992867c6f685e554b41382d241b110700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaca09386796d6053463a2d2013070000000000000000000000000000000000000000000000000000000000000000000000071018202931394149505a616a6f7a828d929fa4a49c938e82796d675d554b42382e23171006000000000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0000000814212d3944505a616465656565656564615a514c433e38342e302f302d33383f44505a606d7985929eabb1a7998c807366544a4034281c1004000815212e3b4854616e7b879aa4afa99c90837669545d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d55534d453b31261a0e020006121f2c3844515c666d71767c81858b90959b9fa3a8a19e99928e89837e79736e6963605b53524c47433c38342e2a251e1b16100c070100000000000000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b000f1b2834404b5660686b6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6e7a8794a1a094877a6d6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6b6860564b4034281b0f00000000000000000000000000000005111e2a3744505c6873787979796d665c504b4d4f4c52565e61686d727678797876726d675f584e463c30261c160d0701000000000000000000000000000000000a1724303d4956626c7179797979797979756f65594d4646453d3c39332a261f181212181d262d3337393e4546464c58646e7479797979797979716c6256493d3024170a000b1825313e4b5864717e8b97a4aca89b8e8175685b4e4235281b13131311100e0a050005090d0f1013131b2734414e5a6774818d9aa7aca4978b7e7164584b3e3125180b0000000000000613202c3945515d6775818e9ba9ac9f92867a6d6053473a2f26323c4855616e7b88959faba4998c7f7266594f43382c1d12070000000000000a1724303d4a5763707d8a93939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939286796c5f5346392c201300000000000000000000000000000000000000000003101d2a3643505d6976828686868686868275695c4f4236291c0f03000000000000000000000000000000000000000000000009121b22292e3132393939392d2c29231d150d0300000000000000000013202c3946535f6c7986929facada09386797b849197a1a9a9abb0a89f92877d706a5f564c43392f261b12090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaca09386796d6053463a2d201307000000000000000000000000000000000000000000000000000000000000000000000000060e171f282f383f4450585f686d78808b9399a3a59e948f82796d675d544a3f342822180b020000000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0000000a1623303c4955616c71727272727272716c605d554f4645403e3d3c3c3d3f44495059616c73808d97a1adab9f95887c6f6255483c2e23180c00000916232f3c4956626f7c8995acb6a89c8f82756a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a615f574d42362a1e1205000713202d3a4653606d787e83888d92989da0a7a69f9c96918c86817c77716d67615f5753504945413a37312c28231c19140f0a0400000000000000000000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b000b17232f3a454e565c5e6060606060606060606060606060616e7a8794a1a094877a6d6160606060606060606060606060605e5c564e453a2f23170b00000000000000000000000000000005121f2b3845525e6b7885868686786d60534a4c51565e61686d737a7f82858685837f796f6a5f584e42382e23170b0000000000000000000000000000000000000815212d3945505a62646c6c6c6c6c6c6c68655d53535353514a49443e363129231d1d23282f383f44464b52535353535c64676c6c6c6c6c6c6c64625a5045392d211508000b1825313e4b5864717e8b979f9f9f9b8e8175685b4e423528202020201d1d1a16110b1015191c1c2020202734414e5a6774818d9a9f9f9f978b7e7164584b3e3125180b0000000000000714212d3a4754606d7a86929facaa9b8e8175675d5145392c212d3a46535f697683909dabab9e9184776b605448392f24180c0000000000000a1724303d4a5763707d8686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686796c5f5346392c201300000000000000000000000000000000000000000003101d2a3643505d69768390939393938f8275695c4f4236291c0f030000000000000000000000000000000000000000000006111b242d343a3d3e464646463a38342f271f150b01000000000000000013202c3946535f6c7986929facada093867a6e7b859197a1a9b3aca1968b7f726b60584e443a31271d140a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaca09386796d6053463a2d20130700000000000000000000000000000000000000000000000000000000000000000000000000050d161d262d333e464e565d666d747f879298a2a69e949082796d665c50443f342a1d140a0000000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0000000b1724313e4a5764717e7e7e7e7e7e7e7d756d67615953514b4b4a49494a4a50535b606b707e88939fa9b0a69d9083766a5f53473b2e1c120700000a1623303d495663707c8996a3afa89b8e8177777777777777777777777777777777777777777777777777777777777777776e695f53463a2d21140700101d293643505c6976828a90949a9fa2aaa29f9a948f8a847f7a756f6a64605d55534d46443f38352f2b261f1c17110e0802000000000000000000000000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b0007121e28333c454b50525353535353535353535353535354616e7a8794a1a094877a6d61545353535353535353535353535352504b453c33281e120700000000000000000000000000000003101d2a3643505d6976839098897c6f635a56555d60686d737a80858b8f9192928f8b847c6f6a5f544a3f34281c1003000000000000000000000000000000000005111d29343e48505658606060606060605b595e606060605e57555046423b342f27272e343c41495053585f6060605f5c585a60606060606060585650483e34291d1105000b1825313e4b5864717e8b93939393938e8175685b4e42352d2d2d2d2d2a2926221c151b212528292d2d2d2d34414e5a6774818d93939393938b7e7164584b3e3125180b000000000005121e2a36424d5765717e8b98a2aea2988a7d7064554b4035291e2a36424d5765727f8b99a3aca096897c6f63554b4035291d100400000000000916232f3c4855616b707979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979746a5e5145382b1f1200000000000000000000000000000000000000000003101d2a3643505d697683909c9f9f9c8f8275695c4f4236291c0f03000000000000000000000000000000000000000000010c18222d363f454a4b535353524745403931271d1207000000000000000013202c3946535f6c7986929facada093867a6d6f7c859297a2aaab9e91847a6d675c554b423930261e140b020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaca09386796d6053463a2d2013070000000000000000000000000000000000000000000000000000000000000000000000000000040b141b2227343c444c545c606d727e869298a2a69f958f82786d605a50463c2f261c110600000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000003101d2a3643505d6976838b8b8b8b8b8b8a817a706b64605c545756555657545b60656c727d86929aa4afaa9f948a7d7064584e43372b1f0b0000000a1724303d4a5763707d8a96a3b0ab9e928583838383838383838383838383838383838383838383838383838383838383837b6e6155483b2e22150800101d2a3743505d6a7683909c9fa6a8a09d98928d88837d78736d6862605853514b46423b37332d29241e1b15100c06000000000000000000000000000000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b00010c17212a333a4043454646464646464646464646464754616e7a8794a1a094877a6d6154474646464646464646464646464543403a332a21170c01000000000000000000000000000000010e1b2834414e5b6774818e9a8e81756c656364676d737a80868d92989c9e9f9e9c9691857c6f665c5044382b1f13080000000000000000000000000000000000000c17222d363e45494b5353535353535359636b6c6c6c6c6b64615a534d45403931303940454d535b60656c6c6c6c6b686157535353535353534b49453e362d22170c00000b1825313e4b5864717e868686868686868175685b4e423939393939393736322d271f262c3235363939393939414e5a677480868686868686867e7164584b3e3125180b00000000000714212d3a46535e697683909caaab9f9285796d6053463a2f241a26313b4754616d7a86929faca89a8e8174675d5145392c1f140900000000000714202c38444f5961636c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6a62584d4135291d100000000000000000000000000407090a0b0b0b0b0b0b101d2a3643505d697683909ca9a89c8f8275695c4f4236291c0f0b0b0b0b0b0b0a09070400000000000000000000000005111d29343f485056586060605f53514b43392f23180c000000000000000013202c3946535f6c7986929facada093867a6d6a6f7c859298a2aaa1968f82796d675c544a423830261d140b0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaca09386796d6053463a2d201307000000000000000000000000000000000000000000000000000000000000000000000000000000020a1117222a323a424a505b626c717d869298a2a79f948e81746d62584e42382d22170b00000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0000030f1c2936424f5c6975828f9898989898938e847d76706d6666646362636465666c71787f879298a2acaca2988f82766c6155463c32261b0f0000000a1724313d4a5764707d8a97a3b0ada1979290909090909090909090909090909090909090909090909090909090909090887b6e6255483b2f22150800101d2a3743505d6a7683909da9a49c96918b85817c76716d66615e56544e4745403936312b27221b19130f0a030000000000000000000000000000000000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b0000050f1821282f34373839393939393939393939393b4754616e7a8794a1a094877a6d6154473a39393939393939393939393837342f2821180f0500000000000000000000000000000000000c1825323f4b5865727e8b98938b7f75717071747a80858d92989fa2aaa4a3a5a8a1979083786d6053463a2f24190d01000000000000000000000000000000000006111b242d34393d3e464646464646525e6b757979797978706c615f57514b433e3d424b51575f656c71787979797873685c504646464646463e3d39342d241b110600000a1724303d4956626c7179797979797979756f65594d3b46464646464644423e39312930383d41434646464646464c58646e7479797979797979716c6256493d3024170a00000000000815212e3b4854616e7b87939faca99b8e8174675c5145382c1d14202d3946525e6876828f9caaab9f9285796d6053473b31251a0e00000000000714212d3a46535f696e72727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272726d62564a3e3125180b00000000000000000000040b10131616171717171717171d2a3643505d697683909ca9a89c8f8275695c4f4236291c17171717171717161613100b05000000000000000000000915212e3a45505a62656c6c6c6c605c554b4034291c10040000000000000013202c3946535f6c7986929facada093867a6d606a6f7d869298a3a89f948f82796d665c544a42382f261d140b02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaca09386796d6053463a2d2013070000000000000000000000000000000000000000000000000000000000000000000000000000000000061018202830383f44515a616b707d869299a4a69d938b7e716a5f544a3f33281d1207000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0000020e1b2835414e5b6874818e9ba5a5a5a59e96918a837d79767271706f6f707275787d838b9299a2aaafa49a92867b6e61594f44342a20150a0000000a1724313d4a5764707d8a97a3b0b3a9a19e9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d94887b6e6155483b2e22150800101d2a3743505d6a7683909da99c928d847f7a746f6a64605c54524c48433d38352f2a261f1b17110d080100000000000000000000000000000000000000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b000000060f171e23282a2b2d2d2d2d2d2d2d2d2d2d2e3b4754616e7a8794a1a094877a6d6154473a2e2d2d2d2d2d2d2d2d2d2d2b2a28231e170f060000000000000000000000000000000000000815222f3b4855626e7b88959b918b827e7d7e81858c92989fa2a29f9a9796989c9f9f958a7d7164554c4135291d110400000000000000000000000000000000000009121b22292d303139393939394653606c7987868686847d756e69605c554f46454f545c60696e777e8586868685786b5f5245393939393931302d29221b12090000000815212d3945505a62646c6c6c6c6c6c6c68655d534648535353535353504f4a433b313a42494e4f53535353535348535c64676c6c6c6c6c6c6c64625a5045392d2115080000000007131f2c38434e5866737f8c9aa4ada2978a7d7063554b4034281c111d2a36414c5664717e8b98a2aea2988b7e7164574d42362a1b1106000000000815222e3b4855616e7b7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7265584c3f3225190c000000000000000000070f161b20222324242424242424242a3643505d697683909ca9a89c8f8275695c4f42362924242424242424242322201c160f070000000000000000000b1724313d4a56626c71797979796d675c5145382c1f13060000000000000013202c3946535f6c7986929facada093867a6d60606a707d869299a3a69f948f82786d665c544a42382f261d140a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaca09386796d6053463a2d201307000000000000000000000000000000000000000000000000000000000000000000000000000000000000060e161e262e343f485059606b707e87939fa6a59f92867c6f665b5044392e23180c000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0000010e1a2734414d5a6774808d9aa7b1b4aea8a19e94908a85827f7e7d7c7c7d7f82858a90959fa3ababa39f93887e71695f53473e3322180e040000000a1723303d4a5663707d8996a3b0b8b0aba99f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9fa9aaaaaaaaaa94877a6e6154473b2e21140800101d2a3743505d6a7683909da69a8d8079726d68625f5853504a46413b38322c29241d1a150f0b0600000000000000000000000000000000000000000000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b00000000050c12171b1e1f202020202020202020212e3b4754616e7a8794a1a094877a6d6154473a2e212020202020202020201f1e1b17120c05000000000000000000000000000000000000000814212e3a47535f6a7784919d9b948f8b898a8d92989fa2a29f98928d8a898b90949c9c8f8276675d5145392c201306000000000000000000000000000000000000000911171d2124252d2d2d2d313e4b5864717e889396918a827b736d67615953525960666d737b828b929792877e7064574a3d312d2d2d2d2524211d1711090000000005111d29343e48505658606060606060605b59534d535f6060606060605d5b554d4339424c545a5c6060606060605f5353585a60606060606060585650483e34291d1105000000000915222e3b4854606a7784919eacab9e9285796d6053463a2e23180d1925303a4754606d7a86929facaa9c8f8276695e5346382d22170b000000000a1724303d4a5763707d8a8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c86796c5f5346392c2013000000000000000007111921272c2f303131313131313131313643505d697683909ca9a89c8f8275695c4f4236313131313131313131302f2c272119110700000000000000000b1825323e4b5865717e86868686796d6053473a2d20140a0000000000000013202c3946535f6c7986929facada093867a6d6058606b707d879299a3a69e948f81786d665c544a41382f261b11060000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaca09386796d6053463a2d20130700000000000000000000000000000000000000000000000000000000000000010000040607080707050100040c141c2328363e474f59616c727f8c949faaa3989083786c60554b4034281c10040000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0000000d1a2633404d596673808c99a6b4aaa29f9a9f9f9c98928f8c8a8988898a8b8e92979da0a7aea8a199928b7f726c61574d42352c21100600000000091623303c4956636f7c8996a2afb0a69f9c9393939393939393939393939393939393939393939393939c9ea6b0aea398877a6d6054473a2d21140700101d2a3743505d6a7683909da99c928d847f7a746f6a64605c54524d48443d39352f2b261f1c17110d080200000000000000000000000000000000000000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b000000000001070b0f1112131313131313131314212e3b4754616e7a8794a1a094877a6d6154473a2e2114131313131313131312110f0b0701000000000000000000000000000000000000000006121e2b37424e5765727e8b95a09e9c9896979a9fa2a39f98928c85817e7d7e838c929f92867a6d6054473a2d2114070000000000000000000000000000000000000000060c1115171820202024303d4956626c717f8b919e948f868079706b615f5d606b6f797f868f949f93887e716c6155493c3023202020181715110c060000000000000c17222d363e45494b535353535353534e4d4d575e6c6c6c6c6c6c6c6a665f554a3e49545e66696c6c6c6c6c6c6c5e574d4e535353535353534b49453e362d22170c0000000004101c2834404b54626f7c8996a0aca99a8e8174665c5144382c1d120813202c3945515d6775818e9ba9ac9f93877b6e6153493f33271b0f030000000a1724303d4a5763707d8a96989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989286796c5f5346392c201300000000000000040f19232b32383b3d3e3e3e3e3e3e3e3e3e3e43505d697683909ca9a89c8f8275695c4f423e3e3e3e3e3e3e3e3e3e3d3b38332b23190f05000000000000000a1723303d4a5663707d8993988a7d7063574a3d31261b0f0300000000000013202c3946535f6c7986929facada093867a6d605359616b717e87929aa4a69e938e81786d665b534941382d2217140a01000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaca09386796d6053463a2d201307000000000000000000000000000000000000000000000000000000020608080e070c101313151413110d0802020a1117242c353d47505a606c77828f98a2aa9f958b7e71675c5145382c1f14080000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0000000c1926323f4c5965727f8c98a5aea298928d939aa0a29f9c999796959697989b9ea1a9acaba39f9691877f726d625a50453c31231a1000000000000815222f3b4855626e7b8895a9b3ab9f948f8686868686868686868686868686868686868686868686868f949eaaac9f928579675d5145392c20130600101d2a3743505d6a7683909da9a49c96918b86817c76716d66615e56544f4745403937312b28221c19130f0a040000000000000000000000000000000000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b0000000000000000020405060606060606060814212e3b4754616e7a8794a1a094877a6d6154473a2e211407060606060606060504020000000000000000000000000000000000000000000000020e1a26313c4653606c78839097a1a8a4a3a4aaa29f98928d86807a74717072767f8c94998a7d7063574a3d3024170a0000000000000000000000000000000000000000000005080a0b131315212d3945505a626d727f8b919c98928c847d756e69686d747c838c92989c918b7f726c625a5044392d201413130b0a0805000000000000000006111b242d34393d3e464646464646464246535e69767979797979797771665b4f424e5a66707679797979797976695e5346464646464646463e3d39342d241b11060000000006131f2c3845515c6674818d9aa8ada197897d7063544a4034281c0b04111d2935414b5564707d8a97a2ada49a8c7f73655b5044372b1f13070000000a1724303d4a5763707d8a969f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9286796c5f5346392c2013000000000000000b16212b353d4448494a4a4a4a4a4a4a4a4a4a4a505d697683909ca9a89c8f8275695c4f4a4a4a4a4a4a4a4a4a4a4a4948443d352b21160b000000000000000815222f3b4855626e7b88959a8d817467584e43372b1f120600000000000013202c3946535f6c7986929facada093867a6d60534f59616c717e88939fa3a59e938e81786c655b53493f3327261c130a010000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaca09386796d6053463a2d2013070000000000000000000000000000000000000000000000000003090e1214151a1c181c1f202121201d19130c050006121a232b353e44505b656e7b86929faaa79e9184796d6053463b3025190d0100000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0000000b1825313e4b5864717e8b97a4ab9f9286818890959b9fa3aba4a3a2a2a3a5a8a9a7a8a19e99928d847d716d625b51483e332a1f110800000000000714212d3a4754606d7a8797a2ada99c8f82797979797979797979797979797979797979797979797979828f9ca9ab9e9184786b554b4135291d110400101d2a3743505d6a7683909c9fa6a8a09d98928d88837e79736e6863605953514b47423c38332d2a251e1b15100c07010000000000000000000000000000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b0000000000000000000000000000000000000814212e3b4754616e7a8794a1a094877a6d6154473a2e2114070000000000000000000000000000000000000000000000000000000000000000000009151f2b3844505b666f7c8591969c9f9f9e9c98928d86807a736d686463656d76828f998d8073665a4d4033271a0d00000000000000000000000000000000000000000000000000000605111d29343e48505a626d727f8c929c9f96918a827b73717a818891959f9d928c7f736d625a50483e33281c1004060000000000000000000000000009121b22292d3031393939393939393b4854616e7b86868686868683776a5d50444f5c6976828686868686867b6e6154483b39393939393931302d29221b120900000000000713202d3a4653606d7985929eabab9e9185796d6053463a2e23180c010d18242f3a4653606d7985929fabac9e9184786c6053463a2f24180d0100000a1724303d4a5763707d8a93939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939286796c5f5346392c201300000000000004101b27323d474f54565757575757575757575757575d697683909ca9a89c8f8275695c57575757575757575757575756544f473d33271c10040000000000000714202d3a4753606d7a86979e9184786a5f53473a2e21150800000000000013202c3946535f6c7986929facada093867a6d605347505a616c727f8b919ba4a59e938e81776c655b504440382e261c130a0100000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaca09386796d6053463a2d201307000000000000000000000000000000000000000000000000060e151a1e2122272823282c2d2e2e2d2a251e160e05000811192327333f49535e69737f8c98a2ada1968b7e7164564c41362a1e110500000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0000000a1724313d4a5764707d8a97a3ac9f9286797c83898e9299999c9d9e9f9f9f9e9d9b9896918c86807a706b625a51493f362c21180e0000000000000613202c3945515d677885929eabaa9d9184776c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c667784919eaaa99c8f8376695c50432f24180d0100101c2936434f5c6976828a8f949a9fa2a9a29f9a94908a84807b756f6b65605d55534d46443f3836302b271f1c18120e0903000000000000000000000000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b0000000000000000000000000000000000000814212e3b4754616e7a8794a1a094877a6d6154473a2e21140700000000000000000000000000000000000000000000000000000000000000000000030f1c28333f4a545f6a6f7c848c909292918f8b86807b746e68605d56565b64707d8a998f8275685c4f4235291c0f020000000000000000000000000000000000000000000000000000000c17222d363f48515b636d737f8c929ca09e948f867f7d848d939aa09d938d80736d635b51483e362c22170b000000000000000000000000000000000911171d2124252d2d2d2d2d2d2e3b4854616e7b87939393939083776a5d50444f5c6976828f93939393877b6e6154483b2e2d2d2d2d2d2524211d171109000000000005111d2935414c5664707d8a97a2ada89a8d8074665c5044382b1c12070007131f2c3845515c6674818e9aa8aca096897c7063554b4035291d110400000a1724303d4a5763707d8686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686796c5f5346392c20130000000000000713202c38444f59606364646464646464646464646464697683909ca9a89c8f827569646464646464646464646464646360594f44382c20130700000000000006131f2c3945515d677885929e96887b6f6255483c3025190d01000000000013202c3946535f6c7986929facada093867a6d60534748505a626d727f8c929ca4a59d938e80776c605c524a40382e251c130a01000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaca09386796d6053463a2d2013070000000000000000000000000000000000000000000000060f181f262b2d2e34352e34383a3b3a3936302820160c0200071117222d38414d57606d7a86929faca89c908376685e5246392d20140700000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0000000a1623303d495663707c8996a3afa399867a6f787d82868a8c8f909192929291908e8b8884807b736d68605950483f372d241a0f0600000000000004111d2935414c55697683909ca9ab9f928578695f606060606060606060606060606060606060606d7986929faca79a8d8174675a4e4134271b0700000713202d3a4653606d787d82888d92979da0a7a69f9c97918c86817c77726d67625f5753504a46413a37322c29231d1a140f0b0600000000000000000000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b0000000000000000000000000000000000000814212e3b4754616e7a8794a1a094877a6d6154473a2e21140700000000000000000000000000000000000000000000000000000000000000000000000b17222d38424e585f6a6f797f83858684827f7a736e69615e56524c4a54606d7987868683776a5e5144372b1e110400000000000000000000000000000000000000000000000000000006101b242d363f49515b636d73808d929da49e98928c8a91969fa49e938e81746e645b51493f362d241a10050000000000000000000000000000000000060c111517182020202020212e3b4854616e7b87949f9f9d9083776a5d50444f5c6976828f9c9f9f94877b6e6154483b2e2120202020181715110c060000000000000713202d3946525e6875828f9ba9ada196897c6f63544a3f34281c0b000004101c2834404b5463707c8996a1ada89b8e8174675d5145392c20140900000916232f3c4855616b707979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979746a5e5145382b1f120000000000000916222f3b4854606b7071717171717171717171717171717683909ca9a89c8f82757171717171717171717171717171706b6054483b2f22160900000000000004101d2935404b556a7783909d998c7f7266564c41362a1d1105000000000013202c3946535f6c7986929facada093867a6d6053473e48515b626d737f8c929ca4a59d938d80746e645c524a40372e251c1309010000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaca09386796d6053463a2d20130700000000000000000000000000000000000000000000030e18212a31373a3b414243404546484746413a32281e1308000006111b262f3b45525d6875828e9ba8ac9f93877a6e6154473b2e21140800000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0000000916222f3c4955626f7c8895a2b5ab94877b6e6c70757a7d808284848586858583817f7c78736e68605d564f473f362d251b120800000000000000010d19242f414d5a6774808d9aabaea298887b6e61555353535353535353535353535353535355626f7c8899a3afa9988b7e7265584b3f3225180c000006121f2c3844505c666d71767b80858b90959b9fa3a9a19e99928e89837e79746e6964605b54524c47433d38342f2a251f1b17110d080100000000000000000000000000000713202d3a4653606d798693a0aca69a8d8073675a4d4034271a0700000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b0000000000000000000000000000000000000814212e3b4754616e7a8794a1a094877a6d6154473a2e211407000000000000000000000000000000000000000000000000000000000000000000000006111c262f3c464e585f676d727678797876726d68615e56524c454145515d67757979797771675b4f43362a1d10040000000000000000000000000000000000000000000000000000000009121b242d373f49525b636e74808d929da5a39f99979ea1a69e948e81786c605c524940372d241b1108000000000000000000000000000000000000000005080a0b1313131315212e3b4854616e7b8794a1aa9d9083776a5d50444f5c6976828f9ca9a194877b6e6154483b2e21151313130b0a080500000000000000000714212e3a4754616d7a86929facab9e9184786c605346392e23170b0000000c18232e394653606c7884919eabac9f92857a6d6053473b31261a0e02000714202c38444f5961636c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6a62584d4135291d100000000000000a1623303d495663707d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7e83919daaaa9d90837e7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d706356493d3023160a000000000000000c18242f424f5c6875828f9b9c908376685e5246392d201307000000000013202c3946535f6c7986929facada093867a6d6053473a3f49515b636d73808d929da5a59d928d80746e635c524940372e251b13090000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaca09386796d6053463a2d2013070000000000000000000000000000000000000000000009151f2a333c4247484d4f504b51535454524c443a3025190d0100000a141d2935414c5664717e8b97a4afa49a8a7e7164574b3e3124180b00000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0000000815212e3b4854616e7b8794abb5a295887b6f6263686d7073767778797978787674726f6a66615e56524c433d352d241b1309000000000000000000081724313e4a5764717d8a99a3afaa988b7e7165574d42464646464646464646464646424d5765727f8c98abada297887b6f6255483c2f221509000003101c28343f4a545c60646a6e74797e83898e92989ea0a8a39f9b95908b85807b76706c66615e56544e4745403936312b27221b19130c04000000000000000000000000000713202d3a4653606d798693a0aca79a8e8174675b4e412e23180c00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b0000000000000000000000000000000000000814212e3b4754616e7a8794a1a094877a6d6154473a2e2114070000000000000000000000000000000000000000000000000000000000000000000000000a141d2a343c464e555d6065696c6c6b6965615e56524d46413b35414b555d6b6c6c6c6a675f564b3f33271b0e02000000000000000000000000000000000000000000000000000000000009121b252d374049525c646e74808d939da59f9f9f9fa79f948f82786d665b504a40372e251b1209000000000000000000000000000000000000000000000000000606060815212e3b4854616e7b8794a1a99d9083776a5d50444f5c6976828f9ca9a194877b6e6154483b2e2115080606000000000000000000000006121e2b37424d5765727f8b99a3aea89a8d8073655b5044372b1c110600000007121f2b3844505b6673808d9aa8aea2988b7e7164574d42362a1e12050004101c28333e474f5557606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060605f5e5850473c3125190d000000000003101d2a3643505d6976838a8a8a8a8a8a8a8a8a8a8a8a8a8a8a9195a0acab9f95908a8a8a8a8a8a8a8a8a8a8a8a8a8a8a83776a5d5044372a1d1104000000000000071a2734414d5a6774808d9a9f93867a6d6154473a2e23180c000000000013202c3946535f6c7986929facada093867a6d6053473a373f49525b636e74808d939da5a49d928d80736e635b51493f372d251b120900000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaca09386796d6053463a2d201307000000000000000000000000000000000000000000020e1a26313c454d53555a5b5c555c6061615e564c41362a1d11050000020b19242f3c4955626f7c8895a2b6ac998d8073665a4d4033271a0d00000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0000000714212d3a4754606d7a8799a4afa296897c6f63565d606366696a6b6c6c6c6b6a6865625f5854524d45413a312b231b1209010000000000000000000714212e3a4754616d7a86929faca89b8e8275695e53463d313939393939393939303946525e6976828f9ca9ab9e9285786c605346392d2013060000000c17232e38424a5053575f62676d71777c81868c91969c9fa4a7a09d97928d87827d78726d6862605853514b46423b37332d29241e160d0a0100000000000000000000000713202d3a4653606d798693a0aca89b8f827568544b4034281c1004000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b0000000000000000000000000000000000000814212e3b4754616e7a87949f9f94877a6d6154473a2e211407000000000000000000000000000000000000000000000000000000000000000000000000020b18222a343c434b5154595d5f5f5e5c5854524c46423b36302f3a434b515e6060605e5b564d44392e22170b0000000000000000000000000000000000000000000000000000000000000009131c252e37404a525c606c77818e93939393939393959082796d665c544a3f382e251c130900000000000000000000000000000000000000000000000000000000000815212e3b4854616e7b87949c9c9c9083776a5d50444f5c6976828f9c9c9c94877b6e6154483b2e211508000000000000000000000000000814212e3a47535f697683909d9f9fa096897c6f6253493f33271b0a00000000030f1c28333f4a54626f7c8895a09faa9c908376695f53463a2d21140700000b16212c353e44484a5353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353514d473e352a1f1409000000000003101d2a3643505d6976839097979797979797979797979797979da0a8b1b1a79f9d97979797979797979797979797979083776a5d5044372a1d11040000000000000c1926323f4c5965727f8c98a4998b7e7164544a4034281c10040000000013202c3946535f6c7986929facada093867a6d6053473a2d374049525c606c77818e939ea6a49c928c80736d635b51493f372d241b1209000000000000000000000000000000000000000000000000010101010101010101010613202c3946535f6c7986929facaca09386796d6053463a2d20130701010101010101010101000000000000000000000006121e2b37424d575f616768696a676d6e6d685e5246392d2013080000000814212e3b4754616e7a8794a1ada89b8e8175685b4e4235281b0f02000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0000000613202d394653606c7986939faca3968a7d706357525457595c5d5e5f5f5f5e5d5b5855534e4746413b352f281f19110900000000000000000000000713202d3946525d6876828f9ca9ac9f92867b6e61584e433b322c292424292c3139424d57616e7b86929faca89b8e8174655b5044372b1f120500000006111c2630383f44464e53555d60656a6f747a7f848a8f93999ea1a9a29f9a938f8a847f7a746f6a64605c55534d46443f38352f28201c140a00000000000000000000000713202d3a4653606d798693a0aca99d908376665c5145382c1f130700091623303c4956636f7c8996a2afa4988b7e7165584b3e3225180b0000000000000000000000000000000000000814212e3b4754616e7a8792929292877a6d6154473a2e21140700000000000000000000000000000000000000000000000000000000000000000000000000061018222a313a4145474c50525352504c4746413a36302a2528313a414547535353514f4b443b32281d110600000000000000000000000000000000000000000000000000000000000000010a131c252e384044505b656c7881868686868686868683796d675d544a42382d261c130a0100000000000000000000000000000000000000000000000000000000000815212e3b4854616e7b878f8f8f8f8f83776a5d50444f5c6976828f8f8f8f8f877b6e6154483b2e211508000000000000000000000000000815222f3b4855626e7b8895939393939184776a605441382d22170b00000000000b17222d3847545f6a7784919393939394887b6e6155483b2e221508000005101a232c33383c3d464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464645413c352c23190e03000000000003101d2a3643505d697683909c9f9f9f9f9f9f9f9f9f9f9f9f9fa9abb0b8b8b0aaa89f9f9f9f9f9f9f9f9f9f9f9f9f9d9083776a5d5044372a1d11040000000000000b1724313e4a5764717d8a97ab9b8e8275665c5144382c1f12060000000013202c3946535f6c7986929facada093867a6d6053473a2d2e374044505b656d78818e949ea6a49c928c7f736d635b51493f362d241b120900000000000000000000000000000000000000010406070d0d0d0d0d0d0d0d0d0d0d13202c3946535f6c7986929facaca09386796d6053463a2d20130d0d0d0d0d0d0d0d0d0d0d07060400000000000000000814212d3a47535f696e7475767778797b7a6d6154473a2f24190d0100000714202d3a4753606d7a8693a0ada89c8f8275695c4f4236291c0f03000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b00000005121f2b3744505b657885929faba4978b7e7164584b474a4d4f515152535252504e4c4947433c39363029241e160d0700000000000000000000000005111d2935414c5664717e8b96a1ada3998d80746a60564d443e39352f2f35383c434b545e6973808d99a3aca096897d706353493f33271b0f03000000000a151e262e34383c42474b5153586062686d72787d82878d92979c9fa6a49f9c96918c86817c76716d67615e5753504945413a322e261c1207000000000000000000000713202d3a4653606d798693a0acac9f9286796d6053463a2e23180d060a1723303d4a5663707d8996a3b0a4978b7e7164584b3e3125180b0000000000000000000000000000000000000814212e3b4754616e7a8786868686877a6d6154473a2e21140700000000000000000000000000000000000000000000000000000000000000000000000000000610181f282f35393a3f43454645433f3a3936302a251f191f282f35393a46464644433f39322920160b000000000000000000000000000000000000000000000000000000000000000000010a131c2627333f49535b666c757979797979797979776d675d554b42392f261c140a010000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a8283838383828074675a4e414d5a6673808283838383827a6e6154473b2e211408000000000000000000000000000d1a2733404d5a66738086868686868686807366584e432f261b1106000000000006111c2b37434e5866737f86868686868686807366594d4033261a0d00000008111a21282c2f3039393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393835312a231a110700000000000003101d2a3643505d6976839093939393939393939393939393939c9fa6b0b0a69e9c93939393939393939393939393939083776a5d5044372a1d11040000000000000916232f3c4956626f7c8995ab9f9285796d6053463a2d2013090000000013202c3946535f6c7986929facada093867a6d6053473a2d2027333f49535c666d78828f949fa6a49c918c7f726d625b51483f362d241b12080000000000000000000000000000000001070d1113141a1a1a1a1a1a1a1a1a1a1a1a202c3946535f6c7986929facaca09386796d6053463a2d201a1a1a1a1a1a1a1a1a1a1a1a1313100c070000000000000815222e3b4855616e7b80828384858687807367554c4135291d120c070a0a15212e3b4854616e7b8794a1aea89c8f8275695c4f4236291c0f03000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000000030f1b27333f495e6b7884919eaba5988b7f7265584c3f3d404344454646454543413f3c3b37322d2a251f19130c0400000000000000000000000000010d1924303a4653606d7984919ea7ab9f92877c6f685e564f47454141414045474e555c666e7b86929faba89e9184786c605346392d22170b0000000000030c151c23282c3137394045474e54565e61666c70757b80858a90949a9fa2a8a19e98928e89837e79736e6963605b53524c4440382e24190e020000000000000000000713202d3a4653606d798693a0acaea398897c6f62544b4034281f1612101824313e4b5764717e8a97a4b1a4978a7e7164574b3e3124180b0000000000000000000000000000000000000714202d3946525e687579797979797975685e5246392d201307000000000000000000000000000000000000000000000000000000000000000000000000000000060d161d24292c2d323639393836322e2d2a251e19140d161d24292c2d3939393736332e2820170e0400000000000000000000000000000000000000000000000000000000000000000000010a1417222d38414a545b60686c6c6c6c6c6c6c6c6a605d554c433930271d140a02000000000000000000000000000000000000000000000000000000000000000714202d3946525e686e767676767676746e64584c404b58636e737676767676766e685e5246392d201407000000000000000000000000000c1926323f4b57636e7379797979797979736e6358463d321d140a000000000000000f1b26323c4b57636d7379797979797979736e63574b3f3226190c000000000810161c2023242d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2c2b29251f1911080000000000000003101d2a3643505d69768286868686868686868686868686868690949fabaa9e948f86868686868686868686868686868683776a5d5044372a1d11040000000000000814212e3b4754616e7a8799a3a297897c706356493d31261a0e0200000013202c3946535f6c7986929facada093867a6d6053473a2d20222d38414a545c666d79828f949fa7a49c918c7f726d625b51483f362c241a12080000000000000000000000000000040c13181d2021272727272727272727272727272c3946535f6c7986929facaca09386796d6053463a2d27272727272727272727272727201f1c18120b03000000000915222f3c4855626f7b888e8f9192978f8276675d5145392f241d181616141b222f3c4955626f7c8895a2afa89b8e8275685b4f4235281c0f02000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000000000b17222d44505d6a7783909daaa6998c7f7366594c403333363738393939383735322f2e2b26201e19140d080b09050100000000000000000000000008131f2c3845515c67727f8b95a0aba39991847a6e68615954514c4e4e4b5153575f676d78839098a2aca0968b7f72665b5044382b1b1106000000000000030a11171c1f262b2f35393d43474c52545b6063696e73797e83888e92989da0a7a39f9b95908b85807b75706c65605d56524a40352a1f13070000000000000000000713202d3a4653606d798693a0acb4aa998d8073665c51453b3128201f1c1e26323f4c5965727f8c98a5b0a3968a7d7063574a3d3024170a00000000000000000000000000000000000005111e2a36414c565e616c6c6c6c6c6c615e564c4135291d110500000000000000000000000000000000000000000000000000000000000000000000000000000000040c13181d2021262a2c2c2b292521201d19130e09040c13181d20212d2d2d2b2a27221d160e050000000000000000000000000000000000000000000000000000000000000000000000000006111b262f38424a50535b60606060606060605d54514c433a31271e150b02000000000000000000000000000000000000000000000000000000000000000005111e2a36414c565e6169696969696967645c52473c47525c6366696969696969615e564c41362a1e1105000000000000000000000000000a17232f3b47525c63666c6c6c6c6c6c6c66635c5247342b200b02000000000000000a15202f3b46515b63666c6c6c6c6c6c6c66635c52473b2f23170a0000000000050b1014161720202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020201f1d19140e070000000000000000030f1c2935424e5a66707679797979797979797979797979797982909ca9a89c8f827979797979797979797979797979797771665b4f4236291d10030000000000000613202d394653606c7986929fa99a8d807367574d42372b1e120600000013202c3946535f6c7986929facada093867a6d6053473a2d201b262f38424a545c676d798290959fa7a39b918b7f726d625a50483e362c241a1108000000000000000000000000040d161d24292c2d34343434343434343434343434343946535f6c7986929facaca09386796d6053463a34343434343434343434343434342d2c28231d150c030000000713202d3a4653606d7985929c9d9f9f92867a6d60554b40352f2923232324262d36424d5765717e8b98a4b1a69a8d8073675a4d4034271a0d01000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b00000000061d293643505c6976838f9ca9a69a8d8073675a4d403427292a2b2c2c2c2b2a282522211f1b1919191919181715110c06000000000000000000000004101c2834404b55606d78839099a3aba09690837a706b64605d555b5b555d60636a6e79818e959faaa49a9184796d60544a3f33281c0a000000000000000000060c10151a1d24292c32383a41464a5053575e61666d71767c81868b91959b9fa3a79f9d97928d87827d78726d68635c52473b2f23170a0000000000000000000713202d3a4653606d798693a0acb8ab9e9285796d60574d433a322d2c282a2d36424d576774818e9aa7b3a995897c6f6256493c2f231609000000000000000000000000000000000000010d1925303b444c52545f5f5f5f5f5f54524c443a3025190d01000000000000000000000000000000000000000000000000000000000000000000000000000000000001070d111314191d1f201f1d191413110d0802000001070d1113142020201e1d1b17110b040000000000000000000000000000000000000000000000000000000000000000000000000000000a141d262f383f44464e5353535353535353504745413a31281f150c03000000000000000000000000000000000000000000000000000000000000000000010d1925303b444c52545c5c5c5c5c5c5a58524a4136404a52585a5c5c5c5c5c5c54524c443b3025190d010000000000000000000000000007131f2a35404a52575a606060606060605a58524a403522190f000000000000000004121e2a354049515759606060606060605957524a40352a1f1307000000000000000407090a131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131312100d0903000000000000000000010d1a26323e4a545e66696c6c6c6c6c6c6c6c6c6c6c6c6c6c76838f9ca9a89c8f82756c6c6c6c6c6c6c6c6c6c6c6c6c6c6a665f554a3e32261a0e0100000000000005121f2b3744505b657784919eaa9d918477695f53473a2d21140800000013202c3946535f6c7986929facada093867a6d6053473a2d20141d263039424b555d676d79839095a0a8a39f93887f726c625a50483e362c231a110800000000000000000000010c161f282f35393a40404040404040404040404040404046535f6c7986929facaca09386796d6053464040404040404040404040404040403a38342e271e150b00000006121f2c3844515c6676828f9caaaba2988b7e72675d51454039342f3030312f383f46525e6975818e9ba8b3a9988b7e7265584b3f3225180c00000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000000020f1c2935424f5c6875828f9ba8a79a8e8174675b4e413428252525252525252525252525252525252525252524211d17110900000000000000000000000c18232e3944515c666f7c87929fa4a8a09590847d76716d6769676869676d70757b838e939ea7a59f93887d70665c5142382d22170b000000000000000000000003090e12181d1f272b3036383f44464d53545c60646a6f747a7f84898e92999ea1a8a19e99938f89847f7a736e63574b3f3226190c0000000000000000000713202d3a4653606d798693a0acb9ada1978b7e71695e554c443e3a3834363a3d46535e697784909daaada297877a6e6154473b2e2114080000000000000000000000000000000000000008141e29323b4146475353535353534746413a32281e13080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010406070c10121312100c070705010000000000000104060713131311100e0b060000000000000000000000000000000000000000000000000000000000000000000000000000000000020b141d262d333839424646464646464646443a39352f281f160d03000000000000000000000000000000000000000000000000000000000000000000000008141e29323b4146475050505050504e4c4741382f3840474b4d5050505050504746413b32291e14080000000000000000000000000000020e19242e3840474b4d535353535353534d4b4740382e2410070000000000000000020d19232e3740464b4c535353535353534d4b4740372e24190e02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a16222d38434c545a5d606060606060606060606060606976838f9ca9a89c8f827569606060606060606060606060605d5b554d43392d22160a00000000000000030f1b27333f49536976838f9ca9a096887b6e6155483b2f24190d01000013202c3946535f6c7986929facada093867a6d6053473a2d2014141e273039434b555d676d7a839096a0a8a49a93887e716c615a50483e352c231a110800000000000000000007131d28313a4145474d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d535f6c7986929facaca09386796d60534d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4645403930271d1207000004101c2834404a5465727e8b98a2aeaa9e9184796d605b514b45403e3d3d3d3f4149505b616e7b86929facada197887c6f6255493c2f22160900000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000000020e1b2835414e5b6874818e9ba7a89b8f8275685c4f4235323232323232323232323232323232323232323232312e29221b12090000000000000000000007121d2834404a54606a727f8c929ca4a7a096918a827d7a7775747475767a7d818790959ea5a59e938d80736b60544b402f261c11060000000000000000000000000001070c10161b1e252a2d33383b42464b5153585f62676d72777c82868c91969c9fa4a49f9c96918b868073665a4d4033271a0d0000000000000000000713202d3a4653606d798693a0acb1a7a09d92857b6e675d56504846443f4246474f58616e7b8795a0acab9f928578685e5246392d20140700000000000000000000000000000000000000020d1720293036393b4646464646463a3935302820160c020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020b141c22282b2d353939393939393939372d2c29241e160d04000000000000000000000000000000000000000000000000000000000000000000000000020d1720293036393b43434343434341403c362f262e353b3f404343434343433b3936302920170d0200000000000000000000000000000007121c262e353b3f4046464646464646403f3b352e261c120000000000000000000007121c252e353b3e4046464646464646403f3b352e251c12070000000000000000000000000000000000000000000000000000000000000000000004090d0f101313131313130e0d0b0803000000000000000000000000000000000000000000000000000000030f1b26323c464e53555656565656565656565656565c6976828f9ca9a89c8f8275695c56565656565656565656565655544e463c32271b0f0300000000000000000b17222d414e5b6874818e9ba7a8988c7f7265554c4135291d1104000013202c3946535f6c7986929facada093867a6d6053473a2d20140c151e273039434c555d686e7a849196a1a9a49a93877e716c615a50473e352c231a110700000000000000010d18242f3a434b51545a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5f6c7986929facaca09386796d605a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a53514b42392e23180c0000000c18232e3a4754616d7a86929fa9aca1968d80746d605d55514b4a49494a4b4f535b606d74818e98a3aeab9e9285796d6053463a2d20130700000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000000010d1a2734404d5a6773808d9aa6a99c8f8376695c50433f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3e3d3a342d241b1106000000000000000000000c18232e39424e58626d73808c929ea1a8a19e948f8a8683828181828386898e93999fa7a39f938f81786d60594f42392e1d140a0000000000000000000000000000000000040a0f13191c22282b3136394045464e53555d60656b70757b7f848a8f939a9fa2a8a09e989083776a5d5144372a1e110000000000000000000713202d3a4653606d798693a0acaca09590959082796d68615a5553504a4d525459606a74808d9aa7b1a99c8f827669564d41362a1e11050000000000000000000000000000000000000000050e171e252a2d2e3939393939392e2d29251e160e04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030607090b0d0f1111121313121211100f0d0a080705020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020a11171c1f20282d2d2d2d2d2d2d2d2a21201d19130c040000000000000000000000000000000000000000000000000000000000000000000000000000050e171e252a2d2e3636363636363433302b241d242a2f32333636363636362e2d2a251e170e0500000000000000000000000000000000000a141c242a2f32333939393939393933322f2a241c140a00000000000000000000000a131c232a2f32333939393939393933322f2a241c130a000000000000000000000000000000000000000000000000000000000000000000020a1015191b1c2020202020201b1a17140e08010000000000000000000000000000000000000000000000000006131f2b37434e585f62636363636363636363636363636976828f9ca9a89c8f827569636363636363636363636363636260584e43372b1f13060000000000000000061a2633404d596673808c99a6a99c8f8276675d5145392c201306000013202c3946535f6c7986929facada093867a6d6053473a2d2014070c151e27313a434c565e686e7b849196a1a9a49992877e716c61594f473e352b23190f0400000000000004111d2935414b555d606767676767676767676767676767676767676c7986929facaca09386796d676767676767676767676767676767676767605c544b4034281c100400000713202d3946525e6874808d97a2ada89d928c7f746d67605c5557565657585960656c727f8b939daaafa4998d8074665c5044382b1f120600000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000000000d192633404c5966737f8c99a6aa9d9083776a5d504c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4b4a453f362d22170c0100000000000000000007121c27303d46515b646e73808a92979fa3a69f9c9992908f8e8e8f9092989b9fa4a69f99928c81786d665c50473d30271d0b020000000000000000000000000000000000000002080d11171c1f252a2e34383c43474c5154596063686e73797d82878d92979da0a79d9084776a5d5144372a1e110000000000000000000713202d3a4653606d798693a0acaa9d9084909490827a716c6562605c54565e61646b707c87929facb0a6998c7f7266594c3f3025190e02000000000000000000000000000000000000000000050d14191e20212c2c2c2c2c2c21201d19130c040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000104060b10121315171a1c1d1e1f1f201f1f1e1d1b19171514120e09060300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060b0f12131b20202020202020201d1413110d080100000000000000000000000000000000000000000000000000000000000000000000000000000000050d14191e20212929292929292726241f1a13191f23262729292929292921201e19140d05000000000000000000000000000000000000020a12191f2326272d2d2d2d2d2d2d2726231f19120a020000000000000000000000010a12191e2325262d2d2d2d2d2d2d2626231f19120a010000000000000000000000000000000000000000000000000000000000000000040c141b212528292d2d2d2d2d2d2726241f1a130b020000000000000000000000000000000000000000000000000815212e3b47535f6a6f707070707070707070707070707075828f9ca8a89c8f827570707070707070707070707070706f6a6054473b2e22150800000000000000000b1825323e4b5865717e8b98a4ac9f92867a6d6054473a2d22170b000013202c3946535f6c7986929facada093867a6d6053473a2d201407030c151f28313a444c565e696e7b849197a1a9a39992877e706c61594f473d352b21160b0000000000000613202c3945515d676d737373737373737373737373737373737373737986929facaca0938678737373737373737373737373737373737373736d665c5145382c1f1306000005111d2935414c56616d7a85929fa5aea49b918c8079716d67656463636465686b70787f87929fa5afa89f93877b6e61544a3f34281c100300000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000000000c1925323f4c5865727f8b98a5aa9e9184776b5e5858585858585858585858585858585858585858585858585650483f34291d1105000000000000000000000b151e2b343f49525c646e737e858e92999ea1a8a39f9d9c9a9b9c9d9fa3a9a29f9b948f877f776d665c544a3f352c1e150b0000000000000000000000000000000000000000000000060b0f141a1d23282c32373a4145474f54565e61666d70767b80858b90959b9d9084776a5d5144372a1e110000000000000000000713202d3a4653606d798693a0aca396897d85929490847d76726e6d666b6b696e71757d859299a3afab9f94887b6e6155483b2e221508000000000000000000000000000000000000000000000002080d1114142020202020201413110d0802000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001070d1113171c1f20222426292a2b2b2c2c2c2b2b2a28262422211e1a1312100c06000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000306060f131313131313131311070604010000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080d1114141d1d1d1d1d1d1b1a17140e080e1317191a1d1d1d1d1d1d1414110d0802000000000000000000000000000000000000000000070e1317191a202020202020201a1917130e08000000000000000000000000000000070d12161919202020202020201a1917130e07000000000000000000000000000000000000000000000000000000000000000000020c161e262c3135363939393939393433302b241d140b0100000000000000000000000000000000000000000000000916222f3c4955626f7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7d82909ca9a99d90837d7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c6f6255493c2f22160900000000000000000a1723303d4a5663707d8996a3aea3998a7d7164544a3f33281c0f030013202c3946535f6c7986929facaca093867a6d6053473a2d20140700030d161f28323b444d575f696e7c859297a2aaa39992877e706b61594f473d32271b100400000000000714212d3a4754606d79808080808080808080808080808080808080808087929facb3a69a8d8080808080808080808080808080808080808080796d6053463a2d2013070000010d1925303a46525e68717e8b939da5ada39b928d847e797572717070707274777d828c9299a3afaaa1968e8174695f5342382e23170b0000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000000000b1825313e4b5864717e8b97a4ab9f9285786565656565656565656565656565656565656565656565656565625a50453a2e21150900000000000000000000030c19222d37404a525c636c717a81868d9196989b9c9e9f9f9f9f9e9d9b9997928e89827c736c655c544b42382e231a0c030000000000000000000000000000000000000000000000000003090e12181c1f262b2f35393d44484d52545c6064696e74797e83898e929084776a5d5144372a1e110000000000000000000714202d3a4753606d7a8693a0ada194887b7e8b9296918a837f7b79787778797a7d82889297a1abafa4998f8276695f53473a2d211408000000000000000000000000000000000000000000000000000105070813131313131307070501000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003090e13181d2023282b2d2f3133353737383939393837373533312e2d2a26201f1c17110d0802000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010507081010101010100e0d0b08030002070a0c0d1010101010100807050100000000000000000000000000000000000000000000000002070a0c0d131313131313130d0c0a0702000000000000000000000000000000000002060a0c0d131313131313130d0c0a0702000000000000000000000000000000000000000000000000000000000000000000000a141e2830383d414346464646464641403c362f261d13080000000000000000000000000000000000000000000003101d2a3643505d69768289898989898989898989898989898990949fabab9f959089898989898989898989898989898983776a5d5044372a1d1104000000000000000815222f3b4855626e7b8895a99f9f9b8e8174665b5044382b1f12060013202c3946535f6c7986929f9f9f9f93867a6d6053473a2d2014070000040d162029323b454d575f6a6f7c859298a29fa39992877d706b60594f44382c20130700000000000814212e3b4754616e7a878d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d9299a3afb5a89d928d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d867a6d6053473a2d20140700000008131e2a36414c56626c74818e939da4aea49d96918b85827f7d7c7c7d7e8184898f949fa3abaaa29891847a6d60574d4230261c11060000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000000000a1724313d4a5764707d8a97a3ac9f93867872727272727272727272727272727272727272727272727272716c62564a3d3124170b000000000000000000000007101b252e38404a525a61686d747b8084888b8e90919292929291908e8c8985817c766f6a605b534b423930261c11080000000000000000000000000000000000000000000000000000000000070c10151b1e24292c32383b41464a5053575f62676d71777c81868c83776a5d5144372a1e110000000000000000000714212d3a4754606d7a8793a0ada194877b74818e949e95908c888685848585878a8f939aa1a9afa59f93877c6f62574d42372b1e1206000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040a0f151a1d24292c2e34383a3c3e404244444546464545444342403d3b3a36312d2c28231c19130d08020000000000000000000000000000000000000000000000000000000000000000000000000000000000040607090c0e1011121313131211100f0d0b08070502000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004101b26303a42494e4f5353535353534e4c4741382f241a0e0300000000000000000000000000000000000000000003101d2a3643505d6976839096969696969696969696969696969c9fa6b0b1a79f9d96969696969696969696969696969083776a5d5044372a1d1104000000000000000714202d3a4753606d7a8697939393939285796c605346392d2013060013202c3946535f6c7986929393939393867a6d6053473a2d201407000000040e172029333b454e585f6a6f7c8692989393939992867d706b6054483b2f22160900000000000814212e3b4754616e7a87949a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9fa3abb5b9aea49d9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a93867a6d6053473a2d201407000000020d1925303a44505a606d78818d929fa2aaa8a09e97928f8c8a89898a8b8e91969c9fa6ada7a09892867c6f685d52453c311e140a000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b00000000091623303c4956636f7c8996a2afa4998c7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7e7165584b3e3225180b00000000000000000000000009131c262e38404850565e61696e73787c7e818384858686858583817f7c79746f6a625f585049413930271e150a0000000000000000000000000000000000000000000000000000000000000000040a0f13191d20272c3036383f44464d53555d60656a6f747a7f8175685b4f4235281c0f0000000000000000000714212e3a4754616d7a8794a0b4ab94877a6d78828f939f9d989a939291919298979b9fa4acaba39f938d80736a6054453c31261a0e020000000000000004080c0e0f0c07070501000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070c151b20262b2f35393a3f4446484a4d4f5051525253525251504e4c4a4846423d3a38342e29251e19140d050000000000000000000000000000000000000000000000000000000000000000000000000004070c10121316191b1d1e1f1f201f1f1e1d1b19171414110e0806030000000000000000000000000000000000000000000000000004090e1112131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313130b0a08040000000000000000000000000004080a0b1313131313131313131313131313131311100e0b06000000000000000000000005090d0f101313100f0d090500000000000000000000000000000000000000000000000000000000000000000000000000000915212c38424c545a5c6060606060605a58524a41362b1f140800000000000000000000000000000000000000000003101d2a3643505d697683909c9f9f9f9f9f9f9f9f9f9fa3a3a3a9abb0b9b9b1aba9a3a3a39f9f9f9f9f9f9f9f9f9f9d9083776a5d5044372a1d11040000000000000006131f2c3945515d677885868686868686867c6f6256493c2f2316090013202c3946535f6c798786868686868686796d6053473a2d20140700000000050e172129333c464e58606a707d8686868686868686867c706356493d3023160a00000000000814212e3b4754616e7a8794a1a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6acafb5acacacaea8a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a093867a6d6053473a2d2014070000000008131e29323f44505c666d78808b92989fa3aba9a29e9b9897969697989b9ea0a8aca9a19e9590867d6f6a60564c41332a1f0c02000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000000000915222f3c4855626f7b8895a2b5ab9b918c8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b85786b5f5245382c1f12050000000000000000000000010a141c262e363e444c52575e61666a6f7274767878797978787675726f6d66626058534e443f382f271e150c030000000000000000000000000000000000000000000000000000000000000000000001080d11161b1f252a2e34383c42474b5153586062686d72756f65594d4134281b0e0000000000000000000814212e3b4754616e7a87949f9fa39986796d6d79818c92989fa29f9e9e9e9fa2aaa8a9aaa29f99928b81786d60584e43332a1f150900000000000002090f14181b1b191413110d08020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b121820262b31373a4145474a50535557595c5d5e5e5f5f5f5e5e5d5b595755534d4946443f3835302a251e170e0802000000000000000000000000000000000000000000000000000000000000000001070c1013181c1f20232527292b2b2c2d2c2c2b2a28262421201e1915120f0a0300000000000000000000000000000000000000000000080f151a1d1f20202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020171714110c05000000000000000000050c11141717202020202020202020202020202020201e1d1b17120b0400000000000000020a1015191c1c20201c1c1915100a020000000000000000000000000000000000000000000000000000000000000000000000000d1925313d49545e65696c6c6c6c6c6c67645c52473c3024170b00000000000000000000000000000000000000000003101d2a3643505d6976839093939393939393939393939b9ea5afb7b7b6b7b9b8afa59d9b93939393939393939393939083776a5d5044372a1d11040000000000000004101d2935404b55687378797979797979796f6a6054483b2e22150900121f2c3845525e6a75797979797979797976675c5145382c1f13060000000000050f18212a333c464e58606b70797979797979797979706b6054483b2f22160900000000000814212e3b4754616e7a87949f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f93867a6d6053473a2d20140700000000020d172028343f4a545c666d747e858e92999ea1a8a7a8a5a4a3a3a3a5a7a8aca49f9d97928c837b6f6b60584e443a3021180e00000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000000000815212e3b4854616e7b8794abb5ada39b989898989898989898989898989898989898989898989898989285786b5f5245382c1f1205000000000000000000000000020a131c242c323a41464d5254585f626568696b6c6c6c6c6b6a686663605c54544e47433c332d261d150c030000000000000000000000000000000000000000000000000000000000000000000000000001040b1014191c23282c3137394045474e54565e616568655d53483d3125190c0000000000000000000815222e3b4855616e7b889393939392867966676d787f868d92989a9c9e9e9f9f9e9d9c9998928d877f746d665c50463d3221180e030000000000030b131a202527282621201d19130f0a040100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070c151d232831373c42474b5154545c60626466686a6a6b6c6c6c6b6a6a686664615f575653504a46413a3630292019130d05000000000000000000000000000000000000000000000000000000000003090e12181d1f23282c2d3032343638383939393838373533312e2d2a25211f1b150f0b060000000000000000000000000000000000000009121920262a2c2c2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2423211c171008000000000000000810171c2123242d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2b2a27231d160e050000000000040c141b212528292d2d292825211b140c0400000000000000000000000000000000000000000000000000000000000000000000020f1b2835414e5a657076797979797979746e64584c4033261a0d00000000000000000000000000000000000000000003101d2a3643505d6976828686868686868686868686868e939ea9b0aba9abacb2a99d938e86868686868686868686868683776a5d5044372a1d110400000000000000000c18242f39435761686b6c6c6c6c6c6c6c6260584e43382c1f130700111d2a36424e59636a6c6c6c6c6c6c6c6c6c5c554b4034291c1004000000000000060f18212a343d464f5960636c6c6c6c6c6c6c6c6c6360594f44382c20130700000000000814212e3b4754616e7a8793939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393867a6d6053473a2d2014070000000000050e17232e38424a545c606c717a81868d9196989a9c9e9f9f9f9f9e9d9c999a93908b857f786e6960594f463c32281e0f0600000000000b1825313e4b5864717e8b97a4aca89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7aca4978b7e7164584b3e3125180b000000000714212d3a4754606d7a8799a3afacada7a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a59e9285786b5f5245382c1f120500000000000000000000000000010a121a202830363b4246484e5355585b5d5e5f5f5f5f5e5d5b595653514a47433d373127221b140b03000000000000000000000000000000000000000000000000000000000000000000000000000000000002080e11171c1f262b2f35393d43474c5254595b59534b42372c2015090000000000000000000916232f3c4956626f7c86868686868685786b5c666c727b80858a8d8f9192929291908f8c8a86807b726d605c544a3f342b200f060000000000020b151d252c313435332e2d2a251e1b16110d0701000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000810191e272e343c43474d53555d6064666d6f7173757777787979787877767573706e696763605c54524c46413b322a251e170e06000000000000000000000000000000000000000000000000000001070c141a1d24292c2e34383a3c3f4143444546464645444342403e3b3936302e2b261f1c17110a020000000000000000000000000000000008121b242b3136383939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393931302d28221a1208000000000008121a22282d3031393939393939393939393939393939393736332e2820170e04000000020c161e262c32353639393635322c261e160c0200000000000000000000000000000000000000000000000000000000000000000003101c2936434f5c6976828686868686868074675a4e4134271b0e010000000000000000000000000000000000000000030f1c2935424e5a667076797979797979797979797979818e9ba7a69f9c9ea1a8a79b8e817979797979797979797979797771665b4f4236291d1003000000000000000007121d2731454f575d5f6060606060606056544e463d32271b0f03000e1a26313d4751595e5f606060606060605f514b43392f23180c0000000000000000060f18222b343d474f54565f606060606060605f56544f473d32271b100400000000000814212e3b4754616e7a868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686796d6053473a2d20140700000000000006111c263038424a505a61686e747b8084888b8e90919292929291908f8d8a87837e79726d665f574f473d342b20160c0000000000000b1825313e4b5864717e8b979f9f9f9b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9a9f9f9f978b7e7164584b3e3125180b000000000613202c3945515d677986929f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9e9285786b5f5245382c1f1205000000000000000000000000000000080e161e252a30363a3c4347484b4e50515253535252504e4c494644403937322b262017110a02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060c10151a1d24292c32373a4146474c4f4d48423930251b0f040000000000000000000815222e3b4754606a6f797979797979787368545b60696e74797d808284858685858482807d7a746e69625b504a42382e22190f00000000000009131d272f373d40423f3a3936302c27201d18130f0a040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009111a222a303940454e53575f62676d7175797b7d8082838485858685858483817f7d7b7874706d66615e56524c443e36302920180f07000000000000000000000000000000000000000000000000030b12181f252a2f35393a404446494c4e5051525253525251504e4c4a4746413c3a37312b28221c140b070000000000000000000000000000040f19242d353d4245464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646463e3c39332c241a100500000005101a242c33393c3e4646464646464646464646464646464644433f39322920160b0000000a141e2830383d4143464643413d3830281e140a000000000000000000000000000000000000000000000000000000000000000000020f1c2835424f5b6875828e939393938d8073675a4d4034271a0d010000000000000000000000000000000000000000010d1a26323e4a545e66696c6c6c6c6c6c6c6c6c66707d89939eab9f94909196a1ac9f93887c6f666c6c6c6c6c6c6c6c6c6a665f554a3e32261a0e010000000000000000010b151f333d454c5052535353535353534948433d342b21160a00000915202b353f474e5253535353535353535345403931271d1207000000000000000000061019222b353d4448495253535353535353524948443d352b21160b0000000000000714202d3946525e687679797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797976675d5145392c201306000000000000000a141e2630383f4450565e61696e73787b7e81838485868685858482807d7a76726d67605c544d453d352b22190e040000000000000b1825313e4b5864717e8b93939393938e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d93939393938b7e7164584b3e3125180b0000000004111d2935414b556b7885929393939393939393939393939393939393939393939393939393939393939285786b5f5245382c1f120500000000000000000000000000000000050c13191f252a2d32373b3c3f414345454646454543423f3c3a38342e2b27201b150b060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003090e12181d1f272b3035393a3f42413d3730271e14090000000000000000000006131f2b37434e5860626c6c6c6c6c6c6b68615750575e61676d7073767778797978777673706d67615e5751443f3830261c10070000000000040f1a252f3941484d4e4c4746413a38322c29241d1a15100c070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009121b232c343c424b51585f62696e747a7d8185888a8c8f9091919292929191908e8c8a8884807d79736d68615e565046413a322a2119100700000000000000000000000000000000000000000000060d151d24293136394045474a515356585a5c5e5e5f605f5f5e5d5b595754524c4847433c38332d261d18120b030000000000000000000000000915202b353f474e52535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353534a49453e362c22170c0000000c17222c363e45494a53535353535353535353535353535353514f4b443b32281d12060005101b26303a42494e4f53534f4e49423a30261b10050000000000000000000000000000000000000000000000000000000000000000020e1b2835414e5b6874818e9b9f9f998c807366594d4033261a0d000000000000000000000000000000000000000000000a16222d38434c545a5d6060606060606057606d7883919da5a499908384919ea6a49a9083786d6057606060606060605d5b554d43392d22160a00000000000000000000030d212b333b404445464646464646463c3b38322b22190f040000040f19242d353d424546464646464646464638342f271f150b0100000000000000000000071019232b32383b3d4646464646464646463d3b38322b23190f0400000000000005111e2a36414c565e6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c5d554b4035291d110400000000000000020c141e262e343e444c52575e61666a6f727476777879797978777573716d6865605d55504a423c332b23191007000000000000000b1825313e4b5864717e868686868686868175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a677480868686868686867e7164584b3e3125180b00000000010d18242f44515e6b7784868686868686868686868686868686868686868686868686868686868686868685786b5f5245382c1f1205000000000000000000000000000000000002080d141a1e20262b2e2f323536383939393938373533302d2c28231c1b150f0a030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001070c10161b1e25292d2e323534312c251e150c0200000000000000000000030f1b27323d464e545660606060606060595751444d53555c606367696b6b6c6c6b6a696663605d55534d453f342e261e140a0000000000000814202c37414b53595b5954524c48433d39352f2b261f1c18120e090300000000000000000000000000000000000000000000000000000000000000000000000000000000000009121b242d353e464e545c606a6f757b81868a8e929797999b9d9d9e9f9f9f9e9d9d9b999796918d8985807a746e68615a524c443c332b2219100700000000000000000000000000000000000000000910181f272f353b42464b5153545c60636567696b6b6c6c6c6b6b6a686664615e5655534e46443f382f28231d150c0500000000000000000000000e1a26313d4751595e5f606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060575550483e33281c11040004111c28333e48505557606060606060606060606060606060605e5b564d44392e23170b000915212c38424c545a5c60605c5a544c42382c2115090000000000000000000000000000000000000000000000000000000000000000010e1b2734414e5a6774818d9aa7a5998c7f7266594c3f3326190c0000000000000000000000000000000000000000000005111c27313a434a4e50535353535353535e69727f8c95a0a99f93877c7e8a949faba0958c7f72695e53535353535353504f4a433b31271c110500000000000000000000000f1921292f343738393939393939392f2e2c27211910070000000008121b242b3136383939393939393939392c29231d150d0300000000000000000000000007111921272c2f30393939393939393939302f2c272119110700000000000000020e1925303b444c525f6060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060605f514b433a2f24180d010000000000000000020c141c2328323b41464d5354585f626567696b6c6c6c6c6b6a696664615e5653514b443f38302a2119110700000000000000000a1724303d4956626c7179797979797979756f65594d4034271b0e01000000000000000000000000010d1a2733404c58646e7479797979797979716c6256493d3024170a0000000000071d2a37434f5c67727779797979797979797979797979797979797979797979797979797979797979797873685d5044372b1e11050000000000000000000000000000000000000003090e12151b1f212225282a2b2c2c2c2c2b2a282623201f1c18120f0a04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040a0f13191d202126282825201b140c030000000000000000000000000a16202b343d434749535761686b6c6c66635b5146464b515357565e61666a6c6c6a66605d56514c46423b3328231c140c020000000000000c1825313d48535d656866615e56544f4745403a37312c28231c1a140f0b0600000000000000000000000000000000000000000000000000000000000000000000000000000007101b242d363e474f585f666d737c82878e92989b9ea2a9a6a8aaa8a7a6a6a6a7a8a9a8a6a8a19e9a97928c86807a716c615e564d453c342b22190e0500000000000000000000000000000000000009121b222a313940454d53555d6065666d6f72747677787979797877767573716e6867625f5853504a423d342e271e170e0500000000000000000000111d2a36424e59636a6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c64615a5045392d211408000814212d3945505a61646c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6a675f564b3f33271b0e000d1925323d49545e66696c6c69665e54493d3225190d0000000000000000000000000000000000000000000000000000000000000000010d1a2734404d5a6773808d9aa6a5988b7e7265584b3f3225180c00000000000000000000000000000000000000000000000a151f2831383e42434646464643505a616e7b86929fa7a2978d817476828f99a3a79f92867b6e61594f434646464644423e3931291f150b000000000000000000000000070f171e24282b2c2d2d2d2d2d2d2d23221f1b160f0700000000000009121920262a2c2c2d2d2d2d2d2d2d2d1f1c18120b030000000000000000000000000000070f161b2022232c2d2d2d2d2d2d2d2c2322201b160f0700000000000000000008141e29323b4146535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535345403a31281d130700000000000000000000020a1117202930363b4246484e5355585b5d5e5f5f5f5f5e5d5c5a5754524c47454039342e261e180f070000000000000000000815212d3945505a62646c6c6c6c6c6c6c68655d53483d3124180c00000000000000000000000000000b1824303c48535c64676c6c6c6c6c6c6c64625a5045392d21150800000000020f1b27333f4b5660676b6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6b6861574c4034281c0f0300000000000000000000000000000000000000000002050a0f121515181b1d1e1f20201f1f1d1b19161312100c07000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080d111314191c1b19150f090200000000000000000000000000040f19222b32373b3c505c6873787979736d63574b434750555d60686d7276787977736d685f584e443b31292117110a02000000000000000e1b2734404d59656f75726d6863605953514b47433c38342e2a251f1b17110d08020000000000000000000000000000000000000000000000000000000000000000000000050e19222d363e485059616a6f7980878f93999fa3aaabaaaaa29f9d9b9a9a999a9a9b9d9fa2aaa9aba9a19e98928d857e756d685f574e463c342a20170c030000000000000000000000000000000009121b242c343c434b51575e61676d7175797c7f81838485858685858483817f7d7a77736f6a64605b544f454039302920170f05000000000000000000121f2c3845525e6a7579797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979716c6155493c3023170a000a1723303c4955616c71797979797979797979797979797979797771675b4f43362a1d10000f1c2835414e5a66707679797670665a4e4135281c0f0200000000000000000000000000000000000000000000000000000006050403020d1a2633404d596673808c99a6a4978b7e7164584b3e3125180b0203040506000000000000000000000000000000000000030d161f272d323536393935404b55616c75828f98a2a79f92857a6d6e7c87929fa9a2988f82756c61554b403539393736322d271f170d0300000000000000000000000000060d13181c1e1f202020202020201615130f0a040000000000000000080f151a1d1f20202020202020202013100c070100000000000000000000000000000000040b101316161f202020202020201f161613100b0400000000000000000000020d1720293036393b4646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464639352f281f160c01000000000000000000000000060e171e252a31363a3c4347484b4e50515253535252514f4d4a4746413a39352f28231c150c060000000000000000000005111d29343e48505658606060606060605b59534b41372c20140800000000000000000000000000000814202b36414a53585a60606060606060585650483e34291d110500000000000b17232e3a444e565c5e60606060606060606060606060606060606060606060606060606060606060605f5d574f453b2f24180c00000000000000000000000000000000000000000000000000030608090c0e10121213131212100f0c09070604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010507070c0f0e0c09040000000000000000000000000000000007101920272b3845525f6b788586867f7366574d4e535a61676d727a7f83858584807a6f6a5f564d42362a1f14080000000000000000000f1b2835424e5b6875817f7a756f6b65605d55534e4644403936302b27221b19130f0a040000000000000000000000000000000000000000000000000000000000000000020d17202b343e48505a616b707c838c92999fa4abaca7a09d999892908f8d8d8d8d8d8f909298989c9fa4abaaa29f97928a827a6e6960584e463c32291e150b00000000000000000000000000000008121b242d363e464e555d60696e74797e8285898b8d8f91919293929291908e8c8a8784807c76716c666059514b433b332921170e05000000000000000013202c3946535f6c79878686868686868686868686868686868686868686868686868686868686868686868686868686868686868686867e7164574a3e3124170b000b1724313e4a5764717d8686868686868686868686868686868684776a5e5144372b1e1100101c2936434f5c69768286868276695c4f4336291c10030000000000000000000000000000000000000000000000030608091211100f0e0d1926333f4c5966727f8c99a5a4978a7d7164574a3e3124170d0e1011121307060401000000000000000000000000000000040d151c2226292a2d2c3945515d67707d8a949eaaa0958b7f72686a73808d97a1aa9e938a7d70675d51453c31262a2926221c150d0500000000000000000000000000000002070c0f11121313131313131309090703000000000000000000000004090e111213131313131313131306040000000000000000000000000000000000000000000307090a1313131313131313130a09070400000000000000000000000000050e171e252a2d2e393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939392c29241d160d040000000000000000000000000000050d14191f252a2d31373a3c3f41434445464646454442403e3a3936302c29241d17110a030000000000000000000000000c17222d363e45494b535353535353534e4d4841392f251a0f040000000000000000000000000000030f1a252f3841484c4e535353535353534b49453e362d22170c00000000000006121d28323c444b4f51535353535353535353535353535353535353535353535353535353535353535352504c453d33291e1307000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070f161b2a3743505d6a7683908f8276695e54585f626c71797f858c909292908c857c6f695e52463b3025190e020000000000000000101d2a3743505d6a76838c86817c77726d67625f5853514a46423b37332d29241e1b15100c0701000000000000000000000000000000000000000000000000000000000009141f29323d46505a626c717d8690959fa3ababa49f9b95908c898584828180808081828385888b8f93999fa2aaa9a19e938f847b6f6a60584e443b30271d12070000000000000000000000000006101a242d363f4850585f676d737b80858b8f9298989a9c9e9e9f9f9f9e9e9d9b999795908d88837e786f6b605c554d453b332920170c030000000000000013202c3946535f6c798692939393939393939393939393939393939393939393939393939393939393939393939393939393939393938a7e7164574a3e3124170b000b1724313e4a5764717d8a93939393939393939393939393939184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c1003000000000000000000000000000000000000000000040a0f1315161f1e1d1c1b1a1925323f4c5865727f8b98a5a3968a7d7063574a3d3024191a1b1c1d1e1f1413110d08010000000000000000000000000000030a11161a16202b37434e58606d7984919ea6a59d9083786d60606d7a85919ea6a59e9184796d60584e43372b20161a16110b0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050d14191e20212d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d201d18130c040000000000000000000000000000000002080d141a1e21262b2e2f323436383939393938373633312e2d2a25201d18120c06000000000000000000000000000006111b242d34393d3e4646464646464642403d372f271d13090000000000000000000000000000000008131d262f363c4041464646464646463e3d39342d241b1106000000000000010c16202a323a3f434446464646464646464646464646464646464646464646464646464646464646464544403b332b21170d0200000000000000000000000000000000000000000000000000000000000000000000020608080c0f111213131312100e0c08070502000000020404060606060606000000000000000000000000000000000001040707131313131313130d0c0a07020000000000000000000000000002060808131313131313131310060603000000000000000000000000040a1b2835424e5b6875818e92877b6e6663646a6f767e848c92989d9f9f9d9791857b6e61564d41362a1e11050000000000000000101d2a3743505d6a768390928e89837e7a746f6a64605c54524d46443f3835302b271f1d18120e09030000000000000000000000000000000000000000000000000000030d1925303b444e58626c717e879298a0a7afa79f99938e88837f7c79777574737373747577797c7f83878d92989ea5ada59e9691857c6f6a5f564c42392e23180c030000000000000000000000030c18222c363f48505a616a6f7980868d92979c9fa2aaa7a9a8a7a6a6a6a7a8a9a8a6a7a09d9a94908a837c746d675e574d453b32291e150a0000000000000013202c3946535f6c7986929f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f978a7d7164574a3e3124170b000b1724313e4a5764717d8a979f9f9f9f9f9f9f9f9f9f9f9f9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c10030000000000000000000000000000000000000000070f161b1f22232c2b2a2928272625323e4b5865717e8b98a4a396897c706356493d3025262728292a2b2c21201d19130c040000000000000000000000000000000508131e28323a47535f6a73808d96a1aa9e93897d70665c5d67717e8b949faba1968d80736a5f53473e32281e13080500000000000000000000000000000000000407090a13131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313130a0907040000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080e1114142020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202013110d07010000000000000000000000000000000000000003090e12151a1f212225282a2b2c2c2c2c2b2a29272421201e1913100d07010000000000000000000000000000000009121b22292d3031393939393939393534312c251d150b0100000000000000000000000000000000010b141d252b3033343939393939393931302d29221b12090000000000000000040e1820282e33373839393939393939393939393939393939393939393939393939393939393939393837342f2921190f0600000000000000000000000000000000000000000000000000000000000000000003090e121415191b1d1f1f201f1f1d1b191514120e09030b0e10111313131313130b0b0905010000000000000000000001080d111314202020202020201a1916130d0700000000000000000000030a0f1214151f202020202020201c13120f0b0600000000000000000000000c1926333f4c5966727f8c998f8279727071757c838a91969fa2aaa3a3a9a1978e8174685e5246392d2014060000000000000000101d2a3743505d6a7683909d9b95908b85807b76716d66615e5753504945413a37322c29241d1a15100b060000000000000000000000000000000000000000000000010b151f2a36424d56606a717e889299a2aaafa49c959087817c77726f6d6668676766676768666c6f72767b80868e939fa3aaa8a09792867c6f685e544b40342820150900000000000000000000000b151e2a343e48505a626c717c848c92989fa2a9aca8a8a09e9c9a9a999a9a9b9d9fa3ababaaa69f9c95908781796e695e574d443b30261c110600000000000013202c3946535f6c7986929facacacaea9a7a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a4978a7d7164574a3e3124170b000b1724313e4a5764717d8a97989898989898989b9ea6b0aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c10030000000000000000000000000000000000000007101920272b2e2f3938373635343331313e4a5764717d8a97a4a295897c6f6256493c3132333435363738392d2c29241e160d040000000000000000000000000000020c1924303a44505a626e7c87929fa8a2988e81756b605455606c78839099a4a89f92877c6f625a50443a3024190c03000000000000000000000000000000040b101316162020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020171614100b05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000205070813131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313060401000000000000000000000000000000000000000000000002050a0f121515181b1d1e1f20201f1f1e1c1a171413110d080401000000000000000000000000000000000000000911171d2124252d2d2d2d2d2d2d282724201a130b03000000000000000000000000000000000000020b131a202427272d2d2d2d2d2d2d2524211d17110900000000000000000000060e161d23272a2b2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2c2b28241e170f070000000000000000000000000000000000000000000000000000000000000000060b0f151a1e212225282a2c2c2d2c2b2a282522211e1a1410171b1d1e202020202020181715110c060000000000000000040c13191d202d2d2d2d2d2d2d2d2625231e19120a0100000000000000060e151a1f21222c2d2d2d2d2d2d2d29201f1c17110a020000000000000000000a1623303d495663707c8998948f837e7d7e828790949ea1a19e9996979a9f9f92877b6e6154473b2d22170b0000000000000000101d2a3743505d6a7683909da7a09d98928d88837e79736e6963605b53524c47433c38352f2b261f1c17110e0802000000000000000000000000000000000000000007121d27313946525e696f7c86929aa3ababa39f928d837c756f6a6662605c545a5a5a5a5a545b606265696e747b818a9298a2a9a9a19891847a6e665c51453c31261a0e0500000000000000000007121d27303c46505a626c717e8691969fa2aaaba39f9b9796918f8e8d8d8d8d8f9092999a9ea1a9aba79f9a938d837b6e695e564c42382e23170c04000000000013202c3946535f6c7986929facb9aea49d9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a978a7d7164574a3e3124170b000b1724313e4a5764717d8a8b8b8b8b8b8b8b8b8f939eaaaa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c1003000000000000000000000000000000000000040f19222b32373b3c4544434241403f3e3d3d4a5763707d8a96a3a295887b6f6255483c3d3e3f4041434445463a39352f281f160c01000000000000000000000000000a141e2935414c56616c76828f99a3a89f92867b6e61594f505b656f7c87939fa9a3999082766c62564c4135291e150a0000000000000000000000000000070f161b2022232d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2323201c16100800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030608090c0e10111213131312110f0d0b070705010000000000000000000000000000000000000000000000060c11151718202020202020201b1b18140f0901000000000000000000000000000000000000000001080f14181a1b20202020202020181715110c06000000000000000000000000040c12171b1d1e20202020202020202020202020202020202020202020202020202020202020201f1e1c18130d0600000000000000000000000000000000000000000000000000000000000000020a11171b1f262b2e2f32353738393939383735322e2d2b261f1c23272a2b2d2d2d2d2d2d2524211d181109000000000000040d161e24292c393939393939393933322f2a241c130a000000000000060f1820262b2e2f3939393939393939362d2b28221c140b0200000000000000000713202d3a4653606d7985929f95908b898b8f93999fa39f97918c8a8a8e9299998c7f7265544a3f33281c0f0300000000000000101d2a3743505d6a768390979d9fa7a29f9a94908a85807b75706c65605d56544e4745403937312b28231c1914100b040100000000000000000000000000000000000c18232f3943505a616e7b859198a3acaca399928b80786f6a625f585653504a4e4d4d4d4e4a505355575e61696e757e869297a2aaaaa1969082786d60574e42372b21170b0000000000000000000c18232e39424e58616c717f8a9298a0a8aba49f99928e8a8784828180808081828486898d92979ea1a8aca49f9590847b6e685e544a3f342820150a000000000013202c3946535f6c7986929facb9a99d928d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8a7e7164574a3e3124170b000815222e3b4855616e7b7f7f7f7f7f7f7f7f7f818f9ba8aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c10030000000000000000000000000000000000000a16202b343d4347495251504f4e4d4c4b4a49495663707c8996a3a194887b6e615548494a4b4c4d4e4f5051524745413a31281e130800000000000000000000000006111c26303845525d68717e8b949faba1968c8073695e534749535f6a74818d97a2ab9f948b7e71685d52463d30261c110600000000000000000000000007111921272c2f303939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939302f2c27211a11080000000000000002080d101213131313131313130707040100000000000000000000000000000000000000000000000000030613131313131313131313120f0a05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005080a0b131313131313130f0e0c080400000000000000000000000000000000000000000000000003080b0d0e131313131313130b0a080500000000000000000000000000000001060b0f1111131313131313131313131313131313131313131313131313131313131313131312110f0c070200000000000000000000000000000000000000000000000000000000000000060b141b22272b31373a3b3f4244454646464543413f3b3a37312c282e33363739393939393932312e29221b120900000000010c1620282f35394646464646464646403f3b352e251c120700000000040d18222a31373a3b4646464646464646433938332d261d140a000000000000000006131f2c3845515c6774818d98a09d9896979b9fa49f99928d85807d7d818792998f8276665b5044382b1f1206000000000000000c1926323f4c5965727f858b90959b9fa3a69f9c97918c87827d78726d6862605853514b47423c38342e2a251e1b16110d0801000000000000000000000000000004101c2934404b55616c76828f97a1aaafa49a92877e736d665f58534e4946443f41404040413f4446484d53565e616c717c859298a2aca89f948d80736a5f53473e33281c10040000000000000004101c2834404b545f6a717e87939fa2aaa9a199938e86827e7a777574737373747577797c80858b91969da5afa79f9691847a6e665c50443c32261b0f040000000013202c3946535f6c7986929facb3a79a8d80808080808080808080808080808080808080808080808080808080808080808080808080807c6f6255483c2f221509000714212d3a46535f696e7272727272727272727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c10030000000000000000000000000000000000030f1b27323d464e54565f5e5d5c5b5a595857565556626f7c8995a2a194877a6e615455565758595a5b5c5d5e5f54524c433a2f24190d0100000000000000000000000b17232e38424e58606d7a85929ea6a69e9184796d60574d42414e58616d7a85929ea7a69e92857a6d61584e42382e23170c0200000000000000000000040f19232b32383b3d46464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646463d3c38332c231a10050000000000060d14191c1f1f202020202020201413110d0801000000000000000000000000000000000000000000060c1012202020202020202020201e1b161009010000000000000002080d101213131313131313090806030000000000000000000000000000000000000000000000010407071213131313131313131313120f0a050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080f181d262d33373c4247484c4e505252535252504e4c4846423c3834393f43444646464646463e3d3a342d241b110600000008131e28323a414553535353535353534d4b4740372e24190d020000010c161f2a343c43474852535353535353534f46443f382f261c11060000000000000004101c2834404b55616e7b86929fa4a5a3a4a7a09d948f868079737070747d87939285796c605346392d201306000000000000000b1825313e4a57626d72797e83898e92999ea1a8a19e99928f89847f7a746f6a65605d55534d46443f3836302c27201d19130f0a0400000000000000000000000006131f2c3845515c67707d8a949fa9b0a69f93887e716c605c544e47433c3a38342e3433342d3338393c42464d525a616a6f7c86929aa4afa69f92877b6e62594f44392d20150a0000000000000006131f2c3845515c666f7c869299a4aea8a0979187817b75716d6869676766676768676d7073797e848e939fa4aca8a0969083786d60584e43372b20150a0000000013202c3946535f6c7986929facada0938679737373737373737373737373737373737373737373737373737373737373737373737373736f6a5f53473a2e2115080005121e2a36424d575f616565656565656566727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c1003000000000000000000000000000000000006131f2b37434e5860626c6b6a696867666463626160626f7b8895a2aa93867a6d606162636465666768696a6b6c605d564c4135291d11040000000000000000000003101c28343f4a54606a74818d97a1ab9f948a7e71675d51453b3c46525e68727e8b95a0aca1978e81746a60544a3f34281f1409000000000000000000000b16212b353d44484953535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353534a48443d352c21160b000000000810181f25292b2c2d2d2d2d2d2d2d2d201d19130c04000000000000000000000000000000000000030a11171c1f2d2d2d2d2d2d2d2d2d2d2b27211b130a010000000000060d14191c1f1f2020202020201515120f0a030000000000000000000000000000000000000001080d1113141f202020202020202020201e1b161009010000000000000004090e1112131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313130b0a0804000000000000000000000001060b0f111113131313131207060300000000000000000000000000000000000000000000000000000000000000000000060606060606060503000000020608080c0f111213131312100e0b08070502000000000000000000000000000000000000000000000000000008111a212a2f383f44464d5355585b5d5f5f605f5e5d5b5855534d46443f444b4f515353535353534b4a453f362d22180c0100010d19242f3a444c525f606060606060605957524940352a1e1307000007131d28313c464e53555f606060606060605c53504a42382d22170b00000000000000000c18232e3946525e69727f8b929b9e9f9e9b959089827b736d6763646b74818e98887b6e6255483b2f221508000000000000000916222e3a46515b62676d71777c81868c91969c9fa6a39f9b96918c86817c77716d67615f5753504a46413b38322c29241e1b15100c0700000000000000000003101c28343f4a54606d7984919ea6b0aa9e948c7f736c625a504a423c37322d2c282327272722282b2d31363b42465058606a707e88939fa8aea3998f82766c6155493c31261b0f00000000000004111d2935414b55606d79839098a3aba9a09691857d746e6964615d565b5a5a5a5a555c6063666d7179818b939aa4afa89f958c80736a5f54473d32271b0f0100000013202c3946535f6c7986929facada093867a6d676767676767676767676767676767676767676767676767676767676767676767676767625f584e43372b1f120600020e1a26313b454d53555858585858585966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c100300000000000000000000000000000000000815222e3b4754606a6f7877767574737271706f6e6d686e7b8894a1a39886796c6c6d6e6f7071727374767778796d685d5245392c201306000000000000000000030c19232b3844505c666f7c87939fa9a3998f82766c61554b403335414c56606c7883909aa4a99f93887c6f665c50443b30251a0d03000000000000000004101b27323d474f5456606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606056554f473d33271c1004000006101a222a3035383939393939393939392c29241e160d0400000000000000000000000000000000030c151c23282c3939393939393939393937332c251c1309000000000810181f25292b2c2d2d2d2d2d2d22211f1b150e060000000000000000000000000000000000040c13191d20212b2d2d2d2d2d2d2d2d2d2d2b27211b130a010000000000080f151a1d1f20202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020171714110c050000000000000000040c12171b1d1e20202020201f1312100c060000000000000000000000000000000000000000000000000000000105090b0b13131313131312120f0c04090e121415191b1d1f1f201f1f1d1b181414110e0802000000000000000000000000000000000000000000000008111a232c333c41495053575f6265686a6b6c6c6c6b6a6865615f5753504a4e565b5e606060606060585650483f34291d11050004111d2935414c565d6c6c6c6c6c6c6c6c66635b52473b2f23160a00071018242f3a434e585f626c6c6c6c6c6c6c6c69605b544a3f33281c0f030000000000000007121d2a36424d56626d7380898f9292918f8a837d766e69605d5559626f7c89988a7d7063574a3d3024170a0000000000000006121e29353f4951555c60646a6f757a7f848a8f949a9fa2a8a09e98928e88837e79736e6964605c54524c48443d39352f2b261f1c18120b030000000000000006121f2b3844505c66727f8c96a0acaea2988f82776c605a50443f38302b26201f1c171a1a1a171c1f20252a30363e464e58616c73808d96a1acab9f948a7d7064584e43372b1d120700000000000613202c3945515d67737f8c95a0aaada19791847b706b615e5754524c4e4d4d4d4e4b5153545c60676d747f88939fa5afa79f92877c6f62584e43372b1d120700000013202c3946535f6c7986929facada093867a6d605a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a55534e463c31261b0f03000009141f2a333b4246484c4c4c4c4c4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c100300000000000000000000000000000000000916232f3c4956626f7c8584838281807f7e7d7c7b7a79787a8794a19f92867978797a7b7c7d7e7f8081828384867a6d6054473a2d2114070000000000000000000b151e2a36414d56606d78839099a4a99f92877c6f625a5043392f303a44505b666f7c87939faaa49a9083786d60574d42362a1f150b01000000000000000713202c38444f5960636c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6361594f44382c20140700020d18222c343b414446464646464646464639352f2820160c010000000000000000000000000000000a151e262e343846464646464646464646433e372e251b1005000006101a222a303538393939393939392f2e2b2620181006000000000000000000000000000000040d161e24292c2d383939393939393939393937332c251c13090000000009121920262a2c2c2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2423211c171008000000000000060e161d23272a2b2d2d2d2d2d2c201f1c17110a03000000000000000000000000000000000000000000000000060c111517182020202020201f1e1c1810151a1e212225282a2b2c2d2c2b2a282521201e19140f0a040000000000000000000000000000000000000000060f1a232c353e454d535b6064696e72757778797979787674726e6964605c545660676a6c6c6c6c6c6c65625a50453a2e211509000713202c3945525d687679797979797979736d63574b3f3225190c050e19222935404b555f6a6e7979797979797979766c665b5044382b1f120600000000000000000e1925303b44515b636e737d82858684827d78706b625f57514b53606d788686867f7265584c3f3225190c00000000000000010d18232d373f434b5153586062686d73787d82888d92989da0a8a29f9b95908b85807b76706d66615e56544f4745413a37312c28231d150c030000000000000713202d3a4653606d7884919ea8b2a99f92867b6e655b50483e342e261e1b1312100c060d060b0f12131a1f252a343d46505a606d7984919ea8b0a69c8f83766a5f5347392e23180c00000000000714212d3a4754606d7a85929fa7b0a69e92857b6e696059524d47464141404040414045464b51555d606d727f8b939ea9afa3998f82766a605447392f24180c00000013202c3946535f6c7986929facada093867a6d60534d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4847433c342a20150a000000030e18212a31363a3b3f3f3f3f3f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c100300000000000000000000000000000000000916232f3c4956626f7c8991908f8e8d8c8b8a898887868583919daa9f92878385868788898a8b8c8d8e8f9091877a6d6054473a2d211407000000000000000007121d27303946525e68727f8b95a0aba1978d80746a5f53483e312728333f4a54606b74818e98a2aca0958c7f72695e52463e31271d1207000000000000000916222f3b4854606b707979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979706b6155483c2f2316090008141f2a343e464d5152535353535353535345413a32281e1308000000000000000000000000000006111c2630383f44535353535353535353534f4940372c21160a00020d18222c343b4144464646464646463c3a37312a22180e0300000000000000000000000000010c1620282f35393a4546464646464646464646433e372e251b1005000008121b242b3136383939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393931302d28221a120800000000040e1820282e3337383939393939392d2c28231c150c03000000000000000000000000000000000000000000000911181d2124252d2d2d2d2d2d2c2b28241c1f262b2e2f32353738393939383735312e2d2a251f1b150d07010000000000000000000000000000000000020b18212c353e474f575f656c71767b7f8183858586858583817f7b77716d665f58677277797979797979716c62564a3d3124170b000714212d3a4754606d7a86868686868686807366594d4033261a0d0b16202b343d45515d676e7c868686868686868682796c605346392d201306000000000000000009141f29323f49525c636b707578797875706c656059534d4544505c6674797979726d62564a3e3124180b000000000000000007111b252d31394045474e54565e61666d70767b81858b91959b9fa3a79f9d97928d87827d78736e6863605954514c47433c38342e271e150b000000000005111e2a36414c5664707d8a96a1adada1978c7f72695e53493f3628231c140c0a060300000000000306090e1419222b343e45515d67717e8a96a0acab9f94887c6f62544b4034281c100400000006131f2b37434e5866727f8c97a2adaa9e948a7d70695f574f46423b3935303433342e34383a40454b515b626d74818e97a1adab9e94897c6f62554b4035291d1004000013202c3946535f6c7986929facada093867a6d6053474040404040404040404040404040404040404040404040404040404040404040403c3a37312a22180e0400000000060f181f262a2d2e323232333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c100300000000000000000000000000000000000916232f3c4956626f7c89959d9c9b9a99979695949992919195a0aca399929091929995969798999a9b9c9d93877a6d6054473a2d21140700000000000000000c18232e39424f59616e7b85929fa7a79e92857a6d60584e43362c1f222d38424f59616e7a86929fa7a79f92867b6e61594f43392f24180c030000000000000a1623303d495663707d86868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686867d7063564a3d3023170a000d1925303b4650585d5f606060606060605f524c443a2f24190d01000000000000000000000000000c17232e38424a505f60606060606060605f5a52493e33271b0f0008141f2a343e464d51525353535353534847433c342a20150a0000000000000000000000000008131e28323a41454752535353535353535353534f4940372c21160a00040f19242d353d4245464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646463e3c39332c241a10050000010c16202a323a3f43444646464646453a38342e261e150a00000000000000000000000000000000000000000009121b22292e313239393939393939373430282c31373a3b3f4244454646464543413e3b3936302b272018130c04000000000000000000000000000000000a141d2a333e474f5961696e787e83888b8e909292939291908e8b88837e786f6a606a77848686868686867e7165584b3e3225180b000714212d3a4754606d7a8793939393938c807366594d4033261a0a141d28323d46515b606d798391989393939991847a6d665b5044382b1f12060000000000000000020d17202d37404952596063686b6c6b6864605b534f47423c3f4a545c6a6c6c6c65625b51463a2e2215090000000000000000000a131b1f272f34383d43474c52545c60646a6e747a7f84898f92999ea1a9a29f9a938f8a847f7a75706b65605d55534e4645403930271d1207000000000714202d3946525e6876828f9ca8b2ab9e9185796d60574d41382d2417110a02000000000000000000000002091019222935404b55606c7884919dabb0a69a8e8174665c5145382c1f13060000000815222e3b4754606a7884919ea9b1a79c8f82756c61574d453d36302d292427272723282c2e343a4145515b606d7a85929eaab0a69b8e8275675d5145392c1f1306000013202c3946535f6c7986929facada093867a6d6053473a34343434343434343434343434343434343434343434343434343434343434342f2e2b2620181006000000000000060e141a1e2122252526333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c100300000000000000000000000000000000000916232f3c4956626f7c8995a2a7a6a5a4a3a2a1aaa29f9e9da0a7b1aba39f9d9e9fa2aaa2a3a4a4a5a6a7a093877a6d6054473a2d2114070000000000000004101c2834404b54606b75818e98a2aca0958b7e72685d52463c31241a1c262f3d46525e68727f8c95a0aca2988e81756b61554b4035292015090000000000000a1623303d495663707c89939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393897d7063564a3d3023170a00101c2935414d5862696c6c6c6c6c6c6c6c6c5d564c4135291d110400000000000000000000000003101c28343f4a545c6c6c6c6c6c6c6c6c6c6c645a4f43372b1e12000d1925303b4650585d5f60606060606055534e463c31261b0f030000000000000000000000030c19242f3a444c52545e6060606060606060605f5a52493e33271b0f000915202b353f474e52535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353534a49453e362c22170c000006121d28323c444b4f5153535353535246443f3830261c11060000000000000000000000000000000000000006111b242d343a3d3e4646464646464544403b34383c4247484c4e505252535252504e4b4746413b373229241d160d05000000000000000000000000000006111b262f3c454f59616b707b838a9095989b9d9e9f9f9f9e9d9b9895908b837c706b67798592939393938a7d7164574a3e3124170b000714212d3a4754606d7a87939f9f9f998c807366594d4033261a111c262f3a444e58626d75818e95a0aaa59f92877c6f685e544a3f33281c0f03000000000000000000050e1b252e3740474f54565c5f5f5e5c57535049413d373138424a50535f6060585651493f34291e1206000000000000000000010a0d151d23292c32383a41464a5053585f62676d72777d82878d92979d9fa7a49f9c96918c86827c77726d67625f5853514b42392e23180c000000000814212e3b4754616e7a87939facafa3998c7f72675d51453b2f261b1206000000000000000000000000000000071018242f3944505b66727e8b99a3aeac9f9285796d6053463a2d2013080000000916222f3c4955626f7c8896a1acaca095897c6f625a50453b332a25201d191a1a1a181c1f23282f353f45515d67727f8b98a2aeac9f9286796d6053473a2d201406000013202c3946535f6c7986929facada093867a6d6053473a2d2727272727272727272727272727272727272727272727272727272727272722211f1b150e06000000000000000003090e121415191926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c100300000000000000000000000000000000000916232f3c4956626f7c89959b9a999998979695949892919095a0aba39992909192989495969798999a9b9c93877a6d6054473a2d211407000000000000040d1a242c3845515c66707d89939eaaa59d9083786c60564c41342a2012141d2a36414c56606d7883919da5aa9e938a7d70675d51453c31261a0d0400000000000a1623303d495663707c89969f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f96897d7063564a3d3023170a00121f2b3844515d6974797979797979797976685d5245392c20130700000000000000000000000006121f2c3844505c66767979797979797979766c5f5346392d201300101c2935414d5862696c6c6c6c6c6c6c625f584e43372b1f120600000000000000000000000b151e2935414c565d606b6c6c6c6c6c6c6c6c6c6c645a4f43372b1e12000e1a26313d4751595e5f606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060575550483e33281c1104000b17232e3a444e565c5e60606060605f53504a42382e23170c000000000000000000000000000000000000010c18222d363f454a4b53535353535352504c454044464e5355585b5d5e5f605f5e5d5b5854524d47433d352f281f170f05000000000000000000000000000b17222d38414d57616b707d8690959d9fa7a8aaaaa39f9e9e9e9fa3a09d9590867d706d798698a29f9f96897d7063564a3d3023170a000714212d3a4754606d7a8793a0aca6998c807366594d4033261a17222d38424c56606a727f8b939ea8a79e938b7f726a60564c42382d22170b000000000000000000000009131c252e353d4448494f5253514f4a46443f382f2b2630383f44465353534c4a463f372d23180d010000000000000000000000030b12181c1f272b3036383f44464e53555d60656b70757b80858b90959b9fa3a8a19e99928e89847f7a746f6a64605c544b4034281c10040000030f1b27333f495364717e8b9aa4afac9f92867a6e61554b4033291d140a000000000000000000000000000000000007121d28333f4a54616d7a86929facaea298897d706356493d2f24190d0100000d1a2633404d596673808c99a8b2aa9d9083776a6054483e332a211a14110d080d070c1013181d242935414c55606d7985929fabaea2988a7d7164574a3e2e23170b000013202c3946535f6c7986929facada093867a6d6053473a2d201a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1515120f0a040000000000000000000000020507080c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c100300000000000000000000000000000000000916232f3c4956626f7c89908f8e8d8c8b8a898887868584839099a49f9287838485868788898a8b8c8d8e8f90877a6d6054473a2d2114070000000000010c161f2a36424d57606d7984919da5aa9e93897c6f665b50443a3022180e0b1925303b44515c66707d89939eaaa59e9184796d60574e42372b20160c01000000000a1623303d495663707c8996a3acacacb5afaca7a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a396897d7063564a3d3023170a00131f2c3946525f6c7986868686868686867a6d6054473a2d2114070000000000000000000000000713202d3a4653606d788686868686868686796c605346392d201300121f2b3844515d697479797979797979766a5f53473a2e2115080000000000000000000007121d27303945525d686d78797979797979797979766c5f5346392d201300111d2a36424e59636a6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c64615a5045392d211408000f1b27333f4b5660676b6c6c6c6c6c6c605c544a3f34281c1003000000000000000000000000000000000005111d29343f485056586060606060605f5d574f4a5153575f6265686a6b6c6c6c6b6a6864615e56544e45413a312921170f050000000000000000000000030f1b27333f49535f69707d8792989fa7aba7a09d9898929191919299989d9f9892877d707a8794aab4a396897c706356493d3023160a000714212d3a4754606d7a8793a0ada6998c807366594d403326172128333f4a545e686f7c87929fa5aaa0958e81756d62584e443a2f261c11060000000000000000000000010a131c232b33383c3d42454645423d3937332d261d1e262e34383a4646463f3e3a342d251b11060000000000000000000000000001070c10161b1e252a2e34383c43474b5154596063696e73797e83888e92989ea1a8a39f9b95918b85817c76716d665c5145382c1f1306000005121f2b3744505b6575818e9bacb6a99c8f8276685e5243392f21170b020000000000000000000000000000000000010b17222d3846525d6875828f9ca8b4aa9a8d807367564c4135291d11040005111e2a36424d576976838f9ca9b5ab998c7f7366584e43362c21180f0905010000000004070c1319242f3a45515d6774818e9aa7b4aa9b8e817468544a3f34281c10030013202c3946535f6c7986929facada093867a6d6053473a2d20140d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0908060300000000000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c100300000000000000000000000000000000000916222f3c4955626f7c83838281807f7e7d7c7b7a7978777887939f9e9184787879797a7b7c7d7e7f80818283847a6d6054473a2d211407000000000007131d28313a46535f69737f8c96a0aca2988e81756b60544a3f32281e100608141e2834404a54606b75828f98a2aca0968c80736a5f53473e32281e1308000000000a1623303d495663707c8996a7b1bbb5aba39f9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a96897d7063564a3d3023170a00131f2c3946525f6c7985929393939393877a6d6054473a2d2114070000000000000000000000000713202d3a4653606d798693939393939386796c605346392d201300131f2c3946525f6c79868686868686867c6f6255483c2f221509000000000000000000000c18232e39424f59606d7a85868686868686868686796c605346392d201300121f2c3845525e6a7579797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979716c6155493c3023170a00111d2a37434f5c6772777979797979786d665c5044382c1f120600000000000000000000000000000000000915212e3a45505a62656c6c6c6c6c6c6c696157545c60646a6e72757778797979787674716e68626058514b433b332921170d030000000000000000000005121f2b3744505b656e7b859299a2aaaaa39f95918b888584848586888b90959e9992857b7b8894a1aea295897c6f6256493c2f231609000714212d3a4754606d7a8793a0ada6998c807366594d4033261e29333b44505b666d7a849199a3aea2989083796d605b51463d32281d140a00000000000000000000000000010a111921272c2f303538393835312d2b27221b14151c23282c2d39393932312e29231b13090000000000000000000000000000000000040a0f13191c23282b31373a4145474f54575e61676d71767c81868c91969c9fa4a7a09d98928e88837e796d6053463a2d20130700000613202d394653606c7885929eabb3a9988b7f7265564c4131271d0f050000000000000000000000000000000000000006111c2935414c5665727f8b98aab4aa9d918477685d5245392c201306000714202d3a46525e697885929eabafa399897c6f6256493d32231a0f060000000000000000000108131e2935404b5564707d8a97a9b3aa9d908377665c5044382b1f12060013202c3946535f6c7986929facada093867a6d6053473a2d201407010101010101010101010101010101010101010101010101010101010000000000000000000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c100300000000000000000000000000000000000815212e3b47535f6a6f77767574737271706f6e6e6d66667885929e9d9083766b676d6e6f7071717273747576776d675d5145392c20130600000000020b18242f3a43505a616e7b86929fa8a89f92867b6e61594f42382d20160c00020c18232e39424f59616e7b86929fa8a89f92867b6e625a50443a2f24190c020000000a1623303d495663707c8995a0a9b3afa399928d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d897d7063564a3d3023170a00131f2c3946525f6c7985929f9f9f9f93877a6d6054473a2d2114070000000000000000000000000713202d3a4653606d7986939f9f9f9f9386796c605346392d201300131f2c3946525f6c79859293939393887b6f6255483c2f22150900000000000000000005101c2834404b54606b74818e979393939393939386796c605346392d20130013202c3946535f6c79878686868686868686868686868686868686868686868686868686868686868686868686868686868686868686867e7164574a3e3124170b00111e2b3844515e6b7784868686868686786d6053463a2d20130800000000000000000000000000000000000b1724313d4a56626c71797979797979787369585f666d71777b7f8183858586858583817e7b756f6a605d554d453b33291f150b010000000000000000030f1b27333f4953606c77829097a2abaaa398928b837f7b79787778797b7f83899196978f827c8895a2aea295897c6f6256493c2f231609000714212d3a4754606d7a8793a0ada6998c807366594d40332627303b454f59606c78828f96a1aba49f92857b6e675d51493f342b20160b02000000000000000000000000000000070f161c202223292c2c2b2924201f1b17110a0a11171c1f202c2d2d2524221e181109010000000000000000000000000000000000000002080d11171c1f262b2f35393d44484d53555c60646a6f747a7f848a8f939a9fa2aaa29f9a94908a8376695d5043362a1d1000000815222e3b4855616e7b8897a1adada197887b6e6255483b3022150b0000000000000000000000000000000000000000000d1924303c4855626f7b8898a2aeaca095877a6d6054473a2d211407000814212e3b4754616e7b8797a2adac9f92867a6d6053473a2d2014070000000000000000000000010d18242f3b4754616e7a8797a1adac9f9286796d6053463a2d2013070013202c3946535f6c7986929facada093867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c1003000000000000000000000000000000000006131f2b37434e585f626a69686766666564636261605c6a7784919d9c8f8275695c60616263646566676869696a605d554c4135291d1104000000000a141d2935404b55616c75828f98a3aca0968c7f73695e52473d2f261c0e04000007121c27303d46535e69737f8c96a0aca3998f82766c61564c4135291e140a0000000714202d3a4753606d79839097a2acac9f928780808080808080808080808080808080808080808080808080808080808080808080808080807b6e6255483b2f22150800131f2c3946525f6c7985929facaca093877a6d6054473a2d2114070000000000000000000000000713202d3a4653606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929f9f9f95887b6f6255483c2f2215090000000000000000050e1b242c3845515c666f7c88939fa99f9f9f9f9f9386796c605346392d20130013202c3946535f6c798692939393939393939393939393939393939393939393939393939393939393939393939393939393939393938a7e7164574a3e3124170b000e1b2734414e5a6774818d93939398897c6f6356493c2f24190d01000000000000000000000000000000000b1825323e4b5865717e868686868686857866616a6f787e83888b8e909192939291908e8b86827c746d675e574d453b31271d1207000000000000000005121f2b3744505b65717e8a949fa9aea39892867f78726e6c656b666d6e72767d849094948c7f8c99a5afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c807366594d4033232e39424d57616b73808c949fa8a69d928a7e71695f554b40372d22190e050000000000000000000000000000000000050b101316161c1f201e1c1713120f0b060000060c101213202020191815120d06000000000000000000000000000000000000000000000000060b10151a1d24292c33383b42464b5153586062686d72787d82878d92989da0a7a69f9c9084776a5d5144372a1e1100000a1724303d4a5763707d8a96a9b3ab9e928578695f53473a2e2114030000000000000000000000000000000000000000000813202d394653606c7985929facb1a795897c6f6256493c2f231609000916232f3c4956626f7c8995a9b3aa9e918477675d5145382c1f13060000000000000000000000000714202d3946525e687885919eabaea398887b6e6255483b2f2215080013202c3946535f6c7986929facada093867a6d6053473a2d20140c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c070604010000000000000000000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c10030000000000000000000000000000000000030f1b26323c464e53555e5d5c5b5a595857565554535d697683909c9b8e8174685b535455565758595a5b5c5d5e54514c433a2f24190d0100000006111b262f3845515d67717e8a949eaaa69e9184796d60574d42352b1d140a000000000b151e2a36424d57606d7984919ea6ab9f948a7e71685d52453d30261c1106000006131f2c3945515d676e7b85929aa4afa3998e81747373737373737373737373737373737373737373737373737373737373737373737373736e695f53473a2e21140800131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000000000000000000000713202d3a4653606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929faca295887b6f6255483c2f22150900000000000000020c16202b37424d57606d7983919aa4afacacacac9f9386796c605346392d20130013202c3946535f6c7986929f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f978a7d7164574a3e3124170b000a1724313d4a5764707d8a99a3aa998c807366564c4135291d1104000000000000000000000000000000000b1724313e4a5764717d8a939393939786796d6c707c838b9095989b9d9e9f9f9f9e9d9b99928f8781796e695e574d43392f24180c03000000000000000613202d394653606c7883909da6b0a79f92867d726c6662605b545c6062656b707a8290959286929facafa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c807366594d40332834404b545e69707d88939fa6a99f948d80736c61574d43392f251b100700000000000000000000000000000000000000000407090a0f1213120f0a0605030000000000000306071313130c0b090601000000000000000000000000000000000000000000000000000000030a0f13181d20272c3136394045464e54565e61666c70767b80858b90959ca4aa9d9084776a5d5144372a1e1100000c1926323f4c5965727f8c98a5b2a99c8f837669574d42372b1e120600000000000000000000000000000000000000000006121f2b3844505b667783909daab1a4978b7e7164584b3e3125180b000a1723303d4a5663707d8996a3b0a99c90837669554b4035291d100400000000000000000000000005111e2a36414c566a7683909da9b4aa96897c6f6356493c302316090013202c3946535f6c7986929facada093867a6d6053473a2d2019191919191919191919191919191919191919191919191919191413110d0701000000000000000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c10030000000000000000000000000000000000000a15202a343c43474951504f4e4d4c4b4a4948474f5b6875828e9b9a8d8073675a4d4748494a4b4c4d4e4f50514745413a31281e1308000000000b17222d38414e58606d7984919ea6ab9f948a7d70675c51453b3023190b0200000000030c1a25313b45515c67707d8a949eaba69e91857a6d60584e42382e23170b000004101d2935404b555f69707d88939fa6ab9d938b7e716a67676767676767676767676767676767676767676767676767676767676767676767625f574d42372b1e120600131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000000000000000000000713202d3a4653606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929faca295887b6f6255483c2f2215090000000000000008131e28323a47535f69737f8c95a0acb6b8b9beac9f9386796c605346392d20130013202c3946535f6c7986929facacacaea9a7a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a4978a7d7164574a3e3124170b000714212d3a4754606d7a86929fa99d908376685d5245392c201307000000000000000000000000000000000a1723303d4a5663707d89969f9fa994877a6d707e8690959da09e9c9b9a9b9c9ea1a9aba39f9a938e847b6e695e554b403529201509000000000000030f1c28333f4a5463707d8995a0acab9f958b7e716b605b5453504a5053555961686d798391999299a3aeafa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c807366594d4033343c45515c666e7b85929aa4aba1979082786d605a50453c31271d1309000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001070d11161c1f252a2e34383c43474c52545b6064696e747a7e838c929caa9d9084776a5d5144372a1e1100000e1b2834414e5b6774818e9aa7b3a79a8d8074675a4d4131261a0e02000000000000000000000000000000000000000000030f1c28333f4a546875818e9ba8b3a6998d8073665a4d4033271a0d000b1724313e4a5764717d8a97a4b0a89b8f8275685c4f422f24180c00000000000000000000000000010d192530424f5c6875828f9ba8b0a3968a7d7063574a3d3024170a0013202c3946535f6c7986929facada093867a6d6053473a2d26262626262626262626262626262626262626262626262626262621201d18130c040000000000000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c1003000000000000000000000000000000000000040e18222a32373b3c44434241403f3e3d3c3b414e5a6774818d9a988c7f7265594c3f3c3d3e3e3f40414243443a39352f281f160c01000000030f1b27333f49535f6a73808d96a19fa3998f82766c61554b4033291f100700000000000009141f2934404b55616c76828f99a39fa1978d80746a60544a3f34281c100300000c18242f39434d57616b73808c949ea8a59f92867c6f685d545a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a55534d453c31261a0e0200131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000000000000000000000713202d3a4653606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929faca295887b6f6255483c2f221509000000000000030d1925303a44505a616e7b86929fa7afacabadb3ac9f9386796c605346392d20130013202c3946535f6c7986929facb9aea49d9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a978a7d7164574a3e3124170b000613202c3945515d677683909ca99f92867a6d6054473a2d211409000000000000000000000000000000000a1623303d495663707c8996a3aca195887b707e8792989e9896918f8e8d8e8f91979b9fa4aca49f9691847b6e675d51453c31261a0f02000000000006121f2b3844505b6674818e9ba7b1a99d9083766d6259504a46443f4446484f565d676f7c87929fa3abb4afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c807366594d40313c46505a606d78839097a2aca39991857a6e665c50483e332a1f150b00000000000000000000000000000000000000000000000000000000000004080a0a1313131312110f0b070100000000000000000000000000000000000000000000000000000000000000000000000000000000060b0f141a1d24292c32383a41464a5053585f62676d7279808c99a69d9084776a5d5144372a1e110000101c2936434f5c6976828f9ca9b2a5998c7f7266594c3f3326190900000000000000000000000000000000000000000000000b17222d404d5a6773808d9aa6b3a89b8e8175685b4f4235281c0f000b1825313e4b5864717e8b97a4b1a89b8e8275685b4f4235281c070000000000000000000000000000081b2835414e5b6874818e9ba7b0a4978a7d7164574a3e3124170b0013202c3946535f6c7986929facada093867a6d6053473a333333333333333333333333333333333333333333333333333333332d2c29241d160d0400000000000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c10030000000000000000000000000000000000000007101820262b2e2f37363534333332313033404d596673808c99978b7e7164584b3e313031323334353636372d2c29241e160d040000000005121f2b3744505b656f7c87929393939392877c6e625a5043392e21170d00000000000000030c18232f3943505a616e7b86929393939393877c6f665c5044382b1f1206000007121d27313b454f59606c78828f96a0aaa39891847a6d665b504d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4847423c332a2015090000131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000000000000000000000713202d3a4653606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929faca295887b6f6255483c2f2215090000000000010b151f2a36414c56626c76828f98a3aca49f9ea1a9b39f9386796c605346392d20130013202c3946535f6c7986929facb9a99d928d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8a7e7164574a3e3124170b0004111d2935414c5566737f8c99a9a3998a7d7164574a3e31261a0e02000000000000000000000000000000091623303c4956636f7c8996a2afa295897c7c86929996918c8784828181818285888e939aa1a9a8a0969083796d60584e43372b1f140900000000000613202d394653606c7985929eabada1978a7d70645a50443f393734383a3d444c555f6a74818e9aa7b1bdafa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c807366594d403a434e58616c74808d959fa9a59f92877d6f685e544a3f362c21180d0300000000000000000000000000000000000000000000000000000000050b10141617202020201f1e1b17120c0500000000000000000000000000000000000000000000000000000000000000000000000002080d11171c1f262a2f35383d43484c52545c60646a6e747a7e838c929caa9d9084776a5d5144372a1e110000101d2a3643505d697683909ca9b1a4978a7e7164574b3e3124180b0000000000000000000000000000000000000000000000061926323f4c5965727f8c98a5b2a89c8f8275695c4f4236291c0f000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2834414e5b6774818e9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d6053473f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3a39352f281f160c01000000000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c10030000000000000000000000000000000000000000070e151b1f21222b2a29282726252425323f4c5865727f8b98968a7d7063574a3d30242425262728292a2b21201d19130c0400000000000613202d394653606c79838686868686868680736a5f53473e30271d0f05000000000000000007121d27313e47535f6973808686868686868683796d6053463a2d2013070000010b151f2a333e44505b666d7a849198a2aaa1968f82786c60594f45404040404040404040404040404040404040404040404040404040403b3a37312a21180e030000131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000000000000000000000713202d3a4653606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929faca295887b6f6255483c2f221509000000000007121d27313946525e68717e8b949faaa49a939297a1ad9f9386796c605346392d20130013202c3946535f6c7986929facb3a79a8d80808080808080808080808080808080808080808080808080808080808080808080808080807c6f6255483c2f22150900010d19242f3c4956626f7c8997a2ab9a8e817467574d42372b1e12050000000000000000000000000000000916232f3c4956626f7c8995a2afa396897d839098938d847f7b777574747476787c81889197a1a9a8a0958d80736a5f53473b30251a0e02000000000916232f3c4956626f7c8997a2adab9e9285796d6053463f332d2b282c2d323a434e58626e7b88959fabb8afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c807366594d40414b555f6a717e8a929da7a89e938c7f726b60564c42382e241a0f06000000000000000000000000000000000000000000000000000000000810171c2023242d2d2d2d2b2a28231e170f06000000000000000000000000000000000000000000000000000000000000000000040a0f13191c22282b3136394045474e54565e61666d70767b80858b90959ca4aa9d9084776a5d5144372a1e110000111e2a3744515d6a7783909daab0a3968a7d7063574a3d3024170a00000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4b1a99c908376695d5043362a1d10000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d60534c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4745413a31281d1307000000000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c1003000000000000000000000000000000000000000000040a0f1315161e1d1c1b1a19181724313e4a5764717d8a9795897c6f6256493c2f231718191a1b1c1d1e1413110d080100000000000005121f2b3744505b656c7679797979797979736e64584e43352c1e150b000000000000000000010b151f2b37424d57636e7379797979797979776d665c5044382b1f1206000000030d182128333f4a545d686f7c86929fa4a89f948c80736b61574d43392f343434343434343434343434343434343434343434343434342f2e2b2620180f06000000131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000000000000000000000713202d3a4653606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929faca295887b6f6255483c2f22150900000000020b18232f39434f59616d7a85929ea6a99f938785929eab9f9386796c605346392d20130013202c3946535f6c7986929facada0938679737373737373737373737373737373737373737373737373737373737373737373737373736f6a5f53473a2e21150800000813202d394653606c7985929eab9e918478695f53463a2d2114060000000000000000000000000000000916222f3c4955626f7c8895a2afa89c8f828f9593888079726e6969686768696a6f747d859197a2ada79f92877c6e62574d42362a1e1205000000000c1926323f4c5965727f8c98a9b3a79b8e8174665c50443828221f1c1f2028313c47535f6a7683909da9b6afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c807366594d3f45515d676f7c86929fa4aaa0968f81756d62594f443b30261c12080000000000000000000000000000000000000000000000000000000008111a22282d3031393939393837342f2821180f05000000000000000000000000000000000000000000000000000000000000070c10151b1e24292d33383b42464b5153586062686d73787d82888d92989da0a7a69f9c9084776a5d5144372a1e110000111e2b3844515e6b7784919eaaafa396897c706356493d3023160a00000000000000000000000000000000000000000000000b1824313e4b5764717e8a97a4b1aa9d9083776a5d5044372a1d11000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d605959595959595959595959595959595959595959595959595959595959595954514b433a2f24180d010000000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c100300000000000000000000000000000000000000000000000306080911100f0e0d0c0b1623303d495663707c899694877b6e6154483b2e21150b0c0d0e0f1011070604010000000000000000030f1b27333f49535b60696c6c6c6c6c6c6c67645c52463c31231a0c0300000000000000000000030d1a26313c45525c63666c6c6c6c6c6c6c6a605c544a3f34281c100300000000060f17222d38424c565f6a717e8b929da7a69f93887d70695f554b40352927272727272727272727272727272727272727272727272722211e1a150e0600000000131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000000000000000000000713202d3a4653606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929faca295887b6f6255483c2f221509000000000a141d2934404b55606b74818e97a1ada1978e8183909da99f9386796c605346392d20130013202c3946535f6c7986929facada093867a6d676767676767676767676767676767676767676767676767676767676767676767676767625f584e43372b1f1206000006121f2b3844505b6675828e9ba8a196887b6e6155483b2e23170c0000000000000000000000000000000916222f3c4955626f7c8895a2afaa9e948f9493887e736d67615e575b5a5b5860626b6f7c85929ea6afa3998e8175695e52463a2d201408000000020f1b2835424e5b6875818e9ba8b5ab988b7e7165544a3f342817121012161f2b37434e5866727f8c99abb5afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c807366595049515b606d79849198a2aea29891847a6d605b51473d32291e150a0000000000000000000000000000000000000000000000000000000005101a232c33393c3d464646464543403a332a21170c01000000000000000000000000000000000000000000000000000003090e12181c1f262b3035383f44464d53555d60656a6f757a7f848a8f949a9fa2aaa29f9a948f8a8276695d5043362a1d100000121f2b3845525e6b7885919eabafa296897c6f6356493c3023160900000000000000000000000000000000000000000000000a1724313d4a5764707d8a97a3b0aa9e9184776b5e5144382b1e11000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d6666666666666666666666666666666666666666666666666666666666666666605d554b4135291d11040000000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c10030000000000000000000000000000000000000000000000000000000403020100000915222f3c4855626f7b889598867a6d6053473a2d201407000102030304000000000000000000000000000b17222d38414950535d606060606060605a58524a40332a20110800000000000000000000000009151f2a33404a52585a606060606060605d53504a42382e23170b00000000000006111c262f3a444e58616c74808d959fa9a49a92857b6e675d51453f342b20171a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1514120e09030000000000131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000000000000000000000713202d3a4653606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929faca295887b6f6255483c2f22150900000006111b262f3845515c67707d89939ea9a69e91857a84919daa9f9386796c605346392d20130013202c3946535f6c7986929facada093867a6d605a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a55534e463c31261b0f030000030f1c28333f4a5465717e8b98a8a8988b7e7265544a3f34281c100300000000000000000000000000000916222f3c4955626f7c8895a2afb0a69e9c958c80736c605c55524d4e4e4e4e5459606a717e8a949fabab9f92877b6e6154483b3025190e02000005111d2a36414c566a7784909daaafa499887b6f6255483c2e23170603060d1a26313c4956626f7c8999a3afafa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c80736b605b5358626d75818e96a0aaa49f92867c6f675d51493f352b20170c03000000000000000000000000000000000000000000000000000000000b17222c363e44494a5353535352504b453c33281e1207000000000000000000000000000000000000000000000001040b10141a1d23282c32373a41464a5053575f61676d71777c81868c91969c9fa6a7a09d98928d88837e786d6053463a2d2013070000121f2b3845525e6b7884919eabafa296897c6f6356493c3023160900000000000000000000000000000000000000000000000b1724313e4a5764717d8a97a4b0aa9d9184776a5e5144372b1e11000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada09386797272727272727272727272727272727272727272727272727272727272727272726d675d5145392c2013060000000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c10030000000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a879a928579675d5145392c2013060000000000000000000000000000000000000006111b262f383f444650535353535353534d4c4740382e21180e00000000000000000000000000030e18212e3840474b4d535353535353535046443f3830261c1106000000000000000a141d28323c46505a606d78839097a1aba2979083796d605b51463d32291e140a0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0808060200000000000000131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000000000000000000000713202d3a4653606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929faca295887b6f6255483c2f2215090000000b17222d38414e58606d7984919ea5aa9e948a7e7885919eab9f9386796c605346392d20130013202c3946535f6c7986929facada093867a6d60534d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4847433c342a20150a000000000b17222d3b4854616e7b8795a0a89b8f8275665c5044382c1f120600000000000000000000000000000916222f3c4955626f7c8895a2afb8b0a89d9083786d605a514b464241414143474f58616c76828f9ca9afa3998c7f7266564c41362a1e110500000713202d3946525e687985929facac9f9386796d6053463a2d20130600000913202d3a4653606d7986929facafa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0adab9e91847d726c655d606a727f8b939ea8a79d928a7e716a5f554c41372d23190e050000000000000000000000000000000000000000000000000000000004101c28333e48505557606060605e5c564e453a2f23170b00000000000000000000000000000000000000000001080d11161c1f252a2e34383c43474c52545b6063696e73797e83898e92999ea1a8a39f9b95908b85807b76716d665c5144382c1f12060000111e2b3844515e6b7784919eaab0a396897d7063564a3d3023170a00000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1a99d9083766a5d5043372a1d10000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facb2a6998c7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f796d6054473a2d2114070000000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c10030000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d7986939184786b554b4035291d100400000000000000000000000000000000000000000a141d262d3337394346464646464646403f3c362e261c0f060000000000000000000000000000060f1c262e363b3f4046464646464646443a38342e261e140a0000000000000000020b16202a343e44515c666e7b859199a3a9a0958e81756d62584e443a30261c11060001010101010101010101010101010101010000000000000000000000131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000000000000000000000713202d3a4653606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929faca295887b6f6255483c2f2215090000040f1b27333f49535f6a73808c96a0aca2988f82757985929fac9f9386796c605346392d20130013202c3946535f6c7986929facada093867a6d6053474040404040404040404040404040404040404040404040404040404040404040403c3a37312a22180e04000000000614202d3a46525e697784919daa9f9285796d6053463a2d20130800000000000000000000000000000916222f3c4955626f7c8895a2afb9ada1968a7d71665c5045403936303432373d46505a63707d8a97a1adab9d908377685e5246392d20140700000714212e3a4754616d7a8798a2aeab9e918478675c5145382c1f1306000006131f2c3845515c667784919daaafa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0adada19691877f776d68686f7c87929fa5a99f958d80746c61584e433a2f251b110700000000000000000000000000000000000000000000000000000000000814202d3944505a61646c6c6c6c6b6860564b4034281b0f0200000000000000000000000000000000000000040c13191d20272c3036394045464e54565d61666c70757b80858b90959b9fa3a8a19e99928e89837e7a746e6a64605c544a4034281c10040000111e2a3744515d6a7784909daab0a3978a7d7064574a3d3124170a00000000000000000000000000000000000000000000000c1825323f4b5865727e8b98a5b1a99c8f8276695c504336291d10000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facb9a89c918c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c877b6e6154483b2e2115080000000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c10030000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d79869a9184786b554b4135291d11040000000000000000000000000000000000000000020b141b22272b2d36393939393939393433302b241c140b000000000000000000000000000000000a141c242a2f323339393939393939372d2b28231c140c02000000000000000000040e18222834404a545e69707d87929fa5a79e938b7f726a60564c42382e23170f0600000000000000000000000000000000000000000000000000000000131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000000000000000000000713202d3a4653606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929faca295887b6f6255483c2f22150900040d1a232b3744505b656f7c87929fa8a79f92867b6e7986939fac9f9386796c605346392d20130013202c3946535f6c7986929facada093867a6d6053473a34343434343434343434343434343434343434343434343434343434343434342f2e2b2620181006000000000005121e2a36424d576774808d9aaaa298897c6f6356493c2f24190d01000000000000000000000000000916222f3c4955626f7c8895a2afb8ab9e9184786c60544a3f342f2a2527272b333e4653606c7885929eabaca095877a6e6154473b2e21140800000915222f3c4855626f7b8895aab4a99d9083766a554b4034281c1004000004101c2834404b546975828f9ca8afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0adb2a9a199928c827a6f6d7a849199a3aba1979083786d605a50463c31281e130a000000000000000000000000000000000000000000000000000000000000061623303c4955616c70797979797872685c5043372a1e07000000000000000000000000000000000000010a0d161e24292c33383b42464b5153585f62686d72787d82878d92979da0a7a49f9c96918c86817c77726d67625f5853514a42392e23180c000000101d2a3643505d697683909ca9b1a5988b7e7265584b3f3225180700000000000000000000000000000000000000000000000d1a2633404d596673808c99a6b3a89b8f8275685c4f4235291c0f000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facb9ada39c999999999999999999999999999999999999999999999999999999999999999994877b6e6154483b2e2115080000000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c10030000000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a8794928679675d5145392c201306000000000000000000000000000000000000000000020a11171b1f202a2d2d2d2d2d2d2d2726231f19120b0200000000000000000000000000000000020a12191f2326272d2d2d2d2d2d2d2a201f1c17110a020000000000000000000000061018232e39424d57606b727f8c939ea7a59f92877c6f685e544a3f342821180d04000000000000000000000000000000000000000000000000000000131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000000000000000000000713202d3a4653606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929faca295887b6f6255483c2f221509010c161f2a36414c56606c77839099a3aba0958c7f726d7a879aa4af9f9386796c605346392d20130013202c3946535f6c7986929facada093867a6d6053473a2d2727272727272727272727272727272727272727272727272727272727272722211f1b150e06000000000000020e1a25303d4a5763707d8a98a3aa998c807366564c4135291d1104000000000000000000000000000916222f3c4955626f7c8895a2afb6ac9a8d8074665b5042382e231d1a1b1b212b3844505b6674818e9ba7b1a7978a7e7164574b3e3124180700000a1623303d495663707c8996a3afa89c8f8275695c4f422e23180c000000000c18232e414e5a6774818d9aa7afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0adbbb2aba39f948f847c78828f96a1aba49992857b6e665c51483e342a1f160c0100000000000000000000000000000000000000000000000000000002080e111724313d4a5764707d8686868684786b5e5245382b18120e09030000000000000000000000000000000a131c1f282f35393d44484d52545c60646a6f747a7f848a8f939a9fa2a9a19e9a938f8a847f7a756f6b65605d55534e4644403930271c12070000000f1c2835424f5b6875818e9ba8b3a6998c807366594d402f23180c00000000000000000000000000000000000000000000010e1b2834414e5b6774818e9aa7b4a79a8e8174675b4e4134281b0e000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facb9b5ada8a6a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a194877b6e6154483b2e2115080000000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c10030000000000000000000000000000000000000000000000000000000403020101000915222f3c4855626f7b889598877a6d6054473a2d2114070001020303040000000000000000000000000000000000060b0f12131d202020202020201a1917130e080100000000000000000000000000000000000000080e1317191a202020202020201d1312100b06000000000000000000000000000007121c27303b454f59626d75818e95a0aaa39991847a6d665c50443e332a1f160c010000000000000000000000000000000000000000000000000000131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000000000000000000000713202d3a4653606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929faca295887b6f6255483c2f22150907121d28313946525e68727e8b949faba3999083786d6e7a8794a1b69f9386796c605346392d20130013202c3946535f6c7986929facada093867a6d6053473a2d201a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1515120f0a0400000000000000000914202d3a4753606d7a86929fa99d908376685d5245392c201307000000000000000000000000000916222f3c4955626f7c8895a2afafa49a897d7063544a3f30261c120e0a0f1c28333f4a5465717e8b98abb5a69a8d8073675a4d402e23180c00000a1724313d4a5764707d8a97a3b0a89b8e8175685b4e4235281b0700000000071a2633404d596673808c99a6afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0adb8b0aaa9a69e969186828f949fa8a69f93877d70695e544b40362c22180d04000000000000000000000000000000000000000000000000000001070c14191b2227313d4a5764707d8a93939185786b5e52453828231c1a140d070100000000000000000000000007121c252e313a4145474f54575e61666d71767c81868c91969c9fa4a79f9d97928d87827d78726d6863605953514b47433c38342e271e150b000000000d1a2734404d5a6773808d9aa6b3a89b8e817568554b4034291c100400000000000000000000000000000000000000000005121e2a36424d576976838f9ca9b2a5988c7f7265594c3f3226190c000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facb9afa7a2a09f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f94877b6e6154483b2e2115080000000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c100300000000000000000000000000000000000000000000000206080811100f0e0d0c0b1623303d495663707c899694887b6e6155483b2e22150b0c0d0e0f10110707050100000000000000000000000000000003050610131313131313130d0d0b07030000000000000000000000000000000000000000000002070a0c0d131313131313131107060300000000000000000000000000000000000b151e29333d47515b606d79839098a2aba1968f82786d605a50453c31281d13070000000000000000000000000000000000000000000000000000131f2c3946525f6c7985929facada093877a6d6054473a2d2114070303030303030303030303030713202d3a4653606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929faca295887b6f6255483c2f2215090b18242f39434f59616e7a85929fa6a89f92877c6f666e7b8894a1ac9f9386796c605346392d20130013202c3946535f6c7986929facada093867a6d6053473a2d20140d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d090806030000000000000000000006131f2c3945515d6776838f9ca99f92867a6d6054473a2d211409000000000000000000000000000916222f3c4955626f7c8895a2afac9f93867a6d6054473a2d21150a01000b17222d3c4855626f7b8899a4afa99c8f837669554b4034281c1004000b1724313e4a5764717d8a97a4b0a79a8d8174675a4e4134271b0e010000000c1926323f4c5965727f8c98a5afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0adb0a69e9c9fa2a199928f949ea6a89e948c7f736b60574d42392e241b10060000000000000000000000000000000000000000000000000000030b12181e252a2d33373d4a5764707d8a979e9185786b5e524538342e2a251f18120c0400000000000000000000020d19232e3740434c5154596063696e73797e83888e92989ea0a8a29f9a95908b85807b76706c66615e56544f4745403a37312c28231c150c03000000000c1925323f4c5865727f8b98abb5aa9d908477675c5145382c1f13060000000000000000000000000000000000000000000714212d3a46535f697885929fabb4aa968a7d7063574a3d3024170a000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facb9a79d95939393939393939393939393939393939393939393939393939393939393939393877b6e6154483b2e2115080000000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c1003000000000000000000000000000000000000000000030a0f1214151e1d1c1b1a19181824313e4b5764717e8a9795897c6f6256493c2f231718191a1b1c1d1e1413110d0802000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030c17202b353f45515d676e7b86929aa4a89f948d80736c61574e433a2f2418110700000000000000000000000000000000000000000000000000131f2c3946525f6c7985929facada093877a6d6054473a2d2114101010101010101010101010101013202d3a4653606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929faca295887b6f6255483c2f22150a141d2935404b55616b75818e97a2aca1968d80746a626f7b8895a2ac9f9386796c605346392d20130013202c3946535f6c7986929facada093867a6d6053473a2d20140701010101010101010101010101010101010101010101010101010101000000000000000000000000000004101d2935404b5566727f8c99a9a3998a7d7164574a3e31261a0e020000000000000000000000000916222f3c4955626f7c8895a2afaa9e918477675d5145392c20130300000613202d3a4653606d7986939facab9e918478675c5145382c1f1306000b1824313e4b5764717e8a97a4b1a79a8d8174675a4e4134271b0e010000000c1825323f4b5865727e8b98a5afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0adaa9e948f9298a2a39f9c9ea6aaa1968f82776c60594f453b30271d12090000000000000000000000000000000000000000000000000000060d151d23293036383f44464a5764707d8a979e9185786b5e5246444039363029241d160d0600000000000000000006121e2a35404951555d60656b70757b80858a90959a9fa2a8a09d98928e88837e79736e6963605b54524c48433d39352f2b261f1c18120b030000000000091623303c4956636f7c8999a4afac9f9286796d6053473a2d22170b0000000000000000000000000000000000000000000815222e3b4855616e7b8897a2adaea298887b6e6155483b2e221508000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facb9a2958b868686868686868686868686868686868686868686868686868686868686868686867b6e6154483b2e2115080000000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c10030000000000000000000000000000000000000000060e151a1f21222b2a29282726252425323f4c5865727f8b98968a7d7063574a3d30242425262728292a2b21201d19130c0500000000000000000000000305060e101010101010090806030000000000000000010304060606060504030100000000000000000000000000000000000000000000000000000000000000000000000000000000050e19232935404b555f69707e88939fa6a69d928a7e716a5f554b40352923190e05000000000000000000000000000000000000000000000000131f2c3946525f6c7985929facada093877a6d6054473a2d211c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c202d3a4653606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929faca295887b6f6255483c2f2215111c262f3845515d67707d8a939ea9a59e9184796d60626f7c8895a2ac9f9386796c605346392d20130013202c3946535f6c7986929facada093867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c18242f3c4955626f7c8897a1ab9a8d817467574d42372b1e12050000000000000000000000000916222f3c4955626f7c8895a2afa89c8f827569554b4135291d1104000006131f2c3845515c677884919eabac9f9386796d6053463a2d201307000b1825313e4b5864717e8b97a4b1a79a8d8074675a4d4134271a0e010000000b1825323e4b5865717e8b98a4afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada99c8f82869298a3aba9aaaea39891847a6d655b50473d33291e150b0000000000000000000000000000000000000000000000000000070f181f272f343b4146495053565964707d8a979e9185786b5e5753514a46423b352f281f180f0700000000000000000a16232f3b46515b63676d72777d82878d92979d9fa7a39f9b96918b86817c76716d67615f5753504a46413a38322c29241d1a15100c07000000000000000714202d3a4753606d7a86939facaea399897d706353493f33271b0f030000000000000000000000000000000000000004111d2935414c5565717e8b98a9b3ac9f9285786d6053463a2d201307000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867979797979797979797979797979797979797979797979797979797979797979797976695e52463a2d2014070000000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c100300000000000000000000000000000000000000060f1820262b2e2f37363534343332313033404d596673808c99978b7e7164584b3e313031323334353636372e2d2a251e170e050000000000000000060b0f12131b1d1d1d1d1d1d1615130f0a0400020507080b0e1011121313131211100e0b08070502000000000000000000000000000000000000000000000000000000000000000000000000071118242f39434d57616c73808d949fa8a49f92867c6e675d51453f352b20170c030000000000000000000000000000000000000000000000131f2c3946525f6c7985929facada093877a6d6054473a2d2929292929292929292929292929292929292d3a4653606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929faca295887b6f6255483c2f221517222d38424e58606d7984919ea5a99e938a7d70675d626f7c8995a2ac9f9386796c605346392d20130013202c3946535f6c7986929facada093867a6d6053473a2d20140c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c070604010000000000000000000000000000000713202d394653606c7885919eaa9e918477695f53463a2d2114060000000000000000000000000916222f3c4955626f7c8895a2afa79a8d8174675a4e412f24180d01000004101c2834404b556a7683909da9afa49a887b6e6155483b2e221508000b1824313e4b5764717e8a97a4b1a79a8d8074675a4d4134271a0e010000000b1825323e4b5865717e8b98a4afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c807d869299a3abb5ac9f92867c6f685d53493f352b21170c0300000000000000000000000000000000000000000000000000071019212a313940454c52535b60636669707d8a979e9185786b6763605c54524d454039312921191007000000000000000c1925323e4b57636d737a7f84898f92999ea1a9a19e99928f89847f7a746f6a64605c55534d46443f3836302c27201d18130f0a040000000000000000000613202c3945515d677784909daab4ab9a8d8073655b5044372b1f140a000000000000000000000000000000000000010c13202c3945515d6775828e9ba8b5a89c8f8275665c5044382b1f1206000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c5e574d42362a1e12050000000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c1003000000000000000000000000000000000000030e18222a31373a3b44434241403f3e3d3c3b414e5a6774818d9a998c7f7266594c3f3c3d3d3e3f40414243443a3936302920170c020000000000020a11171b1f202729292929292922221f1b150e090e111414181a1c1e1f20201f1f1e1c1a181514120e0904010000000000000000000000000000000000000000000000000000000000000000000007121d28313c45505a606c78828f96a1aaa2989183796d605b51473d33291e150b0000000000000000000000000000000000000000000000131f2c3946525f6c7985929facada093877a6d6054473a36363636363636363636363636363636363636363a4653606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929faca295887b6f6255483c2f22151c28333f4a545f6a73808d96a1aca2978e81756b6155626f7c8995a2ac9f9386796c605346392d20130013202c3946535f6c7986929facada093867a6d6053473a2d2019191919191919191919191919191919191919191919191919191413110d07010000000000000000000000000005121f2b3744505b6575818e9baca096887b6e6155483b2e23170c0000000000000000000000000916222f3c4955626f7c8895a2afa6998c807366594d4033261a07000000000c18232e424f5c6975828f9ca8b6ac95897c6f6256493c2f231609000b1724313e4a5764717d8a97a4b0a79a8d8174675a4e4134271b0e010000000c1825323f4b5865727e8b98a5afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c80737d879299a4aca6998c80736a60584e453c332a21170f05000000000000000000000000000000000000000000000000060f19222b333c434b51565e61656c6f7375777e8a979e9184787674706d66615e57514b433b332b22190f060000000000000d192633404c5966737f868b91959b9fa3a69f9c97918c86827d78726d68625f5853514b46423b38332d2a251e1b16110d0701000000000000000000000004101d2935404b556773808d9aa9b3ab9e9184786c6053463c2f261b1106000000000000000000000000000000000007131d28333f4a54606d7a86929facb1a7988b7f7265544a3f34281c1003000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d60606060606060606060606060606060606060606060606060606060606060605f524d453b30251a0e020000000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c10030000000000000000000000000000000000000a15202a343c43474851504f4e4d4c4b4a4948474f5b6875828e9b9a8d8073675a4d4748494a4b4c4d4e4f50514746413a32291e130800000000020b141b22272b2d343636363636362f2e2b262019141a1e20212527292b2c2c2d2c2c2b29272421211e1a14110d08020000000000000000000000000000000000000000000000000000000000000000010c161f2a333e44505b666d7a849198a3aaa0958e81756d62594f453b30271c120700000000000000000000000000000000000000000000131f2c3946525f6c7985929facada093877a6d605447434343434343434343434343434343434343434343434653606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929faca295887b6f6255483c2f221a242b3844505b666f7c87929fa8a69f92857a6e615956626f7c8995a2ac9f9386796c605346392d20130013202c3946535f6c7986929facada093867a6d6053473a2d26262626262626262626262626262626262626262626262626262621201d18130c04000000000000000000000000030f1b27333f495364717e8b9aa4a8988b7e7265544a3f34281c100300000000000000000000000916222f3c4955626f7c8895a2afa5988b7f7265584c3f3225190c00000000071b2835424e5b6875818e9ba8b0a396897d7063564a3d3023170a000a1724303d4a5763707d8a96a3b0a89b8e8175685b4e4235281b07000000000c1926323f4c5965727f8c98a5afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c8073717e87939aa4ab9e92857c6f6a5f574d453b332921170e0500000000000000000000000000000000000000000000040d18212b343c454d555c60686e73787c7f828486929fa196898482807d79746e69605d554d453d342b21180d030000000000101d2a3743505d6a768390989da0a8a29f9a948f8a84807b75706c65605d56544e4745403936312b28221c19130f0a040100000000000000000000000000010d18242f3d495663707c8997a1adaca196897d7063584e41382d22170f06000000000000000000000000000000071118242f3844505b66717e8b98a2aeaca095887b6e6155483b2e23170b00000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d60535353535353535353535353535353535353535353535353535353535353534846423b33291f1409000000000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c10030000000000000000000000000000000000020f1a26313c464e53555e5d5c5b5a595857565554535d697683909c9b8e8174685b535455565758595a5b5c5d5e54524c443a3025190d010000000a141d262d333739414343434343433c3b37322a2220252a2d2e313436373939393938373634312e2d2a25201d19130d070100000000000000000000000000000000000000000000000000000000000000040d182128333f4a545e686f7c86929fa5a79e938c7f726b60574d42392e23181006000000000000000000000000000000000000000000131f2c3946525f6c7985929facada093877a6d60544f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f53606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929faca295887b6f6255483c2f221f2a36424d57606c78839099a3ab9f948b7e71685e5256626f7c8995a2ac9f9386796c605346392d20130013202c3946535f6c7986929facada093867a6d6053473a333333333333333333333333333333333333333333333333333333332d2c29241d160d040000000000000000000000000b17222d3b4754616e7a87939fa89b8f8275665c5044382c1f120600000000000000000000000916222f3c4955626f7c8895a2afa5988b7e7265584b3f3225180c000000010e1b2834414e5b6774818e9aa7b0a3978a7d7064574a3d3124170a000916232f3c4956626f7c8995acb6a89b8f8275685c4f422e23180c000000000d1a2633404d596673808c99a6afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c80736c717e88939fa3a19792857c6e695f574d453b332920170e050000000000000000000000000000000000000000010c161f2a333c464e575f676d737a8084898c8f919298a3a8a197918f8d8a85817b736d675f574e463d332a1f150b0100000000101d2a3743505d6a7683909da7a09d98928d88837d79736e6963605b53524c47433c38342f2a261f1c17110d080200000000000000000000000000000000000713202d3a4653606d7985929eacb2a89c8f82756a5f53493f332721180f0802000000000000000000000003091119232935404b55606c7884919daab3a99d908477695f53463a2d1c110600000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d60534746464646464646464646464646464646464646464646464646464646463b3a36302921170d02000000000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c1003000000000000000000000000000000000006121f2b37434e585f626a69686767666564636261605c6a7784919d9c8f8275695c60616263646566676869696a615e564c41362a1d1105000006111b262f383f44464e5050505050504947433c34292c30363a3b3e41434445464646454443413e3b3a36312c29241e18130c0400000000000000000000000000000000000000000000000000000000000000060f17222d38424c56606a717e8b939da7a59f92877d70695e544a40342822180d040000000000000000000000000000000000000000131f2c3946525f6c7985929facada093877a6d605c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929faca295887b6f6255483c2f2228313a46525e69727f8b959faba3999082776c60564c56626f7c8995a2ac9f9386796c605346392d20130013202c3946535f6c7986929facada093867a6d6053473f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3a39352f281f160c0100000000000000000000000614202d3946525e687783909daa9f9285796d6053463a2d20130800000000000000000000000916222f3c4955626f7c8895a2afa4988b7e7165584b3e3225180b000000010e1b2734414e5a6774818d9aa7b1a4978a7e7164574b3e3124180b000815222e3b4855616e7b889aa4afa99d9083766a544b4034281c10040000010e1b2734414e5a6774818d9aa7afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c8073666c727f8b919ca4a19791857b6e695f574d453b322920170e050000000000000000000000000000000000000008131e28313c464e5860696e7980868d9196999c9d9fa3aaaba9a19e9c9a97928d8680796e6960584e453b31271d120700000000101d2a3743505d6a7683909d9b95908b85807b76716d66615e5753504945413a37322c29231d1a140f0b06000000000000000000000000000000000000000006121f2c3844505c6673808d9aa4afaa9e94887c6f655b50443d332a2219140e09060400000100000406090e141a232b353d45515d67717e8a95a0acada2978b7e7265574d42362a1e0a0000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d6053473a393939393939393939393939393939393939393939393939393939392e2d2a251f170f0500000000000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c100300000000000000000000000000000000000814212e3a47535f6a6e77767574737271706f6e6d6d66667885929e9d9083766b666d6e6f7070717273747576776d685e5246392d20130700000b17222d38414950535a5c5c5c5c5c5c55544e463c35393b4246474b4d4f515253535252514f4d4b4846423b39353029241d160d070000000000000000000000000000000000000000000000000000000000000006111c262f3a444e58626c74818e959fa9a39991857b6e665c51443e342a20160b0200000000000000000000000000000000000000131f2c3946525f6c7985929facada093877a6d696969696969696969696969696969696969696969696969696969696d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929faca295887b6f6255483c2f242f3a43505a616e7b86929fa7a89f92867c6e655b504956626f7c8995a2ac9f9386796c605346392d20130013202c3946535f6c7986929facada093867a6d60534c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4745413a31281d1307000000000000000000000005111e2a36414c566773808d9aaaa298897c6f6356493c2f24190d01000000000000000000000916222f3c4955626f7c8895a2afa4988b7e7165584b3e3225180b000000010e1a2734414d5a6774808d9aa7b1a4978b7e7164584b3e3125180b000714202d3a4753606d7a86939facab9e918478665c5145382c1f1306000004111d2935404b556976828f9ca9afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c807366626d727f8c929ca4a19791847b6e695e574d443b322920160e040000000000000000000000000000000000010d19242f3a434e58606a6f7b838c92989ea1a9a8aaa39f9e9e9fa3aaa8a9a29f98928d837b6f6a60574d43392f24180c03000000101d2a3743505d6a768390928e89837e79746e6a64605c54524d46443f38352f2b261f1c18120e09030000000000000000000000000000000000000000000003101c28343f4a54616e7b87939fabb0a69c9083776c60584e453c342a251e1a1312100c070e070c1013131a1f262a353d47505a606d7984919ea7b1a99f9285796d6053473b31261a0e0000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d6053473a2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d21201e1a140d050000000000000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c100300000000000000000000000000000000000815222f3b4855626e7c83838281807f7e7d7c7b7a7978777887939f9e9184787778797a7b7c7d7e7f80818283847a6d6154473a2e21140700030f1b27333f49535b6067696969696969625f584e454045474d5254585a5c5e5f5f605f5f5e5c5a5754534d4745413a352f281f191109010000000000000000000000000000000000000000000000000000000000000a141d28323c46505a606d79839097a1aba1979083786d605a50463c32281d140a00000000000000000000000000000000000000131f2c3946525f6c7985929facada093877a767676767676767676767676767676767676767676767676767676767676788693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929faca295887b6f6255483c2f2935414c55616c75828f98a2aca0968c80736a5f53494956626f7c8995a2ac9f9386796c605346392d20130013202c3946535f6c7986929facada093867a6d605959595959595959595959595959595959595959595959595959595959595954514b433a2f24180d0100000000000000000000010d1925303d495663707d8998a2aa998c807366564c4135291d1104000000000000000000000916222f3c4955626f7c8895a2afa4988b7e7165584b3e3225180b000000010e1b2734414e5a6774818d9aa7b1a4978a7e7164574b3e3124180b0006131f2c3845515c677885919eabac9f9286796d6053463a2d20130600000613202c3945515d677784919eaaafa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c8073665b636d73808d929da5a19691847b6e695e564d443a322820160d040000000000000000000000000000000004111d2935414c555f6a6f7c8590959fa2aaa69f9c98989291919298979c9fa4aaa39f9590857c6f695f554b4035291f1509000000101d2a3743505d6a76838c86817c77716d67625f5853504a46423b37332d29241e1b15100c0701000000000000000000000000000000000000000000000000000c17232e3846535f6975828e99a3afab9f948b7f726a60574e463e36302a25201f1c181b1a1b181c1f20262b31363f474f59616c74808d96a1adada2978d8073675d5145392a1f14090000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d6053473a2d2020202020202020202020202020202020202020202020202020201514120e0902000000000000000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c100300000000000000000000000000000000000916222f3c4955626f7c88908f8e8d8c8b8a898887868584839099a49f9287838485868788898a8b8c8d8e8f90877a6e6154473b2e2114080005121f2b3744505b656c747676767676766f6a5f574d4b5153575e616467696a6c6c6c6c6b6a696764615e5754524c45403a312b231b130a010000000000000000000000000000000000000000000000000000000000020b16202b343f45515c676e7b859299a3a99f958d80746c61584e443a2f261b1106000000000000000000000000000000000000131f2c3946525f6c7985929facb6a99c8f82828282828282828282828282828282828282828282828282828282828282828f9ca9b5ac9f9386796c605346392d201300131f2c3946525f6c7985929faca295887b6f6255483c2f303845515d67707d8a939eaaa49a9184796d60584e414956626f7c8995a2ac9f9386796c605346392d20130013202c3946535f6c7986929facada093867a6d6666666666666666666666666666666666666666666666666666666666666666605d554b4135291d110400000000000000000000000813202d3a4653606d7985929fa99d908376685d5245392c201307000000000000000000000916222f3c4955626f7c8895a2afa5988b7f7265584c3f3225190c000000010e1b2834414e5b6774818e9aa7b0a4978a7d7164574a3e3124170b0004101c2934404b55697683909ca9afa399887b6f6255483c2d22170b00010714202d3a4753606d7a86939facafa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c807366595b636e74808d939da5a19691847b6e685e564c443a32281f160d040000000000000000000000000000030e18222c3945515d676e7c859297a0a7a8a09e94908b8886858586878a8f93999fa7a7a09792857b6e675d51453c31261a0e0000000f1b2835424e5b6875817f7a756f6b65605d55534e46443f3836302b27221b19130f0a040000000000000000000000000000000000000000000000000000000006111c2a36424d57626e7b87929fa8b0a69f92877c6f695f585046413b36312d2c282327272723282c2d31373b42465159606b717e8a929da8b1a79f92857a6d61554b4035291d10040000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d6053473a2d201413131313131313131313131313131313131313131313131313080705020000000000000000000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c100704000000000000000000000000000000000916222f3c4955626f7c88959b9a9a99989796959a93929190959faba39992909192989495969798999a9b9c94877a6e6154473b2e211408000613202d394653606c79808283838383837c6f695e56555d6065696e717476777879797978777674716e6966605d56514b433d352d251c130a000000000000000000000000000000000000000000000000000000000000040e19222834404b555e69707d87929fa5a79d928a7e716a5f564c41382d22170f050000000000000000000000000000000000131f2c3946525f6c7985929facb8ab9f948f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f949fabb7ac9f9386796c605346392d201300131f2c3946525f6c7985929faca295887b6f6255483c2e38424e58606d7a84919ea6a99f93887d70675c51463c4956626f7c8995a2ac9f9386796c605346392d20130013202c3946535f6c7986929facada09386797272727272727272727272727272727272727272727272727272727272727272726d675d5145392c201306000000000000000000000006131f2c3845515c6775828f9ca89f92867a6d6054473a2d211409000000000000000000000916222f3c4955626f7c8895a2afa6998c7f7366594c4033261906000000020f1b2835424e5b6875818e9ba8b0a3968a7d7063574a3d3024170a00000c18232f414d5a6774808d9aa7b5ab978b7e716453493f33271b0f0b0e121c28333f4a5463707d899aa4afafa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c80736659525c606c77818e939ea6a09691847a6e685e564c443a31281f160d04000000000000000000000000000a15202b37434e58606d7a849197a2a9a79f969189837e7b797878797b7e828790959ea5a9a1979184796d60574d42372b1d120700000e1b2734404d59656f75726d6863605953514b47433c38342e2a251f1b17110d0801000000000000000000000000000000000000000000000000000000000000000e1a26313b47535f6974808d96a0abaea39991857b6e6a615a524c46423c3a38342e3434342e34383a3c42474d535b626b707d86929fa4aeaaa0958b7f72685e5243392f24180d010000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d6053473a2d20140d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0b0a0805000000000000000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c1614100b0500000000000000000000000000000916222f3c4955626f7c8895a2a7a6a5a4a3a2aca49f9f9e9d9fa7b1aba39f9d9e9fa2aaa2a3a3a4a5a6a7a194877a6e6154473b2e2114080005121f2b3744505b656e7b858f8f8f8f8f857b6e685d60676d72777b7e80828485868685858482807e7b77726d68605d554f473f372e251c1209000000000000000000000000000000000000000000000000000000000000071018232e39434d57606b727f8c939ea8a49f92867c6f685d53493f332721170c0300000000000000000000000000000000131f2c3946525f6c7985929facb8b0a69f9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9fa6b0bbac9f9386796c605346392d201300131f2c3946525f6c7985929faca295887b6f6255483c343f4a54606a74808d96a1ada1978e81746b60554b403c4956626f7c8995a2ac9f9386796c605346392d20130013202c3946535f6c7986929facb2a6998c7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f796d6054473a2d211407000000000000000000000004101c2834404b5565727f8b98a8a3998a7d7064574a3d31261a0e020000000000000000000916222f3c4955626f7c8895a2afa79a8d8074675a4d412e23170c000000030f1c2936424f5c6975828f9ca8afa296897c6f6356493c302316090000071824313e4b5764717e8a97a7b1a79a8e8174655b5044372b211b171a1d242b3844505b6673808d9aacb6afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c807366594d505b656c78818e949ea6a09691837a6d685e564c433a31281f160d030000000000000000000000020f1a26313b4754606a74818e96a0a9a89f9590847d76716e6c656b696e71757c838e939ea6a9a0968d8073695f5347392e23180c00000c1825313d48535d656866615e56544f4745403937312c28231c1a140f0b060000000000000000000000000000000000000000000000000000000000000000000009141f2b37424d57606d79849199a4afaba19791847c706c615e56534d494644404141414141404546494d53575f616d727d869298a2aeaca2989083786c60564c4131281d1207000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d6053473a2d201a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a171714110c0500000000000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336292423201c171008000000000000000000000000000916222f3c4955626f7c88959d9c9b9a98979695949992919095a0aca399929091929994969798999a9b9c9d94877a6e6154473b2e21140800030f1b27333f49535e696f7c8692999c9790837a6d666d72797f83878b8d8f919292939292918f8d8a87837f7a736d676059514940372e241b0f0600000000000000000000000000000000000000000000000000000000000007121d27303b454f59636d75818f95a0aaa29891847a6d655b50443d33291e150b00000000000000000000000000000000131f2c3946525f6c7985929facb8b8b0aba9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9abb0b8b9ac9f9386796c605346392d201300131f2c3946525f6c7985929faca295887b6f6255483c3844505c666f7c87939fa9a69e92857a6d60594f43393c4956626f7c8995a2ac9f9386796c605346392d20130013202c3946535f6c7986929facb9a89c918c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c877b6e6154483b2e2115080000000000000000000000000c18232e3b4855626e7b8896a1ab9a8d817467574d42372b1e12050000000000000000000916222f3c4955626f7c8895a2afa89b8f827568544a3f34281c1003000004101d2935404b556a7683909da9b4aa95887b6e6255483b2f22150800000814212e3b4754616e7b8795a0acab9e9184786c6053463e332b2722252a2f35404a54606c7884919eabb8afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c807366594d49535b666d78828f949fa6a09590837a6d685d564c433a31281f150c030000000000000000000006121f2b37434e58626f7c89939da8aca09690837a706b6561605b575e61646a6f78818e949faaa89f92867b6e62554b4034281c1004000814202c37414b53595b5954524c48433d39352f2b261f1c17110e0903000000000000000000000000000000000000000000000000000000000000000000000000030e1a26313c45515d676f7d87939fa4aea9a19691867e756e68615e575653514a4e4e4d4e4e4b515356575f62696e767f879298a2aaafa49a92867c6f665b50443a301f160c01000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d6053473a2d27272727272727272727272727272727272727272727272727272727272423211c171008000000000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f433633302f2c28211a11080000000000000000000000000916222f3c4955626f7c8891908f8e8d8c8b8a898887868583909daa9f92878385868788898a8b8c8d8e8f9091877a6e6154473b2e21140800000b17222d38414d57606a707e87939fa0958f82786e787f858b9095979a9c9d9f9f9f9f9e9d9c9a9795908c868079706b625b514940362c21180e030000000000000000000000000000000000000000000000000000000000000b151e29333d47515b606d79839198a2aaa0968f82776c60594f453b30271d1207000000000000000000000000000000131f2c3946525f6c7985929facb8b0a8a2a09f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9fa0a1a6aeb8ac9f9386796c605346392d201300131f2c3946525f6c7985929faca295887b6f6255483c424d57606d78839099a4aa9e948a7e71685d52473d303c4956626f7c8995a2ac9f9386796c605346392d20130013202c3946535f6c7986929facb9ada39c999999999999999999999999999999999999999999999999999999999999999994877b6e6154483b2e2115080000000000000000000000000714212e3a47535f6a7884919eaa9e918477695f53463a2d2114060000000000000000000916222f3c4955626f7c8895a2afaa9d908377665c5044382c1f1206000006131f2c3845515d677885919eabaea298877a6d6154473a2e21140700000714202d3a46525e697784909dabada197897d70635a50453d37332d3136394045515c66717d8a96a1adb9afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c807366594d414a545c666d79828f949fa7a09590837a6d685d554b433931271e150c030000000000000000000814212e3a47535f6a76828f9ca5afa49a91847a6d6860595553504d5254585f666d78828f98a3aea3998d8074675c5145382c1f130600040f1a252f3941484d4e4c4746413a38322c29241d1a15100c060000000000000000000000000000000000000000000000000000000000000000000000000000000009151f2935404b55606b727f8b929da4ada9a198928a817a746e696562605c545b5a5a5a5b545c606266696e747b828b9299a2aaaea39f93887e706a5f544a3f32291e0d0400000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d6053473a34343434343434343434343434343434343434343434343434343434343431302d28221a12080000000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f433e3f3d3c38332c231a110800000000000000000000000915222f3c4855626f7c8584838281807f7e7d7c7b7a79787a8794a19f92867978797a7b7c7d7e7f8081828384867a6e6154473b2e211408000006111b262f3b454e58616c727f8b929d9f948e817b838c92979d9fa7a8a09e9c9b9a9b9c9d9fa4a7a09d98928d847d726d635b51483e332a201509000000000000000000000000000000000000000000000000000000000000030c17212b353f45515d676e7c86929fa4a89e948c7f736b60574d43392e231810070000000000000000000000000000131f2c3946525f6c7985929facb8a89e969393939393939393939393939393939393939393939393939393939393939393959ca6b1ac9f9386796c605346392d201300131f2c3946525f6c7985929faca295887b6f6255483c46535f69727f8c95a0aba2988f82766c61564c41352f3c4956626f7c8995a2ac9f9386796c605346392d20130013202c3946535f6c7986929facb9b5ada8a6a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a194877b6e6154483b2e21150800000000000000000000000006121f2b37434e586774818e9aaba096887b6e6155483b2e23170c0000000000000000000916222f3c4955626f7c8895a2afac9f9286796d6053463a2d20130900000714202d3a4753606d7a86939facab9f928578685e5246392d201307000005111e2a36424d5666737f8c99a3afa99c8f82766c61574f46443f414142464b515a606d7883919da8b0b8afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c807366594d40424a545c676d79829095a0a7a09590837a6d675d554b433930271e150c0300000000000000000815222f3b4855626e7b88949fabac9f93877d6f685d564f4846444246484e545c666e7b86929facab9f9285796d6053463a2d201307000009131d272f373d40423f3a3936302c27201d18120f0903000000000000000000000000000000000000000000000000000000000000000000000000000000000000030d18242f3a434f59626d74808d929ca3adaaa29f938e86807b76726f6d6669686767676869666d6f72777b81868f949fa3ababa39f918c7f726c61584e42382d20170d0000000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d605347404040404040404040404040404040404040404040404040404040404040403e3c39332c241a100500000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f464a4c4a48443e352c231a1108000000000000000000000815212e3b47535f6a6f7877767574737271706f6e6d676e7b8894a1a39886796c6c6d6e6f7071727374757677796e685e5246392d2014070000000a141d29333c464f59626d74808d939e9d938e8690959ea2a8a19e9896918f8e8d8e8f91939a9d9fa7a29f9691877f736d635a50453c31261a0e05000000000000000000000000000000000000000000000000000000000000050f19232935414b555f6a717e8a929da6a69f93877d70695e554b40342822190e0400000000000000000000000000131f2c3946525f6c7985929facb8a2968c87868686868686868686868686868686868686868686868686868686868686868a95a1adac9f9386796c605346392d201300131f2c3946525f6c7985929faca295887b6f62554844505a616e7b86929fa7a79f92867b6e615a50443a302f3c4956626f7c8995a2ac9f9386796c605346392d20130013202c3946535f6c7986929facb9afa7a2a09f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f94877b6e6154483b2e211508000000000000000000000000020f1a26313e4a5764717d8a99a4a8988b7e7265544a3f34281c100300000000000000000916222f3c4955626f7c8895a2afaea398887c6f6255493c31251a0d06030615222f3c4855626f7c889aa4afaa9d9083776a564c4135291d11050000020e1925303b4854616e7b87929fabab9f948a7d706a60595350494e4e4d53555d606c73808c959c9ea6b0afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c807366594d4038424b555d676d7a839095a0a79f959082796d675d554b433930271e150c0200000000000006121f2b37434e586774808d9aa6b0a89b8e82756b60564c443d3937363a3c424a545f6975818e9baba7a2978a7d7064574a3d3124170a0000020b151d252c313435332e2d2a251e1b16100d070100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007131d28313d47515b606c77808c919ea1a9aea59e98928d87837f7c79777674747474747677797c7f83888e92999fa6aea8a199928b7f736d635a50463c2f261c0e050000000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d60534d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4a49453e362c22170c00000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f51575957554f473e352c231a110800000000000000000006121f2b37434e585f626c6b6a696867656463626160626f7b8895a2aa93867a6d606061636465666768696a6b6c615e564c41362a1e1105000000020b17212b343e47515b606c78818f959f9d999299a0a7a49f96918b8884828181818284878b90959ea2a8a199928c7f736c61574e42372b22170b00000000000000000000000000000000000000000000000000000000000000071118242f3a434e58616c73808d949fa8a49992857b6e675c51453f342b20160b02000000000000000000000000131f2c3946525f6c7985929facada093877a797979797979797979797979797979797979797979797979797979797979788693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929faca295887b6f6255484c56616c76828f98a2aba0958c7f72695e53483e32282f3c4956626f7c8995a2ac9f9386796c605346392d20130013202c3946535f6c7986929facb9a79d95939393939393939393939393939393939393939393939393939393939393939393877b6e6154483b2e211508000000000000000000000000000a14212e3a4754616d7a86939fa89b8f8275665c5044382c1f120600000000000000000916222f3c4955626f7c8895a2afb4aa988b7f7265574d42362a1f161210121c2834404a5465717e8b98acb6a79b8e8174685b4e413025190d010000000914202d3a46525e6975818e99a3afa69e92857c6f6b62605b535a5b575e61676d737e8893948f949eaaafa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c807366594d403039434b555d686d7a839096a0a79f959082796d675d554b423930261e140b0200000000000815212e3b47535f6a7884919eabaca096897c6f62594f443a322d2b2a2d3038424d5763707d89999b9a99988d8073665a4d4033271a0d000000030b131a202527282621201d19130f0a04010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010c161f2b353f44505b656c747f8a92979ea6acaaa29f9a93908c898684828181808181828486898c90959a9fa3ababa49f9691877e736d635b51473e342a1d140a000000000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d605a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a575550483e33281c1105000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c515b63666361594f473e352c231a11080000000000000000030f1b26323c464e53555f5e5d5c5b5a595857565556626f7c8995a2a194877a6e615455565758595a5b5c5d5e5f54524c443b3025190d0100000000050f19222c353f44505b666d79839096a1a39fa3aba49a938c847f7b777675747475777a7e838a9297a1a8a39f918a7e716a5f53473e33281c10040000000000000000000000000000000000000000000000000000000000000007131d28313c46505a606d78828f96a1aba1979083796d605a50463c32281d140a000000000000000000000000131f2c3946525f6c7985929facada093877a6d6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929faca295887b6f625548525d68717e8a949faaa4999083786d60574d42362c232f3c4956626f7c8995a2ac9f9386796c605346392d20130013202c3946535f6c7986929facb9a2958b868686868686868686868686868686868686868686868686868686868686868686867b6e6154483b2e211508000000000000000000000000000713202d3946525d687683909da99f9285796d6053463a2d20130800000000000000000916222f3c4955626f7c8895a2afb6a99c8f8376695e53463c3128201f1c1f232c3844515c6675818e9ba8b3a9988b7f7265584c3f322519080000000005121e2a36424d57626e7c87929fa7ada19791857d746f6c6568676869696e7279808893958f828f9ca8afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c807366594d40333039434c565e686e7a849196a1a79f948f82796d675c544b423830261d140a00000000000915222f3c4855626f7c8896a1adaa9e9184776a6054473d3228201f1e2026303c4753606d79868f8e8d8c8b8b8276695c504336291d100000000002090f14181b1b191413110d0802000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040d192327333f49535b606d737d858f949da0a7acaca49f9c989892918f8e8d8d8d8e8f919298999d9fa7acaca69f99938d847d716c635b51493f352c22180b02000000000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d6767676767676767676767676767676767676767676767676767676767676767676764615a5045392d211408000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c5b636d72706b61594f473e352c231a110800000000000000000a15202a343c4347485251504f4e4d4c4b4a49495663707c8996a3a194887b6e615548494a4b4c4d4e4f5051524746413b32291e140800000000000007101a2328333f4a545d676e7a84919eabacafa49a93888079726e696968676869686d71767e859196a1aaa39f92867c6e625a5044392d20150a00000000000000000000000000000000000000000000000000000000000000010c161f2a333e44505c666d7a849199a3a99f958e81746c62584e443a2f261c11060000000000000000000000131f2c3946525f6c7985929facada093877a6d606060606060606060606060606060606060606060606060606060606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929faca295887b6f62554f59606d7a85929ea6a89f93877c6f665c50453b3124232f3c4956626f7c8995a2ac9f9386796c605346392d20130013202c3946535f6c7986929facada093867979797979797979797979797979797979797979797979797979797979797979797976695e52463a2d2014070000000000000000000000000005111d2935414c566673808c99aaa298897c6f6356493c2f24190d01000000000000000916222f3c4955626f7c8895a2afb9ac9f93877b6e61584e433a312d2c282b2e343f4953606d7985929eabada197887c6f6255493c2f22160900000000020e1a25303b47535f6a73808d95a0a8a9a1979188817c797674747476787b7f848d939890837e8a97a3afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c807366594d403328313a434c565e686e7b849197a1a69f948f82796d665c544a42382f261c1106000000000c1925323f4c5865727f8b98a8b2a79a8d807467584e43352b20161212151f2c3845515c677481828180807f7e7d7063564a3d3023170a00000000000004080c0e0f0c07070501000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000071017222d384149505b636b707b828990959c9fa4acaca9aaa39f9d9c9b9a9a9a9b9c9d9fa3aaaaababa39f9b948f878079706b625a514940372e231a100600000000000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada09386797373737373737373737373737373737373737373737373737373737373737373737373716c6155493c3023170a000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f82766958636d727f7d706b61594f473e352c231a110800000000000000040e18222a32373b3c4544434241403f3e3d3d4a5763707d8a96a3a295887b6f6255483c3d3e3f4041424344463b3936302920170d0200000000000000081117222d38424b555e6873808c99a6b3ac9f93887e736d67615f575b5a5b565e61656c717b849198a2aea2988f82766c6155493c32271b0f0300000000000000000000000000000000000000000000000000000000000000040d182128343f4a545e686f7c87929fa5a79d938b7e716a60564c42382d22170f0600000000000000000000131f2c3946525f6c7985929facada093877a6d605453535353535353535353535353535353535353535353535353606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929faca295887b6f625554606b74818e97a1ada1968d80746a60544a3f33291f232f3c4956626f7c8995a2ac9f9386796c605346392d20130013202c3946535f6c7986929facada093867a6d6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c5e574d42362a1e120500000000000000000000000000010d1924303c4956636f7c8998a2aa998c807366564c4135291d1104000000000000000916222f3c4955626f7c8895a2afbbafa4998d80746a5f554c433d3a383438393f44505b65717d8a97a2adab9e9285786c605346392d201306000000000009141f2b37434e58606d79839096a0a8a9a19a938e8985828181818284878c91969992867c7d8a97a4afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c807366594d40332628313a444c565e696e7b859197a1a69f948f82786d665c544a42382d22170b000000030f1b27333f49536875818e9ba8b4aa978a7d7064574a3d3224190d0505101c2934404b55646f74757474737271706b6054483c2f221609000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006111b262f383f44515961696e757d83898f939a9c9fa2aaa7a8aaa9a7a7a7a7a7a9a9a8a6a9a29e9b99928e88827c746d676059504840372e251c11080000000000000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facb3a79a8d8080808080808080808080808080808080808080808080808080808080808080808080807e7164574a3e3124170b000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695f6a727f8c867d706b61594f473e352c231a11080000000000000006101820262b2e2f3938373635343231313e4a5764717d8a97a4a295897c6f6256493c3132333435363738392e2d2a251e170e0500000000000000000006111c28343f4a54606d7a85929eabb7aa9d91847a6d665d55534d4e4e4e4c52545a61696f7c86929fa8aa9f948a7d7064584e43372b1f13060000000000000000000000000000000000000000000000000000000000000000060f17232e38424c56606a727f8b939da7a59f92867c6f685e544a3f332821180d03000000000000000000131f2c3946525f6c7985929facada093877a6d605447464646464646464646464646464646464646464646464653606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929faca295887b6f62555c666f7d88939fa9a59e9184796d60584e42382e2117232f3c4956626f7c8995a2ac9f9386796c605346392d20130013202c3946535f6c7986929facada093867a6d60606060606060606060606060606060606060606060606060606060606060605f524d453b30251a0e0200000000000000000000000000000813202d3a4653606d7985929fa99d908376685d5245392c201307000000000000000916222f3c4955626f7c8895a2afb4aba39f92877c6e675d554f4846443f44464a5059606c7883909da9b1a79a8e8174655b5044372b1f12050000000000030f1a26313c45515c676e7b8491969fa4aca49f9b97928f8e8d8e8f9196999e9892877e717e8a97a4afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c807366594d4033261f28323b444d575f696f7c859298a2a69e948f81786d665c544a3f33281c0f03000005121f2b3744505b657784909daaaea298877b6e6154483b2e21150800000c18232f3943535d64686968676665646360594f44382c2014070000000000000000000000000000000000000000000406071013131313131310100d0a050000000003060809121313131313130d0c0a0702000000000000000000000000000000000a141d262d3340474f575e616b70777d82878b8f9298989a9b9d9e9e9f9f9f9e9d9d9b999797928e8a86817c766f6a605d554f473e362e251c130a000000000000000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facb9a99d928d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8174675b4e4134281b0e010000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f827669626e7b869292877d706b61594f473e352c231a110800000000000000060e151b1f21222c2b2a2928272625323e4b5865717e8b98a4a396897c706356493d3025262728292a2b2c21201e19140d050000000000000000000006121f2b3844505c66727f8c97a1adb8aca0968f81786c605b514842414141464750575f6a727f8c96a1ada69d9083766a6054473b2e22150900000000000000000000000000000000000000000101010101010101010101010006111c26303a444e58626d74818e95a0a9a39891847a6d665b50443e332a1f150b010000000000000000131f2c3946525f6c7985929facada093877a6d6054473a39393939393939393939393939393939393939393a4653606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929faca295887b6f6257606d7984919aa4a99e938a7d70675d51463c30261c16232f3c4956626f7c8995a2ac9f9386796c605346392d20130013202c3946535f6c7986929facada093867a6d60535353535353535353535353535353535353535353535353535353535353534846423b33291f140900000000000000000000000000000006121f2c3844505c6675828f9ba89f92867a6d6054473a2d211409000000000000000916222f3c4955626f7c8895a2afaea39992999083796d6760595553504a5053545c606b727f8b959fabaca095897c6f6353493f33271b0f030000000000000a15202934404b555e696e7b848e939a9fa3aba9a19e9c9b9a9b9c9e9f9d9590867e70717e8b97a4afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c807366594d403326162029323b454d575f6a6f7c869298939393938e81786d665b5044382b1f120600000613202d394653606c7985929facab9f928578695e52463a2d201407000007121d2731414b53595b5c5b5a59585856544f473d33271c100400000000000000000000000000000000000001070c1013141d2020202020201d1c1a16110a03040a0f1215151f2020202020201a1916130d07000000000000000000000000000000020b141b2227353e454d525960636b70757b7e8285888b8d8f9091929292929191908e8c8a8885817e7a746f6a626058514b433d352d241c130a01000000000000000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000060606060e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facb9aea49d9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a8e8174675b4e4134281b0e010000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695f6a707e869292877d706b61594f473e352c231a0e0400000000000000040a0f1215151f1e1d1c1b1a1925323f4c5865727f8b98a5a3968a7d7063574a3d3024191a1b1c1d1e1f1414110d080200000000000000000000000713202d3a4653606d7985919ea9b3b2aca89e938d80746d625a50463d3336393e454e58606d7984919eabab9f95887c6f6255493c31251a0e02000000000000000000000000000000010507070d0d0d0d0d0d0d0d0d0d0d0d0d0d0a141e29323d46515b606d79839097a1aaa1968f82786c60594f453c31271d12070000000000000000131f2c3946525f6c7985929facada093877a6d6054473a2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d3a4653606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929faca195887b6e625f69737f8c95a0aca2978e81756b61554b40342b1e1516232f3c4956626f7c8995a2ac9f9386796c605346392d20130013202c3946535f6c7986929facada093867a6d60534746464646464646464646464646464646464646464646464646464646463b3a36302921170d0200000000000000000000000000000003101c28343f4a5465727e8b98a8a3998a7d7064574a3d31261a0e020000000000000916222f3c4955626f7c8895a2afac9f928692958f827a706b6562605c545b6062666d727d86929fa7b0a69d9083776b605441382d22170b00000000000000030c18232f39434d575e696e7981878f92999b9d9e9f9f9f9e9d9b9895908a837c706c717e8b97a4afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c807366594d4033261a172029333c454e58606a6f7d868686868686868681796c605346392d20130600000714212e3a4754616d7a8798a2aeaa9d9084776a574d42362a1e12050000010b151f2f3941484c4e4f4e4d4d4c4b4a48443d352b21160b000000000000000000000000000000000000030b12181d1f202a2d2d2d2d2d2d2a2926221c150d0e151b1f21222c2d2d2d2d2d2d2625231e19120a010000000000000000000000000000020a1117232c333b42464f54596063696e7276797c7e808283848585868585848382807d7b7975716d68625f58544e45403a312b231b120a0100000000000000000000000b1825313e4b5864717e8b97a4aca89b8e8175685b4e4235281b0f0200000000000306060c13131313131b2734414e5a6774818d9aa7aca4978b7e7164584b3e3125180b0013202c3946535f6c7986929facacacaea9a7a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a69a8e8174675b4e4134281b0e010000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f82766958616c707d869292877d706b61594f473e352c20160c020000000000000000030608091211100f0e0d1926333f4c5966727f8c99a5a4978a7d7164574a3e3124170d0e0f1011130807050100000000000000000000000000091623303c4956636f7c8997a1adb2a8a19ea19d928b7f726c61584e453c322d333c44515c66727f8c99a7b1a79a8d807367574d42362a1e12050000000000000000000000000002080d1113141a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a17202b343f45515c676e7b859299a4a89f948d80736c61574d43392f2418100700000000000000131f2c3946525f6c7985929facada093877a6d6054473a2d2120202020202020202020202020202020202d3a4653606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929faca194887b6e61626e7b86929fa8a69f92857b6e61594f433a2f22190c16232f3c4956626f7c8995a2ac9f9386796c605346392d20130013202c3946535f6c7986929facada093867a6d6053473a393939393939393939393939393939393939393939393939393939392e2d2a251f170f0500000000000000000000000000000000000c17232e3b4855616e7b8896a0ab9a8d817467574d42362a1e12050000000000000916222f3c4955626f7c8895a2afa6998c7f8c94948f847d76726f6d666b666c6e72787f879298a3aea99f948a7e7164594f442f261b1106000000000000000007121d27313b454d575e676d747c82868b8e909192929291908e8b88837e786f6a64717e8b97a4afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c807366594d4033261a0e17212a333c464e58606b6f7979797979797979756c665b5044382b1f120600000815222f3b4855626e7b8895aab4a99c8f8276695c4f4330251a0e02000000030d1d262f363c4041424141403f3e3d3c38332b231a0f050000000000000000000000000000000000030d151d24292c2d363939393939393736322d271f161820262b2e2f3939393939393933322f2a241c130a0000000000000000000000000000000006111a202930363d44484f54565e6165666d6f7174757778787979787877767573716f6d6664605d56534e47433d352f281f191109000000000000000000000000000b1825313e4b5864717e8b979f9f9f9b8e8175685b4e4235281b0f02000000060b0f12131920202020201b2734414e5a6774818d9a9f9f9f978b7e7164584b3e3125180b0013202c3946535f6c7986929f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9a8e8174675b4e4134281b0e010000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276696464646b707d859292867d706b61594f473d32281e130800000000000000000000000006050403020d1a2633404d596673808c99a6a4978b7e7164584b3e3125180b02030405060000000000000000000000000000000005111d2935414c566773808d9aa9b2a8a0969196a19f93877e706a60574d443a312834404a54616e7b8795a0acaa9e918477695e53463a2d211407000000000000000000000000050c13191d2021272727272727272727272727272727272727272934404b555e69707d87939fa6a69f93887d70695f554b40352922190e05000000000000131f2c3946525f6c7985929facada093877a6d6054473a2d2114131313131313131313131313131313202d3a4653606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929faca194877a6e616c76828f98a3ab9f948b7e72685e52473e31281d100916232f3c4956626f7c8995a2ac9f9386796c605346392d20130013202c3946535f6c7986929facada093867a6d6053473a2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d21201e1a140d050000000000000000000000000000000000000614212d3a46535f697784919eaa9e918477695f53463a2d2114060000000000000916222f3c4955626f7c8895a2afa396897d828f97969189837f7b79787778797b7f848b9299a3aaaaa2978f82766c6155473d321d140a000000000000000000010b151f29333b454d555d606a6f757a7e8183858586858583817f7b77716d665f64717e8b97a4afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c807366594d4033261a0d0f18212a343c464f5960636c6c6c6c6c6c6c6c68605b544a3f33281c0f030000091623303c4956636f7c8996a2afa89b8e8275685b4f4235281c0900000000000b141d252b303335363534333231302f2c27211a11080000000000000000000000000000000000020c151f272f35383a4346464646464643423e3831281f222a31373a3c45464646464646403f3b352e251c120700000000000000000000000000000000080e171f252a33383d44484d5254545c60626567686a6b6b6c6c6c6b6a6a68666462605c5454524c47433c383229241d160d0700000000000000000000000000000b1825313e4b5864717e8b93939393938e8175685b4e4235281b0f0200020a11171c1f20262c2d2d2d2c202734414e5a6774818d93939393938b7e7164584b3e3125180b0013202c3946535f6c79869293939393939393939393939393939393939393939393939393939393939393939393939393939393938e8174675b4e4134281b0e010000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276717171717171717c859292867d706b61594f443a3024190d01000000000000000000000000000000010d1a2734404d5a6773808d9aa6a5988b7e7265584b3f3225180c0000000000000000000000000000000000000000000713202d3946525d687784919daaaca09691849197a19992867c6f695f564c43392f2e3946535e697784919daaaca096877b6e6154483b2e2115080000000000000000000000050e171e252a2d2e34343434343434343434343434343434343434342f39434d57606b737f8c939ea8a49a92857b6e675d51453f342b20170c030000000000131f2c3946525f6c7985929facada093877a6d6054473a2d2114070606060606060606060606060713202d3a4653606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929faca094877a6d68717e8b949faaa3999083776c60564d41352c1f160c0916232f3c4956626f7c8995a2ac9f9386796c605346392d20130013202c3946535f6c7986929facada093867a6d6053473a2d2020202020202020202020202020202020202020202020202020201514120e09020000000000000000000000000000000000000005121e2a36424d576774818d9aaba096887b6e6155483b2e23170b0000000000000916222f3c4955626f7c8895a2afa3968a7d7b8592999e95908b888685848486888c91959fa3abaaa29892857b6e615a5045352b210b0200000000000000000000030d172129333b434b51586062686e71747678797978787674726e6964605c5464717e8b97a4afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c807366594d4033261a0d060f18222b343d474f54565f606060606060605b53504a42382d22170b0000000a1723303d4a5663707d8996a3b0a79a8e8174675b4e4134281b0e0100000000020b131a202427282928272625252322201c160f080000000000000000000000000000000000000a141e27313940454750535353535353504e4a433a31212a343c434748525353535353534d4b4740372e24190d0200000000000000000000000000000000050d141a21272c33383b4246474a505355585a5c5d5e5f5f5b60666c6c6c6c6c6a5c544a4745413a37312b272018130c040000000000000000000000000000000b1825313e4b5864717e868686868686868175685b4e4235281b0f00060b141c22282b2d333939393939382b34414e5a677480868686868686867e7164584b3e3125180b0013202c3946535f6c7987868686868686868686868686868686868686868686868686868686868686868686868686868686868686868174675b4e4134281b0e010000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f90837e7d7d7d7d7d7d7d7e7f869392867d706b61564c4135291d1105000000000000000000000000000000010e1b2734414e5a6774818d9aa7a5998c7f7266594c3f3326190c0000000000000000000000000000000000000000000714212e3a4754616d7a8796a0acaa9e91847b859298a29892857b6e685e554b42382d36424d576774818d9aa7b2a8978a7e7164574b3e3124180b00000000000000000000020c1720293036393a4040404040404040404040404040404040404040404040454f59606c77828f96a0aaa2979083796d605b51463d32291e150a0000000000131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000000000000000000000713202d3a4653606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929faca093867a6d6d7a85929ea6a89f92867c6e655b50443b30231a0d040916232f3c4956626f7c8995a2ac9f9386796c605346392d20130013202c3946535f6c7986929facada093867a6d6053473a2d20141313131313131313131313131313131313131313131313131308070502000000000000000000000000000000000000000000020e1a26313d4a5764707d8a99a3a8988b7e7265544a3f34281c100300000000000916222f3c4955626f7c8895a2afa4978a7d717d8792989f9d9899929191919298989da0a8aba79f9892867d70695f53483e3323190f000000000000000000000000050f172129313a40454e54565e6164686a6b6c6c6c6b6a6865615f5753505864717e8b97a4afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c807366594d4033261a0d00061019222b353d43484952535353535353534e46443f382f261c11060000000a1724303d4a5763707d8a96a3b0a79a8d8174675a4e4134271b0e01000000000001090f14181a1b1c1b1a1a1918171614100b0500000000000000000000000000000000000006111c263039434b51535d6060606060605d5b554d433829333c464e53555f6060606060605957524940352a1e1307000000000000000000000000000000000002090e161c21272c30363a3b3f4446494b4d4f5051575f666c72797979797975665c504439352f2b26201b160d0701000000000000000000000000000000000a1724303d4956626c7179797979797979756f65594d4034271b0e090f181d262d3338393f4646464646453834404c58646e7479797979797979716c6256493d3024170a00121f2c3845525e6a757979797979797979797979797979797979797979797979797979797979797979797979797979797979797979746f64594c4033271a0d010000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f95908a8a8a8a8a8a8a8a8a8c93999892867d70685d5246392d201307000000000000000000000000000000020e1b2835414e5b6874818e9b9f9f998c807366594d4033261a0d000000000000000000000000000000000000000000091623303c4956636f7c8996a8b2a89b8e81757c869299a19791847a6d675c544a3f33313e4b5865717e8b98a4b1a6998d8073665a4d4033271a060000000000000000000008131e29323a4146474d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d505b656d7a849198a2a9a0958e81756d62594f443b30261c110600000000131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000000000000000000000713202d3a4653606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929faca39986796d75818e97a2aca0968c80736a5f53493f32291f1108000916232f3c4956626f7c8995a2ac9f9386796c605346392d20130013202c3946535f6c7986929facada093867a6d6053473a2d20140d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0b0a080500000000000000000000000000000000000000000914212d3a4754606d7a86929fa89b8f8275665c5044382b1f120600000000000916222f3c4955626f7c8895a2afa4978a7e71707d8690959d9fa39f9e9e9e9fa3aaa9a8a79f9d9590867d706b60574d42362c22110700000000000000000000000000050f171f282f353d43474c5254585b5d5e5f5f5f5e5d5b5855534d464b5864717e8b97a4afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c807366594d4033261a0d0000071019232b32383b3c4646464646464646423938332d261d140a000000000a1724303d4a5763707d8a96a3b0a79a8d8174675a4e4134271b0e010000000000000003070909131211100f0e0d0a09070400000000000000000000000000000000000000091317232e38424b555d60696c6c6c6c6c6c6a665f554a3e323b454e585f626c6c6c6c6c6c6c66635b52473b2f23160a00000000000000000000000000000000000000050b10161c1f252a2d2e34383a3c3e444d525b62696e787f8686868687796d6053463a2d241e1b150f0a040000000000000000000000000000000000000815212d3945505a62646c6c6c6c6c6c6c68655d53483d3124180d1419212a2f383f44464c535353535352443f3848535c64676c6c6c6c6c6c6c64625a5045392d21150800111d2a36424e59636a6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c67645d53483c3024180b000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f9393939393939393939393979fa4a39892857a6d6154473a2e211407000000000000000000000000000000020f1c2835424f5b6875828e939393938d8073675a4d4034271a0d0100000000000000000000000000000000000000000b1825323e4b5865717e8b98a4b1a6998c7f73707e87939fa0969083796d665b50443f363c4956636f7c8996abb5a89c8f8275695c4f422e23170b000000000000000000010d1925303a444c52545a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a535d686f7c86929fa4a79e938b7f726b60564c42382e23170c00000000131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000000000000000000000713202d3a4653606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929fac9f928679707d89939ea9a59d9184796d60584e41382d20170d00000916232f3c4956626f7c8995a2ac9f9386796c605346392d20130013202c3946535f6c7986929facada093867a6d6053473a2d201a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a171714110c050000000000000000000000000000000000000613202c3945515d677683909ca99f9285796d6053463a2d20130800000000000916222f3c4955626f7c8895a2afa4978a7e716b707c838a9095989b9d9e9f9f9f9e9d9b9895908a837b706b60594f453b31241a10000000000000000000000000000000050d161d242932373b4146474b4e505252535252504e4c4846423e4b5864717e8b97a4afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c807366594d4033261a0d00000007101921272c2f303939393939393939352d2b28221c140b02000000000a1723303d4a5663707d8996a3b0a79a8e8174675b4e4134281b0e010000000000040a0f131516201f1e1d1c1b1a171614100b050000000000000000000000000000000009121b2528343f4a545d676d767979797979797671665b4e423b444d575f6a6f78797979797979736d63574b3f3225190c000000000000000000000000000000000000000000050b1014191e202429323a414650565e616d727b828c929992877e71665c5044382b1f130f0a04000000000000000000000000000000000000000005111d29343e48505658606060606060605b59534b41372c200e171f252a333b424a5053595f6060605f5e504a42414a53585a60606060606060585650483e34291d1105000e1a26313d4751595e5f606060606060606060606060606060606060606060606060606060606060606060606060606060606060605b59534a41362b201408000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828686868686868686868686868b93999992877e70685d5246392d20130700000000000000000000000000000003101c2936434f5c6976828686868686868074675a4e4134271b0e0100000000000000000000000000000000000000010e1a2734414d5a6774808d9aa7b1a4978a7e716c727f8b929d9f958f81786c605b51483e3b4754616e7a8799a4afaa9d9084776a544a3f34281c1003000000000000000005111d2a36414c565e6167676767676767676767676767676767676767676767676767676767676a717e8a929daba59f92877d6f685e544a3f34281c1003000000131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000000000000000000000713202d3a4653606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929fac9f9285797984919ea5a99d93897d70675c51463c2f261b0e0500000916232f3c4956626f7c8995a2ac9f9386796c605346392d20130013202c3946535f6c7986929facada093867a6d6053473a2d27272727272727272727272727272727272727272727272727272727272423211c171008000000000000000000000000000000000004111d2935414c5566737f8c99a9a297897c6f6356493c2f24190d01000000000916222f3c4955626f7c8895a2afa4978b7e71646a6f787e83888b8e909192929291908e8b88837e766e6960594f473d33291f120800000000000000000000000000000000040c131820272b3036393b3e4143454646454543413f3b3a363e4b5864717e8b97a4afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c807366594d4033261a0d00000000070f161b1f22232c2d2d2d2d2d2d2d28201f1c17110a020000000000091623303c4956636f7c8996a2afa79b8e8174685b4e4135281b060000000000070f161b1f22232c2b2a292827262322201c160f08000000000000000000000000000008111b242d373f44505c666d798286868686868683766a5d5043434c565f696f7c85868686868686807366594d4033261a0d00000000000000000000000000000000000000000000000710191f282f353e444c525a61696e767f8690949a93877e716c61544a3f34281c100100000000000000000000000000000000000000000000000c17222d363e45494b535353535353534e4d4841392f251a19202930363f454d545b60666c6c6c6c6c6a5c544a3f41484c4e535353535353534b49453e362d22170c00000915202b353f474e5253535353535359636b6c6c6c6c6b64615a534d53535353535353534d535b60656c6c6c6c6b686157535353534e4c4841382f251a0f03000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e11000f1c2835414e5a6670767979797979797979797979797e869392877e706c61564c4135291d1105000000000000000000000000000000020f1b2835414e5a657076797979797979746e64584c4033261a0d0000000000000000000000000000000000000000020f1c2835424f5b6875828e9ba8afa396897c70636d74808d939e9e938d80746d625a50463d4653606c7986939facab9e928578665c5044382b1f120600000000000000000713202d3946525e686d7373737373737373737373737373737373737373737373737373737373737374808d99a3aea39991847a6e665c5044382c1f1206000000131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000000000000000000000713202d3a4653606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929fab9e918578808d96a0aca1978e81746b60554b40342a1d140a0000000916232f3c4956626f7c8995a2ac9f9386796c605346392d20130013202c3946535f6c7986929facada093867a6d6053473a34343434343434343434343434343434343434343434343434343434343431302d28221a120800000000000000000000000000000000010d19242f3c4956626f7c8997a2a9998c807366564c4135291d1104000000000916222f3c4955626f7c8895a2afa4978b7e71645f666d71777b7e8183858586858583817e7b76716c615f574f473d352b21180d00000000000000000000000000000000000001070d151b1e252a2d2e31353738393939383735322e2d313e4b5864717e8b97a4afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c807366594d4033261a0d0000000000040a0f1315161f202020202020201b13120f0b06000000000000000915222f3c4855626f7b8895aab4a89b8f8275685c4f422d22170b0000000007101921272c2f3039383736353433302f2c27211a110800000000000000000000000007101a232d363f49525c606d78828f94939393938c807366594d434c565e686e7b85919793939992877d706356493d3023160a00000000000000000000000000000000000000000000040f19222b313a41454f565e616c717b828b92989a93887e716c615a5042382e23170b00000000000000000000000000000000000000000000000006111b242d34393d3e4646464646464642403d372f271d1e2529323b424651575f666c72797979797975665c5044383c4041464646464646463e3d39342d241b11060000040f19242d353d42454646464646525e6b757979797978706c615f57514b434646424b51575f656c71787979797873685c5046464641403c362f261d130800000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e11000d1925323d49545e66696c6c6c6c6c6c6c6c6c6c717e879392877e716c615a50443a3024190d01000000000000000000000000000000000d1925313d49545e65696c6c6c6c6c6c67645c52473c3024170b000000000000000000000000000000000000000003101c2936434f5c6976828f9ca9aea295887b6f62606c78818f959f9d928b7f726c61584e4544505b667885929fabac9f9386796d6053463a2d20130700000000000000000714212e3a4754616d7a80808080808080808080808080808080808080808080808080808080808080808086929facaba1969082786d6053463a2d201307000000131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000000000000000000000713202d3a4653606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929faa9d91847b87929fa8a69e92857a6d61594f43392e22180b020000000916232f3c4956626f7c8995a2ac9f9386796c605346392d20130013202c3946535f6c7986929facada093867a6d605347404040404040404040404040404040404040404040404040404040404040403e3c39332c241a1005000000000000000000000000000000000813202d394653606c7985929ea99d908376685d5245392c201306000000000916222f3c4955626f7c8895a2afa4978b7e7164545c6064696e72747678787979787675726e6964615a534d453d352b23190f060000000000000000000000000000000000000000040a0f14191e202125282a2b2c2c2c2b2a28252225313e4b5864717e8b97a4afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c807366594d4033261a0d000000000000000307090913131313131313130f0606030000000000000000000714212e3a4754616d7a8798a2aea99c8f837669544a3f33281c0f030000040f19222b32383b3c464544434241403d3c38332b231a0f0500000000000000000000060f19222c353e48515b636e74818e949ea69e948e81746e63574b4b555d686e7a849197a1a49f93877e716b6054483b2f221609000000000000000000000000000000000000000000000a16212b343d434b515961686d757e858f949f9f93887f716c625a50483e30261c11060000000000000000000000000000000000000000000000000009121b22292d3031393939393939393534312c2518202830353e444d525b62696e787f8686868687796d6053463a2d33343939393939393931302d29221b12090000000008121b242b313638393939394653606c7987868686847d756e69605c554f46454f545c60696e777e8586868685786b5f524539393433302b251d140b0100000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e11000915212c38424c545a5c6060606060605a626c717e879392877e716c615a50483e32281e130800000000000000000000000000000000000915212c38424c545a5c6060606060605a58524a41362b1f1408000000000000000000000000000000000000000003101d2a3643505d697683909ca9aea194877b6e615b666d79839096a09f93877e706a60574d444a546b7884919eabafa49a867a6d6053473a2d20140700000000000000000815222f3b4855626e7b888d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d9299a3aeb2a99f94897d7063564a3d3023170a000000131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000000000000000000000713202d3a4653606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929faa9d9083839099a3aa9f948a7e71685d52473d30271d0f06000000000916232f3c4956626f7c8995a2ac9f9386796c605346392d20130013202c3946535f6c7986929facada093867a6d60534d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4a49453e362c22170c0000000000000000000000000000000006121f2b3844505b6675828e9ba89f92867a6d6054473a2d211409000000000916222f3c4955626f7c8895a2afa4978b7e7164585053575f6165686a6b6c6c6c6b6a6865615f57555046423b332b231a1108000000000000000000000000000000000000000000000002080e111414181b1d1f1f201f1f1d1b191825313e4b5864717e8b97a4afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c807366594d4033261a0d00000000000000000000000606060606060606020000000000000000000000000613202d394653606c7985929facaa9e918477665b5044382b1f120600000a16212b343d434849535251504f4e4d4a48443d352b21160b000000000000000000050f18222b343e47505a626d73808d939da69f948f82786d605c524a545c676d7a839096a0a49c918b7f726c61594f44382c201307000000000000000000000000000000000000000000030f1b27323d464e555d606b707a818a92979f9b918b7f726d625a50483e362c1e140a0000000000000000000000000000000000000000000000000000000911171d2124252d2d2d2d2d2d2d282724201d2429323a414650565e616d727b828c929992877e71665c5044382b27272d2d2d2d2d2d2d2524211d17110900000000000009121920262a2c2c2d2d313e4b5864717e889396918a827b736d67615953525960666d737b828b929792877e7064574a3d312d282724201a130b020000000000000000000000020507080c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e110005101b26303a42494e4f535353534e58626c717e879393877e716c615a50483e362c20160c02000000000000000000000000000000000004101b26303a42494e4f5353535353534e4c4741382f241a0e03000000000000000000000000000000000000000004111d2a3744505d6a7783909daaada194877a6e61545d676d7a849197a19992867c6f695f564c515e6b7784919eaab6a094877a6d6154473a2e21140700000000000000000815222f3b4855626e7b88959a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9fa3abb5bbb0a6968a7d7063574a3d3024170a000000131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000000000000000000000713202d3a4653606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929fac9f928790959faba2988f82766c61564c41352b1e150b00000000000916232f3c4956626f7c8995a2ac9f9386796c605346392d20130013202c3946535f6c7986929facada093867a6d605a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a575550483e33281c1105000000000000000000000000000000030f1c28333f4a5465717e8b98a7a3998a7d7064574a3d31261a0e020000000916222f3c4955626f7c8895a2afa4978b7e7164584b464d5355585b5d5e5f5f5f5e5d5b5855534d49453e36312a211a11080000000000000000000000000000000000000000000000000000020507080b0e101213131212100e0c1825313e4b5864717e8b97a4afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c807366594d4033261a0d000000000000000000000000000000000000000000000000000000000000000005121f2b3744505b657784909daaac9f9285796c605346392d20130600030f1b27323d464f54565f5e5d5c5b5a5956544f473d33271c100400000000000000040e17212a343d464f59616c727f8c929ca5a0959082796d665c5044505c666d79829095a0a59d928c7f736d625a50473d32271b100400000000000000000000000000000000000000000007131f2c38434e5860676d747d858e939fa29b918b7f726d625a50483f362d241a0c0200000000000000000000000000000000000000000000000000000000060c11151718202020202020201b1b191f282f353e444c525a61696e767f8690949a93877e716c61544a3f34281c1b20202020202020181715110c060000000000000000080f151a1d1f202024303d4956626c717f8b919e948f868079706b615f5d606b6f797f868f949f93887e716c6155493c30231b1a18140f08010000000000000000000003090e121415191926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100000a141e2830383d414346464647535f6a717e879393877e716c615a50483e362c231a0e04000000000000000000000000000000000000000a141e2830383d414346464646464641403c362f261d130800000000000000000000000000000000000000000004111e2b3744515e6a7784919daaada094877a6d6154555e686e7b859298a29892857b6e685e554b5e6a7784919daaada194877a6e6154473b2e21140800000000000000000815222f3b4855626e7b8895a1a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a7acaeb5acacaca3968a7d7063574a3d3024170a000000131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000000000000000000000713202d3a4653606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929faca39992999fa7a79f92867b6e615a50443a3023190c0300000000000916232f3c4956626f7c8995a2ac9f9386796c605346392d20130013202c3946535f6c7986929facada093867a6d6767676767676767676767676767676767676767676767676767676767676767676764615a5045392d211408000000000000000000000000000000000b17222d3b4854616e7b8795a0ab9a8d817467574d42362a1e12050000000916222f3c4955626f7c8895a2afa4978b7e7164584b3e4246484b4e505252535252504e4b4847423c39332a261f180f0800000000000000000000000000000000000000000000000000000000000000000204050606060504020b1825313e4b5864717e8b97a4afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c807366594d4033261a0d0000000000000000000000000000000000000000000000000000000000000000030f1b27333f49536875818e9ba8aea398887b6e6255483b2d22170b0407131f2c38434f5960636c6b6a696867666360594f44382c201407000000000000040d162029333c464e58616b717e88939fa4a19690837a6d675d544a525c606d78818f949fa69e938d80746d635b51483e352b21160b000000000000000000000000000000000000000000000915222e3b4854606a6f79818a91979ea39c918c7f726d625b51483f362d241b12080000000000000000000000000000000000000000000000000000000000000005080a0b131313131313130f19222b313a41454f565e616c717b828b92989a93887e716c615a5042382e23170b131313131313130b0a0805000000000000000000000004090e11121315212d3945505a626d727f8b919c98928c847d756e69686d747c838c92989c918b7f726c625a5044392d20140d0b08030000000000000000000000060e141a1e2122252526333f4c5966727f8c99a5aa9d9184776a5e5144372b1e110000020c161e262c32353639393c4855626f7b869393887e716c615a50483e362c241a11080000000000000000000000000000000000000000020c161e262c3135363939393939393433302b241d140b0100000000000000000000000000000000000000000004111e2b3744515e6a7784919daaada194877a6e61544c565f696f7c869299a19791847a6d675c545e6b7784919eaaada094877a6d6154473a2e21140700000000000000000815222f3b4855626e7b88959f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f968a7d7063574a3d3024170a000000131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000000000000000000000713202d3a4653606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929facaba39fa3ababa0958c7f72695f53483e32281e11070000000000000916232f3c4956626f7c8995a2ac9f9386796c605346392d20130013202c3946535f6c7986929facada09386797373737373737373737373737373737373737373737373737373737373737373737373716c6155493c3023170a000000000000000000000000000000000614202d3a46525e697784919daa9e918477695f53463a2d2114060000000916222f3c4955626f7c8895a2afa4978b7e7164584b3e363a3b3f4143454546464543423f3b3a37312d28221a140e060000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c807366594d4033261a0d0000000000000000000000000000000000000000000000000000000000000000000b17222d3f4c5865727f8b98a8b2aa978a7e7164544a3f33281b13101014222f3b4854606b6f79787776757473706b6054483c2f2216090000000000030c161f28323b454e58606a707d87929aa4a19791847b6e685d554b515b636e74818e939ea69e948e81776c605b51493f362c23190f04000000000000000000000000000000000000000000000916232f3c4956626f7c848e9393939393918c7f726d625b51493f362d241b12090000000000000000000000000000000000000000000000000000000000000000000000000606060606000a16212b343d434b515961686d757e858f949f9f93887f716c625a50483e30261c110600060606060606000000000000000000000000000000000001040605111d29343e48505a626d727f8c929c9f96918a827b73717a818891959f9d928c7f736d625a50483e33281c100400000000000000000000000000060f181f262a2d2e323232333f4c5966727f8c99a5aa9d9184776a5e5144372b1e11000000040c141b212528292d2e3a47535f6a73808c887e716c625a50483e362c241a120800000000000000000000000000000000000000000000040c141b212528292d2d2d2d2d2d2726241f1a130b020000000000000000000000000000000000000000000004111d2a3744505d6a7783909daaaea194877b6e6154484d57606a707e87939fa0969082796d665b5e6b7884919eabb4aa93877a6d6054473a2d21140700000000000000000815222f3b4855626e7b88939393939393939393939393939393939393939393939393939393939393939393939393939393938a7d7063574a3d3024170a000000131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000000000000000000000713202d3a4653606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929facb5afacafafa4999083786d60574d42362c20160c000000000000000916232f3c4956626f7c8995a2ac9f9386796c605346392d20130013202c3946535f6c7986929facb3a79a8d8080808080808080808080808080808080808080808080808080808080808080808080807e7164574a3e3124170b0000000000000000000000000000000005121e2a36424d576774808d9aaaa096887b6e6155483b2e23170b0000000916222f3c4955626f7c8895a2afa4978b7e7164584b3e312d2e32353738393939383735322e2d2b261f1c170e0903000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0aca6998c807366594d4033261a0d0000000000000000000000000000000000000000000000000000000000000000000616222f3c4955626f7c8896a1ada79a8e8174665b5044382d241f1c1d1f27303c4956636f7d868584838281807d7063564a3d3023170a00000000020b151e28313a444d575f6a6f7c869299a3a29892857b6e695e564c505a626d73808d939da59f948f82786d655b504940372d241a110700000000000000000000000000000000000000000000010e1b2734414e5a67748186868686868686867f736d635b51493f372d241b1209000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1b27323d464e555d606b707a818a92979f9b918b7f726d625a50483e362c1e140a00000000000000000000000000000000000000000000000000000000000c17222d363f48515b636d737f8c929ca09e948f867f7d848d939aa09d938d80736d635b51483e362c22170b00000000000000000000000000030e18212a31363a3b3f3f3f3f3f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100000000020a1015191c1c1f2b37434e58636d73807e716c625a50483e362c241a1208000000000000000000000000000000000000000000000000020a1015191b1c2020202020201b1a17140e0801000000000000000000000000000000000000000000000003101d2a3643505d697683909ca9aea295887b6f625548454e58616c727f8c929d9f948e81786c605b657885929eabaea29886796d6053463a2d20130700000000000000000815222f3b4855626e7b8686868686868686868686868686868686868686868686868686868686868686868686868686868686867d7063574a3d3024170a000000131f2c3946525f6c7985929facaca093877a6d6054473a2d2114070000000000000000000000000713202d3a4653606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929facb8bbb9b2a89f93877c6f665c50453b31241a0e04000000000000000916232f3c4956626f7c8995a2ac9f9386796c605346392d20130013202c3946535f6c7986929facb9a99d928d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8174675b4e4134281b0e01000000000000000000000000000000020e1a25303d4a5763707d8a98a3a8988b7e7265544a3f34281c100300000916222f3c4955626f7c8895a2afa4978b7e7164584b3e31252225282a2b2c2c2c2b2a282522211e1a15110c050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4aca295887c6f6255493c2f221609000714212d3a4754606d7a87939f9f9f998c807366594d4033261a0d0000000000000000000000000000000000000000000000000000000000000000000815212e3b47535f6a7884919eabab9e9185786c6053493f352f2c28292c2f39424f5966727f8c91908f8e8d8b7e7265584b3f3225180c000000000a141d273039434c565e696e7c859298a2a39992867c6f695f564d4f59626c727f8c929ca5a0959082796d665c53493f372e251b12080000000000000000000000000000000000000000000000010d1a2733404c58646e747979797979797979736d635b51493f372d251b12090000000000000000000000000000000000000000000000000000000000000000000000000000000000000007131f2c38434e5860676d747d858e939fa29b918b7f726d625a50483f362d241a0c02000000000000000000000000000000000000000000000000000000000006101b242d363f49515b636d73808d929da49e98928c8a91969fa49e938e81746e645b51493f362d241a10050000000000000000000000000009141f2a333b4246484c4c4c4c4c4c5966727f8c99a5aa9d9184776a5e5144372b1e1100000000000005090d0f0f1a26313c46525b646e73716d625a50483e362d241a120800000000000000000000000000000000000000000000000000000004090d0f101313131313130e0d0b080300000000000000000000000000000000000000000000000000020f1c2935424f5c6875828f9ba8afa296897c6f6356493d46505a626d74808d939e9e938d80736d606c7986929facab9f928578665c5044382c1f120600000000000000000814212e3a47535f6a76797979797979797979797979797979797979797979797979797979797979797979797979797979797979706b6155483c2f231609000000131f2c3946525f6c7985929f9f9f9f93877a6d6054473a2d2114070000000000000000000000000713202d3a4653606d7986939f9f9f9f9386796c605346392d201300131f2c3946525f6c7985929facacacacada1968d80746a60544a3f33291f120900000000000000000916232f3c4956626f7c8995a2ac9f9386796c605346392d20130013202c3946535f6c7986929facb9aea49d9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a8e8174675b4e4134281b0e01000000000000000000000000000000000914202d3a4753606d7a86929fa89b8f8275665c5044382b1f120600000916222f3c4955626f7c8895a2afa4978b7e7164584b3e312518181b1d1f1f201f1f1d1b181514120e090300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b979f9f9f95887c6f6255493c2f221609000714212d3a4754606d7a8793939393938c807366594d4033261a0d00000000000000000000000000000000000000000000000000000000000000000006131f2b37434e586774808d9aa6ada1978a7d70655b5045413a383435393b424b54606b7783909d9d9c9b95887b6e6155483b2e22150800000006111b262f39424b555e686e7b849197a2a49a92877d706a60574d4f59616c717e88939fa4a19690837a6d675d544a41382d251c1309000000000000000000000000000000000000000000000000000b1824303c48535c64676c6c6c6c6c6c6c6c66635b51493f372d251b130900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000915222e3b4854606a6f79818a91979ea39c918c7f726d625b51483f362d241b12080000000000000000000000000000000000000000000000000000000000000009121b242d373f49525b636e74808d929da5a39f99979ea1a69e948e81786c605c524940372d241b110800000000000000000000000000020e1a26313b454d53555858585858585966727f8c99a5aa9d9184776a5e5144372b1e11000000000000000000000a15202a344049525c646765625a50483f362d241b1209000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978a7e7164574b3e3e48515b606c78818f959f9d928b7f726c6d7a8799a3afaa9e9184776b544a3f34281c1003000000000000000006121e2b37424e575f6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6361594f44382c201407000000131f2c3946525f6c7986929393939393877a6d6054473a2d2114070000000000000000000000000713202d3a4653606d798693939393939386796c605346392d201300131f2c3946525f6c7985929f9f9f9f9fa59e9184796d60584e42382e21170d0000000000000000000916232f3c4956626f7c89959f9f9f9386796c605346392d20130013202c3946535f6c7986929facacacaea9a7a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a69a8e8174675b4e4134281b0e010000000000000000000000000000000006131f2c3945515d6776828f9ca99f9285796d6053463a2d20130800000916222f3c4955626f7c8895a2afa4978b7e7164584b3e3125180c0e101212131312100f0c08080602000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b9393939393887c6f6255493c2f221609000714212d3a4754606d7a86868686868686807366594d4033261a0d000000000000000000000000000000000000000000000000000000000000000000030f1b26323c4855626e7b88949eaca99d9083786c605a524c4645404045474c545c66707d8995a0aaa99d918477695f53463a2d2114070000000b17222d38414a545d676d7a839196a1a49f93887e716b60584e4e58606b707e87929aa4a19791847b6e685d554b42392f261b130a00000000000000000000000000000000000000000000000000000814202b36414a53585a60606060606060605957514940372e251b13090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000916232f3c4956626f7c848e9393939393918c7f726d625b51493f362d241b120900000000000000000000000000000000000000000000000000000000000000000009121b252d374049525c646e74808d939da59f9f9f9fa79f948f82786d665b504a40372e251b1209000000000000000000000000000005121e2a36424d575f616565656565656566727f8c99a5aa9d9184776a5e5144372b1e1100000000000000000000030e18222e37404a52585a585650483f362d241b120900000000000000000000000000000000000000000000000000000000000000000000000000010507071313131313131313080705020000000000000000000000000000000000000c1926333f4c5966727f8c99a5b2a5998c7f7266594c3f363f44505b666d79839096a09f93877e706f7c8995abb5a99c8f8376695c50432e23170c000000000000000000020e1a26313c454e535560606060606060606060606060606060606060606060606060606060606060606060606060606060606057554f473e33281c1004000000131f2c3946525f6c7986868686868686867a6d6054473a2d2114070000000000000000000000000713202d3a4653606d788686868686868686796c605346392d201300131f2c3946525f6c798692939393939393938a7d70675d51463d30261c0f060000000000000000000916232f3c4956626f7c89939393939386796c605346392d20130013202c3946535f6c7986929f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9a8e8174675b4e4134281b0e010000000000000000000000000000000004101d2935404b5566727f8c99a9a297897c6f6356493c2f24190d01000916222f3c4955626f7c8895a2afa4978b7e7164584b3e3125180b0204050606060504020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e868686868686867c6f6255493c2f221609000713202c3945525d687679797979797979736d63574b3f3225190c000000000000000000000000000000000000000000000000000000000000000000000a15212e3a47535f6a76828f9aa4ab9f958c7f726c605d5653514b4b5153565e666d7983909da7ada2978b7f7265574d42372b1e12050000030f1b27333f49535c666d79839095a0a59c928b7f726c61594f4d575f6a6f7d869299a3a29892857b6e695e564c433930271d140a010000000000000000000000000000000000000000000000000000030f1a252f3841484c4e53535353535353534c4b4640372e251c1309010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010e1b2734414e5a67748186868686868686867f736d635b51493f372d241b1209000000000000000000000000000000000000000000000000000000000000000000000009131c252e37404a525c606c77818e93939393939393959082796d665c544a3f382e251c13090000000000000000000000000000000714212d3a46535f696e7272727272727272727f8c99a5aa9d9184776a5e5144372b1e11000000000000000000000006101c252e3840474c4d4b4a453f362d241b120900000000000000000000000000000000000000000000000000000000000000000000000002080d11131420202020202020201514120e0902000000000000000000000000000000000a1724313d4a5764707d8a97a9b2a89b8e817568564c4136333f4a545d676d7a849197a19992867c717e8a97a4b1a79a8e8174675b4e4134281b06000000000000000000000915202a333c4247485353535353535353535353535353535353535353535353535353535353535353535353535353535353534a48443e352c21160b00000000121f2b3844515d6974797979797979797976685d5245392c20130700000000000000000000000006121f2c3844505c66767979797979797979766c5f5346392d201300131f2c3946525f6c7986868686868686868681756c61554b40342b1e150a000000000000000000000916232f3c4956626f7c86868686868686796c605346392d20130013202c3946535f6c79869293939393939393939393939393939393939393939393939393939393939393939393939393939393938e8174675b4e4134281b0e0100000000000000000000000000000000000c18242f3c4955626f7c8897a1a9998c807366564c4135291d1104000916222f3c4955626f7c8895a2afa4978b7e7164584b3e3125180b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1724303d4956626c7179797979797979766a5f53473b2e2115080004111d2935414c565d6c6c6c6c6c6c6c6c66635b52473b2f23160a0000000000000000000000000000000000000000000000000000000000000000000006121f2b37434e58626f7c87939fa8a79f93887e746d6863605c54555d6063686e78818e95a0aca69f9285796d6053473c31261a0e02000005121f2b3744505b656d78828f959fa59d938c80736d625a504c565f696f7c859298a3a39892867c6f695f564d443a31271e150b020000000000000000000000000000000000000000000000000000000008131d262f363c40414646464646464646403e3b352e251c130a01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010d1a2733404c58646e747979797979797979736d635b51493f372d251b1209000000000000000000000000000000000000000000000000000000000000000000000000010a131c252e384044505b656c7881868686868686868683796d675d544a42382d261c130a010000000000000000000000000000000815222e3b4855616e7b7f7f7f7f7f7f7f7f7f818f9ba8aa9d9184776a5e5144372b1e110000000000000000000000000a131c262e363c3f403e3d3a342d241b1209000000000000000000000000000000000000000000000000000000000000000000000000050c13191d20212d2d2d2d2d2d2d2d21201e1a140d050000000000000000000000000000000815222e3b4855616e7b8896a1adaa9d908477685e5246392d38424b555e686e7b859298a29892857b808d9aa6b4aa988b7f7265584c3f3225190c00000000000000000000030e18212a31373a3b4646464646464646464646464646464646464646464646464646464646464646464646464646464646463d3c38332c231a100500000000101c2935414d5862696c6c6c6c6c6c6c6c6c5d564c4135291d110400000000000000000000000003101c28343f4a545c6c6c6c6c6c6c6c6c6c6c645a4f43372b1e1200121f2b3844515d6974797979797979797979756f65594f433a2f22190c03000000000000000000000815222e3b4754606a6f79797979797979766c5f5346392d20130013202c3946535f6c7987868686868686868686868686868686868686868686868686868686868686868686868686868686868686868174675b4e4134281b0e0100000000000000000000000000000000000713202d394653606c7885919ea99c908376685d5245392c201306000916222f3c4955626f7c8895a2afa4978b7e7164584b3e3125180b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000815212d3945505a62646c6c6c6c6c6c6c625f584e43372b1f130600010d19242f3a444c525f606060606060605957524940352a1e130700000000000000000000000000000000000000000000000000000000000000000000020f1a26313c4754606a74818e96a0a9a49a9387807a74706d666a6a676d70747a828e939ea7a89f948b7e72675d5145392a1f140900000815212d3945505a606c77818e949fa69e938e81746e635b5146525e686e7b859197a2a39992867d706a5f574d443b32281f150c030000000000000000000000000000000000000000000000000000000000010b141d252b303334393939393939393933322f2a231c130a0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1824303c48535c64676c6c6c6c6c6c6c6c66635b51493f372d251b13090000000000000000000000000000000000000000000000000000000000000000000000000000010a131c2627333f49535b666c757979797979797979776d675d554b42392f261c140a01000000000000000000000000000000000b1724313e4a5764717d8a8b8b8b8b8b8b8b8b8f939eaaaa9d9184776a5e5144372b1e11000000000000000000000000010b141c242b30333432312e29221b1209000000000000000000000000000000000000000000000000000000000000000000000000050e161e252a2d2e39393939393939392e2d2a251f170f0500000000000000000000000000000714212d3a46535f697884919eabac9f93877a6d6154473c322f39434c565f696f7d86929aa197918483909daaaea298897c6f6356493c302316090000000000000000000000060f1820262b2e2f393939393939393939393939393939393939393939393939393939393939393939393939393939393939302f2c28211a110800000000000d1925303b4650585d5f606060606060605f524c443a2f24190d01000000000000000000000000000c17232e38424a505f60606060606060605f5a52493e33271b0f00101c2935414d5862696c6c6c6c6c6c6c6c6c68655d53473e31281d1007000000000000000000000006131f2b38434e5860626c6c6c6c6c6c6c6c645a4f43372b1e1200121f2c3845525e6a757979797979797979797979797979797979797979797979797979797979797979797979797979797979797979746f64594c4033271a0d01000000000000000000000000000000000005121f2b3744505b6575818e9bac9f92867a6d6054473a2d211407000916222f3c4955626f7c8895a2aca4978b7e7164584b3e3125180b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005111d29343e485056586060606060606055534e463c32261b0f03000008131e28323a414553535353535353534d4b4740372e24190d0200000000000000000000000000000000000000000000000000000000000000000000000a15202b37434e58606d7a849197a2a9a499938d85807d79787777787a7c81868f949ea5a9a1969082776c60554b403529180e0300000a1724303d4956626c74808d939ea69f948f81786d605c52494754616e7a849197a1a49a92877e706b60584e453c322920160d0300000000000000000000000000000000000000000000000000000000000000020b131a202427272d2d2d2d2d2d2d2d2625231e19120a010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000814202b36414a53585a60606060606060605957514940372e251b130900000000000000000000000000000000000000000000000000000000000000000000000000000000010a1417222d38414a545b60686c6c6c6c6c6c6c6c6a605d554c433930271d140a0200000000000000000000000000000000000b1724313e4a5764717d8a97989898989898989b9ea6b0aa9d9184776a5e5144372b1e1100000000000000000000000000020b12191f2326272524211d181109000000000000000000000000000000000000000000000000000000000000000000000000020c1620283036394646464646464646463b3a36302921170d020000000000000000000000000005121e2a36424d576875818e9baaafa49a8b7e7164584e43372b313a444d57606b717e88939fa096919095a0abac9f9285796d6053463a2d201307000000000000000000000000060e151a1e21222d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2423201c16100800000000000008141f2a343e464d5152535353535353535345413a32281e1308000000000000000000000000000006111c2630383f44535353535353535353534f4940372c21160a000d1925303b4650585d5f60606060606060605b59534b42352c1f160c000000000000000000000000030f1b27323d464e5456606060606060605f5a52493e33271b0f00111d2a36424e59636a6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c67645d53483c3024180b000000000000000000000000000000000000030f1b27333f495364717e8a9aa4a3998a7d7064574a3d3124170a000916222f3c4955626f7c88959f9f9f978b7e7164584b3e3125180b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c17222d363e45494b535353535353534947433c342a20150a000000010c1620282f35394646464646464646403f3b352e251c1207000000000000000000000000000000000000000000000000000000000000000000000000030f1b27323c45515d676e7c859297a0a7a49f97928d89868584848586898d92989fa6a79f9791847b6e655b50433a2f2418060000000b1825313e4b5864717e8b929da5a0958f82796d665c504a43505d6a76839096a0a99f93887e716c61594f463c332a20170e0400000000000000000000000000000000000000000000000000000000000000000001080f14181a1b2020202020202020191916120d070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1a252f3841484c4e53535353535353534c4b4640372e251c13090100000000000000000000000000000000000000000000000000000000000000000000000000000000000006111b262f38424a50535b60606060606060605d54514c433a31271e150b020000000000000000000000000000000000000b1724313e4a5764717d8a979f9f9f9f9f9f9f9f9f9f9f9f9d9184776a5e5144372b1e11000000000000000000000000000001080e1317191a181715110c060000000000000000000000000000000000000000000000000000000000000000000000000008131e28323a41465353535353535353534846423b33291f140900000000000000000000000000020e1a26313e4a5764717e8a98a2aeac9c8f82766a5f53473f352f323c454f59616c727f8c929da09d9da0a7b1aa9c8f8275665c5145382c1f13060000000000000000000000000003090e121415202020202020202020202020202020202020202020202020202020202020202020202020202020202020171614100b0500000000000000020d18222c343b414446464646464646464639352f2820160c010000000000000000000000000000000a151e262e343846464646464646464646433e372e251b10050008141f2a343e464d515253535353535353534f4d48423930231a0d04000000000000000000000000000a16202b343d43474953535353535353534f4940372c21160a000e1a26313d4751595e5f606060606060606060606060606060606060606060606060606060606060606060606060606060606060605b59534a41362b201408000000000000000000000000000000000000000b17222d3a4754616d7a87939393938d8174675a4e4134271b0e000916222f3c4955626f7c8893939393938b7e7164584b3e3125180b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006111b242d34393d3e464646464646463c3b37322a22180e0400000000040d161e24292c393939393939393933322f2a241c130a00000000000000000000000000000000000000000000000000000000000000000000000000000a15202935414c555f6a6f7c8590959fa3a9a19e9a96979291909192999a9fa2aaa29f9590857b6e695e53493f31281d13070000000d1a2633404d596673808c99a4aa9d91847a6d675c544a3f45525e6b7885919ea8a5998c7f726c625a50473d342a21180e0500000000000000000000000000000000000000000000000000000000000000000000000003080b0d0e13131313131313130d0c0a06020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008131d262f363c40414646464646464646403e3b352e251c130a0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a141d262f383f44464e5353535353535353504745413a31281f150c03000000000000000000000000000000000000000b1724313e4a5764717e8a93939393939393939393939393939184776a5e5144372b1e110000000000000000000000000000000003070b0d0d0b0b09050100000000000000000000000000000000000000000000000000000000000000000000000000010d1925303a444c525f60606060606060605f524d453b30251a0e02000000000000000000000000000914202d3a4753606d7985929fabab9f94887c6f625b5145403937333d46505a626d74808d939ea7aaabb1aea2988b7e7164544b4034281c1004000000000000000000000000000000020608081313131313131313131313131313131313131313131313131313131313131313131313131313131313130a0907040000000000000000000006101a222a3035383939393939393939392c29241e160d0400000000000000000000000000000000030c151c23282c3939393939393939393937332c251c13090000020d18222c343b414446464646464646464642413d3730271e11080000000000000000000000000000040f19222b32383b3c4646464646464646433e372e251b1005000915202b353f474e5253535353535353535353535353535353535353535353535353535353535353535353535353535353535353534e4c4841382f251a0f03000000000000000000000000000000000000000613202d3946525e687783868686868684776b5e5144382b1e11000916222f3c4955626f7c868686868686867e7164584b3e3125180b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009121b22292d3031393939393939392f2e2b2620181006000000000000040c13191d202d2d2d2d2d2d2d2d2625231e19120a010000000000000000000000000000000000000000000000000000000000000000000000000000040d19242f3a434e58606a6f7b838c92989ea1a9a7a9a29f9d9d9e9fa3aba9a19e98928d837b6e695f574d41382d1f160c010000000d1a2633404d596673808c99a3ac9f92867c6f695f564c4345525e6b7885919ea6a89c8f82786d605c52493f362c2319100700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010b141d252b303334393939393939393933322f2a231c130a01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020b141d262d333839424646464646464646443a39352f281f160d0300000000000000000000000000000000000000000b1724313e4a5764717e8686868686868686868686868686868684776a5e5144372b1e1100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005111d2a36414c565e6c6c6c6c6c6c6c6c6c6c5e574d42362a1e12050000000000000000000000000006131f2c3945515d6774818d99a3afa69c8f82766d625a514b474242414148515b606c78818f959fabb8b4aa9f92857a6d6054473a2e23180c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000810181f25292b2c2d2d2d2d2d2d2d2d201d19130c04000000000000000000000000000000000000030a11171c1f2d2d2d2d2d2d2d2d2d2d2b27211b130a0100000006101a222a3035383939393939393939393534312c251e150c0000000000000000000000000000000007101920272b2e2f393939393939393937332c251c13090000040f19242d353d4245464646464646464646464646464646464646464646464646464646464646464646464646464646464646464641403c362f261d1308000000000000000000000000000000000000000005111e2a36414c5667717779797979797772675c4f43372a1d11000815212e3b47535f6a7679797979797979716c6256493d3024170a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000911171d2124252d2d2d2d2d2d2d22211f1b150e06000000000000000001080d111314202020202020201a1916130d07000000000000000000000000000000000000000000000000000000000000000000000000000000000008131e28313c464e5860696e7980868d9197999c9d9fa3aaaaa9a19e9c9a97928d8680796e695f574d453b2f261b0d04000000000a1623303d495663707d87929aa4a29891857b6e685e554b424e5b6874818e949fa79e948e81746e635b51483e352b22180f060000000000000000000000000000000000000000000000000000000000000000000000000000030607090b0d0f1111121313121211100f0d0a08070502000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020b131a202427272d2d2d2d2d2d2d2d2625231e19120a010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020b141c22282b2d353939393939393939372d2c29241e160d040000000000000000000000000000000000000000000a1723303c4955616c71797979797979797979797979797979797771675b4f43362a1d10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050a0d0f1013130f0e0c09040000000000000713202d3946525e6876797979797979797976695e52463a2d2014070000000000000000000000000004101d2935404b55616e7b87929fa9ab9f948b7f726c605d55534d4e4e4e4b51535b666d7983909da9b6aea2988d8073675d5145392c1d1207000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060d14191c1f1f202020202020201413110d0801000000000000000000000000000000000000000000060c1012202020202020202020201e1b1610090100000000000810181f25292b2c2d2d2d2d2d2d2d2d282825201b140c030000000000000000000000000000000000070f161b1f22232d2d2d2d2d2d2d2d2b27211b130a0100000008121b242b31363839393939393939393939393939393939393939393939393939393939393939393939393939393939393939393433302b251d140b010000000000000000000000000000000000000000010d1925303a44555f676a6c6c6c6c6c6b6760564b3f33271b0e0006131f2b37434e585f626c6c6c6c6c6c6c64625a5045392d21150800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060c11151718202020202020201615130f0a04000000000000000000000001040707131313131313130d0c0a0702000000000000000000000000000000000000000000000000000000000000000000000000000000000000010c161f2a333d464e575f676d737b8085898c8f919298a3a8a196918f8d8985807b736d675e574d453c33291d140a00000000000916222f3b4854606b717e88939fa4a19791847a6d675d544a4653606d78828f959fa69d938d80736d625a50473d342a21180e050000000000000000000000000000000000000000000000000000000000000000000104060b10121315171a1c1d1e1f1f201f1f1e1d1b19171514120e0906030000000000000000000000000000000000000000000000000000000000000000000000000000000000000001080f14181a1b2020202020202020191916120d070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020a11171c1f20282d2d2d2d2d2d2d2d2a21201d19130c04000000000000000000000000000000000000000000000814212d3945505a61646c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6a675f564b3f33271b0e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000030a11161a1c1d20201c1b1915100902000000000714212e3a4754616d7a86868686868686867b6e6154483b2e21150800000000000000000000000000000c18242f3946535f6974808d96a1aba69f92877e736d67615f575b5a5b555d60636a6f7a83909daab6ab9f92857a6d61554b42382d2217110800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080d101213131313131313130707040100000000000000000000000000000000000000000000000000030613131313131313131313120f0a050000000000000000060d14191c1f1f20202020202020201c1b19150f090200000000000000000000000000000000000000040a0f13151620202020202020201e1b16100901000000000009121920262a2c2c2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d282724201a130b020000000000000000000000000000000000000000000008131e2932434d555b5d60606060605e5c564e44392e23170b00030f1b26323c464e535560606060606060585650483e34291d110500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005080a0b1313131313131309080603000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040d18212b343d454d555d60696e73787c7f828486929fa196898482807d79746e69605c554d453c332a21170b0200000000000713202c38444f59616c727f8c929da5a0969083796d665c5044515c666d79839096a0a59c928b7f726c61594f463c332920170d0400000000000000000000000000000000000000000000000000000000000001070d1113171c1f20222426292a2b2b2c2c2c2b2b2a28262422211e1a1312100c060000000000000000000000000000000000000000000000000000000000000000000000000000000000000003080b0d0e13131313131313130d0c0a06020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060b0f12131b20202020202020201d1413110d0801000000000000000000000000000000000000000000000004111c28333e48505557606060606060606060606060606060605e5b564d44392e23170b000000000000000000000000000000000000000000000000000000000000000000000000000000000000040d151c2226292a2d2d292825211b140c030000000714212e3a4754616d7a87939393939393877b6e6154483b2e211508000000000000000000000000000007121d2a36424d57606d7a849199a3aba39992878079736e696968676869676d70757c8490959fabb3ab9e91847a6e675d544a3f3328231a100700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080d10121313131313131313130f0e0c09040000000000000000000000000000000000000000000000030608091313131313131313120f0a050000000000000000080f151a1d1f20202020202020202020202020202020202020202020202020202020202020202020202020202020202020201b1a18140f08010000000000000000000000000000000000000000000000020d1720313b434a4f515353535353514f4b443c32281d120600000a15202a343c434749535353535353534b49453e362d22170c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010407070b0d0f111213131212100e0c080705020000000000000000000000000000000000000000000000000000000000060f19222b333c434b51565e61666c6f7375777e8a979e9184787673706d66615e56514b433b332a21180f0500000000000003101b27323d47505a626d73808d939ea69f958f82786d605b524a545d676d7a849197a1a49f93887e716b60584e453b32291f160c0300000000000000000000000000000000000000000000000000000003090e13181d2023282b2d2f3133353737383939393837373533312e2d2a26201f1c17110d080200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000306060f1313131313131313110706040100000000000000000000000000000000000000000000000000000c17222c363e45494a53535353535353535353535353535353514f4b443b32281d12060000000000000000000000000000000000000000000000000000000000000000000000000000000000030d161f272d32353639393534312c261e150c0200000714212e3a4754616d7a87949f9f9f9f94877b6e6154483b2e2115080000000000000000000000000000010e1a26313b45525d686f7d879299a3aaa399938d847f7b787675747475777a7d828991969fa7aca6a8a1969083796d665b50443f362c22190f05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020507080b0e111112131312110f0c0908060300000000000000000406070b0f1213131211100e0c0b0906010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004090e111213131313131313131313131313131313131313131313131313131313131313131313131313131313131313130e0d0b08030000000000000000000000000000000000000000000000000000050e1f2931393f4244464646464644433f39322a20160c010000040e18222a32373b3c464646464646463e3d39342d241b110600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010406070a0d10111213131211100d0a07060400000000030505060606060606000000000000000000000000000000000000000000000000000002080d111314171a1c1e1f1f201f1f1d1b181514120e090400000000000000000000000000000000000000000000000000000000071019212a313940454d52545b60636669707d8a979e9185786b6763605c54524d454039302921180f0600000000000000000b16212b353e48515b606c77818e949fa79e948e81746d635a504b555e686e7b859198a2a49a92877d706a5f574d443a31281e150b02000000000000000000000000000000000000000000000000040a0f151a1d24292c2e34383a3c3e404244444546464545444342403d3b3a36312d2c28231c19130d08020000000000000000000000000000000000000000000000000000000000000000000000000000000000040607090c0e1011121313131211100f0d0b080705020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005101a242c33393c3e4646464646464646464646464646464644433f39322920160b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000a151f2831383e4243464642413d3730271e140900000714212e3a4754616d7a8794a0acaca194877b6e6154483b2e21150800000000000000000000000000000009141f2935414c56606b717e879298a0a8a49f97918c8885838181818283868a8f939da0a8a39f999b9e9f958f81786c605b51483e342b21170d0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003090e121415181b1d1e1f201f1f1d1b191515120f0a0401000000070c101313181c1e1f201f1e1d1b181815120d0600000000000000000004090e111213131313131313131313131313131313131313131313131313131211100e0c0a07060400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d171f272e33363739393939393837332e2820180e040000000006101820262b2e2f3939393939393931302d29221b120900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001080d111314171a1d1e1f1f201f1e1c1a171413100c07010c0f1112131313131313090907030000000000000000000000000000000000000000050b1013191d20212427292b2b2c2c2c2b2a282522211e1a14100c07010000000000000000000000000000000000000000000000000000070f181f272f353b42464a5053565964707d8a979e9185786b5e5653504a46423b342e271e170f06000000000000000000040f19232c363f44505b656d78828f95a0a69d938c80736c62594f4c565f696f7c869299a3a39992867c6f695f564c433a30271d140a0000000000000000000000000000000000000000000000070c151b20262b2f35393a3f4446484a4d4f5051525253525251504e4c4a4846423d3a38342e29251e19140d050000000000000000000000000000000000000000000000000000000000000000000000000004070c10121316191b1d1e1f1f201f1f1e1d1b19171414110e0806030000000000000000000000000000000000000000000000000004090e1112131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313130b0a080400000000000000000008121a22282d3031393939393939393939393939393939393736332e2820170e04000000000000000000000000000000000000000000000000000000000000000000000000000000000005111c27313a434a4e5053534f4d49423930261b1004000714212e3a4754616d7a8794a0adaea194877b6e6154483b2e211508000000000000000000000000000000030d19242f3a444f59616c717e8691969fa2a9a19e9997918f8e8d8e8f9092999b9ea5a69f99928d8e939e9e938d80746d625a50463d33291f140900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040a0f141a1e212125282a2b2c2c2c2b2a282622211f1b15110d08030b12181c1f2025292b2c2c2c2b2a272524221d18110901000000000000080f151a1d1f202020202020202020202020202020202020202020202020201f1f1e1d1b19161413100c07040100000000000000000000000000000000000000000000000407090a13131313131313131313131313131313131313131313131313131313131313131313131313131313130b0a080400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050d151c2227292a2d2d2d2d2d2b2a27231d160e06000000000000060e151b1f21222d2d2d2d2d2d2d2524211d171109000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003090e13191d20212427292b2b2c2c2c2b292724201f1c18120e181c1e1f2020202020201615130f0a0400000000000000000000000000000000040a0f171c1e24292c2d3133363738393939383735322e2d2a261f1d18120b060000000000000000000000000000000000000000000000000000060d151d24293036383f44464a5764707d8a979e9185786b5e5246443f38363028231d150c05000000000000000000000007111a2427333f49535c666d79839096a1a59c928b7e716b61584e4d575f6a707d879299a4a29891857b6e685e554b42392f261b11060000000000000000000000000000000000000000030b121820262b31373a4145474a50535557595c5d5e5e5f5f5f5e5e5d5b595755534d4946443f3835302a251e170e0802000000000000000000000000000000000000000000000000000000000000000001070c1013181c1f20232527292b2b2c2d2c2c2b2a28262421201e1915120f0a0300000000000000000000000000000000000000000000080f151a1d1f20202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020171714110c0500000000000000000810171c2123242d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2b2a27231d160e050000000000000000000000000000000000000000000000000000000000000000000000000000000000000a16222d38434c545a5d60605c59544b42372c211509000714212e3a4754616d7a8794a0adaea194877b6e6154483b2e2115080000000000000000000000000000000008131e28323d47505a616c717c848c92989d9fa4a9a19e9c9b9a9b9c9d9fa3a9a29f9a94908780818e949f9d928b7f726c61584e453b31251a0e020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060c161b1f252a2d2e31343738393939383735322f2e2b26201d19130c151d23282c2d32353839393838363432312e29231b1309000000000009121920262a2c2c2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2c2c2c2b29282623201f1d1813110d080100000000000000000000000000000000000000050b101416172020202020202020202020202020202020202020202020202020202020202020202020202020202020171714110c05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040b11161a1d1e20202020201e1d1b17120c040000000000000000040a0f13151620202020202020181715110c060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060e141a1e24292c2d3033363738393939383634302d2c29231d1a24282b2c2d2d2d2d2d2d23221f1b160f070000000000000000000000000000070f151b22282d3035393a3e404244454646454543413f3b3a36312c29241d17110a0200000000000000000000000000000000000000000000000000030b12181f252a2d33383d4a5764707d8a979e9185786b5e524538342e2a251f18120b0300000000000000000000000000091217222d38414b545d676e7a849197a1a49f92877d706a60574d4e58606b717e87939fa4a19791847a6d675d544a41382d22171209000000000000000000000000000000000000070c151d232831373c42474b5154545c60626466686a6a6b6c6c6c6b6a6a686664615f575653504a46413a3630292019130d05000000000000000000000000000000000000000000000000000000000003090e12181d1f23282c2d3032343638383939393838373533312e2d2a25211f1b150f0b060000000000000000000000000000000000000009121920262a2c2c2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2423211c1710080000000000000000050c11141717202020202020202020202020202020201e1d1b17120b04000000000000000000000000000000000000000000000000000000000000000000000000000000000000010d1a26323e4a545e66696c6c68655d54493d3125190c000714212e3a4754616d7a8794a0a2a2a194877b6e6154483b2e21150800000000000000000000000000000000010c16202b343e48505a616a6f797f858b90939a9a9c9d9e9f9f9f9e9d9c9a9897928d88837c7378828f95a09f93877e706a60574d42362a1e1205000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030a111720272b31363a3b3e4144444546464544423f3c3b37322c29241e191e272e34383a3e42454646454443413f3d3a342d251b110600000008121b242b31363839393939393939393939393939393939393939393939393939393837363432302d2c2924201d19130e0902000000000000000000000000000000000810161c2023232d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2423211c17100800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060a0e1011131313131311110e0b0601000000000000000000000003060809131313131313130b0a0805000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070f181f262a2f35393a3d404344454646454443403d3a38342f2a252f3437383939393939392f2e2c272119100700000000000000000000000009101920272b33393a4145474a4d4f515252535252504e4b4846423b39352f27221b140b050000000000000000000000000000000000000000000000000001070c14191c2228313d4a5764707d8a93939185786b5e52453828231c19140c070000000000000000000000000000000006111b262f39424c555e686e7b859298a2a39992867c6f695f564c4f59616c727f8b929ca5a0969083796d665c53493f3327241a1007000000000000000000000000000000000810191e272e343c43474d53555d6064666d6f7173757777787979787877767573706e696763605c54524c46413b322a251e170e06000000000000000000000000000000000000000000000000000001070c141a1d24292c2e34383a3c3f4143444546464645444342403e3b3936302e2b261f1c17110a020000000000000000000000000000000008121b242b3136383939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393931302d28221a120800000000000000000004080a0b1313131313131313131313131313131311100e0b060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1c2935424e5a6670767979756f65594d4134281b0e000714212e3a4754616d7a87949595959594877b6e6154483b2e2115080000000000000000000000000000000000040d19222d363e48505860676d737a7f83878a8d8f90929292929190908e8b8885807c766f6a6d7a8390969a9992867c6f695e53463a2d2114070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030c151c232832373b4246484b4e505152535252504e4c4847433c39352f28222b30394045464b4f5152535251504e4b4a463f372d23180d0100040f19242d353d42454646464646464646464646464646464646464646464646464646454443413f3d3a38352f2c29241e1a140c06000000000000000000000000000008111a21272c2f30393939393939393939393939393939393939393939393939393939393939393939393939393939393931302d28221a120800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b1218212a31363a4145474a4d505152525352514f4d4a4745403936313a4044454646464646463c3b38322b22190f04000000000000000000020a131b222b32373e44494c5254575a5c5e5e5f5f5f5e5d5b5855534d47454039332d261d170e06000000000000000000000000000000000000000000000000000002090e111724313d4a5764707d8686868684786b5e5245382b17110e09020000000000000000000000000000000000000a141d27303a434c565f696f7c869299a3a29892857b6e685e554b505a626d73808d939da69f958f82786d655b50443f362c22190f04000000000000000000000000000009111a222a303940454e53575f62676d7175797b7d8082838485858685858483817f7d7b7874706d66615e56524c443e36302920180f07000000000000000000000000000000000000000000000000030b12181f252a2f35393a404446494c4e5051525253525251504e4c4a4746413c3a37312b28221c140b070000000000000000000000000000040f19242d353d4245464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646463e3c39332c241a1005000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d69768286868175685c4f4235291c0f000714212e3a4754616d7a87888888888888877b6e6154483b2e21150800000000000000000000000000000000000007101b242d363e464e555c60676d72767b7e80828485858685848483817e7c79746f6a625f686e7b848d8d8d8d8d857b6e6154483b2e21150800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030d151e262e343d43474d5354585b5d5e5f5f5f5e5d5b5955534e4745413a3129343c424b5153585c5e5f5f5f5e5d5a585651493f34291d1206000915202b353f474e5253535353535353535353535353535353535353535353535353525251504e4c494745403a39352f2a251f17110a03000000000000000000000005101a232c33383c3d46464646464646464646464646464646464646464646464646464646464646464646464646464646463e3c39332c241a100500000000000004090e111213131313131313131306040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004090e111213131313131313131306040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030c151c2328333b42464c5254575a5c5e5e5f5f5f5e5c5a5753514b46423b454c50525353535353534948433d342b21160a0000000000000000000a141c252d343d43475055565d606466696a6b6c6c6c6b6a6865615f5753514b443f382f292018100600000000000000000000000000000000000000000000000000000000061623303c4955616c70797979797872685c5043372a1e06000000000000000000000000000000000000000000020b151e28313b444d57606a707d87929fa3a19791847a6e675d544a515b636e74818e949ea79f948e81776c605b51483e342b21160a0000000000000000000000000009121b232c343c424b51585f62696e747a7d8185888a8c8f9091919292929191908e8c8a8884807d79736d68615e565046413a322a2119100700000000000000000000000000000000000000000000060d151d24293136394045474a515356585a5c5e5e5f605f5f5e5d5b595754524c4847433c38332d261d18120b030000000000000000000000000915202b353f474e52535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353534a49453e362c22170c00000000000000000000000000000000000000010406070a0c0e101112131313121211100e0c0a070604010000000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f000713202d3a4653606d787c7c7c7c7c7c7c7c786d6053463a2d2013070000000000000000000000000000000000000009121b242d343d434b51555d6065696e717375777879797978777674716f6d66625f58565e696f7c8181818181807f7265584b3f3225180c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010b151f2730383f444e54575e6164676a6b6c6c6c6b6a6865625f5854524c433f353c464e545c6065686b6c6c6b6b696765625b51463a2e221509000e1a26313d4751595e5f60606060606060606060606060606060606060606060605f5f5f5e5c5b595653514b4745413a363028231c150c05000000000000000000000b16212c353d44484a53535353535353535353535353535353535353535353535353535353535353535353535353535353534a49453e362c22170c0000000000080f151a1d1f20202020202020202013100c0701000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080f151a1d1f20202020202020202013100c070100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b151e272e343f454d53565d606366696a6b6c6c6c6b696763605c55534d444f575c5f60606060606056544e463d32271b0f030000000000000009121c262e373f464e545a6164686d7173757778797978787674726e6965605d555049413a322a221810060000000000000000000000000000000000000000000000000000000814202d3944505a61646c6c6c6c6b6860564b4034281b0f00000000000000000000000000000000000000000000030c161f29323c454e58616b717e8b919ca4a0969083796d665c5349525c606d78828f959fa69e938d80736d625a50473d32271b0f03000000000000000000000009121b242d353e464e545c606a6f757b81868a8e929797999b9d9d9e9f9f9f9e9d9d9b999796918d8985807a746e68615a524c443c332b2219100700000000000000000000000000000000000000000910181f272f353b42464b5153545c60636567696b6b6c6c6c6b6b6a686664615e5655534e46443f382f28231d150c0500000000000000000000000e1a26313d4751595e5f606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060575550483e33281c11040000000000000000000000000000000104080d11131417191b1d1e1f1f20201f1e1e1d1b19161413100d0704000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f0006121f2c3844505c666d6f6f6f6f6f6f6f6f6d665c5144382c1f1206000000000000000000000000000000000000000009121b222b313940454b5154575e616467696a6b6c6c6c6b6a69676562605c54534e4d575f6a6f747474747474726d62564a3d3124180b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007121d273139424a50586062696e71747777787979787775726f6a66605d56504540454e5860666d717578797978777674726d62564a3d3124180b00111d2a36424e59636a6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6b6a69676563605d5554524c46423b342e261e170f06000000000000000004101c27333d474f55566060606060606060606060606060606060606060606060606060606060606060606060606060606060575550483e33281c110400000009121920262a2c2c2d2d2d2d2d2d2d2d1f1c18120b030000000000000000000000000000000000000000000000000000000000000000000000000000000000000009121920262a2c2c2d2d2d2d2d2d2d2d1f1c18120b0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007121c273039404451575f61686d7073767778797978777673706d67615e57505761686b6c6c6c6c6c6c6260584e43382c1f130700000000000006101b242e384049515860626c70757a7d808284858586858583817e7b77726d67605b534c443c342a22180e05000000000000000000000000000000000000000000000000000004101c28333e48505557606060605e5c564e453a2f23170b0000000000000000000000000000000000000000000000040d17202a333d464f59626c737f8c929da5a0958f82786d655b5044505c666d79839095a0a59d928c7f726c61594f43382c1f13070000000000000000000007101b242d363e474f585f666d737c82878e92989b9ea2a9a6a8aaa8a7a6a6a6a7a8a9a8a6a8a19e9a97928c86807a716c615e564d453c342b22190e0500000000000000000000000000000000000009121b222a313940454d53555d6065666d6f72747677787979797877767573716e6867625f5853504a423d342e271e170e0500000000000000000000111d2a36424e59636a6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c64615a5045392d2114080000000000000000000000000002080d1113191d2021232628292b2c2c2c2c2c2b2b2a28252320201d1813100c0700000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f0003101c28343f4a545c606262626262626262605c544a4034281c10040000000000000000000000000000000000000000000910191f272f343a4145474d5254575a5c5d5f5f5f5f5e5d5d5b585553514a4743454e585f6267676767676765625b51463a2e2215090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020c18242f39434b545c606a6f757b7e8183848586858583817f7c78726d68625a514b4d57606a6f797e82848586858483817f7265584b3f3225180c00121f2c3845525e6a7579797979797979797979797979797979797979797979797979797877767472706d6765605d56524d443f38302921180f06000000000000000714202c38444f5961636c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c64615a5045392d211408000008121b242b3136383939393939393939392c29231d150d03000000000000000000000000000000000000000000000000000000000000000000000000000000000008121b242b3136383939393939393939392c29231d150d0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c18232e39424a515b63696e747a7d808384858586858482807d79746e69605b536873787979797979796f6a6054483b2e2215090000000000030e18222d36404a525b626a6f767d82868a8d8f919192929291908e8b88847e79716c655e564e463c342a20170c0300000000000000000000000000000000000000000000000000000b17222c363e44494a5353535352504b453c33281e1207000000000000000000000000000000000000000000000000050e18212b343e47505a636d74808d939ea69f948e81776c6053464a545d676d7a839196a1a49f93887e716b6054483b2f221509000000000000000000050e19222d363e485059616a6f7980878f93999fa3aaabaaaaa29f9d9b9a9a999a9a9b9d9fa2aaa9aba9a19e98928d857e756d685f574e463c342a20170c030000000000000000000000000000000009121b242c343c434b51575e61676d7175797c7f81838485858685858483817f7d7a77736f6a64605b544f454039302920170f05000000000000000000121f2c3845525e6a7579797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979716c6155493c3023170a000000000000000000000001080d13191d2024292c2d303335363738393939393837363432302d2c29241f1c18120b060000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f00000c17232e38424a5053555555555555555553514a42392e23180c0000000000000000000000000000000000000000000000070d151d23292f35393b4246474a4d4f51525253525151504e4b4946444039373c464e53555a5a5a5a5a5a585651493f34291d120600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a141e2935404b555d666d747c82878b8e909192929291908e8c88847f7a716d605d55535f696f7c848b8f9192929291908d86796c605346392d20130013202c3946535f6c798786868686868686868686868686868686868686868686868685858483817f7c7976726d68615e57504a423b332a22180f050000000000000916232f3c4855616b707979797979797979797979797979797979797979797979797979797979797979797979797979797979716c6155493c3023170a00040f19242d353d424546464646464646464638342f271f150b01000000000000000000000000000000000000000000000000000000000000000000000000000000040f19242d353d424546464646464646464638342f271f150b0100000000000000000000000000000000000000000000000000000000000000000000000000000000000004101c2834404a545c606d727b81868a8d8f9191929292918f8d8a85807b726c655c6b78858686868686867c6f6256493c2f23160900000000000a15202a343e48525c636d727c838a8f9299999c9d9e9f9f9f9e9d9b9895908b857e776d685f584e463c32291e150a000000000000000000000000000000000000000000000000000005101a232c33393c3d464646464543403a332a21170c0100000000000000000000000000000000000000000000000000060f19222c353f48515b606c78818f94939393938c7f7366594c424b555d686e7b84919793939a92867c6f6356493c302316090000000000000000020d17202b343e48505a616b707c838c92999fa4abaca7a09d999892908f8d8d8d8d8d8f909298989c9fa4abaaa29f97928a827a6e6960584e463c32291e150b00000000000000000000000000000008121b242d363e464e555d60696e74797e8285898b8d8f91919293929291908e8c8a8784807c76716c666059514b433b332921170e05000000000000000013202c3946535f6c79878686868686868686868686868686868686868686868686868686868686868686868686868686868686868686867e7164574a3e3124170b00000000000000000000040c13191e24292c2f35393a3d3f4143444546464645454443413f3d3a39352f2c28231d17110a02000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f000006111c2630383f444649494949494949494644403930271c1207000000000000000000000000000000000000000000000000030b12181d24292c30363a3b3e40424445464646454443413e3c3a38342e2b343c4347484e4e4e4e4e4e4b4a463f372d23180c010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006111c26303845515d676d7880898f93999a9d9e9f9f9f9e9d9b9896918c857e756d675d58626e7b8691969b9e9f9f9e9e9c9386796c605346392d20130013202c3946535f6c79869293939393939393939393939393939393939393939399929292918f8e8c8986827e7a746e69605c544d453c342a21170c0200000000000a1723303d4a5663707d86868686868686868686868686868686868686868686868686868686868686868686868686868686867e7164574a3e3124170b000915202b353f474e5253535353535353535345403931271d12070000000000000000000000000000000000000000000000000000000000000000000000000000000915202b353f474e5253535353535353535345403931271d12070000000000000000000000000000000000000000000000000000000000000000000000000000000000030e18212c3844515c666d757f878d9298999c9d9e9f9f9f9e9c9a98928d867f776d666679869293939393887b6e6255483b2f22150800000000030f1b26313c46505a636e737f8790949c9fa3aba8a5a3a1a1a1a3a5a7a7a09d97928b827a6f6a5f584e443b30261c1106000000000000000000000000000000000000000000000000000008111a22282d3031393939393837342f2821180f0500000000000000000000000000000000000000000000000000000007101a232d364044505b666d79828686868686868275695c4f42434c565e696f7c858686868686867f7265584c3f3225190c000000000000000009141f29323d46505a626c717d8690959fa3ababa49f9b95908c898584828180808081828385888b8f93999fa2aaa9a19e938f847b6f6a60584e443b30271d12070000000000000000000000000006101a242d363f4850585f676d737b80858b8f9298989a9c9e9e9f9f9f9e9e9d9b999795908d88837e786f6b605c554d453b332920170c030000000000000013202c3946535f6c798692939393939393939393939393939393939393939393939393939393939393939393939393939393939393938a7e7164574a3e3124170b000000000000000000070d161e24293035393a4145474a4c4e505152525353525151504e4c494745403a38342e27221b140b060000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f00000c17232e38424a5053555555555555555553514a42392e23180c0000000000000000000000000000000000000000000000000001070c13181d20252a2d2e313436373839393938373634322f2d2c2823222a31373a3c4141414141413f3d3a342d251b110600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b17232e3842505a606d79828d929b9fa4ababa39f9d9c9b9c9d9fa19e97928b82796d685f6a76828f98a1a8aaa39f9995949386796c605346392d20130013202c3946535f6c7986929f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9fa39f9f9e9d9c9a9899928f8b86817b736d665e574e463c33291e140a00000000000a1723303d4a5663707d899393939393939393939393939393939393939393939393939393939393939393939393939393938a7d7164574a3e3124170b000e1a26313d4751595e5f606060606060605f514b43392f23180c0000000000000000000000000000000000000000000000000000000000000000000000000000000e1a26313d4751595e5f606060606060605f514b43392f23180c00000000000000000000000000000000000000000000000000000000000000000000000000000000000915202c38434f59606d78818c92999fa2aaa9a8aaa29f9e9e9e9fa29f98928c81786d6d798699a39f9f94877a6e6154473b2e2114080000000006121f2b37434e58626c73808b92999fa6aca49f9c989695949596989c9fa4a9a19e948f847c6f6a5f564d42382e23170c0300000000000000000000000000000000000000000000000000000810171c2023242d2d2d2d2b2a28231e170f06000000000000000000000000000000000000000000000000000000000008111b2428333f4a545c676d767979797979797570655a4d413a444d575f6a6f78797979797979726d62564a3e3124180b00000000000000030d1925303b444e58626c717e879298a0a7afa79f99938e88837f7c79777574737373747577797c7f83878d92989ea5ada59e9691857c6f6a5f564c42392e23180c030000000000000000000000030c18222c363f48505a616a6f7980868d92979c9fa2aaa7a9a8a7a6a6a6a7a8a9a8a6a7a09d9a94908a837c746d675e574d453b32291e150a0000000000000013202c3946535f6c7986929f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f978a7d7164574a3e3124170b00000000000000000810181f282f353a4145474c525456595b5c5e5f5f5f5f5f5e5e5d5b585653514b46454039332d261d180f0700000000000000000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f0003101c28343f4a545c606262626262626262605c544a4034281c1004000000000000000000000000000000000000000000000000000001070d11141a1e20212427292a2c2c2c2c2b2a2a282522201f1c181820262b2e2f34343434343432312e29231b1309000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003101c28343f4a54616c74818e949da4aca7a09d9992908f8f8f9192999a9e9f948f837a6d666f7c88949faaaea398928c88878886796c605346392d20130013202c3946535f6c7986929facacacada7a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a6a7a8a9a7aba39f9c98928d867f786e695f584e453b30261c1106000000000a1723303d4a5663707d89969f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f978a7d7164574a3e3124170b00111d2a36424e59636a6c6c6c6c6c6c6c6c6c5c554b4034291c10040000000000000000000000000000000000000000000000000000000000000000000000000000111d2a36424e59636a6c6c6c6c6c6c6c6c6c5c554b4034291c1004000000000000000000000000000000000000000000000000000000000000000000000000000000020e1a26313b4854606b74808d939fa3ababa49f9b979892919192939a989d9f938f82786d7a8794abb4a094877a6d6154473a2e211407000000000815212e3a47535f6a717e8b929fa3aba69f9a938f8c89888788898c90939a9ea6a69f9691857c6f685e544a3f34281f1409000000000000000000000000000000000000000000000000000000050b10141617202020201f1e1b17120c0500000000000000000000000000000000000000000000000000000000000000091217222d38424b555c60696c6c6c6c6c6c69655e54493d323b454e585f626c6c6c6c6c6c6c65625b51463a2e221509000000000000010b151f2a36424d56606a717e889299a2aaafa49c959087817c77726f6d6668676766676768666c6f72767b80868e939fa3aaa8a09792867c6f685e544b40342820150900000000000000000000000b151e2a343e48505a626c717c848c92989fa2a9aca8a8a09e9c9a9a999a9a9b9d9fa3ababaaa69f9c95908781796e695e574d443b30261c110600000000000013202c3946535f6c7986929facacacaea9a7a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a4978a7d7164574a3e3124170b0000000000000008111a222a313a41454c5254565d60636668696a6b6c6c6c6c6b6a69676563605d5553514b443f382f2a21191107000000000000000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f0006121f2c3844505c666d6f6f6f6f6f6f6f6f6d665c5144382c1f1206000000000000000000000000000000000000000000000000000000000104090e111414171a1c1e1f1f201f1e1e1d1b18161312100c0e151b1f21222727272727272524221d18110900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006121f2b3844505c66717e8b939ea6aea59d95908a86838282838486898d92979f959083786d73808d99a6b0a89f9286807c7a7b7d7063574a3d3024170a0013202c3946535f6c7986929facb9ada39b9898989898989898989898989898989899999a9c9ea1a8a9acaaa29f98928c837b6e6a5f574d42382e23170b010000000a1723303d4a5663707d8996a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1978a7d7164574a3e3124170b00121f2c3845525e6a75797979797979797976675c5145382c1f13060000000000000000000000000000000000000000000000000000000000000000000000000000121f2c3845525e6a75797979797979797976675c5145382c1f130600000000000000000000000000000000000000000000000000000000000000000000000000000006121e2b37424e57636f7c87939fa5afa9a199938f8a878584848586888c90959e948d80747b8794a1ada093877a6d6054473a2d2114070000000713202c38444f59626f7c86929fa4afa49c948f87827f7c7b7a7b7c7f83878f949fa3a8a19791857a6e665c50443b31261a0e030000000000000000000000000000000000000000000000000000000004080a0a1313131312110f0b070100000000000000000000000000000000000000000000000000000000000000000006111c262f39434b51535d6060606060605c5a544c423729333c464e53555f606060606060585651493f34291e120600000000000007121d27313946525e696f7c86929aa3ababa39f928d837c756f6a6662605c545a5a5a5a5a545b606265696e747b818a9298a2a9a9a19891847a6e665c51453c31261a0e0500000000000000000007121d27303c46505a626c717e8691969fa2aaaba39f9b9796918f8e8d8d8d8d8f9092999a9ea1a9aba79f9a938d837b6e695e564c42382e23170c04000000000013202c3946535f6c7986929facb9aea49d9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a978a7d7164574a3e3124170b00000000000007101a242c343c434c51565d6065686d707274767778797979787877767472706d6764605c555049413c332b231910070000000000000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f000713202d3a4653606d787c7c7c7c7c7c7c7c786d6053463a2d20130700000000000000000000000000000000000000000000000000000000000000020507080b0d0f11121313131211100e0b0907060400040a0f1215151b1b1b1b1b1b181815120c06000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d7884919ea5afa69d938e837d797776757677797c80858c9298958e81747683909ca9aca0958a7e736f6e6e706b6155483c2f2316090013202c3946535f6c7986929facb9a79b918b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8c8d8d8f9196979c9fa3abaaa29f9590847c6e695e544a3f34281d13070000000a1723303d4a5663707d899494949494949494949494949494949494949494949494949494949494949494949494949494948a7d7164574a3e3124170b0013202c3946535f6c798786868686868686796d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000000000000000013202c3946535f6c798786868686868686796d6053473a2d2014070000000000000000000000000000000000000000000000000000000000000000000000000000000814212e3a47535f6a76828f9aa4afaba1979287827d7a79787778797b7f838a9196928a7e7b8895a1ada093867a6d6053473a2d2014070000000916222f3b4854606b76828f98a2aea49c928c827b7672706e6e6e7072767c828b9299a3a9a1979082786d60574d42362a20150a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a141d273139404547505353535353534f4d49423930212a343c434748525353535353534c4a463f372d23180d010000000000000c18232f3943505a616e7b859198a3acaca399928b80786f6a625f585653504a4e4d4d4d4e4a505355575e61696e757e869297a2aaaaa1969082786d60574e42372b21170b0000000000000000000c18232e39424e58616c717f8a9298a0a8aba49f99928e8a8784828180808081828486898d92979ea1a8aca49f9590847b6e685e544a3f342820150a000000000013202c3946535f6c7986929facb9a99d928d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8a7e7164574a3e3124170b0000000000040e19222c363e464e555d60686d72767a7d7f8183848585868685848483817f7c7a75706d67605b534e463d352b22190d0400000000000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f000714212e3a4754616d7a87888888888888877b6e6154483b2e21150800000000000000000000000000000000000000000000000000000000000000000000000001030405060606050403010000000000000000030608090e0e0e0e0e0e0c0b09060100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1824313e4b5764717e8a96a0acac9f948e8179716d67696869676d70747a7f869095938a7e7885929fabaa9d9184776c6261616361594f44382c2014070013202c3946535f6c7986929facb2a5988b7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f80808284878b8f92999fa7aea79f9691847b6e665c50443a2f24180d0100000a1723303d4a5663707d87878787878787878787878787878787878787878787878787878787878787878787878787878787877e7164574a3e3124170b0013202c3946535f6c7986929393939393867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000000000000000013202c3946535f6c7986929393939393867a6d6053473a2d2014070000000000000000000000000000000000000000000000000000000000000000000000000000000815222f3b4855626e7b88949facaea39992857d75716e686b6b666d6e72767d84909492857d8996a3aca09386796d6053463a2d201307000005111e2a36424d5663707d89949faaa79d928c80766e69656362616263656a6f767f879299a4a99f948c7f73695f53463c31261a0f010000000000000000000005080a0b1313131313131313131313131313131313131313131313131313131313131313131313130f0f0d09040000000000000000000000000000000000000000020b151f272f34383a4346464646464642413d3730271e222a31373a3c454646464646463f3e3a342d251b110600000000000004101c2934404b55616c76828f97a1aaafa49a92877e736d665f58534e4946443f41404040413f4446484d53565e616c717c859298a2aca89f948d80736a5f53473e33281c10040000000000000004101c2834404b545f6a717e87939fa2aaa9a199938e86827e7a777574737373747577797c80858b91969da5afa79f9691847a6e665c50443c32261b0f040000000013202c3946535f6c7986929facb3a79a8d80808080808080808080808080808080808080808080808080808080808080808080808080807c6f6255483c2f22150900000000020c16202b343e4850585f676d737a7f8386898c8e8f9192929292929191908e8b8986827d79716c655f584f473d342b20160c01000000000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f000714212e3a4754616d7a87949595959594877b6e6154483b2e211508000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005121e2a36424d576875818e9ba8afa49a8f82786d66605d555c555c6063676d727b838f9391857b8797a2ada79a8d8074675a545557554f473e33281c10040013202c3946535f6c7986929facada093867972727272727272727272727272727272737475787a7e828790959da4aea9a1969083786d60554b4135291d110400000713202d3a4653606d787a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a796d6053463a2d2013070013202c3946535f6c7986929f9f9f9f93867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000000000000000013202c3946535f6c7986929f9f9f9f93867a6d6053473a2d2014070606060606060606060504020000000000000000000000000000000000000000000000000000000d192633404c5966737f8c99a6b0ac9f92877c6f6b64615e56545c6062656c707a8290949083909daaaca09386796d6053463a2d20130700000714202d3a46525e6976828f9ca6aca0958d80736d625f575655545556585f626d727e87939fa6a69f92867b6e61584e43372b1e13080000000000000000060c111517182020202020202020202020202020202020202020202020202020202020202020202020201c1b191510090200000000000000000000000000000000000000030d151d23292c2d363939393939393635312c261e151820262b2e2f3939393939393932312e29231b13090000000000000006131f2c3845515c67707d8a949fa9b0a69f93887e716c605c544e47433c3a38342e3433342d3338393c42464d525a616a6f7c86929aa4afa69f92877b6e62594f44392d20150a0000000000000006131f2c3845515c666f7c869299a4aea8a0979187817b75716d6869676766676768676d7073797e848e939fa4aca8a0969083786d60584e43372b20150a0000000013202c3946535f6c7986929facada0938679737373737373737373737373737373737373737373737373737373737373737373737373736f6a5f53473a2e2115080000000008131e28323d46505a616a6f7a80868b909399999b9c9d9e9f9f9f9f9e9d9c9a9898928e8a847e786e6a60594f463d32281e1308000000000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f000714212e3a4754616d7a8794a0a2a2a194877b6e6154483b2e2115080000000000000000000000000000000000000000000000000000000000020608080b0e10121213131211100e0b0807050200000000000000000000000000000000000000000000000000000000000000000000000000020507080a0d0f1111121313131211100e0c0906050300000000000000000000000000000000000000000714202d3a46525e697885919eabac9f93877c6f665c54514b4f4b5153555d60696e79818f949083909da9b3a4988b7e7165584b484a48443e352c21160b000013202c3946535f6c7986929facada093867a6d656565656565656565656565656566666769686d71767c838d929da5afa89f958c7f72675d5145392c201307000006131f2c3845515c666d6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6d675c5145382c1f13060013202c3946535f6c7986929facaca093867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000000000000000013202c3946535f6c7986929facaca093867a6d6053473a2d20141313131313131313131212110f0d0a07060401000000000000000000000000000000000000000005111e2a36424d576976838f9ca9b1a79a8d80736a605954524c4a5053555a61676d798290959095a0abaca09386796d6053463a2d20130700000814212e3b4754616e7b87939e9fa39d9083786d605b534d49484748494e535b626c727f8c949faba3988f82756a5f53473a2f24190d010000000000000911171d2124252d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d292825211b140c0300000000000000000000000000000000000000030b12181c1f202a2d2d2d2d2d2d292825211b140c0e151b1f21222c2d2d2d2d2d2d2524221e1811090100000000000003101c28343f4a54606d7984919ea6b0aa9e948c7f736c625a504a423c37322d2c282327272722282b2d31363b42465058606a707e88939fa8aea3998f82766c6155493c31261b0f00000000000004111d2935414b55606d79839098a3aba9a09691857d746e6964615d565b5a5a5a5a555c6063666d7179818b939aa4afa89f958c80736a5f54473d32271b0f0100000013202c3946535f6c7986929facada093867a6d676767676767676767676767676767676767676767676767676767676767676767676767625f584e43372b1f1206000000010d1924303a444e58616c707c848d92989c9fa4a49f9e9c9a9a99999a9a9b9d9fa3a29f9b96918b837c706b60584e443a2f24190d020000000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f000714212e3a4754616d7a8794a0adaea194877b6e6154483b2e21150800000000000000000000000000000000000000000000000000000104090e121415181b1d1e1f20201f1e1d1a181514120e090401000000000000000000000000000000000000000000000000000000000000000105080e11141417191c1d1e1f20201f1f1e1c1b181513120f0b060000000000000000000000000000000000000815212e3b4854616e7b8797a1adaa9d9083776a5f544b4540424045474b51575f676d78828f9590959fabb0a3968a7d7063574a3d3d3c38332c231a1005000013202c3946535f6c7986929facada093867a6d6058585858585858585858585858595a5a565d60646a6f78808d939eaab1a79e92857a6d6054473a2f24180d010004101c2834404b545c606161616161616161616161616161616161616161616161616161616161616161616161616161616161605c554b4034281c10040013202c3946535f6c7986929facada093867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000000000000000013202c3946535f6c7986929facada093867a6d6053473a2d20202020202020202020201f1f1e1c1a171413110d08040000000000000000000000000000000000000714202d3a46525e697885929fabaca095877b6e61584f4746413f44464850555d676e7b85929da0a7b1aca09386796d6053463a2d20130700000c1926323f4c5965727f8c8f91929996897d70665c5047423d3b3b3b3d4347515a606c77828f99a3aa9f93877c6f62564c4135291d1104000000000009121b22292d30313939393939393939393939393939393939393939393939393939393939393939393939393635312c261e150c020000000000000000000000000000000000000001070c1013141d2020202020201c1b1915100902030a0f1215151f202020202020191815120d06000000000000000006121f2b3844505c66727f8c96a0acaea2988f82776c605a50443f38302b26201f1c171a1a1a171c1f20252a30363e464e58616c73808d96a1acab9f948a7d7064584e43372b1d120700000000000613202c3945515d67737f8c95a0aaada19791847b706b615e5754524c4e4d4d4d4e4b5153545c60676d747f88939fa5afa79f92877c6f62584e43372b1d120700000013202c3946535f6c7986929facada093867a6d605a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a55534e463c31261b0f0300000005111d2935414c56606a707e8691969fa2a49f9b9993918f8e8d8d8c8d8d8f9092989a9fa2a19e9590867d706a60564c4135291e13080000000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f000714212e3a4754616d7a8794a0adaea194877b6e6154483b2e21150800000000000000000000000000000000000000000000000001080d11151a1e212225282a2b2c2c2c2b2b2a272421211e1a14100d070100000000000000000000000000000000000000000000000000000002080d1114191e20212426292a2b2c2c2d2c2c2b29272522201f1b17110f0a040000000000000000000000000000000916222f3c4955626f7c8895a9b3a79a8d817467584e4239352f34383a40454d555c666d7a85919d9fa7b1afa396897c706356493d302f2c28211a110800000013202c3946535f6c7986929facada093867a6d60534c4c4c4c4c4c4c4c4c4c4c4c4c4d4d4c5254585f666c78818e98a2aeada2978b7e7265554b4035291d100400000c18232e39424b51535454545454545454545454545454545454585c5c5c5c5c58545454545454545454545454545454545453514b43392e23180c000013202c3946535f6c7986929facada093867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000000000000000013202c3946535f6c7986929facada093867a6d6053473a2d2d2d2d2d2d2d2d2d2d2d2d2c2b2a28262421201d1913100c07000000000000000000000000000000000814212e3b4754616e7b8798a2aeaa9d908377695e53463d393634383a3e434c555e69717e8b97a1adb9aca09386796d6053463a2d20130700000a1723303d4a5663707d80828486888a84776b60544a3f37312f2e2f31373f44505b656e7b87929faca49a8e8174685d5245392c2013080000000006111b242d34393d3e46464646464646464646464646464646464646464646464646464646464646464646464642413d3730271e140900000000000000000000000000000000000000000000040607101313131313130f0f0d09040000000003060809121313131313130c0b0906010000000000000000000713202d3a4653606d7884919ea8b2a99f92867b6e655b50483e342e261e1b1312100c060d060b0f12131a1f252a343d46505a606d7984919ea8b0a69c8f83766a5f5347392e23180c00000000000714212d3a4754606d7a85929fa7b0a69e92857b6e696059524d47464141404040414045464b51555d606d727f8b939ea9afa3998f82766a605447392f24180c00000013202c3946535f6c7986929facada093867a6d60534d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4847433c342a20150a000000000713202d3946525d686f7c869298a0a7a099938f8a868482818080808081828486898d92989da59f9892867c6f685d52453a3024190d0100000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f000714212e3a4754616d7a8794a0acaca194877b6e6154483b2e2115080000000000000000000000000000000000000000000000070c13191d20262b2e2f3234363839393938373634312e2d2a25201d18120c0400000000000000000000000000000000000000000000000002090e13191e20252a2d2e30333537383839393938373634322f2d2b27221b1b16100b04000000000000000000000000000a1723303d4a5663707d8996a3b0a6998c7f7366594c402f2924292c2f353b434b545d68707d8a959fabb7afa396897c706356493d3023201c1610080000000013202c3946535f6c7986929facada093867a6d6053473f3f3f3f3f3f3f3f3f3f3f3f40414145474e545b666d7a85929fabb3a99c908376675d5145392c201306000007121d2730394045464747474747474747474747474747505a6264686868686865625b5147474747474747474747474747474645403930271d1207000013202c3946535f6c7986929facada093867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000000000000000013202c3946535f6c7986929facada093867a6d6053473a3939393939393939393939393938373533312d2c29241f1c18120c060000000000000000000000000000091623303c4956636f7c8996aab4a79a8e817467574d42342d2a282b2d313a434d57606d7985929eabb8aca09386796d6053463a2d20130700000916222f3c4854606b70737577797b7d7d7063594f42382e26222122262b333f49535f6974818e9aa6ac9f92867a6d6054473a2f24190d010000000c17222d363e45494b5353535353535353535353535353535353535353535353535353535353535353535353534f4d49423930261b10040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005111e2a36414c5664707d8a96a1adada1978c7f72695e53493f3628231c140c0a060300000000000306090e1419222b343e45515d67717e8a96a0acab9f94887c6f62544b4034281c100400000006131f2b37434e5866727f8c97a2adaa9e948a7d70695f574f46423b3935303433342e34383a40454b515b626d74818e97a1adab9e94897c6f62554b4035291d1004000013202c3946535f6c7986929facada093867a6d6053474040404040404040404040404040404040404040404040404040404040404040403c3a37312a22180e0400000005121e2a36424d57616d7a859298a3a69f959087827d7a77767474737373747577797d80868e929ba3a29891847a6d60564c4135291d110400000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f000714212e3a4754616d7a87949f9f9f9f94877b6e6154483b2e211508000000000000000000000000000000000000000000030b12181e24292c31373a3b3e414345454646454443413e3b3a36312c29241d160d0802000000000000000000000000000000000000000000070c141a1e252a2d3036393b3d4042444445464646454443413f3c3937332d2b27201b160d070100000000000000000000000a1724313d4a5764707d8a97a3b0a5988c7f7265594c3f2e23181c1f24293139424c56616c7683909da9b3afa396897c706356493d302316100b05000000000013202c3946535f6c7986929facada093867a6d6053473a3232323232323232323233332f35393c424a545e68737f8c99a9b2ac9f9286796d6053473a2d2014070000000b151e272e34383a3b3b3b3b3b3b3b3b3b3b3b3b3b4956626c717575757575726d62564a3b3b3b3b3b3b3b3b3b3b3b3b3b3a38342e271e150b00000013202c3946535f6c7986929facada093867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000000000000000013202c3946535f6c7986929facada093867a6d6053474646464646464646464646464645454442403d3a39352f2c28231d17110a030000000000000000000000000a1724313d4a5764707d8a97a3b0a5988c7f7265594c3f31261e1c1f2028313b45515c6673808d99aab4aca09386796d6053463a2d20130700000714202c38444f5960636669666d6f71706b6054473d30262c2c2c2b2a222d38414d57626e7b88949faba3988b7e7265554c4135291d1104000005111d29343e485056586060606060606060606060606060606060606060606060606060606060606060606060605c5a544c42372c21150900000000000002070a0c0d131313131313120908060300000000060b0e10111313131313130f07060300000000000000000000000000000000000000000000000714202d3946525e6876828f9ca8b2ab9e9185796d60574d41382d2417110a02000000000000000000000002091019222935404b55606c7884919dabb0a69a8e8174665c5145382c1f13060000000815222e3b4754606a7884919ea9b1a79c8f82756c61574d453d36302d292427272723282c2e343a4145515b606d7a85929eaab0a69b8e8275675d5145392c1f1306000013202c3946535f6c7986929facada093867a6d6053473a34343434343434343434343434343434343434343434343434343434343434342f2e2b2620181006000000000714212d3a46535f6974808d97a1a99f948f837c75706d686967676666676768666d70747a818b919ba5a1968d8074685d5245392c20130700000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f000714212e3a4754616d7a87939393939393877b6e6154483b2e2115080000000000000000000000000000000000000000060c151d23282f35393c4247484b4e50515253535251504d4b4846423b39352f281f19130c04000000000000000000000000000000000000030b12181f252a3036393b4146474a4c4f50515253535252514f4e4b4846443f3837322c272118130c04000000000000000000000a1723303d4a5663707d8996abb5a6998d807366544a403428211e1a181f27303a44505a64707d8a97a2adafa396897c706356493d3023160a0000000000000013202c3946535f6c7986929facada093867a6d6053473a2d252525252525252525262724292c2f38424c56626f7b8896a1adaea399897c6f6256493c2f231609000000030c151d23282c2d2e2e2e2e2e2e2e2e2e2e2e313e4b5864717e82828282827f7265584c3f322e2e2e2e2e2e2e2e2e2e2e2d2c28231d150c0300000013202c3946535f6c7986929facada093867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000000000000000013202c3946535f6c7986929facada093867a6d605353535353535353535353535353535252514f4d4a4745413a38342e28231c150c0700000000000000000000000b1824313e4b5764717e8a97a4b0a4978a7d7164574a3e3124171012161f2834404b54626f7c8998a3aeaca09386796d6053463a2d201307000004101c27333d474f54565a545c6062646360594f44353638393939383734312f3c47535f6a76838f9ca9aa9c908376675d5145392c20130600000815212d3945505a62646c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c69655e54493d3125190d0000000000070d1316191a2020202020201f1515120f0a04040b11171a1d1e2020202020201c1312100b060000000000000000000000000000000000000000000814212e3b4754616e7a87939facafa3998c7f72675d51453b2f261b1206000000000000000000000000000000071018242f3944505b66727e8b99a3aeac9f9285796d6053463a2d2013080000000916222f3c4955626f7c8896a1acaca095897c6f625a50453b332a25201d191a1a1a181c1f23282f353f45515d67727f8b98a2aeac9f9286796d6053473a2d201406000013202c3946535f6c7986929facada093867a6d6053473a2d2727272727272727272727272727272727272727272727272727272727272722211f1b150e0600000000000815222e3b4855616e7b86929fa9a1978f82796e6a64615d565b5a5a595a5a545c6063686d747f8b939ea89f92867a6d6054473a2d21140700000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f000714212e3a4754616d7a86868686868686867b6e6154483b2e211508000000000000000000000000000000000000000810181e272e343a4145474d5355585b5d5e5f5f5f5e5e5d5a5754534d474540393129251e160e0500000000000000000000000000000000050c151c232830363a4146474d525457595c5d5e5f5f605f5f5e5c5a585553504947433d383229241d160d060000000000000000000915222f3c4855626f7b8899a3afa89b8f8275665c51443a322d2b2627272628323e4653606d7985929fabafa396897c706356493d3023160a0000000000000013202c3946535f6c7986929facada093867a6d6053473a2d201919191919191919191a191d20262f3a47535f6a7885919eabb5ab978b7e7164584b3e3125180b00000000030b12181c1f20212121212121212121212734404d5a6773808d8f8f8f8e8174685b4e41352821212121212121212121201f1c18120b030000000013202c3946535f6c7986929facada093867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000000000000000013202c3946535f6c7986929facada093867a6d606060606060606060606060606060605f5e5d5b595754514c46454039342e261e191009000000000000000000000b1825313e4b5864717e8b97a4b0a396897d7063564a3d3023170a060d18232e3a4653606d7986929facaca09386796d6053463a2d2013070000000b16212b353d44484a4d4b5153555756544f473e4143454646464543413e3a39424e5765727e8b98a7ac9f92867a6d6054473a2d21140600000a1724303d4956626c717979797979797979797979797979797979797979797979797979797979797979797979797570655a4d4135281b0f000000010a12191e2325262d2d2d2d2d2d2c22211f1b150e0e161d22272a2a2d2d2d2d2d2d29201f1c17110a02000000000000000000000000000000000000030f1b27333f495364717e8b9aa4afac9f92867a6e61554b4033291d140a000000000000000000000000000000000007121d28333f4a54616d7a86929facaea298897d706356493d2f24190d0100000d1a2633404d596673808c99a8b2aa9d9083776a6054483e332a211a14110d080d070c1013181d242935414c55606d7985929fabaea2988a7d7164574a3e2e23170b000013202c3946535f6c7986929facada093867a6d6053473a2d201a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1515120f0a04000000000004101c2934404b556673808c99a2a99e91857a6d675f5854524c4e4d4d4d4d4e4b5153565d606d75818e9ba9a2988b7e7164584b3e3125180b00000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f000713202d3946525e6876797979797979797976695e52463a2d20140700000000000000000000000000000000000009121a222a303940454c5254575f626567696b6c6c6c6b6a696764615e5753514b433e35302820170e050000000000000000000000000000050e171e272e343b42464c5254565e616366686a6b6b6c6c6c6b6a69676562605b53544e48443d352f281f180f0600000000000000000714202d3a4753606d7a86929facab9e9285796d60564c443d3a373134333332323845515c6675828f9ca8afa396897c706356493d3023160a0000000000000013202c3946535f6c7986929facada093867a6d6053473a2d20140c0c0c0c0c0c0c0c080d11141d2b37434e58697683909ca9b2a5988c7f7265594c3f3226190c000000000000070c1013131414141414141414141a2734404d5a6773808d9a9b9b8e8174685b4e4135281b1414141414141414141313100c0700000000000013202c3946535f6c7986929facada093867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000000000000000013202c3946535f6c7986929facada093867a6d6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6b6a686664605d5553514b443f38302b221b120a0100000000000000000b1825323e4b5865717e8b98a4afa296897c6f6356493c302316090007131f2c3845515c667683909da9aca09386796d6053463a2d201307000000050f1a232b33383c3d40404546484a494845474a4d505152535252504e4b4746414754616e7a8795a0aca3998a7d7064574a3d2e23170b00000b1825313e4b5864717e8686868686868686868686868686868686868686868686868686868686868686868686868275695c4f4236291c0f0000000a131c242a2f3233393939393939392f2e2b2620181720272e333637393939393939352d2b28231c140c02000000000000000000000000000000000005121f2b3744505b6575818e9bacb6a99c8f8276685e5243392f21170b020000000000000000000000000000000000010b17222d3846525d6875828f9ca8b4aa9a8d807367564c4135291d11040005111e2a36424d576976838f9ca9b5ab998c7f7366584e43362c21180f0905010000000004070c1319242f3a45515d6774818e9aa7b4aa9b8e817468544a3f34281c10030013202c3946535f6c7986929facada093867a6d6053473a2d20140d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d090806030000000000000006131f2c3845515c6777848f929797988b7f72685d554e4746414141404040414045464c525b626f7c8897a2aa9b8e8174685b4e4135281b0e02000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f0005111d2a36414c565e6c6c6c6c6c6c6c6c6c6c5e574d42362a1e1205000000000000000000000000000000000009121a242c343c434b51565d6066696e7174767878797978777674716e6965605d555046413a322920170e05000000000000000000000000050e172029303940444d52565e6165686e70737577777879797978777674726f6c65626058544f45413a312a21180f060000000000000006131f2c3945515d677783909dabada1978a7e71685e564f484742424140403f3f3f404b546673808c99a6afa396897c706356493d3023160a0000000000000013202c3946535f6c7986929facada093867a6d6053473a2d201407000000000000000001040b1b2631424f5c6875828f9ba8b2a6998c7f7366594c403326190d000000000000000004060708080808080808080d1a2734404d5a6773808d9aa69b8e8174685b4e4135281b0e0808080808080808070604000000000000000013202c3946535f6c7986929facada093867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000000000000000013202c3946535f6c7986929facada093867979797979797979797979797979797979797878777573706d6764605c54504a423d342d241c130a01000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f2316090004101c2834404b546875828f9ba8aca09386796d6053463a2d2013070000000008111a21272c2f302e34383a3c43474b5154575a5c5e5f5f5f5e5d5a5854524c48525e687784919daaab9a8d807467544a3f34281c1003000b1825313e4b5864717e8b939393939393939393939393939393939393939393939393939393939393939393938f8275695c4f4236291c0f000007121c252e353b3f40464646464646453c3a37312a22202932393f4344464646464646423a38342e261e140a00000000000000000000000000000000000613202d394653606c7885929eabb3a9988b7f7265564c4131271d0f050000000000000000000000000000000000000006111c2935414c5665727f8b98aab4aa9d918477685d5245392c201306000714202d3a46525e697885929eabafa399897c6f6256493d32231a0f060000000000000000000108131e2935404b5564707d8a97a9b3aa9d908377665c5044382b1f12060013202c3946535f6c7986929facada093867a6d6053473a2d2014070101010101010101010101010101010101010101010101010101010100000000000000000000000714202d3a4753606d79808285878a8c86796d60564c433c393530343333342e34383a4147535f6a7885929fa99d9083766a5d5043372a1d1004000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f00010d1925303a444c525f60606060606060605f524d453b30251a0e020000000000000000000000000000000007111a242c363e464e555c60686d72777b7e818384858686858483807e7b76716d67615a524c443b332920170b0200000000000000000000040d172029323b424a51575e61686d72777a7d7f82838485868685858482817e7b78746f6a636059514b433b332a21180d0400000000000004101d2935404b5566737f8c99a3aea99e91847a6d68615955534d4f4e4d4c4c4c4b4b4c5865727f8b98a5afa396897c706356493d3023160a0000000000000013202c3946535f6c7986929facada093867a6d6053473a2d201407000000000000000001040a1b2835424e5b6875818e9ba8b2a5988b7f7265584c3f3225190c000000000000000000000000000000000000010d1a2734404d5a6773808d9aa69b8e8174685b4e4135281b0e0200000000000000000000000000000000000013202c3946535f6c7986929facada093867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000000000000000013202c3946535f6c7986929facb9a2958b86868686868686868686868686868686868685858482807d7a76716d66605c544e463f372e251c1309000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000c18232e414e5b6874818e9ba7aca09386796d6053463a2d2013070000000000080f161c2022232a313a41454e53555d606467696b6c6c6c6b6a6764615d56544f566774818d9aa7a99c908376665c5044382b1f1206000b1825313e4b5864717e8b979f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9c8f8275695c4f4236291c0f00020d19242e3740474b4d535353535353524847433c342a21323b444a4f515353535353534f46443f3830261c1106000000000000000000000000000000000815222e3b4855616e7b8897a1adada197887b6e6255483b3022150b0000000000000000000000000000000000000000000d1924303c4855626f7b8898a2aeaca095877a6d6054473a2d211407000814212e3b4754616e7b8797a2adac9f92867a6d6053473a2d2014070000000000000000000000010d18242f3b4754616e7a8797a1adac9f9286796d6053463a2d2013070013202c3946535f6c7986929facada093867a6d6053473a2d20140700000000000000000000000000000000000000000000000000000000000000000000000000000006131f2c3845515c676d7376787b7d807f73675d51443a312d29242727262723282c3037434e586a7784919daa9e9184776b5e5144382b1e1105000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f000008131e28323a41465353535353535353534846423b33291f140900000000000000000000000000000000050e19232c363e4850585f676d737a7f84888b8e90919292929191908d8a87837e79716c615e564d453b32291d140a000000000000000000010c161f29323b444c545c60696e757a7f83878a8c8f90919292939292918f8d8b8885817c76706b605d554d453c332a20160c010000000000000c18242f3b4854616e7b86929fa8ada19690827a706b65615f575c5a5a5959585858585865717e8b98a4afa396897c706356493d3023160a0000000000000013202c3946535f6c7986929facada093867a6d6053473a2d20140a0a0a0a0a0a0a0b070d10141b2a36414c566976828f9ca9b4aa978a7e7164574b3e3124180b000000000000000000000000000000000000010d1a2734404d5a6773808d9aa69b8e8174685b4e4135281b0e0200000000000000000000000000000000000013202c3946535f6c7986929facada093867a6d6053473a2d20140b0b0b0b0b0b0b0b0b0a0a0907060401000000000000000000000000000000000000000000000013202c3946535f6c7986929facb9a79d959393939393939393939393939393939399939291908e8c8a86837e79726d666058514940372e251b10070000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f2316090000071a2734404d5a6773808d9aa6aca09386796d6053463a2d201307000000000000050b1019232b343c434c52585f62676d71747678797979787674716d686360595865717e8b98a4ac9f9285796d6053463a2d201307000b1825313e4b5864717e8b97a4a5a5a5a5a5a5a5a5a5a5a5a7a9aeacacacafa9a7a5a5a5a5a5a5a5a5a5a5a59c8f8275695c4f4236291c0f0007131e2a3540495257596060606060605f55534e463c332939444d555b5d6060606060605c53504a42382e2317130a0000000000000000000000000000000a1724303d4a5763707d8a96a9b3ab9e928578695f53473a2e2114030000000000000000000000000000000000000000000813202d394653606c7985929facb1a795897c6f6256493c2f231609000916232f3c4956626f7c8995a9b3aa9e918477675d5145382c1f13060000000000000000000000000714202d3946525e687885919eabaea398887b6e6255483b2f2215080013202c3946535f6c7986929facada093867a6d6053473a2d20140c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c07060401000000000000000000000004101c2934404b555c606769696e7073736d63554b403228201d191a1a1e21262b30363e46525e697885919eab9e9184786b5e5145382b1e1205000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f00000c17232e38424a5053555555555555555553514a42392e23180c000000000000000000000000000000020d17202b353e48505a616a6f797f868c9195989a9c9e9f9f9f9e9d9c9a9795908b857e766d685e574d443b2f261b1106000000000000000007121d28313b444d565e666d727b81868c909596999b9d9e9e9f9f9f9e9d9c9a9897918d89837d746d675f574d453c32281e13080000000000000714202d3a46525e6974808d96a1a9a89f9590847d77726e696a6867666665656565646465717e8b98a4afa396897c706356493d3023160a0000000000000013202c3946535f6c7986929facada093867a6d6053473a2d2016161616161616171718181d20262d3946525e687784909daaaea298897c6f6356493c30231609000000000000000000000000000000000000010d1a2734404d5a6773808d9aa69b8e8174685b4e4135281b0e0200000000000000000000000000000000000013202c3946535f6c7986929facada093867a6d6053473a2d20181818181818181818171716151413110d080705020000000000000000000000000000000000000013202c3946535f6c7986929facb9afa7a2a09f9f9f9f9f9f9f9f9f9f9f9f9f9f9fa49f9f9e9d9b9999928f8b857f786f6a625b514940372d22190c0300000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000000000000050e19222b353d464e565d606a6f747a7d8083848586858583817e7a76706b625f626f7c8995aaaea298887b6e6255483b2f221508000b1825313e4b5864717e8b979898989898989898989898989a9da4aebaafa59d9a9898989898989898989898988f8275695c4f4236291c0f000a16232f3b47525b63666c6c6c6c6c6c6c625f584e453b323f4a555f676a6c6c6c6c6c6c68605c544a3f3428251c120900000000000000000000000000000c1926323f4c5965727f8c98a5b2a99c8f837669574d42372b1e120600000000000000000000000000000000000000000006121f2b3844505b667783909daab1a4978b7e7164584b3e3125180b000a1723303d4a5663707d8996a3b0a99c90837669554b4035291d100400000000000000000000000005111e2a36414c566a7683909da9b4aa96897c6f6356493c302316090013202c3946535f6c7986929facada093867a6d6053473a2d2019191919191919191919191919191919191919191919191919191413110d0701000000000000000000000c18232f39434b51535a575e61646666635b5143392f20191d2021262b2e31373a41464f59616e7b8796a1aa9d9083776a5d5044372a1d1104000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f0003101c28343f4a545c606262626262626262605c544a4034281c1004000000000000000000000000000008141e29323d47505a616c717c848c92989da0a7a7a7a4a3a2a1a2a4a6a7a79f9d97918a827a6e695e564c41382d22170b01000000000000010d18242f39434d565e686e787f868e92999da0a7a6a8a7a5a4a3a3a4a5a7a9a7a9a19e9a94908981796e695f574d443a2f24190d04000000000005121e2a36424d57606d79849197a1a9a79f969189837f7b78767574737372727271717171717e8b98a4afa396897c706356493d3023160a0000000000000013202c3946535f6c7986929facada093867a6d6053473a2d232323232323232324242524292c2f38404b55616e7a86939facac9f9285796d6053463a2d201307000000000000000004060708080808080808080d1a2734404d5a6773808d9aa69b8e8174685b4e4135281b0e0808080808080808070604000000000000000013202c3946535f6c7986929facada093867a6d6053473a2d242424242424242424242424232221201d191514120e0903000000000000000000000000000000000013202c3946535f6c7986929facb9b3a9a19e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9fa2aaa2a5a8aba39f9c97928c837c726d635b51493f342b1e150b00000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d2013070000000000020c17202b343d474f585f686d747c81868a8d8f9192929291908d8b86827d766f6a616d7a8798a2aeaa968a7d7063574a3d3024170a000b1825313e4b5864717e8b8b8b8b8b8b8b8b8b8b8b8b8b8b8d929da9b5a99d938e8b8b8b8b8b8b8b8b8b8b8b8b8b8275695c4f4236291c0f000c1925323f4b57636d73797979797979786f6a5f574d443a434f5b677177797979797979756d665c504440372d241b1108000000000000000000000000000e1b2834414e5b6774818e9aa7b3a79a8d8074675a4d4131261a0e02000000000000000000000000000000000000000000030f1c28333f4a546875818e9ba8b3a6998d8073665a4d4033271a0d000b1724313e4a5764717d8a97a4b0a89b8f8275685c4f422f24180c00000000000000000000000000010d192530424f5c6875828f9ba8b0a3968a7d7063574a3d3024170a0013202c3946535f6c7986929facada093867a6d6053473a2d26262626262626262626262626262626262626262626262626262621201d18130c0400000000000000000007121d2731394045474d4d535457595957514940312720252a2d2e31373a3c42464c5259616b73808d99a9aa9b8e8175685b4f4235281c0f02000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f0006121f2c3844505c666d6f6f6f6f6f6f6f6f6d665c5144382c1f120600000000000000000000000000020b1925303b444f59616c717e8691969fa2aaa9a19e9b9796959595979a9ea1a8a9a19e948f837b6e685e53493f33271e130800000000000004101d2935404b555e696e7a838c92989fa3ababa39f9d9a9897969697989a9d9fa3ababa69f9c938e847b6e695f564c41352921160a0000000000020e1a25303b45515d676f7c8591979ea5a8a09e95908b8885838281807f7f7f7e7e7e7e7d7d808d9aa7afa396897c706356493d3023160a0000000000000013202c3946535f6c7986929facada093867a6d6053473a3030303030303030303031312f35393c4149515d67727e8b99a4afa79c8f8275665c5145382c1f1306000000000000070c1013131414141414141414141a2734404d5a6773808d9aa69b8e8174685b4e4135281b1414141414141414141313100c0700000000000013202c3946535f6c7986929facada093867a6d6053473a31313131313131313131313131302f2d2c292422211e1a14100b0600000000000000000000000000000013202c3946535f6c7986929facb9ada1979292929292929292929292929292929292989495989b9fa3aaa9a19e9591877f736d635b51463c30271d1207000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000000000008131e29323d464f59606a6f7a81878e92989a9c9e9f9f9f9e9d9a99928f89837c726d687885929faba5988b7f7265584c3f3225190c000815222f3b4855626e7c7f7f7f7f7f7f7f7f7f7f7f7f7f7f808d9aa7b4a79a8e807f7f7f7f7f7f7f7f7f7f7f7f7f7d7063574a3d3024170a000d1a2633404d59667380868686868686857c6f695e564c4344515d6a778386868686868682786d605c52493f362d231a1107000000000000000000000000101c2936434f5c6976828f9ca9b2a5998c7f7266594c3f3326190900000000000000000000000000000000000000000000000b17222d404d5a6773808d9aa6b3a89b8e8175685b4f4235281c0f000b1825313e4b5864717e8b97a4b1a89b8e8275685b4f4235281c070000000000000000000000000000081b2835414e5b6874818e9ba7b0a4978a7d7164574a3e3124170b0013202c3946535f6c7986929facada093867a6d6053473a333333333333333333333333333333333333333333333333333333332d2c29241d160d040000000000000000010b151f272f34383a404246484a4d4c4b464037292c2d3036393a3e4247484d53565e616b707d87929faca2988b7e7265584b3f3225180c00000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f000713202d3a4653606d787c7c7c7c7c7c7c7c786d6053463a2d201307000000000000000000000000000a141d2a36414c56606b717e879298a0a8a8a19e97928e8b898888898a8d91969ea1a8a69f9591847a6e655b50443a2f24190d0000000000050f1a232c3945515d676e7b8490959fa2aaa9a19e9992908d8b8a89898a8b8d9092999ea1a9aba59e9691847b6e685d52453d32271b0f03000000000009141f2935414b555f6a6f7c858f939c9fa4a79f9d989892908f8d8d8c8c8b8b8b8b8a8a8a8d929da9afa396897c706356493d3023160a0000000000000013202c3946535f6c7986929facada093867a6d6053473d3d3d3d3d3d3d3d3d3d3d3e3e3f4045474e535b606d7984919eababa0958a7d7164544b4034281c100400000000030b12181c1f20212121212121212121212734404d5a6773808d9aa69b8e8174685b4e41352821212121212121212121201f1c18120b030000000013202c3946535f6c7986929facada093867a6d6053473e3e3e3e3e3e3e3e3e3e3e3e3e3d3d3c3a39352f2e2d2a261f1c17110a020000000000000000000000000013202c3946535f6c7986929facb8ab9e9285858585858585858585858585858585858687898b8e92989fa2aaa7a099928b7f736d62584e43392e23180c000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d20130700000000010d1925303a444e58606b707c848e939a9fa2aaa9a8a4aba39fa3aba39f9c9490877f746d7784919daaa69a8d8073675a4d4034271a0d000814212e3a47535f6a6e72727272727272727272727272727d8a96a3b0a3978a7d72727272727272727272727272706b6155483c2f231609000a1623303d495663707d87929a93939791847b6e685e554b424d5a6774808d93939393938e81746e635b51483f352c231910060000000000000000000000101d2a3643505d697683909ca9b1a4978a7e7164574b3e3124180b0000000000000000000000000000000000000000000000061926323f4c5965727f8c98a5b2a89c8f8275695c4f4236291c0f000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2834414e5b6774818e9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d6053473f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3a39352f281f160c010000000000000000030d151d23292c2d31363a3b3d40403e3b352f35393a3d4146474a4d5355575f61686d747d869299a3a79f92867a6d6154473a2e21140700000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f000714212e3a4754616d7a87888888888888877b6e6154483b2e21150800000000000000000000000006111b262f3846525e68707d879299a3aaa49d96918a85817e7d7b7b7c7d80848a91969fa7a7a0968f82776c60564c4135291c1106000000000b16212c38444f59606d798390969fa7aea59d97918c8683817e7d7d7d7d7e8083868c91979ea5ada8a09691847a6d60594f43382c1f14090000000000020d18242f3a434e585f6a6f7a82898f93999c9fa2aaa29f9d9b9a999998989898979797979a9da4aeafa396897c706356493d3023160a0000000000000013202c3946535f6c7986929facada093867a6d605349494949494949494949494a4a4b4c4b5153585f656c74808d96a1aca4999083786c605346392e23180c00000000030c151d23282c2d2e2e2e2e2e2e2e2e2e2e2e34404d5a6773808d9aa69b8e8174685b4e41352e2e2e2e2e2e2e2e2e2e2e2d2c28231d150c0300000013202c3946535f6c7986929facada093867a6d60534b4b4b4b4b4b4b4b4b4b4b4b4b4a4a49484745413f3b3a36312b28231c140c0701000000000000000000000013202c3946535f6c7986929facada093867978787878787878787878787878787878797a7c7f82868c92989fa7aba39f918b7f726a60554b4034281d12070000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d2013070000000005111d2a36414c56606a707d8691969fa4acaaa29f9b979599929994979a9e9f99928c81787683909ca9a79b8e8174685b4e4135281b0e0006121e2b37424e575f6265656565656565656565656565707d8a96a3b0a3978a7d706565656565656565656565656361594f44382c201407000916222f3b4854606b717e88939fa4a19691847a6d675d544a4653606c78818e949fa69d938d80736d635a50473e352b22180f0600000000000000000000111e2a3744515d6a7783909daab0a3968a7d7063574a3d3024170a00000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4b1a99c908376695d5043362a1d10000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d60534c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4745413a31281d1307000000000000000000030b12181c1f20252a2d2e3133332f34383a4045474a4c525457575f6265696e737a81889298a2a8a0958d8073685d5246392d20130700000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f000714212e3a4754616d7a87949595959594877b6e6154483b2e2115080000000000000000000000000b17222d38414f59616e7a859299a3aba49c928d847e787471706f6e6f7173787d8490959fa8a89f948c7f72685d5245382d22170b00000004101c27333c4854606b74818e95a0a8ada39c938e857f7b777472717070717274777a7f858e939ca4ada9a0968e81746b6054483b31251a0e02000000000007131d28313c464e585f686d757c82878b8f929897999a9b9c9d9d9d9e9e9e9e9f9f9f9fa3abacb5afa396897c706356493d3023160a0000000000000013202c3946535f6c7986929facada093867a6d6056565656565656565656565657575859555d60646a6f77808d929da8a59f93877d70655b5044372b1d1207000000000b151e272e34383a3b3b3b3b3b3b3b3b3b3b3b3b404d5a6773808d9aa69b8e8174685b4e413b3b3b3b3b3b3b3b3b3b3b3b3a38342e271e150b00000013202c3946535f6c7986929facada093867a6d6057575757575757575757575757575757565554514c4c4846423b38342e261e18120b030000000000000000000013202c3946535f6c7986929facada093867a6d6b6b6b6b6b6b6b6b6b6b6b6b6b6b666d6d6f72757a808590959fa6aea49f92877c6f675c5145392e23180c0000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000000040f19232d3946525e686f7c869298a1a8aba39f98928e8a88878686888a8e92979f9f938d8075828f9ba8a89c8f8275695c4f4236291c0f00020e1a26313c454e535558585858585858585858585863707d8a96a3b0a3978a7d7064585858585858585858585857554f473e33281c1004000713202c38444f59616c727f8b929ca5a0969083796d665c5349505b666d78828f959fa59c928c7f726c625a50473d342a21180e05000000000000000000111e2b3844515e6b7784919eaaafa396897c706356493d3023160a00000000000000000000000000000000000000000000000b1824313e4b5764717e8a97a4b1aa9d9083776a5d5044372a1d11000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d605959595959595959595959595959595959595959595959595959595959595954514b433a2f24180d0100000000000000000001070c1013141a1e2124293036394045474b515357565e616467696e72767b80858d939aa2a79f969183796d60564c4135291d110500000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f000714212e3a4754616d7a8794a0a2a2a194877b6e6154483b2e2115080000000000000000000000030f1b27333f4953616b75828f97a1aba49c918c8079716c66646362626264666c707a839096a0aca69f92857a6d60544a3f33281c0f0300000714202c38444f5963707d89939ea7aea49c918c817a726e686765646363646567686e737a818c919ca5afa89e93897c6f63574d42362a1e12050000000000010c161f2a343c464e565e616b6f757b7f8285888a8c8d8f8f9090919191919292929292999ba3acafa396897c706356493d3023160a0000000000000013202c3946535f6c7986929facada093867a6d636363636363636363636363636364646668676d71757c828d929da4a49f938c7f726b6053493f33271b0b0000000007121d273039404546474747474747474747474747474d5a6773808d9aa69b8e8174685b4e474747474747474747474747474645403930271d1207000013202c3946535f6c7986929facada093867a6d64646464646464646464646464646464646362605d555855534d46443f383029231d150d0500000000000000000013202c3946535f6c7986929facada093867a6d605f5f5f5f5f5f5f5f5f5f5f5f5f5c60616265686d737b838f949fa7afa3999183796d60544b4034281c100400000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d2013070000000a16212c38444f59616d7a849198a2aaaaa299928d85817d7b7a79797b7d81858b92979d928a7e818e9ba7a99d9083766a5d5043372a1d1000000915202a333c4247484c4c4c4c4c4c4c4c4c4c4c5763707d8a96a3b0a3978a7d7064574c4c4c4c4c4c4c4c4c4c4a48443e352c21160b000004101c27323d47505a626d73808c929da59f958f82786d655b504a545c666d79839096a0a49c918b7e716c61594f463c332a20170d040000000000000000121f2b3845525e6b7885919eabafa296897c6f6356493c3023160900000000000000000000000000000000000000000000000a1724313d4a5764707d8a97a3b0aa9e9184776b5e5144382b1e11000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d6666666666666666666666666666666666666666666666666666666666666666605d554b4135291d1104000000000000000000000000040610181f272f353b41464b5153555d606467686d7174777b7f83888d92989fa4a39f9590847b6e675d51443a3024190d0100000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f000714212e3a4754616d7a8794a0adaea194877b6e6154483b2e211508000000000000000000000005121f2b3744505b65707d8a939ea9a79d928c7f746d67605b5456555556545b60686d7984919da6aea2988c7f72665b5044382b1f120600000916222f3c4854606b7783909da5afa89d928c7f746d68615e56585756565758565e61686d747f8c939da9afa59c8f8276695e53463a2d211407000000000000040d18222a343c444c52596063696e7276797b7d7f81828383848484848585858585868b909ba7afa396897c706356493d3023160a0000000000000013202c3946535f6c7986929facada093867970707070707070707070707070707071717274767a7d82878f949da4a099938c80746d63594f41382d22170b000000000c18232e39424b515354545454545454545454545454545a6773808d9aa69b8e8174685b545454545454545454545454545453514b43392e23180c000013202c3946535f6c7986929facada0938679717171717171717171717171717171717170706f6d676865615f5753504a423d342f271f170e05000000000000000013202c3946535f6c7986929facada093867a6d605352525252525252525252524a50535456565e61696e78828f95a0acaba0958b7f72665c5145382c1f130600000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d2013070000030f1b27323c4855606b75818e96a1aaaaa2989287807a75716e6d676d6e7074797f858f949e9185818e9ba8aa9d9084776a5d5144372a1e110000030e18212a31373a3b3f3f3f3f3f3f3f3f3f3f4a5763707d8a96a3b0a3978a7d7064574a3f3f3f3f3f3f3f3f3f3d3c38332c231a10050000000b16212b353e48515b636e74808e939ea69f948e81776c605b514b545d676d7a849196a1a39f92877e706b60584e453b322920160d0300000000000000121f2b3845525e6b7884919eabafa296897c6f6356493c3023160900000000000000000000000000000000000000000000000b1724313e4a5764717d8a97a4b0aa9d9184776a5e5144372b1e11000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada09386797272727272727272727272727272727272727272727272727272727272727272726d675d5145392c201306000000000000000000000000071019222a313940454d52555c6064676d7074777a7d8184888c90959a9fa2a39f98928c837b6e695e554b4032281e13080000000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f000714212e3a4754616d7a8794a0adaea194877b6e6154483b2e21150800000000000000000000000613202d394653606c7883909da6aca0958d80736d605c55504a4a4848494a50565d676f7d89949facaa9e9185786c605346392d2013060004101c2834404b5463707d8995a0acaca0968d80736d605d56524d4b4a4a4a4a4b4c52565d606d74818e97a2adab9f94877b6e6154483b2e211507000000000000050e171e252a323a41464f54575e6165666d6f717374757676777777787878787879797e8b98a4afa396897c706356493d3023160a0000000000000013202c3946535f6c7986929facb0a396897d7c7c7c7c7c7c7c7c7c7c7c7c7c7c7d7d7e7f8183868a8e93999f9f9d9590877f746e645b51473d2f261b110600000004101c2834404b545c606161616161616161616161616161616773808d9aa69b8e817468616161616161616161616161616161605c554b4034281c10040013202c3946535f6c7986929facb1a4978b7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7d7d7c7b7a7875726e6964605c544f454039312920170e050000000000000013202c3946535f6c7986929facada093867a6d605347454545454545454545453f444647494c52575f666d7a83919da6b0a79e9184796d6053463a2d20130900000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000007131f2c38444f5963707d89939ea8aea29892867d746d686462605d606164676d727a828e93979185929facaa9e9184776b5e5144382b1e11000000060f1820262b2e2f3232323232323232323d4a5763707d8a96a3b0a3978a7d7064574a3d3232323232323232302f2c28211a110800000000050f19232c363f49525c606c78818f949fa69e938d80746d635a504b555e686e7b849197a2a39992867d706a5f574d443b32281f150c03000000000000111e2b3844515e6b7784919eaab0a396897d7063564a3d3023170a00000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1a99d9083766a5d5043372a1d10000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facb2a6998c7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f796d6054473a2d2114070000000000000000000000061019232b343c434b51565e61676d71757a7d8084868a8d9196989d9fa7aba399928e867f796e695e574d43392f20160c020000000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f000714212e3a4754616d7a8794a0acaca194877b6e6154483b2e2115080000000000000000000005111e2a36424d5763707d8a95a0aca69d9083786d605b514b443f3d3c3b3c3f444c55606b7683909c9f9e9d97897c6f6256493c2f2316090006131f2c3845515c6675818e9ba7b1a99e9184796d605b524c46413f3e3d3d3e3f41464c525b606d7a85929fabb0a6988c7f7265594c3f2f24180d0100000000020c1720293036393a3e3f44484d5354545c606264666768696a6a6a6b6b6b6b6c6c6c717e8b98a4afa396897c706356493d3023160a0000000000000013202c3946535f6c7986929facb9a5998f8989898989898989898989898989898a8a8b8c8e9092989b9e9c9995908a837d726d645c53493f352b1d140a0000000006131f2c3845515c666d6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e73808d9aa69b8e81746e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6d675c5145382c1f13060013202c3946535f6c7986929facb9a69a908b8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a89888784827f7b76716d666059514b433a322920160c0300000000000013202c3946535f6c7986929facada093867a6d6053473a38383838383838382e34383a3a3c41464d545d686f7c89949eaaada1968a7d7064574a3d31251a0e02000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d20130700000915222f3b4854606b7683909da5afa69f92867d706b605d565554515355555d60686d78818e94989298a2aeab9e9184786b5e5145382b1e1200000000060e151a1e21222525252525252525303d4a5763707d8a96a3b0a3978a7d7064574a3d31252525252525252423201c16100800000000000007111a242d374044505b666d79828f95a0a59d928c7f726c625a504c565e696e7c859298a2a39892867c6f695f564d443a31271e150b020000000000111e2a3744515d6a7784909daab0a3978a7d7064574a3d3124170a00000000000000000000000000000000000000000000000c1825323f4b5865727e8b98a5b1a99c8f8276695c504336291d10000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facb9a89c918c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c877b6e6154483b2e21150800000000000000000000030c18222b353d464e555d60686e73797e82868a8d90939a9a9ea0a8a9abb1ac9f9287817b736d665e574d453b31271d0e04000000000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f000714212e3a4754616d7a87949f9f9f9f94877b6e6154483b2e211508000000000000000000000714202d3a46525e6976828f9ca7ab9f94897d70665c50454039332d2f2f2d333a434f5964717e8b989291908f8c7f7366594c403326190d000713202d3a4653606d7985929facada1978a7e71675d5145413a36303130303130363a4145525d68737f8c99a9b3a89c8f827569554b4035291d10040000000008131e29323a4146474b4c4d4e4f51524a50535557595a5c5c5d5d5e5e5e5e5f5f5f65717e8b98a4afa396897c706356493d3023160a0000000000000013202c3946535f6c7986929facb9aba199969696969696969696969696969696969797999b9d9f9e96918f8c88837e78706b625b534a41372e23190b02000000000713202d3a4653606d797a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a808d9aa79b8e817a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a796d6053463a2d2013070013202c3946535f6c7986929facb9aca29a97979797979797979797979797979797979797969596918f8b88837e78706b605c554c443a32281e150a00000000000013202c3946535f6c7986929facada093867a6d6053473a2d2c2c2c2c2c2c2c23282b2d2e30363b424c56606b75828f9cabb2a89b8e817568574d42362a1e1205000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d20130700030f1c28333f4a54636f7c89959fabab9f948b7e716a6059524c48474546484b51565e666d788290989fa2aab4ab9e9185786b5e5245382b1f12000000000003090e1214151919191919191924303d4a5763707d8a96a3b0a3978a7d7064574a3d3124191919191919171614100b05000000000000000008121b2528333f4a545c676d79839096a0a49c918b7e716c61594f4d575f6a6f7d869299a3a29891857b6e685e564c433930261d140a0000000000101d2a3643505d697683909ca9b1a5988b7e7265584b3f3225180700000000000000000000000000000000000000000000000d1a2633404d596673808c99a6b3a89b8f8275685c4f4235291c0f000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facb9ada39c999999999999999999999999999999999999999999999999999999999999999994877b6e6154483b2e211508000000000000000000000b151e2a343d474f585f676d737b80858a8f92989a9d9fa4a39f9fa4aba4a7a79a8d807b756f6a605c544a42382e23170c03000000000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f000714212e3a4754616d7a87939393939393877b6e6154483b2e211508000000000000000205070814212e3b4754616e7b87939facaa9c9083766b60544a3f342f282222222228313d4855616e7b878685848483817f7265584b3f3225180c00091623303c4956636f7c8998a2a5a69e9285796d60554b40352f2a2524232324252a2f35414c56626f7c8897a1adab9e918578675d5145392c201306000000010d1925303a444c525457595a5b5c5d5e5b5953484a4c4e4f5050515151515252525965727f8c98a5afa396897c706356493d3023160a0000000000000013202c3946535f6c7986929facb9b3aba5a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a4a4a5a7a99e948f84827f7b76716c656059514941382f251c110700000000000a1723303d4a5663707d87878787878787878787878787878787878d929da99e938e87878787878787878787878787878787877e7164574a3e3124170b0013202c3946535f6c7986929facb9b4aca6a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a3a3a8a19e9b9894908a847d746d675e564c443a30261c1106000000000013202c3946535f6c7986929facada093867a6d6053473a2d201f1f1f1f1f1f171c1f2021252a303a434f5964707d8a99a3afab9e928578695e53463a2d211407000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d2013070006121f2b3844505b6674818e9ba7b1a79c8f82766c62584f45413b3a393a3b40454c545c666e7b86929facb4b7ab9e9184786b5e5145382b1e1200000000000000020608080c0c0c0c0c0c1724303d4a5763707d8a96a3b0a3978a7d7064574a3d3124170c0c0c0c0c0a0907040000000000000000000000091317222d38424b555d676d7a849197a1a39f92877e706b60584e4e58606a707d87929aa4a19791847a6e685d554b42382f261b1106000000000f1c2835424f5b6875818e9ba8b3a6998c807366594d402f23180c00000000000000000000000000000000000000000000010e1b2834414e5b6774818e9aa7b4a79a8e8174675b4e4134281b0e000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facb9b5ada8a6a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a194877b6e6154483b2e21150800000000000000000007121c27303c464f59606a6f7980868d92979c9fa3a8a09e9a9992939995989b9f9d928d87827c736d665c544a3f34281e150a000000000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f000714212e3a4754616d7a86868686868686867b6e6154483b2e211508000000000002080e1114141d2935404b5565727f8c99a4aea2988a7e7164594f42382e231d17191917212d3a46535f69767b7a7978777675726d62564a3d3124180b000c1926333f4c5966727f8c969798999a8d8174665c5143392f241e1917171717191e24303a4653606c7985929eabada197867a6d6053473a2d20140700000005111d2a36414c565e6164656768696a6b68655d534840414243434444444545454d596673808c99a6afa295897c6f6256493c2f2316090000000000000013202c3946535f6c7986929facb9afa7a2a09f9f9f9f9f9f9f9f9f9f9f9f9fa0a1a2a4a6aaa89c8f827e7a736e6964605b534f473f372f261d130a0000000000000a1723303d4a5663707d89949494949494949494949494949494949a9da4aea59e9b949494949494949494949494949494948a7d7164574a3e3124170b0013202c3946535f6c7986929facb9afa7a2a09f9f9f9f9f9f9f9f9f9f9f9f9f9f9fa0a0a1a2a5a8aba8a69f9c95918981796d685e564c42382e23170c030000000013202c3946535f6c7986929facada093867a6d6053473a2d201412121212060b10121314191e28313d4754606d7a86929facada297877b6e6154483b2e211508000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000613202d394653606c7985929eabaca095897c6f635a50463d35302d2c2d2f353a424a545e6973808d9aa4afb7aa9e9184776b5e5144382b1e11000000000000000000000000000000000a1724303d4a5763707d8a96a3b0a3978a7d7064574a3d3124170a000000000000000000000000000000000000000006111c262f39434c555e686e7b859197a2a39992867d6f6a5f574d4e58616b717e88939fa4a09690837a6d675d544a41382d22170b060000000d1a2734404d5a6773808d9aa6b3a89b8e817568554b4034291c100400000000000000000000000000000000000000000005121e2a36424d576976838f9ca9b2a5988c7f7265594c3f3226190c000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facb9afa7a2a09f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f94877b6e6154483b2e2115080000000000000000000c18232e39424e58606b6f7c848c92989fa2a7a09d9996918d8a868687888b8e92989f9a948f8780786d665c50443e30261c11060000000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f000713202d3946525e6876797979797979797976695e52463a2d20140700000000050d14191e2021252c3845515d6776838f9cabac9f9285796d6053463d3026252525252525252a36424d575f696e6d676b6a696865625b51463a2e221509000e1b2835414e5b68748188898a8b8d8e8b7e7164544b4031271d130e080a0a080e131f2b3744505b657683909da9b3a994887b6e6155483b2e2215080000000713202d3946525e686d71727374767778756f65594d3d323536373737383835404b556774818e9aa7b2a995887b6e6255483b2f2215080000000000000013202c3946535f6c7986929facb9a79d95939393939393939393939393939393949597999d9f9e948f8a85807b726d605c544a42392e2318140b010000000000000a1723303d4a5663707d8996a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a7a9aeb6afaaa8a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1978a7d7164574a3e3124170b0013202c3946535f6c7986929facb9a79d959393939393939393939393939393939393949496989b9fa2a9aba7a09d938e837a6d685e544a3f342820150a0000000013202c3946535f6c7986929facada093867a6d6053473a2d2014070505050000030607080c16202c3945515d677783909daab3a9968a7d7063574a3d3024170a000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000916232f3c4956626f7c8997a2adaa9d9083776b6054483f34292421202024293039424d57616e7b87939facb7aa9d9184776a5e5144372b1e11000000000000000000000000000000000a1724303d4a5763707d8a96a3b0a3978a7d7064574a3d3124170a0000000000000000000000000000000000000000000a141d27303a434c565f696f7c859298a3a39892857c6f695e564c4f59616c727f8b929ca5a0959082796d665c53493f332722170c0000000c1925323f4c5865727f8b98abb5aa9d908477675c5145382c1f13060000000000000000000000000000000000000000000714212d3a46535f697885929fabb4aa968a7d7063574a3d3024170a000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facb9a79d95939393939393939393939393939393939393939393939393939393939393939393877b6e6154483b2e211508000000000000000004101c2834404a545f6a6f7d8691969fa2a69e9c95908c8884807d7a797a7c7e81858c92989e99938c81786d605a5042382e23170c0000000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f0005111d2a36414c565e6c6c6c6c6c6c6c6c6c6c5e574d42362a1e1205000000050e171f252a2d2e32323a4753606d7986929faca89b8e8275675c51453832323232323232323230313b454d575e61605d555d5c5b585651493f34291d1206000714212d3a4754606d7a7b7c7d7f8081827b6e6155483b2e22150b0100000000030f1b27333f49536975828f9ca8aea295887b6f6255483c2f2215090000000714212e3a4754616d7a7e7f8081828485817568584e43372e2c2823282c2f3945515d677783909daaada196877a6d6054473a2d2114070000000000000013202c3946535f6c7986929facb9a2958b86868686868686868686868686868787888a8d90959a9f9c98928d867e756d665c544a40342820160a000000000000000a1723303d4a5663707d89969f9f9f9f9f9f9f9f9f9f9f9f9f9f9fa6a8aeb6afa9a79f9f9f9f9f9f9f9f9f9f9f9f9f9f9f978a7d7164574a3e3124170b0013202c3946535f6c7986929facb9a2958b86868686868686868686868686868686868788898c8e92979da0a8aca59d9590837a6d665c50443c31261a0f0300000013202c3946535f6c7986929facada093867a6d6053473a2d20140700000000000000000004111d2935414c556975828f9ca8b1a4988b7e7165584b3e3225180b000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000c1925323f4c5865727f8b98a9b3ab998c7f7266594f43362d2219141313181e27303b46525e697683909da9b6aa9d9083776a5d5044372a1d11000000000000000000000000000000000a1724303d4a5763707d8a96a3b0a3978a7d7064574a3d3124170a000000000000000000000000000000000000000000020b151e28313a444d575f6a6f7d869299a3a29791847b6e685e554b505a626d73808d939da59f948f82786d655b50443e34281d11050000091623303c4956636f7c8999a4afac9f9286796d6053473a2d22170b0000000000000000000000000000000000000000000815222e3b4855616e7b8897a2adaea298887b6e6155483b2e221508000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facb9a2958b868686868686868686868686868686868686868686868686868686868686868686867b6e6154483b2e211508000000000000000006121f2c3844515c666f7c859298a0a8a19e948f89847f7b7774706d6c6d6f7174797f869195a09f938e81746c61544a3f34281c100300000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f00010d1925303a444c525f60606060606060605f524d453b30251a0e020000020d1720293036393b3f3f3f495663707c8998a3aeaa988b7e7265554b403f3f3f3f3f3f3f3f3f3f3d3c383b454d535453514b51504f4b4a463f372d23180d01000613202c3945515d676d6e7071727374756e695f53463a2d2114030101000205080f17222d424f5b6875828e9ba8b5ab95887b6e6255483b2f2215080000000815212e3b4854616e7b878c8d8e8f909184786a6054473f3a38342e34383a404b55606d7a86929facab9e918578675d5145392c2013060000000000000013202c3946535f6c7986929facada0938679797979797979797979797979797a7a7b7e8083888d9299a19f98928b81786d665c51443d32271b0f030000000000000a1723303d4a5663707d89939393939393939393939393939393939a9da4aea59d9b939393939393939393939393939393938a7d7164574a3e3124170b0013202c3946535f6c7986929facada0938679797979797979797979797979797979797a7b7c7f81858b91969fa4aca79f959082786d60584e43372b1f140900000013202c3946535f6c7986929facada093867a6d6053473a2d201407000000000000000000010d19242f414e5b6874818e9ba7b2a5988c7f7265594c3f3226190c000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000e1b2834414e5b6774818e9aa7afa399897c6f6356493d32231b100806070c151e2a36424d576774808d9aa7b3a99c8f8276695c4f4336291c10000000000000000000000000000000000a1724303d4a5763707d8a96a3b0a3978a7d7064574a3d3124170a00000000000000000000000000000000000000000000030c161f29323b454e58606b707e87929fa3a19691847a6d675d5145515b636e74818e939ea69e948e81776c605a5045392d21150800000714202d3a4753606d7a86939facaea399897d706353493f33271b0f030000000000000000000000000000000000000004111d2935414c5565717e8b98a9b3ac9f9285786d6053463a2d201307000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867979797979797979797979797979797979797979797979797979797979797979797976695e52463a2d20140700000000000000000713202d3a4653606d78839197a2a8a097928a827c77726e6967636060616265676d727b839196a19d938a7d70665c5044382c1f120600000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f000008131e28323a41465353535353535353534846423b33291f140900000008141f29323b4146474c4c4c4c5966727f8c99aaaea398887b6f62554c4c4c4c4c4c4c4c4c4c4c4c4948443d3b4246484745404443423f3d3a342d251b1106000004111d2935414c555d6062636465666869615f574d42362a1e120d0d0e090e121419212b37434e58697683909ca9aea399877a6d6154473a2e2114070000000714212d3a46535e697884919a9b9c9d96897c6f625a504a464440434044464b515c67717e8b98a3aeaa9b8f827568554b4135291d11040000000000000013202c3946535f6c7986929facada093867a6d6c6c6c6c6c6c6c6c6c6c666c6d6e6f7173777b80879196a1a29f938e81786d60584e43382b20150a0000000000000a1723303d4a5663707d86868686868686868686868686868686868d929da89d938e86868686868686868686868686868686867e7164574a3e3124170b0013202c3946535f6c7986929facada093867a6d6c6c6c6c6c6c6c6c6c6c6c6c6c666d6d6e6f7275797e848d939aa4afa79f948d80736a5f53473b31261a0e02000013202c3946535f6c7986929facada093867a6d6053473a2d20140700000000000000000000081b2734414e5a6774818d9aa7b2a6998c7f7366594c403326190d000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d20130700101d293643505c6976838f9ca9ac9f92867a6d6053473a2d201407000000030c1a25303f4b5865727e8b98a5b1a89b8e8275685b4f4235281c0f000000000000000000000000000000000a1724303d4a5763707d8a96a3b0a3978a7d7064574a3d3124170a0000000000000000000000000000000000000000000000040d172029333c464f59616c717e8b919ca4a0969083796d60534749525c606d78818f949fa69e938d80736c6156493d3024170a00000613202c3945515d677784909daab4ab9a8d8073655b5044372b1f140a000000000000000000000000000000000000010c13202c3945515d6775828e9ba8b5a89c8f8275665c5044382b1f1206000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c5e574d42362a1e12050000000000000006131f2b37434e5865727f8c95a0a9a09691857d766f6b66625f575753535455555d60696e7a84919ea59e9184786d6053463a2d20130800000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f000006111c2630383f444649494949494949494644403930271c12070000020e1925303b444d5254585858585b6875828e9ba8ac9f9286796d605858585858585858585858585856544f473d363a3b3a39352f363532312e29231b1309000000010d19242f3a434c5154555657585a5b5c55534d453b31261a1a1a1a1b1b1a1e21252a333b4754606a7884919eabac9f9286796c605346392d20130600000005121e2a36424d576774818e9aa6a9a89b8e81756c605c5453514a504a5153555d606d7983919daaaea2988b7e7165584b3e2f24180d010000000000000013202c3946535f6c7986929facada093867a6d606060606060606060605b606061626466696e747c849196a1a59e938d80736a6054473c31261a0f0200000000000916232f3c4855616b707979797979797979797979797979797979808d9aa69b8e817979797979797979797979797979797979716c6155493c3023170a0013202c3946535f6c7986929facada093867a6d606060606060606060606060605c6061616365676d71798088939fa5afa69f92877c6f62574d42362a1e1205000013202c3946535f6c7986929facada093867a6d6053473a2d20140700000000000000000004101c2834404a546875828e9ba8b2a5988c7f7265594c3f3226190c000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d20130700111e2b3744515e6a7784919daaab9e918578675d5145392c1f130600000000091724313e4a5764717d8a97a4b0a79a8d8174675a4e4134271b0e000000000000000000000000000000000a1724303d4a5763707d8a96a3b0a3978a7d7064574a3d3124170a000000000000000000000000000000000000000000000000050e17212a343d474f59626c727f8c929da89f958e8175685b4e4244505c666d79828f95a0a59d928b7e7164584b3e3125180b000004101d2935404b556773808d9aa9b3ab9e9184786c6053463c2f261b1106000000000000000000000000000000000007131d28333f4a54606d7a86929facb1a7988b7f7265544a3f34281c1003000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d60606060606060606060606060606060606060606060606060606060606060605f524d453b30251a0e02000000000000000815222e3b47545f6a7784919ea7a39891847b706b63605955534d4a474647484b51575e68707d8a96a1a1968a7e7164574b3e2f24190d01000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f00000c17232e38424a5053555555555555555553514a42392e23180c000005111e2a36414d565e6165656565656a7784909daaaa9d9083776665656565656565656565656565656360594f44382d2e2d2c292429282524221d181109010000000008131e28313a41454748494a4c4d4e4f4846423b332923272727272728252a2d30363c454e58626f7c8896a1adab9c908376655b5044372b1f1205000000020e1a25313c4855626f7c88949faaaa9e938a7e726d6662605c545d545c6062676d75808d95a0aca99f92867a6d6154473a2e211407000000000000000013202c3946535f6c7986929facada093867a6d6053535353535353534a505354545557575f616a6f7b84919ea7a59f92877c6f62584e43372b1f120600000000000714202c38444f5961636c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c73808d9aa69b8e81746c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c64615a5045392d2114080013202c3946535f6c7986929facada093867a6d6053535353535353535353534a5153545556555d60676d747f8c939daaaea3998e8275695f53463a2d211407000013202c3946535f6c7986929facada093867a6d6053473a2d2014070606000104060708090b141f2c3844515c667683909ca9b1a4988b7e7165584b3e3225180b000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d20130700121f2b3845525e6b7885919eabaa9d9084776a554b4035291d1004000000000b1824313e4b5764717e8a97a4b1a5998c7f7266594c3f3326190c000000000000000000000000000000000a1724303d4a5763707d8a96a3b0a3978a7d7064574a3d3124170a00000000000000000000000000000000000000000000000000060f18222b353e47505a636d74808d9aa7a79d9083766a5d50433f4a545c676d7a84909daaa4998c807366594d4033261a0d0000010d18242f3d495663707c8997a1adaca196897d7063584e41382d22170f06000000000000000000000000000000071118242f3844505b66717e8b98a2aeaca095887b6e6155483b2e23170b00000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d60535353535353535353535353535353535353535353535353535353535353534846423b33291f140900000000000000000916222f3c4955626f7c8896a0ac9f92867c6e696159544f4847423d3a393a3c40454d56606c7884919ea89b8f827568554c4135291d1104000000000000000000000000000000000408101d2a3643505d697683908f8275685c4f4235291c0f0003101c28343f4a545c606262626262626262605c544a4034281c1004000714202d3946525e686e7272727272727985929faca89b8e8275727272727272727272727272727272706b6054483c3126201f1d181d1c181815120d06000000000000010c161f282f35393a3b3d3e3f4041423b3a36312c2f3034343434343531363a3b41464e57606a74808d9aa8aea3998c7f726653493f33271b0f03000000000915212e3b47535f6a76828f98a2aea59f92877f78726f6d666a696a666d6f7379818d929da7aca2978d8074685d5246392d201307000000000000000013202c3946535f6c7986929facada093867a6d6053474646464646463f44464747484b4d53585f69707d8a959faba3998f82766a5f53473a2e211408000000000004101c27333d474f55566060606060606060606060606060606773808d9aa69b8e817468606060606060606060606060606060575550483e33281c11040013202c3946535f6c7986929facada093867a6d6053474646464646464646464044464748494b51555d606d74818e98a2aeab9f93877b6e6155483b2f24180d010013202c3946535f6c7986929facada093867a6d6053473a2d2014131313070d10131414151a1d27303a4653606d7985929fabb2a896897c706356493d3023160a000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d20130700121f2c3945525f6c7885929faba99c908376695d50432f24180c00000000000c1825323f4b5865727e8b98a5b5ab978a7e7164574a3e3124170b000000000000000000000000000000000a1724303d4a5763707d8a96a3b0a3978a7d7064574a3d3124170a0000000000000000000000000000000000000000000000000007101a232d373f44505c666d7983909da9a59d9083766a5d5043434c565e696f7c85929faca3998c807366594d4033261a0d0000000713202d3a4653606d7985929eacb2a89c8f82756a5f53493f332721180f0802000000000000000000000003091119232935404b55606c7884919daab3a99d908477695f53463a2d1c110600000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d60534746464646464646464646464646464646464646464646464646464646463b3a36302921170d0200000000000000000b1825323e4b5865717e8b98a8a79a8d81746a5f574f48443d3a37312d2d2e2f353b44505b6574818e9ba79e928578675d5145392c2013060000000000000000000000000000050c1114171d2a3643505d697683908f8275685c4f4235291c0f0006121f2c3844505c666d6f6f6f6f6f6f6f6f6d665c5144382c1f1206000814212e3b4754616e7a7f7f7f7f7f7f7f8c98a2aea99c8f827f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7d7063574e42372b1e13100c070f0c0b0906010000000000000000040d161e24292c2d2f3031323335362e2d2a32383b3d404040404141424246484c525860696f7c87929faca99f92867b6e6155483b2d22170b000000000006121f2b37434e58626f7c86929fa4aca399928b837f7b797777767777797c80858e939da4aea49a92857a6d61564c4135291d1105000000000000000013202c3946535f6c7986929facada093867a6d6053473a393939392d3338393a3b3c3e42464e57616c7683909da9ab9f94887b6e6255483b2f2215060000000000000b16212c353d44484a53535353535353535353535353535a6773808d9aa69b8e8174685b53535353535353535353535353534a49453e362c22170c000013202c3946535f6c7986929facada093867a6d6053473a393939393939392e34383a3a3b3c40454b515b616d7a86929facafa4998c7f7366554b4035291d10040013202c3946535f6c7986929facada093867a6d6053473a2d202020202020181d20202122252a2f39434d57636f7c8998a2aeaca196877b6e6154473b2e211408000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d20130700121f2c3945525f6c7885929faba99c908376695d50432f24180d01000000000c1926333f4c5966727f8c99a5afa399887c6f6255493c2f221609000000000000000000000000000000000a1724303d4a5763707d8a96a3b0a3978a7d7064574a3d3124170a000000000000000000000000000000000000000000000000060f19222c363f49525c606d78828f959fa69d938c807366594d424b555e686e7b859198a2a49a92867d706356493d3023160a00000006121f2c3844505c6673808d9aa4afaa9e94887c6f655b50443d332a2219140e09060400000100000406090e141a232b353d45515d67717e8a95a0acada2978b7e7265574d42362a1e0a0000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d6053473a393939393939393939393939393939393939393939393939393939392e2d2a251f170f050000000000000000000d192633404c5966737f8c99a6a3968a7d7063584e453e38322e2b262020212429333f49536673808d99a6a197877a6d6054473a2d211407000000000000000000000000000810171c2123242a3643505d697683908f8275685c4f4235291c0f000713202d3a4653606d787c7c7c7c7c7c7c7c786d6053463a2d201307000714202d3a4753606d7a868b8b8b8b8b8c919caab4ab9f948f8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b84776a5f53473a2e2114080000020000000000000000000000000000040c13191d202122232425272829222b353d4448494d4d4d4d4e4e4f4d5354565e616a6f7b849199a3aba1978d8174695f53463a2d1b11060000000000030f1b26323c47535f6a717e8b939aa2aaa39f95918c8886848483838485898c92979ea5aaa39f93887d70685e52443a3024190d01000000000000000013202c3946535f6c7986929facada093867a6d6053473a2d2d2d2d22282b2d2d2e2f31363c45505a65727f8c98a5b0a6998c7f7366594c402d22170b00000000000005101a232c33383c3d464646464646464646464646464d5a6773808d9aa69b8e8174685b4e464646464646464646464646463e3c39332c241a1005000013202c3946535f6c7986929facada093867a6d6053473a2d2d2d2d2d2d2d23282c2d2e2e2f35394046525e6873808d99a9b3ab9d908377675d5145392c2013060013202c3946535f6c7986929facada093867a6d6053473a2d2d2d2d2d2d2d24292c2d2e2f30363b424b555f6974818e9aaab4ab9e918478695e52463a2d201407000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d20130700121f2b3845525e6b7885919eabaa9d9084776a554b4035291d1004000000030f1b27333f49536773808d9aa6ac9f92867a6d6053473a2d201407000000000000000000000000000000000a1724303d4a5763707d8a96a3b0a3978a7d7064574a3d3124170a0000000000000000000000000000000000000000000000050e18212b343e48515b636e74818e949ea79e948e81746e63574b4a545d676d7a849197a1a49f93887e716b6054483b2f22160900000003101c28343f4a54616e7b87939fabb0a69c9083776c60584e453c342a251e1a1312100c070e070c1013131a1f262a353d47505a606d7984919ea7b1a99f9285796d6053473b31261a0e0000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d6053473a2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d21201e1a140d05000000000000000000000d1a2633404d596673808c99a6a295887c6f6255493c332c27211e1d2024292d333b434e586774818d9aa7a994887b6e6155483b2e22150800000000000000000000000008121a22282d3031323643505d697683908f8275685c4f4235291c0f000714212e3a4754616d7a87888888888888877b6e6154483b2e211508000613202c3945515d6775828f98989898999ca3adbcb0a69f9c98989898989898989898989898989896887b6e6255483b3025190e02000000000000000000000000000000000001080d111314151617191a1b1c27323d474f54565a5a5a5a5a5b5c575e6164686d747c859196a0aaa39992857a6e61574d42362a1e0a000000000000000a15202b37434e58616c727f8892989fa3a7a09d99999291909090919298999ea2a9a69f98928b7f726c61564c4132281e130800000000000000000013202c3946535f6c7986929facada093867a6d6053473a2d202020171c1f20212122262a333e4955626f7c8895a2afa99c8f82766953493f33271b0f0300000000000008111a21272c2f30393939393939393939393939404d5a6773808d9aa69b8e8174685b4e4139393939393939393939393931302d28221a120800000013202c3946535f6c7986929facada093867a6d6053473a2d202020202020181c1f20212224292f35414c56626f7c8897a2adac9f9286796d6053473a2d2014070013202c3946535f6c7986929facada093867a6d6053473a393939393939392f35393a3b3b3d42464d545c676e7b87929facb1a79a8d817467574d42362a1e1105000b1825323e4b5865717e8b98a4aca295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d20130700111e2b3744515e6a7784919daaab9e918578675d5145392c20130600000005121f2b3744505b6576838f9ca9aa9d908477675c5145382c1f1306000000000000000000000000000000000a1724303d4a5763707d8a96a3b0a3978a7d7064574a3d3124170a00000000000000000000000000000000000000000000040d17202a333d47505a626d73808c939da69f958f82786d605b5244505c666d79839096a0a59c928b7f726c61594f44382c201307000000000c17232e3846535f6975828e99a3afab9f948b7f726a60574e463e36302a25201f1c181b1a1b181c1f20262b31363f474f59616c74808d96a1adada2978d8073675d5145392a1f14090000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d6053473a2d2020202020202020202020202020202020202020202020202020201514120e090200000000000000000000000c1925323f4c5865727f8b98a9a396897c706356493d332b262324292c2f35383f444d56606a7683909da9a399877a6e6154473b2e211408000000000000000000000008121a242c33393c3e3f3e43505d697683908f8275685c4f4235291c0f000714212e3a4754616d7a87949595959594877b6e6154483b2e2115080004101d2935404b5565717e8b99a49f9fa5a7adb5bbb2aaa4a19f9f9f9f9f9f9f9f9f9f9f9f9f9fa8998c7f7266564d41362a1e11050000000000000000000000000000000000000001040607080a0b0c0d13202c38444f596063676767676768686a696e71757a81879197a0a8a19892877d6f685e52453b31261a0e00000000000000040f1a26313c46505a636d727e868e92999da0a8aba39f9e9d9c9d9e9fa2aaaaa29f9b948f867e726d62594f443a3020160c0200000000000000000013202c3946535f6c7986929facada093867a6d6053473a2d2014130b0f12131414151a212e3b4754616e7a8794a1adab9e928578655b5044372b1f1205000000000000000810161c2023232d2d2d2d2d2d2d2d2d2d2d34404d5a6773808d9aa69b8e8174685b4e41352d2d2d2d2d2d2d2d2d2d2d2423211c1710080000000013202c3946535f6c7986929facada093867a6d6053473a2d2014131313130c1012131415181d25303a4653606c7985929fabafa399897c6f6256493c2f2316090013202c3946535f6c7986929facada093867a6d60534746464646464646464640454747484a4d52575e666d79829099a3afab9f95897c6f6356493c30251a0e02000b1825323e4b5865717e8b989f9f9f95897c6f6256493c2f23160900000d1a2733404d5a6673808d999f9f9f9386796d6053463a2d20130700101d293643505c6976838f9ca9ac9f92867a6d6053473a2d20140a0000000613202d394653606c7985929fabac9b8e817468554b4034291c1004000000000000000000000000000000000a1724303d4a5763707d8a96a3b0a3978a7d7064574a3d3124170a000000000000000000000000000000000000000000030c161f29323c464f59616c727f8b929ca5a0969083796d665c5049525c606d78828f959fa69e938d80736d625a50473d32271b10030000000006111c2a36424d57626e7b87929fa8b0a69f92877c6f695f585046413b36312d2c282327272723282c2d31373b42465159606b717e8a929da8b1a79f92857a6d61554b4035291d10040000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d6053473a2d2014131313131313131313131313131313131313131313131313130807050200000000000000000000000000091623303c4956636f7c8997a1a5988b7e7265594f453d3731302f35393a40454950565e686f7c89959fac9f9286796d6053463a2d2013070000000000000000000008121a242c363e45494a4c4a46505d697683908f8275685c4f4235291c0f000714212e3a4754616d7a8794a0a2a2a194877b6e6154483b2e21150800010d18242f3a4754616d7a86939393939a9da5afb5aaa0989593939393939393939393939393939393908376685e5246392d2014070000000000000000000000000000000000000000000000000000000916222f3b4854606b707373737374747576787b7e82868e9299a1a39f9791867e716b60564d4133291f140900000000000000000a15202a343e48515b636c717b81878c919597999c9d9e9e9f9f9f9e9d9b9998928e89827b716c625b51473e32281e0e040000000000000000000013202c3946535f6c7986929facada093867a6d6053473a2d20140c0c0c0c0c0c090e13202d3a4653606d798693a0acac9f9286796c605346392d2013060000000000000000050b10141617202020202020202020202734404d5a6773808d9aa69b8e8174685b4e41352820202020202020202020171714110c05000000000013202c3946535f6c7986929facada093867a6d6053473a2d2014070606000004060707070c131f2b3844505b667683909ca9b5ab978a7e7164574b3e3124180b0013202c3946535f6c7986929facada093867a6d6053535353535353535353534b5153545557575e61696e78818e949fabafa59d9083776b6054483b2f1f140900000b1825323e4b5865717e8b9393939393897c6f6256493c2f23160900000d1a2733404d5a6673808d939393939386796d6053463a2d201307000e1b2834414e5b6774818e9aa7afa399897c706356493d30261c110a080a111c28343f4a54626f7c8898a2aea49a8a7e7164574b3e2f23180c00000000000000000000000000000000000a1724303d4a5763707d8a96a3b0a3978a7d7064574a3d3124170a0000000000000000000000000000000000000000020b151e28313b444e58606b707e87929fa4a19791847a6d675d544a515b636e74818e949ea79e948e81776c605b51483e352b21160b0000000000000e1a26313b47535f6974808d96a0abaea39991857b6e6a615a524c46423c3a38342e3434342e34383a3c42474d535b626b707d86929fa4aeaaa0958b7f72685e5243392f24180d010000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d6053473a2d20140d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0b0a080500000000000000000000000713202d3a4653606d7985929ea99c8f82766b60574f47433e3d3d4045474b51535b60686e7a84919ea7a99d908376665c5145382c1f130600000000000000000008121a242c363e48505557585651505d697683908f8275685c4f4235291c0f000714212e3a4754616d7a8794a0adaea194877b6e6154483b2e21150800000713202d3946525e687682868686868e929da9b0a4988e888686868686868686868686868686868686887b6e6154473b2e2114080000000000000000000000000000000000000000000000000000000a1623303d495663707d808080808181828385878b8f92999fa09e99928d857c716c61594f443b3021180d030000000000000000030e18222d363f49515a61696e747b8084888b8d8f90919292929291908e8c8985817c766e69615a51493f352c20160c000000000000000000000013202c3946535f6c7986929facada093867a6d6053473a2d20191919191919191a1a1c222d3a4754606d7a8793a0adafa399877a6d6054473a2d211407000000000000000000000407090a1313131313131313131a2734404d5a6773808d9aa69b8e8174685b4e4135281b1313131313131313130b0a08040000000000000013202c3946535f6c7986929facada093867a6d6053473a2d201407000000000000000000030f1c28333f4a546875828f9ba8b2a5988b7f7265584c3f3225190c0013202c3946535f6c7986929facada093867a6d606060606060606060606060555d6061626466696e737b828e939ea6b0a79e938a7d7063594f44382c200d0200000b1825323e4b5865717e868686868686867c6f6256493c2f23160b0301071a2733404d5a66738086868686868686786d6053463a2d201307000c1825323f4b5865727e8b98a9b2ab998c7f7266594f42382e231a1615141c232c3844505c6673808d9aaaac9f93877a6d6154473a2e21140700000000000000000000000000000000000a1724303d4a5763707d8a96a3b0a3978a7d7064574a3d3124170a00000000000000000000000000000000000000000a141d27303a434d565f6a6f7d869299a3a29892857b6e685e554b505a626d73808c939da69f958f82786d655b50493f362c23190f0400000000000009141f2b37424d57606d79849199a4afaba19791847c706c615e56534d494644404141414141404546494d53575f616d727d869298a2aeaca2989083786c60564c4131281d1207000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d6053473a2d201a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a171714110c0500000000000000000006121f2b3844505c6673808c96a19f94897d70696059534e4b49494b5153555d60656c717a839096a0aca2978c7f7265544b4034281c1004000000000000000008121a242c363e48505a616465625b515d697683908f8275685c4f4235291c0f000714212e3a4754616d7a8794a0adaea194877b6e6154483b2e211508000005111e2a36414c5666707679797979818e9aa7aea195887c79797979797979797979797979797979797976685e5246392d2014070000000000000000000000000000000000000000000000000000000c1926333f4c5966727f8c8d8d8d8d8e8f909298979c9c9a9896918d86807a6f6a615a50473d32291f0f060000000000000000000006101b242e373f4850575e61696e73777b7e80828484858686858583827f7d79756f6b625f5750483f372d231a0e04000000000000000000000013202c3946535f6c7986929facada093867a6d6053473a2d252525252525252626262b2d333c4855616e7b8894a1aeaea399867a6d6053473a2d201407000000000000000000000000000006060606060606060d1a2734404d5a6773808d9aa69b8e8174685b4e4135281b0e0606060606060606000000000000000000000013202c3946535f6c7986929facada093867a6d6053473a2d201407000000000000000000000b17222d414e5b6774818e9aa7b2a5998c7f7266594c3f3326190c0013202c3946535f6c7986929facada093867a6d6c6c6c6c6c6c6c6c6c6c6c6c6c676d6e6e7073767b80858f949ea5afa8a0958e81756b6155473d32271b0f0000000b1724313d4a56626c71797979797979796f6a6054473b2e231c150c0b121826323f4b58636e737979797979797976665c5044382c1f1206000916222f3c4955626f7c8897a1adaa9d9184776b60544a3f342b26232222262e35414c56606d7985919eabaa9d908376685e5246392d20130700000000000000000000000000000000000a1724303d4a5763707d8a96a3b0a3978a7d7064574a3d3124170a0000000000000000000000000000000000000006111c262f39434c565e696e7c859298a3a39992867c6f695f564c4f59616c727f8b929ca5a0969083796d665c53493f372d241a110700000000000000030e1a26313c45515d676f7d87939fa4aea9a19691867e756e68615e575653514a4e4e4d4e4e4b515356575f62696e767f879298a2aaafa49a92867c6f665b50443a301f160c01000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d6053473a2d27272727272727272727272727272727272727272727272727272727272423211c171008000000000000000003101c28343f4a54606d7a849199a49e91847b6f6b625f58585656555d6064676d71787e859095a0a8a49e92857a6d6154473a2e23180c000000000000000008121a242c363e48505a616c71726d625b5d697683908f8275685c4f4235291c0f000714212e3a4754616d7a8794a0acaca194877b6e6154483b2e2115080000010d1925303a44545e66696c6c6c75818e9ba8ada194877a6e6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6b5e564d41362a1e11050000000000000000000000000000000000000000000000000000000c1926333f4c5966727f8c999a9a9a9b9b9d9fa29f94908d8b8884807b746d68605850483e352b20170d00000000000000000000000915202b353f474e524d52575f62666a6e71737577787879797978777573706d67636059534d46423c332a1f140900000000000000000000000013202c3946535f6c7986929facada093867a6d6053473a323232323232323233333137383f444f5964717e8b97a4b1ac9f928679675d5145392c1f1306000000000000000000000000000000000000000000010d1a2734404d5a6773808d9aa69b8e8174685b4e4135281b0e0200000000000000000000000000000000000013202c3946535f6c7986929facada093867a6d6053473a2d20140700000000000000000000061b2834414e5b6774818e9aa7b2a6998c7f7366594c403326190d0013202c3946535f6c7986929facada09386797979797979797979797979797979797a7a7b7d8082868c92979fa6afa79f969183796d60594f44352b21160b0000000915212e3a45505a62656c6c6c6c6c6c6c6260584e443d342e271e18151d2329333c47525c63666c6c6c6c6c6c6c6c5c544a3f34281c1003000613202d394653606c7884919eabaca095897d70665c50443f37312f2e2f30383f46525e68717e8b97a1ada3988b7e7265564c41362a1e110500000000000000000000000000000000000a1724303d4a5763707d8a96a3b0a3978a7d7064574a3d3124170a000000000000000000000000000000000000091217222d38424b555d686e7b849197a2a39f92877d706a60574d4e58606b707e87929fa4a19791847a6d675d544a41382d251b120800000000000000000009151f2935404b55606b727f8b929da4ada9a198928a817a746e696562605c545b5a5a5a5b545c606266696e747b828b9299a2aaaea39f93887e706a5f544a3f32291e0d0400000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d6053473a34343434343434343434343434343434343434343434343434343434343431302d28221a120800000000000000000b17232e3845525d68707d87939aa19691847d746f6a6764636366676d70757a7e838b9297a0a7a49c928b7e71685d5246392d1d12070000000000000008121a242c363e48505a616c717e7f726d6257697683908f8275685c4f4235291c0f000714212e3a4754616d7a87949f9f9f9f94877b6e6154483b2e211508000008131e28323a4146545a5d60606875828f9ba8ada093877a6d606060606060606060606060606060606054524d443b3025190e020000000000000000000000000000000000000000000000000000000c1926333f4c5966727f8c99a5a6a7a7a8a9aba99c9083807e7c77736e69615e564e463e362c23190e0500000000000000000000010e1a26313d4751595e5f6060605e575f626466696a6b6b6c6c6c6b6a686663605d6060606055534d453c31261a0e02000000000000000000000013202c3946535f6c7986929facada093867a6d6053473f3f3f3f3f3f3f3f3f3f404142464a5057606b75828f9ca8b5aa9d9184776a554b4035291d1004000000000000000000000000000000000000000000010d1a2734404d5a6773808d9aa69b8e8174685b4e4135281b0e0200000000000000000000000000000000000013202c3946535f6c7986929facada093867a6d6053473a2d20140700000000000000000205101c2834404b556875828f9ba8b2a5988b7f7265584c3f3225190c0013202c3946535f6c7986929facb9a2958b868686868686868686868686868686868687888a8c8f92999fa2a9aba39f9590847b6e675d51473e3323190f0400000005111d29343f4850565860606060606060605e56544f444039302a211f272f343e454d53555d60606060606060605f504a42382e23170c000005121f2b3744505b6574808d9aa6b0a89d9083786d605a5047433d3c3b3c3d424a505b616d7a85929ea9ab9f92867a6d6154473a3025190d0100000000000000000000000000000000000a1724303d4a5763707d8a96a3b0a3978a7d7064574a3d3124170a000000000000000000000000000000000007101b2428333f4a545c676d7a839096a1a49c918b7e716b61584e4d565f6a6f7d869299a3a29891857b6e685e554b42382f261b130900000000000000000000030d18242f3a434f59626d74808d929ca3adaaa29f938e86807b76726f6d6669686767676869666d6f72777b81868f949fa3ababa39f918c7f726c61584e42382d20170d0000000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d605347404040404040404040404040404040404040404040404040404040404040403e3c39332c241a10050000000000000006111c2935414c56606b717e8892989f969188817c777471707073767a7d81858b91959ea1a9a29f928d80736c61564c4135291d0b0000000000000008121a242c363e48505a616c717e878b7f72695e697683908f8275685c4f4235291c0f000714212e3a4754616d7a87939393939393877b6e6154483b2e21150800010d1925303a444c52545757575c6875828f9ba8aca09386796d60575757575757575757575757575755544e46413b32291f1408000000000000000000000000000000000000000000000000000000000c1926333f4c5966727f8c999f9fa0a1a2a4a6aa9e9185817e7a746e69605c554d443d342c241a1107000000000000000000000004111d2a36424e59636a6c6c6c6c6b636059585a5c5d5e5f5f5f5f5e5d5b575f626a6c6c6c6c6c5f574d42372b1e1205000000000000000000000013202c3946535f6c7986929facada093867a6d60534c4c4c4c4c4c4c4c4c4c4c4d4e4d53545b6069707d88939facb3a99b8e8174685b4e412f24180c00000000000000000000000000000000000000000000010d1a2734404d5a6773808d9aa69b8e8174685b4e4135281b0e0200000000000000000000000000000000000013202c3946535f6c7986929facada093867a6d6053473a2d20140c0c0c0c0c0c0c0c090e1116202c3845515c677683909ca9b6ac978b7e7164584b3e3125180b0013202c3946535f6c7986929facb9a79d959393939393939393939393939393939393949597999c9fa3abaca49f99928d837b6e695e554c41352c21110700000000010c18222d363f454a4b5359636a6c6c6c6c6b636059514a423c332a2a3139404550575f626a6c6c6c6c6c5f574d53443f3830261c11060000030f1b27333f4953626f7c88949eabab9f958c7f726c625a534e4a4948484a4e545c606d75818e97a1ada3998d8074685d524639291e13080000000000000000000002070a0c0d0908060a1724303d4a5763707d8a96a3b0a3978a7d7064574a3d3124170a00000000000000000000000000000000040f19222d363e44505b666d79828f95a0a59d928c7f726c62594f4c565e696e7c859298a2a39892867c6f695e564c433930261d140a01000000000000000000000007131d28313d47515b606c77808c919ea1a9aea59e98928d87837f7c79777674747474747677797c7f83888e92999fa6aea8a199928b7f736d635a50463c2f261c0e050000000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d60534d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4a49453e362c22170c00000000000000000d19242f3a444f59626c717e868f949c9a938e8883807e7c7c7f83868a8e92989da0a7a39f97928a80736e645a50443a3024190d00000000000008121a242c363e48505a616c717e879292867b6e61697683908f8275685c4f4235291c0f000714212e3a4754616d7a86868686868686867b6e6154483b2e2115080005111d2a36414c565e61646464646875828e9ba8aca09386796d6464646464646464646464646464646260584e43372b20170d02000000000000000000000000000000000000000000000000000000000c1926333f4c5966727f8c939393939495979a9d9f97918e8b85817b736d675e564d453b30271d1207000000000000000000000006121f2c3845525e6a757979797978706b605c544d5151525353524b515a61696e777979797976695f53463a2d211407000000000000000000000013202c3946535f6c7986929facada093867a6d60585858585858585858585859595a575f61666c717b84919aa4afada2978a7e7164574b3e3124180700000000000000000000000000000000000000000000010d1a2734404d5a6773808d9aa69b8e8174685b4e4135281b0e0200000000000000000000000000000000000013202c3946535f6c7986929facada093867a6d6053473a2d201919191919191919191a191e2028323a4653606d7986929facafa49a897c6f6356493c302316090013202c3946535f6c7986929facb9afa7a2a09f9f9f9f9f9f9f9f9f9f9f9f9f9f9fa0a1a1a3a6a8a6a8a09e9a938f8780796e695e574d433a2f231a1000000000000006111b242d343a3d3e525e6a757979797978706b605c544d453f36333c434b515a61696e777979797976695f53463a342e261e150a000000000b17222d3847535f6a75828f99a3afa79f92877e716c625f5857565555575860666d737f8c939ea9a89f92867b6e61564c413529170d02000000000000000000070d131619191515120f1724303d4a5763707d8a96a3b0a3978a7d7064574a3d3124170a000000000000000000000000000000000a16212b343e48515b606c78818e949fa69e938d80746d635a504b555d686e7b849197a2a49992867d706a5f574d443a31281e150b02000000000000000000000000010c161f2b353f44505b656c747f8a92979ea6acaaa29f9a93908c898684828181808181828486898c90959a9fa3ababa49f9691877e736d635b51473e342a1d140a000000000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d605a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a575550483e33281c11050000000000000008131e28323d47505a626c717b82898f92999b95908d8b89898c8f92999b9fa2a9a29e99928e857e736e645c52483e32281e13080000000000050e1a242c363e48505a616c717e879292867d70695e697683908f8275685c4f4235291c0f000713202d3946525e6876797979797979797976695e52463a2d201407000713202d3946525e686d717171717174818e9ba7ada093877a717171717171717171717171717171716f6a6054473c31261a0e02000000000000000000000000000000000000000000000000000000000c1926333f4c5966727f868686868687888a8d90959a9e9b98928d8680796e695f574d43392e23180c03000000000000000000000613202c3946535f6c7987868686847d736d665f5751464146454d555c606c717b83868686867b6e6155483b2e221508000000000000000000000013202c3946535f6c7986929facada093867a6d65656565656565656565656566666769696e72787e859196a1acb1a79f9285796d6053473a2d20140700000000000000000000000000000000000000000000010d1a2734404d5a6773808d9a9a9a8e8174685b4e4135281b0e0200000000000000000000000000000000000013202c3946535f6c7986929facada093867a6d6053473a2d2525252525252525252627252a2d323a444e5863707d8998a2aeac9f93867a6d6154473a2e2114070013202c3946535f6c7986929facb9afa7a2a09f9f9f9f9f9f9f9f9f9f9f9f9f9f9fa39f9f9e9d9b999796918c87827c736d675e574d453b31281e11080000000000000009121b22292e3946535f6c7987868686847d736d665f575146413e454d555c606c717b83868686867b6e6155483b2e231c150c030000000006111b2b37434e58626f7c87929fa6aea39992877e766f6a666462616263666a6f78808c919ca5aaa0968c8073695e53443a302419050000000000000000010a12191e23252622211f1b1724303d4a5763707d8a96a3b0a3978a7d7064574a3d3124170a000000000000000000000000000000030f1b27323d47505a636d74808d939ea69f948e81786c605b514a545c676d7a839096a1a49f93877e716b60584e453b32281f160c030000000000000000000000000000040d192327333f49535b606d737d858f949da0a7acaca49f9c989892918f8e8d8d8d8e8f919298999d9fa7acaca69f99938d847d716c635b51493f352c22180b02000000000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d6767676767676767676767676767676767676767676767676767676767676767676764615a5045392d21140800000000000000010c16202b353f48505a61696e767d8287929fa09d9a979696999c9fa3a9a29f9b97928d86817a716c635c524a40362d20160c0200000000020d17202c363e48505a616c717e879292867d706b6057697683908f8275685c4f4235291c0f0005111d2a36414c565e6c6c6c6c6c6c6c6c6c6c5e574d42362a1e1205000714212e3a4754616d7a7e7d7d7d7d7d828f9ca9b1a4988b7f7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7c6f62574d42372b1e1205000000000000000000000000000000000000000000000000000000000c1825323e4b57636d72797979797a7a7b7e8083888d9399a09f99928c837b6e695f554b4034281f140900000000000000000000000b1825323e4b5865717e8b9296918780786e69625b524c4550575f676d747e869095948d8074695f53463a2d211407000000000000000000000013202c3946535f6c7986929facada09386797272727272727272727272727272737476787b7f848a9297a1a8b2a9a0958c7f72675d5145382c1f130600000000000000000000000000000000000000000000010d1a2734404d5a6773808d8d8d8d8d8174685b4e4135281b0e0200000000000000000000000000000000000013202c3946535f6c7986929facada093867a6d6053473a32323232323232323232333330363a3e444c565f6a75818e9baab4aa9d918477685d5246392d2013070013202c3946535f6c7986929facb9a79d959393939393939393939393939393939399929291908f8d8a8784807b756f6a605c554d453b33291f160c0000000000000000000911181d25323e4b5865717e8b9296918780786e69625b524c4550575f676d747e869095948d8074695f53463a2d21110a030000000000000f1b26313c47535f6a73808c949fa7aba399928b827c7773706f6e6f7073777c838d929ca3aba2989184796d60574d4232281e130800000000000000000a131c242a2f32332f2e2b262024303d4a5763707d8a96a3b0a3978a7d7064574a3d3124170a00000000000000000000000000000007131f2c38434f59616c727f8c929da5a0959082796d665b5044505b666d79828f95a0a59c928b7f726c61594f463c332920160d0400000000000000000000000000000000071017222d384149505b636b707b828990959c9fa4acaca9aaa39f9d9c9b9a9a9a9b9c9d9fa3aaaaababa39f9b948f878079706b625a514940372e231a100600000000000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada09386797373737373737373737373737373737373737373737373737373737373737373737373716c6155493c3023170a0000000000000000040d19232d363f49515a61696e757b818e9aa7aaa7a4a3a3aba39f9c9997928e8a85807b746d68615a524a40382e241b0e04000000000008141f29323e48505a616c707e879291857c6f6b646464697683908f8275685c4f4235291c0f00010d1925303a444c525f60606060606060605f524d453b30251a0e02000714212d3a4754606d7a868a8a8a8a8a8f949fabb3a79b918b8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8377695f53463a2d211408000000000000000000000000000000000000000000000000000001020a16222f3a46515b63666c6c6c676d6e6f7173777c81879195a0a39f9590847b6e675c51453b30251a0e02000000000000000000000b1724313d4a56626d73808c9399938d837b726d615e56515a61696e79818a9298958f82786d60574d42372b1e1205000000000000000000000013202c3946535f6c7986929facb2a5988b7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f80818384888b91959fa2a9afa8a1979083796d60554b4035291d100400000000000000000000000000000000000000000000000a1724303d4a5763707d80808080807e7164574a3e3124170b0000000000000000000000000000000000000013202c3946535f6c7986929facada093867a6d6053473f3f3f3f3f3f3f3f3f3f3f3f404142464750565d686f7c87939facb0a69a8d807367564c4135291d11050013202c3946535f6c7986929facb9a2958b86868686868686868686868686868686868685858382807e7b77736e69625f58514b433b332921170d0400000000000000000000060c1724313d4a56626d73808c9399938d837b726d615e56515a61696e79818a9298958f82786d60574d42372b1e1200000000000000000a15202b37434e58606d78828f959fa6aba39f948f8883807d7c7b7b7d7f838990959ca4aba39992867c6f675d51453b3120160c020000000000000007121c252e353b3e403c3b37322a24303d4a5763707d8a96a3b0a3978a7d7064574a3d3124170a0000000000000000000000000000000915222f3b4854606b717e88939fa4a19690837a6d675c544a4653606c78818e949fa69d938c80736d625a50473d342a21170e0500000000000000000000000000000000000006111b262f383f44515961696e757d83898f939a9c9fa2aaa7a8aaa9a7a7a7a7a7a9a9a8a6a9a29e9b99928e88827c746d676059504840372e251c11080000000000000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facb3a79a8d8080808080808080808080808080808080808080808080808080808080808080808080807e7164574a3e3124170b00000000000000000915202a333f48515b636c717b81878e939da9acaba49f9d999992908c8985817d79746e69615e56504840382e261c12090000000000020e1925303b44505a616c707e879291847c717171717171717683908f8275685c4f4235291c0f000008131e28323a41465353535353535353534846423b33291f140900000613202c3945525d6876828f979797979c9fa6b0b7aca39b9897979797979797979797979797979795887b6e6155483b3025190e0200000000000000000000000000000000000000000407090a0d0e0f10121e2a353f495157596060555d60616264676a6f747c839095a0a7a0969083796d60574d42362a1e1205000000000000000000000915212e3a45505a636e74818e939f9590867e756d68605c606c717b838e939f969083796d665c50453c31261a0e02000000000000000000000013202c3946535f6c7986929facb9a79b918b8b8b8b8b8b8b8b8b8b8b8b8b8b8c8c8d8f9196989da0a7adaba59e9691857b6e675c5143392f24180c0000000000000000000000000000000000000000000000000916232f3c4855616b707373737373716c6155493d3023170a0000000000000000000000000000000000000013202c3946535f6c7986929facada093867a6d60534c4c4c4c4c4c4c4c4c4c4c4c4c4d4e4d52545a61686d7a83909aa4afac9f94887c6f6255493c3024190d010013202c3946535f6c7986929facada093867979797979797979797979797979797979797878777573716e6966625f57534e454039302920170f050000000000000000000000000915212e3a45505a636e74818e939f9590867e756d68605c606c717b838e939f969083796d665c50453c31261a0e0200000000000000030f1b26313c44505c666d7a8390949fa4aca69f9c95908c8a8988888a8c90959d9fa7a8a19992877e716a5f554b4033291f0e0400000000000000020d19242e3740464b4c4847433c3429303d4a5763707d8a96a3b0a3978a7d7064574a3d3124170a000000000000000000000000000000091623303c4956636f7c86929a93939791847b6e685d554b424d5a6673808d93939393948e81746e635b51483e352b22180f0500000000000000000000000000000000000000000a141d262d3340474f575e616b70777d82878b8f9298989a9b9d9e9e9f9f9f9e9d9d9b999797928e8a86817c766f6a605d554f473e362e251c130a000000000000000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facb9a99d928d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8174675b4e4134281b0e01000000000000020e1a26313c45505a636d727e868e939a9da5a39f9c9993908c898683807c7975706d66615e57524c443e362e261c140a00000000000005111e2a36414d56616c707e879292867f7e7d7d7d7d7d7d7d7e83918f8275685c4f4235291c0f0000020c1620283036394646464646464646463b3a36302921170d02000004111d2935414c5665727e8b9aa49f9fa1a3a9b1bbb5aca7a49f9f9f9f9f9f9f9f9f9f9f9f9f9fa7988c7f7265564c41362a1e1105000200000000000000000000000000000000050b101416171a1b1c1d1e1f232e373f464b4c53534b5153545557585f626a6f7a839097a1a8a0958d8074695e52463a2d2014090000000000000000000005111d29343f48525b606d78818f959f98928b827a706b676d747e8690959d9891847b6e675d544a3f332a1f140900000000000000000000000013202c3946535f6c7986929facb9ada39b989898989898989898989898989899999a9c9ea1a8aaacaaa69f9c938e847c6f695f554b4031271d12070000000000000000000000000000000000000000000000000714202c38444f596163676767676764615a5045392d2114080000000000000000000000000000000000000013202c3946535f6c7986929facada093867a6d6058585858585858585858585858595a5a565e61656c707a829095a0acafa49a8f82766a5f53473b2e1e1308000013202c3946535f6c7986929facada093867a6d6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6b6a686664615e5755534d47433c342e271e170e050000000000000000000000000005111d29343f48525b606d78818f959f98928b827a706b676d747e8690959d9891847b6e675d544a3f332a1f14090000000000000000000a152028343f4a545d686d7a828d939a9fa6aba7a09d999795949596999d9fa7aba39f9691877e716c61584e43392f21170d000000000000000007131e2a35404952575955534e463f35303d4a5763707d8a96a3b0a3978a7d7064574a3d3124170a0000000000000000000000000000000c1925323f4c5865727f868686868686857c6f695e564c4343505c69768286868686868682786d605c52493f362c23191006000000000000000000000000000000000000000000020b141b2227353e454d525960636b70757b7e8285888b8d8f9091929292929191908e8c8a8885817e7a746f6a626058514b433d352d241c130a01000000000000000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f06060606060000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facb9aea49d9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a8e8174675b4e4134281b0e0100000000000006121e2b37424e57626d727f8a92989fa4a29f99928f8b8683807d797673706d6664605c54534d46413a322c241c140a020000000000000714202d3946525e68707e87929999928c8a8a8a8a8a8a8a8a8a91958f8275685c4f4235291c0f000000050e161e252a2d2e39393939393939392e2d2a251f170f05000000010d19242f3b4754616e7b879393939394979fa9bcaea49c9993939393939393939393939393939393908376685e5246392d20140c070f0b0a080500000000000000000000000810161c202324262728292a2b2c202e353a3e3f464640454747484b4e535860686d7a85929ea9a79f92877b6e6154483b31261a0e02000000000000000000010c18222d364044505c666d79829095a09f938f857d746f79818a9298a09992867c6f695e554b42382e21180e0300000000000000000000000013202c3946535f6c7986929facacacada7a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a6a7a9a9a7aca49f9d99948f89817a6f6a5f574d43392e1f150b0100000000000000000000000000000000000000000000000004101c28333e474f55575a5a5a5a5a575550483e33281d11050000000000000000000000000000000000000013202c3946535f6c7986929facada093867a6d656565656565656565656565656566666769696e72777d8590949fa7b1a79f93877c6f62584e43372b1f0c02000013202c3946535f6c7986929facada093867a6d6060606060606060606060606060605f5f5e5d5c5a5754524d4847423c373128231d150c050000000000000000000000000000010c18222d364044505c666d79829095a09f938f857d746f79818a9298a09992867c6f695e554b42382e21180e03000000000000000000030c17232e38424c565d686d78808790949b9fa2aaa8a6a3a2a1a2a3a6a8a9a29f99928d847d716c615a50463c31271d0f0500000000000000000a16232f3b46525b6366625f585146413a3d4a5763707d8a96a3b0a3978a7d7064574a3d3124170a0000000000000000000000000000000b1824313e4a56626d72797979797979786f6a5f574d443a414e5a667076797979797979756d665c504a40372d241a11070000000000000000000000000000000000000000000000020a1117232c333b42464f54596063696e7276797c7e808283848585868585848382807d7b7975716d68625f58544e45403a312b231b120a0100000000000000000000000b1825313e4b5864717e8b97a4aca89b8e8175685b4e4235281b0f13131313130c06060300000000010e1b2734414e5a6774818d9aa7aca4978b7e7164584b3e3125180b0013202c3946535f6c7986929facacacaea9a7a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a69a8e8174675b4e4134281b0e010000000000000814212e3a47535f6a717e8b919fa2a69f98928d87827e7a7673706d676663605c5453514b46423b363029201c17110a020000000000000814212e3b4754616e7b859299a3a39f9793939393939393939393938f8275685c4f4235291c0f00000000050c13191d20212d2d2d2d2d2d2d2d21201e1a140d0500000000000814202d3a46525e69768386868686878d97aab4a89c928c8686868686868686868686868686868686887a6e6154473b2e211c181c1b171714110c05000000000000000008111a21282c2f30333435363738392d2c282f3233392f35393a3b3c3e43474e565e68717e8b97a1ada3998d807367574d42362a1e12050000000000000000000006111b2428343f4a545d676d7a839196a19e979188807b838e929fa29f93877d706a5f574d433a30261c0f060000000000000000000000000013202c3946535f6c7986929f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9fa49f9f9f9e9d9c9a999a93908d88827d756d685f584e453c30271d0d0300000000000000000000000000000000000000000000000000000b16212c353e44484a4d4d4d4d4d4a49453e362c22170c000000000000000000000000000000000000000013202c3946535f6c7986929facada093867972727272727272727272727272727272737475787b7f838a91979fa6b0a79f958d80746a6054463c32261b0f00000013202c3946535f6c7986929facada093867a6d605353535353535353535353535353535252504f4d4b4846423b3a37312b262018120b030000000000000000000000000000000006111b2428343f4a545d676d7a839196a19e979188807b838e929fa29f93877d706a5f574d433a30261c0f06000000000000000000000006111c26303a434c565d666d737c83898e9298999b9d9e9f9f9f9e9d9b9997928d87817a6f6b615a50483e342a1f150b0000000000000000000c1925323e4b57636d736f6a625b524c443d4a5763707d8a96a3b0a3978a7d7064574a3d3124170a0000000000000000000000000000000915222e3a46515b62656c6c6c6c6c6c6c625f584e453b323e49545e66696c6c6c6c6c6c69605c544a3f382e251b1208000000000000000000000000000000000000000000000000000006111a202930363d44484f54565e6165666d6f7174757778787979787877767573716f6d6664605d56534e47433d352f281f191109000000000000000000000000000b1825313e4b5864717e8b979f9f9f9b8e8175685b4e4235281b1320202020201913120f0b060000010e1b2734414e5a6774818d9a9f9f9f978b7e7164584b3e3125180b0013202c3946535f6c7986929f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9a8e8174675b4e4134281b0e01000000000005111e2a36424d57626e7b86929fa3a59e949086807b75716d686663605d555653504a464540393631302e2d2b28231c140c0400000000000714202d3946525e68717e87929999928a8686868686868686868686868175685c4f4235291c0f000000000002080d11131420202020202020201514120e090200000000000005111e2a36424d56667176797979797b8798a3aea6998c8079797979797979797979797979797979797976685e5246392d2c292329282423211d17100800000000000005101a232c33383c3d404142434445453a38342e27262d24292c2d2e2f31373d444c56606c7885919eabab9e918478695f53463a2d2114070000000000000000000000091217232e38424b555d686e7b849197a2a19a938d8890959da59d928b7f726b61584e453b31281e140a000000000000000000000000000013202c3946535f6c7986929393939393939393939393939393939393939a93929291908f8e8c898683807b76706b615e564e463c332a1e150b00000000000000000000000000000000000000000000000000000005101a232c33383c3d40404040403e3d39332c241a1005000000000000000000000000000000000000000013202c3946535f6c7986929facb2a5988b7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f80818285878b90959ea1a9aea69f959083796d60584e43342a20150a00000013202c3946535f6c7986929facada093867a6d6053474646464646464646464646464645454442403e3b3a36302e2b261f1b150c0700000000000000000000000000000000000000091217232e38424b555d686e7b849197a2a19a938d8890959da59d928b7f726b61584e453b31281e140a000000000000000000000000000a151e28313a444c545c606a6f767c8185898c8e909192929292918f8c8985807b746d68605950483e362c22180d030000000000000000000d192633404c5966737f7c726d615d564f444a5763707d8a96a3b0a3978a7d7064574a3d3124170a00000000000000000000000000000006121e29343f495156586060606060605f55534e463c332938424c545a5c6060606060605c53504a42382e261c130900000000000000000000000000000000000000000000000000000000080e171f252a33383d44484d5254545c60626567686a6b6b6c6c6c6b6a6a68666462605c5454524c47433c383229241d160d0700000000000000000000000000000b1825313e4b5864717e8b93939393938e8175685b4e4235281f202c2d2d2d2c26201f1c17110a02000e1b2734414e5a6774818d93939393938b7e7164584b3e3125180b0013202c3946535f6c79869293939393939393939393939393939393939393939393939393939393939393939393939393939393938e8174675b4e4134281b0e0100000000000714202d3a46525e6975828e98a2a89e938e827b736e6964615e565653514b4946443f3a3e4041403e3d3b3a38342e261e160d040000000005111e2a36414d56616c717e879392867e797979797979797979797979756f65594d4134281b0e00000000000000010507071313131313131313080705020000000000000000020e1925303b44555f666a6c6c6c6c7985929faca89b8e81756c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6b5e564c413b3a38342f363531302d28221a120800000000000b16212c353e44484a4d4e4f505152524644403930271c181d20202122262b323a44505b6674818e9aa7ada196887b6e6155483b2e22150800000000000000000000000006111c263039434c565e696f7c859299a3a49f9a959da0a79e948d80746d62594f463c33291f160c02000000000000000000000000000013202c3946535f6c79878686868686868686868686868686868686868686868685858483817f7d7a77736e6a636059524c443c342a21180c030000000000000000000000000000000000000000000000000000000008111a21282c2f30343434343431302d28221a120800000000000000000000000000000000000000000013202c3946535f6c7986929facb9a79b918b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8c8d8d8f9197989da0a7adaaa39f948f837a6d675c51463d3222180e0400000013202c3946535f6c7986929facada093867a6d6053473a3939393939393939393939393938373533312e2d2a25211e1a150f0a0400000000000000000000000000000000000000000006111c263039434c565e696f7c859299a3a49f9a959da0a79e948d80746d62594f463c33291f160c0200000000000000000000000000030c161f28323a424a515860626b6f75797c7f828385858685858482807c79746e6a615e564f473e362c241a1006000000000000000000020f1c2835424f5b687581867f756d686059504a5763707d8a96a3b0a3978a7d7064574a3d3124170a000000000000000000000000000000010d18232d373f464a4c535353535353524847433c342a21303a42494e505353535353534f46443f3830261c130a010000000000000000000000000000000000000000000000000000000000050d141a21272c33383b4246474a545c6a6c6c6c6c6c66605b5f5e5e5d5b59575553504a4745413a37312b272018130c040000000000000000000000000000000b1825313e4b5864717e868686868686868175685b4e4235282b383939393939332d2b28221c140b060e1b2734414e5a677480868686868686867e7164584b3e3125180b0013202c3946535f6c7987868686868686868686868686868686868686868686868686868686868686868686868686868686868686868174675b4e4134281b0e0100000000000814212e3b4754616e7b87939faaa0968e81786e69615e5754524c494745403d3a3840464b4c4e4c4b494846443f3830281f160c01000000020e1925303b44505a616c717e879392877e716c6c6c6c6c6c6c6c6c6c68655d54493d3125190c000000000000000000000000000000000000000000000000000000000000000009141f2932434d555b5d60605b667783909daaaa9d908377675c60606060606060606060606060606054524c4446484745404443423e3d39332c241a100500000004101c28333e474f5557595a5b5c5d5e5f53514a42392e231810131414151b2028333f4a5464717e8b97a4b2a8978a7e7164574b3e3124180b000000000000000000000000000a141e27313a444d575f6a707d879299a49f9f9f9fa9a0958f82786d605b51473e342a21170d04000000000000000000000000000000121f2c3845525e6a757979797979797979797979797979797979797979797979797877767472706d6866625f58544f46413a322a22180f060000000000000000000000000000000000000000000000000000000000000810161c20232427272727272423211d1710080000000000000000000000000000000000000000000013202c3946535f6c7986929facb9ada39b9898989898989898989898989898989899999a9c9ea1a9aaacaba39f98928c827a6d685e554b40342b2110060000000013202c3946535f6c7986929facada093867a6d6053473a2d2d2d2d2d2d2d2d2d2d2d2c2c2b2a29272421201e1a14120e09030000000000000000000000000000000000000000000000000a141e27313a444d575f6a707d879299a49f9f9f9fa9a0958f82786d605b51473e342a21170d04000000000000000000000000000000040d162028303940444e54596063666d707275767879797978777573706d66625f57524c443d342c241a120800000000000000000000020f1c2835424f5b6875828e8b827a6f6b605c545763707d8a96a3b0a3978a7d7064574a3d3124170a0000000000000000000000000000000006111b252d343a3e3f464646464646453c3a37312a221e2830383e4143464646464646423a38342e261e140a010000000000000000000000000000000000000000000000000000000000000002090e161c21272c30363a44505c66757979797979726c665f5751504f4d4a4846443f3a39352f2b26201b160d0701000000000000000000000000000000000a1724303d4956626c7179797979797979756f65594d402e34384546464646463f3938332d261d180f091a2733404c58646e7479797979797979716c6256493d3024170a00121f2c3845525e6a757979797979797979797979797979797979797979797979797979797979797979797979797979797979797979746f64594c4033271a0d0100000000000b1825313e4b5864717e8b99a4aa9d9184796d665f57524d4746413d3a38352f3040495157595b5958565453504a423a31281e13080000000008141f29323e48505a616c717e889392877e716c615a6060606060605c59544b42372c2115090000000000000000000000000000000000000000000000000000000000000000020d1720313b434a4e50534a546774818e9aa7ac9f9286796d6053535353535353535353535353535347464a51535453514b504f4e4a49453e362c22170c0000000714202c38444f596163666768696a6b6c605c544a4034281c100607080a0e17222d3d4a5763707d8a96a3b0a5988b7f7265584c3f3225190c00000000000000000000000000020c151f28323b454e58606b717e8793939393939393969083796d665c50493f352c22190f0500000000000000000000000000000000111d2a36424e59636a6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6b6a69676663615e5655534e48443d363028201810060000000000000000000000000000000000000000000000000000000000000000050b101416171a1a1a1a1a171714110c05000000000000000000000000000000000000000000000013202c3946535f6c7986929facacacada7a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a6a7a8aaa8a6a7a09d99928e867f786d685e564c43392e22190f000000000013202c3946535f6c7986929facaca093867a6d6053473a2d20202020202020202020201f1f1d1c1a181514120e0906020000000000000000000000000000000000000000000000000000020c151f28323b454e58606b717e8793939393939393969083796d665c50493f352c22190f050000000000000000000000000000000000040d161e272e343d43474f54545c606366686a6b6c6c6c6b6a686663605c54534e46413a322b221a12080000000000000000000000020f1c2835424f5b6875828e938f847d736d665e5763707d8a96a3b0a3978a7d7064574a3d3124170a000000000000000000000000000000000009131b23292e3132393939393939392f2e2b262018161e262d323536393939393939362d2b28231c140c0200000000000000000000000000000000000000000000000000000000000000000000050b10161c1f252d3a4653606d7987868686867f786e69625b524d443e3c3a38342e2c29241e1b150f0a040000000000000000000000000000000000000815212d3945505a62646c6c6c6c6c6c6c68655d53483d383f445253535353534c46443f382f2a2119141824303c48535c64676c6c6c6c6c6c6c64625a5045392d21150800111d2a36424e59636a6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c67645d53483c3024180b0000000000010d1a2734404d5a6773808d9aaba4988b7e71675c544d46423b3935302d2c292e3842515b63666866646361605c544c433a2f24190d01000000020d17202c363e48505a626c717e889392877e716c61574d535353534f4d49423930261b1004000000000000000000000000000000000000000000000000000000000000000000050e1f2831383e4243464b5865717e8b98a8aea399897c7063564946464646464646464646464646404a545c6061605c555d5c5b575550483e33281d110500000916232f3c4855616b70737475767778786d665c5144382c1f12060000000616232f3c4956626f7c8995a2afa6998c807366594d4033261a0d0000000000000000000000000000030d162029333c464f59616c727f8686868686868686847b6e675d544a3f372d231a100700000000000000000000000000000000000e1a26313d4751595e5f6060606060606060606060606060606060606060605f5f5e5d5c5b595654524c4847433c38332a251e160e0600000000000000000000000000000000000000000000000000000000000000000000000407090a0d0d0d0d0d0b0a08050000000000000000000000000000000000000000000000000013202c3946535f6c7986929f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9fa39f9f9e9d9b999795908c86817b736d665e564c443a30271d1007000000000013202c3946535f6c7986929f9f9f9f93867a6d6053473a2d20141313131313131313131212110f0d0b08070502000000000000000000000000000000000000000000000000000000000000030d162029333c464f59616c727f8686868686868686847b6e675d544a3f372d231a100700000000000000000000000000000000000000040c151c232832373d43484b515356595b5d5e5f5f5f5f5e5c595653514b47423c35302820191008000000000000000000000000020f1c2835424f5b6875828e9b96918780786e696163707d8a96a3b0a3978a7d7064574a3d3124170a0000000000000000000000000000000000010911181e2224252d2d2d2d2d2d2c22211f1a150e0c141b212628292d2d2d2d2d2d29201f1c17110a0200000000000000000000000000000000000000000000000000000000000000000000000000050b10141f2b3844505c66717e879399928c827b726d615e565046413a322924201d19130f0a04000000000000000000000000000000000000000005111d29343e48505658606060606060605b59534b4138424a505e5f6060605f5953504a423b332a251f17202b36414a53585a60606060606060585650483e34291d1105000e1a26313d4751595e5f606060606060606060606060606060606060606060606060606060606060606060606060606060606060605b59534a41362b2014080000000000020e1b2835414e5b6874818e9ba7a194887b6e61554b423b36302d292523282c343f4a54636d73747371706e6d665d564c4135291d110400000000050e1a242c363e48505a626c717f889392877e71695f534646464642413d3730271e140900000000000000000000000000000000000000000000000000000000000000000000000d161f272d3236373b4855616e7b8896a0acab998d807366594f4338393939393939393939393844515c666d6e6d676b6a696864615a5045392d21140800000a1724303d4a5763707d80818283848586786d6053463a2d20160d0909070c1724303d4a5763707d8a96a3b0a69a8d8073675a4d4034271a0d010000000000000000000000000000040e17212a343d47505a626d727979797979797979786e695e554b42382e251b11080000000000000000000000000000000000000915202b353f474e525353535353535353535353535353535353535353535353525251504e4c4a4746413b3a37312c272119130c05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013202c3946535f6c7986929393939393939393939393939393939393939393939399929291908f8d8a87847f7b756e69605c544c443a32291e150b00000000000013202c3946535f6c7986929393939393867a6d6053473a2d20140706060606060606060605040200000000000000000000000000000000000000000000000000000000000000000000000000040e17212a343d47505a626d727979797979797979786e695e554b42382e251b1108000000000000000000000000000000000000000000030b121820272b323839404546494c4f505252535252514f4d4946454039373129251e160e0700000000000000000000000000020f1c2835424f5b6875828e9ba199928c827b706c63707d8a96a3b0a3978a7d7064574a3d3124170a00000000000000000000000000000000000000060d121518192020202020201f1515120f0a03030a1015191c1d2020202020201c1312100b06000000000000000000000000000000000000000000000000000000000000000000000000000000000003101c28343f4a54616c717e87939a9490867f766e69615a524c443e352f281f19100700000000000000000000000000000000000000000000000c17222d363e45494b535353535353534e4d4841343f4a545c6a6c6c6c6c6c66605b544d453f3630292019252f3841484c4e535353535353534b49453e362d22170c00000915202b353f474e525353535353535353535353534a545c6a6c6c6c6c6c66605b544d5353535353535353535353535353535353534e4c4841382f251a0f030000000000020e1b2835414e5b6874818e9ba7a194877a6e6154473e39352f3333332e34383d44505c66737f817f7e7c7b786d685d5245392c201306000000000008121b242d363f48505a626d727f8b9192867b6e6155483b39393534312c261e150c020000000000000000000000000000000000000000000000000000000000000000000000040d151c2226292d3a46535f697784919eaaaa9d9184776b6054483d31282d2d2d2d2d2d2d2d3a4653606d787b7a7978777675716c6155493d3023170a00010e1a2734414d5a6774808c8d8e8f9091887c6f6255483e31281f1a171617181d27333f495364717e8b97a4b1a6998c807366594d4033261a0d00000000000000000000000000000000050f18222b353e48515b62656c6c6c6c6c6c6c6c6b615e574d433a30261c130900000000000000000000000000000000000000040f19242d353d4245464646464646464646464646464646464646464646464646454443413f3d3a3936302e2b26201c160d080200000000000000000000000000000000000000000000000000000000000000000000020608080b0e1011121313121211100d0b08070502000000000000000000000000000000000000000013202c3946535f6c79878686868686868686868686868686868686868686868686868685858382807d7a77736e69615f57504a423a322920170c0300000000000013202c3946535f6c798786868686868686796d6053473a2d2014070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050f18222b353e48515b62656c6c6c6c6c6c6c6c6b615e574d433a30261c1309000000000000000000000000000000000000000000000000070c151b21272c2e34383a3d3f424345464646454442403d3a38342e2b262019130c040000000000000000000000000000020f1c2835424f5b6875818e969ea39f9490857d746d707d8a96a3b0a3978a7d7064574a3d3124170a00000000000000000000000000000000000000000106090b0c13131313131312090806030000000005090d0f101313131313130f07060300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b17232e3842505a616c717e88939a98928b827b716c615e564f45413a312b22190f040000000000000000000000000000000000000000000006111b242d34393d3e4646464646464642403d373844505c66757979797979726c665f575146423b3229251e262f363c4041464646464646463e3d39342d241b11060000040f19242d353d4245464646464646464646464644505c66757979797979726c665f5751464246464646464646464646464646464641403c362f261d1308000000000000000d1a2733404d5a6673808d99aca295897c6f62585047454140403f40404045464f57606d78858e8c8b8987867a6d6054473a2d21140700000000000009121b242d363f48505a626d727f8b8c7f72695f53463a2d2d292825211b140c0300000000000000000000000000000000000000000000000000000000000000000000000000030a11161a1e2a36424d576773808d9aa7aca096897c6f63594f433a3129242322222429333f4a5463707d878685848382817e7164574a3e3124170b00000b1825323e4b5865717e8b989b9c9d988b7f7265594f433a312a2524232323282f3744505b6574818e9aa7b5ab988b7e7265584b3f3225180c0000000000000000000000000000000000061019232c363f4951565860606060606060605e54524d453b31281e140a01000000000000000000000000000000000000000008121b242b3136383939393939393939393939393939393939393939393939393837363433302e2d2a25211f1a15100b050000000000000000000000000000000000000000000000000000000000000000000205090e121415181b1d1e1f20201f1f1e1c1a181514120e0905020000000000000000000000000000000000121f2c3845525e6a7579797979797979797979797979797979797979797979797979797878777573716e6866615e57534d443f38302820170e0500000000000000121f2c3845525e6a75797979797979797976675c5145382c1f1306000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061019232c363f4951565860606060606060605e54524d453b31281e140a0100000000000000000000000000000000000000000000000000040a0f161b1d23282c2d303335373839393938373533302d2c28231d1a150d080200000000000000000000000000000000091623303c4956636f7d848e939fa29f97928a8079707d8a96a3b0a3978a7d7064574a3d3124170a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006111c26303e48505a626c717f88939f9f948f857e756d686159514b433d342b21160a000000000000000000000000000000000000000000000009121b22292d3031393939393939393534312d3a4653606d7987868686867f786e69625b524d443e35302820252b3033343939393939393931302d29221b12090000000008121b242b313638393939393939393939393a4653606d7987868686867f786e69625b524d443e353039393939393939393939393433302b251d140b01000000000000000b1824313e4b5764717e8a9aa4a69a8d80736a615a54524c4d4d4c4c4d4b515359606a717e8b979997968f8376685d5245392c2013060000000000000009121b242d363f48515b626d727f80736d63574d42362a1e1c1b191510090200000000000000000000000000000000000000000000000000000000000000000000000000000000050a0e1a26313c4855626f7c88959faba89b8f82756b60554b433b352f2f2f2f2f353b44505b6673808c989291908f8b7e7164584b3e3125180b00000815222e3b4855616e7b8896a0a9aa9d9083776b61554b433c36313030302e3439404b55606c7884919eaaafa499897d7063564a3d3023170a00000000000000000000000000000000000007111a242d373f464a4c5353535353535353524846423b33291f160c020000000000000000000000000000000000000000000009121920262a2c2c2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2c2c2b2a2928262321201d1914120f090300000000000000000000000000000000000000000000000000000000000000000002080e11151a1e21222528292b2c2c2c2c2b2b29272522211e1a14120e0902000000000000000000000000000000111d2a36424e59636a6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6b6a686664615e5654534d46423c342e261e160e050000000000000000111d2a36424e59636a6c6c6c6c6c6c6c6c6c5c554b4034291c10040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007111a242d373f464a4c5353535353535353524846423b33291f160c0200000000000000000000000000000000000000000000000000000000040a0f12181c1f202326282a2b2c2c2c2c2b292623201f1c18120e09030000000000000000000000000000000000000915222f3b4854606b6f7a818a92989fa29e928d837b7d8a96a3b0a3978a7d7064574a3d3124170a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004080a0a131313131310100d0a050000000000000000000000000000000000000000000000000000000000000a141e2c363e48505a626d727f8b919b9e97928a817a706b605d554e463d32271b0f0300000000000000000000000000000000000000000000000911171d2124252d2d2d2d2d2d2d28271f2b3844505c66717e879399928c827b726d615e565046413a3229241d2427272d2d2d2d2d2d2d2524211d17110900000000000009121920262a2c2c2d2d2d2d2d2d2d2d2b3844505c66717e879399928c827b726d615e565046413a3229242d2d2d2d2d2d2d2d282724201a130b0200000000000000000814212e3b4754616e7b87939fac9f92867c706c64605d565a5959595a555c60636b707c85929fa9a1968b7e7265564c4135291d1104000000000000000009121b242d363f49515b626d72736e635b51453b31261a0e0e0c090400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000915212e3a47535f6a7683909da7aa9e93897c6f675d554c45413d3c3b3c3c40454d57606c7884919e9f9e9d95877a6e6154473b2e21140800000814212d3a47535f697784919daaaca0958a7d70675d554d46423e3d3c3d3e40454b515c67707d8a96a0acac9f93867a6d6054473a2d2114070000000000000000000000000000000000000008121b252d343a3e3f4646464646464646453b3a36302921170d04000000000000000000000000000000000000000000000000080f151a1d1f20202020202020202020202020202020202020202020201f1f1e1d1b19171413110d08060200000000000000000000000000000000000000000000000000000000000000000002080d14191e20262b2e2f323436383939393938373634322e2d2b26201e1a140e0902000000000000000000000000000e1a26313d4751595e5f6060606060606060606060606060606060606060606060605f5f5e5d5c5a5754524c4846423b373128231c140c040000000000000000000e1a26313d4751595e5f606060606060605f514b43392f23180c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008121b252d343a3e3f4646464646464646453b3a36302921170d040000000000000000000000000000000000000000000000000000000000000000070c10131316191c1d1f1f201f1f1e1c1a161313100c070000000000000000000000000000000000000000000713202c38444f5960686d757e8590949fa39d959086818e9ba8b0a3978a7d7064574a3d3124170a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050b1014161720202020201d1c1a16110a0300000000000000000000000000000000000000000000000000000000020c1a242d363f48505a626d727f8b919ba29f938e857d746d6760584e43382c1f1307000000000000000000000000000000000000000000000000060c11151718202020202020201b1b1c28343f4a54616c717e87939a9490867f766e69615a524c443e352f281f191b20202020202020181715110c060000000000000000080f151a1d1f20202020202020201c28343f4a54616c717e87939a9490867f766e69615a524c443e352f281f1920202020201b1a18140f08010000000000000000000714202d3946525e6876828f9aa4a39892857d76716d6868676666666668676d70757d859197a2a49e9184796d6053463a2f24190d0100000000000000000009121b242d373f49515b626566635c52493f33291f140900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006121f2b37434e5864707d8a95a0aca59d9183796d675e56514b4a494848494b51575f69717e8b96a1aca89d908377685e5246392d201407000006121e2b37424d5766737f8c98a2aea79e9184796d675f57534d4b4a494a4b4b51555d606d7983909da8b2a99d908376685d5245392c201307000000000000000000000000000000000000000009131b23292e31323939393939393939382e2d2a251f170f05000000000000000000000000000000000000000000000000000004090e11121313131313131313131313131313131313131313131313131211100e0c0a070705010000000000000000000000000000000000000000000000000000000000000000000000040c13191f252a2d31373a3b3e41434445464645454443403e3b3a37312d2a251f1a140d050000000000000000000000000915202b353f474e5253535353535353535353535353535353535353535353535353535252504f4d4a4746413b3a36312b261f17110a02000000000000000000000915202b353f474e5253535353535353535345403931271d12070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009131b23292e31323939393939393939382e2d2a251f170f0500000000000000000000000000000000000000000000000000000000000000000000000406070a0c0f101213131312110f0d0a0706040000000000000000000000000000000000000000000000030f1b27323d474f565d606c717b828c9299a0a098928e939eaab0a3978a7d7064574a3d3124170a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000810171c2023242d2d2d2d2d2a2926221c150d040000000000000000000000000000000000000000000000000000000008121b242d363f48515b626d727f8c919ca39e97918a81796f6a6054483b2e221509000000000000000000000000000000000000000000000000000005080a0b131313131313130f0b17232e3842505a616c717e88939a98928b827b716c615e564f45413a312b22190f1313131313130b0a0805000000000000000000000004090e1112131313131313130b17232e3842505a616c717e88939a98928b827b716c615e564f45413a312b22190f1313130e0d0b0803000000000000000000000005111e2a36414d56626f7c87939fa5a297928a837d7a777573737273737476797d82889197a1a59d928a7e71675c514538281e1308000000000000000000000009121b252d373f495156585a57524a40372d21180d03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1b26313c4653606c7883909aa4aca0958f82796e68605d555756555556555d60696e7b85929fa8aca1968a7e7164564d41362a1e11050000020e1a26313c4754616d7a86929fa8aca1969082796e69615e575857565657545c60676d75818e95a0acada2978b7f7265564c4135291d11040000000000000000000000000000000000000000010911181e2224252d2d2d2d2d2d2d2d2b21201e1a140d0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080e161e25293036393c4247484b4e50515253535252514f4d4b4846423c3a36302a251f170f080000000000000000000000040f19242d353d4245464646464646464646464646464646464646464646464646464645454442403e3b3936302d2a251f1a140b06000000000000000000000000040f19242d353d424546464646464646464638342f271f150b0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010911181e2224252d2d2d2d2d2d2d2d2b21201e1a140d05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b16212b353d444c525a61696e787f8791969da29f9b9ea5afb0a3978a7d7064574a3d3124170a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008111a22282d303139393939393736322d271f160d030000000000000000000000000000000000000000000000000000000009121b242d363f49515b626d727f8c9193939393938e847c6f6256493c2f231609000000000000000000000000000000000000000000000000000000000000060606060606060006111c26303e48505a626c717f88939f9f948f857e756d686159514b433d342b21160a000606060600000000000000000000000000000000000104060606060606060006111c26303e48505a626c717f88939f9f948f857e756d686159514b433d342b21160a000601010000000000000000000000000000020e1925303b4754606a73808d939fa4a29f94908a86848280807f7f80818385898f939aa1a49f938d80746c61554b403428160c0100000000000000000000000009121b252d373f464a4c4d4b4740382e251c0f0600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a151f2b3744505b656f7c88939fa7a89e948f837a736d6765636262626365676d727b849197a2ada59e9184786d6053463b3025190e020000000915202d3946525e6873808c95a0aaa89f9490837b736e6967646363636465666d7179818e939da7b0a69e92857a6d6054473a2f24190d0100000000000000000000000000000000000000000000060d1216181920202020202020201f1514120e09020000000000000000000000000000000000000000000000000000000000000000000104060606060606060601000000000000000000040607090c0e0f11121213131211100e0b0808060200000000000000000000000000000000000000000000000000020a121a202830353b4146474e5355585b5c5e5f5f5f5f5e5e5c5a5855534d4846423b363029211a120a020000000000000000000008121b242b31363839393939393939393939393939393939393939393939393939393938373533312e2d2a25211e1a140e0903000000000000000000000000000008121b242b3136383939393939393939392c29231d150d0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060d1216181920202020202020201f1514120e090200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003070909131313131313130b0a08040000000000000000000000000000000000040f19232b323a414550575e666c727c848d929ea1a9aaafb7b0a3978a7d7064574a3d3124170a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005101a232c33393c3d464646464643423e3831281f150a000000000000000000000000000000000000000000000000000000000009121b242d373f49515b636d737f86868686868686868174675a4e4134271b0e0100000000000000000000000000000000000000000000000000000000000000000000000000000a141e2c363e48505a626d727f8b919b9e97928a817a706b605d554e463d32271b0f0300000000000000000000000000000000000000000000000000000000000000000a141e2c363e48505a626d727f8b919b9e97928a817a706b605d554e463d32271b0f0300000000000000000000000000000000000008141f2b37434e58606d78818d939a9fa69f9c9992908f8d8c8c8c8d8e9092989c9fa49f99938c81786d605a5043392e231804000000000000000000000000000009131b252d343a3e3f403f3b352e261c130a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1b27333f4953606b74808d959fa8a69e959086807a7672706f6e6f6f7274797f869196a1a9a79d938a7e71665c504438291f14080000000005111d2935414c56606d79849198a2aaa69f959086807b767371706f70717275797e848e939da5afa89f948b7f72675d5145392c1e13080000000000000000000000000000000000000000000000000106090b0c1313131313131313120807050200000000000000000000000000000000000000000000000000000000000000000004090e1112131313131313130e0d0b0703000104070c10131316191b1c1e1f1f20201f1e1d1b181514120f0a0400000000000000000000000000000000000000000000020b141c242c323a41464d5254575f626567696b6c6c6c6c6b6a696765615f5754524d46423b332c241c140a020000000000000000000009121920262a2c2c2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2c2c2b2a29272421201e1914120e0903000000000000000000000000000000000009121920262a2c2c2d2d2d2d2d2d2d2d1f1c18120b030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000106090b0c13131313131313131208070502000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040a0f13151620202020202020171714110c0500000000000000000000000000000000071119202830353e454d545b606a6f79808a92979ea6aeb4aca3978a7d7064574a3d3124170a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b17222c363e44494a5353535353504e4a433a31271c1105000000000000000000000000000000000000000000000000000000000009121b252d373f49515b636d737979797979797979746e64584c4033271a0d010000000000000000000000000000000000000000000000000000000000000000000000000000020c1a242d363f48505a626d727f8b919ba29f938e857d746d6760584e43382c1f13070000000000000000000000000000000000000000000000000000000000000000020c1a242d363f48505a626d727f8b919ba29f938e857d746d6760584e43382c1f1307000000000000000000000000000000000000020f1b27323d44505c666d78808890959b9fa2a39f9d9b9a999999999b9d9fa2a29e9b948f877f776d665c50483e30271d120700000000000000000000000000000109131b23292e313233322f2a241c140a01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b17222d38414f59606d788390959fa7a79f98928c86827f7d7c7b7b7c7e81858b9298a1a8a69f958e81746c61544a3f3428170d0200000000010d1925303a45515c676f7c869298a1a9a79f98928d8783807e7d7c7d7e7f82858b91969ea5afa7a0969082786c60554b4135291d0c010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080f151a1d1f202020202020201a1a17130e070d1113181c1f20232527292a2b2c2c2c2c2b2a282522211f1a15100c0701000000000000000000000000000000000000010b141d262e363e444c52565e61666a6e717476777879797878777673716e6966615e57524d453e362e261c140a0000000000000000000000080f151a1d1f20202020202020202020202020202020202020202020202020201f1f1d1c1a171414110e0805020000000000000000000000000000000000000000080f151a1d1f20202020202020202013100c0701000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070f161b1f22232d2d2d2d2d2d2d2423211c17100800000000000000000000000000000000070e161e2429333b424a505860676d747d858f949fa29f9f9f978a7d7064574a3d3124170a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004101c28333e4850555760606060605d5b554d43382d22160a00000000000000000000000000000000000000000000000000000000000009131b252d373f49515b63666c6c6c6c6c6c6c6c67645c53483c3024180b0000000000000000000000000000000000000000000000000000000000000000000000000000000008121b242d363f48515b626d727f8c919ca39e97918a81796f6a6054483b2e22150900000000000000000000000000000000000000000000000000000000000000000008121b242d363f48515b626d727f8c919ca39e97918a81796f6a6054483b2e221509000000000000000000000000000000000000000a152028343f4a545c666c737c83898e9298989b9c9e9e9f9f9f9e9e9d9a9897928e89827c736c655c544a3f362c1e150b00000000000000000000000000000000010911181e2225252726231f19120a02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006111b262f3d45515c666d7a8390959fa4aaa29f98928f8c8a898888898b8e92979fa2aaa59e949083796d605a5042382e23170500000000000008131e2934404b555f6a707d8692979fa6aaa39f9993908d8b8a89898a8c8f92979da0a8aca59e9590847a6d665b50433a2f24180d00000000000000000000000000000000000000000000000000000000000000020608080b0e1011121313121211100d0b080705020000000000000000000000000000000000000000000009121920262a2c2c2d2d2d2d2d2d2726231f1913181d2023282c2d2f323436373839393938383734322f2e2b261f1c18120b03000000000000000000000000000000000009131d262f38404850565e61686e73777b7e81838485868685858482807e7b77736e69615e57504840382e261c1309000000000000000000000004090e111213131313131313131313131313131313131313131313131313131212110f0d0b0807050200000000000000000000000000000000000000000000000004090e1112131313131313131313060400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000407090a131313131313130a09070400000000000000000007101921272c2f303939393939393931302d28221a120800000000000000000000000000000000040c131921292f383f444e555d606b707a828b9298939393938a7d7064574a3d3124170a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000814202d3944505a61646c6c6c6c6c6a665f554a3e32261a0d0000000000000000000000000000000000000000000000000000000000000109131b252e37404951575960606060606060605a58534a41362b201408000000000000000000000000000000000000000000000000000000000000000000000000000000000009121b242d363f49515b626d727f8c9193939393938e847c6f6256493c2f2316090000000000000000000000000000000000000000000000000000000000000000000009121b242d363f49515b626d727f8c9193939393938e847c6f6256493c2f23160900000000000000000000000000000000000000040b17232e38424a545b606b6f767d8185898c8e9091929293929291908e8c8985817c766f6a605b534a42382e241a0c03000000000000000000000000000000000000070d121618191a1917130e0700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a141d2834404b545e686d7a838d939a9fa7aaa29f9c989695959596989b9fa2a9a8a09e938e827a6d675d51483e30261c1106000000000000020c18232f39434e58606b707d858f949ea0a8aba49f9c9a9796969697989b9ea1a9aca7a09d938e837b6e685e544a3f31281d1307000000000000000000000000000000000000000000000000000000000205090e121415181b1d1e1f20201f1f1e1c1a181514120e09050200000000000000000000000000000000000008121b242b313638393939393939393433302b241d24292c2e34383a3c3f41424445454646454443413e3b3a37312c29231d150d0700000000000000000000000000000007101b252f38404a525a61686d747b8084888b8e8f919292929291918f8d8b8884807b746e69615a524a40382e251b0f0600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050b1014161720202020202020171614100b05000000000000040f19232b32383b3c464646464646463e3c39332c241a10050000000000000000000000000000000002080f171d262d333c434b515961686d757e858686868686867d7064574a3d3124170a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1623303c4955616c7079797979797671665b4e4236291c1000000000000000000000000000000000000000000000000000000000000000010a131c252e3740464b4c53535353535353534e4c4841382f251a0f0300000000000000000000000000000000000000000000000000000000000000000000000000000000000009121b242d373f49515b636d737f86868686868686868174675a4e4134271b0e010000000000000000000000000000000000000000000000000000000000000000000009121b242d373f49515b636d737f86868686868686868174675a4e4134271b0e010000000000000000000000000000000000000006111c263038424a505960636b7075797c7f81838485858685858483817f7c79746f6b6260585049413830261c120900000000000000000000000000000000000000000106090b0c0d0c0a0702000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020b18232e39424c565e686d79808790959b9fa2aaa8a5a3a2a1a2a2a5a7aba49f9c96918981796d685d554b40362c1e150a000000000000000007121d27313c464f59606a6f7b828a91969c9fa3aba8a6a4a3a2a3a4a5a8a8aaa29f9b95908981796e695e564c42382d1f160c01000000000000000000000000000000000000000000000000000002080e11151a1e21222528292b2c2c2c2c2b2b29272522211e1a14120e0902000000000000000000000000000000040f19242d353d424546464646464646413f3c362f282f35393a404546494c4e4f51525253535251504e4b4847433c38342f271f19100a01000000000000000000000000030c19222d37404a525c636c717a81868c9196989a9c9e9f9f9f9f9e9d9c9a9895918d86817b716c645c524a40372d21180e030000000000000000000000020507081313131313131313131313131313131313131313131313131313131313131211100c09060503000000000000000000000000000000000000000000000000000000000000020507080b0e111112131312110f0c0908060300000000000000000406070b0f1213131211100e0c0b0906010000000000000000000000000000000000000000000000010406070a0d10111213131312100e0b070705010000000000000000000000000000000000000000000810161c2023232d2d2d2d2d2d2d2323201c16100800000000000a16212b353d434849535353535353534a49453e362c22170c000000000000000000000000000000000000050b141c2228313940454f565e616d7279797979797979706c6155493c3023160a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1724313d4a5764707d868686868683766a5d5043372a1d100000000000000000000000000000000000000000000000000000000000000000010a131c252e353b3e40464646464646464641403c362f261d1308000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009121b252d373f49515b636d737979797979797979746e64584c4033271a0d01000000000000000000000000000000000000000000000000000000000000000000000009121b252d373f49515b636d737979797979797979746e64584c4033271a0d0100000000000000000000000000000000000000000a141e262f383f444f54596063666d6f72747677787979797877767472706d66636059544e443f382f261e140a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007121d27303a444c565e676d747c83898e9298999b9d9e9f9f9f9e9d9c9999938f8a847d756d675d564c433a2f241a0c030000000000000000010b151f2a343d474f5860696e767e848a8f9299999b9d9e9f9f9f9f9e9d9b9998928e89837d756d675e564d443a2f261c0d040000000000000000000000000000000000000000000000000002080d14191e20262b2e2f323436383939393938373634322e2d2b26201e1a140e0902000000000000000000000000000915202b353f474e52535353535353534d4c474038313a4045474b515356585a5c5d5e5f5f5f5f5e5d5b5855534e47454039312b221b130a0000000000000000000000000a151e2b343f49525c646e737e858d92999da0a8a9a29f9d9c9b9c9d9fa2aaa7a09d99928e857e736e645c52493f332a1f140900000000000000000002080e1114142020202020202020202020202020202020202020202020202020202020201f1e1c191613120f0b06000000000000000000000000000000000000000000000000000003090e121415181b1d1e1f201f1f1d1b191515120f0a0401000000070c101313181c1e1f201f1e1d1b181815120d06000000000000000000000000000000000000000001070d111314171a1c1e1e1f201f1e1d1b181413110d080200000000000000000000000000000000000008111a21272c2f3039393939393939302f2c27211a1108000000030f1b27323d474f545660606060606060575550483e33281c1104000000000000000000000000000000000000020a11171f272f353e444c525b62656c6c6c6c6c6c6c64615a5044392d20140800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1724313d4a5764707d8a9393939083766a5d5043372a1d10000000000000000000000000000000000000000000000000000000000000000000010a131c232a2f323339393939393939393433302b251d140b0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009131b252d373f49515b63666c6c6c6c6c6c6c6c67645c53483c3024180b0000000000000000000000000000000000000000000000000000000000000000000000000009131b252d373f49515b63666c6c6c6c6c6c6c6c67645c53483c3024180b000000000000000000000000000000000000000000020c141d262d333d43484f54545c60636568696b6b6c6c6c6b6b6a676563605c54544f47433d332d261d140c020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b151e28323a444c555c606b6f767c8185898c8e909192929291908f8d8a86827d79706b605d554c443a31281d120800000000000000000000030d18222b353d464e575e616c71787d82868a8c8f90919293929291908e8c8985817d77706b605d554d443b32281d140a00000000000000000000000000000000000000000000000000040c13191f252a2d31373a3b3e41434445464645454443403e3b3a37312d2a251f1a140d050000000000000000000000000e1a26313d4751595e5f6060606060605a58524a403a434b5153545c60626567696a6b6c6c6c6b6b6a6765625f5853514b433d342d251b12090000000000000000000006111c26303d46515b646e74808a92979fa3a9a19e999792908f8f8f909298989d9fa7a39f97928a80736e635b51453b31261a0e0400000000000000050d14191e20212d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2c2c2b292623201f1b17110c0600000000000000000000000000000000000000000000040a0f141a1e212125282a2b2c2c2c2b2a282622211f1b15110d08030b12181c1f2025292b2c2c2c2b2a272524221d1811090100000000000000000000000000000000040a0f13181d20202326292a2b2c2c2c2b2a272521201e1913100b0500000000000000000000000000000005101a232c33383c3d464646464646463d3c38332c231a1005000007131f2c38434f5960636c6c6c6c6c6c6c64615a5045392d2114080000000000000000000000000000000000000000060d151d2429323a41465156585f606060606060575550483e33281c100400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1724313d4a5764707d8a979f9d9083766a5d5043372a1d1000000000000000000000000000000000000000000000000000000000000000000000010a12191e2325262d2d2d2d2d2d2d2d272724201a130b02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000109131b252e37404951575960606060606060605a58534a41362b201408000000000000000000000000000000000000000000000000000000000000000000000000000109131b252e37404951575960606060606060605a58534a41362b20140800000000000000000000000000000000000000000000020b141c222832383d44484a515356595b5d5e5f5f605f5f5e5d5b595653504a48443d383227221b140b0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030c162028323a434b515960636b6f75797d7f828385858685858482807d7a76716d666059514b433a32281f160c000000000000000000000000061019232b343d454d525a61666c70757a7d80828385858686858483817f7c7975706b636059514b433b322920160b02000000000000000000000000000000000000000000000000080e161e25293036393c4247484b4e50515253535252514f4d4b4846423c3a36302a251f170f080000000000000000000000111d2a36424e59636a6c6c6c6c6c6c6c67645c5247404b555d6064666d6f727475777878797978777674716e6a64605c554e463f372d251b11070000000000000000000c17232e38424f59626d74808d929ea1a9a39f97918c8885838282838385888b90959ea1a8a29f928d80736d62574d42362a20160a000000000000050e171e252a2d2e39393939393939393939393939393939393939393939393939393939393938373633302d2b27221b17110a0300000000000000000000000000000000000000060c161b1f252a2d2e31343738393939383735322f2e2b26201d19130c151d23282c2d32353839393838363432312e29231b1309000000000000000000000000000002080d151b1d24292c2d3033363738393939383634312e2d2a251e1c160f0a04000000000000000000000000000b16212c353d44484a535353535353534a48443d352c21160b00000915222f3b4854606b6f79797979797979716c6155493c3023170a000000000000000000000000000000000000000000030b1218202930363f454a4b525353535353534a49443e362c22170b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1724313d4a5764707d8a97a39d9083766a5d5043372a1d10000000000000000000000000000000000000000000000000000000000000000000000000070d1216191920202020202020201b1a18140f0801000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010a131c252e3740464b4c53535353535353534e4c4841382f251a0f030000000000000000000000000000000000000000000000000000000000000000000000000000010a131c252e3740464b4c53535353535353534e4c4841382f251a0f030000000000000000000000000000000000000000000000020a111721272c333839404446494c4e5051525253525251504e4c4946443f3838322b272017110a02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040e162028313940454f54596063676d707375777879797978777673716e6864605c544f454039312820160d0400000000000000000000000000071119222b333b424650545b6064676d707375777879797978787675726f6d67636059544f45403a312920170e050000000000000000000000000000000000000000000000020a121a202830353b4146474e5355585b5c5e5f5f5f5f5e5e5c5a5855534d4846423b363029211a120a02000000000000000000121f2c3845525e6a7579797979797979746e64584c45515d676d7176797c7f81828485858686858483817e7b77716d67605851493f372d23190b020000000000000003101c28343f4a54606b727f8c929ca4aaa299928c84807b787675757677797b7f838a91969fa6a49c928b7f72695f53463d32271b0f0300000000020d1720293036393b4646464646464646464646464646464646464646464646464646464646464544433f3c3937332d28231c150c0500000000000000000000000000000000030a111720272b31363a3b3e4144444546464544423f3c3b37322c29241e191e272e34383a3e42454646454443413f3d3a342d251b1106000000000000000000000000050d131920262b2f35393a3d404344454646464543413e3a3936302c28211b150e06000000000000000000000004101c27333d474f55566060606060606056554f473d33271c100400091623303c4956636f7d868686868686867e7164574a3e3124170b0000000000000000000000000000000000000000000001070e171e252a343a3d3f464646464646463d3c39332c231a10050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1724313d4a5764707d8a97a39d9083766a5d5043372a1d100000000000000000000000000000000000000000000000000000000000000000000000000002060a0c0d13131313131313130e0d0b0803000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010a131c252e353b3e40464646464646464641403c362f261d130800000000000000000000000000000000000000000000000000000000000000000000000000000000010a131c252e353b3e40464646464646464641403c362f261d13080000000000000000000000000000000000000000000000000000060b161b21272c2e34383a3c3f41434445464646454443413f3d3a38342e2c27211b160b06000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050e161f272f343d43484f54555c606366686a6b6c6c6c6b6a696664615e5653514a423d352f271f160d04000000000000000000000000000000071019202930363e424a5053555d606366686a6b6c6c6c6c6b6a686663605c55554f48443d352f281f170e050000000000000000000000000000000000000000000000020b141c242c323a41464d5254575f626567696b6c6c6c6c6b6a696765615f5754524d46423b332c241c140a02000000000000000013202c3946535f6c79878686868686868074675a4d4753606d797e8286898b8d8f90919292929291908e8b88837e796f6a625b51493f352b1d140a0000000000000006121f2c3844505c666f7c87929fa4aba29892878079736f6a6a696869656c6e72777d848f949fa6a49f92867b6e61584e43382b1f13060000000008141e29323b41465353535353535353535353535353535353535353535353535353535353535352514f4c4946443f38342e261e170f070000000000000000000000000000030c151c232832373b4246484b4e505152535252504e4c4847433c39352f28222b30394045464b4f5152535251504e4b4a463f372d23180d0100000000000000000000080e171e252a31373a4045474a4d4f515152535251504e4b4746413a38332b2620181009000000000000000000000714202c38444f5961636c6c6c6c6c6c6c6361594f44382c20140700091623303c4956636f7c8993939393938a7d7164574a3e3124170b000000000000000000000000000000000000000000000000050d131923292e31323939393939393931302d28221a1108000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1724313d4a5764707d8a97a39d9083766a5d5043372a1d100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010a131c232a2f323339393939393939393433302b251d140b010000000000000000000000000000000000000000000000000000000000000000000000000000000000010a131c232a2f323339393939393939393433302b251d140b01000000000000000000000000000000000000000000000000000000040a0f161c1c23282c2d3032353638383939393838373432302d2c28231c1b160f0a040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050d151d232932383d44484b515356595b5d5e5f5f5f5e5d5c5a5754524d464440393029241d150d040000000000000000000000000000000000070e171f252a2f383f44464b515457595c5d5e5f605f5f5e5d5b595653514b48443d383329241d160d050000000000000000000000000000000000000000000000010b141d262e363e444c52565e61666a6e717476777879797878777673716e6966615e57524d453e362e261c140a000000000000000013202c3946535f6c798692939393938d8074675a4d4f5c6875828b8f9298989a9c9d9e9f9f9f9e9e9d9a9895908b847c726d625b51473d2f261c1106000000000003101c28343f4a54606d78839099a3afa39992867d736d67625f585c5c535b6061656c707a828f949fa9a2988f82766a6054473b2e221508000000020e1925303b444c525f60606060606060606060606060606060606060606060606060606060605f5f5e5c5956535049443f38302921191007000000000000000000000000030d151e262e343d43474d5354585b5d5e5f5f5f5e5d5b5955534e4745413a3129343c424b5153585c5e5f5f5f5e5d5a585651493f34291d120600000000000000000008111a202930363c43474b515356595c5d5e5f5f5f5e5d5a5854524c48443e37312a221b120a0100000000000000000916232f3c4855616b7079797979797979706b6155483c2f23160900091623303c4956636f7c89969f9f9f978a7d7164574a3e3124170b0000000000000000000000000000000000000000000000000002080d181d2224252c2d2d2d2d2d2d2423201c17100800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1724313d4a5764707d8a97a39d9083766a5d5043372a1d100000000000000000000000000000000000000000000000000000000000060a0e1011121313131212100e0b0707050100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010a12191e2325262d2d2d2d2d2d2d2d272724201a130b0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000010a12191e2325262d2d2d2d2d2d2d2d272724201a130b02000000000000000000000000000000000000000000000000000000000000050b1012181c1f202326282a2b2c2c2d2c2c2b2a282623201f1c17110f0b040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b121821272c3238394045464a4c4f505252535252514f4d4a4746413b38342e271e18120b0300000000000000000000000000000000000000050d141a1d262d33383a4145474a4d4f50525253535251504e4c494645403938332c272118130c0400000000000000000000000000000000000000000000000009131d262f38404850565e61686e73777b7e81838485868685858482807e7b77736e69615e57504840382e261c13090000000000000013202c3946535f6c7986929f9f9f9a8d8074675a4d4f5c6975828f9c9fa3aaa7a7a4a2a1a1a0a1a3a6a7a79f9d9691877f726d62594f42382d22170b000000000006121f2c3844505c66727f8b95a0aba89f92877d706b605d55534e4f4f495053555a61686d79829097a1a49f94897c6f6256493c2f23160900000005111e2a36414c565e6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6b6a696663605b53504a423b332b23190f0600000000000000000000010b151f2730383f444e54575e6164676a6b6c6c6c6b6a6865625f5854524c433f353c464e545c6065686b6c6c6b6b696765625b51463a2e221509000000000000000008121a232c323a41464e53555d606366696a6b6c6c6c6b696764615e56554f47433c342d241c130a01000000000000000a1723303d4a5663707d868686868686867d7063564a3d3023170a00091623303c4956636f7c8996a2aca4978a7d7164574a3e3124170b000000000000000000000000000000000000000000000000000000060c111517181f202020202020171614100b050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1724313d4a5764707d8a97a39d9083766a5d5043372a1d10000000000000000000000000000000000000000000000000000000040b11161a1d1e1f2020201f1e1d1b181413110d080200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070d1216191920202020202020201b1a18140f080100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070d1216191920202020202020201b1a18140f080100000000000000000000000000000000000000000000000000000000000000000000070c10121316191b1d1e1f1f201f1f1e1d1b19161312100c0600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001070c161b21272c2e34383a3d40424445464646454443403e3b3936302c28231c150c070100000000000000000000000000000000000000000002090b141c22282b2f35393a3d40424445464646454543423f3c3a38342e2c27211c160d070100000000000000000000000000000000000000000000000007101b252f38404a525a61686d747b8084888b8e8f919292929291918f8d8b8884807b746e69615a524a40382e251b0f0600000000000013202c3946535f6c7986929faca79a8d8074675a4d4f5c6976828f9caaa29f9c9a97969594939496999ea0a8a8a099928b7f726b60544a3f33281c0f03000000000713202d3a4653606d7984919ea7ada1968d80736b6059514b474342423f44464850565d676d7a85929b9993908c8275685c4f4235291c0f0200000714202d3946525e6876797979797979797979797979797979797979797979797979797979797979787776726f6c65605c544d453d352b22180d0300000000000000000007121d273139424a50586062696e71747777787979787775726f6a66605d56504540454e5860666d717578797978777674726d62564a3d3124180b0000000000000008111a242c353e444c52585f62676d7073767778797979787674716d68636159534e463f362e251c1309000000000000000a1723303d4a5663707d899393939393897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b000000000000000000000000000000000000000000000000000000000105090b0c131313131313130a0a080400000000000000000000000000000000000000000000000000000002050708080808080808080808080808080808080808080808080808080a1724313d4a5764707d8a97a39d9083766a5d5043372a1d100000000000000000000000000000000000000000000000000000050e161c2227292a2c2c2d2c2c2b29282521201d19130f0a0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002060a0c0d13131313131313130e0d0b08030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002060a0c0d13131313131313130e0d0b08030000000000000000000000000000000000000000000000000000000000000000000000000000040607090c0e1011121313131211100e0c0a07060300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040a0f161b1d23282c2d303335373839393938373633312e2d2a251f1c18120b0300000000000000000000000000000000000000000000000000020a11171c1f24292c2d30333537383939393938373533302d2c28231d1c16100b0500000000000000000000000000000000000000000000000000030c19222d37404a525c636c717a81868c9196989a9c9e9f9f9f9f9e9d9c9a9895918d86817b716c645c524a40372d21180e03000000000013202c3946535f6c7986929faca79a8d8074675a4d4f5c6976828f9c9a9892908d8b8988878787898c91969fa2aaa39f93877d70665b5044382b1f120700000004101d2935404b5564717d8a96a1acaa9e9184796d60594f45403937312d3337393e444c555e68717e8b8e8a86837f7c6f6255483c2f2215090000000814212e3b4754616e7a8686868686868686868686868686868686868686868686868686868686868584827f7c78716d665e574f473d342a1f150b0100000000000000020c18242f39434b545c606a6f757b7e8183848586858583817f7c78726d68625a514b4d57606a6f797e82848586858483817f7265584b3f3225180c000000000000050f1a232c363e474f565e616a6f747a7d808284848586858483817e7a76706b625f58514840372e251b11070000000000000a1723303d4a5663707d89969f9f9f96897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002090e11141415151515151515151515151515151515151515151515151515151724313d4a5764707d8a97a39d9083766a5d5043372a1d1000000000000000000000000000000000000000000000000000040e1720272e3336373939393939383634312e2d2a251e1a150e060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040b0f12181c1f202326282a2b2c2c2c2b2a29272421201e1914100c070000000000000000000000000000000000000000000000000000000000060b0f13181d20212426292a2b2c2d2c2c2b2a282623201f1c1812100b050000000000000000000000000000000000000000000000000000000a151e2b343f49525c646e737e858d92999da0a8a9a29f9d9c9b9c9d9fa2aaa7a09d99928e857e736e645c52493f332a1f1409000000000013202c3946535f6c7986929faca79a8d8074675a4d505c6976838f918d898583807e7c7b7a7a7b7d7f848b9298a2aba4999083786c605346392e23180c0000000613202c3945515d6775828f9ba8aea3988b7e71675d51473d352f2b2622272b2d323a434c56606d7883817e7a76736f6a5f53473b2e2115080000000814212e3b4754616e7a87939393939393939393939393939393939393939393939393939393999292918f8c89837e786e6960594f463c31271d1207000000000000000a141e2935404b555d666d747c82878b8e909192929291908e8c88847f7a716d605d55535f696f7c848b8f9192929291908d86796c605346392d20130000000000020d17212c353e48505961686d757c8186898c8f909192929291908d8b86827d766f6a625b524940372d23190d0300000000000a1723303d4a5663707d8996a3aca396897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b0000000000000000000000000000000000000000010507080b0e10111213131211100e0b0807050100000000000000000000000000000000000000000000000000000000050d14191e202121212121212121212121212121212121212121212121212121212124313d4a5764707d8a97a39d9083766a5d5043372a1d10000000000000000000000000000000000000000000000000000b16202932393f434445464646454543413e3a3936302b2620180f0900000000000000000000000000000000000000000000000000000004090e1112131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313130b0a0804000000000000000000000004090e1112131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313130b0a0804000000000000000000000000000000000000000000040613131313131313131312110e090400000000000000000000000000000000000000000000000000000000020507080b0e111112131312110f0c0908060300000000000000000406070b0f1213131211100e0c0b0906010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070c10131317191c1d1f1f201f1f1e1c1a171414110e080400000000000000000000000000000000000000000000000000000000000000000003070d111314171a1c1d1f1f20201f1e1d1b19161313100c07000000000000000000000000000000000000000000000000000000000006111c26303d46515b646e74808a92979fa3a9a19e999792908f8f8f909298989d9fa7a39f97928a80736e635b51453b31261a0e040000000013202c3946535f6c7986929faca79a8d8074675a4d505c6976838a85807c797674716f6e6e6d6e7073787e869299a3aba0958a7e7164544b4034281c100400000714202d3a4753606d7a86929facac9f92867a6d60554b403529241d1a171b1f2028313a44515c666d7775716d6866625f584e43372b1f12060000000814212e3b4754616e7a87949f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9fa39f9e9d9c9995908b837b6f6b60584e43392f23180c02000000000006111c26303845515d676d7880898f93999a9d9e9f9f9f9e9d9b9896918c857e756d675d58626e7b8691969b9e9f9f9e9e9c9386796c605346392d2013000000000009141f29333d47505a616b707a82888e9298999c9d9e9f9f9f9e9c9a99938f8a837c726d635c52493f352b1f150b01000000000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b00000000000000000000000000000000000003080d111414171a1c1e1f20201f1e1d1a171414110d080300000000000000000000000000000000000000000000000000050e171f252a2d2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e313d4a5764707d8a97a39d9083766a5d5043372a1d1000000000000000000000000000000000000000000000000006111c27323b434a4f51525353535251504e4b4746413a37312a221b120900000000000000000000000000000000000000000000000000080f151a1d1f20202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020171714110c050000000000000000080f151a1d1f20202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020171714110c050000000000000000000000000000000001070c10132020202020202020201f1d1a150f080000000000000000000000000000000000000000000000000003090e121415181b1d1e1f201f1f1d1b191515120f0a0401000000070c101313181c1e1f201f1e1d1b181815120d060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000406070a0d0f11121313131211100d0b0807050200000000000000000000000000000000000000000000000000000000000000000000000000010406070a0d0f11121313131212100f0c09070604000000000000000000000000000000000000000000000000000000000000000c17232e38424f59626d74808d929ea1a9a39f97918c8885838282838385888b90959ea1a8a29f928d80736d62574d42362a20160a0000000013202c3946535f6c7986929faca79a8d8074675a4d4e5a6774807d7974706d666764636261606163656c727d87929faca79b8f8275665c5145382c1f130600000a1723303d4a5663707d8998a3aea89b8e8275675d51433a2f23181d1d1d1d1d161f2834404a545c606a6864615e5655534e463c32261b0f030000000814212e3b4754616e7a8794a1acacb4aeaca6a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a6a8aaa9a7a09d9590857d6f6a5f554b4034291e130800000000000b17232e3842505a606d79828d929b9fa4ababa39f9d9c9b9c9d9fa19e97928b82796d685f6a76828f98a1a8aaa39f9995949386796c605346392d201300000000020e1a25303b454f59616c717d858f939a9fa3aaa9aaa8a7a6a7a9a9aba49f9c9490867f736e635b51473d31271d1207000000000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b00000000000000000000000000000000060b1014191e20212427292b2c2c2c2c2b2a272421201e19140f0b0600000000000000000000000000000000000000000000020d17202930363a3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3d4a5764707d8a97a39d9083766a5d5043372a1d100000000000000000000000000000000000000000000000000a16222e39434d555b5d5f5f605f5f5e5c5b5854524c47433c342d241b1108000000000000000000000000000000000000000000000009121920262a2c2c2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2423211c17100800000000000009121920262a2c2c2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2423211c1710080000000000000000000000000000030b12181c1f2d2d2d2d2d2d2d2d2c2c2a262019120900000000000000000000000000000000000000000000040a0f141a1e212125282a2b2c2c2c2b2a282622211f1b15110d08030b12181c1f2025292b2c2c2c2b2a272524221d181109010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003101c28343f4a54606b727f8c929ca4aaa299928c84807b787675757677797b7f838a91969fa6a49c928b7f72695f53463d32271b0f0300000013202c3946535f6c7986929faca79a8d8074675a4d4c58646e74716d6663605c54585655545454535b606b74818d9aa9ac9f9285796d6053463a2d20130700000d1a2733404d5a6673808d99aab4aa978b7e7164554c4131282a2a2a2a2a2a2a2a2a232e39424a51535d5b5754524c4847433c342a20150a000000000814212e3b4754616e7a8794a7afb4aba39f9a9898989898989898989898989898989898989898999b9ea1a9aca79f9792857c6e675c51453a3025190d0100000003101c28343f4a54616c74818e949da4aca7a09d9992908f8f8f9192999a9e9f948f837a6d666f7c88949faaaea398928c88878886796c605346392d20130000000005121e2a36424d57606b717e8791979ea5acaba9a19e9b9a9a9b9d9fa4abaca69f98928b80736d62594f43392f23180c000000000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b0000000000000000000000000000020a11171c1f252a2d2e3134363839393938373634312e2d2a251f1b17110a02000000000000000000000000000000000000000009141f29323b4246474848484848484848484848484848484848484848484848484848484848484a5764707d8a97a39d9083766a5d5043372a1d100000000000000000000000000000000000000000000000020e1a27333f4a555f676a6c6c6c6c6c6b696764615e56534e463e362d23190b0200000000000000000000000000000000000000000008121b242b3136383939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393931302d28221a12080000000008121b242b3136383939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393931302d28221a1208000000000000000000000000030d151d23292c3939393939393939393836312b241b12080000000000000000000000000000000000000000060c161b1f252a2d2e31343738393939383735322f2e2b26201d19130c151d23282c2d32353839393838363432312e29231b13090000000000000000000000000000000000020507080b0e111112131312110f0c0908060300000000000000000406070b0f1213131211100e0c0b09060100000000000000000000000000000000000000050a0d0f101313100f0d0a050000000000000000000000000000000000000000000000000000000000000000060a0e1011121313131212100e0b0707050100000000000000000000000000000000000000000000000006121f2c3844505c666f7c87929fa4aba29892878079736f6a6a696869656c6e72777d848f949fa6a49f92867b6e61584e43382b1f130600000013202c3946535f6c7986929faca79a8d8074675a4d47525c646764605c5453514b4b4948474748495059626e7b8897a1ada298887c6f6255493c2f2216090004101c2834404b546976828f9ca9aea398887b6f6255483c2f3737373737373737373737373039404446514e4b4746413c3b37322a261f180f060000000814212e3b4754616e7a87959fa3aba399928d8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8c8c8f92979ea1a9a9a2979184796d60564c41362a1d110500000006121f2b3844505c66717e8b939ea6aea59d95908a86838282838486898d92979f959083786d73808d99a6b0a89f9286807c7a7b7d7063574a3d3024170a000000030e18212d3a46525e69707d879299a1a9ada79f9d97928f8d8d8e9093999fa2aaaaa39f928b7f726b60554b4034291c12070000000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b00000000000000000000000001070c141c23282b3036393b3e414344454646454443413e3b3936302b27221b140b07000000000000000000000000000000000000020e1925303b444d5254545454545454545454545454545454545454545454545454545454545454545764707d8a97a39d9083766a5d5043372a1d10000000000000000000000000000000000000000000000003101d2936434f5b6771777879797978787674716d68625f5850483e352b1d140a0000000000000000000000000000000000000000040f19242d353d4245464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646463e3c39332c241a10050000040f19242d353d4245464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646463e3c39332c241a100500000000000000000000010b151f272f343846464646464646464645423d352d24190f040000000000000000000000000000000000030a111720272b31363a3b3e4144444546464544423f3c3b37322c29241e191e272e34383a3e42454646454443413f3d3a342d251b1106000000000000000000000000000003090e121415181b1d1e1f201f1f1d1b191515120f0a0401000000070c101313181c1e1f201f1e1d1b181815120d0600000000000000000000000000000000030a11161a1c1d20201d1c1a16110a0300000000000000000000000000000000000000000000000000000000040b11161a1d1e1f2020201f1e1d1b181413110d080200000000000000000000000000000000000000000003101c28343f4a54606d78839099a3afa39992867d736d67625f585c5c535b6061656c707a828f949fa9a2988f82766a6054473b2e22150800000013202c3946535f6c7986929faca79a8d8074675a4d414a52585a5753504a4645403e3c3b3b3a3b3f47535f6a7885929eabaa968a7d7063574a3d3024170a0006131f2c3845515c667884919eabac9f9286796d6053464444444444444444444444444444444444444444444444444444443b3a36312a21180e0300000714202d3a4753606d79838c9299a29f9286807f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f8082858a91969fa7a9a0968c7f73685e5246392d2013080000000713202d3a4653606d7884919ea5afa69d938e837d797776757677797c80858c9298958e81747683909ca9aca0958a7e736f6e6e706b6155483c2f2316090000000915202c38444f59616e7b869299a3abada49c959089858281808183878c9298a0a8aea49f93877d6f675c5145392e23180c0000000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b0000000000000000000000030b12181e262e34383b4146474a4d4f515253535251504d4a4746413b37332d261d18120b030000000000000000000000000000000005111e2a36424d565e61616161616161616161616161616161616161616161616161616161616161616164707d8a97a39d9083766a5d5043372a1d10000000000000000000000000000000000000000000000004111e2a3744515d6a778385868686858483817e7a756e6a615a50473d2f261b1106000000000000000000000000000000000000000915202b353f474e52535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353534a49453e362c22170c00000915202b353f474e52535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353534a49453e362c22170c0000000000000000000007121d2731394045535353535353535353524e473f352b20150900000000000000000000000000000000030c151c232832373b4246484b4e505152535252504e4c4847433c39352f28222b30394045464b4f5152535251504e4b4a463f372d23180d010000000000000000000000040a0f141a1e212125282a2b2c2c2c2b2a282622211f1b15110d08030b12181c1f2025292b2c2c2c2b2a272524221d1811090100000000000000000000000000040d151c2226292a2d2d2a2926221c150d040000000000000000000000000000000000000000000000000000050e161c2227292a2c2c2d2c2c2b29282521201d19130f0a030000000000000000000000000000000000000006121f2c3844505c66727f8b95a0aba89f92877d706b605d55534e4f4f495053555a61686d79829097a1a49f94897c6f6256493c2f23160900000013202c3946535f6c7986929faca79a8d8074675a4d4141474c4e4a46443f3a38342e302f2e2d2d37434e586a7784909daaa4978b7e7164584b3e3125180b000713202d3a4653606d7986939facaa9d908477665c50505050505050505050505050505050505050505050505050505050504846423b332a1f140900000613202c3945515d676d787f879297a29992867e727272727272727272727272727272727272727375797e8490959fa9a89f92867a6d6154473a2f24190d0100000b1824313e4b5764717e8a96a0acac9f948e8179716d67696869676d70747a7f869095938a7e7885929fabaa9d9184776c6261616361594f44382c2014070000020f1a26313c4855616b75828f98a2abada39b928c837d7975747374767a7f869196a0a8afa4999184796d60544a4034281c100400000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b00000000000000000000050d151d242930383f44464c5254575a5c5e5f5f5f5f5e5d5a5754524c46443f382f28231c150c030000000000000000000000000000000714202d3a46525e696e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e707d8a97a39d9083766a5d5043372a1d10000000000000000000000000000000000000000000000006121f2c3945525f6c78859292999292918f8e8b87827c716c61594f41382d22170b000000000000000000000000000000000000000e1a26313d4751595e5f606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060575550483e33281c1104000e1a26313d4751595e5f606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060575550483e33281c11040000000000000000000c18232f39434b515f606060606060605f5e5951473d31261a0e010000000000000000000000000000030d151e262e343d43474d5354585b5d5e5f5f5f5e5d5b5955534e4745413a3129343c424b5153585c5e5f5f5f5e5d5a585651493f34291d120600000000000000000000060c161b1f252a2d2e31343738393939383735322f2e2b26201d19130c151d23282c2d32353839393838363432312e29231b1309000000000000000000000000030d161f272d32353639393635322d271f160d03000000000000000000000000000000000000000000000000040e1720272e3336373939393939383634312e2d2a251e1a150e060000000000000000000000000000000000000713202d3a4653606d7984919ea7ada1968d80736b6059514b474342423f44464850565d676d7a85929b9993908c8275685c4f4235291c0f02000013202c3946535f6c7986929faca79a8d8074675a4d41363c3f413e3a38342e2c2823232221212c3844505c667784919daaa5988b7f7265584b3f3225180c000815212e3b4854616e7b879aa4afa99c90837669545d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d55534d453b31261a0e020004101d2935404b555d666d727d859298a29892877f716b6565656565656565656565656565656566666d717a839097a1ada2988b7f7265564c4135291d11040005121e2a36424d576875818e9ba8afa49a8f82786d66605d555c555c6063676d727b838f9391857b8797a2ada79a8d8074675a545557554f473e33281c1004000006121f2b37434e5863707d8a939eaaafa59b918b8078706c66676768686d737b849196a0acaba0968c7f72665c5144382c1f120600000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b000000000000000000050e161f272f353e424a5053565e616467696b6c6c6c6b6a696764615e56535049413d342e271e150c0300000000000000000000000000000814212e3b4754616e7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7f8b98a49d9083766a5d5043372a1d10000000000000000000000000000000000000000000000006121f2c3945525f6c7885929493939496999a99938e867e716b6053493f33271b0f03000000000000000000000000000000000000111d2a36424e59636a6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c64615a5045392d21140800111d2a36424e59636a6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c64615a5045392d211408000000000000000004101c2934404b555c6c6c6c6c6c6c6c6c6c6a63594e42362a1d110400000000000000000000000000010b151f2730383f444e54575e6164676a6b6c6c6c6b6a6865625f5854524c433f353c464e545c6065686b6c6c6b6b696765625b51463a2e2215090000000000000000030a111720272b31363a3b3e4144444546464544423f3c3b37322c29241e191e272e34383a3e42454646454443413f3d3a342d251b110600000000000000000000000a151f2831383e4243464643423e3831281f150a0000000000000000000000000000000000000000000000000b16202932393f434445464646454543413e3a3936302b2620180f090000000000000000000000000000000004101d2935404b5564717d8a96a1acaa9e9184796d60594f45403937312d3337393e444c555e68717e8b8e8a86837f7c6f6255483c2f22150900000013202c3946535f6c7986929faca79a8d8074675a4d4134303334312d2c28231f1c18161e2429363e4653606d7985929facab978a7e7164574b3e3124180b000916232f3c4956626f7c8995acb6a89c8f82756a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a615f574d42362a1e120500010d18242f39434b545c606b707d86929fa29992877d70675d5858585858585858585858585859545c60686d7a85919ea9aa9c908376685d5245392c201306000714202d3a46525e697885919eabac9f93877c6f665c54514b4f4b5153555d60696e79818f949083909da9b3a4988b7e7165584b484a48443e352c21160b0000000814212e3a47535f6a7683909ca5afa99e938b7f736c65605b545a565e61696e7a84919aa4afa89e9285796d6053463a2d22170b00000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b0000000000000000040d162028313940454f545c6064686e7174767778797978777674716e6863605b534e44403930271e150c0300000000000000000000000000111e2a3744515d6a7784878787878787878787878787878787878787878787878787878787878787878787878b919ba99d9083766a5d5043372a1d10000000000000000000000000000000000000000000000006121f2c3945525f6c78858887868787898d92979f9892887d70655b5044372b1f1205000000000000000000000000000000000000121f2c3845525e6a7579797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979716c6155493c3023170a00121f2c3845525e6a7579797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979716c6155493c3023170a000000000000000006131f2c3845515c67767979797979797979756a5e5245382c1f12060000000000000000000000000007121d273139424a50586062696e71747777787979787775726f6a66605d56504540454e5860666d717578797978777674726d62564a3d3124180b00000000000000030c151c232832373b4246484b4e505152535252504e4c4847433c39352f28222b30394045464b4f5152535251504e4b4a463f372d23180d0100000000000000000005111c27313a434a4e505353504e4a433a31271c11050000000000000000000000000000000000000000000006111c27323b434a4f51525353535251504e4b4746413a37312a221b12090000000000000000000000000000000613202c3945515d6775828f9ba8aea3988b7e71675d51473d352f2b2622272b2d323a434c56606d7883817e7a76736f6a5f53473b2e21150800000013202c3946535f6c7986929faca79a8d8074675a4d413427262724201f1c1713141920282f353f48515b63707d8998a2aea399897c6f6356493c30231609000a1623303d495663707c8996a3afa89b8e8177777777777777777777777777777777777777777777777777777777777777776e695f53463a2d211407000007121d283139424a5059606b717e8b949fa39991857a6d60564c4c4c4c4c4c4c4c4c4c4c4c4c4a51565e68717e8b97a1a69f94877a6d6054473a2d211407000815212e3b4854616e7b8797a1adaa9d9083776a5f544b4540424045474b51575f676d78828f9590959fabb0a3968a7d7063574a3d3d3c38332c231a10050000000815222f3b4855626e7b88949fabada2978e81746d605b53504a4d4c52575e68707d87939facada1978a7d716453493f33271b0f03000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b00000000000000010c161f28323a434b515961666d71767a7e808284858686858483807d7a76706c656058514a423930271e150a00000000000000000000000000111e2a3744515d6a778490949494949494949494949494949494949494949494949494949494949494949494989ba3a99d9083766a5d5043372a1d100000000000000000000000000000000000000000000000000916232f3c4956626f7c7b7a7a7a7b7d808590959f9a9184786c605346392d20130600000000000000000000000000000000000013202c3946535f6c79878686868686868686868686868686868686868686868686868686868686868686868686868686868686868686867e7164574a3e3124170b0013202c3946535f6c79878686868686868686868686868686868686868686868686868686868686868686868686868686868686868686867e7164574a3e3124170b00000000000000000714202d3a4753606d798686868686868687796c5f5346392c201306000000000000000000000000020c18242f39434b545c606a6f757b7e8183848586858583817f7c78726d68625a514b4d57606a6f797e82848586858483817f7265584b3f3225180c000000000000030d151e262e343d43474d5354585b5d5e5f5f5f5e5d5b5955534e4745413a3129343c424b5153585c5e5f5f5f5e5d5a585651493f34291d12060000000000000000000a16222d38434c545a5d60605d5a544c43382d22160a000000000000000000000000000000000000000000000a16222e39434d555b5d5f5f605f5f5e5c5b5854524c47433c342d241b110800000000000000000000000000000714202d3a4753606d7a86929facac9f92867a6d60554b403529241d1a171b1f2028313a44515c666d7775716d6866625f584e43372b1f120600000013202c3946535f6c7986929faca79a8d8074675a4d4134271a1b171312100e171f252a323a4145515a626d76828f9caaac9f9286796d6053473a2d201407000a1724303d4a5763707d8a96a3b0ab9e928583838383838383838383838383838383838383838383838383838383838383837b6e6155483b2e2215080000010c161f2830383f444f59626c76828f9ca7a1978d8073685e52463f3f3f3f3f3f3f3f3f3f3f40444c56606d7985929a999896897c6f6356493c30231609000916222f3c4955626f7c8895a9b3a79a8d817467584e4239352f34383a40454d555c666d7a85919d9fa7b1afa396897c706356493d302f2c28211a110800000005121e2a36424d576774808d9aa6b0ac9f92857a6d615b5049443f4041464d56606b75828f9baab3a99b8e8175655b5044372b1f1205000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b0000000000000008131e28313a444c555d606b70787e82868a8d8f919292929291908d8a87827d786f6a605c544a423930261c1106000000000000000000000000111e2a3744515d6a7784909da1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a4a7aca99d9083766a5d5043372a1d100000000000000000000000000000000000000000000000000815222e3b4754606a6f6e6d6d6d6e70737a83909da096897c6f6356493c3023160900000000000000000000000000000000000013202c3946535f6c798692939393939393939393939393939393939393939393939393939393939393939393939393939393939393938a7e7164574a3e3124170b0013202c3946535f6c798692939393939393939393939393939393939393939393939393939393939393939393939393939393939393938a7e7164574a3e3124170b00000000000000000714202d3a4753606d7a8693939393939286796c5f5346392c2013060000000000000000000000000a141e2935404b555d666d747c82878b8e909192929291908e8c88847f7a716d605d55535f696f7c848b8f9192929291908d86796c605346392d20130000000000010b151f2730383f444e54575e6164676a6b6c6c6c6b6a6865625f5854524c433f353c464e545c6065686b6c6c6b6b696765625b51463a2e2215090000000000000000010d1a26323e4a545e66696c6c69665e544a3e32261a0d010000000000000000000000000000000000000000020e1a27333f4a555f676a6c6c6c6c6c6b696764615e56534e463e362d23190b02000000000000000000000000000a1723303d4a5663707d8998a3aea89b8e8275675d51433a2f23181d1d1d1d1d161f2834404a545c606a6864615e5655534e463c32261b0f0300000013202c3946535f6c7986929faca79a8d8074675a4d4134271a0e0b070b1218202930363e444c525b626c727f8b949faba89c8f8376675d5145392c1f1306000a1724313d4a5764707d8a97a3b0ada1979290909090909090909090909090909090909090909090909090909090909090887b6e6255483b2f221508000000040d161e262e343d47505a63707c8995a0a99f92867a6d6154473b3032323232323232322e343a45515c6674818e8e8c8b89887f7265584c3f3225190c000a1723303d4a5663707d8996a3b0a6998c7f7366594c402f2924292c2f353b434b545d68707d8a959fabb7afa396897c706356493d3023201c161008000000000714212d3a46535f697884919eabafa49a8c7f73685e52443f383330363b444f5963707d8a98a2aeab9f9285796c605346392d201306000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b000000000000050e19242f3a434c565e676d747d848a8f93999a9c9e9f9f9f9e9d9c9a9a938f8a837c736d665c544a42382e23170b020000000000000000000000111e2a3744515d6a7784909d9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9d9083766a5d5043372a1d1000000000000000000000000000000000000000000000000006131f2b38434e586062616160606163686f7c8899a4988b7e7265584b3f3225180c00000000000000000000000000000000000013202c3946535f6c7986929f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f978a7d7164574a3e3124170b0013202c3946535f6c7986929f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f978a7d7164574a3e3124170b00000000000000000714202d3a4753606d7a86939f9f9f9f9286796c5f5346392c201306000000000000000000000006111c26303845515d676d7880898f93999a9d9e9f9f9f9e9d9b9896918c857e756d675d58626e7b8691969b9e9f9f9e9e9c9386796c605346392d2013000000000007121d273139424a50586062696e71747777787979787775726f6a66605d56504540454e5860666d717578797978777674726d62564a3d3124180b0000000000000000030f1c2935424e5a66707679797670665a4e4235291c0f03000000000000000000000000000000000000000003101d2936434f5b6771777879797978787674716d68625f5850483e352b1d140a000000000000000000000000000d1a2733404d5a6673808d99aab4aa978b7e7164554c4131282a2a2a2a2a2a2a2a2a232e39424a51535d5b5754524c4847433c342a20150a0000000013202c3946535f6c7986929faca79a8d8074675a4d4134271a0e030c151c2328323b41464f565d606d727e87929fa6ada1968b7e7165554b4035291d1004000a1724313d4a5764707d8a97a3b0b3a9a19e9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d94887b6e6155483b2e22150800000000040c141c2328353f4854606b7783909daaa3988c7f7266574d42362a25252525252525232834404b5464717e8281807e7d7c796d6053473a2d201407000a1724313d4a5764707d8a97a3b0a5988c7f7265594c3f2e23181c1f24293139424c56616c7683909da9b3afa396897c706356493d302316100b0500000000000815222e3b4855616e7b8896a1aca69f93877b6e61564c41332d28252a323d4653606c7985929fabada297887b6e6155483b2e221508000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b0000000000020d17202935414c555e686d79818a91969c9fa4aba5aba49f9fa4aca5aca49f9c95908780786d665c544a3f34281d140a0000000000000000000000111e2a3744515d6a77839093939393939393939393939393939393939393939393939393939393939393939393939393939083766a5d5043372a1d10000000000000000000000000000000000000000000000000030f1b27323d464e5456555453545456606c7986939f998c807366594d4033261a0d00000000000000000000000000000000000013202c3946535f6c7986929facacacaea9a7a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a4978a7d7164574a3e3124170b0013202c3946535f6c7986929facacacaea9a7a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a4978a7d7164574a3e3124170b00000000000000000714202d3a4753606d7a8693a0acac9f9286796c5f5346392c20130600000000000000000000000b17232e3842505a606d79828d929b9fa4ababa39f9d9c9b9c9d9fa19e97928b82796d685f6a76828f98a1a8aaa39f9995949386796c605346392d201300000000020c18242f39434b545c606a6f757b7e8183848586858583817f7c78726d68625a514b4d57606a6f797e82848586858483817f7265584b3f3225180c000000000000000003101d2a3643505d69768286868276695d5043362a1d1003000000000000000000000000000000000000000004111e2a3744515d6a778385868686858483817e7a756e6a615a50473d2f261b1106000000000000000000000004101c2834404b546976828f9ca9aea398887b6f6255483c2f3737373737373737373737373039404446514e4b4746413c3b37322a261f180f0600000013202c3946535f6c7986929faca79a8d8074675a4d4134271a0e0c151e272e343e444d525961686d757f879299a3afa59e9184796d6053463a2f24180c00000a1723303d4a5663707d8996a3b0b8b0aba99f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9fa9aaaaaaaaaa94877a6e6154473b2e2114080000000000020a1117232c38444f596673808c99a6aa9d918477695e52463a2d2019191919191918232e394955616c7176747371706f6d675d5145392c201306000a1723303d4a5663707d8996abb5a6998d807366544a403428211e1a181f27303a44505a64707d8a97a2adafa396897c706356493d3023160a000000000000000b1825313e4b5864717e8b939a979a9c908376695e52443a30221b19202b3844505b6676838f9ca9b3a9978a7d7064574a3d3124170a000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b000000000008141e29323b45515d676d7a838e939ea0a8a7a09d99959993939a96999ea0a8a7a099928c81786d665c50443d2f261c110600000000000000000000111e2a3744515d6a77838686868686868686868686868686868686868686868686868686868686868686868686868686868683766a5d5043372a1d10000000000000000000000000000000000000000000000000000a162027333f49535b606060606062666e7b8799a4988c7f7265594c3f3226190c00000000000000000000000000000000000013202c3946535f6c7986929facb9aea49d9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a978a7d7164574a3e3124170b0013202c3946535f6c7986929facb9aea49d9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a978a7d7164574a3e3124170b00000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000003101c28343f4a54616c74818e949da4aca7a09d9992908f8f8f9192999a9e9f948f837a6d666f7c88949faaaea398928c88878886796c605346392d2013000000000a141e2935404b555d666d747c82878b8e909192929291908e8c88847f7a716d605d55535f696f7c848b8f9192929291908d86796c605346392d2013000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000000000006121f2c3945525f6c78859292999292918f8e8b87827c716c61594f41382d22170b000000000000000000000006131f2c3845515c667884919eabac9f9286796d6053464444444444444444444444444444444444444444444444444444443b3a36312a21180e03000013202c3946535f6c7986929faca79a8d8074675a4d4134271a0b151e273039404450565e616b707a818b9299a3aba79e938b7e71665c5145382c1d12070000091623303c4956636f7c8996a2afb0a69f9c9393939393939393939393939393939393939393939393939c9ea6b0aea398877a6d6054473a2d2114070000000000000006101b27323d4956636f7c8996a9aca095877b6e6154483b2e21150c0c0c0c07121d2d3944505a6164696766656362605d554b4035291d1104000915222f3c4855626f7b8899a3afa89b8f8275665c51443a322d2b2627272628323e4653606d7985929fabafa396897c706356493d3023160a000000000000000c1925323f4c5865727f8486898b8d8f8c807366574d4232281e110f1c28333f4a546774808d9aa7b2a5988b7f7265584c3f3225190c000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b00000000010d1925303b44515b606d798390959ea5a9a19e95908c8987868687898c91969ea1a9a39f938f81786d60584e42382d22170b00000000000000000000101d2936424f5b677177797979797979797979797979797979797979797979797979797979797979797979797979797979797671665b4e4236291c100000000000000000000000000000000000000000000000000005121f2b3744505b656c6d6c6c6d6f7278818e9ba095897c6f6356493c3023160900000000000000000000000000000000000013202c3946535f6c7986929facb9a99d928d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8a7e7164574a3e3124170b0013202c3946535f6c7986929facb9a99d928d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8a7e7164574a3e3124170b00000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000006121f2b3844505c66717e8b939ea6aea59d95908a86838282838486898d92979f959083786d73808d99a6b0a89f9286807c7a7b7d7063574a3d3024170a00000006111c26303845515d676d7880898f93999a9d9e9f9f9f9e9d9b9896918c857e756d675d58626e7b8691969b9e9f9f9e9e9c9386796c605346392d2013000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000000000006121f2c3945525f6c7885929493939496999a99938e867e716b6053493f33271b0f03000000000000000000000713202d3a4653606d7986939facaa9d908477665c50505050505050505050505050505050505050505050505050505050504846423b332a1f1409000013202c3946535f6c7986929faca79a8d8074675a4d4134271a121d273039424a515a62686e757d848e939fa3aba8a0958f81756c61544b4034281c0b0100000815222f3b4855626e7b8895a9b3ab9f948f8686868686868686868686868686868686868686868686868f949eaaac9f928579675d5145392c20130600000000000000000b14212d3a4754606d7a8797a1ada7978b7e7164584b3e3125180b00000000101c28333e485055575c5b5958565553514b433a2f24180d01000714202d3a4753606d7a86929facab9e9285796d60564c443d3a373134333332323845515c6675828f9ca8afa396897c706356493d3023160a000000000000000b1824313e4a56626d72787a7c7e8082847d7063574a3d3024160c0b17222d404c5966737f8c99a6b2a6998d8073665a4d4033271a0d000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b0000000005111e2a36414c56626d75828f959fa7a8a097928a837f7c7a79797a7c7f848a9297a0a8a59e938d80736a60544a3f33281c0f030000000000000000000e1a27333f4a555f676a6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6a665f554a3e32261a0d000000000000000000000000000000000000000000000001080d13202d394653606c777979797a7b7e838e939e989083786c605346392d20130600000000000000000000000000000000000013202c3946535f6c7986929facb3a79a8d80808080808080808080808080808080808080808080808080808080808080808080808080807c6f6255483c2f2215090013202c3946535f6c7986929facb3a79a8d80808080808080808080808080808080808080808080808080808080808080808080808080807c6f6255483c2f22150900000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000713202d3a4653606d7884919ea5afa69d938e837d797776757677797c80858c9298958e81747683909ca9aca0958a7e736f6e6e706b6155483c2f2316090000000b17232e3842505a606d79828d929b9fa4ababa39f9d9c9b9c9d9fa19e97928b82796d685f6a76828f98a1a8aaa39f9995949386796c605346392d2013000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000000000006121f2c3945525f6c78858887868787898d92979f9892887d70655b5044372b1f1205000000000000000000000815212e3b4854616e7b879aa4afa99c90837669545d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d55534d453b31261a0e020013202c3946535f6c7986929faca79a8d8074675a4d4134271a18232e39434b545c606c717b818a91969ea5afa69f959083796d605a5042392e23180c0000000714212d3a4754606d7a8797a2ada99c8f82797979797979797979797979797979797979797979797979828f9ca9ab9e9184786b554b4135291d110400000000000000030613202c3945515d677885919eaba6998d8073665a4d4033271a0d0c0c0c0c0b17222c363e44494a4f4e4d4b4a484745403a31281d1307000006131f2c3945515d677783909dabada1978a7e71685e564f484742424140403f3f3f404b546673808c99a6afa396897c706356493d3023160a000000000000000916222e3a46515b6265676d6f71737578706b6155483c2f231604061925323f4c5865727f8b98a5b2a79a8d8074675a4d4134271a0e000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b000000000714202d3946525e68727f8b949ea7a9a09591857e77726f6d686c6d6f72787e859196a0a9a59f93877c6f665b5044382b1f13080000000000000000000a16222e39434d555b5d606060606060606060606060606060606060606060606060606060606060606060606060606060605d5b554d43382d22160a00000000000000000000000000000000000000000003090e13191d202d394653606c7984868687888b90959a9590867c6f665b5044382b1f120802000000000000000000000000000000000013202c3946535f6c7986929facada0938679737373737373737373737373737373737373737373737373737373737373737373737373736f6a5f53473a2e2115080013202c3946535f6c7986929facada0938679737373737373737373737373737373737373737373737373737373737373737373737373736f6a5f53473a2e21150800000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000b1824313e4b5764717e8a96a0acac9f948e8179716d67696869676d70747a7f869095938a7e7885929fabaa9d9184776c6261616361594f44382c201407000003101c28343f4a54616c74818e949da4aca7a09d9992908f8f8f9192999a9e9f948f837a6d666f7c88949faaaea398928c88878886796c605346392d2013000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000000000000000916232f3c4956626f7c7b7a7a7a7b7d808590959f9a9184786c605346392d201306000000000000000000000916232f3c4956626f7c8995acb6a89c8f82756a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a615f574d42362a1e12050013202c3946535f6c7986929faca79a8d8074675a4d41342716202834404b555c666d747e858e939ea1a8aca49f9490837b6e675d51483e30271d12070000000613202c3945515d677885929eabaa9d9184776c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c667784919eaaa99c8f8376695c50432f24180d010000000000040a0f13151d2935414b556a7783909daaa89b8f8275685c4f4235291c191919191919191a242c33393c3e4341403e3d3c3a39352f281f160c01000004101d2935404b5566737f8c99a3aea99e91847a6d68615955534d4f4e4d4c4c4c4b4b4c5865727f8b98a5afa396897c706356493d3023160a0000000000000006121e29343f495156555d60626467696b6361594f44382c2014070b1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b00000005111d2935414c56616e7a85929fa6ada19791837b716c6662605d606163656c717b849197a1ada4999184786c6053463a3025190d01000000000000000006111c27313b434a4f5153535353535353535353535353535353535353535353535353535353535353535353535353535353504e4a433a31271c110500000000000000000000000000000000000000030a0f151a1e24292c2e3844505b6673808c9993999292908d89837c6f6a5f544a3f33281c19130d080100000000000000000000000000000013202c3946535f6c7986929facada093867a6d676767676767676767676767676767676767676767676767676767676767676767676767625f584e43372b1f12060013202c3946535f6c7986929facada093867a6d676767676767676767676767676767676767676767676767676767676767676767676767625f584e43372b1f120600000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000005121e2a36424d576875818e9ba8afa49a8f82786d66605d555c555c6063676d727b838f9391857b8797a2ada79a8d8074675a545557554f473e33281c1004000006121f2b3844505c66717e8b939ea6aea59d95908a86838282838486898d92979f959083786d73808d99a6b0a89f9286807c7a7b7d7063574a3d3024170a000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000000000000000815222e3b4754606a6f6e6d6d6d6e70737a83909da096897c6f6356493c30231609000000000000000000000a1623303d495663707c8996a3afa89b8e8177777777777777777777777777777777777777777777777777777777777777776e695f53463a2d2114070013202c3946535f6c7986929faca79a8d8074675a4d4134271e28323a45515c676d78818b92979ea5ada8a19a938d827a6e695e554c41362d1e150b0000000004111d2935414c55697683909ca9ab9f928578695f606060606060606060606060606060606060606d7986929faca79a8d8174675a4e4134271b070000000000070f161b1f2223242f43505d697683909ca9a99c908376695d5043362a2525252525252525252520282d303136343332302f2d2c29241d160d04000000000c18242f3b4854616e7b86929fa8ada19690827a706b65615f575c5a5a5959585858585865717e8b98a4afa396897c706356493d3023160a00000000000000010d18232d373f464a4b515356585a5c5e57554f473e33281c10040b1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b0000000713202d3946525e6874808d98a2aea69e92857b6e69615a5654525354535b60696e7b85929ea8aba0958a7d7063564c41362a1d11050000000000000000000b151f2931393f42444646464646464646464646464646464646464646464646464646464646464646464646464646464643423e3831281f150a00000000000000000000000000000000000000060b151a1f262b2f35393a40444a54616e7b87939f92878583817d786f6a5f584e4238342e29241e19130c04000000000000000000000000000013202c3946535f6c7986929facada093867a6d605a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a55534e463c31261b0f030013202c3946535f6c7986929facada093867a6d605a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a55534e463c31261b0f0300000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000714202d3a46525e697885919eabac9f93877c6f665c54514b4f4b5153555d60696e79818f949083909da9b3a4988b7e7165584b484a48443e352c21160b0000000713202d3a4653606d7884919ea5afa69d938e837d797776757677797c80858c9298958e81747683909ca9aca0958a7e736f6e6e706b6155483c2f231609000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000000000000000000006131f2b38434e586062616160606163686f7c8899a4988b7e7265584b3f3225180c000000000000000000000a1724303d4a5763707d8a96a3b0ab9e928583838383838383838383838383838383838383838383838383838383838383837b6e6155483b2e2215080013202c3946535f6c7986929faca79a8d8074675a4d41342724303a44515b606d79828e939fa2a9ada59d96918880786d685e564d433a2f241b0c0300000000010d19242f414d5a6774808d9aabaea298887b6e61555353535353535353535353535353535355626f7c8899a3afa9988b7e7265584b3f3225180c0000000007101921272c2f303236434f5c6976828f9ca9aa9d9083776a5d50443732323232323232323232322d2c28232429282625232220201d18130c0400000000000714202d3a46525e6974808d96a1a9a89f9590847d77726e696a6867666665656565646465717e8b98a4afa396897c706356493d3023160a000000000000000006111b252d343a3a404547494b4d4f514a48443e352c21170b000b1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b0000000714212e3a4754616d7a86929faaab9f948a7d70695e575049474546474950565e69717e8b96a0aca79c8f8275685e5246392d201307000000000000000000040d171f272e333637393939393939393939393939393939393939393939393939393939393939393939393939393939393736322d271f160d030000000000000000000000000000000000020a111720262b31373a4145474a5153555e6976828f9b8f82787774706c655f58504a46443f38353029241e160d070000000000000000000000000013202c3946535f6c7986929facada093867a6d60534d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4847433c342a20150a000013202c3946535f6c7986929facada093867a6d60534d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4847433c342a20150a0000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000815212e3b4854616e7b8797a1adaa9d9083776a5f544b4540424045474b51575f676d78828f9590959fabb0a3968a7d7063574a3d3d3c38332c231a10050000000b1824313e4b5764717e8a96a0acac9f948e8179716d67696869676d70747a7f869095938a7e7885929fabaa9d9184776c6261616361594f44382c201407000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000000000000030f1b27323d464e5456555453545456606c7986939f998c807366594d4033261a0d000000000000000000000a1724313d4a5764707d8a97a3b0ada1979290909090909090909090909090909090909090909090909090909090909090887b6e6255483b2f2215080013202c3946535f6c7986929faca79a8d8074675a4d4134272935414c56626d75818e949da5ada9a19e938e847d736d665d564d443b31281e1209000000000000081724313e4a5764717d8a99a3afaa988b7e7165574d42464646464646464646464646424d5765727f8c98abada297887b6f6255483c2f221509000000040f19222b32383b3c3f3f434f5c6976828f9ca9aa9d9184776a5e51443f3f3f3f3f3f3f3f3f3f3f3f3a38342e271e151a1817151413110d070100000000000005121e2a36424d57606d79849197a1a9a79f969189837f7b78767574737372727271717171717e8b98a4afa396897c706356493d3023160a00000000000000000009131b23292e2f35393a3c3e4042453d3c38332c231a1005000b1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b000005121e2a36424d5765727f8c98a2aea99c8f82766c61574d453e3a39393a3f444d57616c7784919eaaa99f93867a6d6154473a2e21140700000000000000000000050d151c2227292a2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2a2926221c150d040000000000000000000000000000000000060c141c232831373c42474c5154545c60626466717e8a9792877b6e6a69676462605b5453504a45413a352f281f18120b03000000000000000000000013202c3946535f6c7986929facada093867a6d6053474040404040404040404040404040404040404040404040404040404040404040403c3a37312a22180e04000013202c3946535f6c7986929facada093867a6d6053474040404040404040404040404040404040404040404040404040404040404040403c3a37312a22180e040000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000916222f3c4955626f7c8895a9b3a79a8d817467584e4239352f34383a40454d555c666d7a85919d9fa7b1afa396897c706356493d302f2c28211a110800000005121e2a36424d576875818e9ba8afa49a8f82786d66605d555c555c6063676d727b838f9391857b8797a2ada79a8d8074675a545557554f473e33281c1004000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000000000000000a162027333f49535b606060606062666e7b8799a4988c7f7265594c3f3226190c000000000000000000000a1724313d4a5764707d8a97a3b0b3a9a19e9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d94887b6e6155483b2e2215080013202c3946535f6c7986929faca79a8d8074675a4d4134272d3946525d68727e8b939ea6afa69f979189817a706b605c544c443b32291f160c000000000000000714212e3a4754616d7a86929faca89b8e8275695e53463d313939393939393939303946525e6976828f9ca9ab9e9285786c605346392d2013060000000a16212b343d4348494c4c4c4f5c6976828f9ca9aa9d9184776a5e514c4c4c4c4c4c4c4c4c4c4c4c4c4645403930271d12070a09070604010000000000000000020e1a25303b45515d676f7c8591979ea5a8a09e95908b8885838281807f7f7f7e7e7e7e7d7d808d9aa7afa396897c706356493d3023160a000000000000000000010911181e1d24292c2d2f31343638302f2c28211a110800000b1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b00000714202d3a46525e697783909daaada197897d7063594f453b332d2c2d2d333b45505a66737f8c999d9c9c998a7d7063574a3d3024170a0000000000000000000000040b11161a1d1e202020202020202020202020202020202020202020202020202020202020202020202020202020201d1c1a16110a030000000000000000000000000000000000070f181e262e343c43474d53555d6064666d6f717375798592998c8078777673716e6c6663605c54524c45413a3128231d150c040000000000000000000013202c3946535f6c7986929facada093867a6d6053473a34343434343434343434343434343434343434343434343434343434343434342f2e2b262018100600000013202c3946535f6c7986929facada093867a6d6053473a34343434343434343434343434343434343434343434343434343434343434342f2e2b2620181006000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000a1723303d4a5663707d8996a3b0a6998c7f7366594c402f2924292c2f353b434b545d68707d8a959fabb7afa396897c706356493d3023201c161008000000000714202d3a46525e697885919eabac9f93877c6f665c54514b4f4b5153555d60696e79818f949083909da9b3a4988b7e7165584b484a48443e352c21160b00000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000000000000000005121f2b3744505b656c6d6c6c6d6f7278818e9ba095897c6f6356493c30231609000000000000000000000a1723303d4a5663707d8996a3b0b8b0aba99f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9fa9aaaaaaaaaa94877a6e6154473b2e2114080013202c3946535f6c7986929faca79a8d8074675a4d4134272e3a4754616d7a85929fa5afa59e948f857d746d676059514a423a322920170d04000000000000000713202d3946525d6876828f9ca9ac9f92867b6e61584e433b322c292424292c3139424d57616e7b86929faca89b8e8174655b5044372b1f12050000030f1b27323d474f5456585858585c6976828f9ca9aa9d9184776a5e585858585858585858585858585853514b42392e23180c00000000000000000000000000000009141f2935414b555f6a6f7c858f939c9fa4a79f9d989892908f8d8d8c8c8b8b8b8b8a8a8a8d929da9afa396897c706356493d3023160a0000000000000000000000060d1213181d2020232527292b2423201c1710080000000b1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b00000815212e3b4854616e7b87959fabab9e9184786c6053463e33292120202227333e4956626f7c899191908f8e8d8073665a4d4033271a0d00000000000000000000000000060a0e10111313131313131313131313131313131313131313131313131313131313131313131313131313131310100d0a05000000000000000000000000000000000000081019212a30383f444e53575f62676d7175797c7e80828390979c928c848382807e7b7974706d66605d56524c433d342e271e160e0500000000000000000013202c3946535f6c7986929facada093867a6d6053473a2d2727272727272727272727272727272727272727272727272727272727272722211f1b150e060000000013202c3946535f6c7986929facada093867a6d6053473a2d2727272727272727272727272727272727272727272727272727272727272722211f1b150e0600000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000a1724313d4a5764707d8a97a3b0a5988c7f7265594c3f2e23181c1f24293139424c56616c7683909da9b3afa396897c706356493d302316100b0500000000000815212e3b4854616e7b8797a1adaa9d9083776a5f544b4540424045474b51575f676d78828f9590959fabb0a3968a7d7063574a3d3d3c38332c231a100500000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000000000000000613202d394653606c777979797a7b7e838e939e989083786c605346392d20130600000000000000000000091623303c4956636f7c8996a2afb0a69f9c9393939393939393939393939393939393939393939393939c9ea6b0aea398877a6d6054473a2d2114070013202c3946535f6c7986929faca79a8d8074675a4d41342935404b5565727f8c97a2ada59e938e827a706b605d554f444039302820170e05000000000000000005111d2935414c5664717e8b96a1ada3998d80746a60564d443e39352f2f35383c434b545e6973808d99a3aca096897d706353493f33271b0f03000007131f2c38434f59606365656565656976828f9ca9aa9d9184776a656565656565656565656565656565605c544b4034281c10040000000000000000000000000000020d18242f3a434e585f6a6f7a82898f93999c9fa2aaa29f9d9b9a999998989898979797979a9da4aeafa396897c706356493d3023160a0000000000000000000000000101070d11131416181a1c1e171614100b05000000000b1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b00000b1824313e4b5764717e8a97a7b1a79a8d8174665b5044382c2017131317202d3a4753606d79868584838281807e7164574b3e3124180b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008111a222b333c424a50585f62696e747a7e8185888b8d8f9095a0a49c9691908f8d8a8885817d79736d68605d564f454039302820160e05000000000000000013202c3946535f6c7986929facada093867a6d6053473a2d201a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1515120f0a04000000000013202c3946535f6c7986929facada093867a6d6053473a2d201a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1515120f0a040000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000a1723303d4a5663707d8996abb5a6998d807366544a403428211e1a181f27303a44505a64707d8a97a2adafa396897c706356493d3023160a000000000000000916222f3c4955626f7c8895a9b3a79a8d817467584e4239352f34383a40454d555c666d7a85919d9fa7b1afa396897c706356493d302f2c28211a11080000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000000000000020a13202d394653606c7984868687888b90959a9590867c6f665b5044382b1f1206000000000000000000000815222f3b4855626e7b8895a9b3ab9f948f8686868686868686868686868686868686868686868686868f949eaaac9f928579675d5145392c2013060013202c3946535f6c7986929faca79a8d8074675a4d41342c3945515d677783909da9ac9e938e81786d686159514c433d342e271e160e05000000000000000000010d1924303a4653606d7984919ea7ab9f92877c6f685e564f47454141414045474e555c666e7b86929faba89e9184786c605346392d22170b0000000915222f3b4854606b6f72727272727276828f9ca9aa9d918477727272727272727272727272727272726d665c5145382c1f130600000000000000000000000000000007131d28313c464e585f686d757c82878b8f929897999a9b9c9d9d9d9e9e9e9e9f9f9f9fa3abacb5afa396897c706356493d3023160a00000000000000000000000000000001040607090b0d0f120a0a07040000000000000b1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b00010e1b2734414e5a6774818d9aa7b4aa978a7e7164544a3f33281a0e0606131f2c3845515c676d79787776757474716c6155493d3023170a0000000000000000000000000000000000000000000000000002050708080808080808060503000000000000000000000000000000000000000000000000000000000000000000000000000000000007111a232b343d454d545c606a6e757b81868a8e929897999c9da0a7aea8a19e9d9c9a9797928e8985807a736d686059514b423a322820170e050000000000000013202c3946535f6c7986929facada093867a6d6053473a2d20140d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d090806030000000000000013202c3946535f6c7986929facada093867a6d6053473a2d20140d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0908060300000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000915222f3c4855626f7b8899a3afa89b8f8275665c51443a322d2b2627272628323e4653606d7985929fabafa396897c706356493d3023160a000000000000000a1723303d4a5663707d8996a3b0a6998c7f7366594c402f2924292c2f353b434b545d68707d8a959fabb7afa396897c706356493d3023201c161008000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000000000001070c141c232b3844505b6673808c9993999292908d89837c6f6a5f544a3f33281c0f03000000000000000000000714212d3a4754606d7a8797a2ada99c8f82797979797979797979797979797979797979797979797979828f9ca9ab9e9184786b554b4135291d11040013202c3946535f6c7986929faca79a8d8074675a4d41342d3a4753606d7a86929faca49a8f81776d665e564f45413a3128231c150c04000000000000000000000008131f2c3845515c67727f8b95a0aba39991847a6e68615954514c4e4e4b5153575f676d78839098a2aca0968b7f72665b5044382b1b1106000000091623303c4956636f7d7f7f7f7f7f7f7f83919daaab9e91857f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f796d6053463a2d201307000000000000000000000000000000010c161f2a343c464e565e616b6f757b7f8285888a8c8d8f8f9090919191919292929292999ba3acafa396897c706356493d3023160a000000000000000000000000000000000000000000010305000000000000000000000b1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b0004111d2935414c566a7683909da9aea298887b6e6155483b2d2217080004101c2934404b555c606c6b6a6969686764615a5045392d211408000000000000000000000000000000000000000000000003090e12141515151515151513120f0b060000000000000000000000000000000000000000000000000000000000000000000000000000050f19232b353d464e575f666d727c81878e92999b9fa2aaa6a8aaa9a8a7a7a8a9aaa9a6a9a29e9a97928d85807a706b605c544c443a322920170c0300000000000013202c3946535f6c7986929facada093867a6d6053473a2d20140701010101010101010101010101010101010101010101010101010101000000000000000000000013202c3946535f6c7986929facada093867a6d6053473a2d201407010101010101010101010101010101010101010101010101010101010000000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000714202d3a4753606d7a86929facab9e9285796d60564c443d3a373134333332323845515c6675828f9ca8afa396897c706356493d3023160a000000000000000a1724313d4a5764707d8a97a3b0a5988c7f7265594c3f2e23181c1f24293139424c56616c7683909da9b3afa396897c706356493d302316100b0500000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000000030b12181e262e34383f4a54616e7b87939f92878583817d786f6a5f584e42382d2218120b030000000000000000000613202c3945515d677885929eabaa9d9184776c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c667784919eaaa99c8f8376695c50432f24180d010013202c3946535f6c7986929faca79a8d8074675a4d41342f3c4855626f7b8899a3ac9f93877b6e655c544c443d352f281f18120b0300000000000000000000000004101c2834404b55606d78839099a3aba09690837a706b64605d555b5b555d60636a6e79818e959faaa49a9184796d60544a3f33281c0a000000000d1a2734404d5a6773808b8b8b8b8b8b8b9195a0acada197918b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b877a6d6054473a2d21140700000000000000000000000000000000040d18222a343c444c52596063696e7276797b7d7f81828383848484848585858585868b909ba7afa396897c706356493d3023160a000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b000713202c3945525d687885929fabac9f9285796c605346392d20130600000c18232f39434b51535f5e5e5d5c5b5a575550483e33281d110500000000000000000000000000000000000000000000050d141a1e2121212121212121201f1b17110a020000000000000000000000000000000000000000000000000000000000000000000000030d17212b353d474f5860696e787f868e93999fa3ababaca8a9a29e9d9b9b9a9b9c9d9fa3aaa9aba9a19e98928c857d736d665d564c443a32291e150a00000000000013202c3946535f6c7986929facada093867a6d6053473a2d20140700000000000000000000000000000000000000000000000000000000000000000000000000000013202c3946535f6c7986929facada093867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000006131f2c3945515d677783909dabada1978a7e71685e564f484742424140403f3f3f404b546673808c99a6afa396897c706356493d3023160a000000000000000a1723303d4a5663707d8996abb5a6998d807366544a403428211e1a181f27303a44505a64707d8a97a2adafa396897c706356493d3023160a000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000000050d151d242930383f44464c535e6976828f9b8f82787774706c655f584e443f382f28231c150c03000000000000000004111d2935414c55697683909ca9ab9f928578695f606060606060606060606060606060606060606d7986929faca79a8d8174675a4e4134271b07000013202c3946535f6c7986929faca79a8d8074675a4d4134303c4956636f7c8996abaa9e918477695e534a423a3229241e160d070000000000000000000000000000000c18232e3944515c666f7c87929fa4a8a09590847d76716d6769676869676d70757b838e939ea7a59f93887d70665c5142382d22170b000000000d1a2734404d5a6773808d9898989898989da0a7b1b3a9a19e98989898989898989898989898989893877a6d6054473a2d21140700000000000000000000000000000000050e171e252a323a41464f54575e6165666d6f717374757676777777787878787879797e8b98a4afa396897c706356493d3023160a000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b000714212d3a4754606d7a8797a2adaa9d918477655b5044372b1f1205000007121d273139404547525251504f4e4d4b49453e362c22170c00000000000000000000000000000000000000000000050f171f252a2d2e2e2e2e2e2e2e2d2b27221b140b02000000000000000000000000000000000000000000000000000000000000000000010b151f29333d474f59606a6f7b838c92999fa4abadaaa29f9b979792908f8e8e8e8f909298989d9fa7acaaa29f97918880786d685e564c443a30261c1106000000000013202c3946535f6c7986929facada093867a6d6053473a2d20140c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c07060401000000000000000000000013202c3946535f6c7986929facada093867a6d6053473a2d20140c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c070604010000000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000004101d2935404b5566737f8c99a3aea99e91847a6d68615955534d4f4e4d4c4c4c4b4b4c5865727f8b98a5afa396897c706356493d3023160a000000000000000915222f3c4855626f7b8899a3afa89b8f8275665c51443a322d2b2627272628323e4653606d7985929fabafa396897c706356493d3023160a000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000000000050e161f272f353e424a5053565e6164717e8a9792877b6e696764615e56535049413d342e271e150c0300000000000000010d19242f414d5a6774808d9aabaea298887b6e61555353535353535353535353535353535355626f7c8899a3afa9988b7e7265584b3f3225180c000013202c3946535f6c7986929faca79a8d8074675a4d41342f3c4955626f7c8895a7ab9e9184786a5f544a423930281f160d040000000000000000000000000000000007121d2834404a54606a727f8c929ca4a7a096918a827d7a7775747475767a7d818790959ea5a59e938d80736b60544b402f261c1106000000000d1a2734404d5a6773808d9a9f9f9f9f9fa9aab0b8bab2acaa9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f93877a6d6054473a2d211407000000000000000000000000000000020c1720293036393a3e3f44484d5354545c606264666768696a6a6a6b6b6b6b6c6c6c717e8b98a4afa396897c706356493d3023160a000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b000815222f3b4855626e7b8895a9b3a99c8f82766953493f33271b0f030000010b151f272f34383a464544434241413e3d39332c241a1006000000000000000000000000000000000000000000030c17212931363a3b3b3b3b3b3b3b3937332d261d140a00000000000000000000000000000000000000000000000000000000000000000007121d27313b454f59606b707c8590959fa3abaea9a19e98928e8a87858382818181828386888b90959b9fa4aca9a19a938d837a6d685e564c42382e23170d040000000013202c3946535f6c7986929facada093867a6d6053473a2d2019191919191919191919191919191919191919191919191919191413110d070100000000000000000013202c3946535f6c7986929facada093867a6d6053473a2d2019191919191919191919191919191919191919191919191919191413110d0701000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000c18242f3b4854616e7b86929fa8ada19690827a706b65615f575c5a5a5959585858585865717e8b98a4afa396897c706356493d3023160a000000000000000714202d3a4753606d7a86929facab9e9285796d60564c443d3a373134333332323845515c6675828f9ca8afa396897c706356493d3023160a000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000040d162028313940454f545c6064686e7174798592998c80777674716e6863605b534e44403930271e150c0300000000000000081724313e4a5764717d8a99a3afaa988b7e7165574d42464646464646464646464646424d5765727f8c98abada297887b6f6255483c2f221509000013202c3946535f6c7986929faca79a8d8074675a4d41342e3a4754616d7a8795a0aca196887c6f665c544b423a31281f160d03000000000000000000000000000000000c18232e39424e58626d73808c929ea1a8a19e948f8a8683828181828386898e93999fa7a39f938f81786d60594f42392e1d140a00000000000d1a2734404d5a6773808d9393939393939c9fa6b0b2a8a09393939393939393939393939393939393877a6d6054473a2d21140700000000000000000000000000000008131e29323a4146474b4c4d4e4f51524a50535557595a5c5c5d5d5e5e5e5e5f5f5f65717e8b98a4afa396897c706356493d3023160a000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b00091623303c4956636f7c8996a2afa89b8e8175685b4e422d22170b00000000030d151d23292c2d3938373636353431302d28221a1208000000000000000000000000000000000000000000000a151e29333b42464848484848484846443f382f261b110600000000000000000000000000000000000000000000000000000000000000000c18242f39434d57606b707d8692979fa7aeaba39f96918b86817e7b7876757474757677797c7f83888e939a9fa7aca49f9590837a6d685e544a3f34281f160c0100000013202c3946535f6c7986929facada093867a6d6053473a2d26262626262626262626262626262626262626262626262626262621201d18130c04000000000000000013202c3946535f6c7986929facada093867a6d6053473a2d26262626262626262626262626262626262626262626262626262621201d18130c040000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000714202d3a46525e6974808d96a1a9a89f9590847d77726e696a6867666665656565646465717e8b98a4afa396897c706356493d3023160a0000000000000006131f2c3945515d677783909dabada1978a7e71685e564f484742424140403f3f3f404b546673808c99a6afa396897c706356493d3023160a000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000010c161f28323a434b515961666d71767a7e80828f979c928c8483807d7a76706c656058514a423930271e150a000000000000000714212e3a4754616d7a86929faca89b8e8275695e53463d313939393939393939303946525e6976828f9ca9ab9e9285786c605346392d201306000013202c3946535f6c7986929faca79a8d8074675a4d41342d3946525e687784919da8a89c9082786d665c544b433a31281f150b0100000000000000000000000000000007121c27303d46515b646e73808a92979fa3a69f9c9992908f8e8e8f9092989b9fa4a69f99928c81786d665c50473d30271d0b0200000000000d1a2734404d5a677380868686868686868f949faaaca0968986868686868686868686868686868686867a6d6054473a2d2114070000000000000000000000000000010d1925303a444c525457595a5b5c5d5e5b5953484a4c4e4f5050515151515252525965727f8c98a5afa396897c706356493d3023160a000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b000a1724303d4a5763707d8a96a3b0a79a8d8174675a4e4134271b060000000000030b12181c1f202c2b2b2a2928272423211d1710080000000000000000000000000000000000000000000006111c26303b454d535454545454545453504941382d22170b0000000000000000000000000000000000000000000000000000000000000004101d2935404b555e69707d879298a2a9b1a8a099928c847f7a75716e696a6868676869666d6f72767b818790959da4afa79f9590837a6d665c50443e31281d130700000013202c3946535f6c7986929facada093867a6d6053473a333333333333333333333333333333333333333333333333333333332d2c29241d160d040000000000000013202c3946535f6c7986929facada093867a6d6053473a333333333333333333333333333333333333333333333333333333332d2c29241d160d0400000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000005121e2a36424d57606d79849197a1a9a79f969189837f7b78767574737372727271717171717e8b98a4afa396897c706356493d3023160a0000000000000004101d2935404b5566737f8c99a3aea99e91847a6d68615955534d4f4e4d4c4c4c4b4b4c5865727f8b98a5afa396897c706356493d3023160a000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000008131e28313a444c555d606b70787e82868a8d8f949fa49c9691908d8a87827d786f6a605c544a423930261c11060000000000000713202d3946525d6876828f9ca9ac9f92867b6e61584e433b322c292424292c3139424d57616e7b86929faca89b8e8174655b5044372b1f1205000013202c3946535f6c7986929faca79a8d8074675a4d41342935414c5666727f8c96a1ab9f948e81786d665d554c433a31271d1207000000000000000000000000000000000b151e2b343f49525c646e737e858e92999ea1a8a39f9d9c9a9b9c9d9fa3a9a29f9b948f877f776d665c544a3f352c1e150b0000000000000d1926333f4c58646e7379797979797979828f9ca9aa9d9184797979797979797979797979797979797976685d5245392c201307000000000000000000000000000005111d2a36414c565e6164656768696a6b68655d534840414243434444444545454d596673808c99a6afa295897c6f6256493c2f231609000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b000a1724313d4a5764707d8a97a3b0a79a8d8074675a4d4134271a0e01000000000001070c1013141f1f1e1d1c1b1a181714110c0600000000000000000000000000000000000000000000000c17232e38424d575e61616161616161605b53493f33271b0f03000000000000000000000000000000000000000000000000000000000005101a232c3945515d676e7b859299a2aab1a79f9691878079726d6764615e575c5b5b5b545c6062656a6e747c838d929fa3aba7a0959082786d60594f433a2f24180d02000013202c3946535f6c7986929facada093867a6d6053473f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3a39352f281f160c0100000000000013202c3946535f6c7986929facada093867a6d6053473f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3a39352f281f160c01000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000020e1a25303b45515d676f7c8591979ea5a8a09e95908b8885838281807f7f7f7e7e7e7e7d7d808d9aa7afa396897c706356493d3023160a00000000000000000c18242f3b4854616e7b86929fa8ada19690827a706b65615f575c5a5a5959585858585865717e8b98a4afa396897c706356493d3023160a000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000050e19242f3a434c565e676d747d848a8f93999a9c9fa6aca8a09e9c9a9a938f8a837c736d665c544a42382e23170b02000000000005111d2935414c5664717e8b96a1ada3998d80746a60564d443e39352f2f35383c434b545e6973808d99a3aca096897d706353493f33271b0f03000013202c3946535f6c7986929faca79a8d8074675a4d413425303a4754606d79849199a4a69e938e81786d675d564c43392f24180d03000000000000000000000000000000030c19222d37404a525c636c717a81868d9196989b9c9e9f9f9f9f9e9d9b9997928e89827c736c655c544b42382e231a0c030000000000000b17232f3b47525c64676c6c6c6c6c6c76828f9ca9aa9d9184776c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c5d564c4135291d110400000000000000000000000000000713202d3946525e686d71727374767778756f65594d3d323536373737383835404b556774818e9aa7b2a995887b6e6255483b2f221508000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b000b1724313e4a5764717d8a97a4b0a69a8d8073675a4d4034271a0d010000000000000000040607131211100f0e0e0b0a080500000000000000000000000000000000000000000000000003101c28343f4a545e696e6e6e6e6e6e6e6c655b5044372b1f120500000000000000000000000000000000000000000000000000000000000b16212b37434e58606d79839097a1abb1a79f9590847c736d67605d5554524d4f4e4e4e4a505355585f626a6f78808a9299a3aba79f948d80736b61554b4035291f1409000013202c3946535f6c7986929facada093867a6d60534c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4745413a31281d130700000000000013202c3946535f6c7986929facada093867a6d60534c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4745413a31281d1307000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000009141f2935414b555f6a6f7c858f939c9fa4a79f9d989892908f8d8d8c8c8b8b8b8b8a8a8a8d929da9afa396897c706356493d3023160a00000000000000000714202d3a46525e6974808d96a1a9a89f9590847d77726e696a6867666665656565646465717e8b98a4afa396897c706356493d3023160a000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000020d17202935414c555e686d79818a91969c9fa4aba5aba49f9fa4aca5aca49f9c95908780786d665c544a3f34281d140a0000000000010d1924303a4653606d7984919ea7ab9f92877c6f685e564f47454141414045474e555c666e7b86929faba89e9184786c605346392d22170b00000013202c3946535f6c7986929faca79a8d8074675a4d4134272c3945515d67707d87939fa3a59e938f82796d685d554b4035291f150b0100000000000000000000000000000007101b252e38404a525a61686d747b8084888b8e90919292929291908e8c8985817c766f6a605b534b423930261c11080000000000000007131f2b36404a52585a60606060606976828f9ca9aa9d9184776a6060606060606060606060606060605f524c443a2f24190d0100000000000000000000000000000714212e3a4754616d7a7e7f8081828485817568584e43372e2c2823282c2f3945515d677783909daaada196877a6d6054473a2d211407000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b000a1724313d4a5764707d8a97a3b0a79a8d8074675a4d4134271a0e010000000000000105090b0b121111100f0e0d0908060300000000000000000000000000000000000000000000000006121f2c3844505c66767b7b7b7b7b7b7b776c605346392d2013060000000000000000000000000000000000000000000000000000000004101c27333a47535f6a74808d95a0a9b2a89f9590837a6f6a605c55514b484642424141423f4446494e53585f666d737e879299a4afa69f93887d70675d51453b30251a0e020013202c3946535f6c7986929facada093867a6d605959595959595959595959595959595959595959595959595959595959595954514b433a2f24180d01000000000013202c3946535f6c7986929facada093867a6d605959595959595959595959595959595959595959595959595959595959595954514b433a2f24180d010000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000020d18242f3a434e585f6a6f7a82898f93999c9fa2aaa29f9d9b9a999998989898979797979a9da4aeafa396897c706356493d3023160a000000000000000005121e2a36424d57606d79849197a1a9a79f969189837f7b78767574737372727271717171717e8b98a4afa396897c706356493d3023160a000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000008141e29323b45515d676d7a838e939ea0a8a7a09d99959993939a96999ea0a8a7a099928c81786d665c50443d2f261c1106000000000008131f2c3845515c67727f8b95a0aba39991847a6e68615954514c4e4e4b5153575f676d78839098a2aca0968b7f72665b5044382b1b110600000013202c3946535f6c7986929faca79a8d8074675a4d4134272935414b55606b727f8c919fa3a59e948f837a6d675d51453e31271d12070000000000000000000000000000000009131c262e38404850565e61696e73787c7e818384858686858583817f7c79746f6a625f585049413930271e150a0000000000000000020e19242e3840474c4d535353535c6976828f9ca9aa9d9184776a5e53535353535353535353535353535345413a32281e13080000000000000000000000000000000815212e3b4854616e7b878c8d8e8f909184786a6054473f3a38342e34383a404b55606d7a86929facab9e918578675d5145392c201306000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b000a1724303d4a5763707d8a96a3b0a79a8d8074675a4d4134271a0e010000000000060c111517181f1e1d1c1b1a191615130f0a04000000000000000000000000000000000000000000000713202d3a4653606d7986878787878786796d6053473a2d201407000000000000000000000000000000000000000000000000000000000714202c38444f59626e7c87929fa7b1aaa1969083796d685f58514b45413b3a363035342e34383a3c43474e545c606c717e87939fa5afa49a9185796d60574d42362a1e11050013202c3946535f6c7986929facada093867a6d6666666666666666666666666666666666666666666666666666666666666666605d554b4135291d1104000000000013202c3946535f6c7986929facada093867a6d6666666666666666666666666666666666666666666666666666666666666666605d554b4135291d11040000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000007131d28313c464e585f686d757c82878b8f929897999a9b9c9d9d9d9e9e9e9e9f9f9f9fa3abacb5afa396897c706356493d3023160a0000000000000000020e1a25303b45515d676f7c8591979ea5a8a09e95908b8885838281807f7f7f7e7e7e7e7d7d808d9aa7afa396897c706356493d3023160a000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000010d1925303b44515b606d798390959ea5a9a19e95908c8987868687898c91969ea1a9a39f938f81786d60584e42382d22170b000000000004101c2834404b55606d78839099a3aba09690837a706b64605d555b5b555d60636a6e79818e959faaa49a9184796d60544a3f33281c0a0000000013202c3946535f6c7986929faca79a8d8074675a4d413427242f3a434f59626d727f8b9299a2a69f959083796d605a5043392f24180c000000000000000000000000000000000915202b353f474e524c52575e61666a6f7274767878797978787675726f6d66626058534e4846423c332a1f140900000000000000000008121c262e363b3f404646464f5c6976828f9ca9aa9d9184776a5e51464646464646464646464646464639352f2820160c010000000000000000000000000000000714212d3a46535e697884919a9b9c9d96897c6f625a504a464440434044464b515c67717e8b98a3aeaa9b8f827568554b4135291d1104000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b000a1623303d495663707c8996a3afa79a8e8174675b4e4134281b0700000000000911181d2124252c2b2a2928272622211f1b150e060000000000000000000000000000000000000000000713202d3a4653606d79869394949493867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000916232f3c4855616b76828f99a3afaea39891847a6d675e564e454039352f2d2a25282823282c2d31373c424a505a616c727f8b939ea8aca1978c8073695e52463a2d2014070013202c3946535f6c7986929facada09386797272727272727272727272727272727272727272727272727272727272727272726d675d5145392c201306000000000013202c3946535f6c7986929facada09386797272727272727272727272727272727272727272727272727272727272727272726d675d5145392c2013060000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000000010c161f2a343c464e565e616b6f757b7f8285888a8c8d8f8f9090919191919292929292999ba3acafa396897c706356493d3023160a00000000000000000009141f2935414b555f6a6f7c858f939c9fa4a79f9d989892908f8d8d8c8c8b8b8b8b8a8a8a8d929da9afa396897c706356493d3023160a000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000005111e2a36414c56626d75828f959fa7a8a097928a837f7c7a79797a7c7f848a9297a0a8a59e938d80736a60544a3f33281c0f0300000000000c18232e3944515c666f7c87929fa4a8a09590847d76716d6769676869676d70757b838e939ea7a59f93887d70665c5142382d22170b0000000013202c3946535f6c7986929faca79a8d8074675a4d4134271d28313d47515b636d727e879298a2a79f958e81756c61554b4035291d10040000000000000000000000000000010e1a26313d4751595e5f6060605e585f626568696b6c6c6c6c6b6a686663605c546060606055534d453c31261a0e020000000000000000010a141c242b2f33343939434f5c6976828f9ca9aa9d9184776a5e5144393939393939393939393939392c29241e160d040000000000000000000000000000000005121e2a36424d576774818e9aa6a9a89b8e81756c605c5453514a504a5153555d606d7983919daaaea2988b7e7165584b3e2f24180d01000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b000815222f3b4855626e7b8895a9b3a89b8f8275685c4f422e23180c0000000009121b22292e3132393837363534332f2e2b262018100600000000000000000000000000000000000000000713202d3a4653606d798693a0a1a093867a6d6053473a2d20140700000000000000000000000000000000000000000000000000000005121e2a36424d5763707d89949fabb2a89f92867c6f685e554c443c342e2924201e1a1b1b171c1f20262b30383f44505a626d75818e96a0aca79f92867b6e6154473b2e2114080013202c3946535f6c7986929facb2a6998c7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f796d6054473a2d211407000000000013202c3946535f6c7986929facb2a6998c7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f796d6054473a2d2114070000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000000040d18222a343c444c52596063696e7276797b7d7f81828383848484848585858585868b909ba7afa396897c706356493d3023160a000000000000000000020d18242f3a434e585f6a6f7a82898f93999c9fa2aaa29f9d9b9a999998989898979797979a9da4aeafa396897c706356493d3023160a000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000714202d3946525e68727f8b949ea7a9a09591857e77726f6d686c6d6f72787e859196a0a9a59f93877c6f665b5044382b1f1308000000000007121d2834404a54606a727f8c929ca4a7a096918a827d7a7775747475767a7d818790959ea5a59e938d80736b60544b402f261c11060000000013202c3946535f6c7986929faca79a8d8074675a4d413427161f2c353f49515b636c717d869299a3a79e938a7e71675d5145382c1f1307000000000000000000000000000004111d2a36424e59636a6c6c6c6c6b636059585b5d5e5f5f5f5f5e5d5b59575f626a6c6c6c6c6c5f574d42372b1e1205000000000000000000020a12191f2326272d36434f5c6976828f9ca9aa9d9184776a5e5144372d2d2d2d2d2d2d2d2d2d2d2d201d19130c040000000000000000000000000000000000020e1a25313c4855626f7c88949faaaa9e938a7e726d6662605c545d545c6062676d75808d95a0aca99f92867a6d6154473a2e21140700000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b000714212e3a4754616d7a8797a2ada99c90837669544a4034281c1004000006111b242d343a3d3e454444434241403c3b37322a22180e04000000000000000000000000000000000000000713202d3a4653606d798693a0aca093867a6d6053473a2d2014070000000000000000000000000000000000000000000000000000000714212d3a46535e6975828f9ca6b0aca0968c7f736a60564c433a3228231d1814120e09060c1012131a1e262e343e48515b606d7984919ea09d95908a807366594d4033261a0d0013202c3946535f6c7986929facb9a89c918c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c877b6e6154483b2e211508000000000013202c3946535f6c7986929facb9a89c918c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c877b6e6154483b2e2115080000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000000050e171e252a323a41464f54575e6165666d6f717374757676777777787878787879797e8b98a4afa396897c706356493d3023160a0000000000000000000007131d28313c464e585f686d757c82878b8f929897999a9b9c9d9d9d9e9e9e9e9f9f9f9fa3abacb5afa396897c706356493d3023160a000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000005111d2935414c56616e7a85929fa6ada19791837b716c6662605d606163656c717b849197a1ada4999184786c6053463a3025190d0100000000000c18232e39424e58626d73808c929ea1a8a19e948f8a8683828181828386898e93999fa7a39f938f81786d60594f42392e1d140a0000000000131f2c3946525f6c7985929faca79a8e8174675b4e4134281b1a232d373f49515a626b707d87929fa6a59e9184796d6053473a2f24180d010000000000000000000000000006121f2c3845525e6a757979797978706b605c544d5152535352524b515a61696e777979797976695f53463a2d2114070000000000000000000001080e1317191c2936434f5c6976828f9ca9aa9d9184776a5e5144372b202020202020202020201413110d0805030000000000000000000000000000000000000915212e3b47535f6a76828f98a2aea59f92877f78726f6d666a696a666d6f7379818d929da7aca2978d8074685d5246392d20130700000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000a1723303d4a5663707d8996a3aca396897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b000713202d3946525d687885929fabaa9e918477665c5144382c1f120600010c18222d363f454a4b5251504f4e4d4c4947433c342a20150a000000000000000000000000000000000000000713202d3a4653606d798693a0a7a093867a6d6053473a2d2014070000000000000000000000000000000000000000000000000000000815212e3b4854616e7b87939facb2a89d9184796d60584e443a31292018120d0705020000000306090c151c2328363f45515d676f7d899395908a837e776c605346392d2013060013202c3946535f6c7986929facb9ada39c999999999999999999999999999999999999999999999999999999999999999994877b6e6154483b2e211508000000000013202c3946535f6c7986929facb9ada39c999999999999999999999999999999999999999999999999999999999999999994877b6e6154483b2e2115080000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000000020c1720293036393a3e3f44484d5354545c606264666768696a6a6a6b6b6b6b6c6c6c717e8b98a4afa396897c706356493d3023160a00000000000000000000010c161f2a343c464e565e616b6f757b7f8285888a8c8d8f8f9090919191919292929292999ba3acafa396897c706356493d3023160a000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000713202d3946525e6874808d98a2aea69e92857b6e69615a5654525354535b60696e7b85929ea8aba0958a7d7063564c41362a1d1105000000000007121c27303d46515b646e73808a92979fa3a69f9c9992908f8e8e8f9092989b9fa4a69f99928c81786d665c50473d30271d0b020000000000121f2c3945525f6c7885929faba89b8e8275685b4f42302519111b252e373f485059606b717e8b949faba1968b7e7165554b4135291d1104000000000000000000000000000613202c3946535f6c7987868686847d736d665f5751464146454d555c606c717b83868686867b6e6155483b2e22150800000000000000000000000002070b101c2936434f5c6976828f9ca9aa9d9184776a5e5144372b1e13131313130b101316171e1a1613120f0b060300000000000000000000000000000006121f2b37434e58626f7c86929fa4aca399928b837f7b797777767777797c80858e939da4aea49a92857a6d61564c4135291d110500000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000a1723303d4a5663707d89969f9f9f96897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b0005111d2935414c566a7683909da9ac9f9286796d6053463a2d2013070005111d29343f485056585f5e5d5c5b5a5955534e463c32261b0f030000000000000000000000000000000000000713202d3a4653606d7986939a9a9a93867a6d6053473a2d201407000000000000000000000000000000000000000000000000000005121e2a36424d576673808d99a4afaca0968a7e71665c51463c32281f170e0700000000000000000000030a1117242935414b55606b75818e8a837d78706c655b5044372b1f12050013202c3946535f6c7986929facb9b5ada8a6a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a194877b6e6154483b2e211508000000000013202c3946535f6c7986929facb9b5ada8a6a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a194877b6e6154483b2e2115080000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000008131e29323a4146474b4c4d4e4f51524a50535557595a5c5c5d5d5e5e5e5e5f5f5f65717e8b98a4afa396897c706356493d3023160a0000000000000000000000040d18222a343c444c52596063696e7276797b7d7f81828383848484848585858585868b909ba7afa396897c706356493d3023160a000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000714212e3a4754616d7a86929faaab9f948a7d70695e575049474546474950565e69717e8b96a0aca79c8f8275685e5246392d2013070000000000000b151e2b343f49525c646e737e858e92999ea1a8a39f9d9c9a9b9c9d9fa3a9a29f9b948f877f776d665c544a3f352c1e150b000000000000121e2b3845515e6b7884919eaba99c8f827669564c41362a1e11131c252e363e474f59626d76828f9caaa99c908376675d5145392c20130600000000000000000000000000000b1825323e4b5865717e8b9296918780786e69625b524c4550575f676d747e869095948d8074695f53463a2d211407000000000000000000000000000003101c2936434f5c6976828f9ca9aa9d9184776a5e5144372b1e110600080f161c2022232b2723201f1b17120f0b0600000000000000000000000000030f1b26323c47535f6a717e8b939aa2aaa39f95918c8886848483838485898c92979ea5aaa39f93887d70685e52443a3024190d0100000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000a1723303d4a5663707d899393939393897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b00010d192430414e5b6774818e9aa7afa399887b6f6255483c2e23180c060615212e3a45505a62656c6b6a69686766625f584e43372b1f13060000000000000000040607080808080808080813202d3a4653606d79868d8d8d8d8d86796d6053473a2d20140808080808080808070604000000000000000000000000000000000714212d3a46535f697784919eabb5ab9d9184786c60544b40342b20160d0500000000000000000000000000061218242f3a434f59616e7b837e78716c65605b53493f33271b0f030013202c3946535f6c7986929facb9afa7a2a09f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f94877b6e6154483b2e211508000000000013202c3946535f6c7986929facb9afa7a2a09f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f94877b6e6154483b2e2115080000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000010d1925303a444c525457595a5b5c5d5e5b5953484a4c4e4f5050515151515252525965727f8c98a5afa396897c706356493d3023160a0000000000000000000000050e171e252a323a41464f54575e6165666d6f717374757676777777787878787879797e8b98a4afa396897c706356493d3023160a000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000005121e2a36424d5765727f8c98a2aea99c8f82766c61574d453e3a39393a3f444d57616c7784919eaaa99f93867a6d6154473a2e211407000000000000030c19222d37404a525c636c717a81868d9196989b9c9e9f9f9f9f9e9d9b9997928e89827c736c655c544b42382e231a0c03000000000000101d2a3643505d697683909ca9ab9e918478685e5246392d20140a131c242d353d47505a63707d8998a3ac9f92867a6d6054473a2d21140700000000000000000000000000000b1724313d4a56626d73808c9399938d837b726d615e56515a61696e79818a9298958f82786d60574d42372b1e1205000000000000000000000000000003101c2936434f5c6976828f9ca9aa9d9184776a5e5144372b1e070008111921272c2f3038342f2d2b27221f1c17110a020000000000000000000000000a15202b37434e58616c727f8892989fa3a7a09d99999291909090919298999ea2a9a69f98928b7f726c61564c4132281e13080000000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000a1723303d4a5663707d868686868686867d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b0000081825313e4b5864717e8b97a7b1ab988b7e7165554b4034281d1413131624313d4a56626c71787777767574736f6a5f53473b2e211508000000000001070c101314151515151515151515202d394653606c7880808080808080786d6053463a2d201515151515151515151413100c0701000000000000000000000000000815222e3b4855616e7b8896a0acafa3998c7f72665b5042392e22190e0500000000000000000000000000000007131d28313d46535f696e77716c65605b53504941382d22170b000013202c3946535f6c7986929facb9a79d95939393939393939393939393939393939393939393939393939393939393939393877b6e6154483b2e211508000000000013202c3946535f6c7986929facb9a79d95939393939393939393939393939393939393939393939393939393939393939393877b6e6154483b2e2115080000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000005111d2a36414c565e6164656768696a6b68655d534840414243434444444545454d596673808c99a6afa295897c6f6256493c2f23160900000000000000000000020c1720293036393a3e3f44484d5354545c606264666768696a6a6a6b6b6b6b6c6c6c717e8b98a4afa396897c706356493d3023160a000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000714202d3a46525e697783909daaada197897d7063594f453b332d2c2d2d333b45505a66737f8c999d9c9c998a7d7063574a3d3024170a0000000000000007101b252e38404a525a61686d747b8084888b8e90919292929291908e8c8985817c766f6a605b534b423930261c1108000000000000000f1b2835424e5b6875818e9ba8ada196877a6e6154473b30251b1413121b232b353f4653606d7986929faca399897c6f6256493c2f23160900000000000000000000000000000915212e3a45505a636e74818e939f9590867e756d68605c606c717b838e939f969083796d665c50453c31261a0e02000000000000000000000000000003101c2936434f5c6976828f9ca9aa9d9184776a5e51442f24180d050f19232b33383c3d45403c3937332d2b28221c140b050000000000000000000000040f1a26313c46505a636d727e868e92999da0a8aba39f9e9d9c9d9e9fa2aaaaa29f9b948f867e726d62594f443a3020160c020000000000000000000000000000000000000000000000000000000000000000000000010b1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000916232f3c4855616b7079797979797979706b6155483c2f23160900091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b00000815212e3b4854616e7b87959faba89b8e8175675c5145392e2521201f202935404b5565717e8584838281807f7c6f6255493c2f22160900000000030b12181d1f20212121212121212121212b3844505b666c747474747474746d665c5044382c21212121212121212121201f1d18120b030000000000000000000000000c1825323f4b5865727e8b98a8b2ac9f92867a6e61544a3f30271d100700000000000000000000000000000000010c161f2a36424d575f616a64605b535049443f382f261b1106000013202c3946535f6c7986929facb9a2958b868686868686868686868686868686868686868686868686868686868686868686867b6e6154483b2e211508000000000013202c3946535f6c7986929facb9a2958b868686868686868686868686868686868686868686868686868686868686868686867b6e6154483b2e2115080000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000713202d3946525e686d71727374767778756f65594d3d323536373737383835404b556774818e9aa7b2a995887b6e6255483b2f2215080000000000000000000008131e29323a4146474b4c4d4e4f51524a50535557595a5c5c5d5d5e5e5e5e5f5f5f65717e8b98a4afa396897c706356493d3023160a000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000815212e3b4854616e7b87959fabab9e9184786c6053463e33292120202227333e4956626f7c899191908f8e8d8073665a4d4033271a0d000000000000000009131c262e38404850565e61696e73787c7e818384858686858583817f7c79746f6a625f585049413930271e150a00000000000000000c1926323f4c5965727f8c98a9b2a8978a7d7064564d42362b2621201f1f20232c3845515c667784919eaaab978a7d7164574a3e3124170b000000000000000000000000000005111d29343f48525b606d78818f959f98928b827a706b676d747e8690959d9891847b6e675d544a3f332a1f1409000000000000000000000000000000020f1c2935424f5c6875828f9ba8ab9e9184786b554b4035291d110b16212b353d44484a514d4946443f3938332d261d170e0500000000000000000000000a15202a343e48515b636c717b81878c919597999c9d9e9e9f9f9f9e9d9b9998928e89827b716c625b51473e32281e0e04000000000000000000000000000000000000000000000000000000000000000105090b0b0d0d1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000714202c38444f5961636c6c6c6c6c6c6c6361594f44382c20140700091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b00000714202d3a46525e697783909daaab9f9285796d60544b4036312d2c2c2d323a45515d6775818e91908f8e8d897c6f6356493c30231609000000030d151d24292c2d2e2e2e2e2e2e2e2e2e2e2e333f4a545b6067676767676767605c544a3f342e2e2e2e2e2e2e2e2e2e2e2d2c29241d150d030000000000000000000004101d2935404b556875828f9ba8b5a99c908376685e5242382d1e150b000000000000000000000000000000000000040d1a26313b454d53555d57535049443f38332d261d140a00000013202c3946535f6c7986929facada093867979797979797979797979797979797979797979797979797979797979797979797976695e52463a2d201407000000000013202c3946535f6c7986929facada093867979797979797979797979797979797979797979797979797979797979797979797976695e52463a2d2014070000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000714212e3a4754616d7a7e7f8081828485817568584e43372e2c2823282c2f3945515d677783909daaada196877a6d6054473a2d211407000000000000000000010d1925303a444c525457595a5b5c5d5e5b5953484a4c4e4f5050515151515252525965727f8c98a5afa396897c706356493d3023160a000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000b1824313e4b5764717e8a97a7b1a79a8d8174665b5044382c2017131317202d3a4753606d79868584838281807e7164574b3e3124180b0000000000000000010a141c262e363e444c52575e61666a6f7274767878797978787675726f6d66626058534e443f382f271e150c030000000000000000091623303c4956636f7c8997a2ada89b8f8275695e52463f37312e2d2c2c2d2e343b45515d677885919eaba4978b7e7164584b3e3125180b0000000000000000000000000000010c18222d364044505c666d79829095a09f938f857d746f79818a9298a09992867c6f695e554b42382e21180e03000000000000000000000000000000020f1b2835424e5b6875818e9ba8ab9f928578675d5145392c2017161c27333d474f54565e5a5653504946443f382f2920170d0200000000000000000000030e18222d363f49515a61696e747b8084888b8d8f90919292929291908e8c8985817c766e69615a51493f352c20160c00000000000000000000000000000000000000000000000000000000000000060c111517181a1a1a25313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e0004101c27333d474f55566060606060606056554f473d33271c100400091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b000005121e2a36424d5765727f8c98a2aea2988b7e71665c5146423b3a39383a3d444d57606d7a85929e9d9c9b9285796d6053463a2d2013070000010b151f272f35383a3b3b3b3b3b3b3b3b3b3b3b3b3b424a50535a5a5a5a5a5a5a53504a423b3b3b3b3b3b3b3b3b3b3b3b3b3a39352f271f150b0100000000000000000006131f2c3845515d677884919eabb6ac998c7f7266564c412f261c0c030000000000000000000000000000000000000009141f29333b424648504a46443f38332d27221b140b0200000013202c3946535f6c7986929facada093867a6d6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c5e574d42362a1e1205000000000013202c3946535f6c7986929facada093867a6d6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c5e574d42362a1e12050000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000815212e3b4854616e7b878c8d8e8f909184786a6054473f3a38342e34383a404b55606d7a86929facab9e918578675d5145392c20130600000000000000000005111d2a36414c565e6164656768696a6b68655d534840414243434444444545454d596673808c99a6afa295897c6f6256493c2f231609000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000010e1b2734414e5a6774818d9aa7b4aa978a7e7164544a3f33281a0e0606131f2c3845515c676d79787776757474716c6155493d3023170a000000000000000000020a131c242c323a41464d5254585f626568696b6c6c6c6c6b6a686663605c54544e47433c332d261d150c030000000000000000000713202d3a4653606d7985929fabac9f92877b6e615a5147433c3b3a38383a3b40444d56606d7a86939facaa978a7d7164574a3e3124170b00000000000000000000000000000006111b2428343f4a545d676d7a839196a19e979188807b838e929fa29f93877d706a5f574d433a30261c0f0600000000000000000000000000000000010d1a2734404d5a6773808d9aa6ac9f93867a6d6053473a2e262323262c38444f5960636b6762605b5353504a423b33291f1409000000000000000000000006101b242e373f4850575e61696e73777b7e80828484858686858583827f7d79756f6b625f5750483f372d231a0e040000000000000000000000000000000000000000000000000000000000000911181d21242527272727313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e00000b16212c353d44484a535353535353534a48443d352c21160b0000091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b0000020e1a25303b4754616d7a86929fa9aa9e9184796d605b534d4847454546484f565e69727f8c98a2aaa69b8e8275665c5044382c1f1206000007121d27313940454748484848484848484848484848484848484d4d4d4d4d4d4d48484848484848484848484848484848484745403931271d12070000000000000000000714202d3a4753606d7a86939facafa49a897c6f6356493c3023140a0000000000000000000000000000000000000000030d17212931363a3b443e3937332d27221b17110a020000000013202c3946535f6c7986929facada093867a6d60606060606060606060606060606060606060606060606060606060606060605f524d453b30251a0e02000000000013202c3946535f6c7986929facada093867a6d60606060606060606060606060606060606060606060606060606060606060605f524d453b30251a0e020000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000714212d3a46535e697884919a9b9c9d96897c6f625a504a464440434044464b515c67717e8b98a3aeaa9b8f827568554b4135291d11040000000000000000000713202d3946525e686d71727374767778756f65594d3d323536373737383835404b556774818e9aa7b2a995887b6e6255483b2f221508000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000004111d2935414c566a7683909da9aea298887b6e6155483b2d2217080004101c2934404b555c606c6b6a6969686764615a5045392d21140800000000000000000000010a121a202830363b4246484e5361696b6c6c6c68605c545d5b595653514a47433d373127221b140b030000000000000000000006121f2c3844505c6674818e9ba6afa3998e81756c625b534e494746444446484a51575e68727e8b99a4aea398897c6f6256493c2f23160900000000000000000000000000000000091217232e38424b555d686e7b849197a2a19a938d8890959da59d928b7f726b61584e453b31281e140a0000000000000000000000000000000000000c1825323f4b5865727e8b98aaafa49a897c7063544b403631303031363f4854606b7078736f6c6563605b544d453b30251a0e02000000000000000000000009121c252e363e454d52575f62666a6e71737577787879797978777573706d67636059534d453e362d251b110800000000000000000000000000000000000000000000000000000000000009121b22292e313234343434343e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000005101a232c33383c3d464646464646463d3c38332c231a10050000091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b0000000914202d3946525d6874808d97a2aca0968d80746d615e575554515153555960686e7b86929faaab9f94897c6f63544a3f34281c100300000c18242f39434b5153545454545454545454545454545454545454545454545454545454545454545454545454545454545453514b43392f24180c0000000000000000000915222f3c4855626f7b889aa4afac9f93867a6d6054473a2d211407000000000000000000000000000000000000000000060f171f262a2d2e37312d2b27221b17110b0600000000000013202c3946535f6c7986929facada093867a6d60535353535353535353535353535353535353535353535353535353535353534846423b33291f140900000000000013202c3946535f6c7986929facada093867a6d60535353535353535353535353535353535353535353535353535353535353534846423b33291f1409000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000005121e2a36424d576774818e9aa6a9a89b8e81756c605c5453514a504a5153555d606d7983919daaaea2988b7e7165584b3e2f24180d010000000000000000000714212e3a4754616d7a7e7f8081828485817568584e43372e2c2823282c2f3945515d677783909daaada196877a6d6054473a2d211407000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000713202c3945525d687885929fabac9f9285796c605346392d20130600000c18232f39434b51535f5e5e5d5c5b5a575550483e33281d1105000000000000000000000000080e161e252a30363a3c505d697378797979746d665e564e4c494644403937322b262017110a02000000000000000000000003101c28343f4a54626f7c89949fabab9e938b7e726d625f5856545351505355545c60696e7a85929eabac9f92867a6d6053473a2d201407000000000000000000000000000000000006111c263039434c565e696f7c859299a3a49f9a959da0a79e948d80746d62594f463c33291f160c02000000000000000000000000000000000000091623303c4956636f7c8998a2aeac998c8073665c5146423e3d3c3d4246515b63707d84807c78746f6c665e574d42362a1e11050000000000000000000000000a131c242c333b42464d5355575f626466696a6b6b6c6c6c6b6a686663605d55544f4c4841382f241b130900000000000000000000000000000000000000000000000000000000000006111b242d343a3d3e4040404040404b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000008131e28313a414547494949494949494745413a31281e13080000091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b00000005111d2935414c56616d7a85929fa5a89d928c7f756e696461605d5c6062656b6f7a839198a2aea3999083766b605442382e23170c000004101d2935404b555d606161616161616161616161616161616161616161616161616161616161616161616161616161616161605d554b4035291d100400000000000000000b1724313e4a5764717d8a97acb6aa9e918477675d5145392c20130600000000000000000000000000000000000000000000060d141a1e21222a24201f1b17110b06000000000000000013202c3946535f6c7986929facada093867a6d60534746464646464646464646464646464646464646464646464646464646463b3a36302921170d0200000000000013202c3946535f6c7986929facada093867a6d60534746464646464646464646464646464646464646464646464646464646463b3a36302921170d02000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000020e1a25313c4855626f7c88949faaaa9e938a7e726d6662605c545d545c6062676d75808d95a0aca99f92867a6d6154473a2e211407000000000000000000000815212e3b4854616e7b878c8d8e8f909184786a6054473f3a38342e34383a404b55606d7a86929facab9e918578675d5145392c201306000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000714212d3a4754606d7a8797a2adaa9d918477655b5044372b1f1205000007121d273139404547525251504f4e4d4b49453e362c22170c0000000000000000000000000000050c13191f252a3845525f6b788586868681786d685f584f473f38342e2b27201b150b0600000000000000000000000000000c17232e384754606a76828f99a3aea59f92877f756f6a666261605c5c606164666d727b839097a1ada59c8f8275675d5145392c1f13060000000000000000000000000000000000000a141e27313a444d575f6a707d879299a49f9f9f9fa9a0958f82786d605b51473e342a21170d04000000000000000000000000000000000000000714202d3a4753606d7985929facab9e9185796d605a534d4b4a494a4d535b626d76828f8d8984807c786e695e52463a2d201407000000000000000000000000020e1925303b444c525f6060606060605d5c5d5e5f5f5f5f5e5d5b6060606060605a58534a41362b2014080000000000000000000000000000000000000000000000000000000000010c18222d363f454a4b4d4d4d4d4d4d4d5864717e8b97a4b1a79a8e8174675b4e4134281b0e00010d19242f3a434c52545656565656565654524c433a2f24190d0100091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b000000010d1924303a46525e68727e8b939ea7a49c918c827b75716e6d67666d6f71767d849195a0aaa69f92877c6f63594f4330261c1106000006131f2c3845515d676d6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6d675d5145392c1f130600000000000000000c1926323f4c5965727f8c98a5b2a99c8f837669554b4135291d1104000000000000000000000000000000000000000000000003090e1214151d1713120f0b060000000000000000000013202c3946535f6c7986929facada093867a6d6053473a393939393939393939393939393939393939393939393939393939392e2d2a251f170f050000000000000013202c3946535f6c7986929facada093867a6d6053473a393939393939393939393939393939393939393939393939393939392e2d2a251f170f0500000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000000915212e3b47535f6a76828f98a2aea59f92877f78726f6d666a696a666d6f7379818d929da7aca2978d8074685d5246392d201307000000000000000000000714212d3a46535e697884919a9b9c9d96897c6f625a504a464440434044464b515c67717e8b98a3aeaa9b8f827568554b4135291d1104000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000815222f3b4855626e7b8895a9b3a99c8f82766953493f33271b0f030000010b151f272f34383a464544434241413e3d39332c241a100600000000000000000000000000000002080d141a26323f4c5965727f8c93938e827a6f6a615951444039302820180f0a0300000000000000000000000000000006111c2b38434e58626f7c87929fa5afa399928b817c76726f6e6d66666d6e7074797f859095a0a9a89e93897d7063554b4035291d1004000000000000000000000000000000000000020c151f28323b454e58606b717e8793939393939393969083796d665c50493f352c22190f05000000000000000000000000000000000000000006131f2c3845515c6775828f9ba7ada1978c80736c615f5757565657575f616d727f8b949a96918d89857b6e6154473b2e21140800000000000000000000000005111e2a36414c565e6c6c6c6c6c6c6c6a675f555253534f5960636c6c6c6c6c6c67645c53483c3024180b000000000000000000000000000000000000000000000000000000000005111d29343f485056585a5a5a5a5a5a5a5a64717e8b97a4b1a79a8e8174675b4e4134281b0e0004111d2935414c565d6062626262626262605d564c4135291d110400091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b0000000008131e2a36414c56626d75818e959fa6a49c948f86827e7b7a7979797b7e83899196a0a7a59e948c7f736b6054473d321e150a0000000714202d3a4753606d797b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b796d6053473a2d20140700000000000000000d192633404c5966737f8c99a6b2a89b8e8175685b4e422f24180d010000000000000000000000000000000000000000000000000002050708110b06050300000000000000000000000013202c3946535f6c7986929facada093867a6d6053473a2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d21201e1a140d05000000000000000013202c3946535f6c7986929facada093867a6d6053473a2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d21201e1a140d050000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000006121f2b37434e58626f7c86929fa4aca399928b837f7b797777767777797c80858e939da4aea49a92857a6d61564c4135291d11050000000000000000000005121e2a36424d576774818e9aa6a9a89b8e81756c605c5453514a504a5153555d606d7983919daaaea2988b7e7165584b3e2f24180d01000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000091623303c4956636f7c8996a2afa89b8e8175685b4e422d22170b00000000030d151d23292c2d3938373636353431302d28221a120800000000000000000000000000000000000003091825313e4a56626d75818f969490847c706b625b514a423a322a21191106000000000000000000000000000000000f1b27323d47535f6a727f8c939da5aba39f938e87827f7c7a797879797b7d81858b9297a0a7a8a0968f82756b605443392f24180c0000000000000000000000000000000000000000030d162029333c464f59616c727f8686868686868686847b6e675d544a3f372d231a100700000000000000000000000000000000000000000004101c2934404b5563707d8a95a0aca99f93887e746e69666463636366696e757f87939fa6a19e9a908377695e52463a2d2014070000000000000000000000000714202d3946525e68767979797979797771675b4f464854606b70797979797979746e64584c4033271a0d01000000000000000000000000000000000000000000000000000000000915212e3a45505a6265676767676767676767717e8b97a4b1a79a8e8174675b4e4134281b0e000613202c3945525d686d6f6f6f6f6f6f6f6d685d5245392c20130600091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b00000000020d1925303a44515b606d798390949da5a69e98928f8b8887858586888b90949ea1a8a39f938e82786d60594f43352b210c030000000a1723303d4a5663707d87878787878787878787878787878787878787878787878787878787878787878787878787878787877e7164574a3e3124170b00000000000000000d1a2734404d5a6773808d9aa6b3a79a8d8074675a4d4134271a07000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000013202c3946535f6c7986929facada093867a6d6053473a2d2020202020202020202020202020202020202020202020202020201514120e090200000000000000000013202c3946535f6c7986929facada093867a6d6053473a2d2020202020202020202020202020202020202020202020202020201514120e0902000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000000030f1b26323c47535f6a717e8b939aa2aaa39f95918c8886848483838485898c92979ea5aaa39f93887d70685e52443a3024190d0100000000000000000000020e1a25313c4855626f7c88949faaaa9e938a7e726d6662605c545d545c6062676d75808d95a0aca99f92867a6d6154473a2e21140700000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000a1724303d4a5763707d8a96a3b0a79a8d8174675a4e4134271b060000000000030b12181c1f202c2b2b2a2928272423211d17100800000000000000000000000000000000000000000916222e3a46515b606d7a8491989691867d726d605c544c443c332b2317110a0200000000000000000000000000000a16202b37434e58606c77818e939fa2aaa59e9a938f8c898786858586888a8d92979ea1a9a59e9691847a6d61594f4431271d1207000000000000000000000000000000000000000000040e17212a343d47505a626d727979797979797979786e695e554b42382e251b110800000000000000000000000000000000000000000000000c18232f394653606c7883909aa4afa49a938b817b767371706f7072767b818b9399a4afa99f948a7e7164574d42362a1e11050000000000000000000000000814212e3b4754616e7a86868686868683776a5d5144495663707d8686868686868074675a4e4134271b0e01000000000000000000000000000000000000000000000000000000000b1724313d4a56626d71737373737373737373737e8b97a4b1a79a8e8174675b4e4134281b0e000714212d3a4754606d7a7c7c7c7c7c7c7c7a6d6054473a2d21140700091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b000000000008131e28323f45515d676d7a828e939da0a7a39f9b97949892929895989c9fa6a7a099928d81786d665c50463d3223190f000000000a1723303d4a5663707d899494949494949494949494949494949494949494949494949494949494949494949494949494948a7d7164574a3e3124170b00000000000000000e1b2734414e5a6774818d9aa7b3a69a8d8073675a4d4034271a0d010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013202c3946535f6c7986929facada093867a6d6053473a2d20141313131313131313131313131313131313131313131313131308070502000000000000000000000013202c3946535f6c7986929facada093867a6d6053473a2d201413131313131313131313131313131313131313131313131313080705020000000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000000000a15202b37434e58616c727f8892989fa3a7a09d99999291909090919298999ea2a9a69f98928b7f726c61564c4132281e13080000000000000000000000000915212e3b47535f6a76828f98a2aea59f92877f78726f6d666a696a666d6f7379818d929da7aca2978d8074685d5246392d20130700000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000a1724313d4a5764707d8a97a3b0a79a8d8074675a4d4134271a0e01000000000001070c1013141f1f1e1d1c1b1a181714110c0600000000000000000000000000000000000000000006121e29353f45525d686f7c86929f9892877f746d665d564d453d3528231c140c0300000000000000000000000000040f1b26323c44505b656d78818b92989fa4aca49f9c9995949892929894979a9ea1a9a7a09d938f847b6e685d52473d331f150b0100000000000000000000000000000000000000000000050f18222b353e48515b62656c6c6c6c6c6c6c6c6b615e574d433a30261c130900000000000000000000000000000000000000000000000007121f2b3844505b66707d88939fa5aca49f938e8783807e7d7c7d7f82878e939fa4aba9a1978f82766c6155453b30251a0e020000000000000000000000000814212e3b4754616e7a87939393939084776a5d5144495663707c89939393938d8174675a4e4134271b0e01000000000000000000000000000000000000000000000000000000000b1825323e4b5865717f80808080808080808080828f9ca9b4a79a8e8174675b4e4134281b0e000a1723303d4a5663707d898989898989897d7063564a3d3023170a00091623303c4956636f7c8996a2aca4978a7d7164574a3e3124170b0000000000020c16202935404b555d686d78818991959c9fa3aba4aaa29f9fa2aaa4aba49f9c95908780786d665c544a3f342b211007000000000a1723303d4a5663707d8996a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1978a7d7164574a3e3124170b00000000000000000e1b2835414e5b6874818e9ba7b3a6998c807366594d4033261a0d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013202c3946535f6c7986929facada093867a6d6053473a2d20140d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0b0a080500000000000000000013202c3946535f6c7986929facada093867a6d6053473a2d20140d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0b0a0805000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000000040f1a26313c46505a636d727e868e92999da0a8aba39f9e9d9c9d9e9fa2aaaaa29f9b948f867e726d62594f443a3020160c0200000000000000000000000006121f2b37434e58626f7c86929fa4aca399928b837f7b797777767777797c80858e939da4aea49a92857a6d61564c4135291d110500000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000b1724313e4a5764717d8a97a4b0a69a8d8073675a4d4034271a0d010000000000000000040607131211100f0e0e0b0a08050000000000000000000000000000000000000000000000010d18232935414c565f6a727e8b939e99938c81786d685f574f473f342e261e150c03000000000000000000000000000a152027333f49535c666d747f868e939a9ea1a8a7a5a2aaa29f9fa2aaa3a7aaa29f9b959089827a6e695e564c41352b210d03000000000000000000000000000000000000000000000000061019232c363f4951565860606060606060605e54524d453b31281e140a01000000000000000000000000000000000000000000000000030f1c28333f4a54606b73808d939da4aca59d99938f8c8a89898a8c8f93999ea5aea79f9791857b6e615a504533291f1409000000000000000000000000000814212e3b4754616e7a87949f9f9d9084776a5d5144495663707c89969f9f9a8d8174675a4e4134271b0e0100000000000000000000000000000000000000000000000000000003101d293643505c6976828d8d8d8d8d8d8d8d8d8d8f949eaab4a79a8e8174675b4e4134281b0e000a1723303d4a5663707d899595959595897d7063564a3d3023170a00091623303c4956636f7c89969f9f9f978a7d7164574a3e3124170b000000000000050e18242f3a434c565d666d747d848a8f92999a9c9e9e9f9f9e9d9c9a99938f8a837c736c665c544a42382e22190f00000000000a1723303d4a5663707d89969f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f978a7d7164574a3e3124170b00000000000000000e1b2835414e5b6874818e9ba7b3a6998d8073665a4d4033271a0d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013202c3946535f6c7986929facada093867a6d6053473a2d201a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a171714110c050000000000000013202c3946535f6c7986929facada093867a6d6053473a2d201a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a171714110c0500000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000000000a15202a343e48515b636c717b81878c919597999c9d9e9e9f9f9f9e9d9b9998928e89827b716c625b51473e32281e0e0400000000000000000000000000030f1b26323c47535f6a717e8b939aa2aaa39f95918c8886848483838485898c92979ea5aaa39f93887d70685e52443a3024190d0100000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000a1724313d4a5764707d8a97a3b0a79a8d8074675a4d4134271a0e010000000000000105090b0b121111100f0e0d09080603000000000000000000000000000000000000000000000000070d19242f3a434e58626d75818e95a09f928e827a6e69605951443f3830271e150b00000000000000000000000000040b17222d38414a545c606d727b81878d9196989a9c9d9e9f9f9f9e9d9d9b9898928e8a837d756d685e574d443a3023190f000000000000000000000000000000000000000000000000000007111a242d373f464a4c5353535353535353524846423b33291f160c0200000000000000000000000000000000000000000000000000000b17222d38424f59606c78818d929ea0a8aba49f9c9997969696999c9fa4abaaa29f9590857c6f695e53483e3420170d02000000000000000000000000000814212e3b4754616e7a8794a1aa9d9084776a5d5144495663707c8996a3a79a8d8174675a4e4134271b0e0100000000000000000000000000000000000000000000000000000003101d293643505c6976838f9a9a9a9a9a9a9a9a9a9c9ea6b0b4a79a8e8174675b4e4134281b0e000a1723303d4a5663707d8996a2a2a296897d7063564a3d3023170a00091623303c4956636f7c8993939393938a7d7164574a3e3124170b0000000000000007131d28313a444c545c606b70787e82868a8d8f9192929291918f8d8a86827d786f6a605b544a423930261c100700000000000a1723303d4a5663707d899393939393939393939393939393939393939393939393939393939393939393939393939393938a7d7164574a3e3124170b00000000000000000e1b2734414e5a6774818d9aa7b3a69a8d8073675a4d4034271a0d010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013202c3946535f6c7986929facada093867a6d6053473a2d27272727272727272727272727272727272727272727272727272727272423211c17100800000000000013202c3946535f6c7986929facada093867a6d6053473a2d27272727272727272727272727272727272727272727272727272727272423211c171008000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000000000030e18222d363f49515a61696e747b8084888b8d8f90919292929291908e8c8985817c766e69615a51493f352c20160c0000000000000000000000000000000a15202b37434e58616c727f8892989fa3a7a09d99999291909090919298999ea2a9a69f98928b7f726c61564c4132281e13080000000000000000000000000000000203101d2a3643505d69768390908376695d5043362a1d100302000000000000000a1724303d4a5763707d8a96a3b0a79a8d8074675a4d4134271a0e010000000000060c111517181f1e1d1c1b1a191615130f0a04000000000000000000000000000000000000000000000008131e28313c46515b606d79839198a29d948f847b706b625b504a423930271d12070000000000000000000000000006111b262f38424a505b62696e757b8084888b8d8f90929292929191908e8b8985817d78706b605d564d453b32281e110700000000000000000000000000000000000000000000000000000008121b252d343a3e3f4646464646464646453b3a36302921170d0400000000000000000000000000000000000000000000000000000006111c262f3d44505b666d78808a91969d9fa7a7a9a6a4a3a2a3a5a9a7a8a09e98928c837b6f6a5f574d42362c220e0500000000000000000000000000000814212e3b4754616e7a8794a1a99d9084776a5d5144495663707c8996a3a79a8d8174675a4e4134271b0e0100000000000000000000000000000000000000000000000000000003101d293643505c6976838f9ca6a6a6a6a6a6a6a6a9aab0acaca79a8e8174675b4e4134281b0e000a1723303d4a5663707d8996a3aca396897d7063564a3d3023170a00091623303c4956636f7d868686868686867e7164574a3e3124170b00000000000000010c161f28323a424b515960666c71767a7d808284858686858483807d7a75706c666058504a423930271e140a0000000000000a1723303d4a5663707d86868686868686868686868686868686868686868686868686868686868686868686868686868686867e7164574a3e3124170b00000000000000000d1a2734404d5a6773808d9aa6b3a79a8d8174675a4e4134271b09000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013202c3946535f6c7986929facada093867a6d6053473a34343434343434343434343434343434343434343434343434343434343431302d28221a1208000000000013202c3946535f6c7986929facada093867a6d6053473a34343434343434343434343434343434343434343434343434343434343431302d28221a12080000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000000000006101b242e373f4850575e61696e73777b7e80828484858686858583827f7d79756f6b625f5750483f372d231a0e04000000000000000000000000000000040f1a26313c46505a636d727e868e92999da0a8aba39f9e9d9c9d9e9fa2aaaaa29f9b948f867e726d62594f443a3020160c0200000000000000000000000000050a0f12101d2a3643505d69768390908376695d5043362a1d10120f0a0500000000000a1623303d495663707c8996a3afa79a8e8174675b4e4134281b0700000000000911181d2124252c2b2a2928272622211f1b150e0600000000000000000000000000000000000000000000010c161f2a343f45515d676e7c86929fa59f9691857d726d605c544b42392e23180c00000000000000000000000000000a141d2630383f4451575f61696e73787b7e80828485858685858483817f7c7a75706d666059524c443b332920160c000000000000000000000000000000000000000000000000000000000009131b23292e31323939393939393939382e2d2a251f170f0500000000000000000000000000000000000000000000000000000000000a141d28333f4a545c666d747d848b9095979a9c9e9f9f9f9f9e9d9a9896918c857f786e695f584e453b31241a100000000000000000000000000000000814212e3b4754616e7a87949c9c9c9084776a5d5144495663707c89969c9c9a8d8174675a4e4134271b0e0100000000000000000000000000000000000000000000000000000003101d293643505c6976838f9c9f9f9f9f9f9f9f9f9f9f9f9f9f9f9a8e8174675b4e4134281b0e000a1723303d4a5663707d89969f9f9f96897d7063564a3d3023170a000915222f3b4854606b6f79797979797979716c6155493c3023170a0000000000000000040d162028303940454f545b6064686e7174767778797978777673716e6863605b544e443f382f271e150c020000000000000916232f3c4855616b707979797979797979797979797979797979797979797979797979797979797979797979797979797979716c6155493c3023170a00000000000000000d192633404c5966737f8c99a6b2a89b8f8275685c4f4230251a0e020000000000000000000000000000000000000000000000000000010203000000000000000000000000000000000013202c3946535f6c7986929facada093867a6d605347404040404040404040404040404040404040404040404040404040404040403e3c39332c241a10050000000013202c3946535f6c7986929facada093867a6d605347404040404040404040404040404040404040404040404040404040404040403e3c39332c241a100500000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000000000000009121c252e363e454d52575f62666a6e71737577787879797978777573706d67636059534d453e362d251b110800000000000000000000000000000000000a15202a343e48515b636c717b81878c919597999c9d9e9e9f9f9f9e9d9b9998928e89827b716c625b51473e32281e0e04000000000000000000000000010910161b1e20202a3643505d69768390908376695d5043362a20201e1b161009010000000815222f3b4855626e7b8895a9b3a89b8f8275685c4f422e23180c0000000009121b22292e3132393837363534332f2e2b262018100600000000000000000000000000000000000000000000040d18222935404b555f6a717e8a939da7a09792877f746d665c544b4034281c100400000000000000000000000000020b151e262e343f454d53575f6266696e71747677787979797877767472706d6763605c544f45413a322921170e040000000000000000000000000000000000000000000000000000000000010911181e2224252d2d2d2d2d2d2d2d2b21201e1a140d05000000000000000000000000000000000000000000000000000000000000020b17222d38424a545c606b70797e83878b8d8f919292929291908e8b88847f7a736d665f574e463c33291f12090000000000000000000000000000000814212e3b4754616e7a878f8f8f8f8f84776a5d5144495663707c898f8f8f8f8d8174675a4e4134271b0e0100000000000000000000000000000000000000000000000000000003101d293643505c6976838f939393939393939393939393939393938e8174675b4e4134281b0e000a1723303d4a5663707d899393939393897d7063564a3d3023170a0007131f2c38434f5960636c6c6c6c6c6c6c64615a5045392d211408000000000000000000040d161e272e343d424a5053565e616467696b6b6c6c6b6a696764615e5653504a423c332d261d150c03000000000000000714202c38444f5961636c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c64615a5045392d21140800000000000000000b1825313e4b5864717e8b97a4b1a99d9083766a574d42362a1e1105000000000000000000000000000000000000000000000003080c0e0e0f0b0707040100000000000000000000000013202c3946535f6c7986929facada093867a6d60534d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4a49453e362c22170c0000000013202c3946535f6c7986929facada093867a6d60534d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4a49453e362c22170c00000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000000000000000a131c242c333b42464d5355575f626466696a6b6b6c6c6c6b6a686663605d55544f47423c332d241b1309000000000000000000000000000000000000030e18222d363f49515a61696e747b8084888b8d8f90919292929291908e8c8985817c766e69615a51493f352c20160c000000000000000000000000010a131b21272b2d2d2d3643505d69768390908376695d5043362d2d2d2b27211b130a0100000714212e3a4754616d7a8797a2ada99c90837669544a4034281c1004000006111b242d343a3d3e454444434241403c3b37322a22180e0400000000000000000000000000000000000000000000071018242f39434e58616c74818e95a0a9a299928b80786d665c5145382c1f13060000000000000000000000000000030c151c2328333c42464d5355575f626567696a6b6c6c6c6b6a6a686563605d5553504a423d35302820170f050000000000000000000000000000000000000000000000000000000000000000060d1216181920202020202020201f1514120e0902000000000000000000000000000000000000000000000000000000000000000006111c262f38424a505961666d71767b7e818384858686858483817f7b77736d68605c544d453c342a21170d000000000000000000000000000000000714212d3a4754606d7a8283838383838174675b4e414855626f7c8283838383827f7265584c3f3225190c0000000000000000000000000000000000000000000000000000000003101d293643505c6976828686868686868686868686868686868686868174675b4e4134281b0e000a1723303d4a5663707d868686868686867d7063564a3d3023170a00030f1b27323d474f545660606060606060575550483e33281c110400000000000000000000040c151d23282f383f44464c5254575a5c5e5f5f5f5e5e5c5a5754524c46443f382f28221c140b03000000000000000004101c27333d474f55566060606060606060606060606060606060606060606060606060606060606060606060606060606060575550483e33281c110400000000000000000a1723303d4a5663707d8996aab4ab9f928578695e52463a2d20140700000000000000000000000000000000000000000001090f14181a1b1c181413110d08050100000000000000000013202c3946535f6c7986929facada093867a6d605a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a575550483e33281c110500000013202c3946535f6c7986929facada093867a6d605a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a575550483e33281c1105000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000000000000000010a121a212930363c4247484e5355596063676a6b6c6b6a666260585653514b48433d37312a211b1209010000000000000000000000000000000000000006101b242e373f4850575e61696e73777b7e80828484858686858583827f7d79756f6b625f5750483f372d231a0e0400000000000000000000000009131c252c33373939393943505d69768390908376695d50433939393937332c251c130900000713202d3946525d687885929fabaa9e918477665c5144382c1f120600010c18222d363f454a4b5251504f4e4d4c4947433c342a20150a000000000000000000000000000000000000000000000007121d28313c46505a606d7983909893939393928d82796d6053463a2d201307000000000000000000000000000000030a1117212a31373c4247484d5355585a5c5d5f5f5f5f5e5e5d5b585653514b46443f383029241e160e05000000000000000000000000000000000000000000000000000000000000000000000106090b0c1313131313131313120807050200000000000000000000000000000000000000000000000000000000000000000000000a141d2630383f444f545c6064696e7174767778797978787674726f6a66605d56514a423c332a22180f05000000000000000000000000000000000713202c3945525d686d767676767676746f64584c4047535f6a6f767676767676726d62564a3e3125180b00000000000000000000000000000000000000000000000000000000020f1c2835414e5a667076797979797979797979797979797979797979746f64594c4033271a0d000916232f3c4855616b7079797979797979706b6155483c2f23160900000a16212b353d434849535353535353534a49453e362c22170c000000000000000000000000030b12181d262d33383b4146474a4d4f515253535251504d4a4746413b38332d261d17110a02000000000000000000000b16212c353d44484a53535353535353535353535353535353535353535353535353535353535353535353535353535353534a49453e362c22170c0000000000000000000815222e3b4855616e7b8898a2aeada297877b6e6154473b2e21140a0000000000000000000000000000000000000000030b131a20242728292521201d1913110d08020000000000000013202c3946535f6c7986929facada093867a6d6767676767676767676767676767676767676767676767676767676767676767676764615a5045392d21140800000013202c3946535f6c7986929facada093867a6d6767676767676767676767676767676767676767676767676767676767676767676764615a5045392d211408000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000000000000000000080f171f252a31373e4850585f626b6f737778797877736f6a615f574f473d38322b2620180f090000000000000000000000000000000000000000000009121c252e363e454d52575f62666a6e71737577787879797978777573706d67636059534d453e362d251b110800000000000000000000000005101b252e373e434646464646505d69768390908376695d504646464646433e372e251b10050005111d2935414c566a7683909da9ac9f9286796d6053463a2d2013070005111d29343f485056585f5e5d5c5b5a5955534e463c32261b0f0300000000000000000000000000000000000000000000010c161f2a343e45515c676e7b8586868686868686867a6e6154473b2e2114080000000000000000000000000000000000060f181f262b31373a3c4247484b4d4f51525253525251504e4c494745403a38342e261e19130c0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020b141e262e343e424a5153575e616467696b6c6c6c6c6b6a6765625f5854524c444039302a21181006000000000000000000000000000000000004111d2935414c565d6069696969696967645c53483c434e585f6269696969696965625b51463a2e22160900000000000000000000000000000000000000000000000000000000000d1926323e49545e66696c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c67645d53483c3024180b000714202c38444f5961636c6c6c6c6c6c6c6361594f44382c2014070000040f19232b32383b3c464646464646463e3c39332c241a10050000000000000000000000000000070b141c22282b3036393b3e414344454646454443403e3b3936302b28221c140b0600000000000000000000000005101a232c33383c3d46464646464646464646464646463f44464f4f4f4f4f4f4f46444046464646464646464646464646463e3c39332c241a10050000000000000000000613202d394653606c7985929facb3a9968a7d7063574a3d31261b0f01000000000000000000000000000000000000000b151d252b30343536312d2c2924201d19130c0701000000000013202c3946535f6c7986929facada09386797373737373737373737373737373737373737373737373737373737373737373737373716c6155493c3023170a00000013202c3946535f6c7986929facada09386797373737373737373737373737373737373737373737373737373737373737373737373716c6155493c3023170a000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000000000000000000000050d15202a333e47505a616a6f767c808385868583807c756e6960594f473d32291f150e060000000000000000000000000000000000000000000000000a131c242c333b42464d5355575f626466696a6b6b6c6c6c6b6a686663605d55544f47423c332d241b1309000000000000000000000000000a16212c3740494f5353535353535d69768390908376695d5353535353534f4940372c21160a00010d192430414e5b6774818e9aa7afa399887b6f6255483c2e23180c060615212e3a45505a62656c6b6a69686766625f584e43372b1f13060000000000000000000000000000000000000000000000040d18222934404b555f696e78797979797979797976685e5246392d201407000000000000000000000000000000000000060e141a1f262b2e31373a3b3e41434445464646454443413f3d3a39352f2b28231c140c0802000000000000000000000000000000000000000000000000030608090f1112131313110f0c0707050100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020c141c232830394044464d5254585a5c5e5f5f5f5f5e5d5b5855534e4745413a342e271e180f06000000000000000000000000000000000000010d1924303a444c52545c5c5c5c5c5c5b58534a41363c464e53555c5c5c5c5c5c585651493f34291e120600000000000000000000000000000000000000000000000000000000000915212d38424c545a5c6060606060606060606060606060606060605b59534a41362b2014080004101c27333d474f55566060606060606056554f473d33271c100400000007101921272c2f303939393939393931302d28221a120800000000000000000000000000000000020a11171c1f252a2d2e3134363838393938373634312e2d2a251f1c17110a02000000000000000000000000000008111a21272c2f3039393939393939393939392d38424a50535c5c5c5c5c5c5c53514a42392e393939393939393939393931302d28221a12080000000000000000000006121f2b3844505b667683909ca9b3a79a8d807467584e43372b1e1308000000000000000000000000000000000000060f1d272f373c4041423e3a39352f2d29251e18120b030000000013202c3946535f6c7986929facb3a79a8d8080808080808080808080808080808080808080808080808080808080808080808080807e7164574a3e3124170b00000013202c3946535f6c7986929facb3a79a8d8080808080808080808080808080808080808080808080808080808080808080808080807e7164574a3e3124170b000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000000000000000000000020e1a26313c454f59616c707c82898d90929291908d88827b706b60594f443b3025190e02000000000000000000000000000000000000000000000000010a121a212930363c4247484e5355585a5c5d5e5f5a61646c6c6c6c66635c5248433d37312a211b120901000000000000000000000000000f1b27333e49525a5f60606060606069768390908376696060606060605f5a52493e33271b0f0000081825313e4b5864717e8b97a7b1ab988b7e7165554b4034281d1413131624313d4a56626c71787777767574736f6a5f53473b2e211508000000000000000000000000000000000000000000000000060f18232f39434d575f616c6c6c6c6c6c6c6c6c6c5e564c41362a1e11050000000000000000000000000000000000000003090e151a1e21262b2e2f32343637383939393837373532302d2c29241f1c17110a02000000000000000000000000000000000000000000000000030a0f1215151c1e1f1f201f1e1c181413110d0802000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020a11171e272e34383b4246484b4e50515253535251504e4c4847433c39353028231c150c06000000000000000000000000000000000000000008131e28323a4145475050505050504e4c4841382f343c4347485050505050504c4a463f372d23180d01000000000000000000000000000000000000000000000000000000000005101b26303a42494e505353535353535353535353535353535353534e4c4841382f251a0f0300000b16212c353d44484a535353535353534a48443d352c21160b0000000000070f161b1f22232d2d2d2d2d2d2d2423211c17100800000000000000000000000000000000000000060b0f14191e20212427292b2c2c2c2b2b29272421201e19140f0b0600000000000000000000000000000000000810161c2023232d2d2d2d2d2d2d2d2d2d28333f4a545b6068686868686868605c544a4034282d2d2d2d2d2d2d2d2d2d2423211c1710080000000000000000000000030f1c28333f4a546774808d9aaab4aa9d9184776a5f53473a2f24190b0200000000000000000000000000000000030e18212f3941484d4e4f4b4745413a39353029241d150d0300000013202c3946535f6c7986929facb9a99d928d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8174675b4e4134281b0e01000013202c3946535f6c7986929facb9a99d928d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8174675b4e4134281b0e010000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000000000000000000000006121e2b37424d57616c707e868f949a9c9998999c99938f857d706b60564d42362a1f14080000000000000000000000000000000000000000000000000000080f171f252a31373a3c4247484b4d4f4a505b636c7079797979736e63574b3f322b2620180f09000000000000000000000000000000121e2b37434f5a646c6c6c6c6c6c6c6c7683909083766c6c6c6c6c6c6c6c645a4f43372b1e1200000815212e3b4854616e7b87959faba89b8e8175675c5145392e2521201f202935404b5565717e8584838281807f7c6f6255493c2f2216090000000000000000000000000000000000000000000000000007121d27313c454d53555f60606060606060605f524c443b3025190e0200000000000000000000000000000000000000000003090e12151a1e21222527292a2c2c2c2c2b2b2a282523201f1d1812100b0600000000000000000000000000000000000000000000000000060e151b1f2122282a2b2c2c2c2b292521201d19130d0802000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060c151c23282c30363a3b3e414344454646454543413f3c3a37312c29241e18120b03000000000000000000000000000000000000000000020c1620283035393a43434343434341403c362f262a32373b3c4343434343433f3e3a342d251b1107000000000000000000000000000000000000000000000000000000000000000a141e2830383e414346464646464646464646464646464646464641403c362f261d130800000005101a232c33383c3d464646464646463d3c38332c231a1005000000000000040a0f13151620202020202020171714110c050000000000000000000000000000000000000000000003080d111414171a1c1e1f20201f1e1d1a171414110e08030000000000000000000000000000000000000000050b101416172020202020202020201f2b3844505b666c757575757575756d665c5144382c1f202020202020202020171714110c05000000000000000000000000000b17222d3d4a5763707d8a98a2aeaca095887c6f62564c4135291d140a000000000000000000000000000000000915202a33414b53595b5c5854524c4746413a352f271f150b01000013202c3946535f6c7986929facb9aea49d9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a8e8174675b4e4134281b0e01000013202c3946535f6c7986929facb9aea49d9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a8e8174675b4e4134281b0e010000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000000000000000000000814212e3a47535f69707e87929899938f8c8b8c90949e9792877d6f695e52463b3025190e020000000000000000000000000000000000000000000000000000050d141a1f262b2e31373a3b3e444c545c606d727e868686868073665a4d4033271a150e060000000000000000000000000000000013202d3946535f6c767979797979797979839090837979797979797979766c5f5346392d201300000714202d3a46525e697783909daaab9f9285796d60544b4036312d2c2c2d323a45515d6775818e91908f8e8d897c6f6356493c3023160900000000000000000000000000000000000000000000000000010b151f2a333c4246485253535353535353535346413b32291e14080000000000000000000000000000000000000000000000000206090e121415181a1c1e1f1f201f1f1e1d1b19161413100c0703000000000000000000000000000000000000000000000000000006101820262b2e2f3537383939393835322e2d2a251e19130c04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b12181c1f252a2d2e3134363839393939383734322f2e2b26201d19130c07000000000000000000000000000000000000000000000000040e161e24292c2d3636363636363433302b251d20262b2e2f36363636363632312e29231b13090000000000000000000000000000000000000000000000000000000000000000030c161e262d3235363939393939393939393939393939393939393433302b251d140b010000000008111a21272c2f3039393939393939302f2c27211a110800000000000000000003070909131313131313130b0a08040000000000000000000000000000000000000000000000000000010507080b0e10111213131211100d0b080705020000000000000000000000000000000000000000000000000407090a131313131313131313202d394653606c7881828282828281796d6053463a2d201313131313131313130b0a08040000000000000000000000000000000614202d3a4753606d7985929facb1a79a8d8073685d52453b2f261b1106000000000000000000000000000006101a26313c45535d64686964605d5654524c45403931271d1207000013202c3946535f6c7986929facacacaea9a7a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a69a8e8174675b4e4134281b0e01000013202c3946535f6c7986929facacacaea9a7a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a69a8e8174675b4e4134281b0e010000000000000000020714202d3a4753606d7a8693a0acac9f9286796c5f5346392c2013070502000000000000000000000000000000000006121f2b37434e58626e7b869299959187827f7f80838991969992857b6e61564d41362a1e110500000000000000000000000000000000000000000000000000000002090e151a1e21262b343d454d565d666d747f87929892857b6e6154473b2e21140903000000000000000000000000000000000013202d394653606c798686868686868686909494908686868686868686796c605346392d2013000005121e2a36424d5765727f8c98a2aea2988b7e71665c5146423b3a39383a3d444d57606d7a85929e9d9c9b9285796d6053463a2d2013070000000000000000000000000000000000000000000000000000030d18212a31373a3b4546464646464646463b3936302920170d02000000000000000000000000000000000000000000000000000000020608080b0e1011121313131211100e0c0a07060400000000000000000000000000000000000000000000000000000000030e18222a31373a3c42444546464644423f3a39363029241e160e0700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070c10141a1e20212527292b2c2c2c2c2b2a282522211f1b15110d08020000000000000000000000000000000000000000000000000000040c13191d2021292929292929282724201a13151b1f21222929292929292525221e18110901000000000000000000000000000000000000000000000000000000000000000000040c141b212628292d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d282724201a130b020000000000000810161c2023232d2d2d2d2d2d2d2323201c161008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060606060606060713202d3a4653606d79868f8f8f8f8f867a6d6053473a2d201407060606060606060000000000000000000000000000000000000006131f2c3845515c6775828f9ba8b2ab9f92857a6d60574d41382d2217110a020000000000000000000001081018222b37424e57646f7475716d6865615e56514b43392f24180c000013202c3946535f6c7986929f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9a8e8174675b4e4134281b0e01000013202c3946535f6c7986929f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9a8e8174675b4e4134281b0e0100000000000003090e1214202d3a4753606d7a86939f9f9f9f9286796c5f5346392c201514120e09030000000000000000000000000000000815212e3a47535f6a75828f989691837c76737273767d849197978e8174685e5246392d2014070000000000000000000000000000000000000000000000000000000000050c151d2328363e464f575f686d78818c939993877d70695e52463a2d20140700000000000000000000000000000000000013202d394653606c7986939393939393939c9f9f9c9393939393939386796c605346392d20130000020e1a25303b4754616d7a86929fa9aa9e9184796d605b534d4847454546484f565e69727f8c98a2aaa69b8e8275665c5044382c1f1206000000000000000000000000000000000000000000000000000000060f181f262b2d2e3939393939393939392e2d2a251e170e0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a15202a343c4347484f5152525352514f4b4746413a35302820191108000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004090e121415181b1d1e1f20201f1e1d1b191515120f0a0401000000000000000000000000000000000000000000000000000000000002080d1113141d1d1d1d1d1d1b1a18140f080a0f1215151d1d1d1d1d1d191816120d07000000000000000000000000000000000000000000000000000000000000000000000000030a1015191c1d2020202020202020202020202020202020201b1a18140f08010000000000000000050b1014161720202020202020171614100b05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050a0d0f101313100f0d0a0500000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d7986939b9b9b93867a6d6053473a2d201407000000000000000000000000000000000000000000000000000004101c2934404b5563707d8a96a1acaea2988c7f73695e53493f3327221b140b090603000001000205080d1319222a343c47535f6a7481827e7a76716d68605d554b4035291d10040013202c3946535f6c79869293939393939393939393939393939393939393939393939393939393939393939393939393939393938e8174675b4e4134281b0e01000013202c3946535f6c79869293939393939393939393939393939393939393939393939393939393939393939393939393939393938e8174675b4e4134281b0e010000000000050d141a1e21212d3a4753606d7a8693939393939286796c5f5346392d2d21211e1a140d0500000000000000000000000000000915222f3c4855626f7b88949e91847a6f6a6665666b6f7b85929e93877b6e6154473b2e21140800000000000000000000000000000000000000000000000000000000060e161e272e344048505960696e7a828e939f948c7f736b60574d42362a1e110500000000000000000000000000000000000013202d394653606c7986939f9f9f9f9f9fa9ababa99f9f9f9f9f9f9386796c605346392d20130000000914202d3946525d6874808d97a2aca0968d80746d615e575554515153555960686e7b86929faaab9f94897c6f63544a3f34281c100300000000000000000000000000000000000000000000000000000000060e141a1e21222c2d2d2d2d2d2d2d2d21201e19140d05000000000000000000000000000000000000000000000000000000000000000000000406070a0d0f11121313131212100e0c090606030000000000000000000000000000000000000000000000030f1b26313c464e53555b5d5e5f5f5f5e5c5854524c46413a322b231a1208000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020507080b0e10111213131212100e0c0908060300000000000000000000000000000000000000000000000000000000000000000000010407071010101010100e0d0b08030000030608091010101010100c0b09060100000000000000000000000000000000000000000000000000000000000000000000000000000005090d0f101313131313131313131313131313131313130e0d0b08030000000000000000000000000407090a131313131313130a090704000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030a11161a1c1d20201d1c1a16110a030000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d798693a0a8a093867a6d6053473a2d2014070000000000000000000000000000000000000000000000000000000c18232f394653606c7884919ea8b2aa9f92867b6e655b50443e332d261d1a1312100b060e090e1214191e2429343c46505a626e7b878f8b86827e7a766d675d5145392c1f13060013202c3946535f6c7987868686868686868686868686868686868686868686868686868686868686868686868686868686868686868174675b4e4134281b0e01000013202c3946535f6c7987868686868686868686868686868686868686868686868686868686868686868686868686868686868686868174675b4e4134281b0e0100000000050f171f252a2d2e393a4753606d798686868686868687796c5f53463939392e2d2a251f170f05000000000000000000000000000d192633404c5966737f8c99968a7d70685f5858596069717e8b98998b7e7165584b3e3225180b000000000000000000000000000000000000000000000000000000070f18202830394045525a616b6f7b838f949d968f82776c60594f453b30251a0e0200000000000000000000000000000000000013202d394653606c7986939facacacacacb6b7b7b6acacacacac9f9386796c605346392d201300000005111d2935414c56616d7a85929fa5a89d928c7f756e696461605d5c6062656b6f7a839198a2aea3999083766b605442382e23170c00000000000000000000000000000000000000000000000000000000000003090e1214151f20202020202020201414110e0802000000000000000000000000000000000000000000000000000000000000000001070c10131416191c1d1f1f20201f1e1d1b191613120f0b0600000000000000000000000000000000000000000006121f2b37434e585f62686a6b6c6c6c6b6865615e56524c443d352c241a110800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040d151c2226292a2d2d2a2926221c150d0400000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d798693a0aca093867a6d6053473a2d20140700000000000000000000000000000000000000000000000000000007121f2b3844505b66727f8b96a1acaea2988f82776c605a50443f382f2b26201f1c171b1a1b1a1e2124292f353e464e58626c75828f9999928f8b8682796d6053473a2d20140700121f2c3845525e6a757979797979797979797979797979797979797979797979797979797979797979797979797979797979797979746f64594c4033271a0d010000121f2c3845525e6a757979797979797979797979797979797979797979797979797979797979797979797979797979797979797979746f64594c4033271a0d01000000030d17212931363a3b464645515c67767979797979797979756a5e52464646463b3a36312921170d030000000000000000000000020f1c2935424f5c6875828f9b9184786b61564e4c4f57606d7a86929a8e8174675b4e4134281b0e0100000000000000000000000000000000000000000000000000071019212a323a434b515b636c717d8591959f9991847a6d655b50473d33291f14090000000000000000000000000000000000000013202d394653606c7986939facb9b9b9b9c3c4c4c3b9b9b9b9ac9f9386796c605346392d2013000000010d1924303a46525e68727e8b939ea7a49c918c827b75716e6d67666d6f71767d849195a0aaa69f92877c6f63594f4330261c1106000000000000000000000000000000000000000000000000000000000000000002050708121313131313131313080705020000000000000000000000000000000000000000000000000000000000000000040a0f12181c1f202326282a2b2c2c2c2c2b2a282523201f1c17110f0a030000000000000000000000000000000000000815212e3a47535f6a6f7577787979797775726d68615d564f473e362c231a1006000000000000000000000000000000000000000000000000000000000000000000000000000000020507080b0e111112131312110f0c0908060300000000000000000406070b0f1213131211100e0c0b09060100000000000000000000000000000000000000000000000000020507080b0d0f1112131313131211100e0b08080602000000000000000000000000000000000000000000000000000000000000000000050a0d0f101313100f0d0a0500000000000000000000000000000000000000000000000000000000050a0d0f101313100f0d0a050000000000000000000000000000000000000000000000000000000000050a0d0f101313100f0d0a0500000000000000000000000000000000000000000000000000030d161f272d32353639393635322d271f160d03000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d7986939f9f9f93867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000030f1c28333f4a54606d7984919ea6b0aa9e948c7f726c615a5049413c37312d2b2823272728252a2d2f353a41454f585f6a717e8b939ea39f9c998f8275675d5145392c1f130600111d2a36424e59636a6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c67645d53483c3024180b000000111d2a36424e59636a6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c67645d53483c3024180b0000000009141f29333b4246485353534b555c6c6c6c6c6c6c6c6c6c6a635953535353534846423b33291f1409000000000000000000000004101d2a3743505d6a7683909c8f827669594f443f45515d677784919c8f8275695c4f4236291c0f03000000000000000000000000000000000000000000000000040f19222b333c444c555c606d737e869297a09f92877c6f685d53493f352b20170d020000000000000000000000000000000000000013202d394653606c7986939facb9c6c6c6cfd0d0cfc6c6c6b9ac9f9386796c605346392d20130000000008131e2a36414c56626d75818e959fa6a49c948f86827e7b7a7979797b7e83899196a0a7a59e948c7f736b6054473d321e150a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040a0f161b1d23292c2d303335373839393939383635322f2d2b28221c1b150e0903000000000000000000000000000000000915222f3c4855626f7c81848585868584827e7a746d68605950483e352c22180d0300000000000000000000000000000000000000000000000000000000000000000000000003090e121415181b1d1e1f201f1f1d1b191515120f0a0401000000070c101313181c1e1f201f1e1d1b181815120d060000000000000000000000000000000000000000000205090e121415181a1c1e1f1f20201f1f1e1c1a181514120e09060300000000000000000000000000000000000000000000000000000000030a11161a1c1d20201d1c1a16110a03000000000000000000000000000000000000000000000000030a11161a1c1d20201d1c1a16110a0300000000000000000000000000000000000000000000000000030a11161a1c1d20201d1c1a16110a0300000000000000000000000000000000000000000000000a151f2831383e4243464643423e3831281f150a000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d79869393939393867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000b17222d3845515c67717e8b949ea9b0a69f92877e716c605b534d47423c3a38342e34343531363a3b41454c5159616a6f7c86929fa5aea99f93877c6f62554b4035291d1004000e1a26313d4751595e5f606060606060606060606060606060606060606060606060606060606060606060606060606060606060605b59534a41362b2014080000000e1a26313d4751595e5f606060606060606060606060606060606060606060606060606060606060606060606060606060606060605b59534a41362b201408000000020e1a25313b454d535f6060606060605d606060606060605f5e5c6060606060605f534d453b31251a0e020000000000000000000004101d2a3743505d6a7683909c8f827669594f454045515d677784909c8f8275695c4f4236291c0f030000000000000000000000000000000000000000000000000a16212b343d454d565e676d757f8a9298a19e938b7f726a60564c41382d23190e05000000000000000000000000000000000000000013202d394653606c7986939facb9c6d2d2dcdddddcd2d2c6b9ac9f9386796c605346392d201300000000020d1925303a44515b606d798390949da5a69e98928f8b8887858586888b90949ea1a8a39f938e82786d60594f43352b210c0300000000000000000000000000000000000000000000000000010406070a0d0f11121313131212100f0d0a070704010000000000000000000000000000000000000000000000000000000000000000060b151b21272c2f34383a3d40424445464646454543413f3c3938332d2b26201a150b060000000000000000000000000000000a1724313d4a5764707d8a9091929292918f8b86807a706b615a50473e342a1f150b01000000000000000000000000000000000000000000000000000000000000000000040a0f141a1e212125282a2b2c2c2c2b2a282622211f1b15110d08030b12181c1f2025292b2c2c2c2b2a272524221d18110901000000000000000000000000000000000003090e12141a1e21212527292a2b2c2c2c2c2c2a29272522211e1a15120f0a0400000000000000000000000000000000000000000000000000040d151c2226292a2d2d2a2926221c150d0400000000000000000000000000000000000000000000040d151c2226292a2d2d2a2926221c150d040000000000000000000000000000000000000000000000040d151c2226292a2d2d2a2926221c150d0400000000000000000000000000000000000000000005111c27313a434a4e505353504e4a433a31271c11050000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d7886868686868686796d6053473a2d2014070000000000000000000000000000000000000000000000000000000006111c2834404b55616c75828f97a2abafa39992877e726c655f57534d4946443f41414141424246484c52555d606b707c859298a2aeada2978f82756a5f5343392f24180c00000915202b353f474e52535353535353535353535353535353535353534d545b60666c6c6c6c6c6a5c544a53535353535353535353534e4c4841382f251a0f030000000915202b353f474e52535353535353534d575e6c6c6c6c6c6c6c6a665f55535353545e66696c6c6c6c6c6c6c5e574d5353535353534e4c4841382f251a0f0300000005121e2a36424d575e6c6c6c6c6c6c6c6a665f55535353545e66696c6c6c6c6c6c6c5e574d42362a1e120500000000000000000000020f1c2935424f5c6875828f9b9184786b61574f4d5058606d7a86929a8e8174675b4e4134281b0e010000000000000000000000000000000000000000000000030f1b27323d464e575f686d79818c929fa3a0958e81756d62584e443a2f261b110800000000000000000000000000000000000000000013202d394653606c7986939facb9c6d2dfe9eaeae9dfd2c6b9ac9f9386796c605346392d2013000000000008131e28323f45515d676d7a828e939da0a7a39f9b97949892929895989c9fa6a7a099928d81786d665c50463d3223190f00000000000000000000000000000000000000000000000004080d111314171a1c1d1f1f20201f1f1d1c1a171413110d080400000000000000000000000000000000000000000000000000000000020a111720262b323839404547494c4f50525253535251504e4c4946443f3837312b262017110a02000000000000000000000000000a1724313d4a5764707d8a979e9f9f9f9e9b98928d847d716c61594f463c31271d12070000000000000000000000000000000000000000000000000000000000000000060c161b1f252a2d2e31343738393939383735322f2e2b26201d19130c151d23282c2d32353839393838363432312e29231b130900000000000000000000000000000003090e141a1e21252a2d2e31343637383939393938373634322f2e2b26211f1b150f0a0400000000000000000000000000000000000000000000030d161f272d32353639393635322d271f160d030000000000000000000000000000000000000000030d161f272d32353639393635322d271f160d03000000000000000000000000000000000000000000030d161f272d32353639393635322d271f160d0300000000000000000000000000000000000000000a16222d38434c545a5d60605d5a544c43382d22160a00000000000000000000000000000000000000000000000000000000000000000000000006121f2c3844505c66767979797979797976675c5145382c1f130600000000000000000000000000000000000000000000000000000000000c18232e3943505a616e7b859299a3afaba39992877f776e69615f575553504a4e4e4d4e4f4d5354565d60676d747d859297a1aaaea49e92857b6e61584e4331271d12070000040f19242d353d424546464646464646464646464646464646424651575f666c72797979797975665c50444646464646464646464641403c362f261d130800000000040f19242d353d424546464646464646535e69767979797979797771665b4f464e5a66707679797979797976695e5346464646464641403c362f261d1308000000000714212d3a46535e69767979797979797771665b4f464e5a66707679797979797976695e53463a2d21140700000000000000000000000d192633404c5966737f8c99968a7d706960595a5a616a727e8b98998b7e7265584b3f3225180c00000000000000000000000000000000000000000000000007131f2c38434e5860696e7a828e939ca4a2989183796d605b51463d32281d140a0000000000000000000000000000000000000000000013202d394653606c7986939facb9c6d2dfecf6f6ecdfd2c6b9ac9f9386796c605346392d20130000000000020c16202935404b555d686d78818991959c9fa3aba4aaa29f9fa2aaa4aba49f9c95908780786d665c544a3f342b21100700000000000000000000000000000000000000000000070c1013191d20212426292a2b2c2c2c2c2b2a28262421201d1913100c0701000000000000000000000000000000000000000000000000040b141c222832373d43484b515356595b5d5e5f5f5f5f5e5d5b585653504a47433c373127221b140b030000000000000000000000000a1724313d4a5764707d8a979e9ea2a9a9aaa39f9691877e716b61584e43392f23180c030000000000000000000000000000000000000000000000000000000000030a111720272b31363a3b3e4144444546464544423f3c3b37322c29241e191e272e34383a3e42454646454443413f3d3a342d251b110600000000000000000000000000060b151a1f262a2d31363a3b3e4042444546464646454443413e3b3a37312e2b26201b150c070000000000000000000000000000000000000000000a151f2831383e4243464643423e3831281f150a00000000000000000000000000000000000000000a151f2831383e4243464643423e3831281f150a0000000000000000000000000000000000000000000a151f2831383e4243464643423e3831281f150a00000000000000000000000000000000000000010d1a26323e4a545e66696c6c69665e544a3e32261a0d01000000000000000000000000000000000000000000000000000000000000000000000003101c28343f4a545c6c6c6c6c6c6c6c6c6c5c554b4034291c1004000000000000000000000000000000000000000000000000000000000007121d27303e46525e69707d87929fa4acaba399938c827b746e696562605c545b5a5a5b5c575e6164686d737a808a9297a1a9afa59d928a7e70695e52463c321f150b0100000008121b242b31363839393939393939393939393930353e444d525b62696e787f8686868687796d6053463a3939393939393939393433302b251d140b01000000000008121b242b31363839393939393b4854616e7b86868686868683776a5d50444f5c6976828686868686867b6e6154483b393939393433302b251d140b01000000000815212e3b4854616e7b86868686868683776a5d50444f5c6976828686868686867b6e6154483b2e21150800000000000000000000000916222f3c4955626f7c88949e91847b706b6766676c717c85929f93877b6e6154473b2e2114080000000000000000000000000000000000000000000000000915222e3b4854606a6f7b8490949ea5a49f92867c6e675d51493f342b20160b020000000000000000000000000000000000000000000013202d394653606c7986939facb9c6d2dfececececdfd2c6b9ac9f9386796c605346392d2013000000000000050e18242f3a434c565d666d747d848a8f92999a9c9e9e9f9f9e9d9c9a99938f8a837c736c665c544a42382e22190f000000000000000000000000000000000000000000060b12181c1f24292c2d31333537383939393938373533302d2c29241f1c18120c0700000000000000000000000000000000000000000000040d161d262d333c43474f54555c606366686a6b6c6c6c6c6b69686562605b54534e47423c332d261d150d0300000000000000000000000a1724313d4a5764707d8a92919297979c9fa6a9a19992877d706a5f554b4034291f140900000000000000000000000000000000000000000000000000000000030c151c232832373b4246484b4e505152535252504e4c4847433c39352f28222b30394045464b4f5152535251504e4b4a463f372d23180d0100000000000000000000020a11171f262b31363a3b4246484b4d4f51525253535252514f4d4b4847423c3a37312b262018120b0300000000000000000000000000000000000005111c27313a434a4e505353504e4a433a31271c110500000000000000000000000000000000000005111c27313a434a4e505353504e4a433a31271c11050000000000000000000000000000000000000005111c27313a434a4e505353504e4a433a31271c1105000000000000000000000000000000000000030f1c2935424e5a66707679797670665a4e4235291c0f030000000000000000000000000000000000000000000000000000000000000000000000000c17232e38424a505f606060606060605f514b43392f23180c000000000000000000000000000000000000000000000000000000000000000b151e2a36424d56606b717f8b939aa3ababa49f948f86817b76726f6d6668686767686869696e71757a7f858d929ea2a9afa59e938d80746c61574d42342a200d03000000000009121920262a2c2c2d2d2d2d2d2d2d2d2429323a414650565e616d727b828c929992877e71665c5044382b2d2d2d2d2d2d2d2d282724201a130b020000000000000009121920262a2c2c2d2d2d2e3b4854616e7b87939393939083776a5d50444f5c6976828f93939393877b6e6154483b2e2d2d2d282724201a130b0200000000000815212e3b4854616e7b87939393939083776a5d50444f5c6976828f93939393877b6e6154483b2e21150800000000000000000000000815212e3b47535f6a76828f989691847d77747374777e859297978e8174695e52463a2d2014070000000000000000000000000000000000000000000000000916232f3c4956626f7c85919693939393928a7e716a5f554b40372d22190e04000000000000000000000000000000000000000000000013202d394653606c7986939facb9c6d2dfdfdfdfdfdfd2c6b9ac9f9386796c605346392d20130000000000000007131d28313a444c545c606b70787e82868a8d8f9192929291918f8d8a86827d786f6a605b544a423930261c100700000000000000000000000000000000000000020a11171c23282c2f35393a3d4042444546464645454342403d3a39352f2c29231d18120b0300000000000000000000000000000000000000030c161f282f383f444e54596063676d707375777879797978787674726f6c66625f58534d443f382f271f150d03000000000000000000000a1724313d4a5764707d87858585868a8f949fa2aaa39992867c6f675c51453b31261a0e030000000000000000000000000000000000000000000000000000030d151e262e343d43474d5354585b5d5e5f5f5f5e5d5b5955534e4745413a3129343c424b5153585c5e5f5f5f5e5d5a585651493f34291d1206000000000000000000040c141c232831373b4246484d5354585a5c5d5e5f5f5f5f5f5d5c5a5855534d4847433c373228231d150c0500000000000000000000000000000000000a16222d38434c545a5d60605d5a544c43382d22160a0000000000000000000000000000000000000a16222d38434c545a5d60605d5a544c43382d22160a000000000000000000000000000000000000000a16222d38434c545a5d60605d5a544c43382d22160a00000000000000000000000000000000000003101d2a3643505d69768286868276695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000000000006111c2630383f4453535353535353535345403931271d120700000000000000000000000000000000000000000000000000000000000000030c1925303b444f59626d727f889299a1a8afa69f99928e88837f7c797775747474747576787b7e82868c92979da4adaba39f938e81786d605a50453b3022180e00000000000000080f151a1d1f202020202020191f282f353e444c525a61696e767f8690949a93877e716c61544a3f34281c202020202020201b1a18140f0801000000000000000000080f151a1d1f202020212e3b4854616e7b87949f9f9d9083776a5d50444f5c6976828f9c9f9f94877b6e6154483b2e2120201b1a18140f08010000000000000815212e3b4854616e7b87949f9f9d9083776a5d50444f5c6976828f9c9f9f94877b6e6154483b2e211508000000000000000000000006131f2b37434e58626f7c86929a96918984818081848a92979892857a6e61564d42362a1e11050000000000000000000000000000000000000000000000000d1a2633404d59667380868686868686868680746c61574e43392f251b100700000000000000000000000000000000000000000000000013202d394653606c7986939facb9c6d2d2d2d2d2d2d2d2c6b9ac9f9386796c605346392d201300000000000000010c161f28323a424b515960666c71767a7d808284858686858483807d7a75706c666058504a423930271e140a00000000000000000000000000000000000000050b141c22282e34383a4145474a4d4f50525253535252504f4d4a4745413a38342f28231d150c070000000000000000000000000000000000000b151e283139424a50585f626b6f75797d7f828385858686858483817f7c79746f6a625f575049413931271f150b010000000000000000000714202d3a4753606d79797878787a7d828a9298a1a9a2989083796d60574d42362a20150a00000000000000000000000000000000000000000000000000010b151f2730383f444e54575e6164676a6b6c6c6c6b6a6865625f5854524c433f353c464e545c6065686b6c6c6b6b696765625b51463a2e2215090000000000000000050e161e262e343c42474d5355575e616467696a6b6c6c6c6c6b6a696765625f5755534e47433c342e271e170e05000000000000000000000000000000010d1a26323e4a545e66696c6c69665e544a3e32261a0d0100000000000000000000000000000000010d1a26323e4a545e66696c6c69665e544a3e32261a0d010000000000000000000000000000000000010d1a26323e4a545e66696c6c69665e544a3e32261a0d01000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000000000000000000000000000000000000000000000a151e262e343846464646464646464638342f271f150b01000000000000000000000000000000000000000000000000000000000000000009141f29323d47505a626d727e8791969ea5acaba39f9a95908c8885848281818081828385878b8f92989fa2a9ada8a099928d81786d665c50483e33291f1006000000000000000004090e1112131313130f19222b313a41454f565e616c717b828b92989a93887e716c615a5042382e23170b1313131313130e0d0b080300000000000000000000000004090e1112131315212e3b4854616e7b8794a1aa9d9083776a5d50444f5c6976828f9ca9a194877b6e6154483b2e2115130e0d0b080300000000000000000815212e3b4854616e7b8794a1aa9d9083776a5d50444f5c6976828f9ca9a194877b6e6154483b2e2115080000000000000000000000030f1b26323c47535f6a717e8892989e95908d8d8e91969e9792867d6f685e52443b3025190e020000000000000000000000000000000000000000000000000c1925323f4b57636d737979797979797979746e645a50453c31281d12090000000000000000000000000000000000000000000000000013202d394653606c7986939facb9c6c6c6c6c6c6c6c6c6c6b9ac9f9386796c605346392d20130000000000000000040d162028303940454f545b6064686e7174767778797978777673716e6863605b544e443f382f271e150c02000000000000000000000000000000000000070f171d262d33394044464c525457595c5d5e5f5f5f5f5e5d5b595754524c47454039342e271e1810090000000000000000000000000000000007121d273039434b545b606a6f767c8185898c8e90919292929291908e8b8985817c756e69605b534b433931271d120700000000000000000006131f2c3845515c676d6d676b676d70767e869297a1aaa0958c8073695f53463c31261a0f0300000000000000000000000000000000000000000000000007121d273139424a50586062696e71747777787979787775726f6a66605d56504540454e5860666d717578797978777674726d62564a3d3124180b00000000000000050e17202830383f444d53575f6166696e71737577787979797978777674716e6967625f58544e454039302920170e050000000000000000000000000000030f1c2935424e5a66707679797670665a4e4235291c0f0300000000000000000000000000000000030f1c2935424e5a66707679797670665a4e4235291c0f030000000000000000000000000000000000030f1c2935424e5a66707679797670665a4e4235291c0f03000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000000000000030c151c23282c3939393939393939392c29231d150d03000000000000000000000000000000000000000000000000000000000000000000020d17202b353f48515b626c717d848e939da0a7abaca79f9d989892908f8e8d8d8e8f909298979c9fa3aaada9a29f96918780786c665c544a3f362c21170d00000000000000000000000104060606000a16212b343d434b515961686d757e858f949f9f93887f716c625a50483e30261c110600060606060601010000000000000000000000000000000000010406060815212e3b4854616e7b8794a1a99d9083776a5d50444f5c6976828f9ca9a194877b6e6154483b2e211508010100000000000000000000000815212e3b4854616e7b8794a1a99d9083776a5d50444f5c6976828f9ca9a194877b6e6154483b2e2115080000000000000000000000000a15202b37434e58616c717e868f949a9d9a999a9d99938f857d706b60564d4132291f1409000000000000000000000000000000000000000000000000000a16232f3b47525b63666c6c6c6c6c6c6c6c67645c52483e332a1f160c000000000000000000000000000000000000000000000000000013202d394653606c7986939facb9b9b9b9b9b9b9b9b9b9b9b9ac9f9386796c605346392d2013000000000000000000040d161e272e343d424a5053565e616467696b6b6c6c6b6a696764615e5653504a423c332d261d150c0300000000000000000000000000000000000007101921292f383f444a5153565d606466686a6b6c6c6c6c6b6a686663605d5653514b454039302a221a12090000000000000000000000000000040d18232e39434b555d666c737c83898e9298999b9d9e9f9f9f9f9e9c9b9897918d88827b736c655d554b43392f24180e05000000000000000004101c2934404b555c60605c555d60646c717c859298a3a79f92867b6e61584e43372b1f14090000000000000000000000000000000000000000000000020c18242f39434b545c606a6f757b7e8183848586858583817f7c78726d68625a514b4d57606a6f797e82848586858483817f7265584b3f3225180c000000000000030c172029323a424a50575f62696e73777b7e8082848585868685858482807e7b78736f6a625f58514b423a322920170c030000000000000000000000000003101d2a3643505d69768286868276695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768286868276695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768286868276695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000000000000000000000000000000000000000000000000030a11171c1f2d2d2d2d2d2d2d2d2d1f1c18120b030000000000000000000000000000000000000000000000000000000000000000000000050e19232d363f49515a626b6f7a818990959c9fa6a9aca9aaa29f9d9b9b9a9a9b9b9c9fa2aaa8acaaa9a19e97928c847c736c665b544a42382e241a0f0500000000000000000000000000000000030f1b27323d464e555d606b707a818a92979f9b918b7f726d625a50483e362c1e140a0000000000000000000000000000000000000000000000000000000000000815212e3b4854616e7b87949c9c9c9083776a5d50444f5c6976828f9c9c9c94877b6e6154483b2e211508000000000000000000000000000815212e3b4854616e7b87949c9c9c9083776a5d50444f5c6976828f9c9c9c94877b6e6154483b2e211508000000000000000000000000040f1b26313c46505a616c717c82898d90929291908d88827b706b60594f443b3020170d020000000000000000000000000000000000000000000000000007131e2a35404952575960606060606060605a58524a40362c21180d04000000000000000000000000000000000000000000000000000013202d394653606c7986939facacacacacacacacacacacacacac9f9386796c605346392d201300000000000000000000040c151d23282f383f44464c5254575a5c5e5f5f5f5e5e5c5a5754524c46443f382f28221c140b03000000000000000000000000000000000000071119222b333b424a50545c6064686d70737577787979797878767573706d6864605c55514b423c342c241b1209000000000000000000000000010c161f2834404b555d676d78808790949b9fa2a9a29e9c9b9a9a9b9d9fa3a9a19e9a948f877f776d675d554b40352920170d0200000000000000000c18232f39434b515353514b51535a616a6f7c86929fa7a3988e81756a5f53473b30251a0e01000000000000000000000000000000000000000000000a141e2935404b555d666d747c82878b8e909192929291908e8c88847f7a716d605d55535f696f7c848b8f9192929291908d86796c605346392d20130000000000000b151e29323a444c545c60696e757b8084878b8d8f90919292929292908f8d8b8884807c766f6a605c544c443b32291e150b0000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000000000000000000060c101220202020202020202013100c07010000000000000000000000000000000000000000000000000000000000000000000000000008111b242d373f48505960686d757d83898f94989c9fa3aba7a8aaa8a7a7a7a7a8a9a9a7a5a8a09e9a97918c8580796f6b605b544a423830261c1108000000000000000000000000000000000007131f2c38434e5860676d747d858e939fa29b918b7f726d625a50483f362d241a0c020000000000000000000000000000000000000000000000000000000000000815212e3b4854616e7b878f8f8f8f8f83776a5d50444f5c6976828f8f8f8f8f877b6e6154483b2e211508000000000000000000000000000815212e3b4854616e7b878f8f8f8f8f83776a5d50444f5c6976828f8f8f8f8f877b6e6154483b2e211508000000000000000000000000000a15202a343e48505a616a6f767c808385868583807c756e6960594f473d32291f0e050000000000000000000000000000000000000000000000000000020d19242e3740474b4d53535353535353534d4c4740382f241a0f0600000000000000000000000000000000000000000000000000000013202d394653606c7986939f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9386796c605346392d20130000000000000000000000030b12181d262d33383b4146474a4d4f515253535251504d4a4746413b38332d261d17110a02000000000000000000000000000000000000060f19232b343d454d545b60666d71767a7d8082838585868685858382807d7a76716d67605c544e463e362d241b1108000000000000000000000008131e28313a45515c676d79828d92999fa6a39f9a97928f8e8d8e8e9092989b9fa3a69e99928c82796d675d51453f32291e1408000000000000000007121d27313940454747454045475058606a727f8c959faa9f93877c6f62574d42362a1d120700000000000000000000000000000000000000000006111c26303845515d676d7880898f93999a9d9e9f9f9f9e9d9b9896918c857e756d675d58626e7b8691969b9e9f9f9e9e9c9386796c605346392d2013000000000007121d27303a444c565d666d737b81878c9196979a9c9d9e9f9f9f9f9e9d9c9a9896918d88827c746d665e564c443b30271d120700000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000000000000000000000003061313131313131313130604000000000000000000000000000000000000000000000000000000000000000000000000000000000009121b252d363f474f565e616b70787d82878b909299989a9c9d9e9f9f9f9e9e9d9c9b999696918d89857f7a736d676059504a42382f261e140a0000000000000000000000000000000000000915222e3b4854606a6f79818a91979ea39c918c7f726d625b51483f362d241b1208000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a8283838383828074675a4e414d5a6673808283838383827a6e6154473b2e211408000000000000000000000000000814212e3b4754616e7a8283838383828074675a4e414d5a6673808283838383827a6e6154473b2e21140800000000000000000000000000030e18222c363e4850585f626b6f737778797876736f6a615e574f473d342b20170d0000000000000000000000000000000000000000000000000000000007121c252e353b3f404646464646464646413f3c362f261d12080000000000000000000000000000000000000000000000000000000013202d394653606c798693939393939393939393939393939393939386796c605346392d201300000000000000000000000000070b141c22282b3036393b3e414344454646454443403e3b3936302b28221c140b0600000000000000000000000000000000000000030c18212b353d464f575e666c71797e82868a8c8f90919292929291908e8c8a86837e79726d665f5850483f362d231a0e05000000000000000000010d19242f3a43505a606d79828f949fa3a7a099928e898583818181828386898e92999fa7a39f948f82796d605b51443b3025190e0200000000000000010b151f272f34383a3a3835393e464e58606c7883909da6a49a8e8175695e5246392f23180c0000000000000000000000000000000000000000000b17232e3842505a606d79828d929b9fa4ababa39f9d9c9b9c9d9fa19e97928b82796d685f6a76828f98a1a8aaa39f9995949386796c605346392d201300000000000c18232e39434c565e686d7880868e93999da0a8aba39f9d9d9c9c9c9d9fa2aaa8a19e9a948f8780786d685e564c42392e23180c03000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009131b242d353d444c525960656c70767b7f8386898b8d8f9091929292929190908e8c8a8784807c79726d67605d554f443f382f261d140c020000000000000000000000000000000000000916232f3c4956626f7c848e9393939393918c7f726d625b51493f362d241b120900000000000000000000000000000000000000000000000000000000000000000714202d3946525e686e767676767676746e64584c404b58636e737676767676766e685e5246392d201407000000000000000000000000000714202d3946525e686e767676767676746e64584c404b58636e737676767676766e685e5246392d201407000000000000000000000000000006101a242c363e464e53596063676a6b6c6b6a66625f58534d453d352b22190e0500000000000000000000000000000000000000000000000000000000000a131c242a2f323339393939393939393433302b241d140b000000000000000000000000000000000000000000000000000000000013202d394653606c798686868686868686868686868686868686868686796c605346392d20130000000000000000000000000000020a11171c1f252a2d2e3134363838393938373634312e2d2a251f1c17110a0200000000000000000000000000000000000000000a151e2a333d474f5960696e787e848a8f9299999b9d9e9f9f9f9f9e9d9b9999928f8b857f796f6a615a50483f352b20170d02000000000000000004111d2935414c56616c74818e949ea6a69f959087817c79767474747577797d818790959ea5a69e948e81756d62564c41362a1e14080000000000000000030d151d23292c2d2d2c292c343d44505b666f7c89949eac9f92877b6e61554b4034291c10040000000000000000000000000000000000000003101c28343f4a54616c74818e949da4aca7a09d9992908f8f8f9192999a9e9f948f837a6d666f7c88949faaaea398928c88878886796c605346392d20130000000004101c2834404b555e686d7a828c92999fa4a9a19e99999291908f8f90909298989da0a8a69e99928d837a6e685e544b40342820150a000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000000000000000000010406070a0d10111213131211100d0a070604000000000305050606060606060000000000000000000000000000000000000000000000000000000000000000000000000000000000000109121b232b323a41464f535b6063696e7276797c7f8182848585868685848483817f7d7b7773706d66605d55514b433d332d261d140b02000000000000000000000000000000000000010e1b2734414e5a67748186868686868686867f736d635b51493f372d241b120900000000000000000000000000000000000000000000000000000000000000000005111e2a36414c565e6169696969696967645c52473c47525c6366696969696969615e564c41362a1e11050000000000000000000000000005111e2a36414c565e6169696969696967645c52473c47525c6366696969696969615e564c41362a1e110500000000000000000000000000000008121a242c343c43474f54565a5d5f5f5e5d5a55534e46423b332b23191007000000000000000000000000000000000000000000000000000000000000010a12191e2325262d2d2d2d2d2d2d2d2726241f19130b02000000000000000000000000000000000000000000000000000000000013202d3946535f6c767979797979797979797979797979797979797979766c5f5346392d201300000000000000000000000000000000060b0f14191e20212427292b2c2c2c2b2b29272421201e19140f0b0600000000000000000000000000000000000000000006111c26303c454f59606b6f7b828b91969c9fa3a9a19e9c9b9a9b9c9d9fa2aaa39f9c97928c847c716c625a50473d32291e130800000000000000000613202c3945525d68717e8a939da6a89f948f837c746f6c6668676768666d70757c838f939ea7a69e938b7f72685e52463b3025190d010000000000000000030b12181c1f20201f1d2228333f4a54606b75828f9ca8a3998d8073675c5145382c1f14090000000000000000000000000000000000000006121f2b3844505c66717e8b939ea6aea59d95908a86838282838486898d92979f959083786d73808d99a6b0a89f9286807c7a7b7d7063574a3d3024170a000000020d17202c3845515c676d7a838f949fa3aaa29f97918c898684838282838485888b91969ea1a9a39f9590837a6e665c51453c31261a0f020000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000000000000000000001080d111314171a1d1e1f1f201f1e1c1a171413100c07010c0f11121313131313130909070300000000000000000000000000000000000000000000000000000000000000000000000000000000091019202830363d41495053575e6165676d6f7274757778787979787877767472706e696763605c54514c45403a3128221c140b0200000000000000000000000000000000000000010d1a2733404c58646e747979797979797979736d635b51493f372d251b120900000000000000000000000000000000000000000000000000000000000000000000010d1925303b444c52545c5c5c5c5c5c5a58524a4136404a52585a5c5c5c5c5c5c54524c443b3025190d0100000000000000000000000000010d1925303b444c52545c5c5c5c5c5c5a58524a4136404a52585a5c5c5c5c5c5c54524c443b3025190d010000000000000000000000000000000008121a222a31373d4348494d50525352504d4947433c36312921191107000000000000000000000000000000000000000000000000000000000000000000070d1316191a20202020202020201a1a17130e0801000000000000000000000000000000000000000000000000000000000000121e2b37434f5a646c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c645a4f43372b1e1200000000000000000000000000000000000003080d111414171a1c1e1f20201f1e1d1a171414110e080300000000000000000000000000000000000000000000000c17232e38424d57606b707d8590949ea1a8a29e9997918f8e8e8e8f909298999ea2a9a19e9691867e716c62594f443a3025190d0400000000000004111d2935414c55606d7a85929ea5aca0968f82796e6a62605b545a5b545c60636a6e78818f959faba59f92857a6e61564c41362a1e110500000000000000000001070c10131414131017222d38424f5963707d8995a0ab9e9285796d6053473b31261a0e000000000000000000000000000000000000000713202d3a4653606d7884919ea5afa69d938e837d797776757677797c80858c9298958e81747683909ca9aca0958a7e736f6e6e706b6155483c2f23160900000009141f2b37434e58606d798390959fa6a8a098928b85807c79777675757677797c7f848a92979fa7a79f959083786d60584e43372b1e13080000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000000000003090e13191d20212427292b2b2c2c2c2b292724201f1c18120e181c1e1f2020202020201615130f0a04000000000000000000000000000000000000000000000000000000000000000000000000000000070e161e252a2f383f44464d5354555c60636567696a6b6c6c6c6b6b6a69686663615e575653504a45413a352f281f17110a020000000000000000000000000000000000000000000b1824303c48535c64676c6c6c6c6c6c6c6c66635b51493f372d251b130900000000000000000000000000000000000000000000000000000000000000000000000008141e29323b4146475050505050504e4c4741382f3840474b4d5050505050504746413b32291e140800000000000000000000000000000008141e29323b4146475050505050504e4c4741382f3840474b4d5050505050504746413b32291e140800000000000000000000000000000000000008101820262b32383b3c404445464543403c3b37322a251f170f07000000000000000000000000000000000000000000000000000000000000000000000002070a0c0d13131313131313130e0d0b070300000000000000000000000000000000000000000000000000000000000000000f1b27333e49525a5f60606060606060606060606060606060606060605f5a52493e33271b0f0000000000000000000000000000000000000000010507080b0e10111213131211100d0b0807050200000000000000000000000000000000000000000000000003101c28343f4a545f69707d8692979fa6a49d97928c888583828181828385898c92979fa3a8a09892887e716b60564c41362a20150a0000000000000613202c3945515d6773808d97a1ada69e91847a6d675f5853504a4e4e4b5153585f666d79839099a3ada2978d8174685e5246392d201409000000000000000000000000040607070606111c262f3d4854606b7784919daba2978a7e7164574d42362a1b11060000000000000000000000000000000000000b1824313e4b5764717e8a96a0acac9f948e8179716d67696869676d70747a7f869095938a7e7885929fabaa9d9184776c6261616361594f44382c2014070000020e1925303a47535f6a73808d959fa7aaa09691867f79736f6d676a696969666d6f72787d8590959fa9a79f958d80736a5f53473a3025190d0100000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000000060e141a1e24292c2d3033363738393939383634302d2c29231d1a24282b2c2d2d2d2d2d2d23221f1b160f07000000000000000000000000000000000000000000000000000000000000000000000000000000050c13191d262d33373b4246484b515356585a5c5d5e5f5f5f5f5e5d5d5b595754534d4946443f38352f29241d160d0600000000000000000000000000000000000000000000000814202b36414a53585a60606060606060605957514940372e251b130900000000000000000000000000000000000000000000000000000000000000000000000000020d1720293036393b43434343434341403c362f262e353b3f404343434343433b3936302920170d02000000000000000000000000000000020d1720293036393b43434343434341403c362f262e353b3f404343434343433b3936302920170d0200000000000000000000000000000000000000060e151b21272c2f30343738393837332f2e2b26201a140d0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a16212c3740494f535353535353535353535353535353535353535353534f4940372c21160a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006121f2c3844505c666e7b859298a2a9a49f928d857f7c78767574747576797c80858c9299a2aaa39a92877d70685e52463c32261b0f0200000000000714212d3a4754606d7a85929fa9aa9e94897d70685d554e46443f41414045464e545c676f7c87929faca99f92867a6e6154473c31261a0e0200000000000000000000000000000000000a141d2c38444f5965727f8c99a3a99c8f8276695f5346382d22170b000000000000000000000000000000000005121e2a36424d576875818e9ba8afa49a8f82786d66605d555c555c6063676d727b838f9391857b8797a2ada79a8d8074675a545557554f473e33281c1004000005111e2a36424d56626f7c87929fa7aea29891847c726d6763605c555c5c545c6062656c707a839097a1ada79f92877c6f62564c41362a1e110500000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000000070f181f262a2f35393a3d404344454646454443403d3a38342f2a252f3437383939393939392f2e2c272119100700000000000000000000000000000000000000000000000000000000000000000000000000000002080b141b22272b31363a3b404547494c4e4f5152525353525151504e4c4a4846423d3a38342e29241e18130c04000000000000000000000000000000000000000000000000030f1a252f3841484c4e53535353535353534c4b4640372e251c1309010000000000000000000000000000000000000000000000000000000000000000000000000000050e171e252a2d2e3636363636363433302b241d242a2f32333636363636362e2d2a251e170e050000000000000000000000000000000000050e171e252a2d2e3636363636363433302b241d242a2f32333636363636362e2d2a251e170e05000000000000000000000000000000000000000000040a0f161b1f2223272a2c2c2b2a2722211f1b150e0903000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005080a0b13131313131313090806030000000000000005101b252e373e4346464646464646464646464646464646464646464646433e372e251b10050000000000000000000000030613131313131313130d0c0a07020000000000000000000000000003060809131313131313130b0b090501000000000000000004111d2935414c56606d78839097a2aaa49a938b807a736f6a6968676869666d6f737a80879298a2aba39992857a6d61584e43372b1e14080000000005111e2a36424d5765727f8b98a2aea99c8f82756b60564c433c38332d2e34383c424b555f6a74818e9ba8aea3988c7f7266574d42372b1e12050000000000000000000000000000000000020b1c27333d4754616d7a86929fac9f93877b6e6153493f33271b0f03000000000000000000000000000000000714202d3a46525e697885919eabac9f93877c6f665c54514b4f4b5153555d60696e79818f949083909da9b3a4988b7e7165584b484a48443e352c21160b0000000714202d3a46525e6975828e99a3afa89f92867c6f6a605c5553514b4f4f4a5053535b60686e7a85919ea7afa3998e8175685e5246392d20130700000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000030b1218212a31363a4145474a4d505152525352514f4d4a4745403936313a4044454646464646463c3b38322b22190f0400000000000000000000000000000000000000000000000000000000000000000000000000000000020a11171b1f252a2d2f34383a3c3f4142444545464645454443413f3d3b3a36312d2c28231c19130d0701000000000000000000000000000000000000000000000000000008131d262f363c40414646464646464646403e3b352e251c130a0100000000000000000000000000000000000000000000000000000000000000000000000000000000050d14191e20212929292929292726241f1a13191f23262729292929292921201e19140d0500000000000000000000000000000000000000050d14191e20212929292929292726241f1a13191f23262729292929292921201e19140d05000000000000000000000000000000000000000000000000040a0f1315161a1d1f201f1d1a1615130f0a040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060c11151718202020202020201615130f0a0400000000000009131c252c33373939393939393939393939393939393939393939393937332c251c130900000000000000000000060c101220202020202020201a1917130e0800000000000000000000040a0f13151620202020202020181715110c06000000000000000713202c3945525d68727f8c95a0a9a69f93887f746d68625f585b5b5b545c6063676d737d869299a4aba2978e81756a5f54473b3025190d010000000714202d3a46525e697683909daaada196897d7063594f433a312b282223282c3039434e58626f7c8895a0acaa9d908477695f53463a2d2114070000000000000000000000000000000000000b13202d3a4653606d7985929eaba49a8c8073655b5044372b1f1207000000000000000000000000000000000815212e3b4854616e7b8797a1adaa9d9083776a5f544b4540424045474b51575f676d78828f9590959fabb0a3968a7d7063574a3d3d3c38332c231a10050000000814212e3b4754616e7b87939fabaca0958a7e716a5f58514b47454042423f44464950565e68707d8a95a0acab9f92867a6d6154473a2e21140700000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000030c151c2328333b42464c5254575a5c5e5e5f5f5f5e5c5a5753514b46423b454c50525353535353534948433d342b21160a000000000000000000000000000000000000000000000000000000000000000000000000000000000000060b0f141a1e2123292c2d303234363738393939383837363533302e2d2a25201f1c17110d080100000000000000000000000000000000000000000000000000000000010b141d252b303334393939393939393933322f2a231c130a0100000000000000000000000000000000000000000000000000000000000000000000000000000000000002080d1114141d1d1d1d1d1d1b1a17140e080e1317191a1d1d1d1d1d1d1414110d080200000000000000000000000000000000000000000002080d1114141d1d1d1d1d1d1b1a17140e080e1317191a1d1d1d1d1d1d1414110d0802000000000000000000000000000000000000000000000000000000030709090d11121312100d090806030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000911171d2124252d2d2d2d2d2d2d22211f1b150e060000000000010a131b21272b2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2b27211b130a010000000000000000030a11171c1f2d2d2d2d2d2d2d2d2726231f19120a0200000000000000070f161b1f22232d2d2d2d2d2d2d2524211d1811090000000000000714212d3a4754606d7a85929fa7ab9f948c7f726d605d56534e4f4e4e4a5053555d606b707d87939faaa99e93887c6f62564c41362a1e11050000000814212e3b4754616e7b87959fabab9e9184786c6053463d31281f1c17181c1f27313c47535f6a7784919daaaca095887b6e6155483b2e221506000000000000000000000000000000000005111d2a36414c5664707d8a97a1adac9e9184786c605346392f24180c000000000000000000000000000000000916222f3c4955626f7c8895a9b3a79a8d817467584e4239352f34383a40454d555c666d7a85919d9fa7b1afa396897c706356493d302f2c28211a1108000000000c1925323f4c5865727f8b99a4afaa9d9184786c60574e45403a38342f2e34383a3f444d56616b7783909daaafa3998b7e7265584b3f2f24180d01000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000000b151e272e343f454d53565d606366696a6b6c6c6c6b696763605c55534d444f575c5f60606060606056544e463d32271b0f030000000000000000000000000000000000000000000000000000000000000000000000000000000000000003090e1214181c1f20232527292a2b2c2c2c2c2b2a2a28262421211e1a1312100c060000000000000000000000000000000000000000000000000000000000000000020b131a202427272d2d2d2d2d2d2d2d2625231e19120a01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010507081010101010100e0d0b08030002070a0c0d1010101010100807050100000000000000000000000000000000000000000000000000010507081010101010100e0d0b08030002070a0c0d101010101010080705010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009121b22292d3031393939393939392f2e2b26201810060000000000010910161b1e202020202020202020202020202020202020202020201e1b161009010000000000000000030c151c23282c393939393939393933322f2a241c140a00000000000007101920272b2e2f3939393939393932312e29221b12090000000006131f2b37434e5866727f8c97a2ada79c9083786c605b524c47434241413f44464c5159616b73808d98a2aea59b8f8275685e5246392d2014070000000b1824313e4b5764717e8a97a7b1a79a8e8174665b5044382b1f160f0b0c10151f2b37434e586773808d9aa6b1a7988b7e7165584b3e2d22170b00000000000000000000000000000000000713202d3946525e6875828f9ba9b3aca196897c6f63554b4035291d10040000000000000000000000000000000a1723303d4a5663707d8996a3b0a6998c7f7366594c402f2924292c2f353b434b545d68707d8a959fabb7afa396897c706356493d3023201c1610080000000004111d2935414c556975828f9cabb2a9988b7e72655b50453c342e2c292323282b2d333b444f5965727e8b98a9b3ab9b8f827568554b4035291d1004000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000007121c273039404451575f61686d7073767778797978777673706d67615e57505761686b6c6c6c6c6c6c6260584e43382c1f13070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000205070c10131416191b1c1e1f1f20201f1e1e1d1b19171514120e090603000000000000000000000000000000000000000000000000000000000000000000000001080f14181a1b2020202020202020191916120d070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030608090f1112131313110f0c070705010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006111b242d34393d3e464646464646463c3b37322a22180e04000000000000050a0f1213131313131313131313131313131313131313131313120f0a05000000000000000000000a151e262e34384646464646464646403f3b362e261c120800000000040f19222b32383b3c464646464646463e3d3a342d241b11060000000815222e3b4754606a7784919ea9aca095897d70655b5045413a3732342e34383a41454f59606d7a85929fabac9f92867a6e6154473b2e23180c0000010e1b2834414e5b6774818e9aa7b4aa978a7e7164544a3f3328190d040000040d1b26323d4a5764707d8a97aab4a79b8e81746853493f33271b0f03000000000000000000000000000000000714212e3a4754616d7a86929facb9b2a89a8e8174675d5145382c1f14080000000000000000000000000000000a1724313d4a5764707d8a97a3b0a5988c7f7265594c3f2e23181c1f24293139424c56616c7683909da9b3afa396897c706356493d302316100b0500000000000613202c3945515d677885929eabada196887b6e6153493f3328231f1c18171c1f2227323e4855626e7b8897a2adab9e918578675d5145392c201306000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000c18232e39424a515b63696e747a7d808384858586858482807d79746e69605b536873787979797979796f6a6054483b2e22150900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040607090c0e0f1112121313121211100e0c0a080705020000000000000000000000000000000000000000000000000000000000000000000000000000000003080b0d0e13131313131313130d0c0a0602000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002050708121313131313130a090704000000000000000000000000000000000000000000000000000000060b0e1011131313131313131313131313131313130b0a080400000000000000000000000000030a0f1215151c1e1f1f201f1e1c181413110d080200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c17222d363e45494b535353535353534947433c342a20150a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006111c2630383f4453535353535353534d4b4740382e24190e020000000a16202b343d434749535353535353534b4a453f362d22180c0100000916222f3c4955626f7c8896a0acaa9d9084776b6053493f35302b262823282c2f353e45525d6874818d9aaaafa3998b7f7265544b4034281c10040005111e2a36414c566a7683909da9aea298887b6e6155483b2d221708000000000a15212e3b4854616e7b8798a2aeaa9d908377655b5044372b1f120500000000000000000000000000000006131f2b37434e5865727f8c99a3aeb7b8ab9f9285796d6053473b3025190e0200000000000000000000000000000a1723303d4a5663707d8996abb5a6998d807366544a403428211e1a181f27303a44505a64707d8a97a2adafa396897c706356493d3023160a000000000000000714212d3a4754606d7a8797a1adab9e918578695f5341382d211813100c0b101217202d394653606c7985929fabada196867a6d6053473a2d201407000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000004101c2834404a545c606d727b81868a8d8f9191929292918f8d8a85807b726c655c6b78858686868686867c6f6256493c2f2316090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003090e1214151f202020202020171614100b050000000000000000000000000000000000000000000000040b12171b1d1e20202020202020202020202020202020171714110c0500000000000000000000060e151b1f2122282a2b2c2c2c2b292521201d19130d0802000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005111d29343e485056586060606060606055534e463c32261b0f0300000000000000000000000000000000000307090a0e111213131211100e0b090706030000000000000000000c17232e38424a505f606060606060605a58524a40362a1f13070000030f1b27323d464e545660606060606060585650483f34291d110500000d192633404c5966737f8c99a8b2ab998c807366594f41382d241e1b1b171c1f242935414c5663707c8998a2aeab9c8f8276665c5145382c1f1306000713202d3946525e687885929fabac9f9285796c605346392d201306000000000714212d3a46535e697985929facac9f9285796c605346392d2013060000000000000000000000000000000815222e3b4754606a7783909dabacababaea2988a7e7164564c41362a1e110500000000000000000000000000000915222f3c4855626f7b8899a3afa89b8f8275665c51443a322d2b2627272628323e4653606d7985929fabafa396897c706356493d3023160a000000000000000915222f3c4855626f7b8895a9b3a99c8f827669574d422f261b0f070400000306121f2b3744505b657683909da9b2a995887b6e6255483b2f221508000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000030e18212c3844515c666d757f878d9298999c9d9e9f9f9f9e9c9a98928d867f776d666679869293939393887b6e6255483b2f22150800000000000000000000000000000000000000000000000000000003080c0e0e131313131313130f0e0c09040000000000000000000000000000000000000000000000000000000000000003070b0d0e131313131313130e0e0c08030000000000000000000000000000030608090f1112131313110f0c0707050100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000407090a131313131313120807050200000000000000000000060d141a1e21222c2d2d2d2d2d2c2423201c161008000000000000000000000000000000000000000000050e161d23272a2b2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2423211c171008000000000000000006101820262b2e2f3537383939393835322e2d2a251e19130c04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000815212d3945505a62646c6c6c6c6c6c6c625f584e43372b1f1306000000000000000000000000000000040b101316161a1d1f201f1e1e1d1a18151312100b0600000000000003101c28343f4a545c6c6c6c6c6c6c6c6c66635c52473b2f23170a000006131f2b38434e5860626c6c6c6c6c6c6c65625a50453a2e2115090005111d2935414c566976828f9ca9afa399897c6f6356493d2f261b130f0a0c101319242f3a4653606d7985929facac9f9285796d6053463a2d201307000714212e3a4754616d7a8798a2aeaa9d918477665b5044382b1f12060000000005121e2a36424d576a7784919daaaea298877a6e6154473b2e211408000000000000000000000000000004101c2834404b55626f7c8895a0a8a19e9fa2aa9c8f8275685e5246392d20150a00000000000000000000000000000714202d3a4753606d7a86929facab9e9285796d60564c443d3a373134333332323845515c6675828f9ca8afa396897c706356493d3023160a000000000000000916232f3c4956626f7c8995a2afa89b8e8275685b4f423128140a0000000000030f1b27333f49536976828f9ca9afa295897c6f6256493c2f231609000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000915202c38434f59606d78818c92999fa2aaa9a8aaa29f9e9e9e9fa29f98928c81786d6d798699a39f9f94877a6e6154473b2e2114080000000000000000000000000000000000000000000000000001090f14181a1b202020202020201c1b191510090200000000000000000000000000000000000000000000000000000001080e1317191a202020202020201b1a18140f090100000000000000000000030a0f1215151c1e1f1f201f1e1c181413110d080200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050b101416172020202020201f1514120e090300000000000000060f181f262a2d2e38393939393939302f2c28211a110800000000000000000000000000000000000000040e1720282e3336373939393939393939393939393939393931302d28221a1208000000000000030e18222a31373a3c42444546464644423f3a39363029241e160e070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1724303d4956626c7179797979797979766a5f53473b2e2115080000000000000000000000000002090e161b202223272a2c2c2c2b2a29272522201f1c17110a020000000006121f2c3844505c667679797979797979736e63584b3f3226190c00000815222e3b4754606a6f79797979797979716c62564a3d3124170b000713202d3946525e687885929eabac9f92867a6d6053473a2d20140a0200000308131f2c3844505c667683909ca9aea298887c6f6255493c2f221609000915222f3c4855626f7b8895aab4a99c8f837669544a3f33281c0f0300000000020e1a2531434f5c6976828f9ca9b4aa95887b6f6255483c2f221509000000000000000000000000000006131f2c3845515c6774808d9aa7a196919298a29f92867a6e6154473c31261b0f000000000000000000000000000006131f2c3945515d677783909dabada1978a7e71685e564f484742424140403f3f3f404b546673808c99a6afa396897c706356493d3023160a00000000000000091623303c4956636f7c8996a2afa79a8d8174675a4e4134271b080000000000000b17222d424e5b6875818e9ba8afa296897c6f6356493c30231609000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000020e1a26313b4854606b74808d939fa3ababa49f9b979892919192939a989d9f938f82786d7a8794abb4a094877a6d6154473a2e211407000000000000000000000000000000000000000000000000030b131a202427282d2d2d2d2d2d2d292825211b140c0300000000000000000000000000000000000000000000000000020b12191f2326272d2d2d2d2d2d2d282724201a130b030000000000000000060e151b1f2122282a2b2c2c2c2b292521201d19130d0802000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000810161c2023242c2d2d2d2d2d2c22211e1a140d060000000000030d18212931363a3b454646464646463d3c38332c231a10070000000000000000000000000000000000000b16202932393f4344464646464646464646464646464646463e3c39332c241a100500000000000a15202a343c4347484f5152525352514f4b4746413a3530282019110800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e868686868686867c6f6255493c2f221609000000000000000000000000050d141a21272c2f30343738393938373634312f2d2b28231c140c020000000713202d3a4653606d78868686868686868073665a4d4033271a0d00000916232f3c4956626f7c868686868686867e7165584b3e3225180b000714212e3a4754616d7a8797a1adaa9e918477675d5145382c1f13020000000003101c28343f4a546774818e9aa7b4aa978b7e7164584b3e3125180b000a1723303d4a5663707d8996a3b0a89b8e8275685b4f422d22170b000000000000091c2835424f5b6875828e9ba8b0a396897d7063564a3d3023170a00000000000000000000000000000713202d3a4653606d7985929fab9e918485929fa3998c7f7265584e43372b1c11060000000000000000000000000004101d2935404b5566737f8c99a3aea99e91847a6d68615955534d4f4e4d4c4c4c4b4b4c5865727f8b98a5afa396897c706356493d3023160a000000000000000815222f3b4855626e7b8895aab4a79a8e8174675b4e412f24190d010000000000061b2835424e5b6875818e9ba8b4aa95887b6f6255483c2f221509000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000006121e2b37424e57636f7c87939fa5afa9a199938f8a878584848586888c90959e948d80747b8794a1ada093877a6d6054473a2d2114070000000000000000000000000000000000000000000000010b151d252b303435393939393939393534312c261e150c000000000000000000000000000000000000000000000000000b141d242b303334393939393939393534302b251d150b0100000000000006101820262b2e2f3537383939393835322e2d2a251e19130c04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008111a21282c2f30393939393939382e2d2a261f180f060000000009141f29333b424648525353535353534a48443e352c22190f060000000000000000000000000000000006121d28323b444b4f51535353535353535353535353535353534a49453e362c22170c00000000030f1b26313c464e53555b5d5e5f5f5f5e5c5854524c46413a322b231a1208000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b9393939393887c6f6255493c2f2216090000000000000000000000060f171f252a32383b3d4144454646454443413e3c3a38342e261e140a0000000713202d3a4653606d798693939393938d8073665a4d4033271a0d00000916232f3c4956626f7c8993939393938b7e7165584b3e3225180b000915222f3c4855626f7c8895a9b3a99c8f837669554b4035291d100400000000000c17232e3f4c5966727f8c99a5b2a6998c807366594d4033261a0d000a1724313d4a5764707d8a97a3b0a79a8e8174675b4e4134281b060000000000010e1b2834414e5b6774818e9aa7b0a3978a7d7064574a3d3124170a0000000000000000000000000005111e2a36424d5764717e8a97a2a99a8d80818e9baa9d9083776a5f5347382e23170b00000000000000000000000000000c18242f3b4854616e7b86929fa8ada19690827a706b65615f575c5a5a5959585858585865717e8b98a4afa396897c706356493d3023160a000000000000000814212e3b4754616e7a8798a2aea89b8f827568564c4135291d11070400010407101d2935404b556976828f9ca9aea398877a6e6154473b2e211408000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000814212e3a47535f6a76828f9aa4afaba1979287827d7a79787778797b7f838a9196928a7e7b8895a1ada093867a6d6053473a2d201407000000000000000000000000000000000000000000000009131d272f373c40414646464646464642413d3730271e0e050000000000000000000000000000000000000000000000030d1d262e363c3f414646464646464641403c372f271d13090000000000030e18222a31373a3c42444546464644423f3a39363029241e160e0700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007101a232c33383c3d464646464646453b3a36312921180d030000020e1a26313b454d53555f60606060605f57554f473e342b21180d040000000000000000000000000000000b17232e39444d565b5e60606060606060606060606060606060575550483e33281c110400000006121f2b37434e585f62686a6b6c6c6c6b6865615e56524c443d352c241a11080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b979f9f9f95887c6f6255493c2f22160900000000000000000000060f18212930363d4448494d505253525151504d4b4846443f3830261c110600000713202d3a4653606d7986939f9f9f998d8073665a4d4033271a0d00000916232f3c4956626f7c89959f9f9f988b7e7165584b3e3225180b000a1723303d4a5663707d8996a3b0a89b8e8275685b4f422f24180c000000000000061825323e4b5865717e8b98a4b1a79a8e8174675b4e4134281b0e000b1824313e4b5764717e8a97a4b1a79a8d8174675a4e4134271b0e0100000000010e1b2734414e5a6774818d9aa7b0a4978a7d7164574a3e3124170b000000000000000000000000000714202d3a46525e6976828f9ca9a297897d7d8a98a2a095887c6f62544a3f34281c1003000000000000000000000000000714202d3a46525e6974808d96a1a9a89f9590847d77726e696a6867666665656565646465717e8b98a4afa396897c706356493d3023160a000000000000000613202d394653606c7985929faba99d908376685d5245392c221813100c0d101318202c3945515d677783909daaac9f9286796d6053463a2d201307000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000815222f3b4855626e7b88949facaea39992857d75716e686b6b666d6e72767d84909492857d8996a3aca09386796d6053463a2d20130700000000000000000000000000000000000000000000030f1a252f3941484d4e535353535353534f4d4942393020170d02000000000000000000000000000000000000000000010b151f2e3840474c4d535353535353534e4d4841392f251a0f03000000000a15202a343c4347484f5152525352514f4b4746413a3530282019110800000000000000000000000000000000000000000000000000000000000000000000000000000000000000060f19222c353e44484a535353535353524846423b33291f1409000005121e2a36424d575f616b6c6c6c6c6c6c6361594f463d332a1f160b0200000000000000000000000000000e1b27333f4b565f676a6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c64615a5045392d2114080000000815212e3a47535f6a6f7577787979797775726d68615d564f473e362c231a100600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4aca295887c6f6255493c2f221609000000000000000000020c18212a333b42464f54565a5d5f5f5f5e5d5c5a585553504a42382e23170b00000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2aca4988b7e7165584b3e3225180b000b1724313e4a5764717d8a97a4b0a79a8e8174675b4e4134281b070000000000000b1724313e4a5764717d8a97a4b0a89c8f8275695c4f4236291c0f000b1825313e4b5864717e8b97a4b1a79a8d8074675a4d4134271a0e0100000000010e1a2734414d5a6774808d9aa7b1a4978b7e7164584b3e3125180b000000000000000000000000000814212e3b4754616e7b87939fab9e9285797985929fa79a8d8073665c5044382b1f13070000000000000000000000000005121e2a36424d57606d79849197a1a9a79f969189837f7b78767574737372727271717171717e8b98a4afa396897c706356493d3023160a0000000000000006121f2b3844505b6676828f9cabac9f92867a6d6054473e3429241f1c18181d202328323b4753606d7a86929faca99c908376665c5144382c1f1206000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000d192633404c5966737f8c99a6b0ac9f92877c6f6b64615e56545c6062656c707a8290949083909daaaca09386796d6053463a2d201307000000000000000000000000000000000000000000000814202b37414b53595b606060606060605c59544b4232291f140900000000000000000000000000000000000000000007121d2731404a52585a606060606060605b59534b41372b201408000000030f1b26313c464e53555b5d5e5f5f5f5e5c5854524c46413a322b231a12080000000000000000000000000000000000000000000000000000000000000000000000000000000000040d18212b343e474f55575f60606060605f55534d453b31261a0e02000714212d3a46535f696e78797979797979706b61584e453b31281d140a0000000000000000000000000000101d2a36434f5b67717779797979797979797979797979797979716c6155493c3023170a0000000915222f3c4855626f7c81848585868584827e7a746d68605950483e352c22180d03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4afa295887c6f6255493c2f2216090000000000000000000a141e2a333b454d52596063676a6b6c6c6b6a69676462605c544a3f34281c1003000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b000b1824313e4b5764717e8a97a4b1a79a8d8074675a4d4134271a0e0100000000000a1724313d4a5764707d8a97a3b0a99c8f8376695c504336291d10000b1824313e4b5764717e8a97a4b1a79a8d8174675a4e4134271b0e0100000000010e1b2734414e5a6774818d9aa7b1a4978a7e7164574b3e3124180b00000000000000000000000007131f2c38434f5966727f8c99a4aa9b8e817475818e9baa9e9184796d6053463a2f24180d01000000000000000000000000020e1a25303b45515d676f7c8591979ea5a8a09e95908b8885838281807f7f7f7e7e7e7e7d7d808d9aa7afa396897c706356493d3023160a00000000000000030f1c28333f4a5466727f8c99a3aea3998a7d71645a50463d352f2c292324292c2e343b444f5963707d8a99a3aea6998d807366544a4034281c1004000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000005111e2a36424d576976838f9ca9b1a79a8d80736a605954524c4a5053555a61676d798290959095a0abaca09386796d6053463a2d201307000000000000000000000000000000000000000000000c1824303c48535d64686c6c6c6c6c6c6c68655d54443b3025190e0000000000000000000000000000000000000000000c18232f3943525c64676c6c6c6c6c6c6c68645d53483c3024180c00000006121f2b37434e585f62686a6b6c6c6c6b6865615e56524c443d352c241a1108000000000000000000000000000000000000000000000000000000000000000000000000000000020b16202a333d474f5961636c6c6c6c6c6c6b615f574d42362a1e1205000815222e3b4855616e7b858686868686867d706a60574d433a2f261b110600000000000000000000000000111e2b3744515e6a7784868686868686868686868686868686867e7164574a3e3124170b0000000a1724313d4a5764707d8a9091929292918f8b86807a706b615a50473e342a1f150b010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4afa295887c6f6255493c2f221609000000000000000006111c26303b454d575e616b70747778797978777674716f6d665c5044382b1f1206000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b000b1824313e4b5764717e8a97a4b1a79a8d8074675a4d4134271a0e0100000000000a1724313d4a5764707d8a97a3b0a99d9083766a5d5043372a1d10000a1724313d4a5764707d8a97a3b0a79a8e8174675b4e4134281b0e0100000000010e1b2834414e5b6774818e9aa7b0a3978a7d7064574a3d3124170a0000000000000000000000000915222f3b4854606b7784919eaba2988a7d70707d8a98a2a197897d7063554b4135291d11040000000000000000000000000009141f2935414b555f6a6f7c858f939c9fa4a79f9d989892908f8d8d8c8c8b8b8b8b8a8a8a8d929da9afa396897c706356493d3023160a00000000000000000b17222d3b4754616e7b86929faaab9d9083766c61584e45403a38342f2f35393a40454d56606b75828f9babab9f94887b6f6255483c2e23180c00000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000714202d3a46525e697885929fabaca095877b6e61584f4746413f44464850555d676e7b85929da0a7b1aca09386796d6053463a2d201307000000000000000000000000000000000000000000000e1a2734404d59646f7479797979797979756f65564d42362a1c11060000000000000000000000000000000000000004101c2934404b55646e7479797979797979746f64594d4034271a0e0000000815212e3a47535f6a6f7577787979797775726d68615d564f473e362c231a100600000000000000000000000000000000000000000000000000000000000000000000000000000a141d28323c454f59616b70797979797979786e695f53463a2d211407000714212d3a46535f696f7c86929a939992867d6f695f554c41382d22170d04000000000000000000000000111e2b3744515e6a77849193939393939393939393939393938a7e7164574a3e3124170b0000000a1724313d4a5764707d8a979e9f9f9f9e9b98928d847d716c61594f463c31271d12070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4afa295887c6f6255493c2f22160900000000000000000b17232e38424d575f696e767c8083858685848483807e7c786d6053463a2d201307000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b000b1724313e4a5764717d8a97a4b0a79a8d8174675a4e4134271b070000000000000b1724313e4a5764717d8a97a4b0a99d9083766a5d5043372a1d10000a1723303d4a5663707d8996a3b0a89b8e8175685b4e4235281b090000000000020f1b2835424e5b6875818e9ba8b0a3968a7d7063574a3d3024170a000000000000000000000004101d2935404b55636f7c8996a0ab9f9285796d6d7985929fa99b8e8175675d5145392c20140900000000000000000000000000020d18242f3a434e585f6a6f7a82898f93999c9fa2aaa29f9d9b9a999998989898979797979a9da4aeafa396897c706356493d3023160a00000000000000000614202d3946525e6874818e98a2ab9f958a7e716a6058514b47454042434045474b51575f696f7c89939eaaa4998f82766a5f53473a2e1c120700000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000814212e3b4754616e7b8798a2aeaa9d908377695e53463d393634383a3e434c555e69717e8b97a1adb9aca09386796d6053463a2d201307000000000000000000000000000000000000000000000e1b2835414e5b687481868686868686868175695e5246382d22170b0000000000000000000000000000000000000006131f2c3845515c677480868686868686868174685b4e4135281b0e0000000915222f3c4855626f7c81848585868584827e7a746d68605950483e352c22180d0300000000000000000000000000000000000000000000000000000000000000000000000006111c262f3a444d57606b707d868686868686857b6e6155483b2e2215080005121e2a36424d57606a707e88939fa29892857b6e675d53493f33271f160c010000000000000000000000111e2b3744515e6a7784919d9f9f9f9f9f9f9f9f9f9f9f9f978a7d7164574a3e3124170b0000000a1724313d4a5764707d8a979e9ea2a9a9aaa39f9691877e716b61584e43392f23180c0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000204050606060504020b1825313e4b5864717e8b97a4afa295887c6f6255493c2f2216090000000000000003101c28343f4a545f696e7b82898d9092929291908f8d8b887e7164584b3e3125180b000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b000a1724303d4a5763707d8a96a3b0a89b8e8175685b4e422e23180c0000000000000b1825313e4b5864717e8b97a4b1a99c8f8376695c504336291d10000916222f3c4955626f7c8895aab4a99c8f8276695c4f4330251a0e0200000000030f1c2936424f5c6975828f9ca8b5ab95897c6f6256493c2f23160900000000000000000000000613202c3945515d6774818e9aa8aa9b8e8175676775818e9baa9f92867a6d6054473b31251a0e020000000000000000000000000007131d28313c464e585f686d757c82878b8f929897999a9b9c9d9d9d9e9e9e9e9f9f9f9fa3abacb5afa396897c706356493d3023160a000000000000000005111e2a36414d56616e7b85929fa4a79f92867c6f6a605d5553514b4f4f4b5153545c60696e7b84919ea6a69f93877c6f63584e43372b1f0b0000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000091623303c4956636f7c8996aab4a79a8e817467574d42342d2a282b2d313a434d57606d7985929eabb8aca09386796d6053463a2d201307000000000000000000000000000000000000000000000916232f3c4956626f7c89959393939392867b6e61544a3f33281c0f030000000000000000000000000000000000000714202d3a4753606d7985929393939395897c6f6356493c302316090000000a1724313d4a5764707d8a9091929292918f8b86807a706b615a50473e342a1f150b0100000000000000000000000000000000000000000000000000000000000000000000040d17222d38424c565f696f7d869299939a92867c6f695f53463a2d21140700020e1a26313b454e58616c73808c949ea1979183796d655b50443d31281d13070000000000000000000000111e2b3744515e6a7784919daab0a69e9b98989898989898978a7d7164574a3e3124170b0000000a1724313d4a5764707d8a92919297979c9fa6a9a19992877d706a5f554b4034291f1409000000000000000000000000000000000000000000000000000000000000000000000000000000020608080c0f111213131312110f0c1825313e4b5864717e8b97a4afa295887c6f6255493c2f2216090000000000000006121f2b3844505c666e7b848f949a9d9e9f9f9e9d9c9a978b7e7164584b3e3125180b000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b000916222f3c4955626f7c8895a9b3a99c8f827669544a4034281c100400000000000c1926333f4c5966727f8c99a5b2a89c8f8275695c4f4236291c0f000814212e3b4754616e7b8798a3aeaa9d9084776a574d42362a1e12050000000005111d2935414c566a7783909daaafa399877b6e6154483b2e21150800000000000000000000000714202d3a4753606d7a85929faca3988a7d716464707d8a98a2a2988b7e7165574d42362a1e120500000000000000000000000000010c161f2a343c464e565e616b6f757b7f8285888a8c8d8f8f9090919191919292929292999ba3acafa396897c706356493d3023160a0000000000000000020e1925303b46535e69717e8b929da4a29891847c726d6763605c555c5c555d6063666d727b839096a1a69f948d80736b6054463c31261a0f0000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000a1724313d4a5764707d8a97a3b0a5988c7f7265594c3f31261e1c1f2028313b45515c6673808d99aab4aca09386796d6053463a2d201307000000000000000000000000000000000000000000000915222e3b4854606a7783909daa9fa3998c7f73665b5044382b1f1409000000000000000000000000000000000006121f2b37434e5864717e8a97a29f9f9d9083776b6054483b2f2215090000000a1724313d4a5764707d8a979e9f9f9f9e9b98928d847d716c61594f463c31271d1207000000000000000000000000000000000000000000000000000000000000000000010c161f28333f4a545d686e7b859298a29f93887e706a60574d42362a1e1205000009141f29333d46505a606c77828f96a1a0958f82776c60594f433a2f24180c0300000000000000000000111e2b3744515e6a7784919daaaa9e938f8b8b8b8b8b8b8b8b8a7d7164574a3e3124170b0000000a1724313d4a5764707d87858585868a8f949fa2aaa39992867c6f675c51453b31261a0e0300000000000000000000000000000000000000000000000000000000000000000000000003090e121415191b1d1f1f201f1f1d1b191825313e4b5864717e8b97a4afa295887c6f6255493c2f221609000000000000000713202d3a4653606d788390969fa6aaababa5a1a0a0a1978b7e7164584b3e3125180b000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b000814212e3b4754616e7a8797a2adaa9d918477665c5144382c1f120600000000000e1b2734414e5a6774818d9aa7b4a89b8e8175685b4e4235281b0f000713202d3a4653606d7986929facab9f928578695e52463a2d201407000000000713202d3946525d687885929eabac9f9286796d6053463a2d2013070000000000000000000005121e2a36424d5764717e8b98a2ac9f92867a6d60606d7985929faa9c8f8376695e53463a2d21160a0000000000000000000000000000040d18222a343c444c52596063696e7276797b7d7f81828383848484848585858585868b909ba7afa396897c706356493d3023160a00000000000000000008141f2a36424d57626c74808d929fa2a19691877f79736f6d676969696a676d6f73797f869095a0a49f949082796d60594f43342a20150a0000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000b1824313e4b5764717e8a97a4b0a4978a7d7164574a3e3124171012161f2834404b54626f7c8998a3aeaca09386796d6053463a2d2013070000000000000000000000000000000000000000000007131f2c38434e5865727e8b98a2aeab9e9184786c6053463b30251a0e00000000000000000000000000000000000814212e3a47535f6a7683909ca9aea2988b7f7265594f43382c1f13070000000a1724313d4a5764707d8a979e9ea2a9a9aaa39f9691877e716b61584e43392f23180c03000000000000000000000000000000000000000000000000000000000000000008131e28313a44505b666d7a849197a29e948c80736c61584e453b31261a0e020000030d18212b343e44505b656d7a849199a49e948c7f726b60554b4135291e150b00000000000000000000111e2b3744515e6a7784919daaa89b8f817f7f7f7f7f7f7f7f7f7b6e6155483b2e2215080000000714202d3a4753606d79797878787a7d828a9298a1a9a2989083796d60574d42362a20150a00000000000000000000000000000000000000000000000000000000000000000000060b0f151a1e212225282a2c2c2d2c2b2a28262225313e4b5864717e8b97a4afa295887c6f6255493c2f22160900000000000004101c2834404b5564717e8a959fa8b0a9a19e9894939394968b7e7164584b3e3125180b000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b000714202d3946525e687885929fabac9f9286796d6053463a2d20130a0400000006121f2b37434e586976828f9ca9b4a79a8e8174675b4e4134281b0e0006121f2b3844505c667784909daaaea298877b6e6154483b2e21150a000000000714212e3a4754616d7a8797a1adaa9e918477665c5145382c1f1306000000000000000000000714212d3a46535f6976838f9caaaa9b8f8275675d5d6775828e9baa9f93877b6e6154483d32271b0f0000000000000000000000000000050e171e252a323a41464f54575e6165666d6f717374757676777777787878787879797e8b98a4afa396897c706356493d3023160a000000000000000000020e1a25313b45505a646e74808b92989fa199928c85807c797776757676777a7c80858b9298a09f9a938d82796d675d51473d3222180e030000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000b1825313e4b5864717e8b97a4b0a396897d7063564a3d3023170a060d18232e3a4653606d7986929facaca09386796d6053463a2d20130700000000000000000000000000000000000000000000030f1b27323d4754606d7a85929facaca1968a7d7063574d42362a1c110600000000000000000000000000000004101c2934404b55626e7b88949fabac9f92867a6d6054473d32271b0f030000000a1724313d4a5764707d8a92919297979c9fa6a9a19992877d706a5f554b4034291f140900000000000000000000000000000000000000000000000000000000000000030d19242f3a434f59606c78828f96a0a1968f82776c605a50463d33291f140900000000060f192227333f49535e68707d87939fa69f92877d6f675d51453d30271d1207000000000000000000111e2b3744515e6a7784919daaa5998c7f7272727272727272726e695f53463a2d21140700000006131f2c3845515c676d6d676b676d70767e869297a1aaa0958c8073695f53463c31261a0f0300000000000000000000000000000000000000000000000000000000000000020a11171b1f262b2e2f32353738393939383735322f2e313e4b5864717e8b97a4afa295887c6f6255493c2f22160900000000000006131f2c3845515c6776828f9ca7b1aaa197928b88868687898b7e7164584b3e3125180b000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b0005111e2a36414c56697683909ca9aea399897c6f6256493d32271b13100c090e1117212e3a47535f6a7885929eabb3a6998d8073665a4d4033271a0d0003101c28343f4a546875818e9ba8b3aa978a7d7064574a3d32271b0d04000001081623303d495663707c8996a9b3a89c8f827569544b4034281c1004000000000000000000030f1c28333f4a54616e7b87939faca2988a7e7164555564717e8a98a3a49a8c7f7366584e43372b1d1207000000000000000000000000020c1720293036393a3e3f44484d5354545c606264666768696a6a6a6b6b6b6b6c6c6c717e8b98a4afa396897c706356493d3023160a0000000000000000000009141f29333f48525c646e747e868e92999c9f97928d898684838282838486898d92979f9c99948f8780796d675d554b40342b211006000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000b1825323e4b5865717e8b98a4afa296897c6f6356493c302316090007131f2c3845515c667683909da9aca09386796d6053463a2d20130700000000000000000000000000000000000000000000000a16202c3945515d6774818e9aa7b1a89b8f8275695e5246382e23170b00000000000000000000000000000006131f2c3845515c6774808d9aa6b0a79b8e8174685d5245392b21160a000000000a1724313d4a5764707d87858585868a8f949fa2aaa39992867c6f675c51453b31261a0e030000000000000000000000000000000000000000000000000000000000010b151f2935414c56606b737f8c949ea49991847a6d655b50483e342b21180d030000000000071017222d38414c56606b74808d96a0a3999184796d60594f42392e23180c020000000000000000111e2b3744515e6a7784919daaa5998c7f726665656565656565615f574d42362a1e120500000004101c2934404b555c60605c555d60646c717c859298a3a79f92867b6e61584e43372b1f1409000000000000000000000000000000000000000000000000000000000000060b141b22272b31373a3b3f4244454646464544423f3b3a373e4b5864717e8b97a4afa295887c6f6255493c2f2216090000000000000713202d3a4653606d7986929facaea39892857f7b79797b7c7f7c6f6256493c2f231609000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b00010d192530404d5a6673808d99a9b2ab998c7f7266584e43372b251f1c181b1a1b2228343f4a54626f7c8897a2adb1a4978b7e7164584b3e3125180b00000b17232e3f4b5865727e8b98a8b2a69a8d807367584e43372b1f15100c090e131e2a36414c5666727f8c99a5b3aa998c7f7366594c402e23180c0000000000000000000006121f2b3844505b6673808c9aa4ac9f92867a6d605454606d7a86929fac9d9184776a605447392e23180c00000000000000000000000008131e29323a4146474b4c4d4e4f51524a50535557595a5c5c5d5d5e5e5e5e5f5f5f65717e8b98a4afa396897c706356493d3023160a00000000000000000000030d17212d36414a525c646c717b81868c8f92979e99999291908f8f90919299999e9892908c88827d746d675d554b43392f22190f00000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f2316090004101c2834404b546875828f9ba8aca09386796d6053463a2d201307000000000000000000000000000000000000000000000004111d2935414b55626f7c88959fabac9f92877b6e61544a3f34281c100300000000000000000000000000000714202d3a4753606d7985929eabaca095897c6f63564c413529190f04000000000714202d3a4753606d79797878787a7d828a9298a1a9a2989083796d60574d42362a20150a000000000000000000000000000000000000000000000000000000000007121d27313945525d68707d87939fa69f93877d6f685e53493f362c22190f060000000000000006111b262f3a444f59606d7984919ea5a0968e81746b60544b4034281e13080000000000000000111e2b3744515e6a7784919daaa5998c7f72665958585858585855534d453b31261a0e02000000000c18232f39434b515353514b51535a616a6f7c86929fa7a3988e81756a5f53473b30251a0e0100000000000000000000000000000000000000000000000000000000080f181d262d33373c4247484c4e505252535252504e4c4847433e4b5864717e8b97a4afa295887c6f6255493c2f2216090000000000000916232f3c4956626f7c8999a3aeac9f92867c726e6d6d6e70726f6a6054473b2e221508000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b0000081623303c4956636f7c8997a1adaa9d9083776a6054473f36302c282328252a2d333c44505c6673808c99a9b3b3a996897c6f6356493c3023160900000615222f3c4855626f7b8896a0acaa9d9184776a6054473c31271f1c181b1a1e242d3946525e6876838f9ca9aea298897c706356493d30231607000000000000000000000613202d394653606c7884919eaca99b8e8175675d51515d6775828f9caba096897c6f62544b4034281c100400000000000000000000010d1925303a444c525457595a5b5c5d5e5b5953484a4c4e4f5050515151515252525965727f8c98a5afa396897c706356493d3023160a0000000000000000000000050f1b242f38414a525a62696e747b7f8285929faba39f9d9c9c9c9d9d9fa3ab9f928682807b766f6b605d554b433a31271d100700000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000c18232e414e5b6874818e9ba7aca09386796d6053463a2d2013070000000000000000000000000000000000000000000000010d18242f3a47535f6a7683909da9afa3998c7f73665c5044382b1f14090a0a0a0a0a0a0a0a0a0a0a0a0a0a121f2b37434e5864717e8b97a2adaa9d9083776b6054443a2f241907000000000006131f2c3845515c676d6d676b676d70767e869297a1aaa0958c8073695f53463c31261a0f03000000000000000000000000000000000000000000000000000000000c18232f39434f59606d7a849199a4a0968d80736b60564c41382d231a10070000000000000000000a141d28323d45515d67707d89939ea89d93897d70665c51453a3025190d0200000000000000111e2b3744515e6a7784919daaa5998c7f7266594c4c4c4c4c4c4846423b332a1f1409000000000007121d27313940454747454045475058606a727f8c959faa9f93877c6f62574d42362a1d120700000000000000000000000000000000000000000000000000000008111a212a2f383f44464d5355585b5d5f5f605f5e5d5b5955534e464b5864717e8b97a4afa295887c6f6255493c2f2216090000000000000a1724313d4a5764707d8a97abb5a79a8e81746a6160606163656260584e43372b1f1306000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b00000713202d3a4653606d7984919eaaab9f95897c6f625b5146413a38342e343136383f444d57606d7984919eabb7ada297877a6d6154473a2e21140700000815212e3a47535f6a7784919eabaca095887c6f62584e4339312c282327262b2f35414c56616d7a86929facab9f9285796d6053463a2d20130700000000000000000004111d2935414c5663707d8996a1aca1978a7d7063554b4b5564717e8b99a3a89a8d8174665c5145382c1f13080000000000000000000005111d2a36414c565e6164656768696a6b68655d534840414243434444444545454d596673808c99a6afa295897c6f6256493c2f231609000000000000000000000000091217232e38424a535b606a6f767c8084919eaaa7a4a2a1a0a0a1a2a4a7a99c8f837f7b756e6a625b514b433a31281f150b0000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f2316090000071a2734404d5a6773808d9aa6aca09386796d6053463a2d20130700000000000000000000000000000000000000000000000007131d2b37434e5864717e8b97a2adab9e9184786d6053463b31251a16161616161616161616161616161616212e3a47535f6a7683909ca9aea2988b7f7265594f4332281e1308000000000004101c2934404b555c60605c555d60646c717c859298a3a79f92867b6e61584e43372b1f140900000000000000000000000000000000000000000000000000000004101c2934404b55606b74818e96a1a59d9184796d60594f443a2f261b110800000000000000000000020b16202935404b55606b75818e98a2a59d9184796d60564c41362a1f140800000000000000111e2b3744515e6a7784919daaa5998c7f7266594c3f3f3f3f3f3b3a36312a21180e030000000000010b151f272f34383a3a3835393e464e58606c7883909da6a49a8e8175695e5246392f23180c000000000000000000000000000000000000000000000000000008111a232c333c41495053575f6265686a6b6c6c6c6b6a6865625f5853505864717e8b97a4afa295887c6f6255493c2f2216090000000000000b1825313e4b5864717e8b97a4b1a4978a7e716458535354565856544e463d32271b0f03000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b000006121f2b3844505c6673808d98a2aea79c8f82766d625b524c46454041414242464950575f69727e8b96a1adb8ab9e928578685e5246392d201307000006121f2b37434e586673808d99a3afa89b8e81756a5f554b433c38342e3431373a4145525d68737f8c99a3afa79b8e8175675c5145382c1f13060000000000000000000613202c3945525d6875818e9ba8ab9e9285796d6053464754616d7a86929fab9e9285796d6053463a3025190d010000000000000000000713202d3946525e686d71727374767778756f65594d3d323536373737383835404b556774818e9aa7b2a995887b6e6255483b2f2215080000000000000000000000020c162028343f4a545c656c737c82888c9196a09f9a97959493939495979a9e9f948f8b86817b726d645d534a40352c1f150b0100000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000000000000000000000000000000000000000000000000010f1b26323c4753606d7985929fabada1968a7d7063574d42362a23232323232323232323232323232323232934404b55626e7b88949fabac9f92867a6d6054473d3221160c010000000000000c18232f39434b515353514b51535a616a6f7c86929fa7a3988e81756a5f53473b30251a0e0100000000000000000000000000000000000000000000000000020d17212c3845515c67707d89939da89e93897d6f675c51473d32281d140a000000000000000000000000050e18242f39434f59616e7b86929fa9a0968c7f72685e52463b3025190e01000000000000111e2b3744515e6a7784919daaa5998c7f7266594c3f333232322e2d2a261f180f0600000000000000030d151d23292c2d2d2c292c343d44505b666f7c89949eac9f92877b6e61554b4034291c1004000000000000000000000000000000000000000000000000060f1a232c353e454d535b6064696e72757778797979787775726e6a64605c5464717e8b97a4afa295887c6f6255493c2f2216090000000000000c1825323f4b5865727e8b98a5afa295897c6f6256494648494c4947433d342b20150a00000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b000003101c28343f4a54616e7b86929fa8ab9f948b7f726d615e5653514b4e4e4f4d53535b60696e7b85929fa8b2b5a89c8f827569564c4135291d11050000030f1a26313c4854616e7b87929faaac9f92877c6f675d554e46454041414142474c515b606d7a85929eabaca095897d7063554b4034281c10040000000000000000000714212d3a4754606d7a86929faca89a8d8174665c514446525d6876828f9caba2978a7d7064564c4135291d11050000000000000000000714212e3a4754616d7a7e7f8081828485817568584e43372e2c2823282c2f3945515d677783909daaada196877a6d6054473a2d211407000000000000000000000008131e28323a44505c666d777f878f94999e9f97928e8b8887868687888b8d92979e9c99928e867f746f645c52473e31271d120700000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000000000000000000000000000000000000000000000000000a151f2c3845515d6774808d9aa6b0a89c8f8275695e5346382e3030303030303030303030303030303030303845515c6774808d9aa6b0a79b8e8174685d5245392c2013040000000000000007121d27313940454747454045475058606a727f8c959faa9f93877c6f62574d42362a1d12070000000000000000000000000000000000000000000000000009141f2a36414c56606d7984919ea5a2988e81756b60554b40352b20160b020000000000000000000000000007121d27313d46525e6973808d97a2a89f92857a6d61564d41362a1e1308000000000000111e2b3744515e6a7784919daaa5998c7f7266594c3f3326252522211e1a140e06000000000000000000030b12181c1f20201f1d2228333f4a54606b75828f9ca8a3998d8073675c5145382c1f14090000000000000000000000000000000000000000000000030e18212c353e474f575f656c71767b7f8183858586858583817f7b77716d665f64717e8b97a4afa295887c6f6255493c2f2216090000000000000c1925323f4c5865727f8b98a5aea195887b6e6255483b3b3d3f3c3b37322b22190f0400000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b0000000b17232e3846525e6973808d96a0aaa69f93877f746d6863605c545b5b5c575e61656c717b849198a2aebab3a9988c7f7265594c3f3025190d010000000a15212d3a46535e6975818e98a3aea3999083796d675f5853514b4e4e4e4d53555d606d74818e97a1ada69d9083776b605443392e23180c00000000000000000006121f2b37434e5865727e8b98a2aca096897c6f63544a40414c5665727e8b99a4a99b8f8275685e5246392d2015090000000000000000000815212e3b4854616e7b878c8d8e8f909184786a6054473f3a38342e34383a404b55606d7a86929facab9e918578675d5145392c20130600000000000000000000010d1924303a44505a606d78818c93999fa098928c85817e7b7a797a7a7b7e81858b92979f9f99928b81746e63594f43392f24180c00000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d2013070000000000000000000000000000000000000000000000000004101d2935404b55626e7b88949fabac9f93877b6e61544a3f3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4753606d7985929eabaca095897c6f63564c4135291d110400000000000000010b151f272f34383a3a3835393e464e58606c7883909da6a49a8e8175695e5246392f23180c000000000000000000000000000000000000000000000000020e1a25303946525e68737f8c96a0a99f92867a6e61594f43392f23190e040000000000000000000000000000010b151f2a36424d57606d7a85929eaaa2978d8074685e52463a2f24190d010000000000111e2b3744515e6a7784919daaa5998c7f7266594c3f332619191514120e0903000000000000000000000001070c10131414131017222d38424f5963707d8995a0ab9e9285796d6053473b31261a0e000000000000000000000000000000000000000000000009141f2a333e474f5961696e787e83888b8e909292939291908e8c88847e786e6a64717e8b97a4afa295887c6f6255493c2f2216090000000000000c1925323f4c5865727f8b98a5aea194887b6e6155483b2e30322f2e2b27201910070000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b00000006111c2a36424d56606d79849198a2aba499938b807a736f6d666968676869696e71787e859196a1aab3b9ada297887c6f6255493c2f2216080000000005121e2a36424d57616e7b86929fa6aba0958f82796f6a63605c555b5a5b575f62676d747f8c939ea9a99f948a7d7064594f4430271d12070000000000000000000814212e3a47535f6a7683909daaaa9e9184776b605442393b4754616e7b86939fac9f92867a6d6154473c31261a0e0000000000000000000714212d3a46535e697884919a9b9c9d96897c6f625a504a464440434044464b515c67717e8b98a3aeaa9b8f827568554b4135291d11040000000000000000000004111d2935414c56616c74808d939fa4a09591867f7a74716f6e6d6d6e6f7174797e8590959fa39f938d80736b61554b4035291d1004000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d20130700000000000000000000000000000000000000000000000000000c18242f3947535f6a7683909ca9afa4998c8073665c504949494949494949494949494949494949494949494e5864717e8b97a2adaa9d9083776b6054443a2f24190d010000000000000000030d151d23292c2d2d2c292c343d44505b666f7c89949eac9f92877b6e61554b4034291c1004000000000000000000000000000000000000000000000005121e2a36424d57616e7a86929fa8a1978c8073685e52473d31271d110700000000000000000000000000000000030d1a25303b45525d6873808c98a2a99f92867b6e61554c4135291d11040000000000111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c0807050200000000000000000000000000000000040607070606111c262f3d4854606b7784919daba2978a7e7164574d42362a1b1106000000000000000000000000000000000000000000020b1a26313b454f59616b707b838a9095989b9d9e9f9f9f9e9d9b9895908b837c6f6b717e8a97a4afa295887c6f6255493c2f2216090000000000000c1925323f4c5865727f8b98a5aea194887b6e6155483b2e232523221f1b150f07000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b000000000e1925303b45515d676f7c869299a2aaa49f928d86807c79767574747576787b7e838a9297a1a8b2bcb8ab9e9285796c605346392d20130600000000020e1a25313b46535f69737f8c949fa7a79f948f837c75706d676867676869696e737a818c919ca5aaa1978f82766c6155473d331e150b00000000000000000003101c28343f4a54626e7b88959faba7998c807366594f43303946525e687683909ca9a3998b7f7265574d42372b1b1106000000000000000005121e2a36424d576774818e9aa6a9a89b8e81756c605c5453514a504a5153555d606d7983919daaaea2988b7e7165584b3e2f24180d01000000000000000000000713202c3945525d68717e8a929da5a19791837b726d676462616060616264676d717a839096a1a59c928a7d70675d5145392c1f150a000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000000000000000000000000000000000000000000000000000007121d2b37434e5864717e8a97a1adab9e9184796d6056565656565656565656565656565656565656565656565f6a7683909ca9aea2988b7f7265594f4332281e130800000000000000000000030b12181c1f20201f1d2228333f4a54606b75828f9ca8a3998d8073675c5145382c1f140900000000000000000000000000000000000000000000000714202d3a46525e6974818d98a2aa9e92857a6d60564c41352b1f150b00000000000000000000000000000000000009141f2935414c56616d7a86929faca3988d8073675d5145392c20150a0000000000111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c00000000000000000000000000000000000000000000000000000a141d2c38444f5965727f8c99a3a99c8f8276695f5346382d22170b0000000000000000000000000000000000000000000a141d2a36424d57616b707d8690959d9fa7a8aaaaa39f9e9e9e9fa3a09d9590867d6f717d8a97a4afa295887c6f6255493c2f2216090000000000000c1925323f4c5865727f8b98a5aea194887b6e6155483b2e22191615130f0a0400000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b0000000009141f2935404b55606a707e879298a0a7a49d98928d898583828181828384878b90959ea1a9b2babeb2a99b8e8175665b5044382b1f1206000000000009141f2a36424d57606d78828f959fa7a69f959087817d79777574747476787b80858e939ca3aaa29892857b6e615a5044352b210c0300000000000000000006121f2c3844505c6673808d9aa7ab9f95887b6e6255483d3236414d5665727f8c98a7ab9d908376695f5347382d22170b0000000000000000020e1a25313c4855626f7c88949faaaa9e938a7e726d6662605c545d545c6062676d75808d95a0aca99f92867a6d6154473a2e2114070000000000000000000003101c28343f4a54606d7a85929ea4a79e91857b6e69605d55555453535455555c60686e7a84919ea8a49e9184796d6053473c31261b0f030000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d2013070000000000000000000000000000000000000000000000000000010f1a26313c4653606d7985929eacada1968a7d70646363636363636363636363636363636363636363636363636e7b88949fabac9f92867a6d6054473d3221160c01000000000000000000000001070c10131414131017222d38424f5963707d8995a0ab9e9285796d6053473b31261a0e0000000000000000000000000000000000000000000004111d2935414c56616e7b86929faaa2988c7f73675d51443b3023190d03000000000000000000000000000000000000020d19242f3a46525e6874808d9aa6aa9f92857a6d6054473c31261b0f0300000000111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c0000000000000000000000000000000000000000000000000000020b1c27333d4754616d7a86929fac9f93877b6e6153493f33271b0f030000000000000000000000000000000000000006111b262f3846535f69707d8792989fa7aba8a09d9898929191919299989d9f9892867c707d8a96a3afa295887c6f6255493c2f2216090000000000000c1925323f4c5865727f8b98a5aea194887b6e6155483b2e221509080603000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b00000000020c18242f39434e58616c707d8690959ea1a9a29f9a9892908f8e8e8f8f9196989da09f9da0a8b2b9ada1978a7d7063544a3f33281c0f030000000000030e1a26313b44505c666d7a8390959da5a7a099938e898683828181818385888c92979da5a7a09892867d70695e52483e3323190f000000000000000000000713202d3a4653606d7985919eabab9d908377695f53473a2b303b4854616e7b8795a0ab9f95887b6e6253493f33271b0f0300000000000000000915212e3b47535f6a76828f98a2aea59f92877f78726f6d666a696a666d6f7379818d929da7aca2978d8074685d5246392d2013070000000000000000000006121f2b3844505c66737f8c97a1ab9f958a7d70695f57514b4847464747484b51565e68717e8a96a0aca1968b7f7265584e43372b1f12060000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d20130700000000000000000000000000000000000000000000000000000009151f2c3845515c6673808d9aa4afa99c8f82757070707070707070707070707070707070707070707070707074808d9aa6b0a79b8e8174685d5245392c201304000000000000000000000000000000040607070606111c262f3d4854606b7784919daba2978a7e7164574d42362a1b11060000000000000000000000000000000000000000000713202c3945525d6874808d99a3ab9f92857a6d60554c4132291e1107000000000000000000000000000000000000000008131e2935414c56626f7b88949faba2988b7f7265584e43372b1f120600000000111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c0000000000000000000000000000000000000000000000000000000b13202d3a4653606d7985929eaba49a8c8073655b5044372b1f1207000000000000000000000000000000000000000b17222d3841505a616e7b859299a2aaaba39f96918c888584848586888c90959e9891847a7d8996a3afa295887c6f6255493c2f2216090000000000000c1925323f4c5865727f8b98a5aea194887b6e6155483b2e221508000000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b000000000007121d27313d46505a616b707c838b91979c9fa3aaa29f9d9c9b9a9b9c9ea1a29f9a939196a0acb8ab9e9184796d6053463a2d22170b0000000000000009141f28343f4a545e686d7a838e929d9fa7a49f9b9892908e8e8d8e8f9197999ea1a9a29e9590867d706b60574d42362c22110800000000000000000005111d2a36414c5663707d8a97a1ada3998c7f7265574d42372b2d3a46535e697783909daaa7998d8073655b5044372b1f1207000000000000000006121f2b37434e58626f7c86929fa4aca399928b837f7b797777767777797c80858e939da4aea49a92857a6d61564c4135291d1105000000000000000000000713202d3a4653606d7984919ea9a99d9083766b61574d45403c3b3a3a3b3c40454c56606c7884919eaaa89d9184776a5f53473a2e2115080000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d20130700000000000000000000000000000000000000000000000000000004101c2834404b54616e7b87939facac9f93877d7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7d85929fabaca095897c6f63564c4135291d11040000000000000000000000000000000000000000000a141d2c38444f5965727f8c99a3a99c8f8276695f5346382d22170b0000000000000000000000000000000000000000000714212d3a4754606d7a86929faba69a8d8074685d52433a2f20170d000000000000000000000000000000000000000000010d1925303a47535f6a7683909cacaa9d9184776a5f53473a2e21150a00000000111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c000000000000000000000000000000000000000000000000000005111d2a36414c5664707d8a97a1adac9e9184786c605346392f24180c000000000000000000000000000000000000030f1b27333f4953616c76828f97a2ababa399928c847f7b79787778797b7f838a9197968e817d8996a3afa295887c6f6255493c2f2216090000000000000c1925323f4c5865727f8b98a5aea194887b6e6155483b2e221508000000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b0000000000010b151f2b343e485059616a6e787e858a8f9299999b9d9e9f9f9f9e9e9c9998928e8684919daab0a69a8d8073665c5044382b1c110600000000000000030b17232e38424c565e686d79818990959b9fa2aaa39f9d9b9a9a9b9c9ea1a9a49f9c97928c837b706b60594f453b30241a10000000000000000000000713202d3946525e6875828f9ba9ac9f92867a6e6154473c31262a36424d5766737f8c99a7ab9e9184786c605346392f24180c0000000000000000030f1b26323c47535f6a717e8b939aa2aaa39f95918c8886848483838485898c92979ea5aaa39f93887d70685e52443a3024190d0100000000000000000000091623303c4956636f7c8996a1adab988b7f7265594f453c352f2e2d2d2e2e343b44505b6674808d9aa7aca095887b6f6255483c2f2215090000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000000000000000000000000000000000000000000000000000000000c18232e3946535f6976828f9ca9afa499938a89898989898989898989898989898989898989898989898989899297a2adaa9d9084776b6054443a2f24190d01000000000000000000000000000000000000000000020b1c27333d4754616d7a86929fac9f93877b6e6153493f33271b0f030000000000000000000000000000000000000006131f2b37434e5865727f8c98a2ab9f94887b6e62564c4131281e0e050000000000000000000000000000000000000000000008131e2b37434e5865727f8b9aa4aca095887b6f6255483c32261b0f03000000111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c00000000000000000000000000000000000000000000000000000713202d3946525e6875828f9ba9b3aca196897c6f63554b4035291d1004000000000000000000000000000000000005121f2b3744505b65717e8a949fa9aea39992877f78726e6c666b666d6f72777e859095938c7f8c99a6afa295887c6f6255493c2f2216090000000000000c1925323f4c5865727f8b98a5aea194887b6e6155483b2e221508000000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b000000000000030d19222c363e474f575f666d72797e82868a8c8e909192929292918f8d8a86817c838f9ca9aa9e93887b6e62544a3f34281c0a00000000000000000006111c26303a444c565e676d747c83898e9298999b9d9e9f9f9f9f9e9d9b999993908b857f786e6960594f473d33291f1208000000000000000000000714212e3a4754616d7a86929facaa9c8f8276685e5246392a2025313b4855626e7b8895a0aca196897d7063554b4035291d100400000000000000000a15202b37434e58616c727f8892989fa3a7a09d99999291909090919298999ea2a9a69f98928b7f726c61564c4132281e130800000000000000000000000c1926333f4c5966727f8c99a8afa499887b6e6255483e332924212020212328333f4a5464717d8a97a4b1a7988b7e7265584b3f3225180c0000000000000000000203101d2a3643505d69768390908376695d5043362a1d10030200000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d2013070000000000000000000000000000000000000000000000000000000007121d2a36424d5764707d8a96a1adaba49f9796969696969696969696969696969696969696969696969696969fa2a9aea2988b7f7265594f4332281e130800000000000000000000000000000000000000000000000b13202d3a4653606d7985929eaba49a8c8073655b5044372b1f1207000000000000000000000000000000000000000815212e3b47535f6a7784919daaac9c8f83766a5f53443a301f160c0000000000000000000000000000000000000000000000020f1a26313c4754616e7b87939faca7998c807366584e43372b1f1306000000111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c00000000000000000000000000000000000000000000000000000714212e3a4754616d7a86929facb9b2a89a8e8174675d5145382c1f140800000000000000000000000000000000000613202d394653606c7883909da6b0a79f92877d726d6662605b545c6062656c717a8390969285929facafa295887c6f6255493c2f2216090000000000000c1925323f4c5865727f8b98a5aea194887b6e6155483b2e221508000000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b0000000000000007101a232c353e454e545c60676d71767a7d7f828385858686858482807d79757d89949faba69b8f82756a5f5342382e23170b000000000000000000000a141e28323a444c555c606b6f777d8185898c8e90919292929291908f8d8a86837e79726d665f574f473d352b20170d0000000000000000000006131f2b37434e5865727f8b99a3aea2988b7e7164564c41362a18212e3a47535f6a7784919daaa89b8e8174675d5145392c1f14090000000000000000040f1a26313c46505a636d727e868e92999da0a8aba39f9e9d9c9d9e9fa2aaaaa29f9b948f867e726d62594f443a3020160c0200000000000000000000020f1c2935424f5c6875828f9ba8ac9f9386796c605346392d20181413141418222d3c4956626f7c8995a2afa79a8e8174675b4e4134281b0e01000000000000050a0f12101d2a3643505d69768390908376695d5043362a1d10120f0a050000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000305101d2a3643505d69768390908376695d5043362a1d1005030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d20130700000000000000000000000000000000000000000000000000000000000e1a26313b4653606d7984919eabb5afaca3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3abadb3ac9f92867a6d6054473d3221160c010000000000000000000000000000000000000000000005111d2a36414c5664707d8a97a1adac9e9184786c605346392f24180c000000000000000000000000000000000000000916222f3c4955626f7c8896a0aca49a8b7e7265574e4232281e0d040000000000000000000000000000000000000000000000000a15202d3a46525e697683909da9aa9e9184776a5f54473b2e221506000000111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c0000000000000000000000000000000000000000000000000006131f2b37434e5865727f8c99a3aeb7b8ab9f9285796d6053473b3025190e02000000000000000000000000000000030f1c28333f4a5463707c8995a0acab9f958b7f726b605c5453504a5153555a61686e7a8491989298a2aeafa295887c6f6255493c2f2216090000000000000c1925323f4c5865727f8b98a5aea194887b6e6155483b2e221508000000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0600000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b000000000000000008111a232c333c424a50555c6064676d707375767878797978777673716d7883909da6ac9e93887c6f62584e4330261c110600000000000000000000020c162029323a434b515960636b7075797c7f82838485868685858382807d7a76726d67605c544d453d352b23190e05000000000000000000000815222e3b47545f6a7783909dabac9f92867a6d6054473b3025191e2b37424e576673808c99a8ab9f9285796d6053473b3025190e0200000000000000000a15202a343e48515b636c717b81878c919597999c9d9e9e9f9f9f9e9d9b9998928e89827b716c625b51473e32281e0e04000000000000000000000003101d2a3643505d697683909ca9ab9e928578665b5044382b1f120707070715222e3b4855616e7b8894a1aea89b8f8275685c4f4235291c0f0200000000010910161b1e20202a3643505d69768390908376695d5043362a20201e1b16100901000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000060b0f12131d2a3643505d69768390908376695d5043362a1d13120f0b06000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000000000000000000000000000000000000000000000000000000000009141f2c3844505c6673808c99a3afbbb9b1acaa9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9fa7a9afb8bab1a79b8e8174685d5245392c20130400000000000000000000000000000000000000000000000713202d3946525e6875828f9ba9b3aca196897c6f63554b4035291d1004000000000000000000000000000000000006131f2b37434e586673808d99a8ac9f93877b6e6154473c3121160c0000000000000000000000000000000000000000000000000005111e2a36424d5765727f8c98a9aca096887c6f6255493c2d22170b000000111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c000000000000000000000000000000000000000000000000000815222e3b4754606a7783909dabacababaea2988a7e7164564c41362a1e110500000000000000000000000000000006121f2b3844505b6674818e9ba7b1a99d9083786c6059504a46444044464850565e68707d89939fa2aab4afa295887c6f6255493c2f2216090000000000000c1925323f4c5865727f8b98a5aea194887b6e6155483b2e221508000000000000000000000713202d3a4653606d798693a0aca79a8d8174675a4e412d22170b00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b00000000000000000008111a212a30383f444b5153555d606366686a6b6c6c6c6b6b696668717e8b95a0aca49a8f82756a5f54463c311e140a000000000000000000000000050e172029313940454f54596063676d70727576787879797878777573706d6865605d55504a423c332b231911070000000000000000000004101c2834404b55626f7c8895a0aca99b8e8175675d514539291e141a26313c4955626f7c8896a0aca2988a7e7164564d42362a1e11050000000000000000030e18222d363f49515a61696e747b8084888b8d8f90919292929291908e8c8985817c766e69615a51493f352c20160c00000000000000000000000004111e2b3744515e6a7784919daaab9e9184786b554b4034281c100400000814212e3b4754616e7a8794a1ada99c908376695d5043362a1d1003000000010a131b21272b2d2d2d3643505d69768390908376695d5043362d2d2d2b27211b130a010000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000020a11171b1f202a2d3643505d69768390908376695d5043362d2a201f1b17110a0200000000000000000000000000101d2a3643505d69768390908376695d5043362a1d10000000000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000000000000000000000000000000000000000000000000000000000003101c28343f4a54616e7b87929facb9b1a7a0939393939393939393939393939393939393939393939b9ea5afb8aca095897c6f63564c4135291d110400000000000000000000000000000000000000000000000714212e3a4754616d7a86929facb9b2a89a8e8174675d5145382c1f140800000000000000000000000000000000000815222e3b4754606a7784919eaaa99c908376685e5246392d20140400000000000000000000000000000000000000000000000000020e1a25303b4855616e7b8896a1ada8998c7f7366544a3f33281c0f030000111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c00000000000000000000000000000000000000000000000004101c2834404b55626f7c8895a0a8a19e9fa2aa9c8f8275685e5246392d20150a0000000000000000000000000000000613202d394653606c7985929eabada1978a7d70655b50443f393834383a3e444c56606b75828f9ba8b1bcafa295887c6f6255493c2f2216090000000000000c1925323f4c5865727f8b98a5aea194887b6e6155483b2e221508000000000000000000000713202d3a4653606d798693a0aca89b8e827568544a3f33281c0f03000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b000000000000000000030e1a242f3841474c4e4c474c515457595b5d5e5f5f5f5f5e59616d7a85929ea7a89f93877c6f62584e43342a200c0200000000000000000000000000050e171f272f343d43484f54555c606366686a6b6c6c6c6c6b6a686664615e5653514b443f38302a21191108000000000000000000000006131f2c3845515c6774808d9aa7ada1978a7d7063554b413529170d15212e3b47535f6a7784919eaaaa9c8f8276695e52463a2d20150a00000000000000000006101b242e373f4850575e61696e73777b7e80828484858686858583827f7d79756f6b625f5750483f372d231a0e0400000000000000000000000004111e2b3744515e6a7784919daaab9f928578675c5145382c1f130f0b0c1015222f3b4855626e7b8895a1aea99c8f8376695c504336291d100300000009131c252c33373939393943505d69768390908376695d50433939393937332c251c13090000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000020b141b22272b2d37393943505d69768390908376695d50433939372d2b27221b140b0200000000000000000000000811192a3643505d69768390908376695d5043362a1911080000000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d2013070000000000000000000000000000000000000000000000000000000000000c17232e3846525e6975828f9ca8b2aca095898686868686868686868686868686868686868686868e939ea9b4aa9d9084776b6054443a2f24190d010000000000000000000000000000000000000000000006131f2b37434e5865727f8c99a3aeb7b8ab9f9285796d6053473b3025190e02000000000000000000000000000000000916222f3c4955626f7c8896a0aca8988c7f7265564d41362a1e110500000000000000000000000000000000000000000000000000000914212d3a46535f697884919eaba99c8f8276665b5044382b1f12060000111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c00000000000000000000000000000000000000000000000006131f2c3845515c6774808d9aa7a196919298a29f92867a6e6154473c31261b0f0000000000000000000000000000000916222f3c4955626f7c8897a1adab9e9285796d6053493f342e2b282c2d323b444f59626f7c8995a0acb8afa295887c6f6255493c2f2216090000000000000c1925323f4c5865727f8b98a5aea194887b6e6155483b2e221508000000000000000000000713202d3a4653606d798693a0aca99c8f8376665b5044382b1f120700091623303c4956636f7c8996a2afa4988b7e7165584b3e3225180b00000000000000000008141f2b36414a52585a5954524c474a4c4f50525253534c56616b74818e97a1ada1968d81746a5f54463c3222180e000000000000000000000000000000050d151d232932383d44484b515356595b5d5e5f5f5f5a61646c6c6c6c66635c524739342e261e180f080000000000000000000000000713202d3a4653606d7985929eabab9e9285796d6053463a2f241807131f2b37434e586773808d9aa8ac9f93877b6e6154473c32261b0f0000000000000000000009121c252e363e454d52575f62666a6e71737577787879797978777573706d67636059534d453e362d251b11080000000000000000000000000003101d2a3643505d697683909ca9aea29886796d6053463a2f241f1c17181c1f262f3d495663707c8996a3afa89b8f8275685c4f4235291c0f02000005101b252e373e434646464646505d69768390908376695d504646464646433e372e251b100500000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000a141d262d33373943464646505d69768390908376695d50464646433937332d261d140a0000000000000000000009111a232b3443505d69768390908376695d5043342b231a110900000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d20130700000000000000000000000000000000000000000000000000000000000006111c2a36424d5763707d8a96a1acaa9d9083797979797979797979797979797979797979797979818e9ba7aea2988b7f7265594f4332281e130800000000000000000000000000000000000000000000000815222e3b4754606a7783909dabacababaea2988a7e7164564c41362a1e110500000000000000000000000000000003101c28343f4a546673808c99a8ada196887b6e6155483b3025190e02000000000000000000000000000000000000000000000000000005121e2a36424d576875828f9ba8ab9f9285796c605346392d2013060000111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c0000000000000000000000000000000000000000000000000713202d3a4653606d7985929fab9e918485929fa3998c7f7265584e43372b1c110600000000000000000000000000000c1926323f4c5965727f8c98a9b3a89b8e8175665c5041382d231f1c1f2029323d4854606a7784919daab7afa295887c6f6255493c2f2216090000000000000c1925323f4c5865727f8b98a5aea194887b6e6155483b2e221508000000000000000000000713202d3a4653606d798693a0acab9f9285796c605346392e23180d060a1723303d4a5663707d8996a3b0a4978b7e7164584b3e3125180b0000000000000000000b1724303c47525c646766615e56544e46454045453f49535d68707d8a939da9a59e91847a6d60584e43342a200f0600000000000000000000000000000000030b121821272c323839404546494c4f50514a505b636c7079797979736e63574b3f32231c150c0600000000000000000000000005111e2a36424d5664717d8a97a2ada89a8d8174665c514438281d13070f1b26323c4956626f7c8996a1ada4998c7f7265584e43372b1c1106000000000000000000000a131c242c333b42464d5355575f626466696a6b6b6c6c6c6b6a686663605d55544f47423c332d241b13090000000000000000000000000000020e1b2835414e5b6874818e9ba7b3aa96897c6f63554b40352f2b282223282c3038414e5865727f8c98a5b5ab9a8d8073675a4d4034271a0d0100000a16212c3740494f5353535353535d69768390908376695d5353535353534f4940372c21160a00000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000006111b262f383f444650535353535d69768390908376695d535353535046443f382f261b1106000000000000000006121b232c353d464e576976839090837669574e463d352c231b1206000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000000000000000000000000000000000000000000000000000000000000000e1a25303b4653606c7884919eabaca095897c6f6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6d7a86929facac9f92867a6d6054473d3221160c010000000000000000000000000000000000000000000004101c2834404b55626f7c8895a0a8a19e9fa2aa9c8f8275685e5246392d20150a00000000000000000000000000000006121f2b3844505c6676828f9ca9ab9e918478695f53463a2d1f1408000000000000000000000000000000000000000000000000000000020e1a26313f4c5965727f8c98abaea298887c6f6255483c2f2215090000111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c000000000000000000000000000000000000000000000005111e2a36424d5764717e8a97a2a99a8d80818e9baa9d9083776a5f5347382e23170b00000000000000000000000000020f1b2835424e5b6875818e9ba8b5ab988b7e7165544a3f2f261b12101217202c38434e586673808d99abb5afa295887c6f6255493c2f2216090000000000000c1925323f4c5865727f8b98a5aea194887b6e6155483b2e221508000000000000000000000713202d3a4653606d798693a0acada297887c6f62544a4034281f1612101724313e4a5764717d8a97a4b0a4978a7e7164574b3e3124180b0000000000000000000d1a2633404c58646e74736e6862605853514b464244505b656d7a84919ea5a79e938a7d70675d51463c3222190e00000000000000000000000000000000000001070c161b21272c2e34383a3d3f42444c545c606d727e868686868073665a4d4033271a0a03000000000000000000000000000714202d3a46525e6975828f9ca9aca096897c6f63544a403428160c010a13202d394653606c7884919eabab9d9084776a5f5347382e23170c00000000000000000000010a121a212930363c4247484e5355585a5c5d5e5f5f5f5f5e5d5b595653514b48433d37312a211b1209010000000000000000000000000000000c1925323f4c5865727f8b98a7b1a6998c8073675d5145403938332d2e34383a4149535f6a76828f9ca9afa4998a7e7164574b3e3124180b0000000f1b27333e49525a5f60606060606069768390908376696060606060605f5a52493e33271b0f00000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000b17222d38414950535d6060606060697683909083766960606060605d53504941382d22170b000000000000020a1117242d363e474f585f69768390908376695f584f473e362d2417110a0200000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d2013070000000000000000000000000000000000000000000000000000000000000009141f2b3844505b66727f8c99a3aea79a8d8174675c606060606060606060606060605765717e8b98a2aea79b8e8174685d5245392c201304000000000000000000000000000000000000000000000006131f2c3845515c6774808d9aa7a196919298a29f92867a6e6154473c31261b0f0000000000000000000000000000000713202d3a4653606d7985929faba89b8e827568574d42362a1e0d0200000000000000000000000000000000000000000000000000000000091623303c4956636f7c8999a3aeaa988b7e7265584b3f322518070000111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c00000000000000000000000000000000000000000000000714202d3a46525e6976828f9ca9a297897d7d8a98a2a095887c6f62544a3f34281c100300000000000000000000000005111d2a36414c566a7784909daaafa499887c6f6255483c2e22140a04060e1b27323d495663707c8999a4afafa295887c6f6255493c2f2216090000000000000c1925323f4c5865727f8b98a5aea194887b6e6155483b2e221508000000000000000000000713202d3a4653606d798693a0acb3a9998c7f73665c51443b3128201f1c1f25323f4c5865727f8b98a5b0a3968a7d7063574a3d3024170a0000000000000000010e1b2734414e5a6774807f7a756f6a64605c55524d505a606c77828f96a1a9a0958e81756b61554c41342a2010070000000000000000000000000000000000000000040a0f161b1d23282c2d343d454d565d666d747f87929892857b6e6154473b2e21140800000000000000000000000000000814212e3b4754616e7b86929facaa9e9184776b605442392e2318040005121f2b3744505b6574808d9aa9aca095887c6f62544a3f34281c10030000000000000000000000080f171f252a31373a3c4247484b4d4f51515253535252504f4c4a4745403938322b2620180f0900000000000000000000000000000000000815222f3b4855626e7b88959fabab9e9185796d605a514b46443f42424045464c525b656e7b87939facac9f93867a6e6154473b2e211408000000121e2b37434f5a646c6c6c6c6c6c6c6c7683909083766c6c6c6c6c6c6c6c645a4f43372b1e1200000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000030f1b27333f49535b606a6c6c6c6c6c6c7683909083766c6c6c6c6c6c6a605b53493f33271b0f0300000000020b141b2227363f485059606a6f7b859191857b6f6a605950483f3627221b140b02000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d20130700000000000000000000000000000000000000000000000000000000000000030f1c28333f4a54616e7a86929facab9f9285796d60535353535353535353535353535f697683909caaaca095897c6f63564c4135291d110400000000000000000000000000000000000000000000000713202d3a4653606d7985929fab9e918485929fa3998c7f7265584e43372b1c110600000000000000000000000000000916222f3c4955626f7c8898a2aeab988c7f7265594c3f31261a0e02000000000000000000000000000000000000000000000000000000000714202d3a4753606d7986929faca79b8e8174685b4e412e23180c0000111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c00000000000000000000000000000000000000000000000814212e3b4754616e7b87939fab9e9285797985929fa79a8d8073665c5044382b1f13070000000000000000000000000713202d3946525e687985929facac9f93867a6d6053473a2d20140700000a14202d3a4753606d7a86939facafa295887c6f6255493c2f2216090000000000000c1925323f4c5865727f8b98a5aea194887b6e6155483b2e221508000000000000000000000713202d3a4653606d798693a0acb8ab9e9184796d60574d433a322d2c282b2d36414c566774808d9aa7b3aa95897c6f6256493c2f2316090000000000000000020f1c2935424f5c6875828c86817c76716d67615e5759616c727f8c949ea9a2979083796d60594f433a2f22190e0000000000000000000000000000000000000000000000040b0c151d2328363e464f575f686d78818c939993877d70695e52463a2d2014070000000000000000000000000007131f2c38434f5966727f8c99a3afa7998c807366594f4330271c120700030f1b27333f495363707c8997a1ada79a8d8074665c5044382c1f1206000000000000000000000000050d141a1f262b2e31373a3b3e4042444545464646454442403d3a38352f2c27211a150e060000000000000000000000000000000000000814212e3a47535f6a7683909da6ada1978c80736c605c5553504a4e4f4b5153565d616c77828f99a4afa69c8f8276685e5246392d20140700000013202d3946535f6c767979797979797979839090837979797979797979766c5f5346392d201300000000000000000000101d2a3643505d69768390908376695d5043362a1d0a0000000000000000000005121f2b3744505b656c76797979797979798390908379797979797979766c655b5044372b1f1205000000000a141d262d334048505a616b6f7c8591979791857c6f6b615a504840332d261d140a000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d20130700000000000000000000000000000000000000000000000000000000000000000b17222d3846525e6875828e9ba8ada2978a7e7164574d42464646464646463f4a54626e7b88949fabaa9d9084776b6054443a2f24190d010000000000000000000000000000000000000000000005111e2a36424d5764717e8a97a2a99a8d80818e9baa9d9083776a5f5347382e23170b00000000000000000000000000000c1825323f4b5865727e8b98aaaea399897c6f6356493c30231609000000000000000000000000000000000000000000000000000000000006131f2c3845515c677784919eaaa99c90837669554b4034281c100400111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c0000000000000000000000000000000000000000000007131f2c38434f5966727f8c99a4aa9b8e817475818e9baa9e9184796d6053463a2f24180d0100000000000000000000000714212e3a4754616d7a8798a2aeab9e918478675c5145382c1f1306000006131f2c3945515d677784919eaaafa295887c6f6255493c2f2216090000000000000c1925323f4c5865727f8b98a5aea194887b6e6155483b2e221508000000000000000000000713202d3a4653606d798693a0acb9ada1968b7e71695e554c443e3a383437393e46525e687683909ca9aea298877a6e6154473b2e2114080000000000000000020f1c2935424f5c6875828f928e89837e79736e6963606b707e88939fa6a39992857b6e675d51473e31281e10070000000000000000000000000000000000000000000000060e161e272e344048505960696e7a828e939f948c7f736b60574d42362a1e1105000000000000000000000000000915222f3b4854606b7784919d9f9f9f95887b6e6255483d3222150b0000000b17222d3a4653606d7985929e9f9f9e9185796d6053463a2d2013070000000000000000000000000002090e151a1e21262b2e2f31333637383839393938373533302d2c29241d1b160e09030000000000000000000000000000000000000006121e2b37424e5764707d8a949fa9a99c928b7e746d6762605b545b5b555c6062686d75808d949eaba99e94897d7063564c41362a1e110500000013202d394653606c798686868686868686909494908686868686868686796c605346392d2013000000000000000000020b142a3643505d69768390908376695d504331261a0b020000000000000000000613202d394653606c798386868686868686909494908686868686868683796c605346392d20130600000006111b262f383f44515a626c707d8591938e8e9391857d706c625a51443f382f261b11060000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000000000000000000000000000000000000000000000000000000000000000006111c2a36414c5663707d8996a0aca99c8f8276695e5246382d393939393844505c6673808d99a6aea2988b7f7265594f4332281e130800000000000000000000000000000000000000000000000714202d3a46525e6976828f9ca9a297897d7d8a98a2a095887c6f62544a3f34281c1003000000000000000000000000020e1b2835414e5b6874818e9ba7ac9f9286796d6053473a2d201407000000000000000000000000000000000000000000000000000000000004101c2934404b556976828f9ca9ab9e918478675c5145382c1f130600111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c000000000000000000000000000000000000000000000915222f3b4854606b7784919eaba2988a7d70707d8a98a2a197897d7063554b4135291d110400000000000000000000000915222f3c4855626f7b8895aab4a99d9083766a554b4034291c1004000004101d2935404b556976828f9ca9afa295887c6f6255493c2f2216090000000000000c1925323f4c5865727f8b98a5aea194887b6e6155483b2e221508000000000000000000000713202d3a4653606d798693a0acb1a8a09d92857b6e675e56504846443f4446484f58616d7a86929facab9f928578695e52463a2d2014070000000000000000020f1c2935424f5c6875828f999b95908b85807b756f6b6f7d86929aa4a49f92877d70695f554b41352c1f160c0000000000000000000000000000000000000000000000070f18202830394045525a616b6f7b838f949d968f82776c60594f453b30251a0e0200000000000000000000000000091623303c4956636f7c8996939393939083776a5f53473a2e21140300000006121f2b3844505c6674818e93939393978a7d7063574a3d3024170a00000000000000000000000000000003090e12151a1e21222527292a2b2c2c2c2c2b2a282623201f1d18120f0a04000000000000000000000000000000000000000000020e1a26313c4955616c76828f97a1aaa49f93888079736f6c6669686869676d6f747a818d929ca6aaa1978f82766b6055443b3025190e0200000013202d394653606c798693939393939393969696969393939393939386796c605346392d20130000000000000000000a141d2b37434e586976839090837669584e43372b1d140a00000000000000000005121f2b3744505b656f7c899393939393939c9f9f9c939393939393897c6f655b5044372b1f12050000000b17222d384149505b636c717e8692928c81818c9292867e716c635b504941382d22170b0000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d2013070000000000000000000000000000000000000000000000000000000000000000000d1925303b4854606b7784919daaac9f93877b6e6153493f33272d2d2d3a4653606d7984919eabac9f92867a6d6054473d3221160c0100000000000000000000000000000000000000000000000814212e3b4754616e7b87939fab9e9285797985929fa79a8d8073665c5044382b1f130700000000000000000000000004101c2934404b55697683909ca9aa9e918477675c5145382c1f13060000000000000000000000000000000000000000000000000000000000000c18232f414e5b6774818e9aa7ac9f9386796d6053463a2d20130700111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c00000000000000000000000000000000000000000004101d2935404b55636f7c8996a0ab9f9285796d6d7985929fa99b8e8175675d5145392c20140900000000000000000000000a1623303d495663707c8996a3afa89c8f8275695c4f422f23180c000000000c18242f414e5a6774818d9aa7afa295887c6f6255493c2f2216090000000000000c1925323f4c5865727f8b98a5aea194887b6e6155483b2e221508000000000000000000000713202d3a4653606d798693a0acaca09591959082796d68615a5553504a50535459616a73808c99a3afa99c8f827669564d42362a1e11050000000000000000000d1a2633404d59667380878c91979c97928c86827c777c859298a2a49a938b7f726b60574d433a2f231a0d0400000000000000000000000000000000000000000000071019212a323a434b515b636c717d8591959f9991847a6d655b50473d33291f140900000000000000000000000000000e1b2834414e5b677481868686868686867f7265574e42372b1e120600000003101c28343f4a5463707d868686868686868175685b4f4235281c0f00000000000000000000000000000000000206090e121415181a1c1e1e1f20201f1f1d1c19171413100c07010000000000000000000000000000000000000000000000000915202d3944505a616e7b859298a1a9a49a938d85807b79767575757677797c81858e939ca4a9a19892857b6e61594f4432291e14080000000013202d394653606c798693928d8989898989898989898989898d929386796c605346392d2013000000000000000006111b262f3847535f6a7683909083766a5f53473d2f261b11060000000000000000030f1b27333f4953606b75828f99a39f9f9fa9ababa99f9f9fa3998f82756b6053493f33271b0f030000030f1b27333f49535b606d737e8792928b807474808b9292877e736d605b53493f33271b0f0300000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d20130700000000000000000000000000000000000000000000000000000000000000000008141e2c38444f5965727f8c98a3aea4998c7f73655b5044372b1f2a36414c5663707d8a97a1ada79b8e8174685d5245392c201304000000000000000000000000000000000000000000000007131f2c38434f5966727f8c99a4aa9b8e817475818e9baa9e9184796d6053463a2f24180d01000000000000000000000006131f2c3845515c677885919eaba99c8f827669554b4034291c1004000000000000000000000000000000000000000000000000000000000000071926333f4c5966727f8c99a5afa49a887b6e6255483b2f22150800111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c0000000000000000000000000000000000000000000613202c3945515d6774818e9aa8aa9b8e8175676775818e9baa9f92867a6d6054473b31251a0e02000000000000000000000a1724313d4a5764707d8a97a3b0a89b8e8175685b4e4235281b0700000000071a2633404d596673808c99a6afa295887c6f6255493c2f2216090000000000000c1925323f4c5865727f8b98a5aea194887b6e6155483b2e221508080400000000000000000713202d3a4653606d798693a0acaa9d9184919590837a716c6662605c545b6061646b707c87929fabb0a6998c7f7266594c3f3025190e020000000000000000000c1926323f4b57636e737b80858a90949a99928e8984869297a2a49a93887f726d62594f453b3128221c140b020000000000000000000000000000000000000000040f19222b333c444c555c606d737e869297a09f92877c6f685d53493f352b20170d0200000000000000000000000000000d1a2733404c59646f7479797979797979726d6256453c31261a0e02000000000b17232e384855616b7079797979797979756f65594d4034271b0e0000000000000000000000000000000000000000020608080b0d0f11121213131312110f0d0a07060400000000000000000000000000000000000000000000000000000003101c28333e46525e696f7c8692979fa6a49f97918c888583828182828386898d92989ea5a69f9792867c6f695e52473d3320170d020000000013202d394653606c7986938d807d7d7d7d7d7d7d7d7d7d7d7d808d9386796c605346392d201300000000000000000b17222d38414f59626f7c879292877c6f62594f41382d22170b0000000000000000000b17222d38414f59616e7b86929fa9b3acb6b7b7b6acb3a99f92867b6e61594f41382d22170b00000005121f2b3744505b656c747f8b9292877e736d6d737e8792928b7f746c655b5044372b1f120500000b1825323e4b5865717e8b98a4aca295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d20130700000000000000000000000000000000000000000000000000000000000000000002101c27333d4754616d7a86929facab9e9184786c6053463a2f242d3946525e6875828f9ba9aca095897c6f63564c4135291d110400000000000000000000000000000000000000000000000915222f3b4854606b7784919eaba2988a7d70707d8a98a2a197897d7063554b4135291d110400000000000000000000000714202d3a4753606d7a86939faca79a8e8174675b4e412f23180c000000000000000000000000000000000000000000000000000000000000000b1824313e4b5764717e8a97a4b6ac96897d7063564a3d3023170a00111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c0000000000000000000000000000000000000000000714202d3a4753606d7a85929faca3988a7d716464707d8a98a2a2988b7e7165574d42362a1e1205000000000000000000000b1724313e4a5764717d8a97a4b0a79a8d8174675a4e4134271b0e010000000c1926323f4c5965727f8c98a5afa295887c6f6255493c2f2216090000000000050c1925323f4c5865727f8b98a5aea194887b6e6155483b2e22171614100b050000000000000713202d3a4653606d798693a0aca4978a7e85929590847e77726f6d666b656c6e71767d859299a3aeac9f94887b6e6155483b2e221509000000000000000000000a17232f3b47525c63696e73797e83888d92989b95909298a2a99f93887f726d625b514c47433c332d261d140a00000000000000000000000000000000000000000a16212b343d454d565e676d757f8a9298a19e938b7f726a60564c41382d23190e050000000000000000000000000000000b1824303c48535d64676c6c6c6c6c6c6c65625b5146332a201509000000000006111c2c38444f5961636c6c6c6c6c6c6c68655d53483d3125180c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b17222a36424d57606a6f7c858f949ea1a8a19e999892908f8e8e8f9092999a9fa2a8a09e948f857c6f6a60564d42352c210e05000000000013202d394653606c7986938b7e7270707070707070707070727e8b9386796c605346392d201300000000000000030f1b27333f4953606b75828f99998f82756b6053493f33271d1207000000000000000006111b262f3d46535f6974808d97a2adbac3c4c4c3b9ada2978d8073695f53473d2f261b11060000000613202d394653606c77808c9192867d716c63636c717d8692918c80776c605346392d20130600000b1825323e4b5865717e8b989f9f9f95897c6f6256493c2f23160900000d1a2733404d5a6673808d999f9f9f9386796d6053463a2d201307000000000000000000000000000000000000000000000000000000000000000000000b16202d3946525d6875818e9ba7aca096897c7063554b4135292e3a4754616d7a86929facaa9d9084776b6054443a2f24190d010000000000000000000000000000000000000000000004101d2935404b55636f7c8996a0ab9f9285796d6d7985929fa99b8e8175675d5145392c20140900000000000000000000000815222f3b4855626e7b889aa4afa5998c7f7266594c3f3326190700000000000000000000000000000000000000000000000000000000000000091623303c4956636f7c8996a2afa4978b7e7164584b3e3125180b00111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c000000000000000000000000000000000000000005121e2a36424d5764717e8b98a2ac9f92867a6d60606d7985929faa9c8f8376695e53463a2d21160a000000000000000000000b1824313e4b5764717e8a97a4b1a79a8d8174675a4e4134271b0e010000000c1825323f4b5865727e8b98a5afa295887c6f6255493c2f221609000000000810171c25323f4c5865727f8b98a5aea194887b6e6155483b2e262423201c17100800000000000713202d3a4653606d798693a0aca4978a7e7e8b9296918a837f7b79787778797b7e828a9297a2abafa49a8f8276695f53473a2d2114080000000000000000000007131f2a35404a52575e61666d71767c81869196a09d9fa2aaa6998c8075706b65605d55534e443f382f261c1106000000000000000000000000000000000000030f1b27323d464e575f686d79818c929fa3a0958e81756d62584e443a2f261b1108000000000000000000000000000000000814202b36414a53595b60606060606060595651493f3521180e03000000000000101c28333e474f5557606060606060605b59534b41372c2014080000000000000000000000000000000000000000000000000406070a0d0f11121313131212100e0c0906060300000000000000000000000000000000000000000000000000050e1a25303b454e58606a6f7b828b91969c9fa3aaa29f9d9c9b9b9c9d9fa3aba39f9b96918a827b6f6a60584e443b30231a0f00000000000013202d394653606c7986938b7e7265636363636363636365727e8b9386796c605346392d2013000000000000010c161f2b3744505b65707d89949e9e94897d70655b5044392e23180c0100000000000000000a141d2b37424d57606d7a85929fa8b2bdc8c8bdb2a89e92857a6d60574d42352b1d140a000000020f1b2835424e5b6875818d9292857c706b625a5a626b707c8592928d8175685b4e4235281b0f02000b1825323e4b5865717e8b9393939393897c6f6256493c2f2316110b0b101a2733404d5a6673808d939393939386796d6053463a2d2013070000000000000000000000000000000000000000000000000000000000000000000005111d2935414c56636f7c8995a0aca89b8e8174675d5145392c37434e5865727f8b99a3aea2988b7f7265594f4332281e130800000000000000000000000000000000000000000000000613202c3945515d6774818e9aa8aa9b8e8175676775818e9baa9f92867a6d6054473b31251a0e02000000000000000000000a1724303d4a5763707d8a96acb6a4978a7e7164574b3e3124180b000000000000000000000000000000000000000000000000000000000000000916222f3c4955626f7c8895a2afa5988b7e7265584b3f3225180c00111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c00000000000000000000000000000000000000000714212d3a46535f6976838f9caaaa9b8f8275675d5d6775828e9baa9f93877b6e6154483d32271b0f000000000000000000000b1825313e4b5864717e8b97a4b1a79a8d8074675a4d4134271a0e010000000b1825323e4b5865717e8b98a4afa295887c6f6255493c2f22160900000008121a22282d323f4c5865727f8b98a5aea194887b6e6155483b333331302d28221a1108000000000713202d3a4653606d798693a0aca4978b7e74818e949e95908c888685848585878b8f949fa2a9aea59f93877c6f62574d42372b1e120600000000000000000000020e19242e3840454d52545c60646a6f747b84919eaba39f9da09f9287827d77726d67625f58504a42382d22170b00000000000000000000000000000000000007131f2c38434e5860696e7a828e939ca4a2989183796d605b51463d32281d140a0000000000000000000000000000000000030f1a252f3841484c4e535353535353534c4a463f372d230f06000000000000000b16212c353e44484a535353535353534f4d4841392f251a0f0400000000000000000000000000000000000000000001070c10131416191c1d1f1f20201f1e1d1b191613120f0b0600000000000000000000000000000000000000000000000009141f29333d464e5860696e767e848a8f9299999b9d9e9f9f9f9f9e9d9b9999928f8a847e766e6960584e463d32291f110800000000000013202d394653606c7986938b7e7265585656565656565865727e8b9386796c605346392d201300000000000008131e2834404b54606c7883909da6a69d9083786c60544b4034281e13080000000000000000020b1a26313c45525d68727f8c96a0acb9c2c7b8aca0968b7f72685d52453b3123190b02000000000b1724313e4a5764717e869293877f746d665d5d666d747f879392867e7064574a3d3124170a00000b1825323e4b5865717e868686868686867c6f6256493c2f23221d16161b202733404d5a66738086868686868686786d6053463a2d20130700000000000000000000000000000000000000000000000000000000000000000000010d1924303a4854606b7783909daaac9f92857a6d6054473c313b4754606a7783909dabac9f92867a6d6054473d3221160c0100000000000000000000000000000000000000000000000714202d3a4753606d7a85929faca3988a7d716464707d8a98a2a2988b7e7165574d42362a1e1205000000000000000000000b1825313e4b5864717e8b97a4afa296897c6f6356493c30231609000000000000000000000000000000000000000000000000000000000000000815222f3b4855626e7b8895a1aea5988c7f7265594c3f3226190c00111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c00000000000000000000000000000000000000030f1c28333f4a54616e7b87939faca2988a7e7164555564717e8a98a3a49a8c7f7366584e43372b1d12070000000000000000000b1824313e4b5764717e8a97a4b1a79a8d8174675a4e4134271b0e010000000b1825323e4b5865717e8b98a4afa295887c6f6255493c2f221609000005101a242c33393c3f4c5865727f8b98a5aea194887b6e6155484040403d3c39332c231a10050000000713202d3a4653606d798693a0aca5988b7e7278828e939f9d999a939291919298979c9fa6adaba39f938d80736a6054453c31261a0e0200000000000000000000030e18212a31373e434b51575e666c727c849196a1a0999290959b99928f89847f7a746f6a605b544a3f33281c0f0300000000000000000000000000000000000915222e3b4854606a6f7b8490949ea5a49f92867c6e675d51493f342b20160b0200000000000000000000000000000000000008131d262f363c4041464646464646463f3e3a352d251b11000000000000000005101a232c33383c3d4646464646464642403d372f271e13090000000000000000000000000000000000000000040a0f12181c1f202326282a2b2c2c2c2c2b2a282523201f1c17110f0a03000000000000000000000000000000000000000000020d17212b343d464e565e616c71787e82868a8c8f90919292929291908e8c8986827d78716c615e574e463d342b20170d0000000000000013202d394653606c7986938b7e7265584b4a4a4a4a4b5865727e8b9386796c605346392d20130000000000010d19242f3845515c66717e8a959fabab9f958a7e71665c51453a2f24190d02000000000000000009141f2935414c56606d7984919ea6b0bebeb0a69e9184796d60564c41332a1f100700000000000a1623303c4955616c717d8692938c80786d67676d78808c9392867d706c6155493c3023160a00000b1724313d4a56626c71797979797979796f6a6054473b36332e272021272c2f303f4b58636e737979797979797976665c5044382c1f1206000000000000000000000000000000000000000000000000000000000000000000000008131e2c38434f5965727f8b98a2aea2988b7e7165574d4237404b55626f7c8895a0aca79b8e8174685d5245392c201304000000000000000000000000000000000000000000000005121e2a36424d5764717e8b98a2ac9f92867a6d60606d7985929faa9c8f8376695e53463a2d21160a000000000000000000000c1825323f4b5865727e8b98a5afa295887c6f6255493c2f221609000000000000000000000000000000000000000000000000000000000000000815212e3b4854616e7b8794a1aea6998c7f7366594c403326190d00111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c0000000000000000000000000000000000000006121f2b3844505b6673808c9aa4ac9f92867a6d605454606d7a86929fac9d9184776a605447392e23180c0000000000000000000b1724313e4a5764717d8a97a4b0a79a8d8174675a4e4134271b0e010000000c1825323f4b5865727e8b98a5afa295887c6f6255493c2f22160900000c17222c363e45494a4d5865727f8b98a5aea194887b6e61554d4d4d4d4a49443e362c22170b0000000713202d3a4653606d798693a0aca5988b7f726d78818b92989fa29f9e9e9e9fa3aaa9a9aaa29f99928b81786d60584e43332a1f1509000000000000000000000009151f2a333c42474f555c60696e787f879196a09f95918684898e92989b95918b85817c766c665b5044382b1f120600000000000000000000000000000000000916232f3c4956626f7c85919693939393928a7e716a5f554b40372d22190e0400000000000000000000000000000000000000010b141d252b3033343939393939393932312e29231b130900000000000000000008111a21282c2f30393939393939393534312c251e150c02000000000000000000000000000000000000040a0f161b1d23292c2d303335373839393939383635322f2d2b28221c1b150e09030000000000000000000000000000000000000000050f19222b343c444d525a61666d71757a7d80828385858686858483827f7d7a75716d66615a524d453d342b22190e050000000000000013202d394653606c7986938b7e7265584b3f3d3d3f4b5865727e8b9386796c605346392d2013000000000004111d2935414c56606d7984919ea7b1b1a79e9184796d60564c4135291f14090000000000000000030d1924303a44515c66707d8a949facb6b6ac9f948a7d70665c51443a3021180e0000000000000814212d3944505a616b707c8591928d82796e6e79828e9291857c706b615a5044392d20140800000915212e3a45505a62656c6c6c6c6c6c6c6260584e4344433f3932292b32383b3d4647525c63666c6c6c6c6c6c6c6c5c544a3f34281c10030000000000000000000000000000000000000000000000000000000000000000000000020f1b27323d4754606d7a86929facaa9c908376695f53473845515c6774808d9aa7aca095897c6f63564c4135291d110400000000000000000000000000000000000000000000000714212d3a46535f6976838f9caaaa9b8f8275675d5d6775828e9baa9f93877b6e6154483d32271b0f000000000000000000000c1926323f4c5965727f8c98a5aea195887b6e6255483b2f221508000000000000000000000000000000000000000000000000000000000000000714212e3a4754616d7a8794a0ada6998d8073665a4d4033271a0d00111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c000000000000000000000000000000000000000613202d394653606c7884919eaca99b8e8175675d51515d6775828f9caba096897c6f62544b4034281c100400000000000000000a1724303d4a5763707d8a96a3b0a89b8e8175685b4e4235281b07000000000c1926323f4c5965727f8c98a5afa295887c6f6255493c2f2216090005111c28333e48505557595965727f8b98a5aea194887b6e615959595959575550483e33281c100400000713202d3a4653606d798693a0aca5998c7f72666d757f868d92989a9c9e9e9f9f9e9d9c9998928d867f746d665c50463d3221180e0300000000000000000000020e1a26313c454d535961676d727b828c92999f99928d837c777c81868c91969c98928d8882786c605346392d20130600000000000000000000000000000000000d1a2633404d59667380868686868686868680746c61574e43392f251b1007000000000000000000000000000000000000000000020b131a202427282d2d2d2d2d2d2d2625221e18110901000000000000000000000810161c2023242d2d2d2d2d2d2d282725201a130c03000000000000000000000000000000000000060b151b21272c2f34383a3d40424445464646454543413f3c3938332d2b26201a150b060000000000000000000000000000000000000000071019222b323b424650545c6064676d70737577787979797878767573706d6764605c545046423b332b22191007000000000000000013202d394653606c7986938b7e7265584b3f3d3d3f4b5865727e8b9386796c605346392d201300000000040e18222c3945525d68727f8b96a0acb9b9aca0968b7f72685d52453b30251a0e04000000000000000008131e2834404a54616c7682909aa4afafa49a9082766c61544a4032281e0f0600000000000004101c28333e485059606a6f7b8490948f837a7a838f9490847b6f6a605950483e33281c1004000005111d29343f485056586060606060606056544e5353514f4a443b32353d44484953535352585a606060606060605f504a42382e23170c000000000000000000000000000000000000000000000000000000000000000000000000000a16202c3945515d6774818e9aa7ab9f94887b6e62544a3f4653606d7985929fabaa9d9084776b6054443a3024190d0100000000000000000000000000000000000000000000030f1c28333f4a54616e7b87939faca2988a7e7164555564717e8a98a3a49a8c7f7366584e43372b1d12070000000000000000000d192633404c5966737f8c99a6aea194877b6e6154483b2e211508000000000000000000000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0ada79a8d8074675a4d4134271a0e00111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c00000000000000000000000000000000000004111d2935414c5663707d8996a1aca1978a7d7063554b4b5564717e8b99a3a89a8d8174665c5145382c1f130800000000000000000916232f3c4956626f7c8995acb6a89c8f8275695c4f422e23180c000000000d1a2633404d596673808c99a6afa295887c6f6255493c2f221609000814212d3945505a6164666666727f8b98a5aea194887b6e66666666666664615a5044392d20140800000713202d3a4653606d798693a0aca6998c7f7366606d727b80858a8d8f9192929291908f8c8985807b726d605c544a3f342b200f06000000000000000000000006121e2b37424d575f616b70797f868f949f9d948f8780796f6a6f747a7f84898f93999a9486796d6053463a2d20130700000000000000000000000000000000000c1925323f4b57636d737979797979797979746e645a50453c31281d1209000000000000000000000000000000000000000000000001080f14181a1b20202020202020191816120d0700000000000000000000000000050b10141617202020202020201c1b18140f09020000000000000000000000000000000000020a111720262b323839404547494c4f50525253535251504e4c4946443f3837312b262017110a0200000000000000000000000000000000000000071019202930363e424a5053555d606366686a6b6c6c6c6c6b6a686663605d5553504a423e3630292119100700000000000000000013202d394653606c7986938b7e7265584b4a4a4a4a4b5865727e8b9386796c605346392d2013000000000a15202a36424d57606d7a85929ea8b2bdbdb2a89e92857a6d60574d42362a20150a0000000000000000020c18232e3942505a626f7c87939faaaa9f93877c6f625a5042392e20160c00000000000000000b17222c363e474f585f696e7a839094908484909490837a6e695f584f473e362c22170b000000010c18222d363f454a4b5353534c525f6060606060605d5b554d44393d474f54566060606060605a58535353535353443f3830261c11060000000000000000000000000000000000000000000000000000000000000000000000000004111d2935414c55626f7c88959faba6998d8073665c50444d5764717e8a97a2ada2988b7f7265594f4332281e1308000000000000000000000000000000000000000000000006121f2b3844505b6673808c9aa4ac9f92867a6d605454606d7a86929fac9d9184776a605447392e23180c0000000000000000000d1a2734404d5a6773808d9aa6ada094877a6d6154473a2e211407000000000000000000000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0ada79a8d8074675a4d4134271a0e00111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c0000000000000000000000000000000000000613202c3945525d6875818e9ba8ab9e9285796d6053464754616d7a86929fab9e9285796d6053463a3025190d01000000000000000815222e3b4855616e7b889aa4afa99d9083766a554b4034281c10040000010e1b2834414e5b6774818e9aa7afa295887c6f6255493c2f221609000a1723303c4955616c71737373737f8b98a5aea194887b73737373737373706c6155493c3023160a00000713202d3a4653606d798693a0aca6998d8073665b62686e74797d808284858685858482807d7a746e69625b504a42382e22190f0000000000000000000000000814212d3a47535f696e757d848c92989395908a827c736d676062686d72787d82878d929786796d6053463a2d20130700000000000000000000000000000000000a16232f3b47525b63666c6c6c6c6c6c6c6c67645c52483e332a1f160c000000000000000000000000000000000000000000000000000003080b0d0e131313131313130c0b090601000000000000000000000000000000000407090a131313131313130f0e0c0804000000000000000000000000000000000000040b141c222832373d43484b515356595b5d5e5f5f5f5f5e5d5b585653504a47433c373127221b140b0300000000000000000000000000000000000000070e171f252a30383f44464c515457595c5d5e5f5f5f5f5e5d5b595653514b46443f38302a251f170f070000000000000000000013202d394653606c7986938b7e7265585757575757575865727e8b9386796c605346392d2013000000020b1b26313a46525e6973808d97a1adbac4c4b9ada1978d8073695e52463c31261b0b02000000000000000007121c27303e4754606a75818e98a2a2988e81756a6054483e30271c0e04000000000000000005101a242c353d464e575f686e7a828f949191948f827a6e685f574e463d352c241a10050000000006111b242d343a3d3e46414c565e6c6c6c6c6c6c6c6a675f554a3f444f5960636c6c6c6c6c6c67645c534846464638342e261e150a0000000000000000000000000000000000000000000000000000000000000000000000000000010d19242f3a47545f6a7783909da9ab9e9184796d605346525e6976828f9ca9ac9f92867a6d6054473d3221160c0200000000000000000000000000000000000000000000000613202d394653606c7884919eaca99b8e8175675d51515d6775828f9caba096897c6f62544b4034281c100400000000000000000e1a2734414d5a6774808d9aa7ada093867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000714212e3a4754616d7a8794a0ada6998d8073665a4d4033271a0d00111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c0000000000000000000000000000000000000714212d3a4754606d7a86929faca89a8d8174665c514446525d6876828f9caba2978a7d7064564c4135291d1105000000000000000714202d3a4753606d7a86939facab9e918478675c5145382c1f1306000004111d2935414c566976828f9ca9afa295887c6f6255493c2f221609000b1724313e4a5764717e80808080828f9ca8b3a79a8d80808080808080807e7064574a3d3124170a00000713202d3a4653606d798693a0aca6998d8073665a565e61666d7073757778797978777673706d67615e5751443f3830261c10070000000000000000000000000815222e3b4855616e7b8286868686868686837d766f6a605c55565d61656c70757b80858a867a6d6053473a2d201407000000000000000000000000000000000007131e2a35404952575960606060606060605a58524a40362c21180d040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040d161d262d333c43474f54555c606366686a6b6c6c6c6c6b69686562605b54534e47423c332d261d150d0300000000000000000000000000000000000000050d14191e262e34383a4145474a4d4f50525253535251504f4c4a4745403a38342e261e1a140d05000000000000000000000013202d394653606c7986938b7e7265646464646464646465727e8b9386796c605346392d20130000000a141d2b37434e58616e7b86929fa9b3becccabeb3a99f92867b6e61584e43372b1d140a0000000000000000000b151e2b37434e58616e7b86929f9f92867b6e61584e43362c1e150b0000000000000000000008121a232b343c454d565e686d79828e93938e82796d685e564d453c342b231a120800000000000009121b22292e31323946525e68767979797979797771675b4f434854606b70797979797979746e64584c4039392c28231c150c0300000000000000000000000000000000000000000000000000000000000000000000000000000008131e2b37434e5865717e8b97a2ada1968a7d7063564c54616e7b87939faca79b8e8174685d5245392c201304000000000000000000000000000000000000000000000004111d2935414c5663707d8996a1aca1978a7d7063554b4b5564717e8b99a3a89a8d8174665c5145382c1f130800000000000000000e1a2734414d5a6774808d9aa7ada093867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000815212e3b4854616e7b8794a1aea6998c7f7366594c403326190d00111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c000000000000000000000000000000000006121f2b37434e5865727e8b98a2aca096897c6f63544a40414c5665727e8b99a4a99b8f8275685e5246392d2015090000000000000006131f2c3845515c677885919eabac9f9286796d6053463a2d20130600000713202c3945525d687884919eabafa295887c6f6255493c2f221609000f1c2835424f5b6875828c8c8c8c8f949eaab5a99d928d8c8c8c8c8c8c8c8174685b4e4135281b0e02000713202d3a4653606d798693a0aca6998d8073665a4d52545c606367696b6b6c6c6b6a696663605d55534d453f342e261e140a000000000000000000000000000814212d3a47535f696e757979797979797976706b625f58514b4c52535b6063696e73797e83796d6053473a2d2014070000000000000000000000000000000000020d19242e3740474b4d53535353535353534d4c4740382f241a0f06000000000000000000000000000000000000000000000000000000000000000000000000000000000000010406070a0d10111213131211100d0a07060400000000030505060606060606000000000000000000000000000000000000030c161f282f383f444e54596063676d707375777879797978787674726f6c66625f58534d443f382f271f150d030000000000000000000000000000000000000002090c151c23282c2f35393a3d4042444546464645454342403d3a39352f2b28231c140c090200000000000000000000000013202d394653606c7986938b7e7270707070707070707070727e8b9386796c605346392d2013000006111b262f3847535f6a74818e98a2aebbb9b9b9b9baaea2988e81746a5f53473d2f261b11060000000000000000030c1b27323c46525e6973808d97978c8073695e52463c32241a0c030000000000000000000000081119222a333c444d565d676d78818d8d81786d675d564d443c332a2219110800000000000000000911181d21212e3b4754616e7a86868686868683776a5d5144495663707d8686868686868074675a4e4134271f1c17110a0300000000000000000000000000000000000000000000000000000000000000000000000000000000010f1b26323c4753606d7985929faba99b8e8275685d525966737f8c99a4aca095897c6f63564c4135291d110400000000000000000000000000000000000000000000000613202c3945525d6875818e9ba8ab9e9285796d6053464754616d7a86929fab9e9285796d6053463a3025190d01000000000000000d1a2734404d5a6773808d9aa6ada094877a6d6154473a2e211407000000000000000000000000000000000000000000000000000000000000000815222f3b4855626e7b8895a1aea5988c7f7265594c3f3226190c00111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c00000000000000000000000000000000000814212e3a47535f6a7683909daaaa9e9184776b605442393b4754616e7b86939fac9f92867a6d6154473c31261a0e0000000000000004101c2934404b55697683909ca9afa399887b6f6255483c2e23170b00010714212d3a4754606d7a8796a1acafa295887c6f6255493c2f221609000f1c2835424f5b6875828e9999999c9ea6b0b9aea49d9a9999999999998e8174685b4e4135281b0e02000713202d3a4653606d798693a0aca6998d8073665a4d464b5153575a5c5e5f5f5f5e5d5c595654514b46423b3328231c140c020000000000000000000000000006121e2b37424d575f61696c6c6c6c6c6c6c6a636159534e45404146495053575e61666d71766d675d5145392c1f130600000000000000000000000000000000000007121c252e353b3f404646464646464646413f3c362f261d1208000000000000000000000000000000000000000000000000000000000000000000000000000000000001080d111314171a1d1e1f1f201f1e1c1a171413100c07010c0f11121313131313130909070300000000000000000000000000000b151e283139424a50585f626b6f75797d7f828385858686858483817f7c79746f6a625f575049413931271f150b010000000000000000000000000000000000000000030a11171c1f24292c2d30333537383939393938373533302d2c29241f1c17110a02000000000000000000000000000013202d394653606c7986938d807d7d7d7d7d7d7d7d7d7d7d7d808d9386796c605346392d201300000b17222d38414f59626f7c87939faab4acacacacacacb4aa9f93877c6f62594f41382d22170b0000000000000000000a15202a36424d57606d7a85919185796d60574d42342b20110800000000000000000000000000071019212a323b444c555d666d748080746d665d554c443b322a2118100700000000000000000000060c1114212e3b4754616e7a87939393939084776a5d5144495663707c89939393938d8174675a4e4134271b100c06000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a151f2c3945515d6774808d9aa6ac9f92867a6d6154606b7784919eabaa9d9084776b6054443a3024190d0100000000000000000000000000000000000000000000000714212d3a4754606d7a86929faca89a8d8174665c514446525d6876828f9caba2978a7d7064564c4135291d1105000000000000000d192633404c5966737f8c99a6aea194877b6e6154483b2e211508000000000000000000000000000000000000000000000000000000000000000916222f3c4955626f7c8895a2afa5988b7e7265584b3f3225180c00111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c0000000000000000000000000000000003101c28343f4a54626e7b88959faba7998c807366594f43303946525e687683909ca9a3998b7f7265574d42372b1b1106000000000000000c18232f414d5a6774808d9aa7b5ab988b7e7165544a3f34281c100b0e131c2834404a5464707d8a97a8b2afa295887c6f6255493c2f221609000f1c2835424f5b6875828e9b9f9fa0acaeb5bdb1a9a3a19f9f9f9f9f9b8e8174685b4e4135281b0e02000713202d3a4653606d798693a0aca6998d8073665a4d404045464a4d4f5152535252514f4d4a4745413a3631292117110a020000000000000000000000000000020e1a26313c454d53555c606060606060605d57554f47433c3435383f44464d53545c606469605d554b4035291d1004000000000000000000000000000000000000000a131c242a2f323339393939393939393433302b241d140b0000000000000000000000000000000000000000000000000000000000000000000000000000000003090e13191d20212427292b2b2c2c2c2b292724201f1c18120e181c1e1f2020202020201615130f0a04000000000000000000000007121d273039434b545b606a6f767c8185898c8e90919292929291908e8b8985817c756e69605b534b433931271d120700000000000000000000000000000000000000000000060c1013191d20212426292a2b2c2c2c2c2b2a282623201f1d1812100b060000000000000000000000000000000013202d394653606c798693928d8a8a8a8a8a8a8a8a8a8a8a8a8d929386796c605346392d201300030f1b27333f4953606b76828f99a49f9f9f9f9f9f9f9f9f9fa4998f82756b6053493f33271b0f030000000000000000040e1a25303b45515d67727e8b8b7e71675d51453b3022190f000000000000000000000000000000070f182029323a434b545c606e73736e605c544b433a322920180f07000000000000000000000000010814212e3b4754616e7a87949f9f9d9084776a5d5144495663707c89969f9f9a8d8174675a4e4134271b0e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004101d2935404b55626f7b88949faba3998b7e726557636f7c8996a0aca2988b7f7265594f4332281e1308000000000000000000000000000000000000000000000006121f2b37434e5865727e8b98a2aca096897c6f63544a40414c5665727e8b99a4a99b8f8275685e5246392d201509000000000000000c1926323f4c5965727f8c98a5aea195887b6e6255483b2f22150800000000000000000000000000000000000000000000000000000000000000091623303c4956636f7c8996a2afa4978b7e7164584b3e3125180b00111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c0000000000000000000000000000000006121f2c3844505c6673808d9aa7ab9f95887b6e6255483d3236414d5665727f8c98a7ab9d908376695f5347382d22170b00000000000000071824313e4b5764717e8a97a7b1a79b8e8174665c5044382b221b171a1d242c3844515c6674818d9aa7b4afa295887c6f6255493c2f221609000f1c2835424f5b6875828e939393939fa3abb5a99f98949393939393938e8174685b4e4135281b0e02000713202d3a4653606d798693a0aca6998d8073665a4d4034383a3d404244454646454443403d3a39352f2a251f170f06000000000000000000000000000000000009151f2a333c4247484f53535353535353504a48443e373129292d33373b42464b5153575d53514b43392f24180c0000000000000000000000000000000000000000010a12191e2325262d2d2d2d2d2d2d2d2726241f19130b02000000000000000000000000000000000000000000000000000000000000000000000000000000060e141a1e24292c2d3033363738393939383634302d2c29231d1a24282b2c2d2d2d2d2d2d23221f1b160f07000000000000000000040d18232e39434b555d666c737c83898e9298999b9d9e9f9f9f9f9e9c9b9897918d88827b736c655d554b43392f24180e05000000000000000000000000000000000000000000000003080d111314171a1c1d1f1f20201f1e1d1c19171413100c070300000000000000000000000000000000000013202d394653606c798693939393939393939393939393939393939386796c605346392d20130005121f2b3744505b65707d8994939393939393939393939393939394897d70655b5044372b1f120500000000000000000009141f2935414b55606d788383786d60554b4033291f100700000000000000000000000000000000060e1720283139424a505c636767635c504a4239312820170e0600000000000000000000000000000814212e3b4754616e7a8794a1aa9d9084776a5d5144495663707c8996a3a79a8d8174675a4e4134271b0e010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c18242f3947535f6a7683909ca9ab9d908376695f6774818e9aa8ac9f92867a6d6054473d3221160c0200000000000000000000000000000000000000000000000814212e3a47535f6a7683909daaaa9e9184776b605442393b4754616e7b86939fac9f92867a6d6154473c31261a0e000000000000000c1825323f4b5865727e8b98a5afa295887c6f6255493c2f221609000000000000000000000000000000000000000000000000000000000000000b1824313e4b5764717e8a97a4b6ac96897d7063564a3d3023170a00111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c000000000000000000000000000000000713202d3a4653606d7985919eabab9d908377695f53473a2b303b4854616e7b8795a0ab9f95887b6e6253493f33271b0f030000000000000814212e3b4754616e7b8795a0acab9e9285796d6053463e342b2722262a2f35404b55606d7985929eabb8afa295887c6f6255493c2f221609000f1c2835424f5b68758186868686868b99a3aea3988d88868686868686868174685b4e4135281b0e02000713202d3a4653606d798693a0aca6998d8073665a4d40332c2d3034363838393938373633302d2c29241d1a140d05000000000000000000000000000000000000030e18212a31373a3b4246464646464646433d3c38332b26201b22272b3136394045464b504745403931271d120700000000000000000000000000000000000000000000070d1316191a20202020202020201a1a17130e0801000000000000000000000000000000000000000000000000000000000000000000000000000000070f181f262a2f35393a3d404344454646454443403d3a38342f2a252f3437383939393939392f2e2c272119100700000000000000010c161f2834404b555d676d78808790949b9fa2a9a29e9c9b9a9a9b9d9fa3a9a19e9a948f877f776d675d554b40352920170d02000000000000000000000000000000000000000000000000010406070a0d0f11121313131212100f0d0a07060400000000000000000000000000000000000000000013202d394653606c798686868686868686868686868686868686868686796c605346392d2013000613202d394653606c798386868686868686868686868686868686868683796c605346392d201306000000000000000000030d18242f3a44505c66707d7d70665c50433a2f21170d000000000000000000000000000000000000050d161f2730383f4452585a5a5852443f3830271f160d050000000000000000000000000000000814212e3b4754616e7a8794a1a99d9084776a5d5144495663707c8996a3a79a8d8174675a4e4134271b0e0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007121d2b37434e5864717e8a97a1ab9f95887b6e616d7985929faba79b8e8174685d5245392c201304000000000000000000000000000000000000000000000003101c28343f4a54626e7b88959faba7998c807366594f43303946525e687683909ca9a3998b7f7265574d42372b1b11060000000000000b1825313e4b5864717e8b97a4afa296897c6f6356493c30231609000000000000000000000000000000000000000000000000000000000000000c1926333f4c5966727f8c99a5afa49a887b6e6255483b2f22150800111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c00000000000000000000000000000005111d2a36414c5663707d8a97a1ada3998c7f7265574d42372b2d3a46535e697783909daaa7998d8073655b5044372b1f12070000000000000714202d3a46525e697784909dabada1978a7d70635a50463d37332d31363a4045515d67717e8b97a1adb9afa295887c6f6255493c2f221609000e1b2834414d59656f75797979797987929faca194887b79797979797979746f64594d4034271a0e01000713202d3a4653606d798693a0aca6998d8073665a4d403327202427292b2c2c2c2b2a29262321201d18130e09030000000000000000000000000000000000000000060f181f262b2d2e363939393939393937302f2c28211b1511171b1f252a2e34383a3e433a39352f271f150b01000000000000000000000000000000000000000000000002070a0c0d13131313131313130e0d0b0703000000000000000000000000000000000000000000000000000000000000000000000000000000030b1218212a31363a4145474a4d505152525352514f4d4a4745403936313a4044454646464646463c3b38322b22190f0400000000000008131e28313a45515c676d79828d92999fa6a39f9a97928f8e8d8e8e9092989b9fa3a69e99928c82796d675d51453f32291e140800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013202d3946535f6c767979797979797979797979797979797979797979766c5f5346392d20130005121f2b3744505b656c77797979797979797979797979797979797979776c655b5044372b1f12050000000000000000000007131d28343f4a54606b70706b60544a3f31281d0f0500000000000000000000000000000000000000040d151e262e3440474b4d4d4b4740342e261e150d04000000000000000000000000000000000814212e3b4754616e7a87949c9c9c9084776a5d5144495663707c89969c9c9a8d8174675a4e4134271b0e01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010f1a26313c4653606d7985929eaca7998c7f7366717d8a98a2aca095897c6f63564c4135291d1104000000000000000000000000000000000000000000000006121f2c3844505c6673808d9aa7ab9f95887b6e6255483d3236414d5665727f8c98a7ab9d908376695f5347382d22170b0000000000000a1724303d4a5763707d8a96acb6a4978a7e7164574b3e3124180b000000000000000000000000000000000000000000000000000000000000010e1b2834414e5b6774818e9aa7ac9f9386796d6053463a2d20130700111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c0000000000000000000000000000000713202d3946525e6875828f9ba9ac9f92867a6e6154473c31262a36424d5766737f8c99a7ab9e9184786c605346392f24180c00000000000005111e2a36424d5666737f8c99a3afa99c9083766c61584f46443f414142464b515b606d7984919ea9afb8afa295887c6f6255493c2f221609000c1925313d48535d65686c6c6c677683909da9a194887b6e6c6c6c6c6c6c68645d53483c3024180c00000713202d3a4653606d798693a0aca6998d8073665a4d4033271a171a1c1e1f201f1f1e1c1a171413110d07010000000000000000000000000000000000000000000000060e151a1e2122292d2d2d2d2d2d2d2a2423201c160f0a060b0f141a1d23282c2d31362d2c29241d150d030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030c151c2328333b42464c5254575a5c5e5e5f5f5f5e5c5a5753514b46423b454c50525353535353534948433d342b21160a0000000000010d19242f3a43505a606d79828f949fa3a7a099928e898583818181828386898e92999fa7a39f948f82796d605b51443b3025190e0200000000000000000000000000000000000000000000000002070b0d0d131313131313130f0e0c0804000000000000000000000000000000000000000000000000121e2b37434f5a646c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c645a4f43372b1e1200030f1b27333f49535b606a6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6a605b53493f33271b0f0300000000000000000000010b17232e38424f5960636360594f42382e1f160c000000000000000000000000000000000000000000030c151c2328363b3f40403f3b3628231c140c0300000000000000000000000000000000000814212e3b4754616e7a878f8f8f8f8f84776a5d5144495663707c898f8f8f8f8d8174675a4e4134271b0e01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a151f2c3845515c6773808d9aa4aa9d9184776a75828e9baaaa9d9084776b6054443a3024190d0100000000000000000000000000000000000000000000000713202d3a4653606d7985919eabab9d908377695f53473a2b303b4854616e7b8795a0ab9f95887b6e6253493f33271b0f0300000000000815222f3b4855626e7b889aa4afa5998c7f7266594c3f3326190700000000000000000000000000000000000000000000000000000000000004101d2935404b556976838f9ca9ab9e918478675c5145382c1f130600111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c0000000000000000000000000000000714212e3a4754616d7a86929facaa9c8f8276685e5246392a2025313b4855626e7b8895a0aca196897d7063554b4035291d10040000000000020e1925303b4854616e7b87929fabab9f948a7e716a60595350494e4e4d53555d606d74808d969b9ea5afafa295887c6f6255493c2f221609000915202c37424b53595b6060606774808d9aa7a194887b6e6160606060605b59534b41372b20140800000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d0d0f111213131211100d0a07060401000000000000000000000000000000000000000000000000000003090e1214151c202020202020201d171614100b0500000003090e12181c1f20242a201f1d18120b03000000000000000000000000000000000000000000000000000000000000000000010406070a0d10111213131211100d0a07060400000000030505060606060606000000000000000000000000000000000b151e272e343f454d53565d606366696a6b6c6c6c6b696763605c55534d444f575c5f60606060606056544e463d32271b0f030000000004111d2935414c56616c74818e949ea6a69f959087817c79767474747577797d818790959ea5a69e948e81756d62564c41362a1e14080000000000000000000000000000000000000000000001080e1317191a202020202020201b1b18140f0901000000000000000000000000000000000000000000000f1b27333e49525a5f60606060606060606060606060606060606060605f5a52493e33271b0f00000b17222d38414950535d6060606060606060606060606060606060605d53504941382d22170b00000000000000000000000006111c26303d474f555656554f473d30261c0d0400000000000000000000000000000000000000000000030a1117242a2f323434322f2a2417110a020000000000000000000000000000000000000714212d3a4754606d7a8283838383838174675b4e414855626f7c8283838383827f7265584c3f3225190c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004101c2834404b55616e7b87939faca095887b6f7985929faca3988b7f7265594f4332281e1308000000000000000000000000000000000000000000000005111d2a36414c5663707d8a97a1ada3998c7f7265574d42372b2d3a46535e697783909daaa7998d8073655b5044372b1f120700000000000714202d3a4753606d7a86939faca79a8e8174675b4e412f24180c00000000000000000000000000000000000000000000000000000000000006131f2c3845515d677784919eaaa99c90837669554b4034281c100400111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c000000000000000000000000000006131f2b37434e5865727f8b99a3aea2988b7e7164564c41362a18212e3a47535f6a7784919daaa89b8e8174675d5145392c1f14090000000000000914202d3a46525e6975818e99a3afa69f92857c706b62605b535a5b575f61676d747f8b92938f939eaaafa295887c6f6255493c2f22160900040f1b25303942484d4f53535764717e8a97a9a194887b6e6155535353534e4d4841392f251a0f0300000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d01030505060605040300000000000000000000000000000000000000000000000000000000000000000000020608080f13131313131313100a0907040000000000000000070c101313181d1413100c0701000000000000000000000000000000000000000000000000000000000000000001080d111314171a1d1e1f1f201f1e1c1a171413100c07010c0f111213131313131309090703000000000000000000000007121c273039404451575f61686d7073767778797978777673706d67615e57505761686b6c6c6c6c6c6c6260584e43382c1f1307000000000613202c3945525d68717e8a939da6a89f948f837c746f6c6668676768666d70757c838f939ea7a69e938b7f72685e52463b3025190d010000000000000000000000000000000000000000020a12191f2326272d2d2d2d2d2d2d282724201a130b030000000000000000000000000000000000000000000a16212c3740494f535353535353535353535353535353535353535353534f4940372c21160a000006111b262f383f4446505353535353535353535353535353535353535046443f382f261b1106000000000000000000000000000a141e2c353d44484a4a48443d352c1e140a00000000000000000000000000000000000000000000000000060c191f2326272726231f190b0600000000000000000000000000000000000000000713202c3945525d686d767676767676746f64584c4047535f6a6f767676767676726d62564a3e3125180b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c18232e3946535f6976828f9ca9a7998c7f737d8a98a2ac9f92867a6d6054473d3221160c0200000000000000000000000000000000000000000000000713202d3946525e6875828f9ba9ac9f92867a6e6154473c31262a36424d5766737f8c99a7ab9e9184786c605346392f24180c000000000006131f2c3845515d677885919eaba99c8f827669554b4035291d100400000000000000000000000000000000000000000000000000000000000714202d3a4753606d7a86929faca79b8e8174685b4e412e23180c0000111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c00000000000000000000000000000815222e3b47545f6a7783909dabac9f92867a6d6054473b3025191e2b37424e576673808c99a8ab9f9285796d6053473b3025190e02000000000005121e2a36424d57626e7c87929fa7ada29792857d756f6c6568676869696e7379818b91948f828f9ba8afa295887c6f6255493c2f221609000009141e2730373d4142464854616e7b8796a1a194887b6e61554846464641403c372f271d13090000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003060606060606060400000000000000000000000000000406070b1007060400000000000000000000000000000000000000000000000000000000000000000003090e13191d20212427292b2b2c2c2c2b292724201f1c18120e181c1e1f2020202020201615130f0a040000000000000000000c18232e39424a515b63696e747a7d808384858586858482807d79746e69605b536873787979797979796f6a6054483b2e22150900000004111d2935414c55606d7a85929ea5aca0968f82796e6a62605b545a5b545c60636a6e78818f959faba59f92857a6e61564c41362a1e110500000000000000000000000000000000000000010a141c242b2f3334393939393939393534312c251d150b01000000000000000000000000000000000000000005101b252e373e4346464646464646464646464646464646464646464646433e372e251b10050000000a141d262d33373944464646464646464646464646464646464646443937332d261d140a0000000000000000000000000000020c1a232c33383c3d3d3c38332c231a0c020000000000000000000000000000000000000000000000000000080e1317191a1a1917130e0800000000000000000000000000000000000000000004111d2935414c565d6069696969696967645c53483c434e585f6269696969696965625b51463a2e22160900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007121d2b37424d5764717d8a97a1aa9d908377818e9baaa79b8e8174685d5245392c2013040000000000000000000000000000000000000000000000000714212e3a4754616d7a86929facaa9c8f8276685e5246392a2025313b4855626e7b8895a0aca196897d7063554b4035291d10040000000004101d2935404b55697683909ca9aa9e918477675d5145382c1f13060000000000000000000000000000000000000000000000000000000000091623303c4956636f7c8999a3afaa988b7e7265584b3f322518070000111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c0000000000000000000000000004101c2834404b55626f7c8895a0aca99b8e8175675d514539291e141a26313c4955626f7c8896a0aca2988a7e7164564d42362a1e11050000000000020e1a25303b47535f6a73808d95a0a8a9a1979288817c797674747476787b7f858d929790827d8996a3afa295897c6f6256493c2f2316090000020c151e252c3134353a46535e697884919ea194887b6e6155483b39393534302b251d150b010000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060e141a1e24292c2d3033363738393939383634302d2c29231d1a24282b2c2d2d2d2d2d2d23221f1b160f070000000000000004101c2834404a545c606d727b81868a8d8f9191929292918f8d8a85807b726c655c6b78858686868686867c6f6256493c2f2316090000000613202c3945515d6773808d97a1ada69e91847a6d675f5853504a4e4e4b5153585f666d79839099a3ada2978d8174685e5246392d2014090000000000000000000000000000000000000008121c262e363b3f404646464646464642403d372f271d130900000000000000000000000000000000000000000009131c252c33373939393939393939393939393939393939393939393937332c251c130900000000020b141b22272b2d37393939393939393939393939393939393939372d2b27221b140b0200000000000000000000000000000008111a21272c2f30302f2c27211a11080000000000000000000000000000000000000000000000000000000002070a0d0d0d0d0a070200000000000000000000000000000000000000000000010d1924303a444c52545c5c5c5c5c5c5b58534a41363c464e53555c5c5c5c5c5c585651493f34291e1206000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e1a26313c4653606d7984919eaba095887b85929faba095897c6f63564c4135291d1104000000000000000000000000000000000000000000000006131f2b37434e5865727f8b99a3aea2988b7e7164564c41362a18212e3a47535f6a7784919daaa89b8e8174675d5145392c1f140900000000000c18242f414e5b6874818e9ba7ac9f92867a6d6053473a2d20140700000000000000000000000000000000000000000000000000000000000c1926333f4c5966727f8c99abaea298887b6f6255483c2f2215090000111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c0000000000000000000000000006131f2c3845515c6774808d9aa7ada1978a7d7063554b413529170d15212e3b47535f6a7784919eaaaa9c8f8276695e52463a2d20150a00000000000009141f2b37434e58606d79839096a0a8a9a19a938e8985828181818284888c91979992857b7c8996a2afa296897c6f6356493c30231609000000030c141b2025282a36424d576875828e9ba194887b6e6155483b2e2d282724201a130b03000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000406070a0d0f11121313131212100e0c090606030000000000000000000000000000000000000000000000000000000000070f181f262a2f35393a3d404344454646454443403d3a38342f2a252f3437383939393939392f2e2c27211910070000000000030e18212c3844515c666d757f878d9298999c9d9e9f9f9f9e9c9a98928d867f776d666679869293939393887b6e6255483b2f2215080000000714212d3a4754606d7a85929fa9aa9e94897d70685d554e46443f41414045464e545c676f7c87929faca99f92867a6e6154473c31261a0e020000000000000000000000000000000000020e19242e3840474c4d535353535353534e4d4841392f251a0f040000000000000000000000000000000000000000010a131b21272b2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2b27211b130a010000000000020a11171b1f202a2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2a201f1b17110a020000000000000000000000000000000000080f161c2023232323201c160f08000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008131e28323a4145475050505050504e4c4841382f343c4347485050505050504c4a463f372d23180d010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009141f2c3844505c6673808c99a4a79c8f828f97a2aa9d9084776b6054443a3024190d0100000000000000000000000000000000000000000000000815222e3b47545f6a7783909dabac9f92867a6d6054473b3025191e2b37424e576673808c99a8ab9f9285796d6053473b3025190e0200000000071925323f4c5865727f8b98aaafa399897c6f6356493c302316090000000000000000000000000000000000000000000000000000000006121e2b37424d576875828f9ba8ab9f9285796c605346392d2013060000111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c000000000000000000000000000713202d3a4653606d7985929eabab9e9285796d6053463a2f241807131f2b37434e586773808d9aa8ac9f93877b6e6154473c32261b0f000000000000030f1a26313c45515c676e7b8491969fa4aca49f9b97928f8e8d8e8f9196999e9892877d707b8895a2aea396897c706356493d3023160a0000000002090f15191a25313f4c5965727f8c989f94887b6e6155483b2e221b1a18140f090100000000000713202d3a4653606d7986939f9f9f998d8073665a4d4033271a0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001070c10131416191c1d1f1f20201f1e1d1b191613120f0b0600000000000000000000000000000000000000000000000000030b1218212a31363a4145474a4d505152525352514f4d4a4745403936313a4044454646464646463c3b38322b22190f04000000000915202c38434f59606d78818c92999fa2aaa9a8aaa29f9e9e9e9fa29f98928c81786d6d798699a39f9f94877a6e6154473b2e211408000005111e2a36424d5765727f8b98a2aea99c8f82756b60564c433c38332d2e34383c424b555f6a74818e9ba8aea3988c7f7266574d42372b1e1205000000000000000000000000000000000007131f2b36404a52585a606060606060605b59534b41372c201408000000000000000000000000000000000000000000010910161b1e202020202020202020202020202020202020202020201e1b161009010000000000000000060b0f12131d2020202020202020202020202020202020201d13120f0b060000000000000000000000000000000000000000050b10141617171614100b050000000000000000000000000000000000000000000000000000000000000000000000000000050a0d0f101313100f0d090500000000000000000000000000020c1620283035393a43434343434341403c362f262a32373b3c4343434343433f3e3a342d251b1107000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003101c28343f4a54616e7b87939fac9e948f949ea9a3988b7f7265594f4332281e1308000000000000000000000000000000000000000000000004101c2834404b55626f7c8895a0aca99b8e8175675d514539291e141a26313c4955626f7c8896a0aca2988a7e7164564d42362a1e1105000000000916222f3c4955626f7c8898a2aeab988c7f7265594c3f31261a0e020000000000000000000000000000000000000000000000000000000814212d3a47535f697885919eaba99c8f8276665b5044382b1f12060000111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c00000000000000000000000005111e2a36424d5664717d8a97a2ada89a8d8174665c514438281d13070f1b26323c4956626f7c8996a1ada4998c7f7265584e43372b1c11060000000000000a15202934404b555e696e7b848e939a9fa3aba9a19e9c9b9a9b9c9ea09d9590867d706e7b8894abb5a396897d7063564a3d3023170a0000000000000409091623303c4956636f7c89999393887b6e6155483b2e2215080c0803000000000000000713202d3a4653606d798693939393938d8073665a4d4033271a0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040a0f12181c1f202326282a2b2c2c2c2c2b2a282523201f1c17110f0a03000000000000000000000000000000000000000000030c151c2328333b42464c5254575a5c5e5e5f5f5f5e5c5a5753514b46423b454c50525353535353534948433d342b21160a000000020e1a26313b4854606b74808d939fa3ababa49f9b979892919192939a989d9f938f82786d7a8794abb4a094877a6d6154473a2e21140700000714202d3a46525e697683909daaada196897d7063594f433a312b282223282c3039434e58626f7c8895a0acaa9d908477695f53463a2d21140700000000000000000000000000000000000b17232f3b47525c64676c6c6c6c6c6c6c68655d53483d3124180c0000000000000000000000000000000000000000000000050a0f1213131313131313131313131313131313131313131313120f0a0500000000000000000000000003050611131313131313131313131313131313131313110605030000000000000000000000000000000000000000000000000407090a0a0907040000000000000000000000000000000000000000000000000000000000000000000000000000030a11161a1c1d20201c1c1915100a02000000000000000000000000040e161e24292c2d3636363636363433302b251d20262b2e2f36363636363632312e29231b1309000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c17232e3846535e6975828f9ca8a69e9c9ea6ac9f92867a6d6054473d3221160c02000000000000000000000000000000000000000000000006131f2c3845515c6774808d9aa7ada1978a7d7063554b413529170d15212e3b47535f6a7784919eaaaa9c8f8276695e52463a2d20150a000000000713202d3a4653606d7985929faca89b8f827568574d42362a1e12050000000000000000000000000000000000000000000000000000000815222e3b4855616e7b8897a1ada8998c7f7366544a3f33281c0f030000111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c0000000000000000000000000714202d3a46525e6975828f9ca9aca096897c6f63544a403428160c010a13202d394653606c7884919eabab9d9084776a5f5347382e23170c000000000000030c18232f39434d575e696e7981878f92999b9d9e9f9f9f9e9d9b9895908b837c706b6d7a8799a49f9f978a7d7064574a3d3124170a00000000000000000713202d3a4653606d7987868686867b6e6155483b2e221508000000000000000000000713202d3a4653606d78868686868686868073665a4d4033271a0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040a0f161b1d23292c2d303335373839393939383635322f2d2b28221c1b150e0903000000000000000000000000000000000000000b151e272e343f454d53565d606366696a6b6c6c6c6b696763605c55534d444f575c5f60606060606056544e463d32271b0f03000006121e2b37424e57636f7c87939fa5afa9a199938f8a878584848586888c90959e948d80747b8794a1ada093877a6d6054473a2d21140700000814212e3b4754616e7b87959fabab9e9184786c6053463d31281f1c17181c1f27313c47535f6a7784919daaaca095887b6e6155483b2e22150600000000000000000000000000000000000d1926333f4c58646e7379797979797979756f65594d4034271b0e01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040d151c2226292a2d2d292825211b140c04000000000000000000000000040c13191d2021292929292929282724201a13151b1f21222929292929292525221e181109010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040906111c2a36424d5763707d8a96a1acaaa8aab0a79b8e8174685d5245392c20130f0c07010000000000000000000000000000000000000000000713202d3a4653606d7985929eabab9e9285796d6053463a2f241807131f2b37434e586773808d9aa8ac9f93877b6e6154473c32261b0f0000000006121f2b3844505c6676838f9ca9ab9e918578695f53463a2d211409000000000000000000000000000000000000000000000000000005121e2a36424d5766727f8c99a9aca096887c6f6255493c2d22170b000000111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c0000000000000000000000000814212e3b4754616e7b86929facaa9e9184776b605442392e2318040005121f2b3744505b6574808d9aa9aca095887c6f62544a3f34281c100300000000000007121d27313b454d575e676d747c82868b8e909192929291908e8b88837e786f6a606c798693939393938a7e7164574b3e3124180b000000000000000006131f2c3845515c6775797979797976695f53463a2d2114070000000000000000000006121f2c3844505c667679797979797979736e63584b3f3226190c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060b151b21272c2f34383a3d40424445464646454543413f3c3938332d2b26201a150b06000000000000000000000000000000000007121c273039404451575f61686d7073767778797978777673706d67615e57505761686b6c6c6c6c6c6c6260584e43382c1f130700000814212e3a47535f6a76828f9aa4afaba1979287827d7a79787778797b7f838a9196928a7e7b8895a1ada093867a6d6053473a2d20140700000b1824313e4b5764717e8a97a7b1a79a8e8174665b5044382b1f160f0b0c10151f2b37434e586773808d9aa6b1a7988b7e7165584b3e2d22170b00000000000000000000000000000000010d1a2734404d5a677380868686868686868175685b4e4235281b0f0200000000000000000000000000000000000000000000000000000000000000060a0e1011131313131313100f0d0a0500000000000000000000000000000000000000000000000000000000060a0e1011131313131313100f0d0a05000000000000000000000000000005090d0f101313100f0d0a050000000000000000000000000000000000000000000000000000000000000000000000000000000000030d161f272d32353639393635322c261e160c0200000000000000000000000002080d1113141d1d1d1d1d1d1b1a18140f080a0f1215151d1d1d1d1d1d191816120d07000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080f151a1d1a25313b4653606c7884919e9f9f9f9f9fa095897c6f63564c4135291d1e1c18130c050000000000000000000000000000000000000005111e2a36424d5664717d8a97a2ada89a8d8174665c514438281d13070f1b26323c4956626f7c8996a1ada4998c7f7265584e43372b1c110600000003101c28343f4a546673808c99a8ada197887b6e6155483b30251a0e02000000000000000000000000000000000000000000000000000714212d3a46535e697783909daaaa9e9184776a5f53473b2e1c1106000000111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c000000000000000000000007131f2c38434f5966727f8c99a3afa7998c807366594f4330271c120700030f1b27333f495363707c8997a1ada79a8d8074665c5044382c1f1206000000000000010b151f29333b454d555d606a6f757a7e8183858586858583817f7b77716d665f5b6678848686868686867f7265584c3f3225190c000000000000000004101c2834404b555c6a6c6c6c6c6c6c5f574d42372b1e12050000000000000000000003101c28343f4a545c6c6c6c6c6c6c6c6c66635c52473b2f23170a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020a111720262b323839404547494c4f50525253535251504e4c4946443f3837312b262017110a020000000000000000000000000000000c18232e39424a515b63696e747a7d808384858586858482807d79746e69605b536873787979797979796f6a6054483b2e22150900000815222f3b4855626e7b88949facaea39992857d75716e686b6b666d6e72767d84909492857d8996a3aca09386796d6053463a2d20130700010e1b2834414e5b6774818e9aa7b4aa978a7e7164544a3f3328190d040000040d1b26323d4a5764707d8a97aab4a79b8e81746853493f33271b0f03000000000000000000000000000000010d1a2734404d5a6773808d93939393938e8175685b4e4235281b0f020000000000000000000000000000000000000000000000000000000000040b11161a1d1e2020202020201d1c1916100a03000000000000000000000000000000000000000000000000040b11161a1d1e2020202020201d1c1916100a0300000000000000000000020a1015191c1c20201d1c1a16110a030000000000000000000000000000000000000000000000000000000000000000000000000000000a151f2831383e4243464643413d3830281e140a0000000000000000000000000000010407071010101010100e0d0b08030000030608091010101010100c0b09060100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009121a20262a2c2d2b3844505b66737f8c999393939393939084776b6054443a30242c2b28241e170f070000000000000000000000000000000000000714202d3a46525e6975828f9ca9aca096897c6f63544a403428160c010a13202d394653606c7884919eabab9d9084776a5f5347382e23170c000000000b17232e3c4956626f7c8996a0aca9988c7f7265574d42362a1e1205000000000000000000000000000000000000000000000000000815212e3b4854616e7b87959faba8998c807366584e43372b1f0a00000000111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c00000000000000000000000915222f3b4854606b7784919d9f9f9f95887b6e6255483d3222150b0000000b17222d3a4653606d7985929e9f9f9e9185796d6053463a2d20130700000000000000030d172129333b434b51586062686e71747678797978787675726e6a64605c5454687278797979797979726d62564a3e3124180b0000000000000000000c18232e39434b51535f6060606055534d453c31261a0e0200000000000000000000000c17232e38424a505f606060606060605a58524a40362a1f130700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040b141c222832373d43484b515356595b5d5e5f5f5f5f5e5d5b585653504a47433c373127221b140b030000000000000000000000000004101c2834404a545c606d727b81868a8d8f9191929292918f8d8a85807b726c655c6b78858686868686867c6f6256493c2f23160900000d192633404c5966737f8c99a6b0ac9f92877c6f6b64615e56545c6062656c707a8290949083909daaaca09386796d6053463a2d2013070005111e2a36414c566a7683909da9aea298887b6e6155483b2d221708000000000a15212e3b4854616e7b8798a2aeaa9d908377655b5044372b1f1205000000000000000000000000000000010d1a2734404d5a6773808d9a9f9f9f9b8e8175685b4e4235281b0f0200000000000000000000000000000000000000000000000000000000050d151c2227292a2d2d2d2d2d2d292926211c150d0400000000000000000000000000000000000000000000050d151c2227292a2d2d2d2d2d2d292926211c150d040000000000000000040c141b212528292d2d2a2926221c150d040000000000000000000000000000000000000000000000000000000000000000000000000005111c27313a434a4e5053534f4e49423a30261b1005000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008121b242b3236393939333f4a54616e7a8786868686868686867f7265594f433239393837342f2921190f0500000000000000000000000000000000000814212e3b4754616e7b86929facaa9e9184776b605442392e2318040005121f2b3744505b6574808d9aa9aca095887c6f62544a3f34281c10030000000615222e3b4754606a7784919eaaa99d908376695e52463a2d20150a00000000000000000000000000000000000000000000000006131f2b37434e5865727f8c98a7aca095887c6f6255483c32261b0f00000000111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c0000000000000000000000091623303c4956636f7c8996939393939083776a5f53473a2e211417110b0b10121f2b3844505c6674818e93939393978a7d7063574a3d3024170a0000000000000000050f172129313a40454e54565e6164686a6b6c6c6c6b6a6865625f5753504a5660686b6c6c6c6c6c6c65625b51463a2e22160900000000000000000007121d27303940454653535353534846423c332a1f140900000000000000000000000006111c2630383f4453535353535353534d4b4740382e24190e02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040d161d262d333c43474f54555c606366686a6b6c6c6c6c6b69686562605b54534e47423c332d261d150d030000000000000000000000030e18212c3844515c666d757f878d9298999c9d9e9f9f9f9e9c9a98928d867f776d666679869293939393887b6e6255483b2f2215080005111e2a36424d576976838f9ca9b1a79a8d80736a605954524c4a5053555a61676d798290959095a0abaca09386796d6053463a2d201307000713202d3946525e687885929fabac9f9285796c605346392d201306000000000714212d3a46535e697985929facac9f9285796c605346392d201306000000000000000000000000000000010d1a2734404d5a6773808d9aa6aca89b8e8175685b4e4235281b0f02000000000000000000000000000000000000000000000000000000040d171f272e3336373939393939393635322d261f160d030000000000000000000000000000000000000000040d171f272e3336373939393939393635322d261f160d03000000000000020c161e262c32353639393635322d271f160d030000000000000000000000000000000000000000000000000000000000000000000000000a16222d38434c545a5d60605c5a544c42382c211509000000000000000000000000000000000000030608090b0d0f1112121313121211100e0c0a070604010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040f1a242d363d42454646464646525e686e797979797979797979726d625647454646464544403a332b21170c0100000000000000000000000000000007131f2c38434f5966727f8c99a3afa7998c807366594f4330271c120706040f1b27333f495363707c8997a1ada79a8d8074665c5044382c1f120600000006131f2b37434e586673808d99a8ac9f93877b6e6154483c31261b0f0200000000000000000000000000000000000000000000020c15212e3b47535f6a7683909da9aa9d9184776a5f53473a2a20150a00000000111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c00000000000000000000000e1b2834414e5b677481868686868686867f7265574e42372b2a27221d16161b202228343f4a5463707d868686868686868175685b4f4235281c0f000000000000000000050f171f282f353d43474c5254585b5d5e5f5f5f5e5d5b5855534e46443f4e565c5e606060606060585651493f34291e1206000000000000000000000b151e272e34383a46464646463b3a37312a21180e03000000000000000000000000000a151e262e34384646464646464646403f3b362e261c1208000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030c161f282f383f444e54596063676d707375777879797978787674726f6c66625f58534d443f382f271f150d03000000000000000000000915202c38434f59606d78818c92999fa2aaa9a8aaa29f9e9e9e9fa29f98928c81786d6d798699a39f9f94877a6e6154473b2e211408000714202d3a46525e697885929fabaca095877b6e61584f4746413f44464850555d676e7b85929da0a7b1aca09386796d6053463a2d201307000714212e3a4754616d7a8798a2aeaa9d918477665b5044382b1f12060000000005121e2a36424d576a7784919daaaea298877a6e6154473b2e211408000000000000000000000000000000010d1a2734404d5a6773808d9aa6aca89b8e8175685b4e4235281b0f020000000000000000000000000000000000000000000000000000000b151f2931393f424446464646464643423e3831281f150a00000000000000000000000000000000000000000b151f2931393f424446464646464643423e3831281f150a0000000000000a141e2830383d4143464643423e3831281f150a0000000000000000000000000000000000000000000000000000000000000000000000010d1a26323e4a545e66696c6c69665e54493d3225190d00000000000000000000000000000003070a0f121515181a1c1e1e1f1f201f1f1e1d1b19161413110d08040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000915202b363f484e5253535353514d565e616c6c6c6c6c6c6c6c6c65625b514b5253535352504c453d33291e13070000000000000000000000000000000915222f3b4854606b7784919d9f9f9f95887b6e6255483d3222151b1313100c17222d3a4653606d7985929e9f9f9e9185796d6053463a2d201307000000030f1b27323d4955626f7c8896a0aca49a8b7f7265584e43372b1e13080000000000000000000000000000000000000000000008131e2a36414c56626f7c88959faba2988c7f7265584e43372b1f120600000000111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c00000000000000000000000d1a2733404c59646f7479797979797979726d6256453c313736332e272021272c2f302e384855616b7079797979797979756f65594d4034271b0e00000000000000000000050d161d242932373b4146474b4e505252535252504e4c4847423c3834454b50515353535353534c4a463f372d23180d0100000000000000000000030c151d23282c2d39393939392e2d2b261f180f060000000000000000000000000000030c151c23282c393939393939393933322f2a241c140a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b151e283139424a50585f626b6f75797d7f828385858686858483817f7c79746f6a625f575049413931271f150b010000000000000000020e1a26313b4854606b74808d939fa3ababa49f9b979892919192939a989d9f938f82786d7a8794abb4a094877a6d6154473a2e211407000814212e3b4754616e7b8798a2aeaa9d908377695e53463d393634383a3e434c555e69717e8b97a1adb9aca09386796d6053463a2d201307000915222f3c4855626f7b8895aab4a99c8f837669544a3f33281c0f0300000000020e1a2531434f5c6976828f9ca9b4aa95887b6f6255483c2f221509000000000000000000000000000000010d1a2734404d5a6773808d9a9f9f9f9b8e8175685b4e4235281b0f02000000000000000000000000000000000000000000000000000006111c27313b434a4f51535353535353504e49423a31261c100500000000000000000000000000000000000006111c27313b434a4f51535353535353504e49423a31261c10050000000005101b26303a42494e4f5353504e4a433a31271c110500000000000000000000000000000000000000000000000000000000000000000000030f1c2935424e5a66707679797670665a4e4135281c0f00000000000000000000000000040a0f13151b1f21222527292a2b2c2c2d2c2b2b2a28262321201d1913100c07010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010e1a26323d4851595e606060605e575552545f606060606060606058565053585f6060605f5c574f453a2f24180c000000000000000000000000000000091623303c4956636f7c8996939393939083776a5f53473a2e2d2d28201f1c18121f2b3844505c6674818e93939393978a7d7063574a3d3024170a000000000a15212e3b47535f6a7784919daaac9c9083766a5f53473a3025190d010000000000000000000000000000000000000000010d1924303946525e6874818e9aa7aa9f92857a6d6054473c31261b0f0300000000111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c00000000000000000000000b1824303c48535d64676c6c6c6c6c6c6c65625b5146464644433f3932292b32383b3d4646444f5961636c6c6c6c6c6c6c68655d53483d3125180c0000000000000000000000040c131820272b3036393b3e4143454646454543423f3b3a37312c283a4043454646464646463f3e3a342d251b1106000000000000000000000000030b12181c1f202c2d2d2d2d22211e1a140e0600000000000000000000000000000000030a11171c1f2d2d2d2d2d2d2d2d2726231f19120a0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007121d273039434b545b606a6f767c8185898c8e90919292929291908e8b8985817c756e69605b534b433931271d1207000000000000000006121e2b37424e57636f7c87939fa5afa9a199938f8a878584848586888c90959e948d80747b8794a1ada093877a6d6054473a2d21140700091623303c4956636f7c8996aab4a79a8e817467574d42342d2a282b2d313a434d57606d7985929eabb8aca09386796d6053463a2d201307000a1723303d4a5663707d8996a3b0a89b8e8275685b4f422d22170b000000000000091c2835424f5b6875828e9ba8b0a396897d7063564a3d3023170a000000000000000000000000000000010d1a2734404d5a6773808d93939393938e8175685b4e4235281b0f0200000000000000000000000000000000000000000000000000000a16222e39434d555b5d6060606060605c5a544c42382d21160a0000000000000000000000000000000000000a16222e39434d555b5d6060606060605c5a544c42382d21160a000000000915212c38424c545a5c60605d5a544c43382d22160a0000000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d69768286868276695c4f4336291c100000000000000000000000040b10161b1f22262b2e2f3233353738383939393837373532302d2c29241f1d18120b060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004111d2a36424e59636b6c6c6c6c6b64615a534d53535353535353534d535b60656c6c6c6c6b6861574c4034281c0f0300000000000000000000000000000e1b2834414e5b677481868686868686867f7265574e4237393939352d2c28231d1c28343f4a5463707d868686868686868175685b4f4235281c0f0000000006131f2b37434e5865727f8c98a2ab9f94887c6f62564c4135291e1308000000000000000000000000000000000000000005111d2935414c56616e7a86929faca3988d8074685d5245392a20150a0000000000111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c00000000000000000000000814202b36414a53595b6060606060606059565153535353514f4a443b32353d444849535353534f5557606060606060605b59534b41372c20140800000000000000000000000001070d151b1e252a2d2e31353738393939383735322f2e2b261f282f34373839393939393932312e29231b1309000000000000000000000000000000070c10131320202020201514120e090300000000000000000000000000000000000000060c101220202020202020201a1917130e0800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040d18232e39434b555d666c737c83898e9298999b9d9e9f9f9f9f9e9c9b9897918d88827b736c655d554b43392f24180e05000000000000000814212e3a47535f6a76828f9aa4afaba1979287827d7a79787778797b7f838a9196928a7e7b8895a1ada093867a6d6053473a2d201407000a1724313d4a5764707d8a97a3b0a5988c7f7265594c3f31261e1c1f2028313b45515c6673808d99aab4aca09386796d6053463a2d201307000a1724313d4a5764707d8a97a3b0a79a8e8174675b4e4134281b060000000000010e1b2834414e5b6774818e9aa7b0a3978a7d7064574a3d3124170a000000000000000000000000000000010d1a2734404d5a677380868686868686868175685b4e4235281b0f0200000000000000000000000000000000000000000000000000010e1a27333f4a555f676a6c6c6c6c6c6c69665e54493e3226190d0100000000000000000000000000000000010e1a27333f4a555f676a6c6c6c6c6c6c69665e54493e3226190d010000000d1925323d49545e66696c6c69665e544a3e32261a0d0100000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c1000000000000000000000060c161b21272c2f31373a3c3e4042444545464645454443413f3d3a39352f2c29241d17110a02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006131f2c3945525e6b757979797978706c615f57514b434646424b51575f656c71787979797873685c5044372b1e110500000000000000000000000000000d1a2733404c59646f7479797979797979726d6256453c45464646413a38342e271e232e384855616b7079797979797979756f65594d4034271b0e00000000030f1b26323c4754606d7a86929faaa69a8d8174685e52463a2f24190d02000000000000000000000000000000000000040d1a232d3946525d6873808d98a3aa9f92867b6e61564c413529180e040000000000111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c0807050200000000000000030f1a252f3841484c4e53535353534c525f6060606060605d5b554d44393d474f54566060606060605a585353535353534f4d4841392f251a0f040000000000000000000000000000040a0f14191e202125282a2b2c2c2c2b2a282522211e1a151d23272a2b2d2d2d2d2d2d2524221e1811090100000000000000000000000000000000000406071313131313080705020000000000000000000000000000000000000000000000030613131313131313130d0c0a070200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010c161f2834404b555d676d78808790949b9fa2a9a29e9c9b9a9a9b9d9fa3a9a19e9a948f877f776d675d554b40352920170d020000000000000815222f3b4855626e7b88949facaea39992857d75716e686b6b666d6e72767d84909492857d8996a3aca09386796d6053463a2d201307000b1824313e4b5764717e8a97a4b0a4978a7d7164574a3e3124171012161f2834404b54626f7c8998a3aeaca09386796d6053463a2d201307000b1824313e4b5764717e8a97a4b1a79a8d8174675a4e4134271b0e0100000000010e1b2734414e5a6774818d9aa7b0a4978a7d7164574a3e3124170b000000000000000000000000000000000d1926333f4c58646e7379797979797979756f65594d4034271b0e010000000000000000000000000000000000000000000000000003101d2936424f5b6771777979797979797670665a4e4235291c0f030000000000000000000000000000000003101d2936424f5b6771777979797979797670665a4e4235291c0f030000000f1c2835414e5a66707679797670665a4e4235291c0f0300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c100000000000000000030a111721272c32383b3c4347484b4d4f5151525253525251504e4c494745413a39352f28221c140b06000000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202d394653606c7987868686847d756e69605c554f46454f545c60696e777e8586868685786b5f5245382c1f120500000000000000000000000000000b1824303c48535d64676c6c6c6c6c6c6c65625b514c50525353534e464540393029202c38444f5961636c6c6c6c6c6c6c68655d53483d3125180c00000000000a15202c3945525d6874808d98a3ac9f92867a6d61564c4135291f14090000000000000000000000000000000000010c161f2a36424d57616d7a85929faaa2988d8074695e52433a2f241906000000000000111e2b3744515e6a7784919daaa5998c7f7266594c3f332619191514120e090300000000000008131d262f363c4041464646414c565e6c6c6c6c6c6c6c6a675f554a3f444f5960636c6c6c6c6c6c67645c534846464642403d372f271e1309000000000000000000000000000000000002080e111414181b1d1f1f201f1f1d1b191514120e0912171b1e1e202020202020191816120d060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008131e28313a45515c676d79828d92999fa6a39f9a97928f8e8d8e8e9092989b9fa3a69e99928c82796d675d51453f32291e14080000000000000d192633404c5966737f8c99a6b0ac9f92877c6f6b64615e56545c6062656c707a8290949083909daaaca09386796d6053463a2d201307000b1825313e4b5864717e8b97a4b0a396897d7063564a3d3023170a060d18232e3a4653606d7986929facaca09386796d6053463a2d201307000b1825313e4b5864717e8b97a4b1a79a8d8074675a4d4134271a0e0100000000010e1a2734414d5a6774808d9aa7b1a4978b7e7164584b3e3125180b000000000000000000000000000000000b17232f3b47525c64676c6c6c6c6c6c6c68655d53483d3124180c000000000000000000000000000000000000000000000000000004111e2a3744515d6a77838686868686868276695c504336291d10030000000000000000000000000000000004111e2a3744515d6a77838686868686868276695c504336291d1003000000101c2936434f5c69768286868276695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c1000000000000000030c151c232832383d4348494e5355585a5c5d5e5f5f605f5e5e5d5b595654514c47454039332d261d181008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e889396918a827b736d67615953525960666d737b828b929792877e7064574a3d3124170a0000000000000000000000000000000814202b36414a53595b606060606060605956514f575d5f6060605b53514b423a322a28333e474f5557606060606060605b59534b41372c201408000000000004111d2935414c56616e7b86929faaa2988c8073685d52453b30251a0d030000000000000000000000000000000007121d28313946535e6973808d98a2a89f92857a6d61564d4231281e1308000000000000111e2b3744515e6a7784919daaa5998c7f7266594c3f3326252522211e1a140e060000000000010b141d252b30333439393946525e68767979797979797771675b4f434854606b70797979797979746e64584c4039393534312c251e150c0200000000000000000000000000000000000000020507080b0e101213131212100f0c0808060200070b0f11121313131313130c0b09060100000000000000000000000000000000000000000000000000000000050a0d0f101313100f0d0a0500000000000000000000000000000000000000000000000000000000000000000000020608080b0e1011121313121211100d0b080705020000000000000000000000000000000000000000000000010d19242f3a43505a606d79828f949fa3a7a099928e898583818181828386898e92999fa7a39f948f82796d605b51443b3025190e020000000005111e2a36424d576976838f9ca9b1a79a8d80736a605954524c4a5053555a61676d798290959095a0abaca09386796d6053463a2d201307000b1825323e4b5865717e8b98a4afa296897c6f6356493c302316090007131f2c3845515c667683909da9aca09386796d6053463a2d201307000b1824313e4b5764717e8a97a4b1a79a8d8174675a4e4134271b0e0100000000010e1b2734414e5a6774818d9aa7b1a4978a7e7164574b3e3124180b0000000000000000000000000000000007131f2b36404a52585a606060606060605b59534b41372c201408000000000000000000000000000000000000000000000000000004111e2a3744515d6a778490939393938f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a778490939393938f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c10000000000000030d151e262e343d44484f5456585f626566686a6b6b6c6c6c6b6a6a686563605d5553514b443f382f2a221a11080000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1724303d4956626c717f8b919e948f868079706b615f5d606b6f797f868f949f93887e716c6155493c3023160a000000000000000000000000000000030f1a252f3841484c4e535353535353534c4a4c5761696b6c6c6c68605c544c443c342c2c353e44484a535353535353534f4d4841392f251a0f040000000000010d19242f3a46525e6974808d98a2aa9f92857a6d60574d42362a1f150b010000000000000000000000000000050e18242f39434f59616e7b86929faaa0968c7f72685e52443b301f160c01000000000000111e2b3744515e6a7784919daaa5998c7f7266594c3f333232322e2d2a261f180f060000000000020b131a202427282d2e3b4754616e7a86868686868683776a5d5144495663707d8686868686868074675a4e41342d282725201a130c0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030a11161a1c1d20201d1c1a16110a0300000000000000000000000000000000000000000000000000000000000205090e121415181b1d1e1f20201f1f1e1c1a181514120e090502000000000000000000000000000000000000000004111d2935414c56616c74818e949ea6a69f959087817c79767474747577797d818790959ea5a69e948e81756d62564c41362a1e1408000000000714202d3a46525e697885929fabaca095877b6e61584f4746413f44464850555d676e7b85929da0a7b1aca09386796d6053463a2d201307000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f2316090004101c2834404b546875828f9ba8aca09386796d6053463a2d201307000a1724313d4a5764707d8a97a3b0a79a8e8174675b4e4134281b0e0100000000010e1b2834414e5b6774818e9aa7b0a3978a7d7064574a3d3124170a00000000000000000000000000000000020e19242e3840474c4d535353535353534e4d4841392f251a0f04000000000000000000000000000000000000000000000000000004111e2a3744515d6a7784909d9f9f9c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909d9f9f9c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c100000000000020b151f2730383f444f54596063676a6f7173757778787979787877767472706d6764605d55504a423c342c231a100700000000000000000000000000000000000000000000000000000000000000000000000000000000000815212d3945505a626d727f8b919c98928c847d756e69686d747c838c92989c918b7f726c625a5044392d2014080000000000000000000000000000000008131d262f363c4041464646464646463f44505d697378797979746d665e564e463e35282c33383c3d4646464646464642403d372f271e13090000000000000008131e2a36424d57616d7a85929fa8a2978d8073695e52463d31271d120700000000000000000000000000020b17202935404b55606b75828f98a3a59d9184796d60564c4132291f0d0400000000000000111e2b3744515e6a7784919daaa5998c7f7266594c3f3f3f3f3f3b3a36312a21180e03000000000001080f14181a1b212e3b4754616e7a87939393939084776a5d5144495663707c89939393938d8174675a4e4134271c1b18140f090200000000000000000000000000000000000000000000020507080b0e111112131312110f0c0908060300000000000000000406070b0f1213131211100e0c0b09060100000000000000000000000000000000040d151c2226292a2d2d2a2926221c150d04000000000000000000000000000000000000000000000000000002080e11151a1e21222528292b2c2c2c2c2b2b29272522211e1a14120e09020000000000000000000000000000000000000613202c3945525d68717e8a939da6a89f948f837c746f6c6668676768666d70757c838f939ea7a69e938b7f72685e52463b3025190d010000000814212e3b4754616e7b8798a2aeaa9d908377695e53463d393634383a3e434c555e69717e8b97a1adb9aca09386796d6053463a2d201307000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000c18232e414e5b6874818e9ba7aca09386796d6053463a2d201307000a1723303d4a5663707d8996a3b0a89b8e8175685b4e4235281b090000000000020f1b2835424e5b6875818e9ba8b0a3968a7d7063574a3d3024170a00000000000000000000000000000000020e1a26313c454e53556060606060606055534e463c31261b0f03000000000000000000000000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c1000000000000a141d273139424a505960636b6f74787b7e8082848485858685858483817f7c7a75716d67605b544e463e352c23190d040000000000000000000000000000000000000000000000000000000000000000000000000000000005111d29343e48505a626d727f8c929c9f96918a827b73717a818891959f9d928c7f736d625a50483e33281c100400000000000000000000000000000000010b141d252b303334393939393939393845525f6b788586868681786d685f584f473f342e272c2f30393939393939393534312c251e150c0200000000000000010e1a25303b46525e68727f8c96a0a99f92867b6e61594f43392f24180e040000000000000000000000000a141d29323a45515d67707d89939ea89d93897d70675c51443a3020170d0000000000000000111e2b3744515e6a7784919daaa5998c7f7266594c4c4c4c4c4c4846423b332a1f14090000000000000003080b0814212e3b4754616e7a87949f9f9d9084776a5d5144495663707c89969f9f9a8d8174675a4e4134271b0e0c08040000000000000000000000000000000000000000000003090e121415181b1d1e1f201f1f1d1b191515120f0a0401000000070c101313181c1e1f201f1e1d1b181815120d060000000000000000000000000000030d161f272d32353639393635322d271f160d03000000000000000000000000000000000000000000000002080d14191e20262b2e2f323436383939393938373634322e2d2b26201e1a140e090200000000000000000000000000000004111d2935414c55606d7a85929ea5aca0968f82796e6a62605b545a5b545c60636a6e78818f959faba59f92857a6e61564c41362a1e1105000000091623303c4956636f7c8996aab4a79a8e817467574d42342d2a282b2d313a434d57606d7985929eabb8aca09386796d6053463a2d201307000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f2316090000071a2734404d5a6773808d9aa6aca09386796d6053463a2d201307000916222f3c4955626f7c8895aab4a99c8f8276695c4f4330251a0e0200000000030f1c2936424f5c6975828f9ca8b5ab95897c6f6256493c2f2316090000000000000000000000000000000006121e2b37424e575f6c6c6c6c6c6c6c6c625f584e43372b1f1206000000000000000000000000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c100000000006111b262f39434b545c606b70767c8184888b8d8f9091929293929191908e8c8986827e79716c665f584f473e352b1f160c01000000000000000000000000000000000000000000000000000000000000000000000000000000000c17222d363f48515b636d737f8c929ca09e948f867f7d848d939aa09d938d80736d635b51483e362c22170b000000000000000000000000000000000000020b131a202427282d2d2d2d2d2d2d323f4c5965727f8c93938e827a6f6a615951444039302823242d2d2d2d2d2d2d282725201a130c0300000000000000000009141f2a36414c56606d7984919da5a2988e81756b60554b40352920160b020000000000000000000006111c262f3a444f59606d7984919ea5a1968e81746b60554b4032291e0e050000000000000000111e2b3744515e6a7784919daaa5998c7f72665958585858585855534d453b31261a0e020000000000000000000814212e3b4754616e7a8794a1aa9d9084776a5d5144495663707c8996a3a79a8d8174675a4e4134271b0e0100000000000000000000000000000000000000000000040a0f141a1e212125282a2b2c2c2c2b2a282622211f1b15110d08030b12181c1f2025292b2c2c2c2b2a272524221d181109010000000000000000000000000a151f2831383e4243464643423e3831281f150a00000000000000000000000000000000000000000000040c13191f252a2d31373a3b3e41434445464645454443403e3b3a37312d2a251f1a140d0500000000000000000000000000000613202c3945515d6773808d97a1ada69e91847a6d675f5853504a4e4e4b5153585f666d79839099a3ada2978d8174685e5246392d2014090000000a1724313d4a5764707d8a97a3b0a5988c7f7265594c3f31261e1c1f2028313b45515c6673808d99aab4aca09386796d6053463a2d201307000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000814212e3b4754616e7b8798a3aeaa9d9084776a574d42362a1e12050000000005111d2935414c566a7783909daaafa399877b6e6154483b2e211508000000000000000000000000000000000814212e3a47535f6a7679797979797979766a5f53473a2e211508000000000000000000000000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c10000000000b17222d38414b555c666d737d82898e919698999b9d9e9e9f9f9f9e9d9d9b9898928f8a857e786f6a61594f473d31281e13080000000000000000000000000000000000000000000000000000000000000000000000000000000006101b242d363f49515b636d73808d929da49e98928c8a91969fa49e938e81746e645b51493f362d241a10050000000000000000000000000000000000000001080f14181a1b20202020202025313e4a56626d75818f969490847c706b625b514a423a322a21192020202020201c1b18140f090200000000000000000000020d1925303a45515c67707d89939da89e93897d70675d51453d32281d140a000000000000000000071017222d38424c56606b74808d96a0a3999184796d60594f43392e20170d000000000000000000111e2b3744515e6a7784919daaa5998c7f726665656565656565615f574d42362a1e12050000000000000000000814212e3b4754616e7a8794a1a99d9084776a5d5144495663707c8996a3a79a8d8174675a4e4134271b0e01000000000000000000000000000000000000000000060c161b1f252a2d2e31343738393939383735322f2e2b26201d19130c151d23282c2d32353839393838363432312e29231b1309000000000000000000000005111c27313a434a4e505353504e4a433a31271c11050000000000000000000000000000000000000000080e161e25293036393c4247484b4e50515253535252514f4d4b4846423c3a36302a251f170f08000000000000000000000000000714212d3a4754606d7a85929fa9aa9e94897d70685d554e46443f41414045464e545c676f7c87929faca99f92867a6e6154473c31261a0e0200000b1824313e4b5764717e8a97a4b0a4978a7d7164574a3e3124171012161f2834404b54626f7c8998a3aeaca09386796d6053463a2d201307000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000713202d3a4653606d7986929facab9f928578695e52463a2d201407000000000713202d3946525d687885929eabac9f9286796d6053463a2d201307000000000000000000000000000000000815222f3b4855626e7b868686868686867c6f6255483c2f22140a000000000000000000000000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c10000000030f1b27333f49535c676d7880888f949a9ea1a8a6a9a19e9d9d9c9d9d9ea1a9aaa39f9b97918b837c706b61594f433a2f24190d010000000000000000000000000000000000000000000000000000000000000000000000000000000009121b242d373f49525b636e74808d929da5a39f99979ea1a69e948e81786c605c524940372d241b11080000000000000000000000000000000000000000000003080b0d0e131313131316222e3a46515b606d7a8491989691867d726d605c544c443c332b2317110a1313130f0e0c08040000000000000000000000000008131e2834404b55606b74818e96a1a59d9184796d60594f443a2f261b110600000000000000060f192228333f4a545e68707d88939fa69f92877d6f675d51473d30271d0e05000000000000000000111e2b3744515e6a7784919daaa5998c7f7272727272727272726e695f53463a2d2114070000000000000000000814212e3b4754616e7a87949c9c9c9084776a5d5144495663707c89969c9c9a8d8174675a4e4134271b0e0100000000000000000000000000000000000000030a111720272b31363a3b3e4144444546464544423f3c3b37322c29241e191e272e34383a3e42454646454443413f3d3a342d251b1106000000000000000000000a16222d38434c545a5d60605d5a544c43382d22160a000000000000000000000000000000000000020a121a202830353b4146474e5355585b5c5e5f5f5f5f5e5e5c5a5855534d4846423b363029211a120a020000000000000000000005111e2a36424d5765727f8b98a2aea99c8f82756b60564c433c38332d2e34383c424b555f6a74818e9ba8aea3988c7f7266574d42372b1e120500000b1825313e4b5864717e8b97a4b0a396897d7063564a3d3023170a060d18232e3a4653606d7986929facaca09386796d6053463a2d201307000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d2013070006121f2b3844505c667784909daaaea298877b6e6154483b2e21150a000000000714212e3a4754616d7a8797a1adaa9e918477665c5145382c1f1306000000000000000000000000000000000714212d3a4754606d7a879893939393897d7063564a3d2f261b11060000000000000000000000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c1000000005121f2b3744505b656d79828d939a9fa6a7a09d999697929090909090929795999da0a7a19e9590867d706b60564c4135291d1307000000000000000000000000000000000000000000000000000000000000000000000000000000000009121b252d374049525c646e74808d939da59f9f9f9fa79f948f82786d665b504a40372e251b1209000000000000000000000000000000000000000000000000000001010606060606121e29353f45525d686f7c86929f9892877f746d665d564d453d3528231c140c0300020100000000000000000000000000000000020c18232e39434f59606d79849199a3a0968d80736b60564c41382d221710070000000000030d18212b343d44505b666d7a85919aa49e948c7f726b60554b41352b1e150b00000000000000000000111e2b3744515e6a7784919daaa89b8f817f7f7f7f7f7f7f7f7f7b6e6155483b2e2215080000000000000000000814212e3b4754616e7a878f8f8f8f8f84776a5d5144495663707c898f8f8f8f8d8174675a4e4134271b0e01000000000000000000000000000000000000030c151c232832373b4246484b4e505152535252504e4c4847433c39352f28222b30394045464b4f5152535251504e4b4a463f372d23180d010000000000000000010d1a26323e4a545e66696c6c69665e544a3e32261a0d0100000000000000000000000000000000020b141c242c323a41464d5254575f626567696b6c6c6c6c6b6a696765615f5754524d46423b332c241c140a020000000000000000000714202d3a46525e697683909daaada196897d7063594f433a312b282223282c3039434e58626f7c8895a0acaa9d908477695f53463a2d21140700000b1825323e4b5865717e8b98a4afa296897c6f6356493c302316090007131f2c3845515c667683909da9aca09386796d6053463a2d201307000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d2013070003101c28343f4a546875818e9ba8b3aa978a7d7064574a3d32271b0d04000001081623303d495663707c8996a9b3a89c8f827569544b4034281c1004000000000000000000000000000000000613202c3945525d687985929f9f9f998c7f7366584e41382d2217110a02000000000000000000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c10000005111e2a36414c56606c77818e949fa4a7a09d95908c89878584838383848587898c90959ea1a7a09892867d6f685d52453a2f24180d01000000000000000000000000000000000000000000000000000000000000000000000000000000000009131c252e37404a525c606c77818e93939393939393959082796d665c544a3f382e251c1309000000000000000000000000000000000000000000000000000000000000000000010d18232935414c565f6a727e8b939e99938c81786d685f574f473f342e261e150c030000000000000000000000000000000000000007121d27303d45515d676f7d87929fa69f93877d6f685e53493f332722190f060000000009141f29333d46505a606c78828f97a1a0958f82776c60594f433a2f23190c0300000000000000000000111e2b3744515e6a7784919daaaa9e938f8b8b8b8b8b8b8b8b8a7d7164574a3e3124170b0000000000000000000714212d3a4754606d7a8283838383838174675b4e414855626f7c8283838383827f7265584c3f3225190c000000000000000000000000000000000000030d151e262e343d43474d5354585b5d5e5f5f5f5e5d5b5955534e4745413a3129343c424b5153585c5e5f5f5f5e5d5a585651493f34291d12060000000000000000030f1c2935424e5a66707679797670665a4e4235291c0f03000000000000000000000000000000010b141d262e363e444c52565e61666a6e717476777879797878777673716e6966615e57524d453e362e261c140a0000000000000000000814212e3b4754616e7b87959fabab9e9184786c6053463d31281f1c17181c1f27313c47535f6a7784919daaaca095887b6e6155483b2e22150600000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f2316090004101c2834404b546875828f9ba8aca09386796d6053463a2d201307000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d20130700000b17232e3f4b5865727e8b98a8b2a69a8d807367584e43372b1f15100c090e131e2a36414c5666727f8c99a5b3aa998c7f7366594c402e23180c000000000000000000000000000000000004111d2935414c566976838f9caca99d9083766a6053493f3327221b140b040000000000000000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c1000000713202d3946525e68727f8c939ea6a59d959089837f7c7a787776767677787a7c7f838a9297a1a9a29891847a6d60554b4135291d11040000000000000000000000000000000000000000000000000000000000000000000000000000000000010a131c252e384044505b656c7881868686868686868683796d675d544a42382d261c130a0100000000000000000000000000000000000000000000000000000000000000000000070d19242f3a434e58626d75818e95a09f928e827a6e69605951443f3830271e150b00000000000000000000000000000000000000000b151e2935414b55606b727f8c949ea49991847a6d655b50443e342b21180d030000020e1a26313b454e58616c73808d949ea19791837a6d655b50473d31281d11070000000000000000000000111e2b3744515e6a7784919daab0a69e9b98989898989898978a7d7164574a3e3124170b0000000000000000000713202c3945525d686d767676767676746f64584c4047535f6a6f767676767676726d62564a3e3125180b0000000000000000000000000000000000010b151f2730383f444e54575e6164676a6b6c6c6c6b6a6865625f5854524c433f353c464e545c6065686b6c6c6b6b696765625b51463a2e221509000000000000000003101d2a3643505d69768286868276695d5043362a1d100300000000000000000000000000000009131d262f38404850565e61686e73777b7e81838485868685858482807e7b77736e69615e57504840382e261c130900000000000000000b1824313e4b5764717e8a97a7b1a79a8e8174665b5044382b1f160f0b0c10151f2b37434e586773808d9aa6b1a7988b7e7165584b3e2d22170b00000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000c18232e414e5b6874818e9ba7aca09386796d6053463a2d201307000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d20130700000615222f3c4855626f7b8896a0acaa9d9184776a6054473c31271f1c181b1a1e242d3946525e6876838f9ca9aea298897c706356493d302316070000000000000000000000000000000000010d19242f3f4c5966727f8c9aa4ab9f95897c6f655b50443e332d261d160e0600000000000000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c100004101c2834404a54616d7a85929fa5a69d938e837d77736f6d686a6a696a6a676d6f73787e859196a1aaa1968d8073675d5145392c201306000000000000000000000000000000000000000000000000000000000000000000000000000000000000010a131c2627333f49535b666c757979797979797979776d675d554b42392f261c140a0100000000000000000000000000000000000000000000000000000000000000000000000008131e28313c46515b606d79839198a29d948f847b706b625b504a423930271d120700000000000000000000000000000000000000030c18242f3a434f59606c77828f95a0a1968f82776c605a50463d33291f1409000005121e2a36424d57606a717e8a929ca29892857b6e685d53493f352b1f160c000000000000000000000000111e2b3744515e6a7784919d9f9f9f9f9f9f9f9f9f9f9f9f978a7d7164574a3e3124170b00000000000000000004111d2935414c565d6069696969696967645c53483c434e585f6269696969696965625b51463a2e221609000000000000000000000000000000000007121d273139424a50586062696e71747777787979787775726f6a66605d56504540454e5860666d717578797978777674726d62564a3d3124180b000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000007101b252f38404a525a61686d747b8084888b8e8f919292929291918f8d8b8884807b746e69615a524a40382e251b0f06000000000000010e1b2834414e5b6774818e9aa7b4aa978a7e7164544a3f3328190d040000040d1b26323d4a5764707d8a97aab4a79b8e81746853493f33271b0f03000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f2316090000071a2734404d5a6773808d9aa6aca09386796d6053463a2d201307000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d20130700000815212e3a47535f6a7784919eabaca095887c6f62584e4339312c282327262b2f35414c56616d7a86929facab9f9285796d6053463a2d2013070000000000000000000000000000000000000815222f3b4855626e7b87939faba79c9082776c605a50443f382f282017110a020000000000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c100006121f2c3844515c6674808d98a2aa9e948e8179706b6663605d565d5d5d555d6062656c717b84919ea8a99f92857a6d6054473a2d21140700000000000000000000000000000000000000000000000000000000000000000000000000000000000000010a1417222d38414a545b60686c6c6c6c6c6c6c6c6a605d554c433930271d140a0200000000000000000000000000000000000000000000000000000000000000000000000000010c161f2a343f45515d676e7c86929fa59f9691857d726d605c544b42392e23180c000000000000000000000000000000000000000007131d28313d44505b656d7a839197a19e948c80736c61584e453b31261a0e02000714212d3a46535f696f7c869293939992867c6f695f564c41382d23190d04000000000000000000000000111e2b3744515e6a77849193939393939393939393939393938a7d7164574a3e3124170b000000000000000000010d1924303a444c52545c5c5c5c5c5c5b58534a41363c464e53555c5c5c5c5c5c585651493f34291e120600000000000000000000000000000000020c18242f39434b545c606a6f757b7e8183848586858583817f7c78726d68625a514b4d57606a6f797e82848586858483817f7265584b3f3225180c000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000030c19222d37404a525c636c717a81868c9196989a9c9e9f9f9f9f9e9d9c9a9895918d86817b716c645c524a40372d21180e03000000000005111e2a36414c566a7683909da9aea298887b6e6155483b2d221708000000000a15212e3b4854616e7b8798a2aeaa9d908377655b5044372b1f1205000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000006121f2b37434e586673808d99a3afa89b8e81756a5f554b433c38342e3431373a4145525d68737f8c99a3afa79b8e8175675c5145382c1f13060000000000000000000000000000000000000814212e3a47535f6975828f99a3ab9f948c7f726c615a5049413a3227221b140b0400000000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c10000713202d3a4653606d7885929fa9a2988f82786d6760595654524c5050504c5154535b6069707d8a96a0aca2988a7e7164574a3e3124170b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006111b262f38424a50535b60606060606060605d54514c433a31271e150b02000000000000000000000000000000000000000000000000000000000000000000000000000000040d18222935404b555f6a717e8a939da7a09792877f746d665c544b4034281c100400000000000000000000000000000000000000010c161f27333f49535d686e7b859298a29f93887e706a60574d42362a1e1205000815222e3b4855616e7b858686868686867d706a60574d433a2f261b110700000000000000000000000000111e2b3744515e6a7784868686868686868686868686868686867d7164574a3e3124170b0000000000000000000008131e28323a4145475050505050504e4c4841382f343c4347485050505050504c4a463f372d23180d01000000000000000000000000000000000a141e2935404b555d666d747c82878b8e909192929291908e8c88847f7a716d605d55535f696f7c848b8f9192929291908d86796c605346392d2013000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000a151e2b343f49525c646e737e858d92999da0a8a9a29f9d9c9b9c9d9fa2aaa7a09d99928e857e736e645c52493f332a1f140900000000000713202d3946525e687885929fabac9f9285796c605346392d201306000000000714212d3a46535e697985929facac9f9285796c605346392d201306000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d2013070000030f1a26313c4854616e7b87929faaac9f92877c6f675d554e46454041414142474c515b606d7a85929eabaca095897d7063554b4034281c100400000000000000000000000000000000000006121e2b37424d57626f7c87929fa7a69f93877e716c605b534c443d332d261d160e06000000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c10000a1723303d4a5663707d899297979992857b6e665c554f49474541434343414547495057616b7784919daaaa9a8d8174675a4e4134271b0e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a141d262f383f44464e5353535353535353504745413a31281f150c030000000000000000000000000000000000000000000000000000000000000000000000000000000000071018242f39434e58616c74818e95a0a9a299928b80786d665c5145382c1f13060000000000000000000000000000000000000000040d17222d38414c565f696f7d869299939a92867c6f695f53463a2d211407000714212d3a46535f696e78797979797979706b61584e453b31281d140a0000000000000000000000000000101d2a36434f5b67717779797979797979797979797979797979716c6155493c3023170a00000000000000000000020c1620283035393a43434343434341403c362f262a32373b3c4343434343433f3e3a342d251b11070000000000000000000000000000000006111c26303845515d676d7880898f93999a9d9e9f9f9f9e9d9b9896918c857e756d675d58626e7b8691969b9e9f9f9e9e9c9386796c605346392d2013000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000006111c26303d46515b646e74808a92979fa3a9a19e999792908f8f8f909298989d9fa7a39f97928a80736e635b51453b31261a0e04000000000714212e3a4754616d7a8798a2aeaa9d918477665b5044382b1f12060000000005121e2a36424d576a7784919daaaea298877a6e6154473b2e211408000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d2013070000000a15212d3a46535e6975818e98a3aea3999083796d675f5853514b4e4e4e4d53555d606d74818e97a1ada69d9083776b605443392e23180c00000000000000000000000000000000000000020e1a26313c4754606a73808d959fa8a49992877e736c655e564f443f382f2820180f070000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c10000a1724313d4a5764707d8285878a8c8d8073685e544b433d3a39352f362f35393a3f444f596774818d9aa7a99c908376695d5043362a1d1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020b141d262d333839424646464646464646443a39352f281f160d030000000000000000000000000000000000000000000000000000000000000000000000000000000000000007121d28313c46505a606d7983909893939393928d82796d6053463a2d20130700000000000000000000000000000000000000000006111b262f3a434d57606a707d868686868686857b6e6155483b2e2215080005121e2a36424d575f616b6c6c6c6c6c6c6361594f463d332a1f160b0200000000000000000000000000000e1b27333f4b565f676a6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c64615a5045392d2114080000000000000000000000040e161e24292c2d3636363636363433302b251d20262b2e2f36363636363632312e29231b130900000000000000000000000000000000000b17232e3842505a606d79828d929b9fa4ababa39f9d9c9b9c9d9fa19e97928b82796d685f6a76828f98a1a8aaa39f9995949386796c605346392d2013000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000c17232e38424f59626d74808d929ea1a9a39f97918c8885838282838385888b90959ea1a8a29f928d80736d62574d42362a20160a000000000915222f3c4855626f7b8895aab4a99c8f837669544a3f33281c0f0300000000020e1a2531434f5c6976828f9ca9b4aa95887b6f6255483c2f221509000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d20130700000005121e2a36424d57616e7b86929fa6aba0958f82796f6a63605c555b5a5b575f62676d747f8c939ea9a99f948a7d7064594f4430271d120700000000000000000000000000000000000000000915202b37434e58606d79839096a0a7a39992877f776d6860595049413a322a2119100700000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c10000a1623303c4955616c7076787b7d80827c6f62564d4239302d2c29242a24292c2d33404c5966737f8c99a6aa9d9184776a5e5144372b1e110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020b141c22282b2d353939393939393939372d2c29241e160d040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010c161f2a343e45515c676e7b8586868686868686867a6e6154473b2e211408000000000000000000000000000000000000000000000a141d28313b454e58616b70797979797979786e695f53463a2d21140700020e1a26313b454d53555f60606060605f57554f473e342b21180d040000000000000000000000000000000b17232e39444d565b5e60606060606060606060606060606060575550483e33281c1104000000000000000000000000040c13191d2021292929292929282724201a13151b1f21222929292929292525221e181109010000000000000000000000000000000003101c28343f4a54616c74818e949da4aca7a09d9992908f8f8f9192999a9e9f948f837a6d666f7c88949faaaea398928c88878886796c605346392d2013000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000003101c28343f4a54606b727f8c929ca4aaa299928c84807b787675757677797b7f838a91969fa6a49c928b7f72695f53463d32271b0f030000000a1723303d4a5663707d8996a3b0a89b8e8275685b4f422d22170b000000000000091c2835424f5b6875828e9ba8b0a396897d7063564a3d3023170a000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000000020e1a25313b46535f69737f8c949fa7a79f948f837c75706d676867676869696e737a818c919ca5aaa1978f82766c6155473d331e150b000000000000000000000000000000000000000000030f1b27323c45515d676e7a8490959ea6a399938c827a6f6b605b534c443c332b22191107000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c10000814202d39444f59616469696e7073756f6a5f53443b302721201f2023282c2f353a424d566673808c99a6aa9e9184776b5e5144382b1e11000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020a11171c1f20282d2d2d2d2d2d2d2d2a21201d19130c0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040d18222934404b555f696e78797979797979797976685e5246392d20140700000000000000000000000000000000000000000000020b161f2a333d464f5961636c6c6c6c6c6c6b615f574d42362a1e1205000009141f29333b424648525353535353534a48443e352c22190f060000000000000000000000000000000006121d28323b444b4f51535353535353535353535353535353534a49453e362c22170c000000000000000000000000000002080d1113141d1d1d1d1d1d1b1a18140f080a0f1215151d1d1d1d1d1d191816120d0700000000000000000000000000000000000006121f2b3844505c66717e8b939ea6aea59d95908a86838282838486898d92979f959083786d73808d99a6b0a89f9286807c7a7b7d7063574a3d3024170a000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000006121f2c3844505c666f7c87929fa4aba29892878079736f6a6a696869656c6e72777d848f949fa6a49f92867b6e61584e43382b1f13060000000a1724313d4a5764707d8a97a3b0a79a8e8174675b4e4134281b060000000000010e1b2834414e5b6774818e9aa7b0a3978a7d7064574a3d3124170a000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d2013070000000009141f2a36424d57606d78828f959fa7a69f959087817d79777574747476787b80858e939ca3aaa29892857b6e615a5044352b210c03000000000000000000000000000000000000000000000a15202935404b555e686e7b838f949fa3a49f948f847d726c655d564d453d342b23190f060000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c100004101c28333e474f5557575e61646669625f584e4332292122282b2d2e34383a40454c545e6975828f9ba8aa9d9083776a5d5044372a1d110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060b0f12131b20202020202020201d1413110d0801000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060f18232f39434d575f616c6c6c6c6c6c6c6c6c6c5e564c41362a1e11050000000000000000000000000000000000000000000000040d18212b343e474f55575f60606060605f55534d453b31261a0e020000030d18212931363a3b454646464646463d3c38332c231a10070000000000000000000000000000000000000b16202932393f4344464646464646464646464646464646463e3c39332c241a100500000000000000000000000000000000010407071010101010100e0d0b08030000030608091010101010100c0b090601000000000000000000000000000000000000000713202d3a4653606d7884919ea5afa69d938e837d797776757677797c80858c9298958e81747683909ca9aca0958a7e736f6e6e706b6155483c2f231609000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000003101c28343f4a54606d78839099a3afa39992867d736d67625f585c5c535b6061656c707a828f949fa9a2988f82766a6054473b2e2215080000000b1824313e4b5764717e8a97a4b1a79a8d8174675a4e4134271b0e0100000000010e1b2734414e5a6774818d9aa7b0a4978a7d7164574a3e3124170b000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d20130700000000030e1a26313b44505c666d7a8390959da5a7a099938e898683828181818385888c92979da5a7a09892867d70695e52483e3323190f0000000000000000000000000000000000000000000000040c18242f39434c565e696e7a828c9299a1a69e9691877f776d685f574e463d352b21180c0300000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c1000000b17212c353e44494a4d535457595c55534e463c312a2d2d3338393c4045464b51565d666e7b86929faca89c8f8275695c4f4236291c0f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000306060f1313131313131313110706040100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007121d27313c454d53555f60606060606060605f524c443b3025190e02000000000000000000000000000000000000000000000000060f19222c353e44484a535353535353524846423b33291f140900000000060f181f262a2d2e38393939393939302f2c28211a110800000000000000000000000000000000000000040e1720282e3336373939393939393939393939393939393931302d28221a120800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1824313e4b5764717e8a96a0acac9f948e8179716d67696869676d70747a7f869095938a7e7885929fabaa9d9184776c6261616361594f44382c201407000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000006121f2c3844505c66727f8b95a0aba89f92877d706b605d55534e4f4f495053555a61686d79829097a1a49f94897c6f6256493c2f2316090000000b1825313e4b5864717e8b97a4b1a79a8d8074675a4d4134271a0e0100000000010e1a2734414d5a6774808d9aa7b1a4978b7e7164584b3e3125180b000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000000000009141f28343f4a545e686d7a838e929d9fa7a49f9b9892908e8e8d8e8f9197999ea1a9a29e9590867d706b60574d42362c22110800000000000000000000000000000000000000000000000007121d27313b444d565e686d777f8791979fa6a199928c827a6e6960584f473d332a1e150a00000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c10000005101a232c33393c3d4246484a4d4f4847433c3431363a3b3f4446494b5153555d60686d78828f98a2aea7998c7f7366594c403326190d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010b151f2a333c4246485253535353535353535346413b32291e1408000000000000000000000000000000000000000000000000000007101a232c33383c3d464646464646453b3a36312921180d030000000000060d141a1e21222c2d2d2d2d2d2c2423201c161008000000000000000000000000000000000000000000050e161d23272a2b2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2423211c171008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000106090b0c1313131313130d0c0a070200000000000005121e2a36424d576875818e9ba8afa49a8f82786d66605d555c555c6063676d727b838f9391857b8797a2ada79a8d8074675a545557554f473e33281c1004000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000713202d3a4653606d7984919ea7ada1968d80736b6059514b474342423f44464850565d676d7a85929b9993908c8275685c4f4235291c0f0200000b1824313e4b5764717e8a97a4b1a79a8d8174675a4e4134271b0e0100000000010e1b2734414e5a6774818d9aa7b1a4978a7e7164574b3e3124180b000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d2013070000000000030b17232e38424c565e686d79818990959b9fa2aaa39f9d9b9a9a9b9c9ea1a9a49f9c97928c837b706b60594f453b30241a1000000000000000000000000000000000000000000000000000010b151f29323b444d565d656c727d858f949fa3a39f948f847b6f6a60594f453c30261c1106000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c1000000008111a21282d3031363a3b3d40423c3a37373b3c4246484a505355555c6063676d727a818f949eaaab9f95887c6f6255493c2f22160900000000000000000000000000000000000000000000000000000003080c0e0e131313131313130f0e0c09040000000000000000000000000000000000000000000000000000000000000003070b0d0e131313131313130e0e0c08030000000000000000000000000000000000000000000000000000000000030d18212a31373a3b4546464646464646463b3936302920170d0200000000000000000000000000000000000000000000000000000008111a21282c2f30393939393939382e2d2a261f180f060000000000000003090e1214151f202020202020171614100b050000000000000000000000000000000000000000000000040b12171b1d1e20202020202020202020202020202020171714110c0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070d121618192020202020201a1917130e0800000000000714202d3a46525e697885919eabac9f93877c6f665c54514b4f4b5153555d60696e79818f949083909da9b3a4988b7e7165584b484a48443e352c21160b00000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000004101d2935404b5564717d8a96a1acaa9e9184796d60594f45403937312d3337393e444c555e68717e8b8e8a86837f7c6f6255483c2f2215090000000a1724313d4a5764707d8a97a3b0a79a8e8174675b4e4134281b0e0100000000010e1b2834414e5b6774818e9aa7b0a3978a7d7064574a3d3124170a000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d20130700000000000006111c26303a444c565e676d747c83898e9298999b9d9e9f9f9f9f9e9d9b999993908b857f786e6960594f473d33291f12080000000000000000000000000000000000000000000000000000030d172029323b444c535b606b707a828c9299a1a69e9691857d6f6b60574d42382e23170c020000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c10000000000810171c2023252a2d2e31333036393c4347494d5354545b606266676d7074797e858f939ea6aea49d9083776a6054473b2e2215080000000000000000000000000000000000000000000000000001090f14181a1b202020202020201c1b191510090200000000000000000000000000000000000000000000000000000001080e1317191a202020202020201b1a18140f090100000000000000000000000000000000000000000000000000000000060f181f262b2d2e3939393939393939392e2d2a251e170e0500000000000000000000000000000000000000000000000000000000000810161c2023242c2d2d2d2d2d2c22211e1a140d060000000000000000000002050708121313131313130a090704000000000000000000000000000000000000000000000000000000060b0e1011131313131313131313131313131313130b0a080400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010911181e2225252d2d2d2d2d2d2726231f19120a020000000815212e3b4854616e7b8797a1adaa9d9083776a5f544b4540424045474b51575f676d78828f9590959fabb0a3968a7d7063574a3d3d3c38332c231a100500000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000613202c3945515d6775828f9ba8aea3988b7e71675d51473d352f2b2622272b2d323a434c56606d7883817e7a76736f6a5f53473b2e2115080000000a1723303d4a5663707d8996a3b0a89b8e8175685b4e4235281b090000000000020f1b2835424e5b6875818e9ba8b0a3968a7d7063574a3d3024170a000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000000000000000a141e28323a444c555c606b6f777d8185898c8e90919292929291908f8d8a86837e79726d665f574f473d352b20170d00000000000000000000000000000000000000000000000000000000050e172029323a4149505960686d777f879297a0a8a09792867d6f695f544a3f34281e13080000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c100000000000050b1014161a1e21282f353a4146474e5455575e6165666c6f7276797d81858b91979ea5afa69d92897d7063584e43372b1f1306000000000000000000000000000000000000000000000000030b131a202427282d2d2d2d2d2d2d292825211b140c0300000000000000000000000000000000000000000000000000020b12191f2326272d2d2d2d2d2d2d282724201a130b0300000000000000000000000000000000000000000000000000000000060e141a1e21222c2d2d2d2d2d2d2d2d21201e19140d0500000000000000000000000000000000000000000000000000000000000000050b101416172020202020201f1514120e09030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009131b23292e313239393939393933322f2a241c140a0000000916222f3c4955626f7c8895a9b3a79a8d817467584e4239352f34383a40454d555c666d7a85919d9fa7b1afa396897c706356493d302f2c28211a11080000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000714202d3a4753606d7a86929facac9f92867a6d60554b403529241d1a171b1f2028313a44515c666d7775716d6866625f584e43372b1f12060000000916222f3c4955626f7c8895aab4a99c8f8276695c4f4330251a0e0200000000030f1c2936424f5c6975828f9ca8b5ab95897c6f6256493c2f231609000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d20130700000000000000020c162029323a434b515960636b7075797c7f82838485868685858382807d7a76726d67605c544d453d352b23190e050000000000000000000000000000000000000000000101020000000000050e1720282f383f444f565e656c727d859196a0a9a29892857b6e665c50443a3025190d0000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c10000000000000000409121b232b323a41454c525458606266696e7175797c7f8285898d92979ea1a9ada59e948d80746b6054463c32271b0f030000000000000000000000000000000000000000000000010b151d252b303435393939393939393534312c261e150c000000000000000000000000000000000000000000000000000b141d242b303334393939393939393534302b251d150b010000000000000000000000000000000000000000000000000000000003090e1214151f20202020202020201414110e0802000000000000000000000000000000000000000000000000000000000000000000000407090a13131313131312080705020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002070a0c0d13131313090907030005090d0f101313131312100d0903000000000000000000000000000000000000000000000000050a0d0f101313100f0d0a0500000000000000000000000000000007111b252d343a3e3f464646464646403f3b362e261c120800000a1723303d4a5663707d8996a3b0a6998c7f7366594c402f2924292c2f353b434b545d68707d8a959fabb7afa396897c706356493d3023201c161008000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000a1723303d4a5663707d8998a3aea89b8e8275675d51433a2f23181d1d1d1d1d161f2834404a545c606a6864615e5655534e463c32261b0f030000000814212e3b4754616e7b8798a3aeaa9d9084776a574d42362a1e12050000000005111d2935414c566a7783909daaafa399877b6e6154483b2e211508000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d2013070000000000000000050e1720353f474e524f54596063676d70727576787879797878777573706d6865605d55504a46423c332a1f14090000000000000000000000000000020507080a0b0c0c0d0e0f090907030000050d161d262d333d444c535b606b6f7b849196a1aaa2979083786d60564c41362a1b110600000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c100000000000000009121b242d353d444c52565e61666a6f73777b7e8285888c8f92989a9fa2a9aca9a19e938e82786d60594f44342b20150a00000000000000000000000000000000000000000000000009131d272f373c40414646464646464642413d3730271e0e050000000000000000000000000000000000000000000000030d1d262e363c3f414646464646464641403c372f271d13090000000000000000000000000000000000000000000000000000000000000205070812131313131313131308070502000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070e1317191a202020201615130f0a1015191c1d202020201f1d19140e07000000000000000000000000000000000000000000030a11161a1c1d20201d1c1a16110a03000000000000000000000000010d18232d373f464a4c5353535353534d4b4740382e24190e02000a1724313d4a5764707d8a97a3b0a5988c7f7265594c3f2e23181c1f24293139424c56616c7683909da9b3afa396897c706356493d302316100b0500000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000d1a2733404d5a6673808d99aab4aa978b7e7164554c4131282a2a2a2a2a2a2a2a2a232e39424a51535d5b5754524c4847433c342a20150a000000000713202d3a4653606d7986929facab9f928578695e52463a2d201407000000000713202d3946525d687885929eabac9f9286796d6053463a2d201307000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d20130700000000000000010e1a26313d4751595e5f606060555c606366686a6b6c6c6c6c6b6a686664615e566060606055534d453c31261a0e02000000000000000000000002090e111414171818191a1b1c1615130f0a0400040b141b2227323a4149505960696e7b849199a3a99f958c7f73685e5246382d22170b00000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c1000000000000006101b242d373f474f565d60686d72777c8084878b8e9297999c9fa2aaababa8a19e96918a81796d665c51473d3322190e040000000000000000000000000000000000000000000000030f1a252f3941484d4e535353535353534f4d4942393020170d02000000000000000000000000000000000000000000010b151f2e3840474c4d535353535353534e4d4841392f251a0f0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000106090b0c1313131313130d0c0a07020000000000000000000000000000000000000000000000010a12191f2326262d2d2d2d23221f1b161b212628292d2d2d2c2b29251f19110800000000000000000000000000000000000000040d151c2226292a2d2d2a2926221c150d04000000000000000000000006121e29343f495156586060606060605a58524a40362a1f1307000a1723303d4a5663707d8996abb5a6998d807366544a403428211e1a181f27303a44505a64707d8a97a2adafa396897c706356493d3023160a000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000004101c2834404b546976828f9ca9aea398887b6f6255483c2f3737373737373737373737373039404446514e4b4746413c3b37322a261f180f0600000006121f2b3844505c667784909daaaea298877b6e6154483b2e21150a000000000714212e3a4754616d7a8797a1adaa9e918477665c5145382c1f1306000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d2013070000000000000004111d2a36424e59636a6c6c6c6c6b636059595b5d5e5f5f5f5f5e5d5c5a575f626a6c6c6c6c6c5f574d42372b1e120500000000000000000000050d14191e20212324252627282823221f1b160f0700020a111720292f383f444f575f696f7d87929fa9a79f92867a6d6153493f33271b0f03000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c100000000000040e18222d363f49515960686d737a7f84888d9196989b9ea2a9a9acaaaaa29f9b96918c847e746d675c544a40352b2110070000000000000000000000000000000000000000000000000814202b37414b53595b606060606060605c59544b4232291f140900000000000000000000000000000000000000000007121d2731404a52585a606060606060605b59534b41372b2014080000000000000003060809131313131313130b0a08050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010406070f111213131312110e0b0706040000000000000000000000000000000000070d121618192020202020201a1917130e08000000000000000000000000000000000000000000000a131c242a2f323339393939302f2c2721262d323536393939393835312a231a11070000000000000000000000000000000000030d161f272d32353639393635322d271f160d03000000000000000000000916222e3a46515b62656c6c6c6c6c6c66635c52473b2f23170a000915222f3c4855626f7b8899a3afa89b8f8275665c51443a322d2b2627272628323e4653606d7985929fabafa396897c706356493d3023160a000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000006131f2c3845515c667884919eabac9f9286796d6053464444444444444444444444444444444444444444444444444444443b3a36312a21180e03000003101c28343f4a546875818e9ba8b3aa978a7d7064574a3d32271b0d04000001081623303d495663707c8996a9b3a89c8f827569544b4034281c1004000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000b1825323e4b5865717e8b98a4aca295897c6f6256493c2f23160906040d1a2733404d5a6673808d99a6aca09386796d6053463a2d2013070000000000000006121f2c3845525e6a757979797978706b605c544d5152535352524b515a61696e777979797976695f53463a2d211407000000000000000000050e171f252a2d2e30313233343435302f2c27211910070000060e171d262d333d454d57606b73808d97a2ada2988c8073655b5044372b1f1205000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c1000000000000a15202a343e48515b626b707a80868c9196999da0a8a8abaaa7a7a09d9a98928e8a847f79716c605c554b42392e231a0f000000000000000000000000000000000000000000000000000c1824303c48535d64686c6c6c6c6c6c6c68655d54443b3025190e0000000000000000000000000000000000000000000c18232f3943525c64676c6c6c6c6c6c6c68645d53483c3024180c0000000000040a0f13151620202020202020181715110c060000000000000000000000000000000000000000000000000000000000000000000000000000000001080d1113141c1e1f1f20201f1e1b181413100c0701000000000000000000000000010911181e2225252d2d2d2d2d2d2726231f19120a020000000000000000000000000000000000000007121c262e353b3f40464646463c3b38322b30383e41434646464645413c352c23190e03000000000000000000000000000000000a151f2831383e4243464643423e3831281f150a000000000000000000000b1825313e4a56626d72797979797979736e63584b3f3226190c000714202d3a4753606d7a86929facab9e9285796d60564c443d3a373134333332323845515c6675828f9ca8afa396897c706356493d3023160a000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000713202d3a4653606d7986939facaa9d908477665c50505050505050505050505050505050505050505050505050505050504846423b332a1f14090000000b17232e3f4b5865727e8b98a8b2a69a8d807367584e43372b1f15100c090e131e2a36414c5666727f8c99a5b3aa998c7f7366594c402e23180c00000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000b1825323e4b5865717e8b989f9f9f95897c6f6256493c2f231b1313100c1a2733404d5a6673808d999f9f9f9386796d6053463a2d201307000000000000000613202c3946535f6c7987868686847d736d665f5751464146454d555c606c717b83868686867b6e6155483b2e2215080000000000000000020d17202930363a3b3d3e3f3f4041423c3b38322b23190f040000050b141b2227333b454f59606d7a85929fabaa9e9185786c605346392d201306000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c1000000000030f1b26313c46505a626d727d848d92989ea0a8aaaba8a8a09e9a9795908d8985817d78726d67615a514b433930271c1108000000000000000000000000000000000000000000000000000e1a2734404d59646f7479797979797979756f65564d42362a1c11060000000000000000000000000000000000000004101c2934404b55646e7479797979797979746f64594d4034271a0e00000000060e151b1f21222d2d2d2d2d2d2d2524211d1711090000000000000000000000000000000000000000000000000000000000000000000000000000040c13191d2021292a2c2c2d2c2c2a2824201f1c18120b03000000000000000000000009131b23292e313239393939393933322f2a241c140a000000000000000000000000000000000000020e19242e3840474b4d535353534948433d353a42494e5053535353514d473e352a1f140900000000000000000000000000000005111c27313a434a4e505353504e4a433a31271c11050000000000000000000c1925323f4c5865727f8686868686868073665a4d4033271a0d0006131f2c3945515d677783909dabada1978a7e71685e564f484742424140403f3f3f404b546673808c99a6afa396897c706356493d3023160a000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000815212e3b4854616e7b879aa4afa99c90837669545d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d55534d453b31261a0e0200000615222f3c4855626f7b8896a0acaa9d9184776a6054473c31271f1c181b1a1e242d3946525e6876838f9ca9aea298897c706356493d3023160700000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000b1825323e4b5865717e8b9393939393897c6f6256493c2f2d28201f1c181a2733404d5a6673808d939393939386796d6053463a2d20130700000000000000000b1825323e4b5865717e8b9296918780786e69625b524c4550575f676d747e869095948d8074695f53463a2d211407000000000000000009141f29323b4246474a4b4b4c4d4e4f4948433d352b21160a000000020a11172129333d45525d6874808d9aa7ada197887c6f6255483c2f221509000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c100000000006121f2b37434e58626c727f8791969fa2aaaaaaa29f9b9896918e8a8784807d7975706d66605d555045403930271e150b00000000000000000000000000000000000000000000000000000e1b2835414e5b687481868686868686868175695e5246382d22170b0000000000000000000000000000000000000006131f2c3845515c677480868686868686868174685b4e4135281b0e00000006101820262b2e2f3939393939393931302d29221b1209000000000000000000000000000000000000000000000000000000000000000000000000040d161e24292c2d363738393939383735312d2c29231d150d0600000000000000000007111b252d343a3e3f464646464646403f3b362e261c1208000000000000000000000000000000000007131f2a35404a5257596060606056544f473d424c545a5c6060605f5e5850473c3125190d0100000000000000000000000000000a16222d38434c545a5d60605d5a544c43382d22160a0000000000000000000c1925323f4c5865727f8b939393938d8073665a4d4033271a0d0004101d2935404b5566737f8c99a3aea99e91847a6d68615955534d4f4e4d4c4c4c4b4b4c5865727f8b98a5afa396897c706356493d3023160a000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000916232f3c4956626f7c8995acb6a89c8f82756a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a615f574d42362a1e120500000815212e3a47535f6a7784919eabaca095887c6f62584e4339312c282327262b2f35414c56616d7a86929facab9f9285796d6053463a2d20130700000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000b1825323e4b5865717e868686868686867c6f6256493c3939352d2c28231d2733404d5a66738086868686868686786d6053463a2d20130700000000000000000b1724313d4a56626d73808c9399938d837b726d615e56515a61696e79818a9298958f82786d60574d42372b1e120500000000000000020e1925303b444d5254565758595a5b5b56544f473d32271b0f0300000000060f18212935414c5663707d8996aab3a9988c7f7265594c3f3226190c000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c10000000000815212e3a47535f6a717e889299a1a9aca69f9c98928e8b8784817e7a7773706d6663605c54514b433e342e271e150c0300000000000000000000000000000000000000000000000000000916232f3c4956626f7c89959393939392867b6e61544a3f33281c0f030000000000000000000000000000000000000714202d3a4753606d7985929393939395897c6f6356493c302316090000040e18222a32373b3c464646464646463e3d39342d241b110600000000000000000000000000000000000000000000000000000000000000000000010c161f282f35393a4244454646464544413e3a38342f271f17110a02000000000000010d18232d373f464a4c5353535353534d4b4740382e24190e02000000000000000000000000000000000a17232f3b47525c63666c6c6c6c6360594f4349545e66696c6c6c6c6a62584d4135291d100400000000000000000000000000010d1a26323e4a545e66696c6c69665e544a3e32261a0d0100000000000000000c1925323f4c5865727f8b989f9f998d8073665a4d4033271a0d00000c18242f3b4854616e7b86929fa8ada19690827a706b65615f575c5a5a5959585858585865717e8b98a4afa396897c706356493d3023160a000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000a1623303d495663707c8996a3afa89b8e8177777777777777777777777777777777777777777777777777777777777777776e695f53463a2d211407000006121f2b37434e586673808d99a3afa89b8e81756a5f554b433c38342e3431373a4145525d68737f8c99a3afa79b8e8175675c5145382c1f130600000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000b1724313d4a56626c71797979797979796f6a605447464646413a38342e2726323f4b58636e737979797979797976665c5044382c1f120600000000000000000915212e3a45505a636e74818e939f9590867e756d68605c606c717b838e939f969083796d665c50453c31261a0e020000000000000005111e2a36424d565e61636465666767686360594f43382c1f13070000000000060f1924303a4753606d798698a2aea79a8e8174675b4e4134281b0e000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c1000000006121f2b37434e58626f7c86929aa3aba8a09e948f8a85827e7b7774716e686763605c5453504a4540393128231f1c17110a02000000000000000000000000000000000000000000000000000915222e3b4854606a7783909daa9fa3998c7f73665b5044382b1f1409000000000000000000000000000000000006121f2b37434e5864717e8a97a29f9f9d9083776b6054483b2f22150900000a15202a343c434749535353535353534b49453e362d22170c0000000000000000000000000000000000000000000000000000000000000000000008131e28313a4145474f515252535352514e4b474540393127221b140b02000000000006121e29343f495156586060606060605a58524a40362a1f1307000000000000000000000000000000000c1926323f4b57636e73797979796f6b6054484e5a66707679797979746a5e5145382b1f120500000000000000000000000000030f1c2935424e5a66707679797670665a4e4235291c0f0300000000000000000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d00000714202d3a46525e6974808d96a1a9a89f9590847d77726e696a6867666665656565646465717e8b98a4afa396897c706356493d3023160a000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000a1724303d4a5763707d8a96a3b0ab9e928583838383838383838383838383838383838383838383838383838383838383837b6e6155483b2e2215080000030f1a26313c4854616e7b87929faaac9f92877c6f675d554e46454041414142474c515b606d7a85929eabaca095897d7063554b4034281c100400000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000915212e3a45505a62656c6c6c6c6c6c6c6260584e525353534e4645403930292f3b47525c63666c6c6c6c6c6c6c6c5c544a3f34281c1003000000000000000005111d29343f48525b606d78818f959f98928b827a706b676d747e8690959d9891847b6e675d544a3f332a1f140900000000000000000714202d3a46525e696e707172727374756f6b6054483b2f22150800000000000008131f2c3845515c677885929faba89b8f8275685c4f4235291c0f000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c100000000815212e3a47535f6a76828f98a3aca7a0969189827d7975716e696764615e565653514a46443f38352f312f2d2b28221c140b0200000000000000000000000000000000000000000000000007131f2c38434e5865727e8b98a2aeab9e9184786c6053463b30251a0e00000000000000000000000000000000000814212e3a47535f6a7683909ca9aea2988b7f7265594f43382c1f130700030f1b26323c464e535560606060606060585650483e34291d11050000000000000000000000000000000000000000000000000000000000000000010d19242f3a434c52545c5d5f5f605f5f5d5b5753514b433f332d261d140a00000000000916222e3a46515b62656c6c6c6c6c6c66635c52473b2f23170a000000000000000000000000000000000d1a2633404d59667380868686867d6f635649505c69768286868686796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768286868276695d5043362a1d100300000000000000000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000005121e2a36424d57606d79849197a1a9a79f969189837f7b78767574737372727271717171717e8b98a4afa396897c706356493d3023160a000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000a1724313d4a5764707d8a97a3b0ada1979290909090909090909090909090909090909090909090909090909090909090887b6e6255483b2f2215080000000a15212d3a46535e6975818e98a3aea3999083796d675f5853514b4e4e4e4d53555d606d74818e97a1ada69d9083776b605443392e23180c0000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d2013070005111d29343f48505658606060606060605654575d5f6060605b53514b423a322a36404a52585a606060606060605f504a42382e23170c000000000000000000010c18222d364044505c666d79829095a09f938f857d746f79818a9298a09992867c6f695e554b42382e21180e0300000000000000000814212e3b4754616e7b7d7e7e7f8081827d6f6356493c3024190d02000000000004101c2934404b556b7784919eaaa99c908376695d5043362a1d10000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c100000000915222f3c4855626f7b88949faaaca09590847d76706d6765615e575754524c494644403a444442413f3e3c3938332d261d140a000000000000000000000000000000000000000000000000030f1b27323d4754606d7a85929facaca1968a7d7063574d42362a1c110600000000000000000000000000000004101c2934404b55626e7b88949fabac9f92867a6d6054473d32271b0f030006131f2b37434e585f626c6c6c6c6c6c6c64625a5045392d211508000000000000000000000000000000000000000000000000000000000000000004111d2935414c565d60696a6b6c6c6c6b6a6864605c5550443f382f261b1106000000000b1825313e4a56626d72797979797979736e63584b3f3226190c000000000000000000000000000000000d1a2633404d596673808c9393897c6f635649505c6976838f939286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d0000020e1a25303b45515d676f7c8591979ea5a8a09e95908b8885838281807f7f7f7e7e7e7e7d7d808d9aa7afa396897c706356493d3023160a000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000a1724313d4a5764707d8a97a3b0b3a9a19e9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d94887b6e6155483b2e22150800000005121e2a36424d57616e7b86929fa6aba0958f82796f6a63605c555b5a5b575f62676d747f8c939ea9a99f948a7d7064594f4430271d12070000000b1825323e4b5865717e8b98a4aca295897c6f6256493c2f23160900040d1a2733404d5a6673808d99a6aca09386796d6053463a2d20130700010c18222d363f454a4b53535353535353495761696b6c6c6c68605c544c443c342e3840474b4d5353535353535353443f3830261c11060000000000000000000006111b2428343f4a545d676d7a839196a19e979188807b838e929fa29f93877d706a5f574d433a30261c0f060000000000000000000b1724313e4a5764717e898a8b8c8d8e8c807366564c4135291e130b060400020509121f2b3844505c667885929eaba99c908376695d5043362a1d10000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c100000000c1926333f4c5966727f8c99a6afa49a90837a706b64605c5554524d4b4746413d3a434a4f50514f4d4c4a4946443f382f261c11060000000000000000000000000000000000000000000000000a16202c3945515d6774818e9aa7b1a89b8f8275695e5246382e23170b00000000000000000000000000000006131f2c3845515c6774808d9aa6b0a79b8e8174685d5245392b21160a00000815212e3b47535f6a7679797979797979716c6256493d3024170a00000000000000000000000000000000000000000000000000000000000000000613202c3945525d686d757778797979787774716d67625a504941382d22170b030000000c1925323f4c5865727f8686868686868073665a4d4033271a0d000000000000000000000000000000000d1a2633404d596673808c9996897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d00000009141f2935414b555f6a6f7c858f939c9fa4a79f9d989892908f8d8d8c8c8b8b8b8b8a8a8a8d929da9afa396897c706356493d3023160a000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000a1723303d4a5663707d8996a3b0b8b0aba99f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9fa9aaaaaaaaaa94877a6e6154473b2e211408000000020e1a25313b46535f69737f8c949fa7a79f948f837c75706d676867676869696e737a818c919ca5aaa1978f82766c6155473d331e150b000000000b1825323e4b5865717e8b989f9f9f95897c6f6256493c2f2316090b10141a2733404d5a6673808d999f9f9f9386796d6053463a2d201307000006111b242d343a3d3e46464646464646505d697378797979746d665e564e463e3528363b3f40464646464646464638342e261e150a000000000000000000000000091217232e38424b555d686e7b849197a2a19a938d8890959da59d928b7f726b61584e453b31281e140a000000000000000000000815222f3b4855626e7c889798999a9a8f8275685d52463a30241d1512100c0e12141a202d3a4653606d7986939faca99c8f8276695c4f4336291c10000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c100000020f1c2835424f5b6875828e9ba8ac9f93877c6f68605953514b4846423e3b393634434d555b5d5d5c5a59575553504a42382d22170b00000000000000000000000000000000000000000000000004111d2935414b55626f7c88959fabac9f92877b6e61544a3f34281c100300000000000000000000000000000714202d3a4753606d7985929eabaca095897c6f63564c413529190f0400000916222f3c4955626f7c868686868686867e7164584b3e3125180b00000000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8284858586868584817e79716c605b53493f33271f14090000000c1925323f4c5865727f8b939393938d8073665a4d4033271a0d000000000000000000000000000000000d1a2633404d596673808c9996897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000020d18242f3a434e585f6a6f7a82898f93999c9fa2aaa29f9d9b9a999998989898979797979a9da4aeafa396897c706356493d3023160a000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000091623303c4956636f7c8996a2afb0a69f9c9393939393939393939393939393939393939393939393939c9ea6b0aea398877a6d6054473a2d2114070000000009141f2a36424d57606d78828f959fa7a69f959087817d79777574747476787b80858e939ca3aaa29892857b6e615a5044352b210c03000000000b1825323e4b5865717e8b9393939393897c6f6256493c2f231610171c20232733404d5a6673808d939393939386796d6053463a2d20130700000009121b22292e313239393939393945525f6b788586868681786d685f584f473f342e2f323339393939393939392c28231c150c030000000000000000000000000006111c263039434c565e696f7c859299a3a49f9a959da0a79e948d80746d62594f463c33291f160c02000000000000000000000613202d394653606c7785929ea5a69f92867a6d61564c41352e27201f1c181a1e21252a34404b55626f7c889aa4afa79b8e8174685b4e4135281b0e000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c10000003101d293643505c6976838f9ca9a99d9083766a5f564f4645403b3a36302e2d2f3c46555f666a6a6967656462605b544a3f33281c0f030000000000000000000000000000000000000000000000010d18242f3a47535f6a7683909da9afa3998c7f73665c5044382b1f14090a0a0a0a0a0a0a0a0a0a0a0a0a0a121f2b37434e5864717e8b97a2adaa9d9083776b6054443a2f2419070000000916222f3c4955626f7c8893939393938b7e7164584b3e3125180b00000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a87909292939292908e8a847e746c655b50443b30251a0e0200000c1925323f4c5865727f8b989f9f998d8073665a4d4033271a0d000000000000000000000000000000000d1a2633404d596673808c9996897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d0000000007131d28313c464e585f686d757c82878b8f929897999a9b9c9d9d9d9e9e9e9e9f9f9f9fa3abacb5afa396897c706356493d3023160a000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000815222f3b4855626e7b8895a9b3ab9f948f8686868686868686868686868686868686868686868686868f949eaaac9f928579675d5145392c20130600000000030e1a26313b44505c666d7a8390959da5a7a099938e898683828181818385888c92979da5a7a09892867d70695e52483e3323190f00000000000b1825323e4b5865717e868686868686867c6f6256493c2f23161a22282d303139404d5a66738086868686868686786d6053463a2d201307000000000911181d2124252d2d2d2d2d323f4c5965727f8c93938e827a6f6a6159514440393028272d2d2d2d2d2d2d2d1f1c17110a030000000000000000000000000000000a141e27313a444d575f6a707d879299a49f9f9f9fa9a0958f82786d605b51473e342a21170d04000000000000000000000005121f2b3744505b6575828f9baaaea3988b7f72685d52454039302d2c2823252a2d30363e45515c6773808c99acb4aa998c7f7366594c403326190d000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c10000004101d2a3743505d6a7683909da9a79b8e817468584e443d38342e2d2a2a2d2f38424e5866717777757472716f6c665b5044382b1f120600000000000000000000000000000000000000000000000007131d2b37434e5864717e8b97a2adab9e9184786d6053463b31251a16161616161616161616161616161616212e3a47535f6a7683909ca9aea2988b7f7265594f4332281e13080000000916222f3c4955626f7c88959f9f9f978b7e7164584b3e3125180b00000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a87949e9f9f9f9e9d9b96918b80776c60574d42362a1e120500000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000000000000000000000000000d1a2633404d596673808c9996897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d00000000010c161f2a343c464e565e616b6f757b7f8285888a8c8d8f8f9090919191919292929292999ba3acafa396897c706356493d3023160a000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000714212d3a4754606d7a8797a2ada99c8f82797979797979797979797979797979797979797979797979828f9ca9ab9e9184786b554b4135291d1104000000000009141f28343f4a545e686d7a838e929d9fa7a49f9b9892908e8e8d8e8f9197999ea1a9a29e9590867d706b60574d42362c22110800000000000b1724313d4a56626c71797979797979796f6a6054473b2e2217242c33393c3d46464b58636e737979797979797976665c5044382c1f12060000000000060c111517182020202025313e4a56626d75818f969490847c706b625b514a423a322a211920202020202012100c060000000000000000000000000000000000020c151f28323b454e58606b717e8793939393939393969083796d665c50493f352c22190f05000000000000000000000000030f1b27333f495364717e8a98a2aeaa9e91857a6d605b514b423d3a38342e31363a3b42465059606d7984919eabaea398897d7063564a3d3023170a000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c10000003101d293643505c6976838f9ca9a79a8d817467564c413a39352f363036393c424a54606a77838482807f7d7c786c605346392d201306000000000000000000000000000000000000000000000000010f1b26323c4753606d7985929fabada1968a7d7063574d42362a23232323232323232323232323232323232934404b55626e7b88949fabac9f92867a6d6054473d3221160c010000000916222f3c4955626f7c8895a2aca4978b7e7164584b3e3125180b00000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a87949fa3aba6abaaa9a19e928b7f72695e52463a2d20140800000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000000000000000000000000000d1a2633404d596673808c9996897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d0000000000040d18222a343c444c52596063696e7276797b7d7f81828383848484848585858585868b909ba7afa396897c706356493d3023160a000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000613202c3945515d677885929eabaa9d9184776c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c667784919eaaa99c8f8376695c50432f24180d010000000000030b17232e38424c565e686d79818990959b9fa2aaa39f9d9b9a9a9b9c9ea1a9a49f9c97928c837b706b60594f453b30241a100000000000000915212e3a45505a62656c6c6c6c6c6c6c6260584e43382b1c2328363e44494a525353525c63666c6c6c6c6c6c6c6c5c544a3f34281c10030000000000000105090b0b13131316222e3a46515b606d7a8491989691867d726d605c544c443c332b2317110a13131306030000000000000000000000000000000000000000030d162029333c464f59616c727f8686868686868686847b6e675d544a3f372d231a100700000000000000000000000000000b17222d3a4753606d7a85929faaada1978e81746d605c544f4946444043434246484d525a616b737f8c96a1acac9f92867a6d6053473a2d201407000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c100000020e1b2835414e5b6874818e9ba7a99c8f8276685e534c4745414343434146474d545b666f7c88908f8d8c8a85796c605346392d201306000000000000000000000000000000000000000000000000000a151f2c3845515d6774808d9aa6b0a89c8f8275695e5346382e3030303030303030303030303030303030303845515c6774808d9aa6b0a79b8e8174685d5245392c201304000000000916222f3c4955626f7c8895a2afa4978b7e7164584b3e3125180b00000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a8799929995999fa2aaada49f92867b6e6154483b3025190e02000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000000000000000000000000000d1a2633404d596673808c9996897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d0000000000050e171e252a323a41464f54575e6165666d6f717374757676777777787878787879797e8b98a4afa396897c706356493d3023160a000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000004111d2935414c55697683909ca9ab9f928578695f606060606060606060606060606060606060606d7986929faca79a8d8174675a4e4134271b070000000000000006111c26303a444c565e676d747c83898e9298999b9d9e9f9f9f9f9e9d9b999993908b857f786e6960594f473d33291f120800000000000005111d29343f485056586060606060606056544e463d3227262e343f485055575f6060605a585a606060606060605f504a42382e23170c000000000000000000000000060606121e29353f45525d686f7c86929f9892877f746d665d564d453d3528231c140c03000000000000000000000000000000000000000000000000040e17212a343d47505a626d727979797979797979786e695e554b42382e251b11080000000000000000000000000000000613202c3945515d6773808d98a2aea99d938c7f736d6660595653514a50504d5354575e616c707d87929fa8b0a69b8e8275675d5145392c201306000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c100000000c1926323f4c5965727f8c98a7ac9f92867a6d655e5654514b504f504d5254575f666c7882909c9c9a988e8174655b5044372b1f12050000000000000000000000000000000000000000000000000004101d2935404b55626e7b88949fabac9f93877b6e61544a3f3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4753606d7985929eabaca095897c6f63564c4135291d1104000000000916222f3c4955626f7c8895a2afa4978b7e7164584b3e3125180b00000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a87878686888d9298a2abaea2988c807366564d41362a1e1105000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000000000000000000000000000d1a2633404d596673808c9996897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d00000000020c1720293036393a3e3f44484d5354545c606264666768696a6a6a6b6b6b6b6c6c6c717e8b98a4afa396897c706356493d3023160a000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000010d19242f414d5a6774808d9aabaea298887b6e61555353535353535353535353535353535355626f7c8899a3afa9988b7e7265584b3f3225180c00000000000000000a141e28323a444c555c606b6f777d8185898c8e90919292929291908f8d8a86837e79726d665f574f473d352b20170d00000000000000010c18222d363f454a4b535353535353534947433d342b2830383f44515a61646c6c6c6c66635c5253535353535353443f3830261c11060000000000000000000000000000010d18232935414c565f6a727e8b939e99938c81786d685f574f473f342e261e150c03000000000000000000000000000000000000000000000000050f18222b353e48515b62656c6c6c6c6c6c6c6c6b615e574d433a30261c13090000000000000000000000000000000004111d2935404b55616e7b86929fa6afa59c918c8079706b6562605c545c5d575e6164696e747e869299a3afaa9f94897d7063554b4035291d1104000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c100000000915222f3c4855626f7b88959faba3998e81776d6863605d555d5c5d565e6164696e78808e949fa8a0958a7d706453493f33271b0f0300000000000000000000000000000000000000000000000000000c18242f3947535f6a7683909ca9afa4998c8073665c504949494949494949494949494949494949494949494e5864717e8b97a2adaa9d9083776b6054443a2f24190d01000000000916222f3c4955626f7c8895a2afa4978b7e7164584b3e3125180b00000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d787c7a79797c80869299a4afaa9e918477685e5246392d201407000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000000000000000000000000000d1a2633404d596673808c9996897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d0000000008131e29323a4146474b4c4d4e4f51524a50535557595a5c5c5d5d5e5e5e5e5f5f5f65717e8b98a4afa396897c706356493d3023160a000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000081724313e4a5764717d8a99a3afaa988b7e7165574d42464646464646464646464646424d5765727f8c98abada297887b6f6255483c2f2215090000000000000000020c162029323a434b515960636b7075797c7f82838485868685858382807d7a76726d67605c544d453d352b23190e05000000000000000006111b242d343a3d3e464646464646463c3b38322b29323a424a505b636c7079797979736e63574b46464646464638342e261e150a00000000000000000000000000000000070d19242f3a434e58626d75818e95a09f928e827a6e69605951443f3830271e150b00000000000000000000000000000000000000000000000000061019232c363f4951565860606060606060605e54524d453b31281e140a0100000000000000000000000000000000010d18242f3a46525e68727f8c949fa8ada49c928d837d77726f6d666a69696a696e71757b818a9298a2abaea2988f82766b6054433a2f24180d01000000000000000205111e2a3744515d6a7784909d9f9f9c8f8376695c504336291d100d0b08030000000000000000000000000004111e2a3744515d6a7784909d9f9f9c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c100000000815212e3a47535f6a7683909da5ab9e938e817a74706d676a6969696a686e71757b828e929da6a59d9083786c605346392d22170b00000000000000000000000000000000000000000000000000000007121d2b37434e5864717e8a97a1adab9e9184796d6056565656565656565656565656565656565656565656565f6a7683909ca9aea2988b7f7265594f4332281e130800000000000916222f3c4955626f7c8895a2afa4978b7e7164584b3e3125180b020405060606050402000000000000000000000000000000000000000000000006121f2c3844515c666d6f6d686d6f737d87939facaca096877a6e6154473b2e211408000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000000000000000000000000000d1a2633404d596673808c9996897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000010d1925303a444c525457595a5b5c5d5e5b5953484a4c4e4f5050515151515252525965727f8c98a5afa396897c706356493d3023160a000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000714212e3a4754616d7a86929faca89b8e8275695e53463d313939393939393939303946525e6976828f9ca9ab9e9285786c605346392d201306000000000000000000050e172029313940454f54596063676d70727576787879797878777573706d6865605d55504a423c332b231911070000000000000000000009121b22292e3132393939393939392f2e2b272b333b444c545c606d727e868686868073665a4d4039393939392c28231c150c03000000000000000000000000000000000008131e28313c46515b606d79839198a29d948f847b706b625b504a423930271d12070000000000000000000000000000000000000000000000000007111a242d373f464a4c5353535353535353524846423b33291f160c0200000000000000000000000000000000000007131d2a36414d56606d78829096a1a8ada49d959089837f7c797777767677787b7d82868e939fa2aaaea39f92867b6e61594f4431281d130700000000000002080e11141e2a3744515d6a778490939393938f8376695c50433629201b1a18140f0801000000000000000000000004111e2a3744515d6a778490939393938f8376695c504336291d1001000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c1000000006121f2b37434e5863707d89939da6a59e938e86807d7a787776767677787a7e82878f949da5a69d938a7d70655b5044372b1b1106000000000000000000000000000000000000000000000000000000010f1a26313c4653606d7985929eacada1968a7d70646363636363636363636363636363636363636363636363636e7b88949fabac9f92867a6d6054473d3221160c0100000000000916222f3c4955626f7c8895a2afa4978b7e7164584b3e3125180c0e101213131312100e0b0807050200000000000000000000000000000000000004101c2834404a545c6062615e60626b75818e9ba8b2a8968a7d7063574a3d3024170a000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000000000000000000000000000d1a2633404d596673808c9996897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d00000005111d2a36414c565e6164656768696a6b68655d534840414243434444444545454d596673808c99a6afa295897c6f6256493c2f231609000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000713202d3946525d6876828f9ca9ac9f92867b6e61584e433b322c292424292c3139424d57616e7b86929faca89b8e8174655b5044372b1f120500000000000000000000050e171f272f343d43484f54555c606366686a6b6c6c6c6c6b6a686664615e5653514b443f38302a211911080000000000000000000000000911181d2124252d2d2d2d2d2d2d2322242c343d454d565d666d747f87929892857b6e6154473b2e2d2d2d2d1f1c17110a03000000000000000000000000000000000000010c161f2a343f45515d676e7c86929fa59f9691857d726d605c544b42392e23180c000000000000000000000000000000000000000000000000000008121b252d343a3e3f4646464646464646453b3a36302921170d0400000000000000000000000000000000000000010e1925303b44505c666e7a849196a0a7afa7a09d95908c8985848383838485878a8e92999da5aeaaa39f918a7e71695f53473d321f160c010000000000050d14191e20212d3744515d6a77838686868686868276695c5043362d2d272724201a130b020000000000000000000004111e2a3744515d6a77838686868686868276695c504336291c140a000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c10000000030f1a26313c4855606b74818e949da5a59e98928d898785838382838485878a8f93999fa6a49d948e81746c6153493f33271b0a000000000000000000000000000000000000000000000000000000000009151f2c3845515c6673808d9aa4afa99c8f82757070707070707070707070707070707070707070707070707074808d9aa6b0a79b8e8174685d5245392c2013040000000000000916222f3c4955626f7c8895a2afa4978b7e7164584b3e312518191b1d1f1f201f1f1d1b181414110e080200000000000000000000000000000000000c18232e39424a5153555452535964717e8a97a4b1a5988b7f7265584c3f3225190c000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000000000000000000000000000d1a2633404d596673808c9996897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d0000000713202d3946525e686d71727374767778756f65594d3d323536373737383835404b556774818e9aa7b2a995887b6e6255483b2f221508000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000005111d2935414c5664717e8b96a1ada3998d80746a60564d443e39352f2f35383c434b545e6973808d99a3aca096897d706353493f33271b0f030000000000000000000000050d151d232932383d44484b5161696b6c6c6c68605c5f5e5d5c5a5754524c47454039342e261e180f080000000000000000000000000000060c11151718202020202020151d2328363e464f575f686d78818c939993877d70695e52463a2d2020202012100c06000000000000000000000000000000000000000000040d18222935404b555f6a717e8a939da7a09792877f746d665c544b4034281c1004000000000000000000000000000000000000000000000000000009131b23292e31323939393939393939382e2d2a251f170f0500000000000000000000000000000000000000000008141f28343f4a545e686e7b8490959fa3abaca7a09d98989291908f90919297979b9fa3abaca7a098928b7f726c61574d42352b210d040000000000050e171e252a2d2e3939424f5b6771777979797979797670665a4e423939393433302b251d140b0100000000000000000003101d2936424f5b6771777979797979797670665a4e42352e261c12070000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c10000000000a15202c38444f59606d79828e939da0a7a29f9a96979290908f90909297979b9fa4a7a09d928d82786d605a5041382d22170b000000000000000000000000000000000000000000000000000000000004101c2834404b54616e7b87939facac9f93877d7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7d85929fabaca095897c6f63564c4135291d11040000000000000916222f3c4955626f7c8895a2afa4978b7e7164584b3e31252225282a2b2c2d2c2b2a282521201e19140f0a0400000000000000000000000000000007121c2730394044464847464855626f7b8895a2aea6998c7f7366594c403326190d000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000000000000000000000000000d1a2633404d596673808c9996897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d0000000714212e3a4754616d7a7e7f8081828485817568584e43372e2c2823282c2f3945515d677783909daaada196877a6d6054473a2d211407000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000010d1924303a4653606d7984919ea7ab9f92877c6f685e564f47454141414045474e555c666e7b86929faba89e9184786c605346392d22170b00000000000000000000000000030b121821272c323839505d697378797979746d665e564e4f4d4a4746413a39352f28231c150c06000000000000000000000000000000000105090b0b131313130e161e272e344048505960696e7a828e939f948c7f736b60574d42362a1e1113130603000000000000000000000000000000000000000000000000071018242f39434e58616c74818e95a0a9a299928b80786d665c5145382c1f13060000000000000000000000000000000000000000000000000000010911181e2224252d2d2d2d2d2d2d2d2b21201e1a140d0500000000000000000000000000000000000000000000020b17232e38424d565f696e7b838d92999fa4acacaaaaa39f9e9d9c9c9d9ea1a9a8acaca8a19e9590867e726d625a50453c3123190f0000000000020d1720293036393b4646464a555f676a6c6c6c6c6c6c69665e54494646464641403c362f261d1308000000000000000000010e1a27333f4a555f676a6c6c6c6c6c6c69665e544b4740382e24190e0200101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c100000000003101c27333d45515c676d79818990959b9fa2aaa9a19e9d9c9c9c9d9fa2a9aaa29f9b95908a80786d665c51473e2f261b11060000000000000000000000000000000000000000000000000000000000000c18232e3946535f6976828f9ca9afa499938a89898989898989898989898989898989898989898989898989899297a2adaa9d9084776b6054443a2f24190d010000000000000916222f3c4955626f7c8895a2afa4978b7e7164584b3e312d2e32353738393939383735312e2d2a251f1b150d070100000000000000000000000000000b151e272e34383a3c3a3a4754606d7a8793a0b5a69a8d8073675a4d4034271a0d000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000000000000000000000000000d1a2633404d596673808c9996897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d0000000815212e3b4854616e7b878c8d8e8f909184786a6054473f3a38342e34383a404b55606d7a86929facab9e918578675d5145392c201306000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000008131f2c3845515c67727f8b95a0aba39991847a6e68615954514c4e4e4b5153575f676d78839098a2aca0968b7f72665b5044382b1b1106000000000000000000000000000001070c161b21273845525f6b788586868681786d685f584f473f3a3936302c29241d17110a03000000000000000000000000000000000000000000000600070f18202830394045525a616b6f7b838f949d968f82776c60594f453b30251a0e020600000000000000000000000000000000000000000000000000000007121d28313c46505a606d7983909893939393928d82796d6053463a2d20130700000000000000000000000000000000000000000000000000000000060d1216181920202020202020201f1514120e090200000000000000000000000000000000000000000000000006111c26303b444d575f696e7880878f939a9ea1a8a7a9aaaaaaa9a9aaaaa9a8aaa39f9c96918b837c716c625b51483e332a1f1107000000000008141e29323b4146535353535353555b5d6060606060605c5a545353535353534e4c4841382f251a0f030000000000000000000a16222e39434d555b5d6060606060606060605a57524a40352a1f130700101c2936434f5c6976828f908376695d5043362a1d10030000000000000000000000000000000000000000000000010507070b0b0b0b0b0b0b101d2a3643505d697683908f8276695c4f4336291c1000000000000b16212834404b555c676d747d838a8e9298989a9c9d9e9f9f9f9e9e9c9a9898928e8a837d746d665c544a40352c1d140a0000000000000000000000000000000000000000000000000000000000000007121d2a36424d5764707d8a96a1adaba49f9796969696969696969696969696969696969696969696969696969fa2a9aea2988b7f7265594f4332281e1308000000000000000916222f3c4955626f7c8895a2afa4978b7e7164584b3e373a3b3f4143454646464543413e3b3936302b272018130c0400000000000000000000000000030c151c23282c2d2f2e3a4653606d798699a3afa79a8d8074675a4d4134271a0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000000000000000000000000000d1a2633404d596673808c9996897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d0000000714212d3a46535e697884919a9b9c9d96897c6f625a504a464440434044464b515c67717e8b98a3aeaa9b8f827568554b4135291d1104000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000004101c2834404b55606d78839099a3aba09690837a706b64605d555b5b555d60636a6e79818e959faaa49a9184796d60544a3f33281c0a0000000000000000000000000000000000040a0f1926323f4c5965727f8c93938e827a6f6a6159514440393028201d18120c0600000000000000000000000000000000000000000000000000071019212a323a434b515b636c717d8591959f9991847a6d655b50473d33291f14090000000000000000000000000000000000000000000000000000000000010c161f2a343e45515c676e7b8586868686868686867a6e6154473b2e21140800000000000000000000000000000000000000000000000000000000000106090b0c131313131313131312080705020000000000000000000000000000000000000000000000000000000a141e29323c454d575e666d737c82878d9196989a9c9d9e9f9f9f9f9e9c9b9998928f8a847f786f6a625a51493f362c21180e0000000000020e1925303b444c525f6060606060605d5b5553535353534f54566060606060605a58534a41362b20140800000000000000000006111c27313b434a4f5153515a61646c6c6c6c66635c52473b2f23170a00101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000002080d11131417171717171717171d2a3643505d697683908f8276695c4f4336291c100000000000050c18232e39434b555c606b6f787d8185898b8e9091919292929191908e8c8985827d77706b605c544b42392e231a0b0200000000000000000000000000000000000000000000000000000000000000000e1a26313b4653606d7984919eabb5afaca3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3abadb3ac9f92867a6d6054473d3221160c01000000000000000916222f3c4955626f7c8895a2afa4978b7e7164584b3e4246484c4e505252535252504e4b4746413b373229241d160d0500000000000000000000000000030b12181c1f20222c3844505c667986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000000000000000000000000000d1a2633404d596673808c9996897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d00000005121e2a36424d576774818e9aa6a9a89b8e81756c605c5453514a504a5153555d606d7983919daaaea2988b7e7165584b3e2f24180d01000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000c18232e3944515c666f7c87929fa4a8a09590847d76716d6769676869676d70757b838e939ea7a59f93887d70665c5142382d22170b000000000000000000000000000000000000000b1825313e4a56626d75818f969490847c706b625b514a423a322a2119110600000000000000000000000000000000000000000000000000040f19222b333c444c555c606d737e869297a09f92877c6f685d53493f352b20170d02000000000000000000000000000000000000000000000000000000000000040d18222934404b555f696e78797979797979797976685e5246392d2014070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020c17202a333c454d545c606a6f757b8084888b8d8f91929293929291908e8c8986827d79726d665f5850483f372d241a0f06000000000005111e2a36414c565e6c6c6c6c6c6c6c6a675f554a46444f5960636c6c6c6c6c6c67645c53483c3024180b0000000000000000000008101f2931323a424a505b636c7079797979736e63574b3f3226190c00101c2936434f5c6976828f908376695d5043362a1d10030000000000000000000000000000000000000000050d13191e20212424242424242424242a3643505d697683908f8276695c4f4336291c1000000000000007121d273039434b515960666c7075797c7f81838485858685858483817f7d7975706b636159514b423930271c110800000000000000000000000000000000000000000000000000000000000000000009141f2c3844505c6673808c99a3afbbb9b1acaa9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9fa7a9afb8bab1a79b8e8174685d5245392c20130400000000000000000916222f3c4955626f7c8895a2afa4978b7e7164584b464d5355585b5d5e5f605f5e5d5b5854524d47433d352f281f170f050000000000000000000000000000070c1012131c28343f4a5f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000000000000000000000000000d1a2633404d596673808c9996897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000020e1a25313c4855626f7c88949faaaa9e938a7e726d6662605c545d545c6062676d75808d95a0aca99f92867a6d6154473a2e21140700000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000007121d2834404a54606a727f8c929ca4a7a096918a827d7a7775747475767a7d818790959ea5a59e938d80736b60544b402f261c1106000000000000000000000000000000000000000916222e3a46515b606d7a8491989691867d726d605c544c443c332b2317110a0200000000000000000000000000000000000000000000000a16212b343d454d565e676d757f8a9298a19e938b7f726a60564c41382d23190e050000000000000000000000000000000000000000000000000000000000000000060f18232f39434d575f616c6c6c6c6c6c6c6c6c6c5e564c41362a1e1105000000000000000000000000000000000000000000000000000000000000000000000000020608080c0e111212131312110e0c080705020000000000000000000000000000000000000000050e18212a333b424b51585f626a6e73787b7e80828485858686858483817f7c7975716d66605c544e463f362d251b12080000000000000714202d3946525e68767979797979797771675b4f434854606b70797979797979746e64584c4033271a0d00000000000000000007121a222b333b444c545c606d727e868686868073665a4d4033271a0d00101c2936434f5c6976828f908376695d5043362a1d100b0b0b0b0b0b0b07070501000000000000000000050e171e252a2d2e313131313131313131313643505d697683908f8276695c4f4336291c10000000000000000b151e27303940454f545b6063676d7072747677787879797877767472706d66636159554f45403930271e150b0000000000000000000000000000000000000000000000000000000000000000000003101c28343f4a54616e7b87929facb9b1a7a0939393939393939393939393939393939393939393939b9ea5afb8aca095897c6f63564c4135291d110400000000000000000916222f3c4955626f7c8895a2afa4978b7e7164585053575f6165686a6b6c6c6c6b6a6864615e56544e45403a312921170f0500000000000000000000000000000004060c17232e46535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000000000000000000000000000d1a2633404d596673808c9996897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000915212e3b47535f6a76828f98a2aea59f92877f78726f6d666a696a666d6f7379818d929da7aca2978d8074685d5246392d20130700000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000c18232e39424e58626d73808c929ea1a8a19e948f8a8683828181828386898e93999fa7a39f938f81786d60594f42392e1d140a000000000000000000000000000000000000000006121e29353f45525d686f7c86929f9892877f746d665d564d453d3528231c140c03000000000000000000000000000000000000000000030f1b27323d464e575f686d79818c929fa3a0958e81756d62584e443a2f261b11080000000000000000000000000000000000000000000000000000000000000000000007121d27313c454d53555f60606060606060605f524c443b3025190e020000000000000000000000000000000000000000000000000000000000000000000003090e121415191b1d1e1f201f1f1e1b191514120e090300000000000000000000000000000000000000060f182129303940454e53575f6266696e71747677787979797877767572706d6764605c54504a423c342d241b1309000000000000000814212e3b4754616e7a86868686868683776a5d5144495663707d8686868686868074675a4e4134271b0e00000000000000030b1218242c343d454d565d666d747f87929892857b6e6154473b2e21140800101c2936434f5c6976828f908376695d5043362a1d17171717171717171413110d0802000000000000020d1720293036393a3e3e3e3e3e3e3e3e3e3e3e43505d697683908f8276695c4f4336291c1000000000000000030c151e272e343d424a5053555d60636567696a6b6c6c6c6b6b69676563605c54554f48443e342e271e150c0300000000000000000000000000000000000000000000000000000000000000000000000c17232e3846525e6975828f9ca8b2aca095898686868686868686868686868686868686868686868e939ea9b4aa9d9084776b6054443a2f24190d0100000000000000000916222f3c4955626f7c8895a2afa4978b7e7164545c6064696e72747678797979787674716e68626058514b433b332921170d030000000000000000000000000000000013202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000000000000000000000000000d1a2633404d596673808c9996897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d0000000006121f2b37434e58626f7c86929fa4aca399928b837f7b797777767777797c80858e939da4aea49a92857a6d61564c4135291d110500000000000000000000000000000203101d2a3643505d69768390908376695d5043362a1d100302000000000000000000000007121c27303d46515b646e73808a92979fa3a69f9c9992908f8e8e8f9092989b9fa4a69f99928c81786d665c50473d30271d0b020000000000000000000000000000000000000000010d18232935414c565f6a727e8b939e99938c81786d685f574f473f342e261e150c03000000000000000000000000000000000000000007131f2c38434e5860696e7a828e939ca4a2989183796d605b51463d32281d140a0000000000000000000000000000000000000000000000000000000000000000000000010b151f2a333c4246485253535353535353535346413b32291e1408000000000000000000000000000000000000000000000000000000000000000000060c11151a1e212226282a2b2c2c2c2b2a282522211e1a14100b05000000000000000000000000000000000000060f171e272e343c43474e5355575f626567696a6b6c6c6c6c6b69686663605c5553504a443f38302a221b120901000000000000000814212e3b4754616e7a87939393939084776a5d5144495663707c89939393938d8174675a4e4134271b0e000000000000050c151d2328363e464f575f686d78818c939993877d70695e52463a2d20140700101c2936434f5c6976828f908376695d5043362a24242424242424242421201e19130d05000000000008131e29323a4146474a4a4a4a4a4a4a4a4a4a4a4a505d697683908f8276695c4f4336291c100000000000000000030c151d23282f383f44464b515356585b5d5e5e5f5f5f5e5e5d5b595653514b48443e383328231d150c0300000000000000000000000000000000000000000000000000000000000000000000000006111c2a36424d5763707d8a96a1acaa9d9083797979797979797979797979797979797979797979818e9ba7aea2988b7f7265594f4332281e13080000000000000000000916222f3c4955626f7c8895a2afa4978b7e716460666d71777b7f8183858586858583817e7b756f6a605d554d453b33291f150b0100000000000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000000000000000000000000000d1a2633404d596673808c9996897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d00000000030f1b26323c47535f6a717e8b939aa2aaa39f95918c8886848483838485898c92979ea5aaa39f93887d70685e52443a3024190d01000000000000000000000000050a0f12101d2a3643505d69768390908376695d5043362a1d10120f0a05000000000000000000000b151e2b343f49525c646e737e858e92999ea1a8a39f9d9c9a9b9c9d9fa3a9a29f9b948f877f776d665c544a3f352c1e150b00000000000000000000000000000000000000000000070d19242f3a434e58626d75818e95a09f928e827a6e69605951443f3830271e150b00000000000000000000000000000000000000000915222e3b4854606a6f7b8490949ea5a49f92867c6e675d51493f342b20160b02000000000000000000000000000000000000000000000000000000000000000000000000030d18212a31373a3b4546464646464646463b3936302920170d020000000000000000000000000000000000000000000000000000000000000002090e171d1f262b2e2f32353738393939383735322e2d2b261f1c160c07010000000000000000000000000000000000050c151d232831373c4247484d5355585a5c5e5f5f605f5f5e5d5b595653514b46443f38342e261e1810090000000000000000000814212e3b4754616e7a87949f9f9d9084776a5d5144495663707c89969f9f9a8d8174675a4e4134271b0e0000000000060e161e272e344048505960696e7a828e939f948c7f736b60574d42362a1e110500101c2936434f5c6976828f908376695d504336313131313131313131312e2d2a251e170e05000000010d1925303a444c5254575757575757575757575757575d697683908f8276695c4f4336291c10000000000000000000030b12181d262d333839404547494c4e5051525253525251504e4c4a4645403938332c282118120b0300000000000000000000000000000000000000000000000000000000000000000000000000000e1a25303b4653606c7884919eabaca095897c6f6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6d7a86929facac9f92867a6d6054473d3221160c010000000000000000000916222f3c4955626f7c8895a2afa4978b7e71646a6f787e83888b8e909192939291908e8b86827c746d675e574d453b31271d120700000000000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000000000000000000000000000d1a2633404d596673808c9996897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d00000000000a15202b37434e58616c727f8892989fa3a7a09d99999291909090919298999ea2a9a69f98928b7f726c61564c4132281e13080000000000000000000000010910161b1e20202a3643505d69768390908376695d5043362a20201e1b161009010000000000000000030c19222d37404a525c636c717a81868d9196989b9c9e9f9f9f9f9e9d9b9997928e89827c736c655c544b42382e231a0c03000000000000000000000000000000000000000000000008131e28313c46515b606d79839198a29d948f847b706b625b504a423930271d1207000000000000000000000000000000000000000916232f3c4956626f7c85919693939393928a7e716a5f554b40372d22190e040000000000000000000000000000000000000000000000000000000000000000000000000000060f181f262b2d2e3939393939393939392e2d2a251e170e0500000000000000000000000000000000000000000000000000000000000000050d141a22282d31373a3b3f4144454546464544413f3b3a37312c272118120b030000000000000000000000000000000000030b121820262b31373a3c4247484b4d4f51525253535251504e4c494745403a38342e28231c140c06000000000000000000000814212e3b4754616e7a8794a1aa9d9084776a5d5144495663707c8996a3a79a8d8174675a4e4134271b0e00000000070f18202830394045525a616b6f7b838f949d968f82776c60594f453b30251a0e0200101c2936434f5c6976828f908376695d50433e3e3e3e3e3e3e3e3e3e3e3a3936302920170d02000005111e2a36414c565e616464646464646464646464646464697683908f8276695c4f4336291c100000000000000000000000070b141c22282b2f35383a3d3f41434445454646454443413f3d3a38342e2c28211c160c070000000000000000000000000000000000000000000000000000000000000000000000000000000009141f2b3844505b66727f8c99a3aea79a8d8174675c606060606060606060606060605765717e8b98a2aea79b8e8174685d5245392c201304000000000000000000000916222f3c4955626f7c8895a2afa4978b7e716c717c838b9095989b9d9e9f9f9f9e9d9b99928f8781796e695e574d43392f23180c03000000000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000000000000000000000000000d1a2633404d596673808c9996897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d0000000000040f1a26313c46505a636d727e868e92999da0a8aba39f9e9d9c9d9e9fa2aaaaa29f9b948f867e726d62594f443a3020160c0200000000000000000000010a131b21272b2d2d2d3643505d69768390908376695d5043362d2d2d2b27211b130a01000000000000000007101b252e38404a525a61686d747b8084888b8e90919292929291908e8c8985817c766f6a605b534b423930261c1108000000000000000000000000000000000000000000000000010c161f2a343f45515d676e7c86929fa59f9691857d726d605c544b42392e23180c000000000000000000000000000000000000000d1a2633404d59667380868686868686868680746c61574e43392f251b100700000000000000000000000000000000000000000000000000000000000000000000000000000000060e141a1e21222c2d2d2d2d2d2d2d2d21201e19140d0500000000000000000000000000000000000000000000000000000000000000060f171f252a34393c4247484c4e505152535252514e4c4846423c383329241d150d03000000000000000000000000000000000000070c151b20262b2e31373a3b3e41434445464646454443423f3d3a38342f2c28231c17110a0200000000000000000000000814212e3b4754616e7a8794a1a99d9084776a5d5144495663707c8996a3a79a8d8174675a4e4134271b0e000000071019212a323a434b515b636c717d8591959f9991847a6d655b50473d33291f14090000101c2936434f5c6976828f908376695d504a4a4a4a4a4a4a4a4a4a4a4a4746413a32291e130800000713202d3946525e686d7171717171717171717171717171717683908f8276695c4f4336291c10000000000000000000000000020a11171c1f24292c2d3032343637383939393838363432302d2c28231d1c16100b050000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1c28333f4a54616e7a86929facab9f9285796d60535353535353535353535353535f697683909caaaca095897c6f63564c4135291d1104000000000000000000000916222f3c4955626f7c8895a2afa4978b7e71717e8790959da09e9c9b9a9b9c9ea1a9aba39f9a938e847b6e695e554b403429201509000000000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000000000000000000000000000d1a2633404d596673808c9996897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d0000000000000a15202a343e48515b636c717b81878c919597999c9d9e9e9f9f9f9e9d9b9998928e89827b716c625b51473e32281e0e04000000000000000000000009131c252c33373939393943505d69768390908376695d50433939393937332c251c130900000000000000000009131c262e38404850565e61696e73787c7e818384858686858583817f7c79746f6a625f585049413930271e150a0000000000000000000000000000000000000000000000000000040d18222935404b555f6a717e8a939da7a09792877f746d665c544b4034281c10040000000000000000000000000000000000000c1925323f4b57636d737979797979797979746e645a50453c31281d120900000000000000000000000000000000000000000000000000000000000000000000000000000000000003090e1214151f20202020202020201414110e080200000000000000000000000000000000000000000000000000000000000000060f18212930363e45494d5355595b5d5e5f5f5f5e5d5b5855534d48443d352f271f150d03000000000000000000000000000000000000030a0f151a1e21262b2e2f32343637383939393938363533302d2c29231f1c17110b06000000000000000000000000000814212e3b4754616e7a87949c9c9c9084776a5d5144495663707c89969c9c9a8d8174675a4e4134271b0e0000040f19222b333c444c555c606d737e869297a09f92877c6f685d53493f352b20170d020000101c2936434f5c6976828f908376695d5757575757575757575757575754524c443a3025190d01000714212e3a4754616d7a7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7e83918f8276695c4f4336291c100000000000000000000000000000060b0f12181d1f202325282a2b2b2c2c2c2b2b2a282623201f1c1812100b0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b17222d3846525e6875828e9ba8ada2978a7e7164574d42464646464646463f4a54626e7b88949fabaa9d9084776b6054443a2f24190d01000000000000000000000916222f3c4955626f7c8895a2afa4978a7e717e8892999e9896918f8e8d8e8f92979b9fa4aca49f9691847b6e675c51453c31261a0e020000000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000000000000000000000000000d1a2633404d596673808c9996897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000000030e18222d363f49515a61696e747b8084888b8d8f90919292929291908e8c8985817c766e69615a51493f352c20160c000000000000000000000005101b252e373e434646464646505d69768390908376695d504646464646433e372e251b10050000000000000000010a141c262e363e444c52575e61666a6f7274767878797978787675726f6d66626058534e443f382f271e150c03000000000000000000000000000000000000000000000000000000071018242f39434e58616c74818e95a0a9a299928b80786d665c5145382c1f13060000000000000000000000000000000000000a16232f3b47525b63666c6c6c6c6c6c6c6c67645c52483e332a1f160c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002050708121313131313131313080705020000000000000000000000000000000000000000000000000000000000000000030d18212a333b42465055575f6265686a6b6c6c6c6b6a6865615f57544f45403931271f150b010000000000000000000000000000000000000003090e12151a1e21222527292b2c2c2d2c2c2b2a282623201f1c1812100c060000000000000000000000000000000814212e3b4754616e7a878f8f8f8f8f84776a5d5144495663707c898f8f8f8f8d8174675a4e4134271b0e00000a16212b343d454d565e676d757f8a9298a19e938b7f726a60564c41382d23190e05000000101c2936434f5c6976828f908376696464646464646464646464646464615e564c41362a1e1105000a1723303d4a5663707d898a8a8a8a8a8a8a8a8a8a8a8a8a8a8a91958f8276695c4f4336291c100000000000000000000000000000000003070c10131416191b1d1e1f1f201f1f1e1d1b19171313100c07000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006111c2a36414c5663707d8996a0aca99c8f8276695e5246382d393939393844505c6673808d99a6aea2988b7f7265594f4332281e130800000000000000000000000916222f3c4955626f7c8895a2afa4978a7e7c86929a96918c8784828181818285898e939aa1a9a8a0969083796d60574e42372b1f14090000000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000000000000000000000000000d1a2633404d596673808c9996897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000c1925323f4c5865727f8b989f9f998d8073665a4d4033271a0d0000000000000006101b242e373f4850575e61696e73777b7e80828484858686858583827f7d79756f6b625f5750483f372d231a0e0400000000000000000000000a16212c3740494f5353535353535d69768390908376695d5353535353534f4940372c21160a000000000000000000020a131c242c323a41464d5254585f626568696b6c6c6c6c6b6a686663605c54544e47433c332d261d150c03000000000000000000000000000000000000000000000000000000000007121d28313c46505a606d7983909893939393928d82796d6053463a2d20130700000000000000000000000000000000000007131e2a35404952575960606060606060605a58524a40362c21180d04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010b151f2a333c454d525a6164696e72747778787979787774726e69636059514b433931271d12070000000000000000000000000000000000000000000206090e121415181a1c1e1f1f20201f1e1d1b19161413100c070300000000000000000000000000000000000714212d3a4754606d7a8283838383838174675b4e414855626f7c8283838383827f7265584c3f3225190c00030f1b27323d464e575f686d79818c929fa3a0958e81756d62584e443a2f261b110800000000101c2936434f5c6976828f9083767171717171717171717171717171716d685e5246392d201307000a1723303d4a5663707d8993939393939393939393939393939393938f8276695c4f4336291c10000000000000000000000000000000000000000406070a0c0e1011121213131211100e0c0a07060400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d1925303b4854606b7784919daaac9f93877b6e6153493f33272d2d2d3a4653606d7984919eabac9f92867a6d6054473d3221160c0100000000000000000000000916222f3c4955626f7c8895a2afa3978a7e839098938d847f7b777574747476797c81889297a1a9a89f958d80736a5f53473b30251a0e0200000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000000000000000000000000000d1a2633404d596673808c9996897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000c1925323f4c5865727f8b939393938d8073665a4d4033271a0d000000000000000009121c252e363e454d52575f62666a6e71737577787879797978777573706d67636059534d453e362d251b11080000000000000000000000000f1b27333e49525a5f60606060606069768390908376696060606060605f5a52493e33271b0f00000000000000000000010a121a202830363b4246484e5355585b5d5e5f5f5a61646c6c6c6c66635c52473d373127221b140b03000000000000000000000000000000000000000000000000000000000000010c161f2a343e45515c676e7b8586868686868686867a6e6154473b2e211408000000000000000000000000000000000000020d19242e3740474b4d53535353535353534d4c4740382f241a0f06000000000000000000000000000000000000000000000000000000000000000000000000000000000000030613131313131313130d0c0a07020000000000000000000000000003060809131313131313130b0b090501000000000000000007121d27313c464e575e616c71777b7f8183848586858584817f7b76706b605d554b43392f23180c040000000000000000000000000000000000000000000000020608080b0e1011121313131211100f0c0a07060400000000000000000000000000000000000000000713202c3945525d686d767676767676746f64584c4047535f6a6f767676767676726d62564a3e3125180b0007131f2c38434e5860696e7a828e939ca4a2989183796d605b51463d32281d140a0000000000101c2936434f5c6976828f91837e7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7a6d6154473a2e211407000a1723303d4a5663707d868686868686868686868686868686868686868276695c4f4336291c1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008141e2c38444f5965727f8c98a3aea4998c7f73655b5044372b1f2a36414c5663707d8a97a1ada79b8e8174685d5245392c2013040000000000000000000000000916222f3c4955626f7c8895a2afa89b8e818e9593878079726e6969686768656c6f757d859297a2ada79f92877b6e62574d42362a1e110500000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000000000000000000000000000d1a2633404d596673808c9996897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000c1925323f4c5865727f8686868686868073665a4d4033271a0d0000000000000000000a131c242c333b42464d5355575f626466696a6b6b6c6c6c6b6a686663605d55544f47423c332d241b130900000000000000000000000000121e2b37434f5a646c6c6c6c6c6c6c6c7683909083766c6c6c6c6c6c6c6c645a4f43372b1e12000000000000000000000000080e161e252a30363a3c4347484b4e504a505b636c7079797979736e63574b3f32262017110a020000000000000000000000000000000000000000000000000000000000000000040d18222934404b555f696e78797979797979797976685e5246392d2014070000000000000000000000000000000000000007121c252e353b3f404646464646464646413f3c362f261d12080000000000000000000000000000000000000000000000000000000000000000000000000000000000060c101220202020202020201a1917130e0800000000000000000000040a0f13151620202020202020181715110c06000000000000000c18242f39434e585f696e767e83888c8e909192929291908e8b87827d746d675d554b40342920150a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004111d2935414c565d6069696969696967645c53483c434e585f6269696969696965625b51463a2e221609000915222e3b4854606a6f7b8490949ea5a49f92867c6e675d51493f342b20160b020000000000101c2936434f5c6976828f95918a8a8a8a8a8a8a8a8a8a8a8a8a8a8a897d7063564a3d3023170a000916222f3c4854606b70797979797979797979797979797979797979797670665a4e4135281c0f00000000000000000000000000000000000003080b0d0e13131313131313131313131313131313131313131313131313131313131313131311100e0a06000000000000000000000000000000000000000000000000000000000002101c27333d4754616d7a86929facab9e9184786c6053463a2f242d3946525e6875828f9ba9aca095897c6f63564c4135291d11040000000000000000000000000916222f3c4955626f7c8895a2afaa9e938e9393877e736d67615e575b5a535b60626b707c85929fa6afa3998e8175695e52463a2d20140800000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000000000000000000000000000d1a2633404d596673808c9996897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000b1825313e4a56626d72797979797979736e63584b3f3226190c000000000000000000010a121a212930363c4247485761696b6c6c6c68605c5f5f5e5d5b595653514b48433d37312a211b1209010000000000000000000000000013202d3946535f6c767979797979797979839090837979797979797979766c5f5346392d201300000000000000000000000000050c13191f252a2d32373b3c3f444c545c606d727e868686868073665a4d4033271a0b060000000000000000000000000000000000000000000000000000000000000000000000060f18232f39434d575f616c6c6c6c6c6c6c6c6c6c5e564c41362a1e110500000000000000000000000000000000000000000a131c242a2f323339393939393939393433302b241d140b00000000000000000000000000000000000000000000000000000000000000000000000000000000030a11171c1f2d2d2d2d2d2d2d2d2726231f19120a0200000000000000070f161b1f22232d2d2d2d2d2d2d2524211d181109000000000004101d2935404b555f6a6e7b838a9095989b9c9a989898999c9b9a938f8981796d675c51453d32271b0f00000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010d1924303a444c52545c5c5c5c5c5c5b58534a41363c464e53555c5c5c5c5c5c585651493f34291e1206000916232f3c4956626f7c85919693939393928a7e716a5f554b40372d22190e04000000000000101c2936434f5c6976828f9393939393939393939393939393939393897d7063564a3d3023170a000713202c38444f5960636c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c69665e54493d3225190d0000000000000000000000000000000001080f14181a1b2020202020202020202020202020202020202020202020202020202020202020201e1d1a16110b04000000000000000000000000000000000000000000000000000000000b16202d3946525d6875818e9ba7aca096897c7063554b4135292e3a4754616d7a86929facaa9d9084776b6054443a2f24190d010000000000000000000000000916222f3c4955626f7c8895a2afafa59e9b958c7f736c605c55524d4e4e49505359606a717e8a949fabab9f92877b6e6154473b3025190e02000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000000000000000000000000000d1a2633404d596673808c9996897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000916222e3a46515b62656c6c6c6c6c6c66635c52473b2f23170a0000000000000000000000080f171f252a313744505d697378797979746d665e564e504f4c4a4745403938322b2620180f0900000000000000000000000000000013202d394653606c798686868686868686909494908686868686868686796c605346392d2013000000000000000000000000000002080d141a1e20262b343d454d565d666d747f87929892857b6e6154473b2e2114080000000000000000000000000000000000000000000000000000000000000000000000000007121d27313c454d53555f60606060606060605f524c443b3025190e020000000000000000000000000000000000000000010a12191e2325262d2d2d2d2d2d2d2d2726241f19130b02000000000000000000000000000000000000000000000000000000000000000000000000000000030c151c23282c393939393939393933322f2a241c140a00000000000007101920272b2e2f3939393939393932312e29221b12090000000006131f2c3945515d676e7c8490959d9d9993908d8b8b8b8d8f92999f9c938e82796d60584e43372b1c110600000000000000000000000106090b0c0e06060300000000000000020405060605040200000000000002070a0c0d0b0b0905010000000000000000000000000008131e28323a4145475050505050504e4c4841382f343c4347485050505050504c4a463f372d23180d01000d1a2633404d59667380868686868686868680746c61574e43392f251b100700000000000000101c2936434f5c697682868686868686868686868686868686868686867d7063564a3d3023170a0004101c27333d474f5456606060606060606060606060606060606060605c5a544c42382c211509000000000000000000000000000000020b131a202427272d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2a2927221c150d0500000000000000000000000000000000000000000000000000000005111d2935414c56636f7c8995a0aca89b8e8174675d5145392c37434e5865727f8b99a3aea2988b7f7265594f4332281e1308000000000000000000000000000916222f3c4955626f7c8895a2afb7afa89d9083786d605a514b464241413f44464f58616c76828f9ca9afa3998c7f7266564c41362a1e1105000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000000000000000000000000000d1a2633404d596673808c9996897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000006121e29343f495156586060606060605a58524a40362a1f1307000000000000000000000000050d141a1f263845525f6b788586868681786d685f584f47403d3a38352f2c27211a150e060000000000000000000000000000000013202d394653606c798693939393939393969696969393939393939386796c605346392d201300000000000000000000000000000000050c151d2328363e464f575f686d78818c939993877d70695e52463a2d20140700000000000000000000000000000000000000000000000000000000000000000000000000010b151f2a333c4246485253535353535353535346413b32291e14080000000000000000000000000000000000000000000000070d1316191a20202020202020201a1a17130e0801000000000000000000000000000000000000000000000000000000000000000000000000000000000a151e262e34384646464646464646403f3b362e261c120800000000040f19222b32383b3c464646464646463e3d3a342d241b1106000004111d2935414c55606d798391969f9b938e8783807f7e7f8082878f949e9d948e81746a605447382e23170b00000000000000000000070d121618191b13120f0b06000608080c0e1112131312110f0c09080603080e1317191a181715110c06000000000000000000000000020c1620283035393a43434343434341403c362f262a32373b3c4343434343433f3e3a342d251b110700000c1925323f4b57636d737979797979797979746e645a50453c31281d120900000000000000000f1c2835414e5a66707679797979797979797979797979797979797979706b6054483c2f22160900000b16212b353d44484a535353535353535353535353535353535353534f4e49423a30261b10050000000000000000000000000000010b141d252b3033343939393939393939393939393939393939393939393939393939393939393939393736332e271f170d040000000000000000000000000000000000000000000000000000010d1924303a4854606b7783909daaac9f92857a6d6054473c313b4754606a7783909dabac9f92867a6d6054473d3221160c01000000000000000000000000000916222f3c4955626f7c8895a2afb9ada1968a7d70665c5045403936302d33373d46505a63707d8a97a1adab9d908377685e5246392d201407000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000000000000000000000000000d1a2633404d596673808c9996897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000010d18232d373f464a4c5353535353534d4b4740382e24190e020000000000000000000000000002090e1926323f4c5965727f8c93938e827a6f6a6159514440393029241d1b160e0903000000000000000000000000000000000013202d394653606c798693928d89898989898989898989898989898986796c605346392d2013000000000000000000000000000000060e161e272e344048505960696e7a828e939f948c7f736b60574d42362a1e11050000000000000000000000000000000000000000000000000000000000000000000000000000030d18212a31373a3b4546464646464646463b3936302920170d0200000000000000000000000000000000000000000000000002070a0c0d13131313131313130e0d0b0703000000000000000000000000000000000000000000000000000000000000000000000000000000000006111c2630383f4453535353535353534d4b4740382e24190e020000000a16202b343d434749535353535353534b4a453f362d22180c01000613202c3945515d6773808d95a09b918c817b767372717273767b828f939e9f93877c6f62544a3f34281c100300000000000000010911181e22252628201f1c17110e121415181b1e1e1f201f1e1c191615130f12191f2326272524211d181109000000000000000000000000040e161e24292c2d3636363636363433302b251d20262b2e2f36363636363632312e29231b13090000000a16232f3b47525b63666c6c6c6c6c6c6c6c67645c52483e332a1f160c0000000000000000000d1925323d49545e66696c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6360594f44382c2013070000050f19232b33383c3d4646464646464646464646464646464646464643413d3830281e140a00000000000000000000000000000008131d262f363c404146464646464646464646464646464646464646464646464646464646464646464644423f3931291f150b00000000000000000000000000000000000000000000000000000008131e2c38434f5965727f8b98a2aea2988b7e7165574d4237404b55626f7c8895a0aca79b8e8174685d5245392c20130400000000000000000000000000000916222f3c4955626f7c8895a2afb7ab9e9184786c60544a3f342e2a2522272b343e4653606c7885919eabac9f93877a6e6154473b2e211408000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000000000000000000000002090e1a2633404d596673808c9996897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000007111b252d343a3e3f464646464646403f3b362e261c1208000000000000000000000000000000000b1825313e4a56626d75818f969490847c706b625b514a423a322a211911060000000000000000000000000000000000000013202d394653606c7986938d807d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7063564a3d3023170a0000000000000000000000000000070f18202830394045525a616b6f7b838f949d968f82776c60594f453b30251a0e02000000000000000000000000000000000000000000000000000000000000000000000000000000060f181f262b2d2e3939393939393939392e2d2a251e170e050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c17232e38424a505f606060606060605a58524a40362a1f13070000030f1b27323d464e545660606060606060585650483f34291d1105000714212d3a4754606d7a85929f9e948c7f746e696765656566696e78818f98a39a8e8175665c5044382b1f12060000000000000009131b23292e3132352d2b28221c1a1e212225282a2b2c2c2b2a282622221f1b1c242a2f323332312e29221b1209000000000000000000000000040c13191d2021292929292929282724201a13151b1f21222929292929292525221e1811090100000007131e2a35404952575960606060606060605a58524a40362c21180d040000000000000000000915212c38424c545a5c6060606060606060606060606060606060606056544f473d33271c100400000008111921272c2f30393939393939393939393939393939393939393635322c261e160c020000000000000000000000000000030f1a252f3841484c4e535353535353535353535353535353535353535353535353535353535353535353514f4a433b31271c11060000000000000000000000000000000000000000000000000000020f1b27323d4754606d7a86929facaa9c908376695f53473845515c6774808d9aa7aca095897c6f63564c4135291d110400000000000000000000000000000916222f3c4955626f7c8895a2afb6ac9a8d8073665b5042382e231d1a171b222b3744505b6574818e9ba7afa49a8a7e7164574b3e31241807000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000000000000000000040a0f141a1e2633404d596673808c9996897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000009131b23292e313239393939393933322f2a241c140a00000000000000000000000000000000000916222e3a46515b606d7a8491989691867d726d605c544c443c332b2317110a02000000000000000000000000000000000013202d394653606c7986938b7e727070707070707070707070707070706b6054483c2f22160900000000000000000000000000071019212a323a434b515b636c717d8591959f9991847a6d655b50473d33291f14090000000000000000000000000000000000000000000000000000000000000000000000000000000000060e141a1e21222c2d2d2d2d2d2d2d2d21201e19140d05000000000000000000000000000000000000000000000000000000000000000000000000000000000001070b0f1112131313131313130a090704000001070b0f1112131313131313130a0907040000000000000003101c28343f4a545c6c6c6c6c6c6c6c6c66635c52473b2f23170a000006131f2b38434e5860626c6c6c6c6c6c6c65625a50453a2e211509000b1825323e4b5865717e8b989e9c8f82756d615e57585858575e666e7b86929f9e9285786d6053463a2d20130700000000000009121b252d353a3e3f413938332d26262b2e2f323537383939383735322f2e2b27262e353b3f403e3d3a342d241b120900000000000000000000000002080d1113141d1d1d1d1d1d1b1a18140f080a0f1215151d1d1d1d1d1d191816120d070000000000020d19242e3740474b4d53535353535353534d4c4740382f241a0f060000000000000000000005101b26303a42494e4f535353535353535353535353535353535353534a48443d352b21160b0000000000080f161c2022232d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d292825211b140c040000000000000000000000000000000814202b36414a53585a6060606060606060606060606060606060606060606060606060606060606060605d5b554d43392e22160a0000000000000000000000000000000000000000000000000000000a16202c3945515d6774818e9aa7ab9f94887b6e62544a3f4653606d7985929fabaa9d9084776b6054443a3024190d0100000000000000000000000000000916222f3c4955626f7c8895a2afafa49a897d7063544a3f30261c120e0b0f1b27333f495364717e8b97abb5ac9a8d8073675a4d402e23180c000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d0000000000000000000002080d161b1f252a2d33404d596673808c9996897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000010911181e2225252d2d2d2d2d2d2726231f19120a02000000000000000000000000000000000006121e29353f45525d686f7c86929f9892877f746d665d564d453d3528231c140c030000000000000000000000000000000013202d394653606c7986938b7e7265636363636363636363636363636360594f44382c201307000000000000000000000000040f19222b333c444c555c606d737e869297a09f92877c6f685d53493f352b20170d0200000000000000000000000000000000000000000000000000000000000000000000000000000000000003090e1214151f20202020202020201414110e08020000000000000000000000000000000000000000000000000000000000000000000000000000000000050c12171b1e1f20202020202020171613100b050c12171b1e1f20202020202020171613100b05000000000006121f2c3844505c667679797979797979736e63584b3f3226190c00000815222e3b4754606a6f79797979797979716c62564a3d3124170b000e1b2835414e5b6874818e909192897c6f635b524d4c4b4c4d545e6976828f9ca297887b6e6155483b2e221508000000000009121b252d373f464a4c4e46443f382f31373a3b3f41444546464544423f3c3b37322c3840474b4d4b4a453f362d241a120800000000000000000000000000010407071010101010100e0d0b08030000030608091010101010100c0b0906010000000000000007121c252e353b3f404646464646464646413f3c362f261d12080000000000000000000000000a141e2830383d4143464646464646464646464646464646464646463d3c38332b23190f05000000000000050b10131617202020202020202020202020202020202020201c1c1915100a02000000000000000000000000000000000b1824303c48535c64676c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6a675f554a3f33271a0e00000000000000000000000000000000000000000000000000000004111d2935414c55626f7c88959faba6998d8073665c50444d5764717e8a97a2ada2988b7f7265594f4332281e13080000000000000000000000000000000916222f3c4955626f7c8895a2afac9f93867a6d6053473a2d20140a00000b17222d3c4855626f7b8899a4afa99c8f837669554b4034281c10040000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000000000000050c131921272c30363a3b404d596673808c9996897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000070d121618192020202020201a1917130e0800000000000000000000000000000000000000010d18232935414c565f6a727e8b939e99938c81786d685f574f473f342e261e150c0300000000000000000000000000000013202d394653606c7986938b7e72655856565656565656565656565656544f473d33271c10040000000000000000000000000a16212b343d454d565e676d757f8a9298a19e938b7f726a60564c41382d23190e050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000205070812131313131313131308070502000000000000000000000000000000000000000000000000000000000000000000000000000000000000060f171e23282a2b2d2d2d2d2d2d2d2322201c160f171e23282a2b2d2d2d2d2d2d2d2322201c160f08000000000713202d3a4653606d78868686868686868073665a4d4033271a0d00000916232f3c4956626f7c868686868686867e7165584b3e3225180b000c1926323f4c5965727f8283848586786d605346423f3e3f424d576773808d9aa995897c6f6256493c2f2316090000000008121b242d373f495157595b53504a42383c4247484b4e5151525352514f4c4947433c39404a52585a585650483f362c241a1108000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a131c242a2f323339393939393939393433302b241d140b00000000000000000000000000020c161e262c32353639393939393939393939393939393939393939302f2c27211911080000000000000000000407090a13131313131313131313131313131313131313100f0d09050000000000000000000000000000000000000d1a2733404c58646e747979797979797979797979797979797979797979797979797979797979797979797771675b4f4236291d10000000000000000000000000000000000000000000000000000000010d19242f3a47545f6a7783909da9ab9e9184796d605346525e6976828f9ca9ac9f92867a6d6054473d3221160c020000000000000000000000000000000916222f3c4955626f7c8895a2afaa9e918477675d5145392c20130200000613202d3a4653606d7986939facab9e918478675c5145382c1f13060000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d0000000000000000070e171e252a32383b4246474b4e596673808c9996897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000070d121618192020202020201a1917130e080000000000000000000000000000000000000000070d19242f3a434e58626d75818e95a09f928e827a6e69605951443f3830271e150b00000000000000000000000000000013202d394653606c7986938b7e7265584b4a4a4a4a4a4a4a4a4a4a4a4a48443d352b21160b000000000000000000000000030f1b27323d464e575f686d79818c929fa3a0958e81756d62584e443a2f261b11080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050f1821282f34373839393939393939302f2c27211921282f34373839393939393939302f2c27211911080000000713202d3a4653606d798693939393938d8073665a4d4033271a0d00000916232f3c4956626f7c8993939393938b7e7165584b3e3225180b000c1825313e4a57636d7275767778796d665c5044383030363f4c5966727f8c99ab96897d7063564a3d3023170a000000040d1a242d363f49515b626568605b544a45464d5355585b5d5e5f5f5e5d5b5955544e47454a525c636665625a50483e362c231a0d0400000000000000000003060809131313131313131313131313131313131313131313131313130b0a0804000000000000000000010a12191e2325262d2d2d2d2d2d2d2d2726241f19130b020000000000000000000000000000040c141b212528292d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2322201c160f0800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e1b2734414e5a67748186868686868686868686868686868686868686868686868686868686868686868683776a5d5144372a1e110000000000000000000000000000000000000000000000000000000008131e2b37434e5865717e8b97a2ada1968a7d7063564c54616e7b87939faca79b8e8174685d5245392c201304000000000000000000000000000000000916222f3c4955626f7c8895a2afa89c8f827569554b4035291d1104000006131f2c3845515c677884919eabac9f9386796d6053463a2d2013070000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d00000000000000071019202930363d44484d5254575b5d6673808c9996897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000010911181e2225252d2d2d2d2d2d2726231f19120a020000000000000000000000000000000000000008131e28313c46515b606d79839198a29d948f847b706b625b504a423930271d1207000000000000000000000000000013202d394653606c7986938b7e7265584b3f3d3d3d3d3d3d3d3d3d3d3d3c38332b23190f0500000000000000000000000007131f2c38434e5860696e7a828e939ca4a2989183796d605b51463d32281d140a0000000000000000000000000000000000000000000002070c0f11121313131313131313131313131313131313131313131313131313131313131313131313131308070502000000000000000000000001070b0f1112131313131313130a09070400000000000000010c17212a333a404345464646464646463d3c38332b232a333a404345464646464646463d3c38332b23190f0500000713202d3a4653606d7986939f9f9f998d8073665a4d4033271a0d00000916232f3c4956626f7c89959f9f9f988b7e7165584b3e3225180b000916222e3a46515b636568696b676d675c544a3f41414142464e586673808d99a399887c6f6255493c2f2216090000010c161f2c363f48515b626d72746c665b545153575f6265686a6b6c6c6b6a68656260585452525c636e73716c625a50483e352c1f160c01000000000000040a0f12151520202020202020202020202020202020202020202020202020171714110c05000000000000000000070d1316191a20202020202020201a1a17130e080100000000000000000000000000000000020a1015191c1c20202020202020202020202020202020202020171613100b05000000000000000000000000000000000000000003090d1012131313131313130e0d0b080300000000000000000000000000000000000000000e1b2734414e5a6774818d939393939393939393939393939393939393939393939393939393939393939083776a5d5144372a1e1100000000000000000000000000000000000000000000000000000000010f1b26323c4753606d7985929faba99b8e8275685d525966737f8c99a4aca095897c6f63564c4135291d1104000000000000000000000000000000000916222f3c4955626f7c8895a2afa79a8d8174675a4e412f24180d01000004101c2834404b556a7683909da9afa49a887b6e6155483b2e2215080000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000000061019222b323a41464f54575e6164676a6b73808c9996897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000009131b23292e313239393939393933322f2a241c140a00000000000000000000000000000000000000010c161f2a343f45515d676e7c86929fa59f9691857d726d605c544b42392e23180c000000000000000000000000000013202d394653606c7986938b7e7265584b3f3d3d3d3d3d3d3d3d3d3d3d3c39332c231a10050000000000000000000000000915222e3b4854606a6f7b8490949ea5a49f92867c6e675d51493f342b20160b02000000000000000000000000000000000000000000060d13181c1e1f202020202020202020202020202020202020202020202020202020202020202020202020201514120e09030000000000000000050c12171b1e1f20202020202020171613100b05000000000007121e28333c454b5052535353535353534a48443d352b333c454b5052535353535353534a48443d352b21160b00000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2aca4988b7e7165584b3e3225180b0006121e2a353f495157595b5d555c605c554b474e4e4e4e4d52575f6a76838f9c9f92867a6d6054473a2d211407000007131d28313e48505a626d727f81786c665b5c6064696e727477787979787775726f6a65605d5c636e73807e716c615a50473e31281e13080000000000060e151b1f21222d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2423211c17100800000000000000000002070a0c0d13131313131313130e0d0b0703000000000000000000000000000000000000000005090d0f10131313131313131313131313131313131313130a090704000000000000000000000000000000000000000000070e14191d1f202020202020201b1a17140e08010000000000000000000000000000000000000e1b2734414e5a6774818d9a9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9d9084776a5d5144372a1e1100000000000000000000000000000000000000000000000000000000000a151f2c3945515d6774808d9aa6ac9f92867a6d6154606b7784919eabaa9d9084776b6054443a3024190d01000000000000000000000000000000000916222f3c4955626f7c8895a2afa6998c807366594d4033261a07000000000c18232e424f5c6975828f9ca8b6ac95887c6f6255493c2f2216090000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d0000000000050e18222b343d444c52596063696e7174767778808c9996897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000007111b252d343a3e3f464646464646403f3b362e261c120800000000000000000000000000000000000000040d18222935404b555f6a717e8a939da7a09792877f746d665c544b4034281c10040000000000000000000000000013202d394653606c7986938b7e7265584b4a4a4a4a4a4a4a4a4a4a4a4a49443e362c22170b0000000000000000000000000916232f3c4956626f7c85919693939393928a7e716a5f554b40372d22190e04000000000000000000000000000000000000000000070f171e24282b2c2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d22211e1a140e06000000000000060f171e23282a2b2d2d2d2d2d2d2d2322201c160f08000000000b17232f3a454e565c5e6060606060606056544f473d333a454e565c5e6060606060606056544f473d33271c1004000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b00010d18232d373f464a4c4f504b5153514c52545a5a5a5b575e61696f7c87929f9c8f8376675d5145392c20130600010d18242f3a43505a626c727f8b8e81786c66666d71767b7e81848485868584827f7c77726d68606e73808d877e716c61594f433a2f24190d0100000006101820262b2e2f3939393939393939393939393939393939393939393939393931302d28221a1208000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000811191f25292b2c2d2d2d2d2d2d2726241f1a130b0200000000000000000000000000000000000e1b2734414e5a6774818d9aa7acacb2a9a19e9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9084776a5d5144372a1e11000000000000000000000000000000000000000000000000000000000004101d2935404b55626f7b88949faba3998b7e726557636f7c8996a0aca2988b7f7265594f4332281e130800000000000000000000000000000000000916222f3c4955626f7c8895a2afa5988b7f7265584c3f3225190c00000000071b2835424e5b6875818e9ba8b0a396897d7063564a3d3023170a0000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d00000000020c16202a343d464e565e616b6f757b7e8183848587939f96897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000010d18232d373f464a4c5353535353534d4b4740382e24190e0200000000000000000000000000000000000000071018242f39434e58616c74818e95a0a9a299928b80786d665c5145382c1f13060000000000000000000000000013202d394653606c7986938b7e726558575757575757575757575757575550483e33281c100400000000000000000000000d1a2633404d59667380868686868686868680746c61574e43392f251b1007000000000000000000000000000000000000000000060f1921292f343738393939393939393939393939393939393939393939393939393939393939393939393939392e2d2b261f180f0600000000050f1821282f34373839393939393939302f2c27211911080000000f1b2834404b5660686b6c6c6c6c6c6c6c6360594f4438404b5660686b6c6c6c6c6c6c6c6360594f44382c201307000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b000007111c252d353a3e3f42434045474c565d616767676869696e727b8491999e938a7d7063554b4135291d11040004111d2935404b55616c717e8893938e81786c70797e83888b8e9091929291908e8c88847f7a726d73808d9292877e716b61554c4135291d11040000040e18222a32373b3c464646464646464646464646464646464646464646464646463e3c39332c241a1005000000000000000000000000020608080c0b09060100000000000000000000000000000000000000000004080a0b0807050200000000000000000000000000000000000205070813131313131313130707050100000000000000000007111a232a313538393939393939393433302b241d140b01000000000000000000000000000000000e1b2734414e5a6774818d9aa9b3b9ada1979191919191919191919191919191919191919191919191919083776a5d5144372a1e110000000000000000000000000000000000000000000000000000000000000c18242f3947535f6a7683909ca9ab9d908376695f6774818e9aa8ac9f92867a6d6054473d3221160c0200000000000000000000000000000000000916222f3c4955626f7c8895a2afa5988b7e7265584b3f3225180c000000010e1b2834414e5b6774818e9aa7b0a3978a7d7064574a3d3124170a0000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d0000000008131e28323c464e5860686d767c82878a8e9091929399a496897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000006121e29343f495156586060606060605a58524a40362a1f1307000000000000000000000000000000000000000007121d28313c46505a606d7983909893939393928d82796d6053463a2d2013070000000000000000000000000013202d394653606c7986938b7e72656464646464646464646464646464615a5044392d20140800000000000000000000000c1925323f4b57636d737979797979797979746e645a50453c31281d1209000000000000000000000000000000000000000000020d17212b333b404445464646464646464646464646464646464646464646464646464646464646464646464646463b3a37312a21180e030000010c17212a333a404345464646464646463d3c38332b23190f050000111e2a3743505c68727879797979797979706b6054483c43505c68727879797979797979706b6054483c2f221609000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b0000000a131c232a2e3132352f343946525d686d7474747475777b7f8591969e938e81746b6155433a2f24180d01000613202c3945515d67717e87939a9d938e81797d848b9095989b9d9e9f9f9e9d9b9895918c857f79808d929c9992877d70675d5145392c20130600000a15202a343c434748535353535353535353535353535353535353535353535353534a49453e362c22170c0000000000000000000003090e121415191815120d06000000000000000000000000000000000000050c111417171514120e09030000000000000000000000000002090e12141520202020202020201413110d0802000000000000030e19232c353c414546464646464646413f3c362f261d1308000000000000000000000000000000000e1a2734414d5a6774808d97a2adb8ab9e91858484848484848484848484848484848484848484848484848275685c4f4235291c0f00000000000000000000000000000000000000000000000000000000000007121d2b37434e5864717e8a97a1ab9f95887b6e616d7985929faba79b8e8174685d5245392c2013040000000000000000000000000000000000000916222f3c4955626f7c8895a2afa4978b7e7164584b3e3125180b000000010e1b2734414e5a6774818d9aa7b1a4978a7e7164574b3e3124180b0000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000010d1925303a444e58606a6f7a82898f94979a9d9e9f9fa4ab96897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000000101d2a3643505d69768390908376695d5043362a1d100000000000000000000916222e3a46515b62656c6c6c6c6c6c66635c52473b2f23170a0000000000000000000000000000000000000000010c161f2a343e45515c676e7b8586868686868686867a6e6154473b2e2114080000000000000000000000000013202d394653606c7986938b7e727070707070707070707070707070706c6155493c3023160a00000000000000000000000a16232f3b47525b63666c6c6c6c6c6c6c6c67645c52483e332a1f160c0000000000000000000000000000000000000000000007131e29333d454c5052535353535353535353535353535353535353535353535353535353535353535353535353534846423c332a1f1409000007121e28333c454b5052535353535353534a48443d352b21160b0000121f2b3845525e6b7884868686868686867d7063564a3d45525e6b7884868686868686867d7063564a3d3023170a000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b000000010a11181e22252628232e3a4754616d7a808181818284878c929796918b81796d60594f4431281d130700000714202d3a4753606d7a859297a2a59d938e848991969d9fa7a7aaa8a7a7a8aaa8a7a09d97928b858d929ca4a39892857a6d6054473a2d21140700030f1b26323c464e535560606060606060606060606060606060606060606060606060575550483e33281c11040000000000000000060e151a1e21222524221e181109010000000000000000000000000000000810171c21232422211e1a140d060000000000000000000000050d141a1e20212d2d2d2d2d2d2d2d21201d19130c05000000000009141f2a353e474d51535353535353534e4c4741382f241a0e030000000000000000000000000000000815212e3b4854616e7b85929ea4aea99d9083787777777777777777777777777777777777777777777777756f65594d4134281b0e000000000000000000000000000000000000000000000000000000000000010f1a26313c4653606d7985929eaca7998c7f7366717d8a98a2aca095897c6f63564c4135291d11040000000000000000000000000000000000000916222f3c4955626f7c8895a2afa4988b7e7165584b3e3225180b000000010e1a2734414d5a6774808d9aa7b1a4978b7e7164584b3e3125180b0000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d00000005111d2a36414c565f6a6f7d848f949c9ea6a7a9aaabacafa296897c6f635649505c6976838f9c9286796c5f5346392c201306000000000000000000000000030a0f1d2a3643505d69768390908376695d5043362a1d0f0a03000000000000000b1825313e4a56626d72797979797979736e63584b3f3226190c000000000000000000000000000000000000000000040d18222934404b555f696e78797979797979797976685e5246392d2014070000000000000000000000000013202d394653606c7986938d807d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7e7064574a3d3124170a000000000000000000000007131e2a35404952575960606060606060605a58524a40362c21180d04000000000000000000000000000000000000000000000c18242f3b454f575d5f6060606060606060606060606060606060606060606060606060606060606060606060606055534d453c31261a0e02000b17232f3a454e565c5e6060606060606056544f473d33271c100400121f2b3845525e6b7885919393939393897d7063564a3d45525e6b7885919393939393897d7063564a3d3023170a000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b0000000000070d121618191c212e3b4854616e7b878d8d8e8f9193938f8d89847e756d675c51473e331f160c0100000613202c3945515d676f7c859298a2a59d9591959da0a8aba8a09d9b9a9a9b9d9fa4aca9a19e9691969ca4a39992867d70675d5145392c2013060006121f2b37434e585f626c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c64615a5045392d21140800000000000000060f181f262b2e2f32312e29231b130a010000000000000000000000000008121a22282d30312e2d2a261f180f06000000000000000000050f171f252a2d2e39393939393939392e2d2a251e160e05000000010d1925313c4750585e5f6060606060605a58524a41362b1f14080000000000000000000000000000000714202d3a46525e69707d8a929da7ab9f958d80736b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a68655d54493d3125190c000000000000000000000000000000000000000000000000000000000000000a151f2c3845515c6773808d9aa4aa9d9184776a75828e9baaaa9d9084776b6054443a3024190d010000000000000000000000000000000000000916222f3c4955626f7c8895a2afa5988b7e7265584b3f3225180c000000010e1b2734414e5a6774818d9aa7b1a4978a7e7164574b3e3124180b0000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d0000000713202d3946525e686f7c8691969ea6aab0b4b6b7b8b9afa296897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000060e151a1f2a3643505d69768390908376695d5043362a1f1a150e060000000000000c1925323f4c5865727f8686868686868073665a4d4033271a0d00000000000000000000000000000000000000000000060f18232f39434d575f616c6c6c6c6c6c6c6c6c6c5e564c41362a1e11050000000000000000000000000013202d394653606c798693928d8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a86796c605346392d20130000000000000000000000020d19242e3740474b4d53535353535353534d4c4740382f241a0f0600000000000000000000000000000000000000000000000f1c2834404c5761686b6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c5f574d42372b1e1205000f1b2834404b5660686b6c6c6c6c6c6c6c6360594f44382c20130700121f2b3845525e6b7885919e9f9f9f96897d7063564a3d45525e6b7885919e9f9f9f96897d7063564a3d3023170a000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b0000000000000106090c0c15212e3b4854616e7b87949a9b9c9e938682807d78716c605c554b40352c210d0400000004111d2935404b55606a6f7c869298a2a7a09da0a7a9a29f9996918f8e8d8e90939a9ea1a8a8a19ea1a8a39992877d706b60554c4135291d1104000815212e3b47535f6a7679797979797979797979797979797979797979797979797979716c6155493c3023170a000000000000060f18212a31373a3b3f3e3a342d251c130a01000000000000000000000008121a242c33393c3e3b3a36312921180f0500000000000000020d17212930363a3b4646464646464646463936302820160c02000004101d2935414d58626a6c6c6c6c6c6c6c67645c52473c3024170b00000000000000000000000000000005121e2a36424d57616c74808d95a0aaa79f93887d70685e545e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5c59544b42372c2115090000000000000000000000000000000000000000000000000000000000000004101c2834404b55616e7b87939faca095887b6f7985929faca3988b7f7265594f4332281e1308000000000000000000000000000000000000000916222f3c4955626f7c8895a2afa5988b7f7265584c3f3225190c000000010e1b2834414e5b6774818e9aa7b0a4978a7d7164574a3e3124170b0000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000005121e2a36424d57616d7a849198a1a8b0b7bbc1c3c4c5bcafa296897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000006101820262b2e3643505d69768390908376695d5043362e2b262018100600000000000c1925323f4c5865727f8b939393938d8073665a4d4033271a0d000000000000000000000000000000000000000000000007121d27313c454d53555f60606060606060605f524c443b3025190e020000000000000000000000000013202d394653606c798693939393939393939393939393939393939386796c605346392d201300000000000000000000000007121c252e353b3f404646464646464646413f3c362f261d1208000000000000000000000000000000000000000000000000111e2b3744505d6873787979797979797979797979797979797979797979797979797979797979797979797979797976695f53463a2d21140700111e2a3743505c68727879797979797979706b6054483c2f22160900121f2b3845525e6b7885919eabaca396897d7063564a3d45525e6b7885919eabaca396897d7063564a3d3023170a000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b000000000000060b0f12131c212e3b4854616e7b8793939495989a9285817d756e685e574d43392e23180c00000000010d18242f3a434e58606a6f7d86929aa4acaaaca59d97928c88848281818283878b91969fa3ababadac9f92877d706b61594f433a2f24190d01000915222f3c4855626f7c868686868686868686868686868686868686868686868686867e7164574a3e3124170b0000000000050f18212a333c4247484c4a463f372e251c130a0100000000000000000008121a242c363e45494a4846423b332921170e0500000000000009141f29333b42464853535353535353535346413a32281e1308000005121f2b3845515e6a7479797979797979746e64584c3f33261a0d000000000000000000000000000000020e1a25303b454f59606d79839098a2aea49a92857a6e665b5051515151515151515151515151515151514f4d49423930261b100400000000000000000000000000000000000000000000000000000000000000000c18232e3946535f6976828f9ca9a7998c7f737d8a98a2ac9f92867a6d6054473d3221160c02000000000000000000000000000000000000000916222f3c4955626f7c8895a2afa6998c7f7366594c4033261907000000020f1b2835424e5b6875818e9ba8b0a3978a7d7064574a3d3124170a0000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d00000714212d3a46535f6974818e96a1aab2bac2c7ccd0d1c9bcafa296897c6f635649505c6976838f9c9286796c5f5346392c201306000000000000000000061018222a31373a3c43505d69768390908376695d50433c3a37312a22181006000000000c1925323f4c5865727f8b989f9f998d8073665a4d4033271a0d0000000000000000000000000000000000000000000000010b151f2a333c4246485253535353535353535346413b32291e1408000000000000000000000000000013202d394653606c798686868686868686868686868686868686868686796c605346392d2013000000000000000000000000000a131c242a2f323339393939393939393433302b241d140b00000000000000000000000000000000000000000000000000121f2c3845525f6b7885868686868686868686868686868686868686868686868686868686868686868686868686867b6e6155483b2e22150800121f2b3845525e6b7884868686868686867d7063564a3d3023170a00121f2b3845525e6b7885919eabaca396897d7063564a3d45525e6b7885919eabaca396897d7063564a3d3023170a000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b00000000020a11171c1f2028232e3b4854616e7b86868687898c9195928e89827a6e695e544a4034281c10040000000007131d28313d464e58606b6f7c87939facaba39f938e857f7b7775747475777a7e848c9299a2a9b3a4978a7e716b61594f473d31281e130800000916232f3c4956626f7c8993939393939393939393939393939393939393939393938a7d7164574a3e3124170b00000000050e172129333c454d5355585651493f372e251c130a010000000000000008121a242c363e4850555755534d453b332920170e0500000000020e1a25303b454d525f60606060606060605f524c443a3025190d01000613202c3946535f6c79868686868686868074675a4e4134271b0e0100000000000000000000000000000009141f29333e45515c676e7b86929fa5aca1978f82786c60594f4444444444444444444444444444444442413d3730271e140900000000000000000000000000000000000000000000000000000000000000000007121d2b37424d5764717d8a97a1aa9d908377818e9baaa79b8e8174685d5245392c20130400000000000000000000000000000000000000000916222f3c4955626f7c8895a2afa79a8d8174675a4e412e23180c000000030f1c2936424f5c6975828f9ca8afa296897c6f6356493c302316090000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d00000815222e3b4855616e7b87929fa8b2bcc4ccd3d7dcd5c9bcafa296897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000060f18222a343c43474847505d69768390908376695d50474847433c342a22180f060000000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000000000000000000000000000000000000000000030d18212a31373a3b4546464646464646463b3936302920170d02000000000000000000000000000013202d3946535f6c767979797979797979797979797979797979797979766c5f5346392d201300000000000000000000000000010a12191e2325262d2d2d2d2d2d2d2d2726241f19130b0200000000000000000000000000000000000000000000000000121f2c3845525f6b7885929393939393939393939393939393939393939393939393939393939393939393939393887b6e6155483b2e22150800121f2b3845525e6b7885919393939393897d7063564a3d3023170a00121f2b3845525e6b7885919e9f9f9f96897d7063564a3d45525e6b7885919e9f9f9f96897d7063564a3d3023170a000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b000000020b141c22282b2d352e343a46535e69767979797a7c7f848c9399948f847b6e665c5144382c1f150900000000010c161f2b343d45515d67717e8b9aa4afa399928b817a736e6968676768686e72797f879297a2aaa6998c7f73695f53463e352b1f160c010000091623303c4956636f7c89969f9fa8a19e9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c978a7d7164574a3e3124170b000000020b172029333b454d575f6265625b51493f372e251c130a01000000000008121a242c363e48505a6164615f574d453b322920170c0200000005121e2a36424d575e6c6c6c6c6c6c6c6c6c6c5e564c41362a1d1105000613202c3946535f6c798692939393938d8174675a4e4134271b0e01000000000000000000000000000000030d17212834404b555f69717e8a939da8a99f948c7f736b60564c4135373737373737373737373737373534312c261e150c02000000000000000000000000000000000000000000000000000000000000000000000e1a26313c4653606d7984919eaba095887b85929faba095897c6f63564c4135291d110400000000000000000000000000000000000000000916222f3c4955626f7c8895a2afa89b8f827568544a4034281c1004000004101c2934404b556a7683909da9b4aa95887b6f6255483c2f2215090000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d0006121e2b37424d576774818d99a3afbac4ced6dfe3e2d5c9bcafa296897c6f635649505c6976838f9c9286796c5f5346392c20130600000000000000030e18212a343c464e535554525d69768390908376695d525455534e463c342a21180e0300000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d00000000000000000000000000000000000000000000000000060f181f262b2d2e3939393939393939392e2d2a251e170e05000000000000000000000000000000121e2b37434f5a646c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c645a4f43372b1e12000000000000000000000000000000070d1316191a20202020202020201a1a17130e08010000000000000000000000000000000000000000000000000000121f2c3845525f6b7885929e9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f94887b6e6155483b2e22150800121f2b3845525e6b7885919e9f9f9f96897d7063564a3d3023170a00121f2b3845525e6b7885919393939393897d7063564a3d45525e6b7885919393939393897d7063564a3d3023170a000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b0000000a141d262d33383942434045464d575e6c6c666d6d6f72787f87939f969083786d6053463c31261a0e0200000000040f1b27333f4953606d7984919eaca49f92877f746d68615f575b5a565e61676d727d859298a2ac9f92867b6e61564c41362a1e11050000000a1623303d495663707c899aa4aca196918f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8a7d7164574a3e3124170b0000000a141d29323b454d575f696e726d635b51493f372d251c130a0100000008121a242c363e48505a616c716e695f574d443b32291e140a0000000714202d3a46525e6976797979797979797976685e5246392d201307000613202c3946535f6c7986929f9f9f9a8d8174675a4e4134271b0e0100000000000000000000000000000000050f18232e39434d57616c74818e95a0aaa69f92877d6f685d52463f342a2b2b2b2b2b2b2b2b2b2b2b292825211b140c03000000000000000000000000000000000000000000000000000000000000000000000009141f2c3844505c6673808c99a4a79c8f828f97a2aa9d9084776b6054443a3024190d0100000000000000000000000000000000000000000916222f3c4955626f7c8895a2afaa9d908477665c5144382c1f1206000006131f2c3845515c677884919eabaea298877a6d6154473a2e2114070000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000814212d3a47535f697884919eabb5c0ccd6e0e8f1e2d5c9bcafa296897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000009151f2a333c464e585f62615e566976839090837669565e61625f584e463c332a1f150900000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d0000000000000000000000000000000000000000000000000000060e141a1e21222c2d2d2d2d2d2d2d2d21201e19140d05000000000000000000000000000000000f1b27333e49525a5f60606060606060606060606060606060606060605f5a52493e33271b0f0000000000000000000000000000000002070a0c0d13131313131313130e0d0b070300000000000000000000000000000000000000000000000000000000121f2c3845525f6b7885929eabacacaea9a7a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a194887b6e6155483b2e22150800121f2b3845525e6b7885919eabaca396897d7063564a3d3023170a00121f2b3845525e6b7884868686868686867d7063564a3d45525e6b7884868686868686867d7063564a3d3023170a000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b000006111c262f383f44464f504b51535452535f605c606162666c727f8b95a0958c7f7265574e42372b1e12060000000005121f2b3744505b65727f8c97a1a89c928a7e726d615d56534d4e4e4c52555c606b707c86929fa6a3988e8175685e5246392d2014070000000815222f3b4855626e7b87939fa99e91848383838383838383838383838383838383827d706356493d3023160a000006111b262f3b444d575f696e7b7f726d635b51493f372d251c130a010008121a242c363e48505a616c717d7b6e695e564d443a30261c110600000815212e3b4854616e7b86868686868686867a6d6154473a2e211407000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e01000000000000000000000000000000000007121d27303c45505a606d79839198a3aea39991847a6d615b51463c31281d1e1e1e1e1e1e1e1e1e1c1b191510090200000000000000000000000000000000000000000000000000000000000000000000000003101c28343f4a54616e7b87939fac9e948f949ea9a3988b7f7265594f4332281e13080000000000000000000000000000000000000000000916222f3c4955626f7c8895a2afac9f9286796d6053463a2d20130900000714202d3a4753606d7a86939facac9f928579685e5246392d2013070000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000815222e3b4855616e7b8896a1adbdc7d1dee8f2efe2d5c9bcafa296897c6f635649505c6976838f9c9286796c5f5346392c201306000000000000020e1a26313c454e585f6a6f6d685e69768390908376695e686d6f6a5f584e453c31261a0e02000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d00000000000000000000000000000000000000000000000000000003090e1214151f20202020202020201414110e080200000000000000000000000000000000000a16212c3740494f535353535353535353535353535353535353535353534f4940372c21160a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000121f2c3845525f6b7885929eabb8aea49d9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a94887b6e6155483b2e22150800121f2b3845525e6b7885919eabaca396897d7063564a3d3023170a00111e2a3743505c68727879797979797979706b6054483c43505c68727879797979797979706b6054483c2f221609000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b00000b17222d38424a50535b5d555c60605d564c4a505354545b606c7883909d9e9184786a5f53473a2e211408000000000613202d394653606c7884919ea9a0968d80736c625b524c4642414141464b5159606a717e8a939eaa9f92867a6e6154473b2f24180c0000000814212e3a47535f6975818e97a29d9084787676767676767676767676767676767676706b6054483b2f22160900000b17222d38414d565e696e7b848b7f726d635b51493f372d251b130a08121a242c363e48505a616c717e86847b6e695e564c42382e23170b00000815212e3b4854616e7b87939393939393877a6d6154473a2e211407000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e010000000000000000000000000000000000000b151e2a333e45515d676f7c86929fa5aba1968f82756d62584e433a2f24180f111111111111110f0e0c09040000000000000000000000000000000000000000000000000000000000000000000000000000000c17232e3846535e6975828f9ca8a69e9c9ea6ac9f92867a6d6054473d3221160c020000000000000000000000000000000000000000000916222f3c4955626f7c8895a2afaea399887c6f6255493c31261a0d06030615222f3c4855626f7b8899a4afaa9d9084776a564c41362a1e11050000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000b1825313e4b5864717e8b97a8b2bdcfd9e3f0faefe2d5c9bcafa296897c6f635649505c6976838f9c9286796c5f5346392c20130600000000000006121e2b37424d575f6a6f7b7a6d686976839090837669686d7a7b6f6a5f574d42372b1e1206000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000000000000000000000000000000000000000000000000000002050708121313131313131313080705020000000000000000000000000000000000000005101b252e373e4346464646464646464646464646464646464646464646433e372e251b10050000000000000000000000000000000000000003080b0e0e131313131313130a090704000000000000000000000000000000000000000000000000000000121f2c3845525f6b7885929eabb8a99d928d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d887b6e6155483b2e22150800121f2b3845525e6b7885919e9f9f9f96897d7063564a3d3023170a000f1b2834404b5660686b6c6c6c6c6c6c6c6360594f4438404b5660686b6c6c6c6c6c6c6c6360594f44382c201307000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b00030f1c28333f4a545b6068696b676d6d685d52454446474a505b6573808c99a196887b6e6255483b2f221508000000000a1623303d495663707d8996a0a99e9184786d605a5146413a373130363940454f58616c75828f99a3a3998c7f7266554b4035291d1004000006121e2b37424d57616e7b85929fa0958c80736c6969696969696969696969696969696360594f44382c20130700030f1b27333f49535e696e7b8491918c7f726d635b51493f372d251b13121a242c363e48505a616c717e879291847b6e685e544a3f34281c1003000815212e3b4854616e7b87949f9f9f9f94877a6d6154473a2e211407000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e01000000000000000000000000000000000000030c18212935404b555f6a727f8b939ea8a89e948b7f726a5f554b41352921180d030404040404020200000000000000000000000000000000000000000000000000000000000000000000000000000001070c06111c2a36424d5763707d8a96a1acaaa8aab0a79b8e8174685d5245392c201304000000000000000000000000000000000000000000000916222f3c4955626f7c8895a2afb5ab998c7f7266574d42372b1f15120f121c2834404a5465717e8b98abb5a89b8e8175685b4e423025190d010000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000d192633404c5966737f8c99a6b2bfcfd9eaf5ffefe2d5c9bcafa296897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000814212d3a47535f696f7c85837a6d68768390908376686d7a83857c6f695f53473a2d211408000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009131c252c33373939393939393939393939393939393939393939393937332c251c130900000000000000000000000000000000000001080f14181a1b20202020202020171614100b0500000000000000000000000000000000000000000000000000121f2c3845525f6b7885929eabb4a79a8d8080808080808080808080808080808080808080808080808080808080807a6d6154473a2e21140700121f2b3845525e6b7885919393939393897d7063564a3d3023170a000b17232f3a454e565c5e6060606060606056544f473d333a454e565c5e6060606060606056544f473d33271c1004000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b0006121f2b3844505b666c75767778797a6d60544b403a3a3f495364717e8b97a8978a7d7164574a3e3124170b00000003101c28343f4a546773808d9aa8a2978a7e71665c51483f35302b26252a2e343d46505a626e7b87929fab9d908376675d5145382c1f13060000020e1a26313c46525e68717e8a929c9f93887e716c605b535c5c5c5c5c5c5c5c5c5c5c56544f473d32271b10030005121f2b3744505b656e7b8491969c918c7f726d635b51493f372d251b1a242c363e48505a616c717e8792999691837a6d665c5044382b1f1206000815212e3b4854616e7b8794a1acaca094877a6d6154473a2e211407000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e0100000000000000000000000000000000000000060f18242f39434e58626d75818e96a1aba69f92867c6f675d51453f332a1f150b010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050c13181b1e1a25313b4653606c7884919e9f9f9f9f9fa095897c6f63564c4135291d1104000000000000000000000000000000000000000000000916222f3c4955626f7c8895a2afb6a99c908376695f53473c3127201f1c1f232c3844515c6675818e9ba8b3a9988c7f7265594c3f32261908000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000d1a2734404d5a6773808d9aa6b3c0cdd9e6f3fcefe2d5c9bcafa296897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000815222e3b4855616e7b859290837a6d7683909083766d7a839092857b6e6155483b2e221508000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000000000000000000000000000000000000000000000000000000000000010406070a0d101112131312100e0b080705020000000000000000000000000000010a131b21272b2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2b27211b130a010000000000000000000000000000000000020b131a202427282d2d2d2d2d2d2d2323201c160f08000000000000000000000000000000000000000000000000121f2c3845525f6b7885929eabada194877a73737373737373737373737373737373737373737373737373737373736d685e5246392d20130700121f2b3845525e6b7884868686868686867d7063564a3d3023170a0007121e28333c454b5052535353535353534a48443d352b333c454b5052535353535353534a48443d352b21160b00000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b000613202d394653606c7881838485868275665c5145403f414a5464717e8b97a4988b7e7165584b3e3225180b00000006121f2b3844505c667683909da99f9285796d60544a403629241e1a191d2328343e47535f6a7683909ca99f92867a6d6053473a2d2014070000000915202a36414d56616c73808d939d9a92877e736c655d554e5050505050505050504948443d352b21160b00000613202d394653606c79839096a0a39c918c7f726d635b51493f372d25242c363e48505a616c717e879299a3a0959083796d6053463a2d201307000815212e3b4854616e7b8794a1acaca094877a6d6154473a2e211407000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e01000000000000000000000000000000000000000007121d28313c46515b606d7a849199a3aea3999184796d605a50463c31271d120700000000000000000000000000000000000000000000000000000000000000000000000000000000000000060f171e23282a2b2d2b3844505b66737f8c999393939393939084776b6054443a302419120b030000000000000000000000000000000000000000000916222f3c4955626f7c8895a2afb7ab9f94887b6e62574e4339312d2b282b2e343f4953606d7985929fabada297897c6f6356493c30231609000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000e1b2835414e5b6874818e9ba7b4c1cedae7f4fcefe2d5c9bcafa296897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000713202d3a4653606d78818e9390837a7683909083767a8390938e81786d6053463a2d201307000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d00000000000000020608080d0606030000000000000000000000000000000104080d111314171a1d1e1f201f1f1d1b181414110e080200000000000000000000000000010910161b1e202020202020202020202020202020202020202020201e1b161009010000000000000000000000000000000000010b141d252b30333439393939393939302f2c27211a11080000000000000000000000000000000000000000000000121f2c3845525f6b7885929eabada194877a6e67676767676767676767676767676767676767676767676767676767615e564c4135291d110500111e2a3743505c68727879797979797979706b6054483c2f22160900010c17212a333b434a4f5053535353534c4a463f372d232a333b434a4f5053535353534c4a463f372d23190f0500000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b0006121f2b3844505b6677849091929285796d6058514a4c4b515b6673808d99a9978a7d7164574a3e3124170b0000000713202d3a4653606d7986929fa89b8e8175665c5042392e2419130e0d1218222b37434e5866727f8c99a5a399897c6f6356493c30231609000000030e1925303b44505a606c77818e939c99928b80776d675f585045414343434343433d3b38322b23190f04000005121f2b3744505b65707d869298a2a39c918c7f726d625b51493f372d2c363e48505a616c717e879299a3a39992877e71665c5044382b1f1206000815212e3b4854616e7b87949f9f9f9f94877a6d6154473a2e211407000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e010000000000000000000000000000000000000000010c161f2a343f45525d686f7c87929fa6aba0968e81756c62584e43392f24180f060000000000000000000000000000000000000000000000000000000000000000000000000000000000050f1821292f3437383939333f4a54616e7a8786868686868686867f7265594f43322c29231d150d0700000000000000000000000000000000000000000916222f3c4955626f7c8895a2afbdb0a69a8d81746a5f554b433c39383338393f44505b65717e8a97a2adab9f9285796d6053463a2d201307000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000e1b2835414e5b6874818e9ba7b4c1cedae7f4fcefe2d5c9bcafa296897c6f635649505c6976838f9c9286796c5f5346392c20130600000000000006121f2c3844505c666d78818e9390837a839090837a8390938e81786d665c5044382c1f1206000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000003090e1214151913120f0b06000000000000000000000003070d1013191d202124272a2b2c2d2c2b2a282521201e19140f0a0400000000000000000000000000050a0f1213131313131313131313131313131313131313131313120f0a050000000000000000000000000000000000000008131d262f363c4041464646464646463d3c38332c231a0f0500000000000000000000000000000000000000000000121f2c3845525f6b7885929eabada194877a6e615a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a54524c443a3025190d01000f1b2834404b5660686b6c6c6c6c6c6c6c6360594f44382c20130700000a16222e39434d555b5d6060606060585651493f34292e39434d555b5d6060606060585651493f34291e120600000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b00030f1c28333f4a546774818e9a9f978b7e716a605c5459555d606c7884919da297897c6f6356493c302316090000000714212e3a4754616d7a8798a3a5988b7f7265544a3f30271c1208020007101a26313d495663707c8996a3ab978a7d7164574a3e3124170b0000000008141f29323e44505b656c78818d929f9f928c81796f6a625a514c433c34363636302f2c2721191107000000030f1b27333f4953606b707d869298a2a39c918c7f726d625b51493f37363e48505a616c717e879299a3a39992877e716c61544a3f34281c1003000815212e3b4854616e7b87939393939393877a6d6154473a2e211407000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e01000000000000000000000000000000000000000000040d18222935414c56606a727f8c949fa9a89e938b7e716a5f554b40352921170c03000000000000000000000000000000000000000000000000000000000000000000000000000000010c17212a333a4044454646463a46525e686e797979797979797979726d6256473f3a38342f271f191007000000000000000000000000000000000000000916222f3c4955626f7c8895a2afb4aba39f92877b6e675d554e4846443f44464a5059606c7883909da9b1a89b8e8175665c5044382b1f1206000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000e1b2734414e5a6774818d9aa7b4c0cddae7f6ffefe2d5c9bcafa296897c6f635649505c6976838f9c9286796c5f5346392c20130600000000000003101c28343f4a545c666d78818e939084839191838490938e81786d665c544a3f34281c1003000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d00000000060e151a1e212226201f1c17110a0200000000000003060c1012181d2024292c2d30343638393939383735322e2d2a251e1b150d08020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1a252f3841484c4e535353535353534a48443d352c21160b00000000000000000000000000000000000000000000121f2c3845525f6b7885929eabada194877a6e61544d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4746413a32281e130800000b17232f3a454e565c5e6060606060606056544f473d33271c100400010e1a27333f4a555f676a6c6c6c6c6c65625b51463a2e333f4a555f676a6c6c6c6c6c65625b51463a2e22160900000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b00000b17222d3c4956626f7c89949f9f92857c716d66666666676d737f8c96a09f9285796d6053463a2d2013070000000815222f3b4855626e7b8895aaa4978a7d7164574a3e2e24150b000000000915222f3b4855626e7b8895a1a5988b7e7265584b3f3225180c00000000020d172027333f49535b666c74808b92989c938f847c716c605d554e463e362e292322201b160f0700000000000b17222d38414f59606b707d869298a2a39b918c7f726d625b51493f3e48505a616c717e879299a3a39992877e716c615a5042382e23170b00000815212e3b4854616e7b86868686868686867a6d6154473a2e211407000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e0100000000000000000000000000000000000000000000061019242f3a444e58606c77828f97a1aba59f92867c6e675d51453e33291e150b00000000000000000000000000000000000000000000000000000000000000000000000000000007131e29333c454c505253535246444d565e616c6c6c6c6c6c6c6c6c65625b51504c47454039312a221910060000000000000000000000000000000000000916222f3c4955626f7c8895a2afaea39992999083796d6760585553504a5053545c606b727f8b95a0acaca095897d7063544a3f34281c1003000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000d192633404c5966737f8c99a6b2bfced9e5f1feefe2d5c9bcafa296897c6f635649505c6976838f9c9286796c5f5346392c201300000000000000000c17232e38424a545c666c78818e92909195959191928d81786c665c544a42382e23170c00000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000060f181f262b2d2e332d2b28221c140b08060406060b0f12171c1f24292c2f35393a3d4043444546464543413e3b3936302b272019130c04000000000000000000000000000000000000000000050a0d0f101313100f0d0a05000000000000000000000000000000000000000000000000000814202b36414b53595b6060606060606056554f473d33271c1004000000000000000000000000000000000000000000121f2c3845525f6b7885929eabada194877a6e615447404040404040404040404040404040404040404040404040403a3935302820160c02000007121e28333c454b5052535353535353534a48443d352b21160b000003101d2936424f5b6771777979797979726d62564a3e3136424f5b6771777979797979726d62564a3e3124180b00000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b00000615222e3b4754606a76828f98a29792857e7975737273757a8088939fa1978d8074665c5144382c1f12060000000916222f3c4955626f7c8895a2a396897d7063564a3d30231706000000000714212e3a4754616d7a8794a0a5998c7f7266594c3f3326190c0000000000050e17222d38414a545b606e737e8691969e9691867e756d675f58504840372e261c13100b0400000000000006111b262f3d474f59606b707d869298a2a39b918c7f726d625b514948505a616c717e879299a3a39992877e716c615a50483e30261c110600000714202d3a46525e6976797979797979797976685e5246392d201307000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e01000000000000000000000000000000000000000000000008131e28323d44505b656d7a859199a4aea2989083796d605a50453b30271c120700000000000000000000000000000000000000000000000000000000000000000000000000000c18232f3a454f575c5e60605f53504a4d52545f60606060606060605c5e5f5f5c5853514b433c342a22180c0200000000000000000000000000000000000916222f3c4955626f7c8895a2afac9f928692958f81796f6a6462605b545b6062666d727d87929fa7b0a69d9184786c605346392e23170b00000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000b1824313e4b5764717e8a97a8b2bdc8d4e2edf8efe2d5c9bcafa296897c6f635649505c6976838f9c9286796c5f5346392c20110c0600000000000006111c263038424a545b666c77808d929da0a09d928d80776c665b544a423830261c110600000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d0000030e18212a31373a3b403938332d261d191312101314171c1f23282c2f35393a4145474a4d505152535252504e4b4746413b373229241e160e05000000000000000000000000000000000000030a11161a1c1d20201d1c1a16110a0300000000000000000000000000000000000000000000000b1824303c48535d64676c6c6c6c6c6c6c6360594f44382c201407000000000000000000000000000000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b3434343434343434343434343434343434343434343434342e2d29251e160e04000000010c17212a333b434a4f5053535353534c4a463f372d23190f05000004111d2a3744505d6a778386868686867f7265584c3f323744505d6a778386868686867f7265584c3f3225190c00000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b000006131f2b37434e58616e7b869298a097928b8582807f8082858d939aa19892857a6d61544a4034281c10040000000815222e3b4855616e7b8894aaa4978a7d7164574a3e2d22170b000000000815222f3b4855626e7b8895a1a5988b7e7265584b3f3225180c00000000000006111b262f38424a505c636c717c848e939f98928b817a6f6a625a524940382e251c110800000000000000000a141d2b353d474f59606b707d869298a2a39b918c7f726d625b51505a616c717e879299a3a39992877e716c615a50483e362c1e140a00000005121e2a36424d575e6c6c6c6c6c6c6c6c6c6c5e564c41362a1d1105000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e010000000000000000000000000000000000000000000000010c162027333f49535e68707d87939fa6aaa0958d81746c61574d42392e23180e05000000000000000000000000000000000000000000000000000000000000000000000000030f1b2834404c5761686b6c6c6c605c544a46475353534c52565d6065696b6c6b6965605c554e463c342a1e140a00000000000000000000000000000000000916222f3c4955626f7c8895a2afa5988b7f8b93938f837c76716e6c666b666c6e72787f879299a3aea99f948a7e71665b5044382b1c110600000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000815222e3b4855616e7b8896a0acb8c6d0dbe7f0f9e2d5c9bcafa296897c6f635649505c6976838f9c9286796c5f5346392c211d1711090000000000000a151e263038424a545b656c77808d939d9d938d80776c655b544a423830261e150a0000000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000009151f2a333c4247484c46443f382f2925201f1d1f2022282b2e34383a4045474c5254575a5d5e5f605f5e5d5b5854524c47433c35302820170e0500000000000000000000000000000000040d151c2226292a2d2d2a2926221c150d04000000000000000000000000000000000000000000010e1a2733404c59646f7479797979797979706b6055483c2f231609000000000000000000000000000000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e272727272727272727272727272727272727272727272721201d19130c0400000000000a16222e39434d555b5d6060606060585651493f34291e1206000004111e2b3744515e6a7784919393938c7f7265594c3f323744515e6a7784919393938c7f7265594c3f3226190c00000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b0000030f1b27323d46535f69707d8691969e9f97928e8c8c8d8f92989f9f9691867d6f685e5242392e23180c000000000714212e3a4754616d7a8798a2a5988b7f7265544a3f33281c1107010006101823303c4956636f7c8996a2aa978a7d7164574a3e3124170b000000000000000a141d262f383f44525a616a6f7a818b92989f938e847c716c635b524a40372e231a0d0400000000000000020b19232b353d474f59606b707d869298a2a39b918c7f726d625b5a616c707e879299a3a39992877e716c615a50483e362c241a0c02000000020e1a25303b454d525f60606060606060605f524c443a3025190d01000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e01000000000000000000000000000000000000000000000000040d17222d38414c56606b73808d949fa9a79d928a7e71695f544a40342820170b02000000000000000000000000000000000000000000000000000000000000000000000005111e2a3744505c6873787979796d665c504441454c52565e61686d727678797876726d675f584e463c30261c1106000000000000000000000000000000000916222f3c4955626f7c8895a2afa396897d818e96959087827e7b79787778797b7f848c9299a3abaaa2978f82776c60544a3f33281c0a0000000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000714212d3a46535f697784919eaab4bfcad6dee8eee2d5c9bcafa296897c6f635649505c6976838f9c9286796c5f534639302d29221b12090000000000030c151e262f38424a535b656c74818e9b9b8e81746c655b534a42382f261e150c030000000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d00020e1a26313c454d53555953504a423b35302d2b292c2d2d3338393f44464b5153565d606367696b6c6c6c6b6a6865615e56544e46413a322920170d020000000000000000000000000000030d161f272d32353639393635322d271f160d030000000000000000000000000000000000000000010e1b2834414e5b677481868686868686867d7063564a3d3023170a000000000000000000000000000000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e211a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1413110d08020000000000010e1a27333f4a555f676a6c6c6c6c6c65625b51463a2e221609000005111e2b3844515e6b7784919e9f998c7f7266594c3f333844515e6b7784919e9f998c7f7266594c3f3326190c00000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b0000000a15202a36424d57606b707c848c9196999c9b9999999b9d9a97928d847d6f6b60564c4130271c1207000000000613202d394653606c7985929fa79b8e8174665b5044382d2218120d0c1117222b37424d5765727f8c98a5a398897c6f6256493c2f23160900000000000000020b141d262d33404850585f686d757e8690959d9691867e736d645c524940352c1f160c0100000000000000071119232b353d474f59606b707d869298a2a39b918c7f726d62616c707e879299a3a39992877e716c615a50483e362c241a1208000000000009141f29333b42464853535353535353535346413a32281e130800000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e010000000000000000000000000000000000000000000000000006111b262f3a444f59606d78829097a2ada49f92857b6e665c51443e32291d140a000000000000000000000000000000000000000000000000000000000000000000000005121f2b3845525e6b7885868686786d60534a4c51565e61686d737a7f82858685837f796f6a5f584e42382e23170b000000000000000000000000000000000916222f3c4955626f7c8895a2afa3968a7d7a84919899938f8b888685848486888c91969fa3aba9a29892857b6e655b5042382d22170b0000000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d0005121e2a36424d576673808c98a2aebac3ccd7dce3e7d5c9bcafa296897c6f635649505c6976838f9c9286796c5f53463e3d39342d241b110600000000060f19232b353d464e58606a6f7c8592989891857c6f6a60584e463d352b23190f060000000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d0006121e2b37424d575f6166605b544d46413b393835393a3c3f44464a5053555d6064686d70737677787979787674716e68626058524c443a32291e130800000000000000000000000000000a151f2831383e4243464643423e3831281f150a0000000000000000000000000000000000000000010e1b2734414e5a6774818d93939393938a7d7064574a3d3124170a000000000000000000000000000000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e21140d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d070705010000000000000003101d2936424f5b6771777979797979726d62564a3e3124180b000005121e2b3845515e6b7884919ea6998c807366594d40333845515e6b7884919ea6998c807366594d4033261a0d00000713202d3a4653606d798693a0aca69a8d8073675a4d4034271a0700000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b000000040e1a26313b454f59606a6f797f848a8d8f9192929291908d8a8580796f6b60594f443a301e150b000000000006121f2b3844505b667683909ca99e9285786c60544a3f3329241d19181b2227343c46535f6976838f9ca99f9286796d6053463a2d2013070000000000000000020b141c2228363e464e565d606c717b838d929f98928b80736e645b51473d31281e13080000000000000000071119232b353d474f59606b707d869298a2a39b918c7f726d6c707e879299a3a39992877e716c615a50483e362c241a1208000000000000020d17212930363a3b4646464646464646463936302820160c0200000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e0100000000000000000000000000000000000000000000000000000a141d29323d44505c666e7b85929ea4ada2979083786d60594f443b2f261c11060000000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d6976839098897c6f635a56555d60686d737a80858b8f9192928f8b847c6f6a5f544a3f34281c10030000000000000000000000000000000916222f3c4955626f7c8895a2afa4978a7d717d8692989f9c9799929291919298989ea0a8aba69f9792867d70695f53493f2f261c11060000000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d00020e1a26313b4754616e7a86929fa7b1bac2cbd1d6dcd5c9bcafa296897c6f635653535c6976838f9c9286796c5f53534b49453e362d22170c000000030e18212b353d474f58606a6f7c8592918c8c9191857c6f6a60584f473d352b21180e0300000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000814212d3a47535f696e736c665f57524c484644404547494a5053545c6063676d71757a7d8083848586858583817e7a756f6a615d564c443a3025190d0100000000000000000000000005111c27313a434a4e505353504e4a433a31271c110500000000000000000000000000000000000000010e1a2734414d5a6774808d9a9f9f9f978a7d7164574a3e3124170b000000000000000000000000000000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e2114080101010101010101010101010101010101010101000000000000000000000004111d2a3744505d6a778386868686867f7265584c3f3225190c000005121f2b3845525e6b7885919ea6998d8073665a4d40333845525e6b7885919ea6998d8073665a4d4033271a0d00000713202d3a4653606d798693a0aca79a8e8174675b4e412e23180c00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b0000000009141f29333d474f5860676d72787d8082848586858483807e79736d6760594f473d32281e0c030000000000030f1c28333f4a546673808d99a7a1978a7d70665b50443e352f292423282d333d464f59616e7b86929faa9c908376665c5145382c1f13060000000000000001070d111317242d343c444c525a62696e78808b92999f928c80736d63594f433a2f24190d010000000000000000071119232b353d474f59606b707d869298a2a39b918c7f72707e879299a3a39992877e716c615a50483e362c241a12080000000000000000050f171f252a2d2e39393939393939392e2d2a251e160e050000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e010000000000000000000000000000000000000000000000000000020b172028343f4a545e69707d8a929da7a99f958d80736b61564d42382d22170e05000000000000000000000000000000000000000000000000000000000000000000010e1b2834414e5b6774818e9a8e81756c656364676d737a80868d92989c9e9f9e9c9691857c6f665c5044382b1f13080000000000000000000000000000000916222f3c4955626f7c8895a2afa4978a7e71707d8690959da0a39f9e9e9e9fa3aaa9a8a69f9c948f857d706b60574d41382d1d140a000000000000000000000000000613202c3946535f6c7986929f9f9f9a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d00000914202d3946525e6873808c95a0a8b1bbc0c7cbd0d0c9bcafa296897c6f63606060606976838f9c9286796c606060585650483e34291d110500000915202a333d474f59606a6f7c8592918c7f7f8c9192857c6f6a60594f473d332a20150900000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000815222e3b4855616e7b7f786e69615e565453504b515356545b6063666d70757a7e82868a8d909192939291908e8b86827c746d685e564c41362a1e11050000000000000000000000000a16222d38434c545a5d60605d5a544c43382d22160a00000000000000000000000000000000000000000d1a2633404d596673808c99a6aca4978b7e7164584b3e3125180b000000000000000000000000000000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e2114080000000000000000000000000000000000000000000000000000000000000004111e2b3744515e6a7784919393938c7f7265594c3f3226190c000005121f2c3845525f6b7885929ea69a8d8073675a4d40343845525f6b7885929ea69a8d8073675a4d4034271a0d01000713202d3a4653606d798693a0aca89b8f827568544b4034281c1004000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b00000000030d17212b353d464e555c60666d70737677787978787674716d67605d554f473d352b20160c000000000000000b17222d3c4956636f7c8995a0a99d9083786c605a50454039352f2e34383f444e58616b75818e99a3a3988c7f7265544b4034281c1004000000000000040c13181d202021222a323a414550575f666d747e8792989c928c7f726b61564c4135291d1307000000000000000000071119232b353d474f59606b707d869298a2a39b918b7f7d879299a3a39992877e716c615a50483e362c241a120800000000000000000000050d141a1e20212d2d2d2d2d2d2d2d21201d19130c05000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e01000000000000000000000000000000000000000000000000000000050e17232e38424d57616c74808d95a0aaa79f93887d70695e544a3f332820160b020000000000000000000000000000000000000000000000000000000000000000000c1825323f4b5865727e8b98938b7f75717071747a80858d92989fa2aaa4a3a5a8a1979083786d6053463a2f24190d0100000000000000000000000000000916222f3c4955626f7c8895a2afa4978a7e716b707c838b9195989b9d9e9f9f9f9e9d9b9894908a827b706b60594f453b2f261b0b02000000000000000000000000000613202c3946535f6c798692939393938d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000005111e2a36414c56606d798390969fa7afb5babfc2c3c4bcafa296897c6f6c6c6c6c6c6c76838f9c9286796c6c6c6c64625a5045392d21150800020f1a26313c464f59606b6f7c8592918b7f72727f8b9192857c6f6b60594f463c31261a0f02000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000815222f3b4855626e7b88827b736d686461605b555d606265666c7074797d81858a8f92999a9c9e9f9f9f9e9d9b99928f87817a6d685e5246392d2013070000000000000000000000010d1a26323e4a545e66696c6c69665e544a3e32261a0d01000000000000000000000000000000000000000c1925323f4c5865727f8b98a5b2a5988b7f7265584c3f3225190c000000000000000000000000000000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e2114080000000000000000000000000000000000000000000000000000000000000005111e2b3844515e6b7784919e9f998c7f7266594c3f3326190c000006131f2c3946525f6c7985929fa79a8d8074675a4d41343946525f6c7985929fa79a8d8074675a4d4134271a0e01000713202d3a4653606d798693a0aca99d908376665c5145382c1f130700091623303c4956636f7c8996a2afa4988b7e7165584b3e3225180b0000000000060f19232b343d434b51545c606366696b6c6c6c6b6a6764605d55514b433d342b23190e04000000000000000615222f3b4854606b7784919da8a0958c7f726c615a514b4541403f4045495058606a707d8a939eaa9f92867a6d6154473a2e23180c000000000000040d161d24292c2d2e2f30302f353e454d545c606c717d8692999f93887d70685d52453a2f24180d01000000000000000000071119232b353d474f59606b707d869298a2a39b918b869299a3a39992877e716c615a50483e362c241a120800000000000000000000000002090e12141520202020202020201413110d080200000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e010000000000000000000000000000000000000000000000000000000006111c26303b45505a606d79839098a2aea49a92857b6e665b50443d32281d140a0000000000000000000000000000000000000000000000000000000000000000000815222f3b4855626e7b88959b918b827e7d7e81858c92989fa2a29f9a9796989c9f9f958a7d7164554c4135291d110400000000000000000000000000000916222f3c4955626f7c8895a2afa4978b7e71646a6e787e84888c8e909192929291908e8b88837d766e6960594f473d33291d140a00000000000000000000000000000613202c3946535f6c79878686868686868074675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d0000020e1925303b45515c666e7b8490959fa3abaeb4b6b7b8b9afa296897d7979797979797979828f9c92867979797979716c6256493d3024170a0006121f2b37434e58606b707d8692918b7f726d6d727f8b9192867d706b60584e43372b1f1206000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000815222f3b4855626e7b888f86807a75716e6c666b676d6f7175797c81858a8e92989c9fa3aba39f9e9d9d9d9fa3a39f9a938e847a6d6154473a2e2114070000000000000000000000030f1c2935424e5a66707679797670665a4e4235291c0f03000000000000000000000000000000000000000b1724313e4a5764717d8a97a4b0a6998c807366594d4033261a0d000000000000000000000000000000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e2114080000000000000000000000000000000000000000000000000000000000000005121e2b3845515e6b7884919ea6998c807366594d4033261a0d00000613202c3946535f6c7986929fa79a8d8174675a4e41343946535f6c7986929fa79a8d8174675a4e4134271b0e01000713202d3a4653606d798693a0acac9f9286796d6053463a2e23180d060a1723303d4a5663707d8996a3b0a4978b7e7164584b3e3125180b000000000000081119222b303940454a5053575a5c5e5f5f5f5e5d5a5753514b45413a312b22191107000000000000000007131f2c38434f5965727f8b96a1a79f93887e716c605d55524c4c4c4b51535b606a6f7c86929fa5a3988e8174685e5246392d1d12070000000000010c161f282f35393a3b3c3c3d3d3c383b424a515a626b707e87939f9a92857a6d60554b4135291d110400000000000000000000071119232b353d474f59606b707d869298a2a39b999299a3a39992877e716c615a50483e362c241a120800000000000000000000000000000002050708131313131313131307070501000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e0100000000000000000000000000000000000000000000000000040404000a141e29333e45515c676e7b86929fa5aca1978f82786c60594f443a2f261b110600000000000000000000000000000000000000000000000000000000000000000814212e3a47535f6a7784919d9b948f8b898a8d92989fa2a29f98928d8a898b90949c9c8f8276675d5145392c20130600000000000000000000000000000916222f3c4955626f7c8895a2afa4978b7e71645f666d71777b7f8183858586858583817e7b76706b615e574f473d352b21180b02000000000000000000000000000006121f2c3845525e6a7579797979797979746e64584c3f33261a0d000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d00000008141e2834404b545e696e7b838d92999fa3aaa9aaabacaea5998f8986868686868686868f949f988986868686867e7164584b3e3125180b000814212e3a47535f6a707d8692918b7f726d62626d727f8b9192867d706a5f53473a2e211408000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000815222f3b4855626e7b8898928d86827e7b797877787a7c7e8285898d92979b9fa2a7a09d9999929190909192999a9ea19f96887b6e6255483b2f221508000000000000000000000003101d2a3643505d69768286868276695d5043362a1d1003000000000000000000000000000000000000000916232f3c4956626f7c8995aab4a79a8e8174675b4e4134281b09000000000000000000000000000000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e2114080000000000000000000000000000000000000000000000000000000000000005121f2b3845525e6b7885919ea6998d8073665a4d4033271a0d000006121f2c3844515c667986939fa79b8e8174685b4e41353844515c667986939fa79b8e8174685b4e4135281b0e02000713202d3a4653606d798693a0acaea398897c6f62544b4034281f1612101824313e4b5764717e8a97a4b1a4978a7e7164574b3e3124180b000000000000000810191e272e34383f44464a4d505152535251504d4a47454039352f281f191007000000000000000000030c1b27323d4753606d7984919eaca49a92867e736d67605d565959545c60656c717c859198a2ac9f92867b6e61564c4135291d0c03000000000007131d28313a4045474848494a4a48443d3940445059616c73808c96a0978d8073675d5145392c2013060000000000000000000000071119232b353d474f59606b707d869298a2aba39fa3a39992877e716c615a50483e362c241a12080000000000000000000000000000000000000000060606060606060600000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e010000000000000000000000000000000000000000000306080911111111110c17212834404b555f69717e8a939da8a99f948c7f736b60564c41382d22170d040000000000000000000000000000000000000000000000000000000000000006121e2b37424e5765727e8b95a09e9c9896979a9fa2a39f98928c85817e7d7e838c929f92867a6d6054473a2d21140700000000000000000000000000000916222f3c4955626f7c8895a2afa4978b7e7164545c60646a6e72757778787979787675726e69636159534d453d352b23190f0600000000000000000000000000000004111d2a36424e59636a6c6c6c6c6c6c6c67645c52473c3024170b000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000020c18232e39424d575e696e7880878d9298999c9d9e9fa39fa1999693939393939393939c9fa6a393939393938b7e7164584b3e3125180b000815222f3b4855626e7b8592938b7f726d625b5b626d727f8b9192857b6e6255483b2f221508000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000815222f3b4855626e7b88959f98928e8b878685848586898b8e92979a9ea1a8a09e9995908c89868483838486898d92979e95887b6e6255483b2f221508000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000000000814212e3b4754616e7a8798a2aea89b8f8275685c4f4230251a0e020000000000000000000000000000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e2114080000000000000000000000000000000000000000000000000000000000000005121f2c3845525f6b7885929ea69a8d8073675a4d4034271a0d01000713202d3a4653606d79869aa4a89b8e8175685b4e42353a4653606d79869aa4a89b8e8175685b4e4235281b0f02000713202d3a4653606d798693a0acb4aa998d8073665c51453b3128201f1c1e26323f4c5965727f8c98a5b0a3968a7d7063574a3d3024170a0000000000000000070c151d23282e34383a3d4043444546454543413e3a38352f29241d160d07000000000000000000000b151e2b353d45515c67717d8a9aa4aca298928a8079716d6867666567666d70787e869197a1aaa6998c8073695e53493f372d1e150b00000000010d18242f3a434b51535455565756554f473d343f47505a606d7884919e9f92857a6d6054473a2d211407000000000000000000000000071119232b353d474f59606b707d86929facafacac9f92877e716c615a50483e362c241a1208000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e0100000000000000000000000000000000000000030a0f1215151e1e1e1e1e1e1e18232e39434d57616c74818e96a0aaa69f93877d70685e53493f33271f160c01000000000000000000000000000000000000000000000000000000000000020e1a26313c4653606c78839097a1a8a4a3a4aaa29f98928d86807a74717072767f8c94998a7d7063574a3d3024170a00000000000000000000000000000916222f3c4955626f7c8895a2afa4978b7e7164585053585f6265686a6b6c6c6c6b6a6865615f57554f46423b332b2319110700000000000000000000000000000000010e1a26313d4751595e5f6060606060605a58524a41362b1f1408000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d0000000007121d27303b454d575e666d747b8186898d8f909192999393939393939393939393939393939393939393938b7e7164584b3e3125180b000814212e3a47535f6a74808d887f726d625b51515b626d727f8b8d80746a5f53473a2e211408000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000815222f3b4855626e7b88949fa29f9b979992919192939a989b9ea1a9a29e9a96918c8883807d7a78767677797c80858b9297887b6e6255483b2f221508000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000000000613202d394653606c7985929facaa9d9083776a574d42362a1e11050000000000000000000000000000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e2114080000000000000000000000000000000000000000000000000000000000000006131f2c3946525f6c7985929fa79a8d8074675a4d4134271a0e01000714202d3a4753606d7a8693a0a89b8e8275685b4f42353a4753606d7a8693a0a89b8e8275685b4f4235281c0f02000713202d3a4653606d798693a0acb8ab9e9285796d60574d433a322d2c282a2d36424d576774818e9aa7b3a995897c6f6256493c2f231609000000000000000000030b12181c23282b2d30333638393939383734312d2c29241d18130c040000000000000000000007121c27303d474f59606b707d87939facaaa29f928d847e7a767473727375797d838b9298a1a9b3a5998c7f726d625b51493f30271d120700000004111d2935404b555d60616263636360594f4438353e44505c66727f8b98a2988a7e7164574b3e3124180b00000000000000000000000000071119232b353d474f59606b727f8c98a5b2b3a79a8d80746c615a50483e362d241b120900000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e01000000000000000000000000000000000000060e151a1f21222b2b2b2b2b2b2b2b2b27303c45505a606d79849198a3aea49991847a6d655b50443d31281e13080000000000000000000000000000000000000000000000000000000000000009151f2b3844505b666f7c8591969c9f9f9e9c98928d86807a736d686463656d76828f998d8073665a4d4033271a0d00000000000000000000000000000916222f3c4955626f7c8895a2afa4978b7e7164584b464e5355595b5d5e5f5f5f5e5d5b5855534d48443e363129211911070000000000000000000000000000000000000915202b353f474e52535353535353534e4c4741382f241a0e03000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d00000000000b151e29333b454d545c60696e747a7d808384858686868686868686868686868686868686868686868686867e7164584b3e3125180b0006121f2b37434e58646e74817e726d625b514949515b626d727f80746e64584e43372b1f1206000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000714212d3a4754606d79828b92989ea1a8a39f9e9e9f9fa4aca9a19e9a97928e89847f7b7773706d676a6a666d6f73797f858f887b6e6255483b2f221508000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000000000005121f2b3744505b657783909daaac9f928579695e52463a2d2014070000000000000000000000000000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e211408000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929fa79a8d8174675a4e4134271b0e01000714212d3a4754606d7a8793a0a89b8f8275685c4f42353a4754606d7a8793a0a89b8f8275685c4f4235291c0f02000713202d3a4653606d798693a0acb9ada1978b7e71695e554c443e3a3834363a3d46535e697784909daaada297877a6e6154473b2e2114080000000000000000000000070c11171c1f202427292b2c2c2c2b2a2724201f1d18120d070100000000000000000000000c18232e39424f59606b707d86929aa4aba9aca49c96918b8682807f7f8082858a90959fa3aaaaaca79c918b7f726d625b5142392e23180c0000000613202c3945515d676d6e6f6f70706b6055483d32343f4a54616e7b8899a49a8d8174675a4e4134271b0e010000000000000000000000071119232b353d474f59606b707d86929facacacac9f92877e716c615a50483e362d241b1209000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e01000000000000000000000000000000000006101820262b2e2f3737373737373737373737333e45515d676f7c86929fa5aba1968f82776c60584e433a2f24190d06000000000000000000000000000000000000000000000000000000000000030f1c28333f4a545f6a6f7c848c909292918f8b86807b746e68605d56565b64707d8a998f8275685c4f4235291c0f02000000000000000000000000000916222f3c4955626f7c8895a2afa4978b7e7164584b3e4347484c4e505252535252504e4b4846423b38332a251f170f0700000000000000000000000000000000000000040f19242d353d424546464646464646413f3c362f261d130800000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d0000000000030c172129333b424a51575e61676d7073767778797979797979797979797979797979797979797979797979716c6256493d3024170a00020f1a26313c46525c646e74726d625b51493f3f49515b626d72746e645c52463c31261a0f02000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000613202c3945515d676d767e858c9196989b9d9e9f9f9e9d9a9897928e8a85817c77736e696663605d55545c6063676d727a81887b6e6255483b2f221508000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000000000000000030f1b27333f49536874818e9ba7aea298877b6e6154473b2e2114080000000000000000000000000000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e2114080000000000000000000000000000000000000000000000000000000000000006121f2c3844515c667986939fa79b8e8174685b4e4135281b0e02000814212e3b4754616e7a8794a1a89c8f8275695c4f42363b4754616e7a8794a1a89c8f8275695c4f4236291c0f03000713202d3a4653606d798693a0acb1a7a09d92857b6e675d56504846443f4246474f58616e7b8795a0acab9f928578685e5246392d20140700000000000000000000000000060b101213171a1d1e1f201f1e1d1a171413100c070100000000000000000000000004101c2834404a54606b707d869298a3a69f9c9fa4a8a19e99928f8d8c8c8d8f92989da0a7a7a09da0a7a39b918b7f726d62544b4034281c100400000714202d3a4753606d797b7b7c7d7d7063584e4338313a4653606d7986939f9c8f8276695c4f4336291c100300000000000000000000071119232b353d474f59606b707d869298a2a39f9fa3a39992877e716c615a50483e362d241b12090000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929faca79b8e8174685b4e4135281b0e0200000000000000000000000000000000030e18222a31373a3c44444444444444444444444444404b555f6a727f8b939ea8a89e948c7f726a60554c41352922180c010000000000000000000000000000000000000000000000000000000000000b17222d38424e585f6a6f797f83858684827f7a736e69615e56524c4a54606d7987868683776a5e5144372b1e1104000000000000000000000000000916222f3c4955626f7c8895a2afa4978b7e7164584b3e373a3b3f4244454546464543423f3b3a36312c28211a140d050000000000000000000000000000000000000000000a16202b343d4347494949494949494846423b33291f140900000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000000050f172029303940444d53555d606366696a6b6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c64625a5045392d21150800000915202a33414a525c646765625b51493f37373f49515b626567645c524a41332a20150900000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d0004111d2935414b555d606d717a7f84898c8f9091929291908e8b8885817d79746f6b66615f575653514b4b5153555c60686d757f7b6e6155483b2e221508000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000000000000000000b17222d3f4c5865727f8b98aab4aa96897c706356493d302316080000000000000000000000000000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e211408000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d79869aa4a89b8e8175685b4e4235281b0f02000815212e3b4854616e7b8794a1a99c8f8376695c5043363b4854616e7b8794a1a99c8f8376695c504336291d1003000713202d3a4653606d798693a0acaca09590959082796d68615a5553504a4d525459606a74808d9aa7b1a99c8f827669564d41362a1e11050000000000000000000000000000000306070a0d101112131212100e0b07060400000000000000000000000000000006121f2c3844515c66707d869298a3a39c948f939aa0a7aba39f9c9a99989a9b9fa2aaa8a19e9590959ba3a39b918b7f72665c5145382c1f13060003101c2936434f5c6976828788898a85786a605448423f404653606d798699a49c8f8376695c504336291d1003000000000000000000071119232b353d474f59606b707d869298a2a399929299a3a39992877e716c615a50483e362d241b120900000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929faca89b8e8275685b4f4235281c0900000000000000000000000000000000000a15202a343c4347485151515151515151515151515151514e58626d75818f96a1aba69f92877c6f675d51453f34291d110500000000000000000000000000000000000000000000000000000000000006111c262f3c464e585f676d727678797876726d68615e56524c454145515d67757979797771675b4f43362a1d1004000000000000000000000000000916222f3c4955626f7c8895a2afa4978b7e7164584b3e312e2f32353738393939383735322e2d2a261f1c170e0903000000000000000000000000000000000000000000030f1b27323d464e545656565656565654534d453b31251a0e02000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d00000000000000050e171e272e343b42464b5153565a5c5d5e5f6060606060606060606060606060606060606060606060585650483e34291d11050000030e18212f38414a52585a585651493f372d2d373f495156585a58524a41382f21180e0300000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d00010d18242f3a434b515a62686d72797c7f82848586858583817f7c7974706d6663605955534d494745404045464b51565e616d726e695f53473a2d211408000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000000000000000000616232f3c4956626f7c8998a3aea5988c7f7265594c3f3025190d0100000000000000000000000000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e211408000000000000000000000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0a89b8e8275685b4f4235281c0f02000815222e3b4855616e7b8894a1a99c908376695d5043363b4855616e7b8894a1a99c908376695d5043362a1d1003000713202d3a4653606d798693a0acaa9d9084909490827a716c6562605c54565e61646b707c87929facb0a6998c7f7266594c3f3025190e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d79849197a1a49c918c838790959c9fa4aca9a7a6a5a6a8a8a7a09d96918a848c919ba3a0959084796d6053463a2d20130700000d1a2733404d5a6673808d959697897c6f625b534d4c4d4f58626f7c8895ab9b8e8275685b4f4235281c0f020000000000000000071119232b353d474f59606b707d869298a2a3999286869299a3a39992877e716c615a50483f362d241b1209000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929faca89c8f8275695c4f4230251a0e02000000000000000000000000000000030f1a26313c464e53555e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5b606d7a849199a3aea39991847a6d605a50453a2e211509000000000000000000000000000000000000000000000000000000000000000a141d2a343c464e555d6065696c6c6b6965615e56524d46413b35414b555d6b6c6c6c6a675f564b3f33271b0e02000000000000000000000000000916222f3c4955626f7c8895a2afa4978b7e7164584b3e31252226282a2b2c2c2c2b2a282522211e1a14100b05000000000000000000000000000000000000000000000006131f2b37434e586062626262626262615e574d42362a1e1205000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d0000000000000000050c151c232831363a4045474a4d5051525353535353535353535353535353535353535353535353534b49453e362d22170c00000000060f1d262f3841474c4e4b4a453f372d25252d373f464a4b4e4c4741382f261d0f060000000c1925323f4c5865727f8b989f9f998d8073665a4d4033271a0d000007131d28313a414550565d60666d6f727577787979787674726f6c6663605c54544f4846423d3a393534383a40454c525b6265615f574d42372b1e1206000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000000000000000000713202d3a4653606d7986929faca89b8e817568564c41362a1e110500000000000000000000000000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e211408000000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0a89b8f8275685c4f4235291c0f02000815222f3b4855626e7b8895a1a99d9083766a5d5043373b4855626e7b8895a1a99d9083766a5d5043372a1d1004000713202d3a4653606d798693a0aca396897d85929490847d76726e6d666b6b696e71757d859299a3afab9f94887b6e6155483b2e2215080000000000000002060a0c0d1313131313131313131313131313131313131313131312110f0c0701000000000000000006121f2c3844515c666e7c8591979c928c7f767c838a8f939a9a9d9e9f9f9e9d9b9895908b847e777f8c919b9691837a6e665c5145382c1f130600000916232f3c4956626f7c89959f9c8f82756d615e57595959616a73808d99a8998d8073665a4d4033271a0d0000000000000000071119232b353d474f59606b707d869298a2a39992877d7d879299a3a39992877e716c625a50483f362d241b12090000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaa9d9083776a574d42362a1e120500000000000000000000000000000006121f2b37434e585f626a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a686f7c87929facaba0968e81756c62564a3d3124170b00000000000000000000000000000000000000000000000000000000000000020b18222a343c434b5154595d5f5f5e5c5854524c46423b36302f3a434b515e6060605e5b564d44392e22170b00000000000000000000000000000916222f3c4955626f7c8895a2afa4978b7e7164584b3e312518191b1d1f1f201f1f1d1b181514120e0903000000000000000000000000000000000000000000000000000815222e3b4754606a6f6f6f6f6f6f6f6e695e53463a2d211407000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000000000000030b12181f252a2f35393a3d404344454646464646464646464646464646464646464646464646463e3d39342d241b110600000000000b141d262f363c40413f3d3a342d251b1b252d343a3d3f413f3c362f261d140b000000000c1925323f4c5865727f8b939393938d8073665a4d4033271a0d0000010c161f282f353f444c52545c606265686a6b6c6c6b6a676562605b5453514a48433d3a36312d2c29282c2f343a414651575955534d453c31261a0e02000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000000000006121f2c3844515c667683909ca9aa9e918477685e5246392d20130700000000000000000000000000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e211408000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a8794a1a89c8f8275695c4f4236291c0f03000915222f3c4855626f7b8895a2aa9d9083776a5d5044373c4855626f7b8895a2aa9d9083776a5d5044372a1d1104000714202d3a4753606d7a8693a0ada194887b7e8b9296918a837f7b79787778797a7d82889297a1abafa4998f8276695f53473a2d211408000000000000070d12161919202020202020202020202020202020202020202020201f1e1b18130c050000000000000004101c2834404a545f6a6e7c8591928c7f736d6f787d82878b8e9091929291908e8b88837e79716d727f8c9191847a6e685e544b4034281c100400000815222e3b4754606a7783909a9e948c7f756e69676666676b707c86929fa096897c6f6356493c3023160900000000000000071119232b353d474f59606b707d869298a2a39992877e70717e879299a3a39993877e716c625a50483f362d241b120900000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facac9f928579695e52463a2d2014060000000000000000000000000000000815212e3a47535f6a6f777777777777777777777777777777777777777777777f8c99a5b2a89e938b7e7165584b3e3225180b0000000000000000000000000000000000000000000000000000000000000000061018222a313a4145474c50525352504c4746413a36302a2528313a414547535353514f4b443b32281d110600000000000000000000000000000916222f3c4955626f7c8895a2afa4978b7e7164584b3e3125180c0f111212131312100f0c080705020000000000000000000000000000000000000000000000000000000916232f3c4956626f7c7c7c7c7c7c7c7b6e6154483b2e211508000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d0000000000000000000000070c141a1d24292c2d303336373839393939393939393939393939393939393939393939393931302d29221b1209000000000000020b141d242b30333432312e29231b12131b23292e31323433302b241d140b02000000000c1925323f4c5865727f8686868686868073665a4d4033271a0d000000040d161d2429323a41454a505356595c5d5e5f5f5e5d5b585553504a4644403938322d2a2620201d1c1f232930363f464a4c4847423c332a1f150900000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000000000004101c2834404a5466737f8c99a9aca096877a6d6154473a2e21140a00000000000000000000000000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e211408000000000000000000000000000000000000000000000000000000000000000815212e3b4854616e7b8794a1a99c8f8376695c504336291d1003000916232f3c4956626f7c8995a2aa9d9084776a5d5144373c4956626f7c8995a2aa9d9084776a5d5144372a1e1104000714212d3a4754606d7a8793a0ada194877b74818e949e95908c888685848585878a8f939aa1a9afa59f93877c6f62574d42372b1e120600000000010a12191e2325262d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2b2b28241e170f06000000000000000c18232e39424e575f6a6e7c858c80736d63666d70767b7e81838485858584817f7c77726d67626d727f8b847b6e685e564c42392e23180c00000006131f2b38434e5863707d88939f9c918c817b7673727374777d859298a29e9184786d6053463a2d201307000000000000071119232b353d474f59606b707d869298a2a39992877e706c6c717e879299a3a49993877e716c625a50483f362d241b1209000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaea298877b6e6154483b2d22170b0607080808060200000000000000000915222f3c4855626f7c8484848484848484848484848484848484848484848484919daab7afa59f9285786c5f5245392c1f120600000000000000000000000000000000000000000000000000000000000000000610181f282f35393a3f43454645433f3a3936302a251f191f282f35393a46464644433f39322920160b0000000000000000000000000000000916222f3c4955626f7c8895a2afa4978b7e7164584b3e3125180b020405060606050402000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c79878989898989898074675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d00000000000000000000000003090e13181d20202327292a2b2c2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2524211d1711090000000000000000020b131a1f2426272524221d1811090911181d2224252726241f1a130b0200000000000b1825313e4a56626d72797979797979736e63584b3f3226190c00000000040c131820282f35383f4446494c4f5152535252504e4c4946443f3a38342e2c27211e1a1413101013181e252a353a3e3f3b3a37312a21180e0300000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000000000000000c18232e3c4956626f7c8997a2ada8978a7e7164574a3e31261b0f03000000000000000000000000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e211408000000000000000000000000000000000000000000000000000000000000000815222e3b4855616e7b8894a1a99c908376695d5043362a1d100300091623303c4956636f7c8996a2aa9e9184776b5e5144383c4956636f7c8996a2aa9e9184776b5e5144382b1e1105000714212e3a4754616d7a8794a0b4ab94877a6d78828f939f9d989a939291919298979b9fa4acaba39f938d80736a6054453c31261a0e02000000000a131c232a2f3233393939393939393939393939393939393939393939393837342f2921180f0500000000000007121c27303c454e575f6a6e7c7f736e635b5c6064696e717477787979787775726f6a65605d5b626d727e7b6e695e564d443b30271d1207000000030f1b27323d4854606b73808d939f9c938e8783807f8081848a9297a19f928a7d70665c5044382b1f12060000000000071119232b353d474f59606b707d869298a2a39992877e716c61616c717e879299a3a49993877e716c625a50483f362d241b12090000000000000000000000000000060606060606060600000000000000000000000613202c3946535f6c7986929facb4aa978a7d7064544a3f33281c131313151514120f0a030000000000000916222f3c4955626f7c889191919191919191919191919191919191919191919196a0acb8b8ac9f9285796c5f5246392c1f1306000000000000000000000000000000000000000000000000000000000000000000060d161d24292c2d323639393836322e2d2a251e19140d161d24292c2d3939393736332e2820170e040000000000000000000000000000000916222f3c4955626f7c8895a2afa4978b7e7164584b3e3125180b000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c798692959595958d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000000000000000000000001070d111314171a1d1e1f202020202020202020202020202020202020202020202020181715110c060000000000000000000001080e14171a1b181815120c060000060c121518181b1a17140e08010000000000000916222e3a46515b62656c6c6c6c6c6c66635c52473b2f23170a000000000001070d161e24292e34383a3c3f42444546464543413f3c3938332d2c28231c1b16120e09060404070c131923292e31322e2d2b261f180f060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000000000000000713202d3a4653606d7985929eaba79b8e817468584e43372b1f1206000000000000000000000000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e211408000000000000000000000000000000000000000000000000000000000000000815222f3b4855626e7b8895a1a99d9083766a5d5043372a1d1004000a1623303d495663707c8996a3ab9e9184786b5e5145383d495663707c8996a3ab9e9184786b5e5145382b1e1205000814212e3b4754616e7a87949f9fa39986796d6d79818c92989fa29f9e9e9e9fa2aaa8a9aaa29f99928b81786d60584e43332a1f15090000000007121c252e353b3e40464646464646464646464646464646464646464646464544403a332b21170c010000000000000b151e2a333c454e575f6a6e726d635c525053575e6164676a6b6c6c6b6a6865625f585351515b626c716e695e574d443b32291e150b00000000000a16202c38444f59606c77808c92989f9992908d8c8c8e91969e9f99928c80736b61544a3f34281c100300000000040f19232b353d474f59606b707d869298a2a49992877e716c615a5a616c717e879299a3a49993877e716c625a50483f362d241b110600000000000000000002050708131313131313131307070501000000000000000613202c3946535f6c7986929facb4a79a8e8174665b5044382d22201f202222211f1a150e0600000000000916222f3c4955626f7c88959d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9da0a8b2acacac9f9285796c5f5246392c1f130600000000000000000000000000000000000000000000000000000000000000000000040c13181d2021262a2c2c2b292521201d19130e09040c13181d20212d2d2d2b2a27221d160e05000000000000000000000000000000000916222f3c4955626f7c8895a2afa4978b7e7164584b3e3125180b000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929fa2a29a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d00000000000000000000000000000000010406070a0d1011121313131313131313131313131313131313131313131313130b0a0805000000000000000000000000000003080b0d0e0c0b090501000000000106090b0c0e0d0b0803000000000000000006121e29343f495156586060606060605a58524a40362a1f130700000000000000040c13191c23282b2d2f323537383939383734322f2d2b28221f1c18120f0a0502000000000002080d181e22252622211e1a150e06000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000000000000000000006121f2b3844505c6674818e9baaab9e9184786a5f53473a2e21150a000000000000000000000000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e211408000000000000000000000000000000000000000000000000000000000000000915222f3c4855626f7b8895a2aa9d9083776a5d5044372a1d1104000a1723303d4a5663707d8996a3ab9e9185786b5e5245383d4a5663707d8996a3ab9e9185786b5e5245382b1f1205000815222e3b4855616e7b889393939392867966676d787f868d92989a9c9e9e9f9f9e9d9c9998928d877f746d665c50463d3221180e03000000020d19232e3740464b4c5353535353535353535353535353535353535353535352504c453d33291e1307000000000000030c18212a333c454e575f6266635b524944464d5354585b5d5e5f5f5e5d5b5855534e474549515a6265615e574d453b322920170c03000000000004101c27323d44505b656c777f868e92999b9c9a99999a9d9b99938f867f736e63594f42382e23170b00000000000b16212b353d474f59606b707d869298a2a49993877e716c615a50505a616c717e879299a3a49993887e716c625a51483f372d23180c0100000000000002090e12141520202020202020201413110d080200000000000613202c3946535f6c7986929facb8ab9e9185786c60544a3f332d2c2c2d2f2f2e2b2620180f06000000000916222f3c4955626f7c88959f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9285796c5f5246392c1f1306000000000000000000000000000000000000000000000000000000000000000000000001070d111314191d1f201f1d191413110d0802000001070d1113142020201e1d1b17110b0400000000000000000000000000000000000916222f3c4955626f7c8895a2aca4978b7e7164584b3e3125180b000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b989f9f998d8073665a4d4033271a0d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010d18232d373f464a4c5353535353534d4b4740382e24190e02000000000000000001080d11171c1f202326292a2b2c2c2b2a282522201f1c1712100c070000000000000000000000070d121618191514120e090300000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000000000000000000003101c28343f4a5464707d8a98a2ada196887b6f6255483c31261a0f000000000000000000000000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e211408000000000000000000000000000000000000000000000000000000000000000916232f3c4956626f7c8995a2aa9d9084776a5d5144372a1e1104000a1724303d4a5763707d8a96a3ab9e9285786b5f5245383d4a5763707d8a96a3ab9e9285786b5f5245382c1f0600000916232f3c4956626f7c86868686868685786b5c666c727b80858a8d8f9192929291908f8c8a86807b726d605c544a3f342b200f060000000006121e2a354049515759606060606060606060606060606060606060606060605e5c574f453a2f24180c00000000000000060f18212a333c454e53555957514940383b4246484b4e5051525252514f4c4847433c393f4850565854534d453b332920170e05000000000000000b162127333f49535b656c727b81868b8e9091929291908e8b87827c726d635c52473e30261c11060000000003101b27323d474f59606b707d869298a2a49a93877e716c615a504848505a616c717e879299a4a49a93887e716c625b51493f34291d11050000000000050d141a1e20212d2d2d2d2d2d2d2d21201d19130c05000000000613202c3946535f6c7986929facb4aba1978a7e71665b50443f3a39383a3b3b3a37312a22180e030000000916222f3c4955626f7c8893939393939393939393939393939393939393939393939393939393939285796c5f5246392c1f130600000000000000000000000000000000000000000000000000000000000000000000000000010406070c10121312100c070705010000000000000104060713131311100e0b06000000000000000000000000000000000000000916222f3c4955626f7c88959f9f9f978b7e7164584b3e3125180b000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929f9f9f9a8d8174675a4e4134271b0e000c1925323f4c5865727f8b939393938d8073665a4d4033271a0d00000000000000000000000000000000000000000000000000000000000000000000040613131313131313131312110e09040000000000000000000000000000000000040613131313131313131312110e0904000000000000000000000000000000000007111b252d343a3e3f464646464646403f3b362e261c1208000000000000000000000000060b10121316191c1e1f201f1f1d1b191613120f0b060400000000000000000000000000000106090b0c08080602000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000000000000000b17232e3a4753606d7985929faca8998c7f7366584e43372b1c11060000000000000000000000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e21140800000000000000000000000000000000000000000000000000000000000000091623303c4956636f7c8996a2aa9e9184776b5e5144382b1e1105000a1724313d4a5764707d8a97a3ab9f9285786c5f52452e3d4a5764707d8a97a3ab9f9285786c5f52452e23170b00000815222e3b4754606a6f797979797979787368545b60696e74797d808284858685858482807d7a746e69625b504a42382e22190f00000000000a16232f3b46515b63666c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6b6861574c4034281b0f0000000000000000060f18212a333c4247484c4b463f372b31363a3b3e41444546464544423f3c3a37312c363f454a4b4846423b332920170e050000000000000000050b17222d384149535b606a6e757a7e81838585868584817f7b756f6a635b524940352c1e140a00000000000713202c38444f59606b707d869298a2a49a93887e716c615a50483e3e48505a616c717e879399a4a49a93887f726d625b51453a2e22150900000000050f171f252a2d2e39393939393939392e2d2a251e160e050000000613202c3946535f6c7986929facaea399929183786c6059504947454546484847433c342a20150a0000000916222f3c4955626f7c8686868686868686868686868686868686868686868686868686868686868686796c5f5246392c1f130600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000916222f3c4955626f7c8893939393938b7e7164584b3e3125180b000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c798692939393938d8174675a4e4134271b0e000c1925323f4c5865727f8686868686868073665a4d4033271a0d0000000000000000000000000000000000000000000000000000000000000001070c10132020202020202020201f1d1a150f080000000000000000000000000001070c10132020202020202020201f1d1a150f08000000000000000000000000000000000009131b23292e313239393939393933322f2a241c140a000000000000000000000000000000030607090c0f1112131312100e0c090606030000000000000000000000000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000000000000000006131f2c3845515d6774818e9ba8aa9d9184776a5f5347382e23170b0000000000000000000000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e211408000000000000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3ab9e9184786b5e5145382b1e1205000b1824313e4b5764717e8a97a4ac9f9285796c5f4a3f343e4b5764717e8a97a4ac9f9285796c5f4a3f34281c10030006131f2b37434e5860626c6c6c6c6c6c6b68615750575e61676d7073767778797978777673706d67615e5751443f3830261c100700000000000c1925323e4b57636d73797979797979797979797979797979797979797979797873685c5044372b1e11000000000000000000060f18212a31373a3b3f3e3a352e25252a2d2e313437383939383735322f2e2b26242d343a3d3e3b3a36312921170e050000000000000000000006111b262f38414950575f62686e717477787979787775726e69625f58514940372e231a0c0200000000000916222f3b4854606b707d869298a2a49a93887e716c625a50483e36363e48505a616c717e879399a4a49a93887f726d62564a3d3124180b000000020d17212930363a3b4646464646464646463936302820160c0200000613202c3946535f6c7986929facac9f9286928c7f736b605b53535151535555534e463c31261a0f0200000815222e3b4754606a76797979797979797979797979797979797979797979797979797979797979797974695d5144382b1f120500000000000000000000000000000000000003080c0e0e131313131313130f0e0c09040000000000000000000000000000000000000000000000000000000000000003070b0d0e131313131313130e0e0c08030000000000000916222f3c4955626f7c868686868686867e7164584b3e3125180b000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c79878686868686868074675a4e4134271b0e000b1825313e4a56626d72797979797979736e63584b3f3226190c000000000000000000000000000000000000000000000000000000000000030b12181c1f2d2d2d2d2d2d2d2d2c2c2a26201912090000000000000000000000030b12181c1f2d2d2d2d2d2d2d2d2c2c2a262019120900000000000000000000000000000000010911181e2225252d2d2d2d2d2d2726231f19120a020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000000000000000004101d2935404b5563707d8996a1aca095887b6f62544a3f34281c100300000000000000000000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e211408000000000000000000000000000000000000000000000000000000000000000a1723303d4a5663707d8996a3ab9e9185786b5e5245382b1f1205000b1825313e4b5864717e8b97a4ac9f938679665c5044383e4b5864717e8b97a4ac9f938679665c5044382b1f120600030f1b27323d464e54566060606060605f5c574f444d53555c606367696b6b6c6c6b6a696663605d55534d453f342e261e140a0000000000000d192633404c5966737f8686868686868686868686868686868686868686868685786b5e5245382b1f1200000000000000000000060f1820262b2e2f33322f2a231c1a1e212125282a2b2c2c2b2a282522211f1b1b22292e31322e2d2a251f170f050000000000000000000000000a141d262f383f444e53565e6165686a6b6c6c6b6a6865615e57534e463f372e251c11080000000000000a1623303d495663707d869298a2a39f93887f716c625a50483e362c2c363e48505a616c717e879399a4a49a93887e7265584b3f3225180c00000009141f29333b42464853535353535353535346413a32281e1308000005121f2b3744505b657986939faca79a8d818d93877d726c6562605d5c6062625f584e43372b1f1206000006131f2b37434e5860626c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6962584d4135291c10030000000000000000000000000000000001090f14181a1b202020202020201c1b191510090200000000000000000000000000000000000000000000000000000001080e1317191a202020202020201b1a18140f0901000000000815212e3b47535f6a7679797979797979716c6256493d3024170a0000000000000000000000000000000000000000000000000000000000000000000000000000000006121f2c3845525e6a7579797979797979746e64584c3f33261a0d000916222e3a46515b62656c6c6c6c6c6c66635c52473b2f23170a0000000000000000000000000000000000000000000000000000000000030d151d23292c3939393939393939393836312b241b1208000000000000000000030d151d23292c3939393939393939393836312b241b12080000000000000000000000000000000000070d121618192020202020201a1917130e08000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050a0d0f101313100f0d0a0500000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000000000000000000000000c18242f394653606c7884919eaba7998c8073665c5044382b1f140900000000000000000000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e211408000000000000000000000000000000000000000000000000000000000000000a1724303d4a5763707d8a96a3ab9e9285786b5f5245382c1f0600000b1825323e4b5865717e8b98a4afa49986796d6053463a3e4b5865717e8b98a4afa49986796d6053463a2d20130700000a16202b343d43474953535353535352504c453b42464b5153575a5c5e5f5f5f5e5d5c595754514c46423b3328231c140c020000000000000d192633404c5966737f8c93939393939393939393939393939393939393939185786b5e5245382b1f120000000000000000000000060e151a1e21222625221e18120e121415181b1d1e1f1f1f1e1c191515120f11181d21242521211e1a140d0500000000000000000000000000020b141d262d333c42474c5254585b5d5e5f5f5e5d5b5854524d47433c342d251c130a000000000000020f1c2935424f5c6875828f949fa39b918b7f726d625a50483e362d24242c363e48505a616c717e879399a49e938e8175685b4e4235281b0f0200020e1a25303b454d525f60606060606060605f524c443a3025190d01000613202d394653606c78869aa4afa396897d869292877f78726e6d67676d6e6e6a5f53473a2e2114080000030f1b27323c464e5455606060606060606060606060606060606060606060606060606060606060605f5d5850463b3025190d00000000000000000000000000000000030b131a202427282d2d2d2d2d2d2d292825211b140c0300000000000000000000000000000000000000000000000000020b12191f2326272d2d2d2d2d2d2d282724201a130b0300000006131f2b37434e585f626c6c6c6c6c6c6c64625a5045392d2115080000000000000000000000000000000000000000000000000000000000000000000000000000000004111d2a36424e59636a6c6c6c6c6c6c6c67645c52473c3024170b0006121e29343f495156586060606060605a58524a40362a1f130700000000000000000000000000000000000000000000000000000000010b151f272f343846464646464646464645423d352d24190f0400000000000000010b151f272f343846464646464646464645423d352d24190f0400000000000000000000000000000000000106090b0c1313131313130d0c0a07020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030a11161a1c1d20201d1c1a16110a030000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000000000000000007121f2b3844505b6673808c99a3ab9e9184796d6053463b30251a0e01000000000000000000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e211408000000000000000000000000000000000000000000000000000000000000000a1724313d4a5764707d8a97a3ab9f9285786c5f52452e23170b00000c1825323f4b5865727e8b98a5b5a093867a6d6053473a3f4b5865727e8b98a5b5a093867a6d6053473a2d2014070000040f19222b32373b3c4646464646464544403a3136394045474a4d4f5152535252514f4d4a4745413a3631292117110a02000000000000000d192633404c5966737f8c999999999999999da0a7a9a29f999999999999999185786b5e5245382b1f1200000000000000000000000003090e121415191816120d07020507080b0e1112131312110f0c09080603060c111517181514120e0903000000000000000000000000000000020b141b222731373b4146474b4e5152525352514e4c4846423b37312a221c130a01000000000000000714202d3a4753606d79828f949b918b7f726d625a50483f362d241b1a242c363e48505a626c717e87939a938e81786d6053463a2d201307000005121e2a36424d575e6c6c6c6c6c6c6c6c6c6c5e564c41362a1d1105000713202d3a4653606d798693a0b6a295887c818e99928c837f7b7a7979797b7c6e6255483b2f2215080000000a15202b343c4347495353535353535353535353535353535353535353535353535353535353535352514d463e342a1f1408000000000000000000000000000000010b151d252b303435393939393939393534312c261e150c000000000000000000000000000000000000000000000000000b141d242b303334393939393939393534302b251d150b010000030f1b26323c464e535560606060606060585650483e34291d110500000000000000000000000000000000000000000000000000000000000000000000000000000000010e1a26313d4751595e5f6060606060605a58524a41362b1f140800010d18232d373f464a4c5353535353534d4b4740382e24190e020000000000000000000000000000000000000000000000000000000007121d2731394045535353535353535353524e473f352b2015090000000000000007121d2731394045535353535353535353524e473f352b20150900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040d151c2226292a2d2d2a2926221c150d0400000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000000000000000000030f1c28333f4a54616e7b87929faca1968a7d7063574d42362a1d1307000000000000000000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e211408000000000000000000000000000000000000000000000000000000000000000b1824313e4b5764717e8a97a4ac9f9285796c5f4a3f34281c1003000c1925323f4c5865727f8b98a5ada093877a6d6054473a3f4c5865727f8b98a5ada093877a6d6054473a2d21140700000007101920272b2e2f3939393939393837342f252a2f34383a3d404344454646454443403d3a39352f2a251f170f060000000000000000000d192633404c5966737f8c8c8c8c8c8c8c8c9095a0a297928c8c8c8c8c8c8c8c85786b5e5245382b1f120000000000000000000000000000020608080c0c0a060200000000000001040506060504020000000000000105090b0b08070502000000000000000000000000000000000000020a111720262b3036393b3e41444546464544423f3b3a36302b262018100a01000000000000000006131f2c3845515c676d79828f918b7f726d625b51483f362d241b12121a242c363e48505a626c717e88938e81786d665c5044382b1f120600000714202d3a46525e6976797979797979797976685e5246392d201307000714202d3a4753606d7a8693a0ada194887b7c88949f95918c8886858586888073675a4d4034271a0d000000040f19222b32373b3c464646464646464646464646464646464646464646464646464646464646464644413b342c22180d0200000000000000000000000000000009131d272f373c40414646464646464642413d3730271e0e050000000000000000000000000000000000000000000000030d1d262e363c3f414646464646464641403c372f271d13090000000a15202a343c434749535353535353534b49453e362d22170c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000915202b353f474e52535353535353534e4c4741382f241a0e03000007111b252d343a3e3f464646464646403f3b362e261c120800000000000000000000000000000000000000000000000000000000000c18232f39434b515f606060606060605f5e5951473d31261a0e010000000000000c18232f39434b515f606060606060605f5e5951473d31261a0e0100000000000000000000000000000000000000000000000000000000000106090b0c131313130c0b09060100000000000000000000000000000000000000000000000000000000000000030d161f272d32353639393635322d271f160d03000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000000000000000000000b17222d3846525e6975828f9ba7a89b8f8275695e52463a2f24180d000000000000000000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e211408000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4ac9f938679665c5044382b1f1206000c1926333f4c5966727f8c99a5ada094877a6d6154473a3f4c5966727f8c99a5ada094877a6d6154473a2e21140700000000070f161b1f22232d2d2d2d2d2d2c2b28241a1d23292c2d3034363838393938373633302d2c29241e1a140d0500000000000000000000091623303c4956636f7d808080808080808083909d9f928580808080808080807f7265594c3f3226190c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060b151a1e252a2d2e323537383939383735322e2d2a251f1a150e060000000000000000000004101c2934404b555c676d79828a7f726d625b51493f362d241b120909121b242d363e48505a626c717e8681786d665c544a3f34281c100300000815212e3b4854616e7b86868686868686867a6d6154473a2e211407000714212d3a4754606d7a8793a0ada194877a76828f99a09d9895989292988d8073675a4d4034271a0d0000000007101920272b2e2f39393939393939393939393939393939393939393939393939393939393939393835302a221a1006000000000000000000000000000000030f1a252f3941484d4e535353535353534f4d4942393020170d02000000000000000000000000000000000000000000010b151f2e3840474c4d535353535353534e4d4841392f251a0f030000040e18222a32373b3c464646464646463e3d39342d241b1106000000000000000000000000000000000000000000000000000000000000000000000000000000000000040f19242d353d424546464646464646413f3c362f261d13080000000009131b23292e313239393939393933322f2a241c140a000000000000000000000000000000000000000000000000000000000004101c2934404b555c6c6c6c6c6c6c6c6c6c6a63594e42362a1d1104000000000004101c2934404b555c6c6c6c6c6c6c6c6c6c6a63594e42362a1d110400000000000000000000000000000000000000000000000000000000070d1216181920202020181815120c060000000000000000000000000000000000000000000000000000000000000a151f2831383e4243464643423e3831281f150a000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000000000000000000000000006111c2a36424d5763707d89959fac9f92867b6e61554b4135291d12070000000000000000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e211408000000000000000000000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4afa49986796d6053463a2d201307000d192633404c5966737f8c99a6ada194877a6e6154473b404c5966737f8c99a6ada194877a6e6154473b2e2114080000000000040a0f1315162020202020201f1e1c180e12181c1f202427292b2c2c2c2b2a29262421201d19130e090300000000000000000000000915222f3b4854606b6f7373737373737374818e9b9e91847873737373737373726d62574a3e3125180b0000000000000105090b0b1313131307060405090b0b131313130706040005090b0b13131313070604000000000000000000000000000000000000000000000000000000000000000003090e14191e202125282a2b2c2c2b2a282521201e1a140f0a030000000000000000000000000c18232f39434b555c676d797d726d625b51493f372d241b1209000009121b242d363f48505a626c717d786d665c544a42382e23170b0000000815212e3b4854616e7b87939393939393877a6d6154473a2e211407000814212e3b4754616e7a8794a1aca093877a6f7c87929fa5a5aaa29f9f9a8d8073675a4d4034271a0d0000000000070f151b1f22222d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2c2b29251f181008000000000000000000000000000000000814202b37414b53595b606060606060605c59544b4232291f140900000000000000000000000000000000000000000007121d2731404a52585a606060606060605b59534b41372b20140800000006101820262b2e2f3939393939393931302d29221b1209000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008121b242b313638393939393939393433302b241d140b0100000000010911181e2225252d2d2d2d2d2d2726231f19120a02000000000000000000000000000000000000000000000000000000000006131f2c3845515c67767979797979797979756a5e5245382c1f1206000000000006131f2c3845515c67767979797979797979756a5e5245382c1f12060000000000000000000000000000000000000000000000000000010911181e2225252d2d2d2d2524221d1811090000000000000000000000000000000000000000000000000000000005111c27313a434a4e505353504e4a433a31271c11050000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000000000000000000000e1a25303b4854606b7683909da8a3998d8073675d5145392e23180c0000000000000000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e211408000000000000000000000000000000000000000000000000000000000000000c1825323f4b5865727e8b98a5b5a093867a6d6053473a2d201407000d1a2633404d596673808c99a6aea194887b6e6155483b404d596673808c99a6aea194887b6e6155483b2e221508000000000000000306080913131313131312110f0c01070c101314171a1c1e1f201f1f1e1c1a171413110d0801000000000000000000000000000713202c38444f5960636666666666666874818e9b9e9184786b66666666666665625b51463a2e2216090000000000060c111517182020201f141310111517182020201f1413100c111517182020201f1413100c07010000000000000000000000000000000000000000000000000000000000000002080d111414181b1e1f1f201f1e1b191514120e0903000000000000000000000000000007121d273139434b555c676d716c625b51493f372d251b12090000000009121b242d363f48505a626b706d665c544a423830261c11060000000815212e3b4854616e7b87949f9f9f9f94877a6d6154473a2e211407000815222e3b4855616e7b88949f9fa39986796d73808c939fa2aaaaaba69a8d8073675a4d4034271a0d000000000000040a0f131516202020202020202020202020202020202020202020202020202020202020201f1f1c19140d0600000000000000000000000000000000000c1824303c48535d64686c6c6c6c6c6c6c68655d54443b3025190e0000000000000000000000000000000000000000000c18232f3943525c64676c6c6c6c6c6c6c68645d53483c3024180c00000000060e151b1f21222d2d2d2d2d2d2d2524211d1711090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009121920262a2c2c2d2d2d2d2d2d2726241f1a130b0200000000000000070d121618192020202020201a1917130e08000000000000000000000000000000000000000000000000000000000000000714202d3a4753606d798686868686868687796c5f5346392c20130600000000000714202d3a4753606d798686868686868687796c5f5346392c201306000000000000000000000000000000000000000000000000000009131b23292e31323939393932312e29231b13090000000000000000000000000000000000000000000000000000000a16222d38434c545a5d60605d5a544c43382d22160a0000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000000000000000000000009141f2c38444f5964717e8a96a0ab9f92857a6d60544b4034281d120700000000000000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e211408000000000000000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b98a5ada093877a6d6054473a2d211407000d1a2733404d5a6673808d99a6aea195887b6e6255483b404d5a6673808d99a6aea195887b6e6255483b2f2215080000000000000000000000060606060606050503000000000406070a0d10111213131211100d0a07060401000000000000000000000000000000030f1b27323d474f545659595959595b6874818e9b9e9184786b5e5959595959595751493f35291e1206000000000911181d2124252d2d2d2c201f1c1d2124252d2d2d2c201f1c181d2124252d2d2d2c201f1c18120b030000000000000000000000000000000000000000000000000000000000000000010507080b0e1112131312110f0c0807050200000000000000000000000000000000010b151f273139434b555c6064615a51493f372d251b130900000000000009121b242d363f4850596063605c544a423830261e140a000000000815212e3b4854616e7b8794a1acaca094877a6d6154473a2e211407000915222f3c4855626f7b8893939393928679666c77818c92989b9e9f9f9a8d8073675a4d4034271a0d000000000000000003060809131313131313131313131313131313131313131313131313131313131313131312100d08020000000000000000000000000000000000000e1a2734404d59646f7479797979797979756f65564d42362a1c11060000000000000000000000000000000000000004101c2934404b55646e7479797979797979746f64594d4034271a0e0000000000040a0f13151620202020202020181715110c06000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080f151a1d1f202020202020201b1a17140e08010000000000000000000106090b0c1313131313130d0c0a070200000000000000000000000000000000000000000000000000000000000000000714202d3a4753606d7a8693939393939286796c5f5346392c20130600000000000714202d3a4753606d7a8693939393939286796c5f5346392c2013060000000000000000000000000000000000000000000000000007111b252d343a3e3f464646463f3d3a342d251b110600000000000000000000000000000000000000000000000000010d1a26323e4a545e66696c6c69665e544a3e32261a0d0100000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000000000000000000000002101b27323d4653606c7884919da8a2978b7f72665c5145392e23180c01000000000000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e211408000000000000000000000000000000000000000000000000000000000000000c1926333f4c5966727f8c99a5ada094877a6d6154473a2e211407000d1a2734404d5a6773808d9aa6aea295887b6f6255483c404d5a6773808d9aa6aea295887b6f6255483c2f22150900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b16212b353d4448494d4d4d4d4e5b6874818e9b9e9184786b5e514d4d4d4d4c4a463f372d23180d0100000009121b22292e3132393939392d2c29292e3132393939392d2c2923292e3132393939392d2c29231d150d03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030d151f273139434b5153575550483f372d251b1309000000000000000009121b242d363f474f545653504a423830261e140c02000000000815212e3b4854616e7b8794a1acaca094877a6d6154473a2e211407000916222f3c4955626f7c86868686868685786c656c777f868b8e919292928d8073675a4d4034271a0d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e1b2835414e5b687481868686868686868175695e5246382d22170b0000000000000000000000000000000000000006131f2c3845515c677480868686868686868174685b4e4135281b0e0000000000000003060809131313131313130b0a080500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004090e1112131313131313130e0d0b080300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714202d3a4753606d7a86939f9f9f9f9286796c5f5346392c20130600000000000714202d3a4753606d7a86939f9f9f9f9286796c5f5346392c201306000000000000000000000000000000000000000000000000010d18232d373f464a4c535353534b4a463f372d23180c01000000000000000000000000000000000000000000000000030f1c2935424e5a66707679797670665a4e4235291c0f0300000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000000000000000000000000000000b161f2b3844505b66717e8b96a0a99e9184796d60554b4034281e1308000000000000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e211408000000000000000000000000000000000000000000000000000000000000000d192633404c5966737f8c99a6ada194877a6e6154473b2e211408000e1b2734414e5a6774818d9aa7afa295887c6f6255493c414e5a6774818d9aa7afa295887c6f6255493c2f2216090000000000000105080b0b1313131313130c0b090501000000000000000000000000000002070a0c0d1313131313130b0a08050000000000000000040f19232b32383b3c404040414e5b6874818e9b9e9184786b5e51454040403f3e3a352d251b110700000006111b242d343a3d3e464646463a3834343a3d3e464646463a38342f343a3d3e464646463a38342f271f150b0100000000000000000000000000000000000000030608090d1012131312110f0b0707050100000306060b0f121312110e080705020000000000000000000000000000030d151f2731394045474a49453e362d251b13090100000000000000000009121b242d353d44484a46443f3830261e140c0200000000000815212e3b4854616e7b87949f9f9f9f94877a6d6154473a2e211407000815222e3b4754606a767979797979797873695b656c727a7f8284858685837e7164574b3e3124180b00000000000004090c0e0f131313131313131313131313131313131313131313131313131313131313131313100f0d09050000000000000000000000000000000000000916232f3c4956626f7c89959393939392867b6e61544a3f33281c0f030000000000000000000000000000000000000714202d3a4753606d7985929393939395897c6f6356493c3023160900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050a0d0f101313100f0d0a05000000000000000000000000000714202d3a4753606d7a8693a0acac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0acac9f9286796c5f5346392c20130600000000000000000000000000000000000000000000000006121e29343f4951565860606060585651493f34291d120600000000000000000000000000000000000000000000000003101d2a3643505d69768286868276695d5043362a1d100300000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000000000000000000000000030f1c28333f4a54606d7884919da7a1968b7e72675c51453a2f24190d030000000000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e211408000000000000000000000000000000000000000000000000000000000000000d1a2633404d596673808c99a6aea194887b6e6155483b2e221508000e1b2834414e5b6774818e9aa7afa295897c6f6256493c414e5b6774818e9aa7afa295897c6f6256493c2f2316090000000000060c11151718202020202020181815110c06000000000000000000000000070e1316191a202020202020181715110c060000000000000007111921272c2f30333335414e5b6874818e9b9e9184786b5e514538333332312e29231b130a000000010c18222d363f454a4b535353524745403f454a4b53535352474540393f454a4b535353524745403931271d12070000000000000000000000000000000000040a0f1315161a1d1f1f201f1e1b181413110d080b0f1213181c1f201f1e1b1514120e090300000000000000000000000000030d151f272f34383a3e3c39332c241b130901000000000000000000000009121b232b33383c3d3a38342e261e140c020000000000000815212e3b4854616e7b87939393939393877a6d6154473a2e2114070006131f2b37434e5860626c6c6c6c6c6c6c6961535b60686d72757778797876716c6155493d3023170a0000000002091015191b1c2020202020202020202020202020202020202020202020202020202020202020201d1c1915100a03000000000000000000000000000000000915222e3b4854606a7783909daa9fa3998c7f73665b5044382b1f1409000000000000000000000000000000000006121f2b37434e5864717e8a97a29f9f9d9083776b6054483b2f22150900000000000000000000000000000000000000000406070a0c0f11111213131312110f0d0b070705010000000000000000000000000000000000000000000000000003060809131313131313130b0a08050000000000000000000000000000000000000000000000000000000000000000000000000000000000030a11161a1c1d20201d1c1a16110a0300000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000000000000000000000000000000916222e3a46515b62656c6c6c6c65625b51463a2e22150900000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000000000000000000000000000b17222d3844505c66717e8a95a0a89e9184796d60564c4135291f14090000000000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e211408000000000000000000000000000000000000000000000000000000000000000d1a2733404d5a6673808d99a6aea195887b6e6255483b2f221508000e1b2835414e5b6874818e9ba7afa396897c706356493d414e5b6874818e9ba7afa396897c706356493d3023160a000000000911171d2124252d2d2d2d2d2d2524221d181109000000000000000000010a12191e2325262d2d2d2d2d2d2524211d17110900000000000000070f161b202223262835414e5b6874818e9b9e9184786b5e5145382b262625221e18110a0100000005111d29343f485056586060605f53514b485056586060605f53514b43485056586060605f53514b43392f23180c00000000000000000000000000000003090e151b1f2222272a2b2c2c2c2a282521201d1913171c1f2024292b2c2c2a2821211e1a140d0500000000000000000000000000030d151d23292c2d31302d28221a1209010000000000000000000000000009111921272c2f302d2b28231c140c02000000000000000815212e3b4854616e7b86868686868686867a6d6154473a2e21140700030f1b27323c464e54556060606060605f5d574950565d6065686b6c6c6b6a64615a5045392d211408000000030c141b212528292d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d292826211b140c0400000000000000000000000000000007131f2c38434e5865727e8b98a2aeab9e9184786c6053463b30251a0e00000000000000000000000000000000000814212e3a47535f6a7683909ca9aea2988b7f7265594f43382c1f1307000000000000000000000000000000000001070c10131417191b1d1e1f20201f1f1e1c1a171413110d0804010000000000000000000000000000000000000000040a0f13151620202020202020181715110c060000000000000000000000000000000000000000000000000000000000000000000000000000040d151c2226292a2d2d2a2926221c150d04000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000000000000000000000000000000b1825313e4a56626d7279797979726d62564a3d3124180b00000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000000000000000000000000000000006111c28343f4a54606c7883909da6a1968c7f72685d52453b31261a0c0300000000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e211408000000000000000000000000000000000000000000000000000000000000000d1a2734404d5a6773808d9aa6aea295887b6f6255483c2f221509000f1b2835424e5b6875818e9ba8b0a396897d7063564a3d424e5b6875818e9ba8b0a396897d7063564a3d3023170a00000009121b22292d303139393939393932312e29231b120900000000000000000a131c242a2f323339393939393931302d29221b120900000000000000040b0f1315161b2835414e5b6874818e9b9e9184786b5e5145382b1e191816120d0700000000000915212e3a45505a62656c6c6c6c605c55505a62656c6c6c6c605c554b505a62656c6c6c6c605c554b4034291c100400000000000000000000000000060e141a20262b2e2f3336383939383735322e2d2a251e22282b2d313638393937342e2d2a251f170f0500000000000000000000000000030b12181c1f202423211c17100800000000000000000000000000000000080f161c202223201f1c17110a0200000000000000000714202d3a46525e6976797979797979797976685e5246392d20130700000a15202b343c43474953535353535352514c3f444c5254585b5e5f5f5f5d575550483e33281d11050000020c151e262c3134353939393939393939393939393939393939393939393939393939393939393939393635322d261e160c030000000000000000000000000000030f1b27323d4754606d7a85929facaca1968a7d7063574d42362a1c110600000000000000000000000000000004101c2934404b55626e7b88949fabac9f92867a6d6054473d32271b0f03000000000000000000000000000000050b1012181c1f202326282a2b2c2c2c2c2c2a29272421201d1913100d07010000000000000000000000000000000000060e151b1f21222d2d2d2d2d2d2d2524211d171109000000000000000000000000000000000000000000000000000000000000000000000000030d161f272d32353639393635322d271f160d030000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000000000000000000000000000000c1925323f4c5865727f868686867f7265584b3f3225180c00000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000000000000000000000000000b17232e3844505b66707d89949fa89e92857a6d60574d42362a1e150a00000000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e211408000000000000000000000000000000000000000000000000000000000000000e1b2734414e5a6774818d9aa7afa295887c6f6255493c2f221609000f1c2835424f5b6875828e9ba8b0a3968a7d7063574a3d424f5b6875828e9ba8b0a3968a7d7063574a3d3024170a000006111b242d34393d3e4646464646463f3d3a342d241b0b02000000000000030d1c252e353b3f404646464646463e3d39342d241b110600000000000000000307090e1b2835414e5b6874818e9b9e9184786b5e5145382b1e120b0906010000000000000b1724313d4a56626c71797979796d675c56626c71797979796d675c5156626c71797979796d675c5145382c1f1306000000000000000000000000080f181f262a32373b3c40434546464544423e3a3936302a2d3338393e4245464544413b3a36312921170d030000000000000000000000000001070c101314171714110c05000000000000000000000000000000000000050b101316171312100b060000000000000000000005121e2a36424d575e6c6c6c6c6c6c6c6c6c6c5e564c41362a1d11050000040f19222b32373b3c464646464646454441333a4145474b4f51525352504b49453e362c22170c00000009141e2730373d414246464646464646464646464646464646464646464646464646464646464646464643413e3830281e140a0000000000000000000000000000000a16202c3945515d6774818e9aa7b1a89b8f8275695e5246382e23170b00000000000000000000000000000006131f2c3845515c6774808d9aa6b0a79b8e8174685d5245392b21160a0000000000000000000000000000040b10161c1d23292c2d30333537383839393938373633312e2d2a25201d18120b0600000000000000000000000000000006101820262b2e2f3939393939393931302d29221b120900000000000000000000000000000000000000000000000000000000000000000000000a151f2831383e4243464643423e3831281f150a0000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000000000000000000000000000000c1926323f4c5965727f8c93938b7f7265584c3f3225190c00000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000000000000000000000000000006111c28333f4a54616b76828f99a4a1978d8073695f53463d30261c1106000000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e211408000000000000000000000000000000000000000000000000000000000000000e1b2834414e5b6774818e9aa7afa295897c6f6256493c2f231609000f1c2936424f5c6975828f9ca8b0a3978a7d7064574a3d424f5c6975828f9ca8b0a3978a7d7064574a3d3124170a00010c17222d363f45494b5353535353534b4a453f372d1d140a0000000000010b151f2e3740474b4d5353535353534b49453e362d22170c00000000000000000000020e1b2835414e5b6874818e9b9e9184786b5e5145382b1e12050000000000000000000b1825323e4b5865717e86868686796d605865717e86868686796d60535865717e86868686796d6053473a2d20140a0000000000000000000000081119212a31363c4347494d5052525352514e4b4746413a36383f44464b4f525352514e4846423b33291f1409000000000000000000000000000000000406070b0a0805000000000000000000000000000000000000000000000407090a070603000000000000000000000000020e1a25303b454d525f60606060606060605f524c443a3025190d0100000007101920272b2e2f393939393939393835272f35393a3f4244454645433e3d39332c241a1006000004101b26303942494d4f535353535353535353535353535353535353535353535353535353535353535353504e49423a30261b1005000000000000000000000000000004111d2935414b55626f7c88959fabac9f92877b6e61544a3f34281c100300000000000000000000000000000714202d3a4753606d7985929eabaca095897c6f63564c413529190f0400000000000000000000000000060b161b21282c2f34383a3d3f42444445464646454442403e3a3936302c29241d17110a02000000000000000000000000040e18222a32373b3c464646464646463e3d39342d241b110600000000000000000000000000000000000000000000000000000000000000000005111c27313a434a4e505353504e4a433a31271c110500000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000000000000000000000000000000c1926333f4c5966727f8c99988c7f7265594c3f3226190c00000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000b17222d38424f59626f7c87939fa99f92867b6e61594f42382e23170c020000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e211408000000000000000000000000000000000000000000000000000000000000000e1b2835414e5b6874818e9ba7afa396897c706356493d3023160a00101c2936434f5c6976828f9ca9aca4978a7d7164574a3e434f5c6976828f9ca9aca4978a7d7164574a3e3124170b0005111d29343f48505658606060606060585651493f2f261b11060000000007121d27314049525759606060606060585650483e34291d1105000000000000000205070e1b2835414e5b6874818e9b9e9184786b5e5145382b1e12050000000000000000000a1723303d4a5663707d8993988a7d70635763707d8993988a7d7063575663707d8993988a7d7063574a3d31261b0f03000000000000000000060f19232b333b42464e54555a5d5e5f5f5f5d5b5854524c4641424a5053575c5e5f5f5d5b54534d453b31251a0e020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009141f29333b42464853535353535353535346413a32281e13080000000000070f151b1f22222d2d2d2d2d2d2c2b281e24292c2d3235383939383731302d28221a12080000000915212c37424b54595c6060606060606060606060606060606060606060606060606060606060606060605c5a544c42382d2115090000000000000000000000000000010d18242f3a47535f6a7683909da9afa3998c7f73665c5044382b1f14090a0a0a0a0a0a0a0a0a0a0a0a0a0a121f2b37434e5864717e8b97a2adaa9d9083776b6054443a2f241907000000000000000000000000020a111721272c3338394045474a4c4e50515253535252514f4d4a4746413a39352f28231c140c0600000000000000000000000a15202a343c434749535353535353534b49453e362d22170c0000000000000000000000000000000000000000000000000000000000000000000a16222d38434c545a5d60605d5a544c43382d22160a00000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000000000000000000000000000000d192633404c5966737f8c99998c7f7266594c3f3326190c00000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000000000000000000000000000006111c262f3d47535f6a74818e97a2a3988e82756b60544a3f34281f14090000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e211408000000000000000000000000000000000000000000000000000000000000000f1b2835424e5b6875818e9ba8b0a396897d7063564a3d3023170a00101d293643505c6976838f9c9f9f9f978b7e7164584b3e43505c6976838f9c9f9f9f978b7e7164584b3e3125180b000815212d3945505a62646c6c6c6c6c6c65625b5141382d22170b000000000c18232f3943525b63666c6c6c6c6c6c64625a5045392d211508000000000002090e1114141b2835414e5b6874818e9b9e9184786b5e5145382b1e12050000000000000000000815222f3b4855626e7b88959a8d81746758626e7b88959a8d8174675855626e7b88959a8d817467584e43372b1f12060000000000000000030e18222b353d454d53585f6266696b6c6c6b6a6865615e56524c4c545b6064696b6c6c6a67615e574d42362a1e1205000000000000000000000000000000010406070b0e101213131312100e0b07060401000000000000000000000000000000000000000000000000000000000000020d17212930363a3b4646464646464646463936302820160c02000000000000040a0f1315162020202020201f1e1c13191d202125282b2c2c2c2a2423211d171008000000000c1925313d49545d65686c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c69665e54493e3226190d00000000000000000000000000000007131d2b37434e5864717e8b97a2adab9e9184786d6053463b31251a16161616161616161616161616161616212e3a47535f6a7683909ca9aea2988b7f7265594f4332281e13080000000000000000000000030b141c222832383e44484b515356595b5d5e5f5f5f5f5f5d5c5a5754524c47454039342e261e170f07000000000000000000030f1b26323c464e535560606060606060585650483e34291d110500000000000000000000000000000000000000000000000000000000000000000d1a26323e4a545e66696c6c69665e544a3e32261a0d00000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000000000000000000000000000000d1a2633404d596673808c99998c7f7366594c403326190d00000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000000000000000000000000000000000a141d2b37434e58616d7a85929fa79e93897d70665c50443b30251a0d0300000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e211408000000000000000000000000000000000000000000000000000000000000000f1c2835424f5b6875828e9ba8b0a3968a7d7063574a3d3024170a00101d2a3643505d6976839093939393938b7e7165584b3e43505d6976839093939393938b7e7165584b3e3225180b000b1724303d4956626c71797979797979726d6253493f33271b0f03000004101c2934404b55636e73797979797979716c6256493d3024170a00000000050d14191e2021272835414e5b6874818e9b9e9184786b5e5145382b1e12050000000000000000000714202d3a4753606d7a86979e9184786a5f606d7a86979e9184786a5f53606d7a86979e9184786a5f53473a2e21150800000000000000000a15202a343d474f575f616a6f7376787979787775716d68615e56565d666c717578797877746e695e53463a2d2114070000000000000000000000000001070d111314181b1d1f1f201f1f1d1b181413110d07010000000000000000000000000000000000000000000000000000000000050f171f252a2d2e39393939393939392e2d2a251e160e0500000000000000000003060809131313131313121210080d111314181c1e1f201f1d181714110c0600000000000e1b2834414d59656f757979797979797979797979797979797979797979797979797979797979797979797670665a4e4135281c0f000000000000000000000000000000010f1b26323c4753606d7985929fabada1968a7d7063574d42362a23232323232323232323232323232323232934404b55626e7b88949fabac9f92867a6d6054473d3221160c0100000000000000000000030c151d262d333d44484f55555c606366686a6b6b6c6c6c6b6a696664615e5653514b443f38302921191007000000000000000006131f2b37434e585f626c6c6c6c6c6c6c64625a5045392d21150800000000000000000000000000000000000000000000000000000000000000000f1c2935424e5a66707679797670665a4e4235291c0f00000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000000000000000000000000000000d1a2733404d5a6673808d99998c807366594d4033261a0d00000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000000000000000000000000000000020b1b26323c46525e68727f8c95a0a59d9083786d60574d42362a1f150b01000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e211408000000000000000000000000000000000000000000000000000000000000000f1c2936424f5c6975828f9ca8b0a3978a7d7064574a3d3124170a00101d2a3743505d6a7683868686868686867f7265584b3f43505d6a7683868686868686867e7265584b3f3225180c000b1825313e4b5864717e8686868686867f72655b5044372b1f150a000006131f2c3845515c6773808686868686867e7164584b3e3125180b000000050e171f252a2d2e342d35414e5b6874818e9b9e9184786b5e5145382b1e120500000000000000000006131f2c3945515d677885929e96887b6f625d677885929e96887b6f62555d677885929e96887b6f6255483c3025190d01000000000000020f1a26313c464f5960696e767c80838585868583817e7a746d68605d686d787e8285868584817b6e6154483b2e211508000000000000000000000002080e13181d202024272a2b2c2d2c2b2a272421201d18130e090300000000000000000000000000000000000000000000000000000000050d141a1e20212d2d2d2d2d2d2d2d21201d19130c05000000000000000000000000000006060606060606050300010406070c0f11121312100b0a0805000000000000000f1c2935424f5c6875828686868686868686868686868686868686868686868686868686868686868686868276695c504336291d10000000000000000000000000000000000a151f2c3845515d6774808d9aa6b0a89c8f8275695e5346382e3030303030303030303030303030303030303845515c6774808d9aa6b0a79b8e8174685d5245392c20130400000000000000000000000b151e272f383f444f54596163676d70727577777879797978777573716d6865605d55504a423b332a22190f06000000000000000815212e3b47535f6a7679797979797979716c6256493d3024170a0000000000000000000000000000000000000000000000000000000000000000101d2a3643505d69768386868376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000000000000000000000000000010d1a2734404d5a6773808d9a998d8073665a4d4033271a0d00000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000000000000000000000000000000000a15202a36414c56606d7883909aa4a0958c7f72695e52463e31271d1207000000000000121f2c3845525f6b7885929eabaca194877a6e6154473b2e21140800000000000000000000000000000000000000000000000000000000000000101c2936434f5c6976828f9ca9aca4978a7d7164574a3e3124170b00101c2936424f5b66717679797979797979726d62564a3d424f5b66717679797979797979726d62564a3d3124180b000713202d3a4653606d7984919393939184786c6053463c31261a0f02000714202d3a4753606d7985929393939184796d6053463a2d2013070000020d17202930363a3b413a38414e5b6874818e9b9e9184786b5e5145382b1e120500000000000000000004101d2935404b556a7783909d998c7f7266566a7783909d998c7f726656556a7783909d998c7f7266564c41362a1d110500000000000006121f2b37434e58606b707b82888d9091929292908e8b86817a706b606d7a828a8f91929290897d7063564a3d3023170a00000000000000000000050d14191d24292c2d31343738393939383634312d2c29241d1a140d050000000000000000000000000000000000000000000000000000000002090e12141520202020202020201413110d080200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f1c2935424f5c6875828f939393939393939393939393939393939393939393939393939393939393938f8276695c504336291d100000000000000000000000000000000004101d2935404b55626e7b88949fabac9f93877b6e61544a3f3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4753606d7985929eabaca095897c6f63564c4135291d11040000000000000000000007121d273039424a505960636b7075797d7f81838485868685858482807d7a76716d67605c544d453c342a21180c030000000000000916222f3c4955626f7c868686868686867e7164584b3e3125180b0000000000000000000000000000000000000000000000000000000000000000101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000000000000000000000000000010e1a2734414d5a6774808d9a9a8d8073675a4d4034271a0d01000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000040d1925303a44515c666f7d88939fa79f92867b6e61594f43392f24180c020000000000121f2c3845525f6b7885929e9f9f9f94877a6e6154473b2e21140800000000000000000000000000000000000000000000000000000000000000101d293643505c6976838f9c9f9f9f978b7e7164584b3e3125180b000e1a26323e4a555f666a6c6c6c6c6c6c6c65625b51453a3e4a555f666a6c6c6c6c6c6c6c65625b51453a2e2215090006131f2c3845515c66727f8c97a2a0958a7d7063584e43372b1e13080714202c38444f5965717e8b97a1a2978c7f72665c5144382c1f1206000009141f29323b4246474d4745404e5b6874818e9b9e9184786b5e5145382b1e1205000000000000000000000c18242f424f5c6875828f9b9c908376685e6875828f9b9c908376685e5c6875828f9b9c908376685e5246392d2013070000000000000814212e3a47535f6a707d858f94999c9e9f9c9b9c9b98928e857d706b75828f949c9e9f9f96897d7063564a3d3023170a000000000000000000080e171e252a2f35393a3e4143454646464543413e3a39352f2a251f170f09000000000000000000000000000000000000000000000000000000000002050708131313131313131307070501000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f1c2935424f5c6875828f9b9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9c8f8376695c504336291d1000000000000000000000000000000000000c18242f3947535f6a7683909ca9afa4998c8073665c504949494949494949494949494949494949494949494e5864717e8b97a2adaa9d9083776b6054443a2f24190d01000000000000000000040e18232e39434b545b606b70767d8185898c8e90919292929292908f8d8a86837e79726d665f574e463c332a1e150b0000000000000916222f3c4955626f7c8893939393938b7e7164584b3e3125180b0000000000000000000000000000000000000000000000000000000000000000101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000000000000000000000000000010e1b2734414e5a6774818d9a9a8d8074675a4d4134271a0e01000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000030709090c0c0c0c0c0c0c0c0c0c0c0c0c0c08131e2834404a54606b74818e97a1a2988e81756b61554b4035291e140a0000000000121f2c3845525f6b7885929393939393877a6e6154473b2e21140800000000000000000000000000000000000000000000000000000000000000101d2a3643505d6976839093939393938b7e7165584b3e3225180b000a16222d38434d555b5d60606060606060585651493f3438434d555b5d60606060606060585651493f34291d11050004101c2834404b54606d7a85929fa89c8f82766a5f53473a3025190d0916232f3c4855606b7783909da99f92857a6d60544a4034281c100400020e1925303b444d52545a53514b4e5b6874818e9b9e9184786b5e5145382b1e120500000000000000000000071a2734414d5a6774808d9a9f93867a6d616774808d9a9f93867a6d615a6774808d9a9f93867a6d6154473a2e23180c000000000007131f2c38434e58626e7c8692989fa29f97928f8e8f9196999792877d707d89949ea69e989291897d7063564a3d3023170a00000000000000010a121a202930363a4045474b4e505252535252504e4b4745413a363029211b120a0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f1c2935424f5c6875828f939393939393939393939393939393939393939393939393939393939393938f8376695c504336291d10000000000000000000000000000000000007121d2b37434e5864717e8a97a1adab9e9184796d6056565656565656565656565656565656565656565656565f6a7683909ca9aea2988b7f7265594f4332281e1308000000000000000000020c16202834404b555c666c737d838a8e9298999b9d9e9e9f9f9f9e9d9c999993908b857f786e695f584e453c30271d120700000000000916222f3c4955626f7c88959f9f9f978b7e7164584b3e3125180b0000000000000000000000000000000000000000000000000000000000000000101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000000000000000000000000000010e1b2834414e5b6774818e9a9a8d8174675a4e4134271b0e01000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000040b0f1315161919191919191919191919191919191918232e39424f59616d7a85929ea69e938a7d70675d51453c30261c110600000000121f2c3845525f6b7885868686868686867a6e6154473b2e21140800000000000000000000000000000000000000000000000000000000000000101d2a3743505d6a7683868686868686867e7265584b3f3225180c0005111c27313b434a4f50535353535353534b4a453f372d313b434a4f50535353535353534b4a453f372d23180c0100000c18232e3945515d6773808d98a39f94887c6f62564c41362a1c12121f2b37434e5863707d8995a0a3988c8073675d5142392e23180c000005111e2a36424d565e6167605c554e5b6874818e9b9e9184786b5e5145382b1e1205000000000000000000000c1926323f4c5965727f8c98a4998b7e716465727f8c98a4998b7e71645465727f8c98a4998b7e7164544a4034281c1004000000000915222e3b4854606a76828f98a2a298928b8583828284878c929792857b818e9aa69e948f8684867d7063564a3d3023170a000000000000000a131c242c323b41464b5153575a5d5e5f605f5e5d5a5754514b46423b332d241c140a01000000000000000000000000000000000000000000000000000106090b0c13131313131313090806030000000000000000000000000003060809131313131313130b0b0905010000000000000000000000000000000000000000000f1c2935424f5c6875828686868686868686868686868686868686868686868686868686868686868686868376695c504336291d100000000000000000000000000000000000010f1a26313c4653606d7985929eacada1968a7d70646363636363636363636363636363636363636363636363636e7b88949fabac9f92867a6d6054473d3221160c0100000000000000000008131e28323a45515c676d78808990959b9fa2aaaba39f9d9d9c9d9ea1a9aba49f9d97928b837b6f6a5f574d42392e23180c02000000000916222f3c4955626f7c8895a2aca4978b7e7164584b3e3125180b0000000000000000000000000000000000000000000000000000000000000000101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000000000000000000000000000020e1b2835414e5b6874818e9b9a8e8174675b4e4134281b0e01000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000070f161b20222325252525252525252525252525252525252527303d46525e68717e8a949ea59e9184796d60584e42382e23170b02000000111e2b3744505d6873787979797979797976685e5246392d20140700000000000000000000000000000000000000000000000000000000000000101c2936424f5b66717679797979797979726d62564a3d3124180b00000a151f2931383e4243464646464646463f3d3a342d242931383e4243464646464646463f3d3a342d241b110600000007121d2935414c55616e7b86929fa69a8e8174685e5246392e231814212e3a47535f6a76828f9ca79f92867a6d61554b4030271c120700000714202d3a46525e696e746d675f585b6874818e9b9e9184786b5e5145382b1e1205000000000000000000000b1724313e4a5764717d8a97ab9b8e82756664717d8a97ab9b8e8275665c64717d8a97ab9b8e8275665c5144382c1f1206000000000916232f3c4956626f7c89949fa79f92867e79767576777b7f858f948f8283909daa9c8f82797779796d6053473a2d20140700000000000009121c252e363e444c52555d6064676a6b6c6c6c6b696764605d55524d453f362e261c1309000000000000000000000000000000000000000000000000060d12161819202020202020201615130f0a04000000000000000000040a0f13151620202020202020181715110c0600000000000000000000000000000000000000000e1b2834414d59656f757979797979797979797979797979797979797979797979797979797979797979797670665a4e4135281c0f00000000000000000000000000000000000009151f2c3845515c6673808d9aa4afa99c8f82757070707070707070707070707070707070707070707070707074808d9aa6b0a79b8e8174685d5245392c201304000000000000000000010d1925303a44515b606d79828d929d9fa7a8a19e999992919090919297979b9fa4a9a19e9590857c6f695f544b4034281e1408000000000916222f3c4955626f7c8895a2afa4978b7e7164584b3e3125180b0000000000000000000000000000000000000000000000000000000000000000101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000000000000000000000000000020f1b2835424e5b6875818e9b9b8e8174685b4e4135281b0e02000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000007111921272c2f30323232323232323232323232323232323232323235414c56616c75828f98a2a1968d80736a5f544a3f34281d140a0000000f1c2834404c5761686b6c6c6c6c6c6c6c6c5e564c41362a1e1105000000000000000000000000000000000000000000000000000000000000000e1a26323e4a555f666a6c6c6c6c6c6c6c65625b51453a2e2215090000030d171f272d3236373939393939393932312e29231b1f272d3236373939393939393932312e29231b120900000000000d19242f3a46525e6874818e9aa49f92867a6d61544a4034281c1d2a36414c56626e7b88949fa3998d8174685e52433a2f1e150b0000000814212e3b4754616e7b80796f6a605b6874818e9b9e9184786b5e5145382b1e1205000000000000000000000916232f3c4956626f7c8995ab9f9285796d626f7c8995ab9f9285796d60626f7c8995ab9f9285796d6053463a2d201309000000000d1a2733404d5a6673808d99a69f958a7d716d666869696e737a828e938f90959fa298887b6f676d6d675c5145382c1f13060000000000050f1b242e37404850565e61676d71747678797979787674716d67615e57504840382e251b0f06000000000000000000000000000000000000000000010911181e2224252d2d2d2d2d2d2d23221f1b160f0700000000000000070f161b1f22232d2d2d2d2d2d2d2524211d171109000000000000000000000000000000000000000c1925313d49545d65686c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c69665e54493e3226190d00000000000000000000000000000000000004101c2834404b54616e7b87939facac9f93877d7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7d85929fabaca095897c6f63564c4135291d110400000000000000000005111d2935414c56626d75818e949ca4aba39f96918c88868483838485878a8f939a9fa7a79f9791857b6e665c51453b3025190d000000000916222f3c4955626f7c8895a2afa4978b7e7164584b3e3125180b0000000000000000000000000000000000000000000000000000000000000000101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000000000000000000000000000020f1c2835424f5b6875828e9b9b8e8175685b4e4235281b0f02000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000040f19232b32383b3c3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f44505a616e7b86929fa69f92877c6f665c50443c2f261b110600000c18242f3b454f575d5f606060606060605f524c443b3025190e02000000000000000000000000000000000000000000000000000000000000000a16222d38434d555b5d60606060606060585651493f34291d1105000000040d151c2226292a2d2d2d2d2d2d2d2524221d1811151c2226292a2d2d2d2d2d2d2d2524221d18110900000000000008131e2a36414d56626e7b87939fa3988c7f73665c5144382c1f202d3946525e6874818e9aa69f92877b6e61564c4131281d0c030000000815212e3b4854616e7b87837c726c656874818e9b9e9184786b5e5145382b1e1205000000000000000000000814212e3b4754616e7a8799a3a297897c70636e7a8799a3a297897c7063616e7a8799a3a297897c706356493d31261a0e02000000101d293643505c6976838f9ca99d9083766c605c54575e61686d78818e949d9fa79f9285796a5f60605c554b4034291c100400000000030d17212d364049515a61686e747a7e8183858586858583817e7a746e69625a524a40372d21180e03000000000000000000000000000000000000000009131b23292e3132393939393939392f2e2b2720191007000000000007101920272b2e2f3939393939393932312e29221b12090000000000000000000000000000000000000915212c37424b54595c6060606060606060606060606060606060606060606060606060606060606060605c5a544c42382d211509000000000000000000000000000000000000000c18232e3946535f6976828f9ca9afa499938a89898989898989898989898989898989898989898989898989899297a2adaa9d9084776b6054443a2f24190d010000000000000000000713202d3946525e68727f8b939ea6aba399928c84807c7977767677787a7e828790959ea5a9a1979083796d60564c41362a1c11060000000916222f3c4955626f7c8895a2afa4978b7e7164584b3e3125180b0000000000000000000000000000000000000000000000000000000000000000101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000000000000000000000000000020f1c2935424f5c6875828f9b9b8e8275685b4f4235281c0f02000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000000203101d2a3643505d69768390908376695d5043362a1d10030200000000000000000b16212b353d4448494c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c525e69727f8b949fa3999083786d60574d41382d22170b000007131e29333d454c5052535353535353535346413b32291e1408000000000000000000000000000000000000000000000000000000000000000005111c27313b434a4f50535353535353534b4a453f372d23180c0100000000030a11161a1c1d20202020202020181815110c060a11161a1c1d20202020202020181815110c0600000000000000010e1925303b47535f6975828f9ba69e9184796d6053463d32272834404b55616d7a86929fa69b8e8175695f53443a301f160c000000000815212e3b4854616e7b8790867f776e6974818e9b9e9184786b5e5145382b1e1205000000000000000000000613202d394653606c7986929fa99a8d8073676c7986929fa99a8d807367606c7986929fa99a8d807367574d42372b1e1206000000111e2b3744515e6a7784919da6998d80736659504a4d52565e666d78829099a3aa9e9184776b585353514b43392f23180c000000000009141f29333f48515b636c717a80868a8d909192939291908d8a86817b716d645c52493f332a2015090000000000000000000000000000000000000009121b252d343a3e3f464646464646463c3b38322b22190f04000000040f19222b32383b3c464646464646463e3d3a342d241b1108000000000000000000000000000000000004101b26303942494d4f535353535353535353535353535353535353535353535353535353535353535353504e49423a30261b10050000000000000000000000000000000000000007121d2a36424d5764707d8a96a1adaba49f9796969696969696969696969696969696969696969696969696969fa2a9aea2988b7f7265594f4332281e130800000000000000000003101c28343f4a54616d7a85929fa5aea39992877f79736f6d666a696a686e71757c838f939ea7a9a0958c8073685e5246382d22170b0000000916222f3c4955626f7c8895a2afa4978b7e7164584b3e3125180b0204050606060504020000000000000000000000000000000000000000000000101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000000000000000000000000000030f1c2936424f5c6975828f9c9b8f8275685c4f4235291c0f02000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000050a0f12101d2a3643505d69768390908376695d5043362a1d10120f0a050000000000030f1b27323d474f54565858585858585858585858585858585858585858585858585857606c77828f97a2a0958c7f72695f53493f33271b0f0300020d17212b333b404445464646464646463b3936302920170d020000000000000000000000000000000000000000000000000000000000000000000a151f2931383e4243464646464646463f3d3a342d241b110600000000000000050a0e1010131313131313130c0b0905010000050a0e1010131313131313130c0b09050100000000000000000008141f2b37424d57626f7c89949fa1978a7e7164594f44382c2c3845515c67737f8c98a39f94887c6f62574d4232291e0d04000000000815212e3b4854616e7b8798928c827b7174818e9b9e9184786b5e5145382b1e12050000000000000000000005121f2b3744505b657784919eaa9d91847769657784919eaa9d918477695f657784919eaa9d918477695f53473a2d211408000000121e2b3845515e6b7884919ea5988b7e7265584b3f42464c545c666f7c87929faa9d9084776a5d514745403931271d120700000000020e1a25313b45505a636d737e858d92989a9d9a9998999a9c9a98928d867e736e645b51463c31261a0f04000000000000000000000000000000000008111a242d373f464a4c535353535353534947433d342b20160a0000000a16202b343d434749535353535353534b4a453f362d241a1107000000000000000000000000000000000009141e2730373d414246464646464646464646464646464646464646464646464646464646464646464643413e3830281e140a0000000000000000000000000000000000000000000e1a26313b4653606d7984919eabb5afaca3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3abadb3ac9f92867a6d6054473d3221160c0100000000000000000006121f2b3844505c6673808d97a2aba79f92877d726d6762605c545d565e61646a6f79818f95a0aba79f92867a6e61544a3f33281c0f0300000916222f3c4955626f7c8895a2afa4978b7e7164584b3e3125180c0e101213131312100e0b08070502000000000000000000000000000000000000101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000000000000000000000000000003101c2936434f5c6976828f9c9c8f8275695c4f4236291c0f03000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000010910161b1e20202a3643505d69768390908376695d5043362a20201e1b161009010000000713202c38444f596063656565656565656565656565656565656565656565656565656565656e7b85929fa79f92867b6e655b5044372b1f12050000060f1921292f343738393939393939392e2d2a251e170e0500000000000000000000000000000000000000000000000000000000000000000000030d171f272d3236373939393939393932312e29231b12090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020e1a26313c4854606a7683909ca79d9083776b6054483b312d3a4653606d7985919ea79c8f82766a5f54453b3120170d00000000000815212e3b4854616e7b879298948f857e74818e9b9e9184786b5e5145382b1e120500000000000000000000030f1b27333f49536976838f9ca9a096887b6e6976838f9ca9a096887b6e616976838f9ca9a096887b6e6155483b2f24190d010000111e2a3744515d6a7784909da5988b7f7265544a413d3b424b545f6a75828f9ca89d9084776a5d514438342f271f150b010000000005121e2a36424d57626c737f8a92979f9f97918e8c8b8c8e91969e9f98928b80736d62584e43372b21160b0000000000000000000000000000000007101a232c363f495156586060606060606056544e463d32271b0f0300030f1b27323d464e545660606060606060585650483f362c2319100700000000000000000000000000000000020c151e262c3134353939393939393939393939393939393939393939393939393939393939393939393635322d261e160c0300000000000000000000000000000000000000000009141f2c3844505c6673808c99a3afbbb9b1acaa9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9fa7a9afb8bab1a79b8e8174685d5245392c201304000000000000000000000713202d3a4653606d7985929b9d9e9f958b7e716b605c5553514a504c5254585f676d78839099a3aea2988c8073665b5044382b1f120600000916222f3c4955626f7c8895a2afa4978b7e7164584b3e312518191b1d1f1f201f1f1d1b181414110e080200000000000000000000000000000000101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000000000000000000000000000003101d293643505c6976838f9c9c8f8276695c4f4336291c1003000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000010a131b21272b2d2d2d3643505d69768390908376695d5043362d2d2d2b27211b130a0100000915222f3b4854606b6f7272727272727272727272727272727272727272727272727272727272727e8b97a1a3989082776c605346392d201306000000070f171e24282b2c2d2d2d2d2d2d2d21201e19140d05000000000000000000000000000000000000000000000000000000000000000000000000040d151c2226292a2d2d2d2d2d2d2d2524221d181109000000000000000000000105070810101010101010101010101010101010101010101008070501000000000000000000000000000000000915202c38434e5863707d8a95a0a095897c6f63574d423638444f5964717e8b97a1a095897d7063584e43332a1f0e0500000000000613202d394653606c787f86909597928a81818e9b9e9184786b5e5145382b1e120500000000000000000000000b17222d414e5b6874818e9ba7a8988c7f726874818e9ba7a8988c7f72656874818e9ba7a8988c7f7265554c4135291d11040000101c2936434f5c6976828f9ca79a8d8074665c524c4a4847464e5865717e8b98a49d9084776a5d51443729231d150d0300000000000714212d3a46535e69717e8b919fa297928b85817f7f8081848a9196a09f928c7f726a5f53473d32271b10010000000000000000000000000000061019222c353e48515b62656c6c6c6c6c6c6c6260584e43382b1f13060006131f2b38434e5860626c6c6c6c6c6c6c65625a50483e352b22190f0600000000000000000000000000000000030c141b212528292d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d292826211b140c040000000000000000000000000000000000000000000003101c28343f4a54616e7b87929facb9b1a7a0939393939393939393939393939393939393939393939b9ea5afb8aca095897c6f63564c4135291d1104000000000000000000000a1623303d495663707c898c8e9092979083786c6059514b464440434146474e555d666f7c86929facaa9e9184786c605346392d20130600000916222f3c4955626f7c8895a2afa4978b7e7164584b3e31252225282a2b2c2d2c2b2a282521201e19140f0a040000000000000000000000000000101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000000000000000000000000000003101d2a3643505d697683909c9c8f8376695c504336291d1003000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000009131c252c33373939393943505d69768390908376695d50433939393937332c251c13090000091623303c4956636f7c7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f85919eaa9f948b7f7265584b3f3225180c00000000060d13181c1e1f202020202020201414110e08020000000000000000000000000000000000000000000000000000000000000000000000000000030a11161a1c1d20202020202020181815110c0600000000000000000002080d1114141c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1414110d08020000000000000000000000000000030f1b27323d4653606c7884919da79b8f8275695f53463a3c4854606b7783909da89d9083776b6054463c3221180e00000000000006121f2b3844505b666c727c838c9299938e8e939e9e9184786b5e5145382b1e12050000000000000000000000061a2633404d596673808c99a6a99c8f82766773808c99a6a99c8f8276676673808c99a6a99c8f8276675d5145392c20130600000c1926333f4c5966727f8c99a59e9184796d605d5656555453505663707c8996a39d9084776a5d5144372a18120b03000000000006121f2b37434e58616e7b86929fa29792857e787473727374787d849095a09f92867c6e62594f44382c1e130800000000000000000000000000060f18222b343e47505a626d72797979797979796f6a6054473b2e221508000815222e3b4754606a6f79797979797979716c625a50473d342b21180f050000000000000000000000000000000002091015191b1c2020202020202020202020202020202020202020202020202020202020202020201d1c1915100a030000000000000000000000000000000000000000000000000c17232e3846525e6975828f9ca8b2aca095898686868686868686868686868686868686868686868e939ea9b4aa9d9084776b6054443a2f24190d01000000000000000000000814212e3b4754616e7b7e7f81838587887e71655b5045403a38343036393c434b545f6a75818e9baaada196897c6f6256493c2f23160600000916222f3c4955626f7c8895a2afa4978b7e7164584b3e312d2e32353738393939383735312e2d2a251f1b150d0701000000000000000000000000101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000000000000000000000000000004101d2a3743505d6a7683909d9c908376695d5043362a1d1003000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000005101b252e373e434646464646505d69768390908376695d504646464646433e372e251b1005000e1b2734414e5a6774808b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b9197a1ada69b8e8175685b4f4235281c0f000000000002070c0f11121313131313131308070502000000000000000000000000000000000000000000000000000000000000000000000000000000000000050a0e1010131313131313130c0b090501000000000000000000050d14191e202129292929292929292929292929292929292929292921201e19140d0500000000000000000000000000000a161f2b3744505b65717e8b96a19f93877b6e61554c41424e5763707d8995a0a0968a7e7164594f44342a200f06000000000000030f1c28333f4a545b606a6e787f8690959b9b9ea59e9184786b5e5145382b1e120500000000000000000000000b1825323e4b5865717e8b98a4ac9f92867a6d717e8b98a4ac9f92867a6d65717e8b98a4ac9f92867a6d6054473a2d22170b00000915222f3c4855626f7c88939ea0968c7f746d6865636261605c5f626f7b8895a29d9084776a5d5144372a1e07010000000000000815212e3a47535f6a76828f98a29f92857b716c66666566656c707a839099a3989083766b6054483a2f24190d010000000000000000000000050e17212a343d474f59616c727f868686868686867c6f6256493c2f231609000916232f3c4956626f7c868686868686867e716c61594f463c332a21170e05000000000000000000000000000000000004090c0e0f131313131313131313131313131313131313131313131313131313131313131313100f0d0905000000000000000000000000000000000000000000000000000006111c2a36424d5763707d8a96a1acaa9d9083797979797979797979797979797979797979797979818e9ba7aea2988b7f7265594f4332281e130800000000000000000000000714202d3a46525e696e71737476787a7c796d6053493f46464544423f3b3a39424e5863707d8998a2aea8998c7f7266594c3f2d22170b00000916222f3c4955626f7c8895a2afa4978b7e7164584b3e373a3b3f4143454646464543413e3b3936302b272018130c040000000000000000000000101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000000000000000000000000000004111d2a3744505d6a7783909d9d9083766a5d5043372a1d1004000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000a16212c3740494f5353535353535d69768390908376695d5353535353534f4940372c21160a000e1b2734414e5a6774818d9898989898989898989898989898989898989898989898989898989898989ea1a9b3a89b8e8175685b4f4235281c0f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050e171e252a2d2e3636363636363636363636363636363636363636362e2d2a251e170e0500000000000000000000000000030f1b27333f4953606d7984919ea4998d8074675d514547535f6a75828f9ca79e9184786d6053463d3320190e00000000000000000b17222d38424a50585f666d727c838c9299a0a79e9184786b5e5145382b1e120500000000000000000000000a1723303d4a5663707d8996a3aea3998a7d71707d8996a3aea3998a7d7164707d8996a3aea3998a7d7164544a3f33281c0f03000815212e3a47535f6a75828f97a29c918c807a7572706e6d6d666c6c6f7b8895a29d9084776a5d5144372a1e1104000000000003101c28343f4a54626f7c88949fa0958a7e7169605b5458535b60686e7b86929f9f95897d7063564c4135291d110400000000000000000000040d172029333c464f59616b717e88939393939791847a6d6154473a2e211407000714212e3a4754616d7a84919793939392877e706b60584e453c332920160d0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e1a25303b4653606c7884919eabaca095897c6f6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6d7a86929facac9f92867a6d6054473d3221160c01000000000000000000000005111e2a36424d575e616466686a686d6f6d675d515152535352514e4c4847423c4653606c7885929faba89b8f82756853493f33271b0f03000916222f3c4955626f7c8895a2afa4978b7e7164584b3e4246484c4e505252535252504e4b4746413b373229241d160d0500000000000000000000101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000000000000000000000000000004111e2a3744515d6a7784909d9d9083776a5d5044372a1d1104000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000f1b27333e49525a5f60606060606069768390908376696060606060605f5a52493e33271b0f000e1b2734414e5a6774818d9aa5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5abadb3aca89b8e8275685b4f4235281c0f00000000000000020507080c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0b0906010000000000000000000000000000000000000000000000020d1720293036393b4343434343434343434343434343434343434343433b3936302920170d02000000000000000000000000000b17222d3844515c66727f8c97a29f92857a6d60544a4c56626e7b87939fa1978b7e72665c5044382b1f1207000000000000000006111c262f383f444e545c606a6f788087909593939184786b5e5145382b1e120500000000000000000000000815222f3b4855626e7b8895a99f9f9b8e81746e7b8895a99f9f9b8e8174666e7b8895a99f9f9b8e8174665b5044382b1f12060006121f2b37434e58616e7b8592979f9c928d86827f7d7b7a79797978787c8895a29d9084776a5d5144372a1e1104000000000006121f2b3844505c6674818d9aa69d9083786c6057504a4c4950565f6974818d9aa79b8e8175685d5245392c201306000000000000000000030d161f29323b454e58606b707d87929aa4a29791857b6e685e5246392d201307000713202d3946525e686e7b859197a2a39992867d706a60574e453b32281f160c030000000000000000000000000000060a0e1011131313131313130b0a08080b0d0e131313131313130e0d0b07030000000000000000000000000000000000000000000000000000000000000000000000000000000009141f2b3844505b66727f8c99a3aea79a8d8174675c606060606060606060606060605765717e8b98a2aea79b8e8174685d5245392c201304000000000000000000000000020e1a25303b454d525457595b565d6062605d555c5e5f5f5f5f5d5b5955534d4644505b6576838f9ca9aa9e918477655b5044372b1f1205000916222f3c4955626f7c8895a2afa4978b7e7164584b464d5355585b5d5e5f605f5e5d5b5854524d47433d352f281f170f05000000000000000000101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000000000000000000000000000004111e2b3744515e6a7784919d9d9084776a5d5144372a1e1104000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000121e2b37434f5a646c6c6c6c6c6c6c6c7683909083766c6c6c6c6c6c6c6c645a4f43372b1e12000e1b2734414e5a6774818d9a9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9b8e8275685b4f4235281c0f000000000003090e12141519191919191919191919191919191919191919191919191919191919191919191919191919191919191919191919191919191816120d070000000000000000000000000000000000000000000008141e29323b4146474f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4746413b32291e14080000000000000000000000000006111b2834404a54606d7a85929fa2988b7f72665b50525e6874818d9aa49e9285796d60544a3f34281c10030000000000000000000a141d262d333c424a50585f666d737c838686868684786b5e5145382b1e120500000000000000000000000714202d3a4753606d7a8697939393939285796d7a8697939393939285796c6d7a8697939393939285796c605346392d20130600030f1b26313c46535e696f7c858f949c9f98928f8c898887868685858584919eaa9d9084776a5d5144372a1e110400000000000713202d3a4653606d7885929fa9988b7f72655b50443f3f3f444d57626f7c8897a19f92867a6d6054473a2d2114070000000000000000030c151f28313b444d575f6a6f7d869299a3a29892857c6f695f564c4135291d11050005111d2935414c565f696f7c859298a2a39892867c6f6a5f574d443a31281e150c020000000000000000000000040b11161a1d1e2020202020202018171514171a1b202020202020201a1a17130e08010000000000000000000000000000000000000000000000000000000000000000000000000000030f1c28333f4a54616e7a86929facab9f9285796d60535353535353535353535353535f697683909caaaca095897c6f63564c4135291d11040000000000000000000000000009141f29333b4246474a4c4e4c52545c606366696b6c6c6c6b6a6865625f5753504a536773808d9aa6ac9f9286796c605346392d201306000916222f3c4955626f7c8895a2afa4978b7e7164585053575f6165686a6b6c6c6c6b6a6864615e56544e45403a312921170f050000000000000000101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000000000000000000000000000005111e2b3844515e6b7784919e9d9184776a5e5144372b1e1104000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000013202d3946535f6c767979797979797979839090837979797979797979766c5f5346392d2013000e1b2734414e5a6774808d9393939393939393939393939393939393939393939393939393939393939393939393938e8275685b4f4235281c0f00000000060d141a1e2122262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262525221e1811090100000000000000000000000000000000000000010d1925303b444c52545c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c54524c443b3025190d01000000000000000000000000000c18232e3945515d6773808d98a39e9184786c605354616d7a86929fa2988c7f73675c5142382e23170b00000000000000000000020b141c222830383f444e545c606a6f77797979797872685c5043372a1d1104000000000000000000000006131f2c3945515d677885868686868686867c6f7885868686868686867c6f677885868686868686867c6f6256493c2f23160900000a15202a36424d57606a6f7b828a8f9299999b9896959499929292919196a1aa9d9084776a5d5144372a1e110400000000000915222f3c4855626f7c8897a2a197887b6e6153493f332d333b4653606c7985929ea399897d706356493d3023160a00000000000000020b151e27313a434c565f696f7c859298a2a39992867d6f6a5f574d443a3025190d0100010d1925303a444d575f6a6f7d869299a3a29892857c6e695e564c433a30271e140a00000000000000000000050d151c2227292a2d2d2d2d2d2d2d2524211f2426272d2d2d2d2d2d2d2726231f19120b0200000000000000000000000000000000000000000000000000000000000000000000000000000b17222d3846525e6875828e9ba8ada2978a7e7164574d42464646464646463f4a54626e7b88949fabaa9d9084776b6054443a2f24190d0100000000000000000000000000020d17202930363a3b404850565d60666d70737677787979787775726e6964605c545966727f8c99a5aea399877a6d6154473a2e211407000916222f3c4955626f7c8895a2afa4978b7e7164545c6064696e72747678797979787674716e68626058514b433b332921170d0300000000000000101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000000000000000000000000000005121e2b3845515e6b7884919e9e9184776b5e5144382b1e1105000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000013202d394653606c798686868686868686909494908686868686868686796c605346392d2013000e1b2734414e5a67748086868686868686868686868686868686868686868686868686868686868686868686868686868175685b4f4235281c0f000000060f181f262a2d2e3232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232312e29231b13090000000000000000000000000000000000000005111e2a36414c565e61696969696969696969696969696969696969696969615e564c41362a1e11050000000000000000000000000007121c2935414b55616e7a86929fa0968a7d7064585c66737f8c98a29f92857a6d60554b4030261c11060000000000000000000000020a11171e262e343c424a51585f626a6c6c6c6c6b6860564b3f33271b0f02000000000000000000000004101d2935404b55687378797979797979796f6a7378797979797979796f6a687378797979797979796f6a6054483b2e2215090000030e1a25313b454e5860696e767d8286898c8e8f90909191919292929399a4aa9d9084776a5d5144372a1e110400000000000b1825323e4b5865717e8b98a99e928578695f5341382d222b3744505b6575828f9cab998c7f7266594c3f3326190c000000000000000a141d263039434c565e686e7b859197a2a49a92877d706b60584e453b32281e130800000008131e28323b454e58606b707d879299a4a19791847b6e685e554b433930261c11060000000000000000040d171f272e3336373939393939393931302d2b303334393939393939393433302b241d140b010000000000000000000000000000000000000000000000000000000000000000000000000006111c2a36414c5663707d8996a0aca99c8f8276695e5246382d393939393844505c6673808d99a6aea2988b7f7265594f4332281e1308000000000000000000000000000000050e171f252a38404a525a61686d73797d8082848586868584817f7b77716d66605865717e8b98a4b4ab94887b6e6155483b2e221508000916222f3c4955626f7c8895a2afa4978b7e716460666d71777b7f8183858586858583817e7b756f6a605d554d453b33291f150b01000000000000101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000000000000000000000000000005121f2b3845525e6b7885919e9e9184786b5e5145382b1e1205000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000013202d394653606c7986939393939393939c9f9f9c9393939393939386796c605346392d2013000d1a26333f4c58646e747979797979797979797979797979797979797979797979797979797979797979797979797979756f65594d4034271b0e0000030d18212931363a3b3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3e3a342d251b11070000000000000000000000000000000000000714202d3946525e686e7676767676767676767676767676767676767676766e685e5246392d20140700000000000000000000000000000d18242f3a46525e6874818e99a49c9083766a60606d7984919ea3998d8073685d5243392f1e140a0000000000000000000000000000060c141c2328303940444e54555d606060605e5c564e443a2f23170b000000000000000000000000000c18242f39435761686b6c6c6c6c6c6c6c6260686b6c6c6c6c6c6c6c626061686b6c6c6c6c6c6c6c6260584e43382c1f130700000009141f29333c464e575f626c70757a7d7f8182838484848585858687939faa9d9084776a5d5144372a1e110400000000000e1b2734414e5a6774808d9aa79d9083766a574d422f261b27333f49536774808d9aa79b8f8275685c4f4235291c0f00000000000006111b262f38424b555d686e7a849197a1a49f93887e716b61594f463c332a20160c02000000020c16202a333c464f59616b717e87939fa3a19691847a6d675d554b42382e2317130a000000000000000b151f2931393f4244464646464646463e3d39363c3f4146464646464646413f3c362f261d120800000000000000000000000000000000000000000000000000000000000000000000000000000d1925303b4854606b7784919daaac9f93877b6e6153493f33272d2d2d3a4653606d7984919eabac9f92867a6d6054473d3221160c01000000000000000000000000000000020c16202c36404a525c646c717a8085898d8f9192929292908e8c88837e786f6a6264717d8a97a4aea195887b6e6255483b2f221508000916222f3c4955626f7c8895a2afa4978b7e71646a6f787e83888b8e909192939291908e8b86827c746d675e574d453b31271d1207000000000000101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000000000000000000000000000005121f2c3845525f6b7885929e9e9185786b5e5245382b1f1205000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000013202d394653606c798689898989898989909595908989898989898986796c605346392d2013000b1724303c47525c64676c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c68655d53483d3125180c000009141f29333b4246484c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4a463f372d23180d0100000000000000000000000000000000000814212e3b4754616e7a8282828282828282828282828282828282828282827a6e6154473b2e211408000000000000000000000000000007131d2a36414c56626e7b87939f9f94887c6f6264717e8b97a19f92867b6e61564c4131271d0c02000000000000000000000000000000020a11171e272e343c434749515353535351504b443c32281d12070000000000000000000000000007121d2731454f575d5f6060606060606056545d5f606060606060605654575d5f6060606060606056544e463d32271b0f030000020e1a25313b454d5354575a6164686d7072747576777778787878797c8895a29d9084776a5d5144372a1e110400000000000f1c2936424f5c6975828f9ca89b8e8175685b4e42312817222d3f4c5865727f8b98a59d9083766a5d5043372a1d100000000000091217222d38414a545d676d7a839096a0a49c928b7f726c61594f473d342a21180e040000000000040e18212a343d464f59616c727f8b919ca4a0969083796d675c544a3f3428251c1209000000000006111c27313b434a4f51535353535353534b494541474c4e535353535353534d4c4740382f24190e030000000000000000000000000000000000000000000000000000000000000000000000000008141e2c38444f5965727f8c98a3aea4998c7f73655b5044372b1f2a36414c5663707d8a97a1ada79b8e8174685d5245392c2013040000000000000000000000000000000008131e28323e48525c646e737e858d9297999c9e9f9f9f9e9d9b9895908b847c726d64717d8a97a4aea295887b6f6255483c2f221509000916222f3c4955626f7c8895a2afa4978b7e716c717c838b9095989b9d9e9f9f9f9e9d9b99928f8781796e695e574d43392f23180c030000000000101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000000000000000000000000000006121f2c3945525f6c7885929f9e9285786b5f5245382c1f1205000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000a1723303d4a5663707d7d7d7d7d7d7d7d839090837d7d7d7d7d7d7d7d7063564a3d3023170a0008141f2b36414a52585a60606060606060606060606060606060606060606060606060606060606060606060606060605b59534b41372c20140800020e1a26313b454d535559595959595959595959595959595959595959595959595959595959595959595959595959595959595959595959595959585651493f34291e120600000000000000000000000000000000000815212e3b4854616e7b878f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f877b6e6154483b2e2115080000000000000000000000000000010e1925303b47535f6975828f9ba69b8e8175686b7783909da49a8e8174695e52443a301f150b000000000000000000000000000000000000060c151c232832373b3c444646464645433f3a322a20160c0100000000000000000000000000010b151f333d454c505253535353535353494850525353535353535349484c5052535353535353534948433d342b21160a00000005121e2a36424d575e6163646566676663666869696a6b6b6b6b6c6f7b8895a29d9084776a5d5144372a1e11040000000000101d2a3643505d697682909ca79a8d8174675a4e4134271b25313e4b5864717e8b97a49d9184776a5e5144372b1e110000000008121b2427333f49535c666d79829095a0a59d928c7f736d625a50473e352b22180f0600000000000000060f18222b343d47505a626d727f8c929da59f958f82796d665c504440372e241b1208000000000a16222e39434d555b5d606060606060605856504a52585a606060606060605a58524a40362b1f13070000000000000000000000000000000000000000000000000000000000000000000000000002101c27333d4754616d7a86929facab9e9184786c6053463a2f242d3946525e6875828f9ba9aca095897c6f63564c4135291d1104000000000000000000000000000000010d1925303a44505a646e73808a92979ea1a9a9a8a19e9c9b9a9b9d9f9d9591877f736e717d8a97a4afa295887c6f6255493c2f221609000916222f3c4955626f7c8895a2afa4978b7e71717e8790959da09e9c9b9a9b9c9ea1a9aba39f9a938e847b6e695e554b4034292015090000000000101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000000000000000000000000000006131f2c3946525f6c7985929f9f9285786c5f5245392c1f1200000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000916222f3c4854606b70707070707070768390908376707070707070706b6054483c2f22160900030e1a242f3841474c4e53535353535353535353535353535353535353535353535353535353535353535353535353534f4d4841392f251a0f040005121e2a36424d575f616565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565625b51463a2e22160900000000000000000000000000000000000815212e3b4854616e7b87949c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c94877b6e6154483b2e21150800000000000000000000000000000008141e2b37424d57626f7c89949f9f92867b6e707d8995a09f93877c6f62574d4232281e0d0300000000000000000000000000000000000000030b121820262b2e2f37393939393837332f2820180f05000000000000000000000000000000030d212b333b404445464646464646463c3b4445464646464646463c3b404445464646464646463c3b38322b22190f040000000714212d3a46535e696e7071727374736d63545c5d5d5e5e5e5f626f7b8895a29d9084776a5d5144372a1e11040000000000111e2a3744515d6a7783909da69a8d8073675a4d4034271a24313e4a5764717d8a97a49e9185786b5e5245382b1f12000000060f1a242d363f44505b656d78828f949fa69e938d80746d635b51483e352c23191006000000000000000000061019222c353e48515b636d73808d939da59f948f81786d605c52493f362d241a0f060000000e1a27333f4a555f676a6c6c6c6c6c6c6c64625a525c64676c6c6c6c6c6c6c67645c52473c3023170b00000000000000000000000000000000000000000000000000000000000000000000000000000b16202d3946525d6875818e9ba7aca096897c7063554b4135292e3a4754616d7a86929facaa9d9084776b6054443a2f24190d0100000000000000000000000000000005111d2935414c56616c73808d929fa2a9aaa29f9996918f8e8d8e9092999d99928c8073717d8a97a4afa295887c6f6255493c2f221609000916222f3c4955626f7c8895a2afa4978a7e717e8892999e9896918f8e8d8e8f92979b9fa4aca49f9691847b6e675c51453c31261a0e0200000000101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000000000000000000000000000613202c3946535f6c7986929f9f9285796c5f52462e23170b00000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000713202c38444f5960636363636363697683909083766963636363636360594f44382c201307000008131d262f363c3f41464646464646464646464646464646464646464646464646464646464646464646464646464642403d372f271e130900000714212d3a46535f696e72727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272726d62564a3e3125180b00000000000000000000000000000000000815212e3b4854616e7b8794a1a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a194877b6e6154483b2e211508000000000000000000000000000000020e1a26313c4754606a7683909ca3998c807375828f9ca69c8f82756a5f53453b3020160c00000000000000000000000000000000000000000000070c151b1f22222a2d2d2d2d2b2a27231d160f0600000000000000000000000000000000000f1921292f343738393939393939392f2e3738393939393939392f2e343738393939393939392f2e2c2721191007000000000815212e3b4854616e7b7d7e7f7f807f73665b50505151515256636f7c8996a29c8f8376695c504336291d10030000000000111e2b3844515e6b7784919ea6998c807366594d4033261a24303d4a5763707d8a96a39f9285796c5f5246392c1f130000030e18212c363f48515b606c77818e949ea69e948e81776c605b52493f362c231a1007000000000000000000000007101a232c363f49515b646e74818e939ea69e938e81746e635b51483f362c21180e030000101d2936424f5b67717779797979797979716c6258646e7479797979797979746e64584c3f33261a0d000000000000000000000000000000000000000000000000000000000000000000000000000005111d2935414c56636f7c8995a0aca89b8e8174675d5145392c37434e5865727f8b99a3aea2988b7f7265594f4332281e1308000000000000000000000000000000000713202d3946525e68717e8a929da4ada79f98928d88848281818183868b91959f928b7f727d8a97a4afa295887c6f6255493c2f221609000916222f3c4955626f7c8895a2afa4978a7e7c86929a96918c8784828181818285898e939aa1a9a8a0969083796d60574e42372b1f140900000000101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000000000000000000000000000006121f2b3844505c667986939f9f9286796c5f4a3f34281c1003000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000004101c27333d474f5456565656565d69768390908376695d5656565656544f473d33271c10040000010b141d242b30333439393939393939393939393939393939393939393939393939393939393939393939393939393534312c251e150c0200000815222e3b4855616e7b7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7265584c3f3225190c00000000000000000000000000000000000815212e3b4854616e7b87949f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f94877b6e6154483b2e211508000000000000000000000000000000000915202b38434e5863707d8a95a09e9285797b87939f9f94897c6f63584e4333291f0e040000000000000000000000000000000000000000000000040a0f1315161e202020201e1d1b17120c05000000000000000000000000000000000000070f171e24282b2c2d2d2d2d2d2d2d23222b2c2d2d2d2d2d2d2d2322282b2c2d2d2d2d2d2d2d23221f1b160f0700000000000b1724313e4a5764717d8a8b8b8c8d86786c60544c4a494a4e5764717e8b97a49b8e8275685b4f4235281c0f020000000000111e2a3744515d6a7783909da6998d8073665a4d4033271a24313d4a5764707d8a97a39f9285786c5f5245392c1f1200000915202a333e48505a636d73808d939ea69f948f82786d655b504940372d241a11080000000000000000000000000008111a242d374049525c606d78818f949fa59d938d80736d635a50483e332a2015090000111e2a3744515d6a7783868686868686867e71645a677480868686868686868074675a4d4134271a0e0000000000000000000000000000000000000000000000000000000000000000000000000000010d1924303a4854606b7783909daaac9f92857a6d6054473c313b4754606a7783909dabac9f92867a6d6054473d3221160c0100000000000000000000000000000004111d2935414c56616d7a85929ea4aea79f959086807b7875747475767a7e848c939992867c7d8a97a4afa295887c6f6255493c2f221609000916222f3c4955626f7c8895a2afa3978a7e839098938d847f7b777574747476797c81889297a1a9a89f958d80736a5f53473b30251a0e02000000101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000000000000000000000000000713202d3a4653606d79869aa49f938679665c5044382b1f1206000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000b16212b353d44484a4a4a4a505d69768390908376695d504a4a4a4a48443d352b21160b00000000020b131a1f2426272d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d282725201a130c030000000a1724303d4a5763707d8a8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c86796c5f5346392c201300000000000000000000000000000000000815212e3b4854616e7b8793939393939393939393939393939393939393877b6e6154483b2e21150800000000000000000000000000000000030f1b27323d4653606c7883909da1978b7e808d9aa49c9083766b6054463c3121170d000000000000000000000000000000000000000000000000000003060809111313131312110f0b07010000000000000000000000000000000000000000060d13181c1e1f2020202020202016151e1f2020202020202016151c1e1f202020202020201615130f0a040000000000000814212e3b4754616e7a8793989998897d70665e56565657585f6975818e9ba7998c7f7266594c3f3326190c000000000000101d2a3643505d697682909ca79a8d8174675a4e4134271b24313e4b5764717e8a97a49e9184786b5e5245382b1f1200020f1a26313c46505a626d727f8c929da5a0959082796d665c53493f372e251b120800000000000000000000000000000008121b242e374044505c666d79828f959fa59c928c7f726c625a50463c31261a0f0200111e2a3744515d6a77849093939393938b7e71645a6774818d93939393938d8074675a4d4134271a0e00000000000000000000000000000000000000000000000000000000000000000000000000000008131e2c38434f5965727f8b98a2aea2988b7e7165574d4237404b55626f7c8895a0aca79b8e8174685d5245392c201304000000000000000000000000000000000713202c3945525d6873808d97a1adaa9f9590837b736e6969686768676d71797f87929890837e8a97a4afa295887c6f6255493c2f221609000916222f3c4955626f7c8895a2afa89b8e818e9593878079726e6969686768656c6f757d859297a2ada79f92877b6e62574d42362a1e1105000000101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0a49a86796d6053463a2d201307000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000050f19232b33383c3d3d3d43505d69768390908376695d50433d3d3d3c38332b23190f05000000000001080e14171a1b20202020202020202020202020202020202020202020202020202020202020202020202020201c1b18140f0902000000000a1724303d4a5763707d8a96989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989286796c5f5346392c201300000000000000000000000000000000000815212e3b4854616e7b8686868686868686868686868686868686868686867b6e6154483b2e21150800000000000000000000000000000000000a161f2b3744505b65717e8b96a19e918486929fa0958a7d7064594f43342a200f05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002070c0f111213131313131313090911121313131313131309090f1112131313131313130909070300000000000000000714202d3946525e6875828f9aa49d9083786e6865636363656a6e7b86929f9f95887c6f6255483c2f2215090000000000000f1c2935424f5c6875828f9ba79b8e8174685b4e4130251a25323f4b5865727e8b98a59d9083776a5d5144372a1e110006121f2b37434e58616c717f8b919ca4a09690837a6d675d544a41382d251c1309000000000000000000000000000000000009121c2528343f4a545c676d79839095a0a49c918b7e716c61584e43372b1f120600111e2a3744515d6a7784909d9f9f9f978b7e71645a6774818d9a9f9f9f9a8d8074675a4d4134271a0e000000000000000000000000000000000000000000000000000000000000000000000000000000020f1b27323d4754606d7a86929facaa9c908376695f53473845515c6774808d9aa7aca095897c6f63564c4135291d1104000000000000000000000000000000000714212d3a4754606d7a85929fa9aea2989083796e69625f575b5a555d60666d737e8692958f828f9ca8afa295887c6f6255493c2f221609000916222f3c4955626f7c8895a2afaa9e938e9393877e736d67615e575b5a535b60626b707c85929fa6afa3998e8175695e52463a2d201408000000101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0a093867a6d6053473a2d201407000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000005101a232c33393c3d3d3d43505d69768390908376695d50433d3d3d3c39332c231a10050000000000000003080b0d0e13131313131313131313131313131313131313131313131313131313131313131313131313130f0e0c08040000000000000a1724303d4a5763707d8a969f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9286796c5f5346392c201300000000000000000000000000000000000714212d3a46535e697679797979797979797979797979797979797979797976695e53463a2d2114070000000000000000000000000000000000030f1b27333f4953606d7984919ea096919298a29d9184786c6053463d3220180e0000000000000000000000000000000000000000000000000000020507080c1011131311100c0807050200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005111e2a36414c56626f7c87939f9f958f827a757270707072757c849198a39a9083766a5f53473a2e2115080000000000000e1b2734414e5a6774818d9aa79c90837669574d42362a1e2733404d5a6673808d99a69c8f8276695c4f4336291c10000814212e3a47535f6a717e87939fa3a19691847a6e685d554b42382f261b130a010000000000000000000000000000000000000a1317232e38424b555d676d7a839196a1a39f92877e716a5f53473a2e21140800111e2a3744515d6a7784909daaaca4978b7e71645a6774818d9aa7aca79a8d8074675a4d4134271a0e000000000000000000000000000000000000000000000000000000000000000000000000000000000a16202c3945515d6774818e9aa7ab9f94887b6e62544a3f4653606d7985929fabaa9d9084776b6054443a3024190d0100000000000000000000000000000004111d2935414c5665727e8b98a2aeab9f92867b6e675e57534d4e4e4b51545c606c717e8a92948f949eaaafa295887c6f6255493c2f221609000916222f3c4955626f7c8895a2afafa59e9b958c7f736c605c55524d4e4e49505359606a717e8a949fabab9f92877b6e6154473b3025190e020000101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000000000000000000000000000714212e3a4754616d7a8794a0a093877a6d6054473a2d211407000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000b17222c363e44494a4a4a4a505d69768390908376695d504a4a4a4a49443e362c22170b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1724303d4a5763707d8a93939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939286796c5f5346392c2013000000000000000000000000000000000005121e2a36424d575e6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c5e574d42362a1e12050000000000000000000000000000000000000b17222d3844515c66727f8c97a2a09e9fa2a1968b7e71655b5044372b1f120600000000000000000000000000000000000000000000000003090e121415191c1e1f1f1e1c191514120e090300000000000000000000000000000000000105090b0b1313131307060400000105090b0b13131313070604000000000000000000000000000000000000000000000000010d1925303b4754606a73808d939f9e948f86817e7d7c7d7f82879196a09f93887d6f63584e43372b1f12060000000000000b1825323e4b5865717e8b98a99e918578695e52463a2d232b37424d576875828e9ba79a8d8074675a4d4134271a0e000815222f3b4855626e7b869299a4a29891847b6e685e564c433930261d140a01000000000000000000000000000000000000000006111c263039434b555e686e7b849197a2a39992867b6e6255483b2f22150800111e2a3744515d6a7784909daab1a4978b7e71645a6774818d9aa7b3a79a8d8074675a4d4134271a0e0000000000000000000000000000000000000000000000000000000000000000000000000000000004111d2935414c55626f7c88959faba6998d8073665c50444d5764717e8a97a2ada2988b7f7265594f4332281e1308000000000000000000000000000000000713202c3945525d687683909caaaea3998c8073695e554d4742414140454a515a616c74808d979c9ea6b0afa295887c6f6255493c2f221609000916222f3c4955626f7c8895a2afb7afa89d9083786d605a514b464241413f44464f58616c76828f9ca9afa3998c7f7266564c41362a1e11050000101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000000000000000000000000000814212e3b4754616e7a8794a1a094877a6d6154473a2e211407000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000004101c28333e48505557575757575d69768390908376695d57575757575550483e33281c10040000000000000000000000000000000000000000000000000000000000000000050a0d0f101313100f0d0a05000000000000000000000000000000000a1724303d4a5763707d8686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686796c5f5346392c20130000000000000000000000000000000000020e1a25313b454d535f6060606060606060606060606060606060606060605f534d453b31251a0e0200000000000000000000000000000000000006111b2834404a54606d7a85929393939393939184796d6053493f33271b0f030000000000000000000000000000000000000000000002090e141a1e212226292b2c2c2b292521211e1a140e09020000000000000000000000000000060c111517182020201f1413100c070c111517182020201f1413100c07010000000000000000000000000000000000000000000008141e2b38434e58606d78818c92999f98928e8b89898a8b8f92999f98928b7f726b6054463c31261b0f030000000000000915222f3c4855626f7c8897a2a197877b6e6154483d342e303947535f697784919ea7978b7e7164584b3e3125180b000a1723303d4a5663707d8999a3ab9f92857b6f695e564c433a31271e150b02000000000000000000000000000000000000000000000a141e27303a434c565e696e7b85929faba398897d7063564a3d3023170a00111e2a3744515d6a7784909daaa89f978b7e71645a6774818d9aa7a09f9a8d8074675a4d4134271a0e00000000000000000000000000000000000000000000000000000000000000000000000000000000010d19242f3a47545f6a7783909da9ab9e9184796d605346525e6976828f9ca9ac9f92867a6d6054473d3221160c02000000000000000000000000000000000714212d3a4754606d7a86929facac9f92867a6d61574d433b37312f35394044505a606d7a85919eaab0b8afa295887c6f6255493c2f221609000916222f3c4955626f7c8895a2afb9ada1968a7d70665c5045403936302d33373d46505a63707d8a97a1adab9d908377685e5246392d2014070000101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000000000000000000000000000815212e3b4854616e7b8794a1a194877a6e6154473b2e211408000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000814202d3944505a616464646464646976839090837669646464646464615a5044392d201408000000000000000000000000000000000000000000000000000000000000030a11161a1c1d20201d1c1a16110a0300000000000000000000000000000916232f3c4855616b707979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979746a5e5145382b1f1200000000000000000000000000000000000009141f29333b4246485353535353535353535353535353535353535353534846423b33291f140900000000000000000000000000000000000000000c18232e3945515d67738086868686868686867f72665c5141382d22170b00000000000000000000000000000000000000000000050d141a1f262a2d2e32363839393836322e2d2a251f19140d050000000000000000000000000911181d2124252d2d2d2c201f1c1812181d2124252d2d2d2c201f1c18120b03000000000000000000000000000000000000000000020f1b27323d44505c666d777f868e92999a9b98969696989b9a98928e867f726d62594f44342a20150a000000000000000713202d3a4653606d7985929fa9988b7e7165594f443f3f3f424c56616e7b8896a0a095877b6e6154483b2e211508000a1723303d4a5663707d8996a1a9a2988b7e716b61584e463c332920160d03000000000000000000000000000000000000000000030c161f29323c454e58606b717e87939fa9a196897d7063564a3d3023170a00101d2a3743505d6a7683909d9e9b93938b7e71645a6773808d9aa19393938d8074675a4d4134271a0e000000000000000000000000000000000000000000000000000000000000000000000000000000000008131e2b37434e5865717e8b97a2ada1968a7d7063564c54616e7b87939faca79b8e8174685d5245392c20130400000000000000000000000000000000000a1724313d4a5764707d8a99a3afa99c8f8276685e52453b312b2624292e343e45525d68727f8c98a2aebaafa295887c6f6255493c2f221609000916222f3c4955626f7c8895a2afb7ab9e9184786c60544a3f342e2a2522272b343e4653606c7885919eabac9f93877a6e6154473b2e2114080000101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000000000000000000000000000815222e3b4855616e7b8894a1a194877b6e6154483b2e211508000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000a1623303c4955616c70707070707070768390908376707070707070706c6155493c3023160a0000000000000000000000000000000000000000000000000000000000040d151c2226292a2d2d2a2926221c150d04000000000000000000000000000714202c38444f5961636c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6a62584d4135291d10000000000000000000000000000000000000030d17212931363a3b4646464646464646464646464646464646464646463b3a36312921170d03000000000000000000000000000000000000000007121c2935414b55636e737979797979797979726d62544a402f261b1106000000000000000000000000000000000000000000080e171f252a31363a3b3f4344464644433f3b3a36312a251f170e070000000000000000000009121b22292e3132393939392d2c29231d22292e3132393939392d2c29231d150d030000000000000000000000000000000000000000000a162028343f4a545c656c737b82868b8e909192929291908d8b86817b726d625b51473d3222180e040000000000000006121f2b3844505c6674808d9aa69c9083766b6157504a4c4c4e545d68737f8c99a89d908377695e53463a2d211407000814212e3b4754616e7a849197a2aa9f92877d706a60584e453b32281f150c0200000000000000000000000000000000000000020b151e28313b444d57606a707d879299a4a29791847a6e6154473b2e21140800101d293643505c6976828f9c938e8686867e7164596673808c9997898686868074675a4d4134271a0e0000000000000000000000000000000000000000000000000000000000000000000000000000000000010f1b26323c4753606d7985929faba99b8e8275685d525966737f8c99a4aca095897c6f63564c4135291d110400000000000000000000000000000000000d1a2733404d5a6673808d99abb5ab988b7f7265564c4133291f1a181c232935414c56606d7a85929fabb8afa295887c6f6255493c2f221609000916222f3c4955626f7c8895a2afb6ac9a8d8073665b5042382e231d1a171b222b3744505b6574818e9ba7afa49a8a7e7164574b3e312418070000101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000000000010406070c0b0a09080815222f3b4855626e7b8895a1a194887b6e6155483b2e22150808090a0b0c07070501000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000a1724313d4a5764707d7d7d7d7d7d7d7d839191837d7d7d7d7d7d7d7d7064574a3d3124170a00000000000000000000000000000000000000000000000000000000030d161f272d32353639393635322d271f160d0300000000000000000000000004101c28333e474f5557606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060605f5e5850473c3125190d00000000000000000000000000000000000000050f171f252a2d2e3939393939393939393939393939393939393939392e2d2a251f170f05000000000000000000000000000000000000000000000d18242f3a43525c63666c6c6c6c6c6c6c6c65625b5142392e1d140a00000000000000000000000000000000000000000009111a202930363b4246484c4f515252514f4c4846423b36302920191109000000000000000006111b242d343a3d3e464646463a38342f272d343a3d3e464646463a38342f271f150b010000000000000000000000000000000000000000040b17232e38424a535b60696e757a7e8183848586858483817e7a756e69625b51493f352b211006000000000000000003101c28343f4a54626e7b88949e9f94897d7069605c5458595860666d7a85929fa1978b7f7265574d42362a1e1205000714202d3946525e686f7c859298a3a39992867d6f6a5f574d443a31271e140a000000000000000000000000000000000000000a141d27303a434c565f696f7c869299a3a29892857c6f685e5246392d201407000f1c2935424f5c6875828f9b8e81797979716c625965727f8c989285797979746e64584c3f33261a0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000a151f2c3945515d6774808d9aa6ac9f92867a6d6154606b7784919eabaa9d9084776b6054443a3024190d010000000000000000000000000000000003101c28343f4a546975828f9ca8afa399887c6f6255493c3022170d0d1219242f3a45525d6875818e9ba8b4afa295887c6f6255493c2f221609000916222f3c4955626f7c8895a2afafa49a897d7063544a3f30261c120e0b0f1b27333f495364717e8b97abb5ac9a8d8073675a4d402e23180c0000101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000001080d11131419181716151415222f3c4855626f7b8895a2a195887b6e6255483b2f22151415161718181413110d080200000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000013202d394653606c79868a8a8a8a8a8a8a919595918a8a8a8a8a8a8a86796c605346392d2013000000000000000000000000000000000000000000000000000000000a151f2831383e4243464643423e3831281f150a000000000000000000000000000b16212c353e44484a5353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353514d473e352a1f14090000000000000000000000000000000000000000050d141a1e21212d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d21211e1a140d05000000000000000000000000000000000000000000000007131d2831404a52585a6060606060606060595751493f30271c0b02000000000000000000000000000000000000000009121b232b333b42464d5355595c5e5f5f5e5c5854534d46423b322b231b1209000000000000010c18222d363f454a4b535353524745403931363f454a4b535353524745403931271d120700000000000000000000000000000000000000000006111c263038414950575f62686d71747778787978787674716d68615f5751493f372d23190f000000000000000000000b17232e3847535f6a75828f97a29e92857b716d66666566676a6f78828f97a29e9285796d6053473b31251a0e020005111e2a36414c565f6a6f7d869299a3a29892857c6e695e564c433930261c1106000000000000000000000000000000000006111c262f39434c565e686e7b859298a2a39992867d6f6a5f564c41362a1e1105000f1b2835424e5b6875818e9b9083766c6c64625a5865727e8b989386796d6c67645c52473c3023170b00000000000000000000000000000000000000000000000000000000000000000000000000000000000004101d2935404b55626f7b88949faba3998b7e726557636f7c8996a0aca2988b7f7265594f4332281e1308000000000000000000000000000000000006121f2b3844505c667884919eabac9f9286796d6053463a2d2013070008131e2935414c5664717d8a97a8b2afa295887c6f6255493c2f221609000916222f3c4955626f7c8895a2afac9f93867a6d6053473a2d20140a00000b17222d3c4855626f7b8899a4afa99c8f837669554b4034281c100400101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000040c13191d20212524232221201f222f3c4955626f7c8895a2a295887b6f6255483c2f221f20212223242521201d19130c04000000000000000000000203101d2a3643505d69768390908376695d5043362a1d1003020000000000000013202d394653606c798693939393939393939393939393939393939386796c605346392d201300000000000000000000000000000000000000000000000000000005111c27313a434a4e505353504e4a433a31271c110500000000000000000000000005101a232c33383c3d464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464645413c352c23190e0300000000000000000000000000000000000000000003090e1214152020202020202020202020202020202020202020201514120e0903000000000000000000000000000000000000000000000000010c161f2e3840474b4d53535353535353534c4a463f372d1e150b000000000000000000000000000000000000000007111b242d353d454d52575f6165696b6c6c6b6965615e57524d443d352c241b1107000000000005111d29343f485056586060605f53514b43393f485056586060605f53514b43392f23180c000000000000000000000000000000000000000000000a141e262f383f444d53565e6165676a6b6c6c6c6b696764605d56534d453f372d251b11070000000000000000000006111c2b37434e58616e7b85929fa19792857e797573727274777c838f949f9e938b7e71675d514539291f14090000020e1925303b444e58606b707e87929fa3a29791847b6e685d554b42382e23171309000000000000000000000000000000091317222d38424b555d686e7a849197a1a39f92877d706b60584e443b3025190e02000d1a2633404d596673808c99918477695e5856505663707d89969a877b6e615a58524a40362b1f1307000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c18242f3947535f6a7683909ca9ab9d908376695f6774818e9aa8ac9f92867a6d6054473d3221160c0200000000000000000000000000000000000713202d3a4653606d7986929facaa9e918477665c5145382c1f130600010d19242f3a4754616d7a8796a0acafa295887c6f6255493c2f221609000916222f3c4955626f7c8895a2afaa9e918477675d5145392c20130200000613202d3a4653606d7986939facab9e918478675c5145382c1f130600101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000040d161e24292c2d3231302f2e2d2c292f3c4956626f7c8995a2a295887b6f6255483c2f292c2d2e2f3031322e2d29241e160e0400000000000000050a0f12101d2a3643505d69768390908376695d5043362a1d10120f0a05000000000013202d394653606c798686868686868686868686868686868686868686796c605346392d20130000000000000000000000000000000000000000000000000000000a16222d38434c545a5d60605d5a544c43382d22160a0000000000000000000000000008111a21282c2f3039393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393835312a231a11070000000000000000000000000000000000000000000000000205070813131313131313131313131313131313131313131308070502000000000000000000000000000000000000000000000000000000040d1c262e363b3f4046464646464646463f3e3a352d251b0c0300000000000000000000000000000000000000050e19232d363e474f575e61696e72767779797776726e69615e564f473e362c23190e04000000000915212e3a45505a62656c6c6c6c605c554b4045505a62656c6c6c6c605c554b4034291c1004000000000000000000000000000000000000000000020c141d262d333c42474c5254585b5d5e5f5f5f5e5d5a5854524c46423b332d251b13090000000000000000000000000f1a26313c46525e69717e8a939aa197928b8581807f7f80848890959f9f948e81756c62554b403529170d0300000008141e29323c464f59616c717e8b919ca4a19691837a6d675d544a3f3428251b12080000000000000000000000000008121b2528333f4a545c676d7a839096a0a49c918b7e716b61594f463c32291e140800000b1724313e4a5764717d8a9796877b6e6154474754616e7a8797978a7e7164544a4740382f24190e030000000000000000000000000000000000000000000000000000000000000000000000000000000000000007121d2b37434e5864717e8a97a1ab9f95887b6e616d7985929faba79b8e8174685d5245392c2013040000000000000000000000000000000000000815212e3b4854616e7b8799a3afa99c8f827669544b4034281c100400000813202d3946525d687784919eaaafa295887c6f6255493c2f221609000916222f3c4955626f7c8895a2afa89c8f827569554b4035291d1104000006131f2c3845515c677884919eabac9f9386796d6053463a2d20130700101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000010c161f282f35393a3f3e3d3c3b3a38352f3c4956636f7c8996a2a295887c6f6255493c2f34383a3b3c3d3e3f3a3935302820160c0200000000010910161b1e20202a3643505d69768390908376695d5043362a20201e1b1610090100000013202d3946535f6c767979797979797979797979797979797979797979766c5f5346392d20130000000000000000000000000000000000000000000000000000010d1a26323e4a545e66696c6c69665e544a3e32261a0d01000000000000000000000000000810161c2023242d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2c2b29251f191108000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a141c242a2f3233393939393939393932312e29231b130900000000000000000000000000000000000000020c17202b353e48505960696e747b7f8284858584827f7b746e69605950483e352b20160c020000000b1724313d4a56626c71797979796d675c51454a56626c71797979796d675c5145382c1f130600000000000000000000000000000000000000000000020b141b222731373a4146474b4e505152535251504e4b4745413a36312a211b1309010000000000000000000000000a15202a36424d57616c727f8892979f9e97928e8c8b8c8d90959d9f99938d82796d605a5043392f24180500000000020d17202a343d47505a626c737f8c929da5a0959082796d665c504440372d241a1107000000000000000000000007111a242d373f44505b666d79828f95a0a59d928c7f726c62594f463d342a20170d0200000815222f3b4855626e7b8897978b7e7164574d46525e697885929a8e8174665c5044382c261d12080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010f1a26313c4653606d7985929eaca7998c7f7366717d8a98a2aca095897c6f63564c4135291d11040000000000000000000000000000000000000916222f3c4955626f7c8895abb5a79b8e8174685b4e412e23180c00000005111d2935414c566875828f9ba8afa295887c6f6255493c2f221609000916222f3c4955626f7c8895a2afa79a8d8174675a4e412f24180d01000004101c2834404b556a7683909da9afa49a887b6e6155483b2e22150800101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000008131e28313a4145474c4b4a49484745404443495663707c8996a3a295897c6f625649434440454748494a4b4b4746413a32281e1308000000010a131b21272b2d2d2d3643505d69768390908376695d5043362d2d2d2b27211b130a010000121e2b37434f5a646c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c645a4f43372b1e120000000000000000000000000000000000000000000000000000030f1c2935424e5a66707679797670665a4e4235291c0f030000000000000000000000000000050b1014161720202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020201f1d19140e070000000000000000000000000000000000000000000002070a0c0d131313130e0d0b0803000407090a131313131006050300000000000000000000000000000000000000000000000000000000000000000000020a12191f2326272d2d2d2d2d2d2d2d2625221e181109010000000000000000000000000000000000000008131e29323d47505a626b707b81878c8f919292918f8b87817b706b615a50473d32281e13080000000b1825323e4b5865717e86868686796d6053474b5865717e86868686796d6053473a2d20140a0000000000000000000000000000000000000000000000020a11171f262b3035393a3e4144454546454543413e3a3935302a261f180f090100000000000000000000000000030e1a25303b45505a626d727e858d92989a9c9b9998999a9d9b99938f8780786d675c51483e31281d12070000000000050e18222b353e47505a636d74808d939ea69f948f82786d605c52493f362c23191007000000000000000000071019232c363f49525c606c78818f949fa69e938d80746d635a50473e342b22180e050000000713202d3a4653606d7985929b8f8275695f53464d566975828f9c9184796d6053463e31271d12070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a151f2c3845515c6773808d9aa4aa9d9184776a75828e9baaaa9d9084776b6054443a3024190d010000000000000000000000000000000000000a1623303d495663707c8996a3afa69a8d8073675a4d4034271a07000000010d192430414d5a6774808d9aa7afa295887c6f6255493c2f221609000916222f3c4955626f7c8895a2afa6998c807366594d4033261a07000000000c18232e424f5c6975828f9ca8b6ac95887c6f6255493c2f22160900101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000010d19242f3a434c5154585756555453514b504f4e5663707c8996a3a296897c6f63564e4f504b5153545556575854524c443a3024190d01000009131c252c33373939393943505d69768390908376695d50433939393937332c251c130900000f1b27333e49525a5f60606060606060606060606060606060606060605f5a52493e33271b0f000000000000000000000000000000000000000000000000000003101d2a3643505d69768286868276695d5043362a1d1003000000000000000000000000000000000407090a131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131312100d090300000000000000000000000000000000000000000000070e1316191a202020201b1a18140f0b10141617202020201d13120f0b0600000000000000000000000000000000000000000000000000000000000000000000080e1317191a2020202020202020191816120d070000000000000000000000000000000000000000010d1925303a444f59626c717d858e92999c9a98989a9c99928e857d716c61594f443a3024190d0200000a1723303d4a5663707d8993988a7d7063574a4a5663707d8993988a7d7063574a3d31261b0f03000000000000000000000000000000000000000000000000060b151a1e25292d2e32343738393939383634312d2c29241e1a140e060000000000000000000000000000000009141f29333e48515b626c707a80858a8d909192939291908e8b87827c736d665c554b40362d1f160c01000000000000061019232c353f48515b606c78818e949fa69e948e81746e635b51483e352b22190f0600000000000000060f18222b353e48515b636e74808d939ea69f948e81776c605b51483f352c221910060000000006121f2b3844505c6675818e9b93877b6e61574d4b5864717e8b98978a7e7164594f43392f23180c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004101c2834404b55616e7b87939faca095887b6f7985929faca3988b7f7265594f4332281e1308000000000000000000000000000000000000000a1724313d4a5764707d8a97a3b0a6998c807366594d4033261a0d00000000081926323f4c5965727f8c98a5afa295887c6f6255493c2f221609000916222f3c4955626f7c8895a2afa5988b7f7265584c3f3225190c00000000071b2835424e5b6875818e9ba8b0a396897d7063564a3d3023170a00101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000004111d2935414c555d606564636261605d555d5c5b5a63707d8996a3a396897c70635a5b5c5d555c606162636465615d564c4135291d11050005101b252e373e434646464646505d69768390908376695d504646464646433e372e251b1005000a16212c3740494f535353535353535353535353535353535353535353534f4940372c21160a000000000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010a12191f2325262d2d2d2d282724201a161c2022232d2d2d2d2a201f1b17110a0200000000000000000000000000000000000000000000000000000000000000000002070a0c0d13131313131313130c0b09060100000000000000000000000000000000000000000005111d2a36414c56606b717e8792979e96918d8c8c8d91969e9792877e716b60564c4135291e130800000815222f3b4855626e7b88959a8d817467584e4855626e7b88959a8d817467584e43372b1f12060000000000000000000000000000000000000000000000000003090e13191d202125282a2b2c2c2c2b2a272521201d19130e09030000000000000000000000000000000000020d17202c363f49515a61686d73797d8083848586858583817e7b756f6a605c544b43392f241b0d04000000000000000007101a232d364044505b666d79828f95a0a69d938d80736d625a50473d342a21180d040000000000040d18212a343d47505a626d73808c929da59f958f82786d655b50493f362d231a1007000000000003101c28343f4a5463707d8995998d8074695e534754606d7a86929d9083766b61554b4034291c10040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c18232e3946535f6976828f9ca9a7998c7f737d8a98a2ac9f92867a6d6054473d3221160c02000000000000000000000000000000000000000b1724313e4a5764717d8a97a4b0a5998c7f7266594c3f3326190c000000000b1825323e4b5865717e8b98a4afa295887c6f6255493c2f221609000916222f3c4955626f7c8895a2afa5988b7e7265584b3f3225180c000000010e1b2834414e5b6774818e9aa7b0a3978a7d7064574a3d3124170a00101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000613202c3945515d676d7271706f6e6d676b6a69686766707d8a96a3a396897d70666768696a6b676d6e6f7071726d685d5246392d201307000a16212c3740494f5353535353535d69768390908376695d5353535353534f4940372c21160a0005101b252e373e4346464646464646464646464646464646464646464646433e372e251b1005000000000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000000000000000000000010406070a0d10111213131211100d0a07060400000000030505060606060606000000000000000000000000000000000000040613131313131313131312110e0904000000000000000a131c242a2f3233393939393433302b2521272c2f3039393939372d2b27221b140b0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3946525e68707d87929997918a84807f7f81848a92979992877d6f685d52453a3024190d01000714202d3a4753606d7a86979e9184786a5f534753606d7a86979e9184786a5f53473a2e21150800000000000000000000000000000000000000000000000000000002080d111314181b1d1e1f201f1e1d1b181413110d08020000000000000000000000000000000000000000050e1a242d373f4850565e61676d70747678797979787774716e68625f58504a423931271d12090000000000000000000008111b2428333f4a545c676d79839096a0a59c928b7f726c61594f463c332a1f160c01000000010c161f2a333c464f59616c727f8b929ca4a0969083796d665c53493f372e241b1108000000000000000b17232e394653606c7883909d92867b6e615a50515d6774818e99958a7d70675c5145382c1f130600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007121d2b37424d5764717d8a97a1aa9d908377818e9baaa79b8e8174685d5245392c20130400000000000000000000000000000000000000000b1824313e4b5764717e8a97a4b1a5988c7f7265594c3f3226190c000000000b1824313e4b5764717e8a97a4afa295887c6f6255493c2f221609000916222f3c4955626f7c8895a2afa4978b7e7164584b3e3125180b000000010e1b2734414e5a6774818d9aa7b1a4978a7e7164574b3e3124180b00101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000714212d3a4754606d797f7e7d7c7b7a79787776757473727d8a97a3a3968a7d72737475767778797a7b7c7d7e7f7a6d6154473a2e211407000f1b27333e49525a5f60606060606069768390908376696060606060605f5a52493e33271b0f000009131c252c33373939393939393939393939393939393939393939393937332c251c130900000000000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000000000001080d111314171a1d1e1f1f201f1e1c1a171413100c07010c0f111213131313131309090703000000000000000000000001070c10132020202020202020201f1d1a150f08000000000007121c252e353b3f404646464641403c362f2b33383c3d46464646433937332d261d140a00000000000000000000000000050a0d0f10131313130b0a0805050a0d0f10131313130b0a08050000000000000000000000000000000000000000000000000000000000000005111e2a36414c56616d7a8592999691857e7774727274787e8591969992857a6d60564c4135291d11040006131f2c3945515d677885929e96887b6f625548515d677885929e96887b6f6255483c3025190d0100000000000000000000000000000000000000000000000000000000010507070b0e111212131212100e0b07070401000000000000000000000000000000000000000000000008121b252d363e444c52555c606467696b6c6c6c6b6a6865615e56544e443f3830271f150b000000000000000000000000091217222d38424b555d676e7a849197a1a49f93887e716b60584e453b31281d130700000007131d28313b454e58606b717e87939fa4a19691847a6d675d544a41382d251c1209000000000000000006121f2b3744505b65717e8a94988f82756c61554c55616e7b8692939184796d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e1a26313c4653606d7984919eaba095887b85929faba095897c6f63564c4135291d110400000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1a5988b7f7265584c3f3225190c000000000b1724313e4a5764717d8a97a4afa295887c6f6255493c2f221609000916222f3c4955626f7c8895a2afa4988b7e7165584b3e3225180b000000010e1a2734414d5a6774808d9aa7b1a4978b7e7164584b3e3125180b00101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000815212e3b4854616e7b878a898887868584838281807f7e808d9aa7a79a8d807e7f808182838485868788898a887b6e6255483b2f22150800121e2b37434f5a646c6c6c6c6c6c6c6c7683909083766c6c6c6c6c6c6c6c645a4f43372b1e120000010a131b21272b2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2b27211b130a0100000000000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000000000000003090e13191d20212427292b2b2c2c2c2b292724201f1c18120e181c1e1f2020202020201615130f0a040000000000000000030b12181c1f2d2d2d2d2d2d2d2d2c2c2a2620191209000000020e19242e3740474b4d535353534e4c484138353d44484a535353535046443f382f261b110600000000000000000000030a1016191c1d20202020181714111016191c1d20202020181714110c0600000000000000000000000000000000000000000000000000000000000714202d3946525e6874808d979891847b716c676565656c717b849198978d8073685d5245392c2013070004101d2935404b556a7783909d998c7f7266564c4b556a7783909d998c7f7266564c41362a1d1105000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009131b242c323a41464b5153575a5d5e5f605f5e5d5b5854524d47433c342e261e150d030000000000000000000000000006111c262f39434c555e686e7b859298a2a49a92877d706a5f574d433a2f24180d0100010d18242f3a434d575f6a707d869299a4a29791847b6e685e554b42392f261b130a000000000000000000030f1b27333f4953616c7682868686867d7064574a535e69748086868686807366594d4033261a0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009141f2c3844505c6673808c99a4a79c8f828f97a2aa9d9084776b6054443a3024190d0100000000000000000000000000000000000000000b1824313e4b5764717e8a97a4b1a5988c7f7265594c3f3226190c000000000b1825313e4b5864717e8b97a4afa295887c6f6255493c2f221609000916222f3c4955626f7c8895a2afa5988b7e7265584b3f3225180c000000010e1b2734414e5a6774818d9aa7b1a4978a7e7164574b3e3124180b00101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000815212e3b4854616e7b8794969594989291908f8e8d8c8b8d929da9a99d928d8b8c8d8e8f9091929894959695887b6e6255483b2f2215080013202d3946535f6c767979797979797979839090837979797979797979766c5f5346392d2013000000010910161b1e202020202020202020202020202020202020202020201e1b161009010000000000000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000000060e141a1e24292c2d3033363738393939383634302d2c29231d1a24282b2c2d2d2d2d2d2d23221f1b160f07000000000000030d151d23292c3939393939393939393836312b241b1208000007131f2a354049525759606060605b59534a413d474f5456606060605d53504941382d22170b000000000000000000040d151b212628292d2d2d2d2423211d1b212628292d2d2d2d2423211d171008000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a86929f92867c6e69615a59535b60696e7c86929f92867a6d6054473a2d21140700000c18242f424f5c6875828f9b9c908376685e524f5c6875828f9b9c908376685e5246392d20130700000000000000000000000106090b0c13131313130d0c0a070200050a0d0f1013131313130a0907040000000000000000000000000000000000000000000000000000000000000109111a20283035394045474a4d505152535252504e4b4746413b373228231c150c030000000000000000000000000000000a141d27303a434c565f696f7c869299a3a39992867c6f695f554b4035291d11040004111d2935404b555f696f7c869298a3a39892857c6f695e564c433930271d140a01000000000000000000000b17222d3841505a66707679797979706c6155494d57646e7479797979736e63574b3f3225190c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003101c28343f4a54616e7b87939fac9e948f949ea9a3988b7f7265594f4332281e13080000000000000000000000000000000000000000000b1724313e4a5764717d8a97a4b0a5998c7f7266594c3f3326190c000000000c1825323f4b5865727e8b98a5afa295887c6f6255493c2f221609000916222f3c4955626f7c8895a2afa5988b7f7265584c3f3225190c000000010e1b2834414e5b6774818e9aa7b0a4978a7d7164574a3e3124170b00101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0acac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0acac9f9286796c5f5346392c20130600000000000000000815212e3b4854616e7b8794a1a2aaa29f9e9d9c9b9a99989a9da4aeaea49d9a98999a9b9c9d9e9fa2aaa2a195887b6e6255483b2f2215080013202d394653606c798686868686868686909494908686868686868686796c605346392d20130000000000050a0f1213131313131313131313131313131313131313131313120f0a0500000000000000000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000000000070f181f262a2f35393a3d404344454646454443403d3a38342f2a252f3437383939393939392f2e2c272119100700000000010b151f272f343846464646464646464645423d352d24190f04000a16232f3b47525c63666c6c6c6c67645d5346444f5960636c6c6c6c6a605b53493f33271b110600000000000000000d161f262d3235363939393931302d28262d3235363939393931302d28221a12080000000000000000000000000000000000000000000000000000000b1825323e4b5865717e8b99998c7f736a5f57504c4950575f6a73808d99988a7e7164574b3e3124180b0000071a2734414d5a6774808d9a9f93867a6d61544d5a6774808d9a9f93867a6d6154473a2e23180c00000000000000000000070d1216181920202020201a1917130e0a1015191c1d2020202020161613100b05000000000000000000000000000000000000000000000000000000000000080e161e25292f34383a3d4143454646464544413e3b3936302b262017110a0300000000000000000000000000000000020b151e28313b444d57606a707d87929aa4a29892857b6e675d5145392c201306000613202c3945515d676e7b859198a2a39992867d6f6a5f574d443a31281e150b02000000000000000000000006111b262f3e48545e66696c6c6c6c64615a504445525c64676c6c6c6c66635b52473b2f23160a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030c17232e3846535e6975828f9ca8a69e9c9ea6ac9f92867a6d6054473d3222170b020000000000000000000000000000000000000000000a1724303d4a5763707d8a96a3b0a6998d8073665a4d4033271a0d000000000d192633404c5966737f8c99a6afa295887c6f6255493c2f221609000916222f3c4955626f7c8895a2afa6998c7f7366594c4033261907000000020f1b2835424e5b6875818e9ba8b0a3978a7d7064574a3d3124170a00101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a86939f9f9f9f9286796c5f5346392c20130600000000000714202d3a4753606d7a86939f9f9f9f9286796c5f5346392c20130600000000000000000815212e3b4854616e7b8794a1aaa29f9e9d9c9b9a999796999ca4aeaea49c999697999a9b9c9d9e9fa2aaa195887b6e6255483b2f2215080013202d394653606c798693939393939393969696969393939393939386796c605346392d2013000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000030b1218212a31363a4145474a4d505152525352514f4d4a4745403936313a4044454646464646463c3b38322b22190f0400000007121d2731394045535353535353535353524e473f352b201509000c1925323f4b57636e7379797979746f64584e4854606b7079797979766c655b5044382d22170b0000000000000008111f2831383e4243464646463e3d393431383e4243464646463e3d39342c241a100600000000000000000000000000000000000000000000000000000f1c2835424f5b6875818e9b92867a6d61574e453f3f444e58616e7b87969b8e8174685b4e4135281b0e00000c1926323f4c5965727f8c98a4998b7e7164544a5965727f8c98a4998b7e7164544a4034281c100400000000000000010911181e2225262d2d2d2d2d2726231f19141b212628292d2d2d2d2d2322201c160f07000000000000000000000000000000000000000000000000000000000000040c13191d23292c2d31343638393939383735322e2d2a251f1b150c0600000000000000000000000000000000000000030c161f29323c454e58606b717e8893939393979184796d6053473a2d201407000714202d3a4753606d7984919793939392877e706b60584e453b32281f160c03000000000000000000000000000a141d2c36424c545a5c60606060575550483e414a52585a606060605957524940352a1e1307000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b151e2834404b545c66707d8a96a3b0aaa8aab0a79b8e8174685d544a3f33281d140a0000000000000000000000000000000000000000000916232f3c4956626f7c8995a2afa79a8d8174675a4e4134271b08000000010e1b2734414e5a6774818d9aa7afa295887c6f6255493c2f221609000916222f3c4955626f7c8895a2afa79a8d8174675a4e412e23180c000000030f1c2936424f5c6975828f9ca8afa296897c6f6356493c3023160900101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693939393939286796c5f5346392c20130000000000000714202d3a4753606d7a8693939393939286796c5f5346392c20130600000000000000000815212e3b4854616e7b87949594989291908f8e8d8c8b8a8c929ca8a89c928c8a8b8c8d8e8f90919298949595887b6e6255483b2f2215080013202d394653606c79868989898989898989898989898989898d929386796c605346392d2013000000000000000105070810101010101010101010101010101010101010101008070501000000000000000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000030c151c2328333b42464c5254575a5c5e5e5f5f5f5e5c5a5753514b46423b454c50525353535353534948433d342b21160a0000000c18232f39434b515f606060606060605f5e5951473d31261a0e000d1a2633404d596673808686868681746a5f534a5663707d8686868683776c6053493f33271b0f030000000000050f1a23313a42494e50535353534b49453e3a42494e50535353534b49453e362c22170c0000000000000000000000000000000000000000000000000000111d2a3744505d6a7783909d908377685e52453c33333c46525e697784919c8f8276695c504336291d1000000b1724313e4a5764717d8a97ab9b8e8275665c515764717d8a97ab9b8e8275665c5144382c1f12060000000000000009131b23292e3132393939393933322f2a241f262d3235363939393939302f2c272119110700000000000000000000000000000000000000000000000000000000000002080d12181c1f2024272a2b2c2d2c2b2a282521201e19140f0a04000000000000000000000000000000000000000000040d17202a333c464f59616c727f868686868686867b6e6154483b2e211508000815212e3b4854616e7b868686868686867e716c61594f463c332920160d040000000000000000000000000000020b1a24313a42494e50535353534a49443e363841474c4e535353534d4b4740372e24190e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007121d27303945515c666d78808d99a6a3a0a0a1a4a89c8f82756c665b50443e2f261b110600000000000000000000000000000000000000000815222e3b4855616e7b8894a9b3a89b8f8275685c4f423025190e02000005121e2a36424d576976828f9ca9afa295887c6f6255493c2f221609000916222f3c4955626f7c8895a2afa89b8f827568544a4034281c1004000004101c2934404b556a7683909da9b4aa95887b6f6255483c2f22150900101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d798686868686868687796c5f5346392c140c0200000000000714202d3a4753606d798686868686868687796c5f5346392c20130600000000000000000815212e3b4854616e7b878a8887868584838281807f7e7d808c99a6a6998c807d7e7f80818283848586878889887b6e6255483b2f221508000a1723303d4a5663707d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d808d9386796c605346392d2013000000000002080d1114141c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1414110d080200000000000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000b151e272e343f454d53565d606366696a6b6c6c6c6b696763605c55534d444f575c5f60606060606056544e463d32271b0f030004101c2934404b555c6c6c6c6c6c6c6c6c6c6a63594e42362a1d11000714202d3a4753606d7984919392877b6e62564c54606b75818e98958a7e71655b5044372b1f120600000000000b16212b35424c545a5c6060606057555048424c545a5c60606060575550483e34281d110500000000000000000000000000000000000000000000000000121f2b3845525e6b7885919b8f827568564c41332a2a36424d566976838f9c9184776a5e5144372b1e1100000916232f3c4956626f7c8995ab9f9285796d605356626f7c8995ab9f9285796d6053463a2d20130900000000000007111b252d353a3e3f4646464646403f3b352e2830383e424346464646463d3b38332b23190f050000000000000000000000000000000000000000000000000000000000000001070c101314171a1d1e1f201f1f1d1b181414110e0802000000000000000000000000000000000000000000000000050e18212b343d47505a626d727979797979797976695e53463a2d211407000714212d3a46535e697679797979797979716c625a50473d342a21170e050000000000000000000000000000000008121f2831383e4243464646463d3c39332c2f363c3f4146464646403f3b352e251c1207000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c18232e3943505a606d78828d929c9c97949394979d9e948e81786c60594f41382d22170b00000000000000000000000000000000000000000714202d3a4753606d7a8697a1ada99d9083766a564d41362a1e110500000714202d3a46525e697885919eabafa295887c6f6255493c2f221609000916222f3c4955626f7c8895a2afaa9d908477665c5144382c1f1206000006131f2c3845515c677884919eabaea298877a6d6154473a2e21140700101d2a3643505d69768390908376695d5043362a1d10000000000000000006131f2c3845515c67767979797979797979756a5e52452e261e140a000000000006131f2c3845515c67767979797979797979756a5e5245382c1f120600000000000000000714212d3a4754606d797e7d7c7b7a7978767574737271727f8c98a5a5988b7f7271727374757678797a7b7c7d7e7a6d6054473a2d211407000916222f3c4854606b707070707070707070707070707070727e8b9386796c605346392d201300000000050d14191e202129292929292929292929292929292929292929292921201e19140d05000000000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000007121c273039404451575f61686d7073767778797978777673706d67615e57505761686b6c6c6c6c6c6c6260584e43382c1f13070006131f2c3845515c67767979797979797979756a5e5245382c1f120006131f2c3845515c67707d8a95998e8275685e524f59616e7b86929d9184786c605346392d22170b0000000004101c27333d47545e66696c6c6c6c64615a5047545e66696c6c6c6c64615a5045392d21140800000000000000000000000000000000000000000000000000121f2b3845525e6b7884919b8f827568564c4135292a36414c566976828f9c9184776a5e5144372b1e1100000814212e3b4754616e7a8799a3a297897c70635654616e7a8799a3a297897c706356493d31261a0e0200000000010d18232d373f464a4c53535353534d4b474038303a42494e5053535353534948443d352b21160b000000000000000000000000000000000000000000000000000000000000000000000406070a0e101213131312110e0b08070502000000000000000000000000000000000000000000000000000000060f19222b353e48515b62656c6c6c6c6c6c6c6c5e574d42362a1e12050005121e2a36424d575e6c6c6c6c6c6c6c6c65625a50473e352b22180f050000000000000000000000000000000000000d161f262d3235363939393931302d2822242b3033343939393933322f2a241c130a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004101c2834404b55616c75818e949c94908a8786878a90959d938d80746b6153493f33271b0f030000000000000000000000000000000000000006131f2c3945515d677885919eabab9f928578685e5246392d20140600000815212e3b4854616e7b8797a1adafa295887c6f6255493c2f221609000916222f3c4955626f7c8895a2afac9f9286796d6053463a2d20130900000714202d3a4753606d7a86939facac9f928579685e5246392d20130700101d2a3643505d69768390908376695d5043362a1d10000000000000000004101c2934404b555c6c6c6c6c6c6c6c6c6c6a6359443f3830261c110600000006111c263038404b555c6c6c6c6c6c6c6c6c6c6a63594e42362a1d110400000000000000000613202c3945515d676d71706f6e6d676b6a696867666673808c99a6a6998c7f7366666768696a6b676d6e6f70716d685d5245392c201307000713202c38444f5960636363636363636363636363636365727e8b9386796c605346392d2013000000050e171e252a2d2e3636363636363636363636363636363636363636362e2d2a251e170e050000000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000c18232e39424a515b63696e747a7d808384858586858482807d79746e69605b536873787979797979796f6a6054483b2e221509000714202d3a4753606d798686868686868687796c5f5346392c20130004101c2934404b55616b7683909d92867a6e615447525e6974808d9995897d7063544a3f33281c0f030000000714202c38444f5966707679797979716c61554f5966707679797979716c6155493d3023170a00000000000000000000000000000000000000000000000000111d2a3744505d6a7783909d908377685d52463c33333b46525e687784919c8f8276695c504336291d1000000613202d394653606c7986929fa99a8d8073675753606c7986929fa99a8d807367574d42372b1e12060000000006121e29353f4951575960606060605a57524a4038424c545a5c606060606056544f473d33271c10040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007101a232c363f49515658606060606060605f534d453b31251a0e0200020e1a25313b454d535f60606060606060585650483f352c2319100600000000000000000000000000000000000000040d151c212629292d2d2d2d2423201c171a1f2426272d2d2d2d2625231e19120a010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006131f2c3845515c67717e8b939c928c837d7a797a7e838e939d928a7d70655b5044372b1f12050000000000000000000000000000000000000004101d2935404b55697683909ca9ada297877a6e6154473b2d22170b0107111e2a36414d5665717e8b98a9b3afa295887c6f6255493c2f221609000916222f3c4955626f7c8895a2afaea399887c6f6255493c31261a0d06030615222f3c4855626f7b8899a4afaa9d9084776a564c41362a1e110500101d2a3643505d69768390908376695d5043362a1d100000000000000000000c18232f39434b515f6060606060606060605f5e504a42382e23170b0000000b17232e38424a505e5f60606060606060605f5e5951473d31261a0200000000000000000004111d2935414b555d6064636261605d555d5c5b5a5a6774818d9aa7a79a8d8074675a5a5b5c5d555d6061626364605d564c4135291d11040004101c27333d474f54565656565656565656565656565865727e8b9386796c605346392d20130000020d1720293036393b4343434343434343434343434343434343434343433b3936302920170d0200000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000004101c2834404a545c606d727b81868a8d8f9191929292918f8d8a85807b726c655c6b78858686868686867c6f6256493c2f231609000714202d3a4753606d7a8693939393939286796c5f5346392c201300000c18232f39434f5964717e8a97998b7f7265554b4d56616e7b87929b8e8175665b5044382b1f12060000000916222f3c4854606b7682868686867e71645754606b7682868686867e7164574b3e3124180b000000000000000000000000000000000000000000000000000f1c2835424f5b6875818e9b92867a6d61574d453f3f454e57616e7a87939b8e8174685b4e4135281b0e000005121f2b3744505b657784919eaa9d918477695f535b657784919eaa9d918477695f53473a2d211408000000000916222e3a46515b62656c6c6c6c6c66635c52473e49545e66696c6c6c6c6c6360594f44382c201307000000000000000000000000000000020507080c10121312110f0c080705020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008111a242d373f464a4c535353535353534846423b33291f140900000009141f29333b424648535353535353534b4a453f362d231a1107000000000000000000000000000000000000000000030a1016191c1d20202020171614100b0e14171a1b202020201a1916130e070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d7984919e938c8076706d6d6e7178818e949d9083786c605346392d20130600000000000000000000000000000000000000000c18242f414d5a6774808d9aa7b3a9978a7d706453493f33271b100d1218252d3946525e6875828f9ca8b5afa295887c6f6255493c2f221609000916222f3c4955626f7c8895a2afb5ab998c7f7266574d42372b1f15120f121c2834404a5465717e8b98abb5a89b8e8175685b4e423025190d0100101d2a3643505d69768390908376695d5043362a1d100000000000000000040c131d2731394045534d545b60666c6c6c6c6c6a5c544a3f34281c10030003101c28343f4a545c6a6c6c6c6c6c66605b544d524e473f352019130c040000000000000000010d18242f3a434b51545857555453514b504f4e4f5b6875828e9ba8a89b8e8175685b4e4e4f504b51535455565854524c443a2f24190d0100000b16212b353d44484a4a4a4a4a4a4a4a4a4a4a4a4b5865727e8b9386796c605346392d2013000008141e29323b4146474f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4746413b32291e140800000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000030e18212c3844515c666d757f878d9298999c9d9e9f9f9f9e9c9a98928d867f776d666679869293939393887b6e6255483b2f221508000714202d3a4753606d7a86939f9f9f9f9286796c5f5346392c2013000007121d27313e4653606d7984919d908376675d5146535e6975828f9b9285796c605346392d201306000006131f2b37434e5863707d8994998f82766c61555863707d8994998f82766c6155493d3023170a000000000000000000000000000000000000000000000000000b1825323e4b5865717e8b99998c7f72695f57504c4c50575f6a73808c9a988a7e7164574b3e3124180b0000030f1b27333f49536976838f9ca9a096887b6e6155536976838f9ca9a096887b6e6155483b2f24190d010000000b1825313e4a57626d727979797979736e63574b424e5a6670767979797979706b6054483b2f2216090000000000000000000000000003090e121415191d1e1f1f1e1c181414110e080200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008121b252d343a3e3f464646464646463b3a36312921170d03000000030d17212931363a3b464646464646463e3d3a342d241b1108000000000000000000000000000000000000000000000000050a0d0f10131313130a0a08040003080b0d0e131313130d0c0a0702000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1724303d4a5763707d8a96998e81756e64616061666d78828f9c95897c6f6256493c2f2316090000000000000000000000000000000000000000071825313e4b5864717e8b97a8b2a79a8d8074655b5044372b221c191d242a36414c56616e7b86929facb9afa295887c6f6255493c2f221609000916222f3c4955626f7c8895a2afb6a99c908376695f53473c3127201f1c1f232c3844515c6675818e9ba8b3a9988c7f7265594c3f322619080000101d2a3643505d69768390908376695d5043362a1d1000000000000001070e161e2529323b424651575f666c72797979797975665c5044382b1f12060006121f2b3844505c66757979797979726c665f575146423b3229251e160e07010000000000000007131d28313a4145474b4a4948474540434243505c6976838f9ca9a99c8f8276695c4f43424340454748494a4b4745413a32281e1308000000050f19232b33383c3d3d3d3d3d3d3d3d3d3d3d3f4b5865727e8b9386796c605346392d201300010d1925303b444c52545c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c54524c443b3025190d01000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000915202c38434f59606d78818c92999fa2aaa9a8aaa29f9e9e9e9fa29f98928c81786d6d798699a39f9f94877a6e6154473b2e211408000714202d3a4753606d7a8693a0acac9f9286796c5f5346392c2013000008121d262c3844505c6674818e9b92867a6d6053474d5765717e8b9897887b6e6255483b2f22150800000815212e3b47535f6a7683909d92867b6e615a535f6a7683909d92867b6e615a5045392d211408000000000000000000000000000000000000000000000000000814212e3b4754616e7a86929f92857b6e69615a59595a61696e7c86929f92867a6d6154473a2e2114070000000b17222d414e5b6874818e9ba7a8988c7f7265555b6874818e9ba7a8988c7f7265554c4135291d11040000000c1926323f4c5965727f86868686868073665a4d43505c69768286868686867d706356493d3023160a000000000000000000000002080e141a1e212226292b2c2c2b292521201e19140d0801000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009131b23292e3132393939393939392e2d2a251f170f050000000000050f171f252a2d2e3939393939393932312e29221b12090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010e1b2734414e5a6774818d9a93877b6e615c5453545c666f7c8997998c807366594d4033261a0d00000000000000000000000000000000000000000815212e3b4854616e7b8796a0acab9e9184786c6053463e342c2924292f353e46525e6873808c99a3aebbafa295887c6f6255493c2f221609000916222f3c4955626f7c8895a2afb7ab9f94887b6e62574e4339312d2b282b2e343f4953606d7985929fabada297897c6f6356493c302316090000101d2a3643505d69768390908376695d5043362a1d100000000000040c1318202830353e444d525b62696e787f8686868687796d6053463a2d201307000713202d3a4653606d7987868686867f786e69625b524d443e3530282018130c04000000000000010c161f282f35393a3e3d3c3b3a38352f3744515d6a7784909daaaa9d9083776a5d50442e2f35383a3b3c3d3e3a39352f2820160c0100000005101a232c33393c3d3d3d3d3d3d3d3d3d3d3d3f4b5865727e8b9386796c605346392d20130005111e2a36414c565e61696969696969696969696969696969696969696969615e564c41362a1e1105000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000020e1a26313b4854606b74808d939fa3ababa49f9b979892919192939a989d9f938f82786d7a8794abb4a094877a6d6154473a2e211407000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201300030e19242f3840474a5464717e8a9799897c6f6256494854616e7b8796978a7d7164574a3e3124170b00000916222f3c4955626f7c88959b8e8174695f5355626f7c88959b8e8174695f53483e34281d1105000000000000000000000000000000000000000000000000000714202d3946525e6874808d979891837b706c676565676c717b849198978d8073685d5246392d201307000000061a2633404d596673808c99a6a99c8f8276675d596673808c99a6a99c8f8276675d5145392c2013060000000d192633404c5966737f8c9393938d8074675a4d43505d6a7683909393938a7d7064574a3d3124170a00000000000000000000050d14191f262a2d2e32363839393836322e2d2a251e19130c0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010911181e2225252d2d2d2d2d2d2d21211e1a140d0500000000000000050d141a1e21212d2d2d2d2d2d2d2524211d18110900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004060709090909090909090706030000000000000000000000000000000000000000000000000000000000000000000003101c2936434f5c6976828f9c908377695e5247464a54606a7885919b8e8175685b4e4235281b0f02000000000000000000000000000000000000000714212d3a46535e697784919eaaaca196897d70635a50463e38343035394045515b616e7a85929fabb2baafa295887c6f6255493c2f221609000916222f3c4955626f7c8895a2afbdb0a69a8d81746a5f554b433c39383338393f44505b65717e8a97a2adab9f9285796d6053463a2d2013070000101d2a3643505d69768390908376695d5043362a1d1000000000070d161d2429323a414650565e616d727b828c929992877e71665c5044382b1f12060006121f2b3844505c66717e879399928c827b726d615e565046413a3229241d160d07000000000000040d161d24292c2d31302f2e2d2c292935404b556b7884919eabaa9e9184776b544a403428292c2d2e2f30312d2c29241e160d04000000000b17222c363e44494a4a4a4a4a4a4a4a4a4a4a4a4b5865727e8b9386796c605346392d2013000714202d3946525e686e7676767676767676767676767676767676767676766e685e5246392d201407000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000006121e2b37424e57636f7c87939fa5afa9a199938f8a878584848586888c90959e948d80747b8794a1ada093877a6d6054473a2d211407000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130007131f2b36404a52585a616e7b879a978a7e7164575055575e69788491998c7f7366594c403326190d0005121e2a36424d576673808d9994887c6f62574d576673808d9994887c6f62574d42362c22170c000000000000000000000000000000000000000000000000000005111e2a36414c56616d7a8592999591847d7774727274777e8591969992857a6d61564c4135291d11050000000b1825323e4b5865717e8b98a4ac9f92867a6d605865717e8b98a4ac9f92867a6d6054473a2d22170b0000010d1a2734404d5a6773808d9a9f9b8e8174685b4e44515e6a7784919d9f978a7e7164574b3e3124180b000000000000000000070e171f252a31363a3b3f4345464544423f3b39363029241e160d060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070d12161819202020202020201514120e090300000000000000000003090e12141520202020202020181715110c060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070c10131316161616161616161312100c06000000000000000000000000000000000000000000000000000000000000000004111d2a3744505d6a7783909c8f827569574d423a424e586a7783909c8f8276695c4f4336291c10030000000000000000000000000000000000000005121e2a36424d576673808d99a6b0a89c9083766c6258504745404241464b515a626d75818e989ea0a8b2afa295887c6f6255493c2f221609000916222f3c4955626f7c8895a2afb5aba39f92877b6e675d554e4846443f44464a5059606c7883909da9b1a89b8e8175665c5044382b1f12060000101d2a3643505d69768390908376695d5043362a1d100000000710191f282f353e444c525a61696e767f8690949a93877e716c61544a3f34281c10030003101c28343f4a54616c717e87939a9490867f766e69615a524c443e352f281f191007000000000000040c13181d202125242221201f1f2c3845515d677985929facab9f928578665c5144382c1f1f202122232521201d19130c040000000004101c28333e485055575757575757575757575757575865727e8b9386796c605346392d2013000814212e3b4754616e7a8282828282828282828282828282828282828282827a6e6154473b2e211408000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000814212e3a47535f6a76828f9aa4afaba1979287827d7a79787778797b7f838a9196928a7e7b8895a1ada093867a6d6053473a2d201407000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013000b1723303c47525c64676c6d798693998c7f7266595a61646c6c7683909b8e8174685b4e4135281b0e000714212d3a46535e697884919c8f82766a5f53535e697884919c8f82766a5f53453c31241a10060000000000000000000000000000000000000000000000000000020e1925303b46525e68707d87929996918a84807f7f81848a91979992877d70685e52443a3024190d010000000a1723303d4a5663707d8996a3aea3998a7d71645463707d8996a3aea3998a7d7164544a3f33281c0f0300010e1b2734414e5a6774818d9aa79b8e8275685b4f45515e6b7884919ea5988b7e7265584b3f3225180c0000000000000000081019202930363b4246484c50515252514f4b4746413b352f282018100700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000106090b0c13131313131313080705020000000000000000000000000002050708131313131313130b0b09050100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b12181c1f202323232323232323201f1c17110a0300000000000000000000000000000000000000000000000000000000000003101d293643505c6976838f9c908376675d51464446535f697884919b8e8275685b4f4235281c0f0200000000000000000000000000000000000000020e1a25313b4855626e7b88949eacab9f948b7e716a615a53514b4e4c52555d606c727f8b93969196a0acafa295887c6f6255493c2f221609000916222f3c4955626f7c8895a2afafa39992999083796d6760585553504a5053545c606b727f8b95a0acaca095897d7063544a3f34281c10030000101d2a3643505d69768390908376695d5043362a1d100000040f19222b313a41454f565e616c717b828b92989a93887e716c615a5042382e23170b0000000b17232e3842505a616c717e88939a98928b827b716c615e564f45413a312b22190f0400000000000001070d111314181716151414202d3a4753606d7a8698a2aeaea29886796d6053463a2d201314151617181413110d080100000000000814202d3944505a61646464646464646464646464646465727e8b9386796c605346392d2013000815212e3b4854616e7b878f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f877b6e6154483b2e211508000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000815222f3b4855626e7b88949facaea39992857d75716e686b6b666d6e72767d84909492857d8996a3aca09386796d6053463a2d201307000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013000d1a26333f4c58646e7479797985929a8d8073675a616c71797979828f9b8f8275685c4f4235291c0f000815212e3b4854616e7b8796988c7f7265584e54616e7b8796988c7f7265584e433b33291f140900000000000000000000000000000000000000000000000000000008141e2a36414c56606b717e8792989e96918d8c8c8d91969e9892877e716b60564c4132281e1308000000000815222f3b4855626e7b8895a99f9f9b8e8174665b626e7b8895a99f9f9b8e8174665b5044382b1f120600020e1b2835414e5b6874818e9ba79c8f8276695c4f45525f6b7885929ea5988c7f7265594c3f3226190c0000000000000008111a222b323b41464d5355595c5e5f5f5e5c5854524c45413a322a2219100700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030c151d23282c2d30303030303030302d2c28231c150c030000000000000000000000000000000000000000000000000000000000020f1b2835424e5b6875818e9b92867a6d605a5351535b616e7b88969a8d8073675a4d4034271a0d0100000000000000000000000000000000000000000914212e3a47535f6975828f9aa4afa69f92867d716c64605c555b565d61676d737e8792989184919eaaafa295887c6f6255493c2f221609000916222f3c4955626f7c8895a2afac9f928692958f81796f6a6462605b545b6062666d727d87929fa7b0a69d9184786c605346392e23170b000000101d2a3643505d69768390908376695d5043362a1d1000000a16212b343d434b515961686d757e858f949f9f93887f716c625a50483e30261c110600000006111c26303e48505a626c717f88939f9f948f857e756d686159514b433d342b21160a0000000000000000010406070b0a09080815212e3b4854616e7b8794aab4b3aa94877a6e6154473b2e21140808090a0b07070401000000000000000a1623303c4955616c707070707070707070707070707070727e8b9386796c605346392d2013000815212e3b4854616e7b87949c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c94877b6e6154483b2e211508000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000d192633404c5966737f8c99a6b0ac9f92877c6f6b64615e56545c6062656c707a8290949083909daaaca09386796d6053463a2d201307000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013000e1a2734414d5a67748086868689979a8d8174675a64717e8686868f939c8f8276695c504336291d10000a1724313d4a5764707d8a9798887b6e6255525764707d8a9798887b6e6255524d453b30251a0e020000000000000000000000000000000000000000000000000000020d1925303a444f59626c717d868e93999c9a98989a9c99938e857d716c62594f443a3020160c02000000000714202d3a4753606d7a8697939393939285796c60606d7a8697939393939285796c605346392d20130600020f1c2935424f5c6875828f9ba89c908376695d5044505b667985929fa6998c807366594d4033261a0d00000000000006101a232c343d444d52575f6165696b6c6c6b6965615e56524c443c342b22190f0500000000000000000000050a0d0f1010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100f0d09040000000000000000000000050a0d0f1010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100f0d090400000000000000000b151e272e34383a3c3c3c3c3c3c3c3c3a38342e261e150a0000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b98988d80736d63605c60636d75818e9b97897d7063564a3d3023170a00000000000000000000000000000000000000000006121e2b37424d57626f7c87939fa7aea29892867e76706d67686869686d72798088929992867e8a97a4afa295887c6f6255493c2f221609000916222f3c4955626f7c8895a2afa6998c7f8c93938f837c76716e6c666b666c6e72787f879299a3aea99f948a7e71665b5044382b1c1106000000101d2a3643505d69768390908376695d5043362a1d1000030f1b27323d464e555d606b707a818a92979f9b918b7f726d625a50483e362c1e140a00000000000a141e2c363e48505a626d727f8b919b9e97928a817a706b605d554e463d32271b0f030000000000000000000000000000000915222f3c4855626f7b8895a2aeaea195887b6e6255483b2f2215080000000000000000000000000000000a1724313d4a5764707e7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d808d9386796c605346392d2013000815212e3b4854616e7b8794a1a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a194877b6e6154483b2e211508000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000005111e2a36424d576976838f9ca9b1a79a8d80736a605954524c4a5053555a61676d798290959095a0abaca09386796d6053463a2d201307000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013000e1a2734414d5a6774808d939393a19a8e8174675b64717d8a93939b9e9d9083766a5d5043372a1d10000c1926333f4c5966727f8c999285796a63615e5766727f8c999285796a63615e574d42362a1e110500000000000000000000000000000000000000000000000000000008131e29323d47505a626b707b81878c8f919292918f8c87817b706b625a50473d32281e0e04000000000006131f2c3945515d677885868686868686867c6f625d677885868686868686867c6f6256493c2f2316090003101c2936434f5c6976828f9ca99d9084776a5d514653606c798698a3a69a8d8073675a4d4034271a0d0100000000020c18222c353e474f565e61696e72767879787775726e68605d564e463d342b21170b0200000000000000030a1016191c1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1c1b1915100a0200000000000000030a1016191c1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1c1b1915100a02000000000007121d273039404546494949494949494946443f3830261c110600000000000000000000000000000000000000000000000000000000000714212e3a4754616d7a86929f93887f756f6d666d7076808c939e9185796d6053463a2d201307000000000000000000000000000000000000000000020e1a26313c4754606a74818d95a0a9aaa298928a827d7977757575777a7f848d939a948c7f7c8895a2afa295897c6f6256493c2f231609000916232f3c4956626f7c8995a2afa296897d818e96959087827e7b79787778797b7f848c9299a3abaaa2978f82776c60544a3f33281c0a00000000101d2a3643505d69768390908376695d5043362a1d100007131f2c38434e5860676d747d858e939fa29b918b7f726d625a50483f362d241a0c020000000000020c1a242d363f48505a626d727f8b919ba29f938e857d746d6760584e43382c1f13070000000000000000000000000000000a1623303d495663707c8996a3acaca296897c6f6356493c3023160900000000000000000000000000000013202d394653606c79868a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8d929386796c605346392d2013000815212e3b4854616e7b87949f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f94877b6e6154483b2e211508000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000714202d3a46525e697885929fabaca095877b6e61584f4746413f44464850555d676e7b85929da0a7b1aca09386796d6053463a2d201307000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013000e1a2734414d5a6774808d9a9fa0a79b8e8174685b64717d8a979fa8aa9d9084776a5d5144372a1e11000e1a2734414d5a6774808d9a91847770706e695e6774808d9a91847770706e695e52463a2d201407000000000000000000000000000000000000000000000000000000020d17202b353f48505961696e747b7f8284858584827f7b746e69615950483f352b20160c00000000000004101d2935404b55687378797979797979796f6a6055687378797979797979796f6a6054483b2e2215090003101d2a3643505d697683909ca99e9184776b5e514754606d7a8793aaa79a8d8174675a4e4134271b0e01000000000a141e2a343e474f5960686e747b7f8384858584827e7a736d685f584f473d33291d140a000000000000040d151c2126292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292825211b140c040000000000040d151c2126292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292825211b140c04000000000c18232e39424b5153565656565656565653504a42382e23170c00000000000000000000000000000000000000000000000000000000000713202d3946525e6873808c959a938b817c7978797d828c929c948b7e71665c5145382c1f13060000000000000000000000000000000000000000000009151f2b37434e58606d79839197a0a8aaa29f948f8a868382818284878b91969f958f82787b8894a1aea296897c6f6356493c3023160900091623303c4956636f7c8996a2aea295887c7a84919899938f8b888685848486888c91969fa3aba9a29892857b6e655b5042382d22170b00000000101d2a3643505d69768390908376695d5043362a1d10000915222e3b4854606a6f79818a91979ea39c918c7f726d625b51483f362d241b12080000000000000008121b242d363f48515b626d727f8c919ca39e97918a81796f6a6054483b2e2215090000000000000000000000000000000b1724313e4a5764717d8a979f9f9f9f978a7d7064574a3d3124170a00000000000000000000000000000013202d394653606c798693939393939393939393939393939393939386796c605346392d2013000815212e3b4854616e7b8793939393939393939393939393939393939393877b6e6154483b2e211508000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000814212e3b4754616e7b8798a2aeaa9d908377695e53463d393634383a3e434c555e69717e8b97a1adb9aca09386796d6053463a2d201307000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013000e1a2734414d5a6774808d9aa7b3a79b8e8174685b64717d8a97a4b0aa9d9084776a5d5144372a1e11000f1b2835424e5b6875818e9b91847d7d7d7b6e616875818e9b91847d7d7d7b6e6154473b2e21140800000000000000000000000000000000000000000000000000000000050e19232d363f474f575e61696e72767779797776726e69615e574f473f362d23190e05000000000000000c18242f39435761686b6c6c6c6c6c6c6c6260585761686b6c6c6c6c6c6c6c6260584e43382c1f13070004111e2a3744515d6a7784909daa9e9285786b5f4a4754616e7a8794a1a89b8e8175685b4e4235281b0f0200000006111c26303c464f59616b6f7a81878c8f919292918f8b86807a6f6a60594f453b2f261b110600000000030d161f262d323536363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363635312c261e160c02000000030d161f262d323536363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363635312c261e160c02000004101c2834404b545c606363636363636363605c544a3f34281c10030000000000000000000000000000000000000000000000000000000005111d2935414c56606d798390969f938e89868586898f949c958f82786c60544b4034281c100400000000000000000000000000000000000000000000030f1b27323d45515d676e7b8591969fa4aca69f9c9892908f8e8f90939a9e9f9490837a6d7a8794aab4a396897c706356493d3023160a000a1623303d495663707c8996a3aca194887b6f7d8692989f9c9799929291919298989ea0a8aba69f9792867d70695f53493f2f261c110600000000101d2a3643505d69768390908376695d5043362a1d10000916232f3c4956626f7c848e9393939393918c7f726d625b51493f362d241b120900000000000000000009121b242d363f49515b626d727f8c9193939393938e847c6f6256493c2f2316090000000000000000000000000000000c1825323f4b5865727e8b9393939393938b7e7165584b3e3225180b00000000000000000000000000000013202d394653606c798686868686868686868686868686868686868686796c605346392d2013000815212e3b4854616e7b8686868686868686868686868686868686868686867b6e6154483b2e211508000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000091623303c4956636f7c8996aab4a79a8e817467574d42342d2a282b2d313a434d57606d7985929eabb8aca09386796d6053463a2d201307000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013000e1a2734414d5a6774808d9aa7aca79b8e8174685b64717d8a97a4acaa9d9084776a5d5144372a1e11000f1c2936424f5c6975828f9c95918989897e72656975828f9c95918989897e7265584b3f3225180c000000000000000000000000000000000000000000000000000000000007111b242d353e454d52575f6165696b6c6c6b6965615f57524d453d352d241b1107000000000000000007121d2731454f575d5f6060606060606056544e4f575d5f6060606060606056544e463d32271b0f030005111e2b3844515e6b7784919eaa9f928579665b504855616e7b8894a1a89b8f8275685c4f4235291c0f020000000b17232e38424e58616b707d858e92999c9e9f9f9e9c98928d847c6f6b60574d41382d22170b000000000a151f2831383e42434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343413d3830281e140a0000000a151f2831383e42434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343413d3830281e140a000006131f2c3845515c666d6f6f6f6f6f6f6f6f6d665c5044382c1f120600000000000000000000000000000000000000000000000000000000010d1925303a45515d676e7a848f949d9b99929292999c9d938e83796d665b5042392e23180c0000000000000000000000000000000000000000000000000a15202935414b555f696e7b848e939a9fa3aaaaa39f9d9b9b9c9d9f9f99928d827a6d6d798698a29f9f96897d7063564a3d3023170a000a1723303d4a5663707d89969f9fa49a877a6d707d8690959da0a39f9e9e9e9fa3aaa9a8a69f9c948f857d706b60574d41382d1d140a0000000000101d2a3643505d69768390908376695d5043362a1d10000e1b2734414e5a67748186868686868686867f736d635b51493f372d241b1209000000000000000000000009121b242d373f49515b636d737f86868686868686868174675a4e4134271b0e0000000000000000000000000000000d192633404c5966737f86868686868686867f7265594c3f3226190c00000000000000000000000000000013202d3946535f6c767979797979797979797979797979797979797979766c5f5346392d2013000714212d3a46535e697679797979797979797979797979797979797979797976695e53463a2d211407000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000a1724313d4a5764707d8a97a3b0a5988c7f7265594c3f31261e1c1f2028313b45515c6673808d99aab4aca09386796d6053463a2d201307000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013000e1a2734414d5a6774808d9a9f9f9f9b8e8174685b64717d8a979f9f9f9d9084776a5d5144372a1e1100101c2936434f5c6976828f9ca09d96968b7e72656976828f9ca09d96968b7e7265584b3f3225180c00000000000000000000000000000000000000000000000000000000000009121b232c333b42464d5355595c5e5f5f5e5c5955534d46423b332c231b1209000000000000000000010b151f333d454c505253535353535353494843454c5052535353535353534948433d342b21160a000005121f2b3845525e6b7885919eaba29886796c60534955626f7c8895a2a99c8f8376695c504336291d1003000003101c28343f4a545f6a707d8692979fa3ababacabaaaaa39f9691867d6f695e53493f33271b0f03000005101c26313a42494e50505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050504f4e49423a30261b10040005101c26313a42494e50505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050504f4e49423a30261b1004000713202d3a4653606d787c7c7c7c7c7c7c7c786d6053463a2d201307000000000000000000000000000000000000000000000000000000000008131e2935404b555e686e7a828a919598999a999795908981796d675d544a3f30271d1207000000000000000000000000000000000000000000000000040d18242f3a434d575f696e7981878e92989a9c9e9f9f9f9e9d9a98928e8680786d6866798592939393938a7d7164574a3e3124170b000b1724313e4a5764717d8a939393939386796d6b707c838b9195989b9d9e9f9f9f9e9d9b9894908a827b706b60594f453b2f261b0b020000000000101d2a3643505d69768390908376695d5043362a1d10000d1a2733404c58646e747979797979797979736d635b51493f372d251b12090000000000000000000000000009121b252d373f49515b636d737979797979797979746e64584c4033271a0d0000000000000000000000000000000c1825323e4b57636d737979797979797979726d63574a3e3125180c000000000000000000000000000000121e2b37434f5a646c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c645a4f43372b1e120005121e2a36424d575e6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c5e574d42362a1e1205000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000b1824313e4b5764717e8a97a4b0a4978a7d7164574a3e3124171012161f2834404b54626f7c8998a3aeaca09386796d6053463a2d201307000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013000e1a2734414d5a6774808d93939393938e8174685b64717d8a93939393939084776a5d5144372a1e1100101d293643505c6976838f9ca9aaa3988b7e72656976838f9ca9aaa3988b7e7265584b3f3225180c0000000000000000000000000000000000000000000000000000000000000009111a212930363b4246484c4f515252514f4c4846423b363029211a11090000000000000000000000030d212b333b404445464646464646463c3b383b404445464646464646463c3b38322b22190f04000005121f2b3744505b657985929facaa93877a6d60544956636f7c8996a2a99d9083766a5d5043372a1d1004000006121f2b3844505c666f7c869298a1a9afb5b7b8b8b7b4aea8a19892857b6e655b5044372b1f140900000a16212d38424c545a5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5a544c42382c211509000a16212d38424c545a5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5a544c42382c211509000815212e3b4854616e7b87898989898989877a6d6154473a2e2114070000000000000000000000000000000000000000000000000000000000020c18242f39434c565e686d777e84888b8c8d8c8b87837d746d675d554b42382d1e150b000000000000000000000000000000000000000000000000000007131d28313b454d575f676d747c81868a8d8f9192929291908d8a86817b736d665e6a77838686868686867e7165584b3e3225180b000b1825323e4b5865717e868686868686857866606a6e787e84888c8e909192929291908e8b88837d766e6960594f473d33291d140a000000000000101d2a3643505d69768390908376695d5043362a1d10000b1824303c48535c64676c6c6c6c6c6c6c6c66635b51493f372d251b130900000000000000000000000000000009131b252d373f49515b63666c6c6c6c6c6c6c6c67645c53483c3024180b0000000000000000000000000000000a16222f3b46515b63666c6c6c6c6c6c6c6c65635b51463a2e2216090000000000000000000000000000000f1b27333e49525a5f60606060606060606060606060606060606060605f5a52493e33271b0f00020e1a25313b454d535f6060606060606060606060606060606060606060605f534d453b31251a0e02000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000b1825313e4b5864717e8b97a4b0a396897d7063564a3d3023170a060d18232e3a4653606d7986929facaca09386796d6053463a2d201307000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013000e1a2734414d5a677480868686868686868174685b64717e8686868686868683776a5d5144372a1e1100101d293643505c6976838f9ca9b1a5988b7e72656976838f9ca9b1a5988b7e7265584b3f3225180c0000000000000000000000000000000000000000000000000000000000000000080f171f252a31363a3b3f4344464644433f3b3a36312a251f170f08000000000000000000000000000f1921292f343738393939393939392f2e2c2f343738393939393939392f2e2c27211910070000000613202d394653606c7986939faca194877a6e61544a5663707d8996a3aa9d9184776a5e5144372b1e070000000713202d3a4653606d78839198a2aab3bbc0c4c5c5c4bfbab2aaa1979083776c6053463b31261a0e02000d1926323e49545e66696969696969696969696969696969696969696969696969696969696969696969696969696969696969696969696969655e54493d3125190d000d1926323e49545e66696969696969696969696969696969696969696969696969696969696969696969696969696969696969696969696969655e54493d3125190d000815212e3b4854616e7b87949696969694877a6d6154473a2e21140700000000000000000000000000000000000000000000000000000000000007121d27313b444c565d656c71777b7e80807f7e7b76706b605c554b43392f261c0c030000000000000000000000000000000000000000000000000000010c161f2a333b454d555d606a6f757a7d8183848586858583817e7a746e69605c54677177797979797979716c62564a3d3124170b000b1724313d4a56626c71797979797979787368585f666d71777b7f8183858586858583817e7b76706b615e574f473d352b21180b02000000000000101d2a3643505d69768386868376695d5043362a1d10000814202b36414a53585a60606060606060605957514940372e251b1309000000000000000000000000000000000109131b252e37404951575960606060606060605a58534a41362b20140800000000000000000000000000000006121e2a3540495157596060606060606060595751493f352a1e12060000000000000000000000000000000a16212c3740494f535353535353535353535353535353535353535353534f4940372c21160a000009141f29333b4246485353535353535353535353535353535353535353534846423b33291f140900000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000b1825323e4b5865717e8b98a4afa296897c6f6356493c302316090007131f2c3845515c667683909da9aca09386796d6053463a2d201307000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013000d1a26333f4c58646e7479797979797979746f6459616c71797979797979797771675b4f4236291d1000101d293643505c6976838f9ca9aca5988b7e72656976838f9ca9aca5988b7e7265584b3f3225180c000000000000000000000000000000000000000000000000000000000000000000050d141a1f262a2d2e32363839393836322e2d2a261f1a140d050000000000000000000000000000070f171e24282b2c2d2d2d2d2d2d2d23221f24282b2c2d2d2d2d2d2d2d23221f1b160f07000000000714202d3a4753606d7a869aa4afa195887b6e62554a5764707d8a97a3ab9e9184786b5e51452f23180c000006121e2b37424e5765717e8b95a0aab4bcc5cbd1d2d2d0cbc4bcb3a99f958a7e7164574d42362a1e1205000f1c2935424e5a667076767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767670655a4e4135281b0f000f1c2935424e5a667076767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767670655a4e4135281b0f000815212e3b4854616e7b8794a1a2a2a094877a6d6154473a2e211407000000000000000000000000000000000000000000000000000000000000010b151f29323b444c535b6064696e71737473716e69636059514b433931281d140a00000000000000000000000000000000000000000000000000000000040d18212a333b434b51585f62686d71747678787979787674716d67615f5750555f676a6c6c6c6c6c6c65625a50453a2e211509000915212e3a45505a62656c6c6c6c6c6c6b686157545c60646a6e72757778787979787675726e69636159534d453d352b23190f06000000000000000f1c2935424e5a66707679797670665a4e4235291c0f00030f1a252f3841484c4e53535353535353534c4b4640372e251c1309010000000000000000000000000000000000010a131c252e3740464b4c53535353535353534e4c4841382f251a0f03000000000000000000000000000000020d19232e3740464b4c53535353535353534c4a463f372d23180d0100000000000000000000000000000005101b252e373e4346464646464646464646464646464646464646464646433e372e251b10050000030d17212931363a3b4646464646464646464646464646464646464646463b3a36312921170d0300000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f2316090004101c2834404b546875828f9ba8aca09386796d6053463a2d201307000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013000b1723303c47525c64676c6c6c6c6c6c6c68645d535a61646c6c6c6c6c6c6c6a675f554a3f33271a0e00101d293643505c6976838f9c9f9f9f988b7e72656976838f9c9f9f9f988b7e7265584b3f3225180c0000000000000000000000000000000000000000000000000000000000000000000003090e141a1e212226292b2c2c2b292622211e1a140e090300000000000000000000000000000000060d13181c1e1f20202020202020161513181c1e1f202020202020201615130f0a0400000000000814212e3b4754616e7a8794a1b6a295887c6f62554b5864717e8b97a4ab9f9285786c554b4034291c1004000814212e3a47535f6a7784919ea7b1bcc5cfd7dcdfdedcd6cec5bbb1a79d908377695f53463a2d21140700101d293643505c697683838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838276695c4f4336291c1000101d293643505c697683838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838276695c4f4336291c10000815212e3b4854616e7b8794a1aeada094877a6d6154473a2e21140700000000000000000000000000000000000000000000000000000000000000030d172029323a41495053575f626566676664615e57544f45403931281f160b020000000000000000000000000000000000000000000000000000000000060f182129313a40454e53565d606467696b6c6c6c6b6a6764605d55534d444d555b5e606060606060585650483f34291d11050005111d29343f485056586060606060605f5c574f4a5153585f6265686a6b6c6c6c6b6a6865615f57554f46423b332b2319110700000000000000000d1a26323e4a545e66696c6c69665e544a3e32261a0d000008131d262f363c40414646464646464646403e3b352e251c130a0100000000000000000000000000000000000000010a131c252e353b3e40464646464646464641403c362f261d1308000000000000000000000000000000000007121c252e353b3e4046464646464646463f3e3a352d251c1107000000000000000000000000000000000009131c252c33373939393939393939393939393939393939393939393937332c251c130900000000050f171f252a2d2e3939393939393939393939393939393939393939392e2d2a251f170f050000000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000c18232e414e5b6874818e9ba7aca09386796d6053463a2d201307000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130007131f2b36404a52585a606060606060605b59534b505557606060606060605d5b554d43392e22160a00101d293643505c6976828f93939393938b7e72656976838f93939393938b7e7265584b3f3225180c00000000000000000000000000000000000000000000000000000000000000000000000003090e121415191c1e1f1f1e1c191514120e09030000000000000000000000000000000000000002070c0f1112131313131313130909070c0f11121313131313131309090703000000000000000815222e3b4855616e7b8894a1aca396897c7063564b5865727e8b98a5ac9f928679675c5145382c1f1306000815222f3b4855626e7b8896a0acb9c3ced7e1e8ebebe7e0d6cdc2b8aca095887b6e6155483b2e2215080013202d394653606c79868f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f86796c5f5246392c1f130013202d394653606c79868f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f86796c5f5246392c1f13000815212e3b4854616e7b8794a1aeada094877a6d6154473a2e2114070000000000000000000000000000000000000000000000000000000000000000050e1720282f383f44464d535558595a595854534d48443d342f271f160d0400000000000000000000000000000000000000000000000000000000000000060f181f282f353c43474c5254575a5c5e5f5f5f5e5d5a5754514b46423b444a4f515353535353534b4a453f362d22180c0100010c18222d363f454a4b53535353535352504c454044464e5355595b5d5e5f5f5f5e5d5b5855534d48443e363129211911070000000000000000000a16222d38434c545a5d60605d5a544c43382d22160a0000010b141d252b303334393939393939393933322f2a231c130a01000000000000000000000000000000000000000000010a131c232a2f323339393939393939393433302b251d140b010000000000000000000000000000000000000a131c232a2f3233393939393939393932312e2a231c130a000000000000000000000000000000000000010a131b21272b2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2b27211b130a010000000000050d141a1e21212d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d21211e1a140d05000000000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f2316090000071a2734404d5a6773808d9aa6aca09386796d6053463a2d201307000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201300030e19242f3840474c4d535353535353534e4d484145494a53535353535353514f4a433b31271c110600101d293643505c697682868686868686867f7265697682868686868686867e7265584b3f3225180c0000000000000000000000000000000000000000000000000000000000000000000000000000020507080c1011131311100c0807050200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000915222f3c4855626f7b88959f9f9f968a7d7063574c5965727f8c989f9fa399867a6d6053473a2d201407000c1825323f4b5865727e8b98a8b2bdccd5e0e9f3f9f8f2e8dfd4c8bcb1a7988b7e7165584b3e3225180b0013202d394653606c7986939c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9286796c5f5246392c1f130013202d394653606c7986939c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9286796c5f5246392c1f13000815212e3b4854616e7b8794a1acaca094877a6d6154473a2e211407000000000000000000000000000000000000000000000000000000000000000000050e161d262d33373c4247484b4d4d4c4b4846423b383329231d150d04000000000000000000000000000000000000000000000000000000000000000000060d161d242932373a4145474a4e505152535252504e4b4745413a3631393f43444646464646463e3d3a342d241b110600000006111b242d343a3d3e4646464646464544403b34383c4347484c4e505252535252504e4b4846423b38332a251f170f070000000000000000000005111c27313a434a4e505353504e4a433a31271c1105000000020b131a202427272d2d2d2d2d2d2d2d2625231e19120a010000000000000000000000000000000000000000000000010a12191e2325262d2d2d2d2d2d2d2d272724201a130b0200000000000000000000000000000000000000010a12191e2225262d2d2d2d2d2d2d2d2625221e18110a0100000000000000000000000000000000000000010910161b1e202020202020202020202020202020202020202020201e1b161009010000000000000003090e1214152020202020202020202020202020202020202020201514120e090300000000000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013000008121d262f363c3f414646464646464641403c37393c3e4646464646464644423f3931291f150b00000f1c2835414e5a66707679797979797979726d6266707679797979797979726d62564a3d3124180b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000091623303c4956636f7c8993939393938a7e7164574c5966737f8c9393939393877a6d6154473a2e211407000d1a2633404d596673808c99a6b3bfced9e7f2fbfffffaf1e4d9cebfb3a6998c807366594d4033261a0d0013202d394653606c7986939f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9285796c5f5246392c1f130013202d394653606c7986939f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9285796c5f5246392c1f13000815212e3b4854616e7b87949f9f9f9f94877a6d6154473a2e21140700000000000000000000000000000000000000000000000000000000000000000000040b141b22272b31373a3b3e4041403e3b3a36312c272118120b030000000000000000000000000000000000000000000000000000000000000000000000040c131820262b2f35393a3e4143454546464543413e3a39352f2a262e33363739393939393932312e29221b1209000000000009121b22292e31323939393939393837342f282c31373a3b3f4244454546464543423f3b3a36312c28211a140d050000000000000000000000000a151f2831383e4243464643423e3831281f150a000000000001080f14181a1b2020202020202020191916120d07000000000000000000000000000000000000000000000000000000070d1216191920202020202020201b1a18140f080100000000000000000000000000000000000000000000070d121618192020202020202020191816120d070000000000000000000000000000000000000000000000050a0f1213131313131313131313131313131313131313131313120f0a0500000000000000000000000205070813131313131313131313131313131313131313131308070502000000000000000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130000010b141d242b303334393939393939393534302b2d3031393939393939393736332e271f170d0400000d1926323e49545e66696c6c6c6c6c6c6c65625b5e66696c6c6c6c6c6c6c65625b51453a2e2215090000000000000000000000000000000000000000000000000000000000000000050a0d0f10131313130b0a080500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1723303d4a5663707d868686868686867e7165584d5a677380868686868686867b6e6155483b2e221508000e1b2734414e5a6774818d9aa7b4c0cddae7f7fffffffff5e7dacdc0b4a79a8d8174675a4e4134271b0e0013202d394653606c79869393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939285796c5f5246392c1f130013202d394653606c79869393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939285796c5f5246392c1f13000815212e3b4854616e7b87939393939393877a6d6154473a2e2114070000000000000000000000000000000000000000000000000000000000000000000000020a11171b1f262b2e2f32333433312e2d2a251f1c160c07010000000000000000000000000000000000000000000000000000000000000000000000000001070d151b1e24292c2d31343638393939383734312d2c29241d1a22272a2b2d2d2d2d2d2d2524211d181109000000000000000911181d2124252d2d2d2d2d2d2c2b28241c1f262b2e2f32353738393939383735322e2d2a261f1c170e090300000000000000000000000000030d161f272d32353639393635322d271f160d030000000000000003080b0d0e13131313131313130d0c0a0602000000000000000000000000000000000000000000000000000000000002060a0c0d13131313131313130e0d0b08030000000000000000000000000000000000000000000000000002060a0c0d13131313131313130c0c09060100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013000000020b12191f2326272d2d2d2d2d2d2d282724202123242d2d2d2d2d2d2d2a2927221c150d050000000915212d38424c545a5c60606060606060585651545a5c60606060606060585651493f34291d1105000000000000000000000000000000000000000000000000000000000000030a1016191c1d20202020181714110c060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000916232f3c4855606b7079797979797979716c62564b58646e737979797979797976695f53463a2d211407000d1a2733404d5a6673808d99a6b3c0cfdae6f3fcfffffbf2e9d9ccc0b3a6998d8073665a4d4033271a0d0013202d394653606c79868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686796c5f5246392c1f130013202d394653606c79868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686796c5f5246392c1f13000815212e3b4854616e7b86868686868686867a6d6154473a2e21140700000000000000000000000000000000000000000000000000000000000000000000000000060b0f151a1e2122252627262521211e1a14100b050000000000000000000000000000000000000000000000000000000000000000000000000000000000040a0f13191d20212427292b2c2c2c2b2a272421201d18130e171b1d1e202020202020181715110c06000000000000000000060c111517182020202020201f1e1c1810151a1f212226282a2b2c2c2c2b2a282522211e1a14100b0500000000000000000000000000000000040d151c2226292a2d2d2a2926221c150d0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003060712131313131311110e0b0601000000000000000000000000060a0e1011131313131313100f0d0a050000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130000000001080e13171a1a202020202020201b1a1814141717202020202020201e1d1a16110b040000000005101b26303a42494e50535353535353534b4a45494e50535353535353534b4a453f372d23180c010000000000000000000000000000000000000000000000000000000000040d151b212628292d2d2d2d2423211d17100800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714202c38444f5960636c6c6c6c6c6c6c65625a5047525c64676c6c6c6c6c6c6c6c5f574d42362a1e1205000c1925323f4c5865727f8b98a9b3bec9d5e1eaf4f9f8f3e9e0d5c9bdb2a8988b7f7265584c3f3225190c0013202d3946535f6c7679797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797974695d5144382b1f120013202d3946535f6c7679797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797974695d5144382b1f12000714202d3a46525e6976797979797979797976685e5246392d20130700000000000000000000000000000000000000000000000000000000000000000000000000000003090e121415181a1a19181514120e090300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001080d111314171b1d1e1f201f1f1d1b181413110d07010b0e10111313131313130b0b09050100000000000000000000000105090b0b13131313131312110f0c040a0f121415191b1d1f1f201f1f1d1b181514120e090300000000000000000000000000000000000000030a11161a1c1d20201d1c1a16110a030000000000000000000000000000000000000000000000000000000000000000000000000000000000020507080b0e111112131312110f0c0908060300000000000000000406070b0f1213131211100e0c0b09060100000000000000000000000000000000000000000000000000000406070a0d0f11121313131212100e0c09060603000000000000000000000000000000000000000000000000000000000000000000000000000000000000060c1012131f20202020201e1d1b17120c04000000000000000000040b11161a1d1e2020202020201d1c1916100a03000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201300000000000003070b0d0e131313131313130e0e0c08080a0b1313131313131311100e0a06000000000000000a141e2830383e4143464646464646463f3d3a3e4143464646464646463f3d3a342d241b11060000000000000000000000000000000000000000000000000000000000000d161f262d3235363939393931302d28221a12080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004101c27333d474f55566060606060606058565048404a52585a606060606060605f534d453b31261a0e0200091623303c4956636f7c8997a1adb9c4cfd9e2e8ebebe7e1d7cec6b9ada196887c6f6255493c2f22160900121e2b37434f5a646c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6962584d4135291c1000121e2b37434f5a646c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6962584d4135291c100005121e2a36424d575e6c6c6c6c6c6c6c6c6c6c5e564c41362a1d11050000000000000000000000000000000000000000000000000000000000000000000000000000000000020608080b0d0e0d0b0807050200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010407070b0e101212131312100e0b07060401000000020404060606060606000000000000000000000000000000000000000000060606060606050503000000020608080c0f111212131312100f0c080705020000000000000000000000000000000000000000000000050a0d0f101313100f0d0a05000000000000000000000000000000000000000000000000000000000000000000000000000000000003090e121415181b1d1e1f201f1f1d1b191515120f0a0401000000070c101313181c1e1f201f1e1d1b181815120d060000000000000000000000000000000000000000000001070c10131416191c1d1f1f20201f1e1d1b191613120f0b060000000000000000000000000000000000000000000000000000000000000000000000000000030a11171c1f202c2d2d2d2d2d2b2a27231d160e0600000000000000050d151c2227292a2d2d2d2d2d2d292926211c150d040000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030c161e262d3235363939393939393932312e3235363939393939393932312e29231b120900000000000000000000000000000000000000000000000000000000000008111f2831383e4243464646463e3d39342c241a1006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b16212c353d44484a535353535353534b4a453f3840474b4d535353535353534846423b33291f140900000613202d394653606c7885929ea9b3bdc7d0d8dddfdedcd7cfc6bcb2a89e9184776c605346392d201306000f1b27333e49525a5f60606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060605f5d5850463b3025190d000f1b27333e49525a5f60606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060605f5d5850463b3025190d00020e1a25303b454d525f60606060606060605f524c443a3025190d010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040a0f141a1e212125282a2b2c2c2c2b2a282622211f1b15110d08030b12181c1f2025292b2c2c2c2b2a272524221d18110901000000000000000000000000000000000000040a0f12181c1f202326282a2b2c2c2c2c2b2a282523201f1c17110f0a0300000000000000000000000000000000000000000000000000000000000000000000030c151c23282c2d3939393939393837332e2820180e040000000000040d171f272e3336373939393939393635322d261f160d0300000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201300000000000002070a0c0d131313130e0d0b080303070b0d0e131313130d0c0a06020000000000000000000000040c141b212628292d2d2d2d2d2d2d2524222628292d2d2d2d2d2d2d2524221d181109000000000000000000000000000000000000000000000000000000000000050f1a23313a42494e50535353534b49453e362c22170c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050f1a232c33383c3d464646464646463e3d3a342e363b3f40464646464646463b3a36312921170d03000006121f2b3844505b6673808c97a1abb5bdc5ccd2d2d2d1cbc4bcb4aaa0968c7f72655b5044372b1f1205000a16212c3740494f53535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535352514d463e342a1f1408000a16212c3740494f53535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535352514d463e342a1f1408000009141f29333b42464853535353535353535346413a32281e13080000000000000000000000000000000000000000000000000000000000030608091313131313120707050100000000000000000000000000000003060809131313131313131313131313131313131313131313131313130b0a080400000000000000000000000000000306131313131313131308070502000000000000000000000005080a0b13131313130e0d0b0803000000000000000000000306080913131313131313130603000000000000000000000000000004090c0e0f13131313131313130908060300000000000000000000000000000000000000000000000000000000020507081213131313131313100706040000000000000000000000000000000000060c161b1f252a2d2e31343738393939383735322f2e2b26201d19130c151d23282c2d32353839393838363432312e29231b130900000000000000000000000000000000040a0f161b1d23292c2d303335373839393939383635322f2d2b28221c1b150e090300000000000000000000000000000000000000000000000000000000000000000a151e262e34383a45464646464644433f39322a20160c01000000000b151f2931393f424446464646464643423e3831281f150a00000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130000000000070e1316191a202020201b1a18140f0e13171a1a20202020191916120d070000000000000000000000030a1015191c1d20202020202020181815191c1d20202020202020181815110c06000000000000000000000000000000000000000000000000000000000000000b16212b35424c545a5c60606060575550483e34281d11050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008111a21272c2f303939393939393932312e29242a2f3334393939393939392e2d2a261f170f06000000030f1c28333f4a54606d79859199a3abb3bbc0c4c5c5c4bfbab2aaa2989184796d6053493f33271b0f030005101b252e373e434646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464644413b342c22180d020005101b252e373e434646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464644413b342c22180d020000020d17212930363a3b4646464646464646463936302820160c02000000000000000000000000000000000000000000000000000000040a0f12151520202020201f1413110d08020000000000000000000000040a0f12151520202020202020202020202020202020202020202020202020171714110c0500000000000000000000060c101220202020202020201514120e090200000000000000060c1114171820202020201b1a18140f0801000000000000040a0f131516202020202020202012100c060000000000000000000002090f15191b1c20202020202020201615130f0a0400000000000000000000000000000000000000000000000002090e1114141f202020202020201d1312100c0700000000000000000000000000030a111720272b31363a3b3e4144444546464544423f3c3b37322c29241e191e272e34383a3e42454646454443413f3d3a342d251b11060000000000000000000000000000060b151b21272c2f34383a3d40424445464646454543413f3c3938332d2b26201a150b0600000000000000000000000000000000000000000000000000000000000006111c2630383f4446525353535353514f4b443c32281d120600000006111c27313b434a4f51535353535353504e49423a31261c1005000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013000000010a12191f2325262d2d2d2d282724201a1a1f2426272d2d2d2d2625231e19120a01000000000000000000000005090d0f10131313131313130c0b090d0f10131313131313130c0b0905010000000000000000000000000000000000000000000000000000000000000004101c27333d47545e66696c6c6c6c64615a5045392d2114080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080f161c2023232d2d2d2d2d2d2d2524211d191f2326272d2d2d2d2d2d2d22211e1a140d0600000000000b17222d3845515d67707d879299a2aaafb6b7b8b8b7b4aea8a19892867c6f665c5141382d22170b00000009131c252c3337393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393835302a221a100600000009131c252c3337393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393835302a221a100600000000050f171f252a2d2e39393939393939392e2d2a251e160e05000000000000000000000000000000000000000000000000000000060e151b1f21222c2d2d2d2d2c21201d19130c04000000000000000000060e151b1f21222d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2423211c17100800000000000000030a11171c1f2d2d2d2d2d2d2d2d21201e1a140d0500000000000810171d2123242d2d2d2d2d272724201a130b0200000000070f151b1f22222d2d2d2d2d2d2d2d1f1c17110a0300000000000000030c141b202528282d2d2d2d2d2d2d2c22211f1b150e0700000000000000000000000000000000000000000000050d141a1e20212c2d2d2d2d2d2d2d2a201f1c18120b0300000000000000000000030c151c232832373b4246484b4e505152535252504e4c4847433c39352f28222b30394045464b4f5152535251504e4b4a463f372d23180d010000000000000000000000020a111720262b323839404547494c4f50525253535251504e4c4946443f3837312b262017110a02000000000000000000000000000000000000000000000000000000000c17232e38424a50535f60606060605e5c564e44392e23170b0000000a16222e39434d555b5d6060606060605c5a544c42382d21160a000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130000000a131c242a2f3233393939393433302b25242b3033343939393933322f2a231c130a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714202c38444f5966707679797979716c6155493d3023170a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050b1014161720202020202020181715110e1317191a202020202020201514120e090300000000000006111c2935404b55606b717e8792989fa4acabacabaaaaa39f9691867d706a5f544b402f261b1106000000010a131b21272b2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2c2b29251f18100800000000010a131b21272b2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2c2b29251f181008000000000000050d141a1e20212d2d2d2d2d2d2d2d21201d19130c0500000000000000000000000000000000000000000000000000000006101820262b2e2f3939393939382e2d29251e160e040000000000000006101820262b2e2f3939393939393939393939393939393939393939393939393931302d28221a12080000000000030c151c23282c39393939393939392e2d2a251f170f0500000008121a22282d303139393939393433302b251d140b00000007101920272b2e2f39393939393939392c28231c150c030000000000020c151e252c31343539393939393939392f2e2b26201810070000000000000000000000000000000000000000050e171f252a2d2e3939393939393939372d2c28231c150c030000000000000000030d151e262e343d43474d5354585b5d5e5f5f5f5e5d5b5955534e4745413a3129343c424b5153585c5e5f5f5f5e5d5a585651493f34291d120600000000000000000000040b141c222832373d43484b515356595b5d5e5f5f5f5f5e5d5b585653504a47433c373127221b140b03000000000000000000000000000000000000000000000000000003101c28343f4a545c606c6c6c6c6c6c6b6760564b3f33271b0e0000010e1a27333f4a555f676a6c6c6c6c6c6c69665e54493e3226190d010000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013000007121c252e353b3f404646464641403c362f2f363c3f4146464646403e3b352e251c0e0500000000000000000000060a0e1011121313131212100e0b07070501000000000000000000000000000000000000020507081313131313131313070705010000000000000000000916222f3c4854606b7682868686867e7164574b3e3124180b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000407090a131313131313130b0b090502070b0d0d13131313131313080705020000000000000000000d18242f3a434f59626c717d858e939a9c9e9f9f9d9c98928d847c706b61584e42392e1d140a0000000000010910161b1e2020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020201f1f1c19140d06000000000000010910161b1e2020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020201f1f1c19140d06000000000000000002090e12141520202020202020201413110d0802000000000000000000000000000000000000000000000000000000040e18222a31373a3c4646464646453a3935302820160c020000000000040e18222a32373b3c464646464646464646464646464646464646464646464646463e3c39332c241a1005000000000a151e262e343846464646464646463b3a36302921170d020006101a242c34393d3e464646464641403c362f261d0d0300040f19222b32373b3c464646464646464638342e261e150a000000000009141e2730373d414246464646464646463c3b37322a22180d03000000000000000000000000000000000000020b17202930363a3b4546464646464646433a38342e271e150b00000000000000010b151f2730383f444e54575e6164676a6b6c6c6c6b6a6865625f5854524c433f353c464e545c6065686b6c6c6b6b696765625b51463a2e221509000000000000000000040d161d262d333c43474f54555c606366686a6b6c6c6c6c6b69686562605b54534e47423c332d261d150d030000000000000000000000000000000000000000000000000006121f2c3844505c666d7879797979797772675c4f43372a1d11000003101d2936424f5b6771777979797979797670665a4e4235291c0f030000000000000000000000000000000203101d2a3643505d69768390908376695d5043362a1d100302000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201300020e19242e3740474b4d535353534e4c4841383840474c4d535353534c4b4640372e20170d0200000000000000040b11161a1d1e1f2020201f1e1d1b181413110d0802000000000000000000000000000002090e12141520202020202020201413110d080200000000000006131f2b37434e5863707d8994998f82766c6155493d3023170a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007131d28313d47505a626b707b81878c8f919292918f8b86807a6f6a61594f463c30271d0b0200000000000000050a0f121313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131312100d0802000000000000000000050a0f121313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131312100d080200000000000000000000000205070813131313131313130707050100000000000000000000000000000000000000000000000000000000000a15202a343c4347485353535353524746413a32281e130800000000000a15202a343c434748535353535353535353535353535353535353535353535353534a49453e362c22170c00000006111c2630383f4453535353535353534846423b33291f1409000c17222c363e45494b53535353534e4c4841382f1f150b010a15202b343c4347495353535353535353443f3830261c1106000000040f1b25303942484d4f53535353535353534947433c342a1f150b0100000000000000000000000000000000000a141d29333b4246475253535353535353504644403930271c120700000000000007121d273139424a50586062696e71747777787979787775726f6a66605d56504540454e5860666d717578797978777674726d62564a3d3124180b0000000000000000030c161f282f383f444e54596063676d707375777879797978787674726f6c66625f58534d443f382f271f150d030000000000000000000000000000000000000000000000000713202d3a4653606d7886868686868684776b5e5144382b1e11000004111e2a3744515d6a77838686868686868276695c504336291d100300000000000000000000000000050a0f12101d2a3643505d69768390908376695d5043362a1d10120f0a0500000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130007131f2a354049525759606060605b58534a41404a52585a60606060595751494032291e1408000000000000050e161c2227292a2c2c2d2c2c2b29282521201d19130f0a030000000000000000000000050d141a1e20212d2d2d2d2d2d2d2d21201d19130c0500000000000815212e3b47535f6a7683909d92867b6e615a5045392d211408000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010c161f2b353f48505961696e757b7f8384858584827e7b736d6860584f473e342a1e150b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1b26313c464e53555f606060605f54524c443a3025190c03000000030f1b26323c464e535560606060606060606060606060606060606060606060606060575550483e33281c110400000c17232e38424a505f606060606060605f524d453b30251a0e05111d28343e4850555760606060605a58534a4131271d12070f1b27323c464e5455606060606060605f504a42382e23170c0000000915202c37424b53595b606060606060605f55534e463c31271d12070000000000000000000000000000000006111b262f3b454d52545f606060606060605d53514a42392e23180c0000000000020c18242f39434b545c606a6f757b7e8183848586858583817f7c78726d68625a514b4d57606a6f797e82848586858483817f7265584b3f3225180c00000000000000000b151e283139424a50585f626b6f75797d7f828385858686858483817f7c79746f6a625f575049413931271f150b010000000000000000000000000000000000000000000000091623303c4956636f7c89989393938d8174675a4e4134271b0e000004111e2a3744515d6a778490939393938f8376695c504336291d10030000000000000000000000010910161b1e20202a3643505d69768390908376695d5043362a20201e1b161009010000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013000a16232f3b47525c63666c6c6c6c67645c534547525c64676c6c6c6c66635b51443b3025190e0100000000040e1720272e3336373939393939383634312e2d2a251e1a150e06000000000000000000050f171f252a2d2e39393939393939392e2d2a251e160e05000000000916222f3c4955626f7c88959b8e8174695f53483e34281d110500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040d19232d363f474f575f61696e72767879787775726e69615e564e463e352c22190c0300000000000000000005090d0f101313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313130f0f0d09040000000000000000000000000205070813131313131311100e0b0600000407090a1313131313130e0d0b0803000000000000000000000001070c0f11121313131313070705010000000000000000000000000105090b0b13131313100f0d09050000000000000000000000000000000000000000000000000006121f2b37434e585f626c6c6c6c6c6b615e564c4135291e150b00000006121f2b37434e585f626c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c64615a5045392d2114080003101c28343f4a545c6c6c6c6c6c6c6c6c6c5e574d42362a1e120814212d3945505a61646c6c6c6c6c67645c5343392f23180c131f2b37434e5860626c6c6c6c6c6c6c6c5c544a3f34281c100300000c1925313d48535d65686c6c6c6c6c6c6c6c625f584e43392f24180e050000000000000000000000000000030c17222d38414d575e616c6c6c6c6c6c6c6c6a605c544a4034281c1004000000000a141e2935404b555d666d747c82878b8e909192929291908e8c88847f7a716d605d55535f696f7c848b8f9192929291908d86796c605346392d20130000000000000007121d273039434b545b606a6f767c8185898c8e90919292929291908e8b8985817c756e69605b534b433931271d12070000000000000000000000000000000000000000000004111d2935414c566673808c99aaa3998a7d7064574a3d3124170a000004111e2a3744515d6a7784909d9f9f9c8f8376695c504336291d100300000000000000000000010a131b21272b2d2d2d3643505d69768390908376695d5043362d2d2d2b27211b130a0100000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013000c1925323f4b57636e7379797979746f64574d4c58646e7479797979736d63564c41362a1d1207000000000b16202932393f434445464646454543413e3a3936302b2620180f0900000000000000020d17212930363a3b4646464646464646463936302820160c02000005121e2a36424d576673808d9994887c6f62574d42362c22170c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007111b242d353e454d53575f6266696b6c6c6a6965615e56524c443d342c231a10070000000000000000020a1015191c1c2020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020201c1b1915100902000000000000000002080e1114142020202020201e1d1a17110b0b101316162020202020201b1a18140f08010000000000000000050c12181b1e1f20202020201413110d0802000000000000000000060c11151718202020201c1c1915100a0200000000000000000000000000000000000000000000000815212e3a47535f6a6f7979797979786d685e52463d30271c120700000815212e3b47535f6a7679797979797979797979797979797979797979797979797979716c6155493c3023170a0006121f2c3844505c66767979797979797976695e52463a2d20140a1723303d4955616c717979797979746e64554b4034291c1015222e3b4754606a767979797979797976665c5044382c1f120600020e1b2834414d59656f7579797979797979796f6a5f554b40352920170b02000000000000000000000000000b151e27333f49535e696e7879797979797979766d665c5144382c1f120600000006111c26303845515d676d7880898f93999a9d9e9f9f9f9e9d9b9896918c857e756d675d58626e7b8691969b9e9f9f9e9e9c9386796c605346392d2013000000000000040d18232e39434b555d666c737c83898e9298999b9d9e9f9f9f9f9e9c9b9897918d88827b736c655d554b43392f24180e050000000000000000000000000000000000000000000713202c3945525d687683909da99f92867a6d6054473a2d211407000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000009131c252c33373939393943505d69768390908376695d50433939393937332c251c130900000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013000d1a2633404d59667380868686868174695f534d5a677480868686867f73685e5246392f23180c00000006111c27323b434a4f51525353535251504e4b4746413a37312a221b120900000000000009141f29333b42464853535353535353535346413a32281e130800000714212d3a46535e697884919c8f82766a5f53453c31241a10060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009121b232c333b42464d5355595c5e5f5f5e5c5854524d46413a322b221a11080000000000000000040c141b212528292d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d292825211b140c03000000000000050d14191e20212d2d2d2d2d2d2a2a27221d16161b2022232d2d2d2d2d2d272724201a130b02000000000000060f171e23282a2b2d2d2d2d2d21201d19130c04000000000000000911181d2124252d2d2d2d292826211b140c04000000000000000000000000000000000000000000000915222f3c4855626f7c8786868686857a6d61594f42392e23180c03000915222f3c4855626f7c868686868686868686868686868686868686868686868686867e7164574a3e3124170b000713202d3a4653606d78868686868686867b6e6154483b2e2115121e2a36424d5764717e86868686868074675c5145382c1f1416222f3c4955626f7c86868686868686786d6053463a2d20130700020f1c2835424f5b68758286868686868686867c6f675d51453e32291d140a00000000000000000000000007121d27303944505b656e7b858686868686868683796d6053463a2d2013070000000b17232e3842505a606d79828d929b9fa4ababa39f9d9c9b9c9d9fa19e97928b82796d685f6a76828f98a1a8aaa39f9995949386796c605346392d20130000000000010c161f2834404b555d676d78808790949b9fa2a9a29e9c9b9a9a9b9d9fa3a9a19e9a948f877f776d675d554b40352920170d0200000000000000000000000000000000000000000714212d3a4754606d7a86939fa99c908376675d5145392c201306000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d100300000000000000000005101b252e373e434646464646505d69768390908376695d504646464646433e372e251b1005000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013000714202d3a4753606d7984919392877b6e62564c54606d7a85919392867a6e61554b4034291c100400000a16222e39434d555b5d5f5f605f5f5e5c5b5854524c47433c342d241b110800000000020e1a25303b454d525f60606060606060605f524c443a3025190d01000815212e3b4854616e7b8796988c7f7265584e433b33291f1409000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009111a212931363c4247484c50515252514f4b4746423b363028201910080000000000000000020c161e262c3235363939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393635312c261e150c0200000000050e171e252a2d2e3939393939393736332e272021272c2f303939393939393433302b251d140b0100000000050f1821292f3437383939393939392d29241e160e04000000000009121b22292e3132393939393635322d261e160c000000000000000000000000000000000000000000000815212e3a47535f6a73808d9693978e81746b60544a4034281f1409000916232f3c4956626f7c8993939393939393939393939393939393939393939393938a7d7164574a3e3124170b000713202d3a4653606d79869393939393877b6e6154483b2e211514212d3a46535e6976828f9393939285796d6053473b30251a16222f3c4955626f7c88939393939386796d6053463a2d20130700000714212d3a4754606d7a849199939393999183796d605a50443b2f261b110600000000000000000000040d18232e39424e58606c77828f979393939392867b6e665c5144382c1f1206000003101c28343f4a54616c74818e949da4aca7a09d9992908f8f8f9192999a9e9f948f837a6d666f7c88949faaaea398928c88878886796c605346392d2013000000000008131e28313a45515c676d79828d92999fa6a39f9a97928f8e8d8e8e9092989b9fa3a69e99928c82796d675d51453f32291e140800000000000000000000000000000000000000000b1724313e4a5764717d8a99a4a9998c7f7366554b4135291d1104000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000a16212c3740494f5353535353535d69768390908376695d5353535353534f4940372c21160a000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130006131f2c3845515c67707d8a95998e8175685e52515d67717e8a96988d8073675c5145382c1f130600000e1a27333f4a555f676a6c6c6c6c6c6b696764615e56534e463e362d23190b0200000005121e2a36424d575e6c6c6c6c6c6c6c6c6c6c5e564c41362a1d1105000a1724313d4a5764707d8a9798887b6e6255524d453b30251a0e020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080f171f262a31373a3b3f4345464544423f3b3a36302a251e160e070000000000000000000a141e2830383d414346464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464642413d3730271e1409000000020d1720293036393b46464646464644433f3932292b32383b3d46464646464641403c362f261d1308000000010c17212a333a4044454646464646463935302820160c0200000006111b242d343a3d3e4646464643413e3830281e110700000000000000000000000000000000000000000006121f2b37434e58606d7984919e9f93887d6f665c51443b31261a0d04091623303c4956636f7c89969f9fa8a19e9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c978a7d7164574a3e3124170b000713202d3a4653606d7986939f9f9f94877b6e6154483b2e21151b27333f4953616e7b87939f9fa2978a7e7164574d42362a1e16222f3c4955626f7c88959f9f9f9386796d6053463a2d20130700000613202c3945525d686f7c87929fa69fa0958d81746c61564d41382d22170d030000000000000000010c161f2834404b545f6a727f8b949fa9a89e938b7e71695f544a4034281c1004000006121f2b3844505c66717e8b939ea6aea59d95908a86838282838486898d92979f959083786d73808d99a6b0a89f9286807c7a7b7d7063574a3d3024170a00000000010d19242f3a43505a606d79828f949fa3a7a099928e898583818181828386898e92999fa7a39f948f82796d605b51443b3025190e0200000000000000000000000000000000000006121e2b37424d576774818e9aaba297897c6f6256493c2f24180d01000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000f1b27333e49525a5f60606060606069768390908376696060606060605f5a52493e33271b0f000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130004101c2934404b55616b7683909d92867a6d61544c55606c7884919d9285796d6053473a2d2014070000101d2936434f5b6771777879797978787674716d68625f5850483e352b1d140a0000000714202d3a46525e6976797979797979797976685e5246392d201307000c1926333f4c5966727f8c999285796a63615e574d42362a1e1105000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060d141a20262b2e2f33363839393736322e2d2a251f19130c0500000000000000000005101b26303a42494e4f5353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353534f4d49423930261b1004000008141e29323b414653535353535353514f4a443b32353d4448495353535353534e4c4841382f251a0f03000007121e29333c454b505253535353535346413a32281e13080000010c18222d363f454a4b535353534f4e49423a3023190f050000000000000000000000000000000000000000030f1b26313c45515d67707d8a939e9a9183786d60574d42362a1f160c0a1623303d495663707c899aa4aca196918f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8a7d7164574a3e3124170b000713202d3a4653606d798693a0aca194877b6e6154483b2e21151f2b3744505b65737f8c99a4afa99c8f8276695e52463a2d2016222f3c4955626f7c8895a2aca09386796d6053463a2d201307000004111d2935414c56606a727f8c949ea8a89d928a7d70695e53493f33271f150b010000000000000008131e28313a45515c666f7c86929fa6aba1968e81756c62574d42392e23180c0000000713202d3a4653606d7884919ea5afa69d938e837d797776757677797c80858c9298958e81747683909ca9aca0958a7e736f6e6e706b6155483c2f2316090000000004111d2935414c56616c74818e949ea6a69f959087817c79767474747577797d818790959ea5a69e948e81756d62564c41362a1e14080000000000000000000000000000000000000814212e3a47535f697884919eab9e9285796c605346392d20130700000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000000000000000121e2b37434f5a646c6c6c6c6c6c6c6c7683909083766c6c6c6c6c6c6c6c645a4f43372b1e12000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201300000c18232f39434f5964717e8a97998b7f7265554b505b65727e8b97978a7d7164574a3e2f24180c0000111e2a3744515d6a778385868686858483817e7a756e6a615a50473d2f261b110600000815212e3b4854616e7b86868686868686867a6d6154473a2e211407000e1a2734414d5a6774808d9a91847770706e695e52463a2d2014070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003090e151a1e212226292b2c2c2b292521201e19140d0802000000000000000000000915212c38424c545a5c6060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060605c5a544c42372c21150900020e1925303b444c525f6060606060605d5b554d44393d474f54566060606060605a58534a41362b20140800000c18232f3a454e575c5e60606060605f524c443a3024190d010005111d29343f48505658606060605c5a544c42352b21160b0000000000000000000000000000000000000000000a15202935404b55616b75818e98a0958c7f72695f53463e31281e130815222f3b4855626e7b87939fa99e91848383838383838383838383838383838383827d706356493d3023160a000713202d3a4653606d798693a0aca194877b6e6154483b2e2115202d394653606c7884919eabb5ac9f93877b6e6154473d32271b222f3c4955626f7c8895a2aca09386796d6053463a2d2013070000010d19242f3a434e58606c77828f96a1aba49e92857b6e655b50443c31271d1207000000000000050e19242f3a434f59606d79839098a3aea39991847a6d605a50453c30271c12070000000b1824313e4b5764717e8a96a0acac9f948e8179716d67696869676d70747a7f869095938a7e7885929fabaa9d9184776c6261616361594f44382c201407000000000613202c3945525d68717e8a939da6a89f948f837c746f6c6668676768666d70757c838f939ea7a69e938b7f72685e52463b3025190d0100000000000000000000000000000000000815222f3b4855626e7b8896a1a89b8e8275665b5044382b1f120600000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d100300000000000000000013202d3946535f6c767979797979797979839090837979797979797979766c5f5346392d2013000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013000007121d27313e4653606d7984919c908376675d514953606d7985929b8e817468554b4035291d100400121f2c3945525f6c78859292999292918f8e8b87827c716c61594f41382d22170b00000815212e3b4854616e7b87939393939393877a6d6154473a2e211407000f1b2835424e5b6875818e9b91847d7d7d7b6e6154473b2e21140800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003090e121415191d1e1f1f1e1c181414110e09020000000000000000000000000d1925323d49545e66696c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c69655e54493d3125190d0005111e2a36414c565e6c6c6c6c6c6c6c6a675f554a3f444f5960636c6c6c6c6c6c67645c53483c3024180b00030f1b2834404b5760686b6c6c6c6c6c6c5d564c4135291d1105000915212e3a45505a62656c6c6c6c69665e54473d33271c10040000000000000000000000000000000000000000040c18242f39434f59616e7b85929f9f92867b6e615a50433a2f24190c14212e3a47535f6975818e97a29d9084787676767676767676767676767676767676706b6054483b2f221609000713202d3a4653606d798693a0aca194877b6e6154483b2e211d2935414c5563707d8996a0acacafa4998c7f7266584e43382c1d222f3c4955626f7c8895a2aca09386796d6053463a2d20130700000008131e28313d44505b656d7a849199a3ada1978f82776c60584e43392f24180e0500000000020b17202935414c56606b73808d95a0aaa69f92877d6f685d52483e332a1e150b00000005121e2a36424d576875818e9ba8afa49a8f82786d66605d555c555c6063676d727b838f9391857b8797a2ada79a8d8074675a545557554f473e33281c100400000004111d2935414c55606d7a85929ea5aca0968f82796e6a62605b545a5b545c60636a6e78818f959faba59f92857a6e61564c41362a1e11050000000000000000000000000000000003101c28343f4a5465727f8b98a8a7988b7e7165544a3f33281c0f0300000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d100300000000000000000013202d394653606c798686868686868686909494908686868686868686796c605346392d2013000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013000008121d262c3844505c6674818e9b92867a6d605347515d6775828f9b918477675d5145392c1f130600121f2c3945525f6c7885929493939496999a99938e867e716b6053493f33271b0f03000815212e3b4854616e7b87949f9f9f9f94877a6d6154473a2e211407000f1c2936424f5c6975828f9c95918989897e7265584b3f3225180c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020608080c10121312110f0c0807050200000000000000000000000000000f1c2835414e5a6670767979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797570655a4d4135281b0f000714202d3946525e68767979797979797771675b4f434854606b70797979797979746e64584c4033271a0d0004111e2a3744505c687278797979797976685d5246392d201307000b1724313d4a56626d7179797979767066594f44382c20150a00000000000000000000000000000000000000000007121d27313e46525e69727f8b959f988f82756c61554c4135291e14121e2b37424d57616e7b85929fa0958c80736c6969696969696969696969696969696360594f44382c201307000713202d3a4653606d798693a0aca194877b6e6154483b2e21202c3945515d6775818e9ba8a39fa3ab9d9184776a605448392f24222f3c4955626f7c8895a2aca09386796d6053463a2d201307000000010c161f27333f49535e686f7d87929fa6a99f948c7f726a5f554b40352920170b020000000a141d29333b45525d68707d87939fa7aa9f948c80736b60564c41362d21180c030000000714202d3a46525e697885919eabac9f93877c6f665c54514b4f4b5153555d60696e79818f949083909da9b3a4988b7e7165584b484a48443e352c21160b000000000613202c3945515d6773808d97a1ada69e91847a6d675f5853504a4e4e4b5153585f666d79839099a3ada2978d8174685e5246392d2014090000000000000000000000000000000006121f2c3844505c6675828f9ba8a095877b6e6154483b2d22170b0000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d100300000000000000000013202d394653606c7986939393939393939c9f9f9c9393939393939386796c605346392d2013000b1825323e4b5865717e8b98a4aca295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201300030e19242f3840474a5464717e8a9799897c6f6256494b5565727e8b9893867a6d6053473a2d20140700121f2c3945525f6c78858887868787898d92979f9892887d70655b5044372b1f1205000815212e3b4854616e7b8794a1acaca094877a6d6154473a2e21140700101c2936434f5c6976828f9ca09d96968b7e7265584b3f3225180c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101c2936434f5c6976828686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868275695c4f4236291c0f000814212e3b4754616e7a86868686868683776a5d5144495663707d8686868686868074675a4e4134271b0e0005121f2b3845525e6b788586868686867a6d6154473a2e211407000b1825323e4b5865717e8686868682766b6054483c32261b0f030000000000000000000000000000000000000000010b151f2a36424d56606c788390999e948a7e71675d51453c30261c111a26313c46525e68717e8a929c9f93887e716c605b535c5c5c5c5c5c5c5c5c5c5c56544f473d32271b1003000713202d3a4653606d798693a0aca194877b6e6154483b2e21212d3a4754606d7a86929fa3999299a3a096897c6f62554b403529222f3c4955626f7c8895a2aca09386796d6053463a2d20130700000000040d17222d38414c56606b737f8c949fa9a69f92867c6f675d51453e33291d140a000006111b262f3b45505a606d7a849199a4aea2989083786d60594f443a2f241b0f06000000000815212e3b4854616e7b8797a1adaa9d9083776a5f544b4540424045474b51575f676d78828f9590959fabb0a3968a7d7063574a3d3d3c38332c231a1005000000000714212d3a4754606d7a85929fa9aa9e94897d70685d554e46443f41414045464e545c676f7c87929faca99f92867a6e6154473c31261a0e020000000000000000000000000000000713202d3a4653606d7985929faa9d918477695e52463a2d1c11060000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d100300000000000000000013202d394653606c798689898989898989909595908989898989898986796c605346392d2013000b1825323e4b5865717e8b989f9f9f95897c6f6256493c2f23160900000d1a2733404d5a6673808d999f9f9f9386796d6053463a2d201307000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130007131f2b36404a52585a616e7b879a978a7e71645753595b626f7b889599887c6f6255493c2f221609000916232f3c4956626f7c7b7a7a7a7b7d808590959f9a9184796c605346392d201306000815212e3b4854616e7b8794a1aeada094877a6d6154473a2e21140700101d293643505c6976838f9ca9aaa3988b7e7265584b3f3225180c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101c2936434f5c6976828f939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393938f8275695c4f4236291c0f000814212e3b4754616e7a87939393939084776a5d5144495663707c89939393938d8174675a4e4134271b0e0004101d2935404b556c788592939393877b6e6154483b2e211508000613202d394653606c7883909994897d7063584e43372b1f1306000000000000000000000000000000000000000000030d1925303b44505b666f7c87929f9e91847a6d60584e42382e231715202a36414d56616c73808d939d9a92877e736c655d554e5050505050505050504948443d352b21160b00000713202d3a4653606d798693a0aca194877b6e6154483b2e212b37434e5865717e8b98a29f9286929fa89a8e8174675d5145382c222f3c4955626f7c8895a2aca09386796d6053463a2d201307000000000006111b262f3a444f59606c77828f97a1aba3999184796d605a50453b2f261b1106030c17222d38414d57616c75818e96a1aba59f92857b6e665c50473d32281e120900000000000916222f3c4955626f7c8895a9b3a79a8d817467584e4239352f34383a40454d555c666d7a85919d9fa7b1afa396897c706356493d302f2c28211a11080000000005111e2a36424d5765727f8b98a2aea99c8f82756b60564c433c38332d2e34383c424b555f6a74818e9ba8aea3988c7f7266574d42372b1e1205000000000000000000000000000000091623303c4956636f7c8998a2aa9a8d807467574d42362a1e0a000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000a1723303d4a5663707d7d7d7d7d7d7d7d839090837d7d7d7d7d7d7d7d7063564a3d3023170a000b1825323e4b5865717e8b9393939393897c6f6256493c2f23160900000d1a2733404d5a6673808d939393939386796d6053463a2d201307000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013000b1723303c47525c64676c6d798693998c7f7266595d64686c6d7a8799978a7d7164574a3e3124170b000815222e3b4754606a6f6e6d6d6d6e70737a83909da096897c6f6356493c30231609000815212e3b4854616e7b8794a1acaca094877a6d6154473a2e21140700101d293643505c6976838f9ca9b1a5988b7e7265584b3f3225180c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101c2936434f5c6976828f929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292928f8275695c4f4236291c0f000814212e3b4754616e7a87949f9f9d9084776a5d5144495663707c89969f9f9a8d8174675a4e4134271b0e0006131f2c3945515d677986939f9f95887b6e6255483b2f2215080005121f2b3744505b656f7c87939d9083766a5f53473b2e2115090000000000000000000000000000000000000000000009141f28333f4a545f6a74808d96a1978d80746a60544a3f34281f141925303b44505a606c77818e939c99928b80776d675f585045414343434343433d3b38322b23190f0400000713202d3a4653606d798693a0aca194877b6e6154483b2e212e3a47535f6a7683909daa9b8e828e97a19f9285796d6053473b30252f3c4955626f7c8895a2aca09386796d6053463a2d2013070000000000000a141d28323d44505b656d7a859199a4aba0968e81746c61574d41382d22170d0b151e27333f49535e69717e8a939ea8a89e938a7e71695e544a3f352b20160c0000000000000a1723303d4a5663707d8996a3b0a6998c7f7366594c402f2924292c2f353b434b545d68707d8a959fabb7afa396897c706356493d3023201c16100800000000000714202d3a46525e697683909daaada196897d7063594f433a312b282223282c3039434e58626f7c8895a0acaa9d908477695f53463a2d211407000000000000000000000000000004111d2935414c566673808c99aaa3988a7d7063574a3d30251a0e000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000916222f3c4854606b70707070707070768390908376707070707070706b6054483c2f221609000b1825323e4b5865717e868686868686867c6f6256493c2f23160900000d1a2733404d5a66738086868686868686786d6053463a2d201307000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013000d1a26333f4c58646e7479797985929a8d8073675a646f747979778692988b7e7165584b3e3225180b0006131f2b38434e586062616160606163686f7c8899a4988b7e7265584b3f3225180c000815212e3b4854616e7b87949f9f9f9f94877a6d6154473a2e21140700101d293643505c6976838f9ca9aca5988b7e7265584b3f3225180c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f1c2935424f5c6875828585858585858585858585858585858585858585858585858585858585858585858585858585858585858585858585858275685b4f4235281c0f000814212e3b4754616e7a8794a1aa9d9084776a5d5144495663707c8996a3a79a8d8174675a4e4134271b0e000714202d3a4753606d7a8699a4a295897c6f6256493c2f23160900030f1b27333f49535f6a75828f9b95887c6f6255493c31261a0e02000000000000000000000000000000000000000000020b17222d38424e58606d7984919e9f93877c6f665c50443b30251a141f29323e44505b656c78818d929f9f928c81796f6a625a514c433c34363636302f2c27211911070000000713202d3a4653606d798693a0aca194877b6e6154483b2e28343f4a54626e7b88959fa398897d85919ea2988a7e7164574d42362a2f3c4955626f7c8895a2aca09386796d6053463a2d201307000000000000020b162027333f49535e68707d87939fa6a89d928a7e70695e53493f33271f15121d27303944505b656e7b85929fa5aba0968e81746c61574d42382e23190d040000000000000a1724313d4a5764707d8a97a3b0a5988c7f7265594c3f2e23181c1f24293139424c56616c7683909da9b3afa396897c706356493d302316100b050000000000000814212e3b4754616e7b87959fabab9e9184786c6053463d31281f1c17181c1f27313c47535f6a7784919daaaca095887b6e6155483b2e22150600000000000000000000000000000713202c3945525d687683909da99f92867a6d6053473a2d201409000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000713202c38444f5960636363636363697683909083766963636363636360594f44382c201307000b1724313d4a56626c71797979797979796f6a6054473b2e22150800000c1926323f4b58636e737979797979797976665c5044382c1f1206000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013000e1a2734414d5a67748086868689979a8d8174675b6874818686868999988b7f7265584c3f3225190c00030f1b27323d464e5456555453545456606c7986939f998c807366594d4033261a0d000815212e3b4854616e7b87939393939393877a6d6154473a2e21140700101d293643505c6976838f9c9f9f9f988b7e7265584b3f3225180c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e1b2834414d59656f75797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979756f65594d4134271b0e000814212e3b4754616e7a8794a1a99d9084776a5d5144495663707c8996a3a79a8d8174675a4e4134271b0e000714212e3a4754616d7a8794a0a396897c706356493d3023160a00000b17222d38414e58636f7c89959a8d807367574d42362a1e12050000000000000000000000000000000000000000000006111c262f3c45515d67707d8a949e999083786d60574d42362a1f15172027333f49535b666c74808b92989c938f847c716c605d554e463e362e292322201b160f07000000000713202d3a4653606d798693a0aca194877b6e6154483b2e2c3844505c6673808d9aa79f928679818e9baa9c8f8276695e52463a2d2f3c4955626f7c8895a2aca09386796d6053463a2d20130700000000000000040e17222d38414c56606b73808c949fa9a59e92857b6e655b50443c31271d18232e39424e58606c77828f97a2ada3999184796d605a50453b30261c1007000000000000000a1723303d4a5663707d8996abb5a6998d807366544a403428211e1a181f27303a44505a64707d8a97a2adafa396897c706356493d3023160a00000000000000000b1824313e4b5764717e8a97a7b1a79a8e8174665b5044382b1f160f0b0c10151f2b37434e586773808d9aa6b1a7988b7e7165584b3e2d22170b00000000000000000000000000000714212d3a4754606d7a86929fa99c8f8276675d5145392c1f1306000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d100300000000000000000004101c27333d474f5456565656565d69768390908376695d5656565656544f473d33271c1004000915212e3a45505a62656c6c6c6c6c6c6c6260584e43382b1f130600000a17232f3b47525c63666c6c6c6c6c6c6c6c5c544a3f34281c1003000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013000e1a2734414d5a6774808d939393a19a8e8174675b6874818e939394a3998c7f7366594c403326190d00000a162027333f49535b606060606062666e7b8799a4988c7f7265594c3f3226190c000815212e3b4854616e7b86868686868686867a6d6154473a2e21140700101d293643505c6976828f93939393938b7e7265584b3f3225180c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1925313d49545d65686c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c68655d53483d3125180c000814212e3b4754616e7a87949c9c9c9084776a5d5144495663707c89969c9c9a8d8174675a4e4134271b0e000815222e3b4855616e7b8894a1a3978a7d7064574a3d3124170a000006111b262f3c4854606b7783909d918478695f53463a2d21140700000000000000000000000000000000000000000000000a141d2935414b55616c75828f98a0958b7f72695e52463e31271d1217222d38414a545b606e737e8691969e9691867e756d675f58504840372e261c13100b0400000000000713202d3a4653606d798693a0aca194877b6e6154483b2e2d3a4653606d7985919ea99c8f82767e8a99a39f93877b6e6154483d322f3c4955626f7c8895a2aca09386796d6053463a2d201307000000000000000006111b262f3a444f59606d78828f97a1aca1978f82776c60584e43392f241f2834404b545f6a727f8c949fa9a69f92877c6f675d51483e33291e140a00000000000000000915222f3c4855626f7b8899a3afa89b8f8275665c51443a322d2b2627272628323e4653606d7985929fabafa396897c706356493d3023160a00000000000000010e1b2834414e5b6774818e9aa7b4aa978a7e7164544a3f3328190d040000040d1b26323d4a5764707d8a97aab4a79b8e81746853493f33271b0f03000000000000000000000000000b1724313e4a5764717d8a99a3a9988c7f7265554b4035291d1004000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000000000000000000b16212b353d44484a4a4a4a505d69768390908376695d504a4a4a4a48443d352b21160b000005111d29343f485056586060606060606056544e463d32271b0f03000007131f2a36404a52585a606060606060605f504a42382e23170c00000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013000e1a2734414d5a6774808d9a9fa0a79b8e8174685b6874818e9b9fa0a6998c807366594d4033261a0d000005121f2b3744505b656c6d6c6c6d6f7278818e9ba095897c6f6356493c30231609000714202d3a46525e6976797979797979797976685e5246392d20130700101d293643505c697682868686868686867e7265584b3f3225180c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000915212c37424b54595c5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5b59534b42372c201509000814212e3b4754616e7a878f8f8f8f8f84776a5d5144495663707c898f8f8f8f8d8174675a4e4134271b0e000915222f3c4855626f7b8895a2a4978a7e7164574b3e3124180b000007111b252c38434f5966737f8c9996887b6e6155483b2e2215080000000000000000000000000000000000000000000000020b18242f3a43505a616e7b86929f9f92867b6e61594f43392f2418111b262f38424a505c636c717c848e939f98928b817a6f6a625a524940382e251c11080000000000000713202d3a4653606d798693a0aca194877b6e6154483b2e36414c5664707d8a97a1a8988c7f727a86929fa4998c7f7366594f43382f3c4955626f7c8895a2aca09386796d6053463a2d2013070000000000000000000a141d29323d44505c666e7b85929aa4a99f948c7f726a60554b40352928313a45515c666f7c86929fa6a99f948c7f736a60554b41362c21170c0200000000000000000714202d3a4753606d7a86929facab9e9285796d60564c443d3a373134333332323845515c6675828f9ca8afa396897c706356493d3023160a0000000000000005111e2a36414c566a7683909da9aea298887b6e6155483b2d221708000000000a15212e3b4854616e7b8798a2aeaa9d908377655b5044372b1f120500000000000000000000000006121e2b37424d576774818e9aaba197887c6f6255483c2f24180c00000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d100300000000000000000000050f19232b33383c3d3d3d43505d69768390908376695d50433d3d3d3c38332b23190f050000010c18222d363f454a4b535353535353534947433d342b20160a000000020e19242e3840474b4d5353535353535353443f3830261c110600000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013000e1a2734414d5a6774808d9aa7b3a79b8e8174685b6874818e9ba7b3a6998c807366594d4033261a0d00000613202d394653606c777979797a7b7e838e939e989083786c605346392d2013060005121e2a36424d575e6c6c6c6c6c6c6c6c6c6c5e564c41362a1d1105000f1c2835414e5a66707679797979797979726d62564a3d3124180b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004101b26303942494d4f5252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252524f4d48423930251b0f04000714212d3a4754606d7a8283838383838174675b4e414855626f7c8283838383827f7265584c3f3225190c000916232f3c4956626f7c8995a2a5988b7e7265584b3f3225180c00010d18232d373f464956626f7c8999978a7d7164574a3e3124170b00000000000000000000000000000006060606060606060007131d28313e46535e69727f8c95a0988e81756b61554b4035291d14141d262f383f44525a616a6f7a818b92989f938e847c716c635b524a40372e231a0d0400000000000713202d3a4653606d798693a0aca194877b6e6154483b2e3946525e6875828f9ba9a196887b6f76828f9cab9e9184776b605448392f3c4955626f7c8895a2aca09386796d6053463a2d201307000000000000000000020b172028343f4a545e69707d88939fa7a69f92877c6f675d51453e332f3a434f59606d79839098a3ada2979082786c60584e433a2f241a0f0500000000000000000006131f2c3945515d677783909dabada1978a7e71685e564f484742424140403f3f3f404b546673808c99a6afa396897c706356493d3023160a000000000000000713202d3946525e687885929fabac9f9285796c605346392d201306000000000714212d3a46535e697985929facac9f9285796c605346392d2013060000000000000000000000000814212d3a47535f697884919eab9e9185786c605346392d20130700000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000005101a232c33393c3d3d3d43505d69768390908376695d50433630302f2c27211911080000000006111b242d343a3d3e464646464646463c3b38322b22190f040000000008121c262e363b3f40464646464646464638342e261e150a0000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013000e1a2734414d5a6774808d9aa7aca79b8e8174685b6874818e9ba7aca6998c807366594d4033261a0d00000613202d394653606c7984868687888b90959a9590867c6f665b5044382b1f120600020e1a25303b454d525f60606060606060605f524c443a3025190d01000d1926323e49545e66696c6c6c6c6c6c6c65625b51453a2e22150900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009141e2730373d414246464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464642413d3730271e140900000713202c3945525d686d767676767676746f64584c4047535f6a6f767676767676726d62564a3e3125180b000a1723303d4a5663707d8996a3a5988c7f7265594c3f3226190c0006121e29353f49515759606d798692998c7f7366594c403326190d0000000000000000000002060a0c0d131313131313131313130c161f2a36424d57606d788390999e938a7d70675d51453c2f261b11141d262d33404850585f686d757e8690959d9691867e736d645c524940352c1f160c01000000000713202d3a4653606d798693a0aca194877b6e6154483b2e3a4754616d7a86929fab9e9184786a727f8b99a4a096897c6f63554b40353c4955626f7c8895a2aca09386796d6053463a2d20130700000000000000000000050e17232e38424d56616b73808d959fa9a3999184796d605a50453b35414c56606b73808d95a0aaa59f92857b6e665b50463d31281d12080000000000000000000004101d2935404b5566737f8c99a3aea99e91847a6d68615955534d4f4e4d4c4c4c4b4b4c5865727f8b98a5afa396897c706356493d3023160a000000000000000714212e3a4754616d7a8798a2aeaa9d918477665b5044382b1f12060000000005121e2a36424d576a7784919daaaea298877a6e6154473b2e2114080000000000000000000000000815222e3b4855616e7b8896a1ac9b8e8174655b5044372b1f120500000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000000000000000000b17222c363e44494a4a4a4a505d69768390908376695d5043362a2322201c160f0800000000000009121b22292e3132393939393939392f2e2b27201910070000000000000a141c242a2f323339393939393939392c28231c150c030000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013000e1a2734414d5a6774808d9a9f9f9f9b8e8174685b6874818e9b9f9f9f998c807366594d4033261a0d000006121f2b3844505b6673808c9993999292908d89837c6f6a5f544a3f33281c0f03000009141f29333b42464853535353535353535346413a32281e130800000915212d38424c545a5c60606060606060585651493f34291d1105000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020c151e262c3134353939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393534312c251e150c02000004111d2935414c565d6069696969696967645c53483c434e585f6269696969696965625b51463a2e221609000a1724313d4a5764707d8a97a3a6998c807366594d4033261a0d000916222e3a46515b62656c667885919a8d8174675a4e4134271b0e000000000000000000070d121619192020202020202020202020201a25313b44505c666f7c87939f9e9184796d60584e41382d22170b141c2228363e464e565d606c717b838d929f98928b80736e645b51473d31281e1308000000000713202d3a4653606d798693a0aca194877b6e6154483b37434e5865727f8c99a3a99a8d8074676e7b87939fa89a8e8174675d5145393c4955626f7c8895a2aca09386796d6053463a2d201307000000000000000000000006111c26303b444f59606d78839097a2aba0968e81746c61574d423b45525d68707d87939fa7a89d938a7e71695e544a3f342b1f160c0000000000000000000000000c18242f3b4854616e7b86929fa8ada19690827a706b65615f575c5a5a5959585858585865717e8b98a4afa396897c706356493d3023160a000000000000000915222f3c4855626f7b8895aab4a99c8f837669544a3f33281c0f0300000000020e1a2531434f5c6976828f9ca9b4aa95887b6f6255483c2f221509000000000000000000000003101c28343f4a5465727f8b98a8a49a8a7e716453493f33271b0f0300000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d100300000000000000000004101c28333e48505557575757575d69768390908376695d5043362a1d1613100b0500000000000000000911181d2124252d2d2d2d2d2d2d23221f1b160f0700000000000000020a12191f2326272d2d2d2d2d2d2d2d1f1c17110a03000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013000e1a2734414d5a6774808d93939393938e8174685b6874818e93939393938c807366594d4033261a0d0000030f1c28333f4a54616e7b87939f92878583817d786f6a5f584e42382d22170b000000020d17212930363a3b4646464646464646463936302820160c02000005101b26303a42494e50535353535353534b4a453f372d23180c0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030c141b212528292c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c282725201b140c03000000010d1924303a444c52545c5c5c5c5c5c5b58534a41363c464e53555c5c5c5c5c5c585651493f34291e1206000b1824313e4b5764717e8a97a4a69a8d8073675a4d4034271a0d000b1825313e4a57626d7279797983909b8e8275685b4f4235281c0f00000000000000010a12191e2325262d2d2d2d2d2d2d2d2d2d2d2d2d2d28343f4a54606a74808d97a1968d80736a5f53493f33271e13111317242d343c444c525a62696e78808b92999f928c80736d63594f433a2f24190d010000000713202d3a4653606d798693a0aca194877b6e6154483b3b4754606a7784909daba197897c70636876838f9caa9f9285796d6053473b3c4955626f7c8895a2aca09386796d6053463a2d2013070000000000000000000000000a141e29323e44505c666e7b85929fa4a89d938a7e70695e544a45505a606d7a849199a4aba0968e81746c61574d42382d22190d040000000000000000000000000714202d3a46525e6974808d96a1a9a89f9590847d77726e696a6867666665656565646465717e8b98a4afa396897c706356493d3023160a000000000000000a1723303d4a5663707d8996a3b0a89b8e8275685b4f422d22170b000000000000091c2835424f5b6875828e9ba8b0a396897d7063564a3d3023170a000000000000000000000006121f2c3844505c6675828f9ba89f93877a6e6154473b2d22170b0000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000814202d3944505a6164646464646469768390908376695d5043362a1d1007040000000000000000000000060c11151718202020202020201615130f0a0400000000000000000000080e1317191a202020202020202012100c060000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013000e1a2734414d5a677480868686868686868174685b68748186868686868686807366594d4033261a0d0000000b17222d3846535e6976828f9b8f82787774706c655f584e463c2f261c110600000000050f171f252a2d2e39393939393939392e2d2a251e160e05000000000a141e2830383e4143464646464646463f3d3a342d241b110600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002091015191b1c1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1c1b18150f0902000000000008131e28323a4145475050505050504e4c4841382f343c4347485050505050504c4a463f372d23180d01000c1825323f4b5865727e8b98a5a79a8e8174675b4e4134281b0e000c1926323f4c5965727f86868689959c8f8275695c4f4236291c0f000000000000000a131c232a2f32333939393939393939393939393939392e38424e58606d7a85919e9f92877c6f655b50443a3025191d202021222a323a414550575f666d747e8792989c928c7f726b61564c4135291d13070000000713202d3a4653606d798693a0aca194877b6e6154483b404b55626f7c8995a0ab9e9184796d6064717e8b98a2a2988a7e7164574d423c4955626f7c8895a2aca09386796d6053463a2d201307000000000000000000000000020c172028343f4a545e69707d8a929da7a59e92857b6e665b504d57616c75818e96a1aba3999184796d605a50453b2f261c10070000000000000000000000000005121e2a36424d57606d79849197a1a9a79f969189837f7b78767574737372727271717171717e8b98a4afa396897c706356493d3023160a000000000000000a1724313d4a5764707d8a97a3b0a79a8e8174675b4e4134281b060000000000010e1b2834414e5b6774818e9aa7b0a3978a7d7064574a3d3124170a00000000000000000000000713202d3a4653606d7985929faa9d908377685e5246392d1b11060000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000a1623303c4955616c70707070707070768390908376695d5043362a1d1003000000000000000000000000000105090b0b13131313131313090806030000000000000000000000000002070a0c0d1313131313131313060300000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013000d1a26333f4c58646e7479797979797979746f6459646f7479797979797979736e63574b3f3226190c00000006111c2a36424d5764717e8a9792877b6e6763605b534e463c342a1d140a000000000000050d141a1e20212d2d2d2d2d2d2d2d21201d19130c050000000000030c161e262d3235363939393939393932312e29231b120900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004090c0e0f1313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313130f0e0c090400000000000000020c1620283035393a43434343434341403c362f262a32373b3c4343434343433f3e3a342d251b110700000c1926323f4c5965727f8c98a5a89b8e8175685b4e4235281b0f000c1926323f4c5965727f8c93939d9f9c8f8276695c504336291d1000000000000007121c252e353b3e4046464646464646464646464646464646464645525d68717e8a949f999083776c60564c41362a24292c2d2e2f30302f353e454d545c606c717d8692999f93887d70685d52453a2f24180d0100000713202d3a4653606d798693a0aca194877b6e6154483b45515d6774818d9aa7a6998d8073665c606d7a85929faa9c8f8276695e53463c4955626f7c8895a2aca09386796d6053463a2d20130700000000000000000000000000050e17232e38424d57616c74808d959faaa2978f82786c6058535e69717e8a939ea8a69f92877c6f675d51483e33291d140a0000000000000000000000000000020e1a25303b45515d676f7c8591979ea5a8a09e95908b8885838281807f7f7f7e7e7e7e7d7d808d9aa7afa396897c706356493d3023160a000000000000000b1824313e4b5764717e8a97a4b1a79a8d8174675a4e4134271b0e0100000000010e1b2734414e5a6774818d9aa7b0a4978a7d7164574a3e3124170b0000000000000000000000091623303c4956636f7c8998a2aa998d807366564c41362a1e0a000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000a1724313d4a5764707d7d7d7d7d7d7d7d8391908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0acac9f9286796c5f5346392c2013000b1723303c47525c64676c6c6c6c6c6c6c68645d535d64686c6c6c6c6c6c6c66635c52473b2f23170a000000000e1a25313b4653606d798592998c8073665c535049413c342a22190b020000000000000002090e12141520202020202020201413110d080200000000000000040c141b212628292d2d2d2d2d2d2d2524221d18110900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040e161e24292c2d3636363636363433302b251d20262b2e2f36363636363632312e29231b13090000000d1a2633404d596673808c99a6a89c8f8275695c4f4236291c0f000c1926323f4c5965727f8c989faaa99c8f8376695c504336291d100000000000020d19232e3740464b4c535353535353535353535353535353535353534c56616c76828f989f948b7e71685e52463d302f35393a3b3c3c3d3d3c383b424a515a626b707e87939f9a92857a6d60554b4135291d110400000713202d3a4653606d798693a0aca194877b6e6154483b4753606d7985929fab9f94887b6e62545d6774818e9ba89f93877b6e6154483d4955626f7c8895a2aca09386796d6053463a2d201307000000000000000000000000000006111c26303b45505a606d78839098a2a99f948c7f726a605b656e7b85929fa5a99f948c7f726a60554b40362c21170b0200000000000000000000000000000009141f2935414b555f6a6f7c858f939c9fa4a79f9d989892908f8d8d8c8c8b8b8b8b8a8a8a8d929da9afa396897c706356493d3023160a000000000000000b1825313e4b5864717e8b97a4b1a79a8d8074675a4d4134271a0e0100000000010e1a2734414d5a6774808d9aa7b1a4978b7e7164584b3e3125180b0000000000000000000004111d2935414c566673808c99aaa298897d706356493d3025190d000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d100300000000000000000013202d394653606c79868a8a8a8a8a8a8a9195908376695d5043362a1d1003000000000000000000000000000000000000000000010406070d0b0a08050000000003080b0d0e0d070604000000000000000000000000000000000000000000000714202d3a4753606d7a86939f9f9f9f9286796c5f5346392c20130007131f2b36404a52585a606060606060605b59534b53595b606060606060605957524a40352a1f13070000000009141f2c3845515c67748086868685796d6053463f382f2a22191007000000000000000000000205070813131313131313130707050100000000000000000000030a1015191c1d20202020202020181815110c06000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040c13191d2021292929292929282724201a13151b1f21222929292929292525221e181109010000000d1a2734404d5a6773808d9aa6a99c8f8376695c504336291d10000c1926323f4c5965727f8c98a5b2a99c8f8376695c504336291d10000000000006121e2a3540495157596060606060606060606060606060606060606060605a616e7b86929f9e92857a6d61594f42393a4045474848494a4a48443d3940445059616c73808c96a0978d8073675d5145392c20130600000713202d3a4653606d798693a0aca194877b6e615448424d5764717e8a97a2aa9c908376695f535563707d8996a1a49a8c7f7366594f444955626f7c8895a2aca09386796d6053463a2d2013070000000000000000000000000000000a151e29333e45515c666e7b85929fa5a69f92877c6f67606c77828f97a2ada1978f82776c60584e43392f241a0f0500000000000000000000000000000000020d18242f3a434e585f6a6f7a82898f93999c9fa2aaa29f9d9b9a999998989898979797979a9da4aeafa396897c706356493d3023160a000000000000000b1824313e4b5764717e8a97a4b1a79a8d8174675a4e4134271b0e0100000000010e1b2734414e5a6774818d9aa7b1a4978a7e7164574b3e3124180b000000000000000000000713202c3945525d687683909da99f9285796d6053463a2d201308000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d100300000000000000000013202d394653606c7986939393939393939393908376695d5043362a1d10030000000000000000000000000000000000000001070d1113141a181715110c0601080f14181a1b191413100c0701000000000000000000000000000000000000000714202d3a4753606d798693939393939286796c5f5346392c201300030e19242f3840474c4d535353535353534e4d4841484d4e535353535353534d4b4740382e24190e020000000004101c2834404b55646e74797979786d665c5044382d261d18100700000000000000000000000000000000000000000000000000000000000000000000000000000005090d0f10131313131313130c0b090501000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080d1113141d1d1d1d1d1d1b1a18140f080a0f1215151d1d1d1d1d1d191816120d0700000000000e1b2734414e5a6774818d9aa7aa9d9083776a5d5044372a1d11000c1926323f4c5965727f8c98a5aca99c8f8376695c504336291d1000000000000a16232f3b46515b63666c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6b69727f8c95a0978e81746b60544b40434b51535455565756554f473d343f47505a606d7884919e9f92857a6d6054473a2d21140700000713202d3a4653606d798693a0aca194877b6e61544846535e6976828f9ca9a2988b7e7165574d53606c7884919eac9e9184776b6054484955626f7c8895a2aca09386796d6053463a2d201307000000000000000000000000000000030c17212834404b545f69717e8a929da7a3999184796d6a727f8c949fa9a49e92857b6e655b50463c31281d120800000000000000000000000000000000000007131d28313c464e585f686d757c82878b8f929897999a9b9c9d9d9d9e9e9e9e9f9f9f9fa3abacb5afa396897c706356493d3023160a000000000000000a1724313d4a5764707d8a97a3b0a79a8e8174675b4e4134281b0e0100000000010e1b2834414e5b6774818e9aa7b0a3978a7d7064574a3d3124170a000000000000000000000714212d3a4754606d7a86929fa89c8f8275665c5145382c1f1306000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d100300000000000000000013202d394653606c7986868686868686868686868276695d5043362a1d1003000000000000000000000000000000000000040c13181d2020272524211d17100b131a2024272726201f1c18120b030000000000000000000000000000000000000714202d3a4753606d798686868686868687796c5f5346392c2013000008121d262f363c3f414646464646464641403c373c404146464646464646403f3b352e261c12070000000000000c18232e3943525c64676c6c6c6b605c544a3f34281b140b0600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010407071010101010100e0d0b08030000030608091010101010100c0b0906010000000000000f1b2835424e5b6875818e9b9f9f9d9184776a5e5144372b1e11000c1926323f4c5965727f8c989f9f9f9c8f8376695c504336291d1000000000000c1925323e4b57636d737979797979797979797979797979797979797979797978736d7883919a9e93897d70665c51454b555d60616263636360594f4438353e44505c66727f8b98a2988a7e7164574b3e3124180b00000713202d3a4653606d798693a0aca194877b6e6154484953616e7b87939fac9f92867a6d605447505b6573808c99a6a096897c6f63554b4955626f7c8895a2aca09386796d6053463a2d20130700000000000000000000000000000000050f18232e39424d57616c74818e95a0aaa0968e81746f7c86929fa6a79d928a7d70695e53493f342b1f160c00000000000000000000000000000000000000010c161f2a343c464e565e616b6f757b7f8285888a8c8d8f8f9090919191919292929292999ba3acafa396897c706356493d3023160a000000000000000a1723303d4a5663707d8996a3b0a89b8e8175685b4e4235281b090000000000020f1b2835424e5b6875818e9ba8b0a3968a7d7063574a3d3024170a000000000000000000000b1724313e4a5764717d8a99a3a8988b7f7265544b4034281c1004000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d100300000000000000000013202d3946535f6c7679797979797979797979797670665a4e4235291c0f030000000000000000000000000000000003090d161d24292c2d3431302d28221b141d252b303334332d2c29231d150d09030000000000000000000000000000000006131f2c3845515c67767979797979797979756a5e5245382c1f120000010b141d242b303334393939393939393534302b3034353939393939393933322f2a241c130a0000000000000007121d2730404a52585a6060605e53504a42382e23170a02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f1c2935424f5c6875818f939393939184786b5e5245382b1f12000c1926323f4c5965727f8c93939393938f8376695c504336291d1000000000000d192633404c5966737f868686868686868686868686868686868686868686868578666f7d88939f9d9184796d60574d515d676d6e6f6f70706b6055483d32343f4a54616e7b8899a49a8d8174675a4e4134271b0e01000713202d3a4653606d798693a0aca194877b6e615448505b6573808c9aa4a89b8e8174675d51454953616e7b88949fa89a8e8174675d514955626f7c8895a2aca09386796d6053463a2d201307000000000000000000000000000000000007121d27303b45505a606d79839098a2a89d938a7e79839098a3aaa0958d80746c61564d41382d22190d040000000000000000000000000000000000000000040d18222a343c444c52596063696e7276797b7d7f81828383848484848585858585868b909ba7afa396897c706356493d3023160a000000000000000916222f3c4955626f7c8895aab4a99c8f8276695c4f4330251a0e0200000000030f1c2936424f5c6975828f9ca8b5ab95897c6f6256493c2f23160900000000000000000006121e2b37424d576774818e9aaba196887b6e6255483b2e23180c00000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000000000000000121e2b37434f5a646c6c6c6c6c6c6c6c6c6c6c6c69665e544a3e32261a0d01000000000000000000000000000000060e151a1f282f35393a403e3d39342d241d262f363c4041403a38342f271f1a140d0500000000000000000000000000000004101c2934404b555c6c6c6c6c6c6c6c6c6c6a63594e42362a1d11000000020b12191f2326272d2d2d2d2d2d2d282724202427282d2d2d2d2d2d2d2626231f19120a0100000000000000000b151e2f3840474c4d5353535246443f3830261c11060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101c2936434f5c69768286868686868685786c5f5245392c1f12000c1926323f4c5965727f868686868686868276695c504336291d1000000000000d192633404c5966737f8c93939393939393939393939393939393939393939185786b6b74818e97a0968c7f73695f5353606d797b7b7c7d7d7063584e4338313a4653606d7986939f9c8f8276695c4f4336291c1003000713202d3a4653606d798693a0aca194877b6e61544853606c7884919eaca096897c7063554b4146535f697683909caa9f92857a6d60534955626f7c8895a2aca09386796d6053463a2d2013070000000000000000000000000000000000000b151e2a333e45515c676e7b86929fa5a59e9285818e95a0aaa3989183796d60594f443b2f261b1007000000000000000000000000000000000000000000050e171e252a323a41464f54575e6165666d6f717374757676777777787878787879797e8b98a4afa396897c706356493d3023160a000000000000000814212e3b4754616e7b8798a3aeaa9d9084776a574d42362a1e12050000000005111d2935414c566a7783909daaafa399877b6e6154483b2e2115080000000000000000000814212d3a47535f697784919eaa9e9184786a5f53473a2e1d120700000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000f1b27333e49525a5f60606060606060606060605d5a544c43382d22160a000000000000000000000000000000060f1820262b313a4045474d4b49453e362d222f3841484c4e4c47454039312a251f170f050000000000000000000000000000000c18232f39434b515f606060606060605f5e5951473d31261a0e0000000001080e13171a1a202020202020201b1a1814181a1b202020202020201a1917130e0700000000000000000000030c1d262f363c3f41464646453a38342e261e150a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f1c2835414e5a6670767979797979797873695d5144382b1e12000b1825313e4a57626d72797979797979797670665a4e4235291c0f00000000000d192633404c5966737f8c999999999999999da0a7a9a29f999999999999999185786b616d7a85929e9f92867b6e615a5c6976828788898a85786a605448423f404653606d798699a49c8f8376695c504336291d1003000713202d3a4653606d798693a0aca194877b6e61544c5663707d8996a1ab9e9184786c6053463a424d5765717e8b98a2a2988b7e7164574d55626f7c8895a2aca09386796d6053463a2d201307000000000000000000000000000000000000030c18212934404b555f69717e8b939ea7a297928e939da7a69f92867c6f675d51473e32291d140a000000000000000000000000000000000000000000020c1720293036393a3e3f44484d5354545c606264666768696a6a6a6b6b6b6b6c6c6c717e8b98a4afa396897c706356493d3023160a000000000000000713202d3a4653606d7986929facab9f928578695e52463a2d201407000000000713202d3946525d687885929eabac9f9286796d6053463a2d2013070000000000000000000815222e3b4855616e7b8896a0ab9a8e817467584e43372b1f0b0000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000a16212c3740494f535353535353535353535353504e4a433a31271c11050000000000000000000000000000030e18212a31373e434b51535a585650483e322b34414a53585a5953514b433e36312921170d03000000000000000000000000000007121d2731394045535353535353535353524e473f352b20150900000000000003070b0d0e131313131313130e0e0c080c0e0e131313131313130d0c0a07020000000000000000000000000b141d242b303334393939382d2c28231c150c030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d1926323e49545e66696c6c6c6c6c6c6c6961574c4135281c10000916222e3a46515b62656c6c6c6c6c6c6c69665e54493e3226190d00000000000d192633404c5966737f8c8c8c8c8c8c8c8c9095a0a297928c8c8c8c8c8c8c8c85786b5d68717e8b949f988f82766c61566673808d959697897c6f625b534d4c4d4f58626f7c8895ab9b8e8275685b4f4235281c0f02000713202d3a4653606d798693a0aca194877b6e6154525d6875818e9ba8a4998c7f73655b5044373b4754606d7a86929faa9c8f8276695e5355626f7c8895a2aca09386796d6053463a2d20130700000000000000000000000000000000000000060f18232f39434d57616c74818e95a0a9a29e9b9da5a99e948b7f726a5f554b40352c20170b0200000000000000000000000000000000000000000008131e29323a4146474b4c4d4e4f51524a50535557595a5c5c5d5d5e5e5e5e5f5f5f65717e8b98a4afa396897c706356493d3023160a0000000000000006121f2b3844505c667784909daaaea298877b6e6154483b2e21150a000000000714212e3a4754616d7a8797a1adaa9e918477665c5145382c1f1306000000000000000003101c28343f4a5465727e8b98a8a4998a7d7164574a3e31261a0f0000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d100300000000000000000005101b252e373e4346464646464646464646464643423e3831281f150a0000000000000000000000000000000915202a333c424750555d606764615a50443a323d46535c646766605c554f46423b33291f14090000000000000000000000000000010b151f272f343846464646464646464645423d352d24190f0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020b131a1f2426272d2d2d2b201f1c17110a03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000915212d38424c545a5c6060606060605f5d574f463b3024180c0006121e29353f49515759606060606060605c5a544c42382d21160a0000000000091623303c4956636f7d808080808080808083909d9f928580808080808080807f726556626c76828f989f948a7e71685d626f7c89959f9c8f82756d615e57595959616a73808d99a8998d8073665a4d4033271a0d00000713202d3a4653606d798693a0aca194877b6e615454606d7a86929fac9f93877b6e6153493f333945515d6775818e9ba89f93877b6e615355626f7c8895a2aca09386796d6053463a2d201307000000000000000000000000000000000000000007121d27313c45505a606d79839198a2adaba7a9ada1978f82776c60584e43392f231a0e05000000000000000000000000000000000000000000010d1925303a444c525457595a5b5c5d5e5b5953484a4c4e4f5050515151515252525965727f8c98a5afa396897c706356493d3023160a0000000000000003101c28343f4a546875818e9ba8b3aa978a7d7064574a3d32271b0d04000001081623303d495663707c8996a9b3a89c8f827569544b4034281c1004000000000000000006121f2c3844505c6675828f9ba89f93867a6d6054473a2d2114090000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000009131c252c33373939393939393939393939393635322d271f160d030000000000000000000000000000020e1a26313c454e535a61676d73716c61564c4137434e58646e74736d676159534d453b31251a0e020000000000000000000000000000030d151d23292c3939393939393939393836312b241b120800000000000000000000000104060712131313130908060300000000000000000000000000000000000000000000000000000001080e13171a1a2020201f1312100c0600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005101b26303a42494e4f53535353535352514c463d342a1f130800010d18232d373f464a4c53535353535353504e49423a31261c100500000000000915222f3b4854606b6f7373737373737374818e9b9e91847873737373737373726d62575a626e7b86929f9e91857a6d60606a7783909a9e948c7f756e69676666676b707c86929fa096897c6f6356493c3023160900000713202d3a4653606d798693a0aca194877b6e61545865727e8b98a3a99c8f8276695e5341382d35414b5563707d8996a1a49a8c7f73655b55626f7c8895a2aca09386796d6053463a2d2013070000000000000000000000000000000000000000010b151f2a333e45515d676f7c86929facb8b4b8ab9e92857a6d655b50463c31271d11080000000000000000000000000000000000000000000005111d2a36414c565e6164656768696a6b68655d534840414243434444444545454d596673808c99a6afa295897c6f6256493c2f23160900000000000000000b17232e3f4b5865727e8b98a8b2a69a8d807367584e43372b1f15100c090e131e2a36414c5666727f8c99a5b3aa998c7f7366594c402e23180c0000000000000000000713202d3a4653606d7985929fa99d908376685d5245392c2013070000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d100300000000000000000000010a131b21272b2d2d2d2d2d2d2d2d2d2d2d2d2a2926221c150d0400000000000000000000000000000006121e2b37424e575f626c7179807e71685d52453c4754606a74817f79706b615e574d42362a1e1205000000000000000000000000000000030b12181c1f2d2d2d2d2d2d2d2d2c2c2a26201912090000000000000000000001070d1013141e202020201615130f0a0400000000000000000000000000000000000000000000000000000003070b0d0e131313120706030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a141e2830383e41434646464646464544413b342b22180d02000007111b252d353a3e3f4646464646464643423e3831281f150a0000000000000713202c38444f5960636666666666666874818e9b9e9184786b66666666666665625b51535f6973808c96a0978d80746a6063707d88939f9c918c817b7673727374777d859298a29e9184786d6053463a2d20130700000713202d3a4653606d798693a0aca194877b6e61545f6a7683909daaa2978a7e7164574d422f262f3a4653606c7884919eac9e9184786c6055626f7c8895a2aca09386796d6053463a2d201307000000000000000000000000000000000000000000030d18212935404b555f6a737f8c99a6b2bdb0a3968a7d70685e53493f342a1f150b00000000000000000000000000000000000000000000000713202d3946525e686d71727374767778756f65594d3d323536373737383835404b556774818e9aa7b2a995887b6e6255483b2f22150800000000000000000615222f3c4855626f7b8896a0acaa9d9184776a6054473c31271f1c181b1a1e242d3946525e6876838f9ca9aea298897c706356493d30231607000000000000000000091623303c4956636f7c8998a2aa998c807366564c4135291d11040000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000010910161b1e2020202020202020202020201d1c1a16110a03000000000000000000000000000000000814212e3a47535f6a6e767e848d857a6d60584e43505a626f7c888c847d756e695e53463a2d2114070000000000000000000000000000000001070c10132020202020202020201f1d1a150f0800000000000000000000040c12181d20202b2d2d2d2d22211f1b150e070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020c161e262d323536393939393939393835302a22191006000000000a131b23292e3132393939393939393635322d261f160d03000000000000030f1b27323d474f545659595959595b6874818e9b9e9184786b5e5959595959595751494d57606d7984919e9f93877c6f66606b73808d939f9c938e8783807f8081848a9297a19f928a7d70665c5044382b1f120600000713202d3a4653606d798693a0aca194877b6e6154626f7c88959fab9f9285796d6053473b31202b3844505b6673808d99a7a096897c706355626f7c8895a2aca09386796d6053463a2d20130700000000000000000000000000000000000000000007121d27313c46505a606d7984919eaab7b9b1a4978b7e71695f554b40342820170b02000000000000000000000000000000000000000000000714212e3a4754616d7a7e7f8081828485817568584e43372e2c2823282c2f3945515d677783909daaada196877a6d6054473a2d21140700000000000000000815212e3a47535f6a7784919eabaca095887c6f62584e4339312c282327262b2f35414c56616d7a86929facab9f9285796d6053463a2d201307000000000000000004111d2935414c566673808c99aaa298897c6f6356493c3024190d010000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d100300000000000000000000000000050a0f12131313131313131313131313100f0d0a050000000000000000000000000000000000000815222f3b4855626e7c828a91968d80746a5f534b55616c76839096918a827b6e6154483b2e21150800000000000000000000000000000000000000040613131313131313131312110e090400000000000000000000040d161d24292c2d38393939392f2e2b2620181007000000000000000000000004090d0f0f131313131313130d0c0a060200000000000000000000000105090b0b13131313100f0d0905000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040c141b212628292d2d2d2d2d2d2c2b28241f1810070000000000010a11181e2225262d2d2d2d2d2d2d292926211c150d0400000000000000000b16212b353d4448494d4d4d4d4e5b6874818e9b9e9184786b5e514d4d4d4d4c4a463f45515c67707d89939e999083786d60606c77808c92989f9992908d8c8c8e91969e9f99928c80736b61544a3f34281c100300000713202d3a4653606d798693a0aca194877b6e615c6673808d9aa7a79a8d8174675c5145382c1f28333f4a54626e7b88959fa89b8e8174675d626f7c8895a2aca09386796d6053463a2d2013070000000000000000000000000000000000000000060f18242f39434e58626c75818e96a0acafacafac9f92867b6e675c51453e32291d140a000000000000000000000000000000000000000000000815212e3b4854616e7b878c8d8e8f909184786a6054473f3a38342e34383a404b55606d7a86929facab9e918578675d5145392c201306000000000000000006121f2b37434e586673808d99a3afa89b8e81756a5f554b433c38342e3431373a4145525d68737f8c99a3afa79b8e8175675c5145382c1f130600000000000000000713202c3945525d687683909da99f9285796d6053463a2d201308000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010d1a2734404d5a6773808d949e9f92877c6f625a515c67717e8a949f9e93867d7063574a3d3024170a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010c161f282f35393a45464646463c3b37322a22180e04000000000000000002091015191b1c20202020202020191916120d07000000000000000000060c11151718202020201d1c1915100a030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020a1015191c1c2020202020201f1e1c18130d060000000000000000070d12161819202020202020201d1c1916100a03000000000000000000040f19232b32383b3c404040414e5b6874818e9b9e9184786b5e51454040403f3e3a34404b55606b75818e97a0958c7f72695e656c777f868e92999b9c9a99999a9d9b99938f867f736e63594f42382e23170b0000000713202d3a4653606d798693a0aca194877b6e61606d7985929eaba095897c6f62554b4034291c222d3847535f697683909daa9f92857a6d60626f7c8895a2aca09386796d6053463a2d20130700000000000000000000000000000000000000030c18212935404b555f6a717e8b939ea8aba39fa3aba2989083796d60594f443b2f261c11060000000000000000000000000000000000000000000714212d3a46535e697884919a9b9c9d96897c6f625a504a464440434044464b515c67717e8b98a3aeaa9b8f827568554b4135291d11040000000000000000030f1a26313c4854616e7b87929faaac9f92877c6f675d554e46454041414142474c515b606d7a85929eabaca095897d7063554b4034281c100400000000000000000714212d3a4754606d7a86929fa89b8f8275665c5044382c1f1206000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000000000000000000000000000004080a0a131313130d0c0a070200000000000000000000000713202d3a4653606d78839097a2999083766c6156606d7984919e9f958d80736b6155483c2f23160900000000000000000002070c0f11121313130e0706040000000000000000000000000000000000000000000007121d28313940454751535353534947433c342a20150a00000000000000030c141b212528292d2d2d2d2d2d2d2625231e19120a010000000000000911181d2124252d2d2d2d292826211b140c0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005090d0f101313131313131212100c0802000000000000000000000106090b0c13131313131313100f0d0a0500000000000000000000000007111921272c2f30333335414e5b6874818e9b9e9184786b5e514538333332312e2e39434f59616d7a85929f9f92867b6e615b656c727b81868b8e9091929291908e8b87827c726d635c52473e30261c11060000000713202d3a4653606d798693a0aca194877b6e6164707d8a97a1ab9d9083776a605443392f23181c2b37424d5765727e8b98a3a2988b7e7164626f7c8895a2aca09386796d6053463a2d201307000000000000000000000000000000000000000b151e2a333c45515d676f7c86929fa5a79f999299a3aaa0958d80746b61564d42382d22170d04000000000000000000000000000000000000000005121e2a36424d576774818e9aa6a9a89b8e81756c605c5453514a504a5153555d606d7983919daaaea2988b7e7165584b3e2f24180d010000000000000000000a15212d3a46535e6975818e98a3aea3999083796d675f5853514b4e4e4e4d53555d606d74818e97a1ada69d9083776b605443392e23180c0000000000000000000b1724313e4a5764717d8a99a3a8988b7e7265544a3f34281c1003000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000000000000000000000000050b101416171f2020201a1917130e070000000000000000000006131f2c3845515c666e7b85929a9f948b7e71675e68737f8c96a1989083796d60594f44382c2014070000000000000000060d13181c1e1f2020201b1313100c0700000000000000000000000000000000000000010d18242f39434b51535e6060606055534e463c32261b0f040000000000020c151e262c3135363939393939393933322f2a231c130a000000000009121b22292e3132393939393635322d261e160c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070f161b202223262835414e5b6874818e9b9e9184786b5e5145382b2626251d27303d46525e68717e8b949f988f82756c615b606a6e757a7e81838585868584817f7b756f6a635b524940352c1e140a000000000713202d3a4653606d798693a0aca194877b6e616875828f9ca9a3998c7f7265584e4331271d121a26313c4754606d7a86929faa9c8f837669626f7c8895a2aca09386796d6053463a2d20130700000000000000000000000000000000000007121d27303c45505a606d79839198a2aa9f9590869299a4a79d928a7d70695e544a3f332820160c0100000000000000000000000000000000000000020e1a25313c4855626f7c88949faaaa9e938a7e726d6662605c545d545c6062676d75808d95a0aca99f92867a6d6154473a2e2114070000000000000000000005121e2a36424d57616e7b86929fa6aba0958f82796f6a63605c555b5a5b575f62676d747f8c939ea9a99f948a7d7064594f4430271d1207000000000000000005121e2b37424d576774818e9aaba096887b6e6155483b2e23170c00000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000000000000000000000000000000000000000000000000810171c2023242c2d2d2d2726231f19120a01000000000000000004101c2834404b545e69707d88939f9e91857a6d616e7b86929f9f92867b6e665c51473e33281c1004000000000000000710171e24282b2c2d2d2d28201f1c18120b03000000000000000000000000000000000004101d2935404b555d606b6c6c6c6c625f584e43372b21160a000000000009141e2730373d414246464646464646403e3b352e251c120700000006111b242d343a3d3e4646464643413e3830281e1108000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040b0f1315161b2835414e5b6874818e9b9e9184786b5e5145382b1e1918151e2a36414c56606c778390999e938a7d70675d575f62686e717477787979787775726e69625f58514940372e231a0c02000000000713202d3a4653606d798693a0aca194877b6e616e7a86929fac9f92867a6d6154473d3221150b15202c3945525d6875818e9ba99f93877b6e626f7c8895a2aca09386796d6053463a2d2013070000000000000000000000000000000000060f18232e39434d57616c74818e95a0aaa29890837d87939fa7a49e92857b6e665b50443d32281e130800000000000000000000000000000000000000000915212e3b47535f6a76828f98a2aea59f92877f78726f6d666a696a666d6f7379818d929da7aca2978d8074685d5246392d20130700000000000000000000020e1a25313b46535f69737f8c949fa7a79f948f837c75706d676867676869696e737a818c919ca5aaa1978f82766c6155473d331e150b0000000000000000000714212d3a46535f697784919eaa9e918477695f53463a2d1c110600000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d100300000000000000000000000000000000000000000000000006111a22282d30313939393933322f2a241c140a0000000000000000000c18232e39424d57616b73808d949f978d80746a74818e989d938a7e71695f544b40352c21160b0000000000000006101922292f343738393939352d2c28231d150c05000000000000000000000000000000000613202c3945515d676d78797979796f6a5f53473d32271b0f0100000004101b26303942494d4f535353535353534c4b4640372e23190d0200010c18222d363f454a4b53535353504e49423a30231a0f05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000307090e1b2835414e5b6874818e9b9e9184786b5e5145382b1e120b0c1925303a44505b656f7c87929f9e9184796d605853565e6165686a6b6c6c6b6a6865615e57534e463f372e251c110800000000000713202d3a4653606d798693a0aca194877b6e66727f8c99a3a99b8f8275685e5246392d201304111d2935414c5663707d8a97a1a49a8c8073656f7c8895a2aca09386796d6053463a2d20130700000000000000000000000000000000030c17212834404b555f69717e8a939da7a59f92867b73808d95a0aaa1978f82786c60594f443a2f241910060000000000000000000000000000000000000006121f2b37434e58626f7c86929fa4aca399928b837f7b797777767777797c80858e939da4aea49a92857a6d61564c4135291d1105000000000000000000000009141f2a36424d57606d78828f959fa7a69f959087817d79777574747476787b80858e939ca3aaa29892857b6e615a5044352b210c030000000000000000000815222e3b4855616e7b8896a0ab9a8d817467574d42362a1e0a0000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d100300000000000000000000000000000000000000000000030a1117242c33393c3d46464646403f3b352e261c120700000000000000050c121d27303b454f59606d788290979f92877c6f7c87939f958e81746c61574d42392e231a110c060000000000020d17222b333b404445464646413a38342e271e170e060000000000000000000000000000000714202d3a4753606d7a84868686877c6f62594f44382c1d12070000000915212c37424c545a5c606060606060605957514940352a1e12060005111d29343f48505658606060605c5a544c42352b21160b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020e1b2835414e5b6874818e9b9e9184786b5e5145382b1e120008131e27333f49535f6a73808d96a0968d80736a5f534c5254585b5d5e5f5f5e5d5b5854524d47433c342d251c130a0000000000000713202d3a4653606d798693a0aca194877b6e6a7784919daba1978a7d7064564c41362a1e11050d19242f3a4653606d7984919eac9e9184786c6f7c8895a2aca09386796d6053463a2d201307000000000000000000000000000000000b151e29333b45515c676e7b86929fa5a89e938b7e716d79839098a3a99f948c7f736b60564c41352922180d03000000000000000000000000000000000000030f1b26323c47535f6a717e8b939aa2aaa39f95918c8886848483838485898c92979ea5aaa39f93887d70685e52443a3024190d010000000000000000000000030e1a26313b44505c666d7a8390959da5a7a099938e898683828181818385888c92979da5a7a09892867d70695e52483e3323190f00000000000000000003101c28343f4a5465727e8b98a8a3998a7d7064574a3d31261a0e0200000000000000000000000004111e2a3744515d6a7784909d9f9f9c8f8376695c504336291d1003000000000000000000000000000000000000000000040c151c2328363e44494a525353534d4b4740382e24190e0200000000000810171d1e252a333e44505c666e7b85929a9990827982909a989183796d605a50453c302a251e1d1710090000000007131e29333d454c50525353534e4645403930292018100800000000000000000000000000000613202c3945515d67707d8a949a8f82766b605448392f24180c0000000d1925313d49545e65696c6c6c6c6c6c6c66635b51463b2f23160a000915212e3a45505a62656c6c6c6c69665e54473d33271c10040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000205070e1b2835414e5b6874818e9b9e9184786b5e5145382b1e1205020b17222d38414e58606d7984919e9f92877c6f655b5046474b4e5152525352514e4c4846423b37312a221c130a010000000000000713202d3a4653606d798693a0aca194877a6e6f7c8995a0ab9e9185796d6053463a3025190d0108131f2b3844505c6673808d9aa7a196897d706f7c8895a2aca09386796d6053463a2d20130700000000000000000000000000000007121c27303b45505a606d79839098a2aba0968e81756c666e7c86929fa6a69f92877c6f685d52453f342a1f150b010000000000000000000000000000000000000a15202b37434e58616c727f8892989fa3a7a09d99999291909090919298999ea2a9a69f98928b7f726c61564c4132281e13080000000000000000000000000009141f28343f4a545e686d7a838e929d9fa7a49f9b9892908e8e8d8e8f9197999ea1a9a29e9590867d706b60574d42362c22110800000000000000000006121f2c3844505c6675828f9ba89f92867a6d6054473a2d2114090000000000000000000000000004111e2a3744515d6a778490939393938f8376695c504336291d10030000000000000000000000000000000000000000060d161e262e343f485055575f6060605a57524a40352a1f13070000000008121a22282d3036393a3f4a545e69707d88939f948e828e949f92867c6f675d51483e3a3936302d28221b12090000000c18242f3b454f575d5f6060605b53514b423a322a221a11070000000000000000000000000004101d2935404b55616c75828f9c94897c6f63554b4035291d100400000f1b2835414d5a65707579797979797979736d63574b3e3225190c000b1724313d4a56626d7179797979767066594f44382c20150a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002090e1114141b2835414e5b6874818e9b9e9184786b5e5145382b1e12050006111b262f3c45515d67707d8a939e999083776c60564c413e41444546464544423f3b3a36302b262018100a01000000000000000713202d3a4653606d798693a0aca094877a6d74818d9aa8a79a8d8073665c504438291e13080003101c28343f4a54626e7b88959fa89b8e81746f7c8895a2aca09386796d6053463a2d2013070000000000000000000000000000050f18232e39424d57616c74808d95a0aaa39991847a6d605f6a727f8b949fa9a39991847a6d605a50463c31271d1207000000000000000000000000000000000000040f1a26313c46505a636d727e868e92999da0a8aba39f9e9d9c9d9e9fa2aaaaa29f9b948f867e726d62594f443a3020160c0200000000000000000000000000030b17232e38424c565e686d79818990959b9fa2aaa39f9d9b9a9a9b9c9ea1a9a49f9c97928c837b706b60594f453b30241a10000000000000000000000713202d3a4653606d7985929fa99c908376675d5145392c2013060000000000000000000000000004111e2a3744515d6a77838686868686868276695c504336291d100300000000000000000000000000000000000000070f18202830383f44515a61646c6c6c6c66635c52473b2f23170a00000005101a242c33393a4146474a4d5357606b73808c949e938e939e938b7f726a5f55534d4b4746413a39342c241b100600000f1c2834404c5761696b6c6c6c68605c544c443c342c2318120b030000000000000000000000010d18242f3943505a626f7c89949b8e8175675d5145392c1f130600000f1c2936424f5c697582868686868686867f7366594c403326190d000b1825323e4b5865717e8686868682766b6054483c32271b0f030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050d14191e2021272835414e5b6874818e9b9e9184786b5e5145382b1e120500000a141d2935404b55616b75818e989f958b7e72685e52463d3037383939383735322e2d2a251f1a150e060000000000000000000713202d3a4653606d798693a0aca093877a6d7985919eab9f95887b6e62544a3f3428170d0200000b17232e3847535f6a7783909dab9f9285796f7b8895a2aca09386796d6053463a2d20130700000000000000000000000000020c17212834404a545f69717e8a929da7a69f92877c6f675d58606c77828f97a1aba1968e81756d62584e43392f23180f050000000000000000000000000000000000000a15202a343e48515b636c717b81878c919597999c9d9e9e9f9f9f9e9d9b9998928e89827b716c625b51473e32281e0e0400000000000000000000000000000006111c26303a444c565e676d747c83898e9298999b9d9e9f9f9f9f9e9d9b999993908b857f786e6960594f473d33291f120800000000000000000000091623303c4956636f7c8998a2a9998c7f7366554b4135291d1104000000000000000000000000020d17222b36424f5b6771777979797979797670665a4e4235291c0f030000000000000000000000000000000000000810192129323a424a505b636c7079797979736e63574b3f3226190c0000000c17222c363e45494c525457575f6165656d78828f9c9e9b9e9b8f82756d6865615e575754524c49453e362c22170c0000111e2b3744505d697378797979746d665e564e463e3528231c150c04000000000000000000000007121d28313e4754606a7683909c9285796d6053473a2d20140700000f1c2936424f5c6975828f93939393938c7f7366594c403326190d000613202d394653606c7883909994897d7063584e43372b1f130600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050e171f252a2d2e342d35414e5b6874818e9b9e9184786b5e5145382b1e12050000020b18242f39434f59616e7b85929f9f92857a6e61594f43392e232c2c2b2a282521201e1a140f0a03000000000000000000000713202d3a4653606d798693a0aca093867a6f7c8997a1aa9d9083766a5f5342382e23170500000006111c2b37434e5865727f8b99a3a2988a7e717b8895a1aca09386796d6053463a2d201307000000000000000000000000000a141e29333b44515c666e7b85929fa4a99f948c7f726a6055505b656e7a85929ea5a89e938b7e716a5f554b40342921170c020000000000000000000000000000000000030e18222d363f49515a61696e747b8084888b8d8f90919292929291908e8c8985817c766e69615a51493f352c20160c00000000000000000000000000000000000a141e28323a444c555c606b6f777d8185898c8e90919292929291908f8d8a86837e79726d665f574f473d352b20170d0000000000000000000004111d2935414c566673808c99aaa197897c6f6256493c2f24180d0100000000000000000000000007131e29333d454c555f676a6c6c6c6c6c6c69665e54493e3226190d01000000000000000000000000000000000007121a222b333b444c545c606d727e868686868073665a4d4033271a0d000005111d28333e485055565e616467696e7175787c808d99a6a8a6998c807c7875716e696764615e565550483e34281d110500121f2c3845525f6b788586868681786d685f584f473f342e271e160e0600000000000000000000010c161f2b37434e5864717e8a99988a7e7164574a3e3124170700000f1c2936424f5c6975828f9c9f9f9f998c7f7366594c403326190d0005121f2b3744505b656f7c87939d9083776a6054473b2e221509000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020d17202930363a3b413a38414e5b6874818e9b9e9184786b5e5145382b1e120500000007121d27313e46525e68727f8b959f978e81756b60554b4034281f201f1e1b191514120e09030000000000000000000000000713202d3a4653606d798693a0aca093867974808d9aa9a3988b7e7265584e4330261c1106000000000f1a26313c4754616d7a86929faa9b8f82757b8894a1aca09386796d6053463a2d20130700000000000000000000000006111c26303b454f59606d78839097a2ada1978f82786c60584e49535e68707e8a939da8a59f92867c6f675c51453e33291e140a00000000000000000000000000000000000006101b242e373f4850575e61696e73777b7e80828484858686858583827f7d79756f6b625f5750483f372d231a0e040000000000000000000000000000000000020c162029323a434b515960636b7075797c7f82838485868685858382807d7a76726d67605c544d453d352b23190e05000000000000000000000713202c3945525d687683909da99e9285796c605346392d201307000000000000000000000000000c18242f3b454f575d5f60606060606060605c5a544c42382d21160a00000000000000000000000000000000030b1218242c343d454d565d666d747f87929892857b6e6154473b2e21140800000814212d3945505a6164686d7174777b7e8185888d929ca8b3a89c928c8885817e7b7774716d6864615a5045392d211508000c1926323f4c5965727f8c93938e827a6f6a615951444039302820180f0700000000000000000000040d1b27323d4754606d7a86929a8d8174675a4e412f24180d01000f1c2936424f5c6975828f9ca8aca6998c7f7366594c403326190d00030f1b27333f49535f6a75828f9b95887c6f6255493c31261a0e02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009141f29323b4246474d4745404e5b6874818e9b9e9184786b5e5145382b1e1205000000010b151f2a36414d56606c788390999e93897d70675c51453c31261a0e110f0c0807050200000000000000000000000000000713202d3a4653606d798693a0afa39986797884919eab9f92867a6d6054473c3121150a00000000000a15202d3946525d6875828f9ba99f92867a7b8894a1aca09386796d6053463a2d2013070000000000000000000000050e17232e38424d57616b73808d959fa9a49e92857b6e665b5046414d56616c74818e96a0aba2989083796d605a50453b30261c110600000000000000000000000000000000000009121c25333d45454d52575f62666a6e71737577787879797978777573706d67636059534d453e362d251b110800000000000000000000000000000000000000050e1720333d454c504f54596063676d70727576787879797878777573706d6865605d55504a423c332b2319110700000000000000000000000714212d3a4754606d7a86929fa89b8e8175665b5044382b1f1206000000000000000000000000000f1c2834404c5761696b6c6c6c68605c544c504e49423a31261c1005000000000000000000000000000000050c151d2328363e464f575f686d78818c939993877d70695e52463a2d20140700000a1723303d4955616c71777a7e8184888b8e9297999e9ea1a9a39f9e9997918e8b8784817e7a77716c6155493d3024170a000b1825313e4a56626d75818f969490847c706b625b514a423a322a2119110600000000000000000915202b353f4745515d677683909c9083766a554b4035291d1004000f1c2936424f5c6975828f9ca8b2a6998c7f7366594c403326190d00000b17222d38414e58636f7c89959a8d807367574d42372b1e120600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020e1925303b444d52545a53514b4e5b6874818e9b9e9184786b5e5145382b1e120500000000030d1925303b44505b666f7c87929f9e9184796d60574d42372b20160c02000000000000000000000000000000000000000713202d3a4653606d798693a0ac9f9286797c8996a1a89b8e8175685d5245392c201303000000000005111d2935414c5663707d8a97a1a2988a7d7b8794a1aca09386796d6053463a2d20130700000000000000000000020b172028343f4a545e69707d8a929da7a79d928a7d70695e544a3f3b44505a606d79849199a3aaa0958d80746c61574d42382e23170e0400000000000000000000000000000000000c18242f3a454f575c5f606059575f626466696a6b6b6c6c6c6b6a686663605d55544f47423c332d241b130900000000000000000000000000000000000000000c18242f3a454f575c5f606059555c606366686a6b6c6c6c6c6b6a686664615e5653514b443f38302a211911080000000000000000000000000a1724313d4a5764707d8a99a3a7988b7e7165544a3f33281c0f0300000000000000000000000000111e2b3744505d697378797979746d665e564e463e3528231c150c040000000000000000000000000000060e161e272e344048505960696e7a828e939f948c7f736b60574d42362a1e110500000b1724313e4a5764717e83878a8e9196989b9e9c97919197a1989292979c9e9b9896918e8a87837e7164574b3e3124180b000916222e3a46515b606d7a8491989691867d726d605c544c443c332b2317110a020000000000010e1a26313d4751595e556673808d99928578675d5145392c201306000f1c2936424f5c6975828f9ca8aa9f998c7f7366594c403326190d000006111b262f3c4854606b7783909d918478695f53473a2d2114080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005111e2a36424d565e6167605c554e5b6874818e9b9e9184786b5e5145382b1e1205000000000008141f28333f4a545f6a73808d96a0968c8073695f53473e32281e1308000000000000000000000000000000000000000713202d3a4653606d798693a0ac9f928579808d9aa8a196897d7063564c4135291d11040000000000010d1924303a4653606d7985929eaa9b8e817a8794a0b5a09386796d6053463a2d201307000000000000000000000a141d29323b44505c666e7b85929ea4aaa0958d80746c61574d4238323e45515d676f7c87929fa7a79d928a7e70695e544a3f342820160c02000000000000000000000000000000030f1c2834404c5761686b6c6c66635b55585a5c5d5e5f565e61666a6c6c6a66605d564e463c322a211b12090100000000000000000000000000000000000000030f1c2834404c5761686b6c6c66635b5356595b5d5e5f565e61666a6c6c6a66605d564e463c342e261e180f0800000000000000000000000005121e2b37424d576774818d9aaba095877b6e6154483b2d22170b0000000000000000000000000000121f2c3845525f6b788586868681786d685f584f473f342e271e160e06000000000000000000000000070f18202830394045525a616b6f7b838f949d968f82776c60594f453b30251a0e0200000a1724313d4a5764707d8a939a9a9ea09e9a938f8a8585919e9286858a8f93999ea09e9a9a938a7d7164574a3e3124170b0006121e29353f45525d686f7c86929f9892877f746d665d564d453d3528231c140c030000000004111d2a36424e59636a6c6c727f8b9897867a6d6053473a2d201407000f1c2935424f5c6875828f9b9f9d93938c7f7366594c403326190d000007111b252c38444f596673808c9996887b6e6155483b2e221508000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714202d3a46525e696e746d675f585b6874818e9b9e9184786b5e5145382b1e12050000000000020b17222d38424e58606d7984919e9f92867b6e625a50443a3024190c030000000000000000000000000000000000000713202d3a4653606d798693a0ab9f92857884919eac9e9184786c6053463a2f24190d0100000000000008131f2c3844505c6673808d9aa79e9285798699a3afa09386796d6053463a2d20130700000000000000000006111c262f3b444f59606d78829097a1ada3989083796d605a50453b2f2935404b55606a73808c959faaa49f92857b6e665c50443d32281e130800000000000000000000000000000005111e2b3744505c6873787979736d63574b4d4f50555d60686d7276787977736d685f584e443b3025190e02000000000000000000000000000000000000000005111e2b3744505c6873787979736d6357494c4f50555d60686d7276787977736d685f584e443b3025190c06000000000000000000000000000714212d3a46535f697784919eaa9d918477695e52463a2d1c110600000000000000000000000000000c1926323f4c5965727f8c93938e827a6f6a615951444039302820180f0700000000000000000000071019212a323a434b515b636c717d8591959f9991847a6d655b50473d33291f14090000000713202d3a4653606d7985929f9f9c97928d87827d7883909c9285787d82878c91969b9f9f9285796d6053473a2d20140700010d18232935414c565f6a727e8b939e99938c81786d685f574f473f342e261e150c0300000006121f2c3845525e6a757979797e8a9794877b6e6154483b2e211508000e1b2835414e5b6874818e9b95898686867f7366594c403326190d00010d18232d373f464956636f7c8999978a7d7164574a3e3124170b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7b80796f6a605b6874818e9b9e9184786b5e5145382b1e120500000000000006111c262f3c45515d67707d8a939e988f82766c61564c4135291e150a0000000000000000000000000000000000000713202d3a4653606d798693a0ab9e92857b8896a1a49a8c8073655b504437281e13080000000000000003101c28343f4a54626f7c8895a0a197897c86929faca09386796d6053463a2d2013070000000000000000050e17222d38424c56606b73808d949fa9a69f92867c6f675d51473e3329242f3a434e58606d78839098a2ada2979082786d60594f443a3025191006000000000000000000000000000005121f2c3845525f6b788586867f7366574d4e535a61676d727a7f83858584807a6f6a5f564d42362a1f1408000000000000000000000000000000000000000005121f2c3845525f6b788586867f7366574d4e535a61676d727a7f83858584807a6f6a5f564d42362a1f1408000000000000000000000000000815222e3b4855616e7b8896a0aa9a8d807467574d42362a1e0a0000000000000000000000000000000b1825313e4a56626d75818f969490847c706b625b514a423a322a211911060000000000000000040f19222b333c444c555c606d737e869297a09f92877c6f685d53493f352b20170d0200000006131f2c3845515c6775818e9a948f8a85807b76717783909d92857971767b80848a8f92998e8175675d5145382c1f13060000070d19242f3a434e58626d75818e95a09f928e827a6e69605951443f3830271e150b0000000613202c3946535f6c798786868a909a95887b6e6255483b2f221508000e1b2734414e5a6774818d9a9083797979736d63574b3e3225190c0006121e29353f49515759606d798692998c7f7366594c403326190d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000815212e3b4854616e7b87837c726c656874818e9b9e9184786b5e5145382b1e1205000000000000000a141d2935404b55616c75828f989f948a7e71685d52453d30261c110600000000000000000000000000000000000713202d3a4653606d798693a0ab9e91847f8c99a89f93877b6e6153493f3327160c0100000000000000000c17232e3847535f6a7783909da9998c7f85929faba09386796d6053463a2d20130700000000000000020b162028333f4a545e68707d88939fa6a99e938b7f726a5f554b40352c201d28313d44505c666e7b86929fa6a99f948c80736b60564c41352922180d030000000000000000000000000004101d2a3743505d6a7683908f8276695e54585f626c71797f858c909292908c857c6f695e52463b3025190e020000000000000000000000000000000000000004101d2a3743505d6a7683908f8276695e54585f626c71797f858c909292908c857c6f695e52463b3025190e02000000000000000000000003101c28343f4a5465727e8b98a8a398897d7063564a3d30251a0e0000000000000000000000000000000916222e3a46515b606d7a8491989691867d726d605c544c443c332b2317110a020000000000000a16212b343d454d565e676d757f8a9298a19e938b7f726a60564c41382d23190e050000000004101c2834404b5564707d8a8d88837e79736e696a7784919d9886796d696e73787d82868c8a7d7064554b4035291d100400000008131e28313c46515b606d79839198a29d948f847b706b625b504a423930271d120700000613202c3946535f6c79869293979aa295887c6f6255493c2f221609000d1a2733404d5a6673808d99918578666c66635b51463b2f23160a000916222e3a46515b62656c667885919a8d8174675a4e4134271b0e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000815212e3b4854616e7b8790867f776e6974818e9b9e9184786b5e5145382b1e120500000000000000020b18242f3a43505a616e7b86929f9e92857a6d60594f42382e23170c03000000000000000000000000000000000713202d3a4653606d798693a0aa9e918482909caa9c8f8276695f5341382d22170400000000000000000006111c2b37434e5865727f8b99a39d908384919eaba09386796d6053463a2d201307000000000000000a141d28323a44505b666e7a85929aa4aba1968f82756d62584e43392f231a161f28343f4a545f69717e8b939ea9a69f93877d70685e52463f342a1f150b01000000000000000000000000020f1b2835424e5b6875818e92877b6e6663646a6f767e848c92989d9f9f9d9791857b6e61564d41362a1e110500000000000000000000000000000000000000020f1b2835424e5b6875818e92877b6e6663646a6f767e848c92989d9f9f9d9791857b6e61564d41362a1e1105000000000000000000000006121f2c3844505c6675828f9ba89f9286796d6053473a2d20140900000000000000000000000000000006121e29353f45525d686f7c86929f9892877f746d665d564d453d3528231c140c0300000000030f1b27323d464e575f686d79818c929fa3a0958e81756d62584e443a2f261b11080000000000000c18232e3a4653606d7984807b76716d66615f6b7884919e93877a6d6061666c70757a7f83796d6053463a2f24180c00000000010c161f2a343f45515d676e7c86929fa59f9691857d726d605c544b42392e23180c00000613202c3946535f6c7986929fa4a6a295887c6f6255493c2f221609000b1825323e4b5865717e8b989286796d605957514940352a1e1206000b1825313e4a57626d7279797983909b8e8275685b4f4235281c0f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000815212e3b4854616e7b8798928c827b7174818e9b9e9184786b5e5145382b1e1205000000000000000007131d28313e46525e69727f8c95a0978e81746b60544a3f34281f1409000000000000000000000000000000000713202d3a4653606d798693a0ab9e918587929fa2988b7e7164574d422f261b1106000000000000000000000f1b26313c4754616d7a86929f9f928785929eaba09386796d6053463a2d20130700000000000006111b262f3a444f59606c78828f97a1aca49991847a6d615b51463c31271d110d17232e38424d57626d75828f97a1ada49991847a6d615b51463c31271d1207000000000000000000000000000c1926333f4c5966727f8c998f8279727071757c838a91969fa2aaa3a3a9a1978e8174685e5246392d20140600000000000000000000000000000000000000000c1926333f4c5966727f8c998f8279727071757c838a91969fa2aaa3a3a9a1978e8174685e5246392d20140600000000000000000000000713202d3a4653606d7985929fa99c8f8276675d5145382c1f1306000000000000000000000000000000010d18232935414c565f6a727e8b939e99938c81786d685f574f473f342e261e150c0300000007131f2c38434e5860696e7a828e939ca4a2989183796d605b51463d32281d140a0000000000000007131f2c3845515c676d78746e6a64605c545f6b7885929e94877b6e61545b6063686e72776d675c5145382c1d12070000000000040d18222935404b555f6a717e8a939da7a09792877f746d665c544b4034281c1004000613202c3946535f6c7986929facafa295887c6f6255493c2f221609000916232f3c4956626f7c899a99897c6f6356494640372e23190d02000c1926323f4c5965727f86868689959c8f8275695c4f4236291c0f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000815212e3b4854616e7b879298948f857e74818e9b9e9184786b5e5145382b1e12050000000000000000010c161f2a36424d57606d788390999f93887c6f665c50443b31251a0d040000000000000000000000000000000713202d3a4653606d798693a0ada197919299a39f9285796d6053473b3120140a00000000000000000000000a15202d3946525e6875828f9ba399929297a1ada09386796d6053463a2d2013070000000000040e17222d38414c56606b737f8c949fa9a79f93877d70685e52493f342a1f150b06111c26303c45505a616d7a85919ea4aba1968f82756d62584e43392f24180f060000000000000000000000000a1623303d495663707c8998948f837e7d7e828790949ea1a19e9996979a9f9f92877b6e6154473b2d22170b00000000000000000000000000000000000000000a1623303d495663707c8998948f837e7d7e828790949ea1a19e9996979a9f9f92877b6e6154473b2d22170b0000000000000000000000091623303c4956636f7c8997a2a9988c7f7265554b4035291d100400000000000000000000000000000000070d19242f3a434e58626d75818e95a09f928e827a6e69605951443f3830271e150b0000000915222e3b4854606a6f7b8490949ea5a49f92867c6e675d51493f342b20160b020000000000000004101c2834404b555c666c66625f575351505b657985929f95887b6e62555053565e61666a605c554b4034281c0b01000000000000071018242f39434e58616c74818e95a0a9a299928b80786d665c5145382c1f1306000613202c3946535f6c7986929facafa295887c6f6255493c2f221609000714202d3a4753606d7a8693998c807366594f44382c251c120700000c1926323f4c5965727f8c93939da09c8f8276695c504336291d10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202d394653606c787f86909597928a81818e9b9e9184786b5e5145382b1e1205000000000000000000040d1a25303b44505c666f7c87939f9a9083786d60574d42362a1f160c0100000000000000000000000000000713202d3a4653606d798693a0b3a9a19e9fa3a89a8e8174675d5145392c1f1302000000000000000000000005111d2a36414c5664707d8a97a1a39f9ea1a9b3a09386796d6053463a2d20130700000000020c162027333f49535e686f7d87929fa6aa9f958d80736b60564c41372d22180d03000a151e2a333f46525e68707d8a929da8a89e938b7f726a5f554b40352921170d0300000000000000000000000713202d3a4653606d7985929f95908b898b8f93999fa39f97918c8a8a8e9299998c7f7265544a3f33281c0f03000000000000000000000000000000000000000713202d3a4653606d7985929f95908b898b8f93999fa39f97918c8a8a8e9299998c7f7265544a3f33281c0f0300000000000000000004111d2935414c566673808c99a9a197887c6f6255483c2f24180c00000000000000000000000000000000000008131e28313c46515b606d79839198a29d948f847b706b625b504a423930271d120700000916232f3c4956626f7c85919693939393928a7e716a5f554b40372d22190e040000000000000000000c18232e39434b545b605b54534e464653606c7986939f95897c6f625649464c5254595d53514b43392e23180c000000000000000007121d28313c46505a606d7983909893939393928d82796d6053463a2d201307000613202c3946535f6c7986929facaca295887c6f6255493c2f221609000613202c3945515d677783909d9083776b6054483d30261c110600000c1926323f4c5965727f8c989faaa99c8f8376695c504336291d100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006121f2b3844505b666c727c838c9299938e8e939e9e9184786b5e5145382b1e12050000000000000000000009141f28343f4a54606a74808d97a0958c7f72695e53463e31281d130700000000000000000000000000000713202d3a4653606d798693a0acb3adabacaca095897c6f62554b4035291d10040000000000000000000000010d1925303a4653606d7985929eabacabadb3aca09386796d6053463a2d2013070000000008131e28323a44505b656d7a849199a3aea2989083786d60594f443a30251b10060000030c18212a36414c56616b74808d95a0aba69f92867c6f675d51453e33291f1409000000000000000000000006131f2c3845515c6774818d98a09d9896979b9fa49f99928d85807d7d818792998f8276665b5044382b1f12060000000000000000000000000000000000000006131f2c3845515c6774818d98a09d9896979b9fa49f99928d85807d7d818792998f8276665b5044382b1f12060000000000000000000613202c3945525d687683909da99e9185786c605346392d201307000000000000000000000000000000000000010c161f2a343f45515d676e7c86929fa59f9691857d726d605c544b42392e23180c00000d1a2633404d59667380868686868686868680746c61574e43392f251b10070000000000000000000007121d273039424a5053504a47423c4753606d7a869aa496897c706356493d4146474c504645403930271d12070000000000000000010c161f2a343e45515c676e7b8586868686868686867a6e6154473b2e211408000613202c3946535f6c7986929f9f9f9f95887c6f6255493c2f2216090004101d2935404b556673808c9995897d7063584e42382e23170b00000c1926323f4c5965727f8c98a5b2a99c8f8376695c504336291d1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1c28333f4a545b606a6e787f8690959b9b9ea59e9184786b5e5145382b1e120500000000000000000000030b17232e38424e58606d7a84919e9f92867b6e615a50433a2f24180d01000000000000000000000000000713202d3a4653606d798693a0acacacacb5ab9d9184776a605443392f24180c0000000000000000000000000008131f2c3844515c6674808d9aa7b1acacacaca09386796d6053463a2d201307000000010d1924303a444e58606c77828f96a1aba59f92857b6e665c50473d32281e130900000000060f1925303a444f59606d79839199a3aea3989183796d605a50453b31261a0e020000000000000000000004101c2834404b55616e7b86929fa4a5a3a4a7a09d948f868079737070747d87939285796c605346392d2013060000000000000000000000000000000000000004101c2834404b55616e7b86929fa4a5a3a4a7a09d948f868079737070747d87939285796c605346392d2013060000000000000000000714212d3a4754606d7a86929fac9b8e8174655b5044372b1f120500000000000000000000000000000000000000040d18222935404b555f6a717e8a939da7a09792877f746d665c544b4034281c1004000c1925323f4b57636d737979797979797979746e645a50453c31281d12090000000000000000000000000b151e272f383f4446443f38373a4754616d7a8794a0978a7d7064574a3d36393b3f443a38342e271e150b00000000000000000000040d18222934404b555f696e78797979797979797976685e5246392d201407000613202c3946535f6c7986929393939393887c6f6255493c2f22160900010d18242f3b4855616e7b88949c8f82756a60544a3f34281c1003000c1926323f4c5965727f8c98a5aca99c8f8376695c504336291d1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b17222d38424a50585f666d727c838c9299a0a79e9184786b5e5145382b1e1205000000000000000000000006111c26303d45515d67717e8a949e988f82756c61554b4035291d1104000000000000000000000000000713202d3a4653606d7986939f9f9f9f9f9fa3998c7f7266584e4331271d12070000000000000000000000000004101c2834404a54626f7c8895a09f9f9f9f9f9f9386796d6053463a2d20130700000004111d2935414c56606a727f8c949ea8a89e938a7e71695f544a3f352b20160c00000000000008131e29323e45515d676f7c87929fa69fa0958e81746c61574d42362a1e120500000000000000000000000c18232e3946525e69727f8b929b9e9f9e9b959089827b736d6763646b74818e98887b6e6255483b2f22150800000000000000000000000000000000000000000c18232e3946525e69727f8b929b9e9f9e9b959089827b736d6763646b74818e98887b6e6255483b2f2215080000000000000000000a1724313d4a5764707d8a99a3a49a8a7e716453493f33271b0f030000000000000000000000000000000000000000071018242f39434e58616c74818e95a0a9a299928b80786d665c5145382c1f1306000a16232f3b47525b63666c6c6c6c6c6c6c6c67645c52483e332a1f160c00000000000000000000000000030c151d262d33383938332d2e3b4854616e7b87949f978a7e7164574b3e312d2e33372d2c28231d150c030000000000000000000000060f18232f39434d575f616c6c6c6c6c6c6c6c6c6c5e564c41362a1e1105000613202c3946535f6c7987868686868686867c6f6255493c2f22160900000714212d3a47535f6975828f9c93877c6f665c5044382b1f1206000c1926323f4c5965727f8c989f9f9f9c8f8376695c504336291d10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006111c262f383f444e545c606a6f788087909593939184786b5e5145382b1e12050000000000000000000000000a141e2935414c55616c75828f9893948a7d70675d5145392c201306000000000000000000000000000713202d3a4653606d7986939393939393939392867b6e6154473d3221150b0100000000000000000000000000000c18232e394754606a778390939393939393939386796d6053463a2d2013070000000713202c3945525d686f7c879293939393968e81746c61574d42382e23190e04000000000000020c17202935404b55606a727f8c9493939393938a7e71695f53463a2d211407000000000000000000000007121d2a36424d56626d7380898f9292918f8a837d766e69605d5559626f7c89988a7d7063574a3d3024170a000000000000000000000000000000000000000007121d2a36424d56626d7380898f9292918f8a837d766e69605d5559626f7c89988a7d7063574a3d3024170a0000000000000000000e1b2734414e5a6774818d93939393877a6d6154473a2d22170b0000000000000000000000000000000000000000000007121d28313c46505a606d7983909893939393928d82796d6053463a2d2013070007131e2a35404952575960606060606060605a58524a40362c21180d040000000000000000000000000000030b141c22282b2d2b28222f3b4855626e7b889393938b7e7265584b3f322521262a201f1c18120b030000000000000000000000000007121d27313c454d53555f60606060606060605f524c443b3025190e020006121f2c3845525e6a757979797979797979766a6054473b2e221508000006121e2b37424d57626f7c89939a9083786d6053463a2d201307000c1926323f4c5965727f8c93939393938f8376695c504336291d100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a141d262d333c424a50585f666d737c838686868684786b5e5145382b1e1205000000000000000000000000020c19242f3a43505a616e7b8686868686847a6d6053473a2d201407000000000000000000000000000713202d3a4653606d78868686868686868686868275685e5246392d20140300000000000000000000000000000007121c2b37434e5865727f86868686868686868686786d6053463a2d2013070000000714212d3a4754606d7a848686868686868684796d605a50453b30261c11070000000000000000050e18242f39434e58606c788286868686868686857b6e6155483b2e2215080000000000000000000000000e1925303b44515b636e737d82858684827d78706b625f57514b53606d788686867f7265584c3f3225190c0000000000000000000000000000000000000000000e1925303b44515b636e737d82858684827d78706b625f57514b53606d788686867f7265584c3f3225190c000000000000000000111e2b3844515e6b778486868686868377685e5246392d1b110600000000000000000000000000000000000000000000010c161f2a343e45515c676e7b8586868686868686867a6e6154473b2e21140800020d19242e3740474b4d53535353535353534d4c4740382f241a0f0600000000000000000000000000000000020a11171c1f201f1c222f3c4955626f7c86868686867f7265594c3f322619191d1313100c07000000000000000000000000000000010b151f2a333c4246485253535353535353535346413b32291e1408000004111d2a36424e59636a6c6c6c6c6c6c6c6c6260584e43372b1f13060000020e1a26313c4754606a7581868686867f7265584c3f3225190c000c1926323f4c5965727f868686868686868276695c504336291d10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020b141c222830383f444e545c606a6f77797979797872685c5043372a1d11040000000000000000000000000008131e28313e46535f696e7979797979786d675d5145392c2013060000000000000000000000000006121f2c3844505c667679797979797979797979757065564d41362a1e1105000000000000000000000000000000000f1b27323c4a57626d727979797979797979797976665c5044382c1f12060000000713202c3945525d686d7879797979797979776d675d51483e33291e150a0000000000000000000007121d27313c44505b666c7679797979797979786e695f53463a2d21140700000000000000000000000009141f29323f49525c636b707578797875706c656059534d4544505c6674797979726d62564a3e3124180b00000000000000000000000000000000000000000009141f29323f49525c636b707578797875706c656059534d4544505c6674797979726d62564a3e3124180b000000000000000000111d2a37434f5c6772777979797979777167564c41362a1e0a000000000000000000000000000000000000000000000000040d18222934404b555f696e78797979797979797976685e5246392d201407000007121c252e353b3f404646464646464646413f3c362f261d120800000000000000000000000000000000000000060b0f12131215222e3b4754606a767979797979726d63574a3e3125180c11070604000000000000000000000000000000000000030d18212a31373a3b4546464646464646463b3936302920170d020000010e1a26313d4751595e5f6060606060606055544e463c32271b0f0300000009151f2b38434e58656f7579797979726d62564a3e3125180b000b1825313e4a57626d72797979797979797670665a4e4235291c0f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020a11171e262e343c424a51585f626a6c6c6c6c6b6860564b3f33271b0f0200000000000000000000000000010c161f2a36424d575f616c6c6c6c6c6b605d554b4035291d11040000000000000000000000000003101c28343f4a545c6c6c6c6c6c6c6c6c6c6c6c69655e54443b3025190e02000000000000000000000000000000000a15202e3a46515b62656c6c6c6c6c6c6c6c6c6c6c5c544a3f34281c100300000004111d2935414c565d606b6c6c6c6c6c6c6c6b605d554b40362c21170c0300000000000000000000010b151f28333f4a545b60696c6c6c6c6c6c6c6c615f574d42362a1e1205000000000000000000000000020d17202d37404952596063686b6c6b6864605b534f47423c3f4a545c6a6c6c6c65625b51463a2e221509000000000000000000000000000000000000000000020d17202d37404952596063686b6c6b6864605b534f47423c3f4a545c6a6c6c6c65625b51463a2e2215090000000000000000000f1b27333f4b5660676b6c6c6c6c6c6a675f55443a3025190d00000000000000000000000000000000000000000000000000060f18232f39434d575f616c6c6c6c6c6c6c6c6c6c5e564c41362a1e11050000000a131c242a2f323339393939393939393433302b241d140b0000000000000000000000000000000000000000000003060606131f2b37434e5860626c6c6c6c6c65635b51463a2e2216090400000000000000000000000000000000000000000000060f181f262b2d2e3939393939393939392e2d2a251e170e05000000000915202b353f474e5253535353535353534947433c342b20150a00000000030f1b27323d46535d65686c6c6c6c65625b51463a2e221609000916222e3a46515b62656c6c6c6c6c6c6c69665e54493e3226190d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060c141c2328303940444e54555d606060605e5c564e443a2f23170b000000000000000000000000000000040d1a26313b454d53555f606060605e53514b433a2f24180d0100000000000000000000000000000c17232e38424a505f606060606060606060605c5a544c4232291f1408000000000000000000000000000000000004121e29353f49515759606060606060606060605f504a42382e23170c00000000010d1924303a444c52545e606060606060605e53514b433a2f241a0f06000000000000000000000000030d17222d38424a50535d606060606060605f55534d453b31261a0e0200000000000000000000000000050e1b252e3740474f54565c5f5f5e5c57535049413d373138424a50535f6060585651493f34291e120600000000000000000000000000000000000000000000050e1b252e3740474f54565c5f5f5e5c57535049413d373138424a50535f6060585651493f34291e12060000000000000000000b17232e3a444e565c5e60606060605d5b554d4332291e1308000000000000000000000000000000000000000000000000000007121d27313c454d53555f60606060606060605f524c443b3025190e02000000010a12191e2325262d2d2d2d2d2d2d2d2726241f19130b0200000000000000000000000000000000000000000000000000030f1b27323c464e54556060606060595751493f352a1e1206000000000000000000000000000000000000000000000000060e141a1e21222c2d2d2d2d2d2d2d2d21201e19140d050000000000040f19242d353d424546464646464646463c3b37322b22190f0400000000000a16202b34414b53595b60606060585651493f34291e12060006121e29353f49515759606060606060605c5a544c42382d21160a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020a11171e272e343c434749515353535351504b443c32281d12070000000000000000000000000000000009141f29333b4246485253535353514745403a31281d130700000000000000000000000000000006111c2630383f4453535353535353535353534f4d4942393020170d020000000000000000000000000000000000010d18232d373f464a4c5353535353535353535353443f3830261c1106000000000008131e28323a4145475153535353535353514745403a31281d1208000000000000000000000000000006111c262f383f44465053535353535353524846423b33291f140900000000000000000000000000000009131c252e353d4448494f5253514f4a46443f382f2b2630383f44465353534c4a463f372d23180d01000000000000000000000000000000000000000000000009131c252e353d4448494f5253514f4a46443f382f2b2630383f44465353534c4a463f372d23180d0100000000000000000006121d28323c444b4f515353535353504f4a433b3120170d020000000000000000000000000000000000000000000000000000010b151f2a333c4246485253535353535353535346413b32291e1408000000000000070d1316191a20202020202020201a1a17130e08010000000000000000000000000000000000000000000000000000000a15202b343c43474953535353534c4a463f372d23180d010000000000000000000000000000000000000000000000000003090e1214151f20202020202020201414110e08020000000000000008121b242b31363839393939393939392f2e2b2720191007000000000000040f19222f3941484d4e535353534c4a463f372d23180d0100010d18232d373f464a4c53535353535353504e49423a31261c1005000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060c151c232832373b3c444646464645433f3a322a20160c0100000000000000000000000000000000030d17212931363a3b4646464646453a39352f281f160c01000000000000000000000000000000000a151e262e3438464646464646464646464642413d3730271e0e050000000000000000000000000000000000000007111b252d353a3e3f464646464646464646464638342e261e150a000000000000020c1620283035393a4546464646464646443a39352f281f160c000000000000000000000000000000000a141d262d3338394346464646464646453b3a36312921170d03000000000000000000000000000000010a131c232b33383c3d42454645423d3937332d261d1e262e34383a4646463f3e3a342d251b1106000000000000000000000000000000000000000000000000010a131c232b33383c3d42454645423d3937332d261d1e262e34383a4646463f3e3a342d251b110600000000000000000000010c16202a323a3f4344464646464644423e3931291f0e0500000000000000000000000000000000000000000000000000000000030d18212a31373a3b4546464646464646463b3936302920170d020000000000000002070a0c0d13131313131313130e0d0b07030000000000000000000000000000000000000000000000000000000000040e19222b32373b3c46464646463f3e3a352d251c11070000000000000000000000000000000000000000000000000000000002050708121313131313131313080705020000000000000000000009121920262a2c2c2d2d2d2d2d2d2d22221f1b150f07000000000000000007101d272f373d4042464646463f3e3a342d251b110700000007111b252d353a3e3f4646464646464643423e3831281f150a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b121820262b2e2f37393939393837332f2820180f05000000000000000000000000000000000000060f171f262a2d2e3939393939382d2c29241d160d040000000000000000000000000000000000030c151c23282c39393939393939393939393635312c261e150c0000000000000000000000000000000000000000000a131b23292e313239393939393939393939392c28231c150c0300000000000000040e161e24292c2d3839393939393939382d2c29241d160d0400000000000000000000000000000000020b141c22282b2d3639393939393939392e2d2a261f170f060000000000000000000000000000000000010a111921272c2f303538393835312d2b27221b14151c23282c2d39393932312e29231b13090000000000000000000000000000000000000000000000000000010a111921272c2f303538393835312d2b27221b14151c23282c2d39393932312e29231b1309000000000000000000000000040e1820282e33373839393939393736332e271f170d000000000000000000000000000000000000000000000000000000000000060f181f262b2d2e3939393939393939392e2d2a251e170e05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007101920272b2e2f393939393932312e2a231c130a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080f151a1d1f20202020202020201615130f0a04000000000000000000000b151d252c3134353939393932312e29231b130900000000000a131b23292e3132393939393939393635322d261f160d0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070c151b1f22222a2d2d2d2d2b2a27231d160f060000000000000000000000000000000000000000060d141a1e21222c2d2d2d2d2b20201d18130c0400000000000000000000000000000000000000030a11171c1f2d2d2d2d2d2d2d2d2d2d2d292825211b140c03000000000000000000000000000000000000000000010a11181e2225262d2d2d2d2d2d2d2d2d2d2d1f1c17110a03000000000000000000040c13191d20212b2d2d2d2d2d2d2d2b20201d18130c04000000000000000000000000000000000000020a11171c1f202a2d2d2d2d2d2d2d2c22211e1a140d060000000000000000000000000000000000000000070f161c202223292c2c2b2924201f1b17110a0a11171c1f202c2d2d2524221e1811090100000000000000000000000000000000000000000000000000000000070f161c202223292c2c2b2924201f1b17110a0a11171c1f202c2d2d2524221e1811090100000000000000000000000000060e161d23272a2b2d2d2d2d2d2a2926221c150d0500000000000000000000000000000000000000000000000000000000000000060e141a1e21222c2d2d2d2d2d2d2d2d21201e19140d0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070e151b1f22222d2d2d2d2d2625221e18110a010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004090e1112131313131313131309080603000000000000000000000000030b131a202427282d2d2d2d2525221e181109010000000000010a11181e2225262d2d2d2d2d2d2d292926211c150d04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040a0f1315161e202020201e1d1b17120c050000000000000000000000000000000000000000000003090e1214151f202020201e1413110d070100000000000000000000000000000000000000000000060c101220202020202020202020201c1b1915100902000000000000000000000000000000000000000000000000070d12161819202020202020202020202012100c0600000000000000000000000002080d1113141e202020202020201e1413110d0701000000000000000000000000000000000000000000060b0f12131d202020202020201f1514120e090300000000000000000000000000000000000000000000050b101316161c1f201e1c1713120f0b060000060c101213202020191815120d0600000000000000000000000000000000000000000000000000000000000000050b101316161c1f201e1c1713120f0b060000060c101213202020191815120d0600000000000000000000000000000000040c12171b1d1e20202020201d1d1a16110b0300000000000000000000000000000000000000000000000000000000000000000003090e1214151f20202020202020201414110e0802000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040a0f1315162020202020191816120d0700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001090f14181b1b20202020191816120d07000000000000000000070d12161819202020202020201d1c1916100a0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003060809111313131312110f0b07010000000000000000000000000000000000000000000000000002050708131313131312070604010000000000000000000000000000000000000000000000000000030613131313131313131313130f0f0d09040000000000000000000000000000000000000000000000000000000106090b0c13131313131313131313130603000000000000000000000000000000000104070712131313131313131107060401000000000000000000000000000000000000000000000000000306061013131313131313120807050200000000000000000000000000000000000000000000000000000407090a0f1213120f0a0605030000000000000306071313130c0b090601000000000000000000000000000000000000000000000000000000000000000000000407090a0f1213120f0a0605030000000000000306071313130c0b09060100000000000000000000000000000000000001060b0f1111131313131311100e0a06000000000000000000000000000000000000000000000000000000000000000000000000000205070812131313131313131308070502000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000306080913131313130c0c09060100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004080c0e0f131313130c0b09060100000000000000000000000106090b0c13131313131313100f0d0a05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 m_StreamData: + serializedVersion: 2 offset: 0 size: 0 path: diff --git a/Assets/UI/Mockups/LeaderBoard_Atlas.png b/Assets/UI/Mockups/LeaderBoard_Atlas.png new file mode 100644 index 0000000000000000000000000000000000000000..f01880449625732362c70bebc06732b494371c56 GIT binary patch literal 428902 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 z

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 z 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

K@Qv@{sjb*Vx1;i;YlF`T-Y~G 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 z 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

Lkk4ctH93KXySoZneBy{XXrg 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

tt~<5{?;7_w#5Pv){3CZ{U#gq(M~v#RBC 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

-(~5>ept#OjrFtKQi^- zwRm+lHsK`xN|@)cO8?6lT83qK$)lrH>*Cvt;9ZU zyYA!*Sdh~^q_-+Iqr-I&R&*~|MA02K97H7fM48hd5PS^5oxF|JVgs(i#*c_`n~~I6 zHIS`Gh0c_X{5+4lNqXH@!V7ATF+F2F=O(<}fiMfbVTlQBjt(5lG%UsUz3g|dWSGYhXuy>G*?M@v)6LPd=`tF_rJpo(2h3 z`m(W9vwLijHLcpch2LZP^RsenO7-WAZR<|Asw>vLWYJOQ{eyPAdnJ{!II@&6=C)!J z%zFkGebYp;2|pb3?W4VQ?+b+IaAEsk8sOsw0N; z{9uGTv${c;{L*@p?6TJ{Je}BtUYMhZno;T##&l*bmt=fHy(8kyv3C_#z`pvUdB^;s z+V+dp7WPN(rYqaKOq|N{nxaOTS1Rfv=#(%G?~6Pp&3Zg_WG2hcL@T)kJon<^$jK1u z>RfyIvh9AEYBFW&Zr^bpZ1=N9Xnr|$XNxZCQ|=J)9-`OG0!rXO$e!T-d+~lKePCJ_&3i$uTih!ZDl7-ZwS5 zH0^Rkmun}2=WnM6u6#3u0V-F>{q%3vbtfw#rcsBdy7q*w_yuOX0*LAh)no_U^~wwr z_7wCt4Oz%8U19AcBbr8JduXrgerV8ZsHrlGIUG0C7lzha{w~%rQ@Smh24WIWeU&0` zvQG?&)?f}UzZboFwzf|1|MYd6y$t^8t9l!K@R3Sjj$+ym#Xr3CM1oD-v7EkJQQ$14 z;nyOS8QbV!dH*8|Md028BN72o*Rp6q!5A z&B^abA{Y4IHF!Qsef0>5e#c6RC=vr2mSyGWBg{@#q_)gpV9ljWMQlCL=h2|QwF^^o ztKvfU6NnjZPZIQV{dGfqZ|qbkq6lk;#U?{L*)nklILeCj21dgRMupnJYo?car`wfM z5b!5DX9rD|pAFV0&tCtrsv8^5jDk+Mf4&#AjV*vhehD^Sz00&zcH zFPgGU?P5u5`Cm^jYoR`-F@A?fcE_3)tS3shZQm^WxXZb(=6R>qR-O}IgZtZ%Q|VNZ zM`O+kMw^^JzMdq=?}1fc@Qzkq&GgNZF|kaKW4}qJqSKK}E#0VS#)!kOF0{a@TqD&R z16g9j)t%c+%H(9Yah1r8>p9>-fY87Pt8|*_uJ!dLH7gRts1Oafs1TJtIAEwS_?nu+ z6rYwZL`{y^IpcG^87FRL65M+qhTj@!<%ckwXQisJw9$e*;6s*OXz*^ukrIM%$!7WR zNTJiPjj<25j2R|YbmBpBlL;~y|MBqMaQ3S_qRD(Emi%EdsYdwjeSnx3dUb=H%3_z! zObA@j>|1xB7^uu$DiDMTF=+6$!L80u@uG@Ta(rU{T>+>BS(Snt#%3iXe-{d0qdrYmQ)06#z0FKdQThFc$eq3e3Rn6cljkL!rrKf|n4oV5 z+u;~Mp3qze0oMMIyg)fv$~017X9N>a2nvm8=k+Z#Eutz^ijnL9`Np;3x_^Je4*X&( z3Oj0?r`AIt9zI;e9KOMw1HYo z9=h*q#IFjJIuf3>GjTE0dn~WT+Oz2@V*qq0!2t1q-0Sw}>yk4*-l-Eq-Uxjw%{kWk z)ylL)Hbs5eQVov8hvo(h{PzW?Zj$Ia7DoKO<)3q+f8v90o59*M6oT+C)*e(v_A8Q6 z4=Akrh=@KSv3aGH_3tviB)eSJkzXiXT+E_^N!mUFY~s@&3J5R&i=-#x>;Yfm1b}Kb zXyo))lISh{N^3e8>E6fs6piuZ$Z)Z|$GsFcij8rb_p_?va{||h(k->}Ib~5KzBxH( zj0zDxHaNA1u`#XiH5G$1o>@5waCWUfE2+)#*fv7-7MVmdD+^b)>dx8&w~waiW~V{P z^cH!CMU``p$w1!Qv8M7w$x0TxXJ=BekhOeo#ka8)x$1nQ>THe&3Vc~?{@$&`1R{Q+ zdBh%70q!=kdgj71)9nsbJZ!cf5#h3lh=YX+rxkjmB-PAt%@(L1_`)U8R@wurkv9(c z8RwHJCP1NKLGgB<3M)t|OG7vC=^!VJ2hZyXFO>6M$k4daeZ)ypd zG-^JM9dcv=rYT^sJK?i>djJ!Bho}AHK_0gV}VqdWoNS>fbVXcxfWh*&4 zEIIuBVV%(|k(W;zr&OEepX6g zflZiK<#zgb>C;~poM;F#UG1AK22NcEd>jsgQ?&$a1M!vVtxH#wf_QfKtU?UJg?64I zk|m*Pvx*an3a1lOj0St#={mBO8Fo$bGli==+mkZ<{*&xkb7aM#lUO*_V7eS3>&EU} z6W#Bz1hG(`e%;&rhP6$(Qj0@A1=g$&`4VJ3W5~ zfh2RZsc$kp<5s3{4B4HQYF_udS_0<5KPjTn_=-t(ekL%bJ9Zx0HHv2@e*Ba>#zXpq zV@zWyyKVI(Jr6M1W`CIIy?%1u)U_RV1#`N^l4zP_O7>nU^$_qZ6n zgbvev{UTA0Kf`N{zTzrwFGba*s0WSv@qrt0*0U~R=q6%Ug64K8g^k1t&{Z9iU4z@# z4FEst>{;umcSwR$dXa<7Rt#dHfZoL>%pn{g->NR2p2z($3O2R(+Ru{Qk6QfcVJ~$m z`k2IBL(#D^7EbKB^dr-z@_Ae_Ny`^7cG5B}f)vLcSx9OX|EpHWRZyl|PeTjC<0Zk+ z9(i3v_0SkIwn>ZLfhkbY3gs>T3g809&BWVM@InD~^w*cU3$h|!5?w~J5*_DGHi3`G ze9;i2mIRi`vFKQWC7ATT3BtALArOn?3;;U+n8eW#=B}R}1Ge>kq17f_`vUOBl%%DB zGZ-oPiKGGOyZElK1KAS}_~vy7|3saib{f-n6`K(A<;c;sVE3YFd#6}hRXDZ3nldz3 zK7-wxJk0>zUscAVR2Q>1?3>p$4bD{gpP;q!o6ZN|_p!DF%f}b!A(ZlS>2K#3Qn@uv<6o)p>nsFNcr1wJo;R+1szT zfi!DxO^1m^{aMubJJU$M8kS;8qA4nTof#jU^ARDPn2+9%ADsEMKV2d9WQmFaXpt^+ z3(s4os%GkKpt&z_@2>kbRdJSAPqoDp+f-!C@!d3!%Buw+O+wdDuw0GXgN)%a1LoYuWT@-eeOni~A3_q!QIjGK1ldXR9b zYd(!G@|ra`7*~x%@*rEzmVp9ZJ$0k-Yetd|;W`bs#<7jus1)Jb%et7?<;l_Z(B}EL zM#Xgf09|ojv#*2FG3&1kjD@kopXz1z`Hlm{`@>Aca#A%CiJhN54}b6@th6Gu3&+I( znEaryFo?mmJ(@YN%m{|}{T^yVBER6dND0qKYQS$-eIoZYmRK?rYs>)6i;IKmY%;tc zxN`5eDcy=boGmW%tF*jZ@@%^V8F#4+JSRcBXK+0$(JacBt#~D|{e$<_F+$-MwNEWwNqw!wjYx7#;d0h%7qkLD3dfIgbEbw(^5Zi z`&$S&s@Q2IVZ)W1qr#<-roXQzE)NxOA{BZ%ewGJf;|1R<93D{OR#U&(JYB$gzk;c0 zebTrPfbxCQbUXP=wwOp-@H{)s4nd~E;rit01P9gdHvLL}!!FBAgroWFWH{%inPJV% zFRYu(ev8r#dxJ)CS%?c}shLyU=4R%QXAG=OOH~hiSjcU!?(_9!2t^V3ISvq;U`axf za~QHR-jOPM0`8A~Pihi*4x?6x3d;=#w^myyU(ZaKiGn7%SxenKJnnoCi+%qzqAEGHjmm^U*D)*4}(!sa34t`=P-~VshB&!jI^k1d{OnskIdqfAzQk{%^4oi17KO_?qRh4t zdkX_GuN}Hf^-xS~b-o;-Fkp~WOBTC&piNR7yV3%GQmf#z<)p$jYLyY87Qd<-=ll9D zLjhf}`We%0bF*R<3B|n(>(Vi*#JkPJfBE7~(4%wSP272|!znP9Le~<-%I_^04*<}X z2yhmJ+Y!()g{PRo-%Agxwt8L7T_qM_qBy5Oi(ob@gh+|D{<>!>b)W5^tY2cg<){)1 zVjtCIVjBB4Hxv10K{6o0*xPa6w@IlSLL?obUcZ$Wyj7nzMVYBvg1#r{y++Q@M=brx z?r9(T+*}b@fFPZFp0Tj@F?~x)@Ayz?$ooybTqLt&q&!k+yMH;>jH-;-twwj)LH_9{ zzSs75zEOFriS>)f#?w8%UWbEE#?q{7adq9Qcr<40xUjjg+Fzprx}dl zrLHsHHk-szk%#>P?ND1MH7(5OZmx}xz?m3+Fm*73xNan9JsUHg1uVo0*a(rHDvu2GX3LOq}hr)FvKhFN{Lg5^KqOnjjA~JGcr{G z&5zzbT}iE|ZE^^s(9k)qO@TRbDz{>8USGfAnyx#(sBO^oAXf^vRg=y>Po`a>9h+7t zj_CFj7N+S02tSQ$GSDtA;i-it%j(pSR+f~k4vcSls8O6ZmKw)k^FEs!IkgHGu~AyM z^o)?u;;F0AK?8|*cF$gC^hOnme`o3Pl&2!f^G*hFOn}DJ+a*QHF5*0_f065T@OUmY zML!O^3?)Z@;YV3M2Il-6C)sE_74whTh(5oamhaUSXXmZBOhC;XoBl0yg7Yy7|;4Zl^-epUx zMXf29E(P_XY`}GiTZL93WO$1N{>b|r^%WD}B%69S7fgx;EZ~xJ++8R^&uTpY3+_VsRyp)q3rFO^{2v=wCJZl09ku{PlXysm-74lG>l zZ>j6{X-gH`=`vr$Xy~#Ekndbe+1{ns9mvB1zP02wb9IMz=#6AWRh_EY)Z=#V9KkjU zTO~FPE?we#POw2=FQxnMp1?xAA5MYaTTkzCVZ(&UdUN&S>dBJbWpG5tKnz;vpO$QW zs(6_#@F3@U6K%f))reo`{pgGrBwu)7!tmZ)L3m5OokRJ*2;oS-RBcZ1-Bw+9I$TvET<0*Otl3L1;i zH#vS(iUopD!!-8&Z?VNu9+q%`CKQ*p{O4Li7uAp^SgiiRE?jBzH}s+DYPWM^yz@m8 z_K0A677CGxKYy@0eV!hgPCR^NyQ}}LRiKvRi$~`KwXiSJ&B}w)$Xb-azINvev&aM@ zOd}2|AqY-_=CR&pTUhtJBe{EmG+jS+E;^_N@)3Ial5qRoQ`uLZozbeQhrmhir=+HC zw%izwJP0{5#>dB_bo?(s2H##t)Kxe~t_yh(R4gD$o&s|Iy|%oBfgZU$;Ob8G>cR<; ziNAA)m3jA*LQMf4ZRO=v=JWi3*Zn!QCN65xBs7z`Gg8s}K8DwL3E_!L`rq=Q6F4uG z8}0?8y&%-qLQxuVvJ3rS$2-y$3_#Y4`1J2*jb4xtf*_0>xV_MPNkC!}Xxup^FlFga zC~W2GzZ8f7#wp2UyRk%-f(gnw6{5cNlsiH#>^GT(eN@jRQL+nD!p+Kdnp2XsuK{TZ zIyP!nkGnhy&7G@EE-pxVP{`tplkL_Wep8V>ND1+EM@qe7bdBEPX{v~T zwAcyC5x2a&eqI9lrrj+x&t4Tt#}I$Fh-t&7&)(y#6ilmpTI;mXjW-Z5Ub*xkS-TPc zgYj=s`6OuTODZcCrKX&qnQQ$hB+r>wF;ijwcAsI(3cDv*Ovb{J+uG0>{ou+<aDI*$HkPw zN&}3ElDVHAoqN{Ax6e=VVFG<7u{%3E&MTJ!ivNSr-jQPd2i7qqn;IMY!~U2wATsxS zow$4+m6nov_##F&tr$%$N_*Lx4DS#}yylR3I~sBeLw>S0++m;A*9U{r(nI+LyYWSt zlIfA~#<=>o;<3EXU%Z26#`)UM`&oBaPMcGiA5S}NoAk|AE={(>{^nT1zL1$<2%6t3 zhkP`^^TeZ?Krb;&Ylp!Lx`lZKMNOex-7!BK_h{F{XfL#!r~|tkCeq(Jve`;TR#wFa zA%nNu?;4**j%_%6(W~@eup?i9Pc2wEDLE-i*W+x3Y|1uKx!O zWhlfCeM?=u4jXWO;&;9_=l(R#Hw?Rn) zur#zCrXE9rZGuYbJf(Z_$~j@xOXVqT4SuEVaj!aYDhi(m6kI=TJ|c&>jAW$F<3@GY zm(?>q>0tU6uC8tD9o|Sh;D1ZS@JLXxdA2tv`4`CS`3~bSA|p9wsY|ed0J_UdV{5n2 z%AcgLnB^tRP_1ICe+c+}nASP6H8j#-*q!{cp?Fxq-47$$IMm)Q<>e%h#Si_I$tSP} z!W>W=)S~f2trO?^`XfV#v#j#3dCW?$;{}1Urw2%dL!mtw%ekz+^co9MGU{EXF~w1q zTF2aj-krgd_CM<5m*q~#!jkd(|BYcD{-F{EYQa8!*E3|)lK7xYHSoozl=&#d(&k)Z!hxQO%hdUMK zQR^_~=c_R}d3mtjT=AglDbC4~j;^nvB0d2w7`lvLr~`2h$p`4yD^ZyIj}@2s<(~Di zdM`%!4(NTe8scd(hXyoBMpuNB+dps@m;G)(Z&v-Ei~4H}cli+JWQ3aaPzRg{guVz} zN^+lNw088tXdu8hZPV2!P-*ic-l~C%ej%A+{dd*&W&8kExV4)(oWS6N)gtN>wFrS| zSWwl#0fw>sXL<0=%jy}Jnc4aH7OR9W@6ujA;B`7ZX~&YYl{^ffFOpRY?k@5IQVDzA zyf5u>bQ8E`F1hSszU#zm{nQ2kt&3mQ2&IO>y1tB_`_CW1C>sDPp_J`(%0xtvMcE*{u2D z_<2Awj#gZrvi2_P^J9aDHA(6z%cv z%S6(2jn-lwaNgblLtBmz!X+oZun2$zN$%#|>Te8KP2*X#U`DN`QCzSfM%Z4z5@c{z z{qj830)eg8mGhZeIPYKowp!9D8cY4Cmr_}1@MHID0f<^L|9fsdRiX^6<*-JWUEG7Y=_VogH1-R)a{5Te z?S1Pf;rsaYbb^Wq1Hfl~)(!wecVYCi-Kl1%FwAke@~upk?zKS;C;sZ^kfir*tJ-Azn~5z&UnAUriBKxZp;ONOslmL!klu9E(zhTC>i!biN7KNRCO{O_GNu|>!Q)xy$RET)6bKT@el$3B+Yd_SJsU-e zbos6f477-`-SK?kHBcI;`XnDNhHj7&KLogY(s>98F(4MX-g=3}`Mz>HtgKetOA*U_=QPg9#qk)g&d z-i#MWCz-)9wttHc1A8AY1S%hS+fa>vY3|R$@Yw$f1HranPdF>wgx+-x^8c{_P{)<~ zp8KI8C#LpCc^Jr3c{9nDy#~8o{}@1ft>=D6>1MHbA;A15EwE|J%b=(0vd;m?j-?tu zIx(J@oWFAAr@x^^=%?(q{ZpI6}jBfj}a2JkJ*g`Rtk{ zC4&KL#c_1G2nI3%8eOs&@SHOKqE^iY7>;#_LN;b25LfAUGFBt-KQ&TwsjsVl!5C+r zKDEQo$?3iytQ!VZnLAQnv^oN3{C4E18Wdv3%!j_QePc_hxlyBvr$rK!DOS(;rF4c7 z`#(stK#QS*{_>UH^>sup9$@>!ixvzm%0mXtLo*xau6NG`6bn>IFhwSkB1otA+4R(Fw93lm^j69ZdDrrsbMj#C%57VDbpb4Wp0M?-h6tt<*|F9oEzB zgx4j}K;0G0qb}1s7A!vfPNf2FbcP$u>M&XxPw^Hr`~P58!sPN~>y7Eg&amR*FsYtK zTTSyw+#HcW(4dv((ZNpCbXydjo~yyw&gK}q9tZj5C4ZPyzpk`U0kw(TG?$J(FNqfbcDGjJFGkS7qo{i)B776BGOWv@zENaaZ;io`GLT za<2$N5^_H}VOQdl?9|DBYCeoqZSuIYeBKFC2KmuyB97JUY<<+dI8pX*+QMfca1HwW zO{U~$jZu%or}x8~NdiC?L`iLLNDf0DQBT2n4?YTw7Kh`7^2FKT%fxEyz@XcT2Po5J zy#49~Pde6CCGT4pqihXBG2>FamObxB{*xZ4+n@#QBa*zTL8dp-T1Vq= z;=cDGvsj;+aL2FUR<-_;P8}M3C9R{dIbU1G<2z(8Xe+p!AQm2D9sW(YwAJ7SRO`14 zEG;qorhe6W?;UF5F}JmH?L5nXc50DpDkEL z6vB<@GpW|PrdK|AIG(?}V1(>1%pUP)TL7O4mwFbU+p3v{jkY5&H4 z6IBy6~o3G^!|7Gh8;$}#Sx$ro7p`+ z`}eMn;`=?FE#K3k&x@%~^l=vn_46-$Nb>*CX~y7qGW<71M;-*c+(75`FnKJ1tpeo4 zVhurXX+P#yFgo`LCA1q z3JXDyoqP8ez8_jHLOJvI;9qpm9Z=>4cod5v0Vq|R2r!Z*7y!1kCg#K?nq*& zsuxiY853{LDU4FJS8%M4q5AsMdkZ^-s;%D(dKC=1hFJOgL8OWuSLr<;D2bsKOhF;Rq- z-qg@!`fvX*Bt6NITKTB21&3yTwrQ0(H^vqTd%^LDART~*O{d<<^K~Sh?4xLgp1#R zI!Nf*Lco1};PJ`y#sB1w-sel6pVGLVN0T=+$?P<5Rb&HETh)SOWa?{iC!tm5kCmN0 zm!rs(`7|_Pdo%*HXQHq3O_1N4o<$YdazOi8Op$BxlaLwSAmQT%W_^AiA@Vah?&Ho+ zS&s|*kIyGp+y}b1w1z%e;BwhHx4V+lBOD(R1Qq2kbzEQXl1Sc5+Gv$DsR@LE*KPbO z-_Oj1&;V!y-_o2#ia^%yK>p5Cdt;s6nXm?HIP)6MOozJQxtHgE+equ0-GdKR$f+i| zq9WRkAj+(8VJjN6a+0deDx@62tRHOD2mLW}*d;yZ{{LvYs-U`}Wtjwmy99T45AN*HT zBpvsL6ldk$6$wI;l18v^I{4ZHQ#G+C#ffEe$HJ+3(`8NRupsY!a%RUesLw*M37;at z8wRIjLR(roqD^u(P;38wq3$&CplIasVOaPUrSuI#R}HCJ3Eiz0x;L-91@&djWuPQs zgc4n5Mu$U8lrh>gC!&j`iyHUSXBb~$Iv4Rz&_toof_G?r_fcGk_G4*+fHqh=^byI5;c;`m;_&W(Jk zFB2EHE43%^G2Hdk!+3w|j3bx9%g=HxVUB*clquyO0KQLe%tTXs;w?WG^%#=C%@jur zKwxS$vnJQG@2%C2G|gTQY6ynliau0yA}LdbAtS_@hf0KJ0+pPcw99{CI`b&Jf3-ik zopl`Jjq5%cg=q#ZyV51N)!SzR5orntOA8N*8@8+6JTj`YO#OsH$?~LWl*rU@bMw58d@1ox=5WJr=HI0l<;r(3lvv<&G$gT@0lz$27`CX? zFnZ^2zI}?q9loqP1ig^g?4)x0WXHrq>_?zo(zHdW)M4 z3@e1$AK5xT%d87t7*xj=X5t4pxG#p_Srn2*uo*{f!-j}nAy9Zcfl4X2sNUq4vnWkX z2oYBj`QNB8C4cnPAsYY595<*+pf^6#6AyscD|&SH|$`}CmXZB_h0gD39&ipN9}txMTBa6>g4XTe6{DtyBtpAgCO zSKPks)y9CUd0#?h|BC{|7S)BeD@Agl#v{1=0~)+ajOS5R56IOJVtwJDIDiFCGKw`% z;#1U8%`;TMXK@Iju;@Yq(kMnkG!A;R0Wu@-sNS21|0$+LWOv{{I>?_OhyzestFzgcTroGie(Jj=_7&Psv{^K$+9bMf>Xn^o-TL`cxga@k#dJs4izI-nV?_~U zAP5C5uwVw=lNoGS47seiC9pH_2c(0#X9T%#W_>XizVZE5q0W=VjPZwlPOJc_O&YAQ z5HhJCJ>+iu4(OB!jSY*y*~UNo4ev;BK)l(XqD7qt!Vs6hB?`g0sFPoEeNdq^%hqzJ z!99-kyk!x83}=UxAc`TTj8!5=Y777;`l&FF?!1j6L>w@|-Q@4NNkr*3vhMTh5kixl z>vQ3fk8-ik?~0WFX;T3-TN;p6H(d93!|=ba$TWvM-z|7+ZCBtw!wOzsboaB)dTtkN zeXSMVV}^w+jUU)#g}5*{P!el$^A0z&Cbtjhcp*500u#u7ar+l7KIhA%%IGf=VA_W5 z3MfjFDa~_z4L(oke9dm`sZqp6@j@`RXg7RE7yb+D{nxGL3HGdCRWWdr6tE2cbVrG8 zh>v4`hTe@+qsJYb}`Tpj!K*S zjKNOd7~2WT`x(~dTAaTXD=FAb0&A523m%L>?7|>npb$)tJbnLz7$`S@Ai@DYcL3}P zJ%yo%!24OyV4Uq+SWbQob^5+s6n^^5|B7Hx1+I~6LPvZ*Zp~-*Z~g>7ynqe2itTic z9k7#|7HIuUEgc9T>IMJphZYo8B$>|>f(kK7JK&V75@vV#vCt z%t;uD_cM&c>KyQzo=QnDl~|H zc^yD>U~&m5IaHbqm7aCFLm@}=HNQ3LtKR5%?(ym6e|Jx6M_st|{8QmC@eL;EUGa?Y zu<`eniNZ8t0Ei{oq@dGqpYMOKf>l4h&nfiZNoDzighkb}OztYHMc!}H&s9pS#Te-G z_O~M1RWV<%yemWk-(M@*hu?V|qsCS2etfG*xR?(fc!)puj`U;_W&Qy^prB|(tqCqT z+&MI0(CW1Lyo2%WvMxG?8Mt6V){B%NgAK2luCT+j`SewY8kb5EDiF;t?v6<;ewg&| zjwkA~w|6K38OYecNbWJ{-hn`=+oY<+pZ|4(TAhp8lRjxfTIebcQu`9_{pIcXQS{y` z!pAeVp`v5J#=9{3Fxyd)I@m_R{}N72xXeo9qJ5QhNAi;4ee3w;jb$76Kr?@fTcs9O z0F)Fm1Oxq}n-X%}rdy2h7!aVfOhs^Gh#vSvd$PK0Pqc%e+%%|hP#OoO|EghH|60mSlz zwwSd9VRHI%NrZr-D5f_c-+=WiYOP$hIAcr7{#1{+o2h=5*@FJwmd6bq-yp$Sny z=FZ$kxH4#ip>EG(c=w{@Ip$h9e=VD0eMZ{Fg@OH*nZNbWVJl?Qf8+}*2UF+_T?~`& zGF7OPgvytU1d#`CfH@s#bx884bzPHYReTB=Vvd?7-NL6wcgL6B_Si^<^VWY|_x*2G z!i^xS1`Iv?Ug>U5oP15lVp|6ORqiALdOag2XVXlNMqg*=Cx+IGZaG9lU5A$HvPAa% zoNy@^6(vHDZ-jJ+Z}_Gbd;6g7n){cD;-f24h=viu7G53_|8b2HOe|7&$?bi%k~7XV zpLfH2CDVygPUSBSaM*vgqUQNDAw}iMW8D4_SA6peo5$3XlyGbk;rh1k$2bbxa}pWN zl*ruCmr|q)nan~&e@1PUd2OEzY*5|f3>QGnPivetxeJ%3N^x8l7&&o8R1LR!cS~PTvDLs8a4Ng!IrGVUzez*C{_Vy{#KM%6A&i7QY%8a zAJq|F=k4=fhDe)K)`RbIig#B&Srgk)<&5fjgp734UR40PJrRqABupP;W?~WqqB!Ib zjn*An@YG4^d(Ywt1#lvDZ>B^eJ2w0wy+sLE!BdoOo%p`!J_>%1{6gB8CHz-Q5F25A z*Y@zWG(oCB4{z3JK_MAApG{2sbiRik1WqOg<7)$Fv_62C9D8)Oars+_GI+syta>9M zmEoHNS$wHf2Jt}5zMCLaEt6}O@i5J&9LK=uq9V8JU?#q+ui5SUg41%Lfg{jct3j?X zt-lLBVUuL6a=Vcw$OK>vfN)(t_+Nz}N`LhL7}~XnD-Up`VQwzh6W^f!y&T^SqdV^4 zJk$@&kQK8bmdZnpe4Guz$;ru`-Ju$c?Cqo9c*xSok$hy<#SDTrWW2Z=>jWmkTa+B21!G!O_|0 z3uztsPT=LjST}3ivGKy!Q~mk=6^_& z$a&y0Wq169AlHPwUQ!nb=L=?+sAH&cx<65K_wc~N#a%hnx1_%H>9dax`(qKx^GT{V zCiBY#jpC5H091b1Rx+DTi3n|cYZ)aGt}mMH#1Lu4`vI|#MD5*VKX_DT@p3ZL!yG7! zF>m0YQiaC0?UM=*!Ra%Hlp=M)!710Md;no#Ts|svyQ@Xqx>Vnzk1a>O04!DjZv~P^ z?L2Vdwm>OYghhc6H#J>J$RF4{Dy;wOb^{8kJ})#e)d?j?(gphHmF!V-rjakNNsY)4*|iD@;*NN z^1QbRV<-Own$;dv`w1RFZBx&#c_Gcq<;JkzGX_^{#N`{={Z}>XzcTXhSjwN=LG@#P zqv&eErx2q!Y~c#IZ`^Rjq$XtD-9lMEaAZA!Q7t~KUcowfx})$l&X{qzty-I}fuIk)|Jlo2%SfEUz_MCPJ<8OXKmV{VYQ+OkJgES%N0@GN~fL03!7|CBb)XMa4qQ z;D%j*%Wk!5d~DCxMIsQ|`KsbF)2%Q#k$1_|J#gwQiFfj8b;y8zsLaJB+TWxU zm~j6Dj7?%<52x#IR=`*1HrT2Eo+ocVJ8-k>z)sH(kZmfK4(sIpnafBrg}6Q-cWrb4M1j z3p&mQiAzZqfJzcgQU}|Vb*oh^3J?ebM8X8}?j!qW`1$yrbFP-j0Zl24c86FD@zpKm7+8F#;38@O*xHa&{&4AfUNAp~H*|G%Eeh5%`$oh_|0~yaRoIhQ(Jc9)3v&n`azZO#>F);mH@lfsy?7Qv zgI|!lSi+W5yP9v?Iiw?)o~PUDE#`B*nVR&`I#q`7nibEco~OaPI{5d^c3B}52b|s! z??zWvH!ryNE`^6l;iJ;Q@7rgX7z~duIXkw*RDLfR&C_&PF#MmG9iJtrrur2q(f(L0 zEZLgb#lDx?r^cUmba^4(U9aI>cMS>+pkQ0;AkmH;GWLiQ<1+F+phs_YqYRzNy#$hm zFQ5lvAx4Pxfy*hKn1C51QWk$?r=AXT(|w#Di!k<0xWLAwk`f?4mLj?7N!ROE)#LJK z-oNVsUQrJi-Z}e%+pNm$K74cN5@*9zCLqe{zArIwwLOt7JV>DNa{x{;$6B1c(dVse zsx9%YM(eCCPb{h)l=74uRwGIoEb439gEdiO6JtRro{64&FVA(v8dviIO+j*bx(3KE ziv4;Qkp#{=S4?7to}CXM)C+@ z2(NuXO>hp63@M5ucBFcV!e#3Q6LLbtm5pE$Gx>{GfXdyF+uwhS6TzH<;j~-d(c70@fH9ub-G2M0xB}oD#9dQpl+^ z$m9x83Yzr~=pj-0rbqcRFj7;Rpp@riuoHge;tNiNT))5ICFs!EfNrr$z3{+mcJoW^ z{8YV!u!;!}UZ5q_H;BhGnv!jD`GgkwGwwGNu6kNR0B7z)<<9lu8Jy3pS+cITPgJtGyo?)A=%%Xg<*4gy{3L&q=)KQ$7s z(G}BTB0=PmUaF+MP}KBtAt;QW-?_Q&1AEaSD-HgOJBgY=Q4ag#s`s%j-Fxd+U!FHw zt1?ZMbBh%3s{Vo1DbeShKg_m`TGyB%z{8(%T@FoSlB>9XF_9G^j2KMm9CLLAg59?T zmu){!Cpu<0YP>Z1=`y>H{;rGOcXN$Rrx@OvYChU33FRr2JBiK3VnA~DENkLV-SV%N zCoYd6>mja7cmVMpT8S;=u$LERJtRPU~xjlm;P$#|b2j`o0B8O|S`z!_p8X$_7 z1Pmoq>eOA_2->`E8|z7Xu2&lrk!UQ7(FHjU%Hs@!`M@>G@teS0mnEAP2*MC`%J)Um8|jN8WF6daV5qjr|vj z?IQBbeHvB9t5(>9l5)y{q0wFM zxG(FDZg)vmox}35Z>^BR4H2BTG^7`U>NANX9`el!1*2&MIF-MZ6o+3FNlbad!%(!f zeni)T)9I}2!3q-uUb9Q_-c?F79sf})`U*qD1l{4)xs<5f=$cRhZvsxja1$oA7?U9> zZ?}ncUo{AzgoOCpeZd}&BdLguf8aB7pNqT;W549bpal{Wfs2|)Wl3C6nU0A+T3|LK zL4nhUMvPoiXrn-)?}`%C3aZ0-i~4^mBMUx1Co<;JXx-FLKo}^F{T}Hi3-lVGZ~!rZ z<>m$E64r4#jdYN7XyKqOaAfYdnvH@ec<<8wv(=&ak@M2 zuZyDNtzMCSjv>%c8D3q?;2WRWsnZ$?uV18;u5|IFK3UW*%-a6k<0^5bbj*!qioD}V zvUYcs#_oXAnNrA_OW5}cn=z8AF`5TH0?WOC;S>5L^)MR*2g= zKMTuG>l2|ciHynUC$ZCo8Sx8p6a-cn_ZFlWoxy{RzsBIwLC#{@C4ook=p~I3QTK@N{Pq0zF;a7<;JaR zhE&s?$2>lo36WEBCqr<>rT_i82ZYLo2KCt7mpqGXJC6$rpDT(H@3mqwe&Y18GwIEL zK$lxeE#uiFz{1MS%k%g3_2uSsF*i3K>7SwnUfp!!av-46dQg?X2+WEcI6Y%yk#)Qu zckxC}e>f{v!EbZlai22Wi2Ro5Sqee-(6hj3!vKtVz?)rvvm`@q$h}(&`vn}v(9;|z zR6v4~L2?TZWgRg9lSokFGfG&X8B8CF&|nTL4VtT;-fmhWDu-M5r#*#HUsDTq+Uqgw z11D|z@wK1kcF0u6vvHH?+c*cY__|W&N>!NmTyeqMaq%UXL#`PXOBddY8)3~0&|Qut zqZsbYJd5v0qxAY$q51hkVEKmpVM@T4*z2NYAjgZP z1XV<{+L*7c17yg1CMS{n{ry|7hG~F4o|F_nvI_vEXCmb{lMS_y3XuS#>TdT2zKFyp$Mb3=* zH;OMEUQ2x?u(7vD!>u}UO65Ldsx1cfl_ns0`iq1(F(W22I06YFK464d>%MnNsS?KQ z2GK13UJ`4QyD6!e4120m-Dk8|~@ zJB#X=(C+H(6&XRb_3`O&x~@gmOr}cxvE`VTua!C2gRti+3Mu>f)NN1%4xAJvXoRJv z>sk$*Mj72hqiSsK%3L5oRck69j@!xm{hyu7(M^Q6qj*j+{>J|EOdbSHmTZQr`4gpEuUQh`3F_pASJNB8rc_70 z!=&6}(qdPIwQmQC_*Dsd`tEL2xTW6aHbFr_nrD{GfD(5|0siQjH8do7_4x9KW_T)b zFHb!B%!5Ml25Zic9|JIqVF4h*rUWy7%-E%NTRCsn>|wN-g;PpU1CmxL(4xQ8 zFeOK~Db;Z&msogNM+jmH2TyZI<%(<+Lu(cWN5d+j#zu6_1i{4lTwX|ezwcu_ir?ey zw+Ek@yg>5nujz7IP?3YLb3T}jf;j4%EwF@o#_n0IxtMXVBC@+(HxftFn$BBxr3Tez z*4H}8w0afB*onZvZ**+|DY)>*i*rr07{%!ZkW@IFV9+#%ZSJ z{{CH!_ebNZq_CImU1w(}voD{f7zqX5l>K-XuSFn1c;7TDK;DnfFn)W9v9im_$pM<* zRKhYT${&|*vo#qAMV5gz;Dy!N%i?!A11V3OpPm}&>HPxHFU+2kqa>X4>5mv!`vl-u z8p!vAGk=ev`RVD|x~tX?{7ii&SBxVFCaYnl=N|~%wJ>Bq(N-0*Tn5;4hd-(fT{LHl zBSrCz3N5U6OOUX7zVK)SSq$6&an`KVpl_m3t(pv6k(7mbJUNc4osPOPp^!Hwp_VGs=%dn;qP9UVT)fmws?>*k%FeAyM6W8&iCZbv0W z99~a1c!81a?d@!hgZBIv~ve7lEmURH+NB<~c%Sn}(Xx7ti?evd+pxJ-Q z@_srzTA5p39s%&!0{R@V_|?$RP!+ii`TGd+)71!r&5+&M!-H$jb6;0im#V{^@swrB z^2NnPHEb);|C4pxOE#}VLPMcxZcgl+mlvxg#OZNIThabR4LmN# z&8ol-=ANFObj`b&qp#y*TL5{sIB@$QPUKggGWdPkH}?VJShmz5+R-C6WL%?__VwqY zrt>yXCHosB?G~N+;liGjOhulU$^8uWff`8j46}CdL@6M zLH(p`20z2seLnazhziZ3xL=ki4SNX!ZP21A$*Zl<(E>OOJ4H6XW)^ z7+*9wNMS73+bj5lV?Ujan{r(FnjObU#S+_lUocQ+ zdzYu+bZn!E=zLVk^Sj(hwp;Ps*^e>YTCp-^<2&!W1z)RwpVS%mmWTyr0q|=1jQisi z3<|_wR&+S8N{`mK*F9A0J-Uu2*RAy^DR5vNS#$MS?iw7F7^%R+$6xD>)wqNBvi{eS z7vECeA)69m)hQ;7Ug>f;frgCQ8+yHB;}~Yi74sCZGR?UxXdXj|Ss?js?|zXlYT;OO zQn&RXy$Z-3pR0&%M6GjTck+uaC$O$WfX|TWf2h%Nd)wYUZY=1&a>0Sw<%ROzFK;=d zRq6ay!8YL0Y&VN8wdS~isp&t*GUgqst0Pv0(V)B&8e$JU?;s*3I6gLA>^c*c zJ^*tAKyQYc_}sU2$-J#$fcXLH6MV-xuoBZ@f_K4|R5;Jg-qyrK8OTNN!9aFywj7_< zInl~BnKKhj59R$V8!-pLsBT8?>Odz3^fv%d0m4l~U45modV#ZuO3_RjA(#Ta)LGjz z(+} zKX(G3O@WzrYfCgePcC=oQQzTSUm?wY`L5JXKMHID&BKY zWoHW?-Q}!l|IF2MEuy9{cA{o#!joj5AnDYkfuQcJWxC8gDbcozo_c#p1{<@KZc(#e zY=uYR_#1#0u&}W7ZEY)aqgYR+rXvOQ&4796t_1E;(aY0GYATKP%6-Z6!$lsVzkso# zE@PeNa`^YY4Jz_si*o5kXdmXZIHZ@p7rKD+8J8VW0^JUg5)e#M9-F2V)IyOF+86l# zkj_*8-oeR764HLtfLLF{K|4x%bikRe{S0rybtvI@sbig{F)A9ot1Sctq6%#?qIO4C zFR)1EqbdAdXI%8kipqw1qamM{n+^b)0;KIRV)LT*BxQ2@NmealkD|X>YAZZtToE5M ztYNZPU^1d*NA9nxA5Psb8#0U{tSWO702VNEak*>xc3=gokPyoO=nvg)DWc7`wb=%b z7umR=vx*^;7a~AJ0(~XHU*TC93>ODy+41=pSggAK(9iz8Y$VdCq0+MjrPvAIck6dg zNed*0{SGCPQ-|j15|ao*@dc;i!ZjsD(^EzH+8@xy^&>1kf1n7VYE%V{bugl5SL8HpL0mN27jfv??<<20Q^?U( z3ZBtMEvfFv7TOEbZ+jWxPCr!5CAHN=HFP!J6?y8+nPI}gjZCH7T3Z{SZX zSo_{XL5=?I1B-5R1-33PFSVH#R;+cb>PF_=4diI7vo<$3y^iZ^HE2%-S-#xQ z$n$#*>|2U8*#PiG=fLvjpL@$lgpCVR{#2C)`@x$b175?K{Bl1`QXQybbrHe{M9h_W`;;A;m}6 zVg1s>?cU!d{cjS;a42?8yt7~!Wu^o{s!(R{3i9P_8|9_&+kdWH$Z6`jOhmfH7;KlK2ww0lqIcrVc3MIfq{zuB|Eq7aR>I1BDt)CT{ z$Cs1>JFktInny3sAvXa*Lwa`m*|U$L_MX#QdUup<8G6-;}i7?KeAFx+L`hXFNdJVLm(- z_2n)Uwgt`C@pssBYCC!n(Qzenh~n$%#1IE^y?)uSe7f#8(l2F?_{z#ngrD3Z-Aod5 zYR0_;QYzu3F$)8?csCUv57#exH$4ucic;t?{Fuy8cR3*C2=tKzpaqN09VDb3n}fk1 z$vWN!i(Ic_Asf#h6q~uYCCKAU2X=>dJV2g?Un;hU>Y^`r6E1B(E!f#6h)_dg>l?2n;4ZFvD;AydTUBBY2H?z$p9{5K4j6ptNsB8+VX1 zikS8+QMrlg2I)@MH@CNo{vJT_im-5SEL_)C;B&75Nfwva-BG)%BsCn$%gf6`hY=4G zb7Qtd8J=CO%8esQY%$zq?0cTc*Ro(1_Sc>5c#M-v4>(Z6ucS9ct;kM?85`EYn@ z%2(Y=rNndYVagxTsm0)iQwytZOp)PLD{k6RPLZ0r_jww`23 zxEx_*Q==X&yL<^}*>i$lWpW*mX{13h!R*Xj>B#QbS5+G&u<-{jsI#D2sSv8!&~3#b z2TT{Tf>Df!QKt3LA_ECyc)+SpBiq!Amz4BAUnFb7Q3KbopOiUE&3LGB< zV(}+@!hlU}Jz}EEf`R2^zRgo<<&`wud=+|S`eZ74x~fLTf$6O;St<`z99)S({w|vt zJb~^T$gUR-A>uw*k4;6k*$*&?yibHB<@j58+8I1cl8ZED?_v?q;-*X1QE3?&J3uaO ze~?I)SYM(VqGmd>4L0;OD114R#=Kz-F1B;#Z@P(|p58!(B_P0#h+zUj5gI)IWOJ_- zsm{d!+~2zWY-XHYKfnLa^vC(^tcvi&GW-}aZCO=vw1m~+Jl9|9ZSz0OrE|>XyI9;> zsy&m&`wBS5rlzLCf_XSZ$s@o`DJ)FPe|Jt=ng#PN(nGFJh?UKXT$tNa@s55?jQJ6gInJkW;=zK~na;M3-phi4;66vRjoB?uEE@0Uie^zFA_ z$h%&bAwE8~sAIj4Q*itN>(0-5qLOQ-hr(*_xNC-po!Dn*W7&7EbvLR`Gy_%NfLo*h)la$)1>Q{frn3g2PP3iYAN9d)-ouuGS<97l2GK}_ ze)0LIP(_twS{5ukJivIs3Ms8OFxuoLQ6~DCWezmUVb5KA`TZ9W1hdFGq`g z!WJjhXu~Of{TnIoGA)Rs&9VhOL{XEyVHSz@W&J+2iB)+0)$3(r{yv#bGDN^M_SiW1 ztM;uqB4kuniV9lYMBJV5rt6|mvaGz(Mha6#ufp93XaQSX3U>e+S4!x&ift(x#^Xbq zi$p)l9KAQQ<%tR4ttF91$Q~V!=dq3HdVlHYlm%@rWIvLvbv$G@dNzGeAxsSZV^PJ` z`<>=Kd@s>>Ke8yx{m-HQrrKVi+6o=Oxn&79)+9Sam&(|;9W6z77U|UMfw_Od4`AJX z51AHFF5sPPKXmfEPGA4&=vcetdnxCz_di}TF@V!nxnzpvkXN1o4ENxhc&;B`@D}EZ zuOTa+DMt$R1GBg*9}S}Q+CJ^l4QRT}7XU@H@jBLO@RF-V#RSf!F2I6sCOJ;H}p)^UWW)YjyCr%(NC>*;1K^y{K0q9VYOo4DFh)6+9 z#n(lVdc67eVM1uB8Xh=NyxUjJ_BV6!ii;*_G{~=`+clH|?tD^I2IX2#P|!p`2(W(} zMdRBz_h9rIIdb@B{}yGz1@s;Z3E5YIFzN7>#zb*E-mYB&ujD3zcZz^Z4rkKw-4Tlf z8_6n9Z}Xm}qr;+XYs~#Yavzm2WElaYYC)U(M z`}->K_oPMPlsN1J7E8@>IoR6GrkSWIKx|s9F<~zdeRBTVb&3|HM4EXwl|XXYqpB@Z z!c%8JpEQOT^@+;y*5or9O~K><%7&EaACj>G8UkP6Mw}j1`f_`_0HI+`m$qU@*kXsv zlp{*wDM=jJzS((;qkgj^Vq4NLk((y{`xsF9Os?%jSPpi0f!}jC^5L`24I?&KI~&IYmsa6MwO$q9BVULjq}Y~!jxK^-Yl7X*9J@!qz-CVJVFeV&sCm9loa3_UNx zUDO>{!`8xcc%4g*SvWZUO@pQ^-(+ZNiI-}xbg+3p|D)b~28vmq*$l`c@c>jWw0DDm zfT*v_bg$vGuxN`GyBAHTgD4{_XC-M|8Oog%Vl<-^YuSJVxA{^ zxVCu4Nbj-+8{$_@_i^LoZJrzqx3Vy}E^5W}HVXn)jS27M;p&kIWWkYZ}09^vH_JXLar7 zoaM~*rA|m5bw%f-#N`xxYh13;dEQ{IkuF_|M$m<3kxmVmm@r|I!ieV=-~Q7yd}c-h zU!eW6VG&uuW&|H7RZ@=23dKyH6s|v%Sh(e(;#oocU~0$+u3Hz{K99>2YpQHDfgdIu zTbUnOj_P)l!TZYuZn)EHdNXBeRGr75oD|Q2k`~z4HlYmC%&Dyvu(QiD@Q!*ZlTT@X zfGuQ@?S4T+B%r3DY2!NuR`;Cn@HzkCF<-4w^=aL*8Lf6_`Ic*D-~d2#8* z!;s%cBDQsHDkqK)jg{eYA^<&)tCtzuv27ojVYqAL=yXihO&2Wg>_vO;mzgfT`hj&QW zxCnG4W*(ju6~=3KI0S?x=Of@*k_VZn1>U&oMcM2#Y;VjTH#a<<#410(q*8>pExdjGjM;ZJ-FT-JBA5%gi5NteHWz4mB= z@{biRy|xNR7d;4mUM`^= zhv(-FLK9pZ$MulwT2QlLApDvwi_=u3ot=mF@+3QV@PcIAmjCwxkb!O;o$qZguOL53 zP$ds=r&r>*uYyn;9gpUJXx9}#8wgdIxHVLyAxZ@Jp*un!fF}jykd)hM_uUx83JvwJ zC|t1?gozI=Jhb;OC;&SLOi`*Zb(>mXPZLwqeh_9#U3DSqP|)L@y>@>pr_o4D{|aVJ z>x&w`ozFa|0k_%gxbpt#%%g(kx~F4vezi!=+tW%C5G17?`qZ2^mdfobj0duYeq!R| z8~^;7zw1=LN#_1|{6r&eGg#&MUmbf83V}369gkBsxlArmadF5G z8sAaD9ZEA6L6JPd1SDQf^U=f){ljg-%h#4qy)T%YfjSQ3ZrFAn&r4L{IKQ!TUL9W!88?w#dvQ?Hr zeS|L^F!C2F)Woj}+OWG^r|wQu2r6Gig6hu?K1~b8ARIAU5h+|MDlW*(9h6g)VpHNp3~X01y$eJx_jsU+ z^)8gCmoemsX-fXmEc=yj3uc&vn>{ec)juBzfN6Zk_Sd{G+Ah{mpBtjOBucq)xkgTXzg`(L?fnsBkbKb= zTvmvKTYJcYUBnuLXQZ&aXXwxFKAHWLw@a6)z#m&E)Q?}k(eDzbiVY~6vWu;;fV`gR zdZ#EJ@9M+_6H1Snt=1^?Y;9uz`yrc`?NUf-5&HcwAU6PkuO@e!RO?;gYsL@S=D z8{)j+UyfXoixVvT-15wcy)zK{XhMFh#HMceNp@I@G@S6iyT0@p5haoXmXq-K24D@F z=p;Vx%+ye8dT+X}fE31dGNUE~%di9$SaLMVj;w-?OJiQTrxEl7_!$k6xsYnD_d;jU zFJFHJ&9tHu?i*6pzS46R{*|ZrwZENmj1^lR8++-Mrhcy_1dGm7%#AbEy5t>wTR1NcNer{4C`nxz$HWi^(I8 zYBxyWpr`;?&If39{<%u?^+io8_e_L@ObR$10pXIa?bniwNj0F$C1F#s3X#Vz-uxw% zHmq$K1bbFJKt`!r1Zws7Urj|yO3J^OvKeEE6E-zqfLK>$!6=6rfSUuAb<~J(&+m!I z|F#(|K^otcAu^dMjag-|k6LgjVu6eaZdP*OZ1CW~qDn^f=jf`XrRjub^aK}5VVbCr z48=FNFd}*$qKszavyeh=#JO7nQ=`&r4x(AV9*9|pFvLOO9ZWC-3v7nd>+f=x=CgF{2@F7>CfB8$S6eULQP!@r%=JG3_hYs@LDqW z<}@aZ;j6Tpi{Q|abyFCw&yP*BO z2rn~hcc=h`_Y&^j(wu^~gw8QVNjSyUO z*eG`*7Hbf)5PYRr!q_o_6NR?7nac5|`k!0GV>!vnATHrPuqKbcbHZd;ru7nnR~s+k z{0)0Ot37+6!aI#-=01kuuS1zW0qKwpsp}=c!W+C=6CX)|c_V9dWMpKWO1;rO2QcGo z;subyGI9OiKHwQ^@Wg9tYlA<(2Zp~49WPgfVT1s=#L#igE%35o%^I^0v%b5cjhuNC zPhneHo>I2*Z})dka=JT#NgK;H4T_D8g{OLX795J^K4qGd$enNHzgiwN3X~%hg$wxc z9nz8DXvai-T^z>O9!)cNk!wT+Us-E3j5iL6zE>&VQFiNGUWEUOobMm+oFJI{1YF-zXZqv@G)S*$P zX7_yB;G)zYZOG|!b1>CuqJ;*^HC?&F<@3a3Uv-SHw$J=>O?vgIhVsU-+UQYPSys_1 z)X}v7uAu93d*JfJI_J8LvmVkDj7Y(JXgfn0m9FH4Pc9HK-rwuB41#}{v-=x|B9sev`-3kOuv+p-11)~0#nrbU2Ov+*MKz$Ti19ouAdPy*B8sQ^2 zoZ8UDJ#0#L#RBZ4V>lXk)EwNnx*Uu2oQRyE<;g=i+?8kM1lP~`l9w;cpZ*Hxp(&x% zj>03cLM9B1BYj82<*+48N=IkpQJe4ugS6cljMcCSiYDNX+8&7BzS!)+qse$a@903S zVCr4_D z!{}g5!bJz?zyArBo@{th&da-IzkH<=6jT)XoKUM+8HSV;n%OT0s@m^s^tp!SSpfCK z73R^N*6J;Pn`Hc2KMEnWL<|GbwGTcFm->D~R~TW7`(hEP$gKI9#hZ#8*1Xg^|a&+4vRrzlG* zkyMBmx2V;)wgM0TaJonebX1-*)MD)2=(gswlb~yCJd~y?y3E-4TqWqb3An%5NP?Vg zsVKBEdyWfhNM7`*?$j7Y?eIkgIB>ZLt5zw~w{aiJo%t3+0Vr7S)fY>paQaOS{>Rx{ z%y^Mhlv=emj0}0}4cS4p7lvFSi8{;^31#UC#k{f!ZP!M$)4avIyaX@|0QCd!k`H|y zff1_QuB9WxgT=ShX=E;DX2%ytAVV-5L(Mwa9v=39Uz~v`**5!ZQm|(FCi3RQ$Jz~@ zC<3cVmQ?5`u4&^MX5VWU(w*hPvB)pTAU?^k<@KSb8)ZX}UPU$M{0Ln!xN6-9I{pO# z1U}`{shf-+7_X;QHuQGx37yyRZCG2;-H}57wBT7P3IQ4brNO2< z3`!4-%{w7eWu>mJF5tjRn2Zvx6eIDFQi#=Hjeo$og=xhqj*~PU%e66qtL(!s&nr=G z9n~;Qa~CGq40~js!%)S`SFW7z$5?b_-`!AQ&w5U_^JQ!Z>(NytUW+2c5n)n#j+Z|# zxowq!He*jNZ@D(4{C9-$Bl)I zmq;AiAcuHK-y~w$IV=Ra(AF*1X5ly(r%t6Hq!hmbL{?$Y^{|O1wM^B!7aekyZ(QPed^&;5G z3DnuS>XrcAe*W?NepKXR3hi$0RLOzXAyheQAw#_lmC}ln8AgrEMW@>DTRVJ8O1}#k zL?OuVOw@WfY$ye!s5Nv2Op_IG4gt+Pxpqd;`vC1vk zHmgTrc&J9`&=CCYKHbl_IEGJ^h4DT7Cen}&Mxm`m#De#%>4id{tldN8rfLLiMuZlG zYg)5fwGXPhKWkQl5&MpQ1(MPbkqfxPLS!7abH`bWTO45wBwzI>Ups^rDVm+<@^fAZ z8VuW;U)ltc#$`X`E-AG^Negz;?=?_ydv63jG{s>IL&UBYO62M+ak%faV7j*24?MTy z@z178pI4i6nGF)HlG4dCS*BE+e)Nx!$uls_nPSG4X(P|;qrNk*@VB6xIzi-D&qr6##bblrJXlk^Wt1~33=UBzM!7wsM>)TzD_dl1!d-J7B%^FgH>K2(LI!S4AZv!feW;Rv?{;` z8gU=Cs3mN3#hO2zLmqH9k6V=+h-Q%B$!=ZP-h@7w*HOrF7OrgoUAaI(Vit>mXnrVS zx8;B0^5&{p45n04ih%6iHg>_I^iSx|&H95Zt*e|m3$b>as{U1w1tLXIk&LER#9{dX zlmgu`mv!ZMHrY#4WK0d|UagH%@ZNG-9QLH52hNfCt|VXIH#^=v#6}}H0sL;hmf%?M z$>CnJ{gH4X&~3GkfySy(a(hr|drzB~K0lzHIu*nbYc30`R|RF)xDd3pI$ zGEdT(<-YC{h{HFUGxw{2ROqqkZa*QyFJ=l4uCRR4(k?={clg5fJQ`#hxNsX1KisrVN z1Tkp>{c1emjL?B9LD=p>GSa0E*yHIR71X|&Xhf2I(sC^!27`WQ1Y1@3p9b40U{B3; zG7&!LTW`w0Q8OhR10Z92TEV4vcF`~jc0 zzXugYuzB=|w#R`T=T!XO0rN6yUcDQn&KYvCyvON2koWgL^(WNn+hG zn(cW=MnJ@Mi$Q7%(i4JZixC*uUr`jW;dawicr8RLj|X3_V071vVKU&jm0KT1;EV(J z#;$a&#NOU^1uz_t({q-Zt#Tai2X>AGvau0>P4r#u`&BY$V)a%yMMhq5r8w-|q(0kb zE5#KSdlov;9*xlg-RgYN9u>zlpk33Z*_a6_U^5)|(Ma4hhb>hg`8!WGjysgi(| z9|;iTu{I!9l_%9d-Fsa59T-DYu_^5bo4=lG;H*T3=*;HLX>wGz_5;+2MG4^Xa9liL zA4LvMpVsYOtUXEG>tle5KDE`u!lJ{UPJo^k_>vTncGK$rCLyVse8^?TM83F9;+k_dx<<`JI4Y@_2g_M^)9-*c05I?3@&E&L&c9!Pr&n;H@cDM7(rY_Y@Rha5CW zyXFe7Q(|Y3Sx}Xa`#8HIrjAx&dZX zc;KHhrfNOuSTX=Dg{)*UGnpr6h4-D0f3$hSL)nqS4ER@UH;Wv;0E*j?n8lDMKI*WQ z4GiiSC)T#c`82IV@2pTr77jVp51|%2(kmWNObc@apPmU_qeFf7Kxv=>(0e6e;PnLC zJN?kq=UdTH?J8OnA6aklMx~?$w!8U0$>gs?X!KL=A1wbzesTZ(CIT7n%C2xoILtjr zW>a3q>_4>KSn$f6@3W1#3UO+H4)Xo!sGj~Y^ZrqEp;c7~=~yu&>$+b8U+ydp)Y)(@ zNy_*=_k|Z)vvryA%|6CxQfvaEF*X6rfbnMil%N!P2IUT>_9ZX=RC`lcP&US?o%7a8 zB@^i)za$WN-~;IeyLdu(49mdVN>`0Pp zv2^|xLy-*wA%<%D5*J<+8fhOyg?Bw&;t;+Xzy`g)Jqx|lrTDFR*78HlU?h1#DW7T| zfXA=*y-_`a?8w(@ycTBUlh8s#<{k_Z8-B3fM|CRba_TzWSvx;qil`RR+Pq7pi9?4qjCxDsysAj}gbGWk&fA3-OH+;n7GsGs! z4=%VN^QTAB%Z*29v-?{uXV@FU0WY=a_O0pizIfn$ooi|K92vEW0vx1PsEZmHvR< zXBfCfM8p`lIpTxz&!FJ6R+b><%Sk_!Qi~`liXu$-5dx(~L`d~*(aO0_`u%w-K++Wm z<&zL7sE2rRiRuy5 zd9xH>LPQ!#!nu*-g?_MdkQ$VKQ?pAQWIBH|iX^ZgtuGo9K%u&9W-}eCgj1VF4~?es=~zC?3%H5}K$m0MW-n+y zNZ^USIeh0HcJt59)bLr`MJQfY^pd664-i_#_M zxNWl|GwlV>*IMcrAl6oxd^%!pDu%5BR2+t_wCN`-=8rKSU_T_j%mI#wY9FOB`9KL^ zZ8!{QNoZpK2k}ZG+gy8bE)NVzL8`IQ^FW`XUbCjwkRd^SvnAg%CRYh7#0s)Nq>Pc7 z8W)KjZTjbo<~msGB^3j>QK)t3<;}#(%-U`Wzzl(98*B}+t!rf(+FEONAkw)vfapXt zmNvKrqwqHXD$Ik$&(D3{`$3QS$TZ$lG$@V?w@~k2B%%@|cF6f<0*^?qM`E%kkvytG z_;ngP1_ek@h~a;I++IeI#EyLo?tZX6-UB_KJkYd@eL*3pl}S2j*b53WHN#Zp#EOU?!W*TRPAFM{tRO%wPOAaOmWtpajioZYWFJF{P2>4ZP4Y<}y05i+d% z3k`^goR7SVT{OEG^OA(t)%_4Q&v*5LpXeQ4Si`>q(s!ydKMA=gl;QFJRt_a`v=y@; zLcYvKgh-#&=(NHuOul*kx+hv>lP;6=KeZZZP#Al^>{JTf2YkGYNh_Nc)nHv2zx+jp zJg12ciVzfx87FR@{&(H~7niFZ8M6@12=;!vi?bt&k&18u_jHrbpXLq80k&%pp2)_^ z1C^m{Fg)-BEITvymu?nuV4>#b-llG7o^}^&@E7RbkCJLpCoQ<)r|)vmcvhhD!ktJi zo4S|HegJ?KmU%2R9cwQ%WdE3M;K{D34Y7z2Bwu2yk9YnAzStbuc}LJmXJiJK#bfk@ zyN2V@Z*r6{U|4t93iM{J1&_C26R9=wqb;<$np(hg@M#M>Tjz5nV}&1!*hqKPdjPWf zaD8%l{9YDIZ46=*P1=duYor#RS^VJ#Pt^Y>kczTwirbv6OjU@ph0}Tbt+crAb(OXy z6SI15Cle%-4ZrO?fBA5&M1X1acX_VpL2l?VSJ;iywLo2Fn1YX@wyw~Q$ipbgjDP_z z?(wQXG`6uU&qsixHzJ}-X>$Tz?vs2#l%}vEB9ewVJ%0@i$wn(dK5ok}H5Bk@9kfo& z-_sreh|lrSV%r>RMq0?_-p#P`tU6-VTaAcXoC5U0mce^rM1C4oGlyOLikd6xPXCCL`7{>Q{n(p1lS zqs{Fo0FaftqAkkF|JcBCC4VZQHt4W%Z4N2_S6Oq&Ucg)rW%f_sEcqW2n6D#R&D?BS z3>PzSWC?%eF<>a7=OwiBV2l;{@-T4$|8}k{RGmfM2MnlC%_jm?Va)xZi^iUU%p9%Z zQ6ULs_BE_bl`IN|Trda^+iQHU(AseQV-%NxaofGTgF*70KoWY`K~CTwECygAX`N9G zY%rYsZ|J1c1WStw3VaQ7C@eAf#G#l9vljm_U2Iu1%-HIL&!EyepvHG|Wj51@W1n2j z(@d;dPKJB-LeG8fjQexIbk3V0R-x@-q2ZE57NWTAVsRA4N-=^KV4(S)()73T(E4*h zau=RZ7oLd90?U^m?}ODfqG{Af@7JhBb2~5}{y)xt`q0{ctRO;tx3JrNgO_)Og?048FuY~H z(g#9eWnfU`$*C0F-~%arz};=|{ts-u>?j10GnhVxaruRX#j-UQqQ>RK8?FwUPaUF?1-ZJ)VesL_QWb=EttSOuq@*jF-)zF5 zqZ*cIK{ol;}*m~VwsfYjViqogOOUFE6N zBL@&Ma&JdyUaw+T#YLcPxKSUp;`phbVG58b>)N{_4rswb8F*J25k!BqV1R=>IFJ4q zr`+789Wi1C8?qLaF()-a0yOmxY|JrF-{^Q-TI=*&JQ7dfE$INTG~A=@R2cO}bp+HH z08lyx7Df$yh7NOTi&b*^S`q|4mbUV{d|OJXuRHHdj1zUb&N(4`k~qB+>)5~A@}C~G zpT}--=YR3{9#$b0mhhWN63xn(C`?B%Gz!MjewixupE}D6j>(SZu=G z9b!5VY!d|lgVnLB%Z;@J z8xqqSGV{6>9fJdE(hB!Ihbx>X(>?!spt`dOhreStA^u6BGgcjPPee-(j8mdREJ_p& z*t_M=<1IG5+ENF0a;xfA(sIqIbu6GxOn+udaR~`T7+REYH4HTzBqHa4smiM%@<0KFGL4GFS5||d6tMr< z|A!1?L?O102V!3gztk)pRdd6vl)vv7?n0Ue88Q?w8ZRmd@rI|cgZXLn8CRzxdm&?A zKTQP`+Ub9fxea`HvvAqJ#L+V_Ah(~lAdo!_goC>y#jUK+Wrnni-J%b=Ck0)?v<9Dw z!a|#3V<`hvL$)QU>iY#E5ewl8VZT@s3H?G1319e2{2en?!~oT?x*Cn;Asgqh-yT=d z|6yBD!3_;Xl>_zN%LLA)`WV!~SSJtkV&9yPvtmBofa{WUg2KA z2J4|Z#{P_>dz`U@=3w_xhxr{`e=Q8_|B!^$ta`cI_n}qt+)aO{GJd>5E;Y%0ACl5* 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

    )$iyGi7t-%?$D34zt(=Q+}HzM{?7-D_mRRJ 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 diff --git a/Assets/UI/Mockups/Leaderboard.png b/Assets/UI/Mockups/Leaderboard.png new file mode 100644 index 0000000000000000000000000000000000000000..b382fd1b33d89dc49cd662ed40bfe3947a591bcf GIT binary patch literal 657684 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Ëp;4 zTU25VD8-Cn;Cfwz-9cRwd_SdqZAI~@FDr$m4I^q@v@KeQT6|8TX)C7<0s(`zscd)< z8oY|*N@0 zu4slU*v1Orz#TX*cccuo4y$VXi@<~7&yMRuvThMtj)pD}fsJb+|G`!nReJ8)1dR)M zFI#Hsc&!|Fk?i!XXClkN`8ba%hjH@Qv1$s)AXP`QKJ-!-lMAuD>^#uYE13pbdg_c{ zlfmnHrdLVmy$leg#awYAuU#GA(lw!Eh!3t0xn9E+(?Gv4C3#X70jAO9D_-p<8t+Dr z;nGh-HrACShrz;(t9nI8JyseIfCB_2@NZW*W4HRuY)fg|c$2HRQ_AMW50mRip@3*6 zRF_Awv|Fbc<+=Z4bR?G61#^h`^YSHMA>*;FvCdC{76jJUZd6VPEQ~pA$jSs<57);6 zR!3xqi7%17JQ9C%OP-Q(R~&p=%>wW4E^2>#cV5EI_7djxc9?Otzla0&4^OAH4&S`m zfwSsfy?ipOHc6ln+PD6eR9QTSa z8VhUmY01Ns#Gk=14e^cny!*&YP2-j+lxB=o9Gl##(nVb|-CdIyNPy0-kGL^bXuq1w zTZcHQNoAdv+_^|*e*5-pt3D<9=ifGg;>#;yFQFh|V5bvO%3GNiP@&Iw3}+Q+v67g` zYGuF+cK~!J?#?(1PLMOOw2i3T*`UkZGO7sXTk&XQY)vjJ&ClQxcIs6eCSz%Lv#)gA6EhFgGWJ5+WELv$CH^Xll5#2*kQ(FHN7`E zTl(?0DbBbJOh+pndbaF>S+44_SJOh+t&+4!jmE6M82qm~tNPYx$K3Y>Qc}-@! zieBBJYDD{>{?!|;vWF_60-Y`k9d5Wm&XA3qNpQ>Sgae@;-$ELv2t1Q zV@udDV*^8qsZT783Ud7Fe3wShZf8xnrPH30IF{#$p6M%NN?gBB;CkIWK z#V?;*QI&lM&f%Oc;H=y;aa{RU9_Sp31)z+(Ybfl0tq5;CcZf_G5ZF`F;Vr}BIH^{! zW2DTpW7|mptko;(mk|9e7VSJNRfrvSTPPh^!zT0yvRxQe&vx<9n_m(oCQ4(&p6RZJ zhU=Cmfv&JJuIqES&g~GIZ0Uz)FXw|_-ls0 zW+b-9eAFup>MfhVzDXf9ry56RXYBXg?Ko$K@dwqK{^djrJjMwo6I(6 z!zHiU=YMFuQ9o5J%jaqEZ9RhCp3N;U>gk(pOD?}wFY448B87ICQ3D$F`7p@94A~lM z-uiGq)Q83w&I>+*wr}s2)4g9-z<~IhPA}ockXsPZpUR2VcRZK9$?5|XQiziCqJ(g@ z;v^>1ov)BjR-`VbUJW8f*&Cf;#3_w!t!ajSxur`+G;io0G;{N7i}PLC#J~21UK#B$ zeHI4*8~Wr{6n*j%T86mpC$;Vcn6-KGR~y;pOD(k_#oWcd|RB5J`{oq?c%(Fmm`4m6+%E_Du zD{0Gsc-jZA2Slqb)R%zW%4``O^gJ4}>$}d%S;I;!e;p<>S9!E_XS(Qo$wBhb9d`LM zM)2A2rY%B?JV9CUsbshM4bsR1Wr(zMoRG;n^|(ny!JDy#UpsNPv=QoZEyp6X93Y>+ zkwSgb^^r3cPl#zW`Hb1Td@&=m8NTH>sFv~)JO7K#9`(2n%}Ne+-jSZXs>}j9Shu9W z61zZpEI@E3^A=lIam^%`xd!z;F`&S+B2#z^CG+0^Jzt%%+Nt@MET;wAI%B(Th|CjE z+NiJC7-Dd^crC=J!VK>M) zFIYPG_`Nc8OK&bp%b>|)8-;O_%K`M@h@b~iy)?3Dzzxl$3d*~aw4hU5whr;M%H)=V zY$I$Yw|o+83^f1cyuj++N?Ysivmi-+fi zNbegaUgoAU+;XV8?68xgkUtOXVn~-yeexfR9O>x2yb_||&E^%jitKY}t@>T}!rv03 zu7{OA!En>1=P`i#DYrg3Ys}vD>3kDh6RrFTHPANqrDuF5kKJ-*19+Y&+P;thNSN<| zZVAAWmDDnbP0Y|I#ayEEH5Zw@l_8S7@x%7Z$fQReZsOWctEpJ!V{oY@OMyheG?wQ_ z%9m=S$zv>_@yF$}Q9gEk;cizZ?=u8&+7V!@C>Z2NQx|A_EqhxqN`1|l8_2e$Sl~t} z%SBvI1aN$Ax28k)i{%!ao$tf$_AyK+16Ofu(iWg6z;2K&_E2;rS)j9-6coq>A>2>X z^T}p0bA^O_r$GrA&miqN+nqi=T|2Lk`N*X)R&flIbBrmbZ5gd4gr}y7ev1m zkcP*aTXK|K8%KhonjIsmp+T8zYQ8C=&+;G*cGL#XIebbO{wbExvZ?k_umCLuonNW5 z8W?$)B|`~DyFO6=W9RJ)SF{b6uz+JYuRx9^O~Kk8L0k@6GPxu(ka-3o-~+9#Q%jDD z!*CN+JaT*tl2Zhk23xZDHA2LQp_>jv(H^7Q4iAAEIu7izy3}QCDV5QayH`$EKG%Y% zb%)*5g?c9|?UvFg=GsP*SYue&q9=$LL@9E{;t4U0RTiHt+iz<^ zY&*?X+NwA*Z^%mky+A_0@c2F88<9OLa$LUwjjvT&DY^Hel7>e1Hj(4QgnXI$m(cNb zWi627m$)lo^|qXL4x&s2wI_o03K1m=c?sEh8=!nmvhp=G%5ozPDv*3;=F5frTs)Hb zD`^Tdu%wdV;|~g19x@5=NYiet7G!OyR;w-w;2X|SRi@O5t=y3Jz*cTFZX1G`*RTx0 z_LEac%s9@@?^J)saIp8vD$`9O@x_^%*mH6HYu`15!l|3zZ>3BtO|se@ObBUm`uN+^ zE`iv^06r$CXCzS9s)(pgp1_#y{m!;Xm(i8J@4)8IlMfE=z>y}imV$o$!ULMxwu17j zDrmNUNF_@CHE&}9!R$tqX4d-VENVnr3#$xYF#*5+^4B^;0}KG5@3CDkh|Vuh>#0B$ z?nV`!f!6LC1UtnU>`qSMaCy&)QT88MI(I9FaYQ6JC!(sn)k+z=oaiqHv<-{fYh(95 zvVa?wj?3pp(c^DeF)97XPGP^7AoT0#>a%{r?tBI+(rfjGcYw=Nq>mkoQCIHo-1!?L z2<u9Y@PEXNU**nZ_5WxmI)MQk#n6o;XfF{13g^{hs z>W*)Gu}rmZh9O4s=pQET_xk(~a;|xO=v5h{=ihpjaqUxDt4++5T?s82FcCeYgxnK5 z6bNE_ND2TEp$*7HK-kt;KNlre`-jq}W-^=q?Yxylz5>LgM$qmzt2;$1FZIl=6~$Uh z`HRTHk(F1%Fsjl$;D(llZGYBn6Vdxhxy51*r{@Q-BUW+Tq_a2}EtWIy+`w($T^2as zhcY>kle67hJvxl-ljQihG~kd?zv1aFO_s5~LP|2MK_i`5&K{Lv=h<%T?a*+z70-0> z@o9rE8EW(z%rQyzce{xXqS6p4OAX4{na-j>4zsgMrXhR#i&*iYzy7K45;S^&=CeDy zE{{_#9>?o|+;lDjfHu8U7i&_Nxqwx(D#ek{^WDNr*rgLVDepo_6N}Fn1k?_I9#@$K z;RBDCJQ2Lc3sxZC2YR`&B2U|NjhPw@wNdNn{#G4xIZnEE9zIESII#c<)PpNOW`w&e zS(*Xw?%c`wj85y5e4S{mrCg)%_v7gpdf&?Xev&|Wo4>&31Gxu31oV2*Y| z!S=`aDfM6`lg;7;nHJgl1C|!ahKS5(W9@C={3()C$>^M~qF0EZkqKb?gmpWR07$!j z$hy+aLKk0rBiG&X0yT)CroV;!HQR{UmK0qQln0M0ISg3CkoOlRpEV&W;QV5*`rC#5 z8wzlAk=xdT3?9-xd?XIQoC`x;I#4t_Z*UPd}F0tC}Y; zR)mzTDmhhO@_`!br?&Q+%iBkk6+Ch-CjM$Gp`kIWqDP{5k|86_6%ctZ z^Ag_DJ3&MJq;Q+SAWw3h!<9>tlax(>X)G1HWZ8aFyKc3g;Ps`^@-;%4@T3&r3r&wO z5}Hy+%5MV?$Uz?cjC{wKVf)sqEsq23t6Oz|z5+U=^J^S`R#Byz@Uyc~Oj>d!H*xN^ z7IpY2nmV?(bI33PJIwKGO?yDMnBY#L(c!WVxsB<>dwE;y0ad4xpg-xk_ z=kjtJ&g3eN$z%x|r<4Xf0+Dk=p}2%_H;(kbs!O3tL(?w9(QQ~#2B&nH zl*pG#V-6l(`2@YUyXd%VC9(At4?EVEA{^J^^OT8Cc6}g+iZS+^fbX4C2AL$#VVx0; z=3Hg7Os&aPq?;8By$uAM$$d-r4xT#9Q*X$g0kS`S_64%a5E@^WJMeb-1kTDka4>rV z`;)hou9p>8c{YTf*Ez0z#2$o!QIc%avpHPT4e_N8LCj1 zpHD!P29Nj2b|a@0fU$|pknK)9=- z&U){o+m)23UwartBb0M9Rh3&eSJ)tLX+7lF{J5t$Zhje2ZJumDEuFIT7(t+KLJna3 zt{6y=m9<9?>(lURyiO=sO8Kp`L$o76Ejc{8btN-WW#;)R|2Jv8<$evCayFmORWAm? z+FGnu(CC#OjpHnTB(TBGyhHufK?R6tXPeapU%LVFC7P*)(o&agr6Hp~uLHFm9IRSn z+g@}XSNQ|0oqe*% zE6wLyVJnQBRE6W6Hh_ehz^jx}K00#9_}8i|`aBQ`el#vL(@1?;g^XUv&gf9m)x^}^ zQKQOfp0IaoH+cNGmOKPgI=&Uf1~ZyRL> zp^SV>@flrD0_qI#Q)-{1RE`9J1Zk|P^MjN!Ocf(`2tw;FMrlti)y`*+2c85m8Jhq( zvg$X;oG(0-C#LAZ13ihFJ$@3@kRXTI+t--2(%54Q=-_&2utSY>&icp+tYA_!%gG9- z>8Xjedk9v+RYquiUP=u#`r6S+Un5wCRq=}JMJdkTm_So%tTjDd-GQ@muL3yE;9&X& zb|xnDb7cU8Spew zP=eaGoqY^C$~%H_?>4@e#@H#xz3Alh$7T!y?sFfDI_s=YrnzY-DJX%i%G)utj%W0K zP>Kb)rE5XV;HTLBG4s1}IRP1C)q|vzQ%Wz2mDLb#EY;(rc|H^sBqueA3Ptn0>svV zf&fma9jG$7X9PCyFXb9-4Zf&{f=nf}zsMrP_*p0}VP<$)`R!sA$Iitr?Cc!FO`(g+ zZSVmcEuRj<{+8mUgt)G`gU^4B$xR_wW^X^8MP?o{O2N>kvtTb{ia~+h=`*rhI}HUn z078S3KP3l6)Z{yq4|;U*@nYzyLmLDRRc**;F2Vb+OWUCgQ#G4zu>v=0x*2Sm7XbvZ_FVmUzUHMA4Q9S0x5M=x(d4L{A(I# zOrqe;HK7r7x{k%#EJdd{x3ms&#^v>SknQ{iiRh4%l+8e0vOtC&d4)iZNKm&NPXIyx zs>rSbXcG8*r;sdD2d=Z)=85?~I{VhanRa@!2HO6&@Otr{RTk*ztP75;OJ^u4s&~Ao=&MC#ZaM}06B&nI@;oitcbyk40up1 zZ*gYCldWg4H#vc)=O4k*>P|QhB@c~!efW}NVHNx#e#Pfs3$%e8Zc~*}Rt;LLfJneM zf_PBjgcWU@Y|7%Ka|Z}39;yB_AG>YWtvQH{=) zC#N;Qfsr(IR%)_~%qT-+j5*Mu%2VjlHUFCBXQm6(a!Bw}1#p}uJzKtvE!F`wKj*`C zyzidZXMMIt^#>TPW3&h%bce9+EG7YyhDFpMC}CmSH+ne=D_)WN`Yh(QC!S0_K0@~uf zJ4&J!S3uaejMiDg!{F!LwKY&)z6lR+qc{3?`QfQ?Arg6r!$!|5kYji64NQtve_>Zb zthPM{cvOGG18iVQx|IAfWOK530>Fm4Zm-}NuqP?ifDD$O8aJX5&6P0>@LGeO2jR)?fP&;U!HWrZ)#why_?5c|ukWmZ|_N5G1}i6lCq+Qzkvydpf$7uU>r}zstb*>WLc!b??f-h>Td; zE~DfFMuPg;*##*V+=$BR=v*OV8j_l++TgV50KvGl-h9_Efb^igWyl`v`%;FGP3QOi zQD{VYcgY6v&2Luk9RcLXO4m1&OgTx}M3|ENOh_w=#g|e3n*wsArX2!uv=|hjKR8Cd z&z^F)!g8*FeF7G^U(1=$xdLYbX^t5{C%537iurq-$@KyGZ<~rbXX}tuE8d>#bou0C zbX}GHvI027-_Gt4+$hoygmm3gj5SxZyy!D>CFzkM*f%ffa=(3Ir*3rm#2kb1;3$_$ z-o`t$MQ0k(A)kEBmF3q1{XFE2PEaDAMw|s9z>Ozc-@;aL(PU8>&YcQe*qVZ0}Q=K%zpc0+B zZL&Oxg8S$^0_(M;o38(G3XMWHn|x#4NN!Va8tN+M$Vr_jkCx#G$=BpUCi8gtGX3*x z`2ik5*ij+L_2p!mk}hTe3O>VP!WvMdZ2OpOqT50uoEzkK4gk{TZu6qnrA^8YZXXKT zK3PQh{d#K*^rIo*$K~Zt^|uS#JIB}lu+fz|WYqCtX{52Fk8etW>oH_|(?1%pQCW_GVgmRiQ*8lxFnUxC<1}5Chk4zI9$Mx`6>OOG*<4=U%0k3p|76Vjo-AD*!nxz7g7j&jHPytGIqu ztIlir1=wFZv9l!|hrxVXiR6vS55Yf=@a0K?cHrkX8^cvzg_8~=_W<$dklS9$)wBXQ zwyNI=Or}e?&Lp#N&x0Y+1$lQxyl(EK*7=le+sedHR_b!;0~qEp7?U=89oCOBt8lqJg>Ff5Dg301-~ zOp-}?={hH#o=7#(_5C3z-?|~?XS?CC{3zqE9ROC|CSRpgU0P$%1X%bM8177&_f`FbWv^6=c0HD*R5EPc@b6ay4k!%EkFE ztepm$^D*Y4`Z@3hl9G2CTiZ5JKi|w}7jjo_C<+1`?Fwzb{oHh8bo0-S8`*&7%IK=o z99fDv^m*=>9I^f5;rvy-dSilRkWYXhVs*!kvwg**MmvuPzi(p8JKe$bHSA7~p%-EN z53!pk^>0!vVLmyp4`$6#%?*piE24+) zT-3TqRI%M3( z^b=ohd9w3Wf8b%mv|X>_I2kp2>{(&&+NKOc$Nf-ax>;FxjcGu%arM!(31R@ zqH<#(h#McyD-uEI7d(I{aLw;|cu55;mor!`r^DtLu`;Y-{^GAD?1*o%d1X>0&KF+) zCAPm%6;X&W#?z69peVr6=P#)G5p9By7)PW-+MqG;(+#ux5>2Xapex6q2s_+(3m=J zp!{8vm|MCo)YD5IiNotEyMH#RoonjzDPCDf=x74MCzk$R>l;xye$uWr5ZGt;wQYxe3 z$58sTaEl?ak0gg@_LCTI!U_%?tzC`KE?a_n$-GjK1AEB}fdm0JK{HKwF+|JQ&F)q(WEP*1de@ zm?_H&PXsp569x$~e6m8+YA=1AuAUATEmUisX_RZP?B|3}&M&dM2 zMn53u*9Ax@kUs>{#dNOYGy5pDE_zar^w=S5kV<{)AuHbBB3*yL6)?1_d&wCq(<{hp zld4}Oy)Wgw88p&B*Fm8 zJdOBlZBf_`^K?dvN^651x$T+~cx*~sdEoqZ#gT`HoNKXyLu^yo2#tW&rZpXG`)mn~ zvvV#TkwG2zLAf58gKP$ihyWazCv1==J(6Wq2xUZcP7V^w&}PFyGEt!#03!vY1+ik6>$Z22U#B16Xn$Q5}e{He`jAuD~7Jp`<6i^~}!jfWthPJ7kI_&Z< zd}&gcsLvb(x(LJk9bgB6kJ%SD4%vC5H#{Y6TyC675+FzB2So+-d1;zbu!y`o5DC4; zmjb^Klb0YT6c^2>N2AJlwt=ULVTnDI$cY;*lm4u006DrHiImkGF$%pcS1k;E2{Joq z{Z*Cu+Y03P1#A@;H9&zLvE4+KtOeZNdIjIv|2aI`{uXXJ?M#ngZ}tWzxboIXsw)|+ zPmh7=s{5{01*tl?28!#19zG1nN?B2o#*jx@gJnkEzOws-4suwAI-9_K8r5S{duco{ z$3Ywt?_(abiEPSIzNK5bezZBjBg+n_CdidJka^6pbdt-y`#=_$MmB(|sQ%?|6W zD)l{#0BQ*8=*ih_gc2s^5C$pSgnjxP#_}BESoJi-l*1fLpBXo1K32SC6E`z?xsEir z?#Fz1c#3{+Tc)am}M4ht4WHG7` zCdmoO<>{i6;9$Jpj?7is;{K~;k;q~PMczN~#T$I}#X(|Aq0z@9}d|LqlZ|g6n z+$c(TfZMZE*k8SY%hgWxw+%TY#HS9NE-ykDNKoNOeq&_ufS;!oPv$z5-ltRNeP4%a z45K-=g-w*#Ip9Y4!fA((tke;hT3utw>6F=%HsTm(WRm1~j3sO2bhq@bQ3@2EM}z#v z5z>#5NvaMt-&hJq9q!o-SAVbg8K!`N$XBL$J< zz^=4THy2;q;J%*W1}(82?~$88Hg6-;U5i*GIJ(B6bb!Yw(1{j8L*gh~(vy70naUKo9Gl0^uFi}|OiMRzhdimB--VtOb=as+@Fj8H);Us_2pQdwu zV#OQJtt-77uK*VvX8|6j2CTY>>JpESfgD3*y1GrLOW4{vhh8+ap(&!c?3jPvC58*6 z1ba;p=RP(6*x|Vp2=9uEg@y8zub78DrS2+=C(KQs;)F-}GGuh}t9Z@OU6_k|;u4V`u~jUvXXOQ+7Zo>6{_ z{W^jhBc+dT)k*7wL-o6Mw1xt$^BHP}j7)~~l>w}yq`Rf}mHIgaz1rDGjgug0_)U_N z#Yc&J$pVMb*!oA)wr)CugS-?Chz4g-9~nALM&g|39y**c?^$9;d^p@&_e>`O`rJ>5hM3~CRBY}r1j=y07doBboj0dxX~pz<|K3tMt-tKJqigQNGbL(&ygA~r&Hzt zzV!)MtGLb4jaB@Xu7<|;`aLwzhJ-}+^(V)+Nja0&ELYq-LIgaQiB>Pl+7n(Cv+eTTnGClrO65!HvkZeAJ{c)|EnfFCNb-+7>D;jPHD=A{C_&ev zSiyYj5@xfT@zOV??z_@Pzfu!vPu}OB*|{j;+9%eRch@|-e!kF`dK#$Q$w4o9nLNWm z4$rcmK81A^0HpyorO9Ahw2ccY)3c{cpY?HpMW)G+tY~{Rfk);rEH2j z0KMAWhz*r%HbiVz+P>po24kPecotue%1Q+}azwZIBLc=~HhsqV5YUl2!Ar_dO-uuI z>icb|U%yPz&E{#8BVPE}A3y-CK%ih;JDu;I)7JJW?CxCuvjby(XKuQN&}x&hPZWFQ zsx*Q8Li(!TknEIam$HaJQ4y39$-s(C%&3z*jXE=FG_ZF==rop*$;f~SnLFrWhoF>t z6Fl$j7L~p<5Y(AeVAB5fYq+!h(h}!pk*Z2fnf(q^<0)+=NQ~U}>T_y(0Suk}Fhf+& zG6tQHzV=hofH$5a*xy{+w^14}E?hN@IXrHhZmiWHyz}?>?@*Mvyu7(wJtjN zk_Bc(4dPENLo{tLAR4@Jxv~6m?YqUFnK(9aZ1EA~y@h8jziZ+do49uBrLWCN9Teh| zk;E%n-=nvT1no(*@17^yt^khhonyEOM48vVv{t;VM@URh{CQ+hwp|H?=KvduiXq0T zr2*tO_Oytel=$#EHT8sM1RFn|NE@NWc~PtW1O-cz`{{k&DA zEb;&lJ|JNTfZ%IN*pXk1`nFR@NVh3)qjMmRq>Gbj1w&VSrRBGN*LmTn^11MC=WXXK%!7jtM56%>;oFNsF-F?0A+%MeW)42TAgB6m!C)kjZ0 zX>)zAu8E#2BbZM|W3=UAG+vNck-Rm#^y(SXEv{q3NfBADJQL6SCg;xwiul5|w~t|O z?`{1Rm3NW6&w$raP2DSa$O)j1d?*s<%O@ny3hQd@0ZQ7UvJNAeGysf|CnfS_%Hf0a z5C=8Im?aU}jX+)U=DRhyfca$LVLCSyWVmW_L5{9=V}S~uK~RzJIYWSlLXp%?-_iw|7@Sfi}PH{H~d(jnGZg_mC#z;VsC zrv&Ce^Z7;n90axN!CzMEMm>KBw;f;GBd(W+#_U60d6BtK3Qbi)v@ZM^-`KgPqkLCc zg7HJ@Co(gPMCFrI#3yTtOPCJXp7M@>4Od083Sc_eehn9^T{v6pbtf3xdPL-RWreVQ zb=FC_;Kq>nRGyncgPietx^i3jFs`I7Ej+&e0w%ZuINyuv!bMWx+LzAo377>t)1<`5_yoAI zzyAhq3eBdA+F1BNh#*m_&z0!ik1z@70jdAU&;y&iy5(?)Vhf9)HJ-aZ5&X!4xmIPYCkq#@AR1&j45xlXLV%{{g&Qm zvZpr5iL{CB<1_Z65i=r3Udkk}Q(%IBIY5k`*K%^x$qPgTF z8uH0kw7q=-ckjNae$Vu(h_%p&#t4yuR+0OpJrOsi_JGmpT;fm}WhThcwnd2*?} zMP-P@vD!+ebL&Z(6xk);A1|#=kI5HxFy$KWP98^30d5G8uyPwxMLnW7j?-V-d@v%lL%`2#loh<(DEmlr|$cEM~+BXIKBVqtyDsj{N%C%n?8c zN)8+@YpkJRZFKDwTpz6+^tq*5N~ESOv9;OhiQLN``L35zd{ct3dzq|b()ct;OqjPv zMdpk{+2cQW(ohEP0Lqc)^T(9`P657{917?Vl|@aSMdhP@_~2Xk^-q5ecXy9rIx$~e z6u`&M{H&D^MC5wQ7T~kxHX+@4bbnbz(bm=(JbL&H?%X*{2RE?i-y+tyE3Yd*w8}XsuQ#~SgD08RWE!r$#TiS%D=g?cX4P-$J*IG5j#&SQgFH^& zLzxqkQ9P*S#AnJ%h#H4?fM4vL+z0sk$ZrKk_{XBqb4!_fSbS=N3+;9hlIzRcl`B?l z+&g#+zxAD;!2SKV&8m$6J*)r%r9({b)cQ-A1e3f9ZK7yG(c+;kSWhA7HBgT1p>Zp^E$%czUmoF&C>_Ni-=SH@tj4<(k-)O4>ogVH#t*;Ny9##g$V2XU_6Hb78*AgVXH zGL=4|vUua!IEfj`ktbhqfaRlu*YMpZU&E{dHoCTMY|k$$kmD7+JbYm5hT%NaH9*^! z4VB#uGkGaE16%w}sF5y!oBQ`)!o&OD!q(QsxMyyJ>OIskbFy}1&*zsx-Mc`Hlxs^K z*-xm`-|mQS<(W_qzO;!+Et*1CE`5z-56crv(nFk12asm`{dr(4i5(%?a|Z*R3*{Os zatw(-vFPwSv$JY4eS5&@m6NCb#V2GRAAD7BA$oEAF_e___2xEFR&bQM02S&CNJ!&} zOf{Op@R7j{zg+b5q~_VTu0|Z2H$~T8<$<7DI>Y+pjaJ7uuzlUq`%dB6!w{b_E8P`> z9B#a#6mXy;Y8>9a4*~K(4uHIDylJi&=ulxka3B^h{E7M(^Ys(p#)tQw!zT~Ft*)0z zX~abPlP6DWfWy@T09r5Ry4o@M(y%xlW`iUlpreW1+dZy;jc2gGe+1L2Y{Av*>*xSO z^6@2&d?J=#_W=aBk89-c8jj10=|KU;E>I?xM+%WF%QPmi%RqHLZ^n??HoSZ?a7g=# z0uw=y1M_6D$lkgp0VU*Sr~mb(QD0A4>xscPjm8|QMxg0r0r&T-L8f|6&yGHY#cH0O z*fX&BC=|alJB7R3Z{YdK6Ihf}E;2dqj-YVTp}+{(20DlG;G>7n;G36Epo_TQ zW9bl>clpZf14WcPVt3+xcjpA|-gyak58l9R-kc-S0yoy_|F20l)>~_unn(c%Libjh zDCiKLQTSv9Dbv3k>X+~`O}jGcdRFT)j-kYx0yzNE3`;C>fL#w-UN>KCGqp&Zy|FVr zgKJCcG&VPg#B#cWomViaQ1zEbAHvDST^+ZsNw3KB(|ey+1J)^=Eq36|#XY%1ErH0N zXBW`I(|azx_njiv25w+)8GVRG;z>?7LL17;Z=^J%=s5&%%3@fryiuq}o>!sfExliq z@9&|R?e$7OAn$d690T~T1IS_V4|o` z2wm|!Wqa!!&M&v2Oej(m+@LlO<;qBj_xP5fJY)GM`-GnSrfDf5`fyVw`$@cAJR1Z# z6iPM-kZHsW8$6`73L6cK$`IGv6~M7QJBKJ;ap%3IhJ;bxn;*jT?j^iAc?_>lpR~8E zkoPhg7NU>uep%&rQV$Rx-1!!cU+%+VHH*s&WIzdQeEP;b#BNi9qwF1BZ2Rqed`Qr-Q*qSZugc*eq2a*2p(_g@kKl?Q}z1V336aigQ??YeW z<73`@dI|ULyn(yb-`4hdty2wbT=&)LJto13lm!r2ah}P4*R{+Q8VeeyE?+!lZotE{ ze9;JVC%}t{wQ`&NuL2_hk)k2-=$+!^7(S`SD{|(j+Kk@X#@Wj4p%P znJyTQNsMC|;7*y8z%!EUtB}=4#0Xg>3!y}Y(R3fBaNR_~n_If2>qo=Kl+uwg3rJG1fIWs)Y1_;^bP6l0wlohXBDV%uzy$q8*gD}`xGXVRsC1)+qJK`5kz1{2{E$?nPI8 zaPg5al8^Skt-y>IFfGjTMA1e>*qgI^uv!*CPA8y5`4kH42^xe9B4jq{I6EfG-59vh zgC{xNNWe*g=rts`QnA;DuCjdZdfndAJ3uYx$el9v6tkv8*9qiM)Jt{;Z!NdW8P3f! zBCoIio|8u~x<@&4!H%3Xg2eWX$9G>fFFgm6@EPZoyiXs01AAL%@a)Y)I6dF>f*Woa zuzP@ZRjG91v#tWj*cE>}r`1cp^ZINJad4>cWk;LaT&MYjN0*7%N`wI*z*7Y&fB|*z zbA`wOIYQ}z{(ppWpJ1wAJypWT069A4jA`^o0yzKzD{X8v@3P{S*VkYgOt zbi1>&`U@&+rR!uE-Z7dKE7+c$!gO*8J6k7kSb-03PandvOxs=NlK4`~hj+e)JKJyT zL#A93+nMg~yn<&ZPwG5kh9t`4I3g-2A|2e#=WUtBzP!x)5hj|U9yum=)Y#I!1pg;Z!z>QHd%N5g8HjTuy3A!$N zWKo9Fqm{3Rpc`4YxAacXcpwKrF3>U5&kT_}E?zf~gR?5a6xpe|46ImhnE(dWlP?`) z&QvpEioYq?@?j5{^#c~Q4ms@bTm{q^q z^^4hy#T?32vpRUE0!50V*&Z!cWlXCH{Ja7(1c*^g%F1V5Rq?BOB{SY`v9Hfd!OF2z zzGVzNaPNnM8*K`vlMRqM(#PbqczQP1DbFNpH3IgI?!~)akOSlL0Xoau!Qx3oQJ}}K z55`3~*vEeL#$T-9xcxlryFtxzz>E4*vh$e$I^MwLatlr`_p9G+xTvnh0ij~$MFWOh z*8JP^6FAs9sy{_5&SU8!u_Z>F#qrJIM^)RJLhsfy;zT+Xgow++-g4K~gHiy9zIm@x zwogE|tiV9s!9I)cSe9IAO~7u-n<-xxj$b331x>2K1e+~PVz9un9xx`jtWohCdbsxzUW%XO4j8nlqT=xmC@Kbj3IAB zCjFMyO-VjyI?ypB?-+~n?K+bU1UXu~{ha5Z-wH5bHAik@pBx?#khgK5Lq6Otzuk>; z{r%8&mpI`QiWgk-+2&SsPbQWB31XE-hW~kMbZwILF{_>%R-h0r?C(P5_~zsZr;apj z{x--#frPRAqIwT7!93~I7y15x9GEU2no7rnfyyU2`l+%`-7x_GVPVxjVq412?6ldQ z@;=ggVk8BCQQ_m>^E8H#kavIQHC!y`uq0z9I_=I#z=p-&8{EK-c(`8RMh~7W>M3w7 zx@IOAr7i|On{~CBv1N_kZZ<&IRp&l>-TLS2r#wF|H&GnuSXbU0D8934^p^J)c}FzzFG(*f|W99z*{zy|uo)g*ky`Fy$A6%x0`(53

    J+NuE+I$LAlxK)S6unJN){01z6QBG9 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%0A_Y}r-o5L; zK=#08Jg8gXZ;ue1v)BFwRoKhtSY}7P<+v2wCqv9&`C!~ju9$Y-XFu_lW zn$^QxHGSxNxo|?pHf=|14o&Rw!vze_a>`=OXdTc;dQm zEE$7!Mk8KZ5r=*@|1DvRS_vX%(uhx&fXDZP6D)a{c2&Irkwna^1SQJjq_0H!G9p^_ zbGv{kl07`PE3K5|rKq@`_Xu=3Pa?T1>yF}fh$Zd_u|*R{=vzbgEf+wYPgk|^O!MnD z*(PP2jc1dUdQ8=&Z5+SSD+wvrgJPkb#yiJbyx4kb5;|E!=tpJ6>j(KU91BRlkcupK zoq%J?*JX)*$+F1Pz1zP#q{?Z9i{IfnRw(54P$xPBKlJAf*dZFL;n3~E=tJ>+v4;BHXH7L-uM5>cd3KhF#)?+c`e@3j-Y2Dltuhqk$ zzggLJ$}Ss`dv+#lkpHqOz9@2dO^27lXhK?@_NWp6-pK_l6x3K}L#o^Ze_0I&<4OK; zdnSP&5=5jNpIQ?8@a-yf5K6uG@~5h|hIZ?!EsT0@Ts?Ii`asEUi?7v-IL+L5Ovo9o zt+BazZ!qO5I<(;kSj#bzRS7`!sYPVWZ4o9|$}#4QSbX;N2u&oRXN<4lt5 zpk*YTW87H%UAp?h7~qxGzM@>{%ju9Fc1>k=JmOKwFUL48f*} z0OCG%qNkEQq+;A*B$3g^?(_>m6M_+OKcD_-|7CVVg%a^j_@}m>|L|j!exRmt#3$3z zWba|*z2?b|;Tt}}BgTmpl)`q*`Zn~{yl(O@O$+?SAb9ee@+H!H@H3vr*2vc|0AA*) zf~%c{a^b3ZkGa`fd|fDK`}>hJ{;)&d7n%c()5sl@AI=F|`v9PEC<*SQPfG4#msZ|q z9a(l-u1{EGQ`+b1hpcU8-eCA=bA){1I~3cMT#aO1Cn>K*$5Y>(hE3!1eE-dkTHcF? z*1-UJK?!}GP~0y;n2$y5zgqG?OhI=nRN*5{W{NPnauqMBhO-X#9TRhOc&y$jEGw2) z7Hd`im@Rr)n+ATLMTQo-c;m(AL zrmRJaeD49t#mny8ue^BlG0^hy5Tutc9+a8+^o)FS&D#uEJv^|vbAL~9pxVt z6WC=gab@L36nve`jhRY<)9I zA;sn)AA{G6!Mga08Yb@dCsokJLyGEtqCQ$;Ji=CK-Cr-z^@GC4!Gj5MAVh)c;kL?} z#=um3`s6aQ8cf6y@-0dUTE$j`C&XK!a?*?SEa+dtxgBpCi+FamIY#=R9^2ke3>zS1 zARI(*vc#>rsaCTw|1|-~RE2vBCA*5ChFm_~t!-PHcKGeoqEqaN0As?fbZMbE0&!7j zAXIoAObXFt88>VL0o^$)h=Bc!qIwX{6}Ra6Bg?gRM|pbpFLuWF=h;;}`&Igo(2lV1 z%sd=4r<-Nw8lirDIh~!oeg>kp-@R8UTG2PwMcVjW5F#gUK0ks{qZz?bI|z?{ca!Fw*8NT8C?u9-c5PO7ww<-F4c~eTS?yI>`&7 zv9$&#=SLqHc%##|97#L3ZKY^PQV>WG!V{1Z5O+#Qq!9$4CxnzJ{*E$o=~qIt=!|}t zs^R1Ss9z)?P^v}4StyoSkM*vS%`u;yLQ)|sfc+T z&UNi+RpjfO5AlK;r)StzviL5TBv)g6&`A^QZ1-zY-?-cCoUvoKE7nE75%`3Uut7+` zF$$K99$B#9pZZGNKPrdM=;LFk9sVH$>>|Kko$g-+uL{KEjhN^8fXwlK;Q5{N-3$ zys69yaEupp%xo&kN~cmo$Kuw zXp?C|FJbK!oG4PS!&9j>a$!JzpS#~X(9y@!Q?TtclK<(e{ zj(gDK@lEq1v>r4zPWWe0ACIgp@-c>3^2Xk^DSrk1($b3!11%Z3|mzO~0dkfAS z%UkA&Y_1@tT8uv#Jn)o~E=ndp)|2oQjN>&`z6S4Dflyk>#3PD#U+|%; z0bu6+kf}USFUs-z%A)bMlPF^^UNP|(#xPL*@$JuZYojU(uGxI6+tTp97C}dngu4}B zk=o(3s`A+mJfvyMF;|hbYngA zWv8bl7M(&w{ycYB?}jp$Ob&%3&A&NbXy0IB@*Z-O5IAsNTl`-+{jNCtLAC$b_IvBU zc*!stq^A!U-bpQc+f#oSxObtLOk#KVsegMG&}u6 zF_ql$rpX%K6RG!Eo-$IBL`F{>QWpCPVGdL|IW|F!!jlv8C1GYDU6pB+uNY3De>fpn zws>?+3iBfjI;JLA1GcGac3i#HVqeD}L$5ZJudk=ntfuu@;{H;#&(7gvP*Mtek@b+1=c2f4 zA!koCqqN8RJ0@#w^?G&=^V^lf=8saQwyw)s`kdEQl})|L{N2AWFvD(Ccc6@HuPBC` z#+U|4m?y=bpXbT(L)4eBhPquyei)pMhgdM#J9EXjQt>X<5|-U?aFg?NOkzbJ zPgoGBZ%;^S+plo{l}xFX)KjO)3kN}xeNr6mdp=nTtZ@8|S)bZ>V3B>2iq_FA_h3PpQpG(Vet!#el5SSd z*$SV$S%;$B_@;)R^#Re~dB=Kz2bQZpJf7z2G1Sv${E#N=arE}!;a3_fg52`cv z5TW&Pw4j&Sp8%aRoP%H8>+dx`c%oJ0=#ov9TCTH40h!;Lu%2!dlT6MC)_4l!jQ8MR zeqy6G(DZRS@}U>@^PDW*I`o%5F1~17HXZPKkRH7&XD~0TfI~B6(`@#|N_ZqTpT)%5 zZUkm2qf~ko52}{P!z1?0+J>E>>?OK0McdJ))W;zPaB1XO*_;de-eXCOB_sRkI|gCC z%ufb<;Axoz0K*@rG?7J|G~uPtty;;XtNBhL&*20`rE6PKLph>i7~t(`Y^skcN5cbK z+jSyr*6g^1Q)Od{k>rSARVjBicP zQK|c7{Br75-)b#SSyoZs3V@cd2rf`^)E>vX?xZ zgL37OLDb(Py)zy08(Q&Wf%)wSN)xG^(u{eUr5k|GcRq#ueiU)nf%FbITfq!E@U`GN zrou!w)})pXyI&*9*$l)_9Ad2NdkeOaGWtyo*8nGqz~$P#*uHT;j;&k<37`gw>t2bp zAwv2h$E!6bMfvCrFS@3b(Mc1S2z8d(i{ckrXJ{5>;+SeAz27$$q$=RN}^*A)38Ku-sqJgA)kgvdmY zRYfktcza+RbDFvWbKU8Q*!#G)r1#D~vS_AHJQ*mnjemq-ros>N`Pky16S-z7vfTc#;BNjO&x#rNsuC!~R z9RW2c_=)(}WHMgK@Xh}T-f(#_|s@+k9AJpjwEeEG+A)P zl0bATIAqo`msc~F*B|5WD9DEOYSBQi3jzyQ*hiHGV?uzN7~@!ahD`S0?Hj1OePA@ozjduL*$60z{oj~lzn#rqv_aS`y!+T!;_uCmI)70Z7 zP&5bY+9*2iMZ4J)kzLn0x6e^SlLk%Az~1v^y~9yfekw3K@S~fL=WEt3vL7c%KronU zw8WfS)251l&GBjnBw!>R&J)$#5eQ|kTG@)-7f9*LYL_K`$WTyT2%(TVtR-zmll@o^ z6Rmd|3FiYOPnnz^HdNK9NX2-?WZ^mB1RTHM3 zMG)d$ai<5pq{!Lm>-7C=QG{cEb-BxJo1MpADpRB^P8s8Y{MGWeEPtCb^4kq*!56eL zs-eS4hacjpg9s4blNjn&k<6HVbpL|)yz57YDGN`gb<6FFaCm)*3bNp@VD0XOB%mK3 zqNZ8vCP|l^^B2EWXn|aCn1v4q2&5r()vr51ej}~AH`(gdJm=07@F(IGb;6otG36QO57T;4Y7LW*#xS#9m(1e}M|~C7o4I)AZ-i0vf5qpMDkw`g?Q|VwX=dlrI&CLMRKcn>nHjNHx(6w znV*(ND{iXFd52U}zcih2NVsz+(}>5B=^m+Mz|g7hn-o33#abwhs!f5gGS?&=(=>vs z8gw87jU^H&}E(_Q37{m1y2x>vEfQLW`PAu zKT^*13@L#_-J$2ukAFL1tT}8k`ulJ9fR>!muQponH{GuKrF$uHt~-vs zc)Juv_aXa&S9jX+`@R|cfp-0O|6*NN9nAUfkKGx6KhC^vIKz6(`M<%!wVB-}-}vFy z>gkWH6oIYAKkbKAweF)c_+$4vI$(TXI?EfqJjVidX*ETcKL>_!`Eq?OEFm0p!ZjEW z+_UZ(QXvI8Hd8X$YxVExIC=NDnvZ~r)6rXKWTj?G5vh0=Pv|QCG1JD%VLT0=Xv!$o zcT7@jE34*RGbY$gNNHuG%QjdwT6p(C+n6Qw(j;`s;CxFURiY+cnD!w}sYZO>OLiwk z+8X_%lNy<7xdl~3_9N!L4BxZE7i-~-(DH=xO;vnU7iXGp!wCL&$)uqhU$7wtr}8IS zH@E!z9uKe47Z+N;Iyk-nSR4_+!i>c*$(^K(Ec>vx(dR$mZ?B6=TELmRLVykiWIWyBD6F)C6AZFM3chg2ZP zv<$`Dz^_E3eN^+JtlSS*8iGwtA;{(^H&|Y9tEzM2dto;>WI!n);E;E#>7)+%Wp5y$ zAMC3m#q0kWH#n;pi||{cN#Q0kdn#8&yyZzuVf$z;f^b!$y^<6*>ekj+gbKw03d5Yq zD7a2O=}bGviNq~hgnmfKWX(iKL=F=V-!4zB*#1E?rHwwY>J2HwPw@r`q(+11DjgFJ zvD;4I3OIlcD4<0Nv}RtF<#-?cSdWJ{@={~=IS`EoCrVNPEv1#+J zn{76Ox^@1r5Ox04ae17PY%NI|@iT2(dOXZAKSO+_ND8&o^m@RebdVUECr2 ze>d_)vyZn=ZCk)?lY;v~?3x7IQT{&nynfg6{L#)!O;@5JMh~;rf?=zmGvxM*(=K=W zq+|7t5APn>UhSL9sXV6&hEYj`!2K#TZ&NBrT-flgB^7_+|JuSOdn(9g>@(}-R!iRYV&wHUl zGJ(<%8?)J@2{t9v&4N>^MMZF5PP2xT+^`dxy(id*)|g(S^;R9Cx4-{-EamOdLlz@H z%herJAJ+Rl7{%m)?vIorDEG;4d<_KJ#f`^_$W8 zRP~~DD}&8eSqrvPp*7fn`QPwsv;Cp?o9xC;1(6-0+<)Rz?xOp?a5+8pfb0ls4tfN> z{=F`$6AUo?6gsA6OH92V51U@cGpdclF^7XIv@mwNVceUYu=Ng4UeDS%)L39VT>C?o zIe$puqRVf_eWr*v)O`G4I$(d>ZyU_Gh(O{+oil0 z68|_`H&fEO8;qC2$hW+CK*Or8$ODLPy1zVmz<#71Rt#N$46-)(ix8{Jk7gk#3Tv6nVrvdMaftfVYHljX|O!*t1L?M8uVa!siY7c;Y$ zdJy%r=>mqCBQ2mC>xK3nX5g=|stdimfJ-tBs0oWPl}p7fd|XaOE?;>npc0n-p;zG3 zkwtlyz?s_5d}db+4Tj%Jz-`PXkKmTt$OTYW_4SV5MGwE&UU^+HWOpxuc(7_ByF*JL zjN9jJ@~7?SBTIe|Y78QTv)$$cA0DGZ2zqI)d&n_7x!G}q@@k-;hnnHOyrhGWD9BTO z7y_XcPBQD5yAQ>rf9RF_<^(JBTV zF!`(KQ*!&l4#*O!7TZ&bKgc+V-y9lava;d;Y!}%(NQymqr#RU4V%#2hQR<8~R*`%v z)Q^-C;Q26d&TrD4P7(e!hc@x!vpCGTJ6_R;AGMF>wY&QQ@-4RUR9j6v-d3#N7I>DJ zjS9N6+?ARsUBThAys^0J>#?7QM7Y9cv!Hdgp6>dGV_x@b)j%3w*nL?3G_yu)!`>7W zhwumP7#W;t5t8k$Zh0=-8Bmanixlm~F^Jix!)!0rGjyz#F!_p#0FGafMP!4Uyt)M4 z^d)UpiGId1#$JSiK0yho#;mL7Z$mn-nnk~xYD3PLsS|6DJ3=`i7r3Ni- z3Lz|26Q@ep{3>h=CC{%{5{ff`gGnpCg{Et3-;*w;l|lYPv-8$zhjWT;cdVz89TnNO`uqfjRyl zf!F1t46Vw89X{OK-#qq%*0oyUUcS)&4}Xm_%)OpYF6#y|BeCIF983<^urMyrAai+Q z6AOqNd|!Si&aC-eGhX+6sPT5Wz_#1fKC2>UN*C?fDer9Om(ZYN-gtf}R^x}2JNv27 z=8}tpIVB)9LnLkg+I+_LH8>8y6V07Ln^b0xDwYU!)k{%84AKE(o=DgrNT`%tiVHfh zl$K$skTU2Tg5uK(O0b9D$Z#*Q&e69yY_^n=_XsgE=TzqXCuPARNi=OBR0bf z=w=WK6h>m@!F}LSCKY%T;lrSHcya(ZjK(lo{yDK`Iw0h0z^^nK4-Rl^8Y08N&@xX! zpdc*4Dh}=9bGsk&ZQ{#&h=C7`b`LRoXuq}RlPWyD17TpPsOD2#b_D5A30$Q zj_k0Pp0|k;vpmOAp$%<+)y9_h=m5qR+IuxDRKNR?*J*V596R#JGumck0NIKk0$RKX ziohlwQ~(yhu-4TD#P!;$VLF-0hg=%OTY9=OsBBSNmp@}G46`*+Xha=-BA)Wle-V@i z8TV@hNUYndMrulNSjuLK57*sS6{Xm8X=~lUcY!vDaB2hU+`y_*O0l-049 z6kSbj^3>bMu;^2guDF5rm-Nm*5vSz~(Crp$yT{8aG%ZUHX@9BQ@3LENAkJ=l8w)5a zPQRhbXFxi_xX=MI@=C)wu=J$ba?;^oa;>O!I1l zQY+BBY|4Y$tuD7L4A>@A7XeheA3G0ox63SZdlkE1x^ReJ)Ysil6r3yk)!W_h#`b=& zVYMCblmuJ>wCvSFJv#wyT^IwcbXf})irHB@w*biv+2@w#!TvO%Y1^H+$pv8x0AT;9 z!1*;R_#2aN(>4m+XO&iNKMvP?crgVBlGA4j9>FO^DhUx`;zDciBybA&2#UM#=WmDD z)p$%Hy#3yMFo2-i+RTr7337gXl2WTTgSsURdUU(N7T`8$NG)@v-MElsK7-)}al){T zH*LV8(AyQIjnWU{I%P!N0O|0Gu>Y^_jCGGTS`Z17$_-~4fvOpq_k83tx|G*kBuhoP z4T3BGPpgm_${{Y;yWfu-@&Q+9Q~(_GtwTGD;+=M60Mgjqk~nX-<8EXz%9JWSctUV^ zF|UkRYFf$+&e6E^zHq%1^Ap|=c7F4XR}(sx+_m|7M3J>wc;0%_>uz$4)LbSf_l~;2 z>b&-seilzC&t0gmql*b2#V3@!**N^q9u1BeR7e`HI!v%YyD_*=~H< zIs=zoZfIqdG@&@K?LF$y$rs?9!*9?YWi>PsMq4|AIMedORDtMl*H8Qs|2~i3W6}2m zn$>L^%K1II)iie)t?#d~<-LO2C$15)<@5yaal0VyaIuCAQT!NPLUrtf9Sh;!rT(jB zT8}?t(OsKfE2ovJiKP|$I#C!3?<6%M*r3bwu3)}?Q^nzDjMSdl;gA9OO&;>EPHpow zkOP0D#`|PmpY{z1@(#c`nF}u4o;_!Ol2L-obVi}PY5gu}l`$>z(rDQp^DdBhV zB&0FhQId96}a>{!Zq-$7h!t5n!adfv;@@Yl_4gODLi8(Vps)`j0BB` zIP5^R6zo%FLpY5j2!RL-;25@_2M$ewe+tg7YtS=xjG$mhqS`+gr&ql;Y=<;B1I_JdA?mdQ?r5Le46- zVJ8wl3RvsU6Z@sOyJ(S`)NBJJt}b#Y)#q-TK0Co$QFex|DMKVN>tKw4;c5C`YXEZ} z7|PoSieUO!!8ikR^thY{a@sAWV3;!Loe+K?9$uRqF>Rg5%ktraw&>Fyk4__M$v_?< zUu0_iFZI?Fq+~}4?S89(*nE5y2hvyB=itX&#s4&889R_h1Jqm_P)QR4In2^R#sU*p zuKJiu6t5WfYfAOTQD`Wqq9u?rEQ+!qu%#1?Xt}UQjKfPZ0ra>D!5*T>YBt@z5vLX@ zZQwskt=#*ebN5@NIf{69eStXI*6F>ac%9g?cpH?giV&E=JgADFiQ`xGU5#nh%s9w^ zK1Gwl-=Um3KQ=MQHQ28o>Pu}qa?3d>Q45Y-I=j(!n(SK7f{^)dgV7p;1Yc<1Q+PIe zTy?R&uc>cr!dC(R=zH30p^sO`{PjWKn^$5y|68GI0fAsTXSx(?&^31M0K%^V{~&pv z&mm67gP8g_th2g;Ss(9w4}0~>cXO+}XKzrl8h?&}aoIe^)kc!CORhHx#@Ur~ zs9AT;`kgOK0&|vc*IZ|P8zrw6rOUO<_thkIZwG^z^?Dp1{8!zSAQNE!G~HD7aq?i; z&J9+)R^(nIO6|*bNAd}MDxAoym&k+s^`0V4BH`P^^Arg*k`QVG^c|yeTgf#TH_gDC1i|6r%Jntbv zgon)=>_KRn5P^a6YCVA)m_dgWzztPTulAmxzaE(r0=hTRDq0!W`a)zcf47^NgVyyr zBVUU5Y%77)?`zvH|8gK*)8n{}4w|0~TWf8q_-lBf-#-G*)DNTUB&`I7 zJvz|LPwE=j0sY|ia)L>L+Y>7dbaZQ$;+Q}haeB!Q_O;GiBZzkcQ)}Nrg;vy;1@q)4 z0j(7h_C^sB8BLT!ovfG;^J4Ryq*RuNeqC#%#dlR!EXRHQmaW4biiyeCnRKjG}! z9z@-EL^YdO*mQJa#OMOQ`^$KgyLaT$7=eJx_~H>RsDSGInCwSGC+s$m@FMT*GOPZI zXlLUgfZ-`KYJVmlcJY`J{F*4(xFN-pJW=S!v30*^57aI)K_eTi9T}c$bSvo}QI9#= zImak#=}Vx7gF1`R9ck{^l}!s8u5`%{ZV@8zs_E8s8}0!s?;)|E%`Bk@h6DGr(y!C-dUOf^Hp@$6F~Yq`z6($kN4CQ zm4BDt?em~3Ok+|a5t3HPj?5ed7DnJC&ZW+x|4`! z9gRH*2>ZD^Yd13_E}|F@UoFC-199M`Vb|#`0};pbi;Xj3-xgB3un6!s`(O;6pA*E| znr3F#c5{9C*$^koufhb$*fdE9rXHBfCQmk#J2v~?e0#`L@_HIAd!a?jVv;lCkNIc5 zT9IkBxH9cCA|eq)v`!ikWZQ;=FJU^l{drWv$cN1+TJ`Q+IS|hhqIrTVI!768f{iq|9Qlxp3bc61SBr#)Pf2i z%(;3rY-_@Twf?YQ|4m#*SK1(E4Vx2?Q+1pBr$_h+%Wu%BC zj$9mf0=;LDL}%9ZQ)1L*${kTcHjWTL8yN(p&DbL#RuqUBl&m}slbY~L*kOr!#5KlQ z`Va(gc2?R@4SXI;$%099qtpSip zW01$GVJK&qG55$2g?nToQfl-znKB8y2qM@|t$A!loMwESIh1<<+qV>LtMQr_BN2&@ zJy9st;+|>Z7|QUMS;&btd-3S~h<&NE$u$!2)_~C^?%@y3r6&#lI~%_2>csb#kp{|6 zD!U7b=lx-0_~_{w`AdCWv$FY1!t8n_YEP&H*&6=KQ6BzNKMa}#QcpHt!CY>$G&}l* zRoZZ#E(O7)MuA-nWSu|?sn{0q$;d13$*LpA#lX&%6^V(pBhDjx94Zl)@SjJptTn&v zyE`t(yklxRvEO&(6@`&YaQFEFg>eAR3nW~~Pu0N)?|dg0K>=_p$xaf;2G zYh1adfI*~|!KKux{8i{7hc_P)5TF0Y7b*Dlyl28ey#OfYU>0hovFaLlre8+yI4 zLQ;vHbUYEl7n`2qQ_2X`-hisy4GBi26izq z$o9j3a1iFjyF@ad?_Lx@+#%tXgje|yVf2}7D@S&PE^m?pE~1CIv3x-VjYwrduDxq1p1?UKs9OpP}8^p5o8tZ zoYoNX6NU{mEd4k;z%C?GL#BxX}e=^i0&&7qQ0;#?i5hU{F@UKpMP1M_OJ206ju{&Ty z@yh6co?5Bs0KCrD#d~($Q(!JU&^(s}($8D;rlZ@Xi2yO6(dfK!qu}IIXHcPJ3D@JN zU}@;1y|_AC0_qhUtyH?-zsXFMg%H}78ZvH7$IfztAi7!48-X}YlCpj+Z7(h<^-Q>> zjU>3`*B7R!AT-4N7R9KG=khp;saRs+N2UgpA3&YmqKUcWjiLqDN;Ympu1(tH(9`zm zy+j=mk?j(PUG`6Th}=Po5>O|zrRuqhzQ;1fp8FDE0Alshz@=wTQSh8s6%V4k-iycI zZ?D7BeS8^LunAOWQzgae6NIk|T1gOWP5cpvAIOzxqfsbjN29@a_2=a%6@z!*J zNrs$Q5&;L)lOXi&`yh1d-V=aX3MPLaSS$`PpkF`jAXt)ow=5C$Or>u-KS^|#SKu2^O6GXenidmpYz3t z!ZsptvZBbUWab89zNAWP3WV+PHK;dmwrE%DLEjt z1_QjB>@=ago+n8oDSu8(Wmq!x%o2vaSx@LT4~;`FGn;sZwOa=R5mxns2GwKSxpx{< z*kPUj9UuSn-;bqmP99trG~2utaf5KNC8pv4lDGZN3C~ghWBo(fNyspO3*-{hPad2r z=n`le$}gDJhg#uw5$$bP!t$ZI*Zd;>zbj#WuY`qZ0!T9vWP-lC3#~xmgqo1ArzKLT zpHjuD_=z2QpKx{%dg&!d6x{o(rSH@&%I~y-_g`6iv@`I_=}RJghzD;!Yxp^A-+2<9 zPLx?T3yW0nZ(l(pR5RgbZWu;ViHXa#&r~X8m6rTN{87!?V;Z@u-%|&#hYAT|%y+k^ z7k=~&9)e&-ST0NCAWm4Dy5fZ}rqo#tG7j=RWf*FDjLhgbk!%Nv7so+$Ro-TPK{wQ@TC$*Kw4ut*)S4q=A`=L zxPGh2Zx{Oi37a3i4uq|F^Axo(j9oMO7;^Gk|9d#qZA5E6>TW%x$__OOd^I9SAwQ;I zADeVv3)4X2nwhB#vqHB(A%s=a&blLDtRE{!T;LSW{DA|fO9TSF6KQ21MpDLkH(^ZZ zF9K2#7Jrh+(g>jBKLGa_hA15D zgZ-Zxf>0N8hnTL1_hiir&jl8Em+r%mh$dduhPI8Gd-j-8%l8Reqs4M5m;@!Q^Qw;1 z5jjW-MJkyv+Ckir{cI zZVm9nBbV@cj{Tu!&t&G>glCr|%fjidB5GIG-pDFzcJrU?{a0^fK}E~!kqCgnD?UzC z?JQ(#)k(uEZGY}~iz0ZNN|Q;RE%~2zryO{sD}ue~3IzlwMwn0=JCdpsU#yefCdLJ{ z1T*dKpcG+C=$B`+eOrRQo+M~Dlu+FKUAYG3wI&MKrscx~+KbR6aD1G7&%UP3tDGou z3#IH;QB962saS<0`UT9)T}BYk3*^45F7Ye-0dKS za97DRkcLD{>QKy!-GF1^?i_S}5kZn92J|{G^tVk{0b#&S5H8bZv*J|TOqzDm zj7$sv?nS$uuK;SPEB7@i3C8RFwaC_yE0NMjG@fWXkmx$6w=tDjz4M!4=Ato~(;*kb z1@mAoBw|^zsL#zrSwBYV3$bip^@I{9h_#Mq8M&wbTsAjg1WSmtPGA)K?b?UYeh11K# z{%VdiHY8w2(=Z58b|E~vz2-?$4L=o-2Vs*iDaGq0C4W~-(3Z+Ff8ta2|6w{kPO);y zFiQX%_K^wN`TmlLN!0(EN~cQFVpILr4#N9uMyswGH{6dj6kR9=p?do>_yjt_uSEGg zN;j17iNxo0%2ojcH2_7|Le+qQNh07yde-;HRk$ zPm-css4E(!qIhqiMWnz&oxjSzA^Yv7L>8p=QQX|4Cv{Z*6eb-dFa1w8(VH+`kY?kc z!JX`YUEp4wkU*J};8_=ms-2%+@nX?2!Bp`HylrzVHez%i37GumG9r5Eo``19#GjK2 zc;IvB4C~RxVUpWNjLbP3YC*-fq*!QSPNpOgHTlUlWJOFrW2G)2B5_9Kk}m;H>lkMgIomUoru@9N9G321YAUJGK)zOS*JE1uq_$)+DzV|x_pdO8vzB1de zCGLwVk_P|2S_I`%@pCeHGFA6wKQ&UANGsvZVukbMW{QztM(muo3LNc!~~3Uv67^H)mOP1 zh~z@_hFi$Yy``ofYjCT}D?JPf?bs@Bkr&8KyHquyNCJAgAv%RFvsB$l^KlViMrJSP z#)RS=8Iy9an8I5h6n46A#Df#+vAW1*!Fh+N|1VTp>ZbOx|62-v*K39_X1#BnB5Cmb z%>@zww(9AP9e7t#T@PR^F42%A67SDS7;n(FNE9N{>`>nKVD*Rtr6=}BaU&FjR+pQe zNlwTdd`qPnNCG*58G--7CflL|GSp0(QtEd2Yl2Vhh?;&P=^jK6 zHm-O9dC#9^!gVC>KIufRWTHl%sO28!LQND7H(p{AH{H70L-j*2U)R(7@g0+Yv4Kcm z26D34keVTN!`UTKq3IT*qp~G3&4=W2@nL=XJCzQ`mBgIo>CuQig@-zppQT1JPON;w zQkt;E?R`|UZ4!VAlciGQIP<7f?g5$>IcUQc3j@C$Y z{lDT|$*rihs#4x=yx6fiHA%S@kZq<_vxc9lvmy2)_j{zz0merXjbNWp@@~U`q?m4z z(n%A*o6N|!dQUbg(Dtg8WfADaHp{sn0dC4P0zE{nhB8k4KtV%DVvT0c3|^V}C`>90 z(3z0OEQK%onHAQeMiRr#U+&RQt@4s^7`o_Cb=lu62V5-iqDufYlD%6NfvirGk4PU~ z?-`}6vjGB?rUW8**B~?F)Y@t6ZN2j)cc5KWC1=?ZLK@Q~H>%}6 z_6ZI3{ZJF8VQ2=n)VeB2whGy7qJA|y(i;*FP!js})mBY#&De9%OHWm*Fs8XhC>wL*#q26?69!X;sd>w3P+WY2C^ARvl;Gz)&}>JjKA+Aj8t`4< zu@!HbbU0>5q*4a+a4u*OCukAx6~DUaMV$uU^-J%S0JPqr5@vA9;z$;?Cw_IuaVLmm z=S&GUQT%_5y@Pw5?bj`uG-=X?jkRJow$<3SZLOp+8aH;*xUp^9wzXp0 z+UtFP-*?V;UHhDC??2&wp2;!C98;TvNE}5fo+DaellH^j`_Rw6cL>8x0 z3S;JJ7+Z#D;^NB}%QQit$|dyvQ5&Jrv3GyPM$@gMv;(qQH|bq(196OkHBZe-T-CMD z;O@5gN)8eyN!mw?Q5Sa*OgoW^W8lyticDwb`{(^;B(nQkxd-tX@uCQl!~M4zW?ho_ zf%HW+Wc$zABPgwfDJaG9;eGkO%ublkldm`hHlvW33gMjF`2~vL5G<@C46FB<>lU0L zF|P}U)v$Mog3VdZhGM`EXWeOvkmM=JPh75ST)v`yyG&w60tx_DV)^nJX3=r}N+yj9 zME)b+1>TBR6N*xeA)V0A+JFWol*TC=A3aH?8M$bkY2aAC%13m@tSIPEc3@fs)UI++0#lS<|+*Q{NMoJP;&o?#yHi91y^WJsg}$VK5SOiw;rsyJeS zxjK0RJfBT8=>PxR3z+(T!UCA4o>bkjxc3mJNy)2DIkp#FEciPAnZRBoixeis;`%S0 z=%fo2aEVv}HOQahCcy`8_y-**FuA3nHU^w#C6M($bFu#COF-{ZIej3I9YC6lXo&bA zqJ6(0_!%1O`3~^EyXqE_s_00$^OH2<)snSDs8uP1>c~|*8_JwXE*64mw_$&sb;D!M z>-s*Fea&?8?Jc)(CpR|jJ8vE%xg#8MNf@+l)?Z1p>NJ&J76NineY3npKY(y(mHI#aZN|?q(W&Y;}bJ&@@t(z3u{!r5@sTqzFnOlE|;mt z?>AlVu}j*6MRC_@IjH>pKenv(9<*P0Bw>uW1BxcP>4QJ97GMZz|^Lb(HPW{JY^kRCcYcQ-U1(AAD*37oVR&8@;E&tNt z;}h%?f;v`zgfuMMlINsxG=HP!X!9A~X@S~iObxtc91sxoqnZQt!; z8+;b37v`i=H_TD(W%tx}nh`27OTqr!BKBDRI&9H@qsTv7ovn1U$LHVwM@2xhAsr4G z?8xtK%&L1!4N2TNv=NFg! z1nIN{PR%zqTd{P;bc&bMNSRS$*GA_2;cxJZ)TZ#u&cL7Km4ul~&0S)c&Wf&<+YLW0 zP#S-~ijHI_=KgxOVX#`ZG98Q47w?$(rq8HrIaqRelDDIOW7}x?r4NQsAjmGCSs3+w z#3Pz&WSZqJXU z!aOuhNK3r)c?x&W)m)AM;%SNI=+r28UTQ7q|Kx+if9h#UhNQ=x&Y-hS(`PP}_h{QF zbv@$kw7%IgNO0ApTE`T9xkl-*rTTiU0sI04g+%s`ceS|jmnH!YQ)Dce|6Grfu9lFC zcRb7eYf)+S{% zO^A+lx<2%}u5DEfO@lq$)9$O$v)OcxO`uC!u|8sx>F-m{Gi<&{U zv!|=;zh?d$(X6Fwt%kG7Scc0jb*=X6t%gxLCE0j)6zec@FBc1uX}K06B1s}u4szjZ z!+kt--;}{VO2|elABsS9BwbD`O z@|C^U^o0APYC4T*1YVlq8Xyo9DKpWG(JzV8_HXzZqL}CSpiBsvq#s*kpM=|-8k_$n zc2hTpDYPit8i;W5CmqrJcxS3NX0B;yP!~cXPm#2fJyBw*1cw5jcq_MoTniep?MnFz zFtRo$obOUgm%lhKpeh%C-CPc%R6I_%MBgXQl2FI$&25xfr4Hu|FM9H~ zpNk&MpUv3?|{tVc^=}Yh} z;BTtJx$YMT`xaa~u=Zl7v5T^ExuLi)kgO7)G2`2OOyPtg%GwrsTnlWja0qn%zPO7;^% zyf9u2lp|)41;*}g@}qy;zON@9O^aq3Ttax=>59CQ>{0FMgRn+ozEmA%9rLA{M5eb0 z!NeqoGzp46#z)lT%|{xZlV@C)8*!YjL2DmlwHE!knTtB5_IA(r1K4+7SiK&mRSXUZ zVyto?g(%9&jP1m}nO|OfoSulq?8y7<&o8xF<2Tr2qq>@7rID;6Tt2=wI9zGf{55ZMrSV9+|Rbn~LvL%705`xypx-BD4 z+@%hgYS>j_js>Unx_wRO%eOQ5 z2x~b z@7q~>K!{`Wp}I^?)RV|DcM9?1rYVA3t`>Ly>MjV@ZTRHeL;y~7RW&7 zRKzk~IOhzzw!a$1b!~ED)Je^!H8UC=r)^9u6Ya*VA$7@rnWn`KdFA<)EZppU*^L7b z+RN}txM(JFU71ut3xphATcky{>xNrxI@h!QM>Cw5(wZu9Ud_{=EO!%*h#OpKjQP!^ zfq)eEyiuo22KnqGruk4;ug+_N__wAqSqYOWL18;>*G&b;uLLS#%6}cLf*HO8`CEAN z3EOE^(#SH|Nu!v2rBjlG?MUrcUzJQ4_maigl|LA0D+vw2{T8OO4xZ*rkL}46i5+O> z$2;qC-F4h6tZlACdz!z+^_Cnfe&MGO6$N0)X(NCD`gLoeA+uI?a@#C8=OQfZD$gsj zJ;X{JcKT51FrbJyh6i_CS;z3qaGKyhdC4>D%DsB~-!=o@)8fPOk3>VwUnxEA7?QuO z4|W5Wf^13hL|u10i@39V9+zb#ng2xOnWaRa)fBN-y@3zr-MZjl$Z?jkjt@Uq@B+e$ zJn`E>d51zsQpz`R^$!)U{KLcB0OxNRA2sk|=vV<^`yPfaim|Z87?~O8K|6KYv)A&; zL}{sLbT{Jw24i=VLsK-1e@gPC=q6FHnZ9G4Jnc=JyFGaBw zklR{-T`Q9MO_RSj=vTB3w?Fm`Lb(K$-#Iy{+LWCj(s>9eMbp`6LUFf+N9K(D56pGh z66rLQ!9Sh(;Djdb@dz%Uo9ki(WZAjKjuwg<4cfI)VL86%^Q(-!9*U>DB}uU*JZ)d< zyU4cb6R4qd(vDq$F7=Tj+(KXzpkav#1W|vHxx_Q@1ks#0x!$*Z#?s|ElFO}CYcJkT zduN#FNiTFUkv|$;NowyR8uZJJH?j;3Jzr^+q*>ARWG9V86$}=jw^=pNo2dGD%qwsU z4$}g+N=L@SW2ObTnO9WQ&q`AI#g9I-W#5pZlYaaXHpC3eE%hzQESO!3xLOFRHfa6k z-d9|dF%+~(k(48TXUtVaC5}=eJ&%65)mk()mOfitdx%Sj9lyBYbEa1P1pc%Sb44I} zH(El+n4M$&7w&*R=P3s)2W2zYDCT&4I*qe)a(r3e)H7-mjGB8;VI3 zckhb|J)OZGArC*MLeOfxVLqo~*YCmGqMwCZYCDdlhJf3@-MH1ERrXGF9GR!RSX+$U zA@$8rY51pE6ZoEyd;ab*m8uOWt{Eh1TuRhqcDrRoBahOtTlKuz5&kY>@Hh;j#MB2N zEI{8WMg)-m{te*@^bm3YseuYfs=Dcshs_DX2pT}*%sAy%_MdBBoEh`S?2=ghY~(zv zmDdo0o`=7z{9M!UplcAbvyDy@b>dncZu;$agKP4#f50q3Mm~&m>!LxoBhUyEHd;35 z3N(y>Q4a?^oE?ly8I}1@ZHBh9$uXB~O^>6wN5LF!o&~;Sa}uucM3$UA6xjNrV_WpV z&uMc6nv>tQnGgG!Zyugkz`Uu;yCS&Z9WEW<&P3gga1@6zp3S+KL;X}ijUQ~0TE=36 z+kQh3Q5C>LI6qo-98c=Y{U7jkm{Q%HR>_imQf)_qhNaZafqBNLwOn?V59NsVeGLuN zm-Ee(gl&R`h5`yHHWlX8c{KqOIi|%5_F`JK|Bd3(C=twuAgwxcdiS?W z)hs|&99`9#|2PYE?C^)!gvaEHP|$4lYymPa^z>+8;a~(qv=Cgy&F(H$cW_{ug`#>l z8KVP0*1O}|$s0cEp)$d7@M7^@+Wdl44DW;1AHAt)cj{%;=MvnGecpOfPbvM5C4Mdf zE(e&(PGcIvS!wNi!nDBbX>b{m^*_UW>)r4) z#}cL8p1XJ&XtYl-;WW-v=4N=?YCryH_oM?}PG#hyXWuGqrymN;!&u$_w1A=N^Rtg< zn{3__^T3BwN^T)s=UKNy)yA@mvC1kAQ73lLpHw%P7r&n$Tn2{c@!n+%pvj52|2Vfd zK6vq=$2i4aa|%G&x-+%?f5f_te~Iyb+(iA2#|?>6_?dVquwqq;LmC_HYZI27Zl}XKw1?RvlM8Rc&xlnEWe1#)%Eh#-;1ah zi_BwpE2U{|q}a6?>_7Wo|AE{?nZnmkVRo_gc+&N; zq$0w80Ww?~0u;H~P%;PiBd{X8ffrmd#D_fbT z>l!BWIs^nlmYg2NR_WZau?-pmR9ffY=AlK~#9eB~VU)s2*1?%=)#gaGmC&t&l_<#z zI)DJ#RkW4MA(Z2?IqCtg&NPhNKEmVf)Wcnjr?}4nE{I!}!aZn!0tyvPBLFZ<={H?I zL}{XyITfN0Lj>FWzL}FOqFoEVd7)NN*AgCdLa~i`2aY4Vr57aEX(pw+tC&o~$hvc_ z!O5a7-Ib$vNrY9ev$on&m@=GSS?Oxy7$mI(b5hJFRAx-C>x)@yNeDr91ePg)>F zDg2e=!&)d-iMSp<#K8djJQ1{_Cot0{;`>jwqn!$*0=$X0u3XRXZ0E>YME9OMz%%V!6ahSJ@Pwheyk#72XvjA1L1_% zAp_&pRc8oY%1N_?yj-+yo@~73O!Hht83_Y9EhlqL7_7MItk|tDpqjodcqo)|k%je7 z;tRk#i(h5b%ruVqkNEa=QAL{Dqoc?#)5asiCF*1dq3_$? zfy3`NJv*X7tt%UolOCd0ms)(}FH#tz^qOKgyN9fv)xu$#$hyaQNfA=p+*-?EVw7RA z#Q7D6q!628XuJJ_M6V{f|JO&8kZf!W>IUB#$2+6ce(4Qe-kGjc9;J>{iv(X&80LMsZBPFF;K1~99Q{t>K}`nSY2YcS1+$yPnUa42mJ58J)Ud+ zc`O{I)#z8h;>It$8022BE(FzEbOk<2wFL7W!?JtzUn4jV{sz-eK#W$JL2eY8R2;PN zaq%RRv=gTcjO8;Y>1WWL-?ZtWwT`iMqodu4y;6YMYb0%U!&Er>rLZ%<>>rbpbx@G$ z9sUBZ9}vLJAeARq%w7lbzbe6SdB`TB2)`#W=g;fX@^WR5mnp~V=nkKRRDv6?`0+Tc z8)`6d0q0Kc;D&1vJ~{33yQAp|%Z2(vZm^O*SjEO@t=P$-qDc-d;5b0SN|4sV&|?F^ z!Q#7t!+4CS+JEOdY%qlw#0UxSg!XDT*CIX zGs)F#_!HOtxkfSsN1zPP!hjp>)F)UD=PUOmV}z|3_s;vIGg>bQ_B!(yT*tP%eDy73 zWWsJjUn>DQS^ECH`@sQeL@*2DR9uGBq;#7(ca0NRHoy` zeB?U%d5WfNpvajDl0acwN<4)4xqCVa39PbQ=*KRw1_MQNY;l!a+ZQG3GN<_%$2q{$ z@zsM?{vI^r7zxUUCsZ`fiL`Jm*q>6cHEtfo%;x&h3NCZN1JSEL*Kw$cTD8w~Nt}WX zqv8ZZ&>SWuPdv3YAH!LZL4>{^7ud5lK8v2-qv1_sc$?QyjF9M*IGqE-xA{zhSE&V` z&rLSLtQHc|`Y+pajjIOTLboAH{Zxs$Ph#K3T$SOViui}~;`t5#P8HRKi|OrM`dxR4 z_$m=WexmVXbwuq~B^?&JL1Sc(I{(|mm-A%mn*a{eECP#nuf7r^6&&0PZ;Ul6{k+6;>mtXy?up(Wt} z3F15YgQUEUq|iCyQW#{XQS?9cCKoQD(rGN#b!D8kJ}-%qA_iCm)!MfP44&aBy5;X#egV&1 zXs<)^|NY|}^6yH$>i-}?8BO5EkBCwuCvL}K6%*{@n!ppgm%*neu6su-KUKrkKXNdb zGwEScHpwCW$aCm1jW(jAj0dEwgV-YVj+o~AY*z7k^pTpimbzu~skJi)IByzt?H{>x z2h4tem*@g6+(=sX8W;J{{2c=cUsX`9ehx`P$b2L`w-oxMf+Ck-RMzuGT7=@pN2s@z zv-1tB1JPb*$Bmo?UUwx_$=7gwX)u{4`}UJ=dx>`th5f&?&anEl8t>|&x;ll2W%5yU zsr*=RibdH?p`eB2gm0+t6qnJX=#vsONh_wz5J*S222BND1fuf?6 zoJmv8Sl)k)Aje&xRW6;7`!vwS)A}#Igd?~xc9DQKQHVm-lyDQ{zXeLPwpCu;*y)q# zwx5xd!ql8koaz6dpuP$9TW1^Pt@*wG<%~T<56E^f;BAmcH$Mf54ERe`(?&Y6V{QyF z9J~2wS{+m#MM8u0C1tjZBkKLRl8B)lTL`Ixm;3^AT zzqA$M{&EypgB>J;+;w{-sX_Y6Z`)?%L{uiK*1}K!@!$XP7oZkimUO6_j=|sY`TXRL zr|1i19xkd6heef+sQfn4_ZCMX@leooIzDsQYeVwcMAZgonL51gRK}uBA7*u5&@qK5 z1U+Jmv0Dbgsg!bnvUwqyi-&=lzM_7Dl2j7@p&qOrJ(+rCJU*S$i)1Mr zl!A~pio&$z<0wCGRnBtkFE~TR?r1K@Awf}TnD5wx>KbZpuhcVspG9q;$a#cqteJfA z&2c^DdZsOcu{B-O4z!QtkwA;R90+|4;b(G8(}3*t{VC}RkCyvIpG~)m)4}(Nn@M7n z#*MAj(bV4o=!I|P7PAe>k=kZ%K7wxCX-yO-i04CdCST)38Q5ct*VE|A>=O=3yyZUj zrhWW}H&9mb$)#q@a${HLr$=y#_JatK$fAF>KynqxS(UM-KSHi&4~Lk6U9U4iFiLOs z)`#yyH3n+A<_~CPC=Sz3I|LIv55~D({8Z@Sj{L`zMd$c9gB{mHmz0qI3fbW7p7ljn zs(znJDwP&KwklM4Kam0`5lbF__3MabKSPBi6f{`R&`w~@{=#sSOg(fp^gcT^J!HTJ z&E*{RgOJ|=1{rVWe0}d}e5peSnS>X(WfPW8oj^q}p0W`Bs%+m-y-~F@o)Nn7A)VE? z>U(zcIE9rZ8|is4kC*F`eNj6T}}PqCzsfmG8~eLm*V1$oJR(dm|b7ARVD#-VGH&Vw*X< zFV=$m_Gb!JTG?<_K zt2=D($RPLPI7O50*j<|h>1N`jqQJ(uXL~=l*1{q*Z7U`RUD`O)b%E&+o<{n|Z9VKw z3U)P=uX{LaO5bTPCslee`HU=b8~e*rqaP(l(Vj0w04Z4{tD--7Q{|jLEC)<)3sjZ2=2z0Zu8)q8*<%gSA zida+UMWObia@gp(NdDl&d;Y1o3N@1-Iig~A7kravd2W)uuAwz0 zw1>@V>3BO9{>$aJCeP@N>z&vD4}(6L7IT&+R!#!8D))8U)v*OUH2BBEfRLTL#BNW! zYVsLB+AR)#-XK1ng{=x}cB>tjr{K3O)D_*m<7A!4Qu}5&cS{#5`f2la>DrD+@j?p* zQyxtU7PPP4=(BW9e_ADUIpNIyYO3rnVDylXi1e>v@I9S>9qtbwm(H0e>WGo4@l#f( ziDVZYH~7?<<&-%@%$mnqDPH@iJE|#^}D_=sRf0 zs(npc-qtNXSnfL64O9kdNPrc2Wx>OZ-1X}QpK)QJ7aQT3NC@Z}g3G1|7I<=fpgocl z(w?DilA_FMb6lVzz;Uac~dGKM^toBJ*&%FimE4^q8 zsWW4Vk{IFXTrD_wjJzpnIFLD8qCfT3$sxfwO_4kQA)t0NpGY_fMrAfV_eYo=JnX2X z3P3h-bP$G{&AV#|BOhXcDTZ7NGd75H=P%w-FIIIt(AJ|*kK%vZyVwFkae<35#XrAa zCKWP*VbIU3a{YH{nHd%3D&Bm&m|R``A)kk&6{;mB(bp21uX@l# zA&7}j*U?yPioR8jaS}X*f?TpK9xP7wlo+j*Fa_NsBgi4&C~)d_#5s%}2YdkUxh#jY zP5Y45@LyYZEJ5=;6@WnO_7lCGw*Y}R0$RYW>@_+cOVfiG)FjRrHdxLmpHw@KoPyc0 zOJsvRX%OG@1lhtbK^Gxm8j?KIc)C+M5KC1vnRJNBL75P|lv%Lm!{M)U9Fms8+&>wo zh{=P`x-Q3D?7WhYROqIS_5AML=Y3%h5%WzEIeDO~ZyhHTgUpg4vmmqzVE+!NGUEX% zZdQ>*#6`R02v@@aHAZxCKC`clM?o=bzjV5s0Jj9et;q z>ZHraiey*FP51sq{jw=h*;{UJIH)bOkbglcS4aRQ=MCU|Lmske)vG&@g5UzoDz%`W z$$*QuG%$VtF?=8{FW%Ua52*2$AT2@*FIN#^4R4L)&;L=>U4r~mvIhHVEhiaS*D3x9 zr{Ez@I}Xe>QW>K>8z9ov&f)>$uHK)D;HIdIAXc_u7^~Y1EPmXF_u%dVA-T*jQ#l>& zkig?UN{zE6&cJr{!^V(3?J=Os8uDP3nWuV3+nxthSM|qIo<6j63@L4iTqATcYy4!! zqHT}v;*tJb&>hS}JEVO_Y#9T*(R4!v9_t3bvyqfCv@Fz%@lHPsm)JtoR>6y1&rr*D z&v#=NAU(12>kO|R^t3H4=Ni{Sp~c{VNDi_&^fphadAH$$38&1&$jNu))gCw$YrX1zK_ zR7Vm^f1b)RJb1a47UyhYyg3Z8+6T?mIZ3TFlo4y>WX}v)kVM$ydG^A_L4;6Wpj~{} z8oxhzq@|x_Is4|%rOYT@vGqX5fa zZoCF7hz>r~p;1(!L}`39j+vNEHn7(Xy7{NzW>Ij~KSq)}Q~>W=9ROf>V~L@w6t^>i z__7QXIH5UhI@k9Dmx(qDu0+&O(T(qRwD9Gvqn=65clG;7F=_9mpQ}J9nxhckd~}}B z{xZCNh2rK%S)Z%dWmvfZi#M5`0~jd{)>0Rt3x>>^WGsXtm3E(NE49p=Dv-2n;W!|j z6<~a-n$c~4lhcT3I3>htccPOm>idwGB=+p(eYzT@=SmGSvW zjN;1u{OtQ=<`v)vzN|fH`U%L}_JPpxktq2q;36;Q$gbx@Y|9`43g6Ybj91U|Meb~& zCR)O>o#Ym2cPPiT^PGF9eaZuBCVeW*S4CKR5gAlreYb$;Bu&Tre9Bc6iE|%-0RyyY zHN&gu^kf*BPp|Az(r!qzmB~!`WKs?H3ozclJZ7UEX(`}2$Pl9L3W;2SCMxviM6ymw z6r)ZpBC3d|@1xwr*i!q&bRt9YeERg7Y+fs%2+i3=<^@9BD}(CAZmZ?=?~riI(rolq z@)sk=!(v}`#KpH`IUBdTBBtnbveP7RsbSxg3h)4~JWo6fbVCb_)@3MjBd}8c;GQC} zUDZg;u{HG6TqV#wjuMv^j;dN&dewWc7rn7r;^#kgJU@mb!k37)y4BG^_)x-tY7U-+$gTxWB#jIC7%|JW86W!m@fl^I{g%p0Gqd zDq$c2bzW-ljJ#*o%ALJ+-kBQPaW%E&zzo;k%~nP(_`TKM<1)s3!cZ4Irn8>wT>H5b zX{6s|BK33Itg4MBlpC#1U;@a~Tpq)18&}g+x9`pOT;J$UpDj&DV4w_|=oBksq$Dc5 zGHT&}HTn@bO66PoFLtQnpVlNe`4<7d3lfyg3;tqATiRPup$Qz-ErlFG+_D1BZ#6@) zU|pZ0@+vx^EaA`O0{n1gtK+FQ^K#D?rfnEMJX>y-TEJUf&HgC;721XXwm4HUdQW=H%o1%e zjt3=32a_@6eMx;8eo*ca$v7NXfqcl8lS=i;MCbhz*?denIc#BD79LlZA*e7ooRAHv zpWJddR>)+LN06g~mJf9k_x>tNHn~+?#O_UYD&@^lItpI04XM(H@C#21IdD(D=IbHA z;nY|9HT&qH%3eOrr^u|}#5eRZqKV?E`Lj4}hiI0CT*2);`m%E}*R%LA@nLDAq7}+y zj_^%vs6FM$-zcCZw9zu$Q9INO8F?qo$n0BH(W&SU?bg6ap{MY`+%xF`O4Vk^>n=s) zbcy%`6W>j*VY~}WX*GhU!^Ne=og}?r)^&oDPt>-RB6>*DNV9U^)19T&!8J*>L&xpV zI}5^?!~&&$PEM{ka^{&-xr^~ISTGR3&-XEVwf@29*wg+R5HYYMl?0%0UvfOC$GZ~$ zxaLPdKI9N_+X_{7`zXx3r{6vB4$=f7*kgCoRW^O@J-IXR+@Rp`^a2cYSX&NHYYjDQ z43W(D`&;@9XRr*~?M<}?TFxEfr-&qxZ6r2PjMS%V872WWFS`{j=KY1GpGWxiu3>q& z+~#>OR~M`#_F4NOqVjVQ@wOP_+1sq3J$-&s!niD6->xHkt^F4(TqN29^HF>UIJJX} zr<#6Pr!)HU?XM1|7P0bLwH0!cBi=|Yv$GSOyBc3@%}QDPV;33`lynZ1FBSX^>1I2~ zmHmmnb@++0rhR2hbG>mBuPL4E3*4eL$qhQ{r+vX4rtcnNWoG}zZid!-Wd@6PF&+70roNsJn0Wr zY;@LBZixx*u6)31l(unNytGru=vcwo&myZ1%u)QyfxkXuo!Kcsk)8FQ8l})}xsm>o zSnOq@(0uwg3le{=q<8wU)xk2}yE@%OpT#_oZ7}HUmn2*`8(YdN?lEDXan>NOrcND9E#dz0gVq(kHTD7~y&uNBr=8Xgg zk90hqJd+-Ie7Fr&i1uV2e{C0AqCIvy4Xgi~E;`n7HCU+aEOQ;V0X$O8lxVbizw7)+ z%EnWWMPWshVT)4`RQF*)&c~uUYSeGVXLvbJHVX8^)0HFroZ)qjF30bwG(k(96htoW zfyMj-3L+Sg4d)}$&?TT2uL1NGKi6U9P?C?3Xc9=6|7x6EOiaKE|aGoF1Zu@2k*e`~ro$CJf3B zE*{yLsq9T07j6uQHS-Y&z~7!Yzh8jLD=S;^Mxk)B0DOL5C3BYJdQLW3&bN5>MOSX} z{X=9BA;>i1_$E-2oh{0;CjH+$<)#kKQuM-E*h>VHO9`$Fzjo0RDWpNw=tstNHUjE zA0z<$Olqb8l;uDW2@x!;Bmd=-@W6|}T|0-E8a7h{Yy1Ulr^WtD$3+M6gsAt%znN)X z;s=_)88|UP@)WC#HtoExI*!uVPh8md3If*Lj!#~CcvZHG#0nlw(HAuSgtm8`?CTVn z)0IxZPttM}YjGk1wgm_Mp`*rF6inE8arvo0`0z6`sodNdVqYTMwj>6%J9_zlRD1&b z?(}kyLJ;BS+q`P@5^1{u5(384C&Y}Oo;o3in6CCxGQEoT>u$25w~zIgV9cx13JU(k zpIbcuA4{9K7xsvau94S_X9+!__OPX>ji(ysOHoO)J>7*750A{LK~QF}`FHV_`ru=p ztB`|6yq11E%dR`DuQiZ5H|ji04o-v~LSC9-aCW=NG-2))8;k>A1}bXF`2;ax(T8f< zdiM)=r2~9(qUFfZq@P51h*@Mgmxt4jN}*+u^;-Gh{syyZEzfZlcq#45Ct&b_m;M_D z@yV)5;p%CJ ziFM%jfc@8g^lV~se}5p#RXj7>9ZOKxII=q}^L#Op^=YbfJ5MwI<%ge-Dhbhu{~lEB zohchu*w5|sBA1o*n^*>X!j5GN1 zd{M7-*HYZ~t=}AHGwFU~Rj&chHLToN9doGKXVhcu;r^xSC``60zl*x+i1YGLi1(?! z5Ts-^;8qe#?ISt;C+*XjbBt&m0fY?=;?N=a5fABN@=+2g{C2m{H#<7!pFYq1?crge z{(isXUlV_#V&u|mSo~C=!>E)yJ{T2>>h(ROp6N0yQk1|mx?0%a3yc-$gbVTgU@ah| zKKA+^GeuFi3J7!J`{**S^0ZU4_D0cg1o(c~hqy=hCfM&h2WaW>Y&HOFHSKr4cQDzX%dl2W5q;j1XK;U(s5`H>H-Lz6A00RDe4_aZAD6fvAHajU{@8m` z^-f3aEfB84VtOxw|K=-~{r&@9bWh1RQ%^%GumsCVj>%#Fhc@tV9m?kkufvOH=~uvJN?im{2^3j82ucr{hMsenLWpKj{G~X1ISnkX5{On&8l{+3U5@1YsHxAuy{>q!(5;;>*Bp%L|sAKQc{{7FcfE@M0LFZ2Z zveyeVGa+i$Cz_}%pHbPBmkW<|0;KiHJ z0=zyvmQ&c#-T0jqo{HZ3Mtw9arCDO~!0X$0_@rA6JJ zBjY3BL5KJ0dDe!JTud%<0t~=#*zq1sne(m@?UTfjTu<4QkqMJ?q0&N9^;%fKOV6d= zZE@As)~JdMPl?Xc%||7t&EcH>hr62|I_Kq#nGm!G?vhh3r;PLYj&C$qWdDd1B-e9A znc)G$!$7QsU}Uc>;A7GpEYmh&Vz9asHBR@15FnI_4MlCUQA{H68ErdU9EhKu02#F< zrXbgWm|{$@gjS1(HdM`;LAZsj)L86^@(WCc2r`!92M%x@HFrYqX@do5SoS%)%Fhci(dLcn_OHpe~UO8R1K1N8i>Gaw9em+@Qj!P$c@A`6Pw zwl*c%U@rBpc|X`VoIZZ8*xI=JT=<;*e9Vh!0*jax9>Ba zbl2|Jqm3~(>HT8oeOHdHDUibuGJ|!I(P3IT&R1jZ$a*Wr-wo^2jOI=79DPG_D<|*>0EfO zw`HXnIC8s;>Gn_JSR!l`@j!*Yc)4G$dTpr#uvFzNKrnTqs)4zRaTnMd&}TC!x|w3& z%on_%FFC5}Arww&khB_{AX3PmoMB>+MqvqwV{@F)S!PZvpIwMf^Q~C-XgE5*U~fWt zx=}URT`8%Kk$iKG(b!GuLprdqul%}McEY@hOT7#b2B@>!ew@}IpK19y&eyRD_b|?+ zLBm8uS~2;U>R>lMeJt~LT@(GJA$iAL*%aQ?g0^SZ0^KVGj%kdN&3l-t-gzg;UV!u! z_?ylIKBBlqugd#Eu5HiU7s9x;5xe!TS_`<^<`WnmS^@6sRFK$zl#u!e+-4J#@9}fi zq$dEuP;g4IULDAr27Rh2jv|HOZo@(aGoMGpy&$ zKV48fqNJ*JIQ>Am&!`jzpn2UY=N4Qt^(+ z2}o~JB3(s|ZvK4h-C^J%S4%pg`hb(4Q7-n>ZR>$V!iyn6Qh*L2#Vr95s&*2;v*hMuO4IpUR+-I%tx=exE=ff#e*@DOuvLD zblUTd41pb*h69%g@5x^l1Fy~uX`r66Iu~rNfJ11$NDk0&bKl-loVxAgB>5z17c>(_ z$q{ZFz$^n%3kV)E3bvy^lOmuAz2PYBtWIV~3&n_O{**bRSl>d;+jVVcU6v$-_ z7JeL(ayEZh(1s!AndV59`!Bv9;yJFmu15m(F*JcC4@KubQu+%?EU-gYPYB|J-rJ^6)WYHOZk0FHVt`iheP_=haGX^yxAFssu_KHz5qu; zYFR^%zX_TC8Aq4C0v5I2;EbLIkajEH3!y+p{B{L(UmnsRhjdAN0ytv-Qi|)2P5sC` z^CLx~CT+HkCjbmDFt79RVi|7i-2N*39(q03wr->1)l zFICx4NNeS*+P8uZXO{1wSM<$JAr|!*Pd(>%_u&qMh<`SP!op)s4fBX}7W+H<$k9hI z=F>t%auoZwtr`nPUiSE)u-gopq(#Np>JNLALes|6sU~_3UI(7rbNp%lnP#rXI}dyByDqs3i=4)AMiL4L*l1=b-}0JQm2Ok_Gqrw=WXYD?*0O(wdQz!Z1h6$# z|5NKFwWr2Ju{e2D)hf4Z-&65-YOPC6%Ej(oE(;WB3tDRUYr^Domf}{i%NtLlgtx8W4h-+Rs>a zE1tzQ8s!LScKBP{vF)JKn@bIAv{`3wM7yHzr>h>Ni}bMgzF+0K&30%dZzzlS*#2ASn|MD?f{Yn24cug&S>$7)Vs4nd zBnluMOFYa!0G(Ef5q#cC?^tUJo=4WY`1h%EJBJz|)5eke9?Se{tujl{eEN>y^!$bH z+4bS4;kb}fAZ9MDUO_&UrSqq}hG#H*v zNvjTPTuTCY;f&1tw&ij*3Ed8YI=C~vC##{GvXg%h#<{rWY;+wxwQxw_Jh^8dq}YY` z-HEZfBi{F~pt951D?fJMKq*e=QQ0ZuJLjeSV{^XzgOuN_0=SpOn+cotUi>m#LH&kc zxf6C~&C!e`c@UYeQ7VSnAVutNZ||A|p|c*DPlqd7o|3b@*CR9V(oxwN2y1R!o(YeO zhH)Pj<4dDSM#I~|JW7f?j#d*)CZfie=IJJUrKIP{xoVD6`Zq4xv7u0a@(Fim?4@m6 zO6`c8*Y=h;fq`KWv)8+a;9f`OhTyqd@>HC~+(H630P<_Jd?>?g-?cvG)w-(QORjy7 z?PmVtv&1Y`^?6GEOAa`TYH0vZ1w1yI_Gn;Hn=oM57&&7;ML9@^egjO`hc`=`#T_j6 z`U~YeQ}N$E1#r6SZALd?47TdIX0VqhRihugWieiS!Pau@o4MVHGd8e*c<8tzSaZ8T zZ0?R^4v9IIe@nG3d!ee{f1Wh5e~tSi6p8-qnKDbpX{38yRPVL zP`I|3LvVLm{UVN348G%t8diTXto^x~W*}(}#5Uml#O+|a^26xUhjh0Y?Kb7;B*oHj zVpBmSZB%C1cSYMW|I&{gB!tt7?Bt*I&P{q#sR6s-#a#>-vAKpb^aZT+$E1>sv@4J>S3{OXY11X=t#Of~xxn9;9T~NwewD|fnafy{FEGSWerVc@)J>4O+ znR#35IcEyDTypV&+O}oBCsa}ew&Aw5Dxi#)EM?AzMP<>ro&vLG>3IiVJ8EpYBJ_rAcuD5K6t6jFWk>Jn-g40Msa0~A45;PDj5Zs}0x8T;eI|K{v z?(XjH?(V1athLWs``!Ef2lGSCaaWD1x{AlgfhS86$(;KI3$%~o?w0Tw{a@K0JU*gS za87&;M`ff}^z||02aiW5D9`!9-@ziQ*FU$hz9sa{y$08b6%XE)NJP>s?df2s%l#g( zKeF~YmRu0qL23;hl!#pHt8GKu-qqo_T(=!BTP_RAp1z^wPdM!JJ$(|J-Qy?TDKa-d zA(uj*>eoYsba<}Y){S3Aj!$-Juqaw%x4QE;-7O8K{ASu*5Ko^mC->z^h&nQOF%e1& z$~b*Rmz!%QZaU{9cqU;JeQBjB@Yxx`KBQ;ohO2IRwx4(_yI+d+P;m;;lSs>BNTt&(M~jwna1pJg z{On7*C&;U~tY4tA_#)FFgB;#N!08fhI)AJqK(YzEp|2xzZnK0Xql`*w^}ww#%qYcK zwk;(A517TFmVPxXRUUgRg_yD2Bb}^qhpzQgw zGR}K6lLSpwfX&2F@jO`5=9>%vo~ETx;_Zd%cds*w{M#_fYIGb&nXf~dq3BUtCHmZ3 zhgIrhiXG=o8>NC)XZ5(=v>xNzi7&LC#aNs#{IkirGdMPVn+fH8Hs8qC<}-TY<-kv| z+8Mh|VoO<&XSBX7{6wHG_{Hd$PA@GDH;U&y-_6pNnzQWydzN_Xak7WIJ2J`%c*9Bw zT{dphlXkm<+@vpm$*)+8GLWsJc;)eRP{QG+ybWt0>lWsJ?`q^jtVYvllcZUnuNJN}fqb3vsc zyka-tlBkj%uJ`(|SvKEkMvywI!1lB-CtHv$2qC|L{<-!e$QExLqE4I4byQXtvj zbR-liX!s;CVp{6D7snEgxWek(hstm6&aHq`wA~0@#X6I>GQ4mBeD|#BkDGPflZn%i zlOwfxdzAPM`?lBsqke!88HH(cOS`Cs03TB<^(+I^#4xwQQo^&1kXkY@lujl1`Vu(C zQGcE4YevrnA@1KR#liOFz4u0xEWg?F!+eX`+v95;*jGrfe&;YTVvB86W3%*9r`t7~ z&HwJEyUzP%G$ErKqSIJ5_Lkc#bd_3$7t2WIAYbJM{z9}p*WVc}uWa)iOOAY23(?PN z;y*cBbsB%iN6tlbjfidM664}7t9c?f`rwa*aOaq2a?1w(q7vt>8yBvcY69eLeU2}F zUPQ9T;YPejuI`Giw+0j9jYnDMWB>nSO9l(;XW(_BC!JJgDkByhb{hh5&Y$Ip``iH_ z5y}ke&!hmWRE+}jO=ZhLim4o9Y4#;(5*F-uQ)kG#O<+2w-pET?0cO28*$TO6&R9przoxE>^ z)C*62S$5cHDfd^D+K64=zz@XY@XSI{xad^r^KY`YOb|$rBSzEhR7HBr2?`*}k z66%zZc}f_6%_d|swS(RVdRdOCG3S_~B;#`+J71ziY$j@Lrjv5*}{w=+!SZzG6O7yoaN+K z;gRM7Rc$i`^E_^bTCJTwko>O5Yk#H%mc#w%`O28$A`aav&WAAn!)5Pdi1@7Y`1A(^Ym$NYgX^bzHjMFSYWH4Ce*^=-MzE>i9Pd6W|#nT#>wGTfF@@!4$Wb7<0 zU`QUpumHNiir5rKB?3@dMRY5WjTnZ(xR@bNxiPj1!+M(d z;_F{j(H?1VoVW0kC zA%4@7{>%S*aQx1+Mo(i$tS%!0U~jSGn{9JIbN#yPvp=xLANqI|o@l>Wgm;-hpG1K? z;Y;{M_ILKw){Mg!V?5DmDQSj5L97F=mb$kE@qt(cXim}0^$#jJr#?*GTsQCBE}DBP zF<3O*_I@0TIpCge2QHwT*~jiiYnMjL85|Rr5n`qw8`$J!7{N{(qd^RdQp>C8!t_hT z$k{$40MyYLvn}cOW|Zsx!1?t;_ma~!WZRpkNa-sC-MP}Bp_F=A7xvEjWXFnwKxmr` zQ%!BawWS}MA)9}BFyLA*;MugYqI~=pS&myqa=3lup=j(_)xC^-p@v~wDQJDpjD5n? zY21cqVHkU}vAj)HJkAGrW5lCX+gVMtcp3)9GuX)y*y3+~I2osY>+d+kpa#;d9Pw^E zh9xY?6_cs_H!tM!eKam5z9 zM(z{8G@&HE0sZ#{w>$0Q26Oq?S;y4DOfmL4w_}zFU8ByWyw$(>l1BDRt33Me>Og^D zf4c`d4$e4@E6}pz?~dQ5;-cC=8#1!nWXo9xu2nv~F8v|+t1Z)#^c#j~plt*WMCLgK z=45d=i(aiyxUUN8cT4(@lLM@3X)l3N!zY^Eac@RN^F%$8IFCZ3 zzC3IzSAPR|NE#!_6=yaaYAuELL0*bHcKJVBmjYU;?9V_rEjNXGfbRetuN z_=@*KZo@ao;blE21O%?)gKc9Wc@Or%SpqGYsHH@|!!Fw=sHm;vCp@Az7)j)INE#8D z;DvQPpaYfHdO$CQzW{4HRhG+*i+wEbxlHQ&c?mLqc^@51fA`q*`#MPLwp^Y!UEVXz zg5QCnDnW#oCF@P^Xk-R2!Vx7mWbbPRXfJKqqDc!!ubv3rx%>%uY*Le)IlY=4C7 zq^dz4B3?Aoj!83!qh?n>`URFdfW^bEpJce1CJ2gP?3b@cmSv6LkfT1u$1DD|9at{s zb{lv>*_RCo&=`+)Fq0<2Zw;TV1Z?<3kPP^u%lLf!?Ii>x9s*eriJA)~+MX}>fVFCS z1E7Y@^E`w@E@fPIeqdZ5=Rgl8@+1ArT`5-k8#9N3;09$z#G~*}-;#LZG>BY zdBTr#AExuE79F+;l^8`XN01R2_-|AL^x_FS7{il39Jc=P3@nYJugN-+vh8p1r!XQI zs`IxH3}u|IILp^*FMRVDEmB(1O_Si=2$(DF81ZspV{aba9pW9q&{7HBrdZukD!W_A{1~9v)BN68fdKVp=tc`flhoI*xF4 zc=RdT{i~}cEhINlP#{^Zjtqe#@{|g_i45f z=szNcZaDHyT8EFH_q&?zQ!xv)@P&{-ZcbU4I29pcxbL#6wC3 zw%L)gX1F_#HQM3z0K+zA-$m5%``*4*9}gX`kej{uPbey4ze?r1^-KqW?-XydEN<{{X*Eq#Ar^z>+01E6TP(qbIatMD7>#R2$%{CLM{fLkn8B& z5^PIer!g2!XtQgPnFY8~Me5 z6}ZnfvA3pE{v)nF7?PAwFwh^CGVgO?{^+YCu5o8KVCGW=PIErM-SVhtd5Z0hZvWEG zr@9`AVJneze^T*0w`;}nZzQ5d@mQ5>@RKeHXzdVkM9muZ0T`IaVGiZDY4j@SVDBhx zt1aY)qHg0!G<6;I#9aaoQ$8C;89;RjXBlZGFFI-KoOZ zz2k050xm3bZ)U zobXvR97sF#)9fde^46$CgAO>+M;(lC$DBEYyq=laf0bQ86eNk2&dM0N3E345EU0AU ziA?5cH3FCS6o{Qk*22}D!@rp(_orO;m86d(ChS_+}i+` z{q9PtEsbw1oQ)2lj)03cojlT{*`D043j)FKun%#+-_T;j<_F(#Ws4*G=ycYFura!r zGjdK~rl$JpkZal&d(TVNCQX^wY^72>W#M`io_&(tPp}FDR!L$3FujEf?#q!RC?nS?EmL zQ)+jV%NGtIoFsp5GQm5Doa7{)BY$ur0@&vh)5SrMfvz&>=L0mnW-2Gc8>F(#nMo4L zabT~QlEyUKKAMUi)2O zP=ZbIQYG=-+x*=+_{!(4^iIG`ZKmnQ zY>;GsmMPM*|Hl?(W&C?II(fO#IVIYvDz#|*0-(M?0KWWlvM*5H6U+HlhDr`T*Kvo| zhi4V-x=hIZm%eMM;ol~&bOV+kc-Eo<)x=29F&naJ|94sQW$!IG1HlMA+dSDF^?Kc! zN*%}aJNZA@;DgJZA%)si1dHacXVzqty%;$SWT+<3ylPn&isZ{e zA^2DioE*?Dn(j^IE>YYJ&w=^J^kwi0{J83e;$FW%=a3@lKSZf|;YbtSz<&jCh2LVC-MKc~S zP7l*E_ABcC?7d-ZBDQ|4;LzQ=4d?SB)VEmO6x7oY{V;~|3QDCAc;pE3?iI5)_+C9zysjqr}v8H%Z@l# zF|!5uqHq3!iutI?`}t%_S&@qw&??#^dO6u9mlAOENmK6k0nBMmS1)cLSegzWf%_iA zvUabsVI_5zLn0oVgv*JhaN?9zanW;)rSQ&{iiInn z>$Ze!m0<(!W+hiL0j_*m1P8{)!to;^TP~(wrA#PI>WKTj71B^!TZ;Qdn)%Y z7;X2yUz1VOA8zQLXt=^9R;J%R;%S21o< z!P$4;Vdu%OQ|IB%4H$)2o03a-w8ChFn%8JrDS?NLuu;}fW?@ zs_4`7Z^eXuQfM36p?+zy;0Lw)K zONDxl$wxtuFfyi zRUU=nXLB#&ue25)pN(M0HoceaCByRIPs)@SJsV$ZIQhdvYae6F$Hqou;pdKgi=GeP2Gk{ue+}wh}(6A-p+?fJ$Gcx zKWxB2)`}!~udGXze|)1+3AmdURaPL7eU?fTmpBoR;d^!1UJzE5(8{k{WFRO3&nwNQ zaKz82T0!kxB1!{eFLhXf63Nz>)~V>bRi~roLL6s;9HJc^IJeJ<@v>%%ee>a!i;L)u zJAY@Wk51cd->-G-q#TDnUquLf7-D&3`q$)t_*etl8!H5y|H3}^kM)|jhyIwLI#Mq< zX)oh!8m&2{6O@FjxZU!aP6!$~nG4CKZpmYRGPxNU<70pV<3%NYt|-6%FU=D0u(Lw8 z%h!QAx$ebW(_OzDAFvJ~r$LIY%|f@=^d6{hZGxS<5zYDdJ|^`$`vO*JjbKlyaso@s zA@-eiBa{SVd$__ckQ2ft*^gDWw{ZCEby9^de2TwFoB+BX3isgI^=!-auN1I-XWY$& zzcyQ(f|q%NRs`x)=vdSN$)3)DzSnJ30%J{a{7R9~sGjjOU&sZ^-HIG<)FE;Ksg|yU z9E+FW3Sk^VcBqSPiG0wl?_Q5>ti6=NImD5d%{og-#DJ0@sMkfYI2UYX-BIr1(C;{4 zInR#9W(tP}3O`~af)vUbv)0=K+Ehvf^gQ1j9G-WFjDK}&qyyL21^X&}fT@maT}IMt z;hnLwrkw2;(|z}=b&vfT|3stC0jb0jko=Ff*^6xmQEn&R|F+dEk^ewtbT;s zl-my_k!*ERy>txMII4}gxF6pgUnBbhxk`IpLE-4CyDskU6Mzlx2r~BW=wo5XO4NVs z5~7+ybNU59%`yMvj^r??nsV{MjsqfM0wyLWUrr5mb~%1DV6Q|{U}n zto{z4z$%iP);v&o&fIieO8{D#4vG>vM7b1cVT=Dq^(){~_x6Xt@nuuh;<@9dbCMD# zWu8cq3!=eMI$Zt(^26TjrXimfoGQ;;yAyu9Z*9LDonag5K!zfO_K5c(tjc{AjfG-G z%vFvr41x|G)WNmskgC!CK(T7?LsTWpuPtAC_e)T6AMYmPR9$xGfPw2c$GPte_V6k* z&B27yKKRRn>tlVLh2b%G=48b5s1dhpnmq`%+}FcjD-jBZG8$404bc=)K&bVCV+PVO z9kDvZ3k>Z2OyzL%E&@jxOOZ|T#zfCOufrVkb`FxX!dVa&xhrM(8PJfsbE<=#^qz#5 zJLF2{u|a{ZAzz^rr*S# z^^JjCX&y+i2{l;bbS75P781O*wf}{bdKDX~*nlFy9Rl$DhrjLhQA%5nYY<}Q^EsUf zjL0|5tk z;S=OH*-t(%8-LDl2{emFuq6B`B2iQ6`_)(FVhPO<{R9I|YbKD^%aQhPf5+BfP{$(T z<&GuM6~w?|`qk7BZB*}c@Y}A)w($P^PO<$i&Rt+>fsj;?^hc@N^BO(uBUr8S5|HQIq*fU% zzMSmKsA)Q<>j^2A{=Rh(EYbL1e)3=1Z*3^FEn-o)rq2z9ggbnag=y5+f-(Mn%lIg2 zW5|(}QriVrUEs*xmB&T%$ygm_=cgZ1C~Xe zKuufLrB%QWa(IjLG)^T>``*^=&_eNaQ7ER^|JUOYh>$J`A=EylmzYpW zFbkc!TJr=vku09^V2~$>FY}Axr*3UJ);$Zv=C-)#qCKnLP7w80k9AYxcggfT0S7 zp4}T%C{=*+bx64Yl7n_PxSPVMf#&aQ8!f_xFm;$)6y6g02R|X%_LCg|1aCOHU;396De63-69iXXV}8Yu31AE60b>^4IsZiU~y zdF2q5LF21kc`B6?()53=_{;vbi<6`Br|)&T`?EgBwe*5l@^qW~WvQLl36(_8Q7}&S zP7e&!=xOQQ8|ppivdHDS$jT+W%pGVtnLk}Z5c7yhlkLAO4y9Yk>opMV9QEKnm!PF& zaYn6W^&?>9YjV_M46F_5DVwugCO|vlFtd|8V%U_CJwX$3dYU+~>$5#thI8*vmBS-dCXP^b2yz&L$jp78$~LDgN_>A@nc%Mt14Jz0k_I3N zR3h`(Ok(2Lft8`}rZ6&$AC>BoNm-8d+qv0CBdzXW*AaPi=EhiPJa zXoz{)2}yCT|2e;N-&;ABR`LaE8#E-+(IvqH03^_?JdP>UdF_ByHJQ!qj@WK5}Rf9c4X6`U5O# z+$e_ZDRe(rTtrZmOaOr^U7xfMjlVxjX*S_q4-8Uh34q}EUROC6V{QvLs6i5~Zbn()vJCEshxkk8QYh?X&7=$E z4m7BV=m;tmTVsmss7GN;?A=M={C@q_^HM&g6zY7?XB7Lf08iYq`PrbV$)GiL+wNUJ z?jo}Zk$qYO;r)6L3)@H7QV(H`iB1Yz@Ra;zX)(NpOuVwRC z|3zAE5CTAY2nTXwQB(qBE7mMQn&zpG%x=ogtEBn?sln&h^(V^8CcGXns-G|JQ#?eR z&6jVw{%?rw!?DFk@_)vY1QVN)||3|!Q`~a0$+7FW`P5!h`vUnUqcOPbET08oh*g5 z2hCaz1<}5iJ%bF8OY2(dd_vGg^MD{@0 zWhMQ!xx0;uG5&x@VUh3j3Pp1*g3|A~^um<;QuMu@WLUo~-jezv#{F=}Os*z>xr*A0xd_yl(fDhhwu zGrqv$(Mo2W=|{2XmZyg0D3yZa=zKT%^C0UC@x|I1cB<#9t)mTCyTautTXB_lW(;d1 z!%kYg>iuqCZd%59Y!$8uu&iD0O)8-e;C%UAXGnp-4QWy*>o3Xh7DeIj7=ESIR8?o& zfLwBOrBF^r&3nG=uhk;$>t|qRd9s>atNp2NlI~+q+1kEpXUuGHy%Xg**>z*Hl%F>- zp8#!z_vaFwgym^%-E`VgPekl1pGPk=0AT-~nsBSbf!PU$9tylly)BvGN{U>!T>v@W z%%XJowEI3&Byd2(sFHKwv`-LVda#osKIw{028t&FGVY@jTkcka%)HR{z!5AeD?ShEsxU!WsYRrL(R9=t zcU3lbcg+=o`ZuEESF8!Ns%m6MkYGlR{vByS{SJ zE|nW^lapYv(pv*;!B^thwckuWteSd#9bx;#K2|P+p(C!oQ)0IrQ7a<}xXVF9k-LFp z?|2d2_f)?m)4esA2!OxMkQAy3qDQ=d@;3| ze|Y?B*}}y(U6UJR7j~svgL4m1|7R+q{R;^B7lCD7_7(`}lj+;DT3P`HXk>AU*P0)>xQ z9yEv`{ayO_NzU#Ice~htg@%otjJRBn5&BG6k$rrOTj9g7Pe=Hqz1K<58nbR^P55=I zUI;WVw_wVD{=ltvj`YqL9cSRKu{siI0PjC(DJ6%Ft$o*!b$5-EcHmBS&w`lyUg#PI zRNyB+x^T>0ozEeeh1S{U=Ut28gqyULh)daOg9rt}$Y}9)_%}vqcOMzF zlDBZbvvAI_p*V(0bg;dH!^aLZ8*;Cf&kC)2pHi3Ibj`Ru)DNk21=ItJ_E7^QF`;Ge zCbH1W>VD8wYe9_N9=o%iEU@j7BfcBI4B&Cb7sYBISGF+OeLXzUGHbiV6N6Fdos7* z8=nTYx;RQ(z|j^^LgcEaBb*U+B`8>_x7Gu*K8wE%8pf+4J|83#?r4l-nc&foThfmn z^n2=)Ihy*Ni|%t>H&`RrkEn}ixq9`L+?(-xmgTR@NNbXYWyp#*F_>?d{~#Q?i_q@i zV^NM5efg2$>ce)_{}vMv6V%$^<>01Rr{v5-XQvPI>Col*>ezBaw$Z&8w8S08pwUM$ zzU+m0>(YJjVGOX|@xjPjX*aWKb6uCbB1O72w`Cb2aA~Wo25F6e-&>0Y1KuQ7Ojp<( z057VTmmvc-n)^VJ!r}pLAwv6gi^f=Da%aVe|@5 zgClIBf=!Za^G)V#`=ZD;$)g`KVprO@r2+5A`o+N&lfp$0x?5os(*GCdVDdgRv~I!G z=V2*UZ_0c@KkduO@cc$+qx4SM;E=w*!u}O&SH7+NTF@4-#MVGREq9{7F21~AOYlmg zY3&!^zRJz(cU2?$SP*$IOW2$L7@Z$#(xF>Ay@S9$%v><^4M-vg0%BHej?;g?kYsct zv9S>VZyCwvc3*NCVCl4u&~x1@`bpwCaWs3PIlgS;1c23xk?8NAW!ZpQ!p4!gBmKvAO%N?nOaX2sd>^QH;3m+?N1jq!)=IS&_vxOMZq zeEpR~L*U!@(r=0-HY9qtt+b0Jf2)?CoBOrymME$s$v8!AzD$-me#W#wlfsA#PshGkU?n*hetk9(L|~ zkU_>{lze5pp_AVqy04oh8OI157a)U1k1t}lrKwtwH|K8T`(`hMqBEovA391T5ZK56 zf`{{Y@BA}$qH9-XC6a{@pl+t~d7;aM-iW6Yow{#1yx#Jf#0w~=&;O-T!8teg7V{mB zSvqzi8F+d{x&EdXc=Ied#k!h60zvj-!-2G9K_Y&G?QlXCNz&y%=#V-h3apnrKh|fY zcBkQStjddBpk{d(BBTVGZE`S1F`R}N(w-4?#qw7Lz)59GJU5Z;qxyp5n(xQ zkx{_1kZ#|EQY>dZv{u0m^|K5q0z0>T)J_S>#-=Anfxv@f=Z>@1nN3l+S?;mNmvhSf zxBK3hdEW8S6`M5vkk=A=PQwrscw10tsHRuDW@9BCB(!hn*W2@(=?!Zt4dYZkv?AMP z8bglK{bP^0wEwz%8(Z~)S^^u)Wv$CW^=V%%dqDW+Yo&iYI8sg|*)^;6VkU!Lq)f%L zS)(Oi-pKuhk)xPC2ImA#nEd)paV^&4M@4PG`DSN8C7toRKt3c-iv7pa;o%>4!^YvO z*H&{dTx8YVs4S@u>^jumdaB!*oAvhl!fy{a#C$2cffd8c#mis=KFp~k?@$geWL*@n)zVOzfVr+95k{49Xrv( zg{qhr7iP?N7avkcTdBj?at*fjLT}#bvJR~(p=(FnzkkViBbslhN-GtuRD~h-2F^0c z@w&sT-dLXbbWw&bu&a!e4xO(2aNezJg-XzF#v!23cG;hO;%0qoI@oc#rTZ7ft zz;)h0ydv&UA<48=2CThIBAOlE=hgaXk(*ud{-6(RJGi(yB*JfHGxA3>xU{L0pC%rw zp>0?Jp#}klo%pq43iKGro@rCvz0T`qto&B`di=Hi{KH)4+axGpWz4a*8r#&u{qc~< z*+bKO$p8ks=jgIiF|1{h7rHHUU0lufcFc+;J6T#%0fnXZSC3kOa@(pu)FT~Dvaw5N z_H~U1-!@T>&T|P%YZr6g<**t#`b9q)w0U5A4kxIjdIt6g1S(Apd$=) z7#?}nkC)+G?w!BltM-2`u&-n-pTu`(PQO_$qRuPr_iOJj`bVE1zre7VLC zn=;2iS@zw?F4ZZ#$Oo7u@au$@v19!dt)R2FK#%wlHmyh}q$9i@W`H|SZlKz`2H-gR)ON z)UM}VJ_(uBp*)J}nEJ|k*;{jj=Lf^YlYTI~d0Ds5=+vuZ8SNB{ z&i&9O!IlYG)}g`o&*Z%pNb?gR(W3R(S4URj96S=RAxD--su`{F2I@$}zM0oKacT~J z@ZW=t<0LQKEQJGZKat|{E(gE3!-Nj!F*uwH;;wnAxe)dX2(L|1QQM z#jzCsh{PMHpqUnO80pkZ<1o~eQQ{DH8|M=ahhM?Y@FF+7n0N#U4|(mP^+$HpHhZLw zp^!|$-cl!VfcxE8#_kv$3n~D=mlXaje@XRf#Sh9g9Nu|El^jQ6{pkw<0CcXLfg_RJ z(-AceE>{D}T@%jmv|r(E-h7K<&W;@Um|}@Y>_%X~fzSTMX-v3})dC!5EVXUL;UIQ< zWJsUpx{2!Eb?5mWoX!uA!sJm<_WWvh-m`WO42?FzdC#@y65$J^4g9{bvi54l`4nKc zQ#(|Buv6ORNyPuM_8PQ6Xcn5v&QtX-v1#4*3`m*79b6{db>%0C{KuN46XW*PT=)l;zeMDy|bz=}0 zD4=h8>+y|_+SV({?43pGt6ks5yc01^LyyH?Uy{}P`FWST?^DEf+$X3@1mPPfb7#F8 zgh_&8uZ^Y~R0iU**I><$t*kRrN#K4HYpQ%6cmW*jbm5=kk{W~?rL&7v=)8${;Pa(` z{7%JWG&qaMMz3jr*Gdx<5*%x0p)vY}q4$Ph03;+Ht_0`Urm1)MiI7B~Y*et}KjY%J%-yz7cVVuFOOS zfDfTx=Uf>5Qwa@Clxix5)((N9VxWOm*hWgrhp*ZNp5FOM9N~Ik$>COj9fE3PrJbeq z4v`b#ZO1n??Q7$tb!oFTl9+xG>b$n>aULPFa8LTbTjn4|fF`tl*{$o)xAp>tlnjfF za=@^*o~L94$}noB&aY$(0rV`7Rc96pOp5Dlc0$*$PjPUE@%SlN{`_XnA3s~R;#>~- z?0-bxrqsJgC}x!>`E7fZ8J?3}dML<;@8|ab?zWW6yj%b5=PNcTnR)0o{r~rJ<=MVwi7jQiiA#+Wlxc zzL`W%su4O4SE9(n{W#l8^5#EP&PQit?Jdjw0>2)l2E=I>S|dCGuqKZnvy5@>i-Ec* zar&~m#l@sUyQ+&m&F+5D$LZQ7E%%ktCE4M&eAe{8_D7RT^X6tWHxY_dBsLn~4?1zKLy~AB z&UdEM*8}TJ)xO?h!*e5^t8M3q3HBL|>=$%N+pl2XDpvgNe<82Ln^%)f{bO0@b;6+a z_@*Tj)Qpq1Qv98+=tQcVo!KX3)4{M)vA=bZ8#d#N7g>c4;{B)*I64pN%@YD?iLF@d z$oy=`XT{x#Lu!PCv(xjbrg|r8Z#eye^}m1pF+JMirVsV@Eb_gG=!11}!JKfn17pk4+r12m6T2cghB*_W<-X(YiBVAK>?B1ME`&W+lTA#r8NBrP7)*Bp5t z`y%touY3saRQ)785%N1j=Ju?FT+?%(gb}6u^ zw(rX?YOOtacyGZyFoXtWyiX2Bmhbzcip_Rmp&WhzU(3;(=5%_-q;74}b}e;$MsIM- zqpquHVl0_+f^I)xx6@!16ot~*C>ABw#LygvR|mVHZvXV&0$q(Lu~h>AzckBDAQ#UV zH?FTjg+c}tu={GRIfh-K;Yb7N9NZ^&?oZDho{vTFXM3xUOstpMxifxPcSuWNC_!=x zb;sL4x%NT<2h`@7M;@)E!*|^O4g~{8x3+ITeeKy1=l9!K`>CV69ILdMrf$O~lE`{{ z=NzlWJ`oChX|-BLXSHv}%4f_cl>kfmQw*0%$W0d0Qhmm-&^v6}|7O9{@<6EN%9enoveAgNZsbWZ`j^jYD2ND~Et!JwHDB}sU=c|MX9dcm`XOGA#eFQS)XaaNtg37Mn^v*UtxAUuhI1HM*#C!#_j?v2 z?L<8U=;a`3Bfmd*Z>zr*QvtTIupD7EVo)UhDChRhP32k>4s?g1=yiOYHM4X*f1i?M z!{V_lAF!C_4?&54S0&Z0weg4+k)yq0@7PaYR~;J(@F|S$bLXw@f@>-Ul9Y_#*rP+4 ztLF2XIzLi3$u;-{oyZ#a5VDJq>8ROzf_#)-i-jaL%_iOBtP-kW#TVBd#t zeU6?!fRu>ex)NY)-+BT|JDb3{?dA9+FmmKi3Q%%g+;xWDK!XSmmUhB6y9x^cCW*%d z2NZ*c)nvoaAI;hS2mr5*&3MYnwxIA)C2yFA8p`>MUlF{SbvrKRm1({o8+M3 zdD)KN?`_^n7b9G+4KRYh{ZKy2kOY9Qo7A=&EQ1tw_$&BCGB9VtLMZM_Tsw)~;Jlc@ zH$@%$B{TVKd_jDyFCs?1z~}{<`AcPP^<%O)>p$~A@KjG5&ir={P7mT=G3Z^NWY;VF z0yAUTwEJ5cr_yJpX%w5IPtsylZ&PqmRO9L3xzj@{OAXTZprN=DD=z5I6tbwW*B1Wt zauc?_a@F4pOB>ipkp`}<1*9F739FHz&<-tMFxZ!RVT-m&TI&z?)F$Bx*H{Z5I?5q_ zInbr%^4Yf<|P65u@Aol zkV#gRljcG)Bh4<)u|6E_jW)SZPkdm3HS_1WOr;dBf<3*h0S=ey#+*VyvAh(fTs50hZts_qkfb5_7xP{kMOxhi z4>9w_ZI#esDA{?sz~%E56{=)AlM^1;eHp*lsO!uQ_Xa2M-+l5W;z?Or*lUm%0+Z!~ zJ5$!);-$jFL&~gQZS->9$Ci0K7M(Aj@e}g(#Vi>vuh_4}s12J|v4q4}PdB+h2WZy) zoS0p1frm6;J^}$`M(VAGIu>#CVh@q<%j=amu!)PGl65I9S)rncl3}jHr19>cjO@`j zv|+fIp#g?8^w^_kLcea=b577fzQv1{GJ${akn28-7zo4nWBf|{LGJ2IOZ@ivdcA4K z90cJdin?4tAcj=@kWeo~n`k|M2t`eo=N&w+!7%#|+X)Hv>bLfQY2D z(kV4G(mhCbHwe-l(%p@~5E9Z2(tYRs?!DiC@cf>$&)I9Oz4qR9;uz)=8In=E4))HG zH8tv8p$+QFEbnawoP!Jd9%@Pgv~~+bvb_J`A+^$%n)EH@9x+QPlo-l$mxac`j){Nx z+Q}j3*N|YZ0~oAkxBQDKKxXJ$9=&-8=h>p8+Jz40_$EO1&s41>z8;PL=Dq~h6id;> zq+Q<@O>R*0kMAv8kWsX&Nf*?s@bU{4?}nxy0oKGQn&iOCNi^moB)x4#Jvht>}y=wkpucwVh236JuJG-hOP!n~2UH?ya zC-+FgW{jDnwY-PlW*ln_Nzw^eoJK!>iF-=5sEV|`+M{eceGtdo&GAGfHE-lPo7pw+ zxAeWZsP=jrG+iGf8J!T58QA2rl?DB`p%H77ztuu`-Jn8SeLieSWbK}UyUugjeR?C9qX>|Nq?0M$IcJ=m%F4yLn^CZ@3U*&p9Sh-3;MYd1w`wQ zounRf*X5knbG-7i!c+Es;nDGW_`Aqq#z5n_jUc*v2hE@EbaR5*4DaDAv0-~0`92oN zBzK3UNIh49yD>vEz6LRj`=)aisy%-F@g=JNx#pR5y}8v?q}%>$fx zLDluWSql28GaK9qc;AofH4$r=(iR0^<(YW5eCINsdC%2^Vn^9ExM^%%J`G`G#ZCO# zBs(%%k*~U2(9~P(WBNAXB=y8cCDl%M_()`UY*(B(Eap2bO!X<&bdv=YEM9#JO{}Ow zX?q3=X-Z_4%e4IO`=i~BoF8P#B?E0uX&wC**%d|od_{EDusr+l^z%=l+u;0Kb&tkh zH$mV!O$MV9Bd#~P5b_#Kn1iY`U%XZdUm&drdyxhPQK6Sqq-9eK4Q{kvw{;-%5lxp2 z_nBP3)jgXO#g5?JsHB<7lT~o8`d4o$(4a_Mr9_SuOIT14{0bg8 z%86X~11&mr8^k=oBitEK@+u4PV${w`S_~iJ|~7O z`b=a{a^MPPFRi6K7DE6~d~7M*6Vr-cNkLKSA%O%a zzF}4DBJ}Sb1s&2cjSTsEz_?tDV&Srf2)2(R;=1_iYH6Y{4X*MWG>_dJfDnIG;7ekJ zl(l*1CAH?QqQRfq`Tt9Jx95zHMcqD8t9k+>>Uo6st7zd3&W;0z39KULn#7eCRmWXt zAG9S8BB_$r)>yV#*tbt#Hsn~Ky{W$){fg|OmX-+bfddxU8niXj8?WUAU?s7LV3xFT zGUJgL`xbw;H}tA|L1{=73_B|CN|n}1$1$0VX9{yq?T%iNH(shsM>G;^E0bfz5f+$M zNQUv>81a!KF7LUZ_~2NyN6NS3Mu^_(gSF4FXGNVhVqQqFVCM^q$I%y+o`XEi)P>sg zm-;VWSCq&=Lo-@6o3iikt^`_FFZ}<*v8(M9`-UmT$HzERi=JXN(ST?*T_pZ*mFO#B z`~p2f`q)-G=ruy9j7?D7E*>m<@@qNn)-tP!qTB(DQAGe~q%@@bh|8!K?%niWttBD9 z0DX(*424crhH8Xc0=GY-DPyyzz6&P7Vi*836PMN{fh(j4&scY*Ars8#Vlbdk;GNEK>31x1DYAh+Dm8!GNL0z6sH?ZsUAvz_8lixJxaD`blfR zjCl~qOfI;dXL3Ea?>k}Fd6MDGJ&3|J!c9~4<-2pkyk(aD-?DbQ?}zc<9^+k?PHE&1 zV@+&dJDW}qY%ovil;fqI-xrQ3duMqI7IGQi9wm9xPSdfSDX82%^$0fvcZ%KhTQ4uJjz9l; zY!X9;DVnH-^Ij0m5TEb^d9b{)bcF>BO-*rez*rOpqOtjZv14J&wmy8*fwg*Pcgix> ztX>?YQ@m+&mbB)F@5bzHjzu##JuAQQ5z`id0n3xTzc}LyQ2vSuE^Nv6nAb>bpCi_wQUr}{_Jy)q5v^gmU^lPDA1~R{2(AU_f`)Aw)i-w zXD@L&1tug|TvZF^>nWF)T(%t%l_9bd8&RzjS0E4!q{nhnz}ZrLG2??|dbC2gro6UX zZ^PPBb+l1!&(ynlW+e!k9i1AmfPZY?=H4pKUr^So2y7hXNC1FqHS2Kq(bC{5Gq-xi zC^#i>?Hek-9~6tK(xQm4+Hrer#b3WOoml@1(~#5#b77sM>)ULsG9tJ_d3T7m-rIGY ztU)1?qcJ8L3LsXjk$oQ}@X8-(EF_8Hih+zTpGFn#PQ}Qu#4VlA*uffL0BsgH<1`RT=CS|8k|h?n`}E3;+nvXlMx`}?`# zN_RK;)-xvv#EFlo(k@>ECbbhuLE?M{gA)ZUs;YG38aOX(+Qge@gEq*jq=lHtDup6= zn$PujjVymY(qhfd>RW~s`=cihH&ac#f0bblLWm=B6pAC{03dOZw6!Uj@f{6@RgSuB zi@cmIf40!8#*cyZs%?nO+a5Q`#6sny!A_v`k_Zos!eCdPvNK@iFq*h4){M!83q$e!<*zs4; zpDMsDg_EWC%!V@9XRqh4ONp>$u7VO2fnN`RR~|ES9mx849g8xEauO#Kq! z=B$1zt_m?E;i1OP=20Vgf-(d@8s|~GP+X#fNz~(4wDhPd-dcX^3bh+Wf*3T{p;Xyk z(-BOUcF8%_ki(5=r<2~UtDB$a4$DQ9*n(AIp6YWcG$&%+{y~qPuo9`RfeJ1e$3I5@ z<(Q0n#qy}>2tnh=uMl+8`N|P^Ra-5(#MLi6IK?7W3KkoS{i%`%HkA;Y7`xA_j~NiO z^)t~|ZCW@OE87po_!<-}HPi2ODPn_`O*Ui?$K1d}#_plMx%Ck51m)x#d0IBA6_vN* zOf`@<-*AH2aDFFtd$vZ=gBp47mVc9|Vhl-9XlLJ_>8D`0>@)>bg$qiwH-F<<< zb!fw8;Drz-n5ZjH305A4ZuQ(FhGT#BhOndH{D6-ig1Y4oqFai=a~gY)^et<{JdJNe zvQ|QLOa80dLXu~(HTU7Q{c&45e}SFaenc`QRUR$U*_2c^7q>Y5wE&tyug72i;DILW zg_o8V^yhWu%OgkgKZnthH7@L}<~izKvI=No2mp9L>gqrx{_CC;9b!@QH#Sj6sa_l! zWI>k{X7&1e*u>D%YdxESjXidixl`+8e3&&N))muiS#_@k*PL*kFALoB;*;Q9HISB= z+uM$hkMXzu?*c&MoLvQLxMu^Wfg!*EpyAy+|IwV$=O@JS2fwW7HiGrIn7=+1ujjR% zG&S6wE zD#}}AAvxk&!eO#s?BWNiin=FkbK;MimR%C(QznZbWgvzv?3_m{CgL&_Kn&*5>;C_e%HZqY9w?des-{;^EW0SkK?)ch?E4UL_K%ON z@tyrhL}_o1&x=I3LBN! z4#{`qh%GQ)!~OtbFho&>TXB+nH^6Rk5gHJJXtF znvv5_Ui9Bn>u9NI%92 zj#cknr)Q|f80T{6f?V~T*D|il>pdP_iEbr4#dAfasIk|HlwA>YdP8uWF=NZu}Bwacp!?(RX@@5nJHJa8Sr|#&=MfXjLKLDB}Nq@wlTd9^$(WK5aL_B z%uMsgTOJ86nR+SWKpD-;b~}m@tH+agZiHwkTWC|J18F<_Xc-vuW&fg(qB*HTu=Q!d zgEeoBHsquW4WAhOZ6;NouaUM=E0hm+Yxth32?;Ak{~5rJagfNw0aLAUR=bLZ=2p&i~~Cdf94lIwhh8S=3vngNW!Rr-et0Q5BG>KDoDPF-TGd^Kh(oV=4CU?8yx#VLnGr zi2XuH!RbK>1oreKjqw-dI~9ceY8a{WDV22LI^k2-lAH%nWBZf_H6kJ?h zwTgLcXsu9i5W;Eb=Ld?l*17`oozsvMEJZiCdBgaA$Wjq8bmLblTSE)P=g}LeIOdn2 z6v3HfE2O|Ewzs`5&p>4d_&jLl_E zPJ@UXHl*DCao^b`r3*|?tFFl5^{{=^QkXIq-Y0MJ^n~dY>%T`tt${R1Hzr;m6SRrb zi3Yv6bDGqfzNbJGLv0dG?8X+8ZDXiz;|x!GEUN^%onNb-LAj5?#g{y|Kom(_kh5dj zSa#0_vo#n)(%L_0iFfAj8RZ=Fb741+NzL@4H0G!tBvwZDxGuOb)#nI?U1pdxwoY@d zhAgZU>BpI2x``X9B7uw}K-Kuyql{=*zZ&@f6*5GZyO}YDW_lyv?j*`Q@|QyT{pQuL)#UP3kmHOzwO z!_t1`D~YQKn=^D&5mpI%#t}ip`tyte%r0gPiyrz6cGDCa7o;~2n9n{Roe3w1!ByV%gBh+ zw~aJlHnRKVOI9a%J7P!ne0}P6H+wYisz4UzAIM|#W|ZSK>*Y2-zgm=JV!Z-t0v zIU-9TA4<~nEx1?v@_W$-Guy-lW^BRlexobW04ju=$D>6#D!TOa_ZtcT(C{%B861z; z4~GZ<6o{Ni69rsHO9)%neV5L~4Y5r;nViirTxTRV{;Tuv;8%Tiwl7Yd;(rB@K_e!yy#Y^-OA%;-f1QvK@(f1sq6(@@D#;=(n|B|@ z31$t)aEiSbpsmS|Vs(Df$T?AxA)#}0#m;)*woj2Lx{6=u*{@0xzc!6u_?idGGp-msjzM?vJPE|*di4Tdga&BCl7EB*3F;Qhdd9Dv7uXW8py zmoEtW-PZte;BMzPL@g{{yhM7;62oOxiQ27_}{oO`n_ZiwdIPxV{eM>s6 z4}>0@e~yqf29$82ktSWUw-cpb5EEm9bjcmJta4`XT|=8`+9$Wxe%Vhr0z#Mfw4?K| zN!7Ybk6k1>up3Z7W~`sy?K_2uNgRIzL}N2+U829;q%l2LQ$WlXrRA`wHoDKJIKc*h zD(5GJHxYKblQv|VzMY>02(_YEYJR_g33SMRO}s@D;U9gfS4qBKs{{ZpY|OtH*XARH z>I=hT>r>8<0z?_Ezrwek^ORy(pQSi4u>@^q>GtabuIO5Jg7TYoQ>IH6U|E6{t7hy^pOKoSk~zSoRMrH=?3t!gq57Byg2aeMRdmjuhDv)M_PqT~w@ zb_soMP>Y6ya80QTbvmKUC z1Bli&R*i()|K}wjy6X=%aS?sIEXXu*yBeZg`QUau_dhIjrVHJyQEC(!f}ll_cqaDj zvs!LkwX1S@!(;Ej-L9{QgHUL$aVmH|mp2&))xFP6UWJgX;(S-NEZ!(pU5{kqAXh{c zA`KPzDgvh<#igk5;B{U1$N-88`)5$uNEh0u5}0|6I9WB)Jy0`R4TS^%ZxWkTAn~ z;q`JNpv_&o1`@uT!q-942G>2DPv=CY;&>iw@-zsr_R7O$Di-eu@Eh#!--RT0^N;+)nZ{{L zkqd-$>H}f(^fw07Q&sOZn!!ay_CyK~i=;H>;uPwau#v{UAE{B5;p_|BGnN2@M}d(F zjK!;3H}9%I5UR!NpN=~~O^{{L-0hSa<_HODYNgLSwmgf+K=}M5zzMYpo%{B$0OrGH z=4N6&;r4rn&8kNWGI7@iQ60%v0b@42reS~BT=@VJ`k~!V6|4(u2L?78A=waV&C+^J zmq;FD&?Z_$R8d7KCya%U!z`qd762+ACBTYR{}qaO!M-}*4o(KRSl*N={$b4D6^!{y z!<8k#;J}?_Kpc|M*ZKX?WM1TM%WDl&rDHb=dT`DMjXmzsHh@(WXPCDbS+y*$G>CT=C~;*jTaTAq6xZKh?c*2Ao4yw@5&$KJzshYPmgWl`tr^caQ3avxjG=r-# zu!jSraG_&lwLR?7ZnYvbd5k9F~tjmbjVS7f1^QEPZ-drgw&8CUZ} zQ|B{P=CDe*NH#jDnJw}I$yRQ3tYnn55xuG51w6`<#KzQvEIcPC()E|Q^Ffj`9;5Jb z0hxX8Ued?ZMb^*QGmE!uoekJ2Zk8A4%(ne9(1H#At_#Ys#}MM%@_NCZuxUVxUE{L3 zMo0KKVUhGsj6A5Q)~aT@UK0&6a}D2&o8C-5ZR_$HCzchA5klmeI!!QrNxr=#Z}&Z+r{>hd#UiPObU< z`WWi~;C^i4&_ZELey6-2k*mLXji5S4g_Xc%k@IpOq5%6o)-&2POs9%a#J6Cf*P6Oir?UXCwK2w6(# z{XHlRIqXUlL-Sf%5(6tv`@2(dY#Dw-{`VCYHsbgm<+&Yx>_k>mH` z&}Tu6YANc4T?@Ottat07cb}-R)w0kqBk}-P&|V8S_;UYfNdd)t=tL~Cb1is9LE%#k zIQfsY5{~Bg`Ncd|>_ye(PY96hd;5L)EalB4MW$vulI}BUV@$;?Ex$_PC^4?&D6VMT zh*DzRwY;_Y+PNhlS_~`6HXBBRENtH^hU3I-y7`1;xn@WRPqkp=yq&iRd#0nq zuh^qt(=#O8I;%SFIU8-FIf~+Q|I+ldT-CTv?d|y-i}v-yml4~){HfC$wHI`B(4YWd z0ZD*wq=_>_R+27ih9#bcZV}vSiB}3gu4*)nq&9wV2UEdR)>2mum!i(k1YVyuO>1ix zZCbo*;hZRd0l;ta0XVXMl|r_8X4D$m6($} zXBIaRRLt%Wc+sPTeSYKBE4&xkxPD?;%7L~{vkd$aT{`&Q0G-EOfCEMyPlJ)R$^1!0 zN4jA6Q*BFRr9KH5{3N5?GL_xj$=)u>nRKh!`WL0}WaTiCWFiZwUB zq=qgeL=jKtTD&RgsG!)^%Wf%*ixC(5Gx+YpjR2)|S|>BsN|y~=b9inum1ygBhp6>z z)1jT9Ak_CM=H=6I*k1x7TNV#* zM24hv)h2w9*84<~3u>g~l%gU!3sQma7C37<*8e+hB&T2>>d?tG)RzPMos%NH{(r>r z{|Y)6LJT{(CD?eUlmFK45^6;Caf(^Esp7D^GO|3b?P2c3I1e8JwLne7q}DZgcx{2EfOiVT?FrUA=mo}|D*1qm^d)g7Qe zeAv2b6xx5Q(}KgqK~50B#k1vPD*UhK*xGM4=k4g(`%c^^NOyy1j)HyNR9T zmQCRG+qLw|A~fGYIq`m(r^r-)nG9zF2IC(3-CK zu+(Mkf~-HI_8sB>A$V7gZ_`?98!bu-E0GVQf_u4DbuEVq<}$K{0uzONo%FFdK!pSa zrUe<5Q>zI76q9#|4ppMP8&@QpvarnYc-MiaOU-N)6@m%RO{^ko!kFu>DlL!tboU{u zAd}XdUG%5LY(UhW7ac>$GXW7Ti+R5+V}}GNyvGxWlG-FgGvYQ&H1$su9rK28g=Q2_ zbNV>3VvyD~BMG5d0vcG%wu@KQ#LdjLUKhHeFBi|&uKZ7um?Ypt;P5y1a{k4ghToYv zMltt1j@=#mJbyLYTlD+>_cb23`T*q)qGStx9FJ{{+nar}rGt4ZctYg&pp7G&J4|I5hRX4 z7JMq~A>-ZBh2t{pa@Z7U9!3abk)G@27`o^a!n$);O#MZ;%+%5u!{B)Z2iF!#9zIn1 z!yi${W1tak^K#us&Ns6It(70Oq30`+k0mnorI%UY2((6`%2|u{OW08JV%ZO2MkEm_ zSK-;q%J=M24h~V!K4(JAt&gJiesWi79)CTkWkisQQH01yy)M_*NxsFshL=IlX4YRG z6Y!c~j-{V<%;%X`7i6J-P=DrtN7WE>&Dmuw@x62&&9;zCM2Pp=iY9E3{r{BIMD zmaRoxlf6txS*aGYq%~WO)%h%&lW){Wycfa%-E;(%OI*ioBU3dQYDMDTkCkQUs<}ya zSjBFh6(AL_hWLH>55M{mtk1nDf3_LwP)7UzuY&_RzCJy(ET5TE(Yn#Z%%9=2%B~r0`M}E(QGd2`9L$qjZtVr$Bi9Q+*#Au@ll{tqr;BL2isn=dtmQszcg3j z@bbO>c-=L#c?YCJj#m@v14)>BaIe^2+mAGZaj!PkU<+UIjA=s$Dh%6uBk^YDQ|Ay$ zZ|p!Qo^7lqnxL7~dtKG%UlZRv@?49MZ3;luQlz1dtU8{((lYK^VuX`+nt1QyW)KoP z#>@R4>O5Z;O;!{s*7p-cy2v&U01dOV@(ji4q##3x#p;&s)RL1rZ+^Q9{kcBImSSX6 zYx_l;=VQR6F~UTe@?Tm7p?GXkYnMlxQ}RFzo~Zhd`~w3#7Xf#4lF?C3>#leH$U@21 zO`YgxSBCv+{a;dlCS1jJa@zQG^Cj11%gPQ`*><0WVDsfWH@?ke+-_<;E3vr>F2tlQ z3Iy^*;0G9PAkf~vbC{V`pyCx(9fTFgv*VJgICn@K={f>8`X>EdR|`}d|3_|6Y2&DI zi5#}6+OqL!D12$68p7Q7wu7sCL^x7eyzMrzw&+dtAPsC*;fK@sIvC3?44ZTjmfGE8!9!M|8;0dZ{zcomTb$&$n=2; zzt4ePQ}Q=l@rBUEOItElD@IqhQCA`9gCK^wAP=j4`1;K%b+n5gooC)bqa{LYp4qmdnX18zHC=iRSNW!f1Y2qfJBTH#jUU~q zmc-W(H!hhqA;q{_rbtOOP)=A4D-Q_*BSThG3Ch51)jW4zGt8SKy|86akNN^1_nJYx zKCs&KDT{3?Ghk6lDGE`y`XLpic7R#8Q2&@rcT=WY$el=5F~)4>iVXZNP_i2+E898c zLk#|-nQH&;b*m<8e}}4cek}I;=}}Kp{U|?#@+65z6wm8$pv_AXAGj{pyS@E{X&<`{ znVyx5wp#vKl7Y9C8=FM!cYyAFac)f!LYNe)C^yGIFjGgU_ZD#>ACq;4oSYCW<|i&z zoH~4@q^VauN>%~ly`6xxDSiYQlCpLcT*W=xlLst~e!q%2I-t$Sy3uFi=g)oJs_VZA78|bSIVfzW|wt%!m?C%nJP5pdhiE5?uc0D9M z7x((ZjGbenR5DRshD!8$v_@7mQCynAQ*l?G=2c_xydf?oC%*vxA>+vI=wj;aPj#qn ziFl@Yu?b~{on!t3h(agjv1t3ta21^<_)35NSHx}F@M_gD1_O>N^N0Ze7GR-yG@*~wND8{n>_XX8GzgV%DO?{!mu=JR;f4;khEZH^<}^;>8T@l8lOF_ z-T25T5afjoja4&Mppk$2Tk!57-M8f;il@jS6U_;(6lEo91fcAB?|b}tfhv4ptTcARfEW$%PZl`; zdQZo15Zfi^$PD=ns?}?aAn~S->I|SST@lFUS}&Qoq|<=63tgDw-Ay?rT!C}suU&;H zLPifuMgcb$qN&4UuFMp$_hO0Tgk%Yt2}a^3VrP1{J*|d`_PZ$VpE$3qcu_)-H|IeCLH(EuG(Bcn?xv=6wEg$|u&?7`IY5iwU4YHv>c?e(oY)G&f(ZBL|U#Z}|RW+)Iz!-ToVa&)tROoMe z$SHOWn3-XF&ATC5iT@%1cn!uI3?ZFZdR@@#IFmO4&M0Ubr!10AiclXo86Pt3`6sPK z=M>6JFIl>Defcb8)}Mo`YpjyZ#Ku<-(Fwln>n)$IVW-dSJR(b`fwrd$Oxakax6$KLQ4mbPI>&pqX$E8D7H3mu&w21VJ$BnzHXq??1O^S7ug zaIzgcUCRSyJxq|#Z!-NeTkWOpDAt-PZ$@B8!ZUtN^WX1vaQDcF(Z1}6bgZwVLSBlc zBQ9;-OaNBZxAUsq2Vy_{x8d0cXwefE6AsecqPR(S@ETlIc=Hw=GUg6MJXgK^lGE$7 zZaVnH@%^WEbL!ThERswD8Cr!Q422utTL*WSI< zNm77Q;X=F+%lD+{%4qsfxhs11{~o~2iB*I%v#MUXhc8PWqA}t!`Yj#XKWeY_-76)3 zppm+3zcJgaw7T@7b{9I2pqW@55pnp;42#hXn+^SFX&{J|@6*@z#WxnF&Y35-X9*6S z*bX{bC|0cBhUQrwMKEfTzwE4w)ga*jAVUaPdB2HtXlcAJx537s;Q90+d@hew8?g^J zgq3D6?PmR>@8rK;)uGS~q$)q;^(DUHD=$>1NCUVT?Q{uUz5tlk@YiN{%<~4ew|QM? zn!B~7|0qIC6}mEk_L3i0Yzt8Aovq9xMu5!4kb^))>eGS#>I2s|O1Au?wM$k8p-#w! zZbRWp$CJV3k*VXf8iQ8|-{|uO3ED&6rS`nB_l_E7yC+f|?~Vr*NsBaYb@>9D*LESt z>#ZSH_M+dk?TZEhAX8*;<25>*<`BQCd*tLDzWi`qEt343Y67m&K3;RxbBgt|Ieo(P zwWC;KtORlM=b(WN7CeWZNhYep?s)_J*+U7ps6U#O$2k5n6agSk6e=S6^AWH}bGJSh z7GlI9846VbEgPwaaSd3=r(BaMWn9W!Afk8Js5b=uo?x8yw51$Ie=GTdEto$!N6 ze(;@klU0{!_nwY5-PCkCa8Cz)NNtjU^p(@+r8mlmlhy3TgZwblf=NeYoM3zVZu2y6 zBoh#f|CAc|&LomYUe9b{mx?EA(&_=JMET*xNUJ8X(lhBP?C9yrLPEzQ*ya<2Am3N%E8)FHGlbM+O)wX)@bDFme&<^O{XsNz@B>*uPI-e5f6j|BUPYY!jIws7VLa*)zSVVKQH;Uf!T zZv9+(bK&pDZ$>)ki|`MTpcwe464Q*EI2Q)sXSWZ$42U?#Sg#MM&CD6HER8D#KWXyUH$t8SbM zYvqsK8lRBt&1%3*A+ibnFa;OUgsj)*vRJ)&CibWzs<3(Vv=6%Ki0Y%npFNJc`K!3(>qtzB<;T6s;+*Kl+YSq{v>`cE- z>@SOm5n<&q*$XzELH>izdm(?K56$%v$I4gMH!pNy;6FE8{Z@{}kn2hO`6+KAGQZ+? z`-pzZe~I7bs}KB@(b?m%Ua#5+KVOO)=yqDAqN})aA>kc6&PsJRE)u}JSN+JRC`!3v zUm*9772nW?a443N`MF2_=jD$*z6i%#jwZ+1AomH;XjQgvzVfJTarakuBD>mJ{tTI< zIiF(9Xi5B$TInT_RH}I8_>RIvuoViUDZe(< z-eA_nw~R($W!)6U?8gyfJDo#olT0B zzta_e0~^V3Acj)JH_#R+D|UXIc0icv3b!OeCDWma_rgxt@Avt?H#k;HtB13{+6wE2 zd&kl*t$uAC6C3LgujkZ{^r#@{GW6UceO#AuXA&%Nk=_n(P(G|C;cD10@CVf&(4x42 zg2ebtoIgKDnz&zHoCK*FjZF{MsQIxyi=llG)F4CV<0Py;#|THsyyban*fZF!D8qNc zHEhEvsB$oe6|h$i-!^g8ZxrX)^j`lopvvV}pw&Q8Ah zwg?*Dwc$e4q%hZ^>4)p!1w@H(Q6wx9RpzOiwAlL(n^90?uiAaeCNz}3 zaWjF9HG?jY37Dg+f`rk2ktcUejAYeFqOnvq%%+mZLYyC8>EbuJ2pqtFGgQL`z~`N) zquO`+w9MOhP~5P9BwtIIfLv&%CajC}fkH&w`%MP@_+Rc$!hY7X;(hGCg?N6*>RKzV z1Nkb8ny1tDCE(gjs?Ng%KX=m?0Qu)1_1k3U=JDU0Ki)|6zt1 z4Ghyk9i4q6sYz66R)+pnSoO8(yvD%-Z6HttUUDNf|2ua!j`B?aP^e&gUc?{%N=sA* z^A|#VB+&XeiO(d3pO+Q7zi{#e=5@BI@`b~~St%3g6W=Da$--}6a?2Q%LO%tc-F`-d z!1MsvqoD_5)Ck*m%KkeIFLAuYx@z)7zy6JkV*A+94}Xnz!{FdEPs6mis$?ttYoc=r z)_vh#+pA{bEj~()_5C>}r#z>@IC;ESDS&Ko3@;TvvFe~}qkc;*ER0uWUIQ5k09^!^ zsJ`$mF{*mM)CfhIW5-(5&&@7^9Cc`GghKff?22!QPjI~O!6b$Z|Mf-UVO0ToqjcseLelCqC)%f5*W5=1q zDT7e>sGMT}(R%^}!xyPZ2*OU)_t(nJgj60CYDJ3isZcxn+I{_x4@fD}{p~@{H+611 ze~#j0LARgV-M?h)p36;cScjzU_6^&YEujUt)p1Rnz+hG+LG{6~+Jbszogcd>RO90D z(GEN|LHHD*j>Qb+$4uRL!yC*}LXuF^jDYBtvEV`|wvHvi$J^)XlJnITJ4N9MXu zLmbjkabnH8WHg0~S_;zT7F9a?-a0slI9`TAb6{!L%BtJ;{*48KW}D_4J7dP7@-a+w zMMY-;UZ&95mofLw5P`v%+grKdgXt99ohksf0DuqpwWEzHZiMUQGVVew(1d94Y^~N* z2WIsOYvShDt9!MOvDGN>HRD5xf8xwD=ym8$zEbv9^MsqBeQ&3w{mHFer;{<~&gF1* zE&BjkSKZNR0hucsibd8fc_R%T0e9zgh^rxVRQNtt4HLsg&V9Rcwm7y!j)u`bwrJ2H zqsBCtAg)8N;5DZVUxnFcPk%98=n@rwCsCJFIsQGH%?;s@lo9%OSch8^#%A@3>u1zz zsUjEfL>K(M2&}F%;ckOjQy0k7Y>Wa_N2i1%JibT=CU&uE3W^!(U36Wv2i}s`C5T3i ze~AyrcogvLO}Dl~D7Ei_U5e2h9@9ZRCOwnHqSd=$nvSTtoO@XyPwhbedotphRfbK$T%Btif2HGBx$BhT{B9 z={yY>BM|h_#JPFLn{lfKvV)~TTj23%?BIUl$+c7zTCQUxXW;d*Sm<}!C#(4K4QwmH zb}P3G|5p-YEd!j*fs)bSh`6G);@npBUQtZqjsqiZdJFd;uME@%SSmdEYo38te4$Su$WMcDFp!4G)L;k zOCuvrqY_NGj=8SU7o85&YvkGLQIMdqSnnLm7<(1F)pj~+>yC|<`X`BKqNMPz=t`A` z-`7H18gMguuTX6qn?Gt8kmL#RMl)upF_dA6i;6V^P7l5`m9=mi(YMD-YfVsp?VVN* z;?q#73&MA@jd={KiK|v$5cB%M&dh=n?O5VS+)@3H`AFE+Qe2@HY&%6azO-ID))yv{ zw^uO?5G1xKDDJ}3Jyk*z3p}LCgtTGEsE3#14iO{~C9K2rHfswg_P@oB!)09m&^|^D zI&|G+{i$f&h~(mPRSP?px`IRH^=RKhYSh$-hWtKd}g5}9h<(&h^ zrNH9#fXyhr4-328ax@qLRQSkdH@rgxxL({V9icfQ)eG|!e?sRr7@LejE#*%U45rJh^2E89&6T>Oruxc7njPXuI z97^eGtu}b!Wsgnm4w+#LwXH=ohOF3OtM7IrY5t?q;H^<< zI(?Nv0?)0lGTal#UI3cUbR;)n(R}VfwUJ4mFlDuoNr~vf!&0;f(gC(MSBd|&j`ls> zQ?;o;cgf(4H2(t8!4K6;ql(P3@YGK7w<;esRv#Yd`C%S~#71rDC)fQt>xiK3W{=$W z-|;fEQ3Lw6w4)7eJBzdi5xI4H+ zh%dM#cDnqedJSfdkGWH0eJmi`VK%lyZgUpsBFK!JkP55_B@1Fux7)#h4r5g^tOY7MDL3YpL zXmzRenRv1TlX)c3J)Q5bV(w#&EMiQHbeG<09x?}we4?pCjR;zzAS7?#$Z0ozsP{6) zz}XU#M1s}c@s$%F19$4billDm4`!*6`z)NAg0kt3rTQ4Aq}Zb^v}=S2uV_hOhMIno z7PsHtDSbE zN@6ic;>C*ccj@hb7V`;}x+Kh9$aE92(r)iC4~8&8{+u~z);=1zKvo+*4+{wMWZzGYQJ>L6%`aI+M~)(T`3Wn64SoEjWi;b z5)8w0O64YT7~m!mK6UIYo|S)tSb4WYGZlC*h%AVBaliW*WbjIwRg39(lelkUu#PIm zI@%uBr)f@5{UdJ zMB4&xMyhZ`{4)dpUUYCI4X2-AWq}g*MiE~j!%_pc&+BfY9@Zd5)qI0~yo!adjQ#Jn z`H%4)%xtXs*cP3#;NK=sx)A)5wO7$iMrgrzwE1}3 z6MhX6s#^_BU>hGhOM1d~TA_&4HQfAnZ8TxS^GlsHaSR2F=)oOAel@$Pl z=eE>iLrc|JR)k`}T#d%@qo|fBiyC2$7_@i$sjWc-__d6}Gn|V%?Q?&j$}3H=W&^AQOaJ-`9INd8z|MeX`1jO@Mq2Y6uH(RT*f zC5gMC>^*1r4p^IDPpB^kYZ*p^aTtl$NZ`_n(p_!x(;~~FeGPe#a(p?(@iUaFEqVy# zHID3rc^EM!+-CgMzX3Eb`BRT7h;}&2GzYP(<}9%qceCBUpB7p!yQpDXu$Q@-l~1Jn z(zrMAV-FtD^ljoq5*cLXNVzDRdvWxT;YGIX#=RDzY%hl8#DD={GV8B~C_$u`{-F2! zY@FpY;zCOdj#Mo_m8|CXSpYx-tHD3dMNSL?<@Pc-BCgY0Yq6{2t{!UaQIsp{Z)Y2y zkex24v6^c{%m&bF1a?|U6WBfgfE0rsKU@hrroI(w83o;N&8{6zEmaG%pp(cc+R&F9 z+5|<*jYTDC(Z?ar%fEGRlGxF$EXZO4?Kc|1n4@ZyDQ1I=6O`+MZn~#w8eH8CZ@;f0DI5cc$$;RahZB;YMXtZ+bVlLimN zKSP5&Kptbz9^KDVwH;yw8x}^1aWm8_#3XG6ZwiaRCst<@1U(IW%Tq`FJ6A@!(DE9z zx6WUO>Ew|`pUk}fj0BNB!WnE8yus5CiuA`jJ#n>K{e_M^h>U+7bSx9dCt9RZh}}h7 z&O7tGkj+k1)5+5PPhi_DlsGMWJK=q2{8F6}zXi8*sdcAo?M$GI2I1d)9XF_UphRX% z@8$miVL_h0&R{vVH{R>4XLn!$4l?B+t2DA=-XZD|0FFArjp(R$>A{H#CDl*mBD*dXSHlhJ^XBiJ7W9P@c@y~~;~ zyQDgQ-+~;1feqH$5Y~DLNpM3i(~V|u!?aDbr3O1>RD_-p9|q_Vj0#vAdG_XYAAa&} zJMgBpRC`pRF{s*i5V+AgD;Vg=-N{~n9OmQL8&&AaehgnBw#Jpus88EOwgZ`3k@zTG z#;hoD4M!JxF#6gSguMy_imDw?LHVz2dhq}JVi!JjqcQV7ifopU6!ZIj0yk{)uuW-M zY!1PoDzRK!Gl!`t7RLz2gZkNm%d#}MKv~-QLj~GX-?!3ka#~nwlMRUB=#axi`wlV4 zK|ZC?-J?3^t!Cmqo6g=a^~$mt8}&-IcWw17XZI~1KEMEnGQmi%GbhNg zXn>oO%ljS(bq=llv6UyI3= zRe=q&c->ov=ey_evwi{5WG7@fzZTjaeKjb%fQqaQ(%RU?M|lSp0VhyM3h8Zhn#D7G z6sj`xB{Z@8xkFukPkR&xOQB$JznB3x+|Jp;ollT|Cu|LfQ`y7$CM3z`pX^or(fwp9sA0%G(cfz9GE2}CF}cM z8C?#_w9;<0S(}3%iAJlz@$m*!t!m)`Nf|rMIPEL;y*&gsqy`&W1k!p6%rM#Bjk2G+YsguZ3LiJ2t6qD?+NG_ZJgUPA=0!l*g<+7%{2r&8VdzE zLhAo&05ul%ls0mJ4P&#gII=wL>^5dnQ-l0SdK5$BV}b@gCY<4|(}jYOI0?2W_@Gi-*2y|Nt~kmDWzILK7|o&q^$>x||DIPy21|H78tLyVN0?TXkO zY5*Zwhoi|X4iU|Wa+pdG&uC@>9iq5i0$*OQQ9Sq~pyO>Rpd+d8CcY;;?2xQ*xFIv{1KJw*d_fQ<15sMM~TeIITQ#v0T}?yF4wGJeWkS+r-FbBtvH z8#e1ALe^6N$84+(pS3m?#o8cixJos?=}mX0s59LiDm{+1W&=*GcGa_h&hID;?s1UA z02>b2Z$xrtP)3cDVVMa%BWQjzAuGmVR>E~Y0~@2zXJ_3ph7^Rne{G$M;-mX$`E!zA(Hb!3pxP-vQotI#0eWS0-1vv=V z7=CTLyntxMXQxc@Pv7w1$3C|P7kd?ap9=NJ(#fzx2M-$r)n|{uMdL% zLryiDKMjE`Be?D=`uD9uHb<0k<mXJSXvwuo}$83)SxjzGc=(qQ?8l74#sPia|{UR z_`t1~;Y2?pMO5NUQr~I-Hh59b5XUA|8;O4_Ee{UkOwQ4^2P;jN0g!mZJf}^i3Ee~> zV`u2YE;WU`3(~LssrR8`(r0Z@RM)dsmA6=+YBHG0UYgz(a}4Sm+fMYK@PJ& z0y$2-V=-U{fg0DI#m{FI$Wd6AiG{e1X{#CJ2>Su_zpz;W*r*@bAbpL0_-q$`;k6m) z`6a89ocRo`^^@SnK?zBjW^`$Y&CzLfpw(W*L48Ms@y^gv-wP}b3bUkeOJet~t*zl- zmvyI97>>{9D4D?%T7vc>(JtqOt%S_N3t5*VfFcp@@@x(Rbc|~TI_ffFcQ};6hdvuB zJ+4TnG$f-gFBtP*Fy7_x6Jl$G!5H?$N(V}@0yL8TB8!TO_;eyK+yWp9-&g#JG9-}(MSx~}K&KTqDY6QCBih*%tH&Rj z?bwSn31y=-?je9f86mtJvQi<9>>>b;y#hB9YfG>>XazAi8Y==+xVvsNLY*>pVjnVQ zbQD}Tr4BqL4mf2e2ix%0yBFcaU^}rsbHH8z0Az0)e^&sFX&i+-crEL;g$z>3)Le>06S}%krFeEvespVqwsHG)YU**Y!n~~j>O+-HXj{;0B1BL0vmEMoqw#i(Ew+L_QL3Kkex=5 zV;ws;0zP)oSs_8vd!_+qU_z)=N zePqFz5HhMtKu70E?7>z=M!9_gau_pU$FVm6bY=iY3B({ki-dh3EE{F1Fw&pId>uBZn#efh;}#C{?d%tPL_-a|7hT3P~wr z#OCOBR$z7Y2sFILOdtnS*@pv8DR~f$!TBNfQTTw7X8e&OhoIB#L~Sw|XO!?2(4n$Q zr~zb}&A}#M68NCwP-%yp7E`%fJ=4RBPr#td|9UWDTj&`}?-Aya^c(4Qf#b6jp* zrK6r3K5zDFut77gQ#9z75T!t~ojDn55=_X;9Oy?ee{>y*N)Pr-mwjF`qTekI*ytj# z(Oed=5d#`F3SShCV)bE=#oFNe5)x};3;+7CsD`(!-o`ZB9gLag+j1Q^xzdFd?BoWN zZN*1`MjmvKL%ma^vr&1=f{+yzD@$n!hcFlq_&UYR4v}cz>{$7_*c=qD@^{~~J1Ih% zI00CQHBURxe$;_T-*>-)9L6Y&W#f$s?4ac=z=HsdTL@-sUsS-x*2Nm?lDBPrAO|rv zN&_2Jt-|y3wJi^R^2@96*;~ojZR%!x4h@M`&3wFcyDd|!jC(00Wtw?72wCZ_!OF@S zG-#&XseT^e7~B1R@4#IH6<#^!^sZziroFzt2F;dY3?+O^_8CJpvppVj*hD&QtSv&C z4qIWLGgRR!q)+B^*kN|PSb~%@t#t8zcrfjOW}xHn@uf355^O|}iSrTBzXtS>=^yn= zoMyGelRS2qMRLRCS`2J#!#qaO8qM__7Ka{yWQ8~zM=|mvLAOhtB5wH;fH5B8IC(1wuwyF$n(23)BPT54D1}?8UEokBLy3=Gv5V|o?vIFB6zC9%LSFzk(ccEMf56)^uQ_p2sZLb^-_fx39P1pS`$}TSjW2BjA21 z?aW&y^0t=~%Qh<`oh9X7WNoC4+K*PN1KsWlG#X84ke-5Ypo;D&T{p_6LRnP~iqSpm z4VCT&Ew>sD0{ji=uB?F9v@(RGCeY~NBDTtSIE1t|hh07|Y=w^H<1y*D^t6Ri<}@?t ztD-;VxLx$|DHFx?$%kbC9gguaHJ}j*`-5^TxwjOSPZM7@m}IH~BqoIDKM@y}()7Ks zCtyciz=my##Q_$3I`%1}a}&y)rV>V5!)OG?ex&3ww!au(R{Nqua^LpPIaUeaNV>1; zs2si@ze6-csK(x~cV5NrKak^|1vtpcf*f@K9D4(7BQ~{fVSR4&X8{07rO2{CG z%BEr(W?In72vJ7`*+7R4a8$g$>EZ-%JbmX993SLU-=+Z@#GPP)RXkDZ-1yT|KnKNi z((=07h7;Zj9LCSXPK%LN>O%}`P3l<&UMBD-RNw}$liC3cc<8NE<>_}E%x=jcYy~~o z#FlJxyu(y`K2N%~yltp}4c0d?Cm;(?az6tb_ImzI%Pm^<5RBuoOSo zM3AEgi!eHB3&DqW)2*bpG0lkbOM-0yejZ=xz~MH|MB%mT2mS#AIh1onFNlQtu8(Oy z$Z;7519Y{hfAzfm%#2OvpJj!Y>wanu{fxT6jC`Ds}$!AY;(Kq1`DpYI^D$J z%$V(4(!g&t7_d;i8GP74M>=dJVs}KSk;=+Lbr@SdgB=zV9hZO(hx$-rb2OmL3syJK z5i>OusNq=W$nLLln|0r%n;u~U9NOO&2DHd{pNy{*Dh8vPT+{DnsCH_!HDf>|sv*>A zivTu^MJx_aWb|FJFAkvvO4t)*mQN{cUlVKxGkJ}z-J}+>O{It(E8Q8Wcy;kUQRWoK zJa_c2ZB}J(l&olW1)v_=KL7_=9>{S|0~}-oaySTbh#Zh(e&1Id2yi2@MGl*zi8F-F zRYDj|I7WzQ{8+^fa-$rJyHH~t108XT8UY=|hA^pOD^#(lD2b6ib>|{Hx_u+DUZ$40 zMnadrm-ddNtGi^|;!cJZ$Vw|ok%@JY1*bYXB5w=My62!M=E zYw}xSjb5OvC@-|n!o>xNhZX`G_UwZM$O=a>&Wjo>+nsuLC!~;gqOooxz_A63XlUuS zH}Tn6X?r!a50ggvEWKgCp)Y4vS7D{8m_dEthh2Qe!+q}r)4g(P1vZSS*%Wkc$9?GG zpPeBk4Pe-84*Eu$4DX30tXZ6{^NS$Kxh+z%I;}rrn zc6qrLtNPgK@|XJ#{Jk%(!)I?-)3P!DTgVL!>UhJ)`nqjsCD-?uwjhCRCr+T zsrx_-j#i@u4FozIr`+wO>p1H7A@KJ|AhLpud;;N>?gqI*-BtrZ9Ti%V2XK%@;Iw9} z(7BpnXgZ@x8t6#>#{1Dg%UGvWk0;S4jtnkqbFA}(W|XC5iW#88Uq1$+*MzEOfDNHz ziy7E()F=J98qjcEE(PQYhn;mk-gxB*_^U^-4o&daj^dP0h^cv zGp?cq;2Hod0m6d1CVB~qzztI(`%BUkz%kPIs>D^b3b7-Kl!zJ27!*p29< zNS`AJqb4|7ZJN=TW)Z+)+juzOFcr4wRkhk+k=3Rr!&b=XQ5vCtH4MVox5xoH6q}=q z0Mx41Hz@zYj@LI}bo5kdpu^Gru3~IB%;upf+A9{Y@)OCeu*6Kdui_3m5&Z|fQ~Z(Rg$_l^#k);<=! z@5)J6*V4LDRm|JI4ei@kLHLVHcWl}Weg<3#?R5l+B3#$_nyT>%Ep`SyubR-3YR?io z2kntgZJXr8!laS^?hl5EZOUFz2ge%3;Nb1>o({LMZ63gkHcvY{Z)dju01mP=$Z?+l z9Aw!b$2>mi-h&%t^F65Pu$4wzrE4Op7&iui&Zgp+hev9VLqvlNfH-W$*5{y(-)lE> zQ1@BRL?jj)*y=xd_X@lbQSC;cGQLoQE;YEqj16=`gl25Cnr(Qva}>_E4{;~$5Q_sF z8`&hvn5T3&_>)f7flxD67zL(PQZ;UTdIVSyg)_tf_i(HMj{s*bMoiIU(1QUGQWwYH zIF*_LLqZK?Q1}XWYWUfM5nS{);T8?t3FHVuW{q%gjR7}oW=G<##a~`&oq*>$=V8~G zA$8ysGr)#gPCK{4n%zrtln9A;et=rE%1R(YWZ=wtMo`ZU=F$u>ORf3y}sh6eWKYq+jixt;gB zhndw8bXGHeH^7FY{b81Iqi}4jdjo+DN_W~ozjJ*4jW9m`2m~k2VZTnIsEQ3k^Jjwn zKTshl8gw))VAiA$V^%OP2k|m_J?u}?I{Hs*l@RdZ^md?e`x3Nnd>!209i>wtR9H0w z9a7Pa$^adt6W6$V4H^h;IR4_aV{GPyy^dKNEBaXgNQ9k)kYoa@jgr1)w9-1^7$hmE zPwto4I5X0q!Zk6#906dSr^4cCXob7z&!oMP+VRXbj~}u>0S+=7%CIcC`JPsIbr_3`FJ7UTYKOT-a z_Lcw;&KFOERsurC3j9!me_!oeqw@p&{#tMg?)cl-5h{%ihnXBI1B(JWlF!f>fxEA^ zPs6LNlM4klvYlCLy@VvNVRu5po*B#rHj?{I)nUQlMgyN20yn%G^){v%fg6;9kIwki z$||hUvnZ5kSdT!CaIZlQOEi-{jX9wmtZXudL1( zj#AvVjHtLJjLd4IV3iJKjce|_MsLBRfjT|P)G=cH8t=& zNL;(&CENY700;R!qv1g7Z^f1dI&8*9I&4K3is<~5S*14$wD4##(7~BjoK=-+MS~<& zENFIMbm#>5>v3qW4Q>!q!*OF^!^4R(vAz!eIRrKyc?dglh$YNqU|)aI_5_p=gBX+_>F(Ty&efNo zb@LVd{%XHmC}y(K(lgg2zBZ0OM34l5jh#*QKNn#M&}*U{(e)q}$01^Ih{QILPbrd< zXZE)7gsQb|8EQtlL{3qjxQw3bYR{FcwKs^7GuXoWIX5Zh0mzYMrv13@01h$(a+HnL zvrVS4!%O~zp=#6Ad=(4SE%jt38r06I(uBZZ1XBnHQ{&Zyj( zWP=-Ke~#{OPT?%@<2yIur0gSj(SeQ5Iy|+q0jsSpgBqgU0fzt$1Uj5fo52kSJ14hA zYz~hpWNP11X=mtg6d>jWff5L67!V`mb-r5GX?0nXgIF756|%yiE4Vzy4xa#z(E!Vj z#@tC!c?OUO$RNf>sKgZs?AXHkzc#)Jec1yiR4_jQ9gewn__^tMIJDb1$68Mn}h66of*R4 zd2+`JTY+j;0}w(0N9$n+8poXnAV;cn8uvKCk^APHWJ7z8msCv_9VGBIM@dA_CjJ`bCN%;qpQj zZgG7`0F!-N1U4GzH+XnW25fbeIafe;0h@Zehy{OMY_17dZ& z0^MsbqHjvioYv)FmtE=O@nq!g7Bn}ngNNl8WyQdTYGqlRFVVIM z*CDkZdv*4g$$FMATCJSr1N(EcH_|(u$7c0^_AkIeM(^2u32>0j0&>WVy_B~_T;lp1 zbK6`*O(|8A*VY48qQ)_cgG?rnb{(;zzehnVD*jMVRu3xDo}B z5OEo?HUb8ED5pJt;!Fpx3vdR0q`(Tp=ulxj0e3zM98zFMz)(EV+tA6Tjtl?7F%u1y zKq>u6sY6#(2X!^L1DAu__#FWz5?n+u5L_QsSN1 zGlOQ|B5yy%wL)iRz|4(M)*Ay#kK-c6M9UbReqSrrAHnDFXcrwweirp__^vW^tUiYdXH;wx zTYNNq4Ex$Djf@ra4_7L)IT&EknY-lrAqb9~0B3a-Cq-QF8ZM09{5}ZIKMl<;J{#zB zwwnlYF~H&CGeG_Y0wF?$YYV!j_(vhsA)kj(U-Osa#&ruR4CNLyw(o#r0JjDB zL1loAs0_qHp)_aLK5SSVG0V&hJi^4JS?p8V$4nkKDa|wpvX%gPqS04FWht;#daQ zK*z*EFvD3{MNnfEnrmy|9$EztJ1aq1EU07H?O~@e)F4K{tPRr6P{4*_UJzS@927aC z^#<%PK*(6LI&`Q?KxM-SBnh-=6vs{CI_kg%=mdUhgvQD9;tZKo70y;?KH{_XNyS-2EE9?9H zU=*IxrpXd-dY?felf>rmIGt?rHy-@=`}=~$k=EU4YTXUj$$ogt0vu!{GD>Wfbib7e zNTkA6va+oh-;`IUiTeDu&~?W6yI{;TxED10TCC*TC&n+0t9j?GnkCRfz`mojcs&HP#vjv^KNtXq+jfuteYh`8g&M-Np9mVEwG|iiU z3Wqb2I7&I(b2tsGNeQcdb8#D&bubv@u(Ucf+|J9w>Ojqa(+ouH^@$~syqW||QAbRn z1vG2Y#E$tXJmilcxN(^BwqxhxtgnH0=n%L^4ngzC5on(~1>J`qg4WrS&^nEO=gvUu zumwaX zfsI7}A`KW4xgd%CPN^YYk0JhT;U%jP+z?7kl;Vrq`vBY^Gawx~HUoUNC`_f{nzYtL zvvu{%)#8BCn6at~AYHIHrk0)FLM3qHMxpld6D zv+WSXVlHoNS^Foa>NWyPuc6c1$07}4cR1PQ?*Wh_?1j*OZWsDr+=20x(R}G%YXm_^ zXXD47Jp}*ymF2NEZ1#m|ixYzjX?hyf>rl6hFd%~+>3wB=zu%1gn-TyA>zuIgxe8H8 zgRs=zhgxh@?9m@E6C#AsSm|1j?gpiVrO=DKZ72hTe)gi{LVO*}cjW_G z%esEC7X*n3HLi=R^iG0MMovmryB&ifvb(^1{htkNWKWo>1KKR$ET59UW8Xy#4q|gymrGaK)K?_0QJz&eB{9o( zCCbtH40j|fNZzCdoBh7;M|##-AyJK=Zb(cc zoIN16t0v;@bYsP96Ar43(vL-JCkETLV-T-(S-ILtfEypej_%K4XWgV(mbF!I4?+E_Bx&jV`t>At*>;z{W!Vx*fnvp>u#(1ni zjd8pTnwdc$2LU65m5@a9z?*1YNWa8W==u!XaQmvDyg zMxbUVJCt#1+Q9{s0T$v9F=c-l>uUfxMi++A|56YCb|JW{*l>_tw0`yj zA<*KZmH;XByP*<{+$*CH57K}lfPi#2I;^`P3fsI&00)59AuDF;O$}SIueBM+3I)Wu zI)jNHn2Doepo8m#6DRa1fbL_=Sd2E2D&(1bOP51Y@Vc~{&^UAiZvLsi0rJUrU>lC0 zM#qIi2yPs~$&zC$E}U3%;mnZ^oIlorbNKxv{(h_}V7=ie1_$#a1=ys8P@fOg-iZE^ zm&m#r`gB+$2h4jaq6-i+X!Q76MHx`?>M{eTvp)1aQzhQo_Y&3wy%NL z-_+i?y4DfnrjkD?6W2NIS7wGKr4lZoUxzy{ZQ{&WJu8MbUVh8j=-1o<^Gj%$v;H#aZraXu(P6+vP4B>?ToE$@V9#qQkpXYGlm-M zpo|wI1#Tz}4nNZ8kS3%>DnU~2m4Yy8rTH3gC!=Bqm5{YmNRkFM=-N@{8PIGFP3Qod z;&~JoA7_xmg@FxfKn!ve4UQ7D{T$~t8`!Y?WUGHlQwl|5f3tK#lJ!P{V2g!C>oSgw zMu%mk-B99bR_*r7A8E+YRqCPBNje+^a>UQS!xUSdg-Q+B=lP@5af010QTzEYP!;;n z#~!^m>a#H1qHIxYjyeDiV_(_v;Aby%_~n1gY5*-Kbuo!JH7+|`n47K z@#oj!*}LUv{dJiEEkv}O0z4Go4$|Q&{O(FM5$y4dvj()6;?wMZ<968fBH`jP#%vA( zG6XPCt@fk(;Jr#2Oa4WF=yRAXy>=9q((;_b_D&$^Md2x>&z+tftqU=|=w$nCKXcqW zS>tXs5LZox!%SY4nIe?QOmoK1nP}4mO+*cNAC73~6u)Y}Hn>55P4pSWxyRw=$NwfY z4;_PbY$p$Qh_T_qM#qB<1T)SYZNp<59e8ZL0dGK{yf0% z8@%tJv~Nt9iuweVDTTg+8r-vN8~H?`(ApZxcck#-q+h04y&4^m1aMHMK&(IcufS|# zGchIjd)R2g?&+tPPSU<}fq@Sj>BNulT=HW^XfPInbt0ymBv0{755f*kmFd;?ktXtd6rhQ{er&^UUC)5Z!* z0E|LMqzIU{N3BmtAOT@xjQi9HBbw1S?8|h96BG4*%->rMAj+l9@X+{815NvZw*t(2rV$#6o#TM@eqg&K& zxHz*Gz#Y85Ew2F`3*?|@q~o=r=MV64o8K{3VJVBz+@R-UjMEi877|^&6Q6cs&G*UY zF^t*~GIEHM4!d!PCy!AV*zr$a?ZVGq?7&}pWS7NAlP6MQ2T@xLrL3shtW$9*;6HaA zLA6J)O+AHeiYHSW8dO#<+s{n&RWGQ9C{;#gSHxZ~GmaVU&#rR_;~6CBRloDkw%h7ogPtQiAM&*8s1!CW$KXC2eO z6hAk4dJPGnL#n}dXxeb&GYa5P-%iVcoxwQX7GhsB>sacs-{E`XIEPdf9nhK^j%IE& z0M0%Rx4-wVKzp^zYzzuJIox#MNXLOg-3FXJ(t?K()Hu(K4F}ddl^#}TpKR9`%)q!i za^Nm8GzsvMpoB!}(=1b;slPM$!JiZ^=CB@HNE0B^XyIv!HJJX4SR$dyUP$LCltU(4 z2uN)lfe+0viUT zGVM_WVi^BYB-<;!CHmXgM-d3`Il3OniIU0y$E;Rz-+9G&crZLD?PsdfJ;3$=;D{{b zxPK))It$2g?{)qZqDQnUuNALLc1Bj`C9DCjenB{FLugEx2n`Nc1M;MEn-6rvV2NWw zQyARv;6qsU;|Mf}?h1n&1Z=p64sqy76C3u%G5kAzRIxUW9tMXprkDYZ8Ni3E=)@wU z;~RIF!C?ePC4(Dd#pEEcW8^E{4F)x|?uHIa2{pv7ItHDiTLPzc#cBx{ z)ClPs;l+_c33pIq-dX9uus?zkF-eHgLFuwcj1+g_;XeLMe+WOs_MSw9ru@aAO~18fhdf;?S>R4q2 za6$j#FU&UZ6gx<4wzn&dK<0Q^po>O2);=p?da*VHz zSyN+tWjv{?F&CYsL>W=8JOLa3?3LAphN5s4azJW`Kn!~z0j42`IBj>_){8{@4bkAn z7`2-;0B+#DCo#%V7~X@PPC28tB4piyR`qSUT^uo+ql3T(rIT$m3E&{H(dAvy;RpfE zu^K3IO4vqYVZgtm*|udvaq`-58H`u>KaAW-D_rUhI`~Y-TS705%3l2%)KM#(sHR0rX10G*>;L)xN$6GF^iS zxFMB~Ee)$ewWngGi?ci)$U9pqj5>1U)YaKN{T3LnZNQ1o{D-L^$MnfERjC+gQpXBq zoNZ4vN3otr0w0kU=B)QO?oR?6wc7pKpcPuur$4CnAVei)Gy|`~Rq|$EvTpb?-;m`! zaFG^A3kq1qB0??f_RjdKQG*y4)7wErhXZTYNG&rC9S=N&&Xz(ku-N&uuv2~tzyG=6 zh_j?P>#NXUG10>eWVDYT;}8`JMe&Xx$gyz@+-{d=P2wI;JA)(~+UvpS>UHS9b^*rM zZh*hD3$j0ekW#stKLd1V1_xzJ0Yky0lZ`%=!^q9Kq4%1$nZON3di42f;DZ4Xp?>G< zrhn&|BB9cWDfC@L*N>c&w_sgfMdx!{56IMv2SoJ3yupo3fEng`#Gxixz(yz~$bwD? zpo-2$sy>9&6LTZjg7{+1XXLXHu(8tGyEL$~7*WINGE%4ty#*Ai;#h4Fx?lV~lseN+ zMO!4e;dA=eEv)-sPiK4cLRR!QNIGE2D-o9!ncHX4o~s&#BQ>!t>LWP$+qc^I*MUbm zK8ukiD-Mgboc#wlV>Y@R!0;8EvEB{UZ2qbfZzOVdkX|pc%H(z=6Uzi<3}2)Wlpcqm z%&o1lpoZYHcbf3yUs;ErySR7(QIRntEiDFyTBm_KfCQ+K1U4YCjWIn|N}1}1Srl7` z(%r9Y4&hV}Q?ZS%8?p4Lr*?JxZ<#QTI*ha`dRljbZm|m46s6iS4$mPCj*919Mu#K+ znAvSGn;8^aO%46gGfK}iXT3G-UxQAU@z&QfPS33e5@ zF?jWL1UIgOPYezNZcwO-*4zknSW1+BD*`oAh_ptfolwP3f&n?KhMn0cvTA4-Q7~?>kLqa!_ok8T`gKDUG;W13Ve8 zPfqs9Ty#BaU-9?qX21ho#Ux90fzz>F=O}HaoMVE}MzX!62iRnlLf}dF^~vpo2ikh8D)N z?Q6Rp{N?A4!F$$6@FNdx!FvvmC#qLyv);}r`24KDJNPEoNPOAw5hVBq+c5~*M;{P z(TO{w5H`mlf}aw00!o!G)gStj%-jfMq{R{VDuhMpZb%JmXy%3#dZI}QjtZTsFUC0N z`~uB(7Ex2nEMd?(7U&yeEkNw<@)guS^744~1YG{WUxHJg`d`88-%T<(G8(s}4=5AB zMv}3S^ndMeIs>*&?r(OV@`2TDsXqJw*#m$h)2Lw?soc>{Gq=qBVAM{HOJ(Yu)aOWa zo{{6L8s7x?AuO;%gBqYaEXPrzXV4HhgP_uO{a?p@=-{B<=^}_hSy0wjm8j^(5%3PJ zDR86H2GK%*!&R9}2$T@IAr6UUL7^stK8&thhyKg2LjTnZFurjMf*uYUDStbKq>O!) z7M55WOivBCx1sG7O0FGA9nT7uBN=LdfX_|F2sUe!nD#;g>)i7=O1p!@S0t&~Q(=dX zN2z4PHg=Z%k-A>gQDOawlt@qK58(QL(P_ah$7|AHL=9q12bTsm%&o{m*Au`-d~4&y znmZxNl;VdwwSgNncqGs{p1{vM66?8y%<(Tz2JbdPf)@+*sIode;Qx4=%&!+)6 z>N9d=`lDUg#dmUBw`~Bg8L_IMd?J1p#k#=$I|s0`M%QhAYUh}gsoLDHK^Rdi4c>iqltc0tFc&c zgO4oA>u}^*Ay{nz9mbzAKu3$j#1ZHqy^;9wmQj0c+Hey_!|W7+WmjFe^Id-lS}UtK zu^`|Og`*I_(NW;W5&S%YzUT&CzYPR8C=IMD;xjZrBQY?x5wUo^AHa*-K3weuu#F%` zFHoT=L(SG02U=`2fQYSOz!3&HBJk3%YlVKhgJ`{C_bRZ1_2mfsa4379!(q*wbA~3r zh^ay4SGy|H%GQ=@5y=0Pda}-I!p*mRFP!+oe*}ROEat=}`%HT|_9@fAM(k@EztY-| z1~;-8AP=mp&Hipxvn-HfS;wB;9snG&`3sD%!7rvn}$?35Cg1x1e@h6Xb?x{A5cY;xx+N!Y2^ z=Z2g_mk3>;@5J2jH#cGM+C>gc@o(G)e}}TC;DB*B(rICph$x4nXyyi2)BqdCnY4XQ znas;Aq^9#yXQ~l+Vai4ww4PgM)LqB_b4R6}1T5UZK|9Sb4-kN%V}wMhA=U_13C|Qk zjxqfEZWH<}OqHxtbRYB~!vwHl&INRzliYTZ=z0+Lu!G;keT|?FBd43d4Wg+YbR(dq zjldS^acto;>2g>@vbpvUprvaHeJ5+X@45T?t*jT=B94b;@8e>iICb z5U+DLTm+V}t?oL!AMa?)77Dhpts3KJKUBcR-B1OZm#ltes|;*RFM4_C!q2?23cqx< z1B-0Flw;VtPPOmfDKU*rJ?E(kW9}v(d>79&uV&D!*vmjkHzO;mETpK!^GwIW4?E zpRq?-?=0UX^1B?JL5#EGpihZD7r zBZe&{HMb(V|LkN6Fix}(nhgyxYZ|z2bT5Vy{kfqqyeZy7_V%=^|yZ< zjz9DB;Eo173nxvOwB^Vr85=g3n({RTBtRPTeBWEZMiu~Yui1V($LRpe1AwE@vOtc5 z{1Pt5<^ehs`$0JmYHO7>#l;!Wr@Rop#S1{RR+aX~8ZkH&z|lCoj?Q%l!HqV98!BHr zb`zP$YSR}e0h69|n*s2BGpqde= zu}Yaz?g4Pa7*U9W(1qR65So;x4`+{@R0rdU1_NJG_BDHF(qzrx2ECudaUUJF9@g(b zsG+h{cj8_m_PfqZibu2yCS7m#%mDF9CFvdHqD9LM6&qV}r=lIYmw2&Dov> zQB<9Z)vs)2fQ^v?Hhxh98;f-D^1@M~K?8s_o15rla#Ev+&#A()({+F(nk8Q(DW(PR<}!C^nqpp zH)eguqA-=3`iU|?hw;mdZp>P{2|L3vXH1D%#&Kx1+i>}>|DhiMdHzk%bxE+)jZ?y| zBGA!oAh-dr>Jd9c9fox?!dRz*V3Z-A=H@7bD+p+Ob!&{^MgUj(KJ54wbAvTEfVI^a z)X?At6NAH0C*U(6hg5#Db~%-hy@=VvR3u~vQipqMUz+iG2}(;a z!`d1MVserY}3cd zCC&2b?^!!o=lB5Nm}*5#j%C}ydU+;+4(odk&>^D~v+>}cW;Ghvv3%SeBO>2Y42>>= z87r$SB-%J~7##XeVJSE}At*e7QRk4E7(vie8X6Qc+#evgaR>anTi|c)Lb$sNK7t@& z-(*aou#~ZC@R_xtJ;gAL97}a>5FzaRUH@aVH|)jei`3mA53aNjoMx`j;59H*c{fzF zRfa^Aup5CIr10(G`Hv}$Eq5ZJ(uzVS;!Svtuj93P7M;xy)c&P4tC8-6RCPjY5Ro<8 zSAQoINCY>+Ev$d3*r!6H>qw~#+s%WKDW$3ri-TtQh{e(L8aT5wso>vm8vHp5CqWJ= z>($%{LLX%-DD}1~#li)^2&g zhF%f1$#ytO%pgoLHd5Q9kCSI&jUmu*(B+oV*xg zzr8is!E5MaTfYMNLigp2+UFhYH_ScnHe1ke4d)=vG_puz1_!o>LCw-kRe%o8u!4j6 zZ3H<;Xq6|=bQ|t)=pYXI&pZje_kAC;Ggg`|ta8>Amw}DLD-Br3E_MYc9B>sv1cF(U zx5t#)HN^f`>10rLlucasdN1I=3;1_qK%psC#uQ)bOerc{B+&XA5XJ)UhD9rFU;`jx zascQ+7rz)_!?c(jo)X&Z6b;}|Rv2V{=CXq%^t42n7t+ z&%m80z6lP$@H=1})yM~y`uHV*jpThZAXB}5<^C|M4ZdgX;GE+FfTNV{Cy?XdSy5+{ z20BbEyqa-PX<^ zY)9E1P%NG{NZK~Ozga7|L86@E9_>@;ygCSS?1n0JtVaWAuQ5^1%K$mlQ&SJXVM0=N zhub&{HHL$1)7Tsays%&FXs|f(pcxPZI5UdpI4J@}H6hX>i-3;f7SORE_CnOOF;L@x zwAV?{?6A0OL;+8;LG(418BjavdJy?8Bxc&wzLDwoNtdDAOQe|?vz)8e;g}2wtjF?vOEs?(`)Tz1 zDr<6>XHvD>E`kiGH z!SX4!M{C$7Lf*%~hHVE20GQnl#yQ?M0LT2d;{nJquT29wB3C$yeOCjARcv#=*Y&Y8 zYBAz02;k^;8QAdF;%q6xRcTeZqadJysF?_EgrvFA>oKSi?x@dzSR1{80yc(YW_Tzu zQ3Gy(M%5Fow0$;l=M#O()OV{~w3W4>9i-4g#f^hcpQPDA6Yw$+402G1<*3P1XyA45 zH3&n3QXIR9g%SFIZy);bADYdmmsEYBxyF-}!lXmIxDJTkAK$-=)tX z!!WNb5JXCQA2k9UH@f`yks|~6GiP?-J!>Vxyhsb$m9p%b^Bi!-%S! z1Uu|~S*IVhox*^qLTL-}3@fO?mSJ&lo1{}&3ezS!YOi)bUg~O=ZN_kCFYbEqzg}E{ zU%Iw;z=i=UMB=+uMt2lp2JkVDh^XoZ>T_7>c6G4LBCw->4~DG}a6n-yUSoCuB5lMZ zXtvrg9Q2`w0LM7ogw@sxG`ucUHKn_uSTqE>u8`n*qWy8eFx3`q1dy^G+5*$zrrUD^ zYDn{+RAD5YrVGM%_<3ZV3J3eu_k0ZC_;~~{NS_3+6;7J0H62)6^_a;);0Eb!G#vGg zQ4cr@iIo8?u)7mT&XBS-4*8FOjV%pq^bK=^o|iz0k1Ezi7=Z*TVmTIg*CzxvKnya? z-Y`C$)oL5Z6HMD0YhIAQ5bDO1nH>S?xM_ctbUTRsJRY;~z5*=>{0MmY&Xa!(j&I!n zx3{VHsX-OfE(u-LFs@4SzT6MMhVcxH**(?0YWx3Q-t(h_dT)UZa!|*1uRp+xvFU@0 zI8`Ij8^1#gaTXibQv4|XIh_{&HP+Ucxd9E$+@R4vZO`n6F*7qLBMN~TBrF>44w%WI zz7um}Xn`9+1a5F69)SaKN1?u(lPGhdIiL0_?cj$N4c>O_oe1z@z6S)C&xvfc{BS9s}-bVt|aAKxLs6h(`GT5JW*r}!O zp<#5marp@3km*BN!an9x57G^p+~JvI7hL@t%^?a6Dmg+6Fo$*;adn^xuw%x{`q|AU z{LF<_{+!7w95?IvngG$IOpR^KI$K;cj1MlefenBvZFx;hgw%Ie&zz6$v9J}&s75S~ zIsp!PCJ5jdkA{4I$M|=5u!GlcjD6i&>5!GQ?#4>Hlhfw77L#Lf7U^&Vi`Q$)0uIwc zq~tqLm`I5Is90Tx-uu5FK@A7mIN;0^*a&|tP_2Vl=L{Of4^cryI4IhP# zFaCm&xXItun$6EW2e1Cif3F==(?F?D zLn%~OMJQ^aP#q%mMZ|0&Y9oj5v~V_pl#Fpe>H!yiF_=SA$Sdmvb)Tbfx|8PC)$ z3ti{%hG44}aD!&cyR8NbaNci5p(=FW8RVeUv0f{)9D%RYu#eGEkuzTJdnqJknq>hG zSz#-o)(4{ZvBBVmV-4uz@&b%gop$s@LbIbTpyRXKP5A6rHW=Xe-i=-O*zvwTiTrJn zz=mdPNCi|V5JQ6;1ZLnsAfRQ}QQAI~6@l9%{BtFEYj{moa7%2bofdA@mUdI8jw5wj zN)G-2Kl*q*$N0C4K6M|j<3KYID4iiFJt77-81Rs!yUf3H+Hf17RjH<;lPPsYb)o-y zqYJ-ywGE%yTs$K)4Qxo6WCt36BFV~#*&GJkm<&hB07;;FTVB(nm}|u3pe$E|dn9ay zu5YLr5_MiWPI1~bvKB);TGQ9#e*Cq`0j8UvYdV-Zvstf zwhC!=t+X51cDbSQ9>ass-P;(Sma;9;`Q}`!Ubm8p0o59l)=? zx(k1BWdLdn0&(ACmLs1vx)PwmR8$(`sLc>oU!=i$rLTmoJAxeY&L%sX+%JSGOnSV2 z7J4V&44o@q)}s4DgRUCDPhI=_8`!XISs=#)%d!U=95Wj=T0&-3DBZnjlk{!L zh(ED6zM&Do3Odo0?#rRs5}e^+CI?aKniQI%nHy^4pj4;{xS-IK{y+g5^oihx&)|mA z+z28;QKh*-+aCM&kAS;coenyS9e(#)8RWQwf2K=Pkvc+669^?O%7hf5Wc_$1B+&Dv zG|0f^CSC)7tOQ9z%HvMkV#n0Pj_utz`~FEi^UB?q)d?;G*ic6C$`qE;gL%z!5!}Gp zz=nH&b{O=0kQ25$^f|t|K>}%FvI(cVt+K1oY!l7KRJ*_U260GAe>6Y`t!8z&eQeX1 zWwh4g>?lINo1xbGVbl@q3@lNbmin%Cxj>);|9rjZm27(cu0WZ|KI<&9QfV0w?U6edJ zP{PNO85)TJJN}I~u`WIQyCcBAi*4Ola5<_0fgKEdPDARcG{L<#9B_F8NcS5#l) zoxp+Lz0-w%dGRn@9;(4&6R#05l@^f^C=1xI*Xu76X%=~z5pAeF9Az)9P5K=8{tW%_ zz=y4Hx>%eTaozgdXeBs`?-@?q_48hR8l zLly^eus=s_$r7_}Wwoy?da6Ta+|?t{d-r#ve~F+HrF}(Uqm2_M6vonNkyx}~=7uAZ z;0A@J^n3y{6v#m#D!ab^GnyN|Dod{A8`eGezB6t3Q|G&-0FAUgeXPZQfBC6HaAA84 z|LAjf;6HqAOM@IT0dgoGIOeNFDP%Q(#h`_+J|Q%jS2P=r+I#Y~yZC%<@2VYYr;&^U_)JAk#EN!xEVYW~bL=yCQV9T?67T{R?>!qBv<$@gduBicl{-RN3 zO8NP14mPHwIY3Me5)q|v6q=PlfWy(*Qn&**Sx!htgF;V8Sd>AIJ~KF!nCMV3JBYp+ zF*gF{*ioatEO5h^yS4%VNi7dUgXB*w62;k7LaoWcLQW1l{wlTwUt+v2Bjyged@d@_ zn1FZTxjl>5=Z;XRE~8xM+LqA?`N1~MVC>?t0+{Emq#3|Y%VX!bt^wgeG^58c@Q2VJ zH#loS*40qj5DmWMRX`3u7{dU;jRAri0m%Du1|}S;X`n-2&MN~C z{@cw}`1jWi!FJ##exruebDKcjiR#nm13T<{nFcn@?*=f7zgyeNNI4*p_SGz80UH4G zwdZx}Z{!~X_@a~3NohH$&l-^s_yKKVj1EVg00$WX0Uex4-`>0vt)qK8!e`R&@4#v+ z;4CX?+RYICnxU`Wa{^*J&1R-n)1+zfNp+;05>5n&&SE?{L+#0)XgC=ztgb(`Sy-3e z8{P*_dxhV70yEm!U6KYzr|Urrzc&SNHY~mcrd06Ff@43(+w2%g0K+03)lT7fSK=ubceJ^3lP{);D!%#fg3oh zLIZi{J_k3*I8K}OI6~NFJq`~6k8B5uW~w|;^!sTb2R#$xU5iUsRsT43C#{;p^P;=)N!oMMe^O8_gUY@LI2NPTY;aux&q&`(Swg| z^x@ry#-Jbt6=o7f3=Nlo4FWgoFE_-mTyJ~Q-wY& z?Ib#%&G&ws*`UPIpwAZin5`!Lxk_6}Kc}JE2?G}c9iFnwtPKiF37O5&XTebd?0`i@ z>9Gi~4XP8|uFl=yjoTo+;dfQ@##~y)ja(je%x!3@y!# zKs(pk;WpsHGVPUr@$Ug38LOTcG({bf9uTSNQ9YzkowU!I94fCEu{Z*?f@fdxBzc>s zuw(iIe9K9TBNB-e&ce@^zzx#ffEhw0Y*XMyBg&{#pB>!yl&%A(jve~2GwQQ5+;kf` zWof>>$@e~h>}(q$J}blV0Kttu0w=+PSr}~;iqddYTcossQcQ~!&|$y~p;vK)fqu-Q zFc%$4mu7URL2R;YU91k;{FiTZ;FoW8;SA3H{_wdzeDE+1kkFYAh^av!2hKtVluGg; zfYtM)t3h6_$C;@Fg+VzU52h&V0H+spP3RkFbVD%?n8^}N`GqPZg#ZH0l!H)-IftRe zp2KAdJqcaijt7cTZCD@#$27YLc07up^usuaxZyIhV|&H#cs~Z0vmcE@eFCQ21uhiC}4uMv7B%eu@nZ!#8GwV zW!Iy=OmIeu-~hEftiwUiGCs$|2&mKOZZw)L7?Cd%B*O%$E$@v-2=r~jYG;k#&p!D$ z8YCld!<(r-6e&?W#IUvLUhA(kjj z9#9ks3mpq?;y5&g{u1EEScRzcwBE)bh&49?4Mg1?k~W9rG_#Aaht?bLU;e~7_!Iy6 z0$kV{TYv^cfQMm(sV^F?k&2N+%Tnueuoj1A@!(mo-V%j>%fVP>@B?-!`T6KQ@(r;1 z)!$&un=ed!rQv~vaBS)aWFcaqFOHYae4r9%wr}z#jrRyECV~EcjGLDM9118 z3MdIxk=_P&MzQV&C?`13jx;edMnl%$kV6aHppcaDNNaBRoMpwZH`tcUk$n}xjlq@c z84s*fA(Idh3qfUt3$Iil^1*l3t|hO_*9Gn-a7 z(4l561ve(w{098LF0^6&nt%^)gz!D5d^p?2^F0r+_87J_9hZS*mjE+*W>~}+jL9#@B~Z1%RWy&`Q39+I=}Mw7yLXYMZz$WikR5Go}r zy+>iNJYA2KxtnOR`O)?jc0+ZGDR6H4HinN{qMNv*x10FE9`BvFV; z&tyvRB@5@;f}%Qk9enxj7~Z$BI1%IX2y*<>KXwZK#4lXn?-7<^zVL$GM`<<(ot4z- zV;!Ld>ZM}7F+&gAo>m*%X_^$&%sipm>cNRO!s^SP1R!7Ay0&rKb-(%$RnGkZ$gvD7 z0dO3AaAR3DcmQ(DW)ZN#Uw|1LC$Yai3Yv`|RJvFWQz0!5$I)Q4W^WL%L2QgMg{CM5 zhY3j`MhAzjj1;&*@!wMSKuYjVS+KJU%do-a>u}-U{Sp8qwKr@QM+9;RD`ZvmODw3T zKn`6HRA)>;I#HcGGx?pGsc&lQHX zF$pMS0Sz%LL%+KsHMrHpZ==tV20HW(GxnbkbVOy!z89L7O&&eX?9z;7(DdLBh8_$N zMEK!v+=8RW$nhs;T$BGC1~*hFAZ2baOb!<3!`V*yqo$d{~*XsyW z_PI@>z;>xpwD9?L*MPwce}q6S&UlUx@CY@MLA&BBAvM&?3<})_lECsI3S$|;wL4At zx1T=@zy9i)I;^^S+(&R2Uk%QrVcr1O#N`=#%2MqICWIvhxDsZ86lq|?PW!s7aFpzm zgFQFH=Af_@4+rc}#4MurgVVxl?G4V7 zqD4lTxe-cEJ4*!GfSW@dUWVWQ=;m;t00-Fz&voGgXS?wG7k14_C;UojfDU^ZbiX2` z*5S~77q8cB4{GySH$}1T_-Y9Sg7nV34Z5#gyvK$~uzc)Kx}=5Z3YEb6Ea02sIViSqO_mN}|n@x_5tON8AQCoJujo_n#R( z4$_qAjR&m9(ec`OrPV-J;(!%=bkMe8ci7`BDGyj1N|cW%%1XbXn6RG)I`YC+BJhKM z1OR(>-f94%W0eFt>@sOfgC`6~@XRTJ5)QW!4Fp1u9d_YweEVH^?_(q!O29@79DH_! zXO^-5BA|l-4-XnG5_(qPM(j*UP-&YKupu;J@pGJ?PMtvBH5mwNCoKXn|o z2aX1Zbt@XN)4oA!%#AGt5EYlJ|u%0LzpL`s~Ya7s|aA=)Xg`iO1X#3Ik9fR+E zeK&)>A!A?z)OU4n1-D-Yp%4&fM1fGHj8$|w>=VYLsQ*%|JbW)tyct$r|E!u=Y6gZ*@yY-P>u;zmDa_ztaD%+%fb}_;J80sa!JcKs4(#f6200d)Nrl)OSN`j7 zK{Q*Q?1Pe~sqH$O7aJ`H)aeAeUkW8V+Z^l9d_%fKF8Jes2M|s`^h0v=9e4^0z3!@O z7l!pWsuZ_5_BXLx9Lxo7bP?QWJpeaK8-pBp&-)`1nHxaEZSV|eo`pDi+#TJ;zg>5-a!zfqrQ7hboiSLY`6p}Q{&=T=_F+se=<|U zXK+JhdIGKSDV1nlsE6&s{5k9xb0TaJfZ-S!V8HQ&(m&}q40enWdmi=_IIE*r_!yMI z*ko;?)gO6s7v6Wi2mkI1N8lHqKg|0I%{|BhIV@JjG|Rfr#v?W}!ww*Li0@y3m8O82 zFbFgbZ)Z)hK@B|)DF8MA>H#_(p*<%CnEsY4EG8A^EIG43PUX-3J7d~TILKuN^^q%kU&NmRU_<| z{`sSuBlsf(Ill4uV#G#`eej_!9BMjncMv4~%Cv(i)fq~ooe_$tzfp`11#ED;fG0$4 zKV{hh&O8C_(vz|5M9w|_vDFj-uLrs7Zu{S7QaI682u>vU7cZros9Hy^U%{gY;Gr|-4`6F}3wCkDc)w>!p{vtyQ`u2wu)MI9Xq}85zl1)A{>>I5 zwM9tT*@PrZBt1hGwTW5h$70P2*k}-F*z`Cy|3|)U3%={^BLp-E#2`SUixa+G1~x=v z1sweIIxEm0pmbUFSLimf{a0}k|@Gkr> zpF9Cq?|RJgpf*3u(jOA}AV)T+k-Aq91I9+TfEXQ)beaB50+BxX0uV+TH+!M8!SzJI z#m7F8SRBd}GUN&cF6|e9gN%8JLS0ppu5-lq5cZwXVBH@Nq0wBNug6(cR@b1vvz=Rp z!wy5ruC)uDFu*=xMNJ6Je$;qYzb0eQ)g{K$2o`OVp@8b6f9@%bvkGpPj88@F9BXcH z=#QWlj=xi8l%ZyB4EQh9%nkKSM(ho#*&88fc9d#bK9vJ-{L%Fx{OW}sT-^5I?nq6% zom+9?{iizcKRmGtRgFN7UwLsGCfOV6cWG(PnV;!RV?Wcdxxi|7*ssKT5t|R&4aKmc z{?h06d35AaXx?~5M-M(2q|av$uHPao1K`N(LH5_h-~Y~e3~~q(X**C4uYGlwQ}4*> z*N1ypbrniDQ9H3*Gab7OfeK4eh&cs7>h!Q9odR~O01swwggQ7<8e!2G(U#Wdi+}GY zz+&=QzyhQI2=%3P>IA&|7ydbvF-i;D*TSN4=aOUAZw7%EQB&>Bq3#Ih+5iDOTK8!9B_ z|MBr#@W=_8Ma6+n13`@@0vas>HCAzX72Nh3G**s*(>aD0X@xl3+M!i!IS2>Xj&5R` zN&>=^y(d(lg`VvbjtYI?^(K1?Asvp==iooH?8ZzwX;E5)_Ng6n-b`DQtoPAq<6i?E zYplj_mj>keT7d#LLPxcU1UNi(asdC!$1cLZ`t%0;#tW+uxbC2lcEAcBoCvyU?2G5+29z*C}L$DdJFrN!Hv5 zS#x7{aHEa0%Z&%%#$3j++IS7a5v6>^*+i$o;VP8zp*PyaS-rdHnBCvt1`iS(Cs#zY z4yzKjlCGPbafOTqoi?i@8|X+nMdV;|I0_DGn#9_`f$W>lg$Qokgl@NigV-(z1~yh1 z*buFC#4!-qSUUnS zeo84zGuU+PVs=dZ#^H#q7T-Vh?Bvvi|B=k-lRzOW9Tp9SncF+9p<}U>W;MQ#j=PjF zl{90{yuTv^ahnDKkn!M%TOg@JPIT&23Njn&kQAf25ebUwj43vILt(Yrr_;~pUEJVb zzo3{m|LUvT2y6r~=wN{lHW=~xmJfg9x39x5e9svuYlm7c7 z#lWiuEvO$N|BQTS5$H7F_`BPL(a}esdGl3J@W^7c-R>`YaQ*7E^6=n3v4iKHQzJ5F z$7(i^W0?=S+{0tXc3dOJ2wUI-YK4cRmee?CP)lRx&MY)(cK#Mf zrH0LA2<&i3M$+NzDn8Am3bl_jG^0xF4zR-$X1~Xj3O2yMP)<7PWz2vZEu9MXfz4;E zCqbbq`23R|2f1ARaSwJzTj-dL?rU&^o;8#DwJz31o|Ow*;kA$@M9Q_}u!~e`S;P29 z+(!}r7BM$G@N`JZd!Gp4$3Au!x~okUj>2pWoYifuf!jI+ZhIY?hc>|JoFPgY#oPfj zj^V@9(MW-56w$E_R)N#K`nR#s!9Pi&hx9jMP=h~VsFtM(Wzhgf1aheCD�Tj%L(3 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 z z%XB(Ay(21}#|QF=t^?c5?X8-KPBVVMhl8?AR2ytAsvaC5JSyZyg{&@6bVk*`tBrs0 zH&r^XO58n1m=q1Z|M!Fc^-s_y=y`(U=62{ZmB@fZROU|Qnd`Arsp1gDh7cVXhH%M0 zCuPk{Wv9_OjYGb15wl~)?tu@+u4&V-vm-a^M8xCd zNm!@q4X%hXDhLf!O%WxBsy3XOiB`#tN}xL%MH8o?(3kynGT-`9I^ zn{4PWqBr8IZ?H10{&b$1$uqt3hM#-Cd}gIobRajlOzb$LX=)1(4!obU5hpMAnBHT0= zJiVjoiXfW!@j;jP22><(FcIZSD!!A2^fN>Gvos~^$qjyh*Z|p~jXN(QpC25tV`?BNwX`t6U=+L$9tG#gria7#MK37YIkJ6Y)@kuNM2RH)eRU=HQf0lP3> z<&>0&zF>6VphQx}>3`mC^xlt21m8%R&%vaxC=N;2tN4-iN5CTWWMGdWM1`OY)@=d zv5e4I^j`J-pw8gefw52%(Wq2)gcKITdG>yj`%uJ)87G$zC21e=cV_+^Zp9)A--*>rjq%Ip)3=ULkvb8t2uZA z$x0;^swj=C{6I-yREP(n*`_nRsgM8P?|*tD-;ICxz6bQT-ucDV>J6%{r}|l0Nl)Ii z^4dz36vIKJq#rtKOaBe4L>-jmxqj}P2C7t4rVgi^iJ*2 z*yMOH$-z}E`X?;gHZ#5%7|8#69@96*m_byDb%sdQKgTKM7+8-dBEd#sdn=Om;5Ffb z9j9}lU#k!WWp$PE+0Fe;<@c!4Kdn%2gzs%qb;aHI!v%grt^8!!Hk5rOQEg-{cx>cc z&Xvgy7fPRH6f#vp$0mK86@sJau&?;B4Y_gFkGpCqJHxPQ1J^nNMx>;mMBiOWNr{pB z?t|Li9U?Z8NQ^^4R8&(?<`KM!ir

    kvx88>1|*8$X_=DQM#~4hg7@h4PXM8R8mu% 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%0DD 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�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 literal 0 HcmV?d00001 diff --git a/Assets/UI/Mockups/LeaderBoard_Screen_2.png.meta b/Assets/UI/Mockups/Leaderboard.png.meta similarity index 98% rename from Assets/UI/Mockups/LeaderBoard_Screen_2.png.meta rename to Assets/UI/Mockups/Leaderboard.png.meta index 69fe137d..b07514c3 100644 --- a/Assets/UI/Mockups/LeaderBoard_Screen_2.png.meta +++ b/Assets/UI/Mockups/Leaderboard.png.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: b58d7df41bd0aa046bc5838d69e9e26b +guid: 338cb1790dbe33749bdd0eab190a6803 TextureImporter: internalIDToNameTable: [] externalObjects: {}

1Z-fZMgj8!hHTC!RTp+XYbE0v_4MNtkUx| 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∓OP4jr;DJ9*rB=(`oK~h-P{3LUuHp5Yf&Z z?Z4kZ7()i7L%z9CZUzjc zuWL1@gtcWHg68#`bj;7sFj@l=K4(Y#^ð&GKv~4-pX-7X6CzU$vO=5TOoC2$gIi zO)qw)yG&peH(_g{20Emgv|Ng{eRULl{1X7cESQaUS1Zl_PF)Mz<2YW5WAQ3oN-_!TUR=;uF-Va6o1e; z`m0JaI1R2ErrW28c!-%;s5u!rce~d^+!-Oy&CZV--91F}PUB8>1ce`JMF})qc)3e8 zK+g>KOmNC9_!)P6(F1Y}hIEQm|em&!Hm;sxZOiVqqoJaviT5=gS9-c) z0Xm3#DDieOGFQafdcl?@!dDb0xz_WBn}Q+ z`X14xHOT3(pGZdn@AVF5ptq@?|I{cmCQua|YGuB9Qh)XG_Oq4h`@dCyj>f8FZs}iS zW>=em(4E^l2^NK%%Dj+;V0v?gznvS03?1Tl*(NTB6f^ffgxM@%y526~6snq4XjpZ= z{{q&S%9gw6^qjx1uDPPUi$3b|UM1qJE+(=6n^fY2UZq?_!rIGAug;LEtdpZMERty( zd>Le=xQU|h>WMUev#rp)^K*n}5K-`@aZFEj<-%ElMOElJ>xTEITQ^)%Hkjd>47s^A z-B!`Sva)kq_bR)_^FF1?bFcAHM|S_;k7f@=&WFksx-)S>Qp1r8l`D3p&X`cO#?zmd zWbdg|vvW?rz5}ea@3{U`=iu@t;ZF<(GA;r_XBNNh*(P2f`OSJDG*>E+1|WnMR#rY# zy#}z}(%Fwg0N`3`&(=>qW%!nQ;EOfI&$;4M*?brsgI(3z^Hd5$hbVLcf=mi6;^e5L zs7%H;3`jpcTl2W0D?3gdG6FVd=pN|C(yG_(>=CA>#kXcj7@2jG*L*RD+HdF#je}GO zlXQucs1VFaZ;ze+WN`JEE(fhs$kkKl>Pac=OgErt3U`V|H3nIu^YgepA(}^Mn|QTy ziD$|GOm7~U6=T6hl%c|@F#Se`pq%!?yOc+7u!0EbVVtV&^R8kXJ0(xAYUyjC^&i>0 zAuoYTfv@BR+~CE;d~I{tdF}uj=@RGGPY%ny%u^q5sPfPLikrsbShZ7C#i^_E=G$+X z7Y?6yN3(Ws=s6@&Pf$I8--nt2{yWJ!%hAbcNaAMYB{vk#2h5va7>j`k1+$-AOC>mK zQ6%#IGYFqROGS&M4&ziJmCdPEUf_|c$x8jec&7PFPrz%0vjdg$Thrv zFa}BG+hVZU&WottG@iHGq9NhzuoIm`xC8E;0#@sIt)BSN&btNALz+GZnmcyfJCs=X z4&pWpP>x|Pe5VP}OfV~@QeT%7ACq&B-5$p%;k1NS&PhJ{wCw~ws(qe#e)|-KqR!av>enJ zH+KU@1&4L#CA5!rmqk5Im(XeoXL7XPQ>lC>{h9# z?o|+Y7P%%RdX?~dHNb3QAVguCx8Ng3!%GhDmmFM-`nhj;0Atl&N_+Vzk}j5DnP#PM zh!h#348(^BWB3v~wQg+3$ASx{jfwv*=v~sF^cV6doQ)ARZ+rxueKtl!K~_g!41;Hy zj}=GU4<{FImmXM{S4k!)S)Ny;w!s%PFH#{rWNy@Q4(+xyHgN=}?b;?=SKw|HRv=Q= zeDOLB9NOK-JzGrx`jBG;?Bp~CtQE?nzPnhkN*p>k__*Ll_8+rgXQOZz0`=`@*A$~2 z0J1>_HMn!XA$(1aJ?LALWuT;0s#pSW^(rZ;860KZGIIHft zv@fr9h-TV!>wxE+Ao&OOFnQ^}*XJW28>>90i_gtTXK1AOX}vuvu}Y?F=p>~oZ1J5q zg~jbrEV=*Aca~~nPG6wrb<`#mOE%!2b|%p4*t#sP8*%ZZpN}Eh1ch}On=-Tb@;A4r zFUU0=K`v)m-S7Njx-HsL(jL3I@wr~=TVY{a`J8K<*gsCxaP*q(QxGXs>E?g6=TukC zWmEh1hU6Ig^ieHgT{s~timCb+(16bwa>a!F;Mm?TmjQtfD!$o>sC9Q+Z8*FChMHY1 zd;$(8>I}&Go?dytgxPM4{5!mmgv5Biy+_53eWwyHGCntOe}Fdn761`^j=xFnNP$3gtMm%$OM;ElnXQ56(UqHMDJ_?WnYW9@xhgJ|EU?u`VTS+F0?g!jxT?Ru zaTd%A7!&r>PQJAhJ_kVmr7JPY_}i6c_X{A#FXHmovw@D~B-LMR`Y^!UDlWgE;M?bb zhK7c+*466qdevF?@8@9gH%gg1=+zS%^UgB@zx9e)VoJ)>`rTIe+I1h6R^(3aa~f_Q zA*Gi$e=TLD2>vpJ2Nc&$PU)ZY>+dV>DTFB#$RmrHy1u+zI1gDtK;g$E{h*$thr2P# z%YlW-%mTTbOKTLd5k>=ZyK>YfY>J15Z%UXuWwmuTqqv*~{rLE_i<0y)B_Dmzed&>2Jl(*2Q;2hXTgv*Zss=#CM;Kg$L1eTsqieENx~kD}nx1A~x#u>ND`j%m0Zj zHU|ax` zJdow=>>T4hj?`K4{#z40eB2O(6PplRgXW8zBue_(+FAkd2L7Iwmi7h)2K4I;#fR~) z?Br!NoH(XD3#?z*eD59jDq5tmFye@By;{t$94B6U@aE-fEd4Vw7AHXv0+ z``A-6d;rTI*K5r9vL!zNcGpDMrE|rYeT1oL0aF&RUC0zN>MHEvN&Lj2#Uy-=Si{e6 zRWy++Qj*<3`+9oK1~c7v%*Pf26H>_-;r|}uc8@aLdP>2>y#HMj!-%v%dXYA?|mkA zJk>i55Y}j9FW#YZdH1_DyooT6iT}3#`S=I4PB`FhU%xMx(Vk!+mHEvUiPcTYEs z3YhyRdNiFlD#Fb`fPzRZY+dxExq2mY$&V~-{XeHkL?Qr6zE!M)wchj+X|RCoM0K-G z@&T@{WgmUK-f`MO?*?q>koJxZ&`!)U99YN3F8Z1pJ#XGf`92j?G>i1S#fl;&#pmXx z7ww1vTT`?w2Y+k?(2t~Caoit2LDM#0dN@Xt#FefO92P_##Jx*v#YYu+0nqAEuj+4YA)z#o?*mUx2Hr?n zIaFkz=O}q=sbqcI?5+cE5ta`+J3$1|_7aGPN(4Hl{m_T_+0X~EpJ%*Da~4dU#~6;% z8#J|O61Ve@rkB^mAkz$=L9*v1=g z4u|?xH@2;D#-!yd`w4}u8w{aKv+jXUn}6>sr&|*>x_n{8?j%ZXoa2Mwjsvc+BdgRybcq z&XIVJSTLa7MaAn+>OwzKaWi65;sLQ_n285$YXn|)bY)19ea|dm88_s7&-iBRqfF!7 z(9zq1vSnbWFtZ>1BOjtpnDQE*&0fJTJukT;}r@#TZLjmJOXRwO^ zGH62lGS2U|hqfPZbwiK_F17q?N&zMXC`1Y>6{3`7ESUC<%a&DXEqMB@Wzz!j*pr{~ za8Ib>X?=iYv*({BW4UI=@;`ad+O_*6Yq(@@S~QOZwW&k5$VJtpmx82&ZqBw5#i@&$ z{!%JVh$rTenTD7^5up62wiLn>^x-H*MlAt(k-~}*`-3CL!_v^9?1XIIP@^Td zsv#v|qi51>J6#uY`LWIGPGSFftf1^Bu!~p1AJ2trpqtqtr;fVwol)#Bd1QJN`VeWE z!p_o-G{ltP$cXm@)b`+*jZ{`{b|fWK-K+yqq;JHz)2_hZBO*gWLn1>+P*67t>154| zE`AbbqoieWc#52@k=3%}uTvrxcJb`k3AL#{243at);;g1?B>xv=YWsdUy>+Y8vIHE zsmPz$jaIY@AJV9orGigUf@W4>ELM5Uux(+lagmA9ge;SE>oxM8e)9EWujZ4De?r{K z>S~6##9$Zvs})QjF0g^p4U*2bD&j@8&mK1C$&3qjqXuTTchSk3D)cc70t4NPUbrRUN~8F=^4wv><8RqL~x5byaXS$#+Q%Ac=w?=cd_zJZ%)Ho_=%?Fqb%R0_<+X959!}7N7a#KZsBGf1llAd;>S<+34%*1H8EQJUi~TeT)IU%Deyy3RYfP#5n zGy)D+AU+h@7@+XWNAf{9HKxGZgO@gv>3rLz5vl=guxaa{Bd(bQ<$`;>UUYZ2#-@&@ zZ8sheTz8un9-&;*Aa;t%{7UH}#RY{n$9+-f*j{P7yCqXEea?{oxS;Y^`RZZYnV5tn zJnqemdG=RvYTSQs{A-Dm?&yZ3NxH=p5c{D)%ZbdRmB3Sy4G7A&&%uPDqTgNGPP#nC zD})oYi2G>BR%9$}EUmz*0{K>7t0&R}+HPBKB!~5$p7;_wxCuNs5S;s^rdqqXRW`{o zqdJU50>TBv1=?7mbn#2*DDl;#87C!z2&E|^RD8T^-dx!lGm-H0BJ!awAc~W^qSB!a zVnw0+K`}&*AveSz#)?AD2I(}%M-Qv9H@c$`A-iSWaLDmxRIA)nXehZnkD67aaK{M` zF@Ab8|L~!}OiEx}Bzhan0AGWI5~Z=%%ziw-zP?tgK>wzmw`IeCSoBnt;ty6|NtW7eZL+n98##vptgg=lJj{x@7CoN0? ztszVXDF<9E6~Oz4j=7%$M#z5}9#C_1 z4HC8vM33S*7pk0YyJ|l@?WQc)y5Zs@h;gkpA8ADs^ z$6;(*{Sb86r^-s(qr*i#vBQgX$g{@UIUZa_T>M?u;wG){HqiI8fS&jTPsQJ3GaVg7n!YHOf7kZ}?n zK4*AJAk}vBC-;5Bp6@qVS0C(GYqcmrBEv>&7H$?{OfqV+P(_gpm6kN!ZL**n?l}B7Ozi-haz0Jj z&b)*^R~mMl`1hj7c*hAT`MB6Z*UQd~{B4ZQ^pv*dx40o=ylBzB`GhtHi4dl^RtPk2bG4Q@zA^@MHyez+)nU-Y<$ z9bP&Rf9VQySc;z119YYFu}q4`z9wzYMrI*>o;J?yrCxj1EOSzZP>W?%jcn8_UbIOeTcfR$=tV0>@(U%6M@;`rqW{;&C-j%a( ziSbKhXpL|4!si5!u5gI;YI;ms5gMCOgvdkK&*xz%8!G2|)EQVII%cO~OC4eay4OBw zIICr(it?og^Og6a(M;Z4hp#bIbw=6JpncC$zNe%g-h5iSd4!Hujx=9+e*VnOAG^4? zgSbHNY-o=0<*l2tW-1E?vD|g_exdzu>_|0=FIOMJ?<^-`Us7)>EymRru#9Y?58MY^ zM3T#xjMA%OpvUT^w1Ut^b}Ug_J5?uCHO$7#AQumkQXh2lL{}wZQJS&r2jTQFuw00^ z!R+t74-C(D&w<5sRx%Ntrn=7d#5V8Ff8Ss}9?KQ`bH_8o4(d4^Y@7jbNT~nzt39B6 zMd*Z$=WRbe`me68&Qb|E@6|jV)Euzaw1sHHgwCU;dyo@wxlXc z0pdj!_96=wD;ifMuSndOc^p=bd1WXsm;6Qw3I$p{DjgOdYD9T#E;ClsyJRPpi%aZA z_DO`!@gN*cA=DM}AiJ_(wJgD(pE*clFoFn$1IC;J?rz4co-dzm%x+ztxgYAdR~xKx zY;vssd@9+E3;cB&C3w($^YHP|8F9+(8)Qi!o`=6tt8%ssn zz`!y>2vYrOfNF#-Sh4AQIN^8dVtPOHyp$F?v~3W2T+}l@X~7%=%@MI+=LZ-66gDF# zPH%~PhhuqcjNG^zx9&f=fkz8o$?{dD>JwL#)~nRNr33w-o4KByyINM1vdV%WV(thR z?%|D5Dr}t5r>|<-AG%Ao2Ng;ifOrZan0V+xVF;js(Aa{nHg4Vm5B+*G(;$X!Y%QJf zdTa=m@u60j{ElvVtfUE24^X=^t&7ZFzrRT4b zl^F@6q(kl&YY_q~W zQ1iLzbYA2^i`HuTGk4~8zAw$)nJAWXnLv*ZF>bhP;ikUT%#>JLh}N|=(!}PoCuvzd z4#vG7bVgyXAqqHz5iD}#t{mXj-kRro6yGYrPpM+wnHo&Lne)NL2d!!eiHX+YG>5?M zoaA{gQHtd!pqO5mZ3ara{e*XzgvYXz@dl5#av#fWV8y~)lz=0C7tzl@DJ zbbK@&GzK(2(ti9xo7rp#;upF&~$c zHa{4u(TNcJRoaHU`Mo|%t`@d-EvmUp)18sUCU0 z22pbEjs*97d{z7{@~|6WNfBeDVz|Mp(JFa4Dkqa3>VbwmR8rc0@q|kriEM<(NX>LQ zVs<$-gs1|k$MG7tkjCiq#=KK=7M`OZCsSWB3#Q_VdG{zEHEwhKXXh7C`Cd=!B;+8N;#i10v>NmS z@6XPO#dAEz%_^vrkHyZ(s(4~`drd^&7;fH}h#0(hr(qU?7$K|e@HaQ;=M`e3P{~HN z49{0`CHng$JuxaFu(3hM-CXA*&3v({F~9qE?&ZM1KrXEL=;Y*}%BXRMyaYI*D`hZn z(fgi>Fp)8D&keAG_?UtMbhoZRG2|e{;*3GWqY>A%ic7by7#HD;kY6&ahWi17(4?&}9v{#&a8dkTzq@MO9Ve=jrdbQcpOa`;7=@8>Vzs z0|ZhG0m#Eh50~9~4v`T)m#Q7{2?eZSnj4g=-8Z2jb>N1;9Stb%tH6#nhP6DhoSMRDWT$|*BXsA?vxF}Rf=`6DA zk^NExY>E=xWMS8%dCq=fN;j8|q>F4GPrByq{`?E;3-c;;M7i7AY}%bXmZgnN8<__4 z^p&Uua`EP+pJ{MAnwx9$f}-ojpZLH!IjLv$ML%}i{N|xQ!V{M*)eeDo7dzGC+(}{U zy=Lew=cQ(NKg=Bb>hv`$dDldO$zsESZBCQ;jXq0@9~>nq3FfDdt%_t&qp^)&v;;+6 z<{Om_)ow^529nEyYZ5M}fd^$n&o>1HQr>5>*I}WYpIFFvv_p((a8trrY(McNm^((f z3M$Ir6 zIHi@gyy(1((YCi}-Y0|fY0<#%5JH`ul9HDc*r=if6BHntcai+@iP1`VH`?5fYwf;Y zIYzuVM&o#`)2+9QdHPnz@B*J}q#l1iKQ2o+4MmIMSN7W=1OtW&N3D&W}u8#?=uXN#( z8gk5STf8j_D)U@ z>UD_4G(t0Ahc1@i>0J48eM$aT9Rfdx#U*tuDYA4nQlcN)9^X=m63ped zboK@u#~|3ri+`(o3u5=3u;9dE#M4$dV8U@3v*)<4dSWAYKL)i&zA+ZK_VcB#3+0GJ z7Li06n}?wCd&VM8MPMklQNyoh|A$|J!17?TSXeiQ) zctw2<(vNXnVDY(q4@f^bkV6$pzY`p_NAjZfXa4%d0V?N>Fyu{%DukrMd|)a-wR-F! zCsOhM{sl4(a3TijJ3h{+DZx}~d_q14D@S)4QV;#>0T=uGJDVb{>Nbe=4m@|1j=TtI zRttWJLgX)L_OAt;Zh1DRt7vnaOQPbN~a9JO>-Iy|Zif-k)j$J_0x){FP5~lkvlu4XPtH$9S6H%wyh%g+cU}N-SFoz)hA)VMk(bwytHYuBzq@Dy)8> zxqUQrU2%UBEIy-N>E>7(YhTibk()#Lgp9_gwjBJNb!2lYrpGn~60Gvx3VY2Q#u9_N z{V?ZH&gX@K!iKV@P}iI!U-b+2osX^aUR7%8xKueQmS_QpW(G@bN5{C5l2Uy`!z-s^ z>Fm%~|9{g8SBa>!HJ7qmaeG zOHHarRZwP;4o=>fEd0_DQzSd&Var8Fh7#|b{=EUC@KTFtyY1AE+x-0}r<|WULam;I zM6#c1)RZaXx?LQ9qYVG5CM&MxiDp5j!kTb$()dUwGFCptjO+dw=xkBSpx)HG_*69P|_6WN{l=FDAs%>fR$G+ptO&?OH4>e&61H=rqUyNUoK84IAxt|hj+Y5**u_9p$iv6LIo2S{$ep8Bx6KWO}{EJe4Qx|(2fzJ&IyZiP7i~L+HS|?9Vv()qX6`IuF zimG-p@rMVO7uD@ZQM{UbAER`PBAwYo0+)HqN&KrC^2{CMv|zb>KVqWrlWh#X_LEm1 z8rE}Iol3xb)}lN7H*Wx%+|SRC1E^RnKqKdG@zwiKK$7XHZ8|=jIecSmOs&QDhRc#q z#-@sMwUh6SoU` zh~Ekr18ef)QuS351(M_kD}rkFjG=_n8CL#g9?={oJh5D`cToj;y%sX$6G3ISu}`Hj zEsbtGh=rP8&+3=@j~)^p14ym&k`CtC|sdeE5ktPfv`kxuUX@$`p?@M0$raz6L>^ARTFe{-ywnMsko!&jvZ*fg@tV zGGQID$a}iv53z}KCMIEi`hWQ+n|IZtp>=M{r_>khHMiI2Ty zfsa25#BZ3TBv_71-IjTFP#v3T61qt18=Qz8mIoE7YC}CWB@tFYJU;mTRXD}m2y`(d z!YGBeFb!-51bkDB^Y&joa+)TohIKEoN#sEWGU-TMXmKd1z9%BcybF;85nd|L2l#Fm zo-^5xi{qZHDzsQjnX`0c#(ZT~VQ@U}Umk)cl7I&;3#&N3A2tT4Hl(NRyFOeHw*Jhs z9#AC&u$WW(eP+&M4m!%+E@mmUryQzRby;mGqkUKyU=+C^3=9@|g}mP8Lj(k7llN)9 zk(t><-nM13%hA(ZO5o$^a$A$|5Y8ML?y_9>b!q4Iqy^_oY>uwJc&2zn6840)jX@+O zQ&&x_1j?>Dw69ul6L5Hjt4Hz#^Wk0f%t%y$waBKS=kviZb*#J|%=s9lh|5i3c^Vju zEEHhGs4R>u93Q0xX0S-Z*_sXNS|zgA?gO3N1D`kOwugEJ0edSN5G^&e^7?tsJCy%S zdCGoC|6)w}6EN8F=cymx-+!L^(`-cMbI_Nw4(Cp`CE_RVjvH{@CRmw6UHO3cUh$@e zUK;tG&_*93Uk=**sRvEpx=1Oc$kXWg9YV4*eQn0eg+P&pPGCW-;Zf4h{?ufNwNGJS zE|su`09#;8N;UU{^@+O1S zn}WanW+jac|HWJGeY&QQ56e{lW=I@PX$7#5bDmYBD;VwlyrhObs3hFTa@i)?qmt+F-ABB2vjy)pQA((lc2!g(c6ozt z9Ph^}3I1IQX)`;Q)sCp-Wj2Ol2;qZ;&2BLZIVd*j@3wxP`zJrYHo^f>%J?rlDay#Y z{XK{CH94?+U#^k*ugIvOIbsFyKVw&k@Kr5EeRdo{mDnnah^i~IXt03MrhqkSs7iUrU`gtUpsX-neTwG1>T&PG`ntwFb(|o zNO4N~2Ba0qF^bG4o64Cky0YIM~;b)823*(aA}k5%^0rdfL;3V=Zt*;LJV7343)=Zjf>vS50S+y54D`paWzv0(TeqB0sM zK4C={l+A*=%rSCdk&YA3epyMrkEO8!AJs6uzmO6ZG8ErFCM`FPeBszhoKxH5M0}V? zzYfNpZm1nF==axtI$w$)v=WdEY7t;qk9#K)`R^%Yx(?#D2hOMfG6-7xrR3z4z z5TH|FoN&LJ`6l@aI23iXr4RIKiTT37oosoAxX8cLZ@Cv+s@(~UNW%>tE>fhi#em)MI{3Bwg*^P_l>fkUaIA=ag*l$f|RSY_ki(g+v6gQH#;UDxs zs3w&mccv^SV;N8wNb8dkUwMq(v2}WhoPncjw*1NcZ_=T^wlD9bR@_OAzap z2UZBMRgNZYj)BO7+)oL?<$KOi+W5+Xxwg1?esj8R1`&>y-_k}t0JIWrm%D19y|4{n zlmm8YJgto%JQZGch>xr@wx8R zjK!Nze=ho{#0sAJ7`zvSUsjTlQuScxq+nB(^$ik!q7o{pu%z$g1>#6soom{urJ9*T#raXcD7^F?Eiia;oe5xfrv8#ni^1<7y>0{bfnkzX~cQ zfybGOPLN=Rs7~Z0!k-Y!f;waLX0?cAT59MWnxd_m!MJ|IA3Zbw*G|9Q{$IRWp5Yvr z*m44b&`RXQ<%4T>ik(o~fn3${^nFJX>J`L-6&OTz9#0(W_;e&BFad`T}?mLK~ z(#V?2ouGcvsF_VMx*1)!q9M~2<4iK=gv007EFlFQo!7c>-soO4@DdaWF(}{REyBi5 zhFSmG8V#TXcL#c24WJgLt*)9_+W5M<(t+aK#}PGQxfPIMeTVplInbo|M0^xJh};Tr z;1kg@)z3M{lR8hMeS}AL!0{+sPui9h1@)13a(H$`FE&x@uhb?t7)C1JqRXL{pJ;rI)n0sL74_s^T(L|HmcIe@8uTLwE5c*ZXm@C!Yy~rO2nDh=;k{M`t0HG0g0Wpfo9Fdpb z^s8nd)yxVi9Dz=0bE5m?(|Y3-iPz$dN@90@VRVjy_RlT<;iD z5M?-JNFB0OXdfBzm-0x5uuaM?(Qw`%-l|MQ4)L?cRy3)r9~1spSSfHGGi}F5KhqhA zx;%@bR3l*f-!Lbnww?2J|HgB$6|x#uh~_nxqB}#6k@+ zLR_RIMe`#x{StTrfFRlWaQOsJ7G9Dwbne1%g(NSnJUOkkn*1aS zmdQ-P!AVbzdjAzwr-b$d4Cl%hyE!fgfaOU@mSdmw++YgGeDLQI>=S|(@qq|>+Zs~U z*|GrrNwa+r(;S?{U}^e3#Icnn>SpUn;xJmHHLx|?YmZZ0^625`=MIxU*wZ!rOvkV@ z+bUvXE*{*E94&ix4BCq4jyjSz3x4$_WrT?f<2L-Ej89C2>j@{^=SvL^OJpGkXGSjV zI|#K6>3Dc}{=WsrT!kI8zuLFm;P4C08EVMqT2oM1VF$(4kNTZnFY7%Wga<-vy8#<@)|LS95^E+CVj=ExsG^CLx&bbBjo+wn&;Pmtr4`sL%XJ0BqKd3t$(K zvqn&bRbuDpR??HpnKN)8-*yco1RO{O>^hib{)zO_i7vX+S`&z`f?%rsw$stU4tnV3 z23*D;fS8HMq9WJ?f~3Rqkkt3|?xExKfgE&tdO9-uU2kVNjh$I(k@1#^@U+{Zrd_eo zd6f?+{*7gj$NTXCDS;8D3DGd0j8{kw*l`WDnn5A0zXosQO;S1g}Zq-g&FzLFg+va$rqA#;bH$*IcG# zLS_8^CJv-UZ23)JO$;ide%gCh%I4_=&2iY}*2YFBhp)^EU*O(Mn%{P(lEx zS5VMtv+r3GNrQCUj$A7kO&YnIre7>73~XCL<+>^jp)?el>{kkIf;}B`(s23UovgEn z77%-A*!Q*v=#esO{QWHwxGY#l(04uUfQMp^@9-O;*KONkSkS*$EGA2i^ z_k!>$nQaqJPr@Lg=o>|LG!VM%S%bqokbc^)DM4p|Q{e~Eylmjp<SoN>QBX^q~WaspIy%fxSy`cn9A0#J#YnSdr}X1Le>7HsC_6=>#PDehd$DzDuk~` z66#`;%J_jfVx92Bpgvle92XQc9thpZN0cv^kf}{}tv@;#h?tBs7bIagykXUXHi1VB zh%+Fkb~C4eTrUp+Ee?A$Hc}RJp9&uN%;@535EY6gY4-|yfa}ekOUl}0;NMx>r^v^< zmI)sl)(IQ}ABHcBj{P7&pt9y`pRFh#7F#?yWyk1ga(I4TCk~Y6Puu-C{>KgTKS}&2 zTpyVTqrD?R=HfI|uv{e4rq}SnZ){?jacLG+!LNfnksW$)#ius*NHB3XbdU00cXD8M zdon+9;WWRMX%xEKXA)zUUv(y09h!Iy_AtnbqF`cx$6n_A$;88K(g%rR!NxB_5{*#%P-$G)>0BFuHMvcx{ z#VpD?V@qw4N)W~<2Km;`ZfT-`i8>HtXO3I80!`{R4#U$Og)y|Wz+-jdF&$BECCr~9C-+?tW@(Yy@Vcql zbX>1haMGBfppZJ2nqEmp#j=QOs0Fn`hOBg{3Cc)HW8@TFB1^c}uU5)U}zT&rH8ckt_u8t~XE^o7N|nt4pif6xQ%$JXo5hUqP-)H?21|ZqM1jF_yL54oXOLTwmna23x$IpnTLFACdDm=|@6V-An#9A= zkEeK{HBCl(;s5;Zd(l*Zhcb~v{sY3o^uqvfe*|;fBpxfOTXUE0z8J%8@W|?MoemDc zo0^E4n%I1(Hx~DsXBHmW|GpYhdc9oOm`OoKq(d|PbzZ~!c`knb&`u!}S0qfUHTim- zIf|1miPt2CJ`Tg#&T6mCo9wxC{6d9IcQycF>ggrWf<#{O(CeG}9=~2%UM>O9j0B(! z*$4bSJH<}hLa(ko2Sx>`TPiv7{7$0R@1jSjyaQB^kW&-Qhj~@&P{kIc1r3qvF*X#n z;0-c=cC3OhrQMMg(h($34}fa%+WhH3`cbEI9p`+Ua25KlB-Uf@dXG5qYzY(UX9;^V zBbsX2Ez9v5TVAO4*Xiq)K;O_PE{D_UeqZY6wX3gTyCJ%SU0h>?9R;WyoC9q z3ZH5skK%l#fcq+Z%US=hK}l6>Kd{DWUW~xh($Iarxz{Zo^zp58FOI-mr*Ozzol6Xr z*~%@-*wNqwE?D?Oqdv#IdzApqe=`}K%CCX%n)+YT6@fV#%m1+cof`?+*TsKDEdwWs zasgnLY|81|+ci0HqJ25vQ$O%U2m!9VQRntsMgSmH7#HGLH)C z$OQepXy|}uT{qAE*mndtp{g-|*Qe$ph#)OL`eQ=UAzcDUdZ$4ofk2Ni{}(8fOLJ%e zmt#U#*T>5(9Ubc9BK+i;mEBEugS$fc54YC^@Jin1&=;r(!a1F34ub+4n%`#@_)%2!iml}V=)862WCnxYdRzi;2Vf!9z|EF8DKZO5+hDJUH5JvZU_ut=( z&U#io^o&id5W}q67Q%`=igHmOU6Cj)fHSfNBL@tZc;IW1MOT- zpKdMmBj$OS{G>jTa8sy6X}lk)hhS>Tm6yi+;c=dkf!NHBVM*?h)s^p(B4oJ7q<6&V zFLif&xK>O}am$u?!YY6&LmUn%*eUD|aZzQIdGJ3^vsHaRc$~8P;5(iQDJ?)oARQ)xsL;Oq$q4>)d73WKXMC>$nVuRB8W0A5f`TTuCt1l zRoQ~Rf!0ugiGY|bG6;$$a0(i0*SysG3gQl#WXD+&g^tXZ6)sb`rc23AY%V{#GF#6q zC>)*~7iP*z$5;ynR-#cKqNYU5AZ8%-yzVXAQrkZN9uYpDH7;~6~#viwr9d3=;IToCS=HUCp44C zUlWpIY%{F)I4|gl&@enz_o7|r+`Qnd$_ZO5EBM83aQw|53SVf^TFUGeEYuV`Z}P0P zGe*~W$3q-Gxs571RnKT6$UrFJXYa)C@-aL@2h()a;FgGf_1}$p7_4sm^2uGvsc<>%?UIY)nk6q-*QU7*b)wtHZ zww7-Ucq*9v0|c4@{;ankIWO;pRb1WpSQ^f8RGoF}rJRg8^5#6&WO;uJG^&_e_UMNS zexOK8z^j@0W5J3FuM^{+1wGEctVQ2G8w(Re)-EV%f6-I1`3uu@TPX4Bn0NTb3^S|} zULlpyGkBq;Emw63j!u<1UO**Ml0n$ORz25R7l`+kw6&r7tvfBw{@+CxI6n#`VlgqX z&kxs5`hX>6iApiVf>%pq?(s_IEKL{LIRu~DvcR8(kAjRuj6h$518$-7Q$ok~gk$ad z-$Fcl_Y1$)&d*yuErRETEC;{Tv*t+JEazT^QToek;>%+wjwX=2NDC+AUv8;R;eQ3h z^4=31Z~`A~c8BFQ3>cUsjxu|>6hP}A=b+4j?jKQks>6mNc>2f}&5=L#&^;}Q%g4wf zfI&LMUWuRp(5-*xdg#4xP#|bf3lLiz{XD~pW>aD>@4d;J44&mJf8D{Vo~TyeR*n9k zQB3A+?XDuW3&2_Aov6X{U z?v(EC77zsqrMp485fDV_8cIPxI)?t=-*cVwJm>sg&2`P&`?G89wbz;qk`xAMcAoMK zW^-tD!J^BhK>}RmsO45Q@C1@93=S;-qHjW?E}79SG^u!6A+uWXdhpj=QLX=?EPreE z-G&gmo`GDB{fZ<8=P!OxL;lFZ6$PwBnA>RWMwUbCC`$xwgx8zkC(e}6$8uIOACS2K zrNMFV3g5T3|Av>9g3SN5cP#<|YyqD2K!fte)|=qUd_)yPS}AZZ5tLOL-k6Fm$K34n z=@B>-)~G-~9)3t9GW<#*d)DYCu{NCxmpCw^qpLa9+opQ0#CjGZIrx6>^*gN}wXQTW z{N=WXOYw15zXe#B2#@*y(RQGrrTqyo45O7o=&tq#58S%X4wr=`U*-tv=M4U4W~1uQ zMt)}r(!|t6OG_pUM{h>5#@i!Kvy#RGzr=7glZZJJNa#IhyB`tljY~00j=fN*XtMqh zt6XLmKd3+7cPKP|@qUP7XARv7vJZ|m4k^b>d6|r*@tn@uKPkKw#YwIa%z5%j4FPZf6&JCNBJOlg?BL_7-B?RcsFKQgR116_d(* ziZCQVwUGJdacpw%n5-zKhgoqkk()N6lhZDRny=5T}DJcmoR`F$W6sP%<~+u^e5+X5!y(j@#p`#$JnjO%;Q`vjpJ( zGv1ztXOPkorcwj99y8n9Ruu<^SYc%&tGG@HNc7=x(v)bHIL!i*P)T8&(;}hzMihA& zlC%;k@;=Aejk8~G#{v_Yh&S98YD3RvZ(xe+4&ed*jM38cMYgub1j};YW5^ZS@V>Js zByyA^DM6DeUnj7rGOg3V#DaGK}=wWIYpK4kzaE?UMz_JhYL`HxPy2( zyD^SqJ&@07ORdJA+qJ|O^J*cai}Y>Z`RgM&b2(A3U{Qo&+{Bq5dPZ2reP^?LFchlyf{t zUx-4O7331b1ZPoQKNX01Uw_8F-m#n6JNX;m6L98rJl*SstVp0AxaA=ZkD+_hmhd-h zJ?K?4QB=iWsrf4xdF$enrZ+2xaiEqx)xILQtTff@w=uaUKLs2<0-f;xA4>loHnaQ9 z=_a|do(EzP#>pCdYCoX&My`oOB&wraK~h>mN;cmapZfGv777%T+bu+%a z^ErY)zTf?NR}0m;&cO&gC^A|5_K~l;Tl)uA_m?*kBMS7zqahjjIbLIC&6+VNW>e+=oLk^;j zhO_sLY9aCg>_fpFTbLDUwlQmd&SybpXDlYDblLg2Y2~Am+}s`tOJQP+P>iL?#+4Wv z4=b@85)NvS$jJNxPSF1SA#3PyKSHI$7|@LRCWO^D^o1I$9Hp$mL#}1m#!Bf-+;{!%aU|>C z{LX*>;70*7_%r3B)ec5r<{qE))LfJc&q$D#hWvrL>1*_OiTh2`DL*hBlN^ZH!ACTB+c zO`vKwL;m!k66ocO(%T*?d4z|xgje(3F?~Cawl1}cFlsQWIbB3g+rwryqj;R`Bz{(qVQ*?*b=CV)Z50xD0M3GI;Rn1R6hIm_s#)0PLP zsoY_sx4n|{$X5_vNVX?$i3m&N6N<&`?VN^Lj==E-FS2vhEo8%W9X)ytqkH9N8FI7?7fMWg-3w1zwpd; z(oT3RRu}%kUDETUKx&-Db|Hn$GyWQf?`+fQpDhQ3kNIFtG!;?c!V4WG#;Kc+5I8?QTS- zAjzGtK65@aUmF@=pk{mTyL-+w*OZ`Ru#@AYU}ydtJnd9E3R)lmtH!S=qtwGY zNZ~TNNVWFz+nQqUveI5Uchwtp-(RGu6zsOLC5U$b=qx@8YFNK{p|=UPUms|JuV}yK zH5D@V$;Zv^Vl5~--6Rjz{iyCrtIas-n*6E zy`Re@z*y_9e?$D~Zxbtr?^Ywy#>qK`Wo--BG1(mxA&4~TOs=Q4tMdJNX{Uhh|3xVP zzGeD0fES47stQcJxLn5u!{q&%)ZUO1@CDkN4Dxcgo5)e3Ei^p31uDhK;uWKKUxtMf zsi!?UT|Y*pQ9T`3rUb>Lt=0;TpIs)UsJ{tiz@x-+T;R5%`IeSKZW?(fjIo+fFG59X zHh5XTx+od;6*q~#Qe#{KSk(uc1Gg=Jnt|c&{H5{p;Ir|0BPpFb2Iw;}^hP{u{>4df zDYp$349hR-OAoLM4WmY1;MD+sl=a4QPYO{$#;~eb9ar(}%e9(l>kOISeSG=y^kzq7 ziB`i1-JJ~GB?6K7&WGmJV+JNWS|!ShqG$CjXePPlFGR|59`|E^OPvjpl}QEI$uxbn z)VeV4Q`S^wT34(!=`8gjGpTNQ)AmP7Kqh$v*Z0#*9F!>;_CIr{q$WU`@v}DIBF)(C&{>}*>v+Jz(7X)0 zmL4>>Rf5Uvi$bLXY4iK3qs&p+zJ%srr+sOJESee5PI3J(LOE=kIdZBJ+*w{Qz3^Jm z^RvAmrMtZFZGIJCy3Y4SPnS$xFrknBnJD>dCay0?&l@2p3~A&B`b43buoRdV0|PTd z@OH9rz(g7Ffiy5pfLkk77NVa5$wne&xSh!!LQhFPTV>(&=m$7s(7zcF)F`wxtTcH@ z@JeLrCpu%)Q$0#)aoxtl6`36iBp0!fu9eH!_(8bx2i*&oQ98pA7iDsY+Ug|X`&_=4 zS`nO92G-={FTzl}2z8!64&4mno9KJp$b7VuAanQp2fOCa{0fa7EJA>P7WTC52EpPX zP_S*doy<0c+V)I&;Td6GFXfO0Db_iGESG_YC*QtW<<_pN`Ya3jp0Y2mdXgA?50qqfhCHN0av?GW_8O|A+3KVUsU zcgVvRY8o14lZ8g|y$j)~|%ciJU1xIr4dcmTVSW^T)dZOJ>D|WVXIa zO$()KcdR~8ad}dYTy{z^f^+2E4vIR{Iy&$y6#(2@C%eRBDi=(P_xNMVh!#}~^F*@aM!7&Ua<#<{(MQX{8 zcQb73P8UblKCTaa7~}D3*UhRB6A39P{9A;CKKqCQvPe0m)S2}|M`|5yNMq}KXXQ9> z=n=RXO_tG~p%et7e)g<#?7PXA>sT{duB(*c#WcQwQ+smnZ{_5`v}mBo-(M9WZ*}3R zk@q);WAy7ccYUlbqzhKXDuVC9Gda3Fq2muL@k7mAnd{!&UC*X2Z2>%au>F(PDz0D@ z#Sj(@P2ch*9%?&Hs*&9bkWJccuvYVP{Qn6OLRyi3$Zn0))YR?<*|J_|X1qj_vlxRm;TEpW}#~u%qpRv3T>h$4erSap08+_4< z;Hb*CdKVXgOpXN(hgn`UMP&6A(&3GwDqEzuZrG?6X$>Up9IbAWhZ#BrXWQKKNVx!9 zb-ebVn|}t!4}XZsZRQYxZEhiTeM14QDCF1-5r58-w{=r$uZ}I*k(|UoM>wL|lPni` zKV6{}WO3aR)rrjPOg8M&FRV`>F8RO|`l2Z_3Y83>>7kpQ$+2kcvuOQfs_rkrq*}MQ z&u5a!oypEFbmLP$04KXalFpO>0i}BfNu5a&1mFzjHFNhH`7Bj-zJ(}{fO+;c-PhXN zsq;Ir>-5xsOS!eiD5gXOMjWK`wC5pV4!!0Q7Jo-nt8J}>Sw;?N<%UK^7O6IuVrjP> zaBY*Ej~BP&F=NR_goH-;9jUD9pVNVphvev@P?VA(fQ7q>V@2oe+8oRv*Z=rsFWl`( zWOuzQD}QdfvXc-Le6_brP9h@c)((xF`j@V?@U1E} zX992{9QE6`w5{o|;-Vfo!0n#soP~Im4_3;hOK1-P|FfuvPBCEhrPn0%{B?2r$)vnW zr%cT7s?772!Q&l?HCmo@4eAP^t7cd}b}Ahnww&_*yB^0gj~(Zqu*?{uwcgCUZqcKi z{KLl@6JD5<)s|Py2LW{@!*6!Ff|unzwgk~tLzX1GSXHvn{jmebVjVD(te?;yTEm?! z0T7e&fI&7)yFd#i1c*UH_Bo{si^Re$k7lPo=eE~et&nW&FpmmK zW|}XU2)0Zh-Iu|5zpC~?8}jQa%Si)2tnsHZdZbJQ+oJ-*!8njK-iS~qc&VeYsHwgb z!LZdrg`!L%O(Zm0zb(PWGw*Bc<+VWErH`vs8FC}O2ZVpX_oz6^8MxC#wwe1QD;H^QvVf0*bAM9Kv;OhgU?kwr>V}op$Hm* zQU<$GM0|MzF|dsIuUW`?I}XX+dg2VwgQ%?ZG|g@t3ObuvIzoG>@nSCGgYbjkP%Pt{ozB2jcDWXYZwpzX{S(0R(q-=+#M+Hk4RjwbU z9xIPeUy%H@EVU3Q&hI&S`Py?{>m&VX{Z}^ZfQLjzsRMB+WBNqwv(S4FN*pxn8s^`m z%JE%UixL>c#~g_q^wvy)7U24@>>@PxUsv4sLM@Ng5QADx~Mem=FQ zPBqV6e%z_tVNRFcE~>O_B=WVwh9lyW%uZyZn3y#Q^M2B$5yqsrAEcZmdv)|!Dltvw z@iqDXbuu&Zrj3X4(4vO@`ekEbtNvs1O#(lhj{U9&tv)rZm8)JZw($heE51bH<9zop zAP~Ajf)-9!``W~h0f$^>vS$4iGmakiegvN}TvSlSS{h8y8}PYj)Tx<@dlq>gT?r&f zO2Ckg%lxl!Ia=$~%kw(Svr-+D5X=fLd#^TXO zVvFmI+IY;OdyK)b|3yzHXU~mcgb?jFwbuXn5ZDvVmP2=9`u5J33n_q_w#KlfXpT}y zi#sC|iTFr2uKbx4MW0S-pwG8G+)pPye`no3yW zGPkZJhV@RC9ZEca(b03=pG69G=+-H4 zu7U}S)7@_XWnGUbJzH09W8H$t>^#Oj}6yv5AHLR=^ukA*f6TRZuonFGHSZf7{;T{AX>aTEA z5(-3W_V0i_ykFQ(U;10n3OqSBSiy*7S+ySxtInl=OJC8@4t zJRo&`vrAeRzRdg*V`~-q5F{DyTVwU%_=BJ*m5Y5>QBrFf*j&{m{mKCyMTMgwFCus` z)#eaG%42Z6s_yF>Ll`bU>qCgtJU9h9PbT596%~h3#i4;)U^Jds;wBUHJ^^E+`n)9! z9nZ(yLJrrQ^YP%lmPVWFa-xKzJdQg{@(Ju3(snnxA|bG&Zgkghc*XhXw!@6&9~CKHqmhPcSzKiTHnIaM(buE z@mNwtmFwnP&`q69*}rC_mkbR=aXOauvJ`Y$J0Lu}hvTkyI2t=3X63CP0yabOV@lR0 z?U(aL4z8{#%Pxux89qsCXmpDP4{|W+5DN4lHM8BdUNy3MVolsyxXOJEjJP5p#A-|L z+W2gMNvrK9Afm4-^I}$cR2S)tDFVb#=q>A2DPR{`SXtrHOF5-h5gtW3PRT&5Lf>UO zvM!XbL&{`(PCAPOTXen{M5sa=uotDn<_6gsNFr#>O*oBwZli?^5qm?K3 zkiZpeLC&HGm%cio!m@yb{?AfD4hBkuvZh$5ptBXKtxOMS`#UK68&2wdOnj@Iw>IkVDxAI#bajIOq zbmO}o15=wu8%i;%v&zNyKaoaOS$Pw)tHJ)lVODQL<;r9B=x!Y$?*wNZ?8u;S%_lM> z7&=>Q1_KhaOp6~MyM{!5R@p6-n}R5e@xK>vP@yC?kYei#ENLL8Sc^~trT?tCg%yzX zz4LwfX?GhjMD?3GGC%Sy^XfR{wISQx7w`4%=LwOuQ9o4jVM&f!DS4cmNF&iJhU5l= z57>F$&gX+V=c%Umg&V|7IJJr{ds4(o^QZ@&#fGqt5QkA zn|2rQK7oTrMrIvSO+2(Wb5)UKW|K5Um>xrJPjmoMWH^|3e7Ljm_s>m!?pnBC`|^D9 z^lD?aJM5_z3wZ!<{<(91eQ@FrEG}#=PHOCTEkA-E_+seBbY=eb6`R`BUETRQUarVcf7NLvm?`tuvIiocH{YU+*1l_0k$#&#+ zNq%Ph^Jd>vzajRDQMf*DiY|{iueg#4=K__^y{dIhLlV}xI%#MX%O{<|Iil3LI}W4w zl`lNL*$l7qSni-?F4)cR0D2!FqG1Twhrov*zy_dq=f+qy$hyKUq-<) z1&LI;x|ggW5~-EVe0br>Th;ybu)LmJ?(LWE@`X3mr2aF;Z^?LyDP^hd!e@#*wOrr| zodM$FVn|^ai9?5cV1A(pyC8a~psNJ)qcU2mcxKkMI*9-$ zLu4`AxKHO_K0@FrjfrN&?%IkwT&`Vgfdj93b2Kq)&Dg>Eh~+*YdvM%#JU=oHE3DdG zlJYQO9!XM^5?-nGcJ^LxnR;223d!5}bTl}%ze<^b-%J=Jn3P3NnmxQBD7Je2i_Znd zOi)AzL{9pp96<7|>-0UwbNc?-Z}|QJF3^gILF##n7U+=^i^D@>+>2s_KJh3iKa^AT zeLn;>3nOWSW(3`KV@lp=(u}=!%`+WvMcBLW z5xFWm3pS(rTWgA6X&j7L(K3d4A(h_y>Bn^1fYE)a!~U1Gqnk6b|LF*zJRgAUW=ePn z?=?e@47d8d=^fcW%c%Wl&}@DEwy71lZ=aRMpdVHP?3GN**KC8##bfFN0_qr++k%yKkzq zJ7ncEdH3$3Tl?KT6K$EOcpmQKWAxPt6i+FGNj}@=*ZsXXVp+p(b>k^k?Ov+Yv;0QEp;KcT7&NIrxn%s8fd8 zHKF$f(76yO1><&&|K-#?K4IoXYT^aqgu9IrJKiIiV(5kwB^4J8_maWP&KE?F-^9dF zzQKAe%Y&IxGC2C|_)0QABUk0;8)oGU1~u)#{n-lgC+hfW{C^C7sX%*|0n2}V<|sau zQj(Wf`m@tZzCBp(_TT7Tsd&UK(`FIrbMzZhx-o+i$Q-ez3conazx6;l+NL z(VUe8Qu zAY~0KLYnLAH?mAA+v@9N4H`Z5D) zY3=53!L2=Ld}5Hh2BWM81`^Dc(5eioETtM0r6<*%lPu&hx+zhkZ06(DjwVBQvg0-e zUiOP;Od`pDEaGV>Ho1|EHPGPr!{6wd!R}svUd}zmHj&ljHvHY5_%hX&KjLFzADT%z z4g5hCz@2$3sHAh+3^onxCxVE_P>-gYM~4s&VoG#XYen}5zmq}NW;+dlm?CeW0XOS~ z2X1d!-79=U$gExbg8st=5aX!ZrujXjZ8jdtEOge(MRw=U``b|H%=N*t*6LG82-*3K z&>dxM416WpbWq{GT4>AHn?kBg5Pz+@V8-^5yY3o(qHzCUI@YmZ?`0rWTXkdSCHPch z8t$dum6UuZkw#yS(W4f%4Mo^iAWYjLpY`B#UQExoyCrmS0X^&v^B~Y9TwblX`SOeT z;@JguSCEDO;{DdLetqtG5}UihLZySQhOtHb9`QP(QjYdG=U13ANQ;~Sf@wZ!@6O`5 z_bjXa6}bb``p;4sPtD5W9Ib0Dc`0Ozt7()f-gw`XsNkf^(vJ~EKwqu$7tvB&f8rhf zGH!T3FBBsPrw9=z$7ZgxNf#;i=VTkZ@9ZtJ9S{Sr5^B-5rk&VDb-84LCZ#xt*d+@Z-=IAjJsv&QllnUJT78X76>{38c6~M^RrxPND zn%X(RdZWN#WAkeB2~4Tb%F{s|nWD8^Ct+)0z--dj6gk(;hTGGB&T zAg=FGk`qUhA&j`^nLEuNT0(1SrHRafY4lNb_l!lRq95c|RHxJFW3Q0bVw>L$s$HRW zVMqCXjuPgmPY%N)rU5OLd-$1FDGeH~04*Z*!=LC2-`oXRCucJvR19-wVh9(qe#Ed= zi=XuIa9KSK{!je=kDp?5Py_G@jS~+}LF>^tQkb#A{pO^70%3TS`y3yFeSO)76@>2I zk9HW=?plUq>rDunZ64^i$s-+n)xGI<$tw6cacS3Vu)B^G+N*ay{rlGie@Bv+sjf-m zD{?U%FvC4pm@J9i3-hmdCu-u+cj(8XWy^AtKYK);o;;ZV)F%fE3*@`%fgTEojQe)YR-$erF>T$mKHI`>tYMjN3F)HMkv{n zMq6DGmksk@hF=uKLWV$)3L0Auye+QR${;ji_Bf2NRBHLZk2Qij=b=Va z#bclUUV?li!>_4>k*$JN_n(3u9GT%MlvP4o9|hz3WH2gQVOsaF&^Zx~N`(hTtvWWC z9z{HK9>04#MGVmwj?6QCo^hkvdN;Jt^CoDsCUkDaXW|K?ZHsKO!3-d*Jc?oSBC*C- z97pfVQ-8J(DtRE291_wiLT}lqV!Y-B={VL^YG@ZZZaCpFZJO34*s;jF|KX4hvB1-p zq1?KXw}{v#b1s^s8`V6>@7)(+8h^Wv%N3F|FX}29o?a~Mz18%T?3sb0?2yDBKSm?& zm!?QY8}F?4h8CxF6Ak;mi}8LU%ALPUBxn8_l-{DWu~uaQT8KDF#Xzu=+`mw_{3sRK z`#hqzj|=Z-szv=0Ss?QauZ1xAanzOs$P|58;5|0Re;S(IPc+ZGHXjb85q6m0IamDZ zyQo6*DS{#%HS!jRoRW+!Ec3g@USY1axfQJcGh*}eYlFyD2})>JvO{-fa)UxC-=d)Q z4HR9~4TxeNaIMyZu45$?UW({Li5YMR^cDg#9Rd2qYZ9@&1D(nMi}}Qf7K$M;HMZt( z->ch@E|=)J&SmoTP0o|c;F^Tcu;2@RPJI-vqN}`s-MV(dts${cm`pVtNCC3~qKiWt z+{}+4ntMx_E(-;OAIa8Sg}(qWueU9{C;0Yc5Z}tdLAj| z_UIs2fBz2EjF)QaAI1H*`JYZ$HA8gMQDkOQO}6gIcVkFhZ9sZ4FG#E1)i?C}Ce2ST z!(ocoFE}vp)*PM5wG#U;siFv}=#dPY3D|4AoxAF|@uX1|78S)4!}=s~V^D{tr1FsS zLTk20?P;H?HF*XHS!)Yl;KhdXP;{Lr^ZU83i!{zJdx}smtCwjHyUK$_8f_>Z(O0)x zH@oo=LIjWeVZum@G41vDp1Eiz$SC&-ltD&!h_n#2*7#7i^i`->hIc&ZuAqmXIK5*ca73n*CREMpr89HhRQ z>S|&TnhU64-C&iI85@ext)oGAn zV+vIiEX=DcQ9@Cuf)_Kwk>o(t{DmgNlOah;r4LBXyr@1bG<%=E=yzQTiutIfk!-#! zCwmS-wO80_?aMp&p8IgS#;s`5Cad2v2HAtIZBFaTo#|@=H{jgsLhdY zA4vuL9I~KTNhijxSzlobXt;bAQ0DMk%zld^(8+Gf)h%7a}pU;6E>#A z)F{aYl5pP$1Msp@11Id2zrPoxo`&nz5o-^jQO+a00YuRvz*34!4hx+^f26yvpj zY_}){?FMm8!JTRvAF-q<9Z`h!7NXyUeUTKc{Kbey7wYy~9`3$W$yd&Rs(@#C*1|76 z*)w1F)`GfKn!Jo&=AG?j`ors(=Up>oAV~O7{$3tp70$#Ur=Ia*qLE?RD{yBly?u|T z(S|*QtgfXu7Osk67Q3Yfo^-tu?2e*mJJJ~dTLei=$ubW{KbAWr!NgA=rVo3|;LhM~u77$&{#ykOD{q1rMHmEKG}*h4V{mk{ zX>W)vjhjg>nsf-WTB`jF`MCSw(`hm}JuUVx&~#AW6xcs;4I6T56pviAD&3@lp= zT9m0q7Bh2tT|yY1Piqt;?+&-9LDqO}GWzik^&RIt#IL2Y-@k`^x8);izSBS;1E~K` z6lNHREFpN`t`sZzRx92mKJ`7|ju zm-(4q!Ef9uBpv~&hz@o~hljgXC!6^Ie`sA6_i9cHi?kACsu@3#RLxR`$UV@0? z_1Mmf$D9=D%IodWu#IDxcI>{RZ#^IXy`spWUm8H%SJdIR&p{7zhchoM?T{N$6&Qtp6%h?l9BkYw9Jdns7tN zyIr2d^7#nqMMT}vU`TInn#DrF^v8%S$T9UZNVpanDmW)f=0!pP3#MRbKDO2a4j*_N z0FB7w{B#OT=))Ws+0{cz&bJ;4)IXC0#(P{7F*UkXc?AV^j!z?jwPV>9h^H;xJKB?l z&j?22BqhCv61}G%X(M-z1bTxzp)%ML^AYoYlJF4G(ZM8%*ahqRt(JX%SSPkWgh!G5 z5%(>kJ%seQYv)-l(nZMO58jQ`LIio(g3Fll{B5`Cp+}DA$HbSvgUWh-6j(^C2(6f@ zt|Wg+!M0(Pf)5)HM!TBEhVWKRf3s#hD&;Ai#&!sN?i)@y$)g8i(pPKVpzKU%RsC5?s-66lJLp!s?FHiq|<;_<=Q5yB%t+NgI zKGW~s`$2&OBDE+G^!jLG<{{CzOOGfWHE60-7N;CQUIVn@{DZdrf(~rThv7dmfH#TP>aJ-QJX@}d zui&!lwyq^K)3D1zw!h)x+{<=-9EGtLf5$?7Ok^PF%uuhB{(YT*tGIm6Vl}qDfQo{!~$t_Vl-QO?qd*d&}vZZt?9hGr@l^yvTc&3ijEsV zZ*2@nfByVgR36y1o8U}y=(e5Dexl6w_{X10@0t~MsC6E~{5Ti*e(S6xVIYbYeDeH( zI>bY+)+2J}?sQNyh_Ww`2T}NnK<3|QwW({~E4rSOz;B^8MhNTEkkwYO9{CdVUpa^o z9gjLqx5_3bCkK71Lx!wR&g-VAcRBrW>ve*nE%jWbUB-u|lqit;Gf_t@~uC(7P4a zPBk#y#0#|q*;iSQGyK{bLa2+AGfThYv+b&nWLFG50{?_Tkh#E4%h4ne}xW(|1O{}i*3>r!s5X< z5N1Wb>r`{MgBs%*7h#L09|6K;qt=Plv@JisgMs5t7i3Y?L~Fgzs(Rrjw^NZ7wk&Et zWj^i>0wEf;+R&>leOUd4!b*6zQC3EJP2)tS$p4M)r!({PImzy-`AVw`b1^nEVF!aVyvHOrHfOcSoLZ@>QE6U}!_N zruKu9ScXfAQkCO(x1YOk^&5+ych$#e|AsMsRGmvqSjM=`!}9}7F@1c z{*Ci?Id_~;G=4xuXjWt2|Dazw#Eyg3q9~?N_j9+c7DGRaQ!~K66|kBFz2SL~U0^qb z0ZMG#*&x`lK$X)JY`{H^<&pu)rcPE2k`Fd68o;KYEXL~A=hOsM7uC{4@KFO?JOH_e z1?7wD4H%$%P)Fg@ULPLB?6X}9;H)bEDy!5QYh*_UAHM|lXg~WVAV~2Y`McHc#}pc| z1i4r|`D-^OPgD{24Uny^t^H^UO)31iY|>;-M^q~KXOomnpAV`uln(M1BL>4dtooPT zV;r${ms84^)PgQmrEZmZ7WOU|+0l*TeTo}?#C|kXWMS8I;z2AVh`~!@Gt3f-Xo`!tZGZZ(6stYwX32 zZF_0o>4!T*9_&un;9dCeZiWToCB9;0 zkuy(eg1kO}oCh4{c+oLDxEN&9u?IYP3qO_hei#hI+6c@IaFNdnBDTn9V(TxOFfVhT zDr!#h+|$H+b&U25XEO$Q@e%6{UsN{g5Q(|ot!Tl#Y{XBEn&@^yL*nnnATqi3MiesC zMN;=E*~L)}uRkDGQyjcnVhm|nzG5X3rMWSyrSaG&#{diXdCg`64h3wh&dc>XBy^j} zn#t4VyGf^yL)`)qgQtxtIs3(pRre9u>$68aivmi}l~!5ni83-kkO%=|aFp?Z-0}x2 znW+uqtH@o%CVq*1%@Skz?x=llahj0D<#O+osq;pQvX~b>3M?4x;%p(AuzLokm~`4)F6{`0QcPeNSWlR zUFXNgSU6|~Y0OX0wY}r@ZqT>29}B421F~qyO1=)n5^6f3>a|$PCH;m@Xyv_DL zv5>>)3$YM!!66$>3|>0v?nP{{KF(q~ts;ecN`x!XYhs=LXxZve4SLk@LM2QQ3BJ^j zGxs~~30b?@mqx_$&&9-yxOjL*+V7Nh#%0|CS5^uuMF3KkkF9OtL&y&kfW6t}dw=rd zNVtoF&nwHxx4E1-$tg=@f}SK=F4^?d+vmX~DJIU&@43O|C?;778K$~-5uCw?bn{_CHs7V?3g} zx}{}hu|OuRDlXXW*4wEZ?V)u;-h2l7*%H~hX;_1EZP%gs2^n!8T;1{{dyC)j{rkvn z?&>K1wnN^R133goE#bv^I|bSucvYmKAI7Q&?3DkRYP(clE(B8)A#YrnJx~Ol1s4o& zWqtWPcKZ*6F_FT77hqu_lfh)+slG|g{pReKTkC2Lv7aTC)%4r%DLNKiM=C8A>O~<( zggcBMHl1#Cy>b~SEsIenO^Hdh>Ph(S$Yt>Eg2eDF8;)a#NAq6rL!T!I;^>N5(p{fc z41O{=%|$OI4LxWGI$_J5rTG0q?WYZhb5eY#d}6VCz?b@xKPx#0!vX6vJ17qR7ad9Sfn**MiKR*Y0i;UmxUj72)Fa@p zLr%**vZ7@5^W_w5w0+*>c6wrKyI`rTQTE-&yN!r*y`e0Zy+mCf+mgIN|O;YJehtB5x0yLm9Gp+9cPr zThnDD#MStfk=tx@Ad!Imr>v6$D{vR1-mF;U%l4@Js4v~~o&IyYI2FgvPz(JoS)=2s zsEv(vTx=Bx>7fkyKuM~9HsJv2zDnQop@5vmsCRp!;k2Mx5R2ln)LDm%;?q`l1y|4B zqz=+aM%)GP9uloaQ?lZ&P13m|9(iglhDW8_pYLQ^hrt(+k4H!yL;J$uw~aO%ZCt z8-A9(4>jsfy+M_oi2jf1C0xoX$kiZy^`FhtlaaZ(6oH77P1{4Syr?8-E#Gm-b*IPK zjxr-dOocuFK?Rkau4}u^$_BTb5QqTBpPp<9auZv*;#eO>-=e`1>2sPRYy_Es`$C*wy<>(C9~{ z2v2kPGC3qY%OCXc^Ob1Tv|n3ILZnXtzqjFl-SjaQkCP3Vu3y}4|1#rxXVAH3U|;cd zc6@VJ^wl{&?n)=&%F+#5Sh>%W?&Va8AqfNhlmS68I1I9l;}gbNv;}Gi*}%9~XQ-_u zsQrdv-w>uB_f}I+_VYz>{bh>TM3_x^WZm<_``~w;khc~fLCt8V{F^IuJ5$68K9j3M z|7*QXr^hQ`Qxt1ur9mCapeNCL#gAYFNeOBtIjbK-!G2yS8>ia~`^fg;CyaL?VA_rY zIdV&)CBUc(zfY>5oj;-X-)ty7+TC8ol|l9kVW~u9y$wf(1J!?K3cCy7ns^kDrUdQ zbw#DS_aEnc;EL|0_V4a-TrJBZh6)FxR58m4?*MK5&C#R3TVH3ts> zh|qt!J^FWR%km%g`nPC+oFxszxzNeBVIA*aP|WS!9*OqNQa`6Vm5szOo}<$slz$H{ z-a!R~Hrfc4?UU;+42zGW{(67j|14>L_+aQVPnb}#`3RHps-S-2WED}x@mhTH{ zViWnyR*q12{hu*6 z)2h_`%bQ>DKY8~9tS`hweyRS}X&IgD28KJ8`{ah{bZ)s*BSb;GJ6TxMu!2Ju{`7ys zzTrV{di&bG%Ip}4zV|@ml){`+2l=a)Q-G-K5B;@XitF5gqh*-y#wJc&j5 z!k^x*l*5c0KYXsA$do%YvovY~Ee+>ZxQtmp+GgXtk#Gn)zO8nL@O#vL9$B)RS#@ekx-&OY+*x8kqD3A`_gGhQm;EUE2p!rx~`ItS6x6BD0l zVUIh!dPBY+F1)6@O%F;@QMb9^x<9f=RVXN>ghvi%kmq{H{QdL$?7dH{2Af6ADned~ zzm9;A_kT0*Ah~Jq#!R(1wyZ~DZ>3JFQ=;UvsMPrgZ0_$T&Cu}0~YMFz=loDJ@*T=#Tze}2MLXTlEkq`UW4QZ`Vn z8ocObEg;PM$!)Hif;-ftyIJkb3*B6UEA)lb>|_<@`rLg?Y&CpS$edmHFeQmRg+=3mq5n^_J9 zs@F@Mt(T7_o3G1+tqeWkf&|*QC$b^iJd#eHQbH=DA~-+hi^BM?$zYFmLR)I((h^3T z>9lwz)4F4F^@!UE#6Q<7pCe}B+ZMy$JUnH8&NgP(4mlb24DqX+Qfv8xmHooED2HP6 zhxh!>4!3$>C3R~1_og*`@XVmI|G}Dtp3IxlR%s=ky(0eKbhV%U_P(8u+eCR+o8Q{| z6Ck9m+*YQPhwtvC3EG_H_>&)$ziC^btsDCytM@H`qvZUr#aZ^M zI}B(hz8#v$4*RlLFC+It7loDIzj{IVy615b)AUH()wmyz4`ei2$WJGFGnE)pkYyok zdbZ=4Ue%)uIp*!HDjrGM7nzQ)nZeig|J5_$-|(2>15Rl2eRB>P2Pr?61PXt(fH8xy z*k#UYm~dLAVW)l?kpq~6#%-eOH_vT7wcTa!Cj1`U_jelRcLTt-dHX#f_09OZ$XNaH z`n0i3_R7R*ED}T07be zr985q9C*WA-QfmVyng!Si&Bf`{b`tpv zN5gR!T03v1FmM;DG_@jFqbNXQ;|`&n@iSxzV@H{3SylerzlBIHIL#mB@JRN&q#s_U z>xOFCMSk$;=Zz(MjV|#{Rn^KKPd4)hd8)@J-_HUEWEe9QGdWcMWORgz_X-Rwn_3Kk zN7vsw*<9RHtQAmjLmzvJ`pOFTFJ|7?%Rb1~;rrs{&;6gi-~2FTLnlROC$mNW(eb{e zam4!Ei;F$8zo?gNpSpdMCyk4yI$9atSC&hIm>%)INuO`iDpIUXLR%|<<qjvfvK zr{@V&Q*om;pAPmxML956JGVrFeC8`fv|*cSy0M z$B`Fed^VlCD!L6}a>b7`P22q5QQ?8vEG6+%@uQE1#~)KKpNxka zo^5Fmq8#j>=i1va{`_>q^KEix{ZC{cxpd4{0>mw57?zMfC~Q?XGHL^knLV$E?~&w3 z&K3o6(qajvbZkjje;fZccDezxR7RO==^fx6{B$8CKR3JV;Iy3X z-s^OezivIkUE1176Dv2D+jK9Xd!aNduxA{c>WCl4U#dO^Pc>2Uc=q<)$`M;FLAA@* z1AozE!D;g#2}=6%zE{^)VlELPT78AYx1LR9T21lhim>A`w55UI?Aexo zYsnAx)n=Yck{m%twQ8P|jNE+W*j-`RW+Ne;_VDx3m#6y>5v9AmLo5=C2woI>9ocHy z4O7c)CQfD#{*lPta`pY$x-MNxi!NvMZ0eU{P^j2#Y;?Q=i-r#ho%?X);6Kpi{ac@> zM5d~+H-2yG*l06OACK@|mdKSC=rP+T_+Q?cF;~7T4Xj10Q^sdZi`eXDORS1R@bBQPT)PqL-LD_` z5$+Q0ql%SZSme0Yhu`$u{8CVV`pH+D(6)K`!R%oue}hZm?zghW=>{+U%qIo#`Yo#DVf+Hq_UWP8uU5fvw%w;!r+I0TMezxVPr455SATkhH@rt3TMba3iz-3cGC zw2c1C?_+?&xivL3T<7)GV%4Gy`TbJ-j+PQeXm}bYApXGahv%xJXnPJlR1a&`(-<+O zJVsnls6FxEU-IA2wl(cIrZ$T^vvr$HV#qcfY(F^Cah39Bg?v(&1Xob%3Ng*1Tv^fo zzS$-cSds-tId((RRrA_93t!89Zb3i5Sp$=x@FM8`{nzAvuO6@RlF?T4N=Y%gUmJFG`$T%!l`?iu zSt+|rZa;n_qu7s~Hq=+BT{%5%oA2TLl`zL6@|cR15+^KP6Ju7y14lsh|T2VrxA zch!T2?lL=F8OKA%woU!Ur*?>>Z;rm*K4J5EYCO}U*R-S5zx7R?{qv^=;j8|^s|yoj z!c{u0m&&AbF&;Hz1u}C*!K`ato6^ig9&O0fQu=0DN2<0Vtjx6o`? zOU*z3a-WF}UK#l!>5N5tQPu-N*)gd0-1X$5YoXTnd%#qU@oRnhZ!pERxw)AX&I?4^ z+v8veShM=+hP&kcco0CivG3(DKIVRs!rmVH-Gi(bYHDiCREwOfJdIX2P7!wDvorsh zl=GTV^weW(wf4PcJFZ^1Vs(VNEm&mSY|n|T!KE7?PanyE_B^fHbhCaU@6z3;5;5!B zE)aEt-taJCw*j~S{a z3F+=RxYk?G=wcF72e*Q(G-GkhJIgJ?t(ys1o;78u-^c;G254j&&n(kKudzZ(e%IVMY z#F{gw)|kf5-1k!Mwgao{B~fxJ6{{bV9&O)VdW)y{@#I-+NPdS<-6Q+>u?_c`=?s|O z%xWz*-Jz=}LlRMT+xS=AuidT=ySE8ni2S(YHEpU49Yo)iyK?Yb$fj%O0svyRUS!K9X6Z1MV9iCw~TY zY9KX|CKD#xm?>woYL;_Du?EO~(hbI{fu*&zDPl5nQ^g(5;*x#s=o;k+({kO>(2w3j zj9>+xK(>0o)7Cub15PFi9R`-PHMVDBfm@&X*@#BA=H|3Oei=J+7}KXfOnpS5zh(#h z%6g>%wmHK&DRdYnBx!2tezuwyNuQ+5FJcO6g2M|7h~_0f)!Zs7D|Ja=qg48Qjnbft z9*-QtDlGRBDPS*|DM?95RWB|s*4e<g;2GPJf6gw$vC+ib(LqZN^lOiDlac4 z#gL}J&90P@gCaNO!pb{sZ&y|wtM4~1N#9)S6Wl5u)mF1$7%+L=m)pOnSN&-D&T-}F z)#tWV$JBzUro9^Ot)fO;s^t<0D|TZ?US~aV3gwmXyNtLTy@+gE&i67pzg~U&15@+f ziIk@LG8nR@_Xb`JRKFCIJLCwV6A9mv6>B0s90*Dp>YnH8n@0`!ZTw??=XJzy*KlH5 zzfS*|T@T3YtTT!-wa6ro-Hz(h3P-(Z@@T#482sEv3kt!bEt;Y=d@UjH6xR@sb0TRH z(+bgr&h!5s5wBUQM-}lG?o1G>^E^bN>fW(PL#wN+LE+&@rkb=x`hD{NQ02l#jM0<5 zNFJK9v7umUT7Xk4G~?$-NikFJA9Bk!w&_1vmoo+`Sn*c)J8Od()n~MlnbJYTGs9W? zOc7Qlx#n=RZPQ1wCqQ@g;H^jKNsBdR#g%y^O_Nvzx)Z1VyOMHBR+2=3yy6mBZ0WlR zuBc6a)8GgRruKGtP6+y?M$c_*bviZ4v{Vdcrghc3?Sbm8G4hQ43tNvXSKt*byOX_Z zD%p!6^#oRum)59?9JZI|6x6?HG>4NI*vLp9NZCq6S|uZvQ3!;s;`><_*S!@4SysEl zNjL~SbeQ?}*qfMGcVs4}e6lF|RVEdr!QMNay=Nvc$J;k>eUQ{YL6*VBu?dW%+v-F= zPuzrm8__}!OIJV^PV{D?l1tGo6-pkBmIcdt)040@G^?~D=rG@_E6%I;XI}ukKQmeZ z4}Zs#=MrNHDPe45+kxc;VlRs{{k^@t{T-VA6Hv6VoDsnb6glM+lo~2iYS3Yl>=)lZ zP9jW@2*Kc7-Q?lM*kuwyX?U&z(XAM3kNpiw$UF4s0y;DoKR3#ElDw6az@rFekNoZMX-~po>eoN8Jf`vzmr4` zM4)kZ96J_q{)i6CXk@Zi-|fY`q^wZ|E&KyF+(FCizg7GF%?EKf56rBlsF#(ZwTb)c zts3@X7}!%;esoIn2Qkhgc?LGsvQ)#KNF(F?%^Qf>D3m8!-AnQ4Y>;F2E$?jWbC`)< zM0i$rCm~y=>!nCQvCaL2Ojdg*mHf<{ZDm#5UBq2+Z6WjfMY^5*{w6w1l2(HX1M<=I zIsq^De#W$Z?W#RmPA`^nPw2aXi;0Oz6n+{(aTbs }b?y_>en=Yr9jq_81;S^D}r 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 literal 0 HcmV?d00001 diff --git a/Assets/UI/Mockups/LeaderBoard_Atlas.png.meta b/Assets/UI/Mockups/LeaderBoard_Atlas.png.meta new file mode 100644 index 00000000..4062ccc1 --- /dev/null +++ b/Assets/UI/Mockups/LeaderBoard_Atlas.png.meta @@ -0,0 +1,386 @@ +fileFormatVersion: 2 +guid: 40b5595732a0e224680c1f680953d775 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 2 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: iPhone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: + - serializedVersion: 2 + name: LeaderBoard_Atlas_Wizard + rect: + serializedVersion: 2 + x: 1266 + y: 863 + width: 108 + height: 109 + alignment: 0 + pivot: {x: 0, y: 0} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 54d7856fc0aa2244393f8d7bcac95fec + internalID: -327468578 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: LeaderBoard_Atlas_Mysto + rect: + serializedVersion: 2 + x: 1408 + y: 863 + width: 106 + height: 109 + alignment: 0 + pivot: {x: 0, y: 0} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 2c3fd9a1f58987748887262e59067efc + internalID: 1981311008 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: LeaderBoard_Atlas_Nova + rect: + serializedVersion: 2 + x: 1542 + y: 863 + width: 108 + height: 109 + alignment: 0 + pivot: {x: 0, y: 0} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: b0fe28643b9febf45adb2d1708bd573c + internalID: -1607866603 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: LeaderBoard_Atlas_RedRibbon + rect: + serializedVersion: 2 + x: 78 + y: 389 + width: 279 + height: 349 + alignment: 0 + pivot: {x: 0, y: 0} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 09efdca7771da2d45a5c692c0ea72fd2 + internalID: 1965810598 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: LeaderBoard_Atlas_YellowRibbon + rect: + serializedVersion: 2 + x: 375 + y: 360 + width: 291 + height: 374 + alignment: 0 + pivot: {x: 0, y: 0} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 1070a4701a884f44baedcf43b9641a97 + internalID: 1616187056 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: LeaderBoard_Atlas_BlueRibbon + rect: + serializedVersion: 2 + x: 684 + y: 384 + width: 276 + height: 348 + alignment: 0 + pivot: {x: 0, y: 0} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 24cbf8b6dae3cfb42ac890e8a278c17d + internalID: -1572243905 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: LeaderBoard_Atlas_Dots + rect: + serializedVersion: 2 + x: 1328 + y: 644 + width: 81 + height: 23 + alignment: 0 + pivot: {x: 0, y: 0} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: b0632480a4a4d364797751370f80697b + internalID: -1493856402 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: LeaderBoard_Atlas_Cross + rect: + serializedVersion: 2 + x: 1604 + y: 611 + width: 212 + height: 209 + alignment: 0 + pivot: {x: 0, y: 0} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 743e26e0201f3e94ab580df9c42cdf0b + internalID: 1375524287 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: LeaderBoard_Atlas_YellowItem + rect: + serializedVersion: 2 + x: 1021 + y: 291 + width: 794 + height: 124 + alignment: 0 + pivot: {x: 0, y: 0} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: c499947c6942b8346b5ab8ae988f169f + internalID: -1929014163 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: LeaderBoard_Atlas_WhiteItem + rect: + serializedVersion: 2 + x: 122 + y: 132 + width: 794 + height: 126 + alignment: 0 + pivot: {x: 0, y: 0} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: e47105428ea8c694fa3c67b7b550f0d4 + internalID: 1931590350 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: LeaderBoard_Atlas_Banner + rect: + serializedVersion: 2 + x: 135 + y: 798 + width: 750 + height: 234 + alignment: 0 + pivot: {x: 0, y: 0} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 23cc1c4752ce42d42b470a368ce88dd1 + internalID: 662419875 + vertices: [] + indices: + edges: [] + weights: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: + LeaderBoard_Atlas_11: 775017976 + LeaderBoard_Atlas_13: -622534541 + LeaderBoard_Atlas_8: -689542493 + LeaderBoard_Atlas_9: -479133644 + LeaderBoard_Atlas_Banner: 662419875 + LeaderBoard_Atlas_BlueRibbon: -1572243905 + LeaderBoard_Atlas_Cross: 1375524287 + LeaderBoard_Atlas_Dots: -1493856402 + LeaderBoard_Atlas_Mysto: 1981311008 + LeaderBoard_Atlas_Nova: -1607866603 + LeaderBoard_Atlas_RedRibbon: 1965810598 + LeaderBoard_Atlas_WhiteItem: 1931590350 + LeaderBoard_Atlas_Wizard: -327468578 + LeaderBoard_Atlas_YellowItem: -1929014163 + LeaderBoard_Atlas_YellowRibbon: 1616187056 + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/UI/Mockups/LeaderBoard_Screen_2.png b/Assets/UI/Mockups/LeaderBoard_Screen_2.png deleted file mode 100644 index 65ede4672db825dde7a401c788fcea60049b02db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 626460 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

n$ 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