diff --git a/CHANGELOG.md b/CHANGELOG.md index fe9a81d..63e69be 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,10 +4,30 @@ All notable changes to this package will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). + +## [3.0.5] - 2019-12-06 +* Fix package validation errors. +* Release for verification. + +## [3.0.5-preview.4] - 2019-12-06 +* Release for verification. +* Remove build target filtering support. Will be added back into 3.1.0. + +## [3.0.5-preview.3] - 2019-11-22 +* Correct Samples code to make sure that it compiles correctly. +* Make some documentation fixes for inline code. +* Replace XR SDK text with just XR or other appropriate messaging. + +## [3.0.5-preview.2] - 2019-11-18 +* New attribute was incorrectly placed into Runtime instead of Editor. Moved to Editor where it belongs. + ## [3.0.5-preview.1] - 2019-11-13 * UI rework to provide for simpler installation and management of XR Plugin Providers. * Reworked the underlying data handling and maintenance to be more streamlines and less coupled. +## [3.0.4] - 2019-11-04 +* Release package for verification. + ## [3.0.4-preview.3] - 2019-10-29 * Update minimum compatible Editor version to 2019.3.0b9 * Fixes an issue where subsystems could not be initialized before awake in the editor @@ -34,7 +54,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. * Change legacy input helpers version to 1.* * Fix documentation validation errors. * Allow 3.x to work with Unity 2019.2. - * This package will not work with 2019.3a1 - a11. +* This package will not work with 2019.3a1 - a11. ## [3.0.2-preview.1] - 2019-08-06 * Remove asset menu creation entry for XR Settings as it is unsupported now. @@ -210,4 +230,4 @@ Added code to auto create the first SO settings instance using a file panel sinc ## [0.1.0-preview.1] - 2018-06-21 -### This is the first release of *Unity Package XR SDK Management*. +### This is the first release of *Unity Package XR Management*. diff --git a/Documentation~/EndUser.md b/Documentation~/EndUser.md index 38822a0..c5f9b30 100644 --- a/Documentation~/EndUser.md +++ b/Documentation~/EndUser.md @@ -15,7 +15,7 @@ At package install time, the package may prompt you to create an instance of a l If you wish not to create this at installation time, the appropriate portion of the editor that require them (**XRManagerSettings** and **Unified Settings** will) prompt you to create them as well. -**NOTE**: You can always manually control the XR SDK system by accessing the **XRGeneralSettings.Instance.Manager.activeLoader** field once XR SDK has been initialized. +**NOTE**: You can always manually control the XR system by accessing the **XRGeneralSettings.Instance.Manager.activeLoader** field once XR has been initialized. ## Add plugin loaders as needed * Navigate to **Project Settings**. @@ -25,7 +25,7 @@ If you wish not to create this at installation time, the appropriate portion of ### Automatic manager loading of XR By default XR Management will automatically initialize and start your XR environment on application load. At runtime this happens immediately before first scene load. In Play mode this happens immediately after first scene load but before Start is called on your game objects. In either case XR should be setup before Start is called so you should be able to query the state of XR in the Start method of your game objects. -### If you wish to start XR SDK on a per scene basis (i.e. start in 2D and transition into VR) +### If you wish to start XR on a per scene basis (i.e. start in 2D and transition into VR) * Make sure you disable the **Initialize on Startup** toggle for each platform you support. * At runtime use the **XRGeneralSettings.Instance.Manager** to add/create, remove and reorder the loaders you wish to use from the script. * To setup the XR environment to run manually call **InitializeLoader(Async)** on the **XRGeneralSettings.Instance.Manager**. @@ -37,9 +37,9 @@ By default XR Management will automatically initialize and start your XR environ Any package that needs build or runtime settings should provide a settings datatype for use. This will be surfaced in the **Unified Settings** UI window underneath a top level **XR** node. By default a custom settings data instance will not be created. If you wish to modify build or runtime settings for the package you must go to the package authors entry in **Unified Settings** and select **Create**. This will create an instance of the settings that you can then modify inside of **Unified Settings**. -# Installing *XR SDK Management* +# Installing *XR Management* -Most likey the XR SDK Provider package you want to use already includes XR Management so you shouldn't need to install it. If you do you can follow the directions provided in the top level documentation or follow the instructions in the [Package Manager documentation](https://docs.unity3d.com/Packages/com.unity.package-manager-ui@latest/index.html). +Most likey the XR Provider package you want to use already includes XR Management so you shouldn't need to install it. If you do you can follow the directions provided in the top level documentation or follow the instructions in the [Package Manager documentation](https://docs.unity3d.com/Packages/com.unity.package-manager-ui@latest/index.html). # Installing *Legacy Input Helpers* diff --git a/Documentation~/Provider.md b/Documentation~/Provider.md index 348a8bb..87150eb 100644 --- a/Documentation~/Provider.md +++ b/Documentation~/Provider.md @@ -2,13 +2,13 @@ ## Lifecycle Management -This package provides for management of **XR SDK** subsystem lifecycle without the need for boilerplate code. The **XRManagerSettings** class provides a scriptable object that can be used by the app for start, stop and de-initialization of a set of subsystems defined by an **XRLoader** instance. +This package provides for management of **XR** subsystem lifecycle without the need for boilerplate code. The **XRManagerSettings** class provides a scriptable object that can be used by the app for start, stop and de-initialization of a set of subsystems defined by an **XRLoader** instance. A provider must create a subclass of **XRLoader** to make a loader available for their particular runtime scheme. The **XRLoader** interface looks like this: -```csharp +``` public abstract class XRLoader : ScriptableObject { public virtual bool Initialize() { return false; } @@ -55,7 +55,7 @@ A provider may need optional settings to help manage build issues or runtime con The provider will need to handle getting the settings from **EditorUserBuildSettings** into the build application. This can be done with a custom build processing script. If all you need for build support is to make sure that you have access to the same settings at runtime you can derive from **XRBuildHelper**. This is a generic abstract base class that handles the necessary work of getting the build settings stored in EditorUserBuildSettings and getting them into the build application for access at runtime. Simplest build script for your package would look like this: -```csharp +``` public class MyBuildProcessor : XRBuildHelper { public override string BuildSettingsKey { get { return "MyPackageSettingsKey"; } } @@ -64,7 +64,7 @@ public class MyBuildProcessor : XRBuildHelper You can override the build processing steps from **IPreprocessBuildWithReport** and **IPostprocessBuildWithReport** but make sure that you call to the base class implementation or else your settings will not be copied. -```csharp +``` public class MyBuildProcessor : XRBuildHelper { public override string BuildSettingsKey { get { return "MyPackageSettingsKey"; } } @@ -85,7 +85,7 @@ public class MyBuildProcessor : XRBuildHelper If you wish to support per platform settings at build time, you can override `UnityEngine.Object SettingsForBuildTargetGroup(BuildTargetGroup buildTargetGroup)` and use the passed in buildTargetGroup to retrieve the appropriate platform settings. By default this method just uses the key associated with the settings instance to copy the entire settings object from EditorUserBuildSettings to PlayerSettings. -```csharp +``` public class MyBuildProcessor : XRBuildHelper { public override string BuildSettingsKey { get { return "MyPackageSettingsKey"; } } @@ -111,6 +111,6 @@ If you need more extensive support and/or absolute control you can copy the **Sa Given the need for **ScriptableObject** instance to support loaders and settings, the user will be forced to create these instances at some point. Both **XRManagerSettings** and the **Unified Settings** support can handle creating the necessary instances on demand but it may be beneficial to create these up front at package installation. If you derive a class from **XRPackageInitializationBase** and fill out the interface properties and methods the management system will provide for creation of default instances of your loader and settings at installation. Creation of each one is driven by prompting the user if it is OK to do that and, if so, creating the instance in the appropriate default location in the Assets folder. For loaders this is Assets/XR/Loaders. For settings this is Assets/XR/Settings. While these are the recommended locations for putting these package based objects they do not have to be located there. The user is free to move them around as long as we can find at least one instance of each type for each package. -# Installing *XR SDK Management* +# Installing *XR Management* To install this package, follow the instructions in the [Package Manager documentation](https://docs.unity3d.com/Packages/com.unity.package-manager-ui@latest/index.html). diff --git a/Documentation~/com.unity.xr.management.md b/Documentation~/com.unity.xr.management.md index e70c7bd..b26354e 100644 --- a/Documentation~/com.unity.xr.management.md +++ b/Documentation~/com.unity.xr.management.md @@ -1,6 +1,6 @@ -# About *XR SDK Management* package +# About *XR Management* package -Use the **XR SDK Management** package to help streamline **XR SDK** lifecycle management and potentially provide users with build time UI through the Unity **Unified Settings** system. +Use the **XR Management** package to help streamline **XR** lifecycle management and potentially provide users with build time UI through the Unity **Unified Settings** system. # Installation @@ -31,9 +31,9 @@ If you want to use a cloned version of the package directly, you can point the P NOTE: The package root is not necessarily the root of the cloned repo. The package root the folder where the package's package.json file located. -# Using XR SDK Management +# Using XR Management -There are two target audiences for XR SDK Management: The End User and the Provider. Documentation for those can be found here: +There are two target audiences for XR Management: The End User and the Provider. Documentation for those can be found here: * [End Users Documentation](./EndUser.md) * [Provider Documentation](./Provider.md) @@ -42,7 +42,7 @@ There are two target audiences for XR SDK Management: The End User and the Provi ## Requirements -This version of **XR SDK Management** is compatible with the following versions of the Unity Editor: +This version of **XR Management** is compatible with the following versions of the Unity Editor: * 2019.1 and later (recommended) @@ -52,12 +52,12 @@ This version of **XR SDK Management** is compatible with the following versions ## Package contents -This version of **XR SDK Management** includes: +This version of **XR Management** includes: * **XRManagerSettings** - This is a **ScriptableObject** that can be accessed from the script and provides for management of **XRLoader** instances and their lifecycle. * **XRLoader** - This is the base class all loaders should derive from. It provides a basic the **XRManagerSettings** can use to manage lifecycle and a simple API to allow users to request specific subsystems from the loader as and when needed. * **XRConfigurationData** - This is an attribute that allows for build and runtime settings to be hosted within the **Unified Settings** window. All instances will be hosted under the top level **XR** entry within the **Unified Settings** window under the name supplied as part of the attribute. The management package will maintain and manage the lifecycle for one instance of the build settings using **EditorBuildSettings** config object API, stored with the key provided in the attribute. At any time, the provider or the user is free access the configuration settings instance by asking **EditorBuildSettings** for the instance associated with the chosen key (as set in the attribute). * **XRPackageInitializationBase** - Helper class to derive from that simplifies some of the busy work for package initialization. Helps to create a default instance of the packages XRLoader and default settings at the time of package installation. Initialization is run once only and the package developer should not depend on the user creating the specified instances. * **XRBuildHelper** - Abstract class useful for handling some boilerplate around moving settings from Editor -> Runtime. Derive from this class and specific the appropriate settings type and the system will take care of marshaling that type from EditorUserBuildSettings to PlayerSettings to be used at runtime. -* **XRGeneralSettings** - Contains settings specific to all of XR SDK and not to any single provider. +* **XRGeneralSettings** - Contains settings specific to all of XR and not to any single provider. * **Samples** - There is a samples folder in the package that contains an implementation of all parts of XR Management. Copy that folder to a location in your project/package to get started with implementing XR Management for your needs. diff --git a/Editor/XRLoaderInfoManager.cs b/Editor/XRLoaderInfoManager.cs index 81b1bd1..6e2701d 100644 --- a/Editor/XRLoaderInfoManager.cs +++ b/Editor/XRLoaderInfoManager.cs @@ -64,7 +64,6 @@ public SerializedObject SerializedObjectData } List m_AllLoaderInfos = new List(); - List m_AllLoaderInfosForBuildTarget = new List(); List m_AssignedLoaderInfos = new List(); List m_UnassignedLoaderInfos = new List(); @@ -126,7 +125,6 @@ public void ReloadData() return; PopulateAllLoaderInfos(); - PopulateLoadersForBuildTarget(); PopulateAssignedLoaderInfos(); PopulateUnassignedLoaderInfos(); @@ -177,15 +175,10 @@ string AssetNameFromInstance(UnityEngine.Object asset) return Path.GetFileNameWithoutExtension(assetPath); } - void PopulateLoadersForBuildTarget() - { - m_AllLoaderInfosForBuildTarget = FilteredLoaderInfos(m_AllLoaderInfos); - } - void PopulateUnassignedLoaderInfos() { m_UnassignedLoaderInfos.Clear(); - foreach (var info in m_AllLoaderInfosForBuildTarget) + foreach (var info in m_AllLoaderInfos) { var assigned = from ai in m_AssignedLoaderInfos where ai.loaderType == info.loaderType select ai; if (!assigned.Any()) m_UnassignedLoaderInfos.Add(info); @@ -197,47 +190,6 @@ void PopulateProperty(string propertyPath, ref SerializedProperty prop) if (SerializedObjectData != null && prop == null) prop = SerializedObjectData.FindProperty(propertyPath); } - private List FilteredLoaderInfos(List loaderInfos) - { - List ret = new List(); - - foreach (var info in loaderInfos) - { - if (info.loaderType == null) - continue; - - object[] attrs; - - try - { - attrs = info.loaderType.GetCustomAttributes(typeof(XRSupportedBuildTargetAttribute), true); - } - catch (Exception) - { - attrs = default; - } - - if (attrs.Length == 0) - { - // If unmarked we assume it will be applied to all build targets. - ret.Add(info); - } - else - { - foreach (XRSupportedBuildTargetAttribute attr in attrs) - { - if (attr.buildTargetGroup == m_BuildTargetGroup) - { - ret.Add(info); - break; - } - } - } - } - - return ret; - } - void UpdateSerializedProperty() { if (m_LoaderList != null && m_LoaderList.isArray) diff --git a/Editor/XRSettingsManager.cs b/Editor/XRSettingsManager.cs index b46c8b9..06c9495 100644 --- a/Editor/XRSettingsManager.cs +++ b/Editor/XRSettingsManager.cs @@ -23,7 +23,7 @@ struct Content internal static GUIContent s_ProvidersToInstall = new GUIContent("Installable XR Plugin Providers"); internal static GUIContent s_LookingForProviders = new GUIContent("Looking for installable provider packages... "); internal static GUIContent s_NoInstallablePackages = new GUIContent("No installable provider packages found."); - internal static string k_NeedToInstallAProvider = "Before you can use the XR system you need to install at least one provider from the list above."; + internal static string k_NeedToInstallAProvider = "Before you can use the XR system you need to install at least one provider from the list."; internal static string k_ProvidersUnavailable = "We are unable to find any providers usable within Unity at this time. XR is currently unavailable to use."; internal static GUIContent s_InstallPackage = new GUIContent("Install"); internal static GUIContent s_InstallingPackage = new GUIContent("Installing"); diff --git a/README.md b/README.md index ccec34f..97c1e8f 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ # XR Management -This package provides for management of **XR SDK** subsystem lifecycles without the need for boilerplate code as well as support for provider specific build settings. +This package provides for management of **XR** subsystem lifecycles without the need for boilerplate code as well as support for provider specific build settings. -This package is primarily intented for XR SDK Package authors to provide management tools and touchpoints for their package users. As such, most end users will have this package installed transitively through install of the end user XR SDK package using it. +This package is primarily intented for XR Package authors to provide management tools and touchpoints for their package users. As such, most end users will have this package installed transitively through install of the end user XR package using it. ## Installing XR Management diff --git a/Runtime/IXRLoaderPreInit.cs b/Runtime/IXRLoaderPreInit.cs index 4fa7fac..92a3705 100644 --- a/Runtime/IXRLoaderPreInit.cs +++ b/Runtime/IXRLoaderPreInit.cs @@ -4,17 +4,17 @@ namespace UnityEngine.XR.Management { /// - /// XRLoader interface for retrieving the XR SDK PreInit library name from an XRLoader instance + /// XRLoader interface for retrieving the XR PreInit library name from an XRLoader instance /// public interface IXRLoaderPreInit { /// - /// Get the library name, if any, to use for XR SDK PreInit. + /// Get the library name, if any, to use for XR PreInit. /// /// /// An enum specifying which platform this build is for. /// An enum specifying which platform group this build is for. - /// A string specifying the library name used for XR SDK PreInit. + /// A string specifying the library name used for XR PreInit. string GetPreInitLibraryName(BuildTarget buildTarget, BuildTargetGroup buildTargetGroup); } } diff --git a/Runtime/XRConfigurationData.cs b/Runtime/XRConfigurationData.cs index a6776ee..2f6e4d6 100644 --- a/Runtime/XRConfigurationData.cs +++ b/Runtime/XRConfigurationData.cs @@ -8,7 +8,7 @@ namespace UnityEngine.XR.Management { /// - /// This attribute is used to tag classes as providing build settings support for an XR SDK provider. The unified setting system + /// This attribute is used to tag classes as providing build settings support for an XR provider. The unified setting system /// will present the settings as an inspectable object in the Unified Settings window using the built-in inspector UI. /// /// The implementor of the settings is able to create their own custom UI and the Unified Settings system will use that UI in diff --git a/Runtime/XRGeneralSettings.cs b/Runtime/XRGeneralSettings.cs index 83570fc..2d0b24b 100644 --- a/Runtime/XRGeneralSettings.cs +++ b/Runtime/XRGeneralSettings.cs @@ -33,8 +33,10 @@ public XRManagerSettings Manager private XRManagerSettings m_XRManager = null; +#pragma warning disable 414 // Suppress warning for needed variables. private bool m_ProviderIntialized = false; private bool m_ProviderStarted = false; +#pragma warning restore 414 /// The current settings instance. public static XRGeneralSettings Instance @@ -191,7 +193,7 @@ private void InitXRSDK() m_XRManager = XRGeneralSettings.Instance.m_LoaderManagerInstance; if (m_XRManager == null) { - Debug.LogError("Assigned GameObject for XR Management loading is invalid. XR SDK will not be automatically loaded."); + Debug.LogError("Assigned GameObject for XR Management loading is invalid. No XR Providers will be automatically loaded."); return; } diff --git a/Runtime/XRManagerSettings.cs b/Runtime/XRManagerSettings.cs index cde0be8..3d0aefe 100644 --- a/Runtime/XRManagerSettings.cs +++ b/Runtime/XRManagerSettings.cs @@ -12,7 +12,7 @@ namespace UnityEngine.XR.Management { /// - /// Class to handle active loader and subsystem management for XR SDK. This class is to be added as a + /// Class to handle active loader and subsystem management for XR. This class is to be added as a /// ScriptableObject asset in your project and should only be referenced by the an /// instance for its use. /// @@ -136,7 +136,7 @@ public T ActiveLoaderAs() where T : XRLoader /// Iterate over the configured list of loaders and attempt to initialize each one. The first one /// that succeeds is set as the active loader and initialization immediately terminates. /// - /// When complete will be set to true. This will mark that it is safe to + /// When complete will be set to true. This will mark that it is safe to /// call other parts of the API. This does not guarantee that init successfully created a loader. For that /// you need to check that ActiveLoader is not null. /// diff --git a/Runtime/XRSupportedBuildTargetAttribute.cs b/Runtime/XRSupportedBuildTargetAttribute.cs deleted file mode 100644 index ec0cf40..0000000 --- a/Runtime/XRSupportedBuildTargetAttribute.cs +++ /dev/null @@ -1,45 +0,0 @@ -using System; - -#if UNITY_EDITOR - -using UnityEditor; - -namespace UnityEngine.XR.Management -{ - [AttributeUsage(AttributeTargets.Class, AllowMultiple = true)] - public sealed class XRSupportedBuildTargetAttribute : Attribute - { - /// - /// String representation of UnityEditor.Build.BuildTargetGroup - /// - public BuildTargetGroup buildTargetGroup { get; set; } - - /// - /// Array of BuildTargets, each of which is the representation of UnityEditor.Build.BuildTarget - /// aligned with . - /// - /// Currently only advisory. - /// - public BuildTarget[] buildTargets { get; set; } - - private XRSupportedBuildTargetAttribute() { } - - /// Constructor for attribute. We assume that all build targets for this group will be supported. - /// Build Target Group that will be supported. - public XRSupportedBuildTargetAttribute(BuildTargetGroup buildTargetGroup) - { - this.buildTargetGroup = buildTargetGroup; - } - - /// Constructor for attribute - /// Build Target Group that will be supported. - /// The set of build targets of Build Target Group that will be supported. - public XRSupportedBuildTargetAttribute(BuildTargetGroup buildTargetGroup, BuildTarget[] buildTargets) - { - this.buildTargetGroup = buildTargetGroup; - this.buildTargets = buildTargets; - } - } -} - -#endif diff --git a/Runtime/XRSupportedBuildTargetAttribute.cs.meta b/Runtime/XRSupportedBuildTargetAttribute.cs.meta deleted file mode 100644 index 9172011..0000000 --- a/Runtime/XRSupportedBuildTargetAttribute.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 573bb802f55a06c4fb7f19db9a003f62 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Samples~/.sample.json b/Samples~/.sample.json index 8357d6e..605916e 100644 --- a/Samples~/.sample.json +++ b/Samples~/.sample.json @@ -1,5 +1,5 @@ { "displayName":"Example XR Management implementation", "description": "Example code showing how to implement various portions of the XR Management API.", - "createSeparatePackage": false + "createSeparatePackage": true } diff --git a/Samples~/SampleLoader.cs b/Samples~/SampleLoader.cs index 52108fd..63d15e2 100644 --- a/Samples~/SampleLoader.cs +++ b/Samples~/SampleLoader.cs @@ -13,6 +13,7 @@ #if UNITY_EDITOR using UnityEditor; +using UnityEditor.XR.Management; #endif namespace Samples @@ -22,10 +23,6 @@ namespace Samples /// NOTE: You have to rename this class to make it appear in the loader list for /// XRManager. /// -#if UNITY_EDITOR - [XRSupportedBuildTarget(BuildTargetGroup.Standalone, new BuildTarget[]{ BuildTarget.StandaloneWindows, BuildTarget.StandaloneWindows64})] - [XRSupportedBuildTarget(BuildTargetGroup.Android)] -#endif public class SampleLoader : XRLoaderHelper { static List s_InputSubsystemDescriptors = diff --git a/Tests/StandaloneSubsystem/StandaloneSubsystem.cs.meta b/Tests/StandaloneSubsystem/StandaloneSubsystem.cs.meta index 0408a2d..b67be60 100644 --- a/Tests/StandaloneSubsystem/StandaloneSubsystem.cs.meta +++ b/Tests/StandaloneSubsystem/StandaloneSubsystem.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 56e88abd7d84622489f00a317a1375f1 +guid: 24f65cd604fa73e4e9dbaa12d1b335e9 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Tests/StandaloneSubsystem/StandaloneSubsystemDescriptor.cs.meta b/Tests/StandaloneSubsystem/StandaloneSubsystemDescriptor.cs.meta index e5e7935..f989eb2 100644 --- a/Tests/StandaloneSubsystem/StandaloneSubsystemDescriptor.cs.meta +++ b/Tests/StandaloneSubsystem/StandaloneSubsystemDescriptor.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 1f6045191434e134282927ccb8889a51 +guid: 013b7dbbc8ec54c4182940c05c060ee9 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/package.json b/package.json index cbe3572..c878e85 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "com.unity.xr.management", "displayName": "XR Management", - "version": "3.0.5-preview.1", + "version": "3.0.5", "unity": "2019.3", "unityRelease": "0b9", "description": "Package to provide for simple management of XR plugins. Provides help and management for loading, initialization, settings, and build support for XR plugins.", @@ -19,7 +19,7 @@ "repository": { "type": "git", "url": "git@github.cds.internal.unity3d.com:unity/xr.sdk.management.git", - "revision": "50dca157be6f0edcad3b328f2feb322fa93d1aa3" + "revision": "44ba743d0dc2254c03ef3859adaa984065975e99" }, "samples": [ {