From 3d444c49303956ff2d984c3af6db82caca061acb Mon Sep 17 00:00:00 2001 From: Benxidosz Date: Thu, 12 Aug 2021 21:42:21 +0200 Subject: [PATCH 1/4] Add playfab and sign in --- Assets/PlayFabEditorExtensions.meta | 9 + Assets/PlayFabEditorExtensions/Editor.meta | 9 + .../Editor/PlayFabEditor.cs | 433 + .../Editor/PlayFabEditor.cs.meta | 12 + .../Editor/PlayFabEditorExtensions.asmdef | 14 + .../PlayFabEditorExtensions.asmdef.meta | 7 + .../Editor/Resources.meta | 8 + .../Resources/PlayFabEditorPrefsSO.asset | 23 + .../Resources/PlayFabEditorPrefsSO.asset.meta | 8 + .../PlayFabUnitySdk.unitypackage.meta | 7 + .../Editor/Scripts.meta | 9 + .../Editor/Scripts/Components.meta | 9 + .../Editor/Scripts/Components/ProgressBar.cs | 155 + .../Scripts/Components/ProgressBar.cs.meta | 12 + .../Scripts/Components/SubMenuComponent.cs | 102 + .../Components/SubMenuComponent.cs.meta | 12 + .../Scripts/Components/TitleDataEditor.cs | 54 + .../Components/TitleDataEditor.cs.meta | 12 + .../Scripts/Components/TitleDataViewer.cs | 156 + .../Components/TitleDataViewer.cs.meta | 12 + .../Components/TitleInternalDataEditor.cs | 55 + .../TitleInternalDataEditor.cs.meta | 12 + .../Components/TitleInternalDataViewer.cs | 147 + .../TitleInternalDataViewer.cs.meta | 12 + .../Editor/Scripts/Panels.meta | 9 + .../Panels/PlayFabEditorAuthenticate.cs | 326 + .../Panels/PlayFabEditorAuthenticate.cs.meta | 12 + .../Scripts/Panels/PlayFabEditorDataMenu.cs | 123 + .../Panels/PlayFabEditorDataMenu.cs.meta | 12 + .../Scripts/Panels/PlayFabEditorHeader.cs | 69 + .../Panels/PlayFabEditorHeader.cs.meta | 12 + .../Scripts/Panels/PlayFabEditorHelpMenu.cs | 100 + .../Panels/PlayFabEditorHelpMenu.cs.meta | 12 + .../Scripts/Panels/PlayFabEditorMenu.cs | 132 + .../Scripts/Panels/PlayFabEditorMenu.cs.meta | 12 + .../Scripts/Panels/PlayFabEditorPackages.cs | 113 + .../Panels/PlayFabEditorPackages.cs.meta | 11 + .../Scripts/Panels/PlayFabEditorSDKTools.cs | 410 + .../Panels/PlayFabEditorSDKTools.cs.meta | 12 + .../Scripts/Panels/PlayFabEditorSettings.cs | 364 + .../Panels/PlayFabEditorSettings.cs.meta | 12 + .../Scripts/Panels/PlayFabEditorToolsMenu.cs | 184 + .../Panels/PlayFabEditorToolsMenu.cs.meta | 12 + .../Editor/Scripts/PlayFabEditorSDK.meta | 9 + .../Scripts/PlayFabEditorSDK/ISerializer.cs | 80 + .../PlayFabEditorSDK/ISerializer.cs.meta | 12 + .../PlayFabEditorSDK/PlayFabEditorApi.cs | 94 + .../PlayFabEditorSDK/PlayFabEditorApi.cs.meta | 12 + .../PlayFabEditorSDK/PlayFabEditorHttp.cs | 227 + .../PlayFabEditorHttp.cs.meta | 12 + .../PlayFabEditorSDK/PlayFabEditorModels.cs | 463 + .../PlayFabEditorModels.cs.meta | 12 + .../Scripts/PlayFabEditorSDK/SimpleJson.cs | 2047 +++++ .../PlayFabEditorSDK/SimpleJson.cs.meta | 12 + .../Editor/Scripts/Utils.meta | 9 + .../Editor/Scripts/Utils/EditorCoroutine.cs | 144 + .../Scripts/Utils/EditorCoroutine.cs.meta | 12 + .../Scripts/Utils/PlayFabEditorDataService.cs | 209 + .../Utils/PlayFabEditorDataService.cs.meta | 12 + .../Scripts/Utils/PlayFabEditorHelper.cs | 223 + .../Scripts/Utils/PlayFabEditorHelper.cs.meta | 12 + .../Scripts/Utils/PlayFabEditorPrefsSO.cs | 77 + .../Utils/PlayFabEditorPrefsSO.cs.meta | 11 + .../Scripts/Utils/PlayFabEditorUtils.cs | 118 + .../Scripts/Utils/PlayFabEditorUtils.cs.meta | 12 + .../Scripts/Utils/PlayFabEditorVersion.cs | 1 + .../Utils/PlayFabEditorVersion.cs.meta | 12 + .../Scripts/Utils/PlayFabGuiFieldHelper.cs | 149 + .../Utils/PlayFabGuiFieldHelper.cs.meta | 12 + Assets/PlayFabEditorExtensions/Editor/UI.meta | 9 + .../Editor/UI/Fonts.meta | 9 + .../Editor/UI/Fonts/Avalon Bold.ttf | Bin 0 -> 63922 bytes .../Editor/UI/Fonts/Avalon Bold.ttf.meta | 19 + .../Editor/UI/Fonts/Avalon.ttf | Bin 0 -> 51288 bytes .../Editor/UI/Fonts/Avalon.ttf.meta | 19 + .../Editor/UI/Images.meta | 9 + .../Editor/UI/Images/Black.png | Bin 0 -> 136 bytes .../Editor/UI/Images/Black.png.meta | 57 + .../Editor/UI/Images/Clear.png | Bin 0 -> 127 bytes .../Editor/UI/Images/Clear.png.meta | 57 + .../Editor/UI/Images/Gray_base.png | Bin 0 -> 136 bytes .../Editor/UI/Images/Gray_base.png.meta | 57 + .../Editor/UI/Images/Gray_dk1.png | Bin 0 -> 136 bytes .../Editor/UI/Images/Gray_dk1.png.meta | 57 + .../Editor/UI/Images/Gray_lt1.png | Bin 0 -> 137 bytes .../Editor/UI/Images/Gray_lt1.png.meta | 57 + .../Editor/UI/Images/Gray_lt2.png | Bin 0 -> 137 bytes .../Editor/UI/Images/Gray_lt2.png.meta | 57 + .../Editor/UI/Images/Orange.png | Bin 0 -> 136 bytes .../Editor/UI/Images/Orange.png.meta | 57 + .../Editor/UI/Images/Square.png | Bin 0 -> 78 bytes .../Editor/UI/Images/Square.png.meta | 61 + .../Editor/UI/Images/White.png | Bin 0 -> 137 bytes .../Editor/UI/Images/White.png.meta | 57 + .../Editor/UI/Images/checkmark.png | Bin 0 -> 2763 bytes .../Editor/UI/Images/checkmark.png.meta | 96 + .../Editor/UI/Images/checkmark_off.png | Bin 0 -> 51228 bytes .../Editor/UI/Images/checkmark_off.png.meta | 96 + .../Editor/UI/Images/checkmark_on.png | Bin 0 -> 55178 bytes .../Editor/UI/Images/checkmark_on.png.meta | 96 + .../Editor/UI/Images/dashboardIcon.png | Bin 0 -> 49180 bytes .../Editor/UI/Images/dashboardIcon.png.meta | 96 + .../Editor/UI/Images/dashboardIconHover.png | Bin 0 -> 49499 bytes .../UI/Images/dashboardIconHover.png.meta | 96 + .../Editor/UI/Images/dn_colored.png | Bin 0 -> 514 bytes .../Editor/UI/Images/dn_colored.png.meta | 59 + .../Editor/UI/Images/dn_gray.png | Bin 0 -> 506 bytes .../Editor/UI/Images/dn_gray.png.meta | 59 + .../Editor/UI/Images/green.png | Bin 0 -> 2859 bytes .../Editor/UI/Images/green.png.meta | 57 + .../Editor/UI/Images/pfFullLogo_O.png | Bin 0 -> 11614 bytes .../Editor/UI/Images/pfFullLogo_O.png.meta | 57 + .../Editor/UI/Images/pfFullLogo_W.png | Bin 0 -> 10717 bytes .../Editor/UI/Images/pfFullLogo_W.png.meta | 57 + .../Editor/UI/Images/playfablogo.png | Bin 0 -> 75821 bytes .../Editor/UI/Images/playfablogo.png.meta | 96 + .../Editor/UI/Images/r_colored.png | Bin 0 -> 525 bytes .../Editor/UI/Images/r_colored.png.meta | 59 + .../Editor/UI/Images/r_gray.png | Bin 0 -> 517 bytes .../Editor/UI/Images/r_gray.png.meta | 59 + .../Editor/UI/Images/red.png | Bin 0 -> 2860 bytes .../Editor/UI/Images/red.png.meta | 57 + .../Editor/UI/Images/yellow.png | Bin 0 -> 2859 bytes .../Editor/UI/Images/yellow.png.meta | 57 + .../Editor/UI/PlayFabStyles.guiskin | 3539 ++++++++ .../Editor/UI/PlayFabStyles.guiskin.meta | 8 + Assets/PlayFabSDK.meta | 9 + Assets/PlayFabSDK/Admin.meta | 9 + Assets/PlayFabSDK/Admin/PlayFabAdminAPI.cs | 1575 ++++ .../PlayFabSDK/Admin/PlayFabAdminAPI.cs.meta | 12 + .../Admin/PlayFabAdminInstanceAPI.cs | 1362 +++ .../Admin/PlayFabAdminInstanceAPI.cs.meta | 11 + Assets/PlayFabSDK/Admin/PlayFabAdminModels.cs | 7387 ++++++++++++++++ .../Admin/PlayFabAdminModels.cs.meta | 12 + Assets/PlayFabSDK/Admin/PlayFabEvents.cs | 244 + Assets/PlayFabSDK/Admin/PlayFabEvents.cs.meta | 11 + Assets/PlayFabSDK/Authentication.meta | 8 + .../PlayFabAuthenticationAPI.cs | 77 + .../PlayFabAuthenticationAPI.cs.meta | 11 + .../PlayFabAuthenticationInstanceAPI.cs | 98 + .../PlayFabAuthenticationInstanceAPI.cs.meta | 11 + .../PlayFabAuthenticationModels.cs | 159 + .../PlayFabAuthenticationModels.cs.meta | 11 + .../Authentication/PlayFabEvents.cs | 14 + .../Authentication/PlayFabEvents.cs.meta | 11 + Assets/PlayFabSDK/Client.meta | 9 + Assets/PlayFabSDK/Client/PlayFabClientAPI.cs | 2264 +++++ .../Client/PlayFabClientAPI.cs.meta | 12 + .../Client/PlayFabClientInstanceAPI.cs | 1965 +++++ .../Client/PlayFabClientInstanceAPI.cs.meta | 11 + .../PlayFabSDK/Client/PlayFabClientModels.cs | 7624 +++++++++++++++++ .../Client/PlayFabClientModels.cs.meta | 12 + Assets/PlayFabSDK/Client/PlayFabDeviceUtil.cs | 109 + .../Client/PlayFabDeviceUtil.cs.meta | 12 + Assets/PlayFabSDK/Client/PlayFabEvents.cs | 318 + .../PlayFabSDK/Client/PlayFabEvents.cs.meta | 11 + Assets/PlayFabSDK/CloudScript.meta | 8 + .../CloudScript/PlayFabCloudScriptAPI.cs | 205 + .../CloudScript/PlayFabCloudScriptAPI.cs.meta | 11 + .../PlayFabCloudScriptInstanceAPI.cs | 191 + .../PlayFabCloudScriptInstanceAPI.cs.meta | 11 + .../CloudScript/PlayFabCloudScriptModels.cs | 1103 +++ .../PlayFabCloudScriptModels.cs.meta | 11 + .../PlayFabSDK/CloudScript/PlayFabEvents.cs | 34 + .../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/Entity.meta | 10 + Assets/PlayFabSDK/Entity/ScreenTimeTracker.cs | 246 + .../Entity/ScreenTimeTracker.cs.meta | 11 + Assets/PlayFabSDK/Events.meta | 8 + Assets/PlayFabSDK/Events/PlayFabEvents.cs | 14 + .../PlayFabSDK/Events/PlayFabEvents.cs.meta | 11 + Assets/PlayFabSDK/Events/PlayFabEventsAPI.cs | 67 + .../Events/PlayFabEventsAPI.cs.meta | 11 + .../Events/PlayFabEventsInstanceAPI.cs | 81 + .../Events/PlayFabEventsInstanceAPI.cs.meta | 11 + .../PlayFabSDK/Events/PlayFabEventsModels.cs | 89 + .../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 | 9 + Assets/PlayFabSDK/Matchmaker/PlayFabEvents.cs | 20 + .../Matchmaker/PlayFabEvents.cs.meta | 11 + .../Matchmaker/PlayFabMatchmakerAPI.cs | 97 + .../Matchmaker/PlayFabMatchmakerAPI.cs.meta | 12 + .../PlayFabMatchmakerInstanceAPI.cs | 105 + .../PlayFabMatchmakerInstanceAPI.cs.meta | 11 + .../Matchmaker/PlayFabMatchmakerModels.cs | 296 + .../PlayFabMatchmakerModels.cs.meta | 12 + Assets/PlayFabSDK/Multiplayer.meta | 8 + .../PlayFabSDK/Multiplayer/PlayFabEvents.cs | 140 + .../Multiplayer/PlayFabEvents.cs.meta | 11 + .../Multiplayer/PlayFabMultiplayerAPI.cs | 892 ++ .../Multiplayer/PlayFabMultiplayerAPI.cs.meta | 11 + .../PlayFabMultiplayerInstanceAPI.cs | 780 ++ .../PlayFabMultiplayerInstanceAPI.cs.meta | 11 + .../Multiplayer/PlayFabMultiplayerModels.cs | 3841 +++++++++ .../PlayFabMultiplayerModels.cs.meta | 11 + Assets/PlayFabSDK/PlayFab.asmdef | 12 + Assets/PlayFabSDK/PlayFab.asmdef.meta | 7 + Assets/PlayFabSDK/Profiles.meta | 8 + Assets/PlayFabSDK/Profiles/PlayFabEvents.cs | 24 + .../PlayFabSDK/Profiles/PlayFabEvents.cs.meta | 11 + .../PlayFabSDK/Profiles/PlayFabProfilesAPI.cs | 132 + .../Profiles/PlayFabProfilesAPI.cs.meta | 11 + .../Profiles/PlayFabProfilesInstanceAPI.cs | 136 + .../PlayFabProfilesInstanceAPI.cs.meta | 11 + .../Profiles/PlayFabProfilesModels.cs | 457 + .../Profiles/PlayFabProfilesModels.cs.meta | 11 + Assets/PlayFabSDK/Server.meta | 9 + Assets/PlayFabSDK/Server/PlayFabEvents.cs | 276 + .../PlayFabSDK/Server/PlayFabEvents.cs.meta | 11 + Assets/PlayFabSDK/Server/PlayFabServerAPI.cs | 1838 ++++ .../Server/PlayFabServerAPI.cs.meta | 12 + .../Server/PlayFabServerInstanceAPI.cs | 1593 ++++ .../Server/PlayFabServerInstanceAPI.cs.meta | 11 + .../PlayFabSDK/Server/PlayFabServerModels.cs | 6990 +++++++++++++++ .../Server/PlayFabServerModels.cs.meta | 12 + Assets/PlayFabSDK/Shared.meta | 9 + Assets/PlayFabSDK/Shared/Editor.meta | 5 + .../Shared/Editor/MakeSharedSettingsObj.cs | 21 + .../Editor/MakeSharedSettingsObj.cs.meta | 11 + .../PlayFabSDK/Shared/Editor/PlayFabHelp.cs | 26 + .../Shared/Editor/PlayFabHelp.cs.meta | 8 + .../Shared/Editor/PlayFabSdkEditor.asmdef | 16 + .../Editor/PlayFabSdkEditor.asmdef.meta | 7 + .../PlayFabSDK/Shared/Editor/PlayFablogo.png | Bin 0 -> 3521 bytes .../Shared/Editor/PlayFablogo.png.meta | 91 + Assets/PlayFabSDK/Shared/Internal.meta | 5 + .../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 | 723 ++ .../Shared/Internal/PlayFabErrors.cs.meta | 12 + .../Shared/Internal/PlayFabHttp.meta | 9 + .../Internal/PlayFabHttp/IPlayFabHttp.cs | 59 + .../Internal/PlayFabHttp/IPlayFabHttp.cs.meta | 12 + .../Internal/PlayFabHttp/PlayFabHTTP.cs | 498 ++ .../Internal/PlayFabHttp/PlayFabHTTP.cs.meta | 12 + .../Internal/PlayFabHttp/PlayFabUnityHttp.cs | 237 + .../PlayFabHttp/PlayFabUnityHttp.cs.meta | 13 + .../Shared/Internal/PlayFabHttp/PlayFabWWW.cs | 219 + .../Internal/PlayFabHttp/PlayFabWWW.cs.meta | 12 + .../Internal/PlayFabHttp/PlayFabWebRequest.cs | 540 ++ .../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 | 9 + .../Shared/Models/PlayFabSharedSettings.cs | 33 + .../Models/PlayFabSharedSettings.cs.meta | 12 + .../PlayFabSDK/Shared/Models/SharedModels.cs | 44 + .../Shared/Models/SharedModels.cs.meta | 12 + Assets/PlayFabSDK/Shared/Public.meta | 9 + .../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 | 82 + .../Shared/Public/PlayFabApiSettings.cs.meta | 11 + .../Public/PlayFabAuthenticationContext.cs | 77 + .../PlayFabAuthenticationContext.cs.meta | 11 + .../Shared/Public/PlayFabDataGatherer.cs | 138 + .../Shared/Public/PlayFabDataGatherer.cs.meta | 12 + .../PlayFabSDK/Shared/Public/PlayFabEvents.cs | 2910 +++++++ .../Shared/Public/PlayFabEvents.cs.meta | 11 + .../PlayFabSDK/Shared/Public/PlayFabLogger.cs | 270 + .../Shared/Public/PlayFabLogger.cs.meta | 12 + .../Shared/Public/PlayFabSettings.cs | 201 + .../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 + .../PlayFabSDK/Shared/Public/Resources.meta | 9 + .../Resources/PlayFabSharedSettings.asset | 27 + .../PlayFabSharedSettings.asset.meta | 8 + Assets/PlayFabSDK/link.xml | 21 + Assets/PlayFabSDK/link.xml.meta | 8 + 331 files changed, 69645 insertions(+) create mode 100644 Assets/PlayFabEditorExtensions.meta create mode 100644 Assets/PlayFabEditorExtensions/Editor.meta create mode 100644 Assets/PlayFabEditorExtensions/Editor/PlayFabEditor.cs create mode 100644 Assets/PlayFabEditorExtensions/Editor/PlayFabEditor.cs.meta create mode 100644 Assets/PlayFabEditorExtensions/Editor/PlayFabEditorExtensions.asmdef create mode 100644 Assets/PlayFabEditorExtensions/Editor/PlayFabEditorExtensions.asmdef.meta create mode 100644 Assets/PlayFabEditorExtensions/Editor/Resources.meta create mode 100644 Assets/PlayFabEditorExtensions/Editor/Resources/PlayFabEditorPrefsSO.asset create mode 100644 Assets/PlayFabEditorExtensions/Editor/Resources/PlayFabEditorPrefsSO.asset.meta create mode 100644 Assets/PlayFabEditorExtensions/Editor/Resources/PlayFabUnitySdk.unitypackage.meta create mode 100644 Assets/PlayFabEditorExtensions/Editor/Scripts.meta create mode 100644 Assets/PlayFabEditorExtensions/Editor/Scripts/Components.meta create mode 100644 Assets/PlayFabEditorExtensions/Editor/Scripts/Components/ProgressBar.cs create mode 100644 Assets/PlayFabEditorExtensions/Editor/Scripts/Components/ProgressBar.cs.meta create mode 100644 Assets/PlayFabEditorExtensions/Editor/Scripts/Components/SubMenuComponent.cs create mode 100644 Assets/PlayFabEditorExtensions/Editor/Scripts/Components/SubMenuComponent.cs.meta create mode 100644 Assets/PlayFabEditorExtensions/Editor/Scripts/Components/TitleDataEditor.cs create mode 100644 Assets/PlayFabEditorExtensions/Editor/Scripts/Components/TitleDataEditor.cs.meta create mode 100644 Assets/PlayFabEditorExtensions/Editor/Scripts/Components/TitleDataViewer.cs create mode 100644 Assets/PlayFabEditorExtensions/Editor/Scripts/Components/TitleDataViewer.cs.meta create mode 100644 Assets/PlayFabEditorExtensions/Editor/Scripts/Components/TitleInternalDataEditor.cs create mode 100644 Assets/PlayFabEditorExtensions/Editor/Scripts/Components/TitleInternalDataEditor.cs.meta create mode 100644 Assets/PlayFabEditorExtensions/Editor/Scripts/Components/TitleInternalDataViewer.cs create mode 100644 Assets/PlayFabEditorExtensions/Editor/Scripts/Components/TitleInternalDataViewer.cs.meta create mode 100644 Assets/PlayFabEditorExtensions/Editor/Scripts/Panels.meta create mode 100644 Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorAuthenticate.cs create mode 100644 Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorAuthenticate.cs.meta create mode 100644 Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorDataMenu.cs create mode 100644 Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorDataMenu.cs.meta create mode 100644 Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorHeader.cs create mode 100644 Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorHeader.cs.meta create mode 100644 Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorHelpMenu.cs create mode 100644 Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorHelpMenu.cs.meta create mode 100644 Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorMenu.cs create mode 100644 Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorMenu.cs.meta create mode 100644 Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorPackages.cs create mode 100644 Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorPackages.cs.meta create mode 100644 Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorSDKTools.cs create mode 100644 Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorSDKTools.cs.meta create mode 100644 Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorSettings.cs create mode 100644 Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorSettings.cs.meta create mode 100644 Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorToolsMenu.cs create mode 100644 Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorToolsMenu.cs.meta create mode 100644 Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK.meta create mode 100644 Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/ISerializer.cs create mode 100644 Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/ISerializer.cs.meta create mode 100644 Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/PlayFabEditorApi.cs create mode 100644 Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/PlayFabEditorApi.cs.meta create mode 100644 Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/PlayFabEditorHttp.cs create mode 100644 Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/PlayFabEditorHttp.cs.meta create mode 100644 Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/PlayFabEditorModels.cs create mode 100644 Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/PlayFabEditorModels.cs.meta create mode 100644 Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/SimpleJson.cs create mode 100644 Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/SimpleJson.cs.meta create mode 100644 Assets/PlayFabEditorExtensions/Editor/Scripts/Utils.meta create mode 100644 Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/EditorCoroutine.cs create mode 100644 Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/EditorCoroutine.cs.meta create mode 100644 Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorDataService.cs create mode 100644 Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorDataService.cs.meta create mode 100644 Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorHelper.cs create mode 100644 Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorHelper.cs.meta create mode 100644 Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorPrefsSO.cs create mode 100644 Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorPrefsSO.cs.meta create mode 100644 Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorUtils.cs create mode 100644 Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorUtils.cs.meta create mode 100644 Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorVersion.cs create mode 100644 Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorVersion.cs.meta create mode 100644 Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabGuiFieldHelper.cs create mode 100644 Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabGuiFieldHelper.cs.meta create mode 100644 Assets/PlayFabEditorExtensions/Editor/UI.meta create mode 100644 Assets/PlayFabEditorExtensions/Editor/UI/Fonts.meta create mode 100644 Assets/PlayFabEditorExtensions/Editor/UI/Fonts/Avalon Bold.ttf create mode 100644 Assets/PlayFabEditorExtensions/Editor/UI/Fonts/Avalon Bold.ttf.meta create mode 100644 Assets/PlayFabEditorExtensions/Editor/UI/Fonts/Avalon.ttf create mode 100644 Assets/PlayFabEditorExtensions/Editor/UI/Fonts/Avalon.ttf.meta create mode 100644 Assets/PlayFabEditorExtensions/Editor/UI/Images.meta create mode 100644 Assets/PlayFabEditorExtensions/Editor/UI/Images/Black.png create mode 100644 Assets/PlayFabEditorExtensions/Editor/UI/Images/Black.png.meta create mode 100644 Assets/PlayFabEditorExtensions/Editor/UI/Images/Clear.png create mode 100644 Assets/PlayFabEditorExtensions/Editor/UI/Images/Clear.png.meta create mode 100644 Assets/PlayFabEditorExtensions/Editor/UI/Images/Gray_base.png create mode 100644 Assets/PlayFabEditorExtensions/Editor/UI/Images/Gray_base.png.meta create mode 100644 Assets/PlayFabEditorExtensions/Editor/UI/Images/Gray_dk1.png create mode 100644 Assets/PlayFabEditorExtensions/Editor/UI/Images/Gray_dk1.png.meta create mode 100644 Assets/PlayFabEditorExtensions/Editor/UI/Images/Gray_lt1.png create mode 100644 Assets/PlayFabEditorExtensions/Editor/UI/Images/Gray_lt1.png.meta create mode 100644 Assets/PlayFabEditorExtensions/Editor/UI/Images/Gray_lt2.png create mode 100644 Assets/PlayFabEditorExtensions/Editor/UI/Images/Gray_lt2.png.meta create mode 100644 Assets/PlayFabEditorExtensions/Editor/UI/Images/Orange.png create mode 100644 Assets/PlayFabEditorExtensions/Editor/UI/Images/Orange.png.meta create mode 100644 Assets/PlayFabEditorExtensions/Editor/UI/Images/Square.png create mode 100644 Assets/PlayFabEditorExtensions/Editor/UI/Images/Square.png.meta create mode 100644 Assets/PlayFabEditorExtensions/Editor/UI/Images/White.png create mode 100644 Assets/PlayFabEditorExtensions/Editor/UI/Images/White.png.meta create mode 100644 Assets/PlayFabEditorExtensions/Editor/UI/Images/checkmark.png create mode 100644 Assets/PlayFabEditorExtensions/Editor/UI/Images/checkmark.png.meta create mode 100644 Assets/PlayFabEditorExtensions/Editor/UI/Images/checkmark_off.png create mode 100644 Assets/PlayFabEditorExtensions/Editor/UI/Images/checkmark_off.png.meta create mode 100644 Assets/PlayFabEditorExtensions/Editor/UI/Images/checkmark_on.png create mode 100644 Assets/PlayFabEditorExtensions/Editor/UI/Images/checkmark_on.png.meta create mode 100644 Assets/PlayFabEditorExtensions/Editor/UI/Images/dashboardIcon.png create mode 100644 Assets/PlayFabEditorExtensions/Editor/UI/Images/dashboardIcon.png.meta create mode 100644 Assets/PlayFabEditorExtensions/Editor/UI/Images/dashboardIconHover.png create mode 100644 Assets/PlayFabEditorExtensions/Editor/UI/Images/dashboardIconHover.png.meta create mode 100644 Assets/PlayFabEditorExtensions/Editor/UI/Images/dn_colored.png create mode 100644 Assets/PlayFabEditorExtensions/Editor/UI/Images/dn_colored.png.meta create mode 100644 Assets/PlayFabEditorExtensions/Editor/UI/Images/dn_gray.png create mode 100644 Assets/PlayFabEditorExtensions/Editor/UI/Images/dn_gray.png.meta create mode 100644 Assets/PlayFabEditorExtensions/Editor/UI/Images/green.png create mode 100644 Assets/PlayFabEditorExtensions/Editor/UI/Images/green.png.meta create mode 100644 Assets/PlayFabEditorExtensions/Editor/UI/Images/pfFullLogo_O.png create mode 100644 Assets/PlayFabEditorExtensions/Editor/UI/Images/pfFullLogo_O.png.meta create mode 100644 Assets/PlayFabEditorExtensions/Editor/UI/Images/pfFullLogo_W.png create mode 100644 Assets/PlayFabEditorExtensions/Editor/UI/Images/pfFullLogo_W.png.meta create mode 100644 Assets/PlayFabEditorExtensions/Editor/UI/Images/playfablogo.png create mode 100644 Assets/PlayFabEditorExtensions/Editor/UI/Images/playfablogo.png.meta create mode 100644 Assets/PlayFabEditorExtensions/Editor/UI/Images/r_colored.png create mode 100644 Assets/PlayFabEditorExtensions/Editor/UI/Images/r_colored.png.meta create mode 100644 Assets/PlayFabEditorExtensions/Editor/UI/Images/r_gray.png create mode 100644 Assets/PlayFabEditorExtensions/Editor/UI/Images/r_gray.png.meta create mode 100644 Assets/PlayFabEditorExtensions/Editor/UI/Images/red.png create mode 100644 Assets/PlayFabEditorExtensions/Editor/UI/Images/red.png.meta create mode 100644 Assets/PlayFabEditorExtensions/Editor/UI/Images/yellow.png create mode 100644 Assets/PlayFabEditorExtensions/Editor/UI/Images/yellow.png.meta create mode 100644 Assets/PlayFabEditorExtensions/Editor/UI/PlayFabStyles.guiskin create mode 100644 Assets/PlayFabEditorExtensions/Editor/UI/PlayFabStyles.guiskin.meta create mode 100644 Assets/PlayFabSDK.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/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/PlayFab.asmdef create mode 100644 Assets/PlayFabSDK/PlayFab.asmdef.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/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/Editor/PlayFabSdkEditor.asmdef create mode 100644 Assets/PlayFabSDK/Shared/Editor/PlayFabSdkEditor.asmdef.meta create mode 100644 Assets/PlayFabSDK/Shared/Editor/PlayFablogo.png create mode 100644 Assets/PlayFabSDK/Shared/Editor/PlayFablogo.png.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/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/PlayFabSDK/Shared/Public/Resources.meta create mode 100644 Assets/PlayFabSDK/Shared/Public/Resources/PlayFabSharedSettings.asset create mode 100644 Assets/PlayFabSDK/Shared/Public/Resources/PlayFabSharedSettings.asset.meta create mode 100644 Assets/PlayFabSDK/link.xml create mode 100644 Assets/PlayFabSDK/link.xml.meta diff --git a/Assets/PlayFabEditorExtensions.meta b/Assets/PlayFabEditorExtensions.meta new file mode 100644 index 0000000..b0a06f5 --- /dev/null +++ b/Assets/PlayFabEditorExtensions.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: e6b6b62449f1f4ed1bdf033d7f2d2ccf +folderAsset: yes +timeCreated: 1470764459 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabEditorExtensions/Editor.meta b/Assets/PlayFabEditorExtensions/Editor.meta new file mode 100644 index 0000000..7e91acb --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: c897fef01cc7d7d4a84f9f114b5133c6 +folderAsset: yes +timeCreated: 1466049927 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabEditorExtensions/Editor/PlayFabEditor.cs b/Assets/PlayFabEditorExtensions/Editor/PlayFabEditor.cs new file mode 100644 index 0000000..22525eb --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/PlayFabEditor.cs @@ -0,0 +1,433 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.IO; +using UnityEditor; +using UnityEngine; + +namespace PlayFab.PfEditor +{ + public class PlayFabEditor : UnityEditor.EditorWindow + { +#if !UNITY_5_3_OR_NEWER + public GUIContent titleContent; +#endif + + #region EdEx Variables + // vars for the plugin-wide event system + public enum EdExStates { OnLogin, OnLogout, OnMenuItemClicked, OnSubmenuItemClicked, OnHttpReq, OnHttpRes, OnError, OnSuccess, OnWarning } + + public delegate void PlayFabEdExStateHandler(EdExStates state, string status, string misc); + public static event PlayFabEdExStateHandler EdExStateUpdate; + + public static Dictionary blockingRequests = new Dictionary(); // key and blockingRequest start time + private static float blockingRequestTimeOut = 10f; // abandon the block after this many seconds. + + public static string latestEdExVersion = string.Empty; + + internal static PlayFabEditor window; + #endregion + + #region unity lopps & methods + void OnEnable() + { + if (window == null) + { + window = this; + window.minSize = new Vector2(320, 0); + } + + if (!IsEventHandlerRegistered(StateUpdateHandler)) + { + EdExStateUpdate += StateUpdateHandler; + } + + PlayFabEditorDataService.RefreshStudiosList(true); + GetLatestEdExVersion(); + } + + void OnDisable() + { + // clean up objects: + PlayFabEditorPrefsSO.Instance.PanelIsShown = false; + + if (IsEventHandlerRegistered(StateUpdateHandler)) + { + EdExStateUpdate -= StateUpdateHandler; + } + } + + void OnFocus() + { + OnEnable(); + } + + [MenuItem("Window/PlayFab/Editor Extensions")] + static void PlayFabServices() + { + var editorAsm = typeof(UnityEditor.Editor).Assembly; + var inspWndType = editorAsm.GetType("UnityEditor.SceneHierarchyWindow"); + + if (inspWndType == null) + { + inspWndType = editorAsm.GetType("UnityEditor.InspectorWindow"); + } + + window = GetWindow(inspWndType); + window.titleContent = new GUIContent("PlayFab EdEx"); + PlayFabEditorPrefsSO.Instance.PanelIsShown = true; + } + + [InitializeOnLoad] + public static class Startup + { + static Startup() + { + if (PlayFabEditorPrefsSO.Instance.PanelIsShown || !PlayFabEditorSDKTools.IsInstalled) + { + EditorCoroutine.Start(OpenPlayServices()); + } + } + } + + static IEnumerator OpenPlayServices() + { + yield return new WaitForSeconds(1f); + if (!Application.isPlaying) + { + PlayFabServices(); + } + } + + private void OnGUI() + { + HideRepaintErrors(OnGuiInternal); + } + + private void OnGuiInternal() + { + GUI.skin = PlayFabEditorHelper.uiStyle; + + using (new UnityVertical()) + { + //Run all updaters prior to drawing; + PlayFabEditorHeader.DrawHeader(); + + GUI.enabled = blockingRequests.Count == 0 && !EditorApplication.isCompiling; + + if (PlayFabEditorAuthenticate.IsAuthenticated()) + { + PlayFabEditorMenu.DrawMenu(); + + switch (PlayFabEditorMenu._menuState) + { + case PlayFabEditorMenu.MenuStates.Sdks: + PlayFabEditorSDKTools.DrawSdkPanel(); + break; + case PlayFabEditorMenu.MenuStates.Settings: + PlayFabEditorSettings.DrawSettingsPanel(); + break; + case PlayFabEditorMenu.MenuStates.Help: + PlayFabEditorHelpMenu.DrawHelpPanel(); + break; + case PlayFabEditorMenu.MenuStates.Data: + PlayFabEditorDataMenu.DrawDataPanel(); + break; + case PlayFabEditorMenu.MenuStates.Tools: + PlayFabEditorToolsMenu.DrawToolsPanel(); + break; + case PlayFabEditorMenu.MenuStates.Packages: + PlayFabEditorPackages.DrawPackagesMenu(); + break; + default: + break; + } + } + else + { + PlayFabEditorAuthenticate.DrawAuthPanels(); + } + + using (new UnityVertical(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleGray1"), GUILayout.ExpandHeight(true), GUILayout.ExpandWidth(true))) + { + GUILayout.FlexibleSpace(); + } + + // help tag at the bottom of the help menu. + if (PlayFabEditorMenu._menuState == PlayFabEditorMenu.MenuStates.Help) + { + DisplayHelpMenu(); + } + } + + PruneBlockingRequests(); + + Repaint(); + } + + private static void HideRepaintErrors(Action action) + { + try + { + action(); + } + catch (Exception e) + { + if (!e.Message.ToLower().Contains("repaint")) + throw; + // Hide any repaint issues when recompiling + } + } + + private static void DisplayHelpMenu() + { + using (new UnityVertical(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleGray1"))) + { + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleClear"))) + { + GUILayout.FlexibleSpace(); + EditorGUILayout.LabelField("PlayFab Editor Extensions: " + PlayFabEditorHelper.EDEX_VERSION, PlayFabEditorHelper.uiStyle.GetStyle("versionText")); + GUILayout.FlexibleSpace(); + } + + //TODO Add plugin upgrade option here (if available); + if (ShowEdExUpgrade()) + { + using (new UnityHorizontal()) + { + GUILayout.FlexibleSpace(); + if (GUILayout.Button("UPGRADE EDEX", PlayFabEditorHelper.uiStyle.GetStyle("textButtonOr"))) + { + UpgradeEdEx(); + } + GUILayout.FlexibleSpace(); + } + } + + using (new UnityHorizontal()) + { + GUILayout.FlexibleSpace(); + if (GUILayout.Button("VIEW DOCUMENTATION", PlayFabEditorHelper.uiStyle.GetStyle("textButton"))) + { + Application.OpenURL("https://github.com/PlayFab/UnityEditorExtensions"); + } + GUILayout.FlexibleSpace(); + } + + using (new UnityHorizontal()) + { + GUILayout.FlexibleSpace(); + if (GUILayout.Button("REPORT ISSUES", PlayFabEditorHelper.uiStyle.GetStyle("textButton"))) + { + Application.OpenURL("https://github.com/PlayFab/UnityEditorExtensions/issues"); + } + GUILayout.FlexibleSpace(); + } + + if (!string.IsNullOrEmpty(PlayFabEditorHelper.EDEX_ROOT)) + { + using (new UnityHorizontal()) + { + GUILayout.FlexibleSpace(); + if (GUILayout.Button("UNINSTALL ", PlayFabEditorHelper.uiStyle.GetStyle("textButton"))) + { + RemoveEdEx(); + } + GUILayout.FlexibleSpace(); + } + } + } + } + #endregion + + #region menu and helper methods + public static void RaiseStateUpdate(EdExStates state, string status = null, string json = null) + { + if (EdExStateUpdate != null) + EdExStateUpdate(state, status, json); + } + + private static void PruneBlockingRequests() + { + List itemsToRemove = new List(); + foreach (var req in blockingRequests) + if (req.Value + blockingRequestTimeOut < (float)EditorApplication.timeSinceStartup) + itemsToRemove.Add(req.Key); + + foreach (var item in itemsToRemove) + { + ClearBlockingRequest(item); + RaiseStateUpdate(EdExStates.OnWarning, string.Format(" Request {0} has timed out after {1} seconds.", item, blockingRequestTimeOut)); + } + } + + private static void AddBlockingRequest(string state) + { + blockingRequests[state] = (float)EditorApplication.timeSinceStartup; + } + + private static void ClearBlockingRequest(string state = null) + { + if (state == null) + { + blockingRequests.Clear(); + } + else if (blockingRequests.ContainsKey(state)) + { + blockingRequests.Remove(state); + } + } + + /// + /// Handles state updates within the editor extension. + /// + /// the state that triggered this event. + /// a generic message about the status. + /// a generic container for additional JSON encoded info. + private void StateUpdateHandler(EdExStates state, string status, string json) + { + switch (state) + { + case EdExStates.OnMenuItemClicked: + PlayFabEditorPrefsSO.Instance.curSubMenuIdx = 0; + break; + + case EdExStates.OnSubmenuItemClicked: + int parsed; + if (int.TryParse(json, out parsed)) + PlayFabEditorPrefsSO.Instance.curSubMenuIdx = parsed; + break; + + case EdExStates.OnHttpReq: + object temp; + if (string.IsNullOrEmpty(json) || Json.PlayFabSimpleJson.TryDeserializeObject(json, out temp)) + break; + + var deserialized = temp as Json.JsonObject; + object useSpinner = false; + object blockUi = false; + + if (deserialized.TryGetValue("useSpinner", out useSpinner) && bool.Parse(useSpinner.ToString())) + { + ProgressBar.UpdateState(ProgressBar.ProgressBarStates.spin); + } + + if (deserialized.TryGetValue("blockUi", out blockUi) && bool.Parse(blockUi.ToString())) + { + AddBlockingRequest(status); + } + break; + + case EdExStates.OnHttpRes: + ProgressBar.UpdateState(ProgressBar.ProgressBarStates.off); + ProgressBar.UpdateState(ProgressBar.ProgressBarStates.success); + ClearBlockingRequest(status); + break; + + case EdExStates.OnError: + // deserialize and add json details + // clear blocking requests + ProgressBar.UpdateState(ProgressBar.ProgressBarStates.error); + ClearBlockingRequest(); + Debug.LogError(string.Format("PlayFab EditorExtensions: Caught an error:{0}", status)); + break; + + case EdExStates.OnWarning: + ProgressBar.UpdateState(ProgressBar.ProgressBarStates.warning); + ClearBlockingRequest(); + Debug.LogWarning(string.Format("PlayFab EditorExtensions: {0}", status)); + break; + + case EdExStates.OnSuccess: + ClearBlockingRequest(); + ProgressBar.UpdateState(ProgressBar.ProgressBarStates.success); + break; + } + } + + public static bool IsEventHandlerRegistered(PlayFabEdExStateHandler prospectiveHandler) + { + if (EdExStateUpdate == null) + return false; + + foreach (PlayFabEdExStateHandler existingHandler in EdExStateUpdate.GetInvocationList()) + if (existingHandler == prospectiveHandler) + return true; + return false; + } + + private static void GetLatestEdExVersion() + { + var threshold = PlayFabEditorPrefsSO.Instance.EdSet_lastEdExVersionCheck != DateTime.MinValue ? PlayFabEditorPrefsSO.Instance.EdSet_lastEdExVersionCheck.AddHours(1) : DateTime.MinValue; + + if (DateTime.Today > threshold) + { + PlayFabEditorHttp.MakeGitHubApiCall("https://api.github.com/repos/PlayFab/UnityEditorExtensions/git/refs/tags", (version) => + { + latestEdExVersion = version ?? "Unknown"; + PlayFabEditorPrefsSO.Instance.EdSet_latestEdExVersion = latestEdExVersion; + }); + } + else + { + latestEdExVersion = PlayFabEditorPrefsSO.Instance.EdSet_latestEdExVersion; + } + } + + private static bool ShowEdExUpgrade() + { + if (string.IsNullOrEmpty(latestEdExVersion) || latestEdExVersion == "Unknown") + return false; + + if (string.IsNullOrEmpty(PlayFabEditorHelper.EDEX_VERSION) || PlayFabEditorHelper.EDEX_VERSION == "Unknown") + return true; + + string[] currrent = PlayFabEditorHelper.EDEX_VERSION.Split('.'); + if (currrent.Length != 3) + return true; + + string[] latest = latestEdExVersion.Split('.'); + return latest.Length != 3 + || int.Parse(latest[0]) > int.Parse(currrent[0]) + || int.Parse(latest[1]) > int.Parse(currrent[1]) + || int.Parse(latest[2]) > int.Parse(currrent[2]); + } + + private static void RemoveEdEx(bool prompt = true) + { + if (prompt && !EditorUtility.DisplayDialog("Confirm Editor Extensions Removal", "This action will remove PlayFab Editor Extensions from the current project.", "Confirm", "Cancel")) + return; + + try + { + window.Close(); + var edExRoot = new DirectoryInfo(PlayFabEditorHelper.EDEX_ROOT); + FileUtil.DeleteFileOrDirectory(edExRoot.Parent.FullName); + AssetDatabase.Refresh(); + } + catch (Exception ex) + { + RaiseStateUpdate(EdExStates.OnError, ex.Message); + } + } + + private static void UpgradeEdEx() + { + if (EditorUtility.DisplayDialog("Confirm EdEx Upgrade", "This action will remove the current PlayFab Editor Extensions and install the lastet version.", "Confirm", "Cancel")) + { + window.Close(); + ImportLatestEdEx(); + } + } + + private static void ImportLatestEdEx() + { + PlayFabEditorHttp.MakeDownloadCall("https://api.playfab.com/sdks/download/unity-edex-upgrade", (fileName) => + { + AssetDatabase.ImportPackage(fileName, false); + Debug.Log("PlayFab EdEx Upgrade: Complete"); + }); + } + #endregion + } +} diff --git a/Assets/PlayFabEditorExtensions/Editor/PlayFabEditor.cs.meta b/Assets/PlayFabEditorExtensions/Editor/PlayFabEditor.cs.meta new file mode 100644 index 0000000..998b68e --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/PlayFabEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 1c7b3fb0903da7c48a812037b700de8b +timeCreated: 1465552796 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabEditorExtensions/Editor/PlayFabEditorExtensions.asmdef b/Assets/PlayFabEditorExtensions/Editor/PlayFabEditorExtensions.asmdef new file mode 100644 index 0000000..310319d --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/PlayFabEditorExtensions.asmdef @@ -0,0 +1,14 @@ +{ + "name": "PlayFabEditorExtensions", + "references": [], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [] +} \ No newline at end of file diff --git a/Assets/PlayFabEditorExtensions/Editor/PlayFabEditorExtensions.asmdef.meta b/Assets/PlayFabEditorExtensions/Editor/PlayFabEditorExtensions.asmdef.meta new file mode 100644 index 0000000..836b2db --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/PlayFabEditorExtensions.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 8f342294dfb958a4694b67859092b749 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabEditorExtensions/Editor/Resources.meta b/Assets/PlayFabEditorExtensions/Editor/Resources.meta new file mode 100644 index 0000000..58e3830 --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/Resources.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6a613f482c5a029468dd311884515839 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabEditorExtensions/Editor/Resources/PlayFabEditorPrefsSO.asset b/Assets/PlayFabEditorExtensions/Editor/Resources/PlayFabEditorPrefsSO.asset new file mode 100644 index 0000000..a15cf00 --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/Resources/PlayFabEditorPrefsSO.asset @@ -0,0 +1,23 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5d0199c11aa6f514784c5c69cd8378d8, type: 3} + m_Name: PlayFabEditorPrefsSO + m_EditorClassIdentifier: + DevAccountEmail: vikszpedison@gmail.com + DevAccountToken: 7qadfp84o74pd9ksp691ecazod4bojxw8fsxdef5czhcxoyefuz9a7sfa55nj6max4ouriwjrm1sx44ppy144irkrs3f5tdb8husck5sjnsy11yt68kibrt148a858squsoddwapiewx57i6dbje13n5usfagxpgoi3xmxqkd5e7uwjxptnkxfjgkbyfzmozwtb5gzan + SelectedStudio: My Game Studio + SdkPath: Assets/PlayFabSDK + EdExPath: + LocalCloudScriptPath: + PanelIsShown: 0 + curMainMenuIdx: 2 + curSubMenuIdx: 0 diff --git a/Assets/PlayFabEditorExtensions/Editor/Resources/PlayFabEditorPrefsSO.asset.meta b/Assets/PlayFabEditorExtensions/Editor/Resources/PlayFabEditorPrefsSO.asset.meta new file mode 100644 index 0000000..1510297 --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/Resources/PlayFabEditorPrefsSO.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7f0f895d20658f142a06dc4fb49dce02 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabEditorExtensions/Editor/Resources/PlayFabUnitySdk.unitypackage.meta b/Assets/PlayFabEditorExtensions/Editor/Resources/PlayFabUnitySdk.unitypackage.meta new file mode 100644 index 0000000..af11abc --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/Resources/PlayFabUnitySdk.unitypackage.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 38eed5a7af1a0b6489bc6f7b82e3536d +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabEditorExtensions/Editor/Scripts.meta b/Assets/PlayFabEditorExtensions/Editor/Scripts.meta new file mode 100644 index 0000000..9d68bd9 --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/Scripts.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 8d80bca4081cfd248bd0e0fa9421ea4d +folderAsset: yes +timeCreated: 1465794443 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabEditorExtensions/Editor/Scripts/Components.meta b/Assets/PlayFabEditorExtensions/Editor/Scripts/Components.meta new file mode 100644 index 0000000..2557f2a --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/Scripts/Components.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 51d28a86064544e8e8b3560b7b28b3d7 +folderAsset: yes +timeCreated: 1471296960 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/ProgressBar.cs b/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/ProgressBar.cs new file mode 100644 index 0000000..6be9340 --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/ProgressBar.cs @@ -0,0 +1,155 @@ +using UnityEditor; +using UnityEngine; + +namespace PlayFab.PfEditor +{ + public class ProgressBar + { + public enum ProgressBarStates { off = 0, on = 1, spin = 2, error = 3, warning = 4, success = 5 } + public static ProgressBarStates currentProgressBarState = ProgressBarStates.off; + + public static float progress = 0; + private static GUIStyle pbarStyle = PlayFabEditorHelper.uiStyle.GetStyle("progressBarFg"); + private static GUIStyle pbarBgStyle = PlayFabEditorHelper.uiStyle.GetStyle("progressBarBg"); + + private static float progressWidth = 0; + private static float animationSpeed = 1f; + private static float tickRate = .15f; + private static float stTime; + private static float endTime; + private static float lastUpdateTime; + private static bool isReveresed; + + public static void UpdateState(ProgressBarStates state) + { + if (currentProgressBarState == ProgressBarStates.off && state != ProgressBarStates.off) + { + stTime = (float)EditorApplication.timeSinceStartup; + endTime = stTime + animationSpeed; + } + + currentProgressBarState = state; + } + + //not a good way to do this right now. + public static void UpdateProgress(float p) + { + progress = p; + } + + public static void Draw() + { + pbarBgStyle = PlayFabEditorHelper.uiStyle.GetStyle("progressBarBg"); + if (currentProgressBarState == ProgressBarStates.off) + { + stTime = 0; + endTime = 0; + progressWidth = 0; + lastUpdateTime = 0; + isReveresed = false; + + progressWidth = EditorGUIUtility.currentViewWidth; + pbarStyle = PlayFabEditorHelper.uiStyle.GetStyle("progressBarClear"); + pbarBgStyle = PlayFabEditorHelper.uiStyle.GetStyle("progressBarClear"); + //return; + } + else if (EditorWindow.focusedWindow != PlayFabEditor.window) + { + // pause draw while we are in the bg + return; + } + else if (currentProgressBarState == ProgressBarStates.success) + { + if ((float)EditorApplication.timeSinceStartup - stTime < animationSpeed) + { + progressWidth = EditorGUIUtility.currentViewWidth; + pbarStyle = PlayFabEditorHelper.uiStyle.GetStyle("progressBarSuccess"); + } + else if (PlayFabEditor.blockingRequests.Count > 0) + { + UpdateState(ProgressBarStates.spin); + } + else + { + UpdateState(ProgressBarStates.off); + } + } + else if (currentProgressBarState == ProgressBarStates.warning) + { + if ((float)EditorApplication.timeSinceStartup - stTime < animationSpeed) + { + progressWidth = EditorGUIUtility.currentViewWidth; + pbarStyle = PlayFabEditorHelper.uiStyle.GetStyle("progressBarWarn"); + } + else if (PlayFabEditor.blockingRequests.Count > 0) + { + UpdateState(ProgressBarStates.spin); + } + else + { + UpdateState(ProgressBarStates.off); + } + } + else if (currentProgressBarState == ProgressBarStates.error) + { + if ((float)EditorApplication.timeSinceStartup - stTime < animationSpeed) + { + progressWidth = EditorGUIUtility.currentViewWidth; + pbarStyle = PlayFabEditorHelper.uiStyle.GetStyle("progressBarError"); + } + else if (PlayFabEditor.blockingRequests.Count > 0) + { + UpdateState(ProgressBarStates.spin); + } + else + { + UpdateState(ProgressBarStates.off); + } + } + else + { + + if ((float)EditorApplication.timeSinceStartup - lastUpdateTime > tickRate) + { + lastUpdateTime = (float)EditorApplication.timeSinceStartup; + pbarStyle = PlayFabEditorHelper.uiStyle.GetStyle("progressBarFg"); + + if (currentProgressBarState == ProgressBarStates.on) + { + progressWidth = EditorGUIUtility.currentViewWidth * progress; + } + else if (currentProgressBarState == ProgressBarStates.spin) + { + var currentTime = (float)EditorApplication.timeSinceStartup; + if (currentTime < endTime && !isReveresed) + { + UpdateProgress((currentTime - stTime) / animationSpeed); + progressWidth = EditorGUIUtility.currentViewWidth * progress; + } + else if (currentTime < endTime && isReveresed) + { + UpdateProgress((currentTime - stTime) / animationSpeed); + progressWidth = EditorGUIUtility.currentViewWidth - EditorGUIUtility.currentViewWidth * progress; + } + else + { + isReveresed = !isReveresed; + stTime = (float)EditorApplication.timeSinceStartup; + endTime = stTime + animationSpeed; + } + } + } + + } + + using (new UnityHorizontal(pbarBgStyle)) + { + if (isReveresed) + { + GUILayout.FlexibleSpace(); + } + EditorGUILayout.LabelField("", pbarStyle, GUILayout.Width(progressWidth)); + } + } + } +} diff --git a/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/ProgressBar.cs.meta b/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/ProgressBar.cs.meta new file mode 100644 index 0000000..b0bbc89 --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/ProgressBar.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 73c59009a8870444f8f5658099fc86f8 +timeCreated: 1471388208 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/SubMenuComponent.cs b/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/SubMenuComponent.cs new file mode 100644 index 0000000..914308b --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/SubMenuComponent.cs @@ -0,0 +1,102 @@ +using System.Collections.Generic; +using UnityEngine; + +namespace PlayFab.PfEditor +{ + //[InitializeOnLoad] + public class SubMenuComponent : UnityEditor.Editor + { + + Dictionary items = new Dictionary(); + GUIStyle selectedStyle; + GUIStyle defaultStyle; + GUIStyle bgStyle; + + public void DrawMenu() + { + selectedStyle = selectedStyle ?? PlayFabEditorHelper.uiStyle.GetStyle("textButton_selected"); + defaultStyle = defaultStyle ?? PlayFabEditorHelper.uiStyle.GetStyle("textButton"); + bgStyle = bgStyle ?? PlayFabEditorHelper.uiStyle.GetStyle("gpStyleGray1"); + + using (new UnityHorizontal(bgStyle, GUILayout.ExpandWidth(true))) + { + foreach (var item in items) + { + var styleToUse = item.Value.isSelected ? selectedStyle : defaultStyle; + var content = new GUIContent(item.Value.displayName); + var size = styleToUse.CalcSize(content); + + if (GUILayout.Button(item.Value.displayName, styleToUse, GUILayout.Width(size.x + 1))) + { + OnMenuItemClicked(item.Key); + } + } + } + } + + public void RegisterMenuItem(string n, System.Action m) + { + if (!items.ContainsKey(n)) + { + var selectState = false; + var activeSubmenu = PlayFabEditorPrefsSO.Instance.curSubMenuIdx; + if (items.Count == 0 && activeSubmenu == 0 || activeSubmenu == items.Count) + selectState = true; + + items.Add(n, new MenuItemContainer() { displayName = n, method = m, isSelected = selectState }); + } + } + + private void OnMenuItemClicked(string key) + { + if (!items.ContainsKey(key)) + return; + + DeselectAll(); + items[key].isSelected = true; + if (items[key].method != null) + { + items[key].method.Invoke(); + } + } + + private void DeselectAll() + { + foreach (var item in items) + { + item.Value.isSelected = false; + } + } + + public SubMenuComponent() + { + if (!PlayFabEditor.IsEventHandlerRegistered(StateUpdateHandler)) + { + PlayFabEditor.EdExStateUpdate += StateUpdateHandler; + } + } + + void StateUpdateHandler(PlayFabEditor.EdExStates state, string status, string json) + { + switch (state) + { + case PlayFabEditor.EdExStates.OnMenuItemClicked: + DeselectAll(); + if (items != null) + foreach (var each in items) + { + each.Value.isSelected = true; // Select the first + break; + } + break; + } + } + } + + public class MenuItemContainer + { + public string displayName; + public System.Action method; + public bool isSelected; + } +} diff --git a/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/SubMenuComponent.cs.meta b/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/SubMenuComponent.cs.meta new file mode 100644 index 0000000..960ed10 --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/SubMenuComponent.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 5a2670b1b9ccb4eefa83498d43ab0c8a +timeCreated: 1474667971 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/TitleDataEditor.cs b/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/TitleDataEditor.cs new file mode 100644 index 0000000..7e9abfd --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/TitleDataEditor.cs @@ -0,0 +1,54 @@ +using UnityEditor; +using UnityEngine; + +namespace PlayFab.PfEditor +{ + public class TitleDataEditor : UnityEditor.EditorWindow + { +#if !UNITY_5_3_OR_NEWER + public GUIContent titleContent; +#endif + + public string key = string.Empty; + public string Value = string.Empty; + public Vector2 scrollPos = Vector2.zero; + + void OnGUI() + { + // The actual window code goes here + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleGray1"))) + EditorGUILayout.LabelField(string.Format("Editing: {0}", key), PlayFabEditorHelper.uiStyle.GetStyle("orTitle"), GUILayout.MinWidth(EditorGUIUtility.currentViewWidth)); + + scrollPos = GUILayout.BeginScrollView(scrollPos, PlayFabEditorHelper.uiStyle.GetStyle("gpStyleGray1")); + Value = EditorGUILayout.TextArea(Value, PlayFabEditorHelper.uiStyle.GetStyle("editTxt")); + GUILayout.EndScrollView(); + + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleClear"))) + { + GUILayout.FlexibleSpace(); + if (GUILayout.Button("SAVE", PlayFabEditorHelper.uiStyle.GetStyle("Button"), GUILayout.MaxWidth(200))) + { + for (int z = 0; z < PlayFabEditorDataMenu.tdViewer.items.Count; z++) + { + if (PlayFabEditorDataMenu.tdViewer.items[z].Key == key) + { + PlayFabEditorDataMenu.tdViewer.items[z].Value = Value; + PlayFabEditorDataMenu.tdViewer.items[z].isDirty = true; + } + } + Close(); + + } + GUILayout.FlexibleSpace(); + } + + Repaint(); + } + + public void LoadData(string k, string v) + { + key = k; + Value = v; + } + } +} diff --git a/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/TitleDataEditor.cs.meta b/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/TitleDataEditor.cs.meta new file mode 100644 index 0000000..1187348 --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/TitleDataEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: b7d03dc6e98274816902873adb8ee342 +timeCreated: 1471216768 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/TitleDataViewer.cs b/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/TitleDataViewer.cs new file mode 100644 index 0000000..3758739 --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/TitleDataViewer.cs @@ -0,0 +1,156 @@ +using PlayFab.PfEditor.EditorModels; +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEditor; +using UnityEngine; + +namespace PlayFab.PfEditor +{ + // TODO: Clean up the copy paste between this and TitleInternalDataViewer + public class TitleDataViewer : UnityEditor.Editor + { + public readonly List items = new List(); + public static TitleDataEditor tdEditor; + public Vector2 scrollPos = Vector2.zero; + private bool showSave = false; + + // this gets called after the Base draw loop + public void Draw() + { + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleGray1"))) + EditorGUILayout.LabelField("TitleData provides Key-Value storage available to all API sets. TitleData is designed to store game-wide configuration data.", PlayFabEditorHelper.uiStyle.GetStyle("genTxt")); + + using (new UnityHorizontal()) + { + GUILayout.FlexibleSpace(); + if (GUILayout.Button("REFRESH", PlayFabEditorHelper.uiStyle.GetStyle("Button"))) + { + RefreshTitleData(); + } + + if (GUILayout.Button("+", PlayFabEditorHelper.uiStyle.GetStyle("Button"), GUILayout.MaxWidth(25))) + { + AddRecord(); + } + } + + if (items != null && items.Count > 0) + { + scrollPos = GUILayout.BeginScrollView(scrollPos, PlayFabEditorHelper.uiStyle.GetStyle("gpStyleGray1")); + var keyInputBoxWidth = EditorGUIUtility.currentViewWidth > 200 ? 170 : (EditorGUIUtility.currentViewWidth - 100) / 2; + var valueInputBoxWidth = EditorGUIUtility.currentViewWidth > 200 ? EditorGUIUtility.currentViewWidth - 290 : (EditorGUIUtility.currentViewWidth - 100) / 2; + + for (var z = 0; z < items.Count; z++) + { + items[z].DataEditedCheck(); + if (items[z].isDirty) + { + showSave = true; + } + + if (items[z].Value != null) + { + var keyStyle = items[z].isDirty ? PlayFabEditorHelper.uiStyle.GetStyle("listKey_dirty") : PlayFabEditorHelper.uiStyle.GetStyle("listKey"); + var valStyle = items[z].isDirty ? PlayFabEditorHelper.uiStyle.GetStyle("listValue_dirty") : PlayFabEditorHelper.uiStyle.GetStyle("listValue"); + + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleClear"))) + { + items[z].Key = EditorGUILayout.TextField(items[z].Key, keyStyle, GUILayout.Width(keyInputBoxWidth)); + + EditorGUILayout.LabelField(":", GUILayout.MaxWidth(10)); + EditorGUILayout.LabelField("" + items[z].Value, valStyle, GUILayout.MaxWidth(valueInputBoxWidth), GUILayout.MaxHeight(25)); + + if (GUILayout.Button("EDIT", PlayFabEditorHelper.uiStyle.GetStyle("Button"), GUILayout.MaxHeight(19), GUILayout.MinWidth(35))) + { + if (tdEditor == null) + { + tdEditor = EditorWindow.GetWindow(); + tdEditor.titleContent = new GUIContent("Title Data"); + tdEditor.minSize = new Vector2(300, 400); + } + + tdEditor.LoadData(items[z].Key, items[z].Value); + tdEditor.Show(); + } + if (GUILayout.Button("X", PlayFabEditorHelper.uiStyle.GetStyle("Button"), GUILayout.MaxHeight(19), GUILayout.MinWidth(20))) + { + items[z].isDirty = true; + items[z].Value = null; + } + } + } + } + + GUILayout.EndScrollView(); + + if (showSave) + { + using (new UnityHorizontal()) + { + GUILayout.FlexibleSpace(); + if (GUILayout.Button("SAVE", PlayFabEditorHelper.uiStyle.GetStyle("Button"), GUILayout.MaxWidth(200))) + { + SaveRecords(); + } + GUILayout.FlexibleSpace(); + } + } + } + } + + private void AddRecord() + { + items.Add(new KvpItem("", "NewValue") { isDirty = true }); + } + + public void RefreshTitleData() + { + Action dataRequest = (result) => + { + items.Clear(); + showSave = false; + foreach (var kvp in result.Data) + items.Add(new KvpItem(kvp.Key, kvp.Value)); + + PlayFabEditorPrefsSO.Instance.TitleDataCache.Clear(); + foreach (var pair in result.Data) + PlayFabEditorPrefsSO.Instance.TitleDataCache.Add(pair.Key, pair.Value); + PlayFabEditorDataService.SaveEnvDetails(); + }; + + PlayFabEditorApi.GetTitleData(dataRequest, PlayFabEditorHelper.SharedErrorCallback); + } + + private void SaveRecords() + { + //reset dirty status. + showSave = false; + Dictionary dirtyItems = new Dictionary(); + foreach (var item in items) + if (item.isDirty) + dirtyItems.Add(item.Key, item.Value); + + if (dirtyItems.Count > 0) + { + var nextSeconds = 1f; + foreach (var di in dirtyItems) + { + EditorCoroutine.Start(SaveItem(di, nextSeconds)); + nextSeconds += 1f; + } + + foreach (var item in items) + item.CleanItem(); + } + } + + private IEnumerator SaveItem(KeyValuePair dirtyItem, float seconds) + { + yield return new EditorCoroutine.EditorWaitForSeconds(seconds); + //Debug.LogFormat("{0} - Co-Start: {1}", dirtyItem.Key, seconds); + var itemToUpdateDic = new Dictionary { { dirtyItem.Key, dirtyItem.Value } }; + PlayFabEditorApi.SetTitleData(itemToUpdateDic, null, PlayFabEditorHelper.SharedErrorCallback); + } + } +} diff --git a/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/TitleDataViewer.cs.meta b/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/TitleDataViewer.cs.meta new file mode 100644 index 0000000..ad7e0dc --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/TitleDataViewer.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 667b18201be5e4597bd623f2314cf2bd +timeCreated: 1468948626 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/TitleInternalDataEditor.cs b/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/TitleInternalDataEditor.cs new file mode 100644 index 0000000..b0a090b --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/TitleInternalDataEditor.cs @@ -0,0 +1,55 @@ +using UnityEditor; +using UnityEngine; + +namespace PlayFab.PfEditor +{ + public class TitleInternalDataEditor : UnityEditor.EditorWindow + { + public string key = string.Empty; + public string Value = string.Empty; +#if !UNITY_5_3_OR_NEWER + public GUIContent titleContent; +#endif + + public Vector2 scrollPos = Vector2.zero; + + void OnGUI() + { + // The actual window code goes here + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleGray1"))) + EditorGUILayout.LabelField(string.Format("Editing: {0}", key), PlayFabEditorHelper.uiStyle.GetStyle("orTitle"), GUILayout.MinWidth(EditorGUIUtility.currentViewWidth)); + + scrollPos = GUILayout.BeginScrollView(scrollPos, PlayFabEditorHelper.uiStyle.GetStyle("gpStyleGray1")); + Value = EditorGUILayout.TextArea(Value, PlayFabEditorHelper.uiStyle.GetStyle("editTxt")); + GUILayout.EndScrollView(); + + + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleClear"))) + { + GUILayout.FlexibleSpace(); + if (GUILayout.Button("Save", PlayFabEditorHelper.uiStyle.GetStyle("Button"), GUILayout.MaxWidth(200))) + { + for (int z = 0; z < PlayFabEditorDataMenu.tdInternalViewer.items.Count; z++) + { + if (PlayFabEditorDataMenu.tdInternalViewer.items[z].Key == key) + { + PlayFabEditorDataMenu.tdInternalViewer.items[z].Value = Value; + PlayFabEditorDataMenu.tdInternalViewer.items[z].isDirty = true; + } + } + Close(); + + } + GUILayout.FlexibleSpace(); + } + + Repaint(); + } + + public void LoadData(string k, string v) + { + key = k; + Value = v; + } + } +} diff --git a/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/TitleInternalDataEditor.cs.meta b/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/TitleInternalDataEditor.cs.meta new file mode 100644 index 0000000..fbf55cf --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/TitleInternalDataEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: df195403c2c124d3992a79d9622ce809 +timeCreated: 1471216768 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/TitleInternalDataViewer.cs b/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/TitleInternalDataViewer.cs new file mode 100644 index 0000000..833535e --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/TitleInternalDataViewer.cs @@ -0,0 +1,147 @@ +using PlayFab.PfEditor.EditorModels; +using System; +using System.Collections.Generic; +using UnityEditor; +using UnityEngine; + +namespace PlayFab.PfEditor +{ + // TODO: Clean up the copy paste between this and TitleDataViewer + public class TitleInternalDataViewer : UnityEditor.Editor + { + public readonly List items = new List(); + public static TitleInternalDataEditor tdEditor; + public Vector2 scrollPos = Vector2.zero; + private bool showSave = false; + + // this gets called after the Base draw loop + public void Draw() + { + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleGray1"))) + EditorGUILayout.LabelField("Internal TitleData provides Key-Value storage available only to Admin & Server API sets. This is useful for storing configuration data that should be hidden from players.", PlayFabEditorHelper.uiStyle.GetStyle("genTxt")); + + using (new UnityHorizontal()) + { + GUILayout.FlexibleSpace(); + if (GUILayout.Button("REFRESH", PlayFabEditorHelper.uiStyle.GetStyle("Button"))) + { + RefreshInternalTitleData(); + } + + if (GUILayout.Button("+", PlayFabEditorHelper.uiStyle.GetStyle("Button"), GUILayout.MaxWidth(25))) + { + AddRecord(); + } + } + + if (items.Count > 0) + { + scrollPos = GUILayout.BeginScrollView(scrollPos, PlayFabEditorHelper.uiStyle.GetStyle("gpStyleGray1")); + var keyInputBoxWidth = EditorGUIUtility.currentViewWidth > 200 ? 170 : (EditorGUIUtility.currentViewWidth - 100) / 2; + var valueInputBoxWidth = EditorGUIUtility.currentViewWidth > 200 ? EditorGUIUtility.currentViewWidth - 290 : (EditorGUIUtility.currentViewWidth - 100) / 2; + + for (var z = 0; z < items.Count; z++) + { + items[z].DataEditedCheck(); + if (items[z].isDirty) + { + showSave = true; + } + + if (items[z].Value != null) + { + var keyStyle = items[z].isDirty ? PlayFabEditorHelper.uiStyle.GetStyle("listKey_dirty") : PlayFabEditorHelper.uiStyle.GetStyle("listKey"); + var valStyle = items[z].isDirty ? PlayFabEditorHelper.uiStyle.GetStyle("listValue_dirty") : PlayFabEditorHelper.uiStyle.GetStyle("listValue"); + + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleClear"))) + { + items[z].Key = EditorGUILayout.TextField(items[z].Key, keyStyle, GUILayout.Width(keyInputBoxWidth)); + + EditorGUILayout.LabelField(":", GUILayout.MaxWidth(10)); + EditorGUILayout.LabelField("" + items[z].Value, valStyle, GUILayout.MaxWidth(valueInputBoxWidth), GUILayout.MaxHeight(25)); + + if (GUILayout.Button("EDIT", PlayFabEditorHelper.uiStyle.GetStyle("Button"), GUILayout.MaxHeight(19), GUILayout.MinWidth(35))) + { + if (tdEditor == null) + { + tdEditor = EditorWindow.GetWindow(); + tdEditor.titleContent = new GUIContent("Internal Title Data"); + tdEditor.minSize = new Vector2(300, 400); + } + + tdEditor.LoadData(items[z].Key, items[z].Value); + tdEditor.Show(); + } + if (GUILayout.Button("X", PlayFabEditorHelper.uiStyle.GetStyle("Button"), GUILayout.MaxHeight(19), GUILayout.MinWidth(20))) + { + items[z].isDirty = true; + items[z].Value = null; + } + } + } + } + + GUILayout.EndScrollView(); + + if (showSave) + { + using (new UnityHorizontal()) + { + GUILayout.FlexibleSpace(); + if (GUILayout.Button("SAVE", PlayFabEditorHelper.uiStyle.GetStyle("Button"), GUILayout.MaxWidth(200))) + { + SaveRecords(); + } + GUILayout.FlexibleSpace(); + } + } + } + } + + public void AddRecord() + { + items.Add(new KvpItem("", "NewValue") { isDirty = true }); + } + + public void RefreshInternalTitleData() + { + Action cb = (result) => + { + items.Clear(); + showSave = false; + foreach (var kvp in result.Data) + { + items.Add(new KvpItem(kvp.Key, kvp.Value)); + } + + PlayFabEditorPrefsSO.Instance.InternalTitleDataCache.Clear(); + foreach (var pair in result.Data) + PlayFabEditorPrefsSO.Instance.InternalTitleDataCache.Add(pair.Key, pair.Value); + PlayFabEditorDataService.SaveEnvDetails(); + }; + + PlayFabEditorApi.GetTitleInternalData(cb, PlayFabEditorHelper.SharedErrorCallback); + } + + public void SaveRecords() + { + //reset dirty status. + showSave = false; + Dictionary dirtyItems = new Dictionary(); + foreach (var item in items) + if (item.isDirty) + dirtyItems.Add(item.Key, item.Value); + + if (dirtyItems.Count > 0) + { + PlayFabEditorApi.SetTitleInternalData(dirtyItems, (result) => + { + foreach (var item in items) + { + item.CleanItem(); + } + }, PlayFabEditorHelper.SharedErrorCallback); + } + } + } +} diff --git a/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/TitleInternalDataViewer.cs.meta b/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/TitleInternalDataViewer.cs.meta new file mode 100644 index 0000000..694ba7b --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/TitleInternalDataViewer.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 63d2e11a466c94865aac7fbd7aafd302 +timeCreated: 1473957357 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels.meta b/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels.meta new file mode 100644 index 0000000..26c9cd0 --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: a1c77c7ceb0334bb19f90b5abac164b4 +folderAsset: yes +timeCreated: 1471296116 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorAuthenticate.cs b/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorAuthenticate.cs new file mode 100644 index 0000000..37b9c2c --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorAuthenticate.cs @@ -0,0 +1,326 @@ +using PlayFab.PfEditor.EditorModels; +using UnityEditor; +using UnityEngine; + +namespace PlayFab.PfEditor +{ + public class PlayFabEditorAuthenticate : UnityEditor.Editor + { + #region panel variables + private static string _userEmail = string.Empty; + private static string _userPass = string.Empty; + private static string _userPass2 = string.Empty; + private static string _2FaCode = string.Empty; + private static string _studio = string.Empty; + + private static bool isInitialized = false; + + public enum PanelDisplayStates { Register, Login, TwoFactorPrompt } + private static PanelDisplayStates activeState = PanelDisplayStates.Login; + #endregion + + #region draw calls + public static void DrawAuthPanels() + { + //capture enter input for login + var e = Event.current; + if (e.type == EventType.KeyUp && e.keyCode == KeyCode.Return) + { + switch (activeState) + { + case PanelDisplayStates.Login: + OnLoginButtonClicked(); + break; + case PanelDisplayStates.Register: + OnRegisterClicked(); + break; + case PanelDisplayStates.TwoFactorPrompt: + OnContinueButtonClicked(); + break; + } + } + + if (PlayFabEditorHelper.uiStyle == null) + return; + + if (activeState == PanelDisplayStates.TwoFactorPrompt) + { + using (new UnityVertical(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleGray1"))) + { + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleClear"))) + EditorGUILayout.LabelField("Enter your 2-factor authorization code.", PlayFabEditorHelper.uiStyle.GetStyle("cGenTxt"), GUILayout.MinWidth(EditorGUIUtility.currentViewWidth)); + + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleGray1"))) + { + GUILayout.FlexibleSpace(); + _2FaCode = EditorGUILayout.TextField(_2FaCode, PlayFabEditorHelper.uiStyle.GetStyle("TextField"), GUILayout.MinHeight(25), GUILayout.MinWidth(200)); + GUILayout.FlexibleSpace(); + } + + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("labelStyle"))) + { + var buttonWidth = 100; + GUILayout.FlexibleSpace(); + if (GUILayout.Button("CONTINUE", PlayFabEditorHelper.uiStyle.GetStyle("Button"), GUILayout.MinHeight(32), GUILayout.MaxWidth(buttonWidth))) + { + OnContinueButtonClicked(); + _2FaCode = string.Empty; + + } + GUILayout.FlexibleSpace(); + } + + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("labelStyle"))) + { + GUILayout.FlexibleSpace(); + if (GUILayout.Button("CANCEL", PlayFabEditorHelper.uiStyle.GetStyle("textButton"))) + { + activeState = PanelDisplayStates.Login; + } + GUILayout.FlexibleSpace(); + } + } + return; + } + + if (!string.IsNullOrEmpty(PlayFabEditorPrefsSO.Instance.DevAccountEmail) && !isInitialized) + { + _userEmail = PlayFabEditorPrefsSO.Instance.DevAccountEmail; + PlayFabEditorPrefsSO.Save(); + isInitialized = true; + } + else if (!isInitialized) + { + activeState = PanelDisplayStates.Register; + isInitialized = true; + } + + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleGray1"))) + EditorGUILayout.LabelField("Welcome to PlayFab!", PlayFabEditorHelper.uiStyle.GetStyle("titleLabel"), GUILayout.MinWidth(EditorGUIUtility.currentViewWidth)); + + if (activeState == PanelDisplayStates.Login) + { + // login mode, this state either logged out, or did not have auto-login checked. + DrawLogin(); + + } + else if (activeState == PanelDisplayStates.Register) + { + // register mode + DrawRegister(); + } + else + { + DrawRegister(); + } + + using (new UnityVertical(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleGray1"))) + { + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleClear"))) + { + GUILayout.FlexibleSpace(); + if (GUILayout.Button("VIEW README", PlayFabEditorHelper.uiStyle.GetStyle("textButton"))) + { + Application.OpenURL("https://github.com/PlayFab/UnityEditorExtensions#setup"); + } + GUILayout.FlexibleSpace(); + } + } + } + + private static void DrawLogin() + { + float labelWidth = 120; + + using (new UnityVertical(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleGray1"))) + { + using (var fwl = new FixedWidthLabel("EMAIL: ")) + { + GUILayout.Space(labelWidth - fwl.fieldWidth); + _userEmail = EditorGUILayout.TextField(_userEmail, PlayFabEditorHelper.uiStyle.GetStyle("TextField"), GUILayout.MinHeight(25)); + } + + using (var fwl = new FixedWidthLabel("PASSWORD: ")) + { + GUILayout.Space(labelWidth - fwl.fieldWidth); + _userPass = EditorGUILayout.PasswordField(_userPass, PlayFabEditorHelper.uiStyle.GetStyle("TextField"), GUILayout.MinHeight(25)); + } + + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("labelStyle"))) + { + if (GUILayout.Button("CREATE AN ACCOUNT", PlayFabEditorHelper.uiStyle.GetStyle("textButton"), GUILayout.MaxWidth(100))) + { + activeState = PanelDisplayStates.Register; + } + + var buttonWidth = 100; + GUILayout.Space(EditorGUIUtility.currentViewWidth - buttonWidth * 2); + + if (GUILayout.Button("LOG IN", PlayFabEditorHelper.uiStyle.GetStyle("Button"), GUILayout.MinHeight(32), GUILayout.MaxWidth(buttonWidth))) + { + OnLoginButtonClicked(); + } + } + } + } + + private static void DrawRegister() + { + float labelWidth = 150; + + using (new UnityVertical(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleGray1"))) + { + using (var fwl = new FixedWidthLabel("EMAIL:")) + { + GUILayout.Space(labelWidth - fwl.fieldWidth); + _userEmail = EditorGUILayout.TextField(_userEmail, PlayFabEditorHelper.uiStyle.GetStyle("TextField"), GUILayout.MinHeight(25)); + } + + using (var fwl = new FixedWidthLabel("PASSWORD:")) + { + GUILayout.Space(labelWidth - fwl.fieldWidth); + _userPass = EditorGUILayout.PasswordField(_userPass, PlayFabEditorHelper.uiStyle.GetStyle("TextField"), GUILayout.MinHeight(25)); + } + + using (var fwl = new FixedWidthLabel("CONFIRM PASSWORD: ")) + { + GUILayout.Space(labelWidth - fwl.fieldWidth); + _userPass2 = EditorGUILayout.PasswordField(_userPass2, PlayFabEditorHelper.uiStyle.GetStyle("TextField"), GUILayout.MinHeight(25)); + } + + using (var fwl = new FixedWidthLabel("STUDIO NAME: ")) + { + GUILayout.Space(labelWidth - fwl.fieldWidth); + _studio = EditorGUILayout.TextField(_studio, PlayFabEditorHelper.uiStyle.GetStyle("TextField"), GUILayout.MinHeight(25)); + } + + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleClear"))) + { + if (GUILayout.Button("LOG IN", PlayFabEditorHelper.uiStyle.GetStyle("textButton"), GUILayout.MinHeight(32))) + { + activeState = PanelDisplayStates.Login; + } + + GUILayout.FlexibleSpace(); + + if (GUILayout.Button(" CREATE AN ACCOUNT ", PlayFabEditorHelper.uiStyle.GetStyle("Button"), GUILayout.MinHeight(32))) + { + OnRegisterClicked(); + } + } + + } + } + #endregion + + #region menu and helper methods + public static bool IsAuthenticated() + { + return !string.IsNullOrEmpty(PlayFabEditorPrefsSO.Instance.DevAccountToken); + } + + public static void Logout() + { + PlayFabEditor.RaiseStateUpdate(PlayFabEditor.EdExStates.OnLogout); + + PlayFabEditorApi.Logout(new LogoutRequest + { + DeveloperClientToken = PlayFabEditorPrefsSO.Instance.DevAccountToken + }, null, PlayFabEditorHelper.SharedErrorCallback); + + _userPass = string.Empty; + _userPass2 = string.Empty; + + activeState = PanelDisplayStates.Login; + + PlayFabEditorPrefsSO.Instance.StudioList = null; + PlayFabEditorPrefsSO.Instance.DevAccountToken = string.Empty; + PlayFabEditorPrefsSO.Save(); + + PlayFabEditorPrefsSO.Instance.TitleDataCache.Clear(); + PlayFabEditorDataService.SaveEnvDetails(); + } + + private static void OnRegisterClicked() + { + if (_userPass != _userPass2) + { + Debug.LogError("PlayFab developer account passwords must match."); + return; + } + + PlayFabEditorApi.RegisterAccount(new RegisterAccountRequest() + { + DeveloperToolProductName = PlayFabEditorHelper.EDEX_NAME, + DeveloperToolProductVersion = PlayFabEditorHelper.EDEX_VERSION, + Email = _userEmail, + Password = _userPass, + StudioName = _studio + }, (result) => + { + PlayFabEditorPrefsSO.Instance.DevAccountToken = result.DeveloperClientToken; + PlayFabEditorPrefsSO.Instance.DevAccountEmail = _userEmail; + + PlayFabEditorDataService.RefreshStudiosList(); + + PlayFabEditor.RaiseStateUpdate(PlayFabEditor.EdExStates.OnLogin); + PlayFabEditorMenu._menuState = PlayFabEditorMenu.MenuStates.Sdks; + PlayFabEditorPrefsSO.Save(); + }, PlayFabEditorHelper.SharedErrorCallback); + } + + private static void OnLoginButtonClicked() + { + PlayFabEditorApi.Login(new LoginRequest() + { + DeveloperToolProductName = PlayFabEditorHelper.EDEX_NAME, + DeveloperToolProductVersion = PlayFabEditorHelper.EDEX_VERSION, + Email = _userEmail, + Password = _userPass + }, (result) => + { + PlayFabEditorPrefsSO.Instance.DevAccountToken = result.DeveloperClientToken; + PlayFabEditorPrefsSO.Instance.DevAccountEmail = _userEmail; + PlayFabEditorDataService.RefreshStudiosList(); + PlayFabEditor.RaiseStateUpdate(PlayFabEditor.EdExStates.OnLogin); + PlayFabEditorPrefsSO.Save(); + PlayFabEditorMenu._menuState = PlayFabEditorMenu.MenuStates.Sdks; + + }, (error) => + { + if ((int)error.Error == 1246 || error.ErrorMessage.Contains("TwoFactor")) + { + // pop 2FA dialog + PlayFabEditor.RaiseStateUpdate(PlayFabEditor.EdExStates.OnWarning, "This account requires 2-Factor Authentication."); + activeState = PanelDisplayStates.TwoFactorPrompt; + } + else + { + PlayFabEditorHelper.SharedErrorCallback(error); + } + }); + } + + private static void OnContinueButtonClicked() + { + PlayFabEditorApi.Login(new LoginRequest() + { + DeveloperToolProductName = PlayFabEditorHelper.EDEX_NAME, + DeveloperToolProductVersion = PlayFabEditorHelper.EDEX_VERSION, + TwoFactorAuth = _2FaCode, + Email = _userEmail, + Password = _userPass + }, (result) => + { + PlayFabEditorPrefsSO.Instance.DevAccountToken = result.DeveloperClientToken; + PlayFabEditorPrefsSO.Instance.DevAccountEmail = _userEmail; + PlayFabEditorDataService.RefreshStudiosList(); + PlayFabEditor.RaiseStateUpdate(PlayFabEditor.EdExStates.OnLogin); + PlayFabEditorPrefsSO.Save(); + PlayFabEditorMenu._menuState = PlayFabEditorMenu.MenuStates.Sdks; + + }, PlayFabEditorHelper.SharedErrorCallback); + } + #endregion + } +} diff --git a/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorAuthenticate.cs.meta b/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorAuthenticate.cs.meta new file mode 100644 index 0000000..212ac76 --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorAuthenticate.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 5391580e006220946a84ab25acd7096e +timeCreated: 1465867542 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorDataMenu.cs b/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorDataMenu.cs new file mode 100644 index 0000000..ad49938 --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorDataMenu.cs @@ -0,0 +1,123 @@ +using UnityEditor; +using UnityEngine; + +namespace PlayFab.PfEditor +{ + [InitializeOnLoad] + public class PlayFabEditorDataMenu : UnityEditor.Editor + { + #region panel variables + public static TitleDataViewer tdViewer; + public static TitleInternalDataViewer tdInternalViewer; + + public static SubMenuComponent menu = null; + + public enum DataMenuStates { TitleData, TitleDataInternal } + public static DataMenuStates currentState = DataMenuStates.TitleData; + + private static Vector2 scrollPos = Vector2.zero; + + #endregion + + #region draw calls + public static void DrawDataPanel() + { + if (menu == null) + { + RegisterMenu(); + return; + } + + menu.DrawMenu(); + switch ((DataMenuStates)PlayFabEditorPrefsSO.Instance.curSubMenuIdx) + { + case DataMenuStates.TitleData: + if (tdViewer == null) + { + tdViewer = CreateInstance(); + tdViewer.RefreshTitleData(); + } + scrollPos = GUILayout.BeginScrollView(scrollPos, PlayFabEditorHelper.uiStyle.GetStyle("gpStyleGray1")); + tdViewer.Draw(); + GUILayout.EndScrollView(); + break; + + case DataMenuStates.TitleDataInternal: + if (tdInternalViewer == null) + { + tdInternalViewer = CreateInstance(); + tdInternalViewer.RefreshInternalTitleData(); + } + scrollPos = GUILayout.BeginScrollView(scrollPos, PlayFabEditorHelper.uiStyle.GetStyle("gpStyleGray1")); + tdInternalViewer.Draw(); + GUILayout.EndScrollView(); + break; + + default: + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleGray1"))) + { + EditorGUILayout.LabelField("Coming Soon!", PlayFabEditorHelper.uiStyle.GetStyle("titleLabel"), GUILayout.MinWidth(EditorGUIUtility.currentViewWidth)); + } + break; + } + } + #endregion + + #region unity loops + static PlayFabEditorDataMenu() + { + if (!PlayFabEditor.IsEventHandlerRegistered(StateUpdateHandler)) + { + PlayFabEditor.EdExStateUpdate += StateUpdateHandler; + } + + RegisterMenu(); + } + + public void OnDestroy() + { + if (PlayFabEditor.IsEventHandlerRegistered(StateUpdateHandler)) + { + PlayFabEditor.EdExStateUpdate -= StateUpdateHandler; + } + } + #endregion + + #region menu and helper methods + public static void RegisterMenu() + { + if (menu != null) + return; + + menu = CreateInstance(); + menu.RegisterMenuItem("TITLE", OnTitleDataClicked); + menu.RegisterMenuItem("INTERNAL", OnInternalTitleDataClicked); + } + + public static void StateUpdateHandler(PlayFabEditor.EdExStates state, string status, string json) + { + switch (state) + { + case PlayFabEditor.EdExStates.OnMenuItemClicked: + break; + case PlayFabEditor.EdExStates.OnLogout: + if (tdViewer != null) + { + tdViewer.items.Clear(); + } + break; + } + } + + public static void OnTitleDataClicked() + { + PlayFabEditor.RaiseStateUpdate(PlayFabEditor.EdExStates.OnSubmenuItemClicked, DataMenuStates.TitleData.ToString(), "" + (int)DataMenuStates.TitleData); + } + + public static void OnInternalTitleDataClicked() + { + PlayFabEditor.RaiseStateUpdate(PlayFabEditor.EdExStates.OnSubmenuItemClicked, DataMenuStates.TitleDataInternal.ToString(), "" + (int)DataMenuStates.TitleDataInternal); + } + } + #endregion +} diff --git a/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorDataMenu.cs.meta b/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorDataMenu.cs.meta new file mode 100644 index 0000000..8df2394 --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorDataMenu.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 473b8182a10e24fd0aebe832f98f7779 +timeCreated: 1470329258 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorHeader.cs b/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorHeader.cs new file mode 100644 index 0000000..c7778d6 --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorHeader.cs @@ -0,0 +1,69 @@ +using UnityEngine; +using UnityEditor; + +namespace PlayFab.PfEditor +{ + public class PlayFabEditorHeader : UnityEditor.Editor + { + public static void DrawHeader(float progress = 0f) + { + if (PlayFabEditorHelper.uiStyle == null) + return; + + //using Begin Vertical as our container. + using (new UnityHorizontal(GUILayout.Height(52))) + { + //Set the image in the container + if (EditorGUIUtility.currentViewWidth < 375) + { + EditorGUILayout.LabelField("", PlayFabEditorHelper.uiStyle.GetStyle("pfLogo"), GUILayout.MaxHeight(40), GUILayout.Width(186)); + } + else + { + EditorGUILayout.LabelField("", PlayFabEditorHelper.uiStyle.GetStyle("pfLogo"), GUILayout.MaxHeight(50), GUILayout.Width(233)); + } + + float gmAnchor = EditorGUIUtility.currentViewWidth - 30; + + + if (EditorGUIUtility.currentViewWidth > 375) + { + gmAnchor = EditorGUIUtility.currentViewWidth - 140; + GUILayout.BeginArea(new Rect(gmAnchor, 10, 140, 42)); + GUILayout.BeginHorizontal(); + if (GUILayout.Button("GAME MANAGER", PlayFabEditorHelper.uiStyle.GetStyle("textButton"), GUILayout.MaxWidth(105))) + { + OnDashbaordClicked(); + } + } + else + { + GUILayout.BeginArea(new Rect(gmAnchor, 10, EditorGUIUtility.currentViewWidth * .25f, 42)); + GUILayout.BeginHorizontal(); + } + + if (GUILayout.Button("", PlayFabEditorHelper.uiStyle.GetStyle("gmIcon"))) + { + OnDashbaordClicked(); + } + GUILayout.EndHorizontal(); + GUILayout.EndArea(); + + //end the vertical container + } + + ProgressBar.Draw(); + + } + + + private static void OnDashbaordClicked() + { + Help.BrowseURL(PlayFabEditorDataService.ActiveTitle != null ? PlayFabEditorDataService.ActiveTitle.GameManagerUrl : PlayFabEditorHelper.GAMEMANAGER_URL); + } + + } +} + + + diff --git a/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorHeader.cs.meta b/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorHeader.cs.meta new file mode 100644 index 0000000..f163ed4 --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorHeader.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: cd7bce14a0a4b2a4a827a4ffd4d24849 +timeCreated: 1465798284 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorHelpMenu.cs b/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorHelpMenu.cs new file mode 100644 index 0000000..ac4c66d --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorHelpMenu.cs @@ -0,0 +1,100 @@ +using UnityEditor; +using UnityEngine; + +namespace PlayFab.PfEditor +{ + public class PlayFabEditorHelpMenu : UnityEditor.Editor + { + public static float buttonWidth = 200; + public static Vector2 scrollPos = Vector2.zero; + + public static void DrawHelpPanel() + { + scrollPos = GUILayout.BeginScrollView(scrollPos, PlayFabEditorHelper.uiStyle.GetStyle("gpStyleGray1")); + buttonWidth = EditorGUIUtility.currentViewWidth > 400 ? EditorGUIUtility.currentViewWidth / 2 : 200; + + using (new UnityVertical()) + { + EditorGUILayout.LabelField("LEARN PLAYFAB:", PlayFabEditorHelper.uiStyle.GetStyle("labelStyle")); + + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleClear"))) + { + GUILayout.FlexibleSpace(); + + if (GUILayout.Button("BEGINNERS GUIDE", PlayFabEditorHelper.uiStyle.GetStyle("Button"), GUILayout.MinHeight(32), GUILayout.Width(buttonWidth))) + { + Application.OpenURL("https://api.playfab.com/docs/beginners-guide"); + } + + GUILayout.FlexibleSpace(); + } + + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleClear"))) + { + GUILayout.FlexibleSpace(); + + if (GUILayout.Button("RECIPES", PlayFabEditorHelper.uiStyle.GetStyle("Button"), GUILayout.MinHeight(32), GUILayout.Width(buttonWidth))) + { + Application.OpenURL("https://api.playfab.com/docs/recipe-index"); + } + + GUILayout.FlexibleSpace(); + } + + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleClear"))) + { + GUILayout.FlexibleSpace(); + + if (GUILayout.Button("TUTORIALS", PlayFabEditorHelper.uiStyle.GetStyle("Button"), GUILayout.MinHeight(32), GUILayout.Width(buttonWidth))) + { + Application.OpenURL("https://api.playfab.com/docs/tutorials"); + } + + GUILayout.FlexibleSpace(); + } + + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleClear"))) + { + GUILayout.FlexibleSpace(); + + if (GUILayout.Button("API REFERENCE", PlayFabEditorHelper.uiStyle.GetStyle("Button"), GUILayout.MinHeight(32), GUILayout.Width(buttonWidth))) + { + Application.OpenURL("https://api.playfab.com/documentation"); + } + + GUILayout.FlexibleSpace(); + } + } + + using (new UnityVertical()) + { + EditorGUILayout.LabelField("TROUBLESHOOTING:", PlayFabEditorHelper.uiStyle.GetStyle("labelStyle")); + + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleClear"))) + { + GUILayout.FlexibleSpace(); + + if (GUILayout.Button("ASK QUESTIONS", PlayFabEditorHelper.uiStyle.GetStyle("Button"), GUILayout.MinHeight(32), GUILayout.Width(buttonWidth))) + { + Application.OpenURL("https://community.playfab.com/index.html"); + } + + GUILayout.FlexibleSpace(); + } + + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleClear"))) + { + GUILayout.FlexibleSpace(); + + if (GUILayout.Button("VIEW SERVICE AVAILABILITY", PlayFabEditorHelper.uiStyle.GetStyle("Button"), GUILayout.MinHeight(32), GUILayout.Width(buttonWidth))) + { + Application.OpenURL("http://status.playfab.com/"); + } + + GUILayout.FlexibleSpace(); + } + } + GUILayout.EndScrollView(); + } + } +} diff --git a/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorHelpMenu.cs.meta b/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorHelpMenu.cs.meta new file mode 100644 index 0000000..98c1747 --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorHelpMenu.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: ef5d79e80acc44a588d53dea61dcfc83 +timeCreated: 1470347876 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorMenu.cs b/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorMenu.cs new file mode 100644 index 0000000..a7570b1 --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorMenu.cs @@ -0,0 +1,132 @@ +using UnityEngine; + +namespace PlayFab.PfEditor +{ + public class PlayFabEditorMenu : UnityEditor.Editor + { + #region panel variables + internal enum MenuStates + { + Sdks = 0, + Settings = 1, + Data = 2, + Help = 3, + Tools = 4, + Packages = 5, + Logout = 6 + } + + internal static MenuStates _menuState = MenuStates.Sdks; + #endregion + + public static void DrawMenu() + { + if (PlayFabEditorSDKTools.IsInstalled && PlayFabEditorSDKTools.isSdkSupported) + _menuState = (MenuStates)PlayFabEditorPrefsSO.Instance.curMainMenuIdx; + + var sdksButtonStyle = PlayFabEditorHelper.uiStyle.GetStyle("textButton"); + var settingsButtonStyle = PlayFabEditorHelper.uiStyle.GetStyle("textButton"); + var dataButtonStyle = PlayFabEditorHelper.uiStyle.GetStyle("textButton"); + var helpButtonStyle = PlayFabEditorHelper.uiStyle.GetStyle("textButton"); + var logoutButtonStyle = PlayFabEditorHelper.uiStyle.GetStyle("textButton"); + var toolsButtonStyle = PlayFabEditorHelper.uiStyle.GetStyle("textButton"); + var packagesButtonStyle = PlayFabEditorHelper.uiStyle.GetStyle("textButton"); + + if (_menuState == MenuStates.Sdks) + sdksButtonStyle = PlayFabEditorHelper.uiStyle.GetStyle("textButton_selected"); + if (_menuState == MenuStates.Settings) + settingsButtonStyle = PlayFabEditorHelper.uiStyle.GetStyle("textButton_selected"); + if (_menuState == MenuStates.Logout) + logoutButtonStyle = PlayFabEditorHelper.uiStyle.GetStyle("textButton_selected"); + if (_menuState == MenuStates.Data) + dataButtonStyle = PlayFabEditorHelper.uiStyle.GetStyle("textButton_selected"); + if (_menuState == MenuStates.Help) + helpButtonStyle = PlayFabEditorHelper.uiStyle.GetStyle("textButton_selected"); + if (_menuState == MenuStates.Packages) + packagesButtonStyle = PlayFabEditorHelper.uiStyle.GetStyle("textButton_selected"); + if (_menuState == MenuStates.Tools) + toolsButtonStyle = PlayFabEditorHelper.uiStyle.GetStyle("textButton_selected"); + + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleGray1"), GUILayout.Height(25), GUILayout.ExpandWidth(true))) + { + GUILayout.Space(5); + + if (GUILayout.Button("SDK", sdksButtonStyle, GUILayout.MaxWidth(35))) + { + OnSdKsClicked(); + } + + if (PlayFabEditorSDKTools.IsInstalled && PlayFabEditorSDKTools.isSdkSupported) + { + if (GUILayout.Button("SETTINGS", settingsButtonStyle, GUILayout.MaxWidth(65))) + OnSettingsClicked(); + if (GUILayout.Button("DATA", dataButtonStyle, GUILayout.MaxWidth(45))) + OnDataClicked(); + if (GUILayout.Button("TOOLS", toolsButtonStyle, GUILayout.MaxWidth(45))) + OnToolsClicked(); + if(GUILayout.Button("PACKAGES", packagesButtonStyle, GUILayout.MaxWidth(72))) + OnPackagesClicked(); + } + + if (GUILayout.Button("HELP", helpButtonStyle, GUILayout.MaxWidth(45))) + OnHelpClicked(); + GUILayout.FlexibleSpace(); + + if (GUILayout.Button("LOGOUT", logoutButtonStyle, GUILayout.MaxWidth(55))) + OnLogoutClicked(); + } + } + + public static void OnToolsClicked() + { + _menuState = MenuStates.Tools; + PlayFabEditor.RaiseStateUpdate(PlayFabEditor.EdExStates.OnMenuItemClicked, MenuStates.Tools.ToString()); + PlayFabEditorPrefsSO.Instance.curMainMenuIdx = (int)_menuState; + } + + public static void OnDataClicked() + { + _menuState = MenuStates.Data; + PlayFabEditor.RaiseStateUpdate(PlayFabEditor.EdExStates.OnMenuItemClicked, MenuStates.Data.ToString()); + PlayFabEditorPrefsSO.Instance.curMainMenuIdx = (int)_menuState; + } + + public static void OnHelpClicked() + { + _menuState = MenuStates.Help; + PlayFabEditor.RaiseStateUpdate(PlayFabEditor.EdExStates.OnMenuItemClicked, MenuStates.Help.ToString()); + PlayFabEditorPrefsSO.Instance.curMainMenuIdx = (int)_menuState; + } + + public static void OnSdKsClicked() + { + _menuState = MenuStates.Sdks; + PlayFabEditor.RaiseStateUpdate(PlayFabEditor.EdExStates.OnMenuItemClicked, MenuStates.Sdks.ToString()); + PlayFabEditorPrefsSO.Instance.curMainMenuIdx = (int)_menuState; + } + + public static void OnSettingsClicked() + { + _menuState = MenuStates.Settings; + PlayFabEditor.RaiseStateUpdate(PlayFabEditor.EdExStates.OnMenuItemClicked, MenuStates.Settings.ToString()); + PlayFabEditorPrefsSO.Instance.curMainMenuIdx = (int)_menuState; + } + + public static void OnPackagesClicked() + { + _menuState = MenuStates.Packages; + PlayFabEditor.RaiseStateUpdate(PlayFabEditor.EdExStates.OnMenuItemClicked, MenuStates.Packages.ToString()); + PlayFabEditorPrefsSO.Instance.curMainMenuIdx = (int)_menuState; + } + + public static void OnLogoutClicked() + { + _menuState = MenuStates.Logout; + PlayFabEditor.RaiseStateUpdate(PlayFabEditor.EdExStates.OnMenuItemClicked, MenuStates.Logout.ToString()); + PlayFabEditorAuthenticate.Logout(); + + _menuState = MenuStates.Sdks; + PlayFabEditorPrefsSO.Instance.curMainMenuIdx = (int)_menuState; + } + } +} diff --git a/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorMenu.cs.meta b/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorMenu.cs.meta new file mode 100644 index 0000000..d0ad35c --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorMenu.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: f299dcbf6b977c446a02dfe5885393bd +timeCreated: 1465798447 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorPackages.cs b/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorPackages.cs new file mode 100644 index 0000000..f98f606 --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorPackages.cs @@ -0,0 +1,113 @@ +using UnityEditor; +using UnityEngine; +using System; +using System.Reflection; + +namespace PlayFab.PfEditor +{ + public class PlayFabEditorPackages : UnityEditor.Editor + { + private const int buttonWidth = 150; + + public static bool IsPubSubPresent { get { return GetIsPubSubTypePresent(); } } + + public static void DrawPackagesMenu() + { +#if ENABLE_PLAYFABPUBSUB_API + var labelStyle = new GUIStyle(PlayFabEditorHelper.uiStyle.GetStyle("label")); + if (Environment.Version.Major < 4) + { + EditorGUILayout.LabelField(" PersistentSockets is only supported with dot Net 4\n\n Please change your Project build settings", labelStyle, GUILayout.MinWidth(EditorGUIUtility.currentViewWidth)); + } + else if (!IsPubSubPresent) + { + DrawPubSubPrivatePreviewWarning(); + GUILayout.BeginHorizontal(); + GUILayout.Label(" PubSub: "); + if (GUILayout.Button("Install From GitHub", PlayFabEditorHelper.uiStyle.GetStyle("Button"), GUILayout.MaxWidth(buttonWidth), GUILayout.MinHeight(32))) + { + string possibleNewtonsoftPath = ""; + if (GetIsNewtonsoftInstalled(out possibleNewtonsoftPath)) + { + EditorUtility.DisplayDialog("Newtonsoft is already installed.", + "Please delete your version of Netwonsoft.json.dll in \n\n" + possibleNewtonsoftPath + " \n and retry the install.\n\n Compiler conflicts will occur if this package is installed and Newtonsoft already exists.", "Continue", "Cancel"); + } + else + { + ImportPubSubSDK(); + } + } + + GUILayout.EndHorizontal(); + } + else + { + EditorGUILayout.LabelField(" PersistentSockets is Installed", labelStyle, GUILayout.MinWidth(EditorGUIUtility.currentViewWidth)); + } +#endif + } + + private static void DrawPubSubPrivatePreviewWarning() + { + GUILayout.BeginHorizontal(); + GUILayout.Label(" PUBSUB IS IN PRIVATE PREVIEW."); + GUILayout.EndHorizontal(); + GUILayout.BeginHorizontal(); + GUILayout.Label(" If you are a Professional or Enterprise tier customer and wish to try this feature out, Please contact devrel@playfab.com for more information."); + GUILayout.EndHorizontal(); + GUILayout.BeginHorizontal(); + GUILayout.Label(" User MUST be currently signed into GitHub (with their default browser) to successfully install the unitypackage"); + GUILayout.EndHorizontal(); + } + + public static void ImportPubSubSDK() + { + var link = "https://api.playfab.com/downloads/unity-signalr"; + System.Diagnostics.Process.Start(link); + } + + public static bool GetIsNewtonsoftInstalled(out string path) + { + var allAssemblies = AppDomain.CurrentDomain.GetAssemblies(); + foreach (var assembly in allAssemblies) + { + if (assembly.FullName.Contains("Newtonsoft.Json")) + { + path = assembly.Location; + return true; + } + + foreach (var eachType in assembly.GetTypes()) + { + if (eachType.Name.Contains("Newtonsoft")) + { + path = assembly.Location; + return true; + } + } + } + path = "N/A"; + return false; + } + + // TODO: move this function to a shared location + // and CACHE the results so we don't need to loop multiple times. + public static bool GetIsPubSubTypePresent() + { + var allAssemblies = AppDomain.CurrentDomain.GetAssemblies(); + + foreach (var assembly in allAssemblies) + { + foreach (var eachType in assembly.GetTypes()) + { + if (eachType.Name.Contains("PubSub")) + { + return true; + } + } + } + + return false; + } + } +} diff --git a/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorPackages.cs.meta b/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorPackages.cs.meta new file mode 100644 index 0000000..cf6fa81 --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorPackages.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d82ae6e4704d39945b28d49f4f084d9d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorSDKTools.cs b/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorSDKTools.cs new file mode 100644 index 0000000..81899f8 --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorSDKTools.cs @@ -0,0 +1,410 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Reflection; +using UnityEditor; +using UnityEngine; + +namespace PlayFab.PfEditor +{ + public class PlayFabEditorSDKTools : UnityEditor.Editor + { + private const int buttonWidth = 150; + public static bool IsInstalled { get { return GetPlayFabSettings() != null; } } + + private static Type playFabSettingsType = null; + private static string installedSdkVersion = string.Empty; + private static string latestSdkVersion = string.Empty; + private static UnityEngine.Object sdkFolder; + private static UnityEngine.Object _previousSdkFolderPath; + private static bool isObjectFieldActive; + private static bool isInitialized; //used to check once, gets reset after each compile; + public static bool isSdkSupported = true; + + public static void DrawSdkPanel() + { + if (!isInitialized) + { + //SDK is installed. + CheckSdkVersion(); + isInitialized = true; + GetLatestSdkVersion(); + sdkFolder = FindSdkAsset(); + + if (sdkFolder != null) + { + PlayFabEditorPrefsSO.Instance.SdkPath = AssetDatabase.GetAssetPath(sdkFolder); + PlayFabEditorDataService.SaveEnvDetails(); + } + } + + if (IsInstalled) + ShowSdkInstalledMenu(); + else + ShowSdkNotInstalledMenu(); + } + + private static void ShowSdkInstalledMenu() + { + isObjectFieldActive = sdkFolder == null; + + if (_previousSdkFolderPath != sdkFolder) + { + // something changed, better save the result. + _previousSdkFolderPath = sdkFolder; + + PlayFabEditorPrefsSO.Instance.SdkPath = (AssetDatabase.GetAssetPath(sdkFolder)); + PlayFabEditorDataService.SaveEnvDetails(); + + isObjectFieldActive = false; + } + + var labelStyle = new GUIStyle(PlayFabEditorHelper.uiStyle.GetStyle("titleLabel")); + using (new UnityVertical(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleGray1"))) + { + EditorGUILayout.LabelField(string.Format("SDK {0} is installed", string.IsNullOrEmpty(installedSdkVersion) ? "Unknown" : installedSdkVersion), + labelStyle, GUILayout.MinWidth(EditorGUIUtility.currentViewWidth)); + + if (!isObjectFieldActive) + { + GUI.enabled = false; + } + else + { + EditorGUILayout.LabelField( + "An SDK was detected, but we were unable to find the directory. Drag-and-drop the top-level PlayFab SDK folder below.", + PlayFabEditorHelper.uiStyle.GetStyle("orTxt")); + } + + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleClear"))) + { + GUILayout.FlexibleSpace(); + sdkFolder = EditorGUILayout.ObjectField(sdkFolder, typeof(UnityEngine.Object), false, GUILayout.MaxWidth(200)); + GUILayout.FlexibleSpace(); + } + + if (!isObjectFieldActive) + { + // this is a hack to prevent our "block while loading technique" from breaking up at this point. + GUI.enabled = !EditorApplication.isCompiling && PlayFabEditor.blockingRequests.Count == 0; + } + + if (isSdkSupported && sdkFolder != null) + { + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleClear"))) + { + + GUILayout.FlexibleSpace(); + + if (GUILayout.Button("REMOVE SDK", PlayFabEditorHelper.uiStyle.GetStyle("textButton"), GUILayout.MinHeight(32), GUILayout.MinWidth(200))) + { + RemoveSdk(); + } + + GUILayout.FlexibleSpace(); + } + } + + } + + if (sdkFolder != null) + { + using (new UnityVertical(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleGray1"))) + { + isSdkSupported = false; + string[] versionNumber = !string.IsNullOrEmpty(installedSdkVersion) ? installedSdkVersion.Split('.') : new string[0]; + + var numerical = 0; + if (string.IsNullOrEmpty(installedSdkVersion) || versionNumber == null || versionNumber.Length == 0 || + (versionNumber.Length > 0 && int.TryParse(versionNumber[0], out numerical) && numerical < 2)) + { + //older version of the SDK + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleClear"))) + { + EditorGUILayout.LabelField("Most of the Editor Extensions depend on SDK versions >2.0. Consider upgrading to the get most features.", PlayFabEditorHelper.uiStyle.GetStyle("orTxt")); + } + + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleClear"))) + { + GUILayout.FlexibleSpace(); + if (GUILayout.Button("READ THE UPGRADE GUIDE", PlayFabEditorHelper.uiStyle.GetStyle("textButton"), GUILayout.MinHeight(32))) + { + Application.OpenURL("https://github.com/PlayFab/UnitySDK/blob/master/UPGRADE.md"); + } + GUILayout.FlexibleSpace(); + } + } + else if (numerical >= 2) + { + isSdkSupported = true; + } + + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleClear"))) + { + if (ShowSDKUpgrade() && isSdkSupported) + { + GUILayout.FlexibleSpace(); + if (GUILayout.Button("Upgrade to " + latestSdkVersion, PlayFabEditorHelper.uiStyle.GetStyle("Button"), GUILayout.MinHeight(32))) + { + UpgradeSdk(); + } + GUILayout.FlexibleSpace(); + } + else if (isSdkSupported) + { + GUILayout.FlexibleSpace(); + EditorGUILayout.LabelField("You have the latest SDK!", labelStyle, GUILayout.MinHeight(32)); + GUILayout.FlexibleSpace(); + } + } + } + } + + if (isSdkSupported && string.IsNullOrEmpty(PlayFabEditorDataService.SharedSettings.TitleId)) + { + using (new UnityVertical(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleGray1"))) + { + EditorGUILayout.LabelField("Before making PlayFab API calls, the SDK must be configured to your PlayFab Title.", PlayFabEditorHelper.uiStyle.GetStyle("orTxt")); + using (new UnityHorizontal()) + { + GUILayout.FlexibleSpace(); + if (GUILayout.Button("SET MY TITLE", PlayFabEditorHelper.uiStyle.GetStyle("textButton"))) + { + PlayFabEditorMenu.OnSettingsClicked(); + } + GUILayout.FlexibleSpace(); + } + } + } + + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleGray1"))) + { + GUILayout.FlexibleSpace(); + + if (GUILayout.Button("VIEW RELEASE NOTES", PlayFabEditorHelper.uiStyle.GetStyle("textButton"), GUILayout.MinHeight(32), GUILayout.MinWidth(200))) + { + Application.OpenURL("https://api.playfab.com/releaseNotes/"); + } + + GUILayout.FlexibleSpace(); + } + } + + private static void ShowSdkNotInstalledMenu() + { + using (new UnityVertical(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleGray1"))) + { + var labelStyle = new GUIStyle(PlayFabEditorHelper.uiStyle.GetStyle("titleLabel")); + + EditorGUILayout.LabelField("No SDK is installed.", labelStyle, GUILayout.MinWidth(EditorGUIUtility.currentViewWidth)); + GUILayout.Space(20); + + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleGray1"))) + { + GUILayout.FlexibleSpace(); + if (GUILayout.Button("Refresh", PlayFabEditorHelper.uiStyle.GetStyle("Button"), GUILayout.MaxWidth(buttonWidth), GUILayout.MinHeight(32))) + playFabSettingsType = null; + GUILayout.FlexibleSpace(); + if (GUILayout.Button("Install PlayFab SDK", PlayFabEditorHelper.uiStyle.GetStyle("Button"), GUILayout.MaxWidth(buttonWidth), GUILayout.MinHeight(32))) + ImportLatestSDK(); + + GUILayout.FlexibleSpace(); + } + } + } + + public static void ImportLatestSDK() + { + PlayFabEditorHttp.MakeDownloadCall("https://api.playfab.com/sdks/download/unity-via-edex", (fileName) => + { + Debug.Log("PlayFab SDK Install: Complete"); + AssetDatabase.ImportPackage(fileName, false); + + // attempts to re-import any changed assets (which ImportPackage doesn't implicitly do) + AssetDatabase.Refresh(); + + PlayFabEditorPrefsSO.Instance.SdkPath = PlayFabEditorHelper.DEFAULT_SDK_LOCATION; + PlayFabEditorDataService.SaveEnvDetails(); + + }); + } + + public static Type GetPlayFabSettings() + { + if (playFabSettingsType == typeof(object)) + return null; // Sentinel value to indicate that PlayFabSettings doesn't exist + if (playFabSettingsType != null) + return playFabSettingsType; + + playFabSettingsType = typeof(object); // Sentinel value to indicate that PlayFabSettings doesn't exist + var allAssemblies = AppDomain.CurrentDomain.GetAssemblies(); + foreach (var assembly in allAssemblies) + { + Type[] assemblyTypes; + try + { + assemblyTypes = assembly.GetTypes(); + } + catch (ReflectionTypeLoadException e) + { + assemblyTypes = e.Types; + } + + foreach (var eachType in assemblyTypes) + if (eachType != null) + if (eachType.Name == PlayFabEditorHelper.PLAYFAB_SETTINGS_TYPENAME) + playFabSettingsType = eachType; + } + + //if (playFabSettingsType == typeof(object)) + // Debug.LogWarning("Should not have gotten here: " + allAssemblies.Length); + //else + // Debug.Log("Found Settings: " + allAssemblies.Length + ", " + playFabSettingsType.Assembly.FullName); + return playFabSettingsType == typeof(object) ? null : playFabSettingsType; + } + + private static void CheckSdkVersion() + { + if (!string.IsNullOrEmpty(installedSdkVersion)) + return; + + var types = new List(); + foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies()) + { + try + { + foreach (var type in assembly.GetTypes()) + if (type.Name == "PlayFabVersion" || type.Name == PlayFabEditorHelper.PLAYFAB_SETTINGS_TYPENAME) + types.Add(type); + } + catch (ReflectionTypeLoadException) + { + // For this failure, silently skip this assembly unless we have some expectation that it contains PlayFab + if (assembly.FullName.StartsWith("Assembly-CSharp")) // The standard "source-code in unity proj" assembly name + Debug.LogWarning("PlayFab EdEx Error, failed to access the main CSharp assembly that probably contains PlayFab. Please report this on the PlayFab Forums"); + continue; + } + } + + foreach (var type in types) + { + foreach (var property in type.GetProperties()) + if (property.Name == "SdkVersion" || property.Name == "SdkRevision") + installedSdkVersion += property.GetValue(property, null).ToString(); + foreach (var field in type.GetFields()) + if (field.Name == "SdkVersion" || field.Name == "SdkRevision") + installedSdkVersion += field.GetValue(field).ToString(); + } + } + + private static UnityEngine.Object FindSdkAsset() + { + UnityEngine.Object sdkAsset = null; + + // look in editor prefs + if (PlayFabEditorPrefsSO.Instance.SdkPath != null) + { + sdkAsset = AssetDatabase.LoadAssetAtPath(PlayFabEditorPrefsSO.Instance.SdkPath, typeof(UnityEngine.Object)); + } + if (sdkAsset != null) + return sdkAsset; + + sdkAsset = AssetDatabase.LoadAssetAtPath(PlayFabEditorHelper.DEFAULT_SDK_LOCATION, typeof(UnityEngine.Object)); + if (sdkAsset != null) + return sdkAsset; + + var fileList = Directory.GetDirectories(Application.dataPath, "*PlayFabSdk", SearchOption.AllDirectories); + if (fileList.Length == 0) + return null; + + var relPath = fileList[0].Substring(fileList[0].LastIndexOf("Assets")); + return AssetDatabase.LoadAssetAtPath(relPath, typeof(UnityEngine.Object)); + } + + private static bool ShowSDKUpgrade() + { + if (string.IsNullOrEmpty(latestSdkVersion) || latestSdkVersion == "Unknown") + { + return false; + } + + if (string.IsNullOrEmpty(installedSdkVersion) || installedSdkVersion == "Unknown") + { + return true; + } + + string[] currrent = installedSdkVersion.Split('.'); + string[] latest = latestSdkVersion.Split('.'); + + if (int.Parse(currrent[0]) < 2) + { + return false; + } + + return int.Parse(latest[0]) > int.Parse(currrent[0]) + || int.Parse(latest[1]) > int.Parse(currrent[1]) + || int.Parse(latest[2]) > int.Parse(currrent[2]); + } + + private static void UpgradeSdk() + { + if (EditorUtility.DisplayDialog("Confirm SDK Upgrade", "This action will remove the current PlayFab SDK and install the lastet version. Related plug-ins will need to be manually upgraded.", "Confirm", "Cancel")) + { + RemoveSdk(false); + ImportLatestSDK(); + } + } + + private static void RemoveSdk(bool prompt = true) + { + if (prompt && !EditorUtility.DisplayDialog("Confirm SDK Removal", "This action will remove the current PlayFab SDK. Related plug-ins will need to be manually removed.", "Confirm", "Cancel")) + return; + + //try to clean-up the plugin dirs + if (Directory.Exists(Application.dataPath + "/Plugins")) + { + var folders = Directory.GetDirectories(Application.dataPath + "/Plugins", "PlayFabShared", SearchOption.AllDirectories); + foreach (var folder in folders) + FileUtil.DeleteFileOrDirectory(folder); + + //try to clean-up the plugin files (if anything is left) + var files = Directory.GetFiles(Application.dataPath + "/Plugins", "PlayFabErrors.cs", SearchOption.AllDirectories); + foreach (var file in files) + FileUtil.DeleteFileOrDirectory(file); + } + + if (FileUtil.DeleteFileOrDirectory(PlayFabEditorPrefsSO.Instance.SdkPath)) + { + PlayFabEditor.RaiseStateUpdate(PlayFabEditor.EdExStates.OnSuccess, "PlayFab SDK Removed!"); + + // HACK for 5.4, AssetDatabase.Refresh(); seems to cause the install to fail. + if (prompt) + { + AssetDatabase.Refresh(); + } + } + else + { + PlayFabEditor.RaiseStateUpdate(PlayFabEditor.EdExStates.OnError, "An unknown error occured and the PlayFab SDK could not be removed."); + } + } + + private static void GetLatestSdkVersion() + { + var threshold = PlayFabEditorPrefsSO.Instance.EdSet_lastSdkVersionCheck != DateTime.MinValue ? PlayFabEditorPrefsSO.Instance.EdSet_lastSdkVersionCheck.AddHours(1) : DateTime.MinValue; + + if (DateTime.Today > threshold) + { + PlayFabEditorHttp.MakeGitHubApiCall("https://api.github.com/repos/PlayFab/UnitySDK/git/refs/tags", (version) => + { + latestSdkVersion = version ?? "Unknown"; + PlayFabEditorPrefsSO.Instance.EdSet_latestSdkVersion = latestSdkVersion; + }); + } + else + { + latestSdkVersion = PlayFabEditorPrefsSO.Instance.EdSet_latestSdkVersion; + } + } + } +} diff --git a/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorSDKTools.cs.meta b/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorSDKTools.cs.meta new file mode 100644 index 0000000..aee8a92 --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorSDKTools.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 808d230e8f7859f4a9c84f6653a2ba1c +timeCreated: 1465798472 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorSettings.cs b/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorSettings.cs new file mode 100644 index 0000000..5d8c504 --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorSettings.cs @@ -0,0 +1,364 @@ +using PlayFab.PfEditor.EditorModels; +using System; +using System.Collections.Generic; +using System.Text; +using UnityEditor; +using UnityEngine; + +namespace PlayFab.PfEditor +{ + [InitializeOnLoad] + public class PlayFabEditorSettings : UnityEditor.Editor + { + #region panel variables + public enum SubMenuStates + { + StandardSettings, + TitleSettings, + ApiSettings, + } + + public enum WebRequestType + { + UnityWww, // High compatability Unity api calls + HttpWebRequest, // High performance multi-threaded api calls +#if UNITY_2017_2_OR_NEWER + UnityWebRequest, // Modern unity HTTP component +#endif + } + + private static float LABEL_WIDTH = 180; + + private static readonly StringBuilder Sb = new StringBuilder(); + + private static SubMenuComponent _menu = null; + + private static readonly Dictionary StudioFoldOutStates = new Dictionary(); + private static Vector2 _titleScrollPos = Vector2.zero; + #endregion + + #region draw calls + private static void DrawApiSubPanel() + { + using (new UnityVertical(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleGray1"))) + { + var curDefines = PlayerSettings.GetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup); + var changedFlags = false; + var allFlags = new Dictionary(PlayFabEditorHelper.FLAG_LABELS); + var extraDefines = new HashSet(curDefines.Split(' ', ';')); + foreach (var eachFlag in extraDefines) + if (!string.IsNullOrEmpty(eachFlag) && !allFlags.ContainsKey(eachFlag)) + allFlags.Add(eachFlag, new PfDefineFlag { Flag = eachFlag, Label = eachFlag, Category = PfDefineFlag.FlagCategory.Other, isInverted = false, isSafe = false }); + var allowUnsafe = extraDefines.Contains(PlayFabEditorHelper.ENABLE_BETA_FETURES); + + foreach (PfDefineFlag.FlagCategory activeFlagCategory in Enum.GetValues(typeof(PfDefineFlag.FlagCategory))) + { + if (activeFlagCategory == PfDefineFlag.FlagCategory.Other && !allowUnsafe) + continue; + + using (var fwl = new FixedWidthLabel(activeFlagCategory.ToString())) { } + + foreach (var eachDefinePair in allFlags) + { + PfDefineFlag eachFlag = eachDefinePair.Value; + if (eachFlag.Category == activeFlagCategory && (eachFlag.isSafe || allowUnsafe)) + DisplayDefineToggle(eachFlag.Label + ": ", eachFlag.isInverted, eachFlag.Flag, ref curDefines, ref changedFlags); + } + } + + if (changedFlags) + { + PlayerSettings.SetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup, curDefines); + Debug.Log("Updating Defines: " + curDefines); + AssetDatabase.Refresh(); + } + } + } + + private static void DisplayDefineToggle(string label, bool invertDisplay, string displayedDefine, ref string curDefines, ref bool changedFlag) + { + bool flagSet, flagGet = curDefines.Contains(displayedDefine); + using (var fwl = new FixedWidthLabel(label)) + { + GUILayout.Space(LABEL_WIDTH - fwl.fieldWidth); + flagSet = EditorGUILayout.Toggle(invertDisplay ? !flagGet : flagGet, PlayFabEditorHelper.uiStyle.GetStyle("Toggle"), GUILayout.MinHeight(25)); + if (invertDisplay) + flagSet = !flagSet; + } + changedFlag |= flagSet != flagGet; + + Sb.Length = 0; + if (flagSet && !flagGet) + { + Sb.Append(curDefines); + if (Sb.Length > 0) + Sb.Append(";"); + Sb.Append(displayedDefine); + curDefines = Sb.ToString(); + } + else if (!flagSet && flagGet) + { + Sb.Append(curDefines); + Sb.Replace(displayedDefine, "").Replace(";;", ";"); + if (Sb.Length > 0 && Sb[0] == ';') + Sb.Remove(0, 1); + if (Sb.Length > 0 && Sb[Sb.Length - 1] == ';') + Sb.Remove(Sb.Length - 1, 1); + curDefines = Sb.ToString(); + } + } + + public static void DrawSettingsPanel() + { + if (_menu != null) + { + _menu.DrawMenu(); + switch ((SubMenuStates)PlayFabEditorPrefsSO.Instance.curSubMenuIdx) + { + case SubMenuStates.StandardSettings: + DrawStandardSettingsSubPanel(); + break; + case SubMenuStates.ApiSettings: + DrawApiSubPanel(); + break; + case SubMenuStates.TitleSettings: + DrawTitleSettingsSubPanel(); + break; + } + } + else + { + RegisterMenu(); + } + } + + private static void DrawTitleSettingsSubPanel() + { + float labelWidth = 100; + + if (PlayFabEditorPrefsSO.Instance.StudioList != null && PlayFabEditorPrefsSO.Instance.StudioList.Count != StudioFoldOutStates.Count + 1) + { + StudioFoldOutStates.Clear(); + foreach (var studio in PlayFabEditorPrefsSO.Instance.StudioList) + { + if (string.IsNullOrEmpty(studio.Id)) + continue; + if (!StudioFoldOutStates.ContainsKey(studio.Id)) + StudioFoldOutStates.Add(studio.Id, new StudioDisplaySet { Studio = studio }); + foreach (var title in studio.Titles) + if (!StudioFoldOutStates[studio.Id].titleFoldOutStates.ContainsKey(title.Id)) + StudioFoldOutStates[studio.Id].titleFoldOutStates.Add(title.Id, new TitleDisplaySet { Title = title }); + } + } + + _titleScrollPos = GUILayout.BeginScrollView(_titleScrollPos, PlayFabEditorHelper.uiStyle.GetStyle("gpStyleGray1")); + + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleClear"))) + { + EditorGUILayout.LabelField("STUDIOS:", PlayFabEditorHelper.uiStyle.GetStyle("labelStyle"), GUILayout.Width(labelWidth)); + GUILayout.FlexibleSpace(); + if (GUILayout.Button("REFRESH", PlayFabEditorHelper.uiStyle.GetStyle("Button"))) + PlayFabEditorDataService.RefreshStudiosList(); + } + + foreach (var studio in StudioFoldOutStates) + { + var style = new GUIStyle(EditorStyles.foldout); + if (studio.Value.isCollapsed) + style.fontStyle = FontStyle.Normal; + + studio.Value.isCollapsed = EditorGUI.Foldout(EditorGUILayout.GetControlRect(), studio.Value.isCollapsed, string.Format("{0} ({1})", studio.Value.Studio.Name, studio.Value.Studio.Titles.Length), true, PlayFabEditorHelper.uiStyle.GetStyle("foldOut_std")); + if (studio.Value.isCollapsed) + continue; + + EditorGUI.indentLevel = 2; + + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleClear"))) + { + EditorGUILayout.LabelField("TITLES:", PlayFabEditorHelper.uiStyle.GetStyle("labelStyle"), GUILayout.Width(labelWidth)); + } + GUILayout.Space(5); + + // draw title foldouts + foreach (var title in studio.Value.titleFoldOutStates) + { + title.Value.isCollapsed = EditorGUI.Foldout(EditorGUILayout.GetControlRect(), title.Value.isCollapsed, string.Format("{0} [{1}]", title.Value.Title.Name, title.Value.Title.Id), true, PlayFabEditorHelper.uiStyle.GetStyle("foldOut_std")); + if (title.Value.isCollapsed) + continue; + + EditorGUI.indentLevel = 3; + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleClear"))) + { + EditorGUILayout.LabelField("SECRET KEY:", PlayFabEditorHelper.uiStyle.GetStyle("labelStyle"), GUILayout.Width(labelWidth)); + EditorGUILayout.TextField("" + title.Value.Title.SecretKey); + } + + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleClear"))) + { + EditorGUILayout.LabelField("URL:", PlayFabEditorHelper.uiStyle.GetStyle("labelStyle"), GUILayout.Width(labelWidth)); + GUILayout.FlexibleSpace(); + if (GUILayout.Button("VIEW IN GAME MANAGER", PlayFabEditorHelper.uiStyle.GetStyle("textButton"))) + Application.OpenURL(title.Value.Title.GameManagerUrl); + GUILayout.FlexibleSpace(); + } + EditorGUI.indentLevel = 2; + } + + EditorGUI.indentLevel = 0; + } + GUILayout.EndScrollView(); + } + + private static Studio GetStudioForTitleId(string titleId) + { + if (PlayFabEditorPrefsSO.Instance.StudioList == null) + return Studio.OVERRIDE; + foreach (var eachStudio in PlayFabEditorPrefsSO.Instance.StudioList) + if (eachStudio.Titles != null) + foreach (var eachTitle in eachStudio.Titles) + if (eachTitle.Id == titleId) + return eachStudio; + return Studio.OVERRIDE; + } + + private static void DrawStandardSettingsSubPanel() + { + float labelWidth = 160; + + using (new UnityVertical(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleGray1"), GUILayout.ExpandWidth(true))) + { + var studio = GetStudioForTitleId(PlayFabEditorDataService.SharedSettings.TitleId); + if (string.IsNullOrEmpty(studio.Id)) + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleClear"))) + EditorGUILayout.LabelField("You are using a TitleId to which you are not a member. A title administrator can approve access for your account.", PlayFabEditorHelper.uiStyle.GetStyle("orTxt")); + + PlayFabGuiFieldHelper.SuperFancyDropdown(labelWidth, "STUDIO: ", studio, PlayFabEditorPrefsSO.Instance.StudioList, eachStudio => eachStudio.Name, OnStudioChange, PlayFabEditorHelper.uiStyle.GetStyle("gpStyleClear")); + studio = GetStudioForTitleId(PlayFabEditorDataService.SharedSettings.TitleId); // This might have changed above, so refresh it + + if (string.IsNullOrEmpty(studio.Id)) + { + // Override studio lets you set your own titleId + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleClear"))) + { + EditorGUILayout.LabelField("TITLE ID: ", PlayFabEditorHelper.uiStyle.GetStyle("labelStyle"), GUILayout.Width(labelWidth)); + + var newTitleId = EditorGUILayout.TextField(PlayFabEditorDataService.SharedSettings.TitleId, PlayFabEditorHelper.uiStyle.GetStyle("TextField"), GUILayout.MinHeight(25)); + if (newTitleId != PlayFabEditorDataService.SharedSettings.TitleId) + OnTitleIdChange(newTitleId); + } + } + else + { + PlayFabGuiFieldHelper.SuperFancyDropdown(labelWidth, "TITLE ID: ", studio.GetTitle(PlayFabEditorDataService.SharedSettings.TitleId), studio.Titles, GetTitleDisplayString, OnTitleChange, PlayFabEditorHelper.uiStyle.GetStyle("gpStyleClear")); + } + + DrawPfSharedSettingsOptions(labelWidth); + } + } + + private static string GetTitleDisplayString(Title title) + { + return string.Format("[{0}] {1}", title.Id, title.Name); + } + + private static void DrawPfSharedSettingsOptions(float labelWidth) + { +#if ENABLE_PLAYFABADMIN_API || ENABLE_PLAYFABSERVER_API || UNITY_EDITOR + // Set the title secret key, if we're using the dropdown + var studio = GetStudioForTitleId(PlayFabEditorDataService.SharedSettings.TitleId); + var correctKey = studio.GetTitleSecretKey(PlayFabEditorDataService.SharedSettings.TitleId); + var setKey = !string.IsNullOrEmpty(studio.Id) && !string.IsNullOrEmpty(correctKey); + if (setKey) + PlayFabEditorDataService.SharedSettings.DeveloperSecretKey = correctKey; + + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleClear"))) + { + EditorGUILayout.LabelField("DEVELOPER SECRET KEY: ", PlayFabEditorHelper.uiStyle.GetStyle("labelStyle"), GUILayout.Width(labelWidth)); + using (new UnityGuiToggler(!setKey)) + PlayFabEditorDataService.SharedSettings.DeveloperSecretKey = EditorGUILayout.TextField(PlayFabEditorDataService.SharedSettings.DeveloperSecretKey, PlayFabEditorHelper.uiStyle.GetStyle("TextField"), GUILayout.MinHeight(25)); + } +#endif + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleClear"))) + { + EditorGUILayout.LabelField("REQUEST TYPE: ", PlayFabEditorHelper.uiStyle.GetStyle("labelStyle"), GUILayout.MaxWidth(labelWidth)); + PlayFabEditorDataService.SharedSettings.WebRequestType = (WebRequestType)EditorGUILayout.EnumPopup(PlayFabEditorDataService.SharedSettings.WebRequestType, PlayFabEditorHelper.uiStyle.GetStyle("TextField"), GUILayout.Height(25)); + } + + if (PlayFabEditorDataService.SharedSettings.WebRequestType == WebRequestType.HttpWebRequest) + { + using (var fwl = new FixedWidthLabel(new GUIContent("REQUEST TIMEOUT: "), PlayFabEditorHelper.uiStyle.GetStyle("labelStyle"))) + { + GUILayout.Space(labelWidth - fwl.fieldWidth); + PlayFabEditorDataService.SharedSettings.TimeOut = EditorGUILayout.IntField(PlayFabEditorDataService.SharedSettings.TimeOut, PlayFabEditorHelper.uiStyle.GetStyle("TextField"), GUILayout.MinHeight(25)); + } + + using (var fwl = new FixedWidthLabel(new GUIContent("KEEP ALIVE: "), PlayFabEditorHelper.uiStyle.GetStyle("labelStyle"))) + { + GUILayout.Space(labelWidth - fwl.fieldWidth); + PlayFabEditorDataService.SharedSettings.KeepAlive = EditorGUILayout.Toggle(PlayFabEditorDataService.SharedSettings.KeepAlive, PlayFabEditorHelper.uiStyle.GetStyle("Toggle"), GUILayout.MinHeight(25)); + } + } + + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleClear"))) + { + EditorGUILayout.LabelField("COMPRESS API DATA: ", PlayFabEditorHelper.uiStyle.GetStyle("labelStyle"), GUILayout.MaxWidth(labelWidth)); + PlayFabEditorDataService.SharedSettings.CompressApiData = EditorGUILayout.Toggle(PlayFabEditorDataService.SharedSettings.CompressApiData, PlayFabEditorHelper.uiStyle.GetStyle("Toggle"), GUILayout.MinHeight(25)); + } + } + #endregion + + #region menu and helper methods + private static void RegisterMenu() + { + if (_menu != null) + return; + + _menu = CreateInstance(); + _menu.RegisterMenuItem("PROJECT", OnStandardSetttingsClicked); + _menu.RegisterMenuItem("STUDIOS", OnTitleSettingsClicked); + _menu.RegisterMenuItem("API", OnApiSettingsClicked); + } + + private static void OnApiSettingsClicked() + { + PlayFabEditor.RaiseStateUpdate(PlayFabEditor.EdExStates.OnSubmenuItemClicked, SubMenuStates.ApiSettings.ToString(), "" + (int)SubMenuStates.ApiSettings); + } + + private static void OnStandardSetttingsClicked() + { + PlayFabEditor.RaiseStateUpdate(PlayFabEditor.EdExStates.OnSubmenuItemClicked, SubMenuStates.StandardSettings.ToString(), "" + (int)SubMenuStates.StandardSettings); + } + + private static void OnTitleSettingsClicked() + { + PlayFabEditor.RaiseStateUpdate(PlayFabEditor.EdExStates.OnSubmenuItemClicked, SubMenuStates.TitleSettings.ToString(), "" + (int)SubMenuStates.TitleSettings); + } + + private static void OnStudioChange(Studio newStudio) + { + var newTitleId = (newStudio.Titles == null || newStudio.Titles.Length == 0) ? "" : newStudio.Titles[0].Id; + OnTitleIdChange(newTitleId); + } + + private static void OnTitleChange(Title newTitle) + { + OnTitleIdChange(newTitle.Id); + } + + private static void OnTitleIdChange(string newTitleId) + { + var studio = GetStudioForTitleId(newTitleId); + PlayFabEditorPrefsSO.Instance.SelectedStudio = studio.Name; + PlayFabEditorDataService.SharedSettings.TitleId = newTitleId; +#if ENABLE_PLAYFABADMIN_API || ENABLE_PLAYFABSERVER_API || UNITY_EDITOR + PlayFabEditorDataService.SharedSettings.DeveloperSecretKey = studio.GetTitleSecretKey(newTitleId); +#endif + PlayFabEditorPrefsSO.Instance.TitleDataCache.Clear(); + if (PlayFabEditorDataMenu.tdViewer != null) + PlayFabEditorDataMenu.tdViewer.items.Clear(); + PlayFabEditorDataService.SaveEnvDetails(); + PlayFabEditor.RaiseStateUpdate(PlayFabEditor.EdExStates.OnSuccess); + } + #endregion + } +} diff --git a/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorSettings.cs.meta b/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorSettings.cs.meta new file mode 100644 index 0000000..48627ff --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorSettings.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: cab05e4a89850364e8979904f46d0433 +timeCreated: 1466458580 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorToolsMenu.cs b/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorToolsMenu.cs new file mode 100644 index 0000000..5a02d10 --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorToolsMenu.cs @@ -0,0 +1,184 @@ +using PlayFab.PfEditor.EditorModels; +using System; +using System.Collections.Generic; +using System.IO; +using UnityEditor; +using UnityEngine; + +namespace PlayFab.PfEditor +{ + public class PlayFabEditorToolsMenu : UnityEditor.Editor + { + public static float buttonWidth = 200; + public static Vector2 scrollPos = Vector2.zero; + + public static void DrawToolsPanel() + { + scrollPos = GUILayout.BeginScrollView(scrollPos, PlayFabEditorHelper.uiStyle.GetStyle("gpStyleGray1")); + buttonWidth = EditorGUIUtility.currentViewWidth > 400 ? EditorGUIUtility.currentViewWidth / 2 : 200; + + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleClear"))) + { + EditorGUILayout.LabelField("CLOUD SCRIPT:", PlayFabEditorHelper.uiStyle.GetStyle("labelStyle")); + GUILayout.Space(10); + if (GUILayout.Button("IMPORT", PlayFabEditorHelper.uiStyle.GetStyle("textButton"), GUILayout.MinHeight(30))) + { + ImportCloudScript(); + } + GUILayout.Space(10); + if (File.Exists(PlayFabEditorPrefsSO.Instance.LocalCloudScriptPath)) + { + if (GUILayout.Button("REMOVE", PlayFabEditorHelper.uiStyle.GetStyle("textButton"), GUILayout.MinHeight(30))) + { + PlayFabEditorPrefsSO.Instance.LocalCloudScriptPath = string.Empty; + PlayFabEditorDataService.SaveEnvDetails(); + } + GUILayout.Space(10); + if (GUILayout.Button("EDIT", PlayFabEditorHelper.uiStyle.GetStyle("textButton"), GUILayout.MinHeight(30))) + { + EditorUtility.OpenWithDefaultApp(PlayFabEditorPrefsSO.Instance.LocalCloudScriptPath); + } + } + } + + if (File.Exists(PlayFabEditorPrefsSO.Instance.LocalCloudScriptPath)) + { + var path = File.Exists(PlayFabEditorPrefsSO.Instance.LocalCloudScriptPath) ? PlayFabEditorPrefsSO.Instance.LocalCloudScriptPath : PlayFabEditorHelper.CLOUDSCRIPT_PATH; + var shortPath = "..." + path.Substring(path.LastIndexOf('/')); + + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleClear"))) + { + GUILayout.FlexibleSpace(); + + if (GUILayout.Button(shortPath, PlayFabEditorHelper.uiStyle.GetStyle("textButton"), GUILayout.MinWidth(110), GUILayout.MinHeight(20))) + { + EditorUtility.RevealInFinder(path); + } + // GUILayout.Space(10); + // if (GUILayout.Button("EDIT LOCALLY", PlayFabEditorHelper.uiStyle.GetStyle("textButton"), GUILayout.MinWidth(90), GUILayout.MinHeight(20))) + // { + // EditorUtility.OpenWithDefaultApp(path); + // } + GUILayout.FlexibleSpace(); + } + + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleClear"))) + { + GUILayout.FlexibleSpace(); + if (GUILayout.Button("SAVE TO PLAYFAB", PlayFabEditorHelper.uiStyle.GetStyle("Button"), GUILayout.MinHeight(32), GUILayout.Width(buttonWidth))) + { + if (EditorUtility.DisplayDialog("Deployment Confirmation", "This action will upload your local Cloud Script changes to PlayFab?", "Continue", "Cancel")) + { + BeginCloudScriptUpload(); + } + } + GUILayout.FlexibleSpace(); + } + } + else + { + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleClear"))) + { + GUILayout.FlexibleSpace(); + EditorGUILayout.LabelField("No Cloud Script files added. Import your file to get started.", PlayFabEditorHelper.uiStyle.GetStyle("orTxt")); + GUILayout.FlexibleSpace(); + } + } + + GUILayout.EndScrollView(); + } + + private static void ImportCloudScript() + { + var dialogResponse = EditorUtility.DisplayDialogComplex("Selcet an Import Option", "What Cloud Script file do you want to import?", "Use my latest PlayFab revision", "Cancel", "Use my local file"); + switch (dialogResponse) + { + case 0: + // use PlayFab + GetCloudScriptRevision(); + break; + case 1: + // cancel + return; + case 2: + //use local + SelectLocalFile(); + break; + } + } + + private static void GetCloudScriptRevision() + { + // empty request object gets latest versions + PlayFabEditorApi.GetCloudScriptRevision(new EditorModels.GetCloudScriptRevisionRequest(), (GetCloudScriptRevisionResult result) => + { + var csPath = PlayFabEditorHelper.CLOUDSCRIPT_PATH; + var location = Path.GetDirectoryName(csPath); + try + { + if (!Directory.Exists(location)) + Directory.CreateDirectory(location); + if (!File.Exists(csPath)) + using (var newfile = File.Create(csPath)) { } + File.WriteAllText(csPath, result.Files[0].FileContents); + Debug.Log("CloudScript uploaded successfully!"); + PlayFabEditorPrefsSO.Instance.LocalCloudScriptPath = csPath; + PlayFabEditorDataService.SaveEnvDetails(); + AssetDatabase.Refresh(); + } + catch (Exception ex) + { + Debug.LogException(ex); + // PlayFabEditor.RaiseStateUpdate(PlayFabEditor.EdExStates.OnError, ex.Message); + return; + } + }, PlayFabEditorHelper.SharedErrorCallback); + } + + private static void SelectLocalFile() + { + var starterPath = File.Exists(PlayFabEditorPrefsSO.Instance.LocalCloudScriptPath) ? Application.dataPath : PlayFabEditorPrefsSO.Instance.LocalCloudScriptPath; + var cloudScriptPath = string.Empty; + cloudScriptPath = EditorUtility.OpenFilePanel("Select your Cloud Script file", starterPath, "js"); + + if (!string.IsNullOrEmpty(cloudScriptPath)) + { + PlayFabEditorPrefsSO.Instance.LocalCloudScriptPath = cloudScriptPath; + PlayFabEditorDataService.SaveEnvDetails(); + } + } + + private static void BeginCloudScriptUpload() + { + var filePath = File.Exists(PlayFabEditorPrefsSO.Instance.LocalCloudScriptPath) ? PlayFabEditorPrefsSO.Instance.LocalCloudScriptPath : PlayFabEditorHelper.CLOUDSCRIPT_PATH; + + if (!File.Exists(PlayFabEditorPrefsSO.Instance.LocalCloudScriptPath) && !File.Exists(PlayFabEditorHelper.CLOUDSCRIPT_PATH)) + { + PlayFabEditor.RaiseStateUpdate(PlayFabEditor.EdExStates.OnError, "Cloud Script Upload Failed: null or corrupt file at path(" + filePath + ")."); + return; + } + + var s = File.OpenText(filePath); + var contents = s.ReadToEnd(); + s.Close(); + + var request = new UpdateCloudScriptRequest(); + request.Publish = EditorUtility.DisplayDialog("Deployment Options", "Do you want to make this Cloud Script live after uploading?", "Yes", "No"); + request.Files = new List(){ + new CloudScriptFile() { + Filename = PlayFabEditorHelper.CLOUDSCRIPT_FILENAME, + FileContents = contents + } + }; + + PlayFabEditorApi.UpdateCloudScript(request, (UpdateCloudScriptResult result) => + { + PlayFabEditorPrefsSO.Instance.LocalCloudScriptPath = filePath; + PlayFabEditorDataService.SaveEnvDetails(); + + Debug.Log("CloudScript uploaded successfully!"); + + }, PlayFabEditorHelper.SharedErrorCallback); + } + } +} diff --git a/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorToolsMenu.cs.meta b/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorToolsMenu.cs.meta new file mode 100644 index 0000000..bb7038f --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorToolsMenu.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 656ebe473a0de47c885424ad7816f408 +timeCreated: 1474039500 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK.meta b/Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK.meta new file mode 100644 index 0000000..225e382 --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: f0a0017f3f4fe3941b7da308a9830c25 +folderAsset: yes +timeCreated: 1468807731 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/ISerializer.cs b/Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/ISerializer.cs new file mode 100644 index 0000000..68f6dc4 --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/ISerializer.cs @@ -0,0 +1,80 @@ +namespace PlayFab.PfEditor.Json +{ + public interface ISerializer + { + T DeserializeObject(string json); + T DeserializeObject(string json, object jsonSerializerStrategy); + object DeserializeObject(string json); + + string SerializeObject(object json); + string SerializeObject(object json, object jsonSerializerStrategy); + } + + public class JsonWrapper + { + private static ISerializer _instance = new SimpleJsonInstance(); + + /// + /// Use this property to override the Serialization for the SDK. + /// + public static ISerializer Instance + { + get { return _instance; } + set { _instance = value; } + } + + public static T DeserializeObject(string json) + { + return _instance.DeserializeObject(json); + } + + public static T DeserializeObject(string json, object jsonSerializerStrategy) + { + return _instance.DeserializeObject(json, jsonSerializerStrategy); + } + + public static object DeserializeObject(string json) + { + return _instance.DeserializeObject(json); + } + + public static string SerializeObject(object json) + { + return _instance.SerializeObject(json); + } + + public static string SerializeObject(object json, object jsonSerializerStrategy) + { + return _instance.SerializeObject(json, jsonSerializerStrategy); + } + } + + public class SimpleJsonInstance : ISerializer + { + public T DeserializeObject(string json) + { + return PlayFabSimpleJson.DeserializeObject(json); + } + + public T DeserializeObject(string json, object jsonSerializerStrategy) + { + return PlayFabSimpleJson.DeserializeObject(json, (IJsonSerializerStrategy)jsonSerializerStrategy); + } + + public object DeserializeObject(string json) + { + return PlayFabSimpleJson.DeserializeObject(json); + } + + public string SerializeObject(object json) + { + return PlayFabSimpleJson.SerializeObject(json); + } + + public string SerializeObject(object json, object jsonSerializerStrategy) + { + return PlayFabSimpleJson.SerializeObject(json, (IJsonSerializerStrategy)jsonSerializerStrategy); + } + } +} + diff --git a/Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/ISerializer.cs.meta b/Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/ISerializer.cs.meta new file mode 100644 index 0000000..592b6d3 --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/ISerializer.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: f326e8a2f3464f246b1f3b5edd7ea59c +timeCreated: 1467153640 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/PlayFabEditorApi.cs b/Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/PlayFabEditorApi.cs new file mode 100644 index 0000000..6959a71 --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/PlayFabEditorApi.cs @@ -0,0 +1,94 @@ +using PlayFab.PfEditor.EditorModels; +using System; +using System.Collections.Generic; + +namespace PlayFab.PfEditor +{ + public class PlayFabEditorApi + { + #region FROM EDITOR API SETS ---------------------------------------------------------------------------------------------------------------------------------------- + public static void RegisterAccount(RegisterAccountRequest request, Action resultCallback, Action errorCb) + { + PlayFabEditorHttp.MakeApiCall("/DeveloperTools/User/RegisterAccount", PlayFabEditorHelper.DEV_API_ENDPOINT, request, resultCallback, errorCb); + } + + public static void Login(LoginRequest request, Action resultCallback, Action errorCb) + { + PlayFabEditorHttp.MakeApiCall("/DeveloperTools/User/Login", PlayFabEditorHelper.DEV_API_ENDPOINT, request, resultCallback, errorCb); + } + + public static void Logout(LogoutRequest request, Action resultCallback, + Action errorCb) + { + PlayFabEditorHttp.MakeApiCall("/DeveloperTools/User/Logout", PlayFabEditorHelper.DEV_API_ENDPOINT, request, resultCallback, errorCb); + } + + public static void GetStudios(GetStudiosRequest request, Action resultCallback, Action errorCb) + { + var token = PlayFabEditorPrefsSO.Instance.DevAccountToken; + request.DeveloperClientToken = token; + PlayFabEditorHttp.MakeApiCall("/DeveloperTools/User/GetStudios", PlayFabEditorHelper.DEV_API_ENDPOINT, request, resultCallback, errorCb); + } + + public static void CreateTitle(CreateTitleRequest request, Action resultCallback, Action errorCb) + { + var token = PlayFabEditorPrefsSO.Instance.DevAccountToken; + request.DeveloperClientToken = token; + PlayFabEditorHttp.MakeApiCall("/DeveloperTools/User/CreateTitle", PlayFabEditorHelper.DEV_API_ENDPOINT, request, resultCallback, errorCb); + } + #endregion + + #region FROM ADMIN / SERVER API SETS ---------------------------------------------------------------------------------------------------------------------------------------- + public static void GetTitleData(Action resultCb, Action errorCb) + { + var titleId = PlayFabEditorDataService.SharedSettings.TitleId; + var apiEndpoint = "https://" + titleId + PlayFabEditorHelper.TITLE_ENDPOINT; + PlayFabEditorHttp.MakeApiCall("/Admin/GetTitleData", apiEndpoint, new GetTitleDataRequest(), resultCb, errorCb); + } + + public static void SetTitleData(Dictionary keys, Action resultCb, Action errorCb) + { + foreach (var pair in keys) + { + var req = new SetTitleDataRequest { Key = pair.Key, Value = pair.Value }; + + var titleId = PlayFabEditorDataService.SharedSettings.TitleId; + var apiEndpoint = "https://" + titleId + PlayFabEditorHelper.TITLE_ENDPOINT; + PlayFabEditorHttp.MakeApiCall("/Admin/SetTitleData", apiEndpoint, req, resultCb, errorCb); + } + } + public static void GetTitleInternalData(Action resultCb, Action errorCb) + { + var titleId = PlayFabEditorDataService.SharedSettings.TitleId; + var apiEndpoint = "https://" + titleId + PlayFabEditorHelper.TITLE_ENDPOINT; + PlayFabEditorHttp.MakeApiCall("/Admin/GetTitleInternalData", apiEndpoint, new GetTitleDataRequest(), resultCb, errorCb); + } + + public static void SetTitleInternalData(Dictionary keys, Action resultCb, Action errorCb) + { + foreach (var pair in keys) + { + var req = new SetTitleDataRequest { Key = pair.Key, Value = pair.Value }; + + var titleId = PlayFabEditorDataService.SharedSettings.TitleId; + var apiEndpoint = "https://" + titleId + PlayFabEditorHelper.TITLE_ENDPOINT; + PlayFabEditorHttp.MakeApiCall("/Admin/SetTitleInternalData", apiEndpoint, req, resultCb, errorCb); + } + } + + public static void UpdateCloudScript(UpdateCloudScriptRequest request, Action resultCb, Action errorCb) + { + var titleId = PlayFabEditorDataService.SharedSettings.TitleId; + var apiEndpoint = "https://" + titleId + PlayFabEditorHelper.TITLE_ENDPOINT; + PlayFabEditorHttp.MakeApiCall("/Admin/UpdateCloudScript", apiEndpoint, request, resultCb, errorCb); + } + + public static void GetCloudScriptRevision(GetCloudScriptRevisionRequest request, Action resultCb, Action errorCb) + { + var titleId = PlayFabEditorDataService.SharedSettings.TitleId; + var apiEndpoint = "https://" + titleId + PlayFabEditorHelper.TITLE_ENDPOINT; + PlayFabEditorHttp.MakeApiCall("/Admin/GetCloudScriptRevision", apiEndpoint, request, resultCb, errorCb); + } + #endregion + } +} diff --git a/Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/PlayFabEditorApi.cs.meta b/Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/PlayFabEditorApi.cs.meta new file mode 100644 index 0000000..6d8591e --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/PlayFabEditorApi.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 78d90281a98aa9c47af733ae62f11a73 +timeCreated: 1466719777 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/PlayFabEditorHttp.cs b/Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/PlayFabEditorHttp.cs new file mode 100644 index 0000000..bd9eed7 --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/PlayFabEditorHttp.cs @@ -0,0 +1,227 @@ +using UnityEngine; +using System; +using System.Collections; +using System.Collections.Generic; +using System.IO; +using PlayFab.PfEditor.Json; +using PlayFab.PfEditor.EditorModels; +using UnityEngine.Networking; + +namespace PlayFab.PfEditor +{ + public class PlayFabEditorHttp : UnityEditor.Editor + { + internal static void MakeDownloadCall(string url, Action resultCallback) + { +#if UNITY_2018_2_OR_NEWER + UnityWebRequest www = UnityWebRequest.Get(url); + PlayFabEditor.RaiseStateUpdate(PlayFabEditor.EdExStates.OnHttpReq, url, PlayFabEditorHelper.MSG_SPIN_BLOCK); + EditorCoroutine.Start(PostDownload(www, (response) => { WriteResultFile(url, resultCallback, response); }, PlayFabEditorHelper.SharedErrorCallback), www); +#else + var www = new WWW(url); + PlayFabEditor.RaiseStateUpdate(PlayFabEditor.EdExStates.OnHttpReq, url, PlayFabEditorHelper.MSG_SPIN_BLOCK); + EditorCoroutine.Start(PostDownload(www, (response) => { WriteResultFile(url, resultCallback, response); }, PlayFabEditorHelper.SharedErrorCallback), www); +#endif + } + + private static void WriteResultFile(string url, Action resultCallback, byte[] response) + { + PlayFabEditor.RaiseStateUpdate(PlayFabEditor.EdExStates.OnHttpRes, url); + + string fileName; + if (url.IndexOf("unity-edex") > -1) + fileName = PlayFabEditorHelper.EDEX_UPGRADE_PATH; + else if (url.IndexOf("unity-via-edex") > -1) + fileName = PlayFabEditorHelper.SDK_DOWNLOAD_PATH; + else + fileName = PlayFabEditorHelper.EDEX_PACKAGES_PATH; + + var fileSaveLocation = PlayFabEditorHelper.EDEX_ROOT + fileName; + var fileSaveDirectory = Path.GetDirectoryName(fileSaveLocation); + Debug.Log("Saving " + response.Length + " bytes to: " + fileSaveLocation); + if (!Directory.Exists(fileSaveDirectory)) + Directory.CreateDirectory(fileSaveDirectory); + File.WriteAllBytes(fileSaveLocation, response); + resultCallback(fileSaveLocation); + } + + internal static void MakeApiCall(string api, string apiEndpoint, TRequestType request, Action resultCallback, Action errorCallback) where TResultType : class + { + var url = apiEndpoint + api; + var req = JsonWrapper.SerializeObject(request, PlayFabEditorUtil.ApiSerializerStrategy); + //Set headers + var headers = new Dictionary + { + {"Content-Type", "application/json"}, + {"X-ReportErrorAsSuccess", "true"}, + {"X-PlayFabSDK", PlayFabEditorHelper.EDEX_NAME + "_" + PlayFabEditorHelper.EDEX_VERSION} + }; + + if (api.Contains("/Server/") || api.Contains("/Admin/")) + { + if (PlayFabEditorDataService.ActiveTitle == null || string.IsNullOrEmpty(PlayFabEditorDataService.ActiveTitle.SecretKey)) + { + PlayFabEditorDataService.RefreshStudiosList(); + return; + } + + headers.Add("X-SecretKey", PlayFabEditorDataService.ActiveTitle.SecretKey); + } + + //Encode Payload + var payload = System.Text.Encoding.UTF8.GetBytes(req.Trim()); +#if UNITY_2018_2_OR_NEWER + var www = new UnityWebRequest(url) + { + uploadHandler = new UploadHandlerRaw(payload), + downloadHandler = new DownloadHandlerBuffer(), + method = "POST" + }; + + foreach (var header in headers) + { + if (!string.IsNullOrEmpty(header.Key) && !string.IsNullOrEmpty(header.Value)) + { + www.SetRequestHeader(header.Key, header.Value); + } + else + { + UnityEngine.Debug.LogWarning("Null header"); + } + } + + + PlayFabEditor.RaiseStateUpdate(PlayFabEditor.EdExStates.OnHttpReq, api, PlayFabEditorHelper.MSG_SPIN_BLOCK); + EditorCoroutine.Start(Post(www, (response) => { OnWwwSuccess(api, resultCallback, errorCallback, response); }, (error) => { OnWwwError(errorCallback, error); }), www); +#else + var www = new WWW(url, payload, headers); + PlayFabEditor.RaiseStateUpdate(PlayFabEditor.EdExStates.OnHttpReq, api, PlayFabEditorHelper.MSG_SPIN_BLOCK); + EditorCoroutine.Start(Post(www, (response) => { OnWwwSuccess(api, resultCallback, errorCallback, response); }, (error) => { OnWwwError(errorCallback, error); }), www); +#endif + } + + private static void OnWwwSuccess(string api, Action resultCallback, Action errorCallback, string response) where TResultType : class + { + var httpResult = JsonWrapper.DeserializeObject(response, PlayFabEditorUtil.ApiSerializerStrategy); + if (httpResult.code != 200) + { + OnWwwError(errorCallback, response); + return; + } + + PlayFabEditor.RaiseStateUpdate(PlayFabEditor.EdExStates.OnHttpRes, api); + if (resultCallback == null) + return; + + TResultType result = null; + var resultAssigned = false; + + var dataJson = JsonWrapper.SerializeObject(httpResult.data, PlayFabEditorUtil.ApiSerializerStrategy); + result = JsonWrapper.DeserializeObject(dataJson, PlayFabEditorUtil.ApiSerializerStrategy); + resultAssigned = true; + + if (resultAssigned) + resultCallback(result); + } + + private static void OnWwwError(Action errorCallback, string error) + { + if (errorCallback != null) + errorCallback(PlayFabEditorHelper.GeneratePlayFabError(error)); + else + PlayFabEditor.RaiseStateUpdate(PlayFabEditor.EdExStates.OnError, "OnWwwError" + error); + } + + internal static void MakeGitHubApiCall(string url, Action resultCallback) + { +#if UNITY_2018_2_OR_NEWER + UnityWebRequest webReq = UnityWebRequest.Get(url); + EditorCoroutine.Start(Post(webReq, (response) => { OnGitHubSuccess(resultCallback, response); }, PlayFabEditorHelper.SharedErrorCallback), webReq); +#else + var www = new WWW(url); + EditorCoroutine.Start(Post(www, (response) => { OnGitHubSuccess(resultCallback, response); }, PlayFabEditorHelper.SharedErrorCallback), www); +#endif + } + + private static void OnGitHubSuccess(Action resultCallback, string response) + { + if (resultCallback == null) + return; + + var jsonResponse = JsonWrapper.DeserializeObject>(response); + if (jsonResponse == null || jsonResponse.Count == 0) + return; + + // list seems to come back in ascending order (oldest -> newest) + var latestSdkTag = (JsonObject)jsonResponse[jsonResponse.Count - 1]; + object tag; + if (latestSdkTag.TryGetValue("ref", out tag)) + { + var startIndex = tag.ToString().LastIndexOf('/') + 1; + var length = tag.ToString().Length - startIndex; + resultCallback(tag.ToString().Substring(startIndex, length)); + } + else + { + resultCallback(null); + } + } +#if UNITY_2018_2_OR_NEWER + private static IEnumerator Post(UnityWebRequest www, Action callBack, Action errorCallback) + { + if (www != null) + { + yield return www.SendWebRequest(); + + if (!string.IsNullOrEmpty(www.error)) + errorCallback(www.error); + else + callBack(www.downloadHandler.text); + } + else + { + UnityEngine.Debug.Log("UnityWebRequest was null"); + errorCallback("UnityWebRequest Object was null"); + } + } + + private static IEnumerator PostDownload(UnityWebRequest www, Action callBack, Action errorCallback) + { + if (www != null) + { + yield return www.SendWebRequest(); + + if (!string.IsNullOrEmpty(www.error) || www.isHttpError) + errorCallback(www.error); + else + callBack(www.downloadHandler.data); + } + else + { + UnityEngine.Debug.Log("UnityWebRequest was null"); + errorCallback("UnityWebRequest Object was null"); + } + } +#else + private static IEnumerator Post(WWW www, Action callBack, Action errorCallback) + { + yield return www; + + if (!string.IsNullOrEmpty(www.error)) + errorCallback(www.error); + else + callBack(www.text); + } + + private static IEnumerator PostDownload(WWW www, Action callBack, Action errorCallback) + { + yield return www; + + if (!string.IsNullOrEmpty(www.error)) + errorCallback(www.error); + else + callBack(www.bytes); + } +#endif + } +} diff --git a/Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/PlayFabEditorHttp.cs.meta b/Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/PlayFabEditorHttp.cs.meta new file mode 100644 index 0000000..07e443c --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/PlayFabEditorHttp.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: f495d2bd2522f354d82ab4c043cbc727 +timeCreated: 1466703757 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/PlayFabEditorModels.cs b/Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/PlayFabEditorModels.cs new file mode 100644 index 0000000..231050d --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/PlayFabEditorModels.cs @@ -0,0 +1,463 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace PlayFab.PfEditor.EditorModels +{ + public class RegisterAccountRequest + { + public string Email; + public string Password; + public string StudioName; + public string DeveloperToolProductName; + public string DeveloperToolProductVersion; + } + + public class RegisterAccountResult + { + public string DeveloperClientToken; + } + + public class LoginRequest + { + public string Email; + public string Password; + public string TwoFactorAuth; + public string DeveloperToolProductName; + public string DeveloperToolProductVersion; + } + + public class LoginResult + { + public string DeveloperClientToken; + } + + public class LogoutRequest + { + public string DeveloperClientToken; + } + + public class LogoutResult + { + } + + public class GetStudiosRequest + { + public string DeveloperClientToken; + } + + public class GetStudiosResult + { + public Studio[] Studios; + } + + public class CreateTitleRequest + { + public string DeveloperClientToken; + public string Name; + public string StudioId; + } + + public class CreateTitleResult + { + public Title Title; + } + + public class Title + { + public string Id; + public string Name; + public string SecretKey; + public string GameManagerUrl; + } + + public class Studio + { + public static Studio OVERRIDE = new Studio { Id = "", Name = PlayFabEditorHelper.STUDIO_OVERRIDE, Titles = null }; + + public string Id; + public string Name; + + public Title[] Titles; + + public Title GetTitle(string titleId) + { + if (Titles == null) + return null; + for (var i = 0; i < Titles.Length; i++) + if (Titles[i].Id == titleId) + return Titles[i]; + return null; + } + + public string GetTitleSecretKey(string titleId) + { + var title = GetTitle(titleId); + return title == null ? "" : title.SecretKey; + } + } + + public class GetTitleDataRequest + { + public List Keys; + } + + public class GetTitleDataResult + { + public Dictionary Data; + } + + public class SetTitleDataRequest + { + public string Key; + public string Value; + } + + public class SetTitleDataResult + { + } + + public class CloudScriptFile + { + public string Filename; + public string FileContents; + } + + public class UpdateCloudScriptRequest + { + public List Files; + public bool Publish; + public string DeveloperPlayFabId; + } + + public class UpdateCloudScriptResult + { + public int Version; + public int Revision; + } + + public class GetCloudScriptRevisionRequest + { + public int? Version; + public int? Revision; + } + + public class GetCloudScriptRevisionResult + { + public int Version; + public int Revision; + public System.DateTime CreatedAt; + public List Files; + public bool IsPublished; + } + + public class PlayFabError + { + public int HttpCode; + public string HttpStatus; + public PlayFabErrorCode Error; + public string ErrorMessage; + public Dictionary> ErrorDetails; + public object CustomData; + + [ThreadStatic] + private static StringBuilder _tempSb; + public string GenerateErrorReport() + { + if (_tempSb == null) + _tempSb = new StringBuilder(); + _tempSb.Length = 0; + _tempSb.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 HttpResponseObject + { + public int code; + public string status; + public object data; + } + + public enum PlayFabErrorCode + { + Unknown = 1, + Success = 0, + 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, + InvalidLobbyId = 1114, + 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, + TwoFactorAuthenticationTokenRequired = 1246 + } + + #region Misc UI Models + public class StudioDisplaySet + { + public PlayFab.PfEditor.EditorModels.Studio Studio; + public bool isCollapsed = true; + public Dictionary titleFoldOutStates = new Dictionary(); + } + + public class TitleDisplaySet + { + public PlayFab.PfEditor.EditorModels.Title Title; + public bool isCollapsed = true; + } + + public class KvpItem + { + public string Key; + public string Value; + public string _prvKey; + public string _prvValue; + public bool isDirty; + + public KvpItem(string k, string v) + { + Key = k; + Value = v; + + _prvKey = k; + _prvValue = v; + } + + public void CleanItem() + { + _prvKey = Key; + _prvValue = Value; + isDirty = false; + } + + public void DataEditedCheck() + { + if (Key != _prvKey || Value != _prvValue) + isDirty = true; + } + } + #endregion +} diff --git a/Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/PlayFabEditorModels.cs.meta b/Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/PlayFabEditorModels.cs.meta new file mode 100644 index 0000000..ac21614 --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/PlayFabEditorModels.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 9115cedc892e0c845941e0cb3f98bd3b +timeCreated: 1466719838 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/SimpleJson.cs b/Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/SimpleJson.cs new file mode 100644 index 0000000..05d65f2 --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/SimpleJson.cs @@ -0,0 +1,2047 @@ +//----------------------------------------------------------------------- +// +// 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 Window Metro style application/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.PfEditor.Json +{ + /// + /// 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 + { + /// + /// The internal member dictionary. + /// + private readonly Dictionary _members; + + /// + /// Initializes a new instance of . + /// + public JsonObject() + { + _members = new Dictionary(); + } + + /// + /// 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) + { + return _members.ContainsKey(item.Key) && _members[item.Key] == 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 this) + { + 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(this); + } + +#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 + } + + /// + /// 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) + { + char[] charArray = json.ToCharArray(); + int index = 0; + obj = ParseValue(charArray, ref index, ref success); + } + else + obj = null; + + return success; + } + + public static object DeserializeObject(string json, Type type, IJsonSerializerStrategy jsonSerializerStrategy) + { + object jsonObject = DeserializeObject(json); + return type == null || jsonObject != null && ReflectionUtils.IsAssignableFrom(jsonObject.GetType(), type) + ? jsonObject + : (jsonSerializerStrategy ?? CurrentJsonSerializerStrategy).DeserializeObject(jsonObject, type); + } + + public static object DeserializeObject(string json, Type type) + { + return DeserializeObject(json, type, null); + } + + public static T DeserializeObject(string json, IJsonSerializerStrategy jsonSerializerStrategy) + { + return (T)DeserializeObject(json, typeof(T), jsonSerializerStrategy); + } + + public static T DeserializeObject(string json) + { + return (T)DeserializeObject(json, typeof(T), null); + } + + /// + /// 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(char[] 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(char[] 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(char[] 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(char[] 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(new string(json, 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 (new string(json, index, 2) == "\\u" && UInt32.TryParse(new string(json, 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(char[] 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 = new string(json, index, charLength); + if (str.IndexOf(".", StringComparison.OrdinalIgnoreCase) != -1 || str.IndexOf("e", StringComparison.OrdinalIgnoreCase) != -1) + { + double number; + success = double.TryParse(new string(json, index, charLength), NumberStyles.Any, CultureInfo.InvariantCulture, out number); + returnNumber = number; + } + else if (str.IndexOf("-", StringComparison.OrdinalIgnoreCase) == -1) + { + ulong number; + success = ulong.TryParse(new string(json, index, charLength), NumberStyles.Any, CultureInfo.InvariantCulture, out number); + returnNumber = number; + } + else + { + long number; + success = long.TryParse(new string(json, index, charLength), NumberStyles.Any, CultureInfo.InvariantCulture, out number); + returnNumber = number; + } + index = lastIndex + 1; + return returnNumber; + } + + static int GetLastIndexOfNumber(char[] 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(char[] json, ref int index) + { + for (; index < json.Length; index++) + if (" \t\n\r\b\f".IndexOf(json[index]) == -1) break; + } + + static TokenType LookAhead(char[] json, int index) + { + int saveIndex = index; + return NextToken(json, ref saveIndex); + } + + [SuppressMessage("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + static TokenType NextToken(char[] 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); +#if NETFX_CORE + var isStringKeyDictionary = type.GetTypeInfo().IsGenericType && type.GetGenericTypeDefinition() == typeof(Dictionary<,>) && genArgs[0] == typeof(string); +#else + var isStringKeyDictionary = type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Dictionary<,>) && genArgs[0] == typeof(string); +#endif + 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(string clrPropertyName) + { + return clrPropertyName; + } + + 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[MapClrMemberNameToJsonFieldName(propertyInfo.Name)] = ReflectionUtils.GetGetMethod(propertyInfo); + } + } + foreach (FieldInfo fieldInfo in ReflectionUtils.GetFields(type)) + { + if (fieldInfo.IsStatic || !fieldInfo.IsPublic) + continue; + result[MapClrMemberNameToJsonFieldName(fieldInfo.Name)] = 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.Name)] = 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.Name)] = 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"); + 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; +#if NETFX_CORE + bool isEnumType = type.GetTypeInfo().IsEnum; +#else + bool isEnumType = type.IsEnum; //type.GetType; +#endif + 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 innerType = ReflectionUtils.GetGenericListElementType(type); + list = (IList)(ConstructorCache[type] ?? ConstructorCache[typeof(List<>).MakeGenericType(innerType)])(); + 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) + obj.Add(MapClrMemberNameToJsonFieldName(getter.Key), getter.Value(input)); + } + 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) + { + 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<,>); + } + + 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/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/SimpleJson.cs.meta b/Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/SimpleJson.cs.meta new file mode 100644 index 0000000..83a0769 --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/SimpleJson.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 0f0d14c9d506300479e2ab23ae3af45f +timeCreated: 1466707367 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils.meta b/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils.meta new file mode 100644 index 0000000..e8597d7 --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 71cec03dd8d77ee489008fa915e3b3a2 +folderAsset: yes +timeCreated: 1466715484 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/EditorCoroutine.cs b/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/EditorCoroutine.cs new file mode 100644 index 0000000..0a0324b --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/EditorCoroutine.cs @@ -0,0 +1,144 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEditor; +using UnityEngine; +using UnityEngine.Networking; + +namespace PlayFab.PfEditor +{ + public class EditorCoroutine + { + public string Id; + public class EditorWaitForSeconds : YieldInstruction + { + public float Seconds; + + public EditorWaitForSeconds(float seconds) + { + this.Seconds = seconds; + } + } + + private SortedList shouldRunAfterTimes = new SortedList(); + private const float _tick = .02f; + + public static EditorCoroutine Start(IEnumerator _routine) + { + var coroutine = new EditorCoroutine(_routine); + coroutine.Id = Guid.NewGuid().ToString(); + coroutine.Start(); + return coroutine; + } + +#if UNITY_2018_2_OR_NEWER + public static EditorCoroutine Start(IEnumerator _routine, UnityWebRequest www) + { + var coroutine = new EditorCoroutine(_routine); + coroutine.Id = Guid.NewGuid().ToString(); + coroutine._www = www; + coroutine.Start(); + return coroutine; + } +#else + public static EditorCoroutine Start(IEnumerator _routine, WWW www) + { + var coroutine = new EditorCoroutine(_routine); + coroutine.Id = Guid.NewGuid().ToString(); + coroutine._www = www; + coroutine.Start(); + return coroutine; + } +#endif + + + readonly IEnumerator routine; + + +#if UNITY_2018_2_OR_NEWER + private UnityWebRequest _www; + private bool _sent = false; +#else + private WWW _www; +#endif + + EditorCoroutine(IEnumerator _routine) + { + routine = _routine; + } + + void Start() + { + EditorApplication.update += Update; + } + private void Stop() + { + EditorApplication.update -= Update; + } + + private float _timeCounter = 0; + void Update() + { + _timeCounter += _tick; + //Debug.LogFormat("ID:{0} TimeCounter:{1}", this.Id, _timeCounter); + + try + { + if (_www != null) + { +#if UNITY_2018_2_OR_NEWER + if (!_sent) + { + try + { + routine.MoveNext(); + _sent = true; + } + catch (ArgumentNullException) + { + } + } +#endif + + if (_www.isDone && !routine.MoveNext()) + { + Stop(); + } + } + else + { + var seconds = routine.Current as EditorWaitForSeconds; + if (seconds != null) + { + var wait = seconds; + shouldRunAfterTimes.Add(_timeCounter + wait.Seconds, routine); + } + else if (!routine.MoveNext()) + { + Stop(); + } + } + + var shouldRun = shouldRunAfterTimes; + var index = 0; + foreach (var runAfterSeconds in shouldRun) + { + if (_timeCounter >= runAfterSeconds.Key) + { + //Debug.LogFormat("RunAfterSeconds: {0} >= {1}", runAfterSeconds.Key, _timeCounter); + shouldRunAfterTimes.RemoveAt(index); + if (!runAfterSeconds.Value.MoveNext()) + { + Stop(); + } + } + index++; + } + } + catch (Exception ex) + { + Debug.LogException(ex); + } + } + } +} diff --git a/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/EditorCoroutine.cs.meta b/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/EditorCoroutine.cs.meta new file mode 100644 index 0000000..224da89 --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/EditorCoroutine.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 4bfb5aeb6a8516445b2f97249ab88f62 +timeCreated: 1466530674 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorDataService.cs b/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorDataService.cs new file mode 100644 index 0000000..a2b7350 --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorDataService.cs @@ -0,0 +1,209 @@ +using PlayFab.PfEditor.EditorModels; +using PlayFab.PfEditor.Json; +using System.Collections.Generic; +using System.Reflection; +using UnityEditor; +using UnityEngine; + +namespace PlayFab.PfEditor +{ + [InitializeOnLoad] + public class PlayFabEditorDataService : UnityEditor.Editor + { + #region EditorPref data classes + public class PlayFab_SharedSettingsProxy + { + private readonly Dictionary _settingProps = new Dictionary(); + private readonly string[] expectedProps = new[] { "titleid", "developersecretkey", "requesttype", "compressapidata", "requestkeepalive", "requesttimeout" }; + + public string TitleId { get { return Get("titleid"); } set { Set("titleid", value); } } + public string DeveloperSecretKey { get { return Get("developersecretkey"); } set { Set("developersecretkey", value); } } + public PlayFabEditorSettings.WebRequestType WebRequestType { get { return Get("requesttype"); } set { Set("requesttype", (int)value); } } + public bool CompressApiData { get { return Get("compressapidata"); } set { Set("compressapidata", value); } } + public bool KeepAlive { get { return Get("requestkeepalive"); } set { Set("requestkeepalive", value); } } + public int TimeOut { get { return Get("requesttimeout"); } set { Set("requesttimeout", value); } } + + public PlayFab_SharedSettingsProxy() + { + LoadProps(); + } + + private PropertyInfo LoadProps(string name = null) + { + var playFabSettingsType = PlayFabEditorSDKTools.GetPlayFabSettings(); + if (playFabSettingsType == null) + return null; + + if (string.IsNullOrEmpty(name)) + { + for (var i = 0; i < expectedProps.Length; i++) + LoadProps(expectedProps[i]); + return null; + } + else + { + var eachProperty = playFabSettingsType.GetProperty(name, BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Static); + if (eachProperty != null) + _settingProps[name.ToLowerInvariant()] = eachProperty; + return eachProperty; + } + } + + private T Get(string name) + { + PropertyInfo propInfo; + var success = _settingProps.TryGetValue(name.ToLowerInvariant(), out propInfo); + T output = !success ? default(T) : (T)propInfo.GetValue(null, null); + return output; + } + + private void Set(string name, T value) + { + PropertyInfo propInfo; + if (!_settingProps.TryGetValue(name.ToLowerInvariant(), out propInfo)) + propInfo = LoadProps(name); + if (propInfo != null) + propInfo.SetValue(null, value, null); + else + Debug.LogWarning("Could not save " + name + " because PlayFabSettings could not be found."); + } + } + #endregion EditorPref data classes + + public static PlayFab_SharedSettingsProxy SharedSettings = new PlayFab_SharedSettingsProxy(); + + private static string KeyPrefix + { + get + { + var dataPath = Application.dataPath; + var lastIndex = dataPath.LastIndexOf('/'); + var secondToLastIndex = dataPath.LastIndexOf('/', lastIndex - 1); + return dataPath.Substring(secondToLastIndex, lastIndex - secondToLastIndex); + } + } + + public static bool IsDataLoaded = false; + + public static Title ActiveTitle + { + get + { + if (PlayFabEditorPrefsSO.Instance.StudioList != null && PlayFabEditorPrefsSO.Instance.StudioList.Count > 0) + { + if (string.IsNullOrEmpty(PlayFabEditorPrefsSO.Instance.SelectedStudio) || PlayFabEditorPrefsSO.Instance.SelectedStudio == PlayFabEditorHelper.STUDIO_OVERRIDE) + return new Title { Id = SharedSettings.TitleId, SecretKey = SharedSettings.DeveloperSecretKey, GameManagerUrl = PlayFabEditorHelper.GAMEMANAGER_URL }; + + if (string.IsNullOrEmpty(PlayFabEditorPrefsSO.Instance.SelectedStudio) || string.IsNullOrEmpty(SharedSettings.TitleId)) + return null; + + int studioIndex; int titleIndex; + if (DoesTitleExistInStudios(SharedSettings.TitleId, out studioIndex, out titleIndex)) + return PlayFabEditorPrefsSO.Instance.StudioList[studioIndex].Titles[titleIndex]; + } + return null; + } + } + + public static void SaveEnvDetails(bool updateToScriptableObj = true) + { + UpdateScriptableObject(); + } + + private static TResult LoadFromEditorPrefs(string key) where TResult : class, new() + { + if (!EditorPrefs.HasKey(KeyPrefix + key)) + return new TResult(); + + var serialized = EditorPrefs.GetString(KeyPrefix + key); + var result = JsonWrapper.DeserializeObject(serialized); + if (result != null) + return JsonWrapper.DeserializeObject(serialized); + return new TResult(); + } + + private static void UpdateScriptableObject() + { + var playfabSettingsType = PlayFabEditorSDKTools.GetPlayFabSettings(); + if (playfabSettingsType == null || !PlayFabEditorSDKTools.IsInstalled || !PlayFabEditorSDKTools.isSdkSupported) + return; + + var props = playfabSettingsType.GetProperties(); + foreach (var property in props) + { + switch (property.Name.ToLowerInvariant()) + { + case "productionenvironmenturl": + property.SetValue(null, PlayFabEditorHelper.TITLE_ENDPOINT, null); break; + } + } + + var getSoMethod = playfabSettingsType.GetMethod("GetSharedSettingsObjectPrivate", BindingFlags.NonPublic | BindingFlags.Static); + if (getSoMethod != null) + { + var so = getSoMethod.Invoke(null, new object[0]) as ScriptableObject; + if (so != null) + EditorUtility.SetDirty(so); + } + PlayFabEditorPrefsSO.Save(); + AssetDatabase.SaveAssets(); + } + + public static bool DoesTitleExistInStudios(string searchFor) //out Studio studio + { + if (PlayFabEditorPrefsSO.Instance.StudioList == null) + return false; + searchFor = searchFor.ToLower(); + foreach (var studio in PlayFabEditorPrefsSO.Instance.StudioList) + if (studio.Titles != null) + foreach (var title in studio.Titles) + if (title.Id.ToLower() == searchFor) + return true; + return false; + } + + private static bool DoesTitleExistInStudios(string searchFor, out int studioIndex, out int titleIndex) //out Studio studio + { + studioIndex = 0; // corresponds to our _OVERRIDE_ + titleIndex = -1; + + if (PlayFabEditorPrefsSO.Instance.StudioList == null) + return false; + + for (var studioIdx = 0; studioIdx < PlayFabEditorPrefsSO.Instance.StudioList.Count; studioIdx++) + { + for (var titleIdx = 0; titleIdx < PlayFabEditorPrefsSO.Instance.StudioList[studioIdx].Titles.Length; titleIdx++) + { + if (PlayFabEditorPrefsSO.Instance.StudioList[studioIdx].Titles[titleIdx].Id.ToLower() == searchFor.ToLower()) + { + studioIndex = studioIdx; + titleIndex = titleIdx; + return true; + } + } + } + + return false; + } + + public static void RefreshStudiosList(bool onlyIfNull = false) + { + if (string.IsNullOrEmpty(PlayFabEditorPrefsSO.Instance.DevAccountToken)) + return; // Can't load studios when not logged in + if (onlyIfNull && PlayFabEditorPrefsSO.Instance.StudioList != null) + return; // Don't spam load this, only load it the first time + + if (PlayFabEditorPrefsSO.Instance.StudioList != null) + PlayFabEditorPrefsSO.Instance.StudioList.Clear(); + PlayFabEditorApi.GetStudios(new GetStudiosRequest(), (getStudioResult) => + { + if (PlayFabEditorPrefsSO.Instance.StudioList == null) + PlayFabEditorPrefsSO.Instance.StudioList = new List(); + foreach (var eachStudio in getStudioResult.Studios) + PlayFabEditorPrefsSO.Instance.StudioList.Add(eachStudio); + PlayFabEditorPrefsSO.Instance.StudioList.Add(Studio.OVERRIDE); + PlayFabEditorPrefsSO.Save(); + }, PlayFabEditorHelper.SharedErrorCallback); + } + } +} diff --git a/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorDataService.cs.meta b/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorDataService.cs.meta new file mode 100644 index 0000000..e237b3e --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorDataService.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: c4c398f1711644e79aae821d377e572e +timeCreated: 1470851203 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorHelper.cs b/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorHelper.cs new file mode 100644 index 0000000..59556be --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorHelper.cs @@ -0,0 +1,223 @@ +using UnityEditor; +using UnityEngine; +using System; +using System.Collections.Generic; +using System.IO; +using PlayFab.PfEditor.Json; + +namespace PlayFab.PfEditor +{ + [InitializeOnLoad] + public static partial class PlayFabEditorHelper + { + #region EDITOR_STRINGS + public static string EDEX_VERSION_TEMPLATE = "namespace PlayFab.PfEditor { public static partial class PlayFabEditorHelper { public static string EDEX_VERSION = \"{sdkVersion}\"; } }\n"; + public static string EDEX_NAME = "PlayFab_EditorExtensions"; + public static string EDEX_ROOT = Application.dataPath + "/PlayFabEditorExtensions/Editor"; + public static string DEV_API_ENDPOINT = "https://editor.playfabapi.com"; + public static string TITLE_ENDPOINT = ".playfabapi.com"; + public static string GAMEMANAGER_URL = "https://developer.playfab.com"; + public static string PLAYFAB_SETTINGS_TYPENAME = "PlayFabSettings"; + public static string PLAYFAB_EDEX_MAINFILE = "PlayFabEditor.cs"; + public static string SDK_DOWNLOAD_PATH = "/Resources/PlayFabUnitySdk.unitypackage"; + public static string EDEX_UPGRADE_PATH = "/Resources/PlayFabUnityEditorExtensions.unitypackage"; + public static string EDEX_PACKAGES_PATH = "/Resources/MostRecentPackage.unitypackage"; + + public static string CLOUDSCRIPT_FILENAME = ".CloudScript.js"; //prefixed with a '.' to exclude this code from Unity's compiler + public static string CLOUDSCRIPT_PATH = EDEX_ROOT + "/Resources/" + CLOUDSCRIPT_FILENAME; + + public static string ADMIN_API = "ENABLE_PLAYFABADMIN_API"; + public static string CLIENT_API = "DISABLE_PLAYFABCLIENT_API"; + public static string ENTITY_API = "DISABLE_PLAYFABENTITY_API"; + public static string SERVER_API = "ENABLE_PLAYFABSERVER_API"; + public static string DEBUG_REQUEST_TIMING = "PLAYFAB_REQUEST_TIMING"; + public static string ENABLE_PLAYFABPLAYSTREAM_API = "ENABLE_PLAYFABPLAYSTREAM_API"; + public static string ENABLE_BETA_FETURES = "ENABLE_PLAYFAB_BETA"; + public static string ENABLE_PLAYFABPUBSUB_API = "ENABLE_PLAYFABPUBSUB_API"; + public static Dictionary FLAG_LABELS = new Dictionary { + { ADMIN_API, new PfDefineFlag { Flag = ADMIN_API, Label = "ENABLE ADMIN API", Category = PfDefineFlag.FlagCategory.Api, isInverted = false, isSafe = true } }, + { CLIENT_API, new PfDefineFlag { Flag = CLIENT_API, Label = "ENABLE CLIENT API", Category = PfDefineFlag.FlagCategory.Api, isInverted = true, isSafe = true } }, + { ENTITY_API, new PfDefineFlag { Flag = ENTITY_API, Label = "ENABLE ENTITY API", Category = PfDefineFlag.FlagCategory.Api, isInverted = true, isSafe = true } }, + { SERVER_API, new PfDefineFlag { Flag = SERVER_API, Label = "ENABLE SERVER API", Category = PfDefineFlag.FlagCategory.Api, isInverted = false, isSafe = true } }, + + { DEBUG_REQUEST_TIMING, new PfDefineFlag { Flag = DEBUG_REQUEST_TIMING, Label = "ENABLE REQUEST TIMES", Category = PfDefineFlag.FlagCategory.Feature, isInverted = false, isSafe = true } }, + { ENABLE_BETA_FETURES, new PfDefineFlag { Flag = ENABLE_BETA_FETURES, Label = "ENABLE UNSTABLE FEATURES", Category = PfDefineFlag.FlagCategory.Feature, isInverted = false, isSafe = true } }, + { ENABLE_PLAYFABPUBSUB_API, new PfDefineFlag { Flag = ENABLE_PLAYFABPUBSUB_API, Label = "ENABLE PubSub", Category = PfDefineFlag.FlagCategory.Feature, isInverted = false, isSafe = false } }, + }; + + public static string DEFAULT_SDK_LOCATION = "Assets/PlayFabSdk"; + public static string STUDIO_OVERRIDE = "_OVERRIDE_"; + + public static string MSG_SPIN_BLOCK = "{\"useSpinner\":true, \"blockUi\":true }"; + #endregion + + private static GUISkin _uiStyle; + public static GUISkin uiStyle + { + get + { + if (_uiStyle != null) + return _uiStyle; + _uiStyle = GetUiStyle(); + return _uiStyle; + } + } + + static PlayFabEditorHelper() + { + // scan for changes to the editor folder / structure. + if (uiStyle == null) + { + string[] rootFiles = new string[0]; + bool relocatedEdEx = false; + _uiStyle = null; + + try + { + if (!string.IsNullOrEmpty(PlayFabEditorPrefsSO.Instance.EdExPath)) + EDEX_ROOT = PlayFabEditorPrefsSO.Instance.EdExPath; + rootFiles = Directory.GetDirectories(EDEX_ROOT); + } + catch + { + + if (rootFiles.Length == 0) + { + // this probably means the editor folder was moved. + // see if we can locate the moved root and reload the assets + + var movedRootFiles = Directory.GetFiles(Application.dataPath, PLAYFAB_EDEX_MAINFILE, SearchOption.AllDirectories); + if (movedRootFiles.Length > 0) + { + relocatedEdEx = true; + EDEX_ROOT = movedRootFiles[0].Substring(0, movedRootFiles[0].LastIndexOf(PLAYFAB_EDEX_MAINFILE) - 1); + PlayFabEditorPrefsSO.Instance.EdExPath = EDEX_ROOT; + PlayFabEditorDataService.SaveEnvDetails(); + } + } + } + finally + { + if (relocatedEdEx && rootFiles.Length == 0) + { + Debug.Log("Found new EdEx root: " + EDEX_ROOT); + } + else if (rootFiles.Length == 0) + { + Debug.Log("Could not relocate the PlayFab Editor Extension"); + EDEX_ROOT = string.Empty; + } + } + } + } + + private static GUISkin GetUiStyle() + { + var searchRootAssetFolder = Application.dataPath; + var pfGuiPaths = Directory.GetFiles(searchRootAssetFolder, "PlayFabStyles.guiskin", SearchOption.AllDirectories); + foreach (var eachPath in pfGuiPaths) + { + var loadPath = eachPath.Substring(eachPath.LastIndexOf("Assets")); + return (GUISkin)AssetDatabase.LoadAssetAtPath(loadPath, typeof(GUISkin)); + } + return null; + } + + public static void SharedErrorCallback(EditorModels.PlayFabError error) + { + PlayFabEditor.RaiseStateUpdate(PlayFabEditor.EdExStates.OnError, error.GenerateErrorReport()); + } + + public static void SharedErrorCallback(string error) + { + PlayFabEditor.RaiseStateUpdate(PlayFabEditor.EdExStates.OnError, "SharedErrorCallback" + error); + } + + public static EditorModels.PlayFabError GeneratePlayFabError(string json, object customData = null) + { + JsonObject errorDict = null; + Dictionary> errorDetails = null; + try + { + //deserialize the error + errorDict = JsonWrapper.DeserializeObject(json, PlayFabEditorUtil.ApiSerializerStrategy); + + + if (errorDict.ContainsKey("errorDetails")) + { + var ed = JsonWrapper.DeserializeObject>>(errorDict["errorDetails"].ToString()); + errorDetails = ed; + } + } + catch (Exception e) + { + return new EditorModels.PlayFabError() + { + ErrorMessage = e.Message + }; + } + + //create new error object + return new EditorModels.PlayFabError + { + HttpCode = errorDict.ContainsKey("code") ? Convert.ToInt32(errorDict["code"]) : 400, + HttpStatus = errorDict.ContainsKey("status") + ? (string)errorDict["status"] + : "BadRequest", + Error = errorDict.ContainsKey("errorCode") + ? (EditorModels.PlayFabErrorCode)Convert.ToInt32(errorDict["errorCode"]) + : EditorModels.PlayFabErrorCode.ServiceUnavailable, + ErrorMessage = errorDict.ContainsKey("errorMessage") + ? (string)errorDict["errorMessage"] + : string.Empty, + ErrorDetails = errorDetails, + CustomData = customData ?? new object() + }; + } + + #region unused, but could be useful + + /// + /// Tool to create a color background texture + /// + /// + /// + /// + /// Texture2D + public static Texture2D MakeTex(int width, int height, Color col) + { + var pix = new Color[width * height]; + + for (var i = 0; i < pix.Length; i++) + pix[i] = col; + + var result = new Texture2D(width, height); + result.SetPixels(pix); + result.Apply(); + + return result; + } + + public static Vector3 GetColorVector(int colorValue) + { + return new Vector3((colorValue / 255f), (colorValue / 255f), (colorValue / 255f)); + } + #endregion + } + + public class PfDefineFlag + { + public enum FlagCategory + { + Api, + Feature, + Other, + } + + public string Flag; // Also doubles as the dictionary key + public string Label; + public FlagCategory Category; + public bool isInverted; + public bool isSafe; + } +} diff --git a/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorHelper.cs.meta b/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorHelper.cs.meta new file mode 100644 index 0000000..98bf0b4 --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorHelper.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: b7a0580bf951d2f46861fe4785bf74f6 +timeCreated: 1465794484 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorPrefsSO.cs b/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorPrefsSO.cs new file mode 100644 index 0000000..4ae22c6 --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorPrefsSO.cs @@ -0,0 +1,77 @@ +using PlayFab.PfEditor.EditorModels; +using System.Collections.Generic; +using UnityEditor; +using UnityEngine; +using System; +using System.IO; + +namespace PlayFab.PfEditor +{ +#if UNITY_5_3_OR_NEWER + [CreateAssetMenu(fileName = "PlayFabEditorPrefsSO", menuName = "PlayFab/Make Prefs SO", order = 1)] +#endif + public class PlayFabEditorPrefsSO : ScriptableObject + { + private static PlayFabEditorPrefsSO _instance; + public static PlayFabEditorPrefsSO Instance + { + get + { + if (_instance != null) + return _instance; + + var settingsList = Resources.LoadAll("PlayFabEditorPrefsSO"); + if (settingsList.Length == 1) + _instance = settingsList[0]; + if (_instance != null) + return _instance; + + _instance = CreateInstance(); + if (!Directory.Exists(Path.Combine(Application.dataPath, "PlayFabEditorExtensions/Editor/Resources"))) + Directory.CreateDirectory(Path.Combine(Application.dataPath, "PlayFabEditorExtensions/Editor/Resources")); + + // TODO: we know the location of this file will be under PlayFabEditorExtensions/Editor/ + // just need to pull that files path, and append /Resrouces/ and boom you have the below path. + // consider moving this above the if directory exists so we can do the same logic beforehand. + Directory.GetFiles(Application.dataPath, "PlayFabEditor.cs"); + + AssetDatabase.CreateAsset(_instance, "Assets/PlayFabEditorExtensions/Editor/Resources/PlayFabEditorPrefsSO.asset"); + AssetDatabase.SaveAssets(); + Debug.LogWarning("Created missing PlayFabEditorPrefsSO file"); + return _instance; + } + } + + public static void Save() + { + EditorUtility.SetDirty(_instance); + AssetDatabase.SaveAssets(); + } + + public string DevAccountEmail; + public string DevAccountToken; + + public List StudioList = null; // Null means not fetched, empty is a possible return result from GetStudios + public string SelectedStudio; + + public readonly Dictionary TitleDataCache = new Dictionary(); + public readonly Dictionary InternalTitleDataCache = new Dictionary(); + + public string SdkPath; + public string EdExPath; + public string LocalCloudScriptPath; + + private string _latestSdkVersion; + private string _latestEdExVersion; + private DateTime _lastSdkVersionCheck; + private DateTime _lastEdExVersionCheck; + public bool PanelIsShown; + public string EdSet_latestSdkVersion { get { return _latestSdkVersion; } set { _latestSdkVersion = value; _lastSdkVersionCheck = DateTime.UtcNow; } } + public string EdSet_latestEdExVersion { get { return _latestEdExVersion; } set { _latestEdExVersion = value; _lastEdExVersionCheck = DateTime.UtcNow; } } + public DateTime EdSet_lastSdkVersionCheck { get { return _lastSdkVersionCheck; } } + public DateTime EdSet_lastEdExVersionCheck { get { return _lastEdExVersionCheck; } } + + public int curMainMenuIdx; + public int curSubMenuIdx; + } +} diff --git a/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorPrefsSO.cs.meta b/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorPrefsSO.cs.meta new file mode 100644 index 0000000..63be678 --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorPrefsSO.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5d0199c11aa6f514784c5c69cd8378d8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorUtils.cs b/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorUtils.cs new file mode 100644 index 0000000..90e41d5 --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorUtils.cs @@ -0,0 +1,118 @@ +using PlayFab.PfEditor.Json; +using System; +using System.Globalization; + +namespace PlayFab.PfEditor +{ + internal static class PlayFabEditorUtil + { + 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", + + // 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 = 8; // The default format if you want to use local time (This doesn't have universal support in all PlayFab code) + private 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; + } + + public static MyJsonSerializerStrategy ApiSerializerStrategy = new MyJsonSerializerStrategy(); + public class MyJsonSerializerStrategy : PocoJsonSerializerStrategy + { + /// + /// Convert the json value into the destination field/property + /// + public override object DeserializeObject(object value, Type type) + { + string valueStr = value as string; + if (valueStr == null) // For all of our custom conversions, value is a string + return base.DeserializeObject(value, type); + + Type underType = Nullable.GetUnderlyingType(type); + if (underType != null) + return DeserializeObject(value, underType); +#if NETFX_CORE + else if (type.GetTypeInfo().IsEnum) +#else + else if (type.IsEnum) +#endif + return Enum.Parse(type, (string)value, true); + else if (type == typeof(DateTime)) + { + DateTime output; + bool result = DateTime.TryParseExact(valueStr, _defaultDateTimeFormats, CultureInfo.CurrentCulture, _dateTimeStyles, out output); + if (result) + return output; + } + else if (type == typeof(DateTimeOffset)) + { + DateTimeOffset output; + bool result = DateTimeOffset.TryParseExact(valueStr, _defaultDateTimeFormats, CultureInfo.CurrentCulture, _dateTimeStyles, out output); + if (result) + return output; + } + 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 NETFX_CORE + if (input.GetType().GetTypeInfo().IsEnum) +#else + if (input.GetType().IsEnum) +#endif + { + output = input.ToString(); + return true; + } + else if (input is DateTime) + { + output = ((DateTime)input).ToString(_defaultDateTimeFormats[DEFAULT_UTC_OUTPUT_INDEX], CultureInfo.CurrentCulture); + return true; + } + else if (input is DateTimeOffset) + { + output = ((DateTimeOffset)input).ToString(_defaultDateTimeFormats[DEFAULT_UTC_OUTPUT_INDEX], CultureInfo.CurrentCulture); + return true; + } + return base.TrySerializeKnownTypes(input, out output); + } + } + + } +} diff --git a/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorUtils.cs.meta b/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorUtils.cs.meta new file mode 100644 index 0000000..ee8468a --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorUtils.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: b422838f8121dc44ca79ceeea8582a50 +timeCreated: 1466715484 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorVersion.cs b/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorVersion.cs new file mode 100644 index 0000000..54f3b77 --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorVersion.cs @@ -0,0 +1 @@ +namespace PlayFab.PfEditor { public static partial class PlayFabEditorHelper { public static string EDEX_VERSION = "2.67.190520"; } } diff --git a/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorVersion.cs.meta b/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorVersion.cs.meta new file mode 100644 index 0000000..5d858a8 --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorVersion.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 24ef2cb033a5dfd4588226fe1447bf5a +timeCreated: 1465794484 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabGuiFieldHelper.cs b/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabGuiFieldHelper.cs new file mode 100644 index 0000000..ac7bb21 --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabGuiFieldHelper.cs @@ -0,0 +1,149 @@ +using System; +using System.Collections.Generic; +using UnityEditor; +using UnityEngine; + +namespace PlayFab.PfEditor +{ + public static class PlayFabGuiFieldHelper + { + private static int IndexOf(string[] elements, string element) + { + if (elements == null) + return -1; + for (var i = 0; i < elements.Length; i++) + if (elements[i].Equals(element)) + return i; + return -1; + } + + /// + /// Build a dropdown menu from a list of arbitrary elements. + /// + public static void SuperFancyDropdown(float labelWidth, string label, T activeElement, IList elements, Func getElementKey, Action OnChangeTo, GUIStyle style, params GUILayoutOption[] options) + { + if (elements == null || elements.Count == 0) + return; // Nothing to show + + string[] namesList = new string[elements.Count]; + for (var i = 0; i < elements.Count; i++) + namesList[i] = getElementKey(elements[i]); + + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleClear"))) + { + EditorGUILayout.LabelField(label, PlayFabEditorHelper.uiStyle.GetStyle("labelStyle"), GUILayout.Width(labelWidth)); + var prevIndex = IndexOf(namesList, getElementKey(activeElement)); + var newIndex = EditorGUILayout.Popup(prevIndex, namesList, PlayFabEditorHelper.uiStyle.GetStyle("TextField"), GUILayout.MinHeight(25)); + if (newIndex != prevIndex) + OnChangeTo(elements[newIndex]); + } + } + } + + /// + /// A disposable wrapper for enabled/disabled which sets it to one way or another and restores when finished + /// + public class UnityGuiToggler : IDisposable + { + private bool previous; + + public UnityGuiToggler(bool isEnabled = false) + { + previous = GUI.enabled; + GUI.enabled = isEnabled; + } + + public void Dispose() + { + GUI.enabled = previous; + } + } + + /// + /// A disposable wrapper for Verticals, to ensure they're paired properly, and to make the code visually block together within them + /// + public class UnityHorizontal : IDisposable + { + public UnityHorizontal(params GUILayoutOption[] options) + { + EditorGUILayout.BeginHorizontal(options); + } + + public UnityHorizontal(GUIStyle style, params GUILayoutOption[] options) + { + EditorGUILayout.BeginHorizontal(style, options); + } + + public void Dispose() + { + EditorGUILayout.EndHorizontal(); + } + } + + /// + /// A disposable wrapper for Horizontals, to ensure they're paired properly, and to make the code visually block together within them + /// + public class UnityVertical : IDisposable + { + public UnityVertical(params GUILayoutOption[] options) + { + EditorGUILayout.BeginVertical(options); + } + + public UnityVertical(GUIStyle style, params GUILayoutOption[] options) + { + EditorGUILayout.BeginVertical(style, options); + } + + public void Dispose() + { + EditorGUILayout.EndVertical(); + } + } + + //FixedWidthLabel class. Extends IDisposable, so that it can be used with the "using" keyword. + public class FixedWidthLabel : IDisposable + { + private readonly ZeroIndent indentReset; //helper class to reset and restore indentation + public float fieldWidth = 0; + + public FixedWidthLabel(GUIContent label, GUIStyle style) // constructor. + { + //state changes are applied here. + + this.fieldWidth = style.CalcSize(label).x + 9 * EditorGUI.indentLevel; + EditorGUILayout.BeginHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleClear")); // create a new horizontal group + EditorGUILayout.LabelField(label, style, GUILayout.Width(fieldWidth)); + // indentation from the left side. It's 9 pixels per indent level + + indentReset = new ZeroIndent(); //helper class to have no indentation after the label + } + + public FixedWidthLabel(string label) + : this(new GUIContent(label), PlayFabEditorHelper.uiStyle.GetStyle("labelStyle")) //alternative constructor, if we don't want to deal with GUIContents + { + } + + public void Dispose() //restore GUI state + { + indentReset.Dispose(); //restore indentation + EditorGUILayout.EndHorizontal(); //finish horizontal group + } + } + + class ZeroIndent : IDisposable //helper class to clear indentation + { + private readonly int originalIndent; //the original indentation value before we change the GUI state + + public ZeroIndent() + { + originalIndent = EditorGUI.indentLevel; //save original indentation + EditorGUI.indentLevel = 0; //clear indentation + } + + public void Dispose() + { + EditorGUI.indentLevel = originalIndent; //restore original indentation + } + } +} diff --git a/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabGuiFieldHelper.cs.meta b/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabGuiFieldHelper.cs.meta new file mode 100644 index 0000000..116dfd4 --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabGuiFieldHelper.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 286b8f4cdeaad154ea11e3bca31b955f +timeCreated: 1465870728 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabEditorExtensions/Editor/UI.meta b/Assets/PlayFabEditorExtensions/Editor/UI.meta new file mode 100644 index 0000000..c23149c --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/UI.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: a3ba3e0b8bdd64d44b530b3ba1d603e0 +folderAsset: yes +timeCreated: 1469033493 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabEditorExtensions/Editor/UI/Fonts.meta b/Assets/PlayFabEditorExtensions/Editor/UI/Fonts.meta new file mode 100644 index 0000000..fd36257 --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/UI/Fonts.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 93b8e49ffe6415343be5de01de7c23c1 +folderAsset: yes +timeCreated: 1465800950 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabEditorExtensions/Editor/UI/Fonts/Avalon Bold.ttf b/Assets/PlayFabEditorExtensions/Editor/UI/Fonts/Avalon Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..70cfe31d521228b780f5d889f2991f6d4d756653 GIT binary patch literal 63922 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

Al(wwodhEs< zk5P{nEV!r8qlv|mE+a8IjlJm>xljqT$%TEU6!Qf573USHGuQm!2iK&Cf4(F&K&*(d zkuSlW9Bf{)&;lwF%oD8CWHg#AX57{YrwQbMu65$p;Ex~nJ@+U3i>KX(+C!Rca@u{5 zIP>9K?R9iU>)eUX6Eby<|8mUE&%Acxl0&Nx969luEqnF>iq9p3Xc7KFDhOzhH6Yy! zXzXl!vcMu43}$XJGY)+V{$tFS-D)`puRNRcX3m@SjA8+4H;53%KG8K~QMuWeO5OAD zV|Naqk2@cGm~ZDhQzNn$@YcBD;|5_U z4m)Fg)(Kujf84 z@3|6K%mEgE!~KyRk#sUy;c%*oScVRI+D8V6K|1hofbjmdH1!N=S|akm21Y<a2jRgO8SqaCZ}%fOTk6U@I9IRyaU3 zsS=tvzybcrz%NPiXx?}@XJxp7M|k6*dKdFgQjY5R_*Jj8hOdx&@GHb~^w=Ml z`{Z2ReKFjzj_8NEcl29L(r?#YxgEzDZ4nav;A`3DQqvHNciq17d9C~IxN~3o+}Qm+ix%}xTCju^ zoSy26dk$Xwm5SQlEz74)TC}9McRA?+&ESTIFbm|toC4ni;+<+Fs5(5ViH8&`v>@gu zFg1O^k;NNzzDw#W;M9aK`5y>M5CXY)b-y%O=jDNH|6X%{eA?)}ciy~v>;mQ9?!}8H z^(L_ z53wyX>k*LTeSvYwU%0X4>XrMy_Tc_iC!;r(FX~>fWWw~P`qn;p(f<3_FP*Yv@+2`r z)cYEY5XFHfB}?E;lhuM;)tIB&xlgemO2YDmI*cSGV<6*0)T2hk8io%~0V(>J#4N8x zQ?@HnTC;EJ#@%<_xqH<7!dttRF6-{6!b${sUi$6#pUh*3$0DYgY9DKrME& z9HSFpA<{3Pvm$<`+VfQpq8^-8aK)9YxPpq`!|eg?8lq8>)&%|{OgG&M3A%*)rA8wX%)sK53v_`OyG%ks&NdA zp-9aMFWO!?-mAiDHbKhb5DRMyDzl*{lf0d2%!Z4}8QkLbj&WMUoe=^JpEC zwnFO=8f^dukfx@2n)}DhdcD8CwH;c}+l>RMAMo&k-l_9bzZ3j`F{Z^5%?z115+^@u zRwfS2F`-)9ESfGs-sm_t!d*JW0z$a>w|`%%#irnplvKe$;OC1cIWs1^NDXkxf{=osgIyk z%PGY2X`b}a`e(cY&Hc2Bbr|IfL7zozO|s4c#ljK@hP|q>s8C^GC=Oz~PGYvf+<=l7 zv>AC(FxTZAW(p6{d^N6zchW~RN2QD`Y4wG10U;57D?Q#$~I`DHmlF8XwCr> zC*vl|eiWvfU^beqOf*VUs~a@Bu*f3Q{qgSlZEO2$TgSCXRZXRZhp$TgJ9n>`I(Jp- ze|5gM2@ssib{-~8(}EPeeWC5#b>OQH@7wpahxd(Nx^#T!(xp<%gZuV8^x#E%AKJIF zyL%-yu|@_aO8d|=Nd(AsiMvQ3*aJDLF<%o1K7A03+|7a+n~H2zo!e?gG_e+K5DG|j z(pIV-#2qFu_l@7R_x9T_N=&b~Wx|rB6UHxDa$0(K+_Y1NF8)ek>`&6}<&!2ZUp{f7 zfUgkn5%<&KgUv+nnE;=|r&!_9;Q0ywLoSm8+F&r_W%wfaNbewnDobV!VRj$v>mR>n z-vj-6X_&xF3d?g@()VQohKJpO?LdmpG!%U1OCEL++Gr9-S5-XLbKJsBdIz#$Zn zc%cyv5;5Q~%^I|{qCu36(bC<J+sqB!QJB^^?)k@SS5v@3Ja z=Jg%3#Ui1SlB*|foHl*kB~~R+m>-SL>E1be!N#x0qJ??+p}NUqC$8+9q=x*yfXyD7 z)G=cVW(?j!ypb+!hYp4u7!r@lc+FKmoV{TaAb5n& zqIULGzAi<{D;bRJh~pKTByO<5CWf+M$uf)i7n;SjB1vvA29`FBgDnY&B4{!%K6K;i zl{Y^4y}Nepg15zS|NW^?Qtx~lN&YZ@vF=A<9L%gdnSR@`I^k^~)9IVI-!L1PVk@#F@^jPC29i12dcpb> zFHoTHfHomTt~ekU2mGJ>hVS`=oA>axJ$q6w?g6}UcA8LEF1cG8<|_23NXv4pZ&Dfg{Vw~!U7qzq|D zMqVJHEdA7dOg0#1>YB~*R#K)|vbnh%KagjVn28~2cy$Mu|*0mIsJVJL8eMh83v zb_{strL!l2o>*(zx*m!l8~`np`C5atGqSQ zR3_$1G^3|-_(&fb47`%EO1XSP1F#SEPZi3V2*Pq1$}Dm#(olXZpv*;{*|cPt4y6X3 zNSupUEg{7pRa|z{NZ^Es0a)a*CeteeR%|F(9^p|Ji7`X+f`@{swzVlrTU(XeA8@+^ z$VAe^#{3uJJihDn=im!`iCHcjFpBtWf*nbA)Ya9N#&`%>?52Ef%6FRb^VG&NHL9u! z7H~RL=*;;6w`$E-OqEK+tC(V@2)x9OsAMhRkwIHYbLVLmB-j8H954c4MP~-{eRb^` ztU=IDV+0=gtRyVmk`e|A@K z4G`Dft$bsLqsBa@s%lJaSz*ZU4LRJQwFSSvY%pqEzh*bIND;@C2Ow14Y;Cemi{v`o ziqqwC!YPvu>5|ou71VW^`iAHzBDpucEkU1Fh~u<-4SEEf>~2YltiCH)&T_@vw9`@n<4uoY^d1Nc3;c26$Y5QV2~sxyQPIMp*4r*irXBZE|$ zQbVv{PIbV5H3R>NT#S`XdOBse%uH4m6@=wHHD3#NNm{%sQh*%w za0pz#FcOmU4cY#%EH}JJW6+#U!qFf7f>>BwU)m#LVyXY412 z@T%k!FA|{vZ$5G?ysB?V&>)x#kOO|j=gkZHWuM_Z;R70aG5oYHAhTW-(1$SIBf|+I za~ZH_g%zd=el#?+Ams{hDVp}Nv`+38KD;Pfk*pD(#z<5tEGjCDIApaLE=NAX=U627 zWeswMgmt&07~>2D6MYB@DgH+e$XebKl+NXZyoZSU+>Xcxh}P41^yql>B~^h(Gy=jX zEIJ<+h5rzX^eX)4aggE2Jtq#Yl6UvqIPg+(`lhjvJ{4HRux1;g5!lC(92SWcM`fCh zQhho~)WV@&;G)7IL0_?Gv;4r?lo0XYKd{lvlhS`QBk`6*5SrsT5la2}`c2nf+jPE( zdGzwjlSyq2!;}4yJ~O3kN3vDNNmj9e2WY8$y% zpT0O?QE1^?I+?~2Y$^VaP%PJ1`Z;m@l-ACD1?ktE#X3?AQCAEdnkl}_yI>4VOR_yBKKtl5wtx` zgu5O_ASxfC_h9iBeQ`jc1sc#71QjBX8p8t%LR@4p=*hyMFpON;f=J;PU{LTc$3RGn z^M^%pAv1p@I{W>RP? zPpBBAcw!1lzIY1CbpdgH9A;@!VmKO_c+lm;a>xgbmP**hWQ&MHl@Km!!8vHDFrpNM zAtOqP5t%BEM&zL=k!&DaLbKwA5*P^wEn_bB5AaG$h4UlU4B0ROD@_ZO20nyoY{Ckm zjFZNsAMPBpVl=^{BC-t;2o^CbU2&pJ3vDkhBs0dGwhlv;_Q;^`=Kh;?z5WY8V-NSA~s(V%lN*le12Ph@9+hJtMx>jExzy+5uIN^^he?}KWCv{@(#$PWJ@ z`Yi$#(0I{qzBopV(lHT1!bT@q5}7tg;xQV;_Mu_jXDj(+r)X-j$kj}vtIub1|HryW zmp1EjB_d`ekl;RKH|X)VAU3m@G&?FZQXkgBAK=XybslqCKmz$ZGM99CK0Fw58pdz6ooB;47qPbU3e&tk5)g z5j9^Qzx?4kcshDS0|+7&b6)fXqo?cJBS1`jsxO+6U}o#to3Mh;XDcH;lX63c*~&uz z&R#|Yxu$sjLt8nmL63m?&$QIe0dbb*yb0@$Ag*LHl4T`DrTImrd1_dv$_h1Hsusav zM}UWm&!H&~LP@adDl#av>I=qrq+UD%@P8Y*z(%5xr4MVlFfpt!FZPPfOO_!30=JJZ zSMdh|{t@AkfS}}bY$PoNAen@fUz^$MuUVZW5rXHAlL&)3D^~JjT~rKT4d={z?jb#CTY_W7r~_bV6N=T z%~Q`Yn0}(+^kAkXQD!VPX@uxS+U5?1LzA+{me zq{HhA5x@f6ydbz4V)1^6itHd6TtD(q*!A_N6GB>r5nea4+yxRKhVXeXNUJQ_D7>pn zyW#L_vJX4e5M}r~q6}gOy@(sCB8I3(54G$K5ko|3p~;w+8E7H%^(e#e9rOfWfC7j3 z*OX}D3+}$V|DJoKcTev=`%|fL_i6Yh8~8UkWeU>TNA@~wq<|{JI>JU_E0fE(X^4RY zfi6;Lk^7-!ZwfJMX(=M5mM>k<-oAiZTT@xQv9YYQS(>VySkNBFo}9AAMv7OIvvNKl z{RBB{PL~s2L!W{?eMC-`0?IqES#vmxW=gvZVoEHLG#kOjBT&-fqF{(tOeA}U z3YlDHKL6m%mCI)zygL7?;%!C9%eQzgUO4waVEy{4Lp2?>we1yMQ$2tS zFDZcx>sq!s*-~5(2H7L4-Wm=eqh5^^SY&fytfW{naFrnnT^p$^QVa-0BT%HMZmAaP zSb7bJy!P5Q+80-gur7_A2yF=8Awi!utm`mQh+k0ldO0SF>WF0Rv)K%3wNbzwFS#lJcTN;lVOx)$v`+ z7Ir17iw<_w#LF8MN4_VLw_z91WEBIeBoA;^*(kO=Srd1$YV3?lBpP$o(FnCy<*Pmv zehDhM36oM@pyV_wjyk2JO7fNSk|BgaE?q4jg0O^gpH`%G>t%Ea2qs4E=YU^}whwM} z*Y^hM#y07Q``_mCV3DCfl8h%!Yu0Wi@SO>}FrR5J^vi_n`_F3kplJdmtHFkS>qNaR4|J|W0_RMb>AE>-}&EX}} zzg1GxQrXt9yH%}fyqFmVJ^@C514ee>RLH7ecQ#vX2&sJ580CTLtbLl$>gyP%~Vs0pLPg zCVl5or{6#FSWE5pi4wqqyzN zonJn4=F4}Unfmy}2Ood@;Ke8)C}*&wY{oj|Ggg4%X(_Nl)!P(vDCD^w&!!o@i(`5cTQPy=-}dM7df^$ zT8isBlC_=P!*Jut-h~I2EZ)DYJ6bWJv2h~*bR>Ebo5&Z+cZ(I^XSXDKAz#VHwmU>Z zII=fP$Tm>55?HjS(=B4ZFq5$WO@1GW)<7QnoyhILb_7q3$n`Mus!TfPU_e;kB0{uF z1S`0za5Q5$w8=f4|MB-O&ZL68cjfo1#pdk*rF>#p(FU@Z2fHI^R|$zl`RmnJTfH6x-ZARf;0guVjU`2n5REqp zZ35zo=86KXuFdZaw0yyYtPLI@AV6;@=wr_Wll zH=O~UuE?bEF_=kYe5BX-@V^+qIDAb!&B+Fxw8)_0NO*wwwQ?{sEF0;av4`F`wO~fu z^47NTzrB0*toEwZhqda46R8{7n{uw& zv?BExKk2@9!!qz{+SEKsng!10W-F5kvk8&_}+N)r=AppdTx ztHSPfWtX>sz{pA@fgwnlFWO=Swf`eEH>HNZzx5mS)|! z>-O7srJml!_`sWhYbvNEmmN!v^ZRn#M1~L(c8A06$)Vy+ZWq*?e4iI^p{yMgvbf7@ zF*v+# zQe?pSD2o$mCKeSHQz-LDrV<%WFd9_xbI|xoJje%koDEU&q0oy&ID*HI6d>#=qH5yqu#3SZ$_oOj z(cxC@*y|tmDwaG26Al8vFxsWUaN!VjF)RFn)koe6FgeX+(tH-W$pL^gMJYIB=ZK6v zEk0{}c}Lr9te6H6v^E^a9ANR*b=)t8mlrLOBHZdSxc z^I1XyQ*<9YN#TepgXtg2SM%J6jKk^=hp?Fy?v||ih7JSG7ER+69aKe%98%|#pak3L zaSIlV>sY)fSzK3LT2fQsTlt4Y0 z?1*wyf(k%fsLix_M2V?}#<=RmR?~+1ss<%ep}1=lliLz8)#nAx1{3%SiW{M1lLNJ{ z+}Tc2eKmnnNj=EKK8WLq|GLGmse#SNlG3Uhl%oRdp4J2R-M6oKdda@d)fe7nP0jJl8r^gD?_G-*Pv~5<_%&V^ zxoFqDQ`SssYpaajd*HwW(bATduDkXWmN$;!GgeHTv~2mro)w!ni&6QOv{~8)FKL*? z*wJK%&29?vq8wI~W3dOk5$+4g{(y*~_|;OcT8eT;CQh3s0*XDNaBB$_Hj=H*J|8%# ztc}VbClyK|u~IGlC(T8NrU7ZLQ=xm5%9Mhr6C+#wG zH_mHVf!yr2QMC{Ie4R^q;S=F-=Th68*?TW~Ffet@q=kp}K2$L4^8w?^33a!mKC`Wy z&T<)m7B!d8(@v6>wiE&rMq=A_gI5TO(6UwU)jV%_WW*k^Ck% z5@c!CGFxTZr6zEIraunWRpGs5zX-zB=+#7eLNVA@ae{xgBejpemU{Cs@cq9GY(h=X7HHXv zlPVA8g>6o=*Qewl3(u}1pGVDes%EbT@Tz|7K4f;J#IQWsT&@-UNGB%Kdci75Q-<#B z6U0!2UD~Mr7(>lL+Ar2ZQ{Uo?wIrHaniCB{GlVPOyu`b-J%8ht0Ainh=jb|5+fv_( zoW?sG9>1kpktXd-oxE~~WZY$FU(V<442`}`zObHb)l#;ZALYMBrm+(qgRqm79Bd@U zu3sZ5GB(-VXJ(OBR9dEOGjXg*eq;>&R~#-?JG&kw>S0F zT4HOIUMq5ubq5utOs?+#LH`er9TqR@SLAS_zPOgdIU!ku`b&_b4hMGnKv7I*a5_wV zT3#gSjKXoMRmK6=NYjNzi=rY+R;DI6#L)D|%gGIy$$8vM-bWn@WXus11zOeCfH&yy zqA*bg2)pVEtFEBxwOU+$J%u!_!D_jgn%xJGG9*d@UTkd4f@nm9XDECZjC4U~ptTH( z?I1_)KH*8Lq$V zkhUlXY?rb(Pzt?Oxa+b^2~FZs>Qnj!JWH`CD|wc54MJZKHEsflY`H4`F?Czzg%eM` z{_9gW&E{*!&N%zERmU!0yY|@enKgB<-+S+WESp6Z2mj!@%^R*dv1QwpMAyi#Gvq;+ zC}Ili?{&#KGD<5s%f}|!{IZB@sEw+wYE=#8S5zy(m}0kA216mG((mFZiaVIqEdupI z#T~9TK;zXDMKsE%O1Qe#kkQt1gIa)5*B6?z5z`cgy;nu9T72E~=_f9}|ABoI*VWgr znQ-uKV`{c%#;925*)!PCG_iBhl2>_6boY*XW-hzng0CFh_dsK7TjI_G(UQcNLf)`^ z!laeUdwP~{-AZ0o88uA*`p?!dmHA(^8m6<^`|^$d?5}3ao%Ab-b@NyFt-=csVhfTW z5tlRMbjXZ$Z;(nZK^sS`lPVraer)r`j!_qEi~NjQo^A39f0Wql09HnH0vZXEoP>?7Qa<2y) z7ZfK#1W?c=Y=jeg8kq;l)oG(VW9A6=1I#aI6@%~vbpxHYIAXT~@mFoP<5=E}^0KWb z@fHn9s}7$)m05eeSNt`F3aC&4>*246-IY#MD+pr1sO%7je8FJBi6~_aQ`&(@ooB|z zHEe98pA8#^kin7FivzvnJJ5q(GZ!__(Gga87P7jZ5~4%kNnv~{#zQU$9W9Bf=4LPg zCI*;1uzR<{?%gW*xE*yuh0>12W8EFXlz@;F@Jgj0-Z-O)qXqp&1 zEl~z#9MbX~9Z)4=DmQTvZ&;RkiKIBzR{=XI1*NM5r@bjTu_!;+Bv}nniy_Jk(VQ}W zUYXxr<~KPiJ&sDVqcS&Ez+(l$SbY`8edk4evr=teH6-wR%aV}Ab2#DyVk0CXP0j+m{Hx< z)!kk_wJMO4lUp@aZO12ddR4B=mHTST%GE*rXT~^i{Q)X1f<5e@2 zs`_}mUXdp?Hcg(?)YMC>99k@URA`gsNf+s_P$M~1S7@&30^`tE(hScGFCz3s(o`SK zQciInXr=5|>HCmAD(YFD_de)G*E~t()YVOri`cls>8TBF*porFE7?Y#AZ+Cf`iJcC zcRJveg&sgV{qdXwIY$ZRVrN%wfVemm1j<56J6CirE({zZOLEhar#4*=0P9%uXn=z9 z1c}1)lT{HwWJQ5eM`bDlTtPO`V08dW1g847WEG_0mjVCsWF35L#K*~pmE(pF%ag;f zCmqjTAPbC~LMRi2!ScZ&1c=kY&1|_d5?+mL{80F*&>Y!S+0deJcxqDyQd$F9kkX8& zBfCCCHd-Ba00loR0L*cdcg^boJcts31HkhQpDdz{02O800JO_)wE0kg*qWDB>Uxkl z!twnk`2sZ$n>M@{Q$KuxBJ3N06HWNIg@3Jy&p(A%KfOusp4`1`cj^E?ia#d_${vI> zf5smJMGWqOhv<%E*_Zl)C-&dd&sEw@g@uV4>_35>@-L~uPC_yo)@rb$8ZFH)?$2)( z_YbC}b&#CZD))KGgYClJ4QwuxQ2$Akq%eAiRKwNHpmR#=JS+<0h-nd>eXK!pvVUTG zv0f7%@EpFheWF$z-b_`a4QHSwWA7il67+0|4m`VPRkEJ+96VoQjM{Ch!2>1=3~EJA zQfX}iiqL=FnG$U-KGH{^*EQ^t~gjXhN7 ziBiSSbN+nSYfqw(dxt%EA~k;aiGT9Z6dOl8nc`dzt4P~-j|%(FgZ#!ABpmb5CPD19 zg|N}gOzd?h={&-=%h+{#E|-wTqE1GZS*N8r4z=aJuji3u3^-Y&k4P*DQvQYfD5%)W zmL_WJ=FBqGHBV;0U2dWH88^}B=p0l7828HJyd&n|tM5swLXW)9&GVtm8tB)$u zXYU--fE?UBwk-{y2${(7basojvvMHYDz~G=1U%bW!-cW>|7MlfN)UuYYS+%Es8xED zKG$~kbcr#dJzyj&b|zc3F(T&gP@%x-g;Oz9*}LpKIf9YFgW&bJWHDT6X)ZQ1XCmQP zqMDYO8N9S&Ev8qiFafoXm>S*@dlm}U;MiS75iu>+q$@M}&Ok8!Av*)z;2LX2FWMQ1aUBHk5#j03X7*Ms%gTT;4PoaZt%#A?$)nn+}mdOqsm% zLDQ5$j9RdU!4zVTNFfH#B#js<$T<>->6twcD_ZujaP1AtAMQGy`rkCMo{eNEbpTJ^ zL*coH1V(mb;8hOh50eKAek(i^3QjB(2SfKFhjv$zsAFkHk($JywEzDQ)|s=F?$A zaySR;P>`B4ERiHzzZ|i%@f@2Pbq@yoOT?o_X1|h$DJ%Q+T)rjEuk?S*ejV;iO8s1) z@{um2(}Gn|x>g16kq&^5ikdQ%&NwvN&gc|*gpmvvfbu1n0H#?OG3lBz6kYb|dV@Kn$AlVqm$)#*M&+hjZ;>%66y@%Q$E_1JXq55ZowUf?LBpC`xtbn9tBi+ zl<^FtvWxSk}K7j-(PC8A<0kWcK7-BY7 z{1n&%JPlW>)#al~Y^fZWIZJRM;DH)o0d9Wopk2 zLl#F#$B*7aA=)?IYr53_`RO+&HvP!{Vomnr3o(2mQ3;EwgQJ+{EA4N6@XN7pO3z%^ zcXT?MSOo)(BGJ|ZttS^MzZcI@f|$s`bCfU|&eF`&F*J9(PymQlh=TD@j8+sO(gN*x z?wW|k-_;#2D9E*WT+x!oWVpoV%QKj!x|*v=u^+nT=;>%sdWZ^5MnOJVbSTzb0(E-K zvEJ*Oo36bU+f9iX3 z(xo*96gxNQMT*FGOAo(9K4JjA9;mommoGnl^yoX>KKUl_@PIC>(j&uwZbtf>RklJS%6;?4LQ4mv!`a@KGPMAMHq8 zfi)#+P(u@mBX1aSuBtLXhC0*|3Q?Kb_~+_U`?LxAqVm)g+T?vvm1;Rj6ANsp!r1-b$fbx3As$c}A5vuu`)5m(Dz#iI zHC9IJ6M>RrGf_pDF0QX)YB4KzAU#`!K@Dh*~72v2Wf7)Y;LDv)f zkk*?i0GFX9z!6OQNj-_|hntWwys*1F`w=JCU(cI&^Op2;PM+LNP*Qb~O?pgsZL)?3 zm=6w9qsf5eX>Ty-^{XsT^>UvY#51*3M_6$eD^>}5#9-Q#&_Z=Bxot4f@P@|#UByw0rVNN^%JgKEw)G;Of^Gg(JT4PIv77pa1W(cm zwN_6&t?!FHp*q1kheS@GO6yURI}*Qb8WJ_pEBuIP6EcG-+SG>1sKQ@_I=M(`wb`r& z73q>lPNCEv^bI8=-KQY4wEjfQHxo}npP5)vJ(TyXSW;G1A$t0Q1A6fU)HHS?uQY~- z3K`^Fk77poCp#WK3>zD;;K5-Tb4$<~`C77~@|ZHRB4`7w$Yw(Y?*LNcX+H{{0&%?N zrpqtAJ@XidBb)ag*mMJmi#6jh5TLDQQAv~PpNGhkCppw`K((RT0t%2RW)VWgCIrO= zApzwlyOO3b9w=r-pa_x@6>q};1-YzHQuSQ2KrA~>-rPTK)85-|y=c?8eqK0X$&v|O zOHgF0+%BA($niCr$` zh|JyX$r|Xah>bFX-A+$1Fe_HZEfy4zwwBqECu1}*#bmSKiD(i6Rr+J72Ln~Q8w2=> zInOK?{qbU1pD_szY-NJVB-RN%g_U1??X2sropmk#UpI?yy>8ZZ>HolOC9hx~WB!e# zLs30@cvN5}fx%EziA9ET7xG35HHv&F^vF$cG(2+iw$azZirzFMH34_b7qa@X^ zlyCLmNvWv)4F9mB1Tg@6ftqVVT_mP>WW`;i_#6zC^zzfmf4Z_kb_OXM1RD(ktRc

**Qn<1lJWC9yB067v=^4ul=J_YRh5%l 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ë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 literal 0 HcmV?d00001 diff --git a/Assets/PlayFabEditorExtensions/Editor/UI/Fonts/Avalon Bold.ttf.meta b/Assets/PlayFabEditorExtensions/Editor/UI/Fonts/Avalon Bold.ttf.meta new file mode 100644 index 0000000..b92f5ae --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/UI/Fonts/Avalon Bold.ttf.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 96e17474f840a01459f0cc936c5d4d9b +timeCreated: 1465800940 +licenseType: Pro +TrueTypeFontImporter: + serializedVersion: 3 + fontSize: 16 + forceTextureCase: -2 + characterSpacing: 1 + characterPadding: 0 + includeFontData: 1 + fontNames: [] + fallbackFontReferences: [] + customCharacters: + fontRenderingMode: 0 + ascentCalculationMode: 1 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabEditorExtensions/Editor/UI/Fonts/Avalon.ttf b/Assets/PlayFabEditorExtensions/Editor/UI/Fonts/Avalon.ttf new file mode 100644 index 0000000000000000000000000000000000000000..a5e767b9e85b4169cf3a242d2f786172b912743d GIT binary patch literal 51288 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 literal 0 HcmV?d00001 diff --git a/Assets/PlayFabEditorExtensions/Editor/UI/Fonts/Avalon.ttf.meta b/Assets/PlayFabEditorExtensions/Editor/UI/Fonts/Avalon.ttf.meta new file mode 100644 index 0000000..1316245 --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/UI/Fonts/Avalon.ttf.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 436664d726292a54fa79d2168f4541ac +timeCreated: 1465800973 +licenseType: Pro +TrueTypeFontImporter: + serializedVersion: 3 + fontSize: 16 + forceTextureCase: -2 + characterSpacing: 1 + characterPadding: 0 + includeFontData: 1 + fontNames: [] + fallbackFontReferences: [] + customCharacters: + fontRenderingMode: 0 + ascentCalculationMode: 1 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabEditorExtensions/Editor/UI/Images.meta b/Assets/PlayFabEditorExtensions/Editor/UI/Images.meta new file mode 100644 index 0000000..8af8ba0 --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/UI/Images.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: bcd1f2f077e925c418ed3eac3526988c +folderAsset: yes +timeCreated: 1465796980 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabEditorExtensions/Editor/UI/Images/Black.png b/Assets/PlayFabEditorExtensions/Editor/UI/Images/Black.png new file mode 100644 index 0000000000000000000000000000000000000000..2c14419c259eebc1c68924523b2fd6c487c8af40 GIT binary patch literal 136 zcmeAS@N?(olHy`uVBq!ia0vp^EFjFm1|(O0oL2{=*pj^6U4S$Y{B+)352QE?JR*x3 z7`TN&n2}-D90{Nxdx@v7EBga>4lxt!{e2B*fI_04E{-7_*OOBc5`LU-V3{FtfgzER Y!BK>fz55cI4Nw7tr>mdKI;Vst01KlYm;e9( literal 0 HcmV?d00001 diff --git a/Assets/PlayFabEditorExtensions/Editor/UI/Images/Black.png.meta b/Assets/PlayFabEditorExtensions/Editor/UI/Images/Black.png.meta new file mode 100644 index 0000000..7b3929b --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/UI/Images/Black.png.meta @@ -0,0 +1,57 @@ +fileFormatVersion: 2 +guid: 66d3ceb5fa86d498891e23dd5303a8f7 +timeCreated: 1468018889 +licenseType: Pro +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: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 32 + textureSettings: + filterMode: 0 + aniso: 0 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + 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: 0.001 + alphaIsTransparency: 0 + textureType: 0 + buildTargetSettings: [] + spriteSheet: + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabEditorExtensions/Editor/UI/Images/Clear.png b/Assets/PlayFabEditorExtensions/Editor/UI/Images/Clear.png new file mode 100644 index 0000000000000000000000000000000000000000..7dfa3aa6c9462ef89fbf159e6470e45a99517a7e GIT binary patch literal 127 zcmeAS@N?(olHy`uVBq!ia0vp^EFjFm1|(O0oL2{=*pj^6U4S$Y{B+)352QE?JR*x3 z7`TN&n2}-D90{Nxdx@v7EBga>4lz>!E=`ZKKp`Ga7sn8e>&XcVWPm&u21d36;fsJQ N22WQ%mvv4FO#qi$80P>0 literal 0 HcmV?d00001 diff --git a/Assets/PlayFabEditorExtensions/Editor/UI/Images/Clear.png.meta b/Assets/PlayFabEditorExtensions/Editor/UI/Images/Clear.png.meta new file mode 100644 index 0000000..778b4df --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/UI/Images/Clear.png.meta @@ -0,0 +1,57 @@ +fileFormatVersion: 2 +guid: d03222342209e43daaf2ca8d1364e47a +timeCreated: 1468018889 +licenseType: Pro +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: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 32 + textureSettings: + filterMode: 0 + aniso: 0 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + 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: 0.001 + alphaIsTransparency: 1 + textureType: 0 + buildTargetSettings: [] + spriteSheet: + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabEditorExtensions/Editor/UI/Images/Gray_base.png b/Assets/PlayFabEditorExtensions/Editor/UI/Images/Gray_base.png new file mode 100644 index 0000000000000000000000000000000000000000..b32e7a45a234f8393c9775b757de504f7cfddc06 GIT binary patch literal 136 zcmeAS@N?(olHy`uVBq!ia0vp^EFjFm1|(O0oL2{=*pj^6U4S$Y{B+)352QE?JR*x3 z7`TN&n2}-D90{Nxdx@v7EBga>4lz>;`#BHHfkL95E{-7_*ORYYy7cRO1IrAF3k->j Z42csMTaTrhZ38M`@O1TaS?83{1OPI7AlCo@ literal 0 HcmV?d00001 diff --git a/Assets/PlayFabEditorExtensions/Editor/UI/Images/Gray_base.png.meta b/Assets/PlayFabEditorExtensions/Editor/UI/Images/Gray_base.png.meta new file mode 100644 index 0000000..6e6058f --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/UI/Images/Gray_base.png.meta @@ -0,0 +1,57 @@ +fileFormatVersion: 2 +guid: 9427eaf0703a74a008e9f9353562df39 +timeCreated: 1468018889 +licenseType: Pro +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: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 32 + textureSettings: + filterMode: 0 + aniso: 0 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + 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: 0.001 + alphaIsTransparency: 0 + textureType: 0 + buildTargetSettings: [] + spriteSheet: + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabEditorExtensions/Editor/UI/Images/Gray_dk1.png b/Assets/PlayFabEditorExtensions/Editor/UI/Images/Gray_dk1.png new file mode 100644 index 0000000000000000000000000000000000000000..3f54b0df2fbf36219fd11c97ee08a3862880e8f4 GIT binary patch literal 136 zcmeAS@N?(olHy`uVBq!ia0vp^EFjFm1|(O0oL2{=*pj^6U4S$Y{B+)352QE?JR*x3 z7`TN&n2}-D90{Nxdx@v7EBga>4ly(B3H+b5fI_04E{-7_*ORAApZ@=R1IrAF3k->j Z43T_{Da-etoeWgK;OXk;vd$@?2>=YIALjr7 literal 0 HcmV?d00001 diff --git a/Assets/PlayFabEditorExtensions/Editor/UI/Images/Gray_dk1.png.meta b/Assets/PlayFabEditorExtensions/Editor/UI/Images/Gray_dk1.png.meta new file mode 100644 index 0000000..53e9a3b --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/UI/Images/Gray_dk1.png.meta @@ -0,0 +1,57 @@ +fileFormatVersion: 2 +guid: 1c8aa345bd7fe44b88cf00b2f6b82579 +timeCreated: 1468018889 +licenseType: Pro +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: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 32 + textureSettings: + filterMode: 0 + aniso: 0 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + 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: 0.001 + alphaIsTransparency: 0 + textureType: 0 + buildTargetSettings: [] + spriteSheet: + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabEditorExtensions/Editor/UI/Images/Gray_lt1.png b/Assets/PlayFabEditorExtensions/Editor/UI/Images/Gray_lt1.png new file mode 100644 index 0000000000000000000000000000000000000000..eff3d42d5769e65dbcaff472804ea55199dc54a9 GIT binary patch literal 137 zcmeAS@N?(olHy`uVBq!ia0vp^EFjFm1|(O0oL2{=*pj^6U4S$Y{B+)352QE?JR*x3 z7`TN&n2}-D90{Nxdx@v7EBga>4ly&n+uUloKp`&Z5SkB-!{sT?@cz{bJN Zz;OErbNmqj-W;F`22WQ%mvv4FO#u5o9%ujn literal 0 HcmV?d00001 diff --git a/Assets/PlayFabEditorExtensions/Editor/UI/Images/Gray_lt1.png.meta b/Assets/PlayFabEditorExtensions/Editor/UI/Images/Gray_lt1.png.meta new file mode 100644 index 0000000..7c83a6d --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/UI/Images/Gray_lt1.png.meta @@ -0,0 +1,57 @@ +fileFormatVersion: 2 +guid: 2e064f0948b52496983fa0597fa61a0a +timeCreated: 1468018889 +licenseType: Pro +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: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 32 + textureSettings: + filterMode: 0 + aniso: 0 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + 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: 0.001 + alphaIsTransparency: 0 + textureType: 0 + buildTargetSettings: [] + spriteSheet: + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabEditorExtensions/Editor/UI/Images/Gray_lt2.png b/Assets/PlayFabEditorExtensions/Editor/UI/Images/Gray_lt2.png new file mode 100644 index 0000000000000000000000000000000000000000..7c99ec6ab3ffb19001cdc9dcefe9cbc9ba84d4d3 GIT binary patch literal 137 zcmeAS@N?(olHy`uVBq!ia0vp^EFjFm1|(O0oL2{=*pj^6U4S$Y{B+)352QE?JR*x3 z7`TN&n2}-D90{Nxdx@v7EBga>4ly(7ZPyO90fodoT^vI=t|$Nb^73*$o63PB4Qw3T a3=Dr9nD6Q@UKIjV!QkoY=d#Wzp$PzWnjyyk literal 0 HcmV?d00001 diff --git a/Assets/PlayFabEditorExtensions/Editor/UI/Images/Gray_lt2.png.meta b/Assets/PlayFabEditorExtensions/Editor/UI/Images/Gray_lt2.png.meta new file mode 100644 index 0000000..c3e378e --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/UI/Images/Gray_lt2.png.meta @@ -0,0 +1,57 @@ +fileFormatVersion: 2 +guid: 14a4e823a9ef94dc18a71decc8453380 +timeCreated: 1468018889 +licenseType: Pro +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: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 32 + textureSettings: + filterMode: 0 + aniso: 0 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + 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: 0.001 + alphaIsTransparency: 0 + textureType: 0 + buildTargetSettings: [] + spriteSheet: + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabEditorExtensions/Editor/UI/Images/Orange.png b/Assets/PlayFabEditorExtensions/Editor/UI/Images/Orange.png new file mode 100644 index 0000000000000000000000000000000000000000..a7ea8c5b8a620fed39730ec25dfa628b5ea71e2e GIT binary patch literal 136 zcmeAS@N?(olHy`uVBq!ia0vp^EFjFm1|(O0oL2{=*pj^6U4S$Y{B+)352QE?JR*x3 z7`TN&n2}-D90{Nxdx@v7EBga>4lz@ySAP~>1`3IKx;Tb#Tu=TpfAxp?jGP9B3m6YE YF|6Qbnp`Zz4YG^D)78&qol`;+06Y30y8r+H literal 0 HcmV?d00001 diff --git a/Assets/PlayFabEditorExtensions/Editor/UI/Images/Orange.png.meta b/Assets/PlayFabEditorExtensions/Editor/UI/Images/Orange.png.meta new file mode 100644 index 0000000..211ad89 --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/UI/Images/Orange.png.meta @@ -0,0 +1,57 @@ +fileFormatVersion: 2 +guid: 83fd25cf40b81429ca784df9d37d32ba +timeCreated: 1468018889 +licenseType: Pro +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: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 32 + textureSettings: + filterMode: 0 + aniso: 0 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + 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: 0.001 + alphaIsTransparency: 0 + textureType: 0 + buildTargetSettings: [] + spriteSheet: + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabEditorExtensions/Editor/UI/Images/Square.png b/Assets/PlayFabEditorExtensions/Editor/UI/Images/Square.png new file mode 100644 index 0000000000000000000000000000000000000000..8eb1b1ecc13b6e1d2375151866134cd7a040340c GIT binary patch literal 78 zcmeAS@N?(olHy`uVBq!ia0vp^EFjFm1|(O0oL2{=L_J*`LpWrU|M0W$cr!i aF)*;jval%k4lxtM_~^__Kp`&buq|NmdlrgGp&0~-f7 Z(7;$0mig(aYk?{lJYD@<);T3K0RTMiAK(B0 literal 0 HcmV?d00001 diff --git a/Assets/PlayFabEditorExtensions/Editor/UI/Images/White.png.meta b/Assets/PlayFabEditorExtensions/Editor/UI/Images/White.png.meta new file mode 100644 index 0000000..f10c123 --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/UI/Images/White.png.meta @@ -0,0 +1,57 @@ +fileFormatVersion: 2 +guid: 5f32aedbadeff4790a54248a66f0b89d +timeCreated: 1468018889 +licenseType: Pro +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: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 32 + textureSettings: + filterMode: 0 + aniso: 0 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + 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: 0.001 + alphaIsTransparency: 0 + textureType: 0 + buildTargetSettings: [] + spriteSheet: + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabEditorExtensions/Editor/UI/Images/checkmark.png b/Assets/PlayFabEditorExtensions/Editor/UI/Images/checkmark.png new file mode 100644 index 0000000000000000000000000000000000000000..de1c72b6fb124cdb2519c08f31599bf5ee57e262 GIT binary patch literal 2763 zcmbVOX;f3!7QP7q87v?&J8%h7nUfGQ5CZ`c0uh3dK~S*}$VFnv&?Jz65F3Bdq2ARJZ&gT; z%LzcnKC%}iKY*5b65J*V!0OUJel5VbF zMj^p>5GgMJ`DaoIOcqELiXjl^gZ55EYEG{@S6pg|7hxnn11gtNOh@s-qbi$Ix-*NrvG;A=< z-!BADr(rOm=wKo(ghnUgXudcdAB$b$G6WJSTaXGZ#pUYazUN~9kxQbAA+}T~jui?s zmO6lyE|dx-=|T}mjlqHOTmeTYljslU&%M$hF*gh1(8WSN_^!Gn?%zbm(}`GuE>|2q z1gqb5Fg}DDLdAt*upxd}ItGt?&*l6-6+`KgLFrrLe_CZ}N!Ne+>0gbnbN;$IkU)1| z#JY>|S+#Q~02s|PXu+}ap~)Tm!kRGalX)wlt(thnj)A*w&PS{^y1%JR&v0{XbKJ3o z$Hh5*^~o>0jueJBT77;|deO0oeuj6pvEA`ytye^X_ehIZ#OsCjLTKxy3C;vx&^9|Z zU)7AAA+N4}{O#bw@G8-f(meX9m5ZXfP^F!8$fMp{1}W7u14q<&>^VvtDBDw}k$1bq%v z%+s>!z|D%Y5pYY;>mhPOqWHp>p}P6%#C6Bd5uw-*VaAq5U-So_Yg*-T2tZ7gxp0yk zt;!l109+eC7s1)&FxL^i4uEmo6g-_7cT;%kJ$J>J-g8&f>pc%es^0TZxad94g(01p zOs$3bl1dSvGB0;DXgc1x3t^n>)Vv{f4q~7e)8*AwBx8cQ%ZwxY-P#fWn(=0A z)sQ8)rcY(p%r*^=n3j#LR?p5kfkC7a%Ch@59}O(R;0^U!hdt#?*`kFWIlOLn=*uk* z1;Bpy1-zQk^7CW6Af?u3(Oi9&v*&fr3cbFHs)DtMecw$J{tKuVJh z?NXguRx(V|x*fyzJmypYVK>fe?~D(tzYN0r~zu!Vj&!;UZwuhzLDtngKT zVE(8q|LB&vmq;N#7*LSTTg!*9@0$I|(@nAaiTxr%o$~{we>rh6W&doF%Wj8~VMlqT zu<@1?$Gip=%8ZDcvx_a7F~Anz8N{5=I?Hin&0U-FRwq_cZmr%x38M}+*R$p>e)G9z zojk+pYT=AzYWno0SmN7ft{w|a??2iSEw47rNFr?yfOXo%vSQBlxH3f92k-|X#X(s> zaj}&R1vNDlGPv!L#Q=GOY6JOq=Z*%C1&e-LW-iNCIU@L{S*>@87c<)8L~HMouTxc2mX z{4$qOQd^^lcDQWu^>SF7VdnP@wx5JvC@5=u+WrJFc;+UG13zc{qCpKGIaNBNWsa$; z^X?-OSpP=5k#h?s^Vq5h-o3ciR|SBqC^JE2Q1zz$-eA$Z?Qd@#l9Em~UB6e)WUnE# zuP1Z*_Jmc93V;1>Si=D5Co|GbT!QOM5qGWk3|HqlA&m1s#dY^kirf`zGyN~V=oH~! zV4Rqq+4gone{^1*WPZxIQ)BS(Cufu7WmKLfZ)MQ)@^Lfm0MYc`WO0zP?vti)*5x#c zH9UiNs>Nvdo{{JL%7N~qKF1OLR2y>(!bs0RKTksl$w)lZUCvz7Ea>{IlGUC@@q?p@ z)Tf++5YCsetxiaoed#uPc;D57wPu}%pqoAZiq7T3=7tt;uvU)So+|fA23YKr22p$C z&1JBx3u_bhHov7aQz~}F4H^&K^%8bZY$DsAuKYUlFzIxm;kTDZOm@0PeVRFFl3V8$ zd(IS5IySft|FD;F>IAAP>cN|9JWb;Yuq-U%bSQ_ zSc^YuZ4Oe3H$^UYA5RGLTYvxBw1+ygD{s6bje>`x@3>uY=d9Jl$2EvTfhPCyUuFX@ zcli5la&9(zzDkID`;AplQ-y3OyYPPXe3i-7Cvn~7E8U{cHuPC4SL`yq^4004qZ<){ zLW_x8BSp$Tkj?5nbyoSWUW`q|65Yqwm9krbAO9Lj!cos#BS@YmSh?WV%8bak9cYZU@7R1;=0KU8A#GYYVRP_;XJOvTm}RbQ zZ%^jr7K0mdBL`>54^@n;W8M0B$yE} XwOg*3#dr7Ue=ixKQMB_R$@%{Qf~;TM literal 0 HcmV?d00001 diff --git a/Assets/PlayFabEditorExtensions/Editor/UI/Images/checkmark.png.meta b/Assets/PlayFabEditorExtensions/Editor/UI/Images/checkmark.png.meta new file mode 100644 index 0000000..b32639a --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/UI/Images/checkmark.png.meta @@ -0,0 +1,96 @@ +fileFormatVersion: 2 +guid: 1f806a850e4ff264eafc4935f65793b8 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + 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 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: 1 + wrapV: 1 + wrapW: 1 + 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: 1 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabEditorExtensions/Editor/UI/Images/checkmark_off.png b/Assets/PlayFabEditorExtensions/Editor/UI/Images/checkmark_off.png new file mode 100644 index 0000000000000000000000000000000000000000..55b2bf9f60965001f362ff4bea5fbb4775de7cf4 GIT binary patch literal 51228 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 literal 0 HcmV?d00001 diff --git a/Assets/PlayFabEditorExtensions/Editor/UI/Images/checkmark_off.png.meta b/Assets/PlayFabEditorExtensions/Editor/UI/Images/checkmark_off.png.meta new file mode 100644 index 0000000..a045f64 --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/UI/Images/checkmark_off.png.meta @@ -0,0 +1,96 @@ +fileFormatVersion: 2 +guid: d20c53c8cad21024091aeed0b9bf2a0e +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + 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 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: 1 + wrapV: 1 + wrapW: 1 + 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: 1 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabEditorExtensions/Editor/UI/Images/checkmark_on.png b/Assets/PlayFabEditorExtensions/Editor/UI/Images/checkmark_on.png new file mode 100644 index 0000000000000000000000000000000000000000..a53beb629d205ca3103c6687a94ab9e743e1d7f9 GIT binary patch literal 55178 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

dAtBDXWW`;5YjNL9-5#wzOvJ3A%;5e^nE~hCW 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 >Djgq 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 bfn$6w$HaSdvSGm59|TgARe^qxHuU^AhTZ+a literal 0 HcmV?d00001 diff --git a/Assets/PlayFabEditorExtensions/Editor/UI/Images/checkmark_on.png.meta b/Assets/PlayFabEditorExtensions/Editor/UI/Images/checkmark_on.png.meta new file mode 100644 index 0000000..d2bb2ce --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/UI/Images/checkmark_on.png.meta @@ -0,0 +1,96 @@ +fileFormatVersion: 2 +guid: a2f13c216f2649d49b892cade7f4e5f0 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + 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 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: 1 + wrapV: 1 + wrapW: 1 + 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: 1 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabEditorExtensions/Editor/UI/Images/dashboardIcon.png b/Assets/PlayFabEditorExtensions/Editor/UI/Images/dashboardIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..6cbb6c2a1c2e0a748b309b8b9ea7f2af0817f0bc GIT binary patch literal 49180 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 literal 0 HcmV?d00001 diff --git a/Assets/PlayFabEditorExtensions/Editor/UI/Images/dashboardIcon.png.meta b/Assets/PlayFabEditorExtensions/Editor/UI/Images/dashboardIcon.png.meta new file mode 100644 index 0000000..42d6cc6 --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/UI/Images/dashboardIcon.png.meta @@ -0,0 +1,96 @@ +fileFormatVersion: 2 +guid: 4f1db872b2efa324c806fcbb54e19e1c +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + 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 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: 1 + wrapV: 1 + wrapW: 1 + 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: 1 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabEditorExtensions/Editor/UI/Images/dashboardIconHover.png b/Assets/PlayFabEditorExtensions/Editor/UI/Images/dashboardIconHover.png new file mode 100644 index 0000000000000000000000000000000000000000..070261ff39f4cb2542460509ab2ce783f0f45eb5 GIT binary patch literal 49499 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 b^)g}n-`SSIG4+*8J9zAOJ7IFHj)ngRKSCF- literal 0 HcmV?d00001 diff --git a/Assets/PlayFabEditorExtensions/Editor/UI/Images/dashboardIconHover.png.meta b/Assets/PlayFabEditorExtensions/Editor/UI/Images/dashboardIconHover.png.meta new file mode 100644 index 0000000..64d51d5 --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/UI/Images/dashboardIconHover.png.meta @@ -0,0 +1,96 @@ +fileFormatVersion: 2 +guid: b43817ee9dda16c41a628a705526a021 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + 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 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: 1 + wrapV: 1 + wrapW: 1 + 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: 1 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabEditorExtensions/Editor/UI/Images/dn_colored.png b/Assets/PlayFabEditorExtensions/Editor/UI/Images/dn_colored.png new file mode 100644 index 0000000000000000000000000000000000000000..0722053691a64f96c24746b5438e57a3694beae4 GIT binary patch literal 514 zcmV+d0{#7oP)P000>X1^@s6#OZ}&00006VoOIv00000 z008+zyMF)x010qNS#tmY3ljhU3ljkVnw%H_000McNliru;0PH22MZr!t+@aI03B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*00Cx6L_t(Y$L-a@Y7ok73|uVIQxLl(MRwh-1G%X1H~pq=uWv%C@BNF6E_w@+f6|zMnt=jMAF2~ zv52H3V^VO@4+iF*`u|Y6YH2PD;EP?mWV+EkFkYkxJknznqUpD zv5ij+^zkksPnR^wS!VWOwM6{H2@Y_*1i*D>on*FEC=p-L#xX_<07jY7&P=zE)CFFm zw*aJ<85e&RZy_b(23@@ReU>%V&)#lknKp?M@jcJ;7{eNXVfGwkhC3k%I>$avYd}u1 zpS@;6Qr!ey%>lSdZ}%?4R7i>VfkPb4IJRMW4zov{NtB37wD1w*DVA~WwbH9LB=r`1 z`25$sHp$vvdi*n_M2yhEo4oKQ`3$nwNsmP)Q6j!z2Osi?#`(UJdo$IT^AmlKT|CM4 zZr0|$_vccxsvhBaE?<<0Z};+tYgW}pv#K^8{`L2&Uvf%)yQ%_gE&u=k07*qoM6N<$ Eg7IL~EdT%j literal 0 HcmV?d00001 diff --git a/Assets/PlayFabEditorExtensions/Editor/UI/Images/dn_colored.png.meta b/Assets/PlayFabEditorExtensions/Editor/UI/Images/dn_colored.png.meta new file mode 100644 index 0000000..9dc795e --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/UI/Images/dn_colored.png.meta @@ -0,0 +1,59 @@ +fileFormatVersion: 2 +guid: d396473974f984567a8e398f1ebd9ec9 +timeCreated: 1472083701 +licenseType: Pro +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: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 32 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + 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 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: -1 + buildTargetSettings: [] + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabEditorExtensions/Editor/UI/Images/dn_gray.png b/Assets/PlayFabEditorExtensions/Editor/UI/Images/dn_gray.png new file mode 100644 index 0000000000000000000000000000000000000000..a89ecdc1a133b8070b736b896a8d02a02e9fbf08 GIT binary patch literal 506 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 G2>(CT)4wPH literal 0 HcmV?d00001 diff --git a/Assets/PlayFabEditorExtensions/Editor/UI/Images/pfFullLogo_O.png.meta b/Assets/PlayFabEditorExtensions/Editor/UI/Images/pfFullLogo_O.png.meta new file mode 100644 index 0000000..598213b --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/UI/Images/pfFullLogo_O.png.meta @@ -0,0 +1,57 @@ +fileFormatVersion: 2 +guid: 597788bebb59e4cec8318947e1a3da3e +timeCreated: 1468254721 +licenseType: Pro +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: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 512 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + 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 + alphaIsTransparency: 1 + textureType: -1 + buildTargetSettings: [] + spriteSheet: + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabEditorExtensions/Editor/UI/Images/pfFullLogo_W.png b/Assets/PlayFabEditorExtensions/Editor/UI/Images/pfFullLogo_W.png new file mode 100644 index 0000000000000000000000000000000000000000..e72685fbe8abdd90a58f45df2c50e4b666a313c2 GIT binary patch literal 10717 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 Q!{7j@vX)ZC3+s3P2UbKZWdHyG literal 0 HcmV?d00001 diff --git a/Assets/PlayFabEditorExtensions/Editor/UI/Images/pfFullLogo_W.png.meta b/Assets/PlayFabEditorExtensions/Editor/UI/Images/pfFullLogo_W.png.meta new file mode 100644 index 0000000..beca62d --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/UI/Images/pfFullLogo_W.png.meta @@ -0,0 +1,57 @@ +fileFormatVersion: 2 +guid: b108cf8dccf424419ad69d9354b1d234 +timeCreated: 1468254716 +licenseType: Pro +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: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 512 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + 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 + alphaIsTransparency: 1 + textureType: -1 + buildTargetSettings: [] + spriteSheet: + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabEditorExtensions/Editor/UI/Images/playfablogo.png b/Assets/PlayFabEditorExtensions/Editor/UI/Images/playfablogo.png new file mode 100644 index 0000000000000000000000000000000000000000..1e8fa8de5fdb19b6f56c2e854bd5dff4f1e4f774 GIT binary patch literal 75821 zcmdShbC6`++9>$yvTb(Rw!3U~b=kJ<>auOywr#7+HnMEy^n1>^bMKvhZp3^sU&QQ) z+_`coo|PG~W99zkli`Z;5(u!kupl5H2vU-wKS4l1)&G`%Lqq;O5|;V} z{rB*OHV*sy8pd8y!wCcg?r$3$>bHe0-;ckQn9gGA&LWN`2F@0Cw%>nQ*qDGYaWFEo zFfw!C;+JClGuuBslAvUgNf zbI-ceg0V(d!OmF-&Stq+6zT_qXcvWmUD*8%sigFcJ+EMdbYebWR|yFfT?{2C>>Cnz zIf(5n316e_NLaNuvsheA*7uH8UwPfxnBzf052JuMw(&f_(b}; z{{7m=Vi}&<%W;@%0#pEVl_Y#>=$q}jhAHyT+&|_VImRm^w)M4_2eEC%_RD$iO~%zm z@VBQo$|(XJ_?yOVE`m4xK_4gP3-|RJR8x83<1-2q zn)x;hT=124QuiS46(5fTT zMBKn3Utl5T3lM%+wjJuv3MkON{V5x+>hG#Lc%j^9Mjl%)Uu3og5u(6t8~g1xd?z2D zx#lz+ZSVLbn>UbY^P}zU^A;D1D&yT%WwN=k-;a-3cOT z4|>h^b&u%k%irm(L-qKc(K~S-(0<9hXn4JOjP&=ry~^kG_kJ(^T>azZ{E`2C2ZdaB z4&p2QU5V0%96_o(_at<*=ozkesz@dH@g(^Cbw?(sg82n2o%NVf7lfe;i!AgGq1K8Wue~ zgfIjsM#b6mnbWrI#$pl=MPBnI`V6_X=o?&L;>TjJ8fR)Mx%k_U*Y9 z2&?M`b`2sj&5`SK%7AJBG-YDlG4aD2>h%o_dQwj#G!Q;fI|L4#z9gnnJh0x*s?+27 zs;itmiSqE}^KfSSdxhnf^5O|llL=@E1Bl0-ip<<; z`E0Kh+V4Sj@@asexl4Jiy6dhV0`V33vWcf&L01KYI&m+A)T{3!67cd_ zTzF|jrP^&4tRuJeE&Mun!Vk;T+ZRAIH}LpC$`OWz@rwW!WH3Tp zfe@DcxF_3Pv^3YHH(Iq5?__!7g?|w}V~1SQDtYjXy>TCTrP|diz7D4REsrw&ImBp0 zJLk<>mxr6ti$-M4wqEYk*~EIKo%qRglW;hiJaT&|i2I^&_LvC4&E^EuO42pTm2o1{ zmuF|Ijc?1$z>~>Zo7u7Nfs<8wYi&t%G#9{Jg#$o-;AcQd($P+wFi6*~a4Sv=f))BB zi1W_Ab{2KR+;l8h^hb#PacR4{lTCsl`m1c)%_r+k*B ziOi%n8k5bB)#sEy`td)9%}-c2>mU^rI|S0OXotF58rrWd?=*^rx0r3 z7^BUPnQ4n+pB6Y8QKvuTbU1HMUc!!-6IcO_$xVJ$59+=;h||IQjXH)#`R1lGH=FL^ z3+yN{2ulFz?Ji0mw!{_<42!E1c;^tFVR@NSI8&(pRVz!|QfImAl*{>n`@qA+ys%@E z`A+2*;pyrkqM2@uK_ilkcK+Ek#yC59a$nslXTk(CL(zNcK91s9tIcCiq_6Fel}#Tq zLD}h28ASW8BRfPuy&JWe+^FH#{3ld<&;$e}If$MCUEDEvJ7s1d=vZ!s2h+6JLMJ z;C~|obvR{G8>KY4WaZXs1f z0#DKq1+~^pBoZ`gJ%uhyLsgR&6!3kiyR{AjmR2hK{QDK=kE-D7?YDDV2z=mXXO9PW zj`n6-|K#oMa5N_Th*$XV%QYnyXNTQ+${+T?`@I~$LdaT++w-#Poz)6ld_uWTJh^Mg zgU@ik#reS7LqGt*9IyV$&26tf8@}$&gE(Mz`|4pa`YxMAneQliL0S7K(J|k>e}0^K zqi4FsPk#ex?McR@20$g!@*LOzJ@UDTqwV|*UfVs1YeScnw<6fl#vHiKZ1ovHf1}}< z=)-5u;vae{hj^=ICmEURQ13RtSSQ%Gb3jeVd%9QKkBvpyM3L=&0FgHcot;q zD7#WPJkQW{2d-HR`KgSMu_*XwkL6Pt3=6D9$qX(V6Ot|fc9m~ZpH)?WCU>o+y+QGK zlB8(MFG%<@ok`pK$P(vr-n+5>%Uq_Quv*Q}&^cv^2&Iq**Lf7%#wp4bM<5kGobdfU zJ^wMq=#gNQW~2_9z}yX#aD&X--j7-!CVfCcZqMk{BIsD=i8&j20fsmcnFWTJH7&}Q zxLlsXdN{Klq4WVeah%$=EO5^#W-rNNMKG<$$Mk*jVQS7KLKVJf`AG4cwH7idM?`V| zsrmPK$gs4&z>)qHbFkOwmkw1gOPltQ+fnshFjz;j;>5G{XW?BvvTXFT=5(3tdxqsi zXSL>>4SjN)r~n9=PpjkXpX>>B+!%Rv-1ROF*I|MVR?1WS*f_1Ku{_1d5Seb`HI=|B z>K}e)pAVoh(%+0V!Q(j4oF`9^%Y)+8mXw6(CtToQn17?yQSSyxH$&z%bYQqFl@K^j zJAmo2fF?xuIhEV(I%o7j+BQ6oI16f*fGk=YrJ6VjmoUR~3uQjpZ-P$%e}-Ri>tas<<|XgU zw`~U}gJ*w?$0vT(V`kg=BfP*#8ZC5YCa zZjF3zqK#t+X>mr3z};br%7s!f+v=cmHw7jO9>ncZ1&q(M?K~2~fC3SBIE|e-?x?6t zD;Tn&bmjUW-oyF~oWMXGf!9VU9hY=?@e|!y3&oi!z`MV`Dcml_b$U+B9Q(a&A>Jia zi~2O_m+0i2iTPSkik$h{QgS$mfyptP4$es0tpNf)k@#{%<%cRNsRQ&dLw*>ACa9Q; z2D+SZ{4ZJ9!Xwle&u=j)6N4Z+gixoBWbONF+V|G1NV4k*Ac;8Hk4cUbo;=D@N3A^F zZ3(KXjX6h_;n_Hl=W7$MNKn{-LE^ZBLrD=Mg?7)Ude&aCFPYFvR4*DgPYZMdumKg# zL3DgkcN9Hk;;EV{{3XTJZ2#x9Tgb zcsv%~l8P|6$$3iuI?)Q>|Edt?!&BDtS-#xApQRFuMP_7{sWcnGkMGTp?efMKg%ea!wRiE8(6_xLMQb`7j@wnXt zcEiF; zrT{VrN!j!(^w04oEk#36{w-#Q1vutz8u*14;xcs+JeO!J$uqt+Ep%(LhMMi-KKPC4 zggy)S3X5~_fFd4^^GN*?O%SU-t)@CY-4^i<6o0mk^Qz*jbtWGXS_-y2-SCYVs7M&L zQ2i+Q<*!sNlVPJET7)_ke{>QJh;p1+azz)!ic+}SX6{&&`97U}1C~GJ>I5;BB7L5S z-!2^V`6V7!3{3EAig>s#BUA@K7R{%87H+xV9poGKc+#l`zHe3c*-g>*GX|ZKJiy)8 zaMzipjZeiMX(|6gD}y&rJ?uIbj6am*D{rW4pZe;tO^?ZBF`#h3LuFFV_}mYtca3MCO`~H6(-1)15&V95Wj0!Y{-Hy5ip16&pl^ zK6$H^q3qgcG@^fIu)HDcp?eJM`(_OjaJR@}=_sOG%KFQXWM#bCfoR?rC*gZ?kwP9p zwWO%1$-Ty3cI(Hb9w#h#+>OkiknGfkAjGNuDz(`C9y#SV7H44DHrb+Eza!Yd&a~9e zN+;)7h1vLLU5<8$4*&Rh^*b=;QxMQGPHJ)m-$CC_QKBVSr#RSGB{1|06!x9^M$gsy z+a%hPthollf_zBvckIQI+J;&Jrc1=pdTJ0|ql=(Dyy6F8)UX#l(|12D394?~nRb2TAXno)3%5 zh1aSe^%0%z)*zBK1s(80cN2-aib>XJv}7VZ_)c)|g?GBUGS~qER08NG{r2>OijA@Z zbMi)~%l>mI=lM%z`Ac?al@v<@YzF7r2o4sz37)mnopvsB!oh`PQuUpNV?5Q06x2jI zOXth%cQ%-n=^8m~vECTO7Kq@H?(-2sw8nb8aJG7b6I4U?s2#osair9zN(hT}4E7)l zQSkHW>5erbmz4)PSTQSM`Bm6LS3n0@1e}r_QaAMuzK-Q1F#?@T60y^iAnrR|KuHj{ z6ERN?k|972$QU>;7TBQ9UtQ9o5RDS--6IO97RSK6M=Cyt*?{tX_ivF<+&ACa3v>x( zV+%sZc!<*;^vwQb-`C*lD3Umpb_sN`ma0i-wP5*mQ&e0iqpMF+D@>vDdt3#D|2V7t zyBT~15|^T%I2a$>B#}KbLh(*sSGBSUp&Ul)h-4<01xR{@q%g{#0n-lBa0sFWY#pdl z31;~zB)%W4C$WY@MPRbcNyoRmNIK;g0Dsr9@T@;;Fl_3>q_! z@te*y`o`3l0dHcz^NH1u9|=NA?hTfm83M1w*p7P!HHcgm;qT!0?kYkb55xHaX`4$# zjw(^ZF(eGj?}9O>xuh|T5z;CMUXpBj2mIC69u`%c^(#F=RQu|*1k8hu$^*E&3$F0a zzb_r@=~vlb@}!j)u@yVQuB9yfkCbz+pXJK0c6364aqv9+E=AYP=`iIJ=JpJeLCb z0}9f?mFcGvo(MeravA`4&pf4bA^IL{msSlshzWYng$&|M{V))3AerftWq*W>kA&P9 zZMis&n=WxcuMJ(-aAb1ud_^J68w4^0`&M3->F*w@?HFahYhE`n((^AS&f+l8J zzmX^;QgtJ_BMg>;qc@(zUQs|gRkdivl$6;--!>BD;Me2y_t%ndM8hoo{+nV2VM`JY zS^Dw^{IKVAZb(?8{vbHWobb@0{Q{P^`kSL7BS!0Pl95j8;DJS05(xXXJ|MAj=06>0 zHLh|@Pa&*gv5rWOwef0EsdE)ju)MmC!9oNSUZZa%)4H+oyNvsC0rSJL zt8e|#+x;wgYE@+~dU318!JRMfYWh1?tECKn1l4=w13CasVXPw2=d?&$q#cUgdc+TT zk{)I#=1Qe;{^=pJxR)qZZ-k-eq)59dkh@h85%eQ9p)dtfrSTZ{thzrRt#&f zeu0QLax&k`za*kVV(Ok1{1D9sp8<|qmB;^{_b1BH{(9?2^wj@t7^HIpqS-(NTuBm18P3&6}N zuv_yklmxRVzfr}vrme#{z2rZIz0XQNaat9P6pq#btYGw^eE1(HB|lk|drQdt!Qdk} z=a;cyY(A%AJfoZ8)bCJiWz4JNeGEz`biyh8S>WYW{R(EU7b^h2*1Nw} z=OlF4%Iirz;fvYi;)w`w+HzMbxBJcAS4%z+)Zd`hGXmdq3{C~8LCMk-R41X$<}up%#}@DCU!YcmwGwas4A#?|GKK@M=mR$4BAWqj(NE+P4ZG!vu4TO#!JDR z!j$y5SHr`t!mSIm-_0#lnto3Ej%tSlbN4fZGon&yL~Yz$^%O>q!4!@__mJj9+L)LQ zqgCh&KmqkrWkylY$WA)<5xAD^XY@>{zoVW9;WYj}M$P+9a54T+(()|pOQh7vu+~yE zlT&}7U`|NeyLbS8a7D(2Mcwg@H?}?wu#%F!GBBe$IYZCe3fOFLl5_paX}k~8;mwMa z88tH2$Y*43%IZd(S=O4dMNKB=ZOYK7>+iCEE#w8C$(I8V;8_uw zSvxiR+U{uU^90axSMyJJS~E41YtO}ZS6{5of5-k49KFbj$?3bYhZ~T)qq@uLpMX*d zGd1Tkb^li3{8NR~@lQmVEDt4W+gpAiwzSup|3qhE&Mor1rj$nuqZ_%6C<#x{yLc~m zP8DAr*{&oySDj7lq+xeXL-EdOmc~uHS8VbITwJ<8j+V&|xFwwgKw6cO@Ack9?RRuP z)IZcrwe|kJj(g<`ToySO*IWg=h-FEoEU|aCq&gD0AOLXd6}GZlxbX^Y6xv(JJ#?GI zdn5ND7!19%=0WS_^Ttr=6D~jNL^o&-mQlChWqx6;HaCl|^v^073aISjX@s9>1r+A{ zBGkBRISHNHH=SCw;%_-RPtNuMoskvei1Mi9h@yW8 zJx>wNq1U#h-h@;ef264Xy%AM-GIjnD<=K$vF1^rgm*`|iMrxRTJe8iJE(`XEwZHr?G`f1hv|HJ4cJd|z76YCB>`#iac%&_dP+)-|1-=k`C3^v%55apZVey8 zlE*vPBdsc)YEWD3$qvYEtSlS*ph+bin-fmo3bEF$<1mhQ50vyXe(?$ObXr!s0dK0v zY9`bvqn!2ZxC?lNxj}gBWf}R_`_8J1U>{;tD=u;zA99LUN*s$_l6(8&c-Eu8GG+Md zXzGNkVP$2&#&v|3kE3BHs5IgI^8mOfafb#JT@y~i`Im!^y%%$b`dj1BWEXu$Q_4rfs!H*>Q@ zIjKkP826LI`Kn}~V+`g-pEK9V*a@Iqpdg6fTl|jN*ljEZbo_qX(R4QFm3_TVbx-G@ zagl0l#wXxItVPmW_YTLz%!YCXHkUa%QoWLFwD>g3tX&~_DS&78m-n*rnZ^+`W^*I9 z*zFWDhLYPbyb9*~KI`4Q-r-1duJqNoJoLiyuY$Z%!Q{Rh#2JN91xT*9V6S#a6ZR5AF=va}C_XW)3_O=!iJt*L6B#v+ zR9v-QP=Zc~ax9rfb+jB>C_vRLc4}{5)iX^K@fk)%yqdYSHsgoe!&rhsZjuGn#jFzM zo7eJ4ZrtoWaIKYPAX%zf{akB)o|md$W?Vb0!@3f9wyGLph;u#QV6bienq$fgPSCVw z{p8HCjwMiw!K8#Ka90!ZVQCrbhL|NI|8Yvrr?$9erL=$Su22Qgy*3)wru5M z7w#5Wq)`R4F~JDi^?LmY+mttHR`+}JlIoz;NHA#4hII*a4h`?K8OPE;mM|;E7gznO zRXO=a;cMw}bmnBisWNK)qQYt_QD5^8$zyn(Tvg96>{y_rbvd;oGz)ecd?_Q|PU!Jj zW2fMrajb_VKt*v!-cHBzVX@9}ag+-EkA+J;mMcr4p8DQ%ZLps}iVE3nl+G>Kj8+~$ zuhOTUGN!B+=`o}hsh?0!MD8boDY(Gi=6huXD~~T#TSydIHSURB&6ZXPyP@_8I4ymi zI28cc$#s4?6k`1_QECN(!fb%vmR9)Cvti3U z{Pi>6;6}|n*1eC(J$(N$CTrdiE5a~$U?$I^;?%(B(|Zn-i;ptFFQ1aO>poPD80@XbUh)iaZMeth%^Tha}+U zfw!DAbJ|2}H_JNHgO{)Y+W2!H7X`|PEKJ%h`H)Wir8jnTTi)AK=U#k5NshG$>vH@} zZSF$YZUcE6raqYeN~T|94z{H#4{nEn+J%VKk0RF7gAaB~?pN@_rdjgY@Yalv?h5?K zbo}+Ry2ov>6~T1M*TAw|4DYY9OQ&|qQI;?ZG&GJ`P~I_TxFnk4Qi3UE@`FVVRbrg9 z$bjC54bh&q9iLw4>0=g8io>juRb2CDo$>Grkn7s431l0FO8TZChVh6lk=MSKcUmHx z2#fR&|70I5SQBE3Dg-QVgeskzx`dyv3^k%!jj}wls03AE=lUk-AIG4)+Rj9tP}0z$sLh@(9S0^rV<$k zW1jZEpOy+=+5R>Qx^tQrKGR3~`I?F8Y&+|`MmW~Q>0vi_IWl%Zi~uB1NJ9?PySX-Z z^YmHVz|-A)dC_AETiIKoN_cilbMr#$9Va*ZA&9oaJ-Nktl{;g*q|bDz(`V@CA36RP zl4gA67;T&MnXV3q5121`i-x)B0?s_H-$HCZ{M!XY4~SMtKfQhKEr((pmUiP9OB3~0 zAAhwt4&@knF7>vZy*MqZeG58!)n~_oeVUb6;S4;W<{Q|yhmV{`&NXg|L`G7`J0o3% zz`~JxwF?Qt1jK|irS*wiUtR6hZV50@09fE$jfv#B{39#+cf|dA+v@eX^K(m^u=`)3 z0!h_BY(PibtlJd?OYPfxSnvib`YBKN?_>o~bX7N4FeZkQ-* zDQ~Q}`t?E=joQZclFIU8(IG8gp&07vc)5sn>rX~kzs|53M`wbDJ^Zj31-Q(x6ax~C z?%zT_+uQ2Fv|pO$%=2O4TJZaBWqqnZu%b{EC}?!73T}&M{@%NNR(RTNJG(;8Wc7rI zbaF?gU%klQWA@@->ge8Pu)VzAul>4xoVI6rv|Gxp()Z*kNWMkcS>QdQ?ce4W#>daC zJ0{3|xXtLFXNEO%W-EfQ{<4!rJU3tF>F)Y(Fy+W>qulYJ%s$~t2yJKNdriYHsFZ-tkYR$DKv z$1ZroEa#F%IQI$^oE(9P$6KIR{JE7YQ$6S5X-2rQP)0%q#Vq7Uu8^ZAVkA zyUD8cYeve@PDR8A0sh0kQ;4SQ%X#=uv;O17B@JN%NA)yuR{2%6c^P|y5ibAj+%-JsF&dwKM zwhq&3Bq9rS%#UE2B3x?!H^)R6iTV0b8vHFX50qn;Wi`rUnaFfvI#o=v^Y7=hjwW82 zI!8FoiFXm(LdLW1`A8{lCiRKJTu~_G7B$Z?YM#0$qNme7q?y(lZziQajE$KOb}8Ry zlo^C{#W+05to%|&?G4W#J?A|xP=Y4RLu`yHOhIf6nK;i#_6H_PXFJMexE zM%v*ExnsX!anZx_s4x@zwiSCJ%cWHX^>vG-P;2uqVboWUxQDF?el<55BMUAb0}J!} z^;HbF)0wP1Cq7}@dXhk4dR&Ib5Mwojh7yp^>__E@8?tXK^q`WNFdauuVZR2(XwS>? zFpoNdgVOq7R?+Q+i#5R%HMSynEEf@ZMkG<3=a7OeOI*|{%_<3gtrVK=I7an}bSD%n zqWqF&;)wvTaIpu+`kuVVit`%+r5HutVoAHoVAls|gE@3CrdQae>lj&FNoFi)al-$`u` zeiXwm>&Sw#yjU)~!_0+C**{!rqOSwADC}84Hk;KD zZqoKD7%_v=xy;dxmWO_%Bo^3W;Ev_!_Qpya*B7HX2N|#fn#4>jqtF$emFH~4=5!3L zZ;jY?%5wf&!7`$@{Vr+e{9#{OQ)AjQrIOs$6uZof_Cye0zYZz%M@%9qLNx!;`P%5r z2j(jyL5(z^eDkbWDF^{t%>rRi<&}y*wP0zqkC43bnpFOcevfT<=;QhslhWvj%SMdL zXJ{Ou6$_hTzrMzd!+GH)E)SKBMyT*#C)J?i@?XL393?$(MeVxXp8y#Y9F3qjF=!1L zr6*!W45}wxPWHh*B|}n0a2#2Cat;Gl#HMTxXY^+!@{E7Axq(BSbEr4bgR|?r zfyhy#&7HTbx*=CR`XCkzyr7|jRRcKBq|}m~v)q{^nveMpMg3BD;^*2v@?uPVP_@a{vfjl~vya*AB93Nr- zd1+mY^P@#j=4(3X6pjW7UCb&zT}hg^gDxFI!+buVyBe!E={OB2P&5K{W;tG(@&lX8 zU@ShI8^pQw$kA{K_8=i``6N1OFLKW5a(HMTd#*G9E5i6=fy*^Ua!unkvY4=Pm^}p)mLF=^giX0)eli8fjI6L#!+wWjpNYh8+5>&-ih2OviBRKV(Iy2!( z%eauiN1XD3f?6to?f}u}NNg}~HnmQ208=)CUzO^u1RkdJ4 zNowL5`I8{tLAt063sQ}|$7E(4B+S0FyUj%|7LM9??&sd zKD?#P0Yavxq!aSp<4B5;O1dQ+BY{{irakym$%FBRy!!@{0y!YiiTJ;fCjIS}Q@-=C zD$lr-`M7jl4BX-}Ct;9|eG0~u6Avyq9U{u4O00Brl@(ek7eQ|&FiC7jZY439F^G=d z3q^HXc%pFjXjdrye@2rx@;gYcP;YC9&9SwxTH4wMc<4oNMOW% z!DXJskYRdD8aWeW5e{=P3o?11s1X}3d@EUBDnw?f);{4o11Y38HZI$uG2V!WxKGhd z^JmmSmbn&N1(a|@ReNGG-KoHL`YP$0L#KH7gyx@lr?F>G=6Rt+w_n>YOKh2s#j1SK?<}jF>2o(GhA90@rDz$_Dk}BG)(NWC{TTy_ zS}8J?8hMbhC^&pgGbv-_+I-`;HbcRQu%-n~sO2n_+0-kFE-QMr@GH`CU&$WF$D|HGwUp$(FGC`fIc0ml1;aAL9 zTZBDweS@vqX2Yp3JSE?I4s%TRStY&2X?q~|y(We^k8AS^kzR{~U)WHS0cnk}qikqZ zG661H{T#@E!ZJPK01)`BqQ(Qt1gO29#sHsbaPtI^X;pujhpC%HNTPYy{W=(aW#1`{ zV55`*Z8y6vqFMCMH>v*xwMnAC-Bjyp(?NVt z^Kva$U5n&yH17nY59v#u2Jn5$`1ijW6F#SL%WqGa>E1O#SB3NxK3RVDPA%0^!|Z|t z?#nejiV158HWum{U4r_Y#@YSRqZ;&XQ#vLbJpO`^|TWwp@8*1`xqIo$Y!3bV{> zFV9|7V8`$2K3=CX&GNf5DXhb`DRfCDo|12{y*M^n?!)?&2r%G(T@_S~=rP9`;+D-!LN0q_eY{Y9eN}WG5@b zpLl-*7ODF~XIB)ii*o{Fn)e)v5PI*Y*uCNRe7FU}5RBp|+)UrpHf^`2FLmv6+%+gA zA8NGWSU?M5xvecXuGO(}C`PVv)_c@m1R&=Z;tMJ&LP!nK+*m@iS1u1-SWNp?A=*q8 zF440p!s#oD(EkOQk%9)!meg4!&W1x1_OL_+Z4N3QK{S8qH7lo>uY9bPA(8;&)~!I~ z2$epIT)E9<%UDD)WPLxDtMycx`{F-Hqk?^9V!v1 zZ-DDG-qF915zPmke`1in;7qi}G5K}#I?`Skujdk`!BGu+@^k3oqwCbD6-eO?`J%KB z2B@_!SV+F(crNVM3NI|3z^WT_tbrrq^o_g=RTXPEkr4d#73l|y4}>v$vJaWXP!*ZK z*T!fP^!;|ga4z?OvsZh|y7NClQSs^bA>vi@t{RgI8LA|P5^+U{s1P~XSA^DuBiD}Fny0c*bOY46ys z%_XO2GBId5h}|~z@IoSE8RhVSEXDLegZ~sS7uzd{o-K%VVAf`EgT~&MWB*n@{X{^y z3T{*##%p*-!{@hvnR^OFmKf{Y&(B{p)GzievV*O+V)?mg$qCQKX9v0a7sy|`2S`l) zd``X9&asA`*Knu!1@ahr#Q9q3w0whUtlpmC%}LDhksZ3rh_`FGWN(#O`8^}sMcV_R zy+oAQZj}A)Lg%cPM}V&3wO1_f2EA2&UmF}xdU%_re}mp%Gc!Jw(D(~?DTONo^QM#Y z^b-FPCAkEAN?QP2TWh(PB~-&cw%IcJ&~?+YUR@topX!z=@KWoPS9%$U2eFPPbeOKh&}~WRfOU!kl-){gW=706 zlxu9Hap2$WM<6JmCX9n|d%w~-US*Tv3!m7|dMb8tcCkSE0j;vX0GLUp14I)=Vi zi5U&=NGiMVTF~M-(4Id^c-2$h0!VtJMq* zrddp(=y-;IpW{6YTl$lfyQ?P-MpUPY5&Of?&L^)e0KUgCyt~ypL(%-bqNz3wRXaGREX}6kqziwIpZ1 zXTDfHBcR+*2wpNf&fO-u46Cg8-;^lkn^LSB30cfsPt2@u!h4`y2y+`UEa^VgXvRTHofM0oQn4s@9Q~ zpm=1lS=0~3rCoHUcdL5IHye|8g~J>l6;qBe-ZMGpq;<%eu68eFjGZDKdOgT9UX%1) zfOI`pYIWgQjBDK7Y;hsiD>RB(h;yyGu0z&|nRWRr3;`otEM_&z{{w`Hy$eSA+~T~R zGCJ~imL_y2S=_Qx2dJ>A*C@PJYpDtRn5lhKe`Ab-U?fF~)*7796U*c?lVv=y4XkIX zyN0jkZ-DHCSEe_?8u0D=HH?DW))}e0hc98kY}!D0<=ej=C$^7Zi1_wGd?(wGaR_6s z!fnN`sicte=zOHKU+Kx)wRKJAs;i4Ga~#iaJp0Bwg1I~1i#`Niu?myNNTEqj_}0fT zvfUAY1p0PTvhRfb*#|fwIY1aiL61A-OKnZLRb4(Zn>bWaIM%X;v%h7xT(DHvN2&L( zcc8oB!q2|ZBua(@u;&H@q67l;*}8kUiLUxvvGo>7!dlN##Iy{^k*oOeiBx^%I1Fna zGB$2sS{E*ABzjFcG!#1Zs6weOdRgqC8W3}DXYyG4QYz=4Jc=&gMl9Y*Ii%xiQe)Nh zAI+F69FLtIs4rqGHvmy??$+qs$T`wEN9wUHD)Y&n>(4fh%i^TH>Z7;v2OamMBiqLj z^tX|NZ6jMR!x!Nds&(XvhP;T$ZtrBSkDZS2!CNUMJg zw)aW)4^B2k5Kfq`ZpKC!I!CUN!)^O!m}qbTjOxD_8X8AaC`R5B0oDeX6`I{6KDb1a z%=C#9q}KCLIrOELkrXK2L{^5sl0sw4-qQ@i8v|*iK|iiL2`E>N!YBWYf@oy_Hwt=8 zM6pohpL9#Pj(gt3)YFc*(|$~Ax<;wZs;>VL(*iE$(~Hz&Kc7r|>l`q90B2;{Xh+jA zVsB}~UE3cSk=omtN0b-vG565kcfT|wd~y1fe8+EfpfHy63Iu53C`=To(mj?^wayvo z>h5DErUjBVPv`s@Q5rt^stxC#8^x{*dG&+40Lk-3tD=I6wZ~xI?qmq>Rp9gZx&Dgd zH{UqkDcmAn;6aSF`BMs75LdxZoQ%Ovj-5usKY_O~)Vvj-#EUCIXK9c-u$(?n-MI2mdia z^VyDyi952iln)VICFk(R6{3Rn*t6=#;;TJ##BK0jg9&y*7%%@aL35vQXjLH}-fkD_ z3$?)xZlXdI^x!K)Mu0J(rta=u4-V)}S1GxV)430o)&9fFwE*_0gf8t#deIRq(!8 zeZ{-eW87P#qqAQ?b@?FBhwsVt(uRVT2%RmaN(V&xrwYM1Pm@lS3)@s?`=fe@$Cli>pWPC;49X zxM|GBRjsu#6-VkgEAbcmu<8%5Yk7g?ZbG?9WVy+6s3{{|`&_Gmb*KIneeu@F*BN!q zonenw_Q}%0qJ@4gW2l4po0XCJ1>uX+uL;UX15J`xly`__$G}fKRs2v^1o6{J9b(FX z^=qnpIOECerS3-6aZavdPZ&I%sJPTgB=22_zh8GupNN0f_pu7UwwqVG)^V11S<0WZ z*rZ2Dwcx}*_?()fkJl$Mv;1i{@GdiK_p|w$tbOO24CSKB z_SpyQ=$h>JX_veFtCrNzbENgLmQ+Jy%*Jyjnp-&5Hi%8JNsjxrnDiM^a*{j@M~CZG&i#c7D<4gsOng_|LgVi z&D5SRSYj0~#()`jKQYR6Z4WRC!{!6txl2+=4V;df3)q^E!$fmG-P+>+XxiTcwbG6T~3TqnU5^ z8$)k|B(kbMSTJYhfj?1<+OL0YgA*PfK7#uqP`+H)d%|OJXC;ViN}PXVe+Nrdk08iG zx>>z9vIaUwr5c$H?05A>Vi9FE!cp~)*L(O3era#6eq->~G;dN2hR{OXbuST6^@kHz zqeM%tVV{5bc_IUr`cCO(zv=82HjUFAFwD&th6#9_xk>9LwA|9Q!)kqUyHx|eyqR*P zy>Xr^s50>r%ul?8*_~zICF@_~6C=hbsNcsZytz;7JKNvEpkk2@i&bnJ9C|uOf#MM$ zSbPip;=Ir&M1@ZRysA%$?V;1$kXXK=$nYJfc^5SFAwueYH(wk^*9esgZ|1`8F(o0q z>M`a2I00*$UP~*QMyMk0oWu&&O&lWQ71fTBB8_=gWPF#Pdh8~?=@Zbly*69z7BuGM z!j3IKfHGQ=-}H6%Mz#?YB-mxs)Z7KvoIYIu*BpedtF)*Q@tI~TujM|gS$5%x^sjX@ zRc-5G^4WoHo#opw0dQ}b%n~HA^_||pbm4C8?CWgZ6}7ryW)SFPFj{R3sbK}T-aNz* z2uQ887P^Q$Hk)@YGY`1f9n+MOhf$NuNSprZr2h_e!jhPtJv~OluD;|gnya~s%YSa# z5iVT3I6x5E})?QuH@I-%-<|jUxmm2QVQyS z2LH`I&GrgYQ9&P>p3t2t;%^H3EjuX<`*RUh22{DOq3P@NQ3Bb39VIykLm0(?YHjdm zm~=s%ca(4t28KpRax_1Mr{H))sD*-8XXf%~J628LbB@!K=6e>uTaTbG6_45Vb=CEz z*OSpD`)5aI=eyWQPEGf4##V5{HLdteYMVLt8db}UMR=X&DHHf5JsKk83r?CLvKCPZ zY$>!6&2yJt;QLhyaPcllNm~NP++rvy;1kGm^T{>EfDql1w4bff)W<%v7)6g@2C)G--`;Yg4IDq+AS^yLu*HCdcR)bE z<4gfi>DAASaZv_%xzGKhW=p+p+buW{)*bTHk4HqOK~oZp)rw4Mdj19y;ILoO z3UbP~k^Wz-y?HoP;om==6ctiQ$W|$mErhI-77|5Cb`xSk60#eUgo+5+!VF22Wyrpc zvW$If8T(`%`(Vb5+0Oa;JkRraKG*O0<9B_(*Yi2oxn|Cp`=0xpdwaiM@8y2qMBmE~ zI=z28BE2)064@6CqmNBNjkcXfK|IR4(C#*$UW~{De-P;Qlp3P!n)x@8BuP+zzHtyh zZx7d8@d39s?7zS5p4d<2g+8b#YkJ2<9j^sF@6k38*LC^Fq`mbAhmtcIm2b=ao9vmze+>-aA}6jN;ajz1m-qDV!F}~bW9KD=8Hj%9Zk0I*4s}t{ z`QQvI)kE@;dyP&WSldM<_f#$;^tiezGX&Y-Y$EHM0sJX0;brZUroCaqmPD^fYBJsE z!K38C`3Ohx$2x5OSxi+GHc5ohemdDTjH4t6)Mr8S*C4B-YiC^`R)#-+9KQ|GTG(JZpL8^~1F`18&WbRDeZK;j28@vt0uEBIo&IyVaDg{M`0EGN7>XqE zp^eI*%|M)*52`WS3?SsLh1`k@qotzQCSwG?<8)F;)sc{2=$n5b)YuU@X8W{sU!{D< zKI*m_*<{n_Ccs<-U*%@m+kfaq0#em0+%3e?Lod{ymHtvSs{;Q5pQuFG0rELiou-h% zUzo$?M`ay{V}2nr4|-gY__>SpXq`R8qWt>u=qWFN`kPoeq{70cHOlQ*f(JfYLdTl& z0#ax^rD`7vK zX1*k{aphFLQiFguFD%=sHv;2>lGKHiPNjTWgY>B@oh*&^fpTv68Hp?Q*pi1I9+`n4 z_jClCeXry1P$5^&vLM~pgxqx+@(;|J_NMQ9g-i5u2!!q+;=)VRxW-GP%R8^dcr|V| zEkWGfiq!hmu(vb5=~*SaP#~&SUR7zdyDEbzE=NB_{o`L0(1i0YhUdnI3P*9L=m-4m z`}Bfl-~(VqXoP%`U!7mIO@G`ipz{v}B7hQpYV)+n<3qS~QOmrpSgbI$gulB@epg(Q?OBkXOm zO1R9E7uu&eGl@R~)yX3~@neV{H>7f`pAFLJQIW^xhh@T?XX4#&AB8K^<1<}{dvCGx z(d1q@xB_OI=@8tL!0DrP`r{%c$Oesz-Q@3QT<8ffz}g2oTCB_ofm?h zbvR!gjRdm{-yFMs=}AwqCHHX+58+&fh2(G&lp zVJcyt>dTx{yl>+ z+s$xxLx-?n%T;}#G0mi-qNS!o3V$r5SNqKzWYPN>9ZXF;KDf;&J2x~2Q@m_tv(`U56ZD6jz)JGX%PtvRv*4IkTNsH*IV zK?QB*9F@WaK&rtuzr%(3RrRQ^Pjn_C5mba~oZ=W{Bb^`&6|v>nhuv-@xP%V~y-GD7 zf6_XtI#*62_u#1fl7WkweQ9Rbnm#gWL5`QSL6p!+ZXnHFs`% zhWUdSOI^bPy4Zup1&nUY;hpq}eDy%-Nr};ETKh%1(g7W>D2KvoYAu)ixnbr#r{V=j zR{mkNy6&qTk?~4i{*&~mZB$>Nb~S<1gVMAmpEE-HxGE2dyyz76c$(GR_X_{q&F;oL zCa@pIv(EEyy&OkDTsz1n8TL_3_UxDKU3!u!h*)q&LUZr}`ve!WzCF#US=00ae)V!H zh1k7`@cfDsYJrT%*=;1&QdVz2);r0VZXz!?vks|c*uG}+wNDFD!CK=cCjCw5^iwaZ z<{)$x{-`vb4+p&k<*Ykb3!`IwWfz;EclAg+;ea$?R+q< zMTM?(L(#0`?g2OFGGjIo_BUxJptGnZ37rN8C9G&*_R(scrL`J?FtT{sGR+aj5oY2x*$JM$* z5}J{GY1sk(ep}g~@S0hvxS@(T4k$}rc`2dW4Yt3nyorj|-SGC--*9GNCu#UQ6v#JI z?KF(Cp3_|~nL4O>HZu+QRdj+49ULAJKfXHd=!v+qjd1wDnvB=59GTe>ev;$L}ktTT48jX?dks#2vs>*F5U zS!P(gxR+$vk6rFSWEPQwdfnLe#+YQ5g3q*gSyim=o0S#JQ=4@+W<#0n*UW7wA1JIk z)qhTA@m~CgPv$`3jO420MDcgXUBF`<;z^npX8Ls_{8;&LQoj^fxf2h^tLHyy6AK#| zH=?6c5NqEPsvZffdiAA(HVjmfGU>+gpDNVjsR+bn9CINyNLgL%XUSKHFlOv52#75w z`rWqP4qHv!Inpzyy4cu-fe0=3^dN=$b{iGxG?;&14}UkplQpM3gxm{N^I}rXZySn4 z6m|F38}d`hkM%e^5J7;_W{<8t;4wo8@Jf+cz?=d!f*0Ex)~AeW7cgSr?i441eNy>U zXd;XMDQK_w%(U2c0db89J(1RE3vd@9iW-BJE;F(1O>fq=p$(v~Ju?g(KUs=B8Mf*o zc2;{tvk3R1=h5T7*}0NkI;e4AF>IpQ%OzIv7bHyE!#v~JE#mS2L0JDEZdW=8`%lIt zA@a|hS}pCK5OWjw))(8OkK zFLWaqU#LQr=xy0cN_`8$#DsfnyOMES*|--y$v?~1%?A3X%n^5|FAGr8q9Xtn9k0G) z3M$lo;{B+p;shZ+1UgQp@Y-~+!|z_&uuzSk<#Q!*b4W6D}v zPs{Q%JQwZpLGr0Ti#*5A1V<@%u6+KlwhX)_j3p!)mg4h4vX>IcdV7i?VYlK@r@m7X z_@;Yl-JKh^2)muNnL=%Rk1Od1x5knQ+5EQ+!5FEE$*%~ zJ79UDMQGk*St<+nk#QcrEXVC&fcH6)*RVBZY-Yg1`xS*RV`0RC6C8ZCgfxwQqi?6TH}HnE=6285uvz8e%AI6GBAB^fDLa z-NfO#wmM;dp#2jDw>oc{*_BRt0A%9nEr9=;tue$_AD#zMU>Yv7^G)A8*Ko|%q=fG113-5{V#`x zj>h$ijv{oi`L{7Z{5g+y?dooN2ACj<5WIT7shlf{@Y!-L< z>w<0~S5wKjwQ923(%WT_Xw`|x11W-fI5dB}gX%Vl1oF!Zm7YEv^Y zO0ObuZg)RQbYikyXg7HNbYbW2erQA%3oEqCvNH$fctUkbWI?CU@c6baqDE8mKL_=5 z#meNDt5IT(h!c=!tu%)lbIF9`{vO3eqm5D}fA<>0h52zq7OYU!QFXv`Pl#64{`S}` zdh(3EXF-*&b~l#G$XxJ3oO9V`=qS#0As=V_T5-6j8r-vuqb~U!LH+vnY(h@GoS4 zHcUn&D61@ECyLQHZ*+dTo1dqvP->DMMiKJ|n1UCT^sa7amV_Z4*Z$dKrJrs6Dli#x zn;N_3{@z6`q_xG7Vro!dB=LxNBV_t@0wNwRT$QtsdD@Cj3|McgN*MR=fe;o-3Ewwq zH#foXc)HC*(x!s9QVN7nzNL#<(K+7T6IK#$~ftIs$2-M1UX`OkZ;ZMDVL^Su_eIAjsm_-hm%k^(DV^;Gbu2=gK8G!& z__AnAz~q0ktB}8e-LdI*ZHVdjQ_PhY;(^2}$Yp#?gOC)ch9vym4PL|!#HU9%W9+|` z|I7(I>cCie7QNk&oy^~ly(oZprI&$PVUnnC-9ux!4jj+2-T2#{6V*;@qRYPvAuX}E zuxdN)lM@hs;CWo?dOekxsP59^lSdd}W5^ax=3)Nyd?44MmS(|gs$qI@IaFJYZjM_v zq_D1pLPlNJB`d&wTGb^8)+a8NW*LT4!Fjda15(CNU3=8P9MA;uVNc>53yEpO?TwM> z$xedj$=fmN)HTm$E6^64x&uVAKZf=BD$bo4=M2gm06%(0Tp8PovAa$Z481M^7C&Jj zw`sdd#N9FOJwWNC226BfI)Z?yU6RFrPx=3%iT_C%FE=Q*nw?4w<3At?TpH<9zGi4Q zi^9xL8h33@A0zk}TY+hnzAA{>vWtYgZDL*Aoz=DKQ*~EA#l_0#%_dr1n@wpr+IPQ* zd7pjSDfjQVHzh7>J0S2K&zciWHVL!3Q3LHV4o!|v@b42kGd-zHjQex9LH(G=As3X3 zf(kZ+#89K7G*ijq5Mzh9TXkQ<-f3>*%I=fON~}xp2DMjHRuRYf??D#Aw6%2a=%kV+ z2tba)+RJ@gb*+g(_w=VlvCFV};06$P*lvb-k3DPEWxSH=D=V|?U<|_S!e)so@C@~J z_;5L3=p-n5>%hkG4FduZkE(P2^Nsy9L;Uo6(n(p5AAUa5Z)`=ivaD257F z@L$(r%CWIvF8Sx(kZH?Q33fd5j&&{ChF09QQu*cah3Z(o^}(;tG~**1P7ssVkyYtp zf6zE7Q=CPx+|n-#5Td=o7NGma5htH~4wLZT`g^ZBBl>0*QR9-LHL*}s&R=UN$VHp7 zd$k+>Eo>Q_3XQD(Dc6!P9eEGXMCAURYKA9=TyIB8z2rhKr{M!PKF<9q_Kmmd#CV`% z&5I--t!J>5{t)Z^?&x~0@EWo)n>sOn>P=+8+@EBVqHQhy`J47X)hFGHT(i=*VJ2y- z2ZFPd&~l@Vwjpup1o1kb&8ZudyCv3m?{8r7Q-6lpNp z(%XMuHIGqVGy5X#)Ou1H9rN~FdP&^sYS?(61ThTBY(fxL!={@Mq5l3r%?2}s-9+=9 z!grJEHlzbQeFehpb?aZgeED{KHi(pwythab=OBU%Z))l}j|-HN+OLOTvnsJ7J9jC( z3b|WW*Tn`0_2=h#CC*e4j%_ryl_RoYe;po#8l(0Qctbs# zI=Xx1rz+8o>bK-0r`utVPwQh*$Qjv}!x5mUuAzt%B<}0ni3l#8Xt_hDPvs4p@dFWC zQKJzWhfj~&Q~jS_nE@tr3^fWs)eiu_%+t{gO-MxCMpF;>8z$t_%=FGIWO`;qZ`b&M z_*28r4^|$>-aydA2AYBT*d3+koK*r9naJzh(@e<|8}z5`b@&+YuTw7gG+OBROZj^_ z&JSnCDkr^?h_~s4Nq355=E4`v3o%DOLDX_mQV;KhO`4J1wz*|{B`2G-C|0=%Ig>GUSvyQGw5Ysr;}N;T2cR0 z!S92<@t_~t=P~<9p|WCNs`%+#;;rkG#A7R6o097Q#{p3C<^6kv(1;XMoscACc+i{C z3jZ9Jg7O{TW_~1lr3X}w^e|C-sxNt_mtiOyRr}PT?S$yO46pnknfL5sK;nv(0wC3g zJz3&iRlXCGpWwualx~F?$mlK!JXdz$U$uv?_JGOA#ouZ+NANvAxaq&@6J{fTAC<-J zX)u^*|DCtA-d1A04GY@;U8lj;y+2~Ivq;m?e(S(l1L0Ik0F}P56PMw&_Y|S(u@OS2 zcdIa;|9#BwFGOdY`5P-!nUO*pmSJC)?5zd#iz>Z+YDyEge2Ye|hKoo2e2Qn_b3kZ4 zNW90l1%i(K6`5i(v13Kf9CAaQeohS3BHY%lsSti7P14@0|BW|ZZ$41hTA!qGpkPl* z?*V7T$FR5N5`9jlVsyVbpif`PLHTiLI&cdj3-9bAT=tQy0cXtbTZ&zI(BxOM+xcz7 zo^|(AFDU86i3n~2QaA~Vy{;u#F|9Ll|ZHW7&5m%dL|qey&8U5nEGcn#_y`2uMX6PLq0c-LQ`Owq~kGy+uoYET;sax*cQ^YYPt zvHC768e;`~^wGxst;cXobT}JxrIdD-#chP`G!_VqsI=>5bQAiJLK4_1jz&Wip$=90 z0H{7MPrLn^F;ll1%aA_sUW$>QGyckKj;+Ju_B`Bm_nsBD%>Yi`-@YBSZ`xTw=LrhJ z4<=x(FU3pD)j1ws4aD3h)V(TeO_S+vFqAb|oQK~AmA@exZ;G_aFHiDr|CV1}T!Qc( z6&@0OHx1Lp6^ygElkR-7PWyuF@SS`*9BAHLbIxm-ClOp|Z>gMzOgp05J_SvvcHh#( zEHqn%l;3wA_dP!Ndx`t8=U13GoxenytyuKf^j9D2_c6QM{kwO>8S(1Pj0u-lV!5jO z+x_MB=S1TI;;brn`TJ2>WAEgo=3DW_+1aaRh|>`rla`5bv`L< z`c`k8!Iq@&mbHFZnG64g-Ogm3wu$k01Kxm2*e^#)%-T~7Ii#{o+udI;a?c}r8Q^7o zvTa;_{yl)0A97w_wU7Lm$}x`!tK-&U2FX7zVxf(|G8uPGeVX$&Mw$(46V>b}@|~SW zG}VdF{nHGE&w(C;h)~ij>@{_D0dbc>C_koDNL8mplK{?kU;-yjY<|C2V(heHI9MEv z;VGqu`}Q63{}*?SJN574t^u)v7AK?cKaz_2)^X&Nnfj~uubkR`e{tgENx60T+@Vuu z&N1zYZySZ2-l^#el{w01j~+L+YkSRA_WI1FN6*e2>2T4-^q6dm1vY8ZkU?IA27)9( z(!kY~7)tByX{2R_WT>gDt9!hrsODGNoXI@IJ( zXHx=}*#BWY``OiNc8$4zbyEqE#%~@y3axApH}!SSO}Y1z1<(ZY zVa;%X79kRtGBHH*X8xdV@v(NHWz9$O{WS3lp~WYqLgnmSS&Oq7_8txkoaepT&wkrJ^qT<6Bgvmz))->sEcCn=XN+TDK;+`VPmk5OB)#RpGoY_lsFY2CkxSZO3e zph??x5aDpS8Zt-@tNu7gGTWAbH63Os>k+sLWHs$~BLRFf(biIxfH~H2YZN;a(_8+1 zkVPT}qOX?Z9Gaffc{=G~;JKJ0*NYeg>;vdD{^aJ6$pJy>px&i!3TX{fd3dEd_0uR^ zamiT>)hx)Cp~aI*awFrDGmEe2m*6M%THk?bbu|~92kI{dUzb$v8fY6G)RY$X7`#e* z!Z2+^1RT^zL-*1$4fKvO;^cJE$_aq^7NNK0aC;b9aNMd@fF6Vku`5LG{Ti>+_vfhI zW#XJlly*=E%mcM?vFZTMKHxcsnB4&uw+($}1P#H$_J^BnN!lc?9=`L7Fzf`uJY zE(pGA65gJvT*Tj5K$I@*crJpMIuQrjNoLOFMJ8-oc>{2T0YX2j(w>SiNM1o~*b?DL zEX`wa`evvj%cp`o5DonKeuQ+tP+j<|vR9Oi^F-Z#hUrmv4>P&^$`YAo;nk`mTQ~0B zNj$B>2!LtlW(e_e`+!-OJ#-FCP_r`789Y`?HD_-H$ik`knRgaVo5Z^}J-5M%uIy z_g%Xu>BHQ3s3Wsd&m2Hpdij8g?u?hVDj)T4lxCR5nF0u#zxJ>FrnO}#H^BuGcq<2; zi+Y!WznTtYWFqEM<2ETytKdV1=^CMu;BcsDE|N9uFLCe74)ocIa5EnTH4579_o*aa ztiv+wwFB#3q?1mYg7<(ek}^!SZ+Cr}obw_rpR*?bG8@RwSb~&+>1Am-&nxsCCv$b# ziEAPPhR&w43>r-`+?!x2ABSyl`~aJbzoJD#*)BtS5v_*==HIr)w;+`{b>KdYm>cEa3!%1{A(*VmoKg}8%w&;Ya`f@LCvFm z*^O`3%UB{@ST=UlCCYtp(9@#sKmB2Ks8Q8kSNyR8P_>Xz@fv7 z_pf9=R&@0Y=~#dAy76Wuawl&*^-AHh@4Gtfc6uuxY@#uD*RYLumM2F^rTsRpt$f3e z^@?{z+peyL=J`4z`B(2%Wiy90uRH13mWl6fmwFR;qH4mulgcAWcb3GR_eU%>etqWp znpQnBnZak(&BgpcUo*b*QopeTSI1WWE4rnaRLmYL=NfVIwXVh-s|{)Y`0Z}Rb4I?5J!#uPbi{ZohT9{N?S%vzL^G zKMg(Qb!v!z+a(~?&TM|G@%EfUb_EVd3o7+`5|E$&1Lp6KfrN$6_dc}5Yt#?f+fPjt z<>cgu{C{zod&;SAC6($SHa|Bk6$bm-*+pq((f7y-@wO?l`$J;n4f9#Nyw&R;I$s@6 z2~W{;MA5qcj(NFFG;}@ia(g=#hTgP+#@^FBN(kIAm5p5p=uS%c#ML50SNB4_%!ZGuO~7)Ay%n2SnSbnsBTqzhP-m=*9iBa>Bk^1EDY|N`YfB&dA><6YMLsu1AWye7{o$`|0mn7iimS%dyS z+dxwNx8=-paR4lT5@R%skvILkOA2pt#gBUG&m*rg2+2N#!PA`c)}Vqbes}5?7!=1K zd4g2`E_evR$Lt918ghr*+`0V_y$SI<g6MvY^)R=+4wO$ol!pMJ%FJAK#j-L9?60;L7 zXRA}|G4rrDXy2e$) z=NTtB+N?c4dFc-(A`ze+nT^L03`t%g+%iH)s`;h~=qPP2 zI~&*cqp4H^?qJp5XmoIg{ElSKSI~;TOh3#_#SmWBFEez7Hh;ujAg=g2n`AzSiH;uS z6=0lX_aQG;X#D7+K-vyyYPd}lOzb2`Wn9=itmfJxrI!VJ;&EH`k`-tu9(tpA>SnH` zvFez)o!-gaH>?NsZ=u+<$BL=L(%UHtIuwf=;N2X=f|cj%hWeCZ&BxA z1v_i#hTomPvlkEzu=b9O4t&)e88&6pigvkPKldHH_c8VE15UB%gVzZLr?%ui z2ly`>U%_w|ja6)a)urZ)@PxM51me#%Ir1l+=YPX+Sr2~IupF;8!KvfMe_82W2~W){ z-Mluc3d#BP>9=32l%Xr;Eews$?}4)_Iq|gAE$_Vkrgn+FNC@#;fZf~{+3Pji<%Fb? z?A*l59C&K2f8{da(Bfi#a3I&XO$Olzi}B~c&fUE6j~i0fg)A2FKH`;Fw@4T68Y0KE zU`#1BX3goz&f^YFN0<*u>j+BoG~He`B2 z^d#$J+`ICTA;F>xl9mS<&b+(juO$a<`ipi8ag?5jHY4t!wB&rtesIm-^8(U zM%#MhQ7p$IzplqakS?+s-`HDzw=_EJ-r-VH$q+qdujI_{722iM1~%LuE8~pl=bhPd z;WBT=Wdq+;Byz}h=nHC1x^*kuqrKB&eUey!v_ zvqyQJ%K3b$k*MWd8@+4xA_BNGKmbB4+*H$bkd zyU|wYyQ9bh6aha@D}h!obaot{A1}8khzYv+zwoU@u(&I8L$4rzo!Q&j>L~tSP$Dt> ze-9+~?fVCm_>dqb%Nr^FR>1qr(bjiYk8#i56zgzUUeUwX!;G%saDWxs-5pl%cI?EV z{s?4h>aWL_g?YIm{`vJ6!eZ>KE)a1jMChy*?FVtzH?L@)%P#E~cz>Dx9#9Ph0rtXB zzUhA?tAx_G7YI1TCODI-O)AxJIY40=8VoZlkjY5X9n6090ic8m-MP>3PyUvKUnkJB z>>q9y%^$Eo-RO|lT>@Kg2+@1tPAm*wU6Wk!Ao$f*c!fxO<_|jf13(A4?8Grq5ClLA zSyC8e?{3Y}8Uv&13Y2(mYBfqMtKI~V(%WwvYK2@19c~NZcY;>3-K3OE4aF(JtPi*! zAeQhC_nfeeBU((~yDkIUQg=V$RIO1`x-=DLJ@0+w#GwoGWU=WVaoq$FkfbbB(*`W*Fr;=i=JSAL zHe7tRxoT7wFt9zdSH-ZXBFg>onCs-6d+Cas)rxZK3AGL`h$q9uMwW?}oUL7(0ySUU zqnZ-c#)JO;Y8M;C}U#e-}_3IYGyr2XA9e_3SpP}er!ux*acU!Z0Qw-`U@kv0uK3d zK7L!Qkjhn)M+<*gz+s|A9z+&=q*pwcM2_l{Wk?((27ZhT&E&LRE*cDP7p#X#xFINW znRabKZj%nqix!NbZLgW3OS;E%d78_Alh2a7fY$Ygr;^Kutn)Z4AwI6#FaYe5_$1uo=Huju8ymJZlXiRd$iY~QqQWxwo=$K?9esJOn6A`I$wmGK@{~A!j+JX+= zF0?aA4f~H5?lT>X&W(M_PfS!mHHY=<2*3`U@C+O#@1taMnZ?7`l=fc?~ z`^ZIACZOaKF#%=>OOMkf-2qA*{(Ej7X>EE-&wTB7#v{!_{)e%E?}Ru&lo(A=d-Ytx zda*>F#zl0p3JBpv9GsOb!UT*+Pce4VnIfts_wk>?ckdN#-goiGOCFB5=Pp3ESJzR| zFz4H7MmLfuvf&|E7vurWhf}SEH~`%eMozyPot6`r!k*J18{~7Gg%U zc}t@Ar-;p~#T$R{M5A0i?ku^~+^uU1YoGXEq*KK1x1nap9fr<;P3jL;*0x>ykDe7q zTtlmFtfPK#(U1?Wq9bD?dsXifUcNS{Fu4{HY$okMhA%z-Rh9#$N-~&Vo zRSH+Nw_SsE^s(^?g!izuHRv*e`0O~Hk>4#8)X$E?4Fbrv+45~&bXNHri}XJ`;z6pq z$TOl~vMog&y3VW}2UYDY*wF5cHIf+R2k0?v526KPl=eDnSoE2^Rb3G^`F>0c)4kDkR^e40R*bF|b$NbZ(g z$tp64N(yPXPya0+FYl1$Z6K~>)yDL{TBkVj9VRe?SB0;4)XeTTHKQZe;(5cKUzmGp z!98twH9p?68;b-9q8b^N=cG8SZ7C8Vd;XUEd#|hN4E`s^{T38`8`v7>@+MiV?9?07em?xvR-7RH~G6vF62eYD)5ORupRgOdB&L2+iT6vp3$1({j$ukE`BwQL8o%Hsro>|lJRtxaC7j(cgx z9ix|``jpFIKQ&)Ga!59;4AV=uh3@6Axo28!P7@bF399~+7d9Z8iA&?8`!$KxO}29q zq$d1m^I?A%gsI(04~MJ!Mn1(CaQf?TtlBsQ*P(w-aNBXj&73@Ky7nS34t>z+RMYeG zVW&3XMNLPsUQ5Brs=`|XX?&i>b399hbN&|XeSp0~y<5e-I{xW}8cT6~YQ0niEii8N zQ{nRdghh8k*UQ$OH8CD;;0q&>1aG?R4d<;t)*O|$+V*_1ywfX6 zx`G}UvK4aV{CF?&8{6?SpB9-79hb?QyyP&N^AqEMUPEtrkL!A#&?S|vnauPSnlDKp)kUv4iNEll33GNGzDk?n;2;)-bk)3kSC7;sFJjs10o0e(?#)T!_MK zgcqezY|>o(2|gLxjU@HqBf5ZHm4#t(ZMTQgsDMj^z5qsab$XH(*DzOIJ{AkZ7gr^j z1Ex81+`c_))9&$8D|Ms`HXm%mpxx*v%OfS#U$=hBWo3?RQEGbv?8iWj|LWx3`s`I< zd)%al#Mrt~tl!5bIhTAB`@$2XzLD1?4ljL&cw*^>wyxoWoN`F!zGeS4blIuB(7?1) zl%UtuXS`0upTD=EEK00+tE)xGGuwDHC&+>HL*?pJV9)4C7qT!bs>X#u0ynF3w*z_|maP-4yJ~p(>v&t)@YQM~^x6@kj`j?@Y?hT);$1aGq6&KesP%wT; z{m5nRf@i^rC|~_)=+A~i;nEHM!9b0&k+tgFOB)vO4;#e~N-mH^XCEAv3GxPrdpq@dNHyBBxZ%^-^f{^k;g9}MJUH82`!+IyYmM2Xl3n2z*r|YqJ)L&Ue$vP8T;cFwDhY0GW?cSbw?kx@VS^= z$N=C6w&<>*$(WT%pX~Asns;wfQ%||Qo*vl!WB@KK*SO2VEu0QDX^7mJ{kwCS3f3#L zfPX;LjmT&0>h~_MswpM(IG9#s3BGQt>U|dSu_c}+ui9-o2Pte!;IL0^I%ucKGz;Iw zZ-n*Qmgahxf`^!vbhkA_XTh*`*||gFtqMBGqXFL<6xs2r-aYVS{y8K<#{Y-kX2AJJ zWr;=4PbUrd&um}(>GQMhH&|1m7DrO~-uTvB+p;F63-pME;*1AypUA~muPbp+{mObu zU%G|+lP#Gl6Qj8j06`dQ4+d&&2a0ai9n?u#3%ypwKjB>7ifb$pjLxS&V*Cx7Z5QOO zcitmn*CtZp%q0SPuU_XCOWyV_Y1shnnYlu`@yjaQlxOkRhg{Sj!Ck1d+PBE!!tDp_ zi`ApcE!{KIhaUk1moBQ!L$RFIH&>>Zk|amOlP|?CD%{hFY`N!K)>PagV)yz^YF+$( z)I;w#CFU#y9^|YCjuJjC>twW$b`iz4(l}if!WE3O4UGb6{5v$?(%=mG+YGHZ$bB#84KH9*$~BM2XGJT zQCg0!NtI;7zfW|Z!tYey(kfaroyalO)&Yw^-z-*8YQ{#+Fg$}}Jfq3u9XyN?yHWNh zwDN9Z6iMc)$c=|WKuJ!Kmt29ZC6e*FhZ@_s8)cC`|D8m-pT5KPk)hHWH|&UrVi{uM z%gl$?HMjuE`<`IMo8&y*f=SEJq0TUGU1(0zzMvmXck3s&h+|_My;xcbdLA3^0dTy` zCpnqxsw^@?^9IXsK^6DLp>R|5h6|qlX)&R3BA)t}z4_AQZ>G6A%KPyRaJ|P}%#~fS zr;_Vlo-ExH0{$rTfXnN**U^AI?Q;_G9ec;_+`46V&$Rslxu^?ZnQAww$Xsh$o4XeF z(onRIrBzqR`auj?nDPtn0#-CQJe6Yvm(uUs6U;2LBp(q)RhZ@_aSOrrxV&K0ps!>W zJE3y|uiD>c?@v6Hu<>JZDllLWNtx0bPt_X_djIS3X3iG>+w<;URs$OM?DGd>{w3n3 zh5egE+$rk<3k%`qtqk=v7XyL8^Y>4D8IIt)Bk(ZIX!yp!+tcp1=w^;P*^M_(gx^iM zV)w&#Y~Kah`}zV8-`+@bIe&I=)9l!B{c^s-DOxS=IBo%1o=;kHECyRhw{)2$l^`*= zZ!BaT&h_Qu>1&q_YH!U^$69WByL2iZhrJtWz3&9M-#!Twj%8C4+sFB%J4aDM==XmV zcy2x9kO7WOv}tX9vAWc^F$chh9#49RP9pZAan*kN0!*w%{Uk(L3Z;&`*M8||NS<+KfBy==DySe}AM2KWQSlh<9fp^Qkdq$3 zv;--JA?ysmB;U1E>+LisFN#xW5YrMNyXgD}vJNYqS?rht)K9nUP)Mas9BjkxIlU{V zTT~b%|1Ys*CKtsrK={K9$KI`H7kxMf(-bi2b~!4w)j_xY_yh0?n(em?xh28O_$5p! z-)N%5Q^=3T@xxjal>0EqCxmw6Z^UfiDoEc~`w>+-RLKbCqL+=hgHeMJ;~^~yqT?wq zO(yp2Cm@1v1-+_KCHi4TonaVKziai>oB?s9kpC=D2!2f(%V}Pay$xwO#|%XXvW;5zCT|w)epw#dikUXh7Y_YQ{b$ zD5sc*_)3J7Bh6`h^+@?z8~uvJPF+Zg=VuG$Kb!SM=*E900$g`V=+(aV0f^SU_MIEA z*f7}Aj4v4D+n3+Twsd{AcfAn4gRmF74cfn)T3>v{Sl!Wc_IcObH=Jod&ZHC5GYe9-ExY#T6sOb_9dPcISR#Vdy-2r5H^5-@k(sIOx zl5MgAVlmSmIbBY|I3{OaV-lASMztsp)7 zq#%iNbGykv9u3`10_Ag`Q*et?LQojv9xC)qpHZ1o@krkgBtxx)+4!>9F1bQ!fmGd( zNdy=nsnl^sL&@#Y)L;`GoQ)Dg2t{m}4cvl7vWcfzy!J|^AAoeeszuF*j))i!=?Q|f z0r)J+hCJ--b&6KhF%HFRd0p8R(HO#*Azb_jKjqmwIx%gHD&K}MFTfbPDvx3XhSKHH zrfGpHcu6uqXBOh_Y=A|-s5?yP1kETHQ3jCjtf5z@h9-xUI}>%QOhG3$wtg46=t4m` zR-u^p?GRZDrrj=*H>Pa%3(H-k&IF8kREdqq$%%j6RXv) z3F1-T*GALosJCYyMbg@g_?Grmi2v8ewLbuNwnlpg-!-?@y_MXwf01RB>;H8j|34Z3 z!-%;@mQO}Q-Q7O-M)clPHF~IiaqL=T)A`S`-Gim_cb+zLb!4BD?Q(E28p#dbDSG4j z^|f@7Nx6#X?bh>^7vCoS9E+OrWb4ot$v!w;CbF_m6JL)&gd%iEzNp5L0D=hBAp}+R z;QO$_|IonpEH6kOoxIAaequ#Dpd!>^=H#Ax(hEmej@NIn(#a}b@9V76*5^i3>}Tlh;AD|HIl>0L2w_YeFEndx8ZB76=kt2bT~ufjy)|{GyY9K&_xA1X({jG=_?5jt&HEW} z0K)fp!~uGYP{J%pU5Z>3`V5#+XDAl_L+FcSkV!^G@P)vlF%9P`=Y!n=%E8R#-ZW`v zjA3>#wr5)ZizI@H?rUzJzj~?2Z>TIfwlQUe1hL78mstu$T5#qfIOMIcTy|1!WqjXW4TXO_y_c-hm}C%iCw`=~X}avP8xHJ? z6WSi=9L@S7tP8gF2)Jv36Rz!aX8aQ7#YCm0pQ|UvY6>L9@b9WUohwqOu*Nf`X~!$Un^k4sDhY?~h`I)gg(KCnQFG(pL8SMC zgVAl@I_*bjpMuE>r7#WFP!v{oEw@?=k&y2@ecC&qznm2Kx^dr4f+$&6 zeP2RYk77P$l#rB3sM*U+5ala})vKAzlD7lrCJp8$DG9sZ`(owq7k34v?q3`LiYu?X z5@w8lWAH5Vx>tvI*;nen^U!4c1w0&kufDku-S06UhU8~xEXG}(0rC^LJgK`frPCD- z)xGD%s`i*&@Sg_mNY1=$a6BpYuPN?|+V9avB3JTy?P8D{KGWi};5XZ^sZGOI$j6rb z?qLwWtRVVbG1a?N5VcU~ED2%<%5x;%+DLv8$?v9KLyf3_n3!o&pEzl!qZ+V=Wx9IJ zSxv=IP1cGXEf*X5iDgwXC@KfG*XtI|C6^nf^|r82$d1v5&&RK;{962x+DDzen>5n! zpSNe)-;km6-Bt;=fVrjP4F0*1KSAhlz@NhfgNk!tkt|%)#&Dvk;CVgp%x)6NC}7J7 zbx`*=t>g6t)`7ZQr%xL%06fa5N+0m?p__c+CX&=h4Gq)pUn;Oz_&?EX|K&@MDlj+J>4=Zysqw!9n#TZyZ!IJpRhAkoZ*#E;Jd?K@ z#^jlsHn_^tb>4FR|I`ZpziPQJ%Y!) zDi}U4y#Ck?^z##2d|ZdEtGPnK;c(u!Ue*495|kYrw28`*mX;1)M)N>-Dyij)_wMtG zoKLx>ob1xi^%@s#{B_^xrSWVAP^zmXJ<9*qqx6fe-6s^}Aq8RTrFN#sh>8WZ#_+m- z9ltB-k1^fOwNcB^H3l~niJJiX^$ys7d zkZ(C`_#I1-Y~G8`neDGP$`1vf=*L7lvr11ypn`XA zZ|jfsPS}P&jB3FI5FgfA>aI2_>1|N8XKxu97w#O1UNBhgBG{o)UlwiwkrUZ2hmbqx zkdp?po1^2rtFAy1ngq%_>0AV0IQi;hChM3)6_hNgxaJ{=_uT2GsXznBd$6OL*t7(* zzSLd_fA9|&IhUNZ96uC3w9Ik7lQ^hb9z~V?)b7T}bb<#2z=Td-B6{JNcGKm)`xGb} z$)T4Q%o8TvtWtj;>i+qq3f^ZeLnb_-R=jr$=|?ZJ>dk^^C%PT(VRNQUH-1fkYO%T8 zKaLar2{Wi5CzhT|<&6h52d3)0t4jxtF|ohO4?FxFJ?ZNQ{+VFz8topoQ^yIrPy0Pz z5Is$reHz(1SH#D1j$*x%uB{hx@7r}EVd4v2 z@3@?Fhp(O`>zb4>R1EsF!c?=mPRrgDmYilex|AS62DHuAfNlrD8{N*;;nxQ&)t5E6 zfKR-~Sr#U!7A6=INx(C&@utyVAIq06pD(qb$YsAyBT`VxR?^BrNWgE@GvEy}*?aqI z*R#Z10n{Ho@?iU}`>$C6Pj3A`R9wlnXqtd7M(d}g$zhEEk9@zR(ZJf~GvJ0YXQ5WP zBrpF0fAE{k=>l+6p$>09jmT{h8trU1iH8#m$mrpobdim^12SK7T*KE;jc*F8ERdi! zdWoyxRIk_9=bS;|JuzdF%^z?1J8Wp0cM;+cvmw`QbI32Dfc#ql7)Me@IMCso$%)-* zv|wojRr03rl4m5?aDg*Od1JEOJZV}_arIpt1dLdM_vO0wXa3DFn+tC%g^NHgrbTE# zFo=@hHQ%z#M%+7Ea=>LlMjNb2&DO35BSEmO0V118vBs~^90ACifM(N2Vul_D!Nn%RT$bh- zsdegYr}JzY7XORulqB?SsL8bc0JK>Cow=0Ckf`0Aof2%yZhA<3$`e7`IX*o0&`r2} zN}oTw=Qk`z95V94W;4brFwW(jIPHA^)lypRVcM98E|zXCE5woofc)x@-sZ1g8&o zt;I{|GoZ|Fu9lQQ}CC^6qGE{$ED>vYf6C)nImOUoMz9Y0#7 zjR(w1wqzmOu2H|ePI|zzsNc^K@-8ubeYZQ~m+*r^L)6=qefwWarop+Ou#>2h9%DzL z%R*B#W|{2N0L>bQLpLR>Xt3VKRNscZyp7*gze5Xk`p!;oz^;7o0Z z*+X-u%*T&ld3V$d-?AV)Yl2PXqU+8E z_H*4ta_#^&Q9VaIl8G|X2#ch?y5w{3yhHDMP-5Kgx98Q_rx2m3j7k23`U|0+r>Fgw za*cKyT=#V~B?E%G;y$JYH$nWb%x_C8VxvlBQu415aKK*jo;q_`y0j%TG0UY^8 zvxV9x&baTE5q^GQ!lRfn50n=%;C3(bKzK_-e(TnH5~+L?XRnthC<-cs)>+>c=wIpr zzF3|142O;Mpe|7*vB6QGtD`A1-S%>yAt=jN3dS$W%rMeqO;iQ#{1EVTFG#HQ*Svk*#tOXxs&xKuPuR_$ss)p}>4a~n2K&eP_k}ZM>1v~mQmm%51)D> z3c02oAObl=u@JgDFOGt@^;qY@pfQ2>RaRG;2A_akngbct7=OOp1+SCcvvZZBc>Zzj zDWGkS@_M1lkGNiEXqg5)2Il4N**Tk0J6D=IjwtrS!qP=#Ahn?S6>sw*GNBc~=U=#p zB%XSdJh^s(LH-dyTqBJ|{&{bYXCU#5kNk*@qM)DV_m?QWnT&Z8=o-y>$+N?ezdboO zs#TBiKcczF$3Ra(0I=BQ#{!akxXbj*H=Tek-Hq#Cyb<*XusQb${y;Mrg%bUG6Ir}= z?Gg+v31E^MZ43JEbyl}vKc?tC}132%fA?3TFbe!E|+z3atf!Inf*F#8S0vu>}jGBC`i4L zg%=lTV3xzDv>0{r0!BbOY)aXg73S?)^AE7x=|8}7MneId_>o)v?T*+v6&a$P^0zB9 zLHx6kCXN_6rP^B^&Tcr+vUqawpY)bd7{BKw@Ydt*)LY-#_IoEAEXULvH96r*w zIG)h|=EWfmWbPEWb!%A(Trr{WEtImnHvtk_X5oj z6wTpgU-pb>WiRKoYQuKC&VCBzqCH%c%#rI*mSf`l_k z7H|SdK6ENBv4DG@4b51E@jl{KkR1{-wLrD+)wkthFR_tAzPh4|4Lt3m*Pst7HYw-k z0I-`1KDfYqbokjy7-ZG#dKKj})Ri>X@9QBYyFPtO$hfNqd%bs08xM2DeScHdUv#~Q zLdZ2)+-W8sLBw~rR4-9&#os*Bjta|x4pS|)Zrmc<|Af;ez#bL{`897(vsF=6eXB^4 z;R|Ob@CKzea-X)2ap%G*M2OV}4*(ef+;0iQizI%eZicztEzHNm>M+eoZ@jL|FC9m} z03{u!YpX^-2NWXYGbzF9NqqsFN!e%rMA$WM_ZUV>F0ZrOqH5C~5GA<2yk4FexZT!Q z8FY6Wtkx*?gqGj{yZ+NSS;n0~wAuqeD=^T9o+Yq49r|%7?mD+v3*9*Vn*DG@nz1ZFGrdOqU&}FU!G7f&Gg!U+-mab4aJJ&Rt zRl+9RkK0FuVkmsd(@+G=xdip@zL4s@xHg>ea}F~63dJ}@Eic)*@L-^Wgd3E*2%vNe zAK-^(4@3@*nKpAk&9N)?Sztagh(rLUfQ5is$ibstLDGPrt^^> z5#dUaZ|rLbv9!nY%xW4=9szhQFlcy_klrH%ukPOpf5^VZ?>o@kzo@iG53a-#%4&Gl}o-{5p{}0U!X7}CP+A!FBDO~ z3))I%*sr1zEAK-VCIT79u`Lo37W|0^Nz6@0ZWR4yB?YYQr7n|hkRj*$c7Nr#dW1$# z$R3%)PC5+F3-mVD8Vl}{96&#tN0CBzeZB!yE2rRec9g{L-3?YG;MEyVpEPtH{pf`z zlIu5WZyu#4my~S9=#Vq?{i;wL6~jw^tY>YAs+a|SMw!7+GJ2&=V!Rx;v`l~~>O3!k zO}2aDW0Vtm!?Fj(ngyzs{t-xE-R(euh`vbb8U8w>{!mx^m~n|7)JA(-oF-Rd>oLD6-zkw@t|BEz;jWAgYW8vIlp`2TnW@ z5R(zeMal8cejn7RYdum-D}UB!q)lOrlQx$tps+udYbmv9eYiLMP0`CjC6|e7mnJGS6nc< zNum7bUqKrEp+U?2$1A3>+X5CU?dPx)aCVjI&LVvSh6R>hp_QDkGWU=dTY(+{*=xNt z2ao+PAcgmLMrx^2SkGJ#pTwZI&IiiSHmoB#9_~(X+{Ss#Z`W8D`%mlUeJ-83`KN6PJGtgT@|VeE;vq<1lDhGe%we(J}qAVjNa|ZA&U<{Ma?i z3bxTgOBULG>s$&mCMye8Renx>`6m$mO$a} z3ZDSTYv&+P7j(_T#I$4W6yu-I_rtwgND>}=^TG%p-aj*Sv_&%=&38phe4=iecVGMp0@Wc~ZRO7cdidg@X1aBJ1$y<0*ORe~lZ)Rg%BRo&1ZTe0kb$#`%HQx|yY za%EkQ`uR-o49y=HTm!CV){gwBPa!qy1z^b|7mn&ku;~xD^XQT`Mbms!#2_1Ffy%8(r1j>!GD@9|%) zG*j{b^vh@QRH+o1t7vGisQ*><=FT3|K>x3%^M8_ita?FQt;ZY-H>oPzWU+(HDJn0i zo<07vr0BgQdls7zA0MB_dWt3(%Gu zQ(g~&l|Dz83_Ni){{7SeZ6h*x;L@CaGZc>my%~>os^Ddx&sy42Lqy;CM4-pRxx5Qn zM&6n%*SwoRbGM@=CB>$1zRVWKA>Wx-(+jyaFejn{dQ30PZ@17&F;}D8S%f4nEio^k^P#0xV^Ex|AWgkL@2M+i zGvy1)o58QI>E;>Uxc0IWM|-KceSXsYYr?c;b9uj)ah|s|2QK^|NG}&EseE#Ic@OP!pY@PMP<5|`X($ODG@F-!pb98uJPv!K8=Go4X#6;MsKH6sMsR$ z1LVo83a`+QzXRV?MlG>QOhZXS^Q!1ujg_{{z^R-d{2w}stSY(|eCjqBL((0$oV=cP zwrSSc*Ymj3t$IbuyYg(wwJKkx~QY=zb^3cpo4&r&u#i+t+i&6x`l0dUjp%J?MWC15$L zZw{BQkvok)9d(cfTp#>-w`>n3Zlsh7StDL%^$9nKvGZ5@;ENSXauxBCG_=k^>qazB zu_f8*;uhClRx{^(4t&2JQdK}F9gIwk+FRXRj7n+8I+PQ;Z`#IY zYjZHDsn(pr%JtUrB8DpQ+W7Iu?vY$-N%xfpmU{7w#u9G_OA?_LI5EC2^D7jl!7b~= zBn8FfdY|pU3@?r=kETgv9LJO3?#}g2FGDMbOu%B35m0|QWl+I4Z7IqjXKRvOhX{qg zH`P`Wc#@TfTPm~J2Wjr6?c#zw`yr@9G@o3dp)1Gr_RAi6wD#!XZz(G`{P9X(` zMrqo2>h2DIwtMzyr%3_B(7AC%hK8}4HaZZ;e<2=(gVM=6#R9j@(DhYe!}4jHjLIwm zop%X~2|p_DNNWJpEgS?1Y(8r|BJwQ3asfDD#&xrJ;O(rBbGlD{5{Tr?@B{4~g2SxR zEtETY+^NQf?--|c6c%}C$)v8v)PAj=9^w3!S<_t`Zcrz~fb;EzBxCHrPY!lF`6i99 zmM?sP$(Oa>Ah!(-gJOJX7R({S@QC44Wg${)~Nn2*Ch8`jvkyjV&8iZz1mV?F00&T1bQJpMRoPdK)(95Uj9*lGw zxEQ8FQsh5R^y!A>bXZ=p@t~>1q;WX;M>X51_46U{)32+lF{K@bH}~E_9Epsf2OUlVQgG4N|g}lQ`BX- zmuv3N<(umdOC=pH0$Q9gx4#TGP3DDn7M3q}KEHUKYsp5o^-8Llb+C8TT0d2?$0Rj; zvE{R=aDL^+NT4l!>-f=AfyE-}kcc-go@up{+`FN`BG{Cm#72C?JkbNUhDW!3hf`rN zR{xW3piQZZVQ=RarbpLqm#~}o^IFrXT3HscM$&RM6C~dJ>UsAVxfj8p_0vUhdYREG z9hDp&jEg1cmwMs;^Uj6=;Y9o7J@g8TePvBo&DVq^_cg-wD%3NG`_)mPTK=E6`zs%N zCy%Mb+usg{cjtdW{PC8w@lV`|KfpYHagM^_S9;~fdWm05P-4Hu&sH_ zq3=$(WN9^w2l}IgHA+pmmxDWVKV62(bpO4ml1aii)@OD+JiJnLP$o??M1sa$l+juz zfQqA4I5xnEYg0TQ9jZm2adSI6UKDYq4F$A@kHoL5RbwT?ezOvdRJ;t8Al~i-Fd($6 z-Dwhp8(p<9L_T+#6w z^htVM2PxtyjQBhDpTDF~nI$FSf@@`>l$v&OQRtLLc6 zxrHS5kQ8WqP9#SV{-z7=&l7RugX)SE;R+>NN1ukMPMP=_|Dgckb}iE!00DY4q2dwk z%o@#Z>kS(tm{j1l% z*)l4U4tkl3^+|B0*j1wtll0-DXDtUb0UbF`F|_Y^gCp9Ko`v@_A(MvTD4rcTXzk|W z^th~4Wx*|^vq3*+j3Ce-^Xg38I+m8DzZ&Rb+xAA!KJ<3DQ#Fu(VbM;2T$Us7uELwd zn*TQjdD#M?hFVBW?z`TJs^`l*g-5eTfEo8C;{i9h_uoudT&OOPJdPo(nEp?;w?pFy z>jq)^Gdsa{F}vyETD52~ZX^sxUTh*95l`vvK1#?vDN1#G;jeV$3r@sp3@wgR&x4I! z;ByCRSrdG^Uifz75SGH8r_p|8KAz57^iokHqwNQt3WhA$ZXK?TFBRtXnvwUzzP7A_ zSXxQtjLrP9?#bCEtG)rW)+nTK*=(+?bVn#zv&P>2k;QTP{QIpJv)Imp+@im0_;~e# zw_{n2qZEEPNfHC)pH}_jgJHiy%GGWmPYgt4`3xyO*hw)w)W3l1;RiibowlJnPP+14 zkHfH3oVz=LU;@V7@!yIE3SJuoajs&oI~lS!SSyOA+*xkJ@LR2sjUi<~QB`!R&GV8S z{S^#vokCr9+Nfx}041w>Cw}NUdVB!>lQo}iY>aoPd5L6tkxI6gDG;RZy~XnFz!YC0 zerRHW^V&`912B)v*jG`(u;X78==g_txPlD7*Nv*dAsH?VUqegGw-8EwDC;Fn#8YMn{hJeyI?a84Pj2g zUMJo+iEG0W0*U)gQX>ziKJ3h_2Sazvhd2PfJ+`U zPyAZuB8*FC&)nw#^39_JOS|)W^Kp6M#!IRCQAOOwXWtlV80Lv0xkJimr)xDw@P2;1 z=4-P>dPk2v&M;CX7^K>v*Xo~G%gAqFd80pK+#f2?dUyK;^HpdF=|$alm*%k4juS%u z__m+O(p`yhUX2c3E9BFVw8=l(4ZqD{k0~ELoe(ZLjArc{P#))BSZHwy zIxRA>uXR3|>6(3y;3JUtM~@pmd8Zd8fcQG{G5jV%UBcw)HqwMLSkI!qD=`G!4E_0m zH-@sxQ!nN%2qFKMO9u_G8sbA3fIDUh;vOz_x|$fJ7bGk%N1`jd(t(z&v_V~IbSjYP z6d=fCEQZ?Zr~$9O6?8tNSR@yEJL?hQ6SitX@I#>xW?M-dmT(pCe-qZxT(W@>MP+Q# zX&t2-XZhz-pIx@|H`Dr-Z3k1MJv6-)WwGdH4Fz?R*S1(F1z28Y(XMS^(6@KF(8FS6 ze17xAYI|ta?X;2Qno^F3PQC!(2>8jp8B7ic>_$BmYOH9D4jPm84RGTy>-o7d9cESp zcp8#8h15=Cy{H&>?5n;Jyb3D?h50(^s)D0Jluzo);wdd-@z+NR? zTbd%ElVV$F+I;rM#7h&L3J1(9!j9asoeGZK?r+>>F@8U4 zfOHp9aEtSvHRf*4T=IzY ze)?K9B~41vubGz&0HH4#-<+^K|9Zt3zldf{lu3lGMT!#%+KR4(w`Lc0czPXE3-n6d z<4vY$mh#K;y2tfkcIQ0Bqa7jz>AVu^eN<^<$9Ai1_AHqC3~$8SUmDn zuCazn|JFmt*R=zr9Bf5$da2d->Uw?jwC`LWjJ%-}X_K0~sAituH_PX3cvlG;0xc6N zYC30s9KWb#GUvI`6JMk=#G2@?Vm8`_cJljp-ZAWa!?%^eeo|3AEpYb8;3JIG2+T~S zZtnXYrz+uhnsf6uBOE*lR4?BfB7D(>UxyyUx(Fk zYEqqDM@#{Rbl2Il;37_5PzqyHp1mY!?ZE?df22}4U;-q@Z```CWgB<0v=hS zH=lwXGzY*R{y4gEBz;uDIGbp)O(G`fSW6crY3G*ltZ%v*8JG`yw-Vrr^Xpm017j@j z;;XTD%n1~hrhWvBP+*}0x8Nzh@^~g<+FU`JyAQ_fU6v;H?p`>e4Sdc%V zmi<~ty2}!4H~h%OhurZUEpkAt}`n1xOEwGtA|EdfS)CVo>_}^Zln#mx>(qF|!w9?lh#-FVV`%WVssxznnRF8Q@mxyoO2d9 z>dIwOt?D4b@{T~|dHH$-hr)ebWZmOCIX|e5zfgznJeYEz-Gz1%Jv)2;HI?S{Oo&sM zOojL6dR%{kKf3irgSO6oyaOY*^VkAhPo=8{Yc%$ZC?$M!3_u}`qRF+iPQyfpun9K; zA0E0)6oHg)Go9kdD1IDzu8#zi$!9g?b&bncKe71Sb-Khi8tKg-L_g5)E4dqfX(Xoq zq-70du>}WD?FR8L^9eJ9e=#j2T^1gR{k3!yXU`;n^Q$oTNvdcxKVdV*9~1)JBndZ* z4Kq=xp72XBC;wr%J=OP>1%cIGXZc+NodRuvjJX7sbcDss#%CZfYUQX6=VKd>nM0M0 zxw+39!Rmx^M0R+u{p+?D+C)Fb`_VKlGhZ)YF7%0Oe4)U#RIbPxD^p)WmYwh2!irRJ zA7KYljk>o$CUke0M-in(cL=iR8EvkTO=6kX~}P>0NKsFhbnt zWnjIFe#qC?+QyRPqg4~jOj}HQ1#R#%B@ly~3`vlHb&<|3D}6_Hf(zx~V`7OVQ&{eG z3fC9sNMf!rjlg653H^thL}7$IZI(L*|1>|PgW&DG9lPG2XAjolM&hehwdNI zdQpk(uVTwt`iiJTf6D1zSY#_VC9bT?XOh1taYU!Fc}MgD#U~is0BrGl4|`G;6o_M^$|v$ln=`m=zg2H%!?41X5L0_wi7 z@|R4|QdPbnmQM?-h4WR)90;Ba!+Y>C=GPhELak4PY??BBQ5K0OA9|FpR^cC?U9r^Z z%+bor4*@(aeTV6;qHf=PjvopYt++lqw6yW~unizq7Y^bkcw(BLoA!b+(?6n{bKv75*WKSwb^$d6!tD979}b8CmecV zWd5`q{#a5`q*)38V{7$*Pr|Rl-tS6A=Pj*RAz&=CV5&V2&lZ(S8A9O|eSbS$M#l&rZSp<>Qo606Fh4h9YLCsD<3^^>RgH|n zek{eWHEGuH=Tm;%v=pfp>t(=_ofgJODS(|w?DNWTKhSyT^mSn%^x+ksi%fASt?^1) ztO>_wEn?D9x09;=aPQ_CE9(~YLy-3=d#271P#1Ggrwkw1L2kEj&8 zA%tu=(D>*YekyBsa-Cd^J~cb|Ib`Z3iE=5`B>C*w+}hXtq?KXxsSFy1__{M&0rt?| z+Wy=0mNcy4fKECJ^oCpp1__CUV5M(2YNrAsQx3Tlnd4rPIIcHMmZOP#2QggomB44Y zr8qeR2|8QEDKK^awxLINks`F5&S*0sIN$d%Z{}V&Dq;{R)6@D*ICe#glZ~gKR1?-u zQXl;%${kC}8YRZ(8VM&^o*f{R$~WB@H$g>zBDG@;x10DS9V$=PGzO&CQCaU<1CPQc zr!t@(=pVd>9Ig7UQ_XW_gJfHe_D`q^9xY$_cM!CEy|Mv}f7I^MMzd)tX4^YG?WeIX zhNmp4-lNJ)d68*6}tmFI>b0Rk0iWF1c{NDHJTx@;l zk3(VQzQ*q``jqMf?Z^eoHzG#ki&d6i->1<2kuvH~dQxHis*~?9g&t$21Z|Z_Qwt;c zepraZJ;Gokhul{?g~WhL8mBB+`J1d2gU0LYoja7h{?)2T)=amv#Jw|MwvAb746^^Hoa31A)pZ?)LV@q%_6!k)knq_X$)5Lh& zD!jtXIj=(v8XalGj|e=rI*Hm|i2lS8>g|1dohu!TvilYKH8gqZGFw$L*&+XgsK1#o zW~p??r1(A9H`g%k0Q={H2T@3kvI2GM7FF*KM-&=YY!IOVPg0X=K@39I8FSKp)eC37uJY*XXV@^cla(_uqVV)9^)z4kyk6P;Adwh}xq` zuTHnl7intB0;rizKiA5iX6Jt4VZh8Wtrh}2`h@V?vMm!n3w z7HYiIxMLOi%5xpd$;hY#vT1)d3ub~>!yMcj)4)|!i{FW2p&Li8A9l9kb>~kyx6gZK z-$e8VJJ&XYNl<;r(r%sFvMJvEKLNI>wvp%K%;h$>1J6mNd~mWKXEfj7^I0)pA^`WZ zhp6%96fZIjdfR|i8*1Xqdw{3gkAfJd6YjlYuVO=(e*fjNizf=Ji0dkZf~m^ZdKtp= z#`t)x4G_(i@zqCmODE=6x6;61_fc~<=|`)Yuqtd;M7||x%<&0rqup(2+%nP)nWgT* z1`*ED%k!an%{IwErGL^LDZo)ylcOw_QXOCc4jo^p9)8pZ`)d*<#Wja?-s@-gAvTOFJFy~TU<{ndTT9x=$Thw+RbV*}m=0=?dZ3N|?jwh(D) z0O~^EFxIwEU%?^SMt+9_W3-K=Km5mBM#2^N{U7v}sOq_|fd_=7Z?yX!#00-{oOb~< zl_@f`1q34rt&c1$8k@CTTroa`=$nOS>T;AwGY+FjzJh;7Jf<>LC1o)S9j^fc4ZY3Zvxc0}}FA!}-m2Lknl-GwC$JB*%0eZ48)sY>#) z{duVhK|H@f6&lSH$=w3Jz}zGVkd9p7s%)GDXWS5VBZn&vwB%1=HdxYp$))BCvl~y9 zf_h}{y=_H?%-NL3j1W8x-mo*&@n?^s>CD9*Ql>0msq;?B3R;#f1Ly|3GS+#3z5xnQ z4vp)wFtFNy`|qZ~-;)k9nW|@j(k8xV9<2a`(frwGZUx$d-RtpG^zZTYkNfs@*oXPL z7}QBC4}VNb$PaEIKKLODvyYB*uw%BUZuP89MI~7S8PLc@O^B8NX zhy7xrn~(8JrRb6%I#e-bhhG&T7!2n&r(vHzsMm;|L`u!MwB0OR&GB*LT~`jH+B>#` zGl$gU7{UkPc={PSzhcV-w}rWwlG1}@g1w^c>n%L<<>&4vJG{QQ*X+Z(U&j zCV&VT-;l1J(rQV!3+*GZa#u@ToPa-3TcEW4_o-p#6>MBzNP3*AcAv_3YkxL;8lc&jhS_d0;#_B(fziyB z5wH?a1L<6!pTyT7WeOF@2$if|AO3U_cI@YS$ju~=x1VGFljqxC97pQ~@Lu07J5j_; zpV13&;Uwr}=g7v3n`E-Hr8U>*H80iGhQLbMUHkcoM*YdQ9!H)9VR+)~w#&6Tslr)` z$LOVE9++7vr*pMr_pgZE1KYKmyAk_OUbW$_d}Hl~qF5uQbbGmsGdC=9)StG^XL7 zS|%!-(%mjiM{iIPEOAxW9Y2Uw}FRwnfeQ>VMDX@K<=ERUx{dUt z6E>By{g2;il{Y)+3`yZ(TNds(0~6(;UnK8SNScBZ+v563iModi zM^{;cvtO*KdUFO;5}vi%fC%yi7>u5%;LcG!6)aWJLPj6WDeSF~{ieO9OI>$n= zXXxwl<<#0M%ZLm)7N($el$G?bhnbUYQ5)*7vVesNgke8R)JyELvnhjiyESGb4D|8P zFFIOI!Wy4hKiN)dL7@U)YIK_}tWPlId1O=bjn4qpb?SHSj|4zkTF{)hvETj- zu(1jH;~mWT*O-`kdf$Ty;B$Kb)60tu-9N}?P|i}SFLPuPNsRjVbs83$%tp6*Q!BCYr&~f7qzW{W3c|;jpz=s(1OWS+Gi3H` zm^pu({D6G-Fk1L+)n838FV4@ewyU>SRXCSPN*Q`C-Y@NJ+y4 zit^kH`p)e<C<#xHcZRo#q!MB|{YefUwnU672OlLSHCPpi2-{loKQt1ConVa10Q)j2RLt88?YtJ@EX3tik6 zyW1fGy?M{jn6)QsbdaY1KiWIbsHUQA-v;mZmQN*dRF<|nXH=j@Vs)K zyC0Q4F@9EfZ7(?jpY{Klu!B?2j6H0egwVp~%&t9-oD!+3DPe!x{>uJP!0q*9zXyUO zZcgY+XbW-#?HEGp-jwOkF-o@%?;SLd={me>Sq=EH!(6-ZQF5*`r**ITbW7LPVbpJ7 z`<*uPhSe9P;s5_1G6Nf8j=o`k9VC>u1p-O2xtmxZE%a|doqfE-99?{zT*ZRD5P#Qy zDys$~9GyK~kq{?WxVyIs?{aM;FT~wNh1XnGUqT+I6g`i=Y{+=L3*n2svT7bvCubysQdW2LS)6H zMV%!iB_VQhVv;hz)@70+5Ge^sDRBwlPfk=)1}ZBDm6C`2^TP`}0~{&)xwt`%HMIU& z9q^wD?`foBPAsYScv+Ecq1KyMZNv`{!z$(l%wJ5 z@9gJ}K)U;QLypRIbn*#6s_^n2RrIgVKhMhx@vn-!{r|}hpeP>fh!B?)lMw$`$v{SB zfC*IH&(#s><7eXIa|ia1GuLwWa}DzG^Yn+P-;#q|Hh1@S@d@%5QWpQO=Krq$-zB+f zI3itP03SKgBRJ9~60%SkS*Wz4)ql$W52OE*UEjyW-7Vz*lwA=jCHK$l|HW-|0T}i@{Wzq$X96#tJxPbxVU+!I_U zxQ<2OSjH#nI>B`;0>?5wQP&BsV-Yx(@rk-la2<=lv5ZgDb%N_y1de5VqOKEM$0Ben z;}dnA;5rt8V;P^Q>jc-a2pr4!L|rGijz!>D#wY4J!F4PG$1*-q*9op;5jd9diMmd3 z9gD!Rj8D{cg6miWj%9qJt`l6xB5*9@6Lp>7Iu?Or8K0=@1lO?$9LxAbT_?DXMc`P* zC+a%Ebu0qMGCon)39e%iIF|8$tFANu{<(*%H}D&eAmGOw;t`2MAP@wktD$Ccv;kRA zx{GEdmNdo^;uy!TgCM&^`zXh?6{1EK!Y1+d@}tXV9$cPd(mZQ%myymWnpf=xzvfL{ z!z3=2v$|hWo<*0vHR5-Cx4G}@UE8_Pf!r#dYp4#xZ>_xsw|CoCzgnDyRnPS)65a6W zkN@t5*Vb&JLUy!EWr12Y*~_CO6E_ZrzdPi)=KcSd5CDPJx+6E=%`BuAX2cye_vrmr zucgr$>Wi9iR`N}<29OA4-RX2{F8A=eT>&x&I*zABQ%to>Oy0s;OUF}4(7$pD-wwzl{jHvY z;(~)FT$MJQHdy=NgdJrAn2TEGNm5CMqfNA4jCwqH(1pXWz@^8MqNC@*J9~K;-4f^1 zxz{rbHlu6<+bdeEIMeLQEb4MvfvhKF&jfXAELcZ#lM|B%-NdNeC4a|*-!&7)3be zw#aH+%AAkR=k77^J{T9v8pD@`fm2X}GIi@-lEJ_WY$z2f1^o7k)vs4IUi5z|?#^rR zV?*g)T|`Bk-&R6Yk|qkpY}c+%HYtDG!BR_gbO$Z4EToZ=dv5KC0;E5P=u)Y)Mk zowE2Ilb?+_1T9gEQI*V3(R(2SP5F&}<|M>ErQW21v7`2@NE7$HJB3rZ)O3DlVf;1V zTa@0XVA{KfgZ?@{2XIZ4=AH3iFdKKEb``yUMN5b2;q?}Ior96QK0Mq3+hE?!mP*VmN^Yb^UdS;yl7Yk1^pe)S}jbqv~t0rRaeOf^+o% zD%6baA!sJ|rTu>5qfZU<47X_BKI(V`fSVN;8x{|4l!b+JwRU~_=>Doy6OI|X{JXFE z=;j18t%%J`T8uX_r?3WCOT$LY1J4qh#FLbB)m!{iYeW$N$N_CQ+UnX8s}fnNCfqO) zFLraoW!DrL$cst2QS16*X2A&sEBGO&D%Z3z#t<&jqyW-@PYZU<4TbE#sU8&m7Q1%c zwxPqS#Z#lRoCy(v+?;2}K~GtH*j`h|4&Y+HXJM>0;MH;XhSKe!hMA9dNfTm|xP^~- zz71pB%K?2sM-9D(+;kYHf;6)XW$WA>Wx>S?OU1{MCPIi!pRv0-#Ay?M-mtD)*%L_~%4Hx=uBuIf~u$<{KBa zZNS-J-E14QR5`$0%&2|KdwPH4E)h)oWV4fe_q9$ z`aVWp<-tKr>u94n&_D*(NHNV;HJk>zLrx92xZ0A9d8@?aH!Kw{HXZ`YPiXnFMTv+{WzB{I&I|yfWv?qp?a)3;vY4gxv4W)(wh4IoKV~@Q)uR z(^&DIEPw%Hp#5h%Dbn+XA9#ha&bpo*s=R_(m4E`n40u%_ z-I;;=%HHJ6LS0M2fJtiLhshR*C6ywmk5;d@)}h4y!dcYf71xq*eGw^3_ji}a! zi$B7bn7VNhn;PT6)R5-rE>UURS$_(9tyRpXj>S1Pmo-o`YwHIOq$hdqz`mZv^ZQ^u zViRGK5IUwZvE>%lJ2qmkIk#0XU?ymfE;nPz$rI+2l>#FysI4F9Nuf_KFMbO=M8G&v zDi^jdN%)ZJ8^IwR_4-kE`J*)J#-bD=<7PQ4R*6cpYe~xJWj1cR%hFeGp7|9zet9xA zOlkbn%z~t=d15>`h=UvUq^QHz+%29*fR}Q(szYJ`Vnw4+?t;g@GWv5T)V4r%U@(S$%UQrTJT1r1<|06?G-pb zVQUS`=Zd?%Dn((2QpKo5Zxm)|B#1st@1Dy|xMi@)JnX?LfOlkYXk^UySG~(MZFnxJ zNv`mL(+f%SJxpM+WreCSUm7U9th1TQjZ)n+-mfW)th;U)`I6*#J9+3u+JVid3S;?x zS?qO^;kYpNp?*FSlo4es0}VS>Ufx&O-#VOB#XWd_KL_d-{>nXkTWED6>ikNk6cN%~ zM_pRu0wc~y2>HibQVER=>CHcDFy2?`-DC3BqWYBmLe5wkR z6-{w$f1>`7$S^_`v-))KlvbNN3_QEBXF*z40^i!MR4fgws4{-RUICgv@1nF4i;HD< zrFw*4y4&|-SHKvZZ_7!}stxa2l$c!xr1U)jJa%;z6KU>7*WYW_L$IShx1TkLrhqJ~ z74*L=RbL9e6<}-#SL%IMoT+YJ3jM%bf7tORZhdgtLW14$&TUsJgf3~Cr1N6iEup{o z0Z`!U7tS>*`i(w41j=Zwf-G}g`)^B6)M&~|PRYr`!tvWi9%-V`+M9rOSaU|dE#L1e zfMzZ9mXjvrh)uE4TYLeHCa^UgS)0BEC|dj*P6#v}%(R(c_;Mt|jpB^?}u zB$9Zvt&1a5{7&Z=eli(;u1_}m!92Mx$IQOVI5O3RpBR&CrSkr=x}V$k>V~r@uSh$- zcl94^57Y8Us$=UPh4csaRL4sgriYpKGfLMW61kV7jIQ^*-LRfqyrFv0l58&+xhXM@ zB&s)C2jOCAvoNe=VLZi@EUgO7SM(_|;FC@<37P%8Iw{UeoH6v-7`Nw4BF+XkX$$W} z4&BHx(=TYlyR_^9V>1V;{;oVL-$GwH);tR{$f`CB-0RllxxHj>>h8(}l=gDA#4gUS zPq_^nl^6IXN4*HO@)!7>@=pHh8S7Lif4_Q^6l|eyPEE78RyK+2OZ{u+z8otucg4Xr z`=m2u^L*|!`C4#Qka7%C%HsUTs^Epp)q;cNU^YKzLEmVbf&K?#C|U;nL816Uv6tG94;w0MY!T?0 zV;oq*cwU$fHRSo4%`&;QCC!3eI$3n_X=?bv*O>(?Tx_566QLYR3kW)R+3miWa*yRb zE^l3W9Ro?&NTz~TAv`%U{?NtDbr0tBgd)Tv8m}ELPQehGhFA+YaOha z-u^|0`hi^@jPTOc{O(%5*);N~$M^#dOW!mzr+762o-+8uX)bN0JX*iP)pO%1GYh#b zH%DpMOB!YTs&mN(M3(da+??-M5a$}klhgVP4+wizbulG^W{iNkm(nM+x!K<}f>Ip-j z1@MHS4c~&BG5iWkKKP(YZJ<>p#VJ4JPnO0fD_QN$G3Cd9S(ur6{aRzx?I2_k6k6+d zZqnxZ^89{u-6NlPyuo9<*vN$c9uM_f+Y6-{%!1dpv{Lx}XG|+sBa_Sb{e%(n2*WRI zHH?qJ?*hhuwk`D#ers?0>m8bxi4y$h%@+(WJusvpQEW%(z*GDUkbt4P`05hTMcSE z8V3)bC4h4o>zm77#QbK=7&{H|zRu?C8)|>Q+T5-~#-Jeh%QiyR*vC(LTp`D7z`sSe znKjwwb9=N(veb=cmQ2b@`ED|n6l9Rt3ZBl{mZq+GyG*IqiipaG%vD|_wL>LKpkm97EmbQUnNtm=<#G?JV9~n+*N?T za3_3QJFjN*>sx9IR8<2To&sBfi|tGR4}#dZ-PpJrp8olQ(g?LPT6)8OZ$Ytl{z44D z%T#d0dS#Zre%ofd3_qNF^6IrV{bqqC6Hl@E)4dd=(KNFUn*u8KvzLkLgj+~wW8a~$ z`IlfW!o3cwn$WE6t?~g+j8#aZrO+!t8y=q;bNN;z+pW3r^MNpB)#T_S&b;#fcQo)KM1QZ9LF#cPnA&JZ^Gu~O=!$M{DB9;`j9>=WZ=!!2$1S)_w)wS$?BZ&Xnpu*U0ho7SiS*AuKX~I zf{3HRp=&q%j-zCkqmo`5{ph~Hv zcZsUiTUzj8A!p~LTTL})aol|ST5gbyu;~6PPTbmIF|9;gtWYuc0F2nw)I+${%IZ+L zM(fowXponf2pMDC&wh=Y1unyYz?=cGNl(2YNU1#3S`KRkI0=YbKW{J+o5r#*jnsvO zid!-pDvE3|-?A{$E!Am~3?Zdw3WUFE06cuBY-?nziOUd>Ofnw@YLHo zvuks57=`f@TBFH zM{29-F!fe5H~lJs#pQ+acVn0BGPih}58Gcc2^Ftl?uXE)j2S(xGORQi1kGCx(UwJW zp=_BH2DZBmKvF5b$b9C60ZWdb`B|7P$z2a?4ZF-|G4#4<8Cc(bPGtc5`GVo%!T6Q^ z`OA%!($p!eFGaCZFl82$3YmLTk6!gNJJW_VI=@vbOIsv~8fstR^@4{}@7f+gd=Zhk;f6b2p;h~aWiY8Z} zwQRlmZ;M#jYy84Il(ILnF?qL7XS9=aMA3F7PAH2tJ9mFxYg=vdd{?fZnJVArEX*1O zT7Zspg>Ot_^!_CJWrU%vDpaW?b6(mNA-U4}rm;a-{&N25v4`jX)B(kt_CLE>xk=^c z=T>CRY9TeTBTvDH;`sEU!c0~;X>$Ua#@kw#T4NMM4&Pb{b(Jw&iqhNndolo7ltu7K z822v^$2`AVs+VMzUOi^(9sa{CZmP;`5QJVpeSV0|%*Lob#f!!LVWgjX^76{`xz!En z1vqDNAmrC|Vv~*_lEOWLhE>qs{)<~aPk&w5#C@3MC6v)*#(WW7-~yfilQCH%tN7Zx$zk~|C{%IYY^2F?H)#;Z)-mr zatQzGb(Pp8+;YbJNsu5cN)Cv_&2|>{MofUaKrqo$RXK<$wl$Uh9{miRp+PUAZbck| z$HZDIPnFy!kqKzRZ(Rv~I(hr;aQ-fXJS->U?Yt0C9c32C%3FNs@HPM>Tlp=@$5qz$ zv!m(w(;hv*G0I`Tdzkg@Q)Gg6 z#`ok1KR<-bAjsS-fCNN#b;BYWKDSV6#eR~WfI@`56ge(UGbYdNEJpsu?~kfNYmKHP z_pIzs9i3EMOhSx!O0{=8W6qdty)H74yi6M}Y1$k~wvhF0<);g0Z=1C8gT5M%X8oKO zy06(#5%4c-+9pK~fB1<>w-Ue+_V&e>>wQBX-1?DJ!Q$NY{eWg5OqW)Qh1$#@IMO?c z{Acgfpi@iNE@E}VHG+2K!wqNp`=8AGxNnlER){kTKGCHVdr5W!j^utEzf!U1aIrZ` z%QFk!Sh5_`HnZOwL8$UqY35fPC>0t7Rz-`H zxu(f_-&xNHRtH%&?hLYqb0`%G_o+|*4;_QZ0w3WoQgijsRslQaMDSOuqg&1Sc)8y+ zb8s(}hDrr6p-^$_yT(k}813&r=e87j&DyV4IVS3IIRjc`&B6%sQo9@fVV?DoKMS~> z%*!z<^=gmtczvs#v(Z3^xVhWzar$6PpD|>ZVoaZlFV$Gd81PiGF|`!t-FD#do+3sR z>UQ{hYk2hab+71thwzWI+ZxDClW`*#g7mk$*cdFnhrpKr7Nw=qf~Q_JD}ovBQa_m+ zx!01`6qEq2S@WQ3<#!-_m6W^E5b6r_DEGx)4hCOtV(W5Y%l5{fYS6CX%KoNj=TGU7 zo6_ZFQMx_%0&t__IJq;HCS)F zvAqS+zHOmb%zgB=@zjFeuF%tjm_`kF6vGWkm@){MpQ0i#bof^HB|Pa52;^DeUo73M zkLPzfpa|w_{Sa#OY;f4Tg1a@@xyO^3j4iV!d--!D{;kf?vg>%6FSztYdpey#bpPcB z52ofG5L&|M?>z`bI3PETUFI+MD>#^s?|(ZuDAy6sv0e%4303%W)4VHbAmW`Pg!n{?YM(lpuQ7{|g-w2q z3*~Uv_cdYMlxW>w1#4U<6;$|AcB{_9qpv+Y}3g@P%!BUitk z+C8viTL+;Nt$n0pGI@VPE*6AJF|)r9e*sGlg`%&wL(n)52l|q&?#5->INsJB;3-vK zqiWJrV1M`Sl6e%B9Pm_c$@|eGXs2c@wZPO3h+ty(&>7miq7hO*ep+vwV%(VD48sH@ z5BV3YOTT|hX6B=OdciIH2W}e?kyrvQ(%4j=d4uq&|3|HP z)xxw}a}R-pHF*6n?8D#KxANYq2RkuPR_lwHfCNb{7;Ln3&|t*_-b4fr&gBfh;*lH7tdCMR6z{n zX6-Ul%SnNvi<@3)`pC@)z{fW*<6d8`fSCcZytd`-GDXE81*`DD@2T2;iWJws+IGXn z2tXQ`mJIhSyiQDNVgs8f#3oiv0UiXe+5`-nD&0B3?oc$v(xs&uPm7E7KMK6q3pKO_ zQZ~}>bnmGXYBb>HYUF6C1nGdoTG&PHl%QMlZSih>wNqIK{gYyLjpjI>h&exM3!%>U zrde4Q{*6BN@^@(d6n>d6wXINiL(?JIMs(wqj}YcX$0}CK9n##EPq<5E@g;g)fPx_b zpYeEI{tuGcSvhW9X746}{1p($N+K_?&kv8zpCjsy%dC!GV8}PUTF>ilOEu@xG$VqG zO?Q6jrBS?Uk$525C1KJZQ1?>XEW2?1EotJ#lW8MPKnU40@M=%wCemdX5yxV|b$U6jH|!oO9XB^pd(9h((W!C=00!**wMHt=Fn&ea?dN)k}p` zw}N_h(>MJ(jbyLXb_-j{bza|nJ~$1;U_Lq5Ju3H}knaI`p4UA5ES!a@BW3f@wuzFiv%*x z)b-8BX~PARrYROy`^bRlf)v3W*=AiqQ;Hr!NXxBAzMAy}(uDge@__ArsDrm0UXo%6_}=Tt2d zRK0O7c<@>eplRg^*;iOlw#*j1O-42ToQEln@%n6>0d&jcffBIwIhEq&+tHV%t`0rEk$^vd zK&^LK0Z&K^xp^n&qE2G;VyFW!g8@fAt!-rI&Y-@|oj7BZ*dGIL9oyv9##WItUM)PR z6q1Pg#nwfU>+htUM1zMBOA&~NlgKGrUb&e zKv+DReQNb|8Fkq^5>K=3i^5n;j9@4N)hQM4%ei9l(D#i#U%lC|0y3>^%u9DS=Bai} zm~=-jLH*mu0;-LT5cx6;$x)uDUNTZ0BMSsL2qVe4F-$S&xQFf8Pk>N+k<5jwq4xRa z$+++H9NY$-BP<%Gz-+{2gq?ip%_8j7ZL7$95|6A<#Cz&i|0}-F=$zl5(SVEk^@{b6 z+P3V6yi|78rF!={v`H9y3CkJ-1Ww?l%9#yEu@sLCoXdFD%z|YPfdB&{$@Aywv!Y`9 zxUL6CmKBg3Rf+e^T)1sivuYn`%WHYi<$e-vV)Jnd4}L-SfG4Iu3q$M1roHiV7kix@ z*J>v@y1habLSAH=jZyT2pn*6$c(taAwXB9T5rK>4_RRc@rwhGMl$tc76ks~*j7`+c zUu}x1iMf}2(O)seYndvKjT_$~VJ5Gl9?H;3j*VlV>h;>8O?o-CTB=ssE$s^HIaIHm^)Q4qSQ*_QEK zML|k@bL4< zbfx63lo4TEalE>no*|2U5T9@dS+D?+=9i>9u)5~n{u&Uaq~{{9Q~jQ_#p7e(( z0N09d_@ScJllV#c@uR7kRxvy6qm?eQl6e$G4`&vdlWxT*dSGN~8Mmu|*^K~)qr4k5 z^krv`#`4tYeVyeC+ovTcyRW?i8r8>^LpE@>hwvC%oh&DdVsVOKS76xAAWhVa`2StD z6V(m!Jk>+ckGYq0_tD}upC42rY{TR*&$JXIi^Ln@@vZQ*pV3D^$au{arRy z>>k|@H0D%};CI#-*Ekd#k^fPdNr}Grh!Ju IHHW+Z3&=RSLI3~& literal 0 HcmV?d00001 diff --git a/Assets/PlayFabEditorExtensions/Editor/UI/Images/playfablogo.png.meta b/Assets/PlayFabEditorExtensions/Editor/UI/Images/playfablogo.png.meta new file mode 100644 index 0000000..29fb861 --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/UI/Images/playfablogo.png.meta @@ -0,0 +1,96 @@ +fileFormatVersion: 2 +guid: 77e37f7fe73c7db4d9a1702eb4ad411b +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + 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 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: 1 + wrapV: 1 + wrapW: 1 + 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: 1 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabEditorExtensions/Editor/UI/Images/r_colored.png b/Assets/PlayFabEditorExtensions/Editor/UI/Images/r_colored.png new file mode 100644 index 0000000000000000000000000000000000000000..23034255e4e0ee060ab82781e273bfcdd6f8139c GIT binary patch literal 525 zcmV+o0`mQdP)P000>X1^@s6#OZ}&00006VoOIv00000 z008+zyMF)x010qNS#tmY3ljhU3ljkVnw%H_000McNliru;0PH22OONSD1HC{03B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*00D7HL_t(Y$Gz4+YZXxt zhvDbOfaz4!V6;f3AovGuEKf1DDN+d*wjzkwSc`?7`UONmj0Qm~Z32UCVLC|@LDVLd z7zxovq9n#P000>X1^@s6#OZ}&00006VoOIv00000 z008+zyMF)x010qNS#tmY3ljhU3ljkVnw%H_000McNliru;0PH22myF6SZDwM03B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*00C)9L_t(Y$Gz6SOIC3d z$MM%=LT(k6WDQORK|iRazaj^RL(t$FL5NFpG_+a&Komrl9LUL*Ky1lPS_;BioFXNv zB`o~Wa)SrC!jqo*ESGz^@ILSRJ?Hzq9Xpbl12~4&i1?)-eJ#(1F^Magd9(u3X)(Eg zY;I@p6dxmEv(jW6n>dXL+{I{S9t@Th*L&Z~)6y$8Q^C9dlU3tBCmWFD8Bk_bY#i{!4xX&BJi$HdggY00000NkvXX Hu0mjfs}I*P literal 0 HcmV?d00001 diff --git a/Assets/PlayFabEditorExtensions/Editor/UI/Images/r_gray.png.meta b/Assets/PlayFabEditorExtensions/Editor/UI/Images/r_gray.png.meta new file mode 100644 index 0000000..afec6ea --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/UI/Images/r_gray.png.meta @@ -0,0 +1,59 @@ +fileFormatVersion: 2 +guid: 43f13eb24deac4ae5a86c25189272a74 +timeCreated: 1472083701 +licenseType: Pro +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: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 32 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + 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 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: -1 + buildTargetSettings: [] + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabEditorExtensions/Editor/UI/Images/red.png b/Assets/PlayFabEditorExtensions/Editor/UI/Images/red.png new file mode 100644 index 0000000000000000000000000000000000000000..59b2be99a023891bd4244697f79761a7d46e5efa GIT binary patch literal 2860 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 literal 0 HcmV?d00001 diff --git a/Assets/PlayFabEditorExtensions/Editor/UI/Images/red.png.meta b/Assets/PlayFabEditorExtensions/Editor/UI/Images/red.png.meta new file mode 100644 index 0000000..43a1aed --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/UI/Images/red.png.meta @@ -0,0 +1,57 @@ +fileFormatVersion: 2 +guid: ba384a3c945464600a4046641bb57ca3 +timeCreated: 1470788284 +licenseType: Pro +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: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 64 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + 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 + alphaIsTransparency: 0 + textureType: -1 + buildTargetSettings: [] + spriteSheet: + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabEditorExtensions/Editor/UI/Images/yellow.png b/Assets/PlayFabEditorExtensions/Editor/UI/Images/yellow.png new file mode 100644 index 0000000000000000000000000000000000000000..baf1eb3c6a4934924f0e1aec008dec06f6768849 GIT binary patch literal 2859 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 literal 0 HcmV?d00001 diff --git a/Assets/PlayFabEditorExtensions/Editor/UI/Images/yellow.png.meta b/Assets/PlayFabEditorExtensions/Editor/UI/Images/yellow.png.meta new file mode 100644 index 0000000..f2af5e3 --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/UI/Images/yellow.png.meta @@ -0,0 +1,57 @@ +fileFormatVersion: 2 +guid: a50d8da0637a640dda5e2018b972cade +timeCreated: 1470788288 +licenseType: Pro +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: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 64 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + 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 + alphaIsTransparency: 0 + textureType: -1 + buildTargetSettings: [] + spriteSheet: + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabEditorExtensions/Editor/UI/PlayFabStyles.guiskin b/Assets/PlayFabEditorExtensions/Editor/UI/PlayFabStyles.guiskin new file mode 100644 index 0000000..2ae9816 --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/UI/PlayFabStyles.guiskin @@ -0,0 +1,3539 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 1 + m_Script: {fileID: 12001, guid: 0000000000000000e000000000000000, type: 0} + m_Name: PlayFabStyles + m_EditorClassIdentifier: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_box: + m_Name: box + m_Normal: + m_Background: {fileID: 11001, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.79999995, g: 0.79999995, b: 0.79999995, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 6 + m_Right: 6 + m_Top: 6 + m_Bottom: 6 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Padding: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 1 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_button: + m_Name: button + m_Normal: + m_Background: {fileID: 2800000, guid: 83fd25cf40b81429ca784df9d37d32ba, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 2800000, guid: 5f32aedbadeff4790a54248a66f0b89d, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 0.427451, b: 0.12941177, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: 2e064f0948b52496983fa0597fa61a0a, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 0.427451, b: 0.12941177, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnNormal: + m_Background: {fileID: 11005, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.9019608, g: 0.9019608, b: 0.9019608, a: 1} + m_OnHover: + m_Background: {fileID: 11004, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnActive: + m_Background: {fileID: 11002, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.9, g: 0.9, b: 0.9, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 6 + m_Right: 6 + m_Top: 6 + m_Bottom: 4 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 2 + m_Bottom: 4 + m_Padding: + m_Left: 3 + m_Right: 3 + m_Top: 3 + m_Bottom: 3 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 12800000, guid: 96e17474f840a01459f0cc936c5d4d9b, type: 3} + m_FontSize: 14 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + m_toggle: + m_Name: toggle + m_Normal: + m_Background: {fileID: 2800000, guid: d20c53c8cad21024091aeed0b9bf2a0e, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.89112896, g: 0.89112896, b: 0.89112896, a: 1} + m_Hover: + m_Background: {fileID: 2800000, guid: d20c53c8cad21024091aeed0b9bf2a0e, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: d20c53c8cad21024091aeed0b9bf2a0e, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 2800000, guid: a2f13c216f2649d49b892cade7f4e5f0, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.8901961, g: 0.8901961, b: 0.8901961, a: 1} + m_OnHover: + m_Background: {fileID: 2800000, guid: a2f13c216f2649d49b892cade7f4e5f0, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnActive: + m_Background: {fileID: 2800000, guid: a2f13c216f2649d49b892cade7f4e5f0, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Padding: + m_Left: 15 + m_Right: 0 + m_Top: 3 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 20 + m_FixedHeight: 20 + m_StretchWidth: 0 + m_StretchHeight: 0 + m_label: + m_Name: label + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.9, g: 0.9, b: 0.9, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 3 + m_Bottom: 3 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 1 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_textField: + m_Name: textfield + m_Normal: + m_Background: {fileID: 2800000, guid: 5f32aedbadeff4790a54248a66f0b89d, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.24264705, g: 0.24264705, b: 0.24264705, a: 1} + m_Hover: + m_Background: {fileID: 2800000, guid: 5f32aedbadeff4790a54248a66f0b89d, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.09411765, g: 0.7058824, b: 0.7607843, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 2800000, guid: 5f32aedbadeff4790a54248a66f0b89d, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 0.427451, b: 0.12941177, a: 1} + m_OnNormal: + m_Background: {fileID: 2800000, guid: 5f32aedbadeff4790a54248a66f0b89d, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 0.427451, b: 0.12941177, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 3 + m_Right: 3 + m_Top: 3 + m_Bottom: 3 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 12800000, guid: 96e17474f840a01459f0cc936c5d4d9b, type: 3} + m_FontSize: 14 + m_FontStyle: 0 + m_Alignment: 3 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 3 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_textArea: + m_Name: textarea + m_Normal: + m_Background: {fileID: 2800000, guid: 5f32aedbadeff4790a54248a66f0b89d, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.24264705, g: 0.24264705, b: 0.24264705, a: 1} + m_Hover: + m_Background: {fileID: 2800000, guid: 14a4e823a9ef94dc18a71decc8453380, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 0.5586207, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 11025, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Padding: + m_Left: 3 + m_Right: 3 + m_Top: 3 + m_Bottom: 3 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 1 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_window: + m_Name: window + m_Normal: + m_Background: {fileID: 11023, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 11022, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 8 + m_Right: 8 + m_Top: 18 + m_Bottom: 8 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 10 + m_Right: 10 + m_Top: 20 + m_Bottom: 10 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 1 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: -18} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_horizontalSlider: + m_Name: horizontalslider + m_Normal: + m_Background: {fileID: 11009, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 3 + m_Right: 3 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Padding: + m_Left: -1 + m_Right: -1 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: -2 + m_Bottom: -3 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 12 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_horizontalSliderThumb: + m_Name: horizontalsliderthumb + m_Normal: + m_Background: {fileID: 11011, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 11012, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 11010, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 4 + m_Right: 4 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 7 + m_Right: 7 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: -1 + m_Right: -1 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 12 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_verticalSlider: + m_Name: verticalslider + m_Normal: + m_Background: {fileID: 11021, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 3 + m_Bottom: 3 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: -1 + m_Bottom: -1 + m_Overflow: + m_Left: -2 + m_Right: -3 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 12 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 1 + m_verticalSliderThumb: + m_Name: verticalsliderthumb + m_Normal: + m_Background: {fileID: 11011, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 11012, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 11010, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 7 + m_Bottom: 7 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: -1 + m_Bottom: -1 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 12 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 1 + m_horizontalScrollbar: + m_Name: horizontalscrollbar + m_Normal: + m_Background: {fileID: 2800000, guid: 1c8aa345bd7fe44b88cf00b2f6b82579, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 9 + m_Right: 9 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 1 + m_Bottom: 4 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 10 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_horizontalScrollbarThumb: + m_Name: horizontalscrollbarthumb + m_Normal: + m_Background: {fileID: 2800000, guid: 9427eaf0703a74a008e9f9353562df39, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 6 + m_Right: 6 + m_Top: 6 + m_Bottom: 6 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 6 + m_Right: 6 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: -1 + m_Bottom: 1 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 8 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_horizontalScrollbarLeftButton: + m_Name: horizontalscrollbarleftbutton + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_horizontalScrollbarRightButton: + m_Name: horizontalscrollbarrightbutton + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_verticalScrollbar: + m_Name: verticalscrollbar + m_Normal: + m_Background: {fileID: 2800000, guid: 1c8aa345bd7fe44b88cf00b2f6b82579, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 9 + m_Bottom: 9 + m_Margin: + m_Left: 1 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 1 + m_Bottom: 1 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 10 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_verticalScrollbarThumb: + m_Name: verticalscrollbarthumb + m_Normal: + m_Background: {fileID: 2800000, guid: 9427eaf0703a74a008e9f9353562df39, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 6 + m_Right: 6 + m_Top: 6 + m_Bottom: 6 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 6 + m_Bottom: 6 + m_Overflow: + m_Left: -1 + m_Right: -1 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 8 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 1 + m_verticalScrollbarUpButton: + m_Name: verticalscrollbarupbutton + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_verticalScrollbarDownButton: + m_Name: verticalscrollbardownbutton + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_ScrollView: + m_Name: scrollview + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_CustomStyles: + - m_Name: enabledButton + m_Normal: + m_Background: {fileID: 2800000, guid: d03222342209e43daaf2ca8d1364e47a, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.58431375, g: 0.6, b: 0.58431375, a: 1} + m_Hover: + m_Background: {fileID: 2800000, guid: d03222342209e43daaf2ca8d1364e47a, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.09411765, g: 0.7058824, b: 0.7607843, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: d03222342209e43daaf2ca8d1364e47a, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.09411765, g: 0.7058824, b: 0.7607843, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 5 + m_Right: 5 + m_Top: 5 + m_Bottom: 5 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 12800000, guid: 96e17474f840a01459f0cc936c5d4d9b, type: 3} + m_FontSize: 11 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 1 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: textButton + m_Normal: + m_Background: {fileID: 2800000, guid: d03222342209e43daaf2ca8d1364e47a, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.58431375, g: 0.6, b: 0.58431375, a: 1} + m_Hover: + m_Background: {fileID: 2800000, guid: d03222342209e43daaf2ca8d1364e47a, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.09411765, g: 0.7058824, b: 0.7607843, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: d03222342209e43daaf2ca8d1364e47a, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.09411765, g: 0.7058824, b: 0.7607843, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 5 + m_Right: 5 + m_Top: 5 + m_Bottom: 5 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 12800000, guid: 96e17474f840a01459f0cc936c5d4d9b, type: 3} + m_FontSize: 11 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 1 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: textButtonOr + m_Normal: + m_Background: {fileID: 2800000, guid: d03222342209e43daaf2ca8d1364e47a, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 0.427451, b: 0.12941177, a: 1} + m_Hover: + m_Background: {fileID: 2800000, guid: d03222342209e43daaf2ca8d1364e47a, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.09411765, g: 0.7058824, b: 0.7607843, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: d03222342209e43daaf2ca8d1364e47a, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.09411765, g: 0.7058824, b: 0.7607843, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 5 + m_Right: 5 + m_Top: 5 + m_Bottom: 5 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 12800000, guid: 96e17474f840a01459f0cc936c5d4d9b, type: 3} + m_FontSize: 11 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 1 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: textButton_selected + m_Normal: + m_Background: {fileID: 2800000, guid: d03222342209e43daaf2ca8d1364e47a, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.09411765, g: 0.7058824, b: 0.7607843, a: 1} + m_Hover: + m_Background: {fileID: 2800000, guid: d03222342209e43daaf2ca8d1364e47a, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 0.427451, b: 0.12941177, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: d03222342209e43daaf2ca8d1364e47a, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.58431375, g: 0.6, b: 0.58431375, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 5 + m_Right: 5 + m_Top: 5 + m_Bottom: 5 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 12800000, guid: 96e17474f840a01459f0cc936c5d4d9b, type: 3} + m_FontSize: 11 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 1 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: pfLogo + m_Normal: + m_Background: {fileID: 2800000, guid: 77e37f7fe73c7db4d9a1702eb4ad411b, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 5 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 0 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: listDisplay + m_Normal: + m_Background: {fileID: 2800000, guid: 9427eaf0703a74a008e9f9353562df39, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 20 + m_Right: 20 + m_Top: 20 + m_Bottom: 20 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 0 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: listDisplayBox + m_Normal: + m_Background: {fileID: 2800000, guid: 1c8aa345bd7fe44b88cf00b2f6b82579, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 10 + m_Bottom: 10 + m_Padding: + m_Left: 10 + m_Right: 5 + m_Top: 10 + m_Bottom: 10 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 0 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: progressBarBg + m_Normal: + m_Background: {fileID: 2800000, guid: 1c8aa345bd7fe44b88cf00b2f6b82579, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 2 + m_Bottom: 2 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 1 + m_Bottom: 1 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 0 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 6 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: progressBarFg + m_Normal: + m_Background: {fileID: 2800000, guid: 83fd25cf40b81429ca784df9d37d32ba, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 0 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 4 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: progressBarError + m_Normal: + m_Background: {fileID: 2800000, guid: ba384a3c945464600a4046641bb57ca3, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 0 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 4 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: progressBarWarn + m_Normal: + m_Background: {fileID: 2800000, guid: a50d8da0637a640dda5e2018b972cade, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 0 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 4 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: progressBarSuccess + m_Normal: + m_Background: {fileID: 2800000, guid: f30842e29e3a14ecea9b07a2e8f04c55, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 0 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 4 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: progressBarClear + m_Normal: + m_Background: {fileID: 2800000, guid: d03222342209e43daaf2ca8d1364e47a, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 0 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 6 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: gmIcon + m_Normal: + m_Background: {fileID: 2800000, guid: 4f1db872b2efa324c806fcbb54e19e1c, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Hover: + m_Background: {fileID: 2800000, guid: b43817ee9dda16c41a628a705526a021, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Active: + m_Background: {fileID: 2800000, guid: b43817ee9dda16c41a628a705526a021, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 0 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 25 + m_FixedHeight: 25 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: labelStyle + m_Normal: + m_Background: {fileID: 2800000, guid: d03222342209e43daaf2ca8d1364e47a, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.58431375, g: 0.6, b: 0.58431375, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 5 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 12800000, guid: 96e17474f840a01459f0cc936c5d4d9b, type: 3} + m_FontSize: 14 + m_FontStyle: 0 + m_Alignment: 3 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 0 + m_ImagePosition: 3 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: genTxt + m_Normal: + m_Background: {fileID: 2800000, guid: d03222342209e43daaf2ca8d1364e47a, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.58431375, g: 0.6, b: 0.58431375, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 5 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 12800000, guid: 436664d726292a54fa79d2168f4541ac, type: 3} + m_FontSize: 16 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 1 + m_RichText: 0 + m_TextClipping: 0 + m_ImagePosition: 3 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: editTxt + m_Normal: + m_Background: {fileID: 2800000, guid: 14a4e823a9ef94dc18a71decc8453380, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.24264705, g: 0.24264705, b: 0.24264705, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 5 + m_Right: 5 + m_Top: 5 + m_Bottom: 5 + m_Padding: + m_Left: 10 + m_Right: 10 + m_Top: 10 + m_Bottom: 10 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 12800000, guid: 436664d726292a54fa79d2168f4541ac, type: 3} + m_FontSize: 14 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 1 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 3 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 1 + - m_Name: listKey + m_Normal: + m_Background: {fileID: 2800000, guid: 14a4e823a9ef94dc18a71decc8453380, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.2, g: 0.2, b: 0.2, a: 1} + m_Hover: + m_Background: {fileID: 2800000, guid: 2e064f0948b52496983fa0597fa61a0a, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.09411765, g: 0.7058824, b: 0.7607843, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 2800000, guid: 5f32aedbadeff4790a54248a66f0b89d, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.09411765, g: 0.7058824, b: 0.7607843, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 2 + m_Right: 2 + m_Top: 2 + m_Bottom: 2 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 12800000, guid: 96e17474f840a01459f0cc936c5d4d9b, type: 3} + m_FontSize: 14 + m_FontStyle: 0 + m_Alignment: 3 + m_WordWrap: 1 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 3 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: listKey_dirty + m_Normal: + m_Background: {fileID: 2800000, guid: 9427eaf0703a74a008e9f9353562df39, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 0.427451, b: 0.12941177, a: 1} + m_Hover: + m_Background: {fileID: 2800000, guid: 9427eaf0703a74a008e9f9353562df39, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.36764705, g: 0.36764705, b: 0.36764705, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 2800000, guid: 9427eaf0703a74a008e9f9353562df39, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 0.427451, b: 0.12941177, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 2 + m_Right: 2 + m_Top: 2 + m_Bottom: 2 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 12800000, guid: 96e17474f840a01459f0cc936c5d4d9b, type: 3} + m_FontSize: 14 + m_FontStyle: 0 + m_Alignment: 3 + m_WordWrap: 1 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 3 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: listValue + m_Normal: + m_Background: {fileID: 2800000, guid: d03222342209e43daaf2ca8d1364e47a, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.58431375, g: 0.6, b: 0.58431375, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 2 + m_Right: 2 + m_Top: 5 + m_Bottom: 2 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 12800000, guid: 436664d726292a54fa79d2168f4541ac, type: 3} + m_FontSize: 11 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 3 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: listValue_dirty + m_Normal: + m_Background: {fileID: 2800000, guid: 9427eaf0703a74a008e9f9353562df39, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 0.427451, b: 0.12941177, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 2 + m_Right: 2 + m_Top: 6 + m_Bottom: 2 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 12800000, guid: 436664d726292a54fa79d2168f4541ac, type: 3} + m_FontSize: 11 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 3 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: cGenTxt + m_Normal: + m_Background: {fileID: 2800000, guid: d03222342209e43daaf2ca8d1364e47a, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.58431375, g: 0.6, b: 0.58431375, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 5 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 12800000, guid: 436664d726292a54fa79d2168f4541ac, type: 3} + m_FontSize: 16 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 1 + m_RichText: 0 + m_TextClipping: 0 + m_ImagePosition: 3 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: orTxt + m_Normal: + m_Background: {fileID: 2800000, guid: d03222342209e43daaf2ca8d1364e47a, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.9921569, g: 0.41960788, b: 0.050980397, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.9921569, g: 0.41960788, b: 0.050980397, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 5 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 12800000, guid: 436664d726292a54fa79d2168f4541ac, type: 3} + m_FontSize: 14 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 1 + m_RichText: 0 + m_TextClipping: 0 + m_ImagePosition: 3 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: titleLabel + m_Normal: + m_Background: {fileID: 2800000, guid: d03222342209e43daaf2ca8d1364e47a, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.58431375, g: 0.6, b: 0.58431375, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 5 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 12800000, guid: 96e17474f840a01459f0cc936c5d4d9b, type: 3} + m_FontSize: 20 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 0 + m_ImagePosition: 3 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: orTitle + m_Normal: + m_Background: {fileID: 2800000, guid: d03222342209e43daaf2ca8d1364e47a, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 0.427451, b: 0.12941177, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 5 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 12800000, guid: 96e17474f840a01459f0cc936c5d4d9b, type: 3} + m_FontSize: 20 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 0 + m_ImagePosition: 3 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: versionText + m_Normal: + m_Background: {fileID: 2800000, guid: d03222342209e43daaf2ca8d1364e47a, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.58431375, g: 0.6, b: 0.58431375, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 5 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 12800000, guid: 436664d726292a54fa79d2168f4541ac, type: 3} + m_FontSize: 12 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 0 + m_ImagePosition: 3 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: gpStyleGray1 + m_Normal: + m_Background: {fileID: 2800000, guid: 1c8aa345bd7fe44b88cf00b2f6b82579, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.58431375, g: 0.6, b: 0.58431375, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 3 + m_Bottom: 3 + m_Padding: + m_Left: 5 + m_Right: 5 + m_Top: 5 + m_Bottom: 5 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 12800000, guid: 96e17474f840a01459f0cc936c5d4d9b, type: 3} + m_FontSize: 14 + m_FontStyle: 0 + m_Alignment: 3 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 3 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: gpStyleGray2 + m_Normal: + m_Background: {fileID: 2800000, guid: 1c8aa345bd7fe44b88cf00b2f6b82579, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.58431375, g: 0.6, b: 0.58431375, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 5 + m_Bottom: 5 + m_Padding: + m_Left: 5 + m_Right: 5 + m_Top: 5 + m_Bottom: 5 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 12800000, guid: 96e17474f840a01459f0cc936c5d4d9b, type: 3} + m_FontSize: 14 + m_FontStyle: 0 + m_Alignment: 3 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 3 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: gpStyleGray3 + m_Normal: + m_Background: {fileID: 2800000, guid: 1c8aa345bd7fe44b88cf00b2f6b82579, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.58431375, g: 0.6, b: 0.58431375, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 5 + m_Bottom: 5 + m_Padding: + m_Left: 5 + m_Right: 5 + m_Top: 5 + m_Bottom: 5 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 12800000, guid: 96e17474f840a01459f0cc936c5d4d9b, type: 3} + m_FontSize: 14 + m_FontStyle: 0 + m_Alignment: 3 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 3 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: gpStyleGray4 + m_Normal: + m_Background: {fileID: 2800000, guid: 1c8aa345bd7fe44b88cf00b2f6b82579, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.58431375, g: 0.6, b: 0.58431375, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 5 + m_Bottom: 5 + m_Padding: + m_Left: 5 + m_Right: 5 + m_Top: 5 + m_Bottom: 5 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 12800000, guid: 96e17474f840a01459f0cc936c5d4d9b, type: 3} + m_FontSize: 14 + m_FontStyle: 0 + m_Alignment: 3 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 3 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: gpStyleClear + m_Normal: + m_Background: {fileID: 2800000, guid: d03222342209e43daaf2ca8d1364e47a, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.58431375, g: 0.6, b: 0.58431375, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 2 + m_Right: 2 + m_Top: 2 + m_Bottom: 2 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 12800000, guid: 96e17474f840a01459f0cc936c5d4d9b, type: 3} + m_FontSize: 14 + m_FontStyle: 0 + m_Alignment: 3 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 3 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: gpStyleBlur + m_Normal: + m_Background: {fileID: 2800000, guid: 9de03259c3d2e43fc91ef7dc9054b186, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.58431375, g: 0.6, b: 0.58431375, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 12800000, guid: 96e17474f840a01459f0cc936c5d4d9b, type: 3} + m_FontSize: 14 + m_FontStyle: 0 + m_Alignment: 3 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 3 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 1 + - m_Name: foldOut_std + m_Normal: + m_Background: {fileID: 2800000, guid: 677a55eab8f234e688ec4c6be70208bb, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.58431375, g: 0.6, b: 0.58431375, a: 1} + m_Hover: + m_Background: {fileID: 2800000, guid: d396473974f984567a8e398f1ebd9ec9, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.09411765, g: 0.7058824, b: 0.7607843, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: 677a55eab8f234e688ec4c6be70208bb, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.58431375, g: 0.6, b: 0.58431375, a: 1} + m_Focused: + m_Background: {fileID: 2800000, guid: d396473974f984567a8e398f1ebd9ec9, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.09411765, g: 0.7058824, b: 0.7607843, a: 1} + m_OnNormal: + m_Background: {fileID: 2800000, guid: 43f13eb24deac4ae5a86c25189272a74, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.58431375, g: 0.6, b: 0.58431375, a: 1} + m_OnHover: + m_Background: {fileID: 2800000, guid: 93e56b7e753794953939a50df2c9c323, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.09411765, g: 0.7058824, b: 0.7607843, a: 1} + m_OnActive: + m_Background: {fileID: 2800000, guid: 93e56b7e753794953939a50df2c9c323, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.58431375, g: 0.6, b: 0.58431375, a: 1} + m_OnFocused: + m_Background: {fileID: 2800000, guid: 93e56b7e753794953939a50df2c9c323, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.09411765, g: 0.7058824, b: 0.7607843, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 11 + m_FontStyle: 0 + m_Alignment: 3 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 15, y: 0} + m_FixedWidth: 10 + m_FixedHeight: 10 + m_StretchWidth: 0 + m_StretchHeight: 0 + m_Settings: + m_DoubleClickSelectsWord: 1 + m_TripleClickSelectsLine: 1 + m_CursorColor: {r: 0, g: 0, b: 0, a: 1} + m_CursorFlashSpeed: -1 + m_SelectionColor: {r: 0.58431375, g: 0.6, b: 0.58431375, a: 1} diff --git a/Assets/PlayFabEditorExtensions/Editor/UI/PlayFabStyles.guiskin.meta b/Assets/PlayFabEditorExtensions/Editor/UI/PlayFabStyles.guiskin.meta new file mode 100644 index 0000000..50ac574 --- /dev/null +++ b/Assets/PlayFabEditorExtensions/Editor/UI/PlayFabStyles.guiskin.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d04ab90b288304956b142858114b4310 +timeCreated: 1468007030 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK.meta b/Assets/PlayFabSDK.meta new file mode 100644 index 0000000..0f7c190 --- /dev/null +++ b/Assets/PlayFabSDK.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: e53d5e839d5caa945b9b859abe15689b +folderAsset: yes +timeCreated: 1558474635 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Admin.meta b/Assets/PlayFabSDK/Admin.meta new file mode 100644 index 0000000..a865e68 --- /dev/null +++ b/Assets/PlayFabSDK/Admin.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: f80b73ed5fc053a409c5e9347d9c609a +folderAsset: yes +timeCreated: 1468524875 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PlayFabSDK/Admin/PlayFabAdminAPI.cs b/Assets/PlayFabSDK/Admin/PlayFabAdminAPI.cs new file mode 100644 index 0000000..f75c4bb --- /dev/null +++ b/Assets/PlayFabSDK/Admin/PlayFabAdminAPI.cs @@ -0,0 +1,1575 @@ +#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); + } + + /// + /// Adds the game server executable specified (previously uploaded - see GetServerBuildUploadUrl) to the set of those a + /// client is permitted to request in a call to StartGame + /// + public static void AddServerBuild(AddServerBuildRequest request, 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/AddServerBuild", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// 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); + } + + /// + /// 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); + } + + /// + /// 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); + } + + /// + /// 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); + } + + /// + /// 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); + } + + /// + /// 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); + } + + /// + /// 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); + } + + /// + /// Retrieves the details for a specific completed session, including links to standard out and standard error logs + /// + public static void GetMatchmakerGameInfo(GetMatchmakerGameInfoRequest request, 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/GetMatchmakerGameInfo", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the details of defined game modes for the specified game server executable + /// + public static void GetMatchmakerGameModes(GetMatchmakerGameModesRequest request, 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/GetMatchmakerGameModes", 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); + } + + /// + /// 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); + } + + /// + /// 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); + } + + /// + /// Retrieves the build details for the specified game server executable + /// + public static void GetServerBuildInfo(GetServerBuildInfoRequest request, 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/GetServerBuildInfo", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the pre-authorized URL for uploading a game server package containing a build (does not enable the build for + /// use - see AddServerBuild) + /// + public static void GetServerBuildUploadUrl(GetServerBuildUploadURLRequest request, 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/GetServerBuildUploadUrl", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// 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); + } + + /// + /// 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); + } + + /// + /// 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); + } + + /// + /// 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); + } + + /// + /// Retrieves the build details for all game server executables which are currently defined for the title + /// + public static void ListServerBuilds(ListBuildsRequest request, 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/ListServerBuilds", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// 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); + } + + /// + /// Updates the game server mode details for the specified game server executable + /// + public static void ModifyMatchmakerGameModes(ModifyMatchmakerGameModesRequest request, 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/ModifyMatchmakerGameModes", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates the build details for the specified game server executable + /// + public static void ModifyServerBuild(ModifyServerBuildRequest request, 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/ModifyServerBuild", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// 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); + } + + /// + /// Removes the game server executable specified from the set of those a client is permitted to request in a call to + /// StartGame + /// + public static void RemoveServerBuild(RemoveServerBuildRequest request, 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/RemoveServerBuild", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// 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); + } + + /// + /// 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); + } + + /// + /// 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); + } + + /// + /// 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); + } + + /// + /// 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 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); + } + + /// + /// 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 + /// + 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 + /// + 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); + } + + /// + /// 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); + } + + /// + /// 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); + } + + /// + /// 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); + } + + /// + /// 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 0000000..ec37b6e --- /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 0000000..5f2a3e1 --- /dev/null +++ b/Assets/PlayFabSDK/Admin/PlayFabAdminInstanceAPI.cs @@ -0,0 +1,1362 @@ +#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); + } + + /// + /// Adds the game server executable specified (previously uploaded - see GetServerBuildUploadUrl) to the set of those a + /// client is permitted to request in a call to StartGame + /// + public void AddServerBuild(AddServerBuildRequest request, 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/AddServerBuild", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// 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); + } + + /// + /// 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); + } + + /// + /// 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); + } + + /// + /// 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); + } + + /// + /// 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; +