diff --git a/.drone.yml b/.drone.yml index 941deb6..52e8e4a 100644 --- a/.drone.yml +++ b/.drone.yml @@ -36,11 +36,12 @@ steps: - name: unity-builds image: docker.io/library/unity-runner:0.1 commands: - - /opt/unity/editors/2021.3.19f1/Editor/Unity -batchmode -nographics -projectPath . -buildWindowsPlayer ./wesign-builds/WeSign-Windows.exe -quit --headless || true + - mkdir -p ./wesign-builds/{tmp,WeSign-Windows,WeSign-Linux,WeSign-MacOS} + - /opt/unity/editors/2021.3.19f1/Editor/Unity -batchmode -nographics -projectPath . -buildWindowsPlayer ./wesign-builds/tmp/WeSign-Windows.exe -quit --headless || true - chmod 777 -R . - - /opt/unity/editors/2021.3.19f1/Editor/Unity -batchmode -nographics -projectPath . -buildWindowsPlayer ./wesign-builds/WeSign-Windows.exe -quit --headless - - /opt/unity/editors/2021.3.19f1/Editor/Unity -batchmode -nographics -projectPath . -buildLinux64Player ./wesign-builds/WeSign-Linux -quit --headless - - /opt/unity/editors/2021.3.19f1/Editor/Unity -batchmode -nographics -projectPath . -buildOSXUniversalPlayer ./wesign-builds/WeSign-MacOS.app -quit --headless + - /opt/unity/editors/2021.3.19f1/Editor/Unity -batchmode -nographics -projectPath . -buildWindowsPlayer ./wesign-builds/WeSign-Windows/WeSign.exe -quit --headless + - /opt/unity/editors/2021.3.19f1/Editor/Unity -batchmode -nographics -projectPath . -buildLinux64Player ./wesign-builds/WeSign-Linux/WeSign -quit --headless + - /opt/unity/editors/2021.3.19f1/Editor/Unity -batchmode -nographics -projectPath . -buildOSXUniversalPlayer ./wesign-builds/WeSign-MacOS/WeSign.app -quit --headless - name: commit-files image: alpine/git environment: @@ -51,9 +52,14 @@ steps: commands: - git config --global user.name "DroneCI" - git config --global user.email "droneci@wesign.com" - - ls ./wesign-builds - - git add -f ./wesign-builds/WeSign-Windows.exe - - git add -f ./wesign-builds/WeSign-Linux - - git add -f ./wesign-builds/WeSign-MacOS.app + + - zip -r ./wesign-builds/WeSign-Windows.zip ./wesign-builds/WeSign-Windows + - zip -r ./wesign-builds/WeSign-MacOS.zip ./wesign-builds/WeSign-MacOS + - zip -r ./wesign-builds/WeSign-Linux.zip ./wesign-builds/WeSign-Linux + + - git add ./wesign-builds/WeSign-Windows.zip + - git add ./wesign-builds/WeSign-MacOS.zip + - git add ./wesign-builds/WeSign-Linux.zip + - git commit -m "Add build files [skip ci]" - git push -f https://oauth2:ixKiNbp48zzmP5PF-epo@gitlab.ilabt.imec.be/wesign/unity-application/ diff --git a/Assets/Accounts/Scenes/ChangeUserScreen.unity b/Assets/Accounts/Scenes/ChangeUserScreen.unity index 357c8b1..3b3870d 100644 --- a/Assets/Accounts/Scenes/ChangeUserScreen.unity +++ b/Assets/Accounts/Scenes/ChangeUserScreen.unity @@ -1097,7 +1097,6 @@ GameObject: - component: {fileID: 1143249627} - component: {fileID: 1143249626} - component: {fileID: 1143249625} - - component: {fileID: 1143249628} m_Layer: 5 m_Name: Button (1) m_TagString: Untagged @@ -1170,10 +1169,10 @@ MonoBehaviour: m_OnClick: m_PersistentCalls: m_Calls: - - m_Target: {fileID: 1143249628} - m_TargetAssemblyTypeName: ChangeSceneOnClick, Assembly-CSharp - m_MethodName: LoadScene - m_Mode: 5 + - m_Target: {fileID: 906197780} + m_TargetAssemblyTypeName: ChangeUserScreen, Assembly-CSharp + m_MethodName: GotoUserCreation + m_Mode: 1 m_Arguments: m_ObjectArgument: {fileID: 0} m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine @@ -1220,18 +1219,6 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1143249623} m_CullTransparentMesh: 1 ---- !u!114 &1143249628 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1143249623} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 949ba4da8595d52aebc98e6f9b6a405e, type: 3} - m_Name: - m_EditorClassIdentifier: --- !u!1 &1229328479 GameObject: m_ObjectHideFlags: 0 diff --git a/Assets/Accounts/Scripts/AccountsScripts.asmdef b/Assets/Accounts/Scripts/AccountsScripts.asmdef new file mode 100644 index 0000000..307f704 --- /dev/null +++ b/Assets/Accounts/Scripts/AccountsScripts.asmdef @@ -0,0 +1,17 @@ +{ + "name": "AccountsScripts", + "rootNamespace": "", + "references": [ + "GUID:6055be8ebefd69e48b49212b09b47b2f", + "GUID:df9d7b70293a2e14d9d3a018c3956f7a" + ], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/Assets/EditModeTests/EditModeTests.asmdef.meta b/Assets/Accounts/Scripts/AccountsScripts.asmdef.meta similarity index 76% rename from Assets/EditModeTests/EditModeTests.asmdef.meta rename to Assets/Accounts/Scripts/AccountsScripts.asmdef.meta index 3fc17b7..e6c9789 100644 --- a/Assets/EditModeTests/EditModeTests.asmdef.meta +++ b/Assets/Accounts/Scripts/AccountsScripts.asmdef.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: b3d66002fb543bf3fa03c11006f8cb3a +guid: 1631ed2680c61245b8211d943c1639a8 AssemblyDefinitionImporter: externalObjects: {} userData: diff --git a/Assets/Accounts/Scripts/ChangeUserScreen.cs b/Assets/Accounts/Scripts/ChangeUserScreen.cs index a5f7eef..a88ee57 100644 --- a/Assets/Accounts/Scripts/ChangeUserScreen.cs +++ b/Assets/Accounts/Scripts/ChangeUserScreen.cs @@ -1,9 +1,11 @@ using System.Collections.Generic; using TMPro; using UnityEngine; -using UnityEngine.SceneManagement; using UnityEngine.UI; +/// +/// ChangeUserScreen scene manager +/// public class ChangeUserScreen : MonoBehaviour { /// @@ -58,12 +60,7 @@ public class ChangeUserScreen : MonoBehaviour // Set background color background.color = i == currentUserIndex ? Color.blue : Color.gray; // Find correct component for setting the sprite - foreach (Image img in background.GetComponentsInChildren()) - if (img != background) - { - img.sprite = user.avatar; - break; - } + instance.transform.Find("Avatar").GetComponent().sprite = user.avatar; } } @@ -85,6 +82,14 @@ public class ChangeUserScreen : MonoBehaviour { userList.ChangeCurrentUser(currentUserIndex); userList.Save(); - SceneManager.LoadScene("Common/Scenes/StartScreen"); + SystemController.GetInstance().BackToPreviousScene(); + } + + /// + /// Callback to load the UserCreationScreen scene + /// + public void GotoUserCreation() + { + SystemController.GetInstance().LoadNextScene("Accounts/Scenes/UserCreationScreen"); } } diff --git a/Assets/Accounts/Scripts/Progress.cs b/Assets/Accounts/Scripts/Progress.cs index b54ef7f..2334731 100644 --- a/Assets/Accounts/Scripts/Progress.cs +++ b/Assets/Accounts/Scripts/Progress.cs @@ -73,7 +73,6 @@ public class Progress } } - // Get the value of type `T` belonging to `key` /// /// Get the data object of a certain key /// diff --git a/Assets/Accounts/Scripts/SystemController.cs b/Assets/Accounts/Scripts/SystemController.cs new file mode 100644 index 0000000..69774b3 --- /dev/null +++ b/Assets/Accounts/Scripts/SystemController.cs @@ -0,0 +1,104 @@ +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.SceneManagement; + +/// +/// SystemController singleton +/// +public class SystemController +{ + /// + /// The instance controlling the singleton + /// + private static SystemController instance = null; + + /// + /// Stack of the loaded scenes, used to easily go back to previous scenes + /// + private Stack sceneStack = new Stack(); + + /// + /// Get the instance loaded by the singleton + /// + /// SystemController instance + public static SystemController GetInstance() + { + // Create a new instance if non exists + if (instance == null) + { + instance = new SystemController(); + instance.sceneStack.Push(SceneManager.GetActiveScene().buildIndex); + } + return instance; + } + + /// + /// Load the scene and push on the stack + /// + /// Path of the scene + public void LoadNextScene(string scenePath) + { + LoadNextScene(SceneUtility.GetBuildIndexByScenePath(scenePath)); + } + + /// + /// Load the scene and push on the stack + /// + /// Buildindex of the scene + public void LoadNextScene(int sceneIndex) + { + sceneStack.Push(sceneIndex); + SceneManager.LoadScene(sceneIndex); + } + + /// + /// Swap the current scene with the new scene on the stack + /// + /// Path of the scene + public void SwapScene(string scenePath) + { + SwapScene(SceneUtility.GetBuildIndexByScenePath(scenePath)); + } + + /// + /// Swap the current scene with the new scene on the stack + /// + /// Buildindex of the scene + public void SwapScene(int sceneIndex) + { + sceneStack.Pop(); + LoadNextScene(sceneIndex); + } + + /// + /// Go back to the previous scene and unload the current scene + /// + public void BackToPreviousScene() + { + sceneStack.Pop(); + + if (sceneStack.Count > 0) SceneManager.LoadScene(sceneStack.Peek()); + else Application.Quit(); + } + + /// + /// Go back to a specific scene, unloading all the scenes on the way + /// + /// Path of the scene + public void BackToScene(string scenePath) + { + BackToScene(SceneUtility.GetBuildIndexByScenePath(scenePath)); + } + + /// + /// Go back to a specific scene, unloading all the scene on the way + /// + /// Buildindex of the scene + public void BackToScene(int sceneIndex) + { + while (0 < sceneStack.Count && sceneStack.Peek() != sceneIndex) sceneStack.Pop(); + + if (sceneStack.Count > 0) SceneManager.LoadScene(sceneStack.Peek()); + else Application.Quit(); + } +} diff --git a/Assets/Common/Scripts/ChangeSceneOnClick.cs.meta b/Assets/Accounts/Scripts/SystemController.cs.meta similarity index 83% rename from Assets/Common/Scripts/ChangeSceneOnClick.cs.meta rename to Assets/Accounts/Scripts/SystemController.cs.meta index d139720..388d220 100644 --- a/Assets/Common/Scripts/ChangeSceneOnClick.cs.meta +++ b/Assets/Accounts/Scripts/SystemController.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 949ba4da8595d52aebc98e6f9b6a405e +guid: bf5ea73aa43049e45a0ad926db15f315 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Assets/Accounts/Scripts/UserCreationScreen.cs b/Assets/Accounts/Scripts/UserCreationScreen.cs index 0a703c2..6b5cb77 100644 --- a/Assets/Accounts/Scripts/UserCreationScreen.cs +++ b/Assets/Accounts/Scripts/UserCreationScreen.cs @@ -2,7 +2,6 @@ using System.Collections.Generic; using System.Text.RegularExpressions; using TMPro; using UnityEngine; -using UnityEngine.SceneManagement; using UnityEngine.UI; /// @@ -80,12 +79,7 @@ public class UserCreationScreen : MonoBehaviour // Set background color background.color = selectedAvatar == i ? Color.blue : Color.gray; // Find correct component for setting the sprite - foreach (Image img in background.GetComponentsInChildren()) - if (img != background) - { - img.sprite = sprites[i]; - break; - } + instance.transform.Find("Image").GetComponent().sprite = sprites[i]; } } @@ -123,8 +117,7 @@ public class UserCreationScreen : MonoBehaviour { // Create a new entry in the UserList ScriptableObject users.ChangeCurrentUser(users.CreateAndAddNewUser(username, sprites[selectedAvatar])); - // TODO: change scene, for now just change to StartScreen - SceneManager.LoadScene("Common/Scenes/StartScreen"); + SystemController.GetInstance().BackToPreviousScene(); } // Warn user that username already exists else diff --git a/Assets/Accounts/Tests/AccountsTests.asmdef b/Assets/Accounts/Tests/AccountsTests.asmdef new file mode 100644 index 0000000..cfb3391 --- /dev/null +++ b/Assets/Accounts/Tests/AccountsTests.asmdef @@ -0,0 +1,27 @@ +{ + "name": "AccountsTests", + "rootNamespace": "", + "references": [ + "UnityEngine.TestRunner", + "UnityEditor.TestRunner", + "AccountsScripts", + "InterfacesScripts" + ], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": true, + "precompiledReferences": [ + "nunit.framework.dll", + "nunit.framework.dll" + ], + "autoReferenced": false, + "defineConstraints": [ + "UNITY_INCLUDE_TESTS", + "UNITY_INCLUDE_TESTS" + ], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/Assets/users.json.meta b/Assets/Accounts/Tests/AccountsTests.asmdef.meta similarity index 59% rename from Assets/users.json.meta rename to Assets/Accounts/Tests/AccountsTests.asmdef.meta index e470439..6671d16 100644 --- a/Assets/users.json.meta +++ b/Assets/Accounts/Tests/AccountsTests.asmdef.meta @@ -1,6 +1,6 @@ fileFormatVersion: 2 -guid: 29594155802425940b4fd7351ad447e8 -TextScriptImporter: +guid: 8500f5aede7627729bd8c97b15e541c4 +AssemblyDefinitionImporter: externalObjects: {} userData: assetBundleName: diff --git a/Assets/Accounts/Tests/TestProgress.cs b/Assets/Accounts/Tests/TestProgress.cs index 42ba708..03cdad4 100644 --- a/Assets/Accounts/Tests/TestProgress.cs +++ b/Assets/Accounts/Tests/TestProgress.cs @@ -1,3 +1,4 @@ +using NUnit.Framework; using System; using System.Collections.Generic; using System.Runtime.Serialization; @@ -90,6 +91,7 @@ public class TestProgress : MonoBehaviour /// /// Test for creation of a new progress /// + [Test] public void TestNewProgress() { Progress progress = new Progress(); @@ -99,6 +101,7 @@ public class TestProgress : MonoBehaviour /// /// Test whether invalid data will not be added /// + [Test] public void TestProgressAddInvalidData() { Progress progress = new Progress(); @@ -108,6 +111,7 @@ public class TestProgress : MonoBehaviour /// /// Test whether a duplicated key will be added /// + [Test] public void TestProgressAddDuplicateKey() { Progress progress = new Progress(); @@ -118,6 +122,7 @@ public class TestProgress : MonoBehaviour /// /// Test whether a int value can be added /// + [Test] public void TestProgressAddInt() { Progress progress = new Progress(); @@ -127,6 +132,7 @@ public class TestProgress : MonoBehaviour /// /// Test whether a double value can be added /// + [Test] public void TestProgressAddDouble() { Progress progress = new Progress(); @@ -136,6 +142,7 @@ public class TestProgress : MonoBehaviour /// /// Test whether a string value can be added /// + [Test] public void TestProgressAddString() { Progress progress = new Progress(); @@ -145,6 +152,7 @@ public class TestProgress : MonoBehaviour /// /// Test whether a serializable struct can be added /// + [Test] public void TestProgressAddSerializableStruct() { Progress progress = new Progress(); @@ -154,6 +162,7 @@ public class TestProgress : MonoBehaviour /// /// Test whether a non-serializable struct will throw an error /// + [Test] public void TestProgressAddNonSerializableStruct() { Debug.Assert(AddNonSerializableStruct()); @@ -162,6 +171,7 @@ public class TestProgress : MonoBehaviour /// /// Test whether an invalid key will throw an error /// + [Test] public void TestProgressGetInvalidKey() { Debug.Assert(AccessInvalidKey()); @@ -170,6 +180,7 @@ public class TestProgress : MonoBehaviour /// /// Test whether an invalid type will throw an error /// + [Test] public void TestProgressGetInvalidType() { Debug.Assert(AccessInvalidType()); @@ -178,6 +189,7 @@ public class TestProgress : MonoBehaviour /// /// Test whether a value is correctly updated /// + [Test] public void TestProgressUpdate() { Progress progress = new Progress(); @@ -190,6 +202,7 @@ public class TestProgress : MonoBehaviour /// /// Test whether a int value can be read /// + [Test] public void TestProgressGetInt() { Progress progress = new Progress(); @@ -200,6 +213,7 @@ public class TestProgress : MonoBehaviour /// /// Test whether a double value can be read /// + [Test] public void TestProgressGetDouble() { Progress progress = new Progress(); @@ -210,6 +224,7 @@ public class TestProgress : MonoBehaviour /// /// Test whether a string value can be read /// + [Test] public void TestProgressGetString() { Progress progress = new Progress(); @@ -220,6 +235,7 @@ public class TestProgress : MonoBehaviour /// /// Test whether a serializable struct can be read /// + [Test] public void TestProgressGetStruct() { Progress progress = new Progress(); diff --git a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Packet.meta b/Assets/Common/Interfaces.meta similarity index 77% rename from Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Packet.meta rename to Assets/Common/Interfaces.meta index 768aaec..dd149d1 100644 --- a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Packet.meta +++ b/Assets/Common/Interfaces.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 55cd80546e3f9d043b59677c12f0e891 +guid: e88996685ebf2274ea70a64e08b7ddd7 folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Assets/Courses/Scripts/CourseIndex.cs b/Assets/Common/Interfaces/CourseIndex.cs similarity index 100% rename from Assets/Courses/Scripts/CourseIndex.cs rename to Assets/Common/Interfaces/CourseIndex.cs diff --git a/Assets/Courses/Scripts/CourseIndex.cs.meta b/Assets/Common/Interfaces/CourseIndex.cs.meta similarity index 83% rename from Assets/Courses/Scripts/CourseIndex.cs.meta rename to Assets/Common/Interfaces/CourseIndex.cs.meta index a3affde..14e1a8d 100644 --- a/Assets/Courses/Scripts/CourseIndex.cs.meta +++ b/Assets/Common/Interfaces/CourseIndex.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 3ac4eb825ce7bf5499f083eaf34d5d4d +guid: a5bf21dee022ed0489face1c734359de MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Assets/Common/Interfaces/InterfacesScripts.asmdef b/Assets/Common/Interfaces/InterfacesScripts.asmdef new file mode 100644 index 0000000..666b266 --- /dev/null +++ b/Assets/Common/Interfaces/InterfacesScripts.asmdef @@ -0,0 +1,3 @@ +{ + "name": "InterfacesScripts" +} diff --git a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework.meta b/Assets/Common/Interfaces/InterfacesScripts.asmdef.meta similarity index 57% rename from Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework.meta rename to Assets/Common/Interfaces/InterfacesScripts.asmdef.meta index 453e2a3..2ab3a50 100644 --- a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework.meta +++ b/Assets/Common/Interfaces/InterfacesScripts.asmdef.meta @@ -1,7 +1,6 @@ fileFormatVersion: 2 -guid: 3ec4b51665a3e7b499aa9c64fc9c7462 -folderAsset: yes -DefaultImporter: +guid: df9d7b70293a2e14d9d3a018c3956f7a +AssemblyDefinitionImporter: externalObjects: {} userData: assetBundleName: diff --git a/Assets/Common/Scripts/MinigameIndex.cs b/Assets/Common/Interfaces/MinigameIndex.cs similarity index 100% rename from Assets/Common/Scripts/MinigameIndex.cs rename to Assets/Common/Interfaces/MinigameIndex.cs diff --git a/Assets/Common/Scripts/MinigameIndex.cs.meta b/Assets/Common/Interfaces/MinigameIndex.cs.meta similarity index 83% rename from Assets/Common/Scripts/MinigameIndex.cs.meta rename to Assets/Common/Interfaces/MinigameIndex.cs.meta index 3b85726..2b62ebc 100644 --- a/Assets/Common/Scripts/MinigameIndex.cs.meta +++ b/Assets/Common/Interfaces/MinigameIndex.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 44a1fb926248fe240bed2d5c3820630b +guid: 97282ff3b465e3c4682d218b3819b2e8 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Assets/Common/Interfaces/Score.cs b/Assets/Common/Interfaces/Score.cs new file mode 100644 index 0000000..e09da89 --- /dev/null +++ b/Assets/Common/Interfaces/Score.cs @@ -0,0 +1,12 @@ +using System; + +/// +/// Score class TODO: Move to separate file +/// +[Serializable] +public class Score +{ + public int scoreValue; + public string time; +} + diff --git a/Assets/Courses/Scripts/StartPause.cs.meta b/Assets/Common/Interfaces/Score.cs.meta similarity index 83% rename from Assets/Courses/Scripts/StartPause.cs.meta rename to Assets/Common/Interfaces/Score.cs.meta index 590837a..1bd4bb6 100644 --- a/Assets/Courses/Scripts/StartPause.cs.meta +++ b/Assets/Common/Interfaces/Score.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: ae746f332e314e84c9df74b892c75d4d +guid: 295706da5995d69468daf35ad5527089 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Assets/Common/Prefabs/ButtonBack.prefab b/Assets/Common/Prefabs/ButtonBack.prefab index 6c61148..c63cee4 100644 --- a/Assets/Common/Prefabs/ButtonBack.prefab +++ b/Assets/Common/Prefabs/ButtonBack.prefab @@ -148,7 +148,7 @@ GameObject: - component: {fileID: 8299246693487308515} - component: {fileID: 8299246693487308518} - component: {fileID: 8299246693487308512} - - component: {fileID: 4155745828263815687} + - component: {fileID: 4518652150503380115} m_Layer: 5 m_Name: ButtonBack m_TagString: Untagged @@ -229,10 +229,10 @@ MonoBehaviour: m_OnClick: m_PersistentCalls: m_Calls: - - m_Target: {fileID: 4155745828263815687} - m_TargetAssemblyTypeName: ChangeSceneOnClick, Assembly-CSharp - m_MethodName: LoadScene - m_Mode: 5 + - m_Target: {fileID: 4518652150503380115} + m_TargetAssemblyTypeName: BackButton, Assembly-CSharp + m_MethodName: Back + m_Mode: 1 m_Arguments: m_ObjectArgument: {fileID: 0} m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine @@ -241,7 +241,7 @@ MonoBehaviour: m_StringArgument: m_BoolArgument: 0 m_CallState: 2 ---- !u!114 &4155745828263815687 +--- !u!114 &4518652150503380115 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -250,6 +250,6 @@ MonoBehaviour: m_GameObject: {fileID: 8299246693487308514} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 949ba4da8595d52aebc98e6f9b6a405e, type: 3} + m_Script: {fileID: 11500000, guid: c3dd279b546423e4a8a1b28819a6c4a1, type: 3} m_Name: m_EditorClassIdentifier: diff --git a/Assets/Common/Prefabs/ButtonUser.prefab b/Assets/Common/Prefabs/ButtonUser.prefab index 418cd65..0b5fc9a 100644 --- a/Assets/Common/Prefabs/ButtonUser.prefab +++ b/Assets/Common/Prefabs/ButtonUser.prefab @@ -280,7 +280,6 @@ GameObject: - component: {fileID: 2823887524698191630} - component: {fileID: 2823887524698191625} - component: {fileID: 2823887524698191631} - - component: {fileID: 7528776122952476157} - component: {fileID: 9192617418029337932} m_Layer: 5 m_Name: ButtonUser @@ -376,18 +375,6 @@ MonoBehaviour: m_StringArgument: m_BoolArgument: 0 m_CallState: 2 ---- !u!114 &7528776122952476157 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2823887524698191629} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 949ba4da8595d52aebc98e6f9b6a405e, type: 3} - m_Name: - m_EditorClassIdentifier: --- !u!114 &9192617418029337932 MonoBehaviour: m_ObjectHideFlags: 0 diff --git a/Assets/SpellingBee/Prefabs/Theme.prefab b/Assets/Common/Prefabs/Theme Item.prefab similarity index 99% rename from Assets/SpellingBee/Prefabs/Theme.prefab rename to Assets/Common/Prefabs/Theme Item.prefab index 707ffdd..1069252 100644 --- a/Assets/SpellingBee/Prefabs/Theme.prefab +++ b/Assets/Common/Prefabs/Theme Item.prefab @@ -285,7 +285,7 @@ GameObject: - component: {fileID: 1441088452393136283} - component: {fileID: 2691816296520610901} m_Layer: 5 - m_Name: Theme + m_Name: Theme Item m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 diff --git a/Assets/SpellingBee/Prefabs/Theme.prefab.meta b/Assets/Common/Prefabs/Theme Item.prefab.meta similarity index 100% rename from Assets/SpellingBee/Prefabs/Theme.prefab.meta rename to Assets/Common/Prefabs/Theme Item.prefab.meta diff --git a/Assets/Common/Scenes/WebcamAuthorization.unity b/Assets/Common/Scenes/Boot.unity similarity index 100% rename from Assets/Common/Scenes/WebcamAuthorization.unity rename to Assets/Common/Scenes/Boot.unity diff --git a/Assets/Common/Scenes/WebcamAuthorization.unity.meta b/Assets/Common/Scenes/Boot.unity.meta similarity index 100% rename from Assets/Common/Scenes/WebcamAuthorization.unity.meta rename to Assets/Common/Scenes/Boot.unity.meta diff --git a/Assets/Common/Scenes/InfoCourse.unity b/Assets/Common/Scenes/CourseActivityScreen.unity similarity index 95% rename from Assets/Common/Scenes/InfoCourse.unity rename to Assets/Common/Scenes/CourseActivityScreen.unity index 146713a..dec515e 100644 --- a/Assets/Common/Scenes/InfoCourse.unity +++ b/Assets/Common/Scenes/CourseActivityScreen.unity @@ -189,7 +189,7 @@ Transform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 0} - m_RootOrder: 2 + m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &339096154 GameObject: @@ -610,6 +610,7 @@ GameObject: - component: {fileID: 906197777} - component: {fileID: 906197779} - component: {fileID: 906197778} + - component: {fileID: 906197780} m_Layer: 5 m_Name: Panel m_TagString: Untagged @@ -636,6 +637,8 @@ RectTransform: - {fileID: 955994878} - {fileID: 507029407} - {fileID: 1135894725} + - {fileID: 1774458253} + - {fileID: 1804488336} m_Father: {fileID: 1768150806} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} @@ -682,6 +685,24 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 906197776} m_CullTransparentMesh: 1 +--- !u!114 &906197780 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 906197776} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4ee87f3cdcccf934b82f9531c90f3457, type: 3} + m_Name: + m_EditorClassIdentifier: + courseList: {fileID: 11400000, guid: a7ab583094b7897468bbca9243717608, type: 2} + userList: {fileID: 11400000, guid: 072bec636a40f7e4e93b0ac624a3bda2, type: 2} + title: {fileID: 1168097236} + description: {fileID: 1990031300} + courseImage: {fileID: 755030131} + progressBar: {fileID: 1135894726} --- !u!1 &955994877 GameObject: m_ObjectHideFlags: 0 @@ -767,10 +788,10 @@ MonoBehaviour: m_OnClick: m_PersistentCalls: m_Calls: - - m_Target: {fileID: 1122939481} - m_TargetAssemblyTypeName: ChangeSceneOnClick, Assembly-CSharp - m_MethodName: LoadScene - m_Mode: 5 + - m_Target: {fileID: 906197780} + m_TargetAssemblyTypeName: CourseActivityScreen, Assembly-CSharp + m_MethodName: StartCourse + m_Mode: 1 m_Arguments: m_ObjectArgument: {fileID: 0} m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine @@ -893,50 +914,6 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 991775367} m_CullTransparentMesh: 1 ---- !u!1 &1122939480 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1122939482} - - component: {fileID: 1122939481} - m_Layer: 0 - m_Name: SceneControl - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &1122939481 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1122939480} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 949ba4da8595d52aebc98e6f9b6a405e, type: 3} - m_Name: - m_EditorClassIdentifier: ---- !u!4 &1122939482 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1122939480} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1135894724 GameObject: m_ObjectHideFlags: 0 @@ -1162,56 +1139,6 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1168097234} m_CullTransparentMesh: 1 ---- !u!1 &1353360909 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1353360911} - - component: {fileID: 1353360910} - m_Layer: 0 - m_Name: InfoControl - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &1353360910 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1353360909} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4ee87f3cdcccf934b82f9531c90f3457, type: 3} - m_Name: - m_EditorClassIdentifier: - list: {fileID: 11400000, guid: a7ab583094b7897468bbca9243717608, type: 2} - userList: {fileID: 11400000, guid: 072bec636a40f7e4e93b0ac624a3bda2, type: 2} - title: {fileID: 1168097236} - description: {fileID: 1990031300} - courseImage: {fileID: 755030131} - slider: {fileID: 1135894726} ---- !u!4 &1353360911 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1353360909} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 1023.27716, y: 547.95337, z: -1.0753342} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 4 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1768150802 GameObject: m_ObjectHideFlags: 0 @@ -1305,10 +1232,8 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: - {fileID: 906197777} - - {fileID: 1804488336} - - {fileID: 1774458253} m_Father: {fileID: 0} - m_RootOrder: 3 + m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -1320,7 +1245,7 @@ PrefabInstance: m_ObjectHideFlags: 0 serializedVersion: 2 m_Modification: - m_TransformParent: {fileID: 1768150806} + m_TransformParent: {fileID: 906197777} m_Modifications: - target: {fileID: 8299246693487308512, guid: 3bccdf365a4fbea4d8fa1aa461d3dc5c, type: 3} propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_Arguments.m_StringArgument @@ -1340,7 +1265,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8299246693487308515, guid: 3bccdf365a4fbea4d8fa1aa461d3dc5c, type: 3} propertyPath: m_RootOrder - value: 2 + value: 7 objectReference: {fileID: 0} - target: {fileID: 8299246693487308515, guid: 3bccdf365a4fbea4d8fa1aa461d3dc5c, type: 3} propertyPath: m_AnchorMax.x @@ -1426,8 +1351,12 @@ PrefabInstance: m_ObjectHideFlags: 0 serializedVersion: 2 m_Modification: - m_TransformParent: {fileID: 1768150806} + m_TransformParent: {fileID: 906197777} m_Modifications: + - target: {fileID: 1935285004959629519, guid: 53b0d00ac817ebf43b61bea2d160dd66, type: 3} + propertyPath: m_SizeDelta.y + value: 0 + objectReference: {fileID: 0} - target: {fileID: 2823887524698191629, guid: 53b0d00ac817ebf43b61bea2d160dd66, type: 3} propertyPath: m_Name value: ButtonUser @@ -1442,7 +1371,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 2823887524698191630, guid: 53b0d00ac817ebf43b61bea2d160dd66, type: 3} propertyPath: m_RootOrder - value: 1 + value: 8 objectReference: {fileID: 0} - target: {fileID: 2823887524698191630, guid: 53b0d00ac817ebf43b61bea2d160dd66, type: 3} propertyPath: m_AnchorMax.x @@ -1516,6 +1445,26 @@ PrefabInstance: propertyPath: m_LocalEulerAnglesHint.z value: 0 objectReference: {fileID: 0} + - target: {fileID: 4001770636160324653, guid: 53b0d00ac817ebf43b61bea2d160dd66, type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4001770636160324653, guid: 53b0d00ac817ebf43b61bea2d160dd66, type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4001770636160324653, guid: 53b0d00ac817ebf43b61bea2d160dd66, type: 3} + propertyPath: m_SizeDelta.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4001770636160324653, guid: 53b0d00ac817ebf43b61bea2d160dd66, type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4001770636160324653, guid: 53b0d00ac817ebf43b61bea2d160dd66, type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} m_RemovedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: 53b0d00ac817ebf43b61bea2d160dd66, type: 3} --- !u!224 &1804488336 stripped @@ -1535,7 +1484,7 @@ GameObject: - component: {fileID: 1903244526} - component: {fileID: 1903244525} m_Layer: 5 - m_Name: ControlsInfo + m_Name: Controls m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 diff --git a/Assets/Common/Scenes/InfoCourse.unity.meta b/Assets/Common/Scenes/CourseActivityScreen.unity.meta similarity index 100% rename from Assets/Common/Scenes/InfoCourse.unity.meta rename to Assets/Common/Scenes/CourseActivityScreen.unity.meta diff --git a/Assets/Common/Scenes/CoursesScreen.unity b/Assets/Common/Scenes/CoursesMenuScreen.unity similarity index 97% rename from Assets/Common/Scenes/CoursesScreen.unity rename to Assets/Common/Scenes/CoursesMenuScreen.unity index 4dec6f7..d149b02 100644 --- a/Assets/Common/Scenes/CoursesScreen.unity +++ b/Assets/Common/Scenes/CoursesMenuScreen.unity @@ -1204,6 +1204,10 @@ PrefabInstance: m_Modification: m_TransformParent: {fileID: 906197777} m_Modifications: + - target: {fileID: 1935285004959629519, guid: 53b0d00ac817ebf43b61bea2d160dd66, type: 3} + propertyPath: m_SizeDelta.y + value: 0 + objectReference: {fileID: 0} - target: {fileID: 2823887524698191629, guid: 53b0d00ac817ebf43b61bea2d160dd66, type: 3} propertyPath: m_Name value: ButtonUser @@ -1296,6 +1300,26 @@ PrefabInstance: propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_Arguments.m_StringArgument value: Common/Scenes/StartScreen objectReference: {fileID: 0} + - target: {fileID: 4001770636160324653, guid: 53b0d00ac817ebf43b61bea2d160dd66, type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4001770636160324653, guid: 53b0d00ac817ebf43b61bea2d160dd66, type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4001770636160324653, guid: 53b0d00ac817ebf43b61bea2d160dd66, type: 3} + propertyPath: m_SizeDelta.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4001770636160324653, guid: 53b0d00ac817ebf43b61bea2d160dd66, type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4001770636160324653, guid: 53b0d00ac817ebf43b61bea2d160dd66, type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} m_RemovedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: 53b0d00ac817ebf43b61bea2d160dd66, type: 3} --- !u!224 &1782112234 stripped diff --git a/Assets/Common/Scenes/CoursesScreen.unity.meta b/Assets/Common/Scenes/CoursesMenuScreen.unity.meta similarity index 100% rename from Assets/Common/Scenes/CoursesScreen.unity.meta rename to Assets/Common/Scenes/CoursesMenuScreen.unity.meta diff --git a/Assets/Common/Scenes/StartScreen.unity b/Assets/Common/Scenes/MainMenuScreen.unity similarity index 97% rename from Assets/Common/Scenes/StartScreen.unity rename to Assets/Common/Scenes/MainMenuScreen.unity index e84cd22..cad3aeb 100644 --- a/Assets/Common/Scenes/StartScreen.unity +++ b/Assets/Common/Scenes/MainMenuScreen.unity @@ -343,10 +343,10 @@ MonoBehaviour: m_OnClick: m_PersistentCalls: m_Calls: - - m_Target: {fileID: 1122939481} - m_TargetAssemblyTypeName: ChangeSceneOnClick, Assembly-CSharp - m_MethodName: LoadScene - m_Mode: 5 + - m_Target: {fileID: 906197780} + m_TargetAssemblyTypeName: MainMenuScreen, Assembly-CSharp + m_MethodName: GotoMinigames + m_Mode: 1 m_Arguments: m_ObjectArgument: {fileID: 0} m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine @@ -459,7 +459,7 @@ Transform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 0} - m_RootOrder: 2 + m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &519420028 GameObject: @@ -1166,10 +1166,10 @@ MonoBehaviour: m_OnClick: m_PersistentCalls: m_Calls: - - m_Target: {fileID: 1122939481} - m_TargetAssemblyTypeName: ChangeSceneOnClick, Assembly-CSharp - m_MethodName: LoadScene - m_Mode: 5 + - m_Target: {fileID: 906197780} + m_TargetAssemblyTypeName: MainMenuScreen, Assembly-CSharp + m_MethodName: GotoSettings + m_Mode: 1 m_Arguments: m_ObjectArgument: {fileID: 0} m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine @@ -1292,50 +1292,6 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 991775367} m_CullTransparentMesh: 1 ---- !u!1 &1122939480 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1122939482} - - component: {fileID: 1122939481} - m_Layer: 0 - m_Name: SceneControl - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &1122939481 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1122939480} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 949ba4da8595d52aebc98e6f9b6a405e, type: 3} - m_Name: - m_EditorClassIdentifier: ---- !u!4 &1122939482 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1122939480} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1369063653 GameObject: m_ObjectHideFlags: 0 @@ -1497,7 +1453,7 @@ MonoBehaviour: m_PersistentCalls: m_Calls: - m_Target: {fileID: 906197780} - m_TargetAssemblyTypeName: StartScreenManager, Assembly-CSharp + m_TargetAssemblyTypeName: MainMenuScreen, Assembly-CSharp m_MethodName: QuitApplication m_Mode: 1 m_Arguments: @@ -1631,10 +1587,10 @@ MonoBehaviour: m_OnClick: m_PersistentCalls: m_Calls: - - m_Target: {fileID: 1122939481} - m_TargetAssemblyTypeName: ChangeSceneOnClick, Assembly-CSharp - m_MethodName: LoadScene - m_Mode: 5 + - m_Target: {fileID: 906197780} + m_TargetAssemblyTypeName: MainMenuScreen, Assembly-CSharp + m_MethodName: GotoCourses + m_Mode: 1 m_Arguments: m_ObjectArgument: {fileID: 0} m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine @@ -1851,7 +1807,7 @@ RectTransform: m_Children: - {fileID: 906197777} m_Father: {fileID: 0} - m_RootOrder: 3 + m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} diff --git a/Assets/Common/Scenes/StartScreen.unity.meta b/Assets/Common/Scenes/MainMenuScreen.unity.meta similarity index 100% rename from Assets/Common/Scenes/StartScreen.unity.meta rename to Assets/Common/Scenes/MainMenuScreen.unity.meta diff --git a/Assets/Common/Scenes/InfoMinigame.unity b/Assets/Common/Scenes/MinigameActivityScreen.unity similarity index 95% rename from Assets/Common/Scenes/InfoMinigame.unity rename to Assets/Common/Scenes/MinigameActivityScreen.unity index cf8c3c7..5350c7c 100644 --- a/Assets/Common/Scenes/InfoMinigame.unity +++ b/Assets/Common/Scenes/MinigameActivityScreen.unity @@ -189,7 +189,7 @@ Transform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 0} - m_RootOrder: 2 + m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1001 &143992426 PrefabInstance: @@ -198,6 +198,10 @@ PrefabInstance: m_Modification: m_TransformParent: {fileID: 906197777} m_Modifications: + - target: {fileID: 1935285004959629519, guid: 53b0d00ac817ebf43b61bea2d160dd66, type: 3} + propertyPath: m_SizeDelta.y + value: 0 + objectReference: {fileID: 0} - target: {fileID: 2823887524698191629, guid: 53b0d00ac817ebf43b61bea2d160dd66, type: 3} propertyPath: m_Name value: ButtonUser @@ -290,6 +294,26 @@ PrefabInstance: propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_Arguments.m_StringArgument value: Common/Scenes/StartScreen objectReference: {fileID: 0} + - target: {fileID: 4001770636160324653, guid: 53b0d00ac817ebf43b61bea2d160dd66, type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4001770636160324653, guid: 53b0d00ac817ebf43b61bea2d160dd66, type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4001770636160324653, guid: 53b0d00ac817ebf43b61bea2d160dd66, type: 3} + propertyPath: m_SizeDelta.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4001770636160324653, guid: 53b0d00ac817ebf43b61bea2d160dd66, type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4001770636160324653, guid: 53b0d00ac817ebf43b61bea2d160dd66, type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} m_RemovedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: 53b0d00ac817ebf43b61bea2d160dd66, type: 3} --- !u!224 &143992427 stripped @@ -297,59 +321,6 @@ RectTransform: m_CorrespondingSourceObject: {fileID: 2823887524698191630, guid: 53b0d00ac817ebf43b61bea2d160dd66, type: 3} m_PrefabInstance: {fileID: 143992426} m_PrefabAsset: {fileID: 0} ---- !u!1 &351832751 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 351832753} - - component: {fileID: 351832752} - m_Layer: 0 - m_Name: InfoControl - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &351832752 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 351832751} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 90de9a5c57c2189429073f8aadc9e9b7, type: 3} - m_Name: - m_EditorClassIdentifier: - list: {fileID: 11400000, guid: 51453f9b41bc72f468ba3e67ab622f8f, type: 2} - title: {fileID: 1168097236} - description: {fileID: 1990031300} - gameImage: {fileID: 755030131} - button: {fileID: 955994879} - controls: {fileID: 915818721} - userList: {fileID: 11400000, guid: 072bec636a40f7e4e93b0ac624a3bda2, type: 2} - userContainer: {fileID: 507029407} - prefab: {fileID: 381012861935775045, guid: 154c17a838d2896499bd76d28a584222, type: 3} ---- !u!4 &351832753 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 351832751} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 4 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &507029406 GameObject: m_ObjectHideFlags: 0 @@ -363,7 +334,7 @@ GameObject: - component: {fileID: 507029408} - component: {fileID: 507029410} m_Layer: 5 - m_Name: HighScoresTitle + m_Name: Highscores m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -681,6 +652,7 @@ GameObject: - component: {fileID: 906197777} - component: {fileID: 906197779} - component: {fileID: 906197778} + - component: {fileID: 906197780} m_Layer: 5 m_Name: Panel m_TagString: Untagged @@ -754,6 +726,27 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 906197776} m_CullTransparentMesh: 1 +--- !u!114 &906197780 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 906197776} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 90de9a5c57c2189429073f8aadc9e9b7, type: 3} + m_Name: + m_EditorClassIdentifier: + minigameList: {fileID: 11400000, guid: 51453f9b41bc72f468ba3e67ab622f8f, type: 2} + title: {fileID: 1168097236} + description: {fileID: 1990031300} + gameImage: {fileID: 755030131} + button: {fileID: 955994879} + controls: {fileID: 915818721} + userList: {fileID: 11400000, guid: 072bec636a40f7e4e93b0ac624a3bda2, type: 2} + userContainer: {fileID: 507029407} + prefab: {fileID: 381012861935775045, guid: 154c17a838d2896499bd76d28a584222, type: 3} --- !u!1 &915818719 GameObject: m_ObjectHideFlags: 0 @@ -766,7 +759,7 @@ GameObject: - component: {fileID: 915818722} - component: {fileID: 915818721} m_Layer: 5 - m_Name: ControlsInfo + m_Name: Controls m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -902,7 +895,7 @@ GameObject: - component: {fileID: 955994880} - component: {fileID: 955994879} m_Layer: 5 - m_Name: PlayButton + m_Name: Play Button m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -1088,50 +1081,6 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 991775367} m_CullTransparentMesh: 1 ---- !u!1 &1122939480 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1122939482} - - component: {fileID: 1122939481} - m_Layer: 0 - m_Name: SceneControl - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &1122939481 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1122939480} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 949ba4da8595d52aebc98e6f9b6a405e, type: 3} - m_Name: - m_EditorClassIdentifier: ---- !u!4 &1122939482 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1122939480} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1168097234 GameObject: m_ObjectHideFlags: 0 @@ -1467,7 +1416,7 @@ RectTransform: m_Children: - {fileID: 906197777} m_Father: {fileID: 0} - m_RootOrder: 3 + m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} diff --git a/Assets/Common/Scenes/InfoMinigame.unity.meta b/Assets/Common/Scenes/MinigameActivityScreen.unity.meta similarity index 100% rename from Assets/Common/Scenes/InfoMinigame.unity.meta rename to Assets/Common/Scenes/MinigameActivityScreen.unity.meta diff --git a/Assets/SpellingBee/Scenes/ThemeSelection.unity b/Assets/Common/Scenes/ThemeSelectionScreen.unity similarity index 99% rename from Assets/SpellingBee/Scenes/ThemeSelection.unity rename to Assets/Common/Scenes/ThemeSelectionScreen.unity index 555df50..df4025a 100644 --- a/Assets/SpellingBee/Scenes/ThemeSelection.unity +++ b/Assets/Common/Scenes/ThemeSelectionScreen.unity @@ -706,7 +706,7 @@ MonoBehaviour: m_GameObject: {fileID: 1768150802} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 68caaa5508a4d40448b47630ff86f035, type: 3} + m_Script: {fileID: 11500000, guid: 30d9f9130bf1d414aaad006b2177bdea, type: 3} m_Name: m_EditorClassIdentifier: themePrefab: {fileID: 1441088452393136277, guid: 67febbbd89041e243b4e201a9f8d91e9, type: 3} diff --git a/Assets/SpellingBee/Scenes/ThemeSelection.unity.meta b/Assets/Common/Scenes/ThemeSelectionScreen.unity.meta similarity index 100% rename from Assets/SpellingBee/Scenes/ThemeSelection.unity.meta rename to Assets/Common/Scenes/ThemeSelectionScreen.unity.meta diff --git a/Assets/Common/Scripts/BackButton.cs b/Assets/Common/Scripts/BackButton.cs new file mode 100644 index 0000000..764fc06 --- /dev/null +++ b/Assets/Common/Scripts/BackButton.cs @@ -0,0 +1,15 @@ +using UnityEngine; + +/// +/// Script managing the default 'back'-button action +/// +public class BackButton : MonoBehaviour +{ + /// + /// The default 'back'-button action: go back to the previous scene + /// + public void Back() + { + SystemController.GetInstance().BackToPreviousScene(); + } +} diff --git a/Assets/Courses/Scripts/Webcam.cs.meta b/Assets/Common/Scripts/BackButton.cs.meta similarity index 83% rename from Assets/Courses/Scripts/Webcam.cs.meta rename to Assets/Common/Scripts/BackButton.cs.meta index 9ae1349..0e3e13b 100644 --- a/Assets/Courses/Scripts/Webcam.cs.meta +++ b/Assets/Common/Scripts/BackButton.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: a85f8bd9399680347b4be72850a56fcf +guid: c3dd279b546423e4a8a1b28819a6c4a1 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Assets/Common/Scripts/WebcamAuthorization.cs b/Assets/Common/Scripts/BootScreen.cs similarity index 86% rename from Assets/Common/Scripts/WebcamAuthorization.cs rename to Assets/Common/Scripts/BootScreen.cs index 8190409..ef66015 100644 --- a/Assets/Common/Scripts/WebcamAuthorization.cs +++ b/Assets/Common/Scripts/BootScreen.cs @@ -1,12 +1,11 @@ using System.Collections; using TMPro; using UnityEngine; -using UnityEngine.SceneManagement; /// /// Authorize and check for available webcam(s) /// -public class WebcamAuthorization : MonoBehaviour +public class BootScreen : MonoBehaviour { /// /// UI Reference to the text object to display an error message @@ -24,7 +23,7 @@ public class WebcamAuthorization : MonoBehaviour { if (0 < WebCamTexture.devices.Length) { - SceneManager.LoadScene("Common/Scenes/StartScreen"); + SystemController.GetInstance().SwapScene("Common/Scenes/MainMenuScreen"); } else { diff --git a/Assets/Common/Scripts/WebcamAuthorization.cs.meta b/Assets/Common/Scripts/BootScreen.cs.meta similarity index 100% rename from Assets/Common/Scripts/WebcamAuthorization.cs.meta rename to Assets/Common/Scripts/BootScreen.cs.meta diff --git a/Assets/Common/Scripts/ChangeSceneOnClick.cs b/Assets/Common/Scripts/ChangeSceneOnClick.cs deleted file mode 100644 index 7e7b0d9..0000000 --- a/Assets/Common/Scripts/ChangeSceneOnClick.cs +++ /dev/null @@ -1,35 +0,0 @@ -using UnityEngine; -using UnityEngine.SceneManagement; - -/// -/// Class to handle scene loading callbacks -/// -public class ChangeSceneOnClick : MonoBehaviour -{ - /// - /// Method used as callback for gameobject onClick events - /// - /// The path to the new scene (path == $"Assets/{sceneName}") - public void LoadScene(string sceneName) - { - SceneManager.LoadScene(sceneName); - } - - /// - /// Method used as callback for gameobject onClick events - /// - /// Reference to a scene - public void LoadScene(Scene scene) - { - SceneManager.LoadScene(scene.buildIndex); - } - - /// - /// Method used as callback from gameobject onClick events - /// - /// Build index of the scene to be loaded - public void LoadScene(int buildIndex) - { - SceneManager.LoadScene(buildIndex); - } -} diff --git a/Assets/Common/Scripts/CommonScripts.asmdef b/Assets/Common/Scripts/CommonScripts.asmdef new file mode 100644 index 0000000..99f32a7 --- /dev/null +++ b/Assets/Common/Scripts/CommonScripts.asmdef @@ -0,0 +1,19 @@ +{ + "name": "CommonScripts", + "rootNamespace": "", + "references": [ + "GUID:6055be8ebefd69e48b49212b09b47b2f", + "GUID:63c63e721f65ebb7d871cb9ef49f4752", + "GUID:1631ed2680c61245b8211d943c1639a8", + "GUID:df9d7b70293a2e14d9d3a018c3956f7a" + ], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Format.meta b/Assets/Common/Scripts/CommonScripts.asmdef.meta similarity index 57% rename from Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Format.meta rename to Assets/Common/Scripts/CommonScripts.asmdef.meta index c9c53b4..cacb227 100644 --- a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Format.meta +++ b/Assets/Common/Scripts/CommonScripts.asmdef.meta @@ -1,7 +1,6 @@ fileFormatVersion: 2 -guid: 4a55a1703b7efe449be66773a42e7ff0 -folderAsset: yes -DefaultImporter: +guid: 3444c67d5a3a93e5a95a48906078c372 +AssemblyDefinitionImporter: externalObjects: {} userData: assetBundleName: diff --git a/Assets/Common/Scripts/InfoCourse.cs b/Assets/Common/Scripts/CourseActivityScreen.cs similarity index 70% rename from Assets/Common/Scripts/InfoCourse.cs rename to Assets/Common/Scripts/CourseActivityScreen.cs index e1918d9..d64569b 100644 --- a/Assets/Common/Scripts/InfoCourse.cs +++ b/Assets/Common/Scripts/CourseActivityScreen.cs @@ -1,18 +1,16 @@ -using System.Collections; -using System.Collections.Generic; +using TMPro; using UnityEngine; using UnityEngine.UI; -using TMPro; // For text /// /// Manager infopage for the Courses /// -public class InfoCourse : MonoBehaviour +public class CourseActivityScreen : MonoBehaviour { /// /// Reference to the courses /// - public CourseList list; + public CourseList courseList; // private float maxvalue; In case we want to change progress e.g. amount of words correct, then change maxvalue amount of words etc. /// @@ -43,17 +41,15 @@ public class InfoCourse : MonoBehaviour /// /// Progress bar Display /// - public Slider slider; - - - // Start is called before the first frame update + public Slider progressBar; + /// /// Sets the infopage for a given course /// void Start() { - int index = list.currentCourseIndex; - Course course = list.courses[index]; + int index = courseList.currentCourseIndex; + Course course = courseList.courses[index]; title.text = course.title; description.text = course.description; @@ -63,9 +59,16 @@ public class InfoCourse : MonoBehaviour // Set progress progress = userList.GetCurrentUser().GetCourseProgress(course.index); if (progress != null) - slider.value = progress.Get("courseProgress"); + progressBar.value = progress.Get("courseProgress"); else - slider.value = 0.0f; + progressBar.value = 0.0f; } + /// + /// Callback to start the course + /// + public void StartCourse() + { + SystemController.GetInstance().LoadNextScene("Courses/Scenes/TemplateCourse"); + } } diff --git a/Assets/Common/Scripts/InfoCourse.cs.meta b/Assets/Common/Scripts/CourseActivityScreen.cs.meta similarity index 100% rename from Assets/Common/Scripts/InfoCourse.cs.meta rename to Assets/Common/Scripts/CourseActivityScreen.cs.meta diff --git a/Assets/Common/Scripts/CourseItem.cs b/Assets/Common/Scripts/CourseItem.cs index be5f01c..98fe52c 100644 --- a/Assets/Common/Scripts/CourseItem.cs +++ b/Assets/Common/Scripts/CourseItem.cs @@ -1,6 +1,5 @@ using TMPro; using UnityEngine; -using UnityEngine.SceneManagement; using UnityEngine.UI; /// @@ -68,6 +67,6 @@ public class CourseItem : MonoBehaviour slider.GetComponent().value = progress; // Add click functionality - button.onClick.AddListener(() => SceneManager.LoadScene("Common/Scenes/InfoCourse")); + button.onClick.AddListener(() => SystemController.GetInstance().LoadNextScene("Common/Scenes/CourseActivityScreen")); } } diff --git a/Assets/Common/Scripts/CourseListManager.cs b/Assets/Common/Scripts/ListCoursesScreen.cs similarity index 79% rename from Assets/Common/Scripts/CourseListManager.cs rename to Assets/Common/Scripts/ListCoursesScreen.cs index 40548a1..ebf78bf 100644 --- a/Assets/Common/Scripts/CourseListManager.cs +++ b/Assets/Common/Scripts/ListCoursesScreen.cs @@ -1,10 +1,9 @@ using UnityEngine; -using UnityEngine.SceneManagement; /// /// ListCourseScreen scene manager /// -public class CourseListManager : MonoBehaviour +public class ListCoursesScreen : MonoBehaviour { /// /// Reference to the course-list container object @@ -40,9 +39,8 @@ public class CourseListManager : MonoBehaviour /// /// Method used as callback for course item onClick events /// - /// The path to the new scene (path == $"Assets/{sceneName}") - public void LoadScene(string sceneName) + public void GotoCourseInfo() { - SceneManager.LoadScene(sceneName); + SystemController.GetInstance().LoadNextScene("Common/Scenes/CourseActivityScreen"); } } diff --git a/Assets/Common/Scripts/CourseListManager.cs.meta b/Assets/Common/Scripts/ListCoursesScreen.cs.meta similarity index 100% rename from Assets/Common/Scripts/CourseListManager.cs.meta rename to Assets/Common/Scripts/ListCoursesScreen.cs.meta diff --git a/Assets/Common/Scripts/MinigameListManager.cs b/Assets/Common/Scripts/ListMinigamesScreen.cs similarity index 90% rename from Assets/Common/Scripts/MinigameListManager.cs rename to Assets/Common/Scripts/ListMinigamesScreen.cs index 44fb9f6..613d674 100644 --- a/Assets/Common/Scripts/MinigameListManager.cs +++ b/Assets/Common/Scripts/ListMinigamesScreen.cs @@ -1,10 +1,9 @@ using UnityEngine; -using UnityEngine.SceneManagement; /// /// ListMinigameScreen scene manager /// -public class MinigameListManager : MonoBehaviour +public class ListMinigamesScreen : MonoBehaviour { /// /// Reference to minigame-list container object @@ -43,6 +42,6 @@ public class MinigameListManager : MonoBehaviour /// The path to the new scene (path == $"Assets/{sceneName}") public void LoadScene(string sceneName) { - SceneManager.LoadScene(sceneName); + SystemController.GetInstance().LoadNextScene(sceneName); } } diff --git a/Assets/Common/Scripts/MinigameListManager.cs.meta b/Assets/Common/Scripts/ListMinigamesScreen.cs.meta similarity index 100% rename from Assets/Common/Scripts/MinigameListManager.cs.meta rename to Assets/Common/Scripts/ListMinigamesScreen.cs.meta diff --git a/Assets/Common/Scripts/MainMenuScreen.cs b/Assets/Common/Scripts/MainMenuScreen.cs new file mode 100644 index 0000000..1a7885a --- /dev/null +++ b/Assets/Common/Scripts/MainMenuScreen.cs @@ -0,0 +1,57 @@ +using System.IO; +using UnityEngine; + +/// +/// StartScreen scene manager +/// +public class MainMenuScreen : MonoBehaviour +{ + /// + /// Referece to the userlist to check whether an user account is present + /// + public UserList userList; + + /// + /// Check on load whether a user is already present, + /// if not load the UserCreationScreen scene so the user can create a new account + /// + void Awake() + { + if (!File.Exists(UserList.PATH) || userList.GetUsers().Count <= 0) + { + SystemController.GetInstance().LoadNextScene("Accounts/Scenes/UserCreationScreen"); + } + } + + /// + /// Quit the application + /// + public void QuitApplication() + { + Application.Quit(); + } + + /// + /// Load the `CoursesMenuScreen` scene + /// + public void GotoCourses() + { + SystemController.GetInstance().LoadNextScene("Common/Scenes/CoursesMenuScreen"); + } + + /// + /// Load the `ListMinigamesScreen` scene + /// + public void GotoMinigames() + { + SystemController.GetInstance().LoadNextScene("Common/Scenes/ListMinigamesScreen"); + } + + /// + /// Load the `SettingsScreen` scene + /// + public void GotoSettings() + { + SystemController.GetInstance().LoadNextScene("Common/Scenes/SettingsScreen"); + } +} diff --git a/Assets/Common/Scripts/StartScreenManager.cs.meta b/Assets/Common/Scripts/MainMenuScreen.cs.meta similarity index 100% rename from Assets/Common/Scripts/StartScreenManager.cs.meta rename to Assets/Common/Scripts/MainMenuScreen.cs.meta diff --git a/Assets/Common/Scripts/Minigame.cs b/Assets/Common/Scripts/Minigame.cs index 069dd31..c33c3fb 100644 --- a/Assets/Common/Scripts/Minigame.cs +++ b/Assets/Common/Scripts/Minigame.cs @@ -21,6 +21,11 @@ public class Minigame : ScriptableObject /// public string description; + /// + /// Whether or not the game needs a theme to be selected + /// + public bool needsTheme; + /// /// Reference to the minigame thumbnail /// @@ -35,5 +40,4 @@ public class Minigame : ScriptableObject /// An explanation on how to play the game and score points /// public string controls; - } diff --git a/Assets/Common/Scripts/InfoMinigame.cs b/Assets/Common/Scripts/MinigameActivityScreen.cs similarity index 84% rename from Assets/Common/Scripts/InfoMinigame.cs rename to Assets/Common/Scripts/MinigameActivityScreen.cs index 08eeaec..3acf8fb 100644 --- a/Assets/Common/Scripts/InfoMinigame.cs +++ b/Assets/Common/Scripts/MinigameActivityScreen.cs @@ -1,23 +1,19 @@ using System; -using System.Collections; using System.Collections.Generic; using System.Linq; using TMPro; -using UnityEditor; using UnityEngine; -using UnityEngine.SceneManagement; using UnityEngine.UI; -using static GameController; /// /// Manager infopage for the Minigames /// -public class InfoMinigame : MonoBehaviour +public class MinigameActivityScreen : MonoBehaviour { /// /// Reference to the Minigames /// - public MinigameList list; + public MinigameList minigameList; /// /// Title Display @@ -44,8 +40,6 @@ public class InfoMinigame : MonoBehaviour /// public TMP_Text controls; - // Scores for each user - /// /// Reference to the users /// @@ -66,7 +60,6 @@ public class InfoMinigame : MonoBehaviour /// public GameObject prefab; - // Start is called before the first frame update /// /// Sets the infopage for a given minigame /// @@ -82,17 +75,24 @@ public class InfoMinigame : MonoBehaviour private void GenerateContent() { // Get current minigame - int index = list.currentMinigameIndex; - Minigame minigame = list.minigames[index]; - + int index = minigameList.currentMinigameIndex; + Minigame minigame = minigameList.minigames[index]; + // Set main screen title.text = minigame.title; description.text = minigame.description; gameImage.sprite = minigame.thumbnail; controls.text = minigame.controls; - // Add click functionality - button.onClick.AddListener(() => SceneManager.LoadScene(minigame.minigameEntryPoint)); + // Add click + if (minigame.needsTheme) + { + button.onClick.AddListener(() => SystemController.GetInstance().LoadNextScene("Common/Scenes/ThemeSelectionScreen")); + } + else + { + button.onClick.AddListener(() => SystemController.GetInstance().LoadNextScene(minigame.minigameEntryPoint)); + } } /// @@ -104,8 +104,8 @@ public class InfoMinigame : MonoBehaviour private void GenerateHighScores() { // Get current minigame - int index = list.currentMinigameIndex; - Minigame minigame = list.minigames[index]; + int index = minigameList.currentMinigameIndex; + Minigame minigame = minigameList.minigames[index]; List> allScores = new List>(); foreach (User user in userList.GetUsers()) @@ -137,7 +137,6 @@ public class InfoMinigame : MonoBehaviour instance.transform.Find("Title").GetComponent().text = username; instance.transform.Find("Avatar").GetComponent().sprite = sprite; instance.transform.Find("Score").GetComponent().text = score.scoreValue.ToString(); - } } } diff --git a/Assets/Common/Scripts/InfoMinigame.cs.meta b/Assets/Common/Scripts/MinigameActivityScreen.cs.meta similarity index 100% rename from Assets/Common/Scripts/InfoMinigame.cs.meta rename to Assets/Common/Scripts/MinigameActivityScreen.cs.meta diff --git a/Assets/Common/Scripts/MinigameItem.cs b/Assets/Common/Scripts/MinigameItem.cs index 2d6c110..b652236 100644 --- a/Assets/Common/Scripts/MinigameItem.cs +++ b/Assets/Common/Scripts/MinigameItem.cs @@ -1,6 +1,5 @@ using TMPro; using UnityEngine; -using UnityEngine.SceneManagement; using UnityEngine.UI; /// @@ -47,6 +46,10 @@ public class MinigameItem : MonoBehaviour title.text = minigame.title; // Add click functionality - button.onClick.AddListener(() => SceneManager.LoadScene("Common/Scenes/InfoMinigame")); + button.onClick.AddListener(() => + { + PlayerPrefs.SetString("gamePath", minigame.minigameEntryPoint); + SystemController.GetInstance().LoadNextScene("Common/Scenes/MinigameActivityScreen"); + }); } } diff --git a/Assets/Common/Scripts/StartScreenManager.cs b/Assets/Common/Scripts/StartScreenManager.cs deleted file mode 100644 index ea93cd9..0000000 --- a/Assets/Common/Scripts/StartScreenManager.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System.IO; -using UnityEngine; -using UnityEngine.SceneManagement; - -/// -/// StartScreen scene manager -/// -public class StartScreenManager : MonoBehaviour -{ - /// - /// Referece to the userlist to check whether an user account is present - /// - public UserList userList; - - /// - /// Check on load whether a user is already present, - /// if not load the UserCreationScreen scene so the user can create a new account - /// - void Awake() - { - if (!File.Exists(UserList.PATH) || userList.GetUsers().Count <= 0) - { - SceneManager.LoadScene("Accounts/Scenes/UserCreationScreen"); - } - } - - public void QuitApplication() - { - Application.Quit(); - } -} diff --git a/Assets/SpellingBee/Scripts/ThemeItem.cs b/Assets/Common/Scripts/ThemeItem.cs similarity index 100% rename from Assets/SpellingBee/Scripts/ThemeItem.cs rename to Assets/Common/Scripts/ThemeItem.cs diff --git a/Assets/SpellingBee/Scripts/ThemeItem.cs.meta b/Assets/Common/Scripts/ThemeItem.cs.meta similarity index 100% rename from Assets/SpellingBee/Scripts/ThemeItem.cs.meta rename to Assets/Common/Scripts/ThemeItem.cs.meta diff --git a/Assets/Common/Scripts/ThemeLoader.cs b/Assets/Common/Scripts/ThemeLoader.cs new file mode 100644 index 0000000..2b9b072 --- /dev/null +++ b/Assets/Common/Scripts/ThemeLoader.cs @@ -0,0 +1,36 @@ +using UnityEngine; + +/// +/// JSON structure containing all themes/words +/// +[System.Serializable] +public class ThemeList +{ + public Theme[] themes; +} + +/// +/// Object representing part of the JSON containing word data +/// +[System.Serializable] +public class Theme +{ + public string name; + public string description; + public string[] words; +} + +/// +/// Loader of the themes-JSON +/// +public class ThemeLoader : MonoBehaviour +{ + /// + /// Loads the JSON file containing all of the themes + /// + public static ThemeList LoadJson() + { + TextAsset themeJson = Resources.Load("Common/words"); + return JsonUtility.FromJson(themeJson.text); + } +} diff --git a/Assets/SpellingBee/Scripts/ThemeLoader.cs.meta b/Assets/Common/Scripts/ThemeLoader.cs.meta similarity index 100% rename from Assets/SpellingBee/Scripts/ThemeLoader.cs.meta rename to Assets/Common/Scripts/ThemeLoader.cs.meta diff --git a/Assets/SpellingBee/Scripts/ThemeSelectionController.cs b/Assets/Common/Scripts/ThemeSelectionScreen.cs similarity index 59% rename from Assets/SpellingBee/Scripts/ThemeSelectionController.cs rename to Assets/Common/Scripts/ThemeSelectionScreen.cs index d635ca4..f7c27f1 100644 --- a/Assets/SpellingBee/Scripts/ThemeSelectionController.cs +++ b/Assets/Common/Scripts/ThemeSelectionScreen.cs @@ -1,16 +1,24 @@ using UnityEngine; -using UnityEngine.SceneManagement; -public class ThemeSelectionController : MonoBehaviour +/// +/// ThemeSelectionScreen scene manager +/// +public class ThemeSelectionScreen : MonoBehaviour { - [Header("Theme Selection")] - // Theme prefab + /// + /// Theme prefab + /// public GameObject themePrefab; - // Reference to container holding all theme-buttons + + /// + /// Reference to container holding all theme-buttons + /// public Transform themesContainer; - - public void Start() + /// + /// Start is called before the first frame update + /// + void Start() { // TODO: change to ScriptableObject ThemeList themeList = ThemeLoader.LoadJson(); @@ -30,9 +38,13 @@ public class ThemeSelectionController : MonoBehaviour } } + /// + /// Load the game with a specified theme + /// + /// Name of the clicked theme public void OnButtonClick(string clickedTheme) { PlayerPrefs.SetString("themeName", clickedTheme); - SceneManager.LoadScene("Game"); + SystemController.GetInstance().SwapScene(PlayerPrefs.GetString("gamePath")); } } diff --git a/Assets/EditModeTests/BasicTest.cs.meta b/Assets/Common/Scripts/ThemeSelectionScreen.cs.meta similarity index 83% rename from Assets/EditModeTests/BasicTest.cs.meta rename to Assets/Common/Scripts/ThemeSelectionScreen.cs.meta index c08356d..1b2a48e 100644 --- a/Assets/EditModeTests/BasicTest.cs.meta +++ b/Assets/Common/Scripts/ThemeSelectionScreen.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 74f8b297e568e071198f12d32c3f32c0 +guid: 30d9f9130bf1d414aaad006b2177bdea MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Assets/Common/Scripts/UserButton.cs b/Assets/Common/Scripts/UserButton.cs index a08f6ad..157764b 100644 --- a/Assets/Common/Scripts/UserButton.cs +++ b/Assets/Common/Scripts/UserButton.cs @@ -1,6 +1,5 @@ using TMPro; using UnityEngine; -using UnityEngine.SceneManagement; using UnityEngine.UI; /// @@ -44,7 +43,7 @@ public class UserButton : MonoBehaviour /// public void OpenProgressCallback() { - SceneManager.LoadScene("Accounts/Scenes/UserProgressScreen"); + SystemController.GetInstance().LoadNextScene("Accounts/Scenes/UserProgressScreen"); } /// @@ -52,7 +51,7 @@ public class UserButton : MonoBehaviour /// public void ChangeUserCallback() { - SceneManager.LoadScene("Accounts/Scenes/ChangeUserScreen"); + SystemController.GetInstance().LoadNextScene("Accounts/Scenes/ChangeUserScreen"); } /// diff --git a/Assets/Courses/Scenes/Course_0.unity b/Assets/Courses/Scenes/TemplateCourse.unity similarity index 89% rename from Assets/Courses/Scenes/Course_0.unity rename to Assets/Courses/Scenes/TemplateCourse.unity index a38148c..2560b35 100644 --- a/Assets/Courses/Scenes/Course_0.unity +++ b/Assets/Courses/Scenes/TemplateCourse.unity @@ -394,61 +394,6 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 100123244} m_CullTransparentMesh: 1 ---- !u!1 &118887548 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 118887550} - - component: {fileID: 118887549} - m_Layer: 0 - m_Name: Button-controller - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &118887549 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 118887548} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: ae746f332e314e84c9df74b892c75d4d, type: 3} - m_Name: - m_EditorClassIdentifier: - player: {fileID: 993952931} - button: {fileID: 1159630774} - pauseSprite: {fileID: 21300000, guid: 43db869a07cf51f45a411b6e4a417743, type: 3} - wordImage: {fileID: 2145235737} - title: {fileID: 388014849} - userList: {fileID: 11400000, guid: 072bec636a40f7e4e93b0ac624a3bda2, type: 2} - courselist: {fileID: 11400000, guid: a7ab583094b7897468bbca9243717608, type: 2} - ResultPanel: {fileID: 1383144366} - CoursesButton: {fileID: 839294691} - Webcam: {fileID: 1485779445} - timeSpent: {fileID: 77614869} ---- !u!4 &118887550 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 118887548} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 5 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &301088547 GameObject: m_ObjectHideFlags: 0 @@ -460,6 +405,7 @@ GameObject: - component: {fileID: 301088548} - component: {fileID: 301088550} - component: {fileID: 301088549} + - component: {fileID: 301088551} m_Layer: 5 m_Name: Panel m_TagString: Untagged @@ -480,12 +426,12 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: - {fileID: 2145235736} - - {fileID: 414055543} - {fileID: 1493108463} - {fileID: 378145455} - {fileID: 1343151409} - {fileID: 1813638489} - {fileID: 409590586} + - {fileID: 1335886460} m_Father: {fileID: 1559094126} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} @@ -532,6 +478,32 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 301088547} m_CullTransparentMesh: 0 +--- !u!114 &301088551 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 301088547} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 6b3f784c065813a4a8364b1299284816, type: 3} + m_Name: + m_EditorClassIdentifier: + webcamDisplay: {fileID: 378145456} + feedback: {fileID: 409590587} + feedbackPopup: {fileID: 1374011069} + dynamic: {fileID: 1523390682} + player: {fileID: 993952931} + button: {fileID: 1159630774} + pauseSprite: {fileID: 21300000, guid: 43db869a07cf51f45a411b6e4a417743, type: 3} + wordImage: {fileID: 2145235737} + title: {fileID: 388014849} + userList: {fileID: 11400000, guid: 072bec636a40f7e4e93b0ac624a3bda2, type: 2} + courselist: {fileID: 11400000, guid: a7ab583094b7897468bbca9243717608, type: 2} + ResultPanel: {fileID: 1383144366} + CoursesButton: {fileID: 839294691} + timeSpent: {fileID: 77614869} --- !u!1 &361280475 GameObject: m_ObjectHideFlags: 0 @@ -749,7 +721,7 @@ GameObject: - component: {fileID: 378145457} - component: {fileID: 378145456} m_Layer: 5 - m_Name: Webcam-bg + m_Name: Webcam Background m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -768,7 +740,7 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 301088548} - m_RootOrder: 3 + m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} @@ -822,7 +794,7 @@ GameObject: - component: {fileID: 388014850} - component: {fileID: 388014849} m_Layer: 5 - m_Name: title + m_Name: Title m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -960,7 +932,7 @@ GameObject: - component: {fileID: 409590588} - component: {fileID: 409590587} m_Layer: 5 - m_Name: Test-feedback-button + m_Name: Feedback Button m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -980,7 +952,7 @@ RectTransform: m_Children: - {fileID: 1138468890} m_Father: {fileID: 301088548} - m_RootOrder: 6 + m_RootOrder: 5 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} @@ -1031,9 +1003,9 @@ MonoBehaviour: m_OnClick: m_PersistentCalls: m_Calls: - - m_Target: {fileID: 1485779445} - m_TargetAssemblyTypeName: Webcam, Assembly-CSharp - m_MethodName: Show_feedback + - m_Target: {fileID: 301088551} + m_TargetAssemblyTypeName: TemplateCourse, Assembly-CSharp + m_MethodName: ShowFeedback m_Mode: 1 m_Arguments: m_ObjectArgument: {fileID: 0} @@ -1081,140 +1053,6 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 409590585} m_CullTransparentMesh: 1 ---- !u!1 &414055542 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 414055543} - - component: {fileID: 414055546} - - component: {fileID: 414055545} - - component: {fileID: 414055544} - m_Layer: 5 - m_Name: Courses - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &414055543 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 414055542} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 1785847568} - m_Father: {fileID: 301088548} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 234, y: -60} - m_SizeDelta: {x: 480.0704, y: 99.1845} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &414055544 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 414055542} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Navigation: - m_Mode: 3 - m_WrapAround: 0 - m_SelectOnUp: {fileID: 0} - m_SelectOnDown: {fileID: 0} - m_SelectOnLeft: {fileID: 0} - m_SelectOnRight: {fileID: 0} - m_Transition: 1 - m_Colors: - m_NormalColor: {r: 1, g: 1, b: 1, a: 1} - m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} - m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} - m_ColorMultiplier: 1 - m_FadeDuration: 0.1 - m_SpriteState: - m_HighlightedSprite: {fileID: 0} - m_PressedSprite: {fileID: 0} - m_SelectedSprite: {fileID: 0} - m_DisabledSprite: {fileID: 0} - m_AnimationTriggers: - m_NormalTrigger: Normal - m_HighlightedTrigger: Highlighted - m_PressedTrigger: Pressed - m_SelectedTrigger: Selected - m_DisabledTrigger: Disabled - m_Interactable: 1 - m_TargetGraphic: {fileID: 414055545} - m_OnClick: - m_PersistentCalls: - m_Calls: - - m_Target: {fileID: 1485779445} - m_TargetAssemblyTypeName: Webcam, Assembly-CSharp - m_MethodName: LoadScene - m_Mode: 5 - m_Arguments: - m_ObjectArgument: {fileID: 0} - m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine - m_IntArgument: 0 - m_FloatArgument: 0 - m_StringArgument: CoursesScreen - m_BoolArgument: 0 - m_CallState: 2 ---- !u!114 &414055545 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 414055542} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 0, g: 0, b: 0, a: 0} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Sprite: {fileID: 10917, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 1 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!222 &414055546 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 414055542} - m_CullTransparentMesh: 1 --- !u!1 &519420028 GameObject: m_ObjectHideFlags: 0 @@ -1518,13 +1356,13 @@ MonoBehaviour: m_OnClick: m_PersistentCalls: m_Calls: - - m_Target: {fileID: 0} - m_TargetAssemblyTypeName: - m_MethodName: + - m_Target: {fileID: 301088551} + m_TargetAssemblyTypeName: TemplateCourse, Assembly-CSharp + m_MethodName: Back m_Mode: 1 m_Arguments: m_ObjectArgument: {fileID: 0} - m_ObjectArgumentAssemblyTypeName: + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine m_IntArgument: 0 m_FloatArgument: 0 m_StringArgument: @@ -2130,7 +1968,7 @@ MonoBehaviour: m_OnClick: m_PersistentCalls: m_Calls: - - m_Target: {fileID: 118887549} + - m_Target: {fileID: 0} m_TargetAssemblyTypeName: StartPause, Assembly-CSharp m_MethodName: Pause m_Mode: 1 @@ -2256,6 +2094,120 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1300721216} m_CullTransparentMesh: 1 +--- !u!1001 &1335886459 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 301088548} + m_Modifications: + - target: {fileID: 8299246693487308512, guid: 3bccdf365a4fbea4d8fa1aa461d3dc5c, type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_Target + value: + objectReference: {fileID: 301088551} + - target: {fileID: 8299246693487308512, guid: 3bccdf365a4fbea4d8fa1aa461d3dc5c, type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_MethodName + value: Back + objectReference: {fileID: 0} + - target: {fileID: 8299246693487308512, guid: 3bccdf365a4fbea4d8fa1aa461d3dc5c, type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_TargetAssemblyTypeName + value: TemplateCourse, Assembly-CSharp + objectReference: {fileID: 0} + - target: {fileID: 8299246693487308514, guid: 3bccdf365a4fbea4d8fa1aa461d3dc5c, type: 3} + propertyPath: m_Name + value: ButtonBack + objectReference: {fileID: 0} + - target: {fileID: 8299246693487308515, guid: 3bccdf365a4fbea4d8fa1aa461d3dc5c, type: 3} + propertyPath: m_Pivot.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8299246693487308515, guid: 3bccdf365a4fbea4d8fa1aa461d3dc5c, type: 3} + propertyPath: m_Pivot.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 8299246693487308515, guid: 3bccdf365a4fbea4d8fa1aa461d3dc5c, type: 3} + propertyPath: m_RootOrder + value: 6 + objectReference: {fileID: 0} + - target: {fileID: 8299246693487308515, guid: 3bccdf365a4fbea4d8fa1aa461d3dc5c, type: 3} + propertyPath: m_AnchorMax.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8299246693487308515, guid: 3bccdf365a4fbea4d8fa1aa461d3dc5c, type: 3} + propertyPath: m_AnchorMax.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 8299246693487308515, guid: 3bccdf365a4fbea4d8fa1aa461d3dc5c, type: 3} + propertyPath: m_AnchorMin.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8299246693487308515, guid: 3bccdf365a4fbea4d8fa1aa461d3dc5c, type: 3} + propertyPath: m_AnchorMin.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 8299246693487308515, guid: 3bccdf365a4fbea4d8fa1aa461d3dc5c, type: 3} + propertyPath: m_SizeDelta.x + value: 300 + objectReference: {fileID: 0} + - target: {fileID: 8299246693487308515, guid: 3bccdf365a4fbea4d8fa1aa461d3dc5c, type: 3} + propertyPath: m_SizeDelta.y + value: 120 + objectReference: {fileID: 0} + - target: {fileID: 8299246693487308515, guid: 3bccdf365a4fbea4d8fa1aa461d3dc5c, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8299246693487308515, guid: 3bccdf365a4fbea4d8fa1aa461d3dc5c, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8299246693487308515, guid: 3bccdf365a4fbea4d8fa1aa461d3dc5c, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8299246693487308515, guid: 3bccdf365a4fbea4d8fa1aa461d3dc5c, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 8299246693487308515, guid: 3bccdf365a4fbea4d8fa1aa461d3dc5c, type: 3} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 8299246693487308515, guid: 3bccdf365a4fbea4d8fa1aa461d3dc5c, type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 8299246693487308515, guid: 3bccdf365a4fbea4d8fa1aa461d3dc5c, type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 8299246693487308515, guid: 3bccdf365a4fbea4d8fa1aa461d3dc5c, type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8299246693487308515, guid: 3bccdf365a4fbea4d8fa1aa461d3dc5c, type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8299246693487308515, guid: 3bccdf365a4fbea4d8fa1aa461d3dc5c, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8299246693487308515, guid: 3bccdf365a4fbea4d8fa1aa461d3dc5c, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8299246693487308515, guid: 3bccdf365a4fbea4d8fa1aa461d3dc5c, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 3bccdf365a4fbea4d8fa1aa461d3dc5c, type: 3} +--- !u!224 &1335886460 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 8299246693487308515, guid: 3bccdf365a4fbea4d8fa1aa461d3dc5c, type: 3} + m_PrefabInstance: {fileID: 1335886459} + m_PrefabAsset: {fileID: 0} --- !u!1 &1343151408 GameObject: m_ObjectHideFlags: 0 @@ -2269,7 +2221,7 @@ GameObject: - component: {fileID: 1343151411} - component: {fileID: 1343151410} m_Layer: 5 - m_Name: Change-cam + m_Name: Change Webcam Button m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -2289,7 +2241,7 @@ RectTransform: m_Children: - {fileID: 1898926705} m_Father: {fileID: 301088548} - m_RootOrder: 4 + m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} @@ -2340,8 +2292,8 @@ MonoBehaviour: m_OnClick: m_PersistentCalls: m_Calls: - - m_Target: {fileID: 1485779445} - m_TargetAssemblyTypeName: Webcam, Assembly-CSharp + - m_Target: {fileID: 301088551} + m_TargetAssemblyTypeName: TemplateCourse, Assembly-CSharp m_MethodName: SwapCam m_Mode: 1 m_Arguments: @@ -2402,7 +2354,7 @@ GameObject: - component: {fileID: 1374011072} - component: {fileID: 1374011071} m_Layer: 5 - m_Name: Panel + m_Name: Feedback m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -2701,54 +2653,6 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1427866734} m_CullTransparentMesh: 1 ---- !u!1 &1485779444 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1485779446} - - component: {fileID: 1485779445} - m_Layer: 0 - m_Name: Webcam-controller - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &1485779445 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1485779444} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: a85f8bd9399680347b4be72850a56fcf, type: 3} - m_Name: - m_EditorClassIdentifier: - display: {fileID: 378145456} - feedback: {fileID: 409590587} - popup: {fileID: 1374011069} - dynamic: {fileID: 1523390682} ---- !u!4 &1485779446 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1485779444} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 4 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1493108462 GameObject: m_ObjectHideFlags: 0 @@ -2761,7 +2665,7 @@ GameObject: - component: {fileID: 1493108465} - component: {fileID: 1493108464} m_Layer: 5 - m_Name: video-bg + m_Name: Video Background m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -2781,7 +2685,7 @@ RectTransform: m_Children: - {fileID: 1159630773} m_Father: {fileID: 301088548} - m_RootOrder: 2 + m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} @@ -3199,141 +3103,6 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1773033262} m_CullTransparentMesh: 1 ---- !u!1 &1785847567 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1785847568} - - component: {fileID: 1785847570} - - component: {fileID: 1785847569} - m_Layer: 5 - m_Name: Text (TMP) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1785847568 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1785847567} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 414055543} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0.00024414062} - m_SizeDelta: {x: 0, y: 0.00048828} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1785847569 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1785847567} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_text: < Back to courses - m_isRightToLeft: 0 - m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} - m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} - m_fontSharedMaterials: [] - m_fontMaterial: {fileID: 0} - m_fontMaterials: [] - m_fontColor32: - serializedVersion: 2 - rgba: 4281479730 - m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} - m_enableVertexGradient: 0 - m_colorMode: 3 - m_fontColorGradient: - topLeft: {r: 1, g: 1, b: 1, a: 1} - topRight: {r: 1, g: 1, b: 1, a: 1} - bottomLeft: {r: 1, g: 1, b: 1, a: 1} - bottomRight: {r: 1, g: 1, b: 1, a: 1} - m_fontColorGradientPreset: {fileID: 0} - m_spriteAsset: {fileID: 0} - m_tintAllSprites: 0 - m_StyleSheet: {fileID: 0} - m_TextStyleHashCode: -1183493901 - m_overrideHtmlColors: 0 - m_faceColor: - serializedVersion: 2 - rgba: 4294967295 - m_fontSize: 48 - m_fontSizeBase: 48 - m_fontWeight: 400 - m_enableAutoSizing: 0 - m_fontSizeMin: 18 - m_fontSizeMax: 72 - m_fontStyle: 0 - m_HorizontalAlignment: 2 - m_VerticalAlignment: 512 - m_textAlignment: 65535 - m_characterSpacing: 0 - m_wordSpacing: 0 - m_lineSpacing: 0 - m_lineSpacingMax: 0 - m_paragraphSpacing: 0 - m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 - m_wordWrappingRatios: 0.4 - m_overflowMode: 0 - m_linkedTextComponent: {fileID: 0} - parentLinkedComponent: {fileID: 0} - m_enableKerning: 1 - m_enableExtraPadding: 0 - checkPaddingRequired: 0 - m_isRichText: 1 - m_parseCtrlCharacters: 1 - m_isOrthographic: 1 - m_isCullingEnabled: 0 - m_horizontalMapping: 0 - m_verticalMapping: 0 - m_uvLineOffset: 0 - m_geometrySortingOrder: 0 - m_IsTextObjectScaleStatic: 0 - m_VertexBufferAutoSizeReduction: 0 - m_useMaxVisibleDescender: 1 - m_pageToDisplay: 1 - m_margin: {x: 0, y: 0, z: 0, w: 0} - m_isUsingLegacyAnimationComponent: 0 - m_isVolumetricText: 0 - m_hasFontAssetChanged: 0 - m_baseMaterial: {fileID: 0} - m_maskOffset: {x: 0, y: 0, z: 0, w: 0} ---- !u!222 &1785847570 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1785847567} - m_CullTransparentMesh: 1 --- !u!1 &1813638488 GameObject: m_ObjectHideFlags: 0 @@ -3347,7 +3116,7 @@ GameObject: - component: {fileID: 1813638491} - component: {fileID: 1813638490} m_Layer: 5 - m_Name: Next-sign-button + m_Name: Next Sign Button m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -3367,7 +3136,7 @@ RectTransform: m_Children: - {fileID: 1427866735} m_Father: {fileID: 301088548} - m_RootOrder: 5 + m_RootOrder: 4 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} @@ -3418,8 +3187,8 @@ MonoBehaviour: m_OnClick: m_PersistentCalls: m_Calls: - - m_Target: {fileID: 118887549} - m_TargetAssemblyTypeName: StartPause, Assembly-CSharp + - m_Target: {fileID: 301088551} + m_TargetAssemblyTypeName: TemplateCourse, Assembly-CSharp m_MethodName: NextSign m_Mode: 1 m_Arguments: @@ -3617,7 +3386,7 @@ GameObject: - component: {fileID: 2145235738} - component: {fileID: 2145235737} m_Layer: 5 - m_Name: Tutorial-image-bg + m_Name: Learnable Sprite m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 diff --git a/Assets/Courses/Scenes/Course_0.unity.meta b/Assets/Courses/Scenes/TemplateCourse.unity.meta similarity index 100% rename from Assets/Courses/Scenes/Course_0.unity.meta rename to Assets/Courses/Scenes/TemplateCourse.unity.meta diff --git a/Assets/Courses/Scripts/CourseScripts.asmdef b/Assets/Courses/Scripts/CourseScripts.asmdef new file mode 100644 index 0000000..7f69e18 --- /dev/null +++ b/Assets/Courses/Scripts/CourseScripts.asmdef @@ -0,0 +1,18 @@ +{ + "name": "CourseScripts", + "rootNamespace": "", + "references": [ + "Unity.TextMeshPro", + "AccountsScripts", + "InterfacesScripts" + ], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/Assets/Courses/Scripts/CourseScripts.asmdef.meta b/Assets/Courses/Scripts/CourseScripts.asmdef.meta new file mode 100644 index 0000000..4a5c479 --- /dev/null +++ b/Assets/Courses/Scripts/CourseScripts.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 63c63e721f65ebb7d871cb9ef49f4752 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Courses/Scripts/StartPause.cs b/Assets/Courses/Scripts/TemplateCourse.cs similarity index 64% rename from Assets/Courses/Scripts/StartPause.cs rename to Assets/Courses/Scripts/TemplateCourse.cs index 2a68003..774d69d 100644 --- a/Assets/Courses/Scripts/StartPause.cs +++ b/Assets/Courses/Scripts/TemplateCourse.cs @@ -5,11 +5,39 @@ using UnityEngine.UI; using UnityEngine.Video; /// -/// This class is responsible for loading all data from the Course-scriptableobject. -/// Specifically it fetches and displays the correct title, videos and images while also keeping track of the progress. +/// TemplateCourse scene manager /// -public class StartPause : MonoBehaviour +public class TemplateCourse : MonoBehaviour { + /// + /// Index to indicate which camera is being used + /// + private int camdex = 0; + + /// + /// This texture is used as an intermidiary between the camera output and the display image + /// + private WebCamTexture tex; + + /// + /// Reference to the RawImage that will display the video + /// + public RawImage webcamDisplay; + + /// + /// Reference to the button that is currently used to test the feedback-display + /// + public Button feedback; + + /// + /// This is a reference to the PANEL that holds the feedbackwindow + /// + public GameObject feedbackPopup; + + /// + /// This is a reference to the textfield that holds the part of the feedback-window that will change: bad/good/excellent + /// + public TMP_Text dynamic; /// /// Reference to instructional video player @@ -19,22 +47,21 @@ public class StartPause : MonoBehaviour /// Reference to pause button /// public Button button; - + /// /// Reference to sprite for the pause button /// public Sprite pauseSprite; - + /// /// Reference to the image for displaying the current words sprite /// public Image wordImage; - + /// /// Reference to the text object for displaying the current word /// - public TextMeshProUGUI title; - + public TMP_Text title; /// /// Reference to user list to get current user @@ -45,29 +72,27 @@ public class StartPause : MonoBehaviour /// The current user /// private User user; - + /// /// Current user progress for this course /// private Progress progress = null; - /// /// ScriptableObject with list of all courses /// public CourseList courselist; - + /// /// Reference to Course ScriptableObject /// private Course course; - /// /// Index of the current word/letter in the course.learnables list /// private int currentWordIndex = 0; - + /// /// This holds the amount of words in the course /// @@ -89,11 +114,6 @@ public class StartPause : MonoBehaviour /// public Button CoursesButton; - /// - /// Webcam class to close the webcam when the course is finished - /// - public Webcam Webcam; - /// /// DateTime containint the start moment /// @@ -102,16 +122,28 @@ public class StartPause : MonoBehaviour /// /// Reference to the timeSpent UI /// - public TextMeshProUGUI timeSpent; + public TMP_Text timeSpent; /// /// This function is called when the script is initialised. + /// It inactivatis the popup, finds a webcam to use and links it via the WebcamTexture to the display RawImage. /// It takes the correct course from the courselist, using the courseIndex. /// Then it checks whether or not the User has started the course yet, to possibly create a new progress atribute for the course. /// Then it sets up the course-screen to display relevant information from the course-scriptable. /// - public void Awake() + void Awake() { + // Setting up Webcam + feedbackPopup.SetActive(false); + if (WebCamTexture.devices.Length > 0) + { + WebCamDevice device = WebCamTexture.devices[camdex]; + tex = new WebCamTexture(device.name); + webcamDisplay.texture = tex; + + tex.Play(); + } + // Setting up course course = courselist.courses[courselist.currentCourseIndex]; maxWords = course.learnables.Count; @@ -140,7 +172,6 @@ public class StartPause : MonoBehaviour startMoment = DateTime.Now; } - // These two functions generate video and image from files /// /// This function uses the word_i integer to grab the correct video from the course.learnabels. /// When it has this video, it will load it into the videoplayer and set it to start. @@ -190,7 +221,6 @@ public class StartPause : MonoBehaviour } } - // Press next-sign button for next word /// /// This function is called when the next-sign button is pressed. /// It increased the wordindex and fetches new videos/images if index /// finishcourse is called to save the "finished" progress to the user. /// @@ -236,10 +265,78 @@ public class StartPause : MonoBehaviour timeSpent.text = time.ToString(@"hh\:mm\:ss"); // Link button - //CoursesButton.onClick.AddListener(() => { SceneManager.LoadScene("Assets/Common/Scenes/CoursesScreen.unity"); }); - CoursesButton.onClick.AddListener(() => { Webcam.LoadScene("Assets/Common/Scenes/CoursesScreen.unity"); }); + CoursesButton.onClick.AddListener(() => { SystemController.GetInstance().BackToPreviousScene(); }); progress.AddOrUpdate("courseProgress", 1f); userList.Save(); } + + /// + /// So long as there are cameras to use, you swap the camera you are using to another in the list. + /// + public void SwapCam() + { + if (WebCamTexture.devices.Length > 0) + { + // Stop the old camera + // If there was no camera playing before, then you dont have to reset the texture, as it wasn't assigned in the first place. + if (tex.isPlaying) + { + webcamDisplay.texture = null; + tex.Stop(); + tex = null; + } + // Find the new camera + camdex += 1; + camdex %= WebCamTexture.devices.Length; + // Start the new camera + WebCamDevice device = WebCamTexture.devices[camdex]; + tex = new WebCamTexture(device.name); + webcamDisplay.texture = tex; + + tex.Play(); + } + } + + /// + /// The normal sceneChanger cannot be used here since the camera also needs to be stopped. + /// This extra functionality is implemented in this function + /// + /// The path for the scene you want to travel to, assuming root-directory is Assets + public void Back() + { + webcamDisplay.texture = null; + tex.Stop(); + tex = null; + + SystemController.GetInstance().BackToPreviousScene(); + } + + /// + /// This function toggles between inactivity and activity for the popup panel. + /// This will be changed later when the model gets integrated, probably being timed to dissapear. + /// + public void ShowFeedback() + { + if (feedbackPopup.activeSelf) + { + dynamic.text = ""; + feedbackPopup.SetActive(false); + return; + } + double index = UnityEngine.Random.value; + if (index < 0.5) + { + dynamic.text = "Poor"; + } + else if (index > 0.8) + { + dynamic.text = "Excellent"; + } + else + { + dynamic.text = "Good"; + } + feedbackPopup.SetActive(true); + } } diff --git a/Assets/Courses/Scripts/TemplateCourse.cs.meta b/Assets/Courses/Scripts/TemplateCourse.cs.meta new file mode 100644 index 0000000..d5f2567 --- /dev/null +++ b/Assets/Courses/Scripts/TemplateCourse.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6b3f784c065813a4a8364b1299284816 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Courses/Scripts/Webcam.cs b/Assets/Courses/Scripts/Webcam.cs deleted file mode 100644 index 88027ba..0000000 --- a/Assets/Courses/Scripts/Webcam.cs +++ /dev/null @@ -1,128 +0,0 @@ -using TMPro; -using UnityEngine; -using UnityEngine.SceneManagement; -using UnityEngine.UI; - -/// -/// This class is dedicated to the camera and other actions that later could be connected to it, like the feedback. -/// It is responsible for finding working cameras, displaying them and being able to toggle between them. -/// This class also holds temporary code to display feedback via a button. -/// -public class Webcam : MonoBehaviour -{ - - /// - /// Index to indicate which camera is being used - /// - int camdex = 0; - - - /// - /// This texture is used as an intermidiary between the camera output and the display image - /// - WebCamTexture tex; - - /// - /// Reference to the RawImage that will display the video - /// - public RawImage display; - - /// - /// Reference to the button that is currently used to test the feedback-display - /// - public Button feedback; - - /// - /// This is a reference to the PANEL that holds the feedbackwindow - /// - public GameObject popup; - - /// - /// This is a reference to the textfield that holds the part of the feedback-window that will change: bad/good/excellent - /// - public TextMeshProUGUI dynamic; - - /// - /// This function is called at the start of the frame. - /// It inactivatis the popup, finds a webcam to use and links it via the WebcamTexture to the display RawImage. - /// - void Awake() - { - popup.SetActive(false); - if (WebCamTexture.devices.Length > 0) { - WebCamDevice device = WebCamTexture.devices[camdex]; - tex = new WebCamTexture(device.name); - display.texture = tex; - - tex.Play(); - } - } - - /// - /// So long as there are cameras to use, you swap the camera you are using to another in the list. - /// - public void SwapCam() - { - if (WebCamTexture.devices.Length > 0) - { - // Stop the old camera - // If there was no camera playing before, then you dont have to reset the texture, as it wasn't assigned in the first place. - if (tex.isPlaying) { - display.texture = null; - tex.Stop(); - tex = null; - } - // Find the new camera - camdex += 1; - camdex %= WebCamTexture.devices.Length; - // Start the new camera - WebCamDevice device = WebCamTexture.devices[camdex]; - tex = new WebCamTexture(device.name); - display.texture = tex; - - tex.Play(); - } - } - - /// - /// The normal sceneChanger cannot be used here since the camera also needs to be stopped. - /// This extra functionality is implemented in this function - /// - /// The path for the scene you want to travel to, assuming root-directory is Assets - public void LoadScene(string sceneName) - { - display.texture = null; - tex.Stop(); - tex = null; - - SceneManager.LoadScene(sceneName); - } - - /// - /// This function toggles between inactivity and activity for the popup panel. - /// This will be changed later when the model gets integrated, probably being timed to dissapear. - /// - public void Show_feedback() - { - if (popup.activeSelf) - { - dynamic.text = ""; - popup.SetActive(false); - return; - } - double index = UnityEngine.Random.value; - if (index < 0.5) - { - dynamic.text = "Poor"; - } - else if (index > 0.8) - { - dynamic.text = "Excellent"; - } - else - { - dynamic.text = "Good"; - } - popup.SetActive(true); - } -} diff --git a/Assets/EditModeTests/BasicTest.cs b/Assets/EditModeTests/BasicTest.cs deleted file mode 100644 index 6c756b8..0000000 --- a/Assets/EditModeTests/BasicTest.cs +++ /dev/null @@ -1,11 +0,0 @@ -using NUnit.Framework; - -public class BasicTest -{ - // check if edit mode tests works - [Test] - public void AlwaysTrueTest() - { - Assert.True(true); - } -} diff --git a/Assets/EditModeTests/EditModeTests.asmdef b/Assets/EditModeTests/EditModeTests.asmdef deleted file mode 100644 index 8f5d1b5..0000000 --- a/Assets/EditModeTests/EditModeTests.asmdef +++ /dev/null @@ -1,9 +0,0 @@ -{ - "name": "EditModeTests", - "optionalUnityReferences": [ - "TestAssemblies" - ], - "includePlatforms": [ - "Editor" - ] -} \ No newline at end of file diff --git a/Assets/JustSign/ScriptableObjects/JustSign.asset b/Assets/JustSign/ScriptableObjects/JustSign.asset new file mode 100644 index 0000000..d3ed1a8 --- /dev/null +++ b/Assets/JustSign/ScriptableObjects/JustSign.asset @@ -0,0 +1,21 @@ +%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: d7809d135a59849458ccb29ffad535c5, type: 3} + m_Name: JustSign + m_EditorClassIdentifier: + index: 2 + title: Just Sign + description: A rhythm game + needsTheme: 1 + thumbnail: {fileID: 0} + minigameEntryPoint: JustSign/Scenes/Game + controls: test diff --git a/Assets/JustSign/ScriptableObjects/JustSign.asset.meta b/Assets/JustSign/ScriptableObjects/JustSign.asset.meta new file mode 100644 index 0000000..48877a1 --- /dev/null +++ b/Assets/JustSign/ScriptableObjects/JustSign.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e726e0b93ea88465db7ee27605deb83f +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/SpellingBee/words.json b/Assets/Resources/Common/words.json similarity index 100% rename from Assets/Resources/SpellingBee/words.json rename to Assets/Resources/Common/words.json diff --git a/Assets/Resources/SpellingBee/words.json.meta b/Assets/Resources/Common/words.json.meta similarity index 100% rename from Assets/Resources/SpellingBee/words.json.meta rename to Assets/Resources/Common/words.json.meta diff --git a/Assets/SpellingBee/Scenes/Game.unity b/Assets/SpellingBee/Scenes/Game.unity index f82d493..2838990 100644 --- a/Assets/SpellingBee/Scenes/Game.unity +++ b/Assets/SpellingBee/Scenes/Game.unity @@ -324,7 +324,7 @@ Transform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 0} - m_RootOrder: 2 + m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &519420028 GameObject: @@ -1111,7 +1111,7 @@ PrefabInstance: m_Modifications: - target: {fileID: 8299246693487308512, guid: 3bccdf365a4fbea4d8fa1aa461d3dc5c, type: 3} propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_Mode - value: 5 + value: 1 objectReference: {fileID: 0} - target: {fileID: 8299246693487308512, guid: 3bccdf365a4fbea4d8fa1aa461d3dc5c, type: 3} propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_Target @@ -1119,7 +1119,7 @@ PrefabInstance: objectReference: {fileID: 1537631145} - target: {fileID: 8299246693487308512, guid: 3bccdf365a4fbea4d8fa1aa461d3dc5c, type: 3} propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_MethodName - value: LoadScene + value: GotoThemeSelection objectReference: {fileID: 0} - target: {fileID: 8299246693487308512, guid: 3bccdf365a4fbea4d8fa1aa461d3dc5c, type: 3} propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_TargetAssemblyTypeName @@ -1127,7 +1127,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8299246693487308512, guid: 3bccdf365a4fbea4d8fa1aa461d3dc5c, type: 3} propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_Arguments.m_StringArgument - value: SpellingBee/Scenes/ThemeSelection + value: Common/Scenes/ThemeSelection objectReference: {fileID: 0} - target: {fileID: 8299246693487308514, guid: 3bccdf365a4fbea4d8fa1aa461d3dc5c, type: 3} propertyPath: m_Name @@ -1143,7 +1143,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8299246693487308515, guid: 3bccdf365a4fbea4d8fa1aa461d3dc5c, type: 3} propertyPath: m_RootOrder - value: 6 + value: 5 objectReference: {fileID: 0} - target: {fileID: 8299246693487308515, guid: 3bccdf365a4fbea4d8fa1aa461d3dc5c, type: 3} propertyPath: m_AnchorMax.x @@ -2181,50 +2181,6 @@ MonoBehaviour: m_hasFontAssetChanged: 0 m_baseMaterial: {fileID: 0} m_maskOffset: {x: 0, y: 0, z: 0, w: 0} ---- !u!1 &1122939480 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1122939482} - - component: {fileID: 1122939481} - m_Layer: 0 - m_Name: SceneControl - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &1122939481 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1122939480} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 949ba4da8595d52aebc98e6f9b6a405e, type: 3} - m_Name: - m_EditorClassIdentifier: ---- !u!4 &1122939482 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1122939480} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1172084826 GameObject: m_ObjectHideFlags: 0 @@ -3135,19 +3091,7 @@ MonoBehaviour: m_TargetGraphic: {fileID: 1346891279} m_OnClick: m_PersistentCalls: - m_Calls: - - m_Target: {fileID: 0} - m_TargetAssemblyTypeName: - m_MethodName: - m_Mode: 1 - m_Arguments: - m_ObjectArgument: {fileID: 0} - m_ObjectArgumentAssemblyTypeName: - m_IntArgument: 0 - m_FloatArgument: 0 - m_StringArgument: - m_BoolArgument: 0 - m_CallState: 2 + m_Calls: [] --- !u!114 &1346891279 MonoBehaviour: m_ObjectHideFlags: 0 @@ -3777,7 +3721,6 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: display: {fileID: 588634507} - dynamic: {fileID: 0} --- !u!1 &1570625040 GameObject: m_ObjectHideFlags: 0 @@ -4453,7 +4396,7 @@ RectTransform: m_Children: - {fileID: 906197777} m_Father: {fileID: 0} - m_RootOrder: 3 + m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -4472,7 +4415,6 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 44fbed5ae228de39b9f727def7578d06, type: 3} m_Name: m_EditorClassIdentifier: - input: {fileID: 0} endText: {fileID: 1502459770} lpmText: {fileID: 1172084829} lettersRightText: {fileID: 994850063} diff --git a/Assets/SpellingBee/ScriptableObjects/SpellingBee.asset b/Assets/SpellingBee/ScriptableObjects/SpellingBee.asset index 50c6917..9eb697b 100644 --- a/Assets/SpellingBee/ScriptableObjects/SpellingBee.asset +++ b/Assets/SpellingBee/ScriptableObjects/SpellingBee.asset @@ -16,8 +16,9 @@ MonoBehaviour: title: Spelling Bee description: In deze minigame krijg je verschillende woorden voorgeschoteld die je zo snel mogelijk moet spellen met behulp van het vingeralfabet + needsTheme: 1 thumbnail: {fileID: 21300000, guid: d99bb2dc44e35344fa358208a01c06c4, type: 3} - minigameEntryPoint: SpellingBee/Scenes/ThemeSelection + minigameEntryPoint: SpellingBee/Scenes/Game controls: Je begint dit spel met 5 seconden tijd, voor elk juist antwoord krijg je extra tijd. Hoe sneller je het spel uitspeelt, hoe meer punten je scoort. Verloopt de timer, dan heb je het spelletje verloren diff --git a/Assets/SpellingBee/Scripts/GameController.cs b/Assets/SpellingBee/Scripts/GameController.cs index 91767fb..e2d71a9 100644 --- a/Assets/SpellingBee/Scripts/GameController.cs +++ b/Assets/SpellingBee/Scripts/GameController.cs @@ -6,7 +6,7 @@ using TMPro; using UnityEngine; using UnityEngine.UI; -public class GameController : MonoBehaviour +public partial class GameController : MonoBehaviour { /// /// All of the words that can be used in this session @@ -125,7 +125,6 @@ public class GameController : MonoBehaviour /// private DateTime startTime; - /// /// Reference to the user list to access the current user /// @@ -192,16 +191,6 @@ public class GameController : MonoBehaviour /// public GameObject scoreboardEntry; - /// - /// Score class TODO: Move to separate file - /// - [Serializable] - public class Score - { - public int scoreValue; - public string time; - } - /// /// Start is called before the first frame update @@ -331,11 +320,12 @@ public class GameController : MonoBehaviour if (correctLetters + incorrectLetters > 0) { accuracyText.text = ((correctLetters) * 100f / (correctLetters + incorrectLetters)).ToString("#.##") + "%"; - } else + } + else { accuracyText.text = "-"; } - + // Words wordsText.text = spelledWords.ToString(); diff --git a/Assets/SpellingBee/Scripts/Score.cs b/Assets/SpellingBee/Scripts/Score.cs new file mode 100644 index 0000000..6d4840a --- /dev/null +++ b/Assets/SpellingBee/Scripts/Score.cs @@ -0,0 +1,14 @@ +using System; + +public partial class GameController +{ + /// + /// Score class TODO: Move to separate file + /// + [Serializable] + public class Score + { + public int scoreValue; + public string time; + } +} diff --git a/Assets/SpellingBee/Scripts/Score.cs.meta b/Assets/SpellingBee/Scripts/Score.cs.meta new file mode 100644 index 0000000..8d122b6 --- /dev/null +++ b/Assets/SpellingBee/Scripts/Score.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 44c1f8e0fa862b44485ebaa3c81698fc +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SpellingBee/Scripts/SpellingBeeScripts.asmdef b/Assets/SpellingBee/Scripts/SpellingBeeScripts.asmdef new file mode 100644 index 0000000..78a9950 --- /dev/null +++ b/Assets/SpellingBee/Scripts/SpellingBeeScripts.asmdef @@ -0,0 +1,19 @@ +{ + "name": "SpellingBeeScripts", + "rootNamespace": "", + "references": [ + "GUID:6055be8ebefd69e48b49212b09b47b2f", + "GUID:1631ed2680c61245b8211d943c1639a8", + "GUID:3444c67d5a3a93e5a95a48906078c372", + "GUID:df9d7b70293a2e14d9d3a018c3956f7a" + ], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/Assets/SpellingBee/Scripts/SpellingBeeScripts.asmdef.meta b/Assets/SpellingBee/Scripts/SpellingBeeScripts.asmdef.meta new file mode 100644 index 0000000..c0ce243 --- /dev/null +++ b/Assets/SpellingBee/Scripts/SpellingBeeScripts.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 49d8025a5c8c313cea12c9a1de36c09b +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SpellingBee/Scripts/SpellingBeeWebcam.cs b/Assets/SpellingBee/Scripts/SpellingBeeWebcam.cs index 4db4025..30a01d5 100644 --- a/Assets/SpellingBee/Scripts/SpellingBeeWebcam.cs +++ b/Assets/SpellingBee/Scripts/SpellingBeeWebcam.cs @@ -1,20 +1,31 @@ -using TMPro; using UnityEngine; -using UnityEngine.SceneManagement; using UnityEngine.UI; +/// +/// Class to manage all webcam stuff inside the SpellingBee minigame +/// public class SpellingBeeWebcam : MonoBehaviour { + /// + /// Index of the current camera + /// int camdex = 0; + + /// + /// Texture to paste on the display + /// WebCamTexture tex; + /// + /// Display for the video feed + /// public RawImage display; - public TextMeshProUGUI dynamic; + /// + /// Setup the webcam correctly + /// void Awake() { - //popup.SetActive(false); - WebCamDevice device = WebCamTexture.devices[camdex]; tex = new WebCamTexture(device.name); display.texture = tex; @@ -22,6 +33,9 @@ public class SpellingBeeWebcam : MonoBehaviour tex.Play(); } + /// + /// Swap webcam by cycling through the `WebCamTexture.devices` list + /// public void SwapCam() { if (WebCamTexture.devices.Length > 0) @@ -44,33 +58,15 @@ public class SpellingBeeWebcam : MonoBehaviour } } - // Scene changing is implemented here to avoid problems with webcam - public void LoadScene(string sceneName) + /// + /// Scene changing is implemented here to avoid problems with webcam + /// + public void GotoThemeSelection() { display.texture = null; tex.Stop(); tex = null; - SceneManager.LoadScene(sceneName); + SystemController.GetInstance().BackToPreviousScene(); } - /* - public void Show_feedback(){ - if(popup.activeSelf){ - dynamic.text = ""; - popup.SetActive(false); - return; - } - double index = UnityEngine.Random.value; - if(index < 0.5){ - dynamic.text = "Poor"; - } - else if(index > 0.8){ - dynamic.text = "Excellent"; - } - else{ - dynamic.text = "Good"; - } - popup.SetActive(true); - } - */ } diff --git a/Assets/SpellingBee/Scripts/ThemeLoader.cs b/Assets/SpellingBee/Scripts/ThemeLoader.cs deleted file mode 100644 index 2ede8c1..0000000 --- a/Assets/SpellingBee/Scripts/ThemeLoader.cs +++ /dev/null @@ -1,27 +0,0 @@ -using UnityEngine; - -// JSON structure containing all themes/words -[System.Serializable] -public class ThemeList -{ - public Theme[] themes; -} - -// Object representing part of the JSON containing word data -[System.Serializable] -public class Theme -{ - public string name; - public string description; - public string[] words; -} - -public class ThemeLoader : MonoBehaviour -{ - // Loads the JSON file containing all of the themes - public static ThemeList LoadJson() - { - TextAsset themeJson = Resources.Load("SpellingBee/words"); - return JsonUtility.FromJson(themeJson.text); - } -} diff --git a/Assets/SpellingBee/Scripts/ThemeSelectionController.cs.meta b/Assets/SpellingBee/Scripts/ThemeSelectionController.cs.meta deleted file mode 100644 index 106373a..0000000 --- a/Assets/SpellingBee/Scripts/ThemeSelectionController.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 68caaa5508a4d40448b47630ff86f035 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Fallback.asset b/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Fallback.asset old mode 100755 new mode 100644 index 5cd0b82..22d431f --- a/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Fallback.asset +++ b/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Fallback.asset @@ -193,774 +193,19 @@ MonoBehaviour: m_StrikethroughOffset: 18 m_StrikethroughThickness: 6.298828 m_TabWidth: 24 - m_GlyphTable: - - m_Index: 3 - m_Metrics: - m_Width: 0 - m_Height: 0 - m_HorizontalBearingX: 0 - m_HorizontalBearingY: 0 - m_HorizontalAdvance: 24 - m_GlyphRect: - m_X: 0 - m_Y: 0 - m_Width: 0 - m_Height: 0 - m_Scale: 1 - m_AtlasIndex: 0 - m_ClassDefinitionType: 0 - - m_Index: 11 - m_Metrics: - m_Width: 24 - m_Height: 80 - m_HorizontalBearingX: 5 - m_HorizontalBearingY: 62 - m_HorizontalAdvance: 29 - m_GlyphRect: - m_X: 452 - m_Y: 85 - m_Width: 24 - m_Height: 80 - m_Scale: 1 - m_AtlasIndex: 0 - m_ClassDefinitionType: 0 - - m_Index: 12 - m_Metrics: - m_Width: 24 - m_Height: 80 - m_HorizontalBearingX: 0 - m_HorizontalBearingY: 62 - m_HorizontalAdvance: 29 - m_GlyphRect: - m_X: 331 - m_Y: 101 - m_Width: 24 - m_Height: 80 - m_Scale: 1 - m_AtlasIndex: 0 - m_ClassDefinitionType: 0 - - m_Index: 16 - m_Metrics: - m_Width: 23 - m_Height: 7 - m_HorizontalBearingX: 3 - m_HorizontalBearingY: 26 - m_HorizontalAdvance: 29 - m_GlyphRect: - m_X: 341 - m_Y: 75 - m_Width: 23 - m_Height: 7 - m_Scale: 1 - m_AtlasIndex: 0 - m_ClassDefinitionType: 0 - - m_Index: 17 - m_Metrics: - m_Width: 10 - m_Height: 9 - m_HorizontalBearingX: 7 - m_HorizontalBearingY: 9 - m_HorizontalAdvance: 24 - m_GlyphRect: - m_X: 418 - m_Y: 169 - m_Width: 10 - m_Height: 9 - m_Scale: 1 - m_AtlasIndex: 0 - m_ClassDefinitionType: 0 - - m_Index: 19 - m_Metrics: - m_Width: 42 - m_Height: 61 - m_HorizontalBearingX: 3 - m_HorizontalBearingY: 60 - m_HorizontalAdvance: 48 - m_GlyphRect: - m_X: 190 - m_Y: 170 - m_Width: 42 - m_Height: 61 - m_Scale: 1 - m_AtlasIndex: 0 - m_ClassDefinitionType: 0 - - m_Index: 28 - m_Metrics: - m_Width: 40 - m_Height: 61 - m_HorizontalBearingX: 4 - m_HorizontalBearingY: 60 - m_HorizontalAdvance: 48 - m_GlyphRect: - m_X: 67 - m_Y: 232 - m_Width: 40 - m_Height: 61 - m_Scale: 1 - m_AtlasIndex: 0 - m_ClassDefinitionType: 0 - - m_Index: 36 - m_Metrics: - m_Width: 57 - m_Height: 59 - m_HorizontalBearingX: 0 - m_HorizontalBearingY: 59 - m_HorizontalAdvance: 57 - m_GlyphRect: - m_X: 196 - m_Y: 92 - m_Width: 57 - m_Height: 59 - m_Scale: 1 - m_AtlasIndex: 0 - m_ClassDefinitionType: 0 - - m_Index: 45 - m_Metrics: - m_Width: 36 - m_Height: 60 - m_HorizontalBearingX: 1 - m_HorizontalBearingY: 59 - m_HorizontalAdvance: 43 - m_GlyphRect: - m_X: 163 - m_Y: 10 - m_Width: 36 - m_Height: 60 - m_Scale: 1 - m_AtlasIndex: 0 - m_ClassDefinitionType: 0 - - m_Index: 61 - m_Metrics: - m_Width: 49 - m_Height: 59 - m_HorizontalBearingX: 2 - m_HorizontalBearingY: 59 - m_HorizontalAdvance: 53 - m_GlyphRect: - m_X: 383 - m_Y: 91 - m_Width: 49 - m_Height: 59 - m_Scale: 1 - m_AtlasIndex: 0 - m_ClassDefinitionType: 0 - - m_Index: 66 - m_Metrics: - m_Width: 51 - m_Height: 6 - m_HorizontalBearingX: -2 - m_HorizontalBearingY: -12 - m_HorizontalAdvance: 48 - m_GlyphRect: - m_X: 93 - m_Y: 10 - m_Width: 51 - m_Height: 6 - m_Scale: 1 - m_AtlasIndex: 0 - m_ClassDefinitionType: 0 - - m_Index: 68 - m_Metrics: - m_Width: 45 - m_Height: 47 - m_HorizontalBearingX: 3 - m_HorizontalBearingY: 46 - m_HorizontalAdvance: 48 - m_GlyphRect: - m_X: 277 - m_Y: 10 - m_Width: 45 - m_Height: 47 - m_Scale: 1 - m_AtlasIndex: 0 - m_ClassDefinitionType: 0 - - m_Index: 69 - m_Metrics: - m_Width: 40 - m_Height: 63 - m_HorizontalBearingX: 5 - m_HorizontalBearingY: 62 - m_HorizontalAdvance: 48 - m_GlyphRect: - m_X: 218 - m_Y: 10 - m_Width: 40 - m_Height: 63 - m_Scale: 1 - m_AtlasIndex: 0 - m_ClassDefinitionType: 0 - - m_Index: 70 - m_Metrics: - m_Width: 38 - m_Height: 47 - m_HorizontalBearingX: 3 - m_HorizontalBearingY: 46 - m_HorizontalAdvance: 43 - m_GlyphRect: - m_X: 272 - m_Y: 140 - m_Width: 38 - m_Height: 47 - m_Scale: 1 - m_AtlasIndex: 0 - m_ClassDefinitionType: 0 - - m_Index: 72 - m_Metrics: - m_Width: 42 - m_Height: 47 - m_HorizontalBearingX: 3 - m_HorizontalBearingY: 46 - m_HorizontalAdvance: 48 - m_GlyphRect: - m_X: 93 - m_Y: 35 - m_Width: 42 - m_Height: 47 - m_Scale: 1 - m_AtlasIndex: 0 - m_ClassDefinitionType: 0 - - m_Index: 73 - m_Metrics: - m_Width: 25 - m_Height: 62 - m_HorizontalBearingX: 1 - m_HorizontalBearingY: 62 - m_HorizontalAdvance: 25 - m_GlyphRect: - m_X: 374 - m_Y: 169 - m_Width: 25 - m_Height: 62 - m_Scale: 1 - m_AtlasIndex: 0 - m_ClassDefinitionType: 0 - - m_Index: 74 - m_Metrics: - m_Width: 40 - m_Height: 64 - m_HorizontalBearingX: 3 - m_HorizontalBearingY: 46 - m_HorizontalAdvance: 48 - m_GlyphRect: - m_X: 10 - m_Y: 38 - m_Width: 40 - m_Height: 64 - m_Scale: 1 - m_AtlasIndex: 0 - m_ClassDefinitionType: 0 - - m_Index: 76 - m_Metrics: - m_Width: 9 - m_Height: 62 - m_HorizontalBearingX: 5 - m_HorizontalBearingY: 62 - m_HorizontalAdvance: 19 - m_GlyphRect: - m_X: 126 - m_Y: 101 - m_Width: 9 - m_Height: 62 - m_Scale: 1 - m_AtlasIndex: 0 - m_ClassDefinitionType: 0 - - m_Index: 77 - m_Metrics: - m_Width: 17 - m_Height: 80 - m_HorizontalBearingX: -3 - m_HorizontalBearingY: 62 - m_HorizontalAdvance: 20 - m_GlyphRect: - m_X: 154 - m_Y: 154 - m_Width: 17 - m_Height: 80 - m_Scale: 1 - m_AtlasIndex: 0 - m_ClassDefinitionType: 0 - - m_Index: 78 - m_Metrics: - m_Width: 40 - m_Height: 62 - m_HorizontalBearingX: 5 - m_HorizontalBearingY: 62 - m_HorizontalAdvance: 44 - m_GlyphRect: - m_X: 10 - m_Y: 121 - m_Width: 40 - m_Height: 62 - m_Scale: 1 - m_AtlasIndex: 0 - m_ClassDefinitionType: 0 - - m_Index: 79 - m_Metrics: - m_Width: 9 - m_Height: 62 - m_HorizontalBearingX: 5 - m_HorizontalBearingY: 62 - m_HorizontalAdvance: 19 - m_GlyphRect: - m_X: 424 - m_Y: 10 - m_Width: 9 - m_Height: 62 - m_Scale: 1 - m_AtlasIndex: 0 - m_ClassDefinitionType: 0 - - m_Index: 80 - m_Metrics: - m_Width: 64 - m_Height: 46 - m_HorizontalBearingX: 5 - m_HorizontalBearingY: 46 - m_HorizontalAdvance: 74 - m_GlyphRect: - m_X: 341 - m_Y: 10 - m_Width: 64 - m_Height: 46 - m_Scale: 1 - m_AtlasIndex: 0 - m_ClassDefinitionType: 0 - - m_Index: 81 - m_Metrics: - m_Width: 38 - m_Height: 46 - m_HorizontalBearingX: 5 - m_HorizontalBearingY: 46 - m_HorizontalAdvance: 48 - m_GlyphRect: - m_X: 10 - m_Y: 202 - m_Width: 38 - m_Height: 46 - m_Scale: 1 - m_AtlasIndex: 0 - m_ClassDefinitionType: 0 - - m_Index: 85 - m_Metrics: - m_Width: 23 - m_Height: 46 - m_HorizontalBearingX: 5 - m_HorizontalBearingY: 46 - m_HorizontalAdvance: 29 - m_GlyphRect: - m_X: 154 - m_Y: 89 - m_Width: 23 - m_Height: 46 - m_Scale: 1 - m_AtlasIndex: 0 - m_ClassDefinitionType: 0 - - m_Index: 86 - m_Metrics: - m_Width: 38 - m_Height: 47 - m_HorizontalBearingX: 2 - m_HorizontalBearingY: 46 - m_HorizontalAdvance: 43 - m_GlyphRect: - m_X: 69 - m_Y: 166 - m_Width: 38 - m_Height: 47 - m_Scale: 1 - m_AtlasIndex: 0 - m_ClassDefinitionType: 0 - - m_Index: 87 - m_Metrics: - m_Width: 23 - m_Height: 56 - m_HorizontalBearingX: 1 - m_HorizontalBearingY: 55 - m_HorizontalAdvance: 24 - m_GlyphRect: - m_X: 452 - m_Y: 10 - m_Width: 23 - m_Height: 56 - m_Scale: 1 - m_AtlasIndex: 0 - m_ClassDefinitionType: 0 - - m_Index: 88 - m_Metrics: - m_Width: 38 - m_Height: 46 - m_HorizontalBearingX: 5 - m_HorizontalBearingY: 45 - m_HorizontalAdvance: 48 - m_GlyphRect: - m_X: 69 - m_Y: 101 - m_Width: 38 - m_Height: 46 - m_Scale: 1 - m_AtlasIndex: 0 - m_ClassDefinitionType: 0 - - m_Index: 93 - m_Metrics: - m_Width: 35 - m_Height: 45 - m_HorizontalBearingX: 3 - m_HorizontalBearingY: 45 - m_HorizontalAdvance: 42 - m_GlyphRect: - m_X: 277 - m_Y: 76 - m_Width: 35 - m_Height: 45 - m_Scale: 1 - m_AtlasIndex: 0 - m_ClassDefinitionType: 0 - - m_Index: 2030 - m_Metrics: - m_Width: 64 - m_Height: 9 - m_HorizontalBearingX: 11 - m_HorizontalBearingY: 9 - m_HorizontalAdvance: 86 - m_GlyphRect: - m_X: 10 - m_Y: 10 - m_Width: 64 - m_Height: 9 - m_Scale: 1 - m_AtlasIndex: 0 - m_ClassDefinitionType: 0 - m_CharacterTable: - - m_ElementType: 1 - m_Unicode: 32 - m_GlyphIndex: 3 - m_Scale: 1 - - m_ElementType: 1 - m_Unicode: 40 - m_GlyphIndex: 11 - m_Scale: 1 - - m_ElementType: 1 - m_Unicode: 41 - m_GlyphIndex: 12 - m_Scale: 1 - - m_ElementType: 1 - m_Unicode: 45 - m_GlyphIndex: 16 - m_Scale: 1 - - m_ElementType: 1 - m_Unicode: 46 - m_GlyphIndex: 17 - m_Scale: 1 - - m_ElementType: 1 - m_Unicode: 48 - m_GlyphIndex: 19 - m_Scale: 1 - - m_ElementType: 1 - m_Unicode: 57 - m_GlyphIndex: 28 - m_Scale: 1 - - m_ElementType: 1 - m_Unicode: 65 - m_GlyphIndex: 36 - m_Scale: 1 - - m_ElementType: 1 - m_Unicode: 74 - m_GlyphIndex: 45 - m_Scale: 1 - - m_ElementType: 1 - m_Unicode: 90 - m_GlyphIndex: 61 - m_Scale: 1 - - m_ElementType: 1 - m_Unicode: 95 - m_GlyphIndex: 66 - m_Scale: 1 - - m_ElementType: 1 - m_Unicode: 97 - m_GlyphIndex: 68 - m_Scale: 1 - - m_ElementType: 1 - m_Unicode: 98 - m_GlyphIndex: 69 - m_Scale: 1 - - m_ElementType: 1 - m_Unicode: 99 - m_GlyphIndex: 70 - m_Scale: 1 - - m_ElementType: 1 - m_Unicode: 101 - m_GlyphIndex: 72 - m_Scale: 1 - - m_ElementType: 1 - m_Unicode: 102 - m_GlyphIndex: 73 - m_Scale: 1 - - m_ElementType: 1 - m_Unicode: 103 - m_GlyphIndex: 74 - m_Scale: 1 - - m_ElementType: 1 - m_Unicode: 105 - m_GlyphIndex: 76 - m_Scale: 1 - - m_ElementType: 1 - m_Unicode: 106 - m_GlyphIndex: 77 - m_Scale: 1 - - m_ElementType: 1 - m_Unicode: 107 - m_GlyphIndex: 78 - m_Scale: 1 - - m_ElementType: 1 - m_Unicode: 108 - m_GlyphIndex: 79 - m_Scale: 1 - - m_ElementType: 1 - m_Unicode: 109 - m_GlyphIndex: 80 - m_Scale: 1 - - m_ElementType: 1 - m_Unicode: 110 - m_GlyphIndex: 81 - m_Scale: 1 - - m_ElementType: 1 - m_Unicode: 114 - m_GlyphIndex: 85 - m_Scale: 1 - - m_ElementType: 1 - m_Unicode: 115 - m_GlyphIndex: 86 - m_Scale: 1 - - m_ElementType: 1 - m_Unicode: 116 - m_GlyphIndex: 87 - m_Scale: 1 - - m_ElementType: 1 - m_Unicode: 117 - m_GlyphIndex: 88 - m_Scale: 1 - - m_ElementType: 1 - m_Unicode: 122 - m_GlyphIndex: 93 - m_Scale: 1 - - m_ElementType: 1 - m_Unicode: 8230 - m_GlyphIndex: 2030 - m_Scale: 1 + m_GlyphTable: [] + m_CharacterTable: [] m_AtlasTextures: - {fileID: 28268798066460806} m_AtlasTextureIndex: 0 m_IsMultiAtlasTexturesEnabled: 0 m_ClearDynamicDataOnBuild: 1 - m_UsedGlyphRects: - - m_X: 0 - m_Y: 0 - m_Width: 83 - m_Height: 28 - - m_X: 83 - m_Y: 0 - m_Width: 70 - m_Height: 25 - - m_X: 153 - m_Y: 0 - m_Width: 55 - m_Height: 79 - - m_X: 83 - m_Y: 25 - m_Width: 61 - m_Height: 66 - - m_X: 0 - m_Y: 28 - m_Width: 59 - m_Height: 83 - - m_X: 208 - m_Y: 0 - m_Width: 59 - m_Height: 82 - - m_X: 144 - m_Y: 79 - m_Width: 42 - m_Height: 65 - - m_X: 59 - m_Y: 91 - m_Width: 57 - m_Height: 65 - - m_X: 116 - m_Y: 91 - m_Width: 28 - m_Height: 81 - - m_X: 0 - m_Y: 111 - m_Width: 59 - m_Height: 81 - - m_X: 59 - m_Y: 156 - m_Width: 57 - m_Height: 66 - - m_X: 0 - m_Y: 192 - m_Width: 57 - m_Height: 65 - - m_X: 267 - m_Y: 0 - m_Width: 64 - m_Height: 66 - - m_X: 331 - m_Y: 0 - m_Width: 83 - m_Height: 65 - - m_X: 414 - m_Y: 0 - m_Width: 28 - m_Height: 81 - - m_X: 442 - m_Y: 0 - m_Width: 42 - m_Height: 75 - - m_X: 442 - m_Y: 75 - m_Width: 43 - m_Height: 99 - - m_X: 331 - m_Y: 65 - m_Width: 42 - m_Height: 26 - - m_X: 267 - m_Y: 66 - m_Width: 54 - m_Height: 64 - - m_X: 186 - m_Y: 82 - m_Width: 76 - m_Height: 78 - - m_X: 373 - m_Y: 81 - m_Width: 68 - m_Height: 78 - - m_X: 321 - m_Y: 91 - m_Width: 43 - m_Height: 99 - - m_X: 262 - m_Y: 130 - m_Width: 57 - m_Height: 66 - - m_X: 144 - m_Y: 144 - m_Width: 36 - m_Height: 99 - - m_X: 364 - m_Y: 159 - m_Width: 44 - m_Height: 81 - - m_X: 180 - m_Y: 160 - m_Width: 61 - m_Height: 80 - - m_X: 57 - m_Y: 222 - m_Width: 59 - m_Height: 80 - - m_X: 408 - m_Y: 159 - m_Width: 29 - m_Height: 28 + m_UsedGlyphRects: [] m_FreeGlyphRects: - - m_X: 144 - m_Y: 25 - m_Width: 9 - m_Height: 54 - - m_X: 59 - m_Y: 28 - m_Width: 24 - m_Height: 63 - - m_X: 484 - m_Y: 0 - m_Width: 27 - m_Height: 75 - - m_X: 485 - m_Y: 0 - m_Width: 26 - m_Height: 511 - - m_X: 186 - m_Y: 79 - m_Width: 22 - m_Height: 3 - - m_X: 373 - m_Y: 65 - m_Width: 41 - m_Height: 16 - - m_X: 441 - m_Y: 81 - m_Width: 1 - m_Height: 430 - - m_X: 321 - m_Y: 66 - m_Width: 10 - m_Height: 25 - - m_X: 262 - m_Y: 82 - m_Width: 5 - m_Height: 48 - - m_X: 319 - m_Y: 130 - m_Width: 2 - m_Height: 381 - - m_X: 116 - m_Y: 172 - m_Width: 28 - m_Height: 339 - - m_X: 364 - m_Y: 91 - m_Width: 9 - m_Height: 68 - - m_X: 319 - m_Y: 190 - m_Width: 45 - m_Height: 321 - - m_X: 180 - m_Y: 240 - m_Width: 331 - m_Height: 271 - - m_X: 180 - m_Y: 144 - m_Width: 6 - m_Height: 16 - - m_X: 241 - m_Y: 160 - m_Width: 21 - m_Height: 351 - - m_X: 241 - m_Y: 196 - m_Width: 123 - m_Height: 315 - m_X: 0 - m_Y: 302 + m_Y: 0 m_Width: 511 - m_Height: 209 - - m_X: 0 - m_Y: 257 - m_Width: 57 - m_Height: 254 - - m_X: 57 - m_Y: 192 - m_Width: 2 - m_Height: 30 - - m_X: 116 - m_Y: 243 - m_Width: 395 - m_Height: 268 - - m_X: 408 - m_Y: 187 - m_Width: 103 - m_Height: 324 - - m_X: 437 - m_Y: 174 - m_Width: 74 - m_Height: 337 - - m_X: 437 - m_Y: 159 - m_Width: 5 - m_Height: 352 + m_Height: 511 m_fontInfo: Name: Liberation Sans PointSize: 86 @@ -992,67 +237,7 @@ MonoBehaviour: m_KerningTable: kerningPairs: [] m_FontFeatureTable: - m_GlyphPairAdjustmentRecords: - - m_FirstAdjustmentRecord: - m_GlyphIndex: 3 - m_GlyphValueRecord: - m_XPlacement: 0 - m_YPlacement: 0 - m_XAdvance: -4.75 - m_YAdvance: 0 - m_SecondAdjustmentRecord: - m_GlyphIndex: 36 - m_GlyphValueRecord: - m_XPlacement: 0 - m_YPlacement: 0 - m_XAdvance: 0 - m_YAdvance: 0 - m_FeatureLookupFlags: 0 - - m_FirstAdjustmentRecord: - m_GlyphIndex: 36 - m_GlyphValueRecord: - m_XPlacement: 0 - m_YPlacement: 0 - m_XAdvance: -4.75 - m_YAdvance: 0 - m_SecondAdjustmentRecord: - m_GlyphIndex: 3 - m_GlyphValueRecord: - m_XPlacement: 0 - m_YPlacement: 0 - m_XAdvance: 0 - m_YAdvance: 0 - m_FeatureLookupFlags: 0 - - m_FirstAdjustmentRecord: - m_GlyphIndex: 73 - m_GlyphValueRecord: - m_XPlacement: 0 - m_YPlacement: 0 - m_XAdvance: -1.546875 - m_YAdvance: 0 - m_SecondAdjustmentRecord: - m_GlyphIndex: 73 - m_GlyphValueRecord: - m_XPlacement: 0 - m_YPlacement: 0 - m_XAdvance: 0 - m_YAdvance: 0 - m_FeatureLookupFlags: 0 - - m_FirstAdjustmentRecord: - m_GlyphIndex: 85 - m_GlyphValueRecord: - m_XPlacement: 0 - m_YPlacement: 0 - m_XAdvance: -4.75 - m_YAdvance: 0 - m_SecondAdjustmentRecord: - m_GlyphIndex: 17 - m_GlyphValueRecord: - m_XPlacement: 0 - m_YPlacement: 0 - m_XAdvance: 0 - m_YAdvance: 0 - m_FeatureLookupFlags: 0 + m_GlyphPairAdjustmentRecords: [] fallbackFontAssets: [] m_FallbackFontAssetTable: [] m_CreationSettings: @@ -1134,9 +319,9 @@ Texture2D: m_DownscaleFallback: 0 m_IsAlphaChannelOptional: 0 serializedVersion: 2 - m_Width: 512 - m_Height: 512 - m_CompleteImageSize: 262144 + m_Width: 0 + m_Height: 0 + m_CompleteImageSize: 0 m_MipsStripped: 0 m_TextureFormat: 1 m_MipCount: 1 @@ -1160,8 +345,8 @@ Texture2D: m_LightmapFormat: 0 m_ColorSpace: 0 m_PlatformBlob: - image data: 262144 - _typelessdata: 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004080a0b1313131313131311110e0b060100000000000000000004090e11121313131313131313070705010000000000000000000000060b0e1011131313131313130a0a080400000000000000000000000000020507080c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0b0906010000000000000000000000000000000000000000000000010406070a0d10111213131312100e0b0707050100000000000000000000000000000000000000000000000000000000060606060606060503000000020608080c0f111213131312100e0b080705020000000000000000000000000000000000000000000000000000000000000000020507080b0e111112131312110f0c0908060300000000000000000406070b0f1213131211100e0c0b090601000000000000000000000000060b0e10111313131313130f0e0c0904000000000000000000000003070b0d0e13131313131312110f0c0701000000000000000000000004080a0b13131313131313080705020000000000000000000000000003070909131313131313130b0a080400000000000000000000000000000000000000000000000307090a0e111213131211100e0b0907060300000000000000000000000000000000000000000000000000000000000000000000000000000000050c11141717202020202020201e1d1b17120c0400000000000000080f151a1d1f20202020202020201413110d080200000000000000040b11171a1d1e20202020202020171614100b0500000000000000000003090e12141519191919191919191919191919191919191919191919191919191919191919191919191919191919191919191919191919191816120d07000000000000000000000000000000000000000001070d111314171a1c1e1e1f201f1e1d1b181413110d08020000000000000000000000000000000000000000000105090b0b13131313131312120f0c04090e121415191b1d1f1f201f1f1d1b181414110e08020000000000000000000000000000000000000000000000000000000003090e121415181b1d1e1f201f1f1d1b191515120f0a0401000000070c101313181c1e1f201f1e1d1b181815120d06000000000000000000040b12171b1d1e2020202020201c1b19150f09020000000000000001080e13171a1a2020202020201f1e1b18130c050000000000000000050c11141717202020202020201514120e0903000000000000000000040a0f13151620202020202020171714110c0500000000000000000000000000000000000000040b101316161a1d1f201f1e1e1d1a18151312100b06000000000000000000000000000000000000000000000000000000000000000000000000000810171c2123242d2d2d2d2d2d2d2b2a27231d160e06000000000009121920262a2c2c2d2d2d2d2d2d2d21201d19130c050000000000050e161d22272a2a2d2d2d2d2d2d2d2423201c17100800000000000000060d141a1e2122262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262525221e1811090100000000000000000000000000000000040a0f13181d20202326292a2b2c2c2c2b2a272521201e1913100b05000000000000000000000000000000000000060c111517182020202020201f1e1c1810151a1e212225282a2b2c2d2c2b2a282521201e19140f0a04000000000000000000000000000000000000000000000000040a0f141a1e212125282a2b2c2c2c2b2a282622211f1b15110d08030b12181c1f2025292b2c2c2c2b2a272524221d18110901000000000000050e161d23272a2b2d2d2d2d2d2d282825201b140c030000000000020b12191f2326272d2d2d2d2d2d2b2b28241e170f060000000000000810171c2123242d2d2d2d2d2d2d22211e1a140e0600000000000000070f161b1f22232d2d2d2d2d2d2d2423211c1710080000000000000000000000000000000002090e161b202223272a2c2c2c2b2a29272522201f1c17110a020000000000000000000000000000000000000000000000000000000000000000000008121a22282d3031393939393939393837332e2820180e0400000008121b242b31363839393939393939392e2d2a251e160e05000000040e1720272e3336373939393939393931302d28221a11080000000000060f181f262a2d2e3232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232312e29231b1309000000000000000000000000000002080d151b1d24292c2d3033363738393939383634312e2d2a251e1c160f0a040000000000000000000000000000000911181d2124252d2d2d2d2d2d2c2b28241c1f262b2e2f32353738393939383735312e2d2a251e1b150d0701000000000000000000000000000000000000000000060c161b1f252a2d2e31343738393939383735322f2e2b26201d19130c151d23282c2d32353839393838363432312e29231b13090000000000040e1720282e3336373939393939393534312c251e150c02000000010b141d242b3033343939393939393837342f2921180f050000000008121a22282d3031393939393939392e2d2b261f180f06000000000007101921272c2f303939393939393931302d28221a12080000000000000000000000000000050d141a21272c2f30343738393938373634312f2d2b28231c140c02000000000000000000000000000000000000000000000000000000000000000005101a242c33393c3e4646464646464644433f39322a20160c0100040f19242d353d42454646464646464646463936302820160c0200000b16202932393f4344464646464646463d3c39332c231a1005000000030d18212931363a3b3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3e3a342d251b1107000000000000000000000000050d131920262b2f35393a3d404344454646464543413e3a3936302c28211b150e060000000000000000000000000009121b22292e313239393939393939373430282c31373a3b3f4244454646464543413e3b3936302b272018130c04000000000000000000000000000000000000030a111720272b31363a3b3e4144444546464544423f3c3b37322c29241e191e272e34383a3e42454646454443413f3d3a342d251b1106000000000b16202932393f434446464646464642413d3730271e140900000008121d262f363c3f414646464646464544403a332b21170c01000005101a242c33393c3e464646464646463b3a37312a21180e03000000040f19232b32383b3c464646464646463e3c39332c241a1005000000000000000000000000060f171f252a32383b3d4144454646454443413e3c3a38342e261e140a00000000000000000000000000000000000000000000000000000000000000000c17222c363e45494a53535353535353514f4b443c32281d1206000915202b353f474e5253535353535353535346413a32281e13080006111d27323b444a4f51535353535353534a49443e362c22170b00000009141f29333b4246484c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4a463f372d23180d0100000000000000000000080e171e252a31373a4045474a4d4f515152535251504e4b4746413a38332b2620181009000000000000000000000006111b242d343a3d3e4646464646464544403b34383c4247484c4e505252535252504e4b4746413b373229241d160d0500000000000000000000000000000000030c151c232832373b4246484b4e505152535252504e4c4847433c39352f28222b30394045464b4f5152535251504e4b4a463f372d23180d01000006121d28323b444b4f515353535353534f4d48423930251b0f0400030e19242f3840474c4d53535353535352504c453d33291e130700000c17222c363e45494a535353535353534846423c332a1f14090000000a16212b353d434849535353535353534a49453e362c22170c0000000000000000000000060f18212930363d4448494d505253525151504d4b4846443f3830261c110600000000000000000000000000000000000000000000000000000000000004111c28333e48505557606060606060605e5c564e44392e23170b010e1a26313d4751595e5f606060606060605f524c443a3025190d010b17222e39444d555b5d60606060606060575550483e33281c100400020e1a26313b454d535559595959595959595959595959595959595959595959595959595959595959595959595959595959595959595959595959585651493f34291e120600000000000000000008111a202930363c43474b515356595c5d5e5f5f5f5e5d5a5854524c48443e37312a221b120a010000000000000000010c18222d363f454a4b53535353535352504c454044464e5355585b5d5e5f605f5e5d5b5854524c47433d352f281f170f050000000000000000000000000000030d151e262e343d43474d5354585b5d5e5f5f5f5e5d5b5955534e4745413a3129343c424b5153585c5e5f5f5f5e5d5a585651493f34291d120600000b17232e39444d565b5e6060606060605b59534b42372c2015090007131f2b36404a52585a6060606060605e5c574f453a2f24180c0004111c28333e485055576060606060606055534d453c31261a0e0200030f1b27323d474f545660606060606060575550483e33281c1104000000000000000000020c18212a333b42464f54565a5d5f5f5f5e5d5c5a585553504a42382e23170b0000000000000000000000000000000000000000000000000000000000000814212d3945505a61646c6c6c6c6c6c6c6b6760564b3f33271b0e04111d2a36424e59636a6c6c6c6c6c6c6c6c6c5e564c41362a1d11050e1a27333f4a555f676a6c6c6c6c6c6c6c64615a5044392d2014080005121e2a36424d575f616565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565625b51463a2e221609000000000000000008121a232c323a41464e53555d606366696a6b6c6c6c6b696764615e56554f47433c342d241c130a010000000000000005111d29343f485056586060606060605f5d574f4a5153575f6265686a6b6c6c6c6b6a6864615e56544e45403a312921170f05000000000000000000000000010b151f2730383f444e54575e6164676a6b6c6c6c6b6a6865625f5854524c433f353c464e545c6065686b6c6c6b6b696765625b51463a2e22150900020e1b27333f4b565f676a6c6c6c6c6c6c68655d53483d3125190c000b1723303c47525c64676c6c6c6c6c6c6b6861574c4034281b0f030814212d3945505a61646c6c6c6c6c6c6c6c5f574d42372b1e12050007131f2c38434f5960636c6c6c6c6c6c6c64615a5045392d2114080000000000000000000a141e2a333b454d52596063676a6b6c6c6b6a69676462605c544a3f34281c100300000000000000000000000000000000000000000000000000000000000a1723303c4955616c71797979797979797772675c4f43372a1d1106121f2c3845525e6a75797979797979797976685e5246392d201307101d2a36434f5b67717779797979797979706c6155493c3023160a000714212d3a46535f696e72727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272726d62564a3e3125180b0000000000000008111a242c353e444c52585f62676d7073767778797979787674716d68636159534e463f362e251c1309000000000000000915212e3a45505a62656c6c6c6c6c6c6c696157545c60646a6e72757778797979787674716e68626058514b433b332921170d03000000000000000000000007121d273139424a50586062696e71747777787979787775726f6a66605d56504540454e5860666d717578797978777674726d62564a3d3124180b0004101d2a36434f5b677177797979797979756f65594d4134281b0e020d1a26333f4c58646e747979797979797873685c5044372b1e11050a1723303c4955616c717979797979797976695f53463a2d211407000915222f3b4854606b6f79797979797979716c6155493c3023170a000000000000000006111c26303b454d575e616b70747778797978777674716f6d665c5044382b1f120600000000000000000000000000000000000000000000000000000000000b1724313e4a5764717e8686868686868684776b5e5144382b1e110613202c3946535f6c7987868686868686867a6d6154473a2e211407111e2a3744515d6a7783868686868686867e7064574a3d3124170a000815222e3b4855616e7b7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7265584c3f3225190c000000000000050f1a232c363e474f565e616a6f747a7d808284848586858483817e7a76706b625f58514840372e251b11070000000000000b1724313d4a56626c71797979797979787369585f666d71777b7f8183858586858583817e7a756f6a605d554d453b33291f150b01000000000000000000020c18242f39434b545c606a6f757b7e8183848586858583817f7c78726d68625a514b4d57606a6f797e82848586858483817f7265584b3f3225180c0004111e2b3744515e6a77848686868686868175685b4f4235281c0f020e1a2734414d5a67748086868686868685786b5e5245382b1f12050b1724313e4a5764717e868686868686867b6e6155483b2e22150800091623303c4956636f7d868686868686867e7164574a3e3124170b00000000000000000b17232e38424d575f696e767c8083858685848483807e7c786d6053463a2d20130700000000000000000000000000000000000000000000000000000000000b1724313e4a5764717d8a93939393939184776b5e5144382b1e110613202c3946535f6c7986929393939393877a6d6154473a2e211407111e2a3744515d6a77849093939393938a7d7064574a3d3124170a000a1724303d4a5763707d8a8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c86796c5f5346392c20130000000000020d17212c353e48505961686d757c8186898c8f909192929291908d8b86827d766f6a625b524940372d23190d0300000000000b1825323e4b5865717e868686868686857866616a6f787e83888b8e909192939291908e8b86827c746d675e574d453b31271d12070000000000000000000a141e2935404b555d666d747c82878b8e909192929291908e8c88847f7a716d605d55535f696f7c848b8f9192929291908d86796c605346392d20130004111e2b3744515e6a778491939393938e8275685b4f4235281c0f020e1a2734414d5a6774808d939393939185786b5e5245382b1f12050b1724313e4a5764717d8a9393939393887b6e6155483b2e22150800091623303c4956636f7c8993939393938a7d7164574a3e3124170b0000000000000003101c28343f4a545f696e7b82898d9092929291908f8d8b887e7164584b3e3125180b00000000000000000000000000000000000000000000000000000000000b1724313e4a5764717d8a979f9f9f9e9184776b5e5144382b1e110613202c3946535f6c7986929f9f9f9f94877a6d6154473a2e211407111e2a3744515d6a7784909d9f9f9f978a7d7064574a3d3124170a000a1724303d4a5763707d8a96989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989286796c5f5346392c2013000000000009141f29333d47505a616b707a82888e9298999c9d9e9f9f9f9e9c9a99928f8a837c726d635c52493f352b1f150b01000000000b1724313e4a5764717d8a939393939786796d6c707c838b9095989b9d9e9f9f9f9e9d9b99928f8781796e695e574d43392f24180c030000000000000006111c26303845515d676d7880898f93999a9d9e9f9f9f9e9d9b9896918c857e756d675d58626e7b8691969b9e9f9f9e9e9c9386796c605346392d20130004111e2b3744515e6a7784919d9f9f9b8e8275685b4f4235281c0f020e1a2734414d5a6774808d9a9f9f9e9185786b5e5245382b1f12050b1724313e4a5764717d8a979f9f9f94887b6e6155483b2e22150800091623303c4956636f7c89969f9f9f978a7d7164574a3e3124170b0000000000000006121f2b3844505c666e7b848f949a9d9e9f9f9e9d9c9a978b7e7164584b3e3125180b00000000000000000000000000000000000000000000000000000000000b1724313e4a5764717d8a97a4acaa9e9184776b5e5144382b1e110613202c3946535f6c7986929facaca094877a6d6154473a2e211407111e2a3744515d6a7784909daaaca3978a7d7064574a3d3124170a000a1724303d4a5763707d8a969f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9286796c5f5346392c201300000000020e1a25303b454f59616c717d858f939a9fa3aaa9aaa8a7a6a7a9a9aba39f9c9490867f736e635b51473d31271d1207000000000a1723303d4a5663707d89969f9fa994877a6d707e8690959da09e9c9b9a9b9c9ea1a9aba39f9a938e847b6e695e554b403529201509000000000000000b17232e3842505a606d79828d929b9fa4ababa39f9d9c9b9c9d9fa19e97928b82796d685f6a76828f98a1a8aaa39f9995949386796c605346392d20130004111e2b3744515e6a7784919daaa89b8e8275685b4f4235281c0f020e1a2734414d5a6774808d9aa7ab9e9185786b5e5245382b1f12050b1724313e4a5764717d8a97a4aca194887b6e6155483b2e22150800091623303c4956636f7c8996a2aca4978a7d7164574a3e3124170b000000000000000713202d3a4653606d788390969fa6aaababa5a1a0a0a1978b7e7164584b3e3125180b00000000000000000000000000000000000000000000000000000000000b1724313e4a5764717d8a97a4b0aa9e9184776b5e5144382b1e110613202c3946535f6c7986929facada094877a6d6154473a2e211407111e2a3744515d6a7784909daab0a3978a7d7064574a3d3124170a000a1724303d4a5763707d8a93939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939286796c5f5346392c20130000000005121e2a36424d57606b717e8791979ea5acaba9a19e9b9a9a9b9d9fa4abaca69f98928b80736d62594f43392f23180c000000000a1623303d495663707c8996a3aca195887b707e8792989e9896918f8e8d8e8f91979b9fa4aca49f9691847b6e675d51453c31261a0f02000000000003101c28343f4a54616c74818e949da4aca7a09d9992908f8f8f9192999a9e9f948f837a6d666f7c88949faaaea398928c88878886796c605346392d20130004111e2b3744515e6a7784919daaa89b8e8275685b4f4235281c0f020e1a2734414d5a6774808d9aa7ab9e9185786b5e5245382b1f12050b1724313e4a5764717d8a97a4aea194887b6e6155483b2e22150800091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b00000000000004101c2834404b5564717e8a959fa8b0a9a19e9894939394968b7e7164584b3e3125180b00000000000000000000000000000000000000000000000000000000000b1724313e4a5764717d8a97a4acaa9e9184776b5e5144382b1e110613202c3946535f6c7986929facaca094877a6d6154473a2e211407111e2a3744515d6a7784909daaaca3978a7d7064574a3d3124170a000a1724303d4a5763707d8686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686796c5f5346392c2013000000030e18212d3a46525e69707d879299a1a9ada79f9d97928f8d8d8e9093999fa2aaaaa39f928b7f726b60554b4034291c1207000000091623303c4956636f7c8996a2afa295897c7c86929996918c8784828181818285898e939aa1a9a8a0969083796d60584e43372b1f1409000000000006121f2b3844505c66717e8b939ea6aea59d95908a86838282838486898d92979f959083786d73808d99a6b0a89f9286807c7a7b7d7063574a3d3024170a0004111e2b3744515e6a7784919daaa89b8e8275685b4f4235281c0f020e1a2734414d5a6774808d9aa7ab9e9185786b5e5245382b1f12050b1724313e4a5764717d8a97a4aea194887b6e6155483b2e22150800091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b00000000000006131f2c3845515c6776828f9ca7b1aaa197928b88868687898b7e7164584b3e3125180b00000000000000000000000000000000000000000000000000000000000b1724313e4a5764717d8a979f9f9f9e9184776b5e5144382b1e110613202c3946535f6c7986929f9f9f9f94877a6d6154473a2e211407111e2a3744515d6a7784909d9f9f9f978a7d7064574a3d3124170a000916232f3c4855616b707979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979746a5e5145382b1f120000000915202c38444f59616e7b869299a3abada49c959089858281808183878c9298a0a8aea49f93877d6f675c5145392e23180c0000000916232f3c4956626f7c8995a2afa396897d839098938d847f7b777574747476797c81889197a1a9a8a0958d80736a5f53473b30251a0e02000000000713202d3a4653606d7884919ea5afa69d938e837d797776757677797c80858c9298958e81747683909ca9aca0958a7e736f6e6e706b6155483c2f2316090004111e2b3744515e6a7784919daaa89b8e8275685b4f4235281c0f020e1a2734414d5a6774808d9aa7ab9e9185786b5e5245382b1f12050b1724313e4a5764717d8a97a4aea194887b6e6155483b2e22150800091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b0000000000000713202d3a4653606d7986929facaea39892857f7b79797b7c7f7c6f6256493c2f23160900000000000000000000000000000000000000000000000000000000000b1724313e4a5764717d8a93939393939184776b5e5144382b1e110613202c3946535f6c7986929393939393877a6d6154473a2e211407111e2a3744515d6a77849093939393938a7d7064574a3d3124170a000714202c38444f5961636c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6a62584d4135291d100000020f1a26313c4855616b75828f98a2abada39b928c837d7975747374767a7f869196a0a8afa4999184796d60544a4034281c100400000916222f3c4955626f7c8895a2afa89c8f828f9593888079726e6969686768656c6f747d859197a2ada79f92877c6e62574d42362a1e1205000000000b1824313e4b5764717e8a96a0acac9f948e8179716d67696869676d70747a7f869095938a7e7885929fabaa9d9184776c6261616361594f44382c2014070004111e2b3744515e6a7784919daaa89b8e8275685b4f4235281c0f020e1a2734414d5a6774808d9aa7ab9e9185786b5e5245382b1f12050b1724313e4a5764717d8a97a4aea194887b6e6155483b2e22150800091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b0000000000000916232f3c4956626f7c8999a3aeac9f92867c726e6d6d6e70726f6a6054473b2e22150800000000000000000000000000000000000000000000000000000000000b1724313e4a5764717e8686868686868684776b5e5144382b1e110613202c3946535f6c7987868686868686867a6d6154473a2e211407111e2a3744515d6a7783868686868686867e7064574a3d3124170a0004101c28333e474f5557606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060605f5e5850473c3125190d000006121f2b37434e5863707d8a939eaaafa59b918b8078706c66676768686d737b849196a0acaba0968c7f72665c5144382c1f120600000916222f3c4955626f7c8895a2afaa9e948f9493887e736d67615e575b5a535b60626b6f7c85929ea6afa3998e8175695e52463a2d20140800000005121e2a36424d576875818e9ba8afa49a8f82786d66605d555c555c6063676d727b838f9391857b8797a2ada79a8d8074675a545557554f473e33281c10040004111e2b3744515e6a7784919daaa89b8e8275685b4f4235281c0f020e1a2734414d5a6774808d9aa7ab9e9185786b5e5245382b1f12050b1724313e4a5764717d8a97a4aea194887b6e6155483b2e22150800091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b0000000000000a1724313d4a5764707d8a97abb4a79a8e81746a6160606163656260584e43372b1f130600000000000000000000000000000000000000000000000000000000000a1723303c4955616c71797979797979797772675c4f43372a1d1106121f2c3845525e6a75797979797979797976685e5246392d201307101d2a36434f5b67717779797979797979706c6155493c3023160a00000b16212c353e44484a5353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353514d473e352a1f140900000814212e3a47535f6a7683909ca5afa99e938b7f736c65605b545a565e61696e7a84919aa4afa89e9185796d6053463a2d22170b00000916222f3c4955626f7c8895a2afb0a69e9c958c80736c605c55524d4e4e49505359606a717e8a949fabab9f92877b6e6154483b3025190e0200000714202d3a46525e697885919eabac9f93877c6f665c54514b4f4b5153555d60696e79818f949083909da9b3a4988b7e7165584b484a48443e352c21160b000004111e2b3744515e6a7784919daaa89b8e8275685b4f4235281c0f020e1a2734414d5a6774808d9aa7ab9e9185786b5e5245382b1f12050b1724313e4a5764717d8a97a4aea194887b6e6155483b2e22150800091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b0000000000000b1825313e4b5864717e8b97a4b1a4978a7e716458535354565856544e463d32271b0f0300000000000000000000000000000000000000000000000000000000000814212d3945505a61646c6c6c6c6c6c6c6b6760564b3f33271b0e04111d2a36424e59636a6c6c6c6c6c6c6c6c6c5e564c41362a1d11050e1a27333f4a555f676a6c6c6c6c6c6c6c64615a5044392d201408000005101a232c33383c3d464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464645413c352c23190e0300000815222f3b4855626e7b88949fabada2978e81746d605b53504a4d4c52575e68707d87939facada1978a7d716453493f33271b0f03000916222f3c4955626f7c8895a2afb8b0a89d9083786d605a514b464241413f44464f58616c76828f9ca9afa3998c7f7266564c41362a1e110500000815212e3b4854616e7b8797a1adaa9d9083776a5f544b4540424045474b51575f676d78828f9590959fabb0a3968a7d7063574a3d3d3c38332c231a1005000004111e2b3744515e6a7784919daaa89b8e8275685b4f4235281c0f020e1a2734414d5a6774808d9aa7ab9e9185786b5e5245382b1f12050b1724313e4a5764717d8a97a4aea194887b6e6155483b2e22150800091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b0000000000000c1825323f4b5865727e8b98a5afa295897c6f6256494648494c4947433d342b20150a00000000000000000000000000000000000000000000000000000000000004111c28333e48505557606060606060605e5c564e44392e23170b010e1a26313d4751595e5f606060606060605f524c443a3025190d010b17222e39444d555b5d60606060606060575550483e33281c100400000008111a21282c2f3039393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393835312a231a1107000005121e2a36424d576774808d9aa6b0ac9f92857a6d615b5049443f4041464d56606b75828f9baab3a99b8e8175655b5044372b1f1205000916222f3c4955626f7c8895a2afb9ada1968a7d71665c5045403936302d33373d46505a63707d8a97a1adab9d908377685e5246392d20140700000916222f3c4955626f7c8895a9b3a79a8d817467584e4239352f34383a40454d555c666d7a85919d9fa7b1afa396897c706356493d302f2c28211a110800000004111e2b3744515e6a7784919daaa89b8e8275685b4f4235281c0f020e1a2734414d5a6774808d9aa7ab9e9185786b5e5245382b1f12050b1724313e4a5764717d8a97a4aea194887b6e6155483b2e22150800091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b0000000000000c1925323f4c5865727f8b98a5aea195887b6e6255483b3b3d3f3c3b37322b22190f04000000000000000000000000000000000000000000000000000000000000000c17222c363e45494a53535353535353514f4b443c32281d1206000915202b353f474e5253535353535353535346413a32281e13080006111d27323b444a4f51535353535353534a49443e362c22170b00000000000810161c2023242d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2c2b29251f1911080000000714212d3a46535f697884919eabafa49a8c7f73685e52443f383330363b444f5963707d8a98a2aeab9e9285796c605346392d201306000916222f3c4955626f7c8895a2afb8ab9e9184786c60544a3f342f2a2522272b333e4653606c7885929eabaca095877a6e6154473b2e21140800000a1723303d4a5663707d8996a3b0a6998c7f7366594c402f2924292c2f353b434b545d68707d8a959fabb7afa396897c706356493d3023201c1610080000000004111e2b3744515e6a7784919daaa89b8e8275685b4f4235281c0f020e1a2734414d5a6774808d9aa7ab9e9185786b5e5245382b1f12050b1724313e4a5764717d8a97a4aea194887b6e6155483b2e22150800091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b0000000000000c1925323f4c5865727f8b98a5aea194887b6e6155483b2e30322f2e2b2720191007000000000000000000000000000000000000000000000000000000000000000005101a242c33393c3e4646464646464644433f39322a20160c0100040f19242d353d42454646464646464646463936302820160c0200000b16202932393f4344464646464646463d3c39332c231a1005000000000000050b1014161720202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020201f1d19140e07000000000815222e3b4855616e7b8896a1aca69f93877b6e61564c41332d28252a323d4653606c7985929fabada297887b6e6155483b2e221508000916222f3c4955626f7c8895a2afb6ac9a8d8074665b5042382e231d1a171b212b3844505b6674818e9ba7b1a7978a7e7164574b3e3124180700000a1724313d4a5764707d8a97a3b0a5988c7f7265594c3f2e23181c1f24293139424c56616c7683909da9b3afa396897c706356493d302316100b05000000000004111e2b3744515e6a7784919daaa89b8e8275685b4f4235281c0f020e1a2734414d5a6774808d9aa7ab9e9185786b5e5245382b1f12050b1724313e4a5764717d8a97a4aea194887b6e6155483b2e22150800091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b0000000000000c1925323f4c5865727f8b98a5aea194887b6e6155483b2e232523221f1b150f070000000000000000000000000000000000000000000000000000000000000000000008121a22282d3031393939393939393837332e2820180e0400000008121b242b31363839393939393939392e2d2a251e160e05000000040e1720272e3336373939393939393931302d28221a11080000000000000000000407090a131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131312100d090300000000000b1825313e4b5864717e8b939a979a9c908376695e52443a30221b19202b3844505b6676838f9ca9b3a9978a7d7064574a3d3124170a000916222f3c4955626f7c8895a2afafa49a897d7063544a3f30261c120e0b0f1c28333f4a5465717e8b98abb5a69a8d8073675a4d402e23180c00000a1723303d4a5663707d8996abb5a6998d807366544a403428211e1a181f27303a44505a64707d8a97a2adafa396897c706356493d3023160a0000000000000004111e2b3744515e6a7784919daaa89b8e8275685b4f4235281c0f020e1a2734414d5a6774808d9aa7ab9e9185786b5e5245382b1f12050b1724313e4a5764717d8a97a4aea194887b6e6155483b2e22150800091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b0000000000000c1925323f4c5865727f8b98a5aea194887b6e6155483b2e22191615130f0a040000000000000000000000000000000000000000000000000000000000000000000000000810171c2123242d2d2d2d2d2d2d2b2a27231d160e06000000000009121920262a2c2c2d2d2d2d2d2d2d21201d19130c050000000000050e161d22272a2a2d2d2d2d2d2d2d2423201c17100800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1925323f4c5865727f8486898b8d8f8c807366574d4232281e110f1c28333f4a546774808d9aa7b2a5988b7f7265584c3f3225190c000916222f3c4955626f7c8895a2afac9f93867a6d6054473a2d21150a01000b17222d3c4855626f7b8899a4afa99c8f837669554b4034281c1004000915222f3c4855626f7b8899a3afa89b8f8275665c51443a322d2b2627272628323e4653606d7985929fabafa396897c706356493d3023160a0000000000000004111e2b3744515e6a7784919daaa89b8e8275685b4f4235281c0f020e1a2734414d5a6774808d9aa7ab9e9185786b5e5245382b1f12050b1724313e4a5764717d8a97a4aea194887b6e6155483b2e22150800091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b0000000000000c1925323f4c5865727f8b98a5aea194887b6e6155483b2e221509080603000000000000000000000000000000000000000000000000000000000000000000000000000000050c11141717202020202020201e1d1b17120c0400000000000000080f151a1d1f20202020202020201413110d080200000000000000040b11171a1d1e20202020202020171614100b0500000000000000000000000000000000000000000000000000020608080b0e1011121313121211100d0b0807050200000000000000000000000000000000000000000000000000000000000b1824313e4a56626d72787a7c7e8082847d7063574a3d3024160c0b17222d404c5966737f8c99a6b2a6998d8073665a4d4033271a0d000916222f3c4955626f7c8895a2afaa9e918477675d5145392c20130300000613202d3a4653606d7986939facab9e918478675c5145382c1f1306000714202d3a4753606d7a86929facab9e9285796d60564c443d3a373134333332323845515c6675828f9ca8afa396897c706356493d3023160a0000000000000004111e2b3744515e6a7784919daaa89b8e8275685b4f4235281c0f020e1a2734414d5a6774808d9aa7ab9e9185786b5e5245382b1f12050b1724313e4a5764717d8a97a4aea194887b6e6155483b2e22150800091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b0000000000000c1925323f4c5865727f8b98a5aea194887b6e6155483b2e221508000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004080a0b1313131313131311110e0b060100000000000000000004090e11121313131313131313070705010000000000000000000000060b0e1011131313131313130a0a08040000000000000000000000000000000000000000000000000205090e121415181b1d1e1f20201f1f1e1c1a181514120e09050200000000000000000000000000000000000000000000000000000916222e3a46515b6265676d6f71737578706b6155483c2f231604061925323f4c5865727f8b98a5b2a79a8d8074675a4d4134271a0e000916222f3c4955626f7c8895a2afa89c8f827569554b4135291d1104000006131f2c3845515c677884919eabac9f9386796d6053463a2d2013070006131f2c3945515d677783909dabada1978a7e71685e564f484742424140403f3f3f404b546673808c99a6afa396897c706356493d3023160a0000000000000004111e2b3744515e6a7784919daaa89b8e8275685b4f4235281c0f020e1a2734414d5a6774808d9aa7ab9e9185786b5e5245382b1f12050b1724313e4a5764717d8a97a4aea194887b6e6155483b2e22150800091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b0000000000000c1925323f4c5865727f8b98a5aea194887b6e6155483b2e2215080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080e11151a1e21222528292b2c2c2c2c2b2b29272522211e1a14120e090200000000000000000000000000000000000000000000000006121e29343f495156555d60626467696b6361594f44382c2014070b1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000916222f3c4955626f7c8895a2afa79a8d8174675a4e412f24180d01000004101c2834404b556a7683909da9afa49a887b6e6155483b2e2215080004101d2935404b5566737f8c99a3aea99e91847a6d68615955534d4f4e4d4c4c4c4b4b4c5865727f8b98a5afa396897c706356493d3023160a0000000000000004111e2b3744515e6a7784919daaa89b8e8275685b4f4235281c0f020e1a2734414d5a6774808d9aa7ab9e9185786b5e5245382b1f12050b1724313e4a5764717d8a97a4aea194887b6e6155483b2e22150800091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b0000000000000c1925323f4c5865727f8b98a5aea194887b6e6155483b2e2215080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000406070a0c0f11111213131312110f0d0b07070501000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080d14191e20262b2e2f323436383939393938373634322e2d2b26201e1a140e090200000000000000000000000000000000000000000000010d18232d373f464a4b515356585a5c5e57554f473e33281c10040b1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000916222f3c4955626f7c8895a2afa6998c807366594d4033261a07000000000c18232e424f5c6975828f9ca8b6ac95897c6f6256493c2f23160900000c18242f3b4854616e7b86929fa8ada19690827a706b65615f575c5a5a5959585858585865717e8b98a4afa396897c706356493d3023160a0000000000000004111e2b3744515e6a7784919daaa89b8e8275685b4f4235281c0f020e1a2734414d5a6774808d9aa7ab9e9185786b5e5245382b1f12050b1724313e4a5764717d8a97a4aea194887b6e6155483b2e22150800091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b0000000000000c1925323f4c5865727f8b98a5aea194887b6e6155483b2e22150800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001070c10131417191b1d1e1f20201f1f1e1c1a171413110d08040100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040c13191f252a2d31373a3b3e41434445464645454443403e3b3a37312d2a251f1a140d050000000000000000000000000000000000000000000006111b252d343a3a404547494b4d4f514a48443e352c21170b000b1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000916222f3c4955626f7c8895a2afa5988b7f7265584c3f3225190c00000000071b2835424e5b6875818e9ba8b0a396897d7063564a3d3023170a00000714202d3a46525e6974808d96a1a9a89f9590847d77726e696a6867666665656565646465717e8b98a4afa396897c706356493d3023160a0000000000000004111e2b3744515e6a7784919daaa89b8e8275685b4f4235281c0f020e1a2734414d5a6774808d9aa7ab9e9185786b5e5245382b1f12050b1724313e4a5764717d8a97a4aea194887b6e6155483b2e22150800091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b0000000000000c1925323f4c5865727f8b98a5aea194887b6e6155483b2e22150800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050b1012181c1f202326282a2b2c2c2c2c2c2a29272421201d1913100d070100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080e161e25293036393c4247484b4e50515253535252514f4d4b4846423c3a36302a251f170f080000000000000000000000000000000000000000000009131b23292e2f35393a3c3e4042453d3c38332c231a1005000b1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000916222f3c4955626f7c8895a2afa5988b7e7265584b3f3225180c000000010e1b2834414e5b6774818e9aa7b0a3978a7d7064574a3d3124170a000005121e2a36424d57606d79849197a1a9a79f969189837f7b78767574737372727271717171717e8b98a4afa396897c706356493d3023160a0000000000000004111e2b3744515e6a7784919daaa89b8e8275685b4f4235281c0f020e1a2734414d5a6774808d9aa7ab9e9185786b5e5245382b1f12050b1724313e4a5764717d8a97a4aea194887b6e6155483b2e22150800091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b0000000000000c1925323f4c5865727f8b98a5aea194887b6e6155483b2e2215080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040b10161c1d23292c2d30333537383839393938373633312e2d2a25201d18120b0600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020a121a202830353b4146474e5355585b5c5e5f5f5f5f5e5e5c5a5855534d4846423b363029211a120a020000000000000000000000000000000000000000010911181e1d24292c2d2f31343638302f2c28211a110800000b1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000916222f3c4955626f7c8895a2afa4988b7e7165584b3e3225180b000000010e1b2734414e5a6774818d9aa7b1a4978a7e7164574b3e3124180b0000020e1a25303b45515d676f7c8591979ea5a8a09e95908b8885838281807f7f7f7e7e7e7e7d7d808d9aa7afa396897c706356493d3023160a0000000000000004111e2b3744515e6a7784919daaa89b8e8275685b4f4235281c0f020e1a2734414d5a6774808d9aa7ab9e9185786b5e5245382b1f12050b1724313e4a5764717d8a97a4aea194887b6e6155483b2e22150800091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b0000000000000c1925323f4c5865727f8b98a5aea194887b6e6155483b2e22150800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060b161b21282c2f34383a3d3f42444445464646454442403e3a3936302c29241d17110a0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000020b141c242c323a41464d5254575f626567696b6c6c6c6c6b6a696765615f5754524d46423b332c241c140a02000000000000000000000000000000000000000000060d1213181d2020232527292b2423201c1710080000000b1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000916222f3c4955626f7c8895a2afa4988b7e7165584b3e3225180b000000010e1a2734414d5a6774808d9aa7b1a4978b7e7164584b3e3125180b00000009141f2935414b555f6a6f7c858f939c9fa4a79f9d989892908f8d8d8c8c8b8b8b8b8a8a8a8d929da9afa396897c706356493d3023160a0000000000000004111e2b3744515e6a7784919daaa89b8e8275685b4f4235281c0f020e1a2734414d5a6774808d9aa7ab9e9185786b5e5245382b1f12050b1724313e4a5764717d8a97a4aea194887b6e6155483b2e22150800091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b0000000000000c1925323f4c5865727f8b98a5aea194887b6e6155483b2e2215080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020a111721272c3338394045474a4c4e50515253535252514f4d4a4746413a39352f28231c140c050000000000000000000000000000000000000000000000000000000000000000000000000000000000010b141d262e363e444c52565e61666a6e717476777879797878777673716e6966615e57524d453e362e261c140a000000000000000000000000000000000000000000000101070d11131416181a1c1e171614100b05000000000b1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000916222f3c4955626f7c8895a2afa4988b7e7165584b3e3225180b000000010e1b2734414e5a6774818d9aa7b1a4978a7e7164574b3e3124180b000000020d18242f3a434e585f6a6f7a82898f93999c9fa2aaa29f9d9b9a999998989898979797979a9da4aeafa396897c706356493d3023160a0000000000000004111e2b3744515e6a7784919daaa89b8e8275685b4f4235281c0f020e1a2734414d5a6774808d9aa7ab9e9185786b5e5245382b1f07000b1724313e4a5764717d8a97a4aea194887b6e6155483b2e22150800091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b0000000000000c1925323f4c5865727f8b98a5aea194887b6e6155483b2e22150800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b141c222832383e44484b515356595b5d5e5f5f5f5f5f5d5c5a5754524c47454039342e261e170f070000000000000000000000000000000000000000000000000000000000000000000000000000000009131d262f38404850565e61686e73777b7e81838485868685858482807e7b77736e69615e57504840382e261c130900000000000000000000000000000000000000000000000001040607090b0d0f120a0a07040000000000000b1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000916222f3c4955626f7c8895a2afa5988b7f7265584c3f3225190c000000010e1b2834414e5b6774818e9aa7b0a4978a7d7164574a3e3124170b0000000007131d28313c464e585f686d757c82878b8f929897999a9b9c9d9d9d9e9e9e9e9f9f9f9fa3abacb5afa396897c706356493d3023160a0000000000000004111e2b3744515e6a7784919daaa89b8e8275685b4f4235281c0f020e1a2734414d5a6774808d9aa7ab9e9185786b5e52452f24180c000b1724313e4a5764717d8a97a4aea194887b6e6155483b2e22150800091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b0000000000000c1925323f4c5865727f8b98a5aea194887b6e6155483b2e221508000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030c151d262d333d44484f55555c606366686a6b6b6c6c6c6b6a696664615e5653514b443f38302921191007000000000000000000000000000000000000000000000000000000000000000000000000000007101b252f38404a525a61686d747b8084888b8e8f919292929291918f8d8b8884807b746e69615a524a40382e251b0f060000000000000000000000000000000000000000000000000000000000010305000000000000000000000b1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000916222f3c4955626f7c8895a2afa6998c7f7366594c4033261906000000020f1b2835424e5b6875818e9ba8b0a3968a7d7063574a3d3024170a00000000010c161f2a343c464e565e616b6f757b7f8285888a8c8d8f8f9090919191919292929292999ba3acafa396897c706356493d3023160a0000000000000004111e2b3744515e6a7784919daaa89b8f8275685c4f4235291c08000e1a2734414d5a6774808d9aa7ab9e9285786b554b4035291d10040b1724313e4a5764717d8a97a4aea194887b6e6155483b2e22150800091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b0000000000000c1925323f4c5865727f8b98a5aea194887b6e6155483b2e2215080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b151e272f383f444f54596163676d70727577777879797978777573716d6865605d55504a423b332a22190f06000000000000000000000000000000000000000000000000000000000000000000000000030c19222d37404a525c636c717a81868c9196989a9c9e9f9f9f9f9e9d9c9a9895918d86817b716c645c524a40372d21180e0300000000000000000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000916222f3c4955626f7c8895a2afa79a8d8074675a4d412e23170c000000030f1c2936424f5c6975828f9ca8afa296897c6f6356493c302316090000000000040d18222a343c444c52596063696e7276797b7d7f81828383848484848585858585868b909ba7afa396897c706356493d3023160a0000000000000004111e2b3744515e6a7784919daaa99c8f8376695c50433025190e020e1a2734414d5a6774808d9aa7ac9f928679675d5145392c1f13060b1724313e4a5764717d8a97a4aea194887b6e6155483b2e22150800091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b0000000000000c1925323f4c5865727f8b98a5aea194887b6e6155483b2e221508000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007121d273039424a505960636b7075797d7f81838485868685858482807d7a76716d67605c544d453c342a21180c0300000000000000000000000000000000000000000000000000000000000000000000000a151e2b343f49525c646e737e858d92999da0a8a9a29f9d9c9b9c9d9fa2aaa7a09d99928e857e736e645c52493f332a1f140900000000000000000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000916222f3c4955626f7c8895a2afa89b8f827568544a3f34281c1003000004101d2935404b556a7683909da9b4aa95887b6e6255483b2f2215080000000000050e171e252a323a41464f54575e6165666d6f717374757676777777787878787879797e8b98a4afa396897c706356493d3023160a0000000000000004111e2b3744515e6a7784919daaaa9d9083776a564c41362a1e11050e1a2734414d5a6774808d9aa7afa399867a6d6053473a2d2014070b1724313e4a5764717d8a97a4aea194887b6e6155483b2e22150800091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b0000000000000c1925323f4c5865727f8b98a5aea194887b6e6155483b2e22150800000000000000000000000000000000000000000000000000000000000000000000000000000000000000040e18232e39434b545b606b70767d8185898c8e90919292929292908f8d8a87837e79726d665e574e463c332a1e150b0000000000000000000000000000000000000000000000000000000000000000000006111c26303d46515b646e74808a92979fa3a9a19e999792908f8f8f909298989d9fa7a39f97928a80736e635b51453b31261a0e04000000000000000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000916222f3c4955626f7c8895a2afaa9d908377665c5044382c1f1206000006131f2c3845515d677885919eabaea298877a6d6154473a2e21140700000000020c1720293036393a3e3f44484d5354545c606264666768696a6a6a6b6b6b6b6c6c6c717e8b98a4afa396897c706356493d3023160a0000000000000004111e2b3744515e6a7784919daaab9e918578685e5246392d2014070e1b2834414e5b6774818e9aa7b5ab94887b6e6155483b2e2215090b1825313e4b5864717e8b97a4aea194887b6e6155483b2e22150800091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b0000000000000c1925323f4c5865727f8b98a5aea194887b6e6155483b2e221508000000000000000000000000000000000000000000000000000000000000000000000000000000000000020c16202834404b555c666c737d838a8e9298999b9d9e9e9f9f9f9e9d9c999a93908b857f786e695f584e453c30271d12070000000000000000000000000000000000000000000000000000000000000000000c17232e38424f59626d74808d929ea1a9a39f97918c8885838282838385888b90959ea1a8a29f928d80736d62574d42362a20160a000000000000000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000916222f3c4955626f7c8895a2afac9f9286796d6053463a2d20130900000714202d3a4753606d7a86939facab9f928578685e5246392d2013070000000008131e29323a4146474b4c4d4e4f51524a50535557595a5c5c5d5d5e5e5e5e5f5f5f65717e8b98a4afa396897c706356493d3023160a0000000000000004111e2b3744515e6a7784919daaada197877a6e6154473b2e23180b0f1b2835424e5b6875818e9ba8b0a3978a7d7064574a3d31261a0d0c1825323f4b5865727e8b98a5aea194887b6e6155483b2e22150800091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b0000000000000c1925323f4c5865727f8b98a5aea194887b6e6155483b2e22150800000000000000000000000000000000000000000000000000000000000000000000000000000000000008131e28323a45515c676d78808990959b9fa2aaaba39f9d9d9c9d9ea1a9aca49f9d97928b837b6f6a5f574d42392e23180c020000000000000000000000000000000000000000000000000000000000000003101c28343f4a54606b727f8c929ca4aaa299928c84807b787675757677797b7f838a91969fa6a49c928b7f72695f53463d32271b0f030000000000000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000916222f3c4955626f7c8895a2afaea398887c6f6255493c31251a0d06030615222f3c4855626f7c889aa4afaa9d9084776a564c4135291d1105000000010d1925303a444c525457595a5b5c5d5e5b5953484a4c4e4f5050515151515252525965727f8c98a5afa396897c706356493d3023160a0000000000000004111e2b3744515e6a7784919daab3a9968a7d7063554b4034281d14111c2935424f5c6875828f9ba8b3a6998c807366584e43372b1f16111926323f4c5965727f8c98a5b5ab94877a6e6154473b2e21140800091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b0000000000000c1925323f4c5865727f8b98a5aea194887b6e6155483b2e2215080804000000000000000000000000000000000000000000000000000000000000000000000000000000010d1925303a44515b606d79828d929d9fa7a8a19e999992919090919297979b9fa4a9a19e9590857c6f695f544b4034281e14080000000000000000000000000000000000000000000000000000000000000006121f2c3844505c666f7c87929fa4aba29892878079736f6a6a696869656c6e72777d848f949fa6a49f92867b6e61584e43382b1f13060000000000000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000916222f3c4955626f7c8895a2afb4aa988b7f7265574d42362a1f161210121c2834404a5465717e8b98acb6a89b8e8175685b4e423025190d0100000005111d2a36414c565e6164656768696a6b68655d534840414243434444444545454d596673808c99a6afa295897c6f6256493c2f2316090000000000000004111e2b3744515e6a7784919daab4a79a8d8074675c51453a2f26201d1e2b37424d576a7783909daab6a99d9083766a5f53473c3128201e1d27333f49536774808d9aa7aea399877a6d6054473a2d21140700091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b0000000000050c1925323f4c5865727f8b98a5aea194887b6e6155483b2e22171614100b050000000000000000000000000000000000000000000000000000000000000000000000000005111d2935414c56626d75818e949ca4aba39f96918c88868483838485878a8f939a9fa7a79f9791857b6e665c51453b3025190e00000000000000000000000000000000000000000000000000000000000003101c28343f4a54606d78839099a3afa39992867d736d67625f585c5c535b6061656c707a828f949fa9a2988f82766a6054473b2e2215080000000000000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000916222f3c4955626f7c8895a2afb6a99c8f8376695e53463c3128201f1c1f232c3844515c6675818e9ba8b3a9988c7f7265594c3f32261908000000000713202d3946525e686d71727374767778756f65594d3d323536373737383835404b556774818e9aa7b2a995887b6e6255483b2f2215080000000000000004111e2b3744515e6a7784919daab7ab9f9285796d60564c42382f2c292a2d3a47535f697885929fabb8ab9f95887b6e62584e4339312d2a2a2d3744505b6576828f9ca9ac9f928679685d5245392c20130600091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b000000000810171c25323f4c5865727f8b98a5aea194887b6e6155483b2e262423201c1710080000000000000000000000000000000000000000000000000000000000000000000000000713202d3946525e68727f8b939ea6aba399928c84807c7977767677787a7e828790959ea5a9a1979083796d60564c41362a1c1106000000000000000000000000000000000000000000000000000000000006121f2c3844505c66727f8b95a0aba89f92877d706b605d55534e4f4f495053555a61686d79829097a1a49f94897c6f6256493c2f2316090000000000000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000916222f3c4955626f7c8895a2afb9ac9f93877b6e61584e433a312d2c282b2e343f4953606d7985929eabada197887c6f6255493c2f221609000000000714212e3a4754616d7a7e7f8081828485817568584e43372e2c2823282c2f3945515d677783909daaada196877a6d6054473a2d2114070000000000000004111e2b3744515e6a7784919daab7ada2978b7e71685e544a423c3935363a3f4a54616e7b8898a2aeb5afa79a8d80746a5f554b433d393636393d4653606c7985919eabaa9e9184776b564c4135291d110400091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b00000008121a22282d323f4c5865727f8b98a5aea194887b6e6155483b333331302d28221a11080000000000000000000000000000000000000000000000000000000000000000000003101c28343f4a54616d7a85929fa5aea39992877f79736f6d666a696a686e71757c838f939ea7a9a0958c8073685e5246382d22170b00000000000000000000000000000000000000000000000000000000000713202d3a4653606d7984919ea7ada1968d80736b6059514b474342423f44464850565d676d7a85929b9993908c8275685c4f4235291c0f0200000000000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000916222f3c4955626f7c8895a2afbbafa4998d80746a5f554c433d3a383438393f44505b65717d8a97a2adab9e9285796c605346392d201306000000000815212e3b4854616e7b878c8d8e8f909184786a6054473f3a38342e34383a404b55606d7a86929facab9e918578675d5145392c2013060000000000000004111e2b3744515e6a7784919daab1a7a09d92857a6d665b544e474541424648505b66727f8c98aab4aba49f9d92877c6f675d554f4746414146474e58626f7c8997a1ada99c8f8276695c4f432f24190d0100091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b000005101a242c33393c3f4c5865727f8b98a5aea194887b6e6155484040403d3c39332c231a100500000000000000000000000000000000000000000000000000000000000000000006121f2b3844505c6673808d97a2aba79f92877d726d6762605c545d565e61646a6f79818f95a0aba79f92867a6e61544a3f33281c0f0300000000000000000000000000000000000000000000000000000004101d2935404b5564717d8a96a1acaa9e9184796d60594f45403937312d3337393e444c555e68717e8b8e8a86837f7c6f6255483c2f2215090000000000000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000916222f3c4955626f7c8895a2afb4aba39f92877c6e675d554f4846443f44464a5059606c7883909da9b1a79a8e8174665b5044382b1f1206000000000714212d3a46535e697884919a9b9c9d96897c6f625a504a464440434044464b515c67717e8b98a3aeaa9b8f827568554b4135291d11040000000000000004111e2b3744515e6a7784919daaaca09590958e81786c665f5854524c4d53555a606c7883909daaafa4999390959083796d67605954524c4c525458606a74818e9aa9b3aa998d8073665a4d4033271a080000091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b00000c17222c363e45494a4d5865727f8b98a5aea194887b6e61554d4d4d4d4a49443e362c22170b0000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d7985929b9d9e9f958b7e716b605c5553514a504c5254585f676d78839099a3aea2988c8073665b5044382b1f12060000000000000000000000000000000000000000000000000000000613202c3945515d6775828f9ba8aea3988b7e71675d51473d352f2b2622272b2d323a434c56606d7883817e7a76736f6a5f53473b2e2115080000000000000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000916222f3c4955626f7c8895a2afaea39992999083796d6760595553504a5053545c606b727f8b959fabaca095897c6f63544a3f33281c0f030000000005121e2a36424d576774818e9aa6a9a89b8e81756c605c5453514a504a5153555d606d7983919daaaea2988b7e7165584b3e2f24180d010000000000000004111e2b3744515e6a7784919daaaa9d908490938e81786e6a64605d56575f61646c727f8b95a0acac9f93878390958f82796f6b64615e56565e61646a6f7c87929facaea298897d7063564a3d3023170a0000091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b0005111c28333e48505557595965727f8b98a5aea194887b6e615959595959575550483e33281c100400000000000000000000000000000000000000000000000000000000000000000a1623303d495663707c898c8e9092979083786c6059514b464440434146474e555d666f7c86929facaa9e9184786c605346392d2013060000000000000000000000000000000000000000000000000000000714202d3a4753606d7a86929facac9f92867a6d60554b403529241d1a171b1f2028313a44515c666d7775716d6866625f584e43372b1f12060000000000000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000916222f3c4955626f7c8895a2afac9f928692958f827a706b6562605c545b6062666d727d86929fa7b0a69d9083776b605442382d22170b0000000000020e1a25313c4855626f7c88949faaaa9e938a7e726d6662605c545d545c6062676d75808d95a0aca99f92867a6d6154473a2e211407000000000000000005111e2b3844515e6b7784919eaaa4978b7e8491938e827c75716d686b6b696e71767e87929fa7b1a79c8f827b8692948f837c75716e686b6b686d70757c859299a3afaa9f9285796d6053463a2d2013070000091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b000814212d3945505a6164666666727f8b98a5aea194887b6e66666666666664615a5044392d20140800000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7b7e7f81838587887e71655b5045403a38343036393c434b545f6a75818e9baaada196897c6f6256493c2f2316060000000000000000000000000000000000000000000000000000000a1723303d4a5663707d8998a3aea89b8e8275675d51433a2f23181d1d1d1d1d161f2834404a545c606a6864615e5655534e463c32261b0f030000000000000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000916222f3c4955626f7c8895a2afa6998c7f8c94948f847d76726f6d666b666c6e72787f879298a3aea99f948a7e7164594f442f261c11060000000000000915212e3b47535f6a76828f98a2aea59f92877f78726f6d666a696a666d6f7379818d929da7aca2978d8074685d5246392d201307000000000000000005111e2b3844515e6b7784919eaaa3978a7d7d8992948f86817d7a797778797b7e838b9299a3afaba0958a7e737f8c94959087827e7a797878797a7d82889297a1abaea3988d8074665c5145382c1f13060000091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b000a1723303c4955616c71737373737f8b98a5aea194887b73737373737373706c6155493c3023160a00000000000000000000000000000000000000000000000000000000000000000714202d3a46525e696e71737476787a7c796d6053493f46464544423f3b3a39424e5863707d8998a2aea8998c7f7366594c402d22170b0000000000000000000000000000000000000000000000000000000d1a2733404d5a6673808d99aab4aa978b7e7164554c4131282a2a2a2a2a2a2a2a2a232e39424a51535d5b5754524c4847433c342a20150a000000000000000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000916222f3c4955626f7c8895a2afa396897d828f97969189837f7b79787778797b7f848b9299a3aaaaa2978f82766c6155473d321d140a0000000000000006121f2b37434e58626f7c86929fa4aca399928b837f7b797777767777797c80858e939da4aea49a92857a6d61564c4135291d1105000000000000000005121e2b3845515e6b7884919eaba3968a7d73808d9499928e8a8785848585888b90959fa3abaea3999183786d78828f959a938f8b8786848485878a8e939aa1a9afa59f92867b6e61544b4034281c10040000091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b000b1724313e4a5764717e80808080828f9ca8b3a79a8d80808080808080807e7064574a3d3124170a000000000000000000000000000000000000000000000000000000000000000005111e2a36424d575e616466686a686d6f6d675d515152535352514e4c4847423c4653606c7885929faba89b8f82756853493f33271b0f030000000000000000000000000000000000000000000000000004101c2834404b546975828f9ca8aea398887b6f6255483c2f3737373737373737373737373039404446514e4b4746413c3b37322a261f180f060000000000000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000916222f3c4955626f7c8895a2afa3968a7d7b8592999e95908b888685848486888c91959fa3abaaa29892857b6e615a5045352b210b0200000000000000030f1b26323c47535f6a717e8b939aa2aaa39f95918c8886848483838485898c92979ea5aaa39f93887d70685e52443a3024190d01000000000000000005121f2b3845525e6b7885919eaba396897c7078828f949f9b97989291919298979d9fa7aeaaa29f92877d70666d7a8390959f9c97999291919298979b9fa4acaca49f938c7f72695e5342392e23180c000000091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b000f1c2835424f5b6875828c8c8c8c8f949eaab5a99d928d8c8c8c8c8c8c8c8174685b4e4135281b0e0200000000000000000000000000000000000000000000000000000000000000020e1a25303b454d525457595b565d6062605d555c5e5f5f5f5f5d5b5955534d4644505b6576838f9ca9aa9e918477655b5044372b1f12050000000000000000000000000000000000000000000000000006131f2c3845515c667884919eabac9f9286796d6053464444444444444444444444444444444444444444444444444444443b3a36312a21180e0300000000000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000916222f3c4955626f7c8895a2afa4978a7d717d8792989f9d9899929191919298989da0a8aba79f9892867d70695f53483e3323190f0000000000000000000a15202b37434e58616c727f8892989fa3a7a09d99999291909090919298999ea2a9a69f98928b7f726c61564c4132281e130800000000000000000004101d2935404b556c7885929f9f9f95887c6f6d79828d939a9fa29f9e9e9fa3aaa9a9aba39f98928a7f726b60686d7a838d939a9fa39f9e9e9fa2aaa8a9aba49f9a938c81776c60574d4230271d1207000000091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b000f1c2835424f5b6875828e9999999c9ea6b0b9aea49d9a9999999999998e8174685b4e4135281b0e02000000000000000000000000000000000000000000000000000000000000000009141f29333b4246474a4c4e4c52545c606366696b6c6c6c6b6a6865625f5753504a536773808d9aa6ac9f9286796c605346392d201306000000000000000000000000000000000000000000000000000713202d3a4653606d7986939facaa9d908477665c50505050505050505050505050505050505050505050505050505050504846423b332a1f140900000000000000000000000000000000000000000000000000000000000000000000000000010b1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000916222f3c4955626f7c8895a2afa4978a7e71707d8690959d9fa39f9e9e9e9fa3aaa9a8a79f9d9590867d706b60574d42362c221107000000000000000000040f1a26313c46505a636d727e868e92999da0a8aba39f9e9d9c9d9e9fa2aaaaa29f9b948f867e726d62594f443a3020160c020000000000000000000613202c3945515d6779869293939393887b6e676d7880878f93999b9d9e9f9f9f9e9c9a99928e867e726d62595e686d7980878e92999a9c9e9f9f9f9e9d9a99938e877f746c655b50453b311e150b00000000091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b000f1c2835424f5b6875828e9b9f9fa0acaeb5bdb1a9a3a19f9f9f9f9f9b8e8174685b4e4135281b0e020000000000000000000000000000000000000000000000000000000000000000020d17202930363a3b404850565d60666d70737677787979787775726e6964605c545966727f8c99a5aea399877a6d6154473a2e211407000000000000000000000000000000000000000000000000000815212e3b4854616e7b879aa4afa99c90837669545d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d55534d453b31261a0e02000000000000000000000000000000000000000000000000000000000000000105090b0b0d0d1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000916222f3c4955626f7c8895a2afa4978a7e716b707c838a9095989b9d9e9f9f9f9e9d9b9895908a837b706b60594f453b31241a1000000000000000000000000a15202a343e48515b636c717b81878c919597999c9d9e9e9f9f9f9e9d9b9998928e89827b716c625b51473e32281e0e04000000000000000000000714202d3a4753606d79868686868686867a6d61666d737c82878b8e909192929291908d8a86817b716c625b51565e676d737c81868a8d909192929291908e8a87817c736d605b53493f33291f0c0300000000091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b000f1c2835424f5b6875828e939393939fa3abb5a99f98949393939393938e8174685b4e4135281b0e02000000000000000000000000000000000000000000000000000000000000000000050e171f252a38404a525a61686d73797d8082848586868584817f7b77716d66605865717e8b98a4b4ab94887b6e6155483b2e221508000000000000000000000000000000000000000000000000000916232f3c4956626f7c8995acb6a89c8f82756a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a615f574d42362a1e1205000000000000000000000000000000000000000000000000000000000000060c111517181a1a1a25313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000916222f3c4955626f7c8895a2afa4978b7e71646a6f787e83888b8e909192929291908e8b88837e766e6960594f473d33291f12080000000000000000000000030e18222d363f49515a61696e747b8084888b8d8f90919292929291908e8c8985817c766e69625a51493f352c20160c00000000000000000000000613202c3945515d67767979797979797976685e5c606a6f757a7e8183858586858483817e7a746e69615a51494c555c606a6f757a7e8183848586858483817e7b756f6a635b504941382d21170d0000000000091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b000f1c2835424f5b68758186868686868b99a3aea3988d88868686868686868174685b4e4135281b0e02000000000000000000000000000000000000000000000000000000000000000000020c16202c36404a525c646c717a8085898d8f9192929292908e8c88837e786f6a6264717d8a97a4aea195887b6e6255483b2f221508000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afa89b8e8177777777777777777777777777777777777777777777777777777777777777776e695f53463a2d21140700000000000000000000000000000000000000000000000000000000000911181d21242527272727313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000916222f3c4955626f7c8895a2afa4978b7e71645f666d71777b7e8183858586858583817e7b76716c615f574f473d352b21180d0000000000000000000000000006101b242e373f4850575e61696e73777b7e80828484858686858583827f7d79756f6b625f5750483f372d231a0e04000000000000000000000004101d2935404b555d6c6c6c6c6c6c6c6c6c5e5651586062686d71747678797978787674716d67615e5750483f434b51585f62686d71747678787978777674716e69625f5851443f382f261b0f050000000000091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b000e1b2834414d59656f75797979797987929faca194887b79797979797979746f64594d4034271a0e0100000000000000000000000000000000000000000000000000000000000000000008131e28323e48525c646e737e858d9297999c9e9f9f9f9e9d9b9895908b847c726d64717d8a97a4aea295887b6f6255483c2f221509000000000000000000000000000000000000000000000000000a1724303d4a5763707d8a96a3b0ab9e928583838383838383838383838383838383838383838383838383838383838383837b6e6155483b2e2215080000000000000000000000000000000000000000000000000000000009121b22292e313234343434343e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000916222f3c4955626f7c8895a2afa4978b7e7164545c6064696e72747678787979787675726e6964615a534d453d352b23190f06000000000000000000000000000009121c252e363e454d52575f62666a6e71737577787879797978777573706d67636059534d453e362d251b1108000000000000000000000000010d18242f39434b515f606060606060605f524c454e54565e6165686a6b6c6c6c6b696764605d55534d453e363940454e53565d606467696b6c6c6c6b6a6764615e57534e4640332d261d140a000000000000091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b000c1925313d48535d65686c6c6c677683909da9a194887b6e6c6c6c6c6c6c68645d53483c3024180c000000000000000000000000000000000000000000000000000000000000000000010d1925303a44505a646e73808a92979ea1a9a9a8a19e9c9b9a9b9d9f9d9591877f736e717d8a97a4afa295887c6f6255493c2f221609000000000000000000000000000000000000000000000000000a1724313d4a5764707d8a97a3b0ada1979290909090909090909090909090909090909090909090909090909090909090887b6e6255483b2f22150800000000000000000000000000000000000000000000000000000006111b242d343a3d3e4040404040404b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000916222f3c4955626f7c8895a2afa4978b7e7164585053575f6165686a6b6c6c6c6b6a6865615f57555046423b332b231a1108000000000000000000000000000000000a131c242c333b42464d5355575f626466696a6b6b6c6c6c6b6a686663605d55544f47423c332d241b1309000000000000000000000000000007121d283139404553535353535353535346413c43474c5254585b5d5e5f5f5f5e5d5a5754514c46423b332c2e343c43474c5254575a5d5e5f5f5f5e5d5b5754524d47433c3427221b140b02000000000000091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b000915202c37424b53595b6060606774808d9aa7a194887b6e6160606060605b59534b41372b20140800000000000000000000000000000000000000000000000000000000000000000005111d2935414c56616c73808d929fa2a9aaa29f9996918f8e8d8e9092999d99928c8073717d8a97a4afa295887c6f6255493c2f221609000000000000000000000000000000000000000000000000000a1724313d4a5764707d8a97a3b0b3a9a19e9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d94887b6e6155483b2e2215080000000000000000000000000000000000000000000000000000010c18222d363f454a4b4d4d4d4d4d4d4d5864717e8b97a4b1a79a8e8174675b4e4134281b0e000916222f3c4955626f7c8895a2afa4978b7e7164584b464d5355585b5d5e5f5f5f5e5d5b5855534d49453e36312a211a11080000000000000000000000000000000000010a121a212930363c4247484e5355585a5c5d5e5f5f5f5f5e5d5b595653514b48433d37312a211b1209010000000000000000000000000000010c161f282f3539464646464646464646393632373a4146474b4e505252535251504e4b4745413a36312921232831373a4145474b4e505152535251504e4b4746423b37312a2217110a0200000000000000091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b00040f1b25303942484d4f53535764717e8a97a9a194887b6e6155535353534e4d4841392f251a0f030000000000000000000000000000000000000000000000000000000000000000000713202d3946525e68717e8a929da4ada79f98928d88848281818183868b91959f928b7f727d8a97a4afa295887c6f6255493c2f221609000000000000000000000000000000000000000000000000000a1723303d4a5663707d8996a3b0b8b0aba99f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9fa9aaaaaaaaaa94877a6e6154473b2e211408000000000000000000000000000000000000000000000000000005111d29343f485056585a5a5a5a5a5a5a5a64717e8b97a4b1a79a8e8174675b4e4134281b0e000916222f3c4955626f7c8895a2afa4978b7e7164584b3e4246484b4e505252535252504e4b4847423c39332a261f180f080000000000000000000000000000000000000000080f171f252a31373a3c4247484b4d4f51515253535252504f4c4a4745403938322b2620180f090000000000000000000000000000000000040d161d24292c39393939393939392e2d2a272b3036393a3e4143454646454543413e3a39352f2a251f171820262b2f35393a3e4143454546454443413e3b3a36302b2620181006000000000000000000091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b000009141e2730373d4142464854616e7b8796a1a194887b6e61554846464641403c372f271d130900000000000000000000000000000000000000000000000000000000000000000004111d2935414c56616d7a85929ea4aea79f959086807b7875747475767a7e848c939992867c7d8a97a4afa295887c6f6255493c2f22160900000000000000000000000000000000000000000000000000091623303c4956636f7c8996a2afb0a69f9c9393939393939393939393939393939393939393939393939c9ea6b0aea398877a6d6054473a2d21140700000000000000000000000000000000000000000000000000000915212e3a45505a6265676767676767676767717e8b97a4b1a79a8e8174675b4e4134281b0e000916222f3c4955626f7c8895a2afa4978b7e7164584b3e363a3b3f4143454546464543423f3b3a37312d28221a140e0600000000000000000000000000000000000000000000050d141a1f262b2e31373a3b3e4042444545464646454442403d3a38352f2c27211a150e0600000000000000000000000000000000000000040c12181d202d2d2d2d2d2d2d2d21201d1b1e252a2d2e32353738393939383634312d2c29241e1a140d0c151a1e24292c2d31343638393939383734312e2d2a251f1b150e0600000000000000000000091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b0000020c151e252c3134353a46535e697884919ea194887b6e6155483b39393534302b251d150b010000000000000000000000000000000000000000000000000000000000000000000713202c3945525d6873808d97a1adaa9f9590837b736e6969686768676d71797f87929890837e8a97a4afa295887c6f6255493c2f221609000000000000000000000000000000000000000000000000000815222f3b4855626e7b8895a9b3ab9f948f8686868686868686868686868686868686868686868686868f949eaaac9f928579675d5145392c20130600000000000000000000000000000000000000000000000000000b1724313d4a56626d71737373737373737373737e8b97a4b1a79a8e8174675b4e4134281b0e000916222f3c4955626f7c8895a2afa4978b7e7164584b3e312d2e32353738393939383735322e2d2b261f1c170e090300000000000000000000000000000000000000000000000002090e151a1e21262b2e2f31333637383839393938373533302d2c29241d1b160e090300000000000000000000000000000000000000000001070d101320202020202020201413110f13191e202125282a2b2c2c2c2b2a272421201d19130e0903030a0f13191d202124272a2b2c2c2c2b2a282421201e1a140f0a030000000000000000000000091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b000000030c141b2025282a36424d576875828e9ba194887b6e6155483b2e2d282724201a130b03000000000000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a85929fa9aea2989083796e69625f575b5a555d60666d737e8692958f828f9ca8afa295887c6f6255493c2f221609000000000000000000000000000000000000000000000000000714212d3a4754606d7a8797a2ada99c8f82797979797979797979797979797979797979797979797979828f9ca9ab9e9184786b554b4135291d110400000000000000000000000000000000000000000000000000000b1825323e4b5865717f80808080808080808080828f9ca9b4a79a8e8174675b4e4134281b0e000916222f3c4955626f7c8895a2afa4978b7e7164584b3e31252225282a2b2c2c2c2b2a282522211e1a15110c050000000000000000000000000000000000000000000000000000000003090e12151a1e21222527292a2b2c2c2c2c2b2a282623201f1d18120f0a0400000000000000000000000000000000000000000000000000010406131313131313131307070502080d111314181b1d1f1f201f1e1d1b181413110d08010000000001080d111314181b1d1e1f201f1e1d1b181414110e090200000000000000000000000000091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b0000000002090f15191a25313f4c5965727f8c989f94887b6e6155483b2e221b1a18140f09010000000000000000000000000000000000000000000000000000000000000000000004111d2935414c5665727e8b98a2aeab9f92867b6e675e57534d4e4e4b51545c606c717e8a92948f949eaaafa295887c6f6255493c2f221609000000000000000000000000000000000000000000000000000613202c3945515d677885929eabaa9d9184776c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c667784919eaaa99c8f8376695c50432f24180d010000000000000000000000000000000000000000000000000003101d293643505c6976828d8d8d8d8d8d8d8d8d8d8f949eaab4a79a8e8174675b4e4134281b0e000916222f3c4955626f7c8895a2afa4978b7e7164584b3e312518181b1d1f1f201f1f1d1b181514120e090300000000000000000000000000000000000000000000000000000000000000000206090e121415181a1c1e1e1f20201f1f1d1c19171413100c070100000000000000000000000000000000000000000000000000000000000006060606060606060000000000010507070b0e101213131212100e0b070604010000000000000000010406070b0e101212131211100e0b08070502000000000000000000000000000000091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b0000000000000409091623303c4956636f7c89999393887b6e6155483b2e2215080c08030000000000000000000000000000000000000000000000000000000000000000000000000713202c3945525d687683909caaaea3998c8073695e554d4742414140454a515a616c74808d979c9ea6b0afa295887c6f6255493c2f2216090000000000000000000000000000000000000000000000000004111d2935414c55697683909ca9ab9f928578695f606060606060606060606060606060606060606d7986929faca79a8d8174675a4e4134271b07000000000000000000000000000000000000000000000000000003101d293643505c6976838f9a9a9a9a9a9a9a9a9a9c9ea6b0b4a79a8e8174675b4e4134281b0e000916222f3c4955626f7c8895a2afa4978b7e7164584b3e3125180c0e101212131312100f0c0808060200000000000000000000000000000000000000000000000000000000000000000000000000020608080b0d0f11121213131312110f0d0a0706040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b00000000000000000713202d3a4653606d7987868686867b6e6155483b2e2215080000000000000000000000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a86929facac9f92867a6d61574d433b37312f35394044505a606d7a85919eaab0b8afa295887c6f6255493c2f22160900000000000000000000000000000000000000000000000000010d19242f414d5a6774808d9aabaea298887b6e61555353535353535353535353535353535355626f7c8899a3afa9988b7e7265584b3f3225180c000000000000000000000000000000000000000000000000000003101d293643505c6976838f9ca6a6a6a6a6a6a6a6a9aab0acaca79a8e8174675b4e4134281b0e000916222f3c4955626f7c8895a2afa4978b7e7164584b3e3125180b0204050606060504020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000105070810101010101010101010101010101010101010101008070501000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b000000000000000006131f2c3845515c6775797979797976695f53463a2d2114070000000000000000000000000000000000000000000000000000000000000000000000000000000a1724313d4a5764707d8a99a3afa99c8f8276685e52453b312b2624292e343e45525d68727f8c98a2aebaafa295887c6f6255493c2f2216090000000000000000000000000000000000000000000000000000081724313d4a5764707d8a99a3afaa988b7e7165574d42464646464646464646464646424d5765727f8c98abada297887b6f6255483c2f221509000000000000000000000000000000000000000000000000000003101d293643505c6976838f9c9f9f9f9f9f9f9f9f9f9f9f9f9f9f9a8e8174675b4e4134281b0e000916222f3c4955626f7c8895a2afa4978b7e7164584b3e3125180b0000000000000000000000000000000000000000000000000000000000000000000000000003080b0d0e13131313131313131313131313131313131313131313131313131313131313131311100e0a06000000000000000000000000000000000000000002080d1114141c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1414110d080200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b000000000000000004101c2834404b555c6a6c6c6c6c6c6c5f574d42372b1e12050000000000000000000000000000000000000000000000000000000000000000000000000000000d1a2733404d5a6673808d99abb5ab988b7f7265564c4133291f1a181c232935414c56606d7a85929fabb8afa295887c6f6255493c2f22160900000000000000000000000000000000000000000000000000000714212e3a4754616d7a86929faca89b8e8275695e53463d313939393939393939303946525e6976828f9ca9ab9e9285786c605346392d201306000000000000000000000000000000000000000000000000000003101d293643505c6976838f939393939393939393939393939393938e8174675b4e4134281b0e000916222f3c4955626f7c8895a2afa4978b7e7164584b3e3125180b000000000000000000000000000000000000000000000000000000000000000000000001080f14181a1b2020202020202020202020202020202020202020202020202020202020202020201e1d1a16110b040000000000000000000000000000000000050d14191e202129292929292929292929292929292929292929292921201e19140d05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000091623303c4956636f7c8996a2aca4978a7d7164574a3e3124170b0000000000000000000c18232e39434b51535f6060606055534d453c31261a0e02000000000000000000000000000000000000000000000000000000000000000000000000000003101c28343f4a546975828f9ca8afa399887c6f6255493c3022170d0d1219242f3a45525d6875818e9ba8b4afa295887c6f6255493c2f22160900000000000000000000000000000000000000000000000000000713202d3946525d6876828f9ca8ac9f92867b6e61584e433b322c292424292c3139424d57616e7b86929faca89b8e8174655b5044372b1f1205000000000000000000000000000000000000000000000000000003101d293643505c6976828686868686868686868686868686868686868174675b4e4134281b0e000916222f3c4955626f7c8895a2aca4978b7e7164584b3e3125180b00000000000000000000000000000000000000000000000000000000000000000000020b131a202427272d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2a2927221c150d05000000000000000000000000000000050e171e252a2d2e3636363636363636363636363636363636363636362e2d2a251e170e050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000091623303c4956636f7c89969f9f9f978a7d7164574a3e3124170b00000000000000000007121d27303940454653535353534846423c332a1f140900000000000000000000000000000000000000000000000000000000000000000000000000000006121f2b3844505c667884919eabac9f9286796d6053463a2d2013070008131e2935414c5664717d8a97a8b2afa295887c6f6255493c2f221609000000000000000000000000000000000000000000000000000005111d2935414c5664717e8a96a1ada3998d80746a60564d443e39352f2f35383c434b545e6973808d99a3aca0968a7d706353493f33271b0f030000000000000000000000000000000000000000000000000000020f1c2835414e5a667076797979797979797979797979797979797979746f64594c4033271a0d000916222f3c4955626f7c88959f9f9f978b7e7164584b3e3125180b000000000000000000000000000000000000000000000000000000000000000000010b141d252b3033343939393939393939393939393939393939393939393939393939393939393939393736332e271f170d0400000000000000000000000000020d1720293036393b4343434343434343434343434343434343434343433b3936302920170d0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000091623303c4956636f7c8993939393938a7d7164574a3e3124170b000000000000000000000b151e272e34383a46464646463b3a37312a21180e030000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d7986929facaa9e918477665c5145382c1f130600010d19242f3a4754616d7a8796a0acafa295887c6f6255493c2f2216090000000000000000000000000000000000000000000000000000010d1924303a4653606d7984919ea7ab9f92877c6f685e564f47454141414045474e555c666e7b86929faba89e9184786c605346392d22170b000000000000000000000000000000000000000000000000000000000d1926323e49545e66696c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c67645d53483c3024180b000916222f3c4955626f7c8893939393938b7e7164584b3e3125180b00000000000000000000000000000000000000000000000000000000000000000008131d262f363c404146464646464646464646464646464646464646464646464646464646464646464644423f3931291f150b0000000000000000000000000008141e29323b4146474f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4746413b32291e140800000000000000000000000000000000000000000000000000000000000000000000000000000000000000091623303c4956636f7d868686868686867e7164574a3e3124170b00000000000000000000030c151d23282c2d39393939392e2d2b261f180f06000000000000000000000000000000000000000000000000000000000000000000000000000000000815212e3b4854616e7b8799a3afa99c8f827669544b4034281c100400000813202d3946525d687784919eaaafa295887c6f6255493c2f22160900000000000000000000000000000000000000000000000000000008131f2c3845515c66727f8b95a0aba39991847a6e68615954514c4e4e4b5153575f676d78839098a2aca0968b7f72665b5044382b1b1106000000000000000000000000000000000000000000000000000000000915212d38424c545a5c6060606060606060606060606060606060605b59534a41362b201408000916222f3c4955626f7c868686868686867e7164584b3e3125180b0000000000000000000000000000000000000000000000000000000000000000030f1a252f3841484c4e535353535353535353535353535353535353535353535353535353535353535353514f4a433b31271c11060000000000000000000000010d1925303b444c52545c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c54524c443b3025190d010000000000000000000000000000000000000000000000000000000000000000000000000000000000000915222f3b4854606b6f79797979797979716c6155493c3023170a0000000000000000000000030b12181c1f202c2d2d2d2d22211e1a140e0600000000000000000000000000000000000000000000000000000000000000000000000000000000000916222f3c4955626f7c8895abb5a79b8e8174685b4e412e23180c00000005111d2935414c566875828f9ba8afa295887c6f6255493c2f22160900000000000000000000000000000000000000000000000000000004101c2834404b54606d78839199a3aba09690837a706b64605d555b5b555d60636a6e79818e959faaa49a9184796d60544a3f33281c0a000000000000000000000000000000000000000000000000000000000005101b26303a42494e505353535353535353535353535353535353534e4c4841382f251a0f03000815212e3b47535f6a7679797979797979716c6256493d3024170a00000000000000000000000000000000000000000000000000000000000000000814202b36414a53585a6060606060606060606060606060606060606060606060606060606060606060605d5b554d43392e22160a000000000000000000000005111e2a36414c565e61696969696969696969696969696969696969696969615e564c41362a1e110500000000000000000000000000000000000000000000000000000000000000000000000000000000000007131f2c38434f5960636c6c6c6c6c6c6c64615a5045392d21140800000000000000000000000000070c10131320202020201514120e09030000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afa69a8d8073675a4d4034271a07000000010d192430414d5a6774808d9aa7afa295887c6f6255493c2f221609000000000000000000000000000000000000000000000000000000000c18232e3944515c666f7c87929fa4a8a09590847d76716d6769676869676d70757b838e939ea7a69f93887d70665c5142382d22170b0000000000000000000000000000000000000000000000000000000000000a141e2830383e414346464646464646464646464646464646464641403c362f261d1308000006131f2b37434e585f626c6c6c6c6c6c6c64625a5045392d21150800000000000000000000000000000000000000000000000000000000000000000b1824303c48535c64676c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6a675f554a3f33271a0e00000000000000000000000714202d3946525e686e7676767676767676767676767676767676767676766e685e5246392d201407000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1b27323d474f545660606060606060575550483e33281c110400000000000000000000000000000004060713131313130807050200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1724313d4a5764707d8a97a3b0a6998c807366594d4033261a0d00000000081926323f4c5965727f8c98a5afa295887c6f6255493c2f2216090000000000000000000000000000000000000000000000000000000007121d2834404a54606b727f8c929ca4a7a096918a827d7a7775747475767a7d818790959ea5a59e938d80736b61544b402f261c1106000000000000000000000000000000000000000000000000000000000000030c161e262d3235363939393939393939393939393939393939393433302b251d140b010000030f1b26323c464e535560606060606060585650483e34291d110500000000000000000000000000000000000000000000000000000000000000000d1a2733404c58646e747979797979797979797979797979797979797979797979797979797979797979797771675b4f4236291d1000000000000000000000000814212e3b4754616e7a8282828282828282828282828282828282828282827a6e6154473b2e211408000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a16212b353d434849535353535353534a49453e362c22170c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1724313e4a5764717d8a97a4b0a5998c7f7266594c3f3326190c000000000b1825323e4b5865717e8b98a4afa295887c6f6255493c2f22160900000000000000000000000000000000000000000000000000000000000c18232e39424f59626d73808c929ea1a8a19e948f8a8683828181828386898e93999fa7a39f938f81786d60594f42392e1d140a0000000000000000000000000000000000000000000000000000000000000000040c141b212628292d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d282724201a130b02000000000a15202a343c434749535353535353534b49453e362d22170c0000000000000000000000000000000000000000000000000000000000000000000e1b2734414e5a67748186868686868686868686868686868686868686868686868686868686868686868683776a5d5144372a1e1100000000000000000000000815212e3b4854616e7b878f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f877b6e6154483b2e21150800000000000000000000000000000000000000000000000000000000000000000000000000000000000000040f19232b32383b3c464646464646463e3c39332c241a100500000000000000000000000000000000000000000000000407090a1313131313131208070502000000000000000000000000000000000000000000000000000000000000000000000b1824313e4b5764717e8a97a4b1a5988c7f7265594c3f3226190c000000000b1824313e4b5764717e8a97a4afa295887c6f6255493c2f221609000000000000000000000000000000000000000000000000000000000007121c27303d46515b646e73808a92979fa3a69f9c9992908f8e8e8f9092989b9fa4a69f99928c81796d665c50473d30271d0b02000000000000000000000000000000000000000000000000000000000000000000030a1015191c1d2020202020202020202020202020202020201b1a18140f08010000000000040e18222a32373b3c464646464646463e3d39342d241b11060000000000000000000000000000000000000000000000000000000000000000000e1b2734414e5a6774818d939393939393939393939393939393939393939393939393939393939393939083776a5d5144372a1e1100000000000000000000000815212e3b4854616e7b87949c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c94877b6e6154483b2e211508000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007101921272c2f303939393939393931302d28221a120800000000000000000000000000000000000000000000050b101416172020202020201f1514120e090300000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1a5988b7f7265584c3f3225190c000000000b1724313e4a5764717d8a97a4afa295887c6f6255493c2f2216090000000000000000000000000000000000000000000000000000000000000b151e2b343f49525c646e737e858e92999ea1a8a39f9d9c9a9b9c9d9fa3a9a29f9b948f877f776d675c544a3f352c1e150b00000000000000000000000000000000000000000000000000000000000000000000000005090d0f101313131313131313131313131313131313130e0d0b0803000000000000000006101820262b2e2f3939393939393931302d29221b1209000000000000000000000000000000000000000000000000000000000000000000000e1b2734414e5a6774818d9a9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9d9084776a5d5144372a1e1100000000000000000000000815212e3b4854616e7b8794a1a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a194877b6e6154483b2e211508000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070f161b1f22232d2d2d2d2d2d2d2423211c171008000000000000000000000000000000000000000000000810161c2023242c2d2d2d2d2d2c22211e1a140d06000000000000000000000000000000000000000000000000000000000000000b1824313e4b5764717e8a97a4b1a5988c7f7265594c3f3226190c000000000b1825313e4b5864717e8b97a4afa295887c6f6255493c2f221609000000000000000000000000000000000000000000000000000000000000030c19222d37404a525c636c707a81868d9196989b9c9e9f9f9f9f9e9d9b9997928e89827c736c655c554b42382e231a0c0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060e151b1f21222d2d2d2d2d2d2d2524211d17110900000000000000000000000000000000000000000000000000000000000000000000000e1b2734414e5a6774818d9aa7acacb2a9a19e9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9084776a5d5144372a1e1100000000000000000000000815212e3b4854616e7b87949f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f94877b6e6154483b2e21150800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040a0f13151620202020202020171714110c050000000000000000000000000000000000000000000008111a21282c2f30393939393939382e2d2a261f180f060000000000000000000000000000000000000000000000000000000000000b1724313e4a5764717d8a97a4b0a5998c7f7266594c3f3326190c000000000c1825323f4b5865727e8b98a5afa295887c6f6255493c2f2216090000000000000000000000000000000000000000000000000000000000000007101b252e38404a525a61686d747b8084888b8e90919292929291908e8c8985817c766f6a605b534b433930261c110800000000000000000000000003090d1012131313131313130e0d0b080300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040a0f13151620202020202020181715110c060000000000000000000000000000000000000000000000000000000000000000000000000e1b2734414e5a6774818d9aa9b3b9ada1979191919191919191919191919191919191919191919191919083776a5d5144372a1e1100000000000000000000000815212e3b4854616e7b8793939393939393939393939393939393939393877b6e6154483b2e21150800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003070909131313131313130b0a0804000000000000000000000000000000000000000000000007101a232c33383c3d464646464646453b3a36312921180d0300000000000000000000000000000000000000000000000000000000000a1724303d4a5763707d8a96a3b0a6998d8073665a4d4033271a0d000000000d192633404c5966737f8c99a6afa295887c6f6255493c2f221609000000000000000000000000000000000000000000000000000000000000000009131c262e37404850565e61696e73787c7e818384858686858583817f7c79746f6a625f585049413930271e150a000000000000000000000000070e14191d1f202020202020201b1a17140e08010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003060809131313131313130b0a080500000000000000000000000000000000000000000000000000000000000000000000000000000e1a2734414d5a6774808d97a2adb8ab9e91858484848484848484848484848484848484848484848484848275685c4f4235291c0f00000000000000000000000815212e3b4854616e7b8686868686868686868686868686868686868686867b6e6154483b2e21150800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060f19222c353e44484a535353535353524846423b33291f140900000000000000000000000000000000000000000000000000000000000916232f3c4956626f7c8995a2afa79a8d8174675a4e4134271b08000000010e1b2734414e5a6774818d9aa7afa295887c6f6255493c2f2216090000000000000000000000000000000000000000000000000000000000000000010a141c252e363e444c52575e61666a6f7274767878797978787675726f6d66626058534e443f382f271e150c0300000000000000000000000811191f25292b2c2d2d2d2d2d2d2726241f1a130b0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000815212e3b4854616e7b85929ea4aea99d9083787777777777777777777777777777777777777777777777756f65594d4134281b0e00000000000000000000000714212d3a46535e697679797979797979797979797979797979797979797976695e53463a2d211407000000000000000407090a13131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313130a09070400000000000000000000000000000000000000000000040d18212b343e474f55575f60606060605f55534d453b31261a0e02000000000000000000000000000000000000000000000000000000000815222e3b4855616e7b8894a9b3a89b8f8275685c4f423025190e02000005121e2a36424d576976828f9ca9afa295887c6f6255493c2f221609000000000000000000000000000000000000000000000000000000000000000000020a131c242c323a41464d5254585f626568696b6c6c6c6c6b6a686663605c54544e47433c332d261d150c03000000000000000000000007111a232a313538393939393939393433302b241d140b0100000000000000000000000000000000000000000003080c0e0e131313131313130f0e0c09040000000000000000000000000000000000000000000000000000000000000003070b0d0e131313131313130e0e0c080300000000000000000000000714202d3a46525e69707d8a929da7ab9f958d80736b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a68655d54493d3125190c000000000000000000000005121e2a36424d575e6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c5e574d42362a1e12050000000000040b101316162020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020171614100b0500000000000000000000000000000000000000020b16202a333d474f5961636c6c6c6c6c6c6b615f574d42362a1e1205000000000000000000000000000000000000000000000000000000000714202d3a4753606d7a8697a1ada99d9083766a564d41362a1e110500000714202d3a46525e697885919eabafa295887c6f6255493c2f22160900000000000000000000000000000000000000000000000000000000000000000000010a121a202830363b4246484e5355585b5d5e5f5f5f5f5e5d5b595653514b47433d373127221b140b030000000000000000000000030e19232c353c414546464646464646413f3c362f261d13080000000000000000000000000000000000000001090f14181a1b202020202020201c1b191510090200000000000000000000000000000000000000000000000000000001080e1317191a202020202020201b1a18140f090100000000000000000005121e2a36424d57616c74808d95a0aaa79f93887d70685e545e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5c59544b42372c2115090000000000000000000000020e1a25313b454d535f6060606060606060606060606060606060606060605f534d453b31251a0e0200000000070f161b2022232d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2323201c1610080000000000000000000000000000000000000a141d28323c454f59616b70797979797979786e695f53463a2d2114070000000000000000000000000000000000000000000000000000000006131f2c3945515d677885919eabab9f928578685e5246392d20140600000815212e3b4854616e7b8797a1adafa295887c6f6255493c2f221609000000000000000000000000000000000000000000000000000000000000000000000000080e161e252a30363a3c4347484b4e50515253535252504e4c494645403937322b262017110a0200000000000000000000000009141f2a353e474d51535353535353534e4c4741382f241a0e030000000000000000000000000000000000030b131a202427282d2d2d2d2d2d2d292825211b140c0300000000000000000000000000000000000000000000000000020b12191f2326272d2d2d2d2d2d2d282724201a130b030000000000000000020e1a25303b454f59606d79839098a2aea49a92857a6e665b5051515151515151515151515151515151514f4d49423930261b100400000000000000000000000009141f29333b4246485353535353535353535353535353535353535353534846423b33291f14090000000007111921272c2f303939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939302f2c27211a11080000000000000000000000000000000006111b262f3a444d57606b707d868686868686857b6e6155483b2e2215080000000000000000000000000000000000000000000000000000000004101d2935404b55697683909ca9ada297877a6e6154473b2d22170b0107111e2a36414d5665717e8b98a9b3afa295887c6f6255493c2f22160900000000000000000000000000000000000000000000000000000000000000000000000000050c13191f252a2d32373b3c3f414345454646454543423f3c3a38342e2b27201b150b0600000000000000000000000000010d1925313c4750585e5f6060606060605a58524a41362b1f140800000000000000000000000000000000010b151d252b303435393939393939393534312c261e150c000000000000000000000000000000000000000000000000000b141d242b303334393939393939393534302b251d150b01000000000000000009141f29333e45515c676e7b86929fa5aca1978f82786c60594f4444444444444444444444444444444442413d3730271e140900000000000000000000000000030d17212931363a3b4646464646464646464646464646464646464646463b3a36312921170d03000000040f19232b32383b3d46464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646463d3c38332c231a10050000000000000000000000000000040d17222d38414c565f696f7d869299939a92867c6f695f53463a2d21140700000000000000000000000000000000000000000000000000000000000c18242f414d5a6774808d9aa7b3a9978a7d706453493f33271b100d1218252d3946525e6875828f9ca8b5afa295887c6f6255493c2f221609000000000000000000000000000000000000000000000000000000000000000000000000000002080d141a1e20262b2e2f323536383939393938373533302d2c28231d1b150f0a03000000000000000000000000000004101d2935414d58626a6c6c6c6c6c6c6c67645c52473c3024170b0000000000000000000000000000000009131d272f373c40414646464646464642413d3730271e0e050000000000000000000000000000000000000000000000030d1d262e363c3f414646464646464641403c372f271d13090000000000000000030d17212834404b555f69717e8a939da8a99f948c7f736b60564c4135373737373737373737373737373534312c261e150c020000000000000000000000000000050f171f252a2d2e3939393939393939393939393939393939393939392e2d2a251f170f05000000000b16212b353d44484953535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353534a48443d352c21160b00000000000000000000000000010c161f27333f49535d686e7b859298a29f93887e706a60574d42362a1e12050000000000000000000000000000000000000000000000000000000000071825313e4b5864717e8b97a8b2a79a8d8074655b5044372b221c191d242a36414c56616e7b86929facb9afa295887c6f6255493c2f2216090000000000000000000000000000000000000000000000000000000000000000000000000000000003090e12151b1f212225282a2b2c2c2c2c2b2a282623201f1c18120f0a040000000000000000000000000000000005121f2b3845515e6a7479797979797979746e64584c3f33261a0d000000000000000000000000000000030f1a252f3941484d4e535353535353534f4d4942393020170d02000000000000000000000000000000000000000000010b151f2e3840474c4d535353535353534e4d4841392f251a0f030000000000000000050f18232e39434d57616c74818e95a0aaa69f92877d6f685d52463f342a2b2b2b2b2b2b2b2b2b2b2b292825211b140c0300000000000000000000000000000000050d141a1e21212d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d21211e1a140d050000000004101b27323d474f5456606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606056554f473d33271c100400000000000000000000000008131e28313a44505b656d7a849197a29e948c80736c61584e453b31261a0e0200000000000000000000000000000000000000000000000000000000000815212e3b4854616e7b8796a0acab9e9184786c6053463e342c2924292f353e46525e6873808c99a3aebbafa295887c6f6255493c2f22160900000000000000000000000000000000000000000000000000000000000000000000000000000000000002050a0f121515181b1d1e1f20201f1f1d1b19161313100c07000000000000000000000000000000000000000613202c3946535f6c79868686868686868074675a4e4134271b0e0100000000000000000000000000000814202b37414b53595b606060606060605c59544b4232291f140900000000000000000000000000000000000000000007121d2731404a52585a606060606060605b59534b41372b20140800000000000000000007121d27303c45505a606d79839198a3aea39991847a6d615b51463c31281d1e1e1e1e1e1e1e1e1e1c1b191510090200000000000000000000000000000000000003090e1214152020202020202020202020202020202020202020201514120e090300000000000713202c38444f5960636c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6361594f44382c2014070000000000000000000000030d19242f3a434f59606c77828f96a0a1968f82776c605a50463d33291f14090000000000000000000000000000000000000000000000000000000000000714212d3a46535e697784919daaaca196897d70635a50463e38343035394045515b616e7a85929fabb2baafa295887c6f6255493c2f221609000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030608090c0e10121213131212100f0c090706040000000000000000000000000000000000000000000613202c3946535f6c798692939393938d8174675a4e4134271b0e0100000000000000000000000000000c1824303c48535d64686c6c6c6c6c6c6c68655d54443b3025190e0000000000000000000000000000000000000000000c18232f3943525c64676c6c6c6c6c6c6c68645d53483c3024180c000000000000000000000b151e2a333e45515d676f7c86929fa5aba1968f82756d62584e433a2f24180f111111111111110f0e0c0904000000000000000000000000000000000000000000000205070813131313131313131313131313131313131313131308070502000000000000000916222f3b4854606b707979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979706b6155483c2f23160900000000000000000000010b151f2935414c55606b737f8c949ea49991847a6d655b50483e342b21180d0300000000000000000000000000000000000000000000000000000000000005121e2a36424d576673808d99a6b0a89c9083766c6258504745404241464b515a626d75818e989ea0a8b2afa295887c6f6255493c2f22160900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929f9f9f9a8d8174675a4e4134271b0e0100000000000000000000000000000e1a2734404d59646f7479797979797979756f65564d42362a1c11060000000000000000000000000000000000000004101c2934404b55646e7479797979797979746f64594d4034271a0e00000000000000000000030c18212935404b555f6a727f8b939ea8a89e938b7f726a5f554b41352921180d0304040404040202000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1623303d495663707d86868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686867d7063564a3d3023170a0000000000000000000007121d27313945515d67707d87939fa69f93877d6f685e53493f362c22190f0600000000000000000000000000000000000000000000000000000000000000020e1a25313b4855626e7b88949eacab9f948b7e716a615a53514b4e4c52555d606c727f8b93969196a0acafa295887c6f6255493c2f221609000000000000000000000000000000010406070a0d10111213131211100d0a0706040000000003050506060606060600000000000000000000000000000000000407090a131313131313130a090704000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e0100000000000000000000000000000e1b2835414e5b687481868686868686868175695e5246382d22170b0000000000000000000000000000000000000006131f2c3845515c677480868686868686868174685b4e4135281b0e0000000000000000000000060f18242f39434e58626d75818e96a1aba69f92867c6f675d51453f332a1f150b0100000000000000000000000000000000000000000002050708121313131313130a090704000000000000000000000000000000000000000000000000000000000000000a1623303d495663707c89939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393897d7063564a3d3023170a000000000000000000000c18232f39434f59606d7a849199a4a0968d80736b60564c41382d231a10070000000000000000000000000000000000000000000000000000000000000000000914212e3a47535f6975828f9aa4afa69f92867d716c64605c555b565d61676d737e8792989184919eaaafa295887c6f6255493c2f2216090000000000000000000000000001080d111314171a1d1e1f1f201f1e1c1a171413100c07010c0f1112131313131313090907030000000000000000000000050b1014161720202020202020171614100b0500000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e0100000000000000000000000000000916232f3c4956626f7c89959393939392867b6e61544a3f33281c0f030000000000000000000000000000000000000714202d3a4753606d7985929393939395897c6f6356493c3023160900000000000000000000000007121d28313c46515b606d7a849199a3aea3999184796d605a50463c31271d12070000000000000000000000000000000000000003090e1214151f202020202020171614100b0500000000000000000000000000000000000000000000000000000000000a1623303d495663707c89969f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f96897d7063564a3d3023170a00000000000000000004101c2934404b55606b74818e96a1a59d9184796d60594f443a2f261b11080000000000000000000000000000000000000000000000000000000000000000000006121e2b37424d57626f7c87939fa7aea29892867e76706d67686869686d72798088929992867e8a97a4afa295887c6f6255493c2f221609000000000000000000000003090e13191d20212427292b2b2c2c2c2b292724201f1c18120e181c1e1f2020202020201615130f0a0400000000000000000810161c2023232d2d2d2d2d2d2d2323201c161008000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e0100000000000000000000000000000915222e3b4854606a7783909daa9fa3998c7f73665b5044382b1f1409000000000000000000000000000000000006121f2b37434e5864717e8a97a29f9f9d9083776b6054483b2f221509000000000000000000000000010c161f2a343f45525d686f7c87929fa6aba0968e81756c62584e43392f24180f060000000000000000000000000000000000060d141a1e21222c2d2d2d2d2d2c2423201c161008000000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3acacacb5afaca7a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a396897d7063564a3d3023170a0000000000000000020d17212c3845515c67707d89939da89e93897d6f675c51473d32281d140a0000000000000000000000000000000000000000000000000000000000000000000000020e1a26313c4754606a74818d95a0a9aaa298928a827d7977757575777a7f848d939a948c7f7c8895a2afa295897c6f6256493c2f23160900000000000000000000060e141a1e24292c2d3033363738393939383634302d2c29231d1a24282b2c2d2d2d2d2d2d23221f1b160f0700000000000008111a21272c2f3039393939393939302f2c27211a11080000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e01000000000000000000000000000007131f2c38434e5865727e8b98a2aeab9e9184786c6053463b30251a0e00000000000000000000000000000000000814212e3a47535f6a7683909ca9aea2988b7f7265594f43382c1f130700000000000000000000000000040d18222935414c56606a727f8c949fa9a89e938b7e716a5f554b40352921170c03000000000000000000000000000000060f181f262a2d2e38393939393939302f2c28211a11080000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a7b1bbb5aba39f9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a96897d7063564a3d3023170a000000000000000009141f2a36414c56606d7984919ea5a2988e81756b60554b40352b20160b0200000000000000000000000000000000000000000000000000000000000000000000000009151f2b37434e58606d79839197a0a8aaa29f948f8a868382818284878b91969f958f82787b8894a1aea295897c6f6256493c2f231609000000000000000000070f181f262a2f35393a3d404344454646454443403d3a38342f2a252f3437383939393939392f2e2c27211910070000000005101a232c33383c3d464646464646463d3c38332c231a100500000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e010000000000000000000000000000030f1b27323d4754606d7a85929facaca1968a7d7063574d42362a1c110600000000000000000000000000000004101c2934404b55626e7b88949fabac9f92867a6d6054473d32271b0f030000000000000000000000000000061019242f3a444e58606c77828f97a1aba59f92867c6e675d51453e33291e150b0000000000000000000000000000030d18212931363a3b454646464646463d3c38332c231a100700000000000000000000000000000000000000000000000000000a1623303d495663707c8995a0a9b3afa399928d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d897d7063564a3d3023170a00000000000000020e1a25303946525e68737f8c96a0a99f92867b6e61594f43392f23190e0400000000000000000000000000000000000000000000000000000000000000000000000000030f1b27323d45515d676e7b8591969fa4aca69f9c9892908f8e8f90939a9e9f9490837a6d7a8794aab4a396897c706356493d3023160a00000000000000030b1218212a31363a4145474a4d505152525352514f4d4a4745403936313a4044454646464646463c3b38322b22190f040000000b16212c353d44484a535353535353534a48443d352c21160b00000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e010000000000000000000000000000000a16202c3945515d6774818e9aa7b1a89b8f8275695e5246382e23170b00000000000000000000000000000006131f2c3845515c6774808d9aa6b0a79b8e8174685d5245392b21160a0000000000000000000000000000000008131e28323d44505b656d7a859199a4aea2989083796d605a50453b30271c12070000000000000000000000000009141f29333b424648525353535353534a48443e352c22190f06000000000000000000000000000000000000000000000000000714202d3a4753606d79839097a2acac9f928780808080808080808080808080808080808080808080808080808080808080808080808080807b6e6255483b2f2215080000000000000005121e2a36424d57616e7a86929fa8a1978c8073685e52473d31271d11070000000000000000000000000000000000000000000000000000000000000000000000000000000a15202935414b555f696e7b848e939a9fa3aaaaa39f9d9b9b9c9d9f9f99928d827a6d6d798698a29f9f96897d7063564a3d3023170a000000000000030c151c2328333b42464c5254575a5c5e5e5f5f5f5e5c5a5753514b46423b454c50525353535353534948433d342b21160a000004101c27333d474f55566060606060606056554f473d33271c1004000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e0100000000000000000000000000000004111d2935414b55626f7c88959fabac9f92877b6e61544a3f34281c100300000000000000000000000000000714202d3a4753606d7985929eabaca095897c6f63564c413529190f0400000000000000000000000000000000010c162027333f49535e68707d87939fa6aaa0958d81746c61574d42392e23180e050000000000000000000000020e1a26313b454d53555f60606060605f57554f473e342b21180d0400000000000000000000000000000000000000000000000006131f2c3945515d676e7b85929aa4afa3998e81747373737373737373737373737373737373737373737373737373737373737373737373736e695f53473a2e211408000000000000000714202d3a46525e6974818d98a2aa9e92857a6d60564d41352b1f150b00000000000000000000000000000000000000000000000000000000000000000000000000000000040d18242f3a434d575f696e7981878e92989a9c9e9f9f9f9e9d9a98928e8680786d6866798592939393938a7d7164574a3e3124170b0000000000000b151e272e343f454d53565d606366696a6b6c6c6c6b696763605c55534d444f575c5f60606060606056544e463d32271b0f03000714202c38444f5961636c6c6c6c6c6c6c6361594f44382c201407000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e01000000000000000000000000000000010d18242f3a47535f6a7683909da9afa3998c7f73665c5044382b1f14090a0a0a0a0a0a0a0a0a0a0a0a0a0a121f2b37434e5864717e8b97a2adaa9d9083776b6054443a2f241907000000000000000000000000000000000000040d17222d38414c56606b73808d949fa9a79d928a7e71695f544a40342820170b020000000000000000000005121e2a36424d575f616b6c6c6c6c6c6c6361594f463d332a1f160b02000000000000000000000000000000000000000000000004101d2935404b555f69707d88939fa6ab9d938b7e716a67676767676767676767676767676767676767676767676767676767676767676767625f574d42372b1e120600000000000004111d2935414c56616e7b86929faaa2988c7f73675d51443b3023190d03000000000000000000000000000000000000000000000000000000000000000000000000000000000007131d28313b454d575f676d747c81868a8d8f9192929291908d8a86817b736d665e6a77838686868686867e7165584b3e3225180b000000000007121c273039404451575f61686d7073767778797978777673706d67615e57505761686b6c6c6c6c6c6c6260584e43382c1f1307000916232f3c4855616b7079797979797979706b6155483c2f231609000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e010000000000000000000000000000000007131d2b37434e5864717e8b97a2adab9e9184786d6053463b31251a16161616161616161616161616161616212e3a47535f6a7683909ca9aea2988b7f7265594f4332281e13080000000000000000000000000000000000000006111b262f3a444f59606d78829097a2ada49f92857b6e665c51443e32291d140a000000000000000000000714212d3a46535f696e78797979797979706b61584e453b31281d140a0000000000000000000000000000000000000000000000000c18242f39434d57616b73808c949ea8a59f92867c6f685d545a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a55534d453c31261a0e020000000000000713202c3945525d6874808d99a3ab9f92857a6d60554c4132291f1107000000000000000000000000000000000000000000000000000000000000000000000000000000000000010c161f2a333b454d555d606a6f757a7d8183848586858583817e7a746e69605c54677177797979797979716c62564a3d3124170b00000000000c18232e39424a515b63696e747a7d808384858586858482807d79746e69605b536873787979797979796f6a6054483b2e221509000a1723303d4a5663707d868686868686867d7063564a3d3023170a000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e0100000000000000000000000000000000010f1b26323c4753606d7985929fabada1968a7d7063574d42362a23232323232323232323232323232323232934404b55626e7b88949fabac9f92867a6d6054473d3221160c0100000000000000000000000000000000000000000a141d29323d44505c666e7b85929ea4ada2979083786d60594f443b2f261c11060000000000000000000815222e3b4855616e7b858686868686867d706a60574d433a2f261b1106000000000000000000000000000000000000000000000007121d27313b454f59606c78828f96a0aaa39891847a6d665b504d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4847423c332a201509000000000000000714212d3a4754606d7a86929faba69a8d8074685d52433a2f20170d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040d18212a333b434b51585f62686d71747678787979787674716d67615f5750555f676a6c6c6c6c6c6c65625a50453a2e2115090000000004101c2834404a545c606d727b81868a8d8f9191929292918f8d8a85807b726c655c6b78858686868686867c6f6256493c2f231609000a1723303d4a5663707d899393939393897d7063564a3d3023170a000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e0100000000000000000000000000000000000a151f2c3845515d6774808d9aa6b0a89c8f8275695e5346382e3030303030303030303030303030303030303845515c6774808d9aa6b0a79b8e8174685d5245392c201304000000000000000000000000000000000000000000020b172028343f4a545e69707d8a929da7a99f958d80736b61564d42382d22170e0500000000000000000714212d3a46535f696f7c86929a939992867d6f695f554c41382d22170d0400000000000000000000000000000000000000000000010b151f2a333e44505b666d7a849198a2aaa1968f82786c60594f45404040404040404040404040404040404040404040404040404040403b3a37312a21180e0300000000000006131f2b37434e5865727f8c98a2ab9f94887b6e62564c4131281e0e05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060f182129313a40454e53565d606467696b6c6c6c6b6a6764605d55534d444d555b5e606060606060585650483f34291d1105000000030e18212c3844515c666d757f878d9298999c9d9e9f9f9f9e9c9a98928d867f776d666679869293939393887b6e6255483b2f221508000a1723303d4a5663707d89969f9f9f96897d7063564a3d3023170a000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e01000000000000000000000000000000000004101d2935404b55626e7b88949fabac9f93877b6e61544a3f3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4753606d7985929eabaca095897c6f63564c4135291d110400000000000000000000000000000000000000000000050e17232e38424d57616c74808d95a0aaa79f93887d70695e544a3f332820160b020000000000000005121e2a36424d57606a707e88939fa29892857b6e675d53493f33271f160c0100000000000000000000000000000000000000000000030d182128333f4a545d686f7c86929fa4a89f948c80736b61574d43392f343434343434343434343434343434343434343434343434342f2e2b2620180f06000000000000000815212e3b47535f6a7784919daaac9c8f83766a5f53443a301f160c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060f181f282f353c43474c5254575a5c5e5f5f5f5e5d5a5754514b46423b444a4f515353535353534b4a453f362d22180c010000000915202c38434f59606d78818c92999fa2aaa9a8aaa29f9e9e9e9fa29f98928c81786d6d798699a39f9f94877a6e6154473b2e211408000a1723303d4a5663707d8996a3aca396897d7063564a3d3023170a000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e010000000000000000000000000000000000000c18242f3947535f6a7683909ca9afa4998c8073665c504949494949494949494949494949494949494949494e5864717e8b97a2adaa9d9083776b6054443a2f24190d01000000000000000000000000000000000000000000000006111c26303b45505a606d79839098a2aea49a92857b6e665b50443d32281d140a00000000000000020e1a26313b454e58616c73808c949ea1979183796d655b50443d31281d13070000000000000000000000000000000000000000000000060f17222d38424c565f6a717e8b929da7a69f93887d70695f554b40352927272727272727272727272727272727272727272727272722211e1a150e0600000000000000000916222f3c4955626f7c8896a0aca49a8b7e7265574e4232281e0d04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060d161d242931373a4145474a4e505152535252504e4b4745413a3631393f43444646464646463e3d3a342d241b1106000000020e1a26313b4854606b74808d939fa3ababa49f9b979892919192939a989d9f938f82786d7a8794abb4a094877a6d6154473a2e211407000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e0100000000000000000000000000000000000007121d2b37434e5864717e8a97a1adab9e9184796d6056565656565656565656565656565656565656565656565f6a7683909ca9aea2988b7f7265594f4332281e1308000000000000000000000000000000000000000000040404000a141e29333e45515c676e7b86929fa5aca1978f82786c60594f443a2f261b11060000000000000009141f29333d46505a606c77828f96a1a0958f82776c60594f433a2f24180c03000000000000000000000000000000000000000000000006111c262f3a444e58616c74808d959fa9a49a92857b6e675d51453f342b20171a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1514120e0903000000000000000006131f2b37434e586673808d99a8ac9f93877b6e6154473c3121160c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040c131820262b3035393a3e4143454546464543413e3a39352f2a262e33363739393939393932312e29221b12090000000006121e2b37424e57636f7c87939fa5afa9a199938f8a878584848586888c90959e948d80747b8794a1ada093877a6d6054473a2d211407000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e01000000000000000000000000000000000000010f1a26313c4653606d7985929eacada1968a7d70646363636363636363636363636363636363636363636363636e7b88949fabac9f92867a6d6054473d3221160c0100000000000000000000000000000000000306080911111111110c17212834404b555f69717e8a939da8a99f948c7f736b60564c41382d22170d04000000000000030d18212b343e44505b656d7a849199a49e948c7f726b60554b4135291e150b0000000000000000000000000000000000000000000000000a141d28323c46505a606d78839097a1aba2979083796d605b51463d32291e140a0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d08080602000000000000000000000815222e3b4754606a7784919eaaa99c908376685e5246392d20140400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001070d151b1e24292c2d31343638393939383734312d2c29241d1a22272a2b2d2d2d2d2d2d2524211d18110900000000000814212e3a47535f6a76828f9aa4afaba1979287827d7a79787778797b7f838a9196928a7e7b8895a1ada093867a6d6053473a2d201407000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e010000000000000000000000000000000000000009151f2c3845515c6673808d9aa4afa99c8f82757070707070707070707070707070707070707070707070707074808d9aa6b0a79b8e8174685d5245392c20130400000000000000000000000000000000030a0f1215151e1e1e1e1e1e1e18232e39434d57616c74818e95a0aaa69f93877d70685e53493f33271f160c01000000000000060f192227333f49535e68707d87939fa69f92877d6f675d51453d30271d12070000000000000000000000000000000000000000000000020b16202a343e44515c666e7b859199a3a9a0958e81756d62584e443a30261c110600010101010101010101010101010101010100000000000000000000000000000916222f3c4955626f7c8896a0aca8988c7f7265564d41362a1e11050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040a0f13191d20212427292b2c2c2c2b2a272421201d18130e171b1d1e202020202020181715110c060000000000000815222f3b4855626e7b88949facaea39992857d75716e686b6b666d6e72767d84909492857d8996a3aca09386796d6053463a2d201307000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e010000000000000000000000000000000000000004101c2834404b54616e7b87939facac9f93877d7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7d85929fabaca095897c6f63564c4135291d1104000000000000000000000000000000060e151a1f21222b2b2b2b2b2b2b2b2b27303c45505a606d79839198a3aea49991847a6d655b50443d31281e130800000000000000071017222d38414c56606b74808d96a0a3999184796d60594f42392e23180c020000000000000000000000000000000000000000000000040e18222834404a545e69707d87929fa5a79e938b7f726a60564c42382e23170f0600000000000000000000000000000000000000000000000000000000000003101c28343f4a546673808c99a8ada196887b6e6155483b3025190e020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080d111314171b1d1e1f201f1f1d1b181413110d07010b0e10111313131313130b0b090501000000000000000d192633404c5966737f8c99a6b0ac9f92877c6f6b64615e56545c6062656c707a8290949083909daaaca09386796d6053463a2d201307000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e0100000000000000000000000000000000000000000c18232e3946535f6976828f9ca9afa499938a89898989898989898989898989898989898989898989898989899297a2adaa9d9084776b6054443a2f24190d01000000000000000000000000000006101820262b2e2f3737373737373737373737333e45515d676f7c86929fa5aba1968f82776c60584e433a2f24190d060000000000000006111b262f3a444f59606d7984919ea5a0968e81746b60544b4034281e1308000000000000000000000000000000000000000000000000061018232e39424d56606b727f8c939ea7a59f92877c6f685e544a3f342821180d04000000000000000000000000000000000000000000000000000000000006121f2b3844505c6676828f9ca9ab9e918478695f53463a2d1f140800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010407070b0e101212131312100e0b07060401000000020404060606060606000000000000000000000005111e2a36424d576976838f9ca9b1a79a8d80736a605954524c4a5053555a61676d798290959095a0abaca09386796d6053463a2d201307000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e01000000000000000000000000000000000000000007121d2a36424d5764707d8a96a1adaba49f9796969696969696969696969696969696969696969696969696969fa2a9aea2988b7f7265594f4332281e13080000000000000000000000000000030e18222a31373a3c44444444444444444444444444404b555f6a727f8b939ea8a99e948c7f726a60554c41352922180c01000000000000000a141d28323d45515d67707d89939ea89d93897d70665c51453a3025190d0200000000000000000000000000000000000000000000000007121c27303b444f59626d75818e95a0aaa39991847a6d665c50443e332a1f160c01000000000000000000000000000000000000000000000000000000000713202d3a4653606d7985929faba89b8e827568574d42362a1e0d02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714202d3a46525e697885929fabaca095877b6e61584f4746413f44464850555d676e7b85929da0a7b1aca09386796d6053463a2d201307000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e010000000000000000000000000000000000000000000e1a26313b4653606d7984919eabb5afaca3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3abadb3ac9f92867a6d6054473d3221160c0100000000000000000000000000000a15202a343c4347485151515151515151515151515151514e58626d75818f96a1aba69f92877c6f675d51453f34291d110500000000000000020b16202935404b55606b75818e98a2a59d9184796d60564c41362a1f1408000000000000000000000000000000000000000000000000000b151e29323d47515b606d79839098a2aba1968f82786d605a50453c31281d1307000000000000000000000000000000000000000000000000000000000916222f3c4955626f7c8898a2aeab988c7f7265594c3f31261a0e02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001040707131313131313130d0c0a0702000000000000000000000000000206080813131313131313131006060300000000000000000814212e3b4754616e7b8798a2aeaa9d908377695e53463d393634383a3e434c555e69717e8b97a1adb9aca09386796d6053463a2d201307000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e0100000000000000000000000000000000000000000009141f2c3844505c6673808c99a3afbbb9b1acaa9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9fa7a9afb8bab1a79b8e8174685d5245392c2013040000000000000000000000000000030f1a26313c464e53555e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5b606d7a849199a3aea39991847a6d605a50453a2e2115090000000000000000050e18242f39434f59616e7b86929fa9a0968c7f72685e52463b3025190e01000000000000000000000000000000000000000000000000030c17202b353f45515d676e7b86929aa4a89f948d80736c61574e433a2f241811070000000000000000000000000000000000000000000000000000000c1825323f4b5865727e8b98aaaea399897c6f6356493c302316090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001080d111314202020202020201a1916130d0700000000000000000000030a0f1214151f202020202020201c13120f0b06000000000000091623303c4956636f7c8996aab4a79a8e817467574d42342d2a282b2d313a434d57606d7985929eabb8aca09386796d6053463a2d201307000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a000613202c3946535f6c7986929faca79b8e8174685b4e4135281b0e0200000000000000000000000000000000000000000003101c28343f4a54616e7b87929facb9b1a7a0939393939393939393939393939393939393939393939b9ea5afb8aca095897c6f63564c4135291d1104000000000000000000000000000006121f2b37434e585f626a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a686f7c87929facaba0968e81756c62564a3d3124170b00000000000000000007121d27313d46525e6973808d97a2a89f92857a6d61564d41362a1e130800000000000000000000000000000000000000000000000000050e19232935404b555f69707e88939fa6a69d928a7e716a5f554b40352923190e0500000000000000000000000000000000000000000000000000020e1b2835414e5b6874818e9ba7ac9f9286796d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040c13191d202d2d2d2d2d2d2d2d2625231e19120a0100000000000000060e151a1f21222c2d2d2d2d2d2d2d29201f1c17110a02000000000a1724313d4a5764707d8a97a3b0a5988c7f7265594c3f31261e1c1f2028313b45515c6673808d99aab4aca09386796d6053463a2d201307000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a000613202c3946535f6c7986929faca89b8e8275685b4f4235281c0900000000000000000000000000000000000000000000000c17232e3846525e6975828f9ca8b2aca095898686868686868686868686868686868686868686868e939ea9b4aa9d9084776b6054443a2f24190d0100000000000000000000000000000815212e3a47535f6a6f777777777777777777777777777777777777777777777f8c99a5b2a89e938b7e7165584b3e3225180b000000000000000000010b151f2a36424d57606d7a85929eaaa2978d8074685e52463a2f24190d0100000000000000000000000000000000000000000000000000071118242f39434d57616c73808d949fa8a49f92867c6e675d51453f352b20170c0300000000000000000000000000000000000000000000000004101c2934404b55697683909ca9aa9e918477675c5145382c1f13060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040d161e24292c393939393939393933322f2a241c130a000000000000060f1820262b2e2f3939393939393939362d2b28221c140b020000000b1824313e4b5764717e8a97a4b0a4978a7d7164574a3e3124171012161f2834404b54626f7c8998a3aeaca09386796d6053463a2d201307000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a000613202c3946535f6c7986929faca89c8f8275695c4f4230251a0e020000000000000000000000000000000000000000000006111c2a36424d5763707d8a96a1acaa9d9083797979797979797979797979797979797979797979818e9ba7aea2988b7f7265594f4332281e13080000000000000000000000000000000915222f3c4855626f7c8484848484848484848484848484848484848484848484919daab7afa59f9285786c5f5245392c1f1206000000000000000000030d1a25303b45525d6873808c98a2a99f92867b6e61554c4135291d1104000000000000000000000000000000000000000000000000000007121d28313c45505a606c78828f96a1aaa2989183796d605b51473d33291e150b00000000000000000000000000000000000000000000000006131f2c3845515c677885919eaba99c8f827669554b4034291c100400000000000000000000000000000000000000000000000000000000000000000000000000000000000000010c1620282f35394646464646464646403f3b352e251c120700000000040d18222a31373a3b4646464646464646433938332d261d140a0000000b1825313e4b5864717e8b97a4b0a396897d7063564a3d3023170a060d18232e3a4653606d7986929facaca09386796d6053463a2d201307000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a000613202c3946535f6c7986929facaa9d9083776a574d42362a1e120500000000000000000000000000000000000000000000000e1a25303b4653606c7884919eabaca095897c6f6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6d7a86929facac9f92867a6d6054473d3221160c010000000000000000000000000000000916222f3c4955626f7c889191919191919191919191919191919191919191919196a0acb8b8ac9f9285796c5f5246392c1f13060000000000000000000009141f2935414c56616d7a86929faca3988d8073675d5145392c20150a0000000000000000000000000000000000000000000000000000010c161f2a333e44505b666d7a849198a3aaa0958e81756d62594f453b30271c120700000000000000000000000000000000000000000000000714202d3a4753606d7a86939faca79a8e8174675b4e412f23180c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008131e28323a414553535353535353534d4b4740372e24190d020000010c161f2a343c43474852535353535353534f46443f382f261c110600000b1825323e4b5865717e8b98a4afa296897c6f6356493c302316090007131f2c3845515c667683909da9aca09386796d6053463a2d201307000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a000613202c3946535f6c7986929facac9f928579695e52463a2d201406000000000000000000000000000000000000000000000009141f2b3844505b66727f8c99a3aea79a8d8174675c606060606060606060606060605765717e8b98a2aea79b8e8174685d5245392c201304000000000000000000000000000000000916222f3c4955626f7c88959d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9da0a8b2acacac9f9285796c5f5246392c1f130600000000000000000000020d19242f3a46525e6874808d9aa6aa9f92857a6d6054473c31261b0f030000000000000000000000000000000000000000000000000000040d182128333f4a545e686f7c86929fa5a79e938c7f726b60574d42392e23181006000000000000000000000000000000000000000000000815222f3b4855626e7b889aa4afa5998c7f7266594c3f3326190700000000000000000000000000000000000000000000000000000000000000000000000000000000000000010d19242f3a444c525f606060606060605957524940352a1e1307000007131d28313c464e53555f606060606060605c53504a42382d22170b00000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f2316090004101c2834404b546875828f9ba8aca09386796d6053463a2d201307000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a000613202c3946535f6c7986929facaea298877b6e6154483b2d22170b0607080808060200000000000000000000000000000000030f1c28333f4a54616e7a86929facab9f9285796d60535353535353535353535353535f697683909caaaca095897c6f63564c4135291d1104000000000000000000000000000000000916222f3c4955626f7c88959f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9285796c5f5246392c1f1306000000000000000000000008131e2935414c56626f7b88949faba2988b7f7265584e43372b1f1206000000000000000000000000000000000000000000000000000000060f17222d38424c56606a717e8b939da7a59f92877d70695e544a40342822180d040000000000000000000000000000000000000000000a1724303d4a5763707d8a96acb6a4978a7e7164574b3e3124180b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000004111d2935414c565d6c6c6c6c6c6c6c6c66635b52473b2f23160a00071018242f3a434e585f626c6c6c6c6c6c6c6c69605b544a3f33281c0f03000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000c18232e414e5b6874818e9ba7aca09386796d6053463a2d201307000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a000613202c3946535f6c7986929facb4aa978a7d7064544a3f33281c131313151514120f0a030000000000000000000000000000000b17222d3846525e6875828e9ba8ada2978a7e7164574d42464646464646463f4a54626e7b88949fabaa9d9084776b6054443a2f24190d01000000000000000000000000000000000916222f3c4955626f7c8893939393939393939393939393939393939393939393939393939393939285796c5f5246392c1f13060000000000000000000000010d1925303a47535f6a7683909cacaa9d9184776a5f53473a2e21150a0000000000000000000000000000000000000000000000000000000006111c262f3a444e58626c74818e959fa9a39992857b6e665c51443e342a20160b0200000000000000000000000000000000000000000b1825313e4b5864717e8b97a4afa296897c6f6356493c30231609000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202c3945525d687679797979797979736d63574b3f3225190c050e19222935404b555f6a6e7979797979797979766c665b5044382b1f1206000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f2316090000071a2734404d5a6773808d9aa6aca09386796d6053463a2d201307000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a000613202c3946535f6c7986929facb4a79a8e8174665b5044382d22201f202222211f1a150e06000000000000000000000000000006111c2a36414c5663707d8996a0aca99c8f8276695e5246382d393939393844505c6673808d99a6aea2988b7f7265594f4332281e130800000000000000000000000000000000000916222f3c4955626f7c8686868686868686868686868686868686868686868686868686868686868686796c5f5246392c1f130600000000000000000000000008131e2b37434e5865727f8b9aa4aca095887b6f6255483c32261b0f03000000000000000000000000000000000000000000000000000000000a141d28323c46505a606d79839097a1aba1979083786d605a50463c32281d140a00000000000000000000000000000000000000000c1825323f4b5865727e8b98a5afa295887c6f6255493c2f221609000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a86868686868686807366594d4033261a0d0b16202b343d45515d676e7c868686868686868682796c605346392d201306000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a000613202c3946535f6c7986929facb8ab9e9185786c60544a3f332d2c2c2d2f2f2e2b2620180f0600000000000000000000000000000d1925303b4854606b7784919daaac9f93877b6e6153493f33272d2d2d3a4653606d7984919eabac9f92867a6d6054473d3221160c0100000000000000000000000000000000000815222e3b4754606a76797979797979797979797979797979797979797979797979797979797979797974695d5144382b1f1205000000000000000000000000020f1a26313c4754616e7b87939faca7998c807366584e43372b1f130600000000000000000000000000000000000000000000000000000000020b16202b343f45515c676e7b859299a3a99f958d80746c61584e443a2f261b1106000000000000000000000000000000000000000c1926323f4c5965727f8c98a5aea195887b6e6255483b2f221508000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8793939393938c807366594d4033261a0a141d28323d46515b606d798391989393939991847a6d665b5044382b1f1206000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a000613202c3946535f6c7986929facb4aba1978a7e71665b50443f3a39383a3b3b3a37312a22180e030000000000000000000000000008141e2c38444f5965727f8c98a3aea4998c7f73655b5044372b1f2a36414c5663707d8a97a1ada79b8e8174685d5245392c20130400000000000000000000000000000000000006131f2b37434e5860626c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6962584d4135291c1003000000000000000000000000000a15202d3a46525e697683909da9aa9e9184776a5f54473b2e2215060000000000000000000000000000000000000000000000000000000000040e19222834404b555e69707d87929fa5a79d928a7e716a5f564c41382d22170f050000000000000000000000000000000000000d192633404c5966737f8c99a6aea194877b6e6154483b2e211508000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a87939f9f9f998c807366594d4033261a111c262f3a444e58626d75818e95a0aaa59f92877c6f685e544a3f33281c0f03000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a000613202c3946535f6c7986929facaea399929183786c6059504947454546484847433c342a20150a0000000000000000000000000002101c27333d4754616d7a86929facab9e9184786c6053463a2f242d3946525e6875828f9ba9aca095897c6f63564c4135291d1104000000000000000000000000000000000000030f1b27323c464e5455606060606060606060606060606060606060606060606060606060606060605f5d5850463b3025190d000000000000000000000000000005111e2a36424d5765727f8c98a9aca096887c6f6255493c2d22170b000000000000000000000000000000000000000000000000000000000000071018232e39434d57606b727f8c939ea8a49f92867c6f685d53493f332721170c0300000000000000000000000000000000000d1a2734404d5a6773808d9aa6ada094877a6d6154473a2e211407000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0aca6998c807366594d4033261a17222d38424c56606a727f8b939ea8a79e938b7f726a60564c42382d22170b00000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a000613202c3946535f6c7986929facac9f9286928c7f736b605b53535151535555534e463c31261a0f02000000000000000000000000000b16202d3946525d6875818e9ba7aca096897c7063554b4135292e3a4754616d7a86929facaa9d9084776b6054443a3024190d01000000000000000000000000000000000000000a15202b343c4347495353535353535353535353535353535353535353535353535353535353535352514d463e342a1f14080000000000000000000000000000020e1a25303b4855616e7b8896a1ada8998c7f7366544a3f33281c0f0300000000000000000000000000000000000000000000000000000000000007121d27303b454f59636d75818f95a0aaa29891847a6d655b50443d33291e150b00000000000000000000000000000000000e1a2734414d5a6774808d9aa7ada093867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0ada6998c807366594d403326172128333f4a545e686f7c87929fa5aaa0958e81756d62584e443a2f261c110600000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a0005121f2b3744505b657986939faca79a8d818d93877d726c6562605d5c6062625f584e43372b1f12060000000000000000000000000005111d2935414c56636f7c8995a0aca89b8e8174675d5145392c37434e5865727f8b99a3aea2988b7f7265594f4332281e13080000000000000000000000000000000000000000040f19222b32373b3c464646464646464646464646464646464646464646464646464646464646464644413b342c22180d020000000000000000000000000000000914212d3a46535f697884919eaba99c8f8276665b5044382b1f1206000000000000000000000000000000000000000000000000000000000000000b151e29333d47515b606d79839198a2aaa0968f82776c60594f453b30271d1207000000000000000000000000000000000e1a2734414d5a6774808d9aa7ada093867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0ada6998c807366594d4033261e29333b44505b666d7a849199a3aea2989083796d605b51463d32281d140a0000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a000613202d394653606c78869aa4afa396897d869292877f78726e6d67676d6e6e6a5f53473a2e21140800000000000000000000000000010d1924303a4854606b7783909daaac9f92857a6d6054473c313b4754606a7783909dabac9f92867a6d6054473d3221160c0200000000000000000000000000000000000000000007101920272b2e2f39393939393939393939393939393939393939393939393939393939393939393835302a221a10060000000000000000000000000000000005121e2a36424d576875828f9ba8ab9f9285796c605346392d20130600000000000000000000000000000000000000000000000000000000000000030c17212b353f45515d676e7c86929fa4a89e948c7f736b60574d43392e231810070000000000000000000000000000000d1a2734404d5a6773808d9aa6ada094877a6d6154473a2e211407000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0ada6998c807366594d40332627303b454f59606c78828f96a1aba49f92857b6e675d51493f342b20160b020000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a000713202d3a4653606d798693a0b6a295887c818e99928c837f7b7a7979797b7c6e6255483b2f221508000000000000000000000000000008131e2c38434f5965727f8b98a2aea2988b7e7165574d4237404b55626f7c8895a0aca79b8e8174685d5245392c2013040000000000000000000000000000000000000000000000070f151b1f22222d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2c2b29251f1810080000000000000000000000000000000000020e1a26313f4c5965727f8c98abaea298887c6f6255483c2f2215090000000000000000000000000000000000000000000000000000000000000000050f19232935414b555f6a717e8a929da6a69f93877d70695e554b40342822190e0400000000000000000000000000000d192633404c5966737f8c99a6aea194877b6e6154483b2e211508000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0ada6998c807366594d4033232e39424d57616b73808c949fa8a69d928a7e71695f554b40372d22190e05000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a000714202d3a4753606d7a8693a0ada194887b7c88949f95918c8886858586888073675a4d4034271a0d0000000000000000000000000000020f1b27323d4754606d7a86929facaa9c908376695f53473845515c6774808d9aa7aca095897c6f63564c4135291d1104000000000000000000000000000000000000000000000000040a0f131516202020202020202020202020202020202020202020202020202020202020201f1f1c19140d0600000000000000000000000000000000000000091623303c4956636f7c8999a3aeaa988b7e7265584b3f32251807000000000000000000000000000000000000000000000000000000000000000000071118242f3a434e58616c73808d949fa8a49992857b6e675c51453f342b20160b02000000000000000000000000000c1926323f4c5965727f8c98a5aea195887b6e6255483b2f221508000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0ada6998c807366594d40332834404b545e69707d88939fa6a99f948d80736c61574d43392f251b100700000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a000714212d3a4754606d7a8793a0ada194877a76828f99a09d9895989292988d8073675a4d4034271a0d0000000000000000000000000000000a16202c3945515d6774818e9aa7ab9f94887b6e62544a3f4653606d7985929fabaa9d9084776b6054443a3024190d01000000000000000000000000000000000000000000000000000003060809131313131313131313131313131313131313131313131313131313131313131312100d080200000000000000000000000000000000000000000714202d3a4753606d7986929faca79b8e8174685b4e412e23180c0000000000000000000000000000000000000000000000000000000000000000000007131d28313c46505a606d78828f96a1aba1979083796d605a50463c32281d140a000000000000000000000000000c1825323f4b5865727e8b98a5afa295887c6f6255493c2f221609000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0ada6998c807366594d4033343c45515c666e7b85929aa4aba1979082786d605a50453c31271d13090000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a000814212e3b4754616e7a8794a1aca093877a6f7c87929fa5a5aaa29f9f9a8d8073675a4d4034271a0d00000000000000000000000000000004111d2935414c55626f7c88959faba6998d8073665c50444d5764717e8a97a2ada2988b7f7265594f4332281e13080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006131f2c3845515c677784919eaaa99c90837669554b4034281c1004000000000000000000000000000000000000000000000000000000000000000000010c161f2a333e44505c666d7a849199a3a99f958e81746c62584e443a2f261c11060000000000000000000000000b1825313e4b5864717e8b97a4afa296897c6f6356493c30231609000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0ada6998c807366594d40313c46505a606d78839097a2aca39991857a6e665c50483e332a1f150b000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a000815222e3b4855616e7b88949f9fa39986796d73808c939fa2aaaaaba69a8d8073675a4d4034271a0d000000000000000000000000000000010d19242f3a47545f6a7783909da9ab9e9184796d605346525e6976828f9ca9ac9f92867a6d6054473d3221160c0200000000000000000000000000000000000000000000000000000000000000000000010507080b0e10111213131211100e0b080705010000000000000000000000000000000000000000000000000000000000000000000004101c2934404b556976828f9ca9ab9e918478675c5145382c1f130600000000000000000000000000000000000000000000000000000000000000000000040d182128343f4a545e686f7c87929fa5a79d938b7e716a60564c42382d22170f0600000000000000000000000a1724303d4a5763707d8a96acb6a4978a7e7164574b3e3124180b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0ada6998c807366594d403a434e58616c74808d959fa9a59f92877d6f685e544a3f362c21180d03000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a000915222f3c4855626f7b8893939393928679666c77818c92989b9e9f9f9a8d8073675a4d4034271a0d0000000000000000000000000000000008131e2b37434e5865717e8b97a2ada1968a7d7063564c54616e7b87939faca79b8e8174685d5245392c20130400000000000000000000000000000000000000000000000000000000000000000003080d111414171a1c1e1f20201f1e1d1a171414110d08030000000000000000000000000000000000000000000000000000000000000000000c18232f414e5b6774818e9aa7ac9f9386796d6053463a2d2013070000000000000000000000000000000000000000000000000000000000000000000000060f17232e38424c56606a727f8b939da7a59f92867c6f685e544a3f332821180d03000000000000000000000815222f3b4855626e7b889aa4afa5998c7f7266594c3f33261907000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0ada6998c807366594d40414b555f6a717e8a929da7a89e938c7f726b60564c42382e241a0f0600000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a000916222f3c4955626f7c86868686868685786c656c777f868b8e919292928d8073675a4d4034271a0d00000000000000000000000000000000010f1b26323c4753606d7985929faba99b8e8275685d525966737f8c99a4aca095897c6f63564c4135291d110400000000000000000000000000000000000000000000000000000000000000060b1014191e20212427292b2c2c2c2c2b2a272421201e19140f0b0600000000000000000000000000000000000000000000000000000000000000071926333f4c5966727f8c99a5afa49a887b6e6255483b2f22150800000000000000000000000000000000000000000000000101010101010101010101010006111c26303a444e58626d74818e95a0a9a39891847a6d665b50443e332a1f150b010000000000000000000714202d3a4753606d7a86939faca79a8e8174675b4e412f24180c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0ada6998c807366594d3f45515d676f7c86929fa4aaa0968f81756d62594f443b30261c12080000000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a000815222e3b4754606a767979797979797873695b656c727a7f8284858685837e7164574b3e3124180b00000000000000000000000000000000000a151f2c3945515d6774808d9aa6ac9f92867a6d6154606b7784919eabaa9d9084776b6054443a3024190d010000000000000000000000000000000000000000000000000000000000020a11171c1f252a2d2e3134363839393938373634312e2d2a251f1b17110a0200000000000000000000000000000000000000000000000000000000000b1824313e4b5764717e8a97a4b6ac96897d7063564a3d3023170a00000000000000000000000000000000000000010507070d0d0d0d0d0d0d0d0d0d0d0d0d0d0a141e29323d46515b606d79839097a1aaa1968f82786c60594f453c31271d120700000000000000000006131f2c3845515d677885919eaba99c8f827669554b4035291d10040000000000000000000000000000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0ada6998c807366595049515b606d79849198a2aea29891847a6d605b51473d32291e150a000000000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a0006131f2b37434e5860626c6c6c6c6c6c6c6961535b60686d72757778797876716c6155493d3023170a000000000000000000000000000000000004101d2935404b55626f7b88949faba3998b7e726557636f7c8996a0aca3988b7f7265594f4332281e13080000000000000000000000000000000000000000000000000000000001070c141c23282b3036393b3e414344454646454443413e3b3936302b27221b140b0700000000000000000000000000000000000000000000000000000000091623303c4956636f7c8996a2afa4978b7e7164584b3e3125180b000000000000000000000000000000000002080d1113141a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a17202b343f45515c676e7b859299a4a89f948d80736c61574d43392f24181007000000000000000004101d2935404b55697683909ca9aa9e918477675d5145382c1f13060000000000000000000000000000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0ada6998c80736b605b5358626d75818e96a0aaa49f92867c6f675d51493f352b20170c03000000000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a00030f1b27323c464e54556060606060605f5d574950565d6065686b6c6c6b6a64615a5045392d2114080000000000000000000000000000000000000c18242f3947535f6a7683909ca9ab9d908376695f6774818e9aa8ac9f92867a6d6054473d3221160c02000000000000000000000000000000000000000000000000000000030b12181e262e34383b4146474a4d4f515253535251504d4a4746413b37332d261d18120b0300000000000000000000000000000000000000000000000000000916222f3c4955626f7c8895a2afa5988b7e7265584b3f3225180c00000000000000000000000000000000050c13191d2021272727272727272727272727272727272727272934404b555e69707d87939fa6a69f93887d70695f554b40352922190e0500000000000000000c18242f414e5b6874818e9ba7ac9f92867a6d6053473a2d2014070000000000000000000000000000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0adab9e91847d726c655d606a727f8b939ea8a79d928a7e716a5f554c41372d23190e0500000000000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a00000a15202b343c43474953535353535352514c3f444c5254585b5e5f5f5f5d575550483e33281d110500000000000000000000000000000000000007121d2b37434e5864717e8a97a1ab9f95887b6e616d7985929faba79b8e8174685d5245392c201304000000000000000000000000000000000000000000000000000000050d151d242930383f44464c5254575a5c5e5f5f5f5f5e5d5a5754524c46443f382f28231c150c03000000000000000000000000000000000000000000000000000815222f3b4855626e7b8895a1aea5988c7f7265594c3f3226190c000000000000000000000000000000050e171e252a2d2e34343434343434343434343434343434343434342f39434d57606b737f8c939ea8a49a92857b6e675d51453f342b20170c0300000000000000071925323f4c5865727f8b98aaafa399897c6f6356493c302316090000000000000000000000000000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0adada19691877f776d68686f7c87929fa5a99f958d80746c61584e433a2f251b11070000000000000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a0000040f19222b32373b3c464646464646454441333a4145474b4f51525352504b49453e362c22170c00000000000000000000000000000000000000010f1a26313c4653606d7985929eaca7998c7f7366717d8a98a2aca095897c6f63564c4135291d11040000000000000000000000000000000000000000000000000000050e161f272f353e424a5053565e616467696b6c6c6c6b6a696764615e56535049413d342e271e150c030000000000000000000000000000000000000000000000000815212e3b4854616e7b8794a1aea6998c7f7366594c403326190d0000000000000000000000000000020c1720293036393a4040404040404040404040404040404040404040404040454f59606c77828f96a0aaa2979083796d605b51463d32291e150a000000000000000916222f3c4955626f7c8898a2aeab988c7f7265594c3f31261a0e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0adb2a9a199928c827a6f6d7a849199a3aba1979083786d605a50463c31281e130a000000000000000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a00000007101920272b2e2f393939393939393835272f35393a3f4244454645433e3d39332c241a100600000000000000000000000000000000000000000a151f2c3845515c6773808d9aa4aa9d9184776a75828e9baaaa9d9084776b6054443a3024190d0100000000000000000000000000000000000000000000000000040d162028313940454f545c6064686e7174767778797978777674716e6863605b534e44403930271e150c0300000000000000000000000000000000000000000000000714212e3a4754616d7a8794a0ada6998d8073665a4d4033271a0d000000000000000000000000000008131e29323a4146474d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d505b656d7a849198a2a9a0958e81756d62594f443b30261c11060000000000000713202d3a4653606d7985929faca89b8f827568574d42362a1e120500000000000000000000000000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0adbbb2aba39f948f847c78828f96a1aba49992857b6e665c51483e342a1f160c01000000000000000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a00000000070f151b1f22222d2d2d2d2d2d2c2b281e24292c2d3235383939383731302d28221a120800000000000000000000000000000000000000000004101c2834404b55616e7b87939faca095887b6f7985929faca3988b7f7265594f4332281e130800000000000000000000000000000000000000000000000000010c161f28323a434b515961666d71767a7e808284858686858483807d7a76706c656058514a423930271e150a00000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0ada79a8d8074675a4d4134271a0e00000000000000000000000000010d1925303a444c52545a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a535d686f7c86929fa4a79e938b7f726b60564c42382e23170c00000000000006121f2b3844505c6676838f9ca9ab9e918578695f53463a2d21140900000000000000000000000000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0adb8b0aaa9a69e969186828f949fa8a69f93877d70695e544b40362c22180d0400000000000000000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a0000000000040a0f1315162020202020201f1e1c13191d202125282b2c2c2c2a2423211d17100800000000000000000000000000000000000000000000000c18232e3946535f6976828f9ca9a7998c7f737d8a98a2ac9f92867a6d6054473d3221160c020000000000000000000000000000000000000000000000000008131e28313a444c555d606b70787e82868a8d8f919292929291908d8a87827d786f6a605c544a423930261c1106000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0ada79a8d8074675a4d4134271a0e0000000000000000000000000005111d2a36414c565e6167676767676767676767676767676767676767676767676767676767676a717e8a929daba59f92877d6f685e544a3f34281c1003000000000003101c28343f4a546673808c99a8ada197887b6e6155483b30251a0e02000000000000000000000000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0adb0a69e9c9fa2a199928f949ea6a89e948c7f736b60574d42392e241b10060000000000000000000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000a1723303d4a5663707d8996a3aca396897d7063564a3d3023170a0000000000000003060809131313131313121210080d111314181c1e1f201f1d181714110c0600000000000000000000000000000000000000000000000007121d2b37424d5764717d8a97a1aa9d908377818e9baaa79b8e8174685d5245392c20130400000000000000000000000000000000000000000000000000050e19242f3a434c565e676d747d848a8f93999a9c9e9f9f9f9e9d9c9a9a938f8a837c736d665c544a42382e23170b020000000000000000000000000000000000000000000714212e3a4754616d7a8794a0ada6998d8073665a4d4033271a0d000000000000000000000000000713202d3946525e686d7373737373737373737373737373737373737373737373737373737373737374808d99a3aea39991847a6e665c5044382c1f12060000000000000b17232e3c4956626f7c8996a0aca9988c7f7265574d42362a1e1205000000000000000000000000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0adaa9e948f9298a2a39f9c9ea6aaa1968f82776c60594f453b30271d1209000000000000000000000000000000000b1825323e4b5865717e8b98a4aca295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000a1723303d4a5663707d89969f9f9f96897d7063564a3d3023170a000000000000000000000006060606060606050300010406070c0f11121312100b0a08050000000000000000000000000000000000000000000000000000000e1a26313c4653606d7984919eaba095887b85929faba095897c6f63564c4135291d1104000000000000000000000000000000000000000000000000020d17202935414c555e686d79818a91969c9fa4aba5aba49f9fa4aca5aca49f9c95908780786d665c544a3f34281d140a0000000000000000000000000000000000000000000815212e3b4854616e7b8794a1aea6998c7f7366594c403326190d000000000000000000000000000714212e3a4754616d7a80808080808080808080808080808080808080808080808080808080808080808086929facaba1969082786d6053463a2d2013070000000000000615222e3b4754606a7784919eaaa99d908376695e52463a2d20150a000000000000000000000000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0ada99c8f82869298a3aba9aaaea39891847a6d655b50473d33291e150b00000000000000000000000000000000000b1825323e4b5865717e8b989f9f9f95897c6f6256493c2f23160900000d1a2733404d5a6673808d999f9f9f9386796d6053463a2d201307000a1723303d4a5663707d899393939393897d7063564a3d3023170a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009141f2c3844505c6673808c99a4a79c8f828f97a2aa9d9084776b6054443a3024190d0100000000000000000000000000000000000000000000000008131e29323a45515d676d7a838e939ea0a8a7a09d99959993939a96999ea0a8a7a099928c81786d665c50443d2f261c110600000000000000000000000000000000000000000815222f3b4855626e7b8895a1aea5988c7f7265594c3f3226190c000000000000000000000000000815222f3b4855626e7b888d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d9299a3aeb2a99f94897d7063564a3d3023170a00000000000006131f2b37434e586673808d99a8ac9f93877b6e6154483c31261b0f020000000000000000000000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0ada6998c807d869299a3abb5ac9f92867c6f685d53493f352b21170c0300000000000000000000000000000000000b1825323e4b5865717e8b9393939393897c6f6256493c2f23160900000d1a2733404d5a6673808d939393939386796d6053463a2d201307000a1723303d4a5663707d868686868686867d7063564a3d3023170a00000000000000010406070f111213131312110e0b07060400000000000000000000000000000000000000000000000000000000000000000000000000000003101c28343f4a54616e7b87939fac9e948f949ea9a3988b7f7265594f4332281e1308000000000000000000000000000000000000000000000000010d1925303a44515b606d798390959ea5a9a19e95908c8987868687898c91969ea1a9a39f938f81786d60584e42382d22170b00000000000000000000000000000000000000000916222f3c4955626f7c8895a2afa5988b7e7265584b3f3225180c000000000000000000000000000815222f3b4855626e7b88959a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9fa3abb5bbb0a6968a7d7063574a3d3024170a000000000000030f1b27323d4955626f7c8896a0aca49a8b7f7265584e43372b1e13080000000000000000000000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0ada6998c80737d879299a4aca6998c80736a60584e453c332a21170f0500000000000000000000000000000000000b1825323e4b5865717e868686868686867c6f6256493c2f23160900000d1a2733404d5a66738086868686868686786d6053463a2d201307000916232f3c4855616b7079797979797979706b6155483c2f231609000000000001080d1113141c1e1f1f20201f1e1b181413100c0701000000000000000000000000000000000000000000000000000000000000000000000000000c17232e3846535e6975828f9ca8a69e9c9ea6ac9f92867a6d6054473d3221160c0200000000000000000000000000000000000000000000000005111e2a36414c56626d75828f959fa7a8a097928a837f7c7a79797a7c7f848a9297a0a8a59e938d80736a60544a3f33281c0f0300000000000000000000000000000000000000091623303c4956636f7c8996a2afa4978b7e7164584b3e3125180b000000000000000000000000000815222f3b4855626e7b8895a1a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a7acaeb5acacaca3968a7d7063574a3d3024170a000000000000000a15212e3b47535f6a7784919daaac9c9083766a5f53473a3025190d0100000000000000000000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0ada6998c8073717e87939aa4ab9e92857c6f6a5f574d453b332921170e05000000000000000000000000000000000b1724313d4a56626c71797979797979796f6a6054473b2e22150800000c1926323f4b58636e737979797979797976665c5044382c1f1206000714202c38444f5961636c6c6c6c6c6c6c6361594f44382c20140700000000040c13191d2021292a2c2c2d2c2c2a2824201f1c18120b0300000000000000000000000000000000000000000000000000000000000000000000000006111c2a36424d5763707d8a96a1acaaa8aab0a79b8e8174685d5245392c201304000000000000000000000000000000000000000000000000000713202d3946525e68727f8b949ea7a9a09591857e77726f6d686c6d6f72787e859196a0a9a59f93877c6f665b5044382b1f1308000000000000000000000000000000000000000b1824313e4b5764717e8a97a4b6ac96897d7063564a3d3023170a000000000000000000000000000815222f3b4855626e7b88959f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f968a7d7063574a3d3024170a0000000000000006131f2b37434e5865727f8c98a2ab9f94887c6f62564c4135291e130800000000000000000000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0ada6998c80736c717e88939fa3a19792857c6e695f574d453b332920170e050000000000000000000000000000000915212e3a45505a62656c6c6c6c6c6c6c6260584e43382b1f130600000a17232f3b47525c63666c6c6c6c6c6c6c6c5c544a3f34281c10030004101c27333d474f55566060606060606056554f473d33271c1004000000040d161e24292c2d363738393939383735312d2c29231d150d060000000000000000000000000000000000000000000000000000000000000000000000000e1a25313b4653606c7884919e9f9f9f9f9fa095897c6f63564c4135291d110400000000000000000000000000000000000000000000000005111d2935414c56616d7a85929fa6ada19791837b716c6662605d606163656c717b849197a1ada4999184786c6053463a3025190d010000000000000000000000000000000000000c1926333f4c5966727f8c99a5afa49a887b6e6255483b2f221508000000000000000000000000000815222f3b4855626e7b88939393939393939393939393939393939393939393939393939393939393939393939393939393938a7d7063574a3d3024170a00000000000000030f1b26323c4754606d7a86929faaa69a8d8174685e52463a2f24190d02000000000000000000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0ada6998c8073666c727f8b919ca4a19791857b6e695f574d453b322920170e05000000000000000000000000000005111d29343f485056586060606060606056544e463d32271b0f03000007131f2a36404a52585a606060606060605f504a42382e23170c0000000b16212c353d44484a535353535353534a48443d352c21160b000000010c161f282f35393a4244454646464544413e3a38342f271f17110a020000000000000000000000000000000000000000000000000000000000000000000009141f2b3844505b66737f8c999393939393939084776b6054443a3024190d010000000000000000000000000000000000000000000000000713202d3946525e6874808d98a2aea69e92857b6e69615a5654525354535b60696e7b85929ea8aba0958a7d7063564c41362a1d11050000000000000000000000000000000000010e1b2834414e5b6774818e9aa7ac9f9386796d6053463a2d201307000000000000000000000000000815222f3b4855626e7b8686868686868686868686868686868686868686868686868686868686868686868686868686868686867d7063574a3d3024170a00000000000000000a15202c3945525d6874808d98a3ac9f92867a6d61564c4135291f1409000000000000000000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0ada6998c807366626d727f8c929ca4a19791847b6e695e574d443b322920160e0400000000000000000000000000010c18222d363f454a4b535353535353534947433d342b20160a000000020e19242e3840474b4d5353535353535353443f3830261c110600000005101a232c33383c3d464646464646463d3c38332c231a100500000008131e28313a4145474f515252535352514e4b474540393127221b140b02000000000000000000000000000000000000000000000000000000000000000000030f1c28333f4a54616e7a8786868686868686867f7265594f4332281e1308000000000000000000000000000000000000000000000000000714212e3a4754616d7a86929faaab9f948a7d70695e575049474546474950565e69717e8b96a0aca79c8f8275685e5246392d201307000000000000000000000000000000000004101d2935404b556976838f9ca9ab9e918478675c5145382c1f1306000000000000000000000000000814212e3a47535f6a76797979797979797979797979797979797979797979797979797979797979797979797979797979797979706b6155483c2f231609000000000000000004111d2935414c56616e7b86929faaa2988c8073685d52453b30251a0d030000000000000000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0ada6998c8073665b636d73808d929da5a19691847b6e695e564d443a322820160d040000000000000000000000000006111b242d343a3d3e464646464646463c3b38322b22190f040000000008121c262e363b3f40464646464646464638342e261e150a0000000008131e28313a414547494949494949494745413a31281e13080000010d19242f3a434c52545c5d5f5f605f5f5d5b5753514b433f332d261d140a000000000000000000000000000000000000000000000000000000000000000000000b17222d3846525e686e797979797979797979726d6256473d3220160c0200000000000000000000000000000000000000000000000005121e2a36424d5765727f8c98a2aea99c8f82766c61574d453e3a39393a3f444d57616c7784919eaaa99f93867a6d6154473a2e211407000000000000000000000000000000000006131f2c3845515d677784919eaaa99c90837669554b4034281c10040000000000000000000000000006121e2b37424e575f6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6361594f44382c2014070000000000000000010d19242f3a46525e6974808d98a2aa9f92857a6d60574d42362a1f150b0100000000000000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0ada6998c807366595b636e74808d939da5a19691847b6e685e564c443a32281f160d040000000000000000000000000009121b22292e3132393939393939392f2e2b27201910070000000000000a141c242a2f323339393939393939392c28231c150c03000000010d19242f3a434c52545656565656565654524c433a2f24190d010004111d2935414c565d60696a6b6c6c6c6b6a6864605c5550443f382f261b110600000000000000000000000000000000000000000000000000000000000000000006111c2a36414c565e616c6c6c6c6c6c6c6c6c65625b5146342b210e04000000000000000000000000000000000000000000000000000714202d3a46525e697783909daaada197897d7063594f453b332d2c2d2d333b45505a66737f8c999d9c9c998a7d7063574a3d3024170a00000000000000000000000000000000000714202d3a4753606d7a86929faca79b8e8174685b4e412e23180c0000000000000000000000000000020e1a26313c454e535560606060606060606060606060606060606060606060606060606060606060606060606060606060606057554f473e33281c100400000000000000000008131e2a36424d57616d7a85929fa8a2978d8073695e52463d31271d120700000000000000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0ada6998c80736659525c606c77818e939ea6a09691847a6e685e564c443a31281f160d04000000000000000000000000000911181d2124252d2d2d2d2d2d2d23221f1b160f0700000000000000020a12191f2326272d2d2d2d2d2d2d2d1f1c17110a030000000004111d2935414c565d6062626262626262605d564c4135291d1104000613202c3945525d686d757778797979787774716d67625a504941382d22170b030000000000000000000000000000000000000000000000000000000000000000000e1925303b444c52545f6060606060606060585651493f3422190f00000000000000000000000000000000000000000000000000000815212e3b4854616e7b87959fabab9e9184786c6053463e33292120202227333e4956626f7c899191908f8e8d8073665a4d4033271a0d0000000000000000000000000000000000091623303c4956636f7c8999a3afaa988b7e7265584b3f322518070000000000000000000000000000000915202a333c4247485353535353535353535353535353535353535353535353535353535353535353535353535353535353534a48443e352c21160b00000000000000000000010e1a25303b46525e68727f8c96a0a99f92867b6e61594f43392f24180e04000000000000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0ada6998c807366594d505b656c78818e949ea6a09691837a6d685e564c433a31281f160d0300000000000000000000000000060c11151718202020202020201615130f0a0400000000000000000000080e1317191a202020202020202012100c060000000000000613202c3945525d686d6f6f6f6f6f6f6f6d685d5245392c201306000714212d3a4754606d7a8284858586868584817e79716c605b53493f33271f140900000000000000000000000000000000000000000000000000000000000000000008141e29323b4146475353535353535353534c4a463f372d23100700000000000000000000000000000000000000000000000000000b1824313e4b5764717e8a97a7b1a79a8d8174665b5044382c2017131317202d3a4753606d79868584838281807e7164574b3e3124180b00000000000000000000000000000000000c1926333f4c5966727f8c99abaea298887b6f6255483c2f221509000000000000000000000000000000030e18212a31373a3b4646464646464646464646464646464646464646464646464646464646464646464646464646464646463d3c38332c231a1005000000000000000000000009141f2a36414c56606d7984919da5a2988e81756b60554b40352920160b020000000000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0ada6998c807366594d49535b666d78828f949fa6a09590837a6d685d564c433a31281f150c03000000000000000000000000000105090b0b13131313131313090806030000000000000000000000000002070a0c0d1313131313131313060300000000000000000714212d3a4754606d7a7c7c7c7c7c7c7c7a6d6054473a2d211407000814212e3b4754616e7a87909292939292908e8a847e746c655b50443b30251a0e020000000000000000000000000000000000000000000000000000000000000000020d1720293036393b4646464646464646463f3e3a342d251b110000000000000000000000000000000000000000000000000000010e1b2734414e5a6774818d9aa7b4aa978a7e7164544a3f33281a0e0606131f2c3845515c676d79787776757474716c6155493d3023170a0000000000000000000000000000000006121e2b37424d576875828f9ba8ab9f9285796c605346392d20130600000000000000000000000000000000060f1820262b2e2f393939393939393939393939393939393939393939393939393939393939393939393939393939393939302f2c28211a1108000000000000000000000000020d1925303a45515c67707d89939da89e93897d70675d51453d32281d140a0000000000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0ada6998c807366594d414a545c666d79828f949fa7a09590837a6d685d554b433931271e150c03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1723303d4a5663707d898989898989897d7063564a3d3023170a000814212e3b4754616e7a87949e9f9f9f9e9d9b96918b80776c60574d42362a1e1205000000000000000000000000000000000000000000000000000000000000000000050e171e252a2d2e39393939393939393932312e29231b1309000000000000000000000000000000000000000000000000000004111d2935414c566a7683909da9aea298887b6e6155483b2d2217080004101c2934404b555c606c6b6a6969686764615a5045392d211408000000000000000000000000000000000814212d3a47535f697885919eaba99c8f8276665b5044382b1f12060000000000000000000000000000000000060e151a1e21222d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2423201c161008000000000000000000000000000008131e2834404b55606b74818e96a1a59d9184796d60594f443a2f261b110600000000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0ada6998c807366594d40424a545c676d79829095a0a7a09590837a6d675d554b433930271e150c030000000000000000000000000000000000000000000000030608090b0d0f1112121313121211100e0c0a0706040100000000000000000000000000000000000a1723303d4a5663707d899595959595897d7063564a3d3023170a000814212e3b4754616e7a87949fa3aba6abaaa9a19e928b7f72695e52463a2d20140800000000000000000000000000000000000000000000000000000000000000000000050d14191e20212c2d2d2d2d2d2d2d2d2524221e1811090100000000000000000000000000000000000000000000000000000713202c3945525d687885929fabac9f9285796c605346392d20130600000c18232f39434b51535f5e5e5d5c5b5a575550483e33281d1105000000000000000000000000000000000815222e3b4855616e7b8897a1ada8998c7f7366544a3f33281c0f0300000000000000000000000000000000000003090e121415202020202020202020202020202020202020202020202020202020202020202020202020202020202020171614100b05000000000000000000000000000000020c18232e39434f59606d79849199a3a0968d80736b60564c41382d22171007000000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0ada6998c807366594d4038424b555d676d7a839095a0a79f959082796d675d554b433930271e150c020000000000000000000000000000000000000003070a0f121515181a1c1e1e1f1f201f1f1e1d1b19161413110d08040000000000000000000000000000000a1723303d4a5663707d8996a2a2a296897d7063564a3d3023170a000814212e3b4754616e7a8799929995999fa2aaada49f92867b6e6154483b3025190e020000000000000000000000000000000000000000000000000000000000000000000002080e111414202020202020202020191816120d06000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8797a2adaa9d918477655b5044372b1f1205000007121d273139404547525251504f4e4d4b49453e362c22170c0000000000000000000000000000000005121e2a36424d5766727f8c99a9aca096887c6f6255493c2d22170b000000000000000000000000000000000000000000020608081313131313131313131313131313131313131313131313131313131313131313131313131313131313130a09070400000000000000000000000000000000000007121d27303d45515d676f7d87929fa69f93877d6f685e53493f332722190f060000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0ada6998c807366594d403039434b555d686d7a839096a0a79f959082796d675d554b423930261e140b0200000000000000000000000000000000040a0f13151b1f21222527292a2b2c2c2d2c2b2b2a28262321201d1913100c07010000000000000000000000000a1723303d4a5663707d8996a3aca396897d7063564a3d3023170a000814212e3b4754616e7a87878686888d9298a2abaea2988c807366564d41362a1e1105000000000000000000000000000000000000000000000000000000000000000000000000020507081313131313131313130c0b09060100000000000000000000000000000000000000000000000000000000000815222f3b4855626e7b8895a9b3a99c8f82766953493f33271b0f030000010b151f272f34383a464544434241413e3d39332c241a1006000000000000000000000000000000000714212d3a46535e697783909daaaa9e9184776a5f53473b2e1c11060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b151e2935414b55606b727f8c949ea49991847a6d655b50443e342b21180d0300000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0ada6998c807366594d40333039434c565e686e7a849196a1a79f948f82796d675c544b423830261d140a0000000000000000000000000000040b10161b1f22262b2e2f3233353738383939393837373532302d2c29241f1d18120b0600000000000000000000000a1723303d4a5663707d89969f9f9f96897d7063564a3d3023170a000713202d3a4653606d787c7a79797c80869299a4afaa9e918477685e5246392d2014070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000091623303c4956636f7c8996a2afa89b8e8175685b4e422d22170b00000000030d151d23292c2d3938373636353431302d28221a120800000000000000000000000000000000000815212e3b4854616e7b87959faba8998c807366584e43372b1f0a0000000000000000000000000000000001040613131313131313130d0c0a07020000000000000000000000000000000000000000000002050708131313131313131307070501000000000000000000000000000000000000000000030c18242f3a434f59606c77828f95a0a1968f82776c605a50463d33291f140900000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0ada6998c807366594d403328313a434c565e686e7b849197a1a69f948f82796d665c544a42382f261c1106000000000000000000000000060c161b21272c2f31373a3c3e4042444545464645454443413f3d3a39352f2c29241d17110a020000000000000000000a1723303d4a5663707d899393939393897d7063564a3d3023170a0006121f2c3844515c666d6f6d686d6f737d87939facaca096877a6e6154473b2e211408000000000000000000000000000000000000000000010507070b0e101212131312110f0d0a070604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1724303d4a5763707d8a96a3b0a79a8d8174675a4e4134271b060000000000030b12181c1f202c2b2b2a2928272423211d171008000000000000000000000000000000000006131f2b37434e5865727f8c98a7aca095887c6f6255483c32261b0f000000000000000000000000000001070d111320202020202020201a1917130e070000000000000000000000000000000000000002090e12141520202020202020201413110d0802000000000000000000000000000000000000000007131d28313d44505b656d7a839197a19e948c80736c61584e453b31261a0e02000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0ada6998c807366594d40332628313a444c565e696e7b859197a1a69f948f82786d665c544a42382d22170b00000000000000000000030a111721272c32383b3c4347484b4d4f5151525253525251504e4c494745413a39352f28221c140b0600000000000000000a1723303d4a5663707d868686868686867d7063564a3d3023170a0004101c2834404a545c6062615e60626b75818e9ba8b2a8968a7d7063574a3d3024170a0000000000000000000000000000000000000003080d111314181b1d1e1f20201f1e1c1a171413100c0701000000000000000000000000000000000000000000000000000000000000000000000000000000000a1724313d4a5764707d8a97a3b0a79a8d8074675a4d4134271a0e01000000000001070c1013141f1f1e1d1c1b1a181714110c060000000000000000000000000000000000020c15212e3b47535f6a7683909da9aa9d9184776a5f53473a2a20150a00000000000000000000000000040c13181d202d2d2d2d2d2d2d2d2626231f19120a0100000000000000000000000000000000050d141a1e20212d2d2d2d2d2d2d2d21201d19130c0500000000000000000000000000000000000000010c161f27333f49535d686e7b859298a29f93887e706a60574d42362a1e1205000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0ada6998c807366594d4033261f28323b444d575f696f7c859298a2a69e948f81786d665c544a3f33281c0f030000000000000000030c151c232832383d4348494e5355585a5c5d5e5f5f605f5e5e5d5b595654514c47454039332d261d181008000000000000000916232f3c4855616b7079797979797979706b6155483c2f23160900000c18232e39424a5153555452535964717e8a97a4b1a5988b7f7265584c3f3225190c0000000000000000000000000000000000060b0f13191d20212427292b2c2c2c2c2b292724201f1d18120f0a0400000000000000000000000000000000000000000000000000000000000000000000000000000b1724313e4a5764717d8a97a4b0a69a8d8073675a4d4034271a0d010000000000000000040607131211100f0e0e0b0a08050000000000000000000000000000000000000008131e2a36414c56626f7c88959faba2988c7f7265584e43372b1f1206000000000000000000000000040d161d24292c393939393939393933322f2a241c130a000000000000000000000000000000050f171f252a2d2e39393939393939392e2d2a251e160e0500000000000000000000000000000000000000040d17222d38414c565f696f7d869299939a92867c6f695f53463a2d211407000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0ada6998c807366594d403326162029323b454d575f6a6f7c869298939393938e81786d665b5044382b1f120600000000000000030d151e262e343d44484f5456585f626566686a6b6b6c6c6c6b6a6a686563605d5553514b443f382f2a221a11080000000000000714202c38444f5961636c6c6c6c6c6c6c6361594f44382c201407000007121c2730394044464847464855626f7b8895a2aea6998c7f7366594c403326190d000000000000000000000000000000020a11171b1f25292d2e3134363839393938383633302d2c29241d1b150e09030000000000000000000000000000000000000000000000000000000000000000000000000a1724313d4a5764707d8a97a3b0a79a8d8074675a4d4134271a0e010000000000000105090b0b121111100f0e0d09080603000000000000000000000000000000000000010d1924303946525e6874818e9aa7aa9f92857a6d6054473c31261b0f030000000000000000000000010c161f282f35394646464646464646403f3b352e261c120700000000000000000000000000020d17212930363a3b4646464646464646463936302820160c020000000000000000000000000000000000000006111b262f3a434d57606a707d868686868686857b6e6155483b2e221508000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0ada6998c807366594d4033261a172029333c454e58606a6f7d868686868686868681796c605346392d201306000000000000020b151f2730383f444f54596063676a6f7173757778787979787877767472706d6764605d55504a423c342c231a1007000000000004101c27333d474f55566060606060606056554f473d33271c10040000000b151e272e34383a3c3a3a4754606d7a8793a0b5a69a8d8073675a4d4034271a0d0000000000000000000000000000060b141b22272b3035393a3e414345454646454442403d3a38352f2b27201a140d0500000000000000000000000000000000000000000000000000000000000000000000000a1724303d4a5763707d8a96a3b0a79a8d8074675a4d4134271a0e010000000000060c111517181f1e1d1c1b1a191615130f0a040000000000000000000000000000000005111d2935414c56616d7a86929faca3988d8074685d5245392a20150a00000000000000000000000007131d28313a404553535353535353534d4b4740382e24190e0200000000000000000000000009141f29333b42464853535353535353535346413a32281e130800000000000000000000000000000000000000000a141d28313b454e58616b70797979797979786e695f53463a2d211407000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0ada6998c807366594d4033261a0e17212a333c464e58606b6f7979797979797979756c665b5044382b1f12060000000000000a141d273139424a505960636b6f74787b7e8082848485858685858483817f7c7a75716d67605b544e463e352c23190d0400000000000b16212c353d44484a535353535353534a48443d352c21160b00000000030c151c23282c2d2f2e3a4653606d798699a3afa79a8d8074675a4d4134271a0e000000000000000000000000020a11171d262d33373a4146474b4e505152535352514f4d4a4745403937322a251f170f08000000000000000000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afa79a8e8174675b4e4134281b0700000000000911181d2124252c2b2a2928272622211f1b150e060000000000000000000000000000040d1a232d3946525d6873808d98a2aa9f92867b6e61564c413529180e040000000000000000000000010d18242f3a434b515f606060606060605957524a40352a1f13070000000000000000000000020e1a25303b454d525f60606060606060605f524c443a3025190d0100000000000000000000000000000000000000020b161f2a333d464f5961636c6c6c6c6c6c6b615f574d42362a1e1205000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0ada6998c807366594d4033261a0d0f18212a343c464f5960636c6c6c6c6c6c6c6c68605b544a3f33281c0f03000000000006111b262f39434b545c606b70767c8184888b8d8f9091929293929191908e8c8986827e79716c665f584f473e352b20160c010000000005101a232c33383c3d464646464646463d3c38332c231a10050000000000030b12181c1f20222c3844505c667986929faca79a8d8174675a4e4134271b0e0000000000000000000000030b141b22272f383f44464c5254575a5c5e5f5f5f5f5e5c5a5753514b47433d363129211a120a0100000000000000000000000000000000000000000000000000000000000000000815222f3b4855626e7b8895a9b3a89b8f8275685c4f422e23180c0000000009121b22292e3132393837363534332f2e2b2620181006000000000000000000000000010c161f2a36424d57616d7a85929faaa2988d8074695e52433a2f24190600000000000000000000000004111d2935404b555d6c6c6c6c6c6c6c6c66635c52473b2f23170a000000000000000000000005121e2a36424d575e6c6c6c6c6c6c6c6c6c6c5e564c41362a1d11050000000000000000000000000000000000000000040d18212b343e474f55575f60606060605f55534d453b31261a0e02000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0ada6998c807366594d4033261a0d060f18222b343d474f54565f606060606060605b53504a42382d22170b0000000000000b17222d38414b555c666d737d82898e919698999b9d9e9e9f9f9f9e9d9d9b9898928f8a857e786f6a61594f473d32281e1308000000000008111a21272c2f3039393939393939302f2c27211a11080000000000000000070c1012131c28343f4a5f6c7986929faca79a8d8174675a4e4134271b0e00000000000000000000030c151d262d333d41495053565e616467696b6c6c6c6b6b696663605d55544e46423b332c241c130a01000000000000000000000000000000000000000000000000000000000000000714212e3a4754616d7a8797a2ada99c90837669544a4034281c1004000006111b242d343a3d3e454444434241403c3b37322a22180e04000000000000000000000007121d28313946535e6973808d97a2a89f92857a6d61564d4231281e13080000000000000000000000000613202c3945515d677679797979797979736e63574b3f3226190c00000000000000000000000714202d3a46525e6976797979797979797976685e5246392d201307000000000000000000000000000000000000000000060f19222c353e44484a535353535353524846423b33291f140900000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0ada6998c807366594d4033261a0d00061019222b353d43484952535353535353534e46443f382f261c11060000000000030f1b27333f49535c676d7880888f949a9ea1a8a6a9a19e9d9d9c9d9d9ea1a9aaa39f9b97918b837c706b61594f443a2f24190d0100000000000810161c2023232d2d2d2d2d2d2d2323201c161008000000000000000000000004060c17232e46535f6c7986929faca79a8d8174675a4e4134271b0e000000000000000000020c151e272f383f444e535b6063686d7174767878797978777573706d67626058534d453e362e251c130a000000000000000000000000000000000000000000000000000000000000000713202d3946525d687885929fabaa9e918477665c5144382c1f120600010c18222d363f454a4b5251504f4e4d4c4947433c342a20150a00000000000000000000050e18242f39434f59616e7b86929fa9a0968c7f72685e52443b301f160c010000000000000000000000000714202d3a4753606d7986868686868686807366594d4033261a0d00000000000000000000000815212e3b4854616e7b86868686868686867a6d6154473a2e2114070000000000000000000000000000000000000000000007101a232c33383c3d464646464646453b3a36312921180d0300000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0ada6998c807366594d4033261a0d0000071019232b32383b3c4646464646464646423938332d261d140a00000000000005121f2b3744505b656d79828d939a9fa6a7a09d999697929090909090929795999da0a7a19e9590867d706b60564c4135291d1307000000000000050b1014161720202020202020171614100b05000000000000000000000000000013202c3946535f6c7986929faca79a8d8174675a4e4134271b0e0000000000000000000a141e2730394149505860656c70767a7e818384858686858482807d79746f6a615e57504840372e251c120900000000000000000000000000000000000000000000000000000000000005111d2935414c566a7683909da9ac9f9286796d6053463a2d2013070005111d29343f485056585f5e5d5c5b5a5955534e463c32261b0f030000000000000000020b17202935404b55606b75818e98a3a59d9184796d60564c4132291f0d04000000000000000000000000000714202d3a4753606d7a8693939393938c807366594d4033261a0d00000000000000000000000815212e3b4854616e7b87939393939393877a6d6154473a2e211407000000000000000000000000000000000000000000000008111a21282c2f30393939393939382e2d2a261f180f060000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0ada6998c807366594d4033261a0d00000007101921272c2f303939393939393939352d2b28221c140b02000000000005111e2a36414c56606c77818e949fa4a7a09d95908c89878584838383848587898c90959ea1a7a09892867d6f685d52453a2f24180d01000000000000000407090a131313131313130a0907040000000000000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000000000000000006111c263039424a535b606a6f787d82868a8d8f9192929292918f8d8a86817c756e69615a524a40372e241b0f060000000000000000000000000000000000000000000000000000000000010d192430414e5b6774818e9aa7afa399887b6f6255483c2e23180c060615212e3a45505a62656c6b6a69686766625f584e43372b1f130600000000000000000a141d29323a45515d67707d89939ea89d93897d70675c51443a3020170d00000000000000000000000000000714202d3a4753606d7a86939f9f9f998c807366594d4033261a0d00000000000000000000000815212e3b4854616e7b87949f9f9f9f94877a6d6154473a2e2114070000000000000000000000000000000000000000000000000810161c2023242c2d2d2d2d2d2c22211e1a140d06000000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0ada6998c807366594d4033261a0d00000000070f161b1f22232c2d2d2d2d2d2d2d28201f1c17110a020000000000000713202d3946525e68727f8c939ea6a59d959089837f7c7a787776767677787a7c7f838a9297a1a9a29891847a6d60554b4135291d1104000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e00000000000000030d17232e38424a545c656c737c838a8f93999a9c9e9f9f9f9e9e9c9998928e89827b716c635c524940362d22180b020000000000000000000000000000000000000000000000000000000000081824313e4b5764717e8a97a7b1ab988b7e7165554b4034281d1413131624313d4a56626c71787777767574736f6a5f53473b2e2115080000000000000006111c262f3a444f59606d7984919ea5a1968e81746b60554b4032291e0e0500000000000000000000000000000714202d3a4753606d7a8693a0aca6998c807366594d4033261a0d00000000000000000000000815212e3b4854616e7b8794a1acaca094877a6d6154473a2e21140700000000000000000000000000000000000000000000000000050b101416172020202020201f1514120e090300000000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0ada6998c807366594d4033261a0d0000000000040a0f1315161f202020202020201b13120f0b060000000000000004101c2834404a54616d7a85929fa5a69d938e837d77736f6d686a6a696a6a676d6f73787e859196a1aaa1968d8073675d5145392c201306000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000000000000010b151f28343f4a545c666d777f8890959c9fa4aba8a5a3a2a2a3a5a8aaa39f9b938f867e736e635b52483e342a1d140a00000000000000000000000000000000000000000000000000000000000815212e3b4854616e7b87959faba89b8e8175675c5145392e2521201f202935404b5565717e8584838281807f7c6f6255493c2f221609000000000000071017222d38424c56606b74808d96a0a3999184796d60594f43392e20170d0000000000000000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d00000000000000000000000815212e3b4854616e7b8794a1aeada094877a6d6154473a2e2114070000000000000000000000000000000000000000000000000000000407090a1313131313131208070502000000000000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0ada6998c807366594d4033261a0d000000000000000307090913131313131313130f06060300000000000000000006121f2c3844515c6674808d98a2aa9e948e8179706b6663605d565d5d5d555d6062656c717b84919ea8a99f92857a6d6054473a2d211407000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e00000000000007121d27313944505c666d78818c939a9fa7a9a29f9b9896959596989b9fa2aaa59e98928a80736e635a50463c2f261b1106000000000000000000000000000000000000000000000000000000000714202d3a46525e697783909daaab9f9285796d60544b4036312d2c2c2d323a45515d6775818e91908f8e8d897c6f6356493c302316090000000000060f192228333f4a545e68707d88939fa69f92877d6f675d51473d30271d0e050000000000000000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d00000000000000000000000815212e3b4854616e7b8794a1acaca094877a6d6154473a2e211407000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0ada6998c807366594d4033261a0d00000000000000000000000606060606060606020000000000000000000000000713202d3a4653606d7885929fa9a2988f82786d6760595654524c5050504c5154535b6069707d8a96a0aca2988a7e7164574b3e3124180b000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e0000000000000c18232f39434f59606d78818e939fa4aaa29f97928e8b898888898b8e92989fa3aaa29f928c80736c61584e41382d22170b0000000000000000000000000000000000000000000000000000000005121e2a36424d5765727f8c98a2aea2988b7e71665c5146423b3a39383a3d444d57606d7a85929e9d9c9b9285796d6053463a2d20130700000000030d18212b343d44505b666d7a85919aa49e948c7f726b60554b41352b1e150b000000000000000000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d00000000000000000000000815212e3b4854616e7b87949f9f9f9f94877a6d6154473a2e211407000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0ada6998c807366594d4033261a0d00000000000000000000000000000000000000000000000000000000000000000a1723303d4a5663707d899297979992857b6e665c554f49474541434343414547495057616b7784919daaaa9a8d8174675a4e4134271b0e000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000000000004101c2934404b55606b73808d939ea5a7a098928c85817e7c7c7c7d7f82868d9299a1a8a49c928b7e716a5f53493f33271c1106000000000000000000000000000000000000000000000000000000020e1a25303b4754616d7a86929fa9aa9e9184796d605b534d4847454546484f565e69727f8c98a2aaa69b8e8275665c5044382c1f12060000000009141f29333d46505a606c78828f97a1a0958f82776c60594f433a2f23190c03000000000000000000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d00000000000000000000000815212e3b4854616e7b87939393939393877a6d6154473a2e211407000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0ada6998c807366594d4033261a0d00000000000000000000000000000000000000000000000000000000000000000a1724313d4a5764707d8285878a8c8d8073685e544b433d3a39352f362f35393a3f444f596774818d9aa7a99c908376695d5043362a1d10000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000000000006131f2c3845515c67707d88939fa5a7a09590857f797572706f6f7072757a80869196a1a9a49f92867c6e655b5044382e23170c000000000000000000000000000000000000000000000000000000000914202d3946525d6874808d97a2aca0968d80746d615e575554515153555960686e7b86929faaab9f94897c6f63544a3f34281c1003000000020e1a26313b454e58616c73808d949ea19791837a6d655b50473d31281d110700000000000000000000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d00000000000000000000000815212e3b4854616e7b86868686868686867a6d6154473a2e211407000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0ada6998c807366594d4033261a0d00000000000000000000000000000000000000000000000000000000000000000a1623303c4955616c7076787b7d80827c6f62564d4239302d2c29242a24292c2d33404c5966737f8c99a6aa9d9184776a5e5144372b1e11000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e0000000004111d2935414c55606d7984919aa4a9a09590837b726d67656362626365686d737c849197a1aba2989083786c60544a3f34281c100300000000000000000000000000000000000000000000000000000005111d2935414c56616d7a85929fa5a89d928c7f756e696461605d5c6062656b6f7a839198a2aea3999083766b605442382e23170c0000000005121e2a36424d57606a717e88939fa29892857b6e685d53493f352b1f160c0000000000000000000000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d00000000000000000000000714202d3a46525e6976797979797979797976685e5246392d201307000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0aca6998c807366594d4033261a0d00000000000000000000000000000000000000000000000000000000000000000814202d39444f59616469696e7073756f6a5f53443b302721201f2023282c2f353a424d566673808c99a6aa9e9184776b5e5144382b1e11000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000000000613202c3945515d67737f8c96a1aca29790837a6e69605d5556555556565d606a6f7b859199a3aa9f948b7e71665c5044382c1f1509000000000000000000000000000000000000000000000000000000010d1924303a46525e68727e8b939ea7a49c918c827b75716e6d67666d6f71767d849195a0aaa69f92877c6f63594f4330261c1106000000000714212d3a46535f696f7c86929a939992867d6f695f564c41382d23190d040000000000000000000000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d000000000000000000000005121e2a36424d575e6c6c6c6c6c6c6c6c6c6c5e564c41362a1d1105000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a87939f9f9f998c807366594d4033261a0d000000000000000000000000000000000000000000000000000000000000000004101c28333e474f5557575e61646669625f584e4332292122282b2d2e34383a40454c545e6975828f9ba8aa9d9083776a5d5044372a1d11000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000000000714212d3a4754606d7a85929fa8a89f92857b6e685e57514b4949494a4c52585f696f7d87929faaa69e9184786d6053463c31261a0e0200000000000000000000000000000000000000000000000000000008131e2a36414c56626d75818e959fa6a49c948f86827e7b7a7979797b7e83899196a0a7a59e948c7f736b6054473d321e150a00000000000815222e3b4855616e7b858686868686867d706a60574d433a2f261b1107000000000000000000000000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d0000000000000000000000020e1a25303b454d525f60606060606060605f524c443a3025190d01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8793939393938c807366594d4033261a0d0000000000000000000000000000000000000000000000000000000000000000000b17212c353e44494a4d535457595c55534e463c312a2d2d3338393c4045464b51565d666e7b86929faca89c8f8275695c4f4236291c0f000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e00000007131f2c38434e5865727f8c98a2aca0968b7f72695f564d45403d3c3c3d41454e57606b74808d98a2aca1968a7e7164574d42372b1e1206000000000000000000000000000000000000000000000000000000020d1925303a44515b606d798390949da5a69e98928f8b8887858586888b90949ea1a8a39f938e82786d60594f43352b210c0300000000000714212d3a46535f696e78797979797979706b61584e453b31281d140a00000000000000000000000000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d00000000000000000000000009141f29333b42464853535353535353535346413a32281e130800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a86868686868686807366594d4033261a0d00000000000000000000000000000000000000000000000000000000000000000005101a232c33393c3d4246484a4d4f4847433c3431363a3b3f4446494b5153555d60686d78828f98a2aea7998c7f7366594c403326190d000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e0000000915222e3b4854606a7784919eaaab9e9184786d60574d443b352f2f2f30353c454f59616d7a86929faca89d908376695f53473a2d2114080000000000000000000000000000000000000000000000000000000008131e28323f45515d676d7a828e939da0a8a39f9b97949892929895989c9fa6a7a099928d81786d665c50463d3223190f00000000000005121e2a36424d575f616b6c6c6c6c6c6c6361594f463d332a1f160b0200000000000000000000000000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d000000000000000000000000020d17212930363a3b4646464646464646463936302820160c0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202c3945525d687679797979797979736d63574b3f3225190c0000000000000000000000000000000000000000000000000000000000000000000008111a21282d3031363a3b3d40423c3a37373b3c4246484a505355555c6063676d727a818f949eaaab9f95887c6f6255493c2f221609000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e0000000916232f3c4956626f7c8996a0aca3998b7f72665c50453b32292422222429333d46525d6874808d9aa8ab9f95887b6e6155483b3025190d01000000000000000000000000000000000000000000000000000000020c16202935404b555d686d78818991959c9fa3aba4aaa29f9fa2aaa4aba49f9c95908780786d665c544a3f342b211007000000000000020e1a26313b454d53555f60606060605f57554f473e342b21180d040000000000000000000000000000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d00000000000000000000000000050f171f252a2d2e39393939393939392e2d2a251e160e0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004111d2935414c565d6c6c6c6c6c6c6c6c66635b52473b2f23160a00000000000000000000000000000000000000000000000000000000000000000000000810171c2023252a2d2e31333036393c4347494d5354545b606266676d7074797e858f939ea6aea49d9083776a6054473b2e221508000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000005121e2a36424d576774808d9aa8ac9f92867a6d61544a3f33292018161619212935414c56626f7c8895a0aca7998c807366564c4135291d110500000000000000000000000000000000000000000000000000000000050e18242f3a434c565d666d747d848a8f92999a9c9e9e9f9f9e9d9c9a99938f8a837c736c665c544a42382e22190f000000000000000009141f29333b424648525353535353534a48443e352c22190f06000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d0000000000000000000000000000050d141a1e20212d2d2d2d2d2d2d2d21201d19130c0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010d19242f3a444c525f606060606060605957524940352a1e1307000000000000000000000000000000000000000000000000000000000000000000000000050b1014161a1e21282f353a4146474e5455575e6165666c6f7276797d81858b91979ea5afa69d92897d7063584e43372b1f1306000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e00000714202d3a46525e697784919eaaa99c8f8276685e5242382e21170d07080f1924303a47535f6a7784919daaaa9d908377685e5246392d201307000000000000000000000000000000000000000000000000000000000007131d28313a444c545c606b70787e82868a8d8f9192929291918f8d8a86827d786f6a605b544a423930261c10070000000000000000030d18212931363a3b454646464646463d3c38332c231a100700000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d00000000000000000000000000000002090e12141520202020202020201413110d080200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008131e28323a414553535353535353534d4b4740372e24190d0200000000000000000000000000000000000000000000000000000000000000000000000000000409121b232b323a41454c525458606266696e7175797c7f8285898d92979ea1a9ada59e948d80746b6054463c32271b0f03000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e00000815212e3b4854616e7b8796a0acab988c7f7265564c4130261c0f06000008131e2b37434e586774808d9aa7ac9f93867a6d6154473a2e2114070000000000000000000000000000000000000000000000000000000000010c161f28323a424b515960666c71767a7d808284858686858483807d7a75706c666058504a423930271e140a00000000000000000000060f181f262a2d2e38393939393939302f2c28211a11080000000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d0000000000000000000000000000000000020507081313131313131313070705010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010c1620282f35394646464646464646403f3b352e251c120700000000000000000000000000000000000000000000000000000000000000000000000000000009121b242d353d444c52565e61666a6f73777b7e8285888c8f92989a9fa2a9aca9a19e938e82786d60594f44342b20150a00000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e00000b1825313e4b5864717e8b97a8aea399887c6f6255493c3022140a000000020f1b26323d4a5763707d8a96a8afa4998a7d7064574a3d31241707000000000000000000000000000000000000000000000000000000000000040d162028303940454f545b6064686e7174767778797978777673716e6863605b544e443f382f271e150c020000000000000000000000060d141a1e21222c2d2d2d2d2d2c2423201c161008000000000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040d161e24292c393939393939393933322f2a241c130a00000000000000000000000000000000000000000000000000000000000000000000000000000006101b242d373f474f565d60686d72777c8084878b8e9297999c9fa2aaababa8a19e96918a81796d665c51473d3322190e0400000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e00010e1a2734414d5a6774808d9aa7ac9f9286796d6053463a2d201307000000000a14212e3b4754616e7a8796a1adab998d8073665a4d402f24180c00000000000000000000000000000000000000000000000000000000000000040d161e272e343d424a5053565e616467696b6b6c6c6b6a696764615e5653504a423c332d261d150c030000000000000000000000000003090e1214151f202020202020171614100b0500000000000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040c13191d202d2d2d2d2d2d2d2d2625231e19120a010000000000000000000000000000000000000000000000000000000000000000000000000000040e18222d363f49515960686d737a7f84888d9196989b9ea2a9a9acaaaaa29f9b96918c847e746d675c544a40352b2110070000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e0004111d2935414c556976838f9ca9aa9d908377665c5144382c1f1206000000000714202d3946525e687884919eaba99c8f827669554b4035291d100400000000000000000000000000000000000000000000000000000000000000040c151d23282f383f44464c5254575a5c5e5f5f5f5e5e5c5a5754524c46443f382f28221c140b030000000000000000000000000000000002050708121313131313130a090704000000000000000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001080d111314202020202020201a1916130d07000000000000000000000000000000000000000000000000000000000000000000000000000000000a15202a343e48515b626b707a80868c9196999da0a8a8abaaa7a7a09d9a98928e8a847f79716c605c554b42392e231a0f000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000613202c3945515d677885929eaba89b8e827568544a4034281c10040000000005111e2a36414c566976838f9ca9ab9e918578675d5145382c1f13060000000000000000000000000000000000000000000000000000000000000000030b12181d262d33383b4146474a4d4f515253535251504d4a4746413b38332d261d17110a020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001040707131313131313130d0c0a070200000000000000000000000000000000000000000000000000000000000000000000000000000000030f1b26313c46505a626d727d848d92989ea0a8aaaba8a8a09e9a9795908d8985817d78726d67615a514b433930271c1108000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000714212d3a4754606d7a8797a1ada6998c807366594d402e23180c0000000000010d192530414e5a6774818d9aa7ada197867a6d6053473a2d20140700000000000000000000000000000000000000000000000000000000000000000000070b141c22282b3036393b3e414344454646454443403e3b3936302b28221c140b0600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006121f2b37434e58626c727f8791969fa2aaaaaaa29f9b9896918e8a8784807d7975706d66605d555045403930271e150b00000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000915222f3c4855626f7c8895a9b3a4988b7e7165584b3e32251807000000000000081926333f4c5966727f8c99a5b2a995887b6e6255483b2f2215080000000000000000000000000000000000000000000000000000000000000000000000020a11171c1f252a2d2e3134363838393938373634312e2d2a251f1c17110a020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030613131313131313130d0c0a07020000000000000000000000000003060809131313131313130b0b09050100000000000000000000000815212e3a47535f6a717e889299a1a9aca69f9c98928e8b8784817e7a7773706d6663605c54514b433e342e271e150c0300000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000a1724303d4a5763707d8a96a3b0a3978a7d7064574a3d3124170a0000000000000b1825313e4b5864717e8b97a4b0a3968a7d7063574a3d3024170a00000000000000000000000000000000000000000000000000000000000000000000000000060b0f14191e20212427292b2c2c2c2b2b29272421201e19140f0b0600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060c101220202020202020201a1917130e0800000000000000000000040a0f13151620202020202020181715110c0600000000000000000006121f2b37434e58626f7c86929aa3aba8a09e948f8a85827e7b7774716e686763605c5453504a4540393128231f1c17110a02000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000b1825313e4b5864717e8b97a4afa295897c6f6256493c2f2316090000000000000a1723303d4a5663707d8996a3b0a4978b7e7164584b3e3125180b00000000000000000000000000000000000000000000000000000000000000000000000000000003080d111414171a1c1e1f20201f1e1d1a171414110e0803000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030a11171c1f2d2d2d2d2d2d2d2d2726231f19120a0200000000000000070f161b1f22232d2d2d2d2d2d2d2524211d18110900000000000000000815212e3a47535f6a76828f98a3aca7a0969189827d7975716e696764615e565653514a46443f38352f312f2d2b28221c140b020000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1926323f4c5965727f8c98a5aea195887b6e6255483b2f2215080000000000000916232f3c4956626f7c8995a2afa5988b7f7265584c3f3225190c0000000000000000000000000000000000000000000000000000000000000000000000000000000000010507080b0e10111213131211100d0b080705020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030c151c23282c393939393939393933322f2a241c140a00000000000007101920272b2e2f3939393939393932312e29221b1209000000000000000915222f3c4855626f7b88949faaaca09590847d76706d6765615e575754524c494644403a444442413f3e3c3938332d261d140a0000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000d1a2733404d5a6673808d99a6ada194877a6e6154473b2e2114080000000000000815222f3b4855626e7b8895a1aea6998c807366594d4033261a0d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a151e262e34384646464646464646403f3b362e261c120800000000040f19222b32383b3c464646464646463e3d3a342d241b11060000000000000c1926333f4c5966727f8c99a6afa49a90837a706b64605c5554524d4b4746413d3a434a4f50514f4d4c4a4946443f382f261c110600000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000e1a2734414d5a6774808d9aa7ada093877a6d6054473a2d2114070000000000000815212e3b4854616e7b8794a1aea69a8d8073675a4d4034271a0d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006111c2630383f4453535353535353534d4b4740382e24190e020000000a16202b343d434749535353535353534b4a453f362d22180c0100000000020f1c2835424f5b6875828e9ba8ac9f93877c6f68605953514b4846423e3b393634434d555b5d5d5c5a59575553504a42382d22170b00000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000e1b2734414e5a6774818d9aa7ada093867a6d6053473a2d2014070000000000000814212e3b4754616e7a8794a1ada79a8d8174675a4e4134271b0e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c17232e38424a505f606060606060605a58524a40362a1f13070000030f1b27323d464e545660606060606060585650483f34291d11050000000003101d293643505c6976838f9ca9a99d9083766a5f564f4645403b3a36302e2d2f3c46555f666a6a6967656462605b544a3f33281c0f03000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000e1b2834414e5b6774818e9aa7aca09386796d6053463a2d2013070000000000000714212e3a4754616d7a8794a0ada79a8e8174675b4e4134281b0e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d0707040100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003101c28343f4a545c6c6c6c6c6c6c6c6c66635c52473b2f23170a000006131f2b38434e5860626c6c6c6c6c6c6c65625a50453a2e2115090000000004101d2a3743505d6a7683909da9a79b8e817468584e443d38342e2d2a2a2d2f38424e5866717777757472716f6c665b5044382b1f1206000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000e1b2835414e5b6874818e9ba7aca09386796d6053463a2d2013070000000000000714212d3a4754606d7a8793a0ada79b8e8174685b4e4135281b0e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060c1114202d3a4753606d7a8693a0ada6998c807366594d4033261a1a1413110d08010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006121f2c3844505c667679797979797979736e63584b3f3226190c00000815222e3b4754606a6f79797979797979716c62564a3d3124170b0000000003101d293643505c6976838f9ca9a79a8d817467564c413a39352f363036393c424a54606a77838482807f7d7c786c605346392d201306000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000e1b2834414e5b6774818e9aa7aca09386796d6053463a2d2013070000000000000714212e3a4754616d7a8794a0ada79a8e8174675b4e4134281b0e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000910171d21202d3a4753606d7a8693a0ada6998c807366594d403326262621201d19130c040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d78868686868686868073665a4d4033271a0d00000916232f3c4956626f7c868686868686867e7165584b3e3225180b00000000020e1b2835414e5b6874818e9ba7a99c8f8276685e534c4745414343434146474d545b666f7c88908f8d8c8a85796c605346392d201306000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000e1b2734414e5a6774818d9aa7ada093867a6d6053473a2d2014070000000000000814212e3b4754616e7a8794a1ada79a8d8174675a4e4134271b0e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009121b22282d30313a4753606d7a8693a0ada6998c807366594d40333333332d2c29241e160d0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d798693939393938d8073665a4d4033271a0d00000916232f3c4956626f7c8993939393938b7e7165584b3e3225180b00000000000c1926323f4c5965727f8c98a7ac9f92867a6d655e5654514b504f504d5254575f666c7882909c9c9a988e8174655b5044372b1f1205000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000e1a2734414d5a6774808d9aa7ada093877a6d6054473a2d2114070000000000000815212e3b4854616e7b8794a1aea79a8d8074675a4d4134271a0e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006101b242c34393d3e404753606d7a8693a0ada6998c807366594d40404040403a39352f2820160c01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d7986939f9f9f998d8073665a4d4033271a0d00000916232f3c4956626f7c89959f9f9f988b7e7165584b3e3225180b00000000000815222f3b4855626e7b88959faba3998e81776d6863605d555d5c5d565e6164696e78808e949fa8a0958a7d706453493f33271b0f03000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000d1a2733404d5a6673808d99a6ada194877a6e6154473b2e2114080000000000000815222f3b4855626e7b8895a1aea6998d8073665a4d4033271a0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c17222c363e45494b4d4d53606d7a8693a0ada6998c807366594d4d4d4d4d4d4745413a32281e1308000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2aca4988b7e7165584b3e3225180b00000000000814212e3a47535f6a7683909da5ab9e938e817a74706d676a6969696a686e71757b828e929da6a59d9083786c605346392d22170b00000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1926333f4c5966727f8c99a5aea195887b6e6255483b2f2215080000000000000916222f3c4955626f7c8895a2afa5988c7f7265594c3f3226190c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005111d28343e48505557595959606d7a8693a0ada6998c8073665959595959595954524c443a2f24190d010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b000000000006121f2b37434e5863707d89939da6a59e938e86807d7a787776767677787a7e82878f949da5a69d938a7d70655b5044372b1b110600000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f2316090000000000000a1623303d495663707c8996a3afa4988b7e7165584b3e3225180b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000815212d3945505a6164666666666d7a8693a0ada6998c80736666666666666666605d564c4135291d11040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b0000000000020f1a26313c4855606b74818e949da5a59e98928d898785838382838485878a8f93999fa6a49d948e81746c6153493f33271b0a0000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000b1724313e4a5764717d8a97a4b0a3968a7d7063574a3d3024170a0000000000000b1724313e4a5764717d8a97a4b0a3978a7d7064574a3d3124170a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1724303d4955616c7173737373737a8693a0ada6998c807373737373737373736d685d5245392c2013070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b0000000000000a15202c38444f59606d79828e939da0a7a29f9a96979290908f90909297979b9fa4a7a09d928d82786d605a5041382d22170b0000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000916232f3c4956626f7c8995aab4a4978b7e7164584b3e3125180b0000000000000c1925323f4c5865727f8b98a5b4aa95887c6f6255493c2f221609000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1824313e4b5764717e8080808080808d99a6b3a99c90828080808080808080807a6d6054473a2d2114070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b00000000000003101c27333d45515c676d79818990959b9fa2aaa9a19e9d9c9c9c9d9fa2a9aaa29f9b95908a80786d665c51473e2f261b11060000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000814212e3b4754616e7a8798a3aea6998c7f7366594c40332619090000000000000d1a2733404d5a6673808d99a6aea298877a6d6154473a2e21140700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101c2936434f5c6976828c8c8c8c8c8d929ca8b4ab9f94908c8c8c8c8c8c8c8c877b6e6154483b2e2115080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b000000000000000b16212834404b555c676d747d838a8e9298989a9c9d9e9f9f9f9e9e9c9a9898928e8a837d746d665c544a40352c1d140a000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000613202d394653606c7985929faca79b8e8174685b4e4131261a0e020000000003101c28343f4a546875828e9ba8ac9f928579685e5246392d20130700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101c2936434f5c6976828f99999999999ca4aeb9b0a69f9c9999999999999994877b6e6154483b2e2115080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b00000000000000050c18232e39434b555c606b6f787d8185898b8e9091919292929191908e8c8985827d77706b605c544b42392e231a0b02000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e0005121f2b3744505b657783909daaa99c90837669574d42362a1e12050000000006121f2c3844505c667783909daaa99d9083766a564c4135291d110500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101c2936434f5c6976828f9c9f9f9fa0a2a7afb9b6aea8a69f9f9f9f9f9f9f94877b6e6154483b2e2115080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b000000000000000007121d273039434b515960666c7075797c7f81838485858685858483817f7d7975706b636159514b423930271c110800000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e00030f1b27333f49536874818e9ba7ab9f928578695f53463a2d211407000000000713202d3a4653606d7986929faca79a8e8174675b4e413025190d0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101c2936434f5c6976828f9393939393969da7b2aea49c999393939393939393877b6e6154483b2e2115080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b0000000000000000000b151e27303940454f545b6063676d7072747677787879797877767472706d66636159554f45403930271e150b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e00000b17222d3f4c5965727f8c98aaada297887b6e6155483b2e23180c000000000915222f3c4855626f7b8898a3aea9988b7e7265584b3f322518080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101c2936434f5c6976828686868686868b96a2aea89c928c8686868686868686867b6e6154483b2e2115080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b000000000000000000030c151e272e343d424a5053555d60636567696a6b6c6c6c6b6b69676563605c54554f48443e342e271e150c030000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929f9f9f9a8d8174675a4e4134271b0e00000616232f3c4956626f7c8998a2aea9978b7e7164544b4034281c1004000004101d2935404b5565727e8b98aaada197887c6f6255483c2f22150900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f1c2835414e5a6670767979797979798693a0ada6998c8079797979797979797976695e53463a2d2114070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b00000000000000000000030c151d23282f383f44464b515356585b5d5e5e5f5f5f5e5e5d5b595653514b48443e383328231d150c03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c798692939393938d8174675a4e4134271b0e00000713202d3a4653606d7985929faba79b8e8174665c5145382c1f160c06060c141f2c3845515d6775828e9ba8ab9e9285786c605346392d20130600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d1925323d49545e66696c6c6c6c6d7a8693a0ada6998c80736c6c6c6c6c6c6c6c6c5e574d42362a1e12050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b0000000000000000000000030b12181d262d333839404547494c4e5051525253525251504e4c4a4645403938332c282118120b0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c79878686868686868074675a4e4134271b0e000006121f2b3844505c6675828f9caaab9e9285796d6053463d31281e171515171e28313a4753606d7985929facaa9b8e8175655b5044372b1f120500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000915212c38424c545a5c606060606d7a8693a0ada6998c807366606060606060605f534d453b31251a0e020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b00000000000000000000000000070b141c22282b2f35383a3d3f41434445454646454443413f3d3a38342e2c28211c160c070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006121f2c3845525e6a7579797979797979746e64584c3f33261a0d000003101c28343f4a5464717e8b98a3ada2978a7d7064594f433a30282322222227303a434f5964717e8a98a2aea2988a7d706453493f33271b0f03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005101b26303a42494e4f535353606d7a8693a0ada6998c807366595353535353534846423b33291f1409000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b0000000000000000000000000000020a11171c1f24292c2d3032343637383939393838363432302d2c28231d1c16100b05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004111d2a36424e59636a6c6c6c6c6c6c6c67645c52473c3024170b0000000b17232e3a4754606d7a86929faca99c9083766b60554b423a342e2f2e2d3339424b55616b7683909daaab9f9285796d6053473a2d22170b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a141e2830383d4143464753606d7a8693aab4a6998d8073665a4d46464646463b3a36312921170d03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b00000000000000000000000000000000060b0f12181d1f202325282a2b2b2c2c2c2b2b2a282623201f1c1812100b0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010e1a26313d4751595e5f6060606060605a58524a41362b1f14080000000613202c3945515d6775818e9ba6ab9f94897d70675d544c443f3c3b3b3c3f444b545d67707d89959faba4998d8174675c5145382c1b110600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020c161e262c3235363a4653606d798698a3aea79a8d81746753493f36393a3c3a38342f271f150b01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b00000000000000000000000000000000000003070c10131416191b1d1e1f1f201f1f1e1d1b19171313100c0700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000915202b353f474e52535353535353534e4c4741382f241a0e0300000004111d2935414c55626f7c88949faba69e9184796d665d56504a494848494950555d666d7984919ea7aa9f93877b6e61554b4034291c0a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040c141b2125282c3845515c667986929faca89b8f8275655b5046424547484745403931271d1207000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b0000000000000000000000000000000000000000000406070a0c0e1011121213131211100e0c0a07060400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040f19242d353d424546464646464646413f3c362f261d130800000000010d19242f3a47535f6a76828f99a3aca0968f82786d68605c5456555555535b60676d78818f96a0aca2988e8175695f5343392f23180c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020a1015191c2834404b546b7885929eabab9e9184786c6056534d51545553514b43392f23180c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a16202b343d4347494949494949494846423b33291f1409000000000008131e2b37434e58626e7c87929fa7a89e948f827a716d66646262616264656c7079818e939ea8a69f92867b6e61574d4231271d120700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005090c18232e43505d6a7683909da9ada196897d7068615f575d6062605c554b4034291c10040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b000000000000000000000000000000000000010407070b0d0f111213131212100e0c080705020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1b27323d464e545656565656565654534d453b31251a0e0200000000010f1b26323c47535f6a73808d959fa8a69e948f847e7974716f6e6e6f7173787d848e939ea5a79f948c7f72695e53453c311f150b010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000071a2734414d5a6774808d9aa9b2a89d91837a726e696c676d6f6d675c5145382c1f13060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b0000000000000000000000000000000002080d111314171a1c1e1f1f201f1f1d1b181514120e090400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006131f2b37434e586062626262626262615e574d42362a1e120500000000000a15202b37434e58606d78839096a0a8a69e96918b85817e7c7b7b7c7e80848a91969ea5a7a0958f82776c60574d42332a1f0d030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1724313e4a5764717d8a97a1adaca09591847f7b7978797a7c796d6053473a2d2014070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b0000000000000000000000000000050b1013191d20212427292b2b2c2c2c2b2a282522211e1a14100c07010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000815222e3b4754606a6f6f6f6f6f6f6f6e695e53463a2d2114070000000000040f1a26313c44505c666e7b8491969ea5a9a19e97918e8b898888888a8d91969ea0a8a59e9590837a6d655b50453b3121180e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d7985929ea6b0a7a096918b8886858687877b6e6154483b2e2115080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b000000000000000000000000040a0f171c1e24292c2d3133363738393939383735322e2d2a261f1d18120b0600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000916232f3c4956626f7c7c7c7c7c7c7c7b6e6154483b2e2115080000000000000a152028343f4a545e696e7b848f939ea1a8a9a19e9a9795959495979a9ea0a8a8a19e938e837a6e685e53493f33291f0f060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006131f2c3845515c67737f8c949fa6ada8a19e989992929299877b6e6154483b2e2115080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b0000000000000000000000070f151b22282d3035393a3e404244454646454543413f3b3a36312c29241d17110a0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c79878989898989898074675a4e4134271b0e000000000000030c17232e38424d565e696e7a828a91969d9fa7a7a7a4a2a1a1a2a4a6a7a7a09d96918a81796e685e564c41382d21170d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004101c2834404b55606d78828f949ea1a8a9aaaba39f9f9f94877b6e6154483b2e2115080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d798693a0aca69a8d8073675a4d4034271a0700000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b0000000000000000000009101920272b33393a4145474a4d4f515252535252504e4b4846423b39352f27221b140b05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c798692959595958d8174675a4e4134271b0e0000000000000006111c26303b444d575e686d757e848b9095979a9c9e9e9f9f9f9e9c9a9895908b847e756d675e564c443a2f261b0f050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c18232e3944505c666d7a828c91969a9c9e9f9f9f9f9e94877b6e6154483b2e2115080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d798693a0aca79a8e8174675b4e412e23180c00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b0000000000000000020a131b222b32373e44494c5254575a5c5e5e5f5f5f5e5d5b5855534d47454039332d261d170e060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929fa2a29a8d8174675a4e4134271b0e00000000000000000a151e29323b454d565d606c71797e83878a8d8f9192929292918f8d8b87837e79716c605d554c443b32281d140a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007121d28343f4a545e686d787f848a8d9091929292929190877b6e6154483b2e2115080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d798693a0aca89b8f827568544b4034281c1004000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b00000000000000000a141c252d343d43475055565d606466696a6b6c6c6c6b6a6865615f5753514b443f382f292018100600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e0000000000000000030c172029333b444c525a61676d71767a7e818284858686858483817e7b77716d67615a514b433b322920160b0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c17232e38424c565e666c72797d808384858686858483817a6d6054473a2d2114070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d798693a0aca99d908376665c5145382c1f130700091623303c4956636f7c8996a2afa4988b7e7165584b3e3225180b0000000000000009121c262e373f464e545a6164686d7173757778797978787674726e6965605d555049413a322a22181006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929f9f9f9a8d8174675a4e4134271b0e000000000000000000050e172129323a414550555c6064686e7174767778797978787674716e6965605d555045403a312920170e0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006111c26303a444c545b60666d70737677787979787876746d685d5245392c2013070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d798693a0acac9f9286796d6053463a2e23180d060a1723303d4a5663707d8996a3b0a4978b7e7164584b3e3125180b00000000000006101b242e384049515860626c70757a7d808284858586858583817e7b77726d67605b534c443c342a22180e050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c798692939393938d8174675a4e4134271b0e00000000000000000000050f1720282f353e434b5153565e616467696b6b6c6c6c6b696765615e5753514b433e352f281f170e0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a151e29323a424a50545c606467696b6c6c6c6c6b6967605d564c4135291d11040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d798693a0acaea398897c6f62544b4034281f1612101824313e4b5764717e8a97a4b1a4978a7e7164574b3e3124180b0000000000030e18222d36404a525b626a6f767d82868a8d8f919192929291908e8b88847e79716c655e564e463c342a20170c0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c79878686868686868074675a4e4134271b0e0000000000000000000000050d161e242931394045474c5254575a5c5e5f5f5f5f5e5c5a5854524d474540393129241d160d05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030c1720292f383f444a5053575a5d5e5f5f5f5f5e5d5b54524c443a2f24190d010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d798693a0acb4aa998d8073665c51453b3128201f1c1e26323f4c5965727f8c98a5b0a3968a7d7063574a3d3024170a00000000000a15202a343e48525c636d727c838a8f9299999c9d9e9f9f9f9e9d9b9895908b857e776d685f584e463c32291e150a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006121f2c3845525e6a7579797979797979746e64584c3f33261a0d000000000000000000000000040c13191f272f34383b4146474b4e4f515253535251504e4b4846423b38352f271f18130c040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050e171d262d33383f44464a4d50515253535251504e4745413a32281e1308000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d798693a0acb8ab9e9285796d60574d433a322d2c282a2d36424d576774818e9aa7b3aa95897c6f6256493c2f23160900000000030f1b26313c46505a636e737f8790949c9fa3aba8a5a3a1a1a1a3a5a7a7a09d97928b827a6f6a5f584e443b30261c11060000000000000000000000000000000000000000000000000000000000000000000000000000000000000004111d2a36424e59636a6c6c6c6c6c6c6c67645c52473c3024170b0000000000000000000000000001080d151d23292c3036393b3e414344454646454543413e3b3a36302c29241d150d070100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050b141c22282e34383a3d404344454646454543413a39352f2820160c01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d798693a0acb9ada1978b7e71695e554c443e3a3834363a3d46535e697784909daaaea298877a6e6154473b2e2114080000000006121f2b37434e58626c73808b92999fa6aca49f9c989695949596989c9fa4a9a19e948f847c6f6a5f564d42382e23170c03000000000000000000000000000000000000000000000000000000000000000000000000000000000000010e1a26313d4751595e5f6060606060605a58524a41362b1f1408000000000000000000000000000000030b12181c1f252a2d2e3134363838393939383634322e2d2a251f1d18120b0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020a11171c23282c2d31343638393939393836342d2c29241e160d0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d798693a0acb1a7a09d92857b6e675d56504846443f4246474f58616e7b8795a0acab9f928578685e5246392d201407000000000815212e3a47535f6a717e8b929fa3aba69f9a938f8c89888788898c90939a9ea6a69f9691857c6f695e544a3f34281f1409000000000000000000000000000000000000000000000000000000000000000000000000000000000000000915202b353f474e52535353535353534e4c4741382f241a0e030000000000000000000000000000000001070c1014191e20212427292b2c2c2c2c2b29272521201e1a14100c070100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060b11171c1f2024272a2b2c2c2c2c2b2a2821201d19130c040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d798693a0acaca09590959082796d68615a5553504a4d525459606a74808d9aa7b1a99c8f827669564d41362a1e11050000000713202c38444f59626f7c86929fa4afa49c948f87827f7c7b7a7b7c7f83878f949fa3a8a19791857b6e665c50443b31261a0e03000000000000000000000000000000000000000000000000000000000000000000000000000000000000040f19242d353d424546464646464646413f3c362f261d1308000000000000000000000000000000000000000004080e111414181b1c1e1f20201f1e1d1b181514120e0904000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060c101213171a1d1e1f20201f1e1d1b1413110d0801000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d798693a0acaa9d9084909490827a716c6562605c54565e61646b707c87929facb0a6998c7f7266594c3f3025190e020000000916222f3b4854606b76828f98a2aea49c928c827b7672706e6e6e7072767c828b9299a3a9a1979082786d60574d42362a20150a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000008121b242b313638393939393939393433302b241d140b0100000000000000000000000000000000000000000000020507080b0e10111213131212100e0b08070502000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000306070a0d10111213131212100e070704010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d798693a0aca396897d85929490847d76726e6d666b6b696e71757d859299a3afac9f94887b6e6155483b2e22150800000005111e2a36424d5663707d89949faaa79d928c80766e69656362616263656a6f767f879299a4a99f948c7f73695f53463c31261a0f010000000000000000000000000000000000000000000000000000000000000000000000000000000000000009121920262a2c2c2d2d2d2d2d2d2726241f1a130b0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0ada194887b7e8b9296918a837f7b79787778797a7d82889297a1abafa49a8f8276695f53473a2d2114080000000714202d3a46525e6976828f9ca6aca0958d80736e625f575655545556585f626d727e87939fa6a69f92867b6e61584e43372b1e13080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080f151a1d1f202020202020201b1a17140e08010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0ada194877b74818e949e95908c888685848585878a8f939aa1a9afa59f93877c6f62574d42372b1e12060000000814212e3b4754616e7b87939e9fa39d9083786d605b534d49484748494e535b626c727f8c949faba3988f82756a5f53473a2f24190d01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004090e1112131313131313130e0d0b080300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714212e3a4754616d7a8794a0b4ab94877a6d78828f939f9d989a939291919298979b9fa4acaba39f938d80736a6054453c31261a0e020000000c1926323f4c5965727f8c8f91929996897d70665c5047423d3b3b3b3d4347515a606c77828f99a3aa9f93877c6f62564c4135291d11040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a87949f9fa39986796d6d79818c92989fa29f9e9e9e9fa2aaa8a9aaa29f99928b81786d60584e43332a1f1509000000000a1723303d4a5663707d80828486888a84776b60544a3f37312f2e2f31373f44505b656e7b87929faca49a8e8174685d5245392c2013080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000815222e3b4855616e7b889393939392867966676d787f868d92989a9c9e9e9f9f9e9d9c9998928d877f746d665c50463d3221180e03000000000916222f3c4854606b70737577797b7d7d7063594f42382e26222122262b333f49535f6974818e9aa6ac9f92867a6d6054473a2f24190d0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000916232f3c4956626f7c86868686868685786b5c666c727b80858a8d8f9192929291908f8c8a86807b726d605c544a3f342b200f0600000000000714202c38444f5960636669666d6f71706b6054473d30262c2c2c2b2a222d38414d57626e7b88949faba3988b7e7265554c4135291d110400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000815222e3b4754606a6f797979797979787368545b60696e74797d808284858685858482807d7a746e69625b504a42382e22190f00000000000004101c27333d474f54565a545c6062646360594f44353638393939383734312f3c47535f6a76838f9ca9aa9c908376675d5145392c201306000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006131f2b37434e5860626c6c6c6c6c6c6b68615750575e61676d7073767778797978777673706d67615e5751443f3830261c1007000000000000000b16212b353d44484a4d4b5153555756544f473e4143454646464543413e3a39424e5765727e8b98a7ac9f92867a6d6054473a2d2114060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1b27323d464e54566060606060605f5c574f444d53555c606367696b6b6c6c6b6a696663605d55534d453f342e261e140a0000000000000000050f1a232b33383c3d40404546484a494845474a4d505152535252504e4b4746414754616e7a8795a0aca3998a7d7064574a3d2e23170b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a16202b343d43474953535353535352504c453b42464b5153575a5c5e5f5f5f5e5d5c595754514c46423b3328231c140c0200000000000000000008111a21272c2f302e34383a3c43474b5154575a5c5e5f5f5f5e5d5a5854524c48525e687784919daaab9a8d807467544a3f34281c10030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040f19222b32373b3c4646464646464544403a3136394045474a4d4f5152535252514f4d4a4745413a3631292117110a020000000000000000000000080f161c2022232a313a41454e53555d606467696b6c6c6c6b6a6764615d56544f566774818d9aa7a99c908376665c5044382b1f120600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007101920272b2e2f3939393939393837342f252a2f34383a3d404344454646454443403d3a39352f2a251f170f060000000000000000000000000000050b1019232b343c434c52585f62676d71747678797979787674716d686360595865717e8b98a4ac9f9285796d6053463a2d20130700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070f161b1f22232d2d2d2d2d2d2c2b28241a1d23292c2d3034363838393938373633302d2c29241e1a140d05000000000000000000000000000000050e19222b353d464e565d606a6f747a7d8083848586858583817e7a76706b625f626f7c8995aaaea298887b6e6255483b2f2215080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040a0f1315162020202020201f1e1c180e12181c1f202427292b2c2c2c2b2a29262421201d19130e0903000000000000000000000000000000020c17202b343d474f585f686d747c81868a8d8f9192929291908d8b86827d766f6a616d7a8798a2aeaa968a7d7063574a3d3024170a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000306080913131313131312110f0c01070c101314171a1c1e1f201f1f1e1c1a171413110d0801000000000000000000000000000000000008131e29323d464f59606a6f7a81878e92989a9c9e9f9f9f9e9d9a99928f89837c726d687885929faba5988b7f7265584c3f3225190c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060606060606050503000000000406070a0d10111213131211100d0a07060401000000000000000000000000000000000000010d1925303a444e58606b707c848e939a9fa2aaa9a8a4aba39fa3aba39f9c9490877f746d7784919daaa69a8d8073675a4d4034271a0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005111d2a36414c56606a707d8691969fa4acaaa29f9b979599929994979a9e9f99928c81787683909ca9a79b8e8174685b4e4135281b0e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040f19232d3946525e686f7c869298a1a8aba39f98928e8a88878686888a8e92979f9f938d8075828f9ba8a89c8f8275695c4f4236291c0f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a16212c38444f59616d7a849198a2aaaaa299928d85817d7b7a79797b7d81858b92979d928a7e818e9ba7a99d9083766a5d5043372a1d100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1b27323c4855606b75818e96a1aaaaa2989287807a75716e6d676d6e7074797f858f949e9185818e9ba8aa9d9084776a5d5144372a1e11000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007131f2c38444f5963707d89939ea8aea29892867d746d686462605d606164676d727a828e93979185929facaa9e9184776b5e5144382b1e1100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000915222f3b4854606b7683909da5afa69f92867d706b605d565554515355555d60686d78818e94989298a2aeab9e9184786b5e5145382b1e1200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1c28333f4a54636f7c89959fabab9f948b7e716a6059524c48474546484b51565e666d788290989fa2aab4ab9e9185786b5e5245382b1f120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006121f2b3844505b6674818e9ba7b1a79c8f82766c62584f45413b3a393a3b40454c545c666e7b86929facb4b7ab9e9184786b5e5145382b1e12000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202d394653606c7985929eabaca095897c6f635a50463d35302d2c2d2f353a424a545e6973808d9aa4afb7aa9e9184776b5e5144382b1e11000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000916232f3c4956626f7c8997a2adaa9d9083776b6054483f34292421202024293039424d57616e7b87939facb7aa9d9184776a5e5144372b1e11000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b98a9b3ab998c7f7266594f43362d2219141313181e27303b46525e697683909da9b6aa9d9083776a5d5044372a1d11000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e1b2834414e5b6774818e9aa7afa399897c6f6356493d32231b100806070c151e2a36424d576774808d9aa7b3a99c8f8276695c4f4336291c1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101d293643505c6976838f9ca9ac9f92867a6d6053473a2d201407000000030c1a25303f4b5865727e8b98a5b1a89b8e8275685b4f4235281c0f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111e2b3744515e6a7784919daaab9e918578675d5145392c1f130600000000091724313e4a5764717d8a97a4b0a79a8d8174675a4e4134271b0e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000121f2b3845525e6b7885919eabaa9d9084776a554b4035291d1004000000000b1824313e4b5764717e8a97a4b1a5998c7f7266594c3f3326190c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000121f2c3945525f6c7885929faba99c908376695d50432f24180c00000000000c1825323f4b5865727e8b98a5b5ab978a7e7164574a3e3124170b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000121f2c3945525f6c7885929faba99c908376695d50432f24180d01000000000c1926333f4c5966727f8c99a5afa399887c6f6255493c2f22160900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000121f2b3845525e6b7885919eabaa9d9084776a554b4035291d1004000000030f1b27333f49536773808d9aa6ac9f92867a6d6053473a2d20140700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111e2b3744515e6a7784919daaab9e918578675d5145392c20130600000005121f2b3744505b6576838f9ca9aa9d908477675d5145382c1f130600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101d293643505c6976838f9ca9ac9f92867a6d6053473a2d20140a0000000613202d394653606c7985929fabac9b8e817468554b4035291d1004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e1b2834414e5b6774818e9aa7afa399897c706356493d30261c110a080a111c28343f4a54626f7c8898a2aea49a8a7e7164574b3e2f24180c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1825323f4b5865727e8b98a9b2ab998c7f7266594f42382e231a1615141c232c3844505c6673808d9aaaac9f93877a6e6154473b2e21140700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000916222f3c4955626f7c8897a1adaa9d9184776b60544a3f342b26232222262e35414c56606d7985919eabaa9d908376685e5246392d20140700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202d394653606c7884919eabaca095897d70665c50443f37312f2e2f30383f46525e68717e8b97a1ada3988b7e7265564c41362a1e1105000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005121f2b3744505b6574808d9aa6b0a89d9083786d605a5047433d3c3b3c3d424a505b616d7a85929ea9ab9f92867a6d6154473b3025190d010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1b27333f4953626f7c88949eabab9f958c7f726c625a534e4a4948484a4e545c606d75818e97a1ada3998d8074685d524639291e1408000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b17222d3847535f6a75828f99a3afa79f92877e716c625f5857565555575860666d737f8c939ea9a89f92867b6e61564c413529170d020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006111b2b37434e58626f7c87929fa6aea39992877e766f6a666462616263666a6f78808c919ca5aaa0968c8073695e53443a302419050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f1b26313c47535f6a73808c949fa7aba399928b827c7773706f6e6f7073777c838d929ca3aba2989184796d60574d4232281e13080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a15202b37434e58606d78828f959fa6aba39f948f8883807d7c7b7b7d7f838990959ca4aba39992867c6f675d51453b3120160c02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1b26313c44505c666d7a8390949fa4aca69f9c95908c8a8988888a8c90959d9fa7a9a19992877e716a5f554b4033291f0e0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a152028343f4a545d686d7a828d939a9fa6aba7a09d999795949596999d9fa7aba39f9691877e716c61584e43392f21170d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030c17232e38424c565d686d78808790949b9fa2aaa8a6a3a2a1a2a3a6a8aaa29f99928d847d716c615a50463c31271d0f050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006111c26303a434c565d666d737c83898e9298999b9d9e9f9f9f9e9d9b9998928d87817a6f6b615a50483e342a1f150b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a151e28313a444c545c606a6f767c8185898c8e909192929292918f8c8985807b746d68605950483e362c22180d03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030c161f28323a424a515860626b6f75797c7f828385858685858482807c79746e6a615e564f473e362c241a10060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040d162028303940444e54596063666d707275767879797978777573706d66625f57524c443d352c241a120800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040d161e272e343d43474f54545c606366686a6b6c6c6c6b6a686663605c54534e46413a322b231a1208000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040c151c232832373d43484b515356595b5d5e5f5f5f5f5e5c595653514b47423c363028201910080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b121820272b323839404546494c4f505252535252514f4d494645403937312a251e160e070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070c151b21272c2e34383a3d3f424345464646454442403d3a38342e2b262019130c0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040a0f161b1d23282c2d303335373839393938373533302d2c28231d1a150d080200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040a0f12181c1f202326282a2b2c2c2c2c2b292623201f1c18120e0903000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070c10131316191c1d1f1f201f1f1e1c1a161313100c0700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000406070a0c0f101213131312110f0d0a0706040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + image data: 0 + _typelessdata: m_StreamData: serializedVersion: 2 offset: 0 diff --git a/Assets/users.json b/Assets/users.json deleted file mode 100644 index 860dd71..0000000 --- a/Assets/users.json +++ /dev/null @@ -1 +0,0 @@ -{"currentUserIndex":0,"storedUsers":[{"username":"testkonijn","avatar":{"instanceID":0},"playtime":0.0,"courses":[{"entries":[{"key":"courseIndex","bytes":[0,1,0,0,0,255,255,255,255,1,0,0,0,0,0,0,0,12,2,0,0,0,70,65,115,115,101,109,98,108,121,45,67,83,104,97,114,112,44,32,86,101,114,115,105,111,110,61,48,46,48,46,48,46,48,44,32,67,117,108,116,117,114,101,61,110,101,117,116,114,97,108,44,32,80,117,98,108,105,99,75,101,121,84,111,107,101,110,61,110,117,108,108,5,1,0,0,0,11,67,111,117,114,115,101,73,110,100,101,120,1,0,0,0,7,118,97,108,117,101,95,95,0,8,2,0,0,0,0,0,0,0,11]},{"key":"courseProgress","bytes":[0,1,0,0,0,255,255,255,255,1,0,0,0,0,0,0,0,4,1,0,0,0,13,83,121,115,116,101,109,46,83,105,110,103,108,101,1,0,0,0,7,109,95,118,97,108,117,101,0,11,205,204,76,62,11]}]}],"minigames":[{"entries":[{"key":"minigameIndex","bytes":[0,1,0,0,0,255,255,255,255,1,0,0,0,0,0,0,0,12,2,0,0,0,70,65,115,115,101,109,98,108,121,45,67,83,104,97,114,112,44,32,86,101,114,115,105,111,110,61,48,46,48,46,48,46,48,44,32,67,117,108,116,117,114,101,61,110,101,117,116,114,97,108,44,32,80,117,98,108,105,99,75,101,121,84,111,107,101,110,61,110,117,108,108,5,1,0,0,0,13,77,105,110,105,103,97,109,101,73,110,100,101,120,1,0,0,0,7,118,97,108,117,101,95,95,0,8,2,0,0,0,0,0,0,0,11]},{"key":"highscore","bytes":[0,1,0,0,0,255,255,255,255,1,0,0,0,0,0,0,0,4,1,0,0,0,12,83,121,115,116,101,109,46,73,110,116,51,50,1,0,0,0,7,109,95,118,97,108,117,101,0,8,0,0,0,0,11]},{"key":"scores","bytes":[0,1,0,0,0,255,255,255,255,1,0,0,0,0,0,0,0,12,2,0,0,0,70,65,115,115,101,109,98,108,121,45,67,83,104,97,114,112,44,32,86,101,114,115,105,111,110,61,48,46,48,46,48,46,48,44,32,67,117,108,116,117,114,101,61,110,101,117,116,114,97,108,44,32,80,117,98,108,105,99,75,101,121,84,111,107,101,110,61,110,117,108,108,4,1,0,0,0,129,1,83,121,115,116,101,109,46,67,111,108,108,101,99,116,105,111,110,115,46,71,101,110,101,114,105,99,46,76,105,115,116,96,49,91,91,71,97,109,101,67,111,110,116,114,111,108,108,101,114,43,83,99,111,114,101,44,32,65,115,115,101,109,98,108,121,45,67,83,104,97,114,112,44,32,86,101,114,115,105,111,110,61,48,46,48,46,48,46,48,44,32,67,117,108,116,117,114,101,61,110,101,117,116,114,97,108,44,32,80,117,98,108,105,99,75,101,121,84,111,107,101,110,61,110,117,108,108,93,93,3,0,0,0,6,95,105,116,101,109,115,5,95,115,105,122,101,8,95,118,101,114,115,105,111,110,4,0,0,22,71,97,109,101,67,111,110,116,114,111,108,108,101,114,43,83,99,111,114,101,91,93,2,0,0,0,8,8,9,3,0,0,0,10,0,0,0,10,0,0,0,7,3,0,0,0,0,1,0,0,0,10,0,0,0,4,20,71,97,109,101,67,111,110,116,114,111,108,108,101,114,43,83,99,111,114,101,2,0,0,0,9,4,0,0,0,9,5,0,0,0,9,6,0,0,0,9,7,0,0,0,9,8,0,0,0,9,9,0,0,0,9,10,0,0,0,9,11,0,0,0,9,12,0,0,0,9,13,0,0,0,5,4,0,0,0,20,71,97,109,101,67,111,110,116,114,111,108,108,101,114,43,83,99,111,114,101,2,0,0,0,10,115,99,111,114,101,86,97,108,117,101,4,116,105,109,101,0,1,8,2,0,0,0,153,0,0,0,6,14,0,0,0,19,49,48,47,48,51,47,50,48,50,51,32,49,53,58,51,56,58,53,54,1,5,0,0,0,4,0,0,0,17,0,0,0,6,15,0,0,0,19,49,48,47,48,51,47,50,48,50,51,32,49,53,58,51,57,58,53,48,1,6,0,0,0,4,0,0,0,16,0,0,0,6,16,0,0,0,19,49,48,47,48,51,47,50,48,50,51,32,49,55,58,53,51,58,50,50,1,7,0,0,0,4,0,0,0,14,0,0,0,6,17,0,0,0,19,49,48,47,48,51,47,50,48,50,51,32,49,55,58,53,49,58,51,49,1,8,0,0,0,4,0,0,0,12,0,0,0,6,18,0,0,0,19,49,48,47,48,51,47,50,48,50,51,32,49,55,58,50,55,58,48,55,1,9,0,0,0,4,0,0,0,11,0,0,0,6,19,0,0,0,19,49,48,47,48,51,47,50,48,50,51,32,49,53,58,51,51,58,53,48,1,10,0,0,0,4,0,0,0,11,0,0,0,6,20,0,0,0,19,49,48,47,48,51,47,50,48,50,51,32,49,54,58,50,49,58,52,55,1,11,0,0,0,4,0,0,0,11,0,0,0,6,21,0,0,0,19,49,48,47,48,51,47,50,48,50,51,32,49,55,58,51,54,58,50,56,1,12,0,0,0,4,0,0,0,9,0,0,0,6,22,0,0,0,19,49,48,47,48,51,47,50,48,50,51,32,49,55,58,51,48,58,49,56,1,13,0,0,0,4,0,0,0,8,0,0,0,6,23,0,0,0,19,49,48,47,48,51,47,50,48,50,51,32,49,54,58,50,49,58,50,54,11]}]}]}]} \ No newline at end of file diff --git a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/CalculatorGraphTest.cs b/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/CalculatorGraphTest.cs deleted file mode 100644 index 330391a..0000000 --- a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/CalculatorGraphTest.cs +++ /dev/null @@ -1,167 +0,0 @@ -// Copyright (c) 2021 homuler -// -// Use of this source code is governed by an MIT-style -// license that can be found in the LICENSE file or at -// https://opensource.org/licenses/MIT. - -using NUnit.Framework; - -namespace Mediapipe.Tests -{ - public class CalculatorGraphTest - { - private const string _ValidConfigText = @"node { - calculator: ""PassThroughCalculator"" - input_stream: ""in"" - output_stream: ""out1"" -} -node { - calculator: ""PassThroughCalculator"" - input_stream: ""out1"" - output_stream: ""out"" -} -input_stream: ""in"" -output_stream: ""out"" -"; - - #region Constructor - [Test] - public void Ctor_ShouldInstantiateCalculatorGraph_When_CalledWithNoArguments() - { - Assert.DoesNotThrow(() => - { - var graph = new CalculatorGraph(); - graph.Dispose(); - }); - } - - [Test] - public void Ctor_ShouldInstantiateCalculatorGraph_When_CalledWithConfigText() - { - using (var graph = new CalculatorGraph(_ValidConfigText)) - { - var config = graph.Config(); - Assert.AreEqual("in", config.InputStream[0]); - Assert.AreEqual("out", config.OutputStream[0]); - } - } - #endregion - - #region #isDisposed - [Test] - public void IsDisposed_ShouldReturnFalse_When_NotDisposedYet() - { - using (var graph = new CalculatorGraph()) - { - Assert.False(graph.isDisposed); - } - } - - [Test] - public void IsDisposed_ShouldReturnTrue_When_AlreadyDisposed() - { - var graph = new CalculatorGraph(); - graph.Dispose(); - - Assert.True(graph.isDisposed); - } - #endregion - - #region #Initialize - [Test] - public void Initialize_ShouldReturnOk_When_CalledWithConfig_And_ConfigIsNotSet() - { - using (var graph = new CalculatorGraph()) - { - using (var status = graph.Initialize(CalculatorGraphConfig.Parser.ParseFromTextFormat(_ValidConfigText))) - { - Assert.True(status.Ok()); - } - - var config = graph.Config(); - Assert.AreEqual("in", config.InputStream[0]); - Assert.AreEqual("out", config.OutputStream[0]); - } - } - - [Test] - public void Initialize_ShouldReturnInternalError_When_CalledWithConfig_And_ConfigIsSet() - { - using (var graph = new CalculatorGraph(_ValidConfigText)) - { - using (var status = graph.Initialize(CalculatorGraphConfig.Parser.ParseFromTextFormat(_ValidConfigText))) - { - Assert.AreEqual(Status.StatusCode.Internal, status.Code()); - } - } - } - - [Test] - public void Initialize_ShouldReturnOk_When_CalledWithConfigAndSidePacket_And_ConfigIsNotSet() - { - using (var sidePacket = new SidePacket()) - { - sidePacket.Emplace("flag", new BoolPacket(true)); - - using (var graph = new CalculatorGraph()) - { - var config = CalculatorGraphConfig.Parser.ParseFromTextFormat(_ValidConfigText); - - using (var status = graph.Initialize(config, sidePacket)) - { - Assert.True(status.Ok()); - } - } - } - } - - [Test] - public void Initialize_ShouldReturnInternalError_When_CalledWithConfigAndSidePacket_And_ConfigIsSet() - { - using (var sidePacket = new SidePacket()) - { - sidePacket.Emplace("flag", new BoolPacket(true)); - - using (var graph = new CalculatorGraph(_ValidConfigText)) - { - var config = CalculatorGraphConfig.Parser.ParseFromTextFormat(_ValidConfigText); - - using (var status = graph.Initialize(config, sidePacket)) - { - Assert.AreEqual(Status.StatusCode.Internal, status.Code()); - } - } - } - } - #endregion - - #region lifecycle - [Test] - public void LifecycleMethods_ShouldControlGraphLifeCycle() - { - using (var graph = new CalculatorGraph(_ValidConfigText)) - { - Assert.True(graph.StartRun().Ok()); - Assert.False(graph.GraphInputStreamsClosed()); - - Assert.True(graph.WaitUntilIdle().Ok()); - Assert.True(graph.CloseAllPacketSources().Ok()); - Assert.True(graph.GraphInputStreamsClosed()); - Assert.True(graph.WaitUntilDone().Ok()); - Assert.False(graph.HasError()); - } - } - - [Test] - public void Cancel_ShouldCancelGraph() - { - using (var graph = new CalculatorGraph(_ValidConfigText)) - { - Assert.True(graph.StartRun().Ok()); - graph.Cancel(); - Assert.AreEqual(Status.StatusCode.Cancelled, graph.WaitUntilDone().Code()); - } - } - #endregion - } -} diff --git a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/CalculatorGraphTest.cs.meta b/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/CalculatorGraphTest.cs.meta deleted file mode 100644 index 86978b8..0000000 --- a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/CalculatorGraphTest.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 083c8421f4820d09290f0de495a23ec2 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Format/ImageFrameTest.cs b/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Format/ImageFrameTest.cs deleted file mode 100644 index 7fd102e..0000000 --- a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Format/ImageFrameTest.cs +++ /dev/null @@ -1,256 +0,0 @@ -// Copyright (c) 2021 homuler -// -// Use of this source code is governed by an MIT-style -// license that can be found in the LICENSE file or at -// https://opensource.org/licenses/MIT. - -using NUnit.Framework; -using System; -using System.Linq; -using Unity.Collections; - -namespace Mediapipe.Tests -{ - public class ImageFrameTest - { - #region Constructor - [Test] - public void Ctor_ShouldInstantiateImageFrame_When_CalledWithNoArguments() - { - using (var imageFrame = new ImageFrame()) - { - Assert.AreEqual(ImageFormat.Types.Format.Unknown, imageFrame.Format()); - Assert.AreEqual(0, imageFrame.Width()); - Assert.AreEqual(0, imageFrame.Height(), 0); - Assert.AreEqual(0, imageFrame.ChannelSize()); - Assert.AreEqual(0, imageFrame.NumberOfChannels()); - Assert.AreEqual(0, imageFrame.ByteDepth()); - Assert.AreEqual(0, imageFrame.WidthStep()); - Assert.AreEqual(0, imageFrame.PixelDataSize()); - Assert.AreEqual(0, imageFrame.PixelDataSizeStoredContiguously()); - Assert.True(imageFrame.IsEmpty()); - Assert.False(imageFrame.IsContiguous()); - Assert.False(imageFrame.IsAligned(16)); - Assert.AreEqual(IntPtr.Zero, imageFrame.MutablePixelData()); - } - } - - [Test] - public void Ctor_ShouldInstantiateImageFrame_When_CalledWithFormat() - { - using (var imageFrame = new ImageFrame(ImageFormat.Types.Format.Sbgra, 640, 480)) - { - Assert.AreEqual(ImageFormat.Types.Format.Sbgra, imageFrame.Format()); - Assert.AreEqual(640, imageFrame.Width()); - Assert.AreEqual(480, imageFrame.Height()); - Assert.AreEqual(1, imageFrame.ChannelSize()); - Assert.AreEqual(4, imageFrame.NumberOfChannels()); - Assert.AreEqual(1, imageFrame.ByteDepth()); - Assert.AreEqual(640 * 4, imageFrame.WidthStep()); - Assert.AreEqual(640 * 480 * 4, imageFrame.PixelDataSize()); - Assert.AreEqual(640 * 480 * 4, imageFrame.PixelDataSizeStoredContiguously()); - Assert.False(imageFrame.IsEmpty()); - Assert.True(imageFrame.IsContiguous()); - Assert.True(imageFrame.IsAligned(16)); - Assert.AreNotEqual(IntPtr.Zero, imageFrame.MutablePixelData()); - } - } - - [Test] - public void Ctor_ShouldInstantiateImageFrame_When_CalledWithFormatAndAlignmentBoundary() - { - using (var imageFrame = new ImageFrame(ImageFormat.Types.Format.Gray8, 100, 100, 8)) - { - Assert.AreEqual(100, imageFrame.Width()); - Assert.AreEqual(1, imageFrame.NumberOfChannels()); - Assert.AreEqual(104, imageFrame.WidthStep()); - } - } - - [Test] - public void Ctor_ShouldInstantiateImageFrame_When_CalledWithPixelData() - { - var pixelData = new NativeArray(32, Allocator.Temp, NativeArrayOptions.UninitializedMemory); - var srcBytes = new byte[] { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - }; - pixelData.CopyFrom(srcBytes); - - using (var imageFrame = new ImageFrame(ImageFormat.Types.Format.Sbgra, 4, 2, 16, pixelData)) - { - Assert.AreEqual(4, imageFrame.Width()); - Assert.AreEqual(2, imageFrame.Height()); - Assert.False(imageFrame.IsEmpty()); - - var bytes = new byte[32]; - imageFrame.CopyToBuffer(bytes); - Assert.IsEmpty(bytes.Where((x, i) => x != srcBytes[i])); - } - } - - [Test, SignalAbort] - public void Ctor_ShouldThrowMediaPipeException_When_CalledWithInvalidArgument() - { -#pragma warning disable IDE0058 - Assert.Throws(() => { new ImageFrame(ImageFormat.Types.Format.Sbgra, 640, 480, 0); }); -#pragma warning restore IDE0058 - } - #endregion - - #region #isDisposed - [Test] - public void IsDisposed_ShouldReturnFalse_When_NotDisposedYet() - { - using (var imageFrame = new ImageFrame()) - { - Assert.False(imageFrame.isDisposed); - } - } - - [Test] - public void IsDisposed_ShouldReturnTrue_When_AlreadyDisposed() - { - var imageFrame = new ImageFrame(); - imageFrame.Dispose(); - - Assert.True(imageFrame.isDisposed); - } - #endregion - - #region #SetToZero - [Test] - public void SetToZero_ShouldSetZeroToAllBytes() - { - using (var imageFrame = new ImageFrame(ImageFormat.Types.Format.Gray8, 10, 10)) - { - imageFrame.SetToZero(); - var bytes = new byte[100]; - imageFrame.CopyToBuffer(bytes); - Assert.True(bytes.All((x) => x == 0)); - } - } - #endregion - - #region #SetAlignmentPaddingAreas - [Test] - public void SetAlignmentPaddingAreas_ShouldNotThrow() - { - using (var imageFrame = new ImageFrame(ImageFormat.Types.Format.Gray8, 10, 10, 16)) - { - Assert.DoesNotThrow(() => { imageFrame.SetAlignmentPaddingAreas(); }); - } - } - #endregion - - #region CopyToBuffer - [Test, SignalAbort] - public void CopyToByteBuffer_ShouldThrowException_When_BufferDepthIsWrong() - { - using (var imageFrame = new ImageFrame(ImageFormat.Types.Format.Gray16, 10, 10)) - { -#pragma warning disable IDE0058 - Assert.Throws(() => { imageFrame.CopyToBuffer(new byte[100]); }); -#pragma warning restore IDE0058 - } - } - - [Test] - public void CopyToByteBuffer_ShouldReturnByteArray_When_BufferSizeIsLargeEnough() - { - using (var imageFrame = new ImageFrame(ImageFormat.Types.Format.Gray8, 10, 10)) - { - var normalBuffer = new byte[100]; - var largeBuffer = new byte[120]; - imageFrame.CopyToBuffer(normalBuffer); - imageFrame.CopyToBuffer(largeBuffer); - - Assert.IsEmpty(normalBuffer.Where((x, i) => x != largeBuffer[i])); - } - } - - [Test, SignalAbort] - public void CopyToByteBuffer_ShouldThrowException_When_BufferSizeIsTooSmall() - { - using (var imageFrame = new ImageFrame(ImageFormat.Types.Format.Gray8, 10, 10)) - { -#pragma warning disable IDE0058 - Assert.Throws(() => { imageFrame.CopyToBuffer(new byte[99]); }); -#pragma warning restore IDE0058 - } - } - - [Test, SignalAbort] - public void CopyToUshortBuffer_ShouldThrowException_When_BufferDepthIsWrong() - { - using (var imageFrame = new ImageFrame(ImageFormat.Types.Format.Gray8, 10, 10)) - { -#pragma warning disable IDE0058 - Assert.Throws(() => { imageFrame.CopyToBuffer(new ushort[100]); }); -#pragma warning restore IDE0058 - } - } - - [Test] - public void CopyToUshortBuffer_ShouldReturnUshortArray_When_BufferSizeIsLargeEnough() - { - using (var imageFrame = new ImageFrame(ImageFormat.Types.Format.Gray16, 10, 10)) - { - var normalBuffer = new ushort[100]; - var largeBuffer = new ushort[120]; - imageFrame.CopyToBuffer(normalBuffer); - imageFrame.CopyToBuffer(largeBuffer); - - Assert.IsEmpty(normalBuffer.Where((x, i) => x != largeBuffer[i])); - } - } - - [Test, SignalAbort] - public void CopyToUshortBuffer_ShouldThrowException_When_BufferSizeIsTooSmall() - { - using (var imageFrame = new ImageFrame(ImageFormat.Types.Format.Gray16, 10, 10)) - { -#pragma warning disable IDE0058 - Assert.Throws(() => { imageFrame.CopyToBuffer(new ushort[99]); }); -#pragma warning restore IDE0058 - } - } - - [Test, SignalAbort] - public void CopyToFloatBuffer_ShouldThrowException_When_BufferDepthIsWrong() - { - using (var imageFrame = new ImageFrame(ImageFormat.Types.Format.Gray8, 10, 10)) - { -#pragma warning disable IDE0058 - Assert.Throws(() => { imageFrame.CopyToBuffer(new float[100]); }); -#pragma warning restore IDE0058 - } - } - - [Test] - public void CopyToFloatBuffer_ShouldReturnFloatArray_When_BufferSizeIsLargeEnough() - { - using (var imageFrame = new ImageFrame(ImageFormat.Types.Format.Vec32F1, 10, 10)) - { - var normalBuffer = new float[100]; - var largeBuffer = new float[120]; - imageFrame.CopyToBuffer(normalBuffer); - imageFrame.CopyToBuffer(largeBuffer); - - Assert.IsEmpty(normalBuffer.Where((x, i) => Math.Abs(x - largeBuffer[i]) > 1e-9)); - } - } - - [Test, SignalAbort] - public void CopyToFloatBuffer_ShouldThrowException_When_BufferSizeIsTooSmall() - { - using (var imageFrame = new ImageFrame(ImageFormat.Types.Format.Vec32F1, 10, 10)) - { -#pragma warning disable IDE0058 - Assert.Throws(() => { imageFrame.CopyToBuffer(new float[99]); }); -#pragma warning restore IDE0058 - } - } - #endregion - } -} diff --git a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Format/ImageFrameTest.cs.meta b/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Format/ImageFrameTest.cs.meta deleted file mode 100644 index bbb222f..0000000 --- a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Format/ImageFrameTest.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: efccb8a8c7f87c9629872169190107db -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Packet/BoolPacketTest.cs b/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Packet/BoolPacketTest.cs deleted file mode 100644 index 54e34bd..0000000 --- a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Packet/BoolPacketTest.cs +++ /dev/null @@ -1,132 +0,0 @@ -// Copyright (c) 2021 homuler -// -// Use of this source code is governed by an MIT-style -// license that can be found in the LICENSE file or at -// https://opensource.org/licenses/MIT. - -using NUnit.Framework; -using System; - -namespace Mediapipe.Tests -{ - public class BoolPacketTest - { - #region Constructor - [Test, SignalAbort] - public void Ctor_ShouldInstantiatePacket_When_CalledWithNoArguments() - { - using (var packet = new BoolPacket()) - { -#pragma warning disable IDE0058 - Assert.AreEqual(Status.StatusCode.Internal, packet.ValidateAsType().Code()); - Assert.Throws(() => { packet.Get(); }); - Assert.AreEqual(Timestamp.Unset(), packet.Timestamp()); -#pragma warning restore IDE0058 - } - - } - - [Test] - public void Ctor_ShouldInstantiatePacket_When_CalledWithTrue() - { - using (var packet = new BoolPacket(true)) - { - Assert.True(packet.ValidateAsType().Ok()); - Assert.True(packet.Get()); - Assert.AreEqual(Timestamp.Unset(), packet.Timestamp()); - } - } - - [Test] - public void Ctor_ShouldInstantiatePacket_When_CalledWithFalse() - { - using (var packet = new BoolPacket(false)) - { - Assert.True(packet.ValidateAsType().Ok()); - Assert.False(packet.Get()); - Assert.AreEqual(Timestamp.Unset(), packet.Timestamp()); - } - } - - [Test] - public void Ctor_ShouldInstantiatePacket_When_CalledWithValueAndTimestamp() - { - using (var timestamp = new Timestamp(1)) - { - using (var packet = new BoolPacket(true, timestamp)) - { - Assert.True(packet.ValidateAsType().Ok()); - Assert.True(packet.Get()); - Assert.AreEqual(timestamp, packet.Timestamp()); - } - } - } - #endregion - - #region #isDisposed - [Test] - public void IsDisposed_ShouldReturnFalse_When_NotDisposedYet() - { - using (var packet = new BoolPacket()) - { - Assert.False(packet.isDisposed); - } - } - - [Test] - public void IsDisposed_ShouldReturnTrue_When_AlreadyDisposed() - { - var packet = new BoolPacket(); - packet.Dispose(); - - Assert.True(packet.isDisposed); - } - #endregion - - #region #At - [Test] - public void At_ShouldReturnNewPacketWithTimestamp() - { - using (var timestamp = new Timestamp(1)) - { - var packet = new BoolPacket(true).At(timestamp); - Assert.True(packet.Get()); - Assert.AreEqual(timestamp, packet.Timestamp()); - - using (var newTimestamp = new Timestamp(2)) - { - var newPacket = packet.At(newTimestamp); - Assert.True(newPacket.Get()); - Assert.AreEqual(newTimestamp, newPacket.Timestamp()); - } - - Assert.AreEqual(timestamp, packet.Timestamp()); - } - } - #endregion - - #region #Consume - [Test] - public void Consume_ShouldThrowNotSupportedException() - { - using (var packet = new BoolPacket()) - { -#pragma warning disable IDE0058 - Assert.Throws(() => { packet.Consume(); }); -#pragma warning restore IDE0058 - } - } - #endregion - - #region #ValidateAsType - [Test] - public void ValidateAsType_ShouldReturnOk_When_ValueIsSet() - { - using (var packet = new BoolPacket(true)) - { - Assert.True(packet.ValidateAsType().Ok()); - } - } - #endregion - } -} diff --git a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Packet/BoolPacketTest.cs.meta b/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Packet/BoolPacketTest.cs.meta deleted file mode 100644 index 929637a..0000000 --- a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Packet/BoolPacketTest.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: b59151b6708d204ee970450f8028d00b -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Packet/FloatArrayPacketTest.cs b/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Packet/FloatArrayPacketTest.cs deleted file mode 100644 index 0ece68f..0000000 --- a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Packet/FloatArrayPacketTest.cs +++ /dev/null @@ -1,137 +0,0 @@ -// Copyright (c) 2021 homuler -// -// Use of this source code is governed by an MIT-style -// license that can be found in the LICENSE file or at -// https://opensource.org/licenses/MIT. - -using NUnit.Framework; -using System; - -namespace Mediapipe.Tests -{ - public class FloatArrayPacketTest - { - #region Constructor - [Test, SignalAbort] - public void Ctor_ShouldInstantiatePacket_When_CalledWithNoArguments() - { - using (var packet = new FloatArrayPacket()) - { -#pragma warning disable IDE0058 - packet.length = 0; - Assert.AreEqual(Status.StatusCode.Internal, packet.ValidateAsType().Code()); - Assert.Throws(() => { packet.Get(); }); - Assert.AreEqual(Timestamp.Unset(), packet.Timestamp()); -#pragma warning restore IDE0058 - } - } - - [Test] - public void Ctor_ShouldInstantiatePacket_When_CalledWithEmptyArray() - { - float[] array = { }; - using (var packet = new FloatArrayPacket(array)) - { - Assert.True(packet.ValidateAsType().Ok()); - Assert.AreEqual(array, packet.Get()); - Assert.AreEqual(Timestamp.Unset(), packet.Timestamp()); - } - } - - [Test] - public void Ctor_ShouldInstantiatePacket_When_CalledWithArray() - { - float[] array = { 0.01f }; - using (var packet = new FloatArrayPacket(array)) - { - Assert.True(packet.ValidateAsType().Ok()); - Assert.AreEqual(array, packet.Get()); - Assert.AreEqual(Timestamp.Unset(), packet.Timestamp()); - } - } - - [Test] - public void Ctor_ShouldInstantiatePacket_When_CalledWithValueAndTimestamp() - { - float[] array = { 0.01f, 0.02f }; - using (var timestamp = new Timestamp(1)) - { - using (var packet = new FloatArrayPacket(array, timestamp)) - { - Assert.True(packet.ValidateAsType().Ok()); - Assert.AreEqual(array, packet.Get()); - Assert.AreEqual(timestamp, packet.Timestamp()); - } - } - } - #endregion - - #region #isDisposed - [Test] - public void IsDisposed_ShouldReturnFalse_When_NotDisposedYet() - { - using (var packet = new FloatArrayPacket()) - { - Assert.False(packet.isDisposed); - } - } - - [Test] - public void IsDisposed_ShouldReturnTrue_When_AlreadyDisposed() - { - var packet = new FloatArrayPacket(); - packet.Dispose(); - - Assert.True(packet.isDisposed); - } - #endregion - - #region #At - [Test] - public void At_ShouldReturnNewPacketWithTimestamp() - { - using (var timestamp = new Timestamp(1)) - { - float[] array = { 0.0f }; - var packet = new FloatArrayPacket(array).At(timestamp); - Assert.AreEqual(array, packet.Get()); - Assert.AreEqual(timestamp, packet.Timestamp()); - - using (var newTimestamp = new Timestamp(2)) - { - var newPacket = packet.At(newTimestamp); - Assert.AreEqual(array, newPacket.Get()); - Assert.AreEqual(newTimestamp, newPacket.Timestamp()); - } - - Assert.AreEqual(timestamp, packet.Timestamp()); - } - } - #endregion - - #region #Consume - [Test] - public void Consume_ShouldThrowNotSupportedException() - { - using (var packet = new FloatArrayPacket()) - { -#pragma warning disable IDE0058 - Assert.Throws(() => { packet.Consume(); }); -#pragma warning restore IDE0058 - } - } - #endregion - - #region #ValidateAsType - [Test] - public void ValidateAsType_ShouldReturnOk_When_ValueIsSet() - { - float[] array = { 0.01f }; - using (var packet = new FloatArrayPacket(array)) - { - Assert.True(packet.ValidateAsType().Ok()); - } - } - #endregion - } -} diff --git a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Packet/FloatArrayPacketTest.cs.meta b/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Packet/FloatArrayPacketTest.cs.meta deleted file mode 100644 index 4eb5dcc..0000000 --- a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Packet/FloatArrayPacketTest.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 43430c0ef642804f9a6347fce4ec497a -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Packet/FloatPacketTest.cs b/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Packet/FloatPacketTest.cs deleted file mode 100644 index 45d3300..0000000 --- a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Packet/FloatPacketTest.cs +++ /dev/null @@ -1,120 +0,0 @@ -// Copyright (c) 2021 homuler -// -// Use of this source code is governed by an MIT-style -// license that can be found in the LICENSE file or at -// https://opensource.org/licenses/MIT. - -using NUnit.Framework; -using System; - -namespace Mediapipe.Tests -{ - public class FloatPacketTest - { - #region Constructor - [Test, SignalAbort] - public void Ctor_ShouldInstantiatePacket_When_CalledWithNoArguments() - { - using (var packet = new FloatPacket()) - { -#pragma warning disable IDE0058 - Assert.AreEqual(Status.StatusCode.Internal, packet.ValidateAsType().Code()); - Assert.Throws(() => { packet.Get(); }); - Assert.AreEqual(Timestamp.Unset(), packet.Timestamp()); -#pragma warning restore IDE0058 - } - } - - [Test] - public void Ctor_ShouldInstantiatePacket_When_CalledWithValue() - { - using (var packet = new FloatPacket(0.01f)) - { - Assert.True(packet.ValidateAsType().Ok()); - Assert.AreEqual(0.01f, packet.Get()); - Assert.AreEqual(Timestamp.Unset(), packet.Timestamp()); - } - } - - [Test] - public void Ctor_ShouldInstantiatePacket_When_CalledWithValueAndTimestamp() - { - using (var timestamp = new Timestamp(1)) - { - using (var packet = new FloatPacket(0.01f, timestamp)) - { - Assert.True(packet.ValidateAsType().Ok()); - Assert.AreEqual(0.01f, packet.Get()); - Assert.AreEqual(timestamp, packet.Timestamp()); - } - } - } - #endregion - - #region #isDisposed - [Test] - public void IsDisposed_ShouldReturnFalse_When_NotDisposedYet() - { - using (var packet = new FloatPacket()) - { - Assert.False(packet.isDisposed); - } - } - - [Test] - public void IsDisposed_ShouldReturnTrue_When_AlreadyDisposed() - { - var packet = new FloatPacket(); - packet.Dispose(); - - Assert.True(packet.isDisposed); - } - #endregion - - #region #At - [Test] - public void At_ShouldReturnNewPacketWithTimestamp() - { - using (var timestamp = new Timestamp(1)) - { - var packet = new FloatPacket(0).At(timestamp); - Assert.AreEqual(0.0f, packet.Get()); - Assert.AreEqual(timestamp, packet.Timestamp()); - - using (var newTimestamp = new Timestamp(2)) - { - var newPacket = packet.At(newTimestamp); - Assert.AreEqual(0.0f, newPacket.Get()); - Assert.AreEqual(newTimestamp, newPacket.Timestamp()); - } - - Assert.AreEqual(timestamp, packet.Timestamp()); - } - } - #endregion - - #region #Consume - [Test] - public void Consume_ShouldThrowNotSupportedException() - { - using (var packet = new FloatPacket()) - { -#pragma warning disable IDE0058 - Assert.Throws(() => { packet.Consume(); }); -#pragma warning restore IDE0058 - } - } - #endregion - - #region #ValidateAsType - [Test] - public void ValidateAsType_ShouldReturnOk_When_ValueIsSet() - { - using (var packet = new FloatPacket(0.01f)) - { - Assert.True(packet.ValidateAsType().Ok()); - } - } - #endregion - } -} diff --git a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Packet/FloatPacketTest.cs.meta b/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Packet/FloatPacketTest.cs.meta deleted file mode 100644 index 71c439a..0000000 --- a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Packet/FloatPacketTest.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 39a81137616a1218b9b2b11d2feeadd0 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Packet/FloatVectorPacketTest.cs b/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Packet/FloatVectorPacketTest.cs deleted file mode 100644 index 06d0da2..0000000 --- a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Packet/FloatVectorPacketTest.cs +++ /dev/null @@ -1,176 +0,0 @@ -// Copyright (c) 2021 homuler -// -// Use of this source code is governed by an MIT-style -// license that can be found in the LICENSE file or at -// https://opensource.org/licenses/MIT. - -using NUnit.Framework; -using System; -using System.Collections.Generic; - -namespace Mediapipe.Tests -{ - public class FloatVectorPacketTest - { - #region Constructor - [Test, SignalAbort] - public void Ctor_ShouldInstantiatePacket_When_CalledWithNoArguments() - { - using (var packet = new FloatVectorPacket()) - { -#pragma warning disable IDE0058 - Assert.AreEqual(Status.StatusCode.Internal, packet.ValidateAsType().Code()); - Assert.Throws(() => { packet.Get(); }); - Assert.AreEqual(Timestamp.Unset(), packet.Timestamp()); -#pragma warning restore IDE0058 - } - } - - [Test] - public void Ctor_ShouldInstantiatePacket_When_CalledWithEmptyArray() - { - float[] data = { }; - using (var packet = new FloatVectorPacket(data)) - { - Assert.True(packet.ValidateAsType().Ok()); - Assert.AreEqual(data, packet.Get()); - Assert.AreEqual(Timestamp.Unset(), packet.Timestamp()); - } - } - - [Test] - public void Ctor_ShouldInstantiatePacket_When_CalledWithArray() - { - float[] data = { 0.01f }; - using (var packet = new FloatVectorPacket(data)) - { - Assert.True(packet.ValidateAsType().Ok()); - Assert.AreEqual(data, packet.Get()); - Assert.AreEqual(Timestamp.Unset(), packet.Timestamp()); - } - } - - [Test] - public void Ctor_ShouldInstantiatePacket_When_CalledWithValueAndTimestamp() - { - float[] data = { 0.01f, 0.02f }; - using (var timestamp = new Timestamp(1)) - { - using (var packet = new FloatVectorPacket(data, timestamp)) - { - Assert.True(packet.ValidateAsType().Ok()); - Assert.AreEqual(data, packet.Get()); - Assert.AreEqual(timestamp, packet.Timestamp()); - } - } - } - - [Test] - public void Ctor_ShouldInstantiatePacket_When_CalledWithEmptyList() - { - var data = new List(); - using (var packet = new FloatVectorPacket(data)) - { - Assert.True(packet.ValidateAsType().Ok()); - Assert.AreEqual(data, packet.Get()); - Assert.AreEqual(Timestamp.Unset(), packet.Timestamp()); - } - } - - [Test] - public void Ctor_ShouldInstantiatePacket_When_CalledWithList() - { - var data = new List() { 0.01f }; - using (var packet = new FloatVectorPacket(data)) - { - Assert.True(packet.ValidateAsType().Ok()); - Assert.AreEqual(data, packet.Get()); - Assert.AreEqual(Timestamp.Unset(), packet.Timestamp()); - } - } - - [Test] - public void Ctor_ShouldInstantiatePacket_When_CalledWithListAndTimestamp() - { - var data = new List() { 0.01f, 0.02f }; - using (var timestamp = new Timestamp(1)) - { - using (var packet = new FloatVectorPacket(data, timestamp)) - { - Assert.True(packet.ValidateAsType().Ok()); - Assert.AreEqual(data, packet.Get()); - Assert.AreEqual(timestamp, packet.Timestamp()); - } - } - } - #endregion - - #region #isDisposed - [Test] - public void IsDisposed_ShouldReturnFalse_When_NotDisposedYet() - { - using (var packet = new FloatVectorPacket()) - { - Assert.False(packet.isDisposed); - } - } - - [Test] - public void IsDisposed_ShouldReturnTrue_When_AlreadyDisposed() - { - var packet = new FloatVectorPacket(); - packet.Dispose(); - - Assert.True(packet.isDisposed); - } - #endregion - - #region #At - [Test] - public void At_ShouldReturnNewPacketWithTimestamp() - { - using (var timestamp = new Timestamp(1)) - { - var data = new List() { 0.0f }; - var packet = new FloatVectorPacket(data).At(timestamp); - Assert.AreEqual(data, packet.Get()); - Assert.AreEqual(timestamp, packet.Timestamp()); - - using (var newTimestamp = new Timestamp(2)) - { - var newPacket = packet.At(newTimestamp); - Assert.AreEqual(data, newPacket.Get()); - Assert.AreEqual(newTimestamp, newPacket.Timestamp()); - } - - Assert.AreEqual(timestamp, packet.Timestamp()); - } - } - #endregion - - #region #Consume - [Test] - public void Consume_ShouldThrowNotSupportedException() - { - using (var packet = new FloatVectorPacket()) - { -#pragma warning disable IDE0058 - Assert.Throws(() => { packet.Consume(); }); -#pragma warning restore IDE0058 - } - } - #endregion - - #region #ValidateAsType - [Test] - public void ValidateAsType_ShouldReturnOk_When_ValueIsSet() - { - float[] array = { 0.01f }; - using (var packet = new FloatVectorPacket(array)) - { - Assert.True(packet.ValidateAsType().Ok()); - } - } - #endregion - } -} diff --git a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Packet/FloatVectorPacketTest.cs.meta b/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Packet/FloatVectorPacketTest.cs.meta deleted file mode 100644 index 15a7a32..0000000 --- a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Packet/FloatVectorPacketTest.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 8a567519c65348c47ae2c5784431179e -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Packet/ImageFramePacketTest.cs b/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Packet/ImageFramePacketTest.cs deleted file mode 100644 index 359166d..0000000 --- a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Packet/ImageFramePacketTest.cs +++ /dev/null @@ -1,178 +0,0 @@ -// Copyright (c) 2021 homuler -// -// Use of this source code is governed by an MIT-style -// license that can be found in the LICENSE file or at -// https://opensource.org/licenses/MIT. - -using NUnit.Framework; - -namespace Mediapipe.Tests -{ - public class ImageFramePacketTest - { - #region Constructor - [Test] - public void Ctor_ShouldInstantiatePacket_When_CalledWithNoArguments() - { - using (var packet = new ImageFramePacket()) - { - using (var statusOrImageFrame = packet.Consume()) - { - Assert.AreEqual(Status.StatusCode.Internal, packet.ValidateAsType().Code()); - Assert.AreEqual(Status.StatusCode.Internal, statusOrImageFrame.status.Code()); - Assert.AreEqual(Timestamp.Unset(), packet.Timestamp()); - } - } - } - - [Test] - public void Ctor_ShouldInstantiatePacket_When_CalledWithValue() - { - var srcImageFrame = new ImageFrame(); - - using (var packet = new ImageFramePacket(srcImageFrame)) - { - Assert.True(srcImageFrame.isDisposed); - Assert.True(packet.ValidateAsType().Ok()); - Assert.AreEqual(Timestamp.Unset(), packet.Timestamp()); - - using (var statusOrImageFrame = packet.Consume()) - { - Assert.True(statusOrImageFrame.Ok()); - - using (var imageFrame = statusOrImageFrame.Value()) - { - Assert.AreEqual(ImageFormat.Types.Format.Unknown, imageFrame.Format()); - } - } - } - } - - [Test] - public void Ctor_ShouldInstantiatePacket_When_CalledWithValueAndTimestamp() - { - var srcImageFrame = new ImageFrame(); - - using (var timestamp = new Timestamp(1)) - { - using (var packet = new ImageFramePacket(srcImageFrame, timestamp)) - { - Assert.True(srcImageFrame.isDisposed); - Assert.True(packet.ValidateAsType().Ok()); - - using (var statusOrImageFrame = packet.Consume()) - { - Assert.True(statusOrImageFrame.Ok()); - - using (var imageFrame = statusOrImageFrame.Value()) - { - Assert.AreEqual(ImageFormat.Types.Format.Unknown, imageFrame.Format()); - Assert.AreEqual(timestamp, packet.Timestamp()); - } - } - } - } - } - #endregion - - #region #isDisposed - [Test] - public void IsDisposed_ShouldReturnFalse_When_NotDisposedYet() - { - using (var packet = new ImageFramePacket()) - { - Assert.False(packet.isDisposed); - } - } - - [Test] - public void IsDisposed_ShouldReturnTrue_When_AlreadyDisposed() - { - var packet = new ImageFramePacket(); - packet.Dispose(); - - Assert.True(packet.isDisposed); - } - #endregion - - #region #At - [Test] - public void At_ShouldReturnNewPacketWithTimestamp() - { - using (var timestamp = new Timestamp(1)) - { - var packet = new ImageFramePacket(new ImageFrame(ImageFormat.Types.Format.Srgba, 10, 10)).At(timestamp); - Assert.AreEqual(10, packet.Get().Width()); - Assert.AreEqual(timestamp, packet.Timestamp()); - - using (var newTimestamp = new Timestamp(2)) - { - var newPacket = packet.At(newTimestamp); - Assert.AreEqual(10, newPacket.Get().Width()); - Assert.AreEqual(newTimestamp, newPacket.Timestamp()); - } - - Assert.AreEqual(timestamp, packet.Timestamp()); - } - } - #endregion - - #region #Get - [Test, SignalAbort] - public void Get_ShouldThrowMediaPipeException_When_DataIsEmpty() - { - using (var packet = new ImageFramePacket()) - { -#pragma warning disable IDE0058 - Assert.Throws(() => { packet.Get(); }); -#pragma warning restore IDE0058 - } - } - - public void Get_ShouldReturnImageFrame_When_DataIsNotEmpty() - { - using (var packet = new ImageFramePacket(new ImageFrame(ImageFormat.Types.Format.Sbgra, 10, 10))) - { - using (var imageFrame = packet.Get()) - { - Assert.AreEqual(ImageFormat.Types.Format.Sbgra, imageFrame.Format()); - Assert.AreEqual(10, imageFrame.Width()); - Assert.AreEqual(10, imageFrame.Height()); - } - } - } - #endregion - - #region #Consume - [Test] - public void Consume_ShouldReturnImageFrame() - { - using (var packet = new ImageFramePacket(new ImageFrame(ImageFormat.Types.Format.Sbgra, 10, 10))) - { - using (var statusOrImageFrame = packet.Consume()) - { - Assert.True(statusOrImageFrame.Ok()); - - using (var imageFrame = statusOrImageFrame.Value()) - { - Assert.AreEqual(ImageFormat.Types.Format.Sbgra, imageFrame.Format()); - Assert.AreEqual(10, imageFrame.Width()); - Assert.AreEqual(10, imageFrame.Height()); - } - } - } - } - #endregion - - #region #ValidateAsType - [Test] - public void ValidateAsType_ShouldReturnOk_When_ValueIsSet() - { - using (var packet = new ImageFramePacket(new ImageFrame())) - { - Assert.True(packet.ValidateAsType().Ok()); - } - } - #endregion - } -} diff --git a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Packet/ImageFramePacketTest.cs.meta b/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Packet/ImageFramePacketTest.cs.meta deleted file mode 100644 index 4c18fb1..0000000 --- a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Packet/ImageFramePacketTest.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: a3eb7f3538d626cd68495da48b11e6f7 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Packet/MatrixPacketTest.cs b/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Packet/MatrixPacketTest.cs deleted file mode 100644 index 4d361e8..0000000 --- a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Packet/MatrixPacketTest.cs +++ /dev/null @@ -1,111 +0,0 @@ -// Copyright (c) 2021 homuler -// -// Use of this source code is governed by an MIT-style -// license that can be found in the LICENSE file or at -// https://opensource.org/licenses/MIT. - -using System.Collections.Generic; -using NUnit.Framework; -using System; - -namespace Mediapipe.Tests -{ - public class MatrixPacketTest - { - #region Constructor - [Test] - public void Ctor_ShouldInstantiatePacket_When_CalledWithValue() - { - var matrix = CreateMatrixInputData(); - using (var packet = new MatrixPacket(matrix)) - { - Assert.True(packet.ValidateAsType().Ok()); - Assert.AreEqual(matrix, packet.Get()); - Assert.AreEqual(Timestamp.Unset(), packet.Timestamp()); - } - } - #endregion - - #region #isDisposed - [Test] - public void IsDisposed_ShouldReturnFalse_When_NotDisposedYet() - { - using (var packet = new MatrixPacket()) - { - Assert.False(packet.isDisposed); - } - } - - [Test] - public void IsDisposed_ShouldReturnTrue_When_AlreadyDisposed() - { - var packet = new MatrixPacket(); - packet.Dispose(); - - Assert.True(packet.isDisposed); - } - #endregion - - #region #At - [Test] - public void At_ShouldReturnNewPacketWithTimestamp() - { - using (var timestamp = new Timestamp(1)) - { - var matrix = CreateMatrixInputData(); - var packet = new MatrixPacket(matrix).At(timestamp); - Assert.AreEqual(matrix, packet.Get()); - Assert.AreEqual(timestamp, packet.Timestamp()); - - using (var newTimestamp = new Timestamp(2)) - { - var newPacket = packet.At(newTimestamp); - Assert.AreEqual(matrix, newPacket.Get()); - Assert.AreEqual(newTimestamp, newPacket.Timestamp()); - } - - Assert.AreEqual(timestamp, packet.Timestamp()); - } - } - #endregion - - #region #Consume - [Test] - public void Consume_ShouldThrowNotSupportedException() - { - using (var packet = new MatrixPacket()) - { -#pragma warning disable IDE0058 - Assert.Throws(() => { packet.Consume(); }); -#pragma warning restore IDE0058 - } - } - #endregion - - #region #ValidateAsType - [Test] - public void ValidateAsType_ShouldReturnOk_When_ValueIsSet() - { - using (var packet = new MatrixPacket(CreateMatrixInputData())) - { - Assert.True(packet.ValidateAsType().Ok()); - } - } - #endregion - - private static MatrixData CreateMatrixInputData() - { - var matrix = new MatrixData(); - matrix.PackedData.Add(0); - matrix.PackedData.Add(1); - matrix.PackedData.Add(2); - matrix.PackedData.Add(3); - matrix.PackedData.Add(4); - matrix.PackedData.Add(5); - - matrix.Rows = 2; - matrix.Cols = 3; - return matrix; - } - } -} diff --git a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Packet/MatrixPacketTest.cs.meta b/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Packet/MatrixPacketTest.cs.meta deleted file mode 100644 index b349e37..0000000 --- a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Packet/MatrixPacketTest.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: a3a4963f37dcdcc43a8292c2493c19bc -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Packet/PacketTest.cs b/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Packet/PacketTest.cs deleted file mode 100644 index 8f9d4ac..0000000 --- a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Packet/PacketTest.cs +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright (c) 2021 homuler -// -// Use of this source code is governed by an MIT-style -// license that can be found in the LICENSE file or at -// https://opensource.org/licenses/MIT. - -using NUnit.Framework; - -namespace Mediapipe.Tests -{ - public class PacketTest - { - #region #DebugString - [Test] - public void DebugString_ShouldReturnDebugString_When_InstantiatedWithDefaultConstructor() - { - using (var packet = new BoolPacket()) - { - Assert.AreEqual("mediapipe::Packet with timestamp: Timestamp::Unset() and no data", packet.DebugString()); - } - } - #endregion - - #region #DebugTypeName - [Test] - public void DebugTypeName_ShouldReturnTypeName_When_ValueIsNotSet() - { - using (var packet = new BoolPacket()) - { - Assert.AreEqual("{empty}", packet.DebugTypeName()); - } - } - #endregion - - #region #RegisteredTypeName - [Test] - public void RegisteredTypeName_ShouldReturnEmptyString() - { - using (var packet = new BoolPacket()) - { - Assert.AreEqual("", packet.RegisteredTypeName()); - } - } - #endregion - - #region #ValidateAsProtoMessageLite - [Test] - public void ValidateAsProtoMessageLite_ShouldReturnInvalidArgument_When_ValueIsBool() - { - using (var packet = new BoolPacket(true)) - { - Assert.AreEqual(Status.StatusCode.InvalidArgument, packet.ValidateAsProtoMessageLite().Code()); - } - } - #endregion - } -} diff --git a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Packet/PacketTest.cs.meta b/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Packet/PacketTest.cs.meta deleted file mode 100644 index 3d1c74c..0000000 --- a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Packet/PacketTest.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 8c8b062f481adfe73be16b679e3c1cca -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Packet/SidePacketTest.cs b/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Packet/SidePacketTest.cs deleted file mode 100644 index ce02c30..0000000 --- a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Packet/SidePacketTest.cs +++ /dev/null @@ -1,129 +0,0 @@ -// Copyright (c) 2021 homuler -// -// Use of this source code is governed by an MIT-style -// license that can be found in the LICENSE file or at -// https://opensource.org/licenses/MIT. - -using NUnit.Framework; - -namespace Mediapipe.Tests -{ - public class SidePacketTest - { - #region #size - [Test] - public void Size_ShouldReturnZero_When_Initialized() - { - using (var sidePacket = new SidePacket()) - { - Assert.AreEqual(0, sidePacket.size); - } - } - - [Test] - public void Size_ShouldReturnSize_When_AfterPacketsAreEmplaced() - { - using (var sidePacket = new SidePacket()) - { - var flagPacket = new BoolPacket(true); - var valuePacket = new FloatPacket(1.0f); - sidePacket.Emplace("flag", flagPacket); - sidePacket.Emplace("value", valuePacket); - - Assert.AreEqual(2, sidePacket.size); - Assert.True(flagPacket.isDisposed); - Assert.True(valuePacket.isDisposed); - } - } - #endregion - - #region #Emplace - [Test] - public void Emplace_ShouldInsertAndDisposePacket() - { - using (var sidePacket = new SidePacket()) - { - Assert.AreEqual(0, sidePacket.size); - Assert.IsNull(sidePacket.At("value")); - - var flagPacket = new FloatPacket(1.0f); - sidePacket.Emplace("value", flagPacket); - - Assert.AreEqual(1, sidePacket.size); - Assert.AreEqual(1.0f, sidePacket.At("value").Get()); - Assert.True(flagPacket.isDisposed); - } - } - - [Test] - public void Emplace_ShouldIgnoreValue_When_KeyExists() - { - using (var sidePacket = new SidePacket()) - { - var oldValuePacket = new FloatPacket(1.0f); - sidePacket.Emplace("value", oldValuePacket); - Assert.AreEqual(1.0f, sidePacket.At("value").Get()); - - var newValuePacket = new FloatPacket(2.0f); - sidePacket.Emplace("value", newValuePacket); - Assert.AreEqual(1.0f, sidePacket.At("value").Get()); - } - } - #endregion - - #region #Erase - [Test] - public void Erase_ShouldDoNothing_When_KeyDoesNotExist() - { - using (var sidePacket = new SidePacket()) - { - var count = sidePacket.Erase("value"); - - Assert.AreEqual(0, sidePacket.size); - Assert.AreEqual(0, count); - } - } - - [Test] - public void Erase_ShouldEraseKey_When_KeyExists() - { - using (var sidePacket = new SidePacket()) - { - sidePacket.Emplace("value", new BoolPacket(true)); - Assert.AreEqual(1, sidePacket.size); - - var count = sidePacket.Erase("value"); - Assert.AreEqual(0, sidePacket.size); - Assert.AreEqual(1, count); - } - } - #endregion - - #region #Clear - [Test] - public void Clear_ShouldDoNothing_When_SizeIsZero() - { - using (var sidePacket = new SidePacket()) - { - sidePacket.Clear(); - - Assert.AreEqual(0, sidePacket.size); - } - } - - [Test] - public void Clear_ShouldClearAllKeys_When_SizeIsNotZero() - { - using (var sidePacket = new SidePacket()) - { - sidePacket.Emplace("flag", new BoolPacket(true)); - sidePacket.Emplace("value", new FloatPacket(1.0f)); - Assert.AreEqual(2, sidePacket.size); - - sidePacket.Clear(); - Assert.AreEqual(0, sidePacket.size); - } - } - #endregion - } -} diff --git a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Packet/SidePacketTest.cs.meta b/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Packet/SidePacketTest.cs.meta deleted file mode 100644 index 7b0d6e0..0000000 --- a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Packet/SidePacketTest.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 148809b5633f2f8cd9f277e01bb7b0ca -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Packet/StringPacketTest.cs b/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Packet/StringPacketTest.cs deleted file mode 100644 index f5b3ccc..0000000 --- a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Packet/StringPacketTest.cs +++ /dev/null @@ -1,177 +0,0 @@ -// Copyright (c) 2021 homuler -// -// Use of this source code is governed by an MIT-style -// license that can be found in the LICENSE file or at -// https://opensource.org/licenses/MIT. - -using NUnit.Framework; -using System.Text.RegularExpressions; - -namespace Mediapipe.Tests -{ - public class StringPacketTest - { - #region Constructor - [Test, SignalAbort] - public void Ctor_ShouldInstantiatePacket_When_CalledWithNoArguments() - { - using (var packet = new StringPacket()) - { -#pragma warning disable IDE0058 - Assert.AreEqual(Status.StatusCode.Internal, packet.ValidateAsType().Code()); - Assert.Throws(() => { packet.Get(); }); - Assert.AreEqual(Timestamp.Unset(), packet.Timestamp()); -#pragma warning restore IDE0058 - } - } - - [Test] - public void Ctor_ShouldInstantiatePacket_When_CalledWithString() - { - using (var packet = new StringPacket("test")) - { - Assert.True(packet.ValidateAsType().Ok()); - Assert.AreEqual("test", packet.Get()); - Assert.AreEqual(Timestamp.Unset(), packet.Timestamp()); - } - } - - [Test] - public void Ctor_ShouldInstantiatePacket_When_CalledWithByteArray() - { - var bytes = new byte[] { (byte)'t', (byte)'e', (byte)'s', (byte)'t' }; - using (var packet = new StringPacket(bytes)) - { - Assert.True(packet.ValidateAsType().Ok()); - Assert.AreEqual("test", packet.Get()); - Assert.AreEqual(Timestamp.Unset(), packet.Timestamp()); - } - } - - [Test] - public void Ctor_ShouldInstantiatePacket_When_CalledWithStringAndTimestamp() - { - using (var timestamp = new Timestamp(1)) - { - using (var packet = new StringPacket("test", timestamp)) - { - Assert.True(packet.ValidateAsType().Ok()); - Assert.AreEqual("test", packet.Get()); - Assert.AreEqual(timestamp, packet.Timestamp()); - } - } - } - - [Test] - public void Ctor_ShouldInstantiatePacket_When_CalledWithByteArrayAndTimestamp() - { - var bytes = new byte[] { (byte)'t', (byte)'e', (byte)'s', (byte)'t' }; - using (var timestamp = new Timestamp(1)) - { - using (var packet = new StringPacket(bytes, timestamp)) - { - Assert.True(packet.ValidateAsType().Ok()); - Assert.AreEqual("test", packet.Get()); - Assert.AreEqual(timestamp, packet.Timestamp()); - } - } - } - #endregion - - #region #isDisposed - [Test] - public void IsDisposed_ShouldReturnFalse_When_NotDisposedYet() - { - using (var packet = new StringPacket()) - { - Assert.False(packet.isDisposed); - } - } - - [Test] - public void IsDisposed_ShouldReturnTrue_When_AlreadyDisposed() - { - var packet = new StringPacket(); - packet.Dispose(); - - Assert.True(packet.isDisposed); - } - #endregion - - #region #At - [Test] - public void At_ShouldReturnNewPacketWithTimestamp() - { - using (var timestamp = new Timestamp(1)) - { - var str = "str"; - var packet = new StringPacket(str).At(timestamp); - Assert.AreEqual(str, packet.Get()); - Assert.AreEqual(timestamp, packet.Timestamp()); - - using (var newTimestamp = new Timestamp(2)) - { - var newPacket = packet.At(newTimestamp); - Assert.AreEqual(str, newPacket.Get()); - Assert.AreEqual(newTimestamp, newPacket.Timestamp()); - } - - Assert.AreEqual(timestamp, packet.Timestamp()); - } - } - #endregion - - #region #GetByteArray - [Test] - public void GetByteArray_ShouldReturnByteArray() - { - var bytes = new byte[] { (byte)'a', (byte)'b', 0, (byte)'c' }; - using (var packet = new StringPacket(bytes)) - { - Assert.AreEqual(bytes, packet.GetByteArray()); - Assert.AreEqual("ab", packet.Get()); - } - } - #endregion - - #region #Consume - [Test] - public void Consume_ShouldReturnStatusOrString_When_PacketIsEmpty() - { - using (var packet = new StringPacket()) - { - using (var statusOrString = packet.Consume()) - { - Assert.False(statusOrString.Ok()); - Assert.AreEqual(Status.StatusCode.Internal, statusOrString.status.Code()); - } - } - } - - [Test] - public void Consume_ShouldReturnStatusOrString_When_PacketIsNotEmpty() - { - using (var packet = new StringPacket("abc")) - { - using (var statusOrString = packet.Consume()) - { - Assert.True(statusOrString.Ok()); - Assert.AreEqual("abc", statusOrString.Value()); - } - Assert.True(packet.IsEmpty()); - } - } - #endregion - - #region #ValidateAsType - [Test] - public void ValidateAsType_ShouldReturnOk_When_ValueIsSet() - { - using (var packet = new StringPacket("test")) - { - Assert.True(packet.ValidateAsType().Ok()); - } - } - #endregion - } -} diff --git a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Packet/StringPacketTest.cs.meta b/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Packet/StringPacketTest.cs.meta deleted file mode 100644 index 53e5f18..0000000 --- a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Packet/StringPacketTest.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 1fc360374ea123c28b7da8b9b81ebac6 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Port.meta b/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Port.meta deleted file mode 100644 index 97b3b19..0000000 --- a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Port.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 62cf7906c5d34b94b984c3b13300b589 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Port/StatusOrGpuResourcesTest.cs b/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Port/StatusOrGpuResourcesTest.cs deleted file mode 100644 index 1412e83..0000000 --- a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Port/StatusOrGpuResourcesTest.cs +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright (c) 2021 homuler -// -// Use of this source code is governed by an MIT-style -// license that can be found in the LICENSE file or at -// https://opensource.org/licenses/MIT. - -using NUnit.Framework; - -namespace Mediapipe.Tests -{ - public class StatusOrGpuResourcesTest - { - #region #status - [Test, GpuOnly] - public void Status_ShouldReturnOk_When_StatusIsOk() - { - using (var statusOrGpuResources = GpuResources.Create()) - { - Assert.AreEqual(Status.StatusCode.Ok, statusOrGpuResources.status.Code()); - } - } - #endregion - - #region #isDisposed - [Test, GpuOnly] - public void IsDisposed_ShouldReturnFalse_When_NotDisposedYet() - { - using (var statusOrGpuResources = GpuResources.Create()) - { - Assert.False(statusOrGpuResources.isDisposed); - } - } - - [Test, GpuOnly] - public void IsDisposed_ShouldReturnTrue_When_AlreadyDisposed() - { - var statusOrGpuResources = GpuResources.Create(); - statusOrGpuResources.Dispose(); - - Assert.True(statusOrGpuResources.isDisposed); - } - #endregion - - #region #Value - [Test, GpuOnly] - public void Value_ShouldReturnGpuResources_When_StatusIsOk() - { - using (var statusOrGpuResources = GpuResources.Create()) - { - Assert.True(statusOrGpuResources.Ok()); - - using (var gpuResources = statusOrGpuResources.Value()) - { - Assert.IsInstanceOf(gpuResources); - Assert.True(statusOrGpuResources.isDisposed); - } - } - } - #endregion - } -} diff --git a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Port/StatusOrGpuResourcesTest.cs.meta b/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Port/StatusOrGpuResourcesTest.cs.meta deleted file mode 100644 index e7545ea..0000000 --- a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Port/StatusOrGpuResourcesTest.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 744f3edd2e0a5c864b1e59a13c017bbd -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Port/StatusOrImageFrameTest.cs b/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Port/StatusOrImageFrameTest.cs deleted file mode 100644 index 1d60df7..0000000 --- a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Port/StatusOrImageFrameTest.cs +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright (c) 2021 homuler -// -// Use of this source code is governed by an MIT-style -// license that can be found in the LICENSE file or at -// https://opensource.org/licenses/MIT. - -using NUnit.Framework; - -namespace Mediapipe.Tests -{ - public class StatusOrImageFrameTest - { - #region #status - [Test] - public void Status_ShouldReturnOk_When_StatusIsOk() - { - using (var statusOrImageFrame = InitializeSubject()) - { - Assert.True(statusOrImageFrame.Ok()); - Assert.AreEqual(Status.StatusCode.Ok, statusOrImageFrame.status.Code()); - } - } - #endregion - - #region #isDisposed - [Test] - public void IsDisposed_ShouldReturnFalse_When_NotDisposedYet() - { - using (var statusOrImageFrame = InitializeSubject()) - { - Assert.False(statusOrImageFrame.isDisposed); - } - } - - [Test] - public void IsDisposed_ShouldReturnTrue_When_AlreadyDisposed() - { - var statusOrImageFrame = InitializeSubject(); - statusOrImageFrame.Dispose(); - - Assert.True(statusOrImageFrame.isDisposed); - } - #endregion - - #region #Value - [Test] - public void Value_ShouldReturnImageFrame_When_StatusIsOk() - { - using (var statusOrImageFrame = InitializeSubject()) - { - Assert.True(statusOrImageFrame.Ok()); - - using (var imageFrame = statusOrImageFrame.Value()) - { - Assert.AreEqual(10, imageFrame.Width()); - Assert.AreEqual(10, imageFrame.Height()); - Assert.True(statusOrImageFrame.isDisposed); - } - } - } - #endregion - - private StatusOrImageFrame InitializeSubject() - { - var imageFrame = new ImageFrame(ImageFormat.Types.Format.Sbgra, 10, 10); - var packet = new ImageFramePacket(imageFrame, new Timestamp(1)); - - return (StatusOrImageFrame)packet.Consume(); - } - } -} diff --git a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Port/StatusOrImageFrameTest.cs.meta b/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Port/StatusOrImageFrameTest.cs.meta deleted file mode 100644 index dd6cada..0000000 --- a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Port/StatusOrImageFrameTest.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 466caabcab9db68b9bf6cd8b2ea6829a -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Port/StatusOrStringTest.cs b/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Port/StatusOrStringTest.cs deleted file mode 100644 index 25c761d..0000000 --- a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Port/StatusOrStringTest.cs +++ /dev/null @@ -1,87 +0,0 @@ -// Copyright (c) 2021 homuler -// -// Use of this source code is governed by an MIT-style -// license that can be found in the LICENSE file or at -// https://opensource.org/licenses/MIT. - -using NUnit.Framework; - -namespace Mediapipe.Tests -{ - public class StatusOrStringTest - { - #region #status - [Test] - public void Status_ShouldReturnOk_When_StatusIsOk() - { - using (var statusOrString = InitializeSubject("")) - { - Assert.True(statusOrString.Ok()); - Assert.AreEqual(Status.StatusCode.Ok, statusOrString.status.Code()); - } - } - #endregion - - #region #isDisposed - [Test] - public void IsDisposed_ShouldReturnFalse_When_NotDisposedYet() - { - using (var statusOrString = InitializeSubject("")) - { - Assert.False(statusOrString.isDisposed); - } - } - - [Test] - public void IsDisposed_ShouldReturnTrue_When_AlreadyDisposed() - { - var statusOrString = InitializeSubject(""); - statusOrString.Dispose(); - - Assert.True(statusOrString.isDisposed); - } - #endregion - - #region #Value - [Test] - public void Value_ShouldReturnString_When_StatusIsOk() - { - var bytes = new byte[] { (byte)'a', (byte)'b', 0, (byte)'c' }; - using (var statusOrString = InitializeSubject(bytes)) - { - Assert.True(statusOrString.Ok()); - Assert.AreEqual("ab", statusOrString.Value()); - } - } - #endregion - - #region #ValueAsByteArray - [Test] - public void ValueAsByteArray_ShouldReturnByteArray_When_StatusIsOk() - { - var bytes = new byte[] { (byte)'a', (byte)'b', 0, (byte)'c' }; - using (var statusOrString = InitializeSubject(bytes)) - { - Assert.True(statusOrString.Ok()); - Assert.AreEqual(bytes, statusOrString.ValueAsByteArray()); - } - } - #endregion - - private StatusOrString InitializeSubject(string str) - { - using (var packet = new StringPacket(str)) - { - return (StatusOrString)packet.Consume(); - } - } - - private StatusOrString InitializeSubject(byte[] bytes) - { - using (var packet = new StringPacket(bytes)) - { - return (StatusOrString)packet.Consume(); - } - } - } -} diff --git a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Port/StatusOrStringTest.cs.meta b/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Port/StatusOrStringTest.cs.meta deleted file mode 100644 index e969bed..0000000 --- a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Port/StatusOrStringTest.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 033bc341009a18e46920a405cd163bfb -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Port/StatusTest.cs b/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Port/StatusTest.cs deleted file mode 100644 index 49d0aaa..0000000 --- a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Port/StatusTest.cs +++ /dev/null @@ -1,286 +0,0 @@ -// Copyright (c) 2021 homuler -// -// Use of this source code is governed by an MIT-style -// license that can be found in the LICENSE file or at -// https://opensource.org/licenses/MIT. - -using NUnit.Framework; - -namespace Mediapipe.Tests -{ - public class StatusTest - { - #region #Code - [Test] - public void Code_ShouldReturnStatusCode_When_StatusIsOk() - { - using (var status = Status.Ok()) - { - Assert.AreEqual(Status.StatusCode.Ok, status.Code()); - } - } - - [Test] - public void Code_ShouldReturnStatusCode_When_StatusIsFailedPrecondition() - { - using (var status = Status.FailedPrecondition()) - { - Assert.AreEqual(Status.StatusCode.FailedPrecondition, status.Code()); - } - } - #endregion - - #region #isDisposed - [Test] - public void IsDisposed_ShouldReturnFalse_When_NotDisposedYet() - { - using (var status = Status.Ok()) - { - Assert.False(status.isDisposed); - } - } - - [Test] - public void IsDisposed_ShouldReturnTrue_When_AlreadyDisposed() - { - var status = Status.Ok(); - status.Dispose(); - - Assert.True(status.isDisposed); - } - #endregion - - #region #RawCode - [Test] - public void RawCode_ShouldReturnRawCode_When_StatusIsOk() - { - using (var status = Status.Ok()) - { - Assert.AreEqual(0, status.RawCode()); - } - } - - [Test] - public void RawCode_ShouldReturnRawCode_When_StatusIsFailedPrecondition() - { - using (var status = Status.FailedPrecondition()) - { - Assert.AreEqual(9, status.RawCode()); - } - } - #endregion - - #region #Ok - [Test] - public void Ok_ShouldReturnTrue_When_StatusIsOk() - { - using (var status = Status.Ok()) - { - Assert.True(status.Ok()); - } - } - - [Test] - public void Ok_ShouldReturnFalse_When_StatusIsFailedPrecondition() - { - using (var status = Status.FailedPrecondition()) - { - Assert.False(status.Ok()); - } - } - #endregion - - #region #AssertOk - [Test] - public void AssertOk_ShouldNotThrow_When_StatusIsOk() - { - using (var status = Status.Ok()) - { - Assert.DoesNotThrow(() => { status.AssertOk(); }); - } - } - - [Test] - public void AssertOk_ShouldThrow_When_StatusIsNotOk() - { - using (var status = Status.FailedPrecondition()) - { -#pragma warning disable IDE0058 - Assert.Throws(() => { status.AssertOk(); }); -#pragma warning restore IDE0058 - } - } - #endregion - - #region #ToString - [Test] - public void ToString_ShouldReturnMessage_When_StatusIsOk() - { - using (var status = Status.Ok()) - { - Assert.AreEqual("OK", status.ToString()); - } - } - - [Test] - public void ToString_ShouldReturnMessage_When_StatusIsCancelled() - { - var message = "Some error"; - using (var status = Status.Cancelled(message)) - { - Assert.AreEqual($"CANCELLED: {message}", status.ToString()); - } - } - - [Test] - public void ToString_ShouldReturnMessage_When_StatusIsUnknown() - { - var message = "Some error"; - using (var status = Status.Unknown(message)) - { - Assert.AreEqual($"UNKNOWN: {message}", status.ToString()); - } - } - - [Test] - public void ToString_ShouldReturnMessage_When_StatusIsInvalidArgument() - { - var message = "Some error"; - using (var status = Status.InvalidArgument(message)) - { - Assert.AreEqual($"INVALID_ARGUMENT: {message}", status.ToString()); - } - } - - [Test] - public void ToString_ShouldReturnMessage_When_StatusIsDeadlineExceeded() - { - var message = "Some error"; - using (var status = Status.DeadlineExceeded(message)) - { - Assert.AreEqual($"DEADLINE_EXCEEDED: {message}", status.ToString()); - } - } - - [Test] - public void ToString_ShouldReturnMessage_When_StatusIsNotFound() - { - var message = "Some error"; - using (var status = Status.NotFound(message)) - { - Assert.AreEqual($"NOT_FOUND: {message}", status.ToString()); - } - } - - [Test] - public void ToString_ShouldReturnMessage_When_StatusIsAlreadyExists() - { - var message = "Some error"; - using (var status = Status.AlreadyExists(message)) - { - Assert.AreEqual($"ALREADY_EXISTS: {message}", status.ToString()); - } - } - - [Test] - public void ToString_ShouldReturnMessage_When_StatusIsPermissionDenied() - { - var message = "Some error"; - using (var status = Status.PermissionDenied(message)) - { - Assert.AreEqual($"PERMISSION_DENIED: {message}", status.ToString()); - } - } - - [Test] - public void ToString_ShouldReturnMessage_When_StatusIsResourceExhausted() - { - var message = "Some error"; - using (var status = Status.ResourceExhausted(message)) - { - Assert.AreEqual($"RESOURCE_EXHAUSTED: {message}", status.ToString()); - } - } - - [Test] - public void ToString_ShouldReturnMessage_When_StatusIsFailedPrecondition() - { - var message = "Some error"; - using (var status = Status.FailedPrecondition(message)) - { - Assert.AreEqual($"FAILED_PRECONDITION: {message}", status.ToString()); - } - } - - [Test] - public void ToString_ShouldReturnMessage_When_StatusIsAborted() - { - var message = "Some error"; - using (var status = Status.Aborted(message)) - { - Assert.AreEqual($"ABORTED: {message}", status.ToString()); - } - } - - [Test] - public void ToString_ShouldReturnMessage_When_StatusIsOutOfRange() - { - var message = "Some error"; - using (var status = Status.OutOfRange(message)) - { - Assert.AreEqual($"OUT_OF_RANGE: {message}", status.ToString()); - } - } - - [Test] - public void ToString_ShouldReturnMessage_When_StatusIsUnimplemented() - { - var message = "Some error"; - using (var status = Status.Unimplemented(message)) - { - Assert.AreEqual($"UNIMPLEMENTED: {message}", status.ToString()); - } - } - - [Test] - public void ToString_ShouldReturnMessage_When_StatusIsInternal() - { - var message = "Some error"; - using (var status = Status.Internal(message)) - { - Assert.AreEqual($"INTERNAL: {message}", status.ToString()); - } - } - - [Test] - public void ToString_ShouldReturnMessage_When_StatusIsUnavailable() - { - var message = "Some error"; - using (var status = Status.Unavailable(message)) - { - Assert.AreEqual($"UNAVAILABLE: {message}", status.ToString()); - } - } - - [Test] - public void ToString_ShouldReturnMessage_When_StatusIsDataLoss() - { - var message = "Some error"; - using (var status = Status.DataLoss(message)) - { - Assert.AreEqual($"DATA_LOSS: {message}", status.ToString()); - } - } - - [Test] - public void ToString_ShouldReturnMessage_When_StatusIsUnauthenticated() - { - var message = "Some error"; - using (var status = Status.Unauthenticated(message)) - { - Assert.AreEqual($"UNAUTHENTICATED: {message}", status.ToString()); - } - } - #endregion - } -} diff --git a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Port/StatusTest.cs.meta b/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Port/StatusTest.cs.meta deleted file mode 100644 index 30b46c2..0000000 --- a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Port/StatusTest.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: cb9c4c0cb4b7c323db90d8592b4684cb -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/TimestampTest.cs b/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/TimestampTest.cs deleted file mode 100644 index adeef7d..0000000 --- a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/TimestampTest.cs +++ /dev/null @@ -1,254 +0,0 @@ -// Copyright (c) 2021 homuler -// -// Use of this source code is governed by an MIT-style -// license that can be found in the LICENSE file or at -// https://opensource.org/licenses/MIT. - -using NUnit.Framework; - -namespace Mediapipe.Tests -{ - public class TimestampTest - { - #region #isDisposed - [Test] - public void IsDisposed_ShouldReturnFalse_When_NotDisposedYet() - { - using (var timestamp = new Timestamp(1)) - { - Assert.False(timestamp.isDisposed); - } - } - - [Test] - public void IsDisposed_ShouldReturnTrue_When_AlreadyDisposed() - { - var timestamp = new Timestamp(1); - timestamp.Dispose(); - - Assert.True(timestamp.isDisposed); - } - #endregion - - #region #Value - [Test] - public void Value_ShouldReturnValue() - { - using (var timestamp = new Timestamp(10)) - { - Assert.AreEqual(10, timestamp.Value()); - } - } - #endregion - - #region #Seconds - [Test] - public void Seconds_ShouldReturnValueInSeconds() - { - using (var timestamp = new Timestamp(1_000_000)) - { - Assert.AreEqual(1d, timestamp.Seconds(), 1e-9); - } - } - #endregion - - #region #Microseconds - [Test] - public void Microseconds_ShouldReturnValueInMicroseconds() - { - using (var timestamp = new Timestamp(1_000_000)) - { - Assert.AreEqual(1_000_000, timestamp.Microseconds()); - } - } - #endregion - - #region #IsSpecialValue - [Test] - public void IsSpecialValue_ShouldReturnFalse_When_ValueIsInRange() - { - using (var timestamp = new Timestamp(1)) - { - Assert.False(timestamp.IsSpecialValue()); - } - } - - [Test] - public void IsSpecialValue_ShouldReturnTrue_When_TimestampIsUnset() - { - using (var timestamp = Timestamp.Unset()) - { - Assert.True(timestamp.IsSpecialValue()); - } - } - - [Test] - public void IsSpecialValue_ShouldReturnTrue_When_TimestampIsUnstarted() - { - using (var timestamp = Timestamp.Unstarted()) - { - Assert.True(timestamp.IsSpecialValue()); - } - } - #endregion - - #region #IsRangeValue - [Test] - public void IsRangeValue_ShouldReturnTrue_When_ValueIsInRange() - { - using (var timestamp = new Timestamp(1)) - { - Assert.True(timestamp.IsRangeValue()); - } - } - - [Test] - public void IsRangeValue_ShouldReturnFalse_When_TimestampIsPreStream() - { - using (var timestamp = Timestamp.PreStream()) - { - Assert.False(timestamp.IsRangeValue()); - } - } - - [Test] - public void IsRangeValue_ShouldReturnFalse_When_TimestampIsPostStream() - { - using (var timestamp = Timestamp.PostStream()) - { - Assert.False(timestamp.IsRangeValue()); - } - } - - [Test] - public void IsRangeValue_ShouldReturnTrue_When_TimestampIsMin() - { - using (var timestamp = Timestamp.Min()) - { - Assert.True(timestamp.IsRangeValue()); - } - } - - [Test] - public void IsRangeValue_ShouldReturnTrue_When_TimestampIsMax() - { - using (var timestamp = Timestamp.Max()) - { - Assert.True(timestamp.IsRangeValue()); - } - } - #endregion - - #region #IsAllowedInStream - [Test] - public void IsAllowedInStream_ShouldReturnTrue_When_ValueIsInRange() - { - using (var timestamp = new Timestamp(1)) - { - Assert.True(timestamp.IsAllowedInStream()); - } - } - - [Test] - public void IsAllowedInStream_ShouldReturnFalse_When_TimestampIsOneOverPostStream() - { - using (var timestamp = Timestamp.OneOverPostStream()) - { - Assert.False(timestamp.IsAllowedInStream()); - } - } - - [Test] - public void IsAllowedInStream_ShouldReturnFalse_When_TimestampIsDone() - { - using (var timestamp = Timestamp.Done()) - { - Assert.False(timestamp.IsAllowedInStream()); - } - } - #endregion - - #region #DebugString - [Test] - public void DebugString_ShouldReturnDebugString() - { - using (var timestamp = new Timestamp(1)) - { - Assert.AreEqual("1", timestamp.DebugString()); - } - } - - [Test] - public void DebugString_ShouldReturnDebugString_When_TimestampIsUnset() - { - using (var timestamp = Timestamp.Unset()) - { - Assert.AreEqual("Timestamp::Unset()", timestamp.DebugString()); - } - } - #endregion - - #region #NextAllowedInStream - [Test] - public void NextAllowedInStream_ShouldReturnNextTimestamp_When_ValueIsInRange() - { - using (var timestamp = new Timestamp(1)) - { - using (var nextTimestamp = timestamp.NextAllowedInStream()) - { - Assert.AreEqual(2, nextTimestamp.Microseconds()); - } - } - } - - [Test] - public void NextAllowedInStream_ShouldReturnOneOverPostStream_When_TimestampIsPostStream() - { - using (var timestamp = Timestamp.PostStream()) - { - using (var nextTimestamp = timestamp.NextAllowedInStream()) - { - Assert.AreEqual(Timestamp.OneOverPostStream(), nextTimestamp); - } - } - } - #endregion - - #region #PreviousAllowedInStream - [Test] - public void PreviousAllowedInStream_ShouldReturnPreviousTimestamp_When_ValueIsInRange() - { - using (var timestamp = new Timestamp(1)) - { - using (var nextTimestamp = timestamp.PreviousAllowedInStream()) - { - Assert.AreEqual(0, nextTimestamp.Microseconds()); - } - } - } - - [Test] - public void PreviousAllowedInStream_ShouldReturnUnstarted_When_TimestampIsPreStream() - { - using (var timestamp = Timestamp.PreStream()) - { - using (var nextTimestamp = timestamp.PreviousAllowedInStream()) - { - Assert.AreEqual(Timestamp.Unstarted(), nextTimestamp); - } - } - } - #endregion - - #region #FromSeconds - [Test] - public void FromSeconds_ShouldReturnTimestamp() - { - using (var timestamp = Timestamp.FromSeconds(1d)) - { - Assert.AreEqual(1_000_000, timestamp.Microseconds()); - } - } - #endregion - } -} diff --git a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/TimestampTest.cs.meta b/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/TimestampTest.cs.meta deleted file mode 100644 index a5dfbda..0000000 --- a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/TimestampTest.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 4a89b44de17930bf6bcbf5f75f57c100 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Tool.meta b/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Tool.meta deleted file mode 100644 index e554234..0000000 --- a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Tool.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: b737c0d514315064ebd2a4180cc065a3 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Tool/NameUtilTest.cs b/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Tool/NameUtilTest.cs deleted file mode 100644 index 3fcc7b7..0000000 --- a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Tool/NameUtilTest.cs +++ /dev/null @@ -1,156 +0,0 @@ -// Copyright (c) 2021 homuler -// -// Use of this source code is governed by an MIT-style -// license that can be found in the LICENSE file or at -// https://opensource.org/licenses/MIT. - -using NUnit.Framework; -using System; - -namespace Mediapipe.Tests -{ - public class NameUtilTest - { - [TestCase("{}", "base", "base")] - [TestCase(@"{""node"":[{""name"":""a""}]}", "base", "base")] - [TestCase(@"{""node"":[{},{}]}", "", "")] - [TestCase(@"{""node"":[{""name"":""base""},{""name"":""base_02""}]}", "base", "base_03")] - public void GetUnusedNodeName_ShouldReturnUniqueName(string configJson, string nameBase, string uniqueName) - { - var config = CalculatorGraphConfig.Parser.ParseJson(configJson); - Assert.AreEqual(uniqueName, Tool.GetUnusedNodeName(config, nameBase)); - } - - [TestCase("{}", "base", "base")] - [TestCase(@"{""node"":[{""input_side_packet"":[""a""]}]}", "base", "base")] - [TestCase(@"{""node"":[{},{""input_side_packet"":[]}]}", "", "")] - [TestCase(@"{""node"":[{""input_side_packet"":[""base""]},{""input_side_packet"":[""TAG:base_02""]}]}", "base", "base_03")] - public void GetUnusedSidePacketName_ShouldReturnUniqueName(string configJson, string nameBase, string uniqueName) - { - var config = CalculatorGraphConfig.Parser.ParseJson(configJson); - Assert.AreEqual(uniqueName, Tool.GetUnusedSidePacketName(config, nameBase)); - } - - [TestCase(@"{""node"":[{""name"":""x""}]}", 0, "x")] - [TestCase(@"{""node"":[{""name"":""x""},{""name"":""x""},{""name"":""y""},{""name"":""x""}]}", 0, "x_1")] - [TestCase(@"{""node"":[{""name"":""x""},{""name"":""x""},{""name"":""y""},{""name"":""x""}]}", 1, "x_2")] - [TestCase(@"{""node"":[{""name"":""x""},{""name"":""x""},{""name"":""y""},{""name"":""x""}]}", 2, "y")] - [TestCase(@"{""node"":[{""name"":""x""},{""name"":""x""},{""name"":""y""},{""name"":""x""}]}", 3, "x_3")] - [TestCase(@"{""node"":[{""calculator"":""x""},{""name"":""x""}]}", 0, "x_1")] - [TestCase(@"{""node"":[{""calculator"":""x""},{""name"":""x""}]}", 1, "x_2")] - [TestCase(@"{""node"":[{""name"":""x""},{""calculator"":""x""}]}", 0, "x_1")] - [TestCase(@"{""node"":[{""name"":""x""},{""calculator"":""x""}]}", 1, "x_2")] - public void CanonicalNodeName_ShouldReturnCanonicalNodeName_When_NodeIdIsValid(string configJson, int nodeId, string name) - { - var config = CalculatorGraphConfig.Parser.ParseJson(configJson); - Assert.AreEqual(name, Tool.CanonicalNodeName(config, nodeId)); - } - - [Test] - public void CanonicalNodeName_ShouldThrow_When_NodeIdIsNegative() - { - var config = CalculatorGraphConfig.Parser.ParseJson(@"{""node"":[{""name"":""name""}]}"); -#pragma warning disable IDE0058 - Assert.Throws(() => { Tool.CanonicalNodeName(config, -1); }); -#pragma warning restore IDE0058 - } - - [Test] - public void CanonicalNodeName_ShouldThrow_When_NodeIdIsInvalid() - { - var config = CalculatorGraphConfig.Parser.ParseJson(@"{""node"":[{""name"":""name""}]}"); -#pragma warning disable IDE0058 - Assert.Throws(() => { Tool.CanonicalNodeName(config, 1); }); -#pragma warning restore IDE0058 - } - - [Test] - public void CanonicalNodeName_ShouldThrow_When_NodeIsEmpty() - { - var config = CalculatorGraphConfig.Parser.ParseJson("{}"); -#pragma warning disable IDE0058 - Assert.Throws(() => { Tool.CanonicalNodeName(config, 0); }); -#pragma warning restore IDE0058 - } - - [TestCase("stream", "stream")] - [TestCase("TAG:x", "x")] - [TestCase("TAG:1:x", "x")] - public void ParseNameFromStream_ShouldReturnName_When_InputIsValid(string stream, string name) - { - Assert.AreEqual(name, Tool.ParseNameFromStream(stream)); - } - - [TestCase(":stream")] - [TestCase("TAG::stream")] - [TestCase("TAG:1:")] - public void ParseNameFromStream_ShouldThrow_When_InputIsInvalid(string stream) - { -#pragma warning disable IDE0058 - Assert.Throws(() => { Tool.ParseNameFromStream(stream); }); -#pragma warning restore IDE0058 - } - - [TestCase("", "", 0)] - [TestCase("TAG", "TAG", 0)] - [TestCase(":1", "", 1)] - [TestCase("TAG:1", "TAG", 1)] - public void ParseTagIndex_ShouldReturnTagIndexPair_When_InputIsValid(string tagIndex, string tag, int index) - { - var output = Tool.ParseTagIndex(tagIndex); - - Assert.AreEqual(tag, output.Item1); - Assert.AreEqual(index, output.Item2); - } - - [TestCase("tag")] - [TestCase(":")] - [TestCase("TAG:")] - [TestCase("1")] - public void ParseTagIndex_ShouldThrow_When_InputIsInvalid(string tagIndex) - { -#pragma warning disable IDE0058 - Assert.Throws(() => { Tool.ParseTagIndex(tagIndex); }); -#pragma warning restore IDE0058 - } - - [TestCase("stream", "", -1)] - [TestCase("TAG:x", "TAG", 0)] - [TestCase("TAG:1:x", "TAG", 1)] - public void ParseTagIndexFromStream_ShouldReturnTagIndexPair_When_InputIsValid(string stream, string tag, int index) - { - var output = Tool.ParseTagIndexFromStream(stream); - - Assert.AreEqual(tag, output.Item1); - Assert.AreEqual(index, output.Item2); - } - - [TestCase(":stream")] - [TestCase("TAG::stream")] - [TestCase("TAG:1:")] - public void ParseTagIndexFromStream_ShouldThrow_When_InputIsInvalid(string stream) - { -#pragma warning disable IDE0058 - Assert.Throws(() => { Tool.ParseTagIndexFromStream(stream); }); -#pragma warning restore IDE0058 - } - - [TestCase("", -1, "")] - [TestCase("", 1, "")] - [TestCase("TAG", -1, "TAG")] - [TestCase("TAG", 1, "TAG:1")] - public void CatTag_ShouldReturnTag(string tag, int index, string output) - { - Assert.AreEqual(output, Tool.CatTag(tag, index)); - } - - [TestCase("", -1, "x", "x")] - [TestCase("", 1, "x", "x")] - [TestCase("TAG", -1, "x", "TAG:x")] - [TestCase("TAG", 1, "x", "TAG:1:x")] - public void CatStream_ShouldReturnStream(string tag, int index, string name, string output) - { - Assert.AreEqual(output, Tool.CatStream((tag, index), name)); - } - } -} diff --git a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Tool/NameUtilTest.cs.meta b/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Tool/NameUtilTest.cs.meta deleted file mode 100644 index 9ca8108..0000000 --- a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Tool/NameUtilTest.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 7707b1c1356d57b29b1ad8932beca1a4 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Tool/ValidateNameTest.cs b/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Tool/ValidateNameTest.cs deleted file mode 100644 index 75192d9..0000000 --- a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Tool/ValidateNameTest.cs +++ /dev/null @@ -1,290 +0,0 @@ -// Copyright (c) 2021 homuler -// -// Use of this source code is governed by an MIT-style -// license that can be found in the LICENSE file or at -// https://opensource.org/licenses/MIT. - -using NUnit.Framework; -using System; - -namespace Mediapipe.Tests -{ - public class ValidateNameTest - { - #region .ValidateName - [TestCase("humphrey")] - [TestCase("humphrey_bogart")] - [TestCase("humphrey_bogart_1899")] - [TestCase("aa")] - [TestCase("b1")] - [TestCase("_1")] - public void ValidateName_ShouldNotThrow_WhenNameIsValid(string name) - { - Assert.DoesNotThrow(() => { Tool.ValidateName(name); }); - } - - [TestCase("")] - [TestCase("humphrey bogart")] - [TestCase("humphreyBogart")] - [TestCase("humphrey-bogart")] - [TestCase("humphrey/bogart")] - [TestCase("humphrey.bogart")] - [TestCase("humphrey:bogart")] - [TestCase("1ST")] - [TestCase("7_ELEVEN")] - [TestCase("401K")] - [TestCase("0")] - [TestCase("1")] - [TestCase("11")] - [TestCase("92091")] - [TestCase("1st")] - [TestCase("7_eleven")] - [TestCase("401k")] - [TestCase("\0contains_escapes\t")] - public void ValidateName_ShouldThrow_WhenNameIsInvalid(string name) - { -#pragma warning disable IDE0058 - Assert.Throws(() => { Tool.ValidateName(name); }); -#pragma warning restore IDE0058 - } - #endregion - - #region .ValidateNumber - [TestCase("0")] - [TestCase("10")] - [TestCase("1234567890")] - public void ValidateNumber_ShouldNotThrow_WhenNumberIsValid(string number) - { - Assert.DoesNotThrow(() => { Tool.ValidateNumber(number); }); - } - - [TestCase("01")] - [TestCase("1a")] - public void ValidateNumber_ShouldThrow_WhenNumberIsInvalid(string number) - { -#pragma warning disable IDE0058 - Assert.Throws(() => { Tool.ValidateNumber(number); }); -#pragma warning restore IDE0058 - } - #endregion - - #region .ValidateTag - [TestCase("MALE")] - [TestCase("MALE_ACTOR")] - [TestCase("ACTOR_1899")] - [TestCase("AA")] - [TestCase("B1")] - [TestCase("_1")] - public void ValidateTag_ShouldNotThrow_WhenTagIsValid(string tag) - { - Assert.DoesNotThrow(() => { Tool.ValidateTag(tag); }); - } - - [TestCase("")] - [TestCase("MALE ACTOR")] - [TestCase("MALEaCTOR")] - [TestCase("MALE-ACTOR")] - [TestCase("MALE/ACTOR")] - [TestCase("MALE.ACTOR")] - [TestCase("MALE:ACTOR")] - [TestCase("0")] - [TestCase("1")] - [TestCase("11")] - [TestCase("92091")] - [TestCase("1ST")] - [TestCase("7_ELEVEN")] - [TestCase("401K")] - [TestCase("\0CONTAINS_ESCAPES\t")] - public void ValidateTag_ShouldThrow_WhenTagIsInvalid(string tag) - { -#pragma warning disable IDE0058 - Assert.Throws(() => { Tool.ValidateTag(tag); }); -#pragma warning restore IDE0058 - } - #endregion - - #region .ParseTagAndName - [TestCase("MALE:humphrey", "MALE", "humphrey")] - [TestCase("ACTOR:humphrey_bogart", "ACTOR", "humphrey_bogart")] - [TestCase("ACTOR_1899:humphrey_1899", "ACTOR_1899", "humphrey_1899")] - [TestCase("humphrey_bogart", "", "humphrey_bogart")] - [TestCase("ACTOR:humphrey", "ACTOR", "humphrey")] - public void ParseTagAndName_ShouldParseInput_When_InputIsValid(string input, string expectedTag, string expectedName) - { - Tool.ParseTagAndName(input, out var tag, out var name); - - Assert.AreEqual(expectedTag, tag); - Assert.AreEqual(expectedName, name); - } - - [TestCase(":humphrey")] - [TestCase("humphrey bogart")] - [TestCase("actor:humphrey")] - [TestCase("actor:humphrey")] - [TestCase("ACTOR:HUMPHREY")] - public void ParseTagAndName_ShouldThrow_When_InputIsInvalid(string input) - { - var tag = "UNTOUCHED"; - var name = "untouched"; - -#pragma warning disable IDE0058 - Assert.Throws(() => { Tool.ParseTagAndName(input, out tag, out name); }); - Assert.AreEqual("UNTOUCHED", tag); - Assert.AreEqual("untouched", name); -#pragma warning restore IDE0058 - } - - [Test] - public void ParseTagAndName_ShouldThrow_When_InputIncludesBadCharacters( - [Values(' ', '-', '/', '.', ':')] char ch, - [Values("MALE$0ACTOR:humphrey", "ACTOR:humphrey$0:bogart")] string str - ) - { - ParseTagAndName_ShouldThrow_When_InputIsInvalid(str.Replace("$0", $"{ch}")); - } - #endregion - - #region .ParseTagIndexName - [TestCase("MALE:humphrey", "MALE", 0, "humphrey")] - [TestCase("ACTOR:humphrey_bogart", "ACTOR", 0, "humphrey_bogart")] - [TestCase("ACTOR_1899:humphrey_1899", "ACTOR_1899", 0, "humphrey_1899")] - [TestCase("humphrey_bogart", "", -1, "humphrey_bogart")] - [TestCase("ACTRESS:3:mieko_harada", "ACTRESS", 3, "mieko_harada")] - [TestCase("ACTRESS:0:mieko_harada", "ACTRESS", 0, "mieko_harada")] - [TestCase("A1:100:mieko1", "A1", 100, "mieko1")] - [TestCase("A1:10000:mieko1", "A1", 10000, "mieko1")] - public void ParseTagIndexName_ShouldParseInput_When_InputIsValid(string input, string expectedTag, int expectedIndex, string expectedName) - { - Tool.ParseTagIndexName(input, out var tag, out var index, out var name); - - Assert.AreEqual(expectedTag, tag); - Assert.AreEqual(expectedIndex, index); - Assert.AreEqual(expectedName, name); - } - - [TestCase("")] - [TestCase("A")] - [TestCase("Aa")] - [TestCase("aA")] - [TestCase("1a")] - [TestCase("1")] - [TestCase(":name")] - [TestCase("A:")] - [TestCase("a:name")] - [TestCase("Aa:name")] - [TestCase("aA:name")] - [TestCase("1A:name")] - [TestCase("1:name")] - [TestCase(":1:name")] - [TestCase("A:1:")] - [TestCase("A::name")] - [TestCase("a:1:name")] - [TestCase("Aa:1:name")] - [TestCase("aA:1:name")] - [TestCase("1A:1:name")] - [TestCase("1:1:name")] - [TestCase("A:1:N")] - [TestCase("A:1:nN")] - [TestCase("A:1:Nn")] - [TestCase("A:1:1name")] - [TestCase("A:1:1")] - [TestCase("A:-0:name")] - [TestCase("A:-1:name")] - [TestCase("A:01:name")] - [TestCase("A:00:name")] - [TestCase("A:10001:a")] - [TestCase("A:1:a:")] - [TestCase(":A:1:a")] - [TestCase("A:1:a:a")] - [TestCase("A:1:a:A")] - [TestCase("A:1:a:1")] - public void ParseTagIndexName_ShouldThrow_When_InputIsInvalid(string input) - { - var tag = "UNTOUCHED"; - var index = -1; - var name = "untouched"; - -#pragma warning disable IDE0058 - Assert.Throws(() => { Tool.ParseTagIndexName(input, out tag, out index, out name); }); - Assert.AreEqual("UNTOUCHED", tag); - Assert.AreEqual(-1, index); - Assert.AreEqual("untouched", name); -#pragma warning restore IDE0058 - } - - [Test] - public void ParseTagIndexName_ShouldThrow_When_InputIncludesBadCharacters( - [Values('!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '{', '}', '[', ']', - '/', '=', '?', '+', '\\', '|', '-', ';', ':', '\'', '"', '<', '.', '>')] char ch, - [Values("$0", "$0a", "a$0", "$0:a", "A$0:a", "$0A:a", "A:$0:a", "A:$01:a", "A:1$0:a", "A:1:a$0", "$0A:1:a")] string str - ) - { - ParseTagIndexName_ShouldThrow_When_InputIsInvalid(str.Replace("$0", $"{ch}")); - } - #endregion - - #region .ParseTagIndex - [TestCase("", "", 0)] - [TestCase("VIDEO:0", "VIDEO", 0)] - [TestCase("VIDEO:1", "VIDEO", 1)] - [TestCase("AUDIO:2", "AUDIO", 2)] - [TestCase(":0", "", 0)] - [TestCase(":1", "", 1)] - [TestCase(":100", "", 100)] - [TestCase("VIDEO:10000", "VIDEO", 10000)] - public void ParseTagIndex_ShouldParseInput_When_InputIsValid(string input, string expectedTag, int expectedIndex) - { - Tool.ParseTagIndex(input, out var tag, out var index); - - Assert.AreEqual(expectedTag, tag); - Assert.AreEqual(expectedIndex, index); - } - - [TestCase("a")] - [TestCase("Aa")] - [TestCase("aA")] - [TestCase("1A")] - [TestCase("1")] - [TestCase(":")] - [TestCase(":a")] - [TestCase(":A")] - [TestCase(":-0")] - [TestCase(":-1")] - [TestCase(":01")] - [TestCase(":00")] - [TestCase("A:")] - [TestCase("A:a")] - [TestCase("A:A")] - [TestCase("A:-0")] - [TestCase("A:-1")] - [TestCase("A:01")] - [TestCase("A:00")] - [TestCase("A:10001")] - [TestCase("A:1:")] - [TestCase(":A:1")] - [TestCase("A:1:2")] - [TestCase("A:A:1")] - public void ParseTagIndex_ShouldThrow_When_InputIsInvalid(string input) - { - var tag = "UNTOUCHED"; - var index = -1; - -#pragma warning disable IDE0058 - Assert.Throws(() => { Tool.ParseTagIndex(input, out tag, out index); }); - Assert.AreEqual("UNTOUCHED", tag); - Assert.AreEqual(-1, index); -#pragma warning restore IDE0058 - } - - [Test] - public void ParseTagIndex_ShouldThrow_When_InputIncludesBadCharacters( - [Values('!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '{', '}', '[', ']', - '/', '=', '?', '+', '\\', '|', '-', ';', ':', '\'', '"', '<', '.', '>')] char ch, - [Values("$0", "$0A", "A$0", "$0:1", "A$0:1", "$0A:1", "A:1$0", "A:$01")] string str - ) - { - ParseTagIndex_ShouldThrow_When_InputIsInvalid(str.Replace("$0", $"{ch}")); - } - #endregion - } -} diff --git a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Tool/ValidateNameTest.cs.meta b/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Tool/ValidateNameTest.cs.meta deleted file mode 100644 index 42eb7cb..0000000 --- a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/Tool/ValidateNameTest.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 17bfd5c3db2e476b6b04101190819090 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/ValidatedGraphConfigTest.cs b/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/ValidatedGraphConfigTest.cs deleted file mode 100644 index ead2004..0000000 --- a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/ValidatedGraphConfigTest.cs +++ /dev/null @@ -1,743 +0,0 @@ -// Copyright (c) 2021 homuler -// -// Use of this source code is governed by an MIT-style -// license that can be found in the LICENSE file or at -// https://opensource.org/licenses/MIT. - -using NUnit.Framework; -using System.Linq; - -namespace Mediapipe.Tests -{ - public class ValidatedGraphConfigTest - { - private const string _PassThroughConfigText = @" -node { - calculator: ""PassThroughCalculator"" - input_stream: ""in"" - output_stream: ""out1"" -} -node { - calculator: ""PassThroughCalculator"" - input_stream: ""out1"" - output_stream: ""out"" -} -input_stream: ""in"" -output_stream: ""out"" -"; - - private const string _FlowLimiterConfigText = @" -input_stream: ""input_video"" -input_stream: ""output"" - -node { - calculator: ""FlowLimiterCalculator"" - input_stream: ""input_video"" - input_stream: ""FINISHED:output"" - input_stream_info: { - tag_index: ""FINISHED"" - back_edge: true - } - input_side_packet: ""MAX_IN_FLIGHT:max_in_flight"" - input_side_packet: ""OPTIONS:flow_limiter_calculator_options"" - output_stream: ""throttled_input_video"" -} -"; - - private const string _ImageTransformationConfigText = @" -input_stream: ""input_video"" - -node: { - calculator: ""ImageTransformationCalculator"" - input_stream: ""IMAGE:input_video"" - input_side_packet: ""ROTATION_DEGREES:input_rotation"" - input_side_packet: ""FLIP_HORIZONTALLY:input_horizontally_flipped"" - input_side_packet: ""FLIP_VERTICALLY:input_vertically_flipped"" - output_stream: ""IMAGE:transformed_input_video"" -} -"; - - private const string _ConstantSidePacketConfigText = @" -node { - calculator: ""ConstantSidePacketCalculator"" - output_side_packet: ""PACKET:0:int_packet"" - output_side_packet: ""PACKET:1:float_packet"" - output_side_packet: ""PACKET:2:bool_packet"" - output_side_packet: ""PACKET:3:string_packet"" - options: { - [mediapipe.ConstantSidePacketCalculatorOptions.ext]: { - packet { int_value: 256 } - packet { float_value: 0.5f } - packet { bool_value: false } - packet { string_value: ""string"" } - } - } -} -"; - - private const string _FaceDetectionShortRangeConfigText = @" -input_stream: ""image"" -input_stream: ""roi"" - -node { - calculator: ""FaceDetectionShortRange"" - input_stream: ""IMAGE:image"" - input_stream: ""ROI:roi"" - output_stream: ""DETECTIONS:detections"" -} -"; - - #region Constructor - [Test] - public void Ctor_ShouldInstantiateValidatedGraphConfig() - { - Assert.DoesNotThrow(() => - { - var config = new ValidatedGraphConfig(); - config.Dispose(); - }); - } - #endregion - - #region #isDisposed - [Test] - public void IsDisposed_ShouldReturnFalse_When_NotDisposedYet() - { - using (var config = new ValidatedGraphConfig()) - { - Assert.False(config.isDisposed); - } - } - - [Test] - public void IsDisposed_ShouldReturnTrue_When_AlreadyDisposed() - { - var config = new ValidatedGraphConfig(); - config.Dispose(); - - Assert.True(config.isDisposed); - } - #endregion - - #region #Initialize - [Test] - public void Initialize_ShouldReturnOk_When_CalledWithConfig() - { - using (var config = new ValidatedGraphConfig()) - { - using (var status = config.Initialize(CalculatorGraphConfig.Parser.ParseFromTextFormat(_PassThroughConfigText))) - { - Assert.True(status.Ok()); - } - Assert.True(config.Initialized()); - } - } - - [Test] - public void Initialize_ShouldReturnOk_When_CalledWithValidGraphType() - { - using (var config = new ValidatedGraphConfig()) - { - using (var status = config.Initialize("SwitchContainer")) - { - Assert.True(status.Ok()); - } - Assert.True(config.Initialized()); - } - } - - [Test] - public void Initialize_ShouldReturnInternalError_When_CalledWithInvalidGraphType() - { - using (var config = new ValidatedGraphConfig()) - { - using (var status = config.Initialize("InvalidSubgraph")) - { - Assert.AreEqual(Status.StatusCode.NotFound, status.Code()); - } - Assert.False(config.Initialized()); - } - } - #endregion - - #region #ValidateRequiredSidePackets - [Test] - public void ValidateRequiredSidePackets_ShouldReturnOk_When_TheConfigDoesNotRequireSidePackets_And_SidePacketIsEmpty() - { - using (var config = new ValidatedGraphConfig()) - { - config.Initialize(CalculatorGraphConfig.Parser.ParseFromTextFormat(_PassThroughConfigText)).AssertOk(); - using (var sidePacket = new SidePacket()) - { - using (var status = config.ValidateRequiredSidePackets(sidePacket)) - { - Assert.True(status.Ok()); - } - } - } - } - - [Test] - public void ValidateRequiredSidePackets_ShouldReturnOk_When_TheConfigDoesNotRequireSidePackets_And_SidePacketIsNotEmpty() - { - using (var config = new ValidatedGraphConfig()) - { - config.Initialize(CalculatorGraphConfig.Parser.ParseFromTextFormat(_PassThroughConfigText)).AssertOk(); - using (var sidePacket = new SidePacket()) - { - sidePacket.Emplace("in", new IntPacket(0)); - using (var status = config.ValidateRequiredSidePackets(sidePacket)) - { - Assert.True(status.Ok()); - } - } - } - } - - [Test] - public void ValidateRequiredSidePackets_ShouldReturnOk_When_AllTheSidePacketsAreOptional_And_SidePacketIsEmpty() - { - using (var config = new ValidatedGraphConfig()) - { - config.Initialize(CalculatorGraphConfig.Parser.ParseFromTextFormat(_FlowLimiterConfigText)).AssertOk(); - using (var sidePacket = new SidePacket()) - { - using (var status = config.ValidateRequiredSidePackets(sidePacket)) - { - Assert.True(status.Ok()); - } - } - } - } - - [Test] - public void ValidateRequiredSidePackets_ShouldReturnInvalidArgumentError_When_TheConfigRequiresSidePackets_And_SidePacketIsEmpty() - { - using (var config = new ValidatedGraphConfig()) - { - config.Initialize(CalculatorGraphConfig.Parser.ParseFromTextFormat(_ImageTransformationConfigText)).AssertOk(); - using (var sidePacket = new SidePacket()) - { - using (var status = config.ValidateRequiredSidePackets(sidePacket)) - { - Assert.AreEqual(Status.StatusCode.InvalidArgument, status.Code()); - } - } - } - } - - [Test] - public void ValidateRequiredSidePackets_ShouldReturnInvalidArgumentError_When_AllTheRequiredSidePacketsAreNotGiven() - { - using (var config = new ValidatedGraphConfig()) - { - config.Initialize(CalculatorGraphConfig.Parser.ParseFromTextFormat(_ImageTransformationConfigText)).AssertOk(); - using (var sidePacket = new SidePacket()) - { - sidePacket.Emplace("input_horizontally_flipped", new BoolPacket(false)); - sidePacket.Emplace("input_vertically_flipped", new BoolPacket(true)); - using (var status = config.ValidateRequiredSidePackets(sidePacket)) - { - Assert.AreEqual(Status.StatusCode.InvalidArgument, status.Code()); - } - } - } - } - - [Test] - public void ValidateRequiredSidePackets_ShouldReturnInvalidArgumentError_When_TheSidePacketValuesAreWrong() - { - using (var config = new ValidatedGraphConfig()) - { - config.Initialize(CalculatorGraphConfig.Parser.ParseFromTextFormat(_ImageTransformationConfigText)).AssertOk(); - using (var sidePacket = new SidePacket()) - { - sidePacket.Emplace("input_horizontally_flipped", new BoolPacket(false)); - sidePacket.Emplace("input_vertically_flipped", new BoolPacket(true)); - sidePacket.Emplace("input_rotation", new StringPacket("0")); - using (var status = config.ValidateRequiredSidePackets(sidePacket)) - { - Assert.AreEqual(Status.StatusCode.InvalidArgument, status.Code()); - } - } - } - } - - [Test] - public void ValidateRequiredSidePackets_ShouldReturnOk_When_AllTheRequiredSidePacketsAreGiven() - { - using (var config = new ValidatedGraphConfig()) - { - config.Initialize(CalculatorGraphConfig.Parser.ParseFromTextFormat(_ImageTransformationConfigText)).AssertOk(); - using (var sidePacket = new SidePacket()) - { - sidePacket.Emplace("input_horizontally_flipped", new BoolPacket(false)); - sidePacket.Emplace("input_vertically_flipped", new BoolPacket(true)); - sidePacket.Emplace("input_rotation", new IntPacket(0)); - using (var status = config.ValidateRequiredSidePackets(sidePacket)) - { - Assert.True(status.Ok()); - } - } - } - } - #endregion - - #region Config - [Test] - public void Config_ShouldReturnAnEmptyConfig_When_NotInitialized() - { - using (var config = new ValidatedGraphConfig()) - { - var canonicalizedConfig = config.Config(); - Assert.AreEqual(canonicalizedConfig.CalculateSize(), 0); - } - } - - [Test] - public void Config_ShouldReturnTheCanonicalizedConfig_When_TheConfigIsPassThroughConfig() - { - using (var config = new ValidatedGraphConfig()) - { - var originalConfig = CalculatorGraphConfig.Parser.ParseFromTextFormat(_PassThroughConfigText); - config.Initialize(originalConfig).AssertOk(); - var canonicalizedConfig = config.Config(); - - Assert.AreEqual(originalConfig.Node, canonicalizedConfig.Node); - Assert.AreEqual(originalConfig.InputStream, canonicalizedConfig.InputStream); - Assert.AreEqual(originalConfig.OutputStream, canonicalizedConfig.OutputStream); - Assert.IsEmpty(originalConfig.Executor); - Assert.AreEqual(1, canonicalizedConfig.Executor.Count); - Assert.AreEqual(0, canonicalizedConfig.Executor[0].CalculateSize()); - - Assert.AreEqual(80, originalConfig.CalculateSize()); - Assert.AreEqual(82, canonicalizedConfig.CalculateSize()); - } - } - - [Test] - public void Config_ShouldReturnTheCanonicalizedConfig_When_TheConfigIsFaceDetectionShortRangeCommonConfig() - { - using (var config = new ValidatedGraphConfig()) - { - var originalConfig = CalculatorGraphConfig.Parser.ParseFromTextFormat(_FaceDetectionShortRangeConfigText); - config.Initialize(originalConfig).AssertOk(); - var canonicalizedConfig = config.Config(); - - Assert.AreEqual(84, originalConfig.CalculateSize()); - // 2167 on CPU, 2166 on GPU - Assert.AreEqual(2166, canonicalizedConfig.CalculateSize(), 1); - } - } - #endregion - - #region InputStreamInfos - [Test] - public void InputStreamInfos_ShouldReturnEmptyList_When_NotInitialized() - { - using (var config = new ValidatedGraphConfig()) - { - Assert.IsEmpty(config.InputStreamInfos()); - } - } - - [Test] - public void InputStreamInfos_ShouldReturnEmptyList_When_NoInputStreamExists() - { - using (var config = new ValidatedGraphConfig()) - { - config.Initialize(CalculatorGraphConfig.Parser.ParseFromTextFormat(_ConstantSidePacketConfigText)).AssertOk(); - Assert.IsEmpty(config.InputStreamInfos()); - } - } - - [Test] - public void InputStreamInfos_ShouldReturnEdgeInfoList_When_InputStreamsExist() - { - using (var config = new ValidatedGraphConfig()) - { - config.Initialize(CalculatorGraphConfig.Parser.ParseFromTextFormat(_PassThroughConfigText)).AssertOk(); - var inputStreamInfos = config.InputStreamInfos(); - - Assert.AreEqual(inputStreamInfos.Count, 2); - - var inStream = inputStreamInfos.First((edgeInfo) => edgeInfo.name == "in"); - Assert.AreEqual(0, inStream.upstream); - Assert.AreEqual(NodeType.Calculator, inStream.parentNode.type); - Assert.AreEqual(0, inStream.parentNode.index); - Assert.False(inStream.backEdge); - - var out1Stream = inputStreamInfos.First((edgeInfo) => edgeInfo.name == "out1"); - Assert.AreEqual(1, out1Stream.upstream); - Assert.AreEqual(NodeType.Calculator, out1Stream.parentNode.type); - Assert.AreEqual(1, out1Stream.parentNode.index); - Assert.False(out1Stream.backEdge); - } - } - #endregion - - #region OutputStreamInfos - [Test] - public void OutputStreamInfos_ShouldReturnEmptyList_When_NotInitialized() - { - using (var config = new ValidatedGraphConfig()) - { - Assert.IsEmpty(config.OutputStreamInfos()); - } - } - - [Test] - public void OutputStreamInfos_ShouldReturnEdgeInfoList_When_OutputStreamsExist() - { - using (var config = new ValidatedGraphConfig()) - { - config.Initialize(CalculatorGraphConfig.Parser.ParseFromTextFormat(_PassThroughConfigText)).AssertOk(); - var outputStreamInfos = config.OutputStreamInfos(); - - Assert.AreEqual(3, outputStreamInfos.Count); - - var inStream = outputStreamInfos.First((edgeInfo) => edgeInfo.name == "in"); - Assert.AreEqual(-1, inStream.upstream); - Assert.AreEqual(NodeType.GraphInputStream, inStream.parentNode.type); - Assert.AreEqual(2, inStream.parentNode.index, 2); - Assert.False(inStream.backEdge); - - var out1Stream = outputStreamInfos.First((edgeInfo) => edgeInfo.name == "out1"); - Assert.AreEqual(-1, out1Stream.upstream); - Assert.AreEqual(NodeType.Calculator, out1Stream.parentNode.type); - Assert.AreEqual(0, out1Stream.parentNode.index); - Assert.False(out1Stream.backEdge); - - var outStream = outputStreamInfos.First((edgeInfo) => edgeInfo.name == "out"); - Assert.AreEqual(-1, outStream.upstream); - Assert.AreEqual(NodeType.Calculator, outStream.parentNode.type); - Assert.AreEqual(1, outStream.parentNode.index); - Assert.False(outStream.backEdge); - } - } - #endregion - - #region InputSidePacketInfos - [Test] - public void InputSidePacketInfos_ShouldReturnEmptyList_When_NotInitialized() - { - using (var config = new ValidatedGraphConfig()) - { - Assert.IsEmpty(config.InputSidePacketInfos()); - } - } - - [Test] - public void InputSidePacketInfos_ShouldReturnEmptyList_When_NoInputSidePacketExists() - { - using (var config = new ValidatedGraphConfig()) - { - config.Initialize(CalculatorGraphConfig.Parser.ParseFromTextFormat(_PassThroughConfigText)).AssertOk(); - Assert.IsEmpty(config.InputSidePacketInfos()); - } - } - - [Test] - public void InputSidePacketInfos_ShouldReturnEdgeInfoList_When_InputSidePacketsExist() - { - using (var config = new ValidatedGraphConfig()) - { - config.Initialize(CalculatorGraphConfig.Parser.ParseFromTextFormat(_FlowLimiterConfigText)).AssertOk(); - var inputSidePacketInfos = config.InputSidePacketInfos(); - - Assert.True(inputSidePacketInfos.Count >= 2); - - var maxInFlightPacket = inputSidePacketInfos.First((edgeInfo) => edgeInfo.name == "max_in_flight"); - Assert.AreEqual(-1, maxInFlightPacket.upstream); - Assert.AreEqual(NodeType.Calculator, maxInFlightPacket.parentNode.type); - Assert.False(maxInFlightPacket.backEdge); - - var flowLimiterCalculatorOptionsPacket = inputSidePacketInfos.First((edgeInfo) => edgeInfo.name == "flow_limiter_calculator_options"); - Assert.AreEqual(-1, flowLimiterCalculatorOptionsPacket.upstream); - Assert.AreEqual(NodeType.Calculator, flowLimiterCalculatorOptionsPacket.parentNode.type); - Assert.False(flowLimiterCalculatorOptionsPacket.backEdge); - } - } - #endregion - - #region OutputSidePacketInfos - [Test] - public void OutputSidePacketInfos_ShouldReturnEmptyList_When_NotInitialized() - { - using (var config = new ValidatedGraphConfig()) - { - Assert.IsEmpty(config.OutputSidePacketInfos()); - } - } - - [Test] - public void OutputSidePacketInfos_ShouldReturnEmptyList_When_NoOutputSidePacketExists() - { - using (var config = new ValidatedGraphConfig()) - { - config.Initialize(CalculatorGraphConfig.Parser.ParseFromTextFormat(_PassThroughConfigText)).AssertOk(); - Assert.IsEmpty(config.OutputSidePacketInfos()); - } - } - - [Test] - public void OutputSidePacketInfos_ShouldReturnEdgeInfoList_When_OutputSidePacketsExist() - { - using (var config = new ValidatedGraphConfig()) - { - config.Initialize(CalculatorGraphConfig.Parser.ParseFromTextFormat(_ConstantSidePacketConfigText)).AssertOk(); - var outputSidePacketInfos = config.OutputSidePacketInfos(); - - Assert.AreEqual(4, outputSidePacketInfos.Count); - - var intPacket = outputSidePacketInfos.First((edgeInfo) => edgeInfo.name == "int_packet"); - Assert.AreEqual(-1, intPacket.upstream); - Assert.AreEqual(NodeType.Calculator, intPacket.parentNode.type); - Assert.False(intPacket.backEdge); - - var floatPacket = outputSidePacketInfos.First((edgeInfo) => edgeInfo.name == "float_packet"); - Assert.AreEqual(-1, floatPacket.upstream); - Assert.AreEqual(NodeType.Calculator, floatPacket.parentNode.type); - Assert.False(floatPacket.backEdge); - - var boolPacket = outputSidePacketInfos.First((edgeInfo) => edgeInfo.name == "bool_packet"); - Assert.AreEqual(-1, boolPacket.upstream); - Assert.AreEqual(NodeType.Calculator, boolPacket.parentNode.type); - Assert.False(boolPacket.backEdge); - - var stringPacket = outputSidePacketInfos.First((edgeInfo) => edgeInfo.name == "string_packet"); - Assert.AreEqual(-1, stringPacket.upstream); - Assert.AreEqual(NodeType.Calculator, stringPacket.parentNode.type); - Assert.False(stringPacket.backEdge); - } - } - #endregion - - #region OutputStreamIndex - [Test] - public void OutputStreamIndex_ShouldReturnNegativeValue_When_NotInitialized() - { - using (var config = new ValidatedGraphConfig()) - { - Assert.AreEqual(-1, config.OutputStreamIndex("")); - } - } - - [Test] - public void OutputStreamIndex_ShouldReturnNegativeValue_When_TheNameIsInvalid() - { - using (var config = new ValidatedGraphConfig()) - { - config.Initialize(CalculatorGraphConfig.Parser.ParseFromTextFormat(_PassThroughConfigText)).AssertOk(); - Assert.AreEqual(-1, config.OutputStreamIndex("unknown")); - } - } - - [Test] - public void OutputStreamIndex_ShouldReturnIndex_When_TheNameIsValid() - { - using (var config = new ValidatedGraphConfig()) - { - config.Initialize(CalculatorGraphConfig.Parser.ParseFromTextFormat(_PassThroughConfigText)).AssertOk(); - Assert.AreEqual(2, config.OutputStreamIndex("out")); - } - } - - [Test] - public void OutputStreamIndex_ShouldReturnIndex_When_TheStreamIsNotPublic() - { - using (var config = new ValidatedGraphConfig()) - { - config.Initialize(CalculatorGraphConfig.Parser.ParseFromTextFormat(_PassThroughConfigText)).AssertOk(); - Assert.AreEqual(1, config.OutputStreamIndex("out1")); - } - } - #endregion - - #region OutputSidePacketIndex - [Test] - public void OutputSidePacketIndex_ShouldReturnNegativeValue_When_NotInitialized() - { - using (var config = new ValidatedGraphConfig()) - { - Assert.AreEqual(-1, config.OutputSidePacketIndex("")); - } - } - - [Test] - public void OutputSidePacketIndex_ShouldReturnNegativeValue_When_TheNameIsInvalid() - { - using (var config = new ValidatedGraphConfig()) - { - config.Initialize(CalculatorGraphConfig.Parser.ParseFromTextFormat(_ConstantSidePacketConfigText)).AssertOk(); - Assert.AreEqual(-1, config.OutputSidePacketIndex("unknown")); - } - } - - [Test] - public void OutputSidePacketIndex_ShouldReturnIndex_When_TheNameIsValid() - { - using (var config = new ValidatedGraphConfig()) - { - config.Initialize(CalculatorGraphConfig.Parser.ParseFromTextFormat(_ConstantSidePacketConfigText)).AssertOk(); - Assert.AreEqual(0, config.OutputSidePacketIndex("int_packet")); - } - } - #endregion - - - #region OutputStreamToNode - [Test] - public void OutputStreamToNode_ShouldReturnNegativeValue_When_NotInitialized() - { - using (var config = new ValidatedGraphConfig()) - { - Assert.AreEqual(-1, config.OutputStreamToNode("")); - } - } - - [Test] - public void OutputStreamToNode_ShouldReturnNegativeValue_When_TheNameIsInvalid() - { - using (var config = new ValidatedGraphConfig()) - { - config.Initialize(CalculatorGraphConfig.Parser.ParseFromTextFormat(_PassThroughConfigText)).AssertOk(); - Assert.AreEqual(-1, config.OutputStreamToNode("unknown")); - } - } - - [Test] - public void OutputStreamToNode_ShouldReturnIndex_When_TheNameIsValid() - { - using (var config = new ValidatedGraphConfig()) - { - config.Initialize(CalculatorGraphConfig.Parser.ParseFromTextFormat(_PassThroughConfigText)).AssertOk(); - Assert.AreEqual(0, config.OutputStreamToNode("out1")); - } - } - #endregion - - #region RegisteredSidePacketTypeName - [Test] - public void RegisteredSidePacketTypeName_ShouldReturnInvalidArgumentError_When_TheSidePacketDoesNotExist() - { - using (var config = new ValidatedGraphConfig()) - { - using (var statusOrString = config.RegisteredSidePacketTypeName("max_in_flight")) - { - Assert.AreEqual(Status.StatusCode.InvalidArgument, statusOrString.status.Code()); - } - } - } - - [Test] - public void RegisteredSidePacketTypeName_ShouldReturnUnknownError_When_TheSidePacketTypeCannotBeDetermined() - { - using (var config = new ValidatedGraphConfig()) - { - config.Initialize(CalculatorGraphConfig.Parser.ParseFromTextFormat(_FlowLimiterConfigText)).AssertOk(); - using (var statusOrString = config.RegisteredSidePacketTypeName("max_in_flight")) - { - Assert.AreEqual(Status.StatusCode.Unknown, statusOrString.status.Code()); - } - } - } - #endregion - - #region RegisteredStreamTypeName - [Test] - public void RegisteredStreamTypeName_ShouldReturnInvalidArgumentError_When_TheStreamDoesNotExist() - { - using (var config = new ValidatedGraphConfig()) - { - using (var statusOrString = config.RegisteredStreamTypeName("in")) - { - Assert.AreEqual(Status.StatusCode.InvalidArgument, statusOrString.status.Code()); - } - } - } - - [Test] - public void RegisteredStreamTypeName_ShouldReturnUnknownError_When_TheStreamTypeCannotBeDetermined() - { - using (var config = new ValidatedGraphConfig()) - { - config.Initialize(CalculatorGraphConfig.Parser.ParseFromTextFormat(_PassThroughConfigText)).AssertOk(); - using (var statusOrString = config.RegisteredStreamTypeName("in")) - { - Assert.AreEqual(Status.StatusCode.Unknown, statusOrString.status.Code()); - } - } - } - #endregion - - #region Package - [Test] - public void Package_ShouldReturnNull_When_NotInitialized() - { - using (var config = new ValidatedGraphConfig()) - { - Assert.IsNull(config.Package()); - } - } - - [Test] - public void Package_ShouldReturnNull_When_TheNamespaceIsNotSet() - { - using (var config = new ValidatedGraphConfig()) - { - config.Initialize(CalculatorGraphConfig.Parser.ParseFromTextFormat(_PassThroughConfigText)).AssertOk(); - Assert.IsNull(config.Package()); - } - } - #endregion - - #region IsReservedExecutorName - [Test] - public void IsReservedExecutorName_ShouldReturnFalse_When_TheNameIsNotReserved() - { - Assert.False(ValidatedGraphConfig.IsReservedExecutorName("unknown")); - } - - [Test] - public void IsReservedExecutorName_ShouldReturnFalse_When_TheNameIsReserved() - { - Assert.True(ValidatedGraphConfig.IsReservedExecutorName("default")); - Assert.True(ValidatedGraphConfig.IsReservedExecutorName("gpu")); - Assert.True(ValidatedGraphConfig.IsReservedExecutorName("__gpu")); - } - #endregion - - #region IsExternalSidePacket - [Test] - public void IsExternalSidePacket_ShouldReturnFalse_When_NotInitialized() - { - using (var config = new ValidatedGraphConfig()) - { - Assert.False(config.IsExternalSidePacket("max_in_flight")); - } - } - - - [Test] - public void IsExternalSidePacket_ShouldReturnFalse_When_TheSidePacketIsInternal() - { - using (var config = new ValidatedGraphConfig()) - { - config.Initialize(CalculatorGraphConfig.Parser.ParseFromTextFormat(_ConstantSidePacketConfigText)).AssertOk(); - Assert.False(config.IsExternalSidePacket("int_packet")); - } - } - - [Test] - public void IsExternalSidePacket_ShouldReturnTrue_When_TheSidePacketIsExternal() - { - using (var config = new ValidatedGraphConfig()) - { - config.Initialize(CalculatorGraphConfig.Parser.ParseFromTextFormat(_FlowLimiterConfigText)).AssertOk(); - Assert.True(config.IsExternalSidePacket("max_in_flight")); - } - } - #endregion - } -} diff --git a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/ValidatedGraphConfigTest.cs.meta b/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/ValidatedGraphConfigTest.cs.meta deleted file mode 100644 index 68882fc..0000000 --- a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/ValidatedGraphConfigTest.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 593d3340196fca643b5346fb3cd60f7e -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Gpu.meta b/Packages/com.github.homuler.mediapipe/Tests/EditMode/Gpu.meta deleted file mode 100644 index 9e1596f..0000000 --- a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Gpu.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 34ad49218cadf094e8bc99057c757771 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Gpu/GlCalculatorHelperTest.cs b/Packages/com.github.homuler.mediapipe/Tests/EditMode/Gpu/GlCalculatorHelperTest.cs deleted file mode 100644 index 5d3b7dc..0000000 --- a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Gpu/GlCalculatorHelperTest.cs +++ /dev/null @@ -1,192 +0,0 @@ -// Copyright (c) 2021 homuler -// -// Use of this source code is governed by an MIT-style -// license that can be found in the LICENSE file or at -// https://opensource.org/licenses/MIT. - -using NUnit.Framework; -using System; - -namespace Mediapipe.Tests -{ - public class GlCalculatorHelperTest - { - #region Constructor - [Test, GpuOnly] - public void Ctor_ShouldInstantiateGlCalculatorHelper() - { - using (var glCalculatorHelper = new GlCalculatorHelper()) - { - Assert.AreNotEqual(IntPtr.Zero, glCalculatorHelper.mpPtr); - } - } - #endregion - - #region #isDisposed - [Test, GpuOnly] - public void IsDisposed_ShouldReturnFalse_When_NotDisposedYet() - { - using (var glCalculatorHelper = new GlCalculatorHelper()) - { - Assert.False(glCalculatorHelper.isDisposed); - } - } - - [Test, GpuOnly] - public void IsDisposed_ShouldReturnTrue_When_AlreadyDisposed() - { - var glCalculatorHelper = new GlCalculatorHelper(); - glCalculatorHelper.Dispose(); - - Assert.True(glCalculatorHelper.isDisposed); - } - #endregion - - #region #InitializeForTest - [Test, GpuOnly] - public void InitializeForTest_ShouldInitialize() - { - using (var glCalculatorHelper = new GlCalculatorHelper()) - { - Assert.False(glCalculatorHelper.Initialized()); - glCalculatorHelper.InitializeForTest(GpuResources.Create().Value()); - Assert.True(glCalculatorHelper.Initialized()); - } - } - #endregion - - #region #RunInGlContext - [Test, GpuOnly] - public void RunInGlContext_ShouldReturnOk_When_FunctionReturnsOk() - { - using (var glCalculatorHelper = new GlCalculatorHelper()) - { - glCalculatorHelper.InitializeForTest(GpuResources.Create().Value()); - - var status = glCalculatorHelper.RunInGlContext(() => { }); - Assert.True(status.Ok()); - } - } - - [Test, GpuOnly] - public void RunInGlContext_ShouldReturnInternal_When_FunctionThrows() - { - using (var glCalculatorHelper = new GlCalculatorHelper()) - { - glCalculatorHelper.InitializeForTest(GpuResources.Create().Value()); - - var status = glCalculatorHelper.RunInGlContext((GlCalculatorHelper.GlFunction)(() => { throw new Exception("Function Throws"); })); - Assert.AreEqual(Status.StatusCode.Internal, status.Code()); - } - } - #endregion - - #region #CreateSourceTexture - [Test, GpuOnly] - public void CreateSourceTexture_ShouldReturnGlTexture_When_CalledWithImageFrame() - { - using (var glCalculatorHelper = new GlCalculatorHelper()) - { - glCalculatorHelper.InitializeForTest(GpuResources.Create().Value()); - - using (var imageFrame = new ImageFrame(ImageFormat.Types.Format.Srgba, 32, 24)) - { - var status = glCalculatorHelper.RunInGlContext(() => - { - var texture = glCalculatorHelper.CreateSourceTexture(imageFrame); - - Assert.AreEqual(32, texture.width); - Assert.AreEqual(24, texture.height); - - texture.Dispose(); - }); - Assert.True(status.Ok()); - - status.Dispose(); - } - } - } - - [Test, GpuOnly] - [Ignore("Skip because a thread will hang")] - public void CreateSourceTexture_ShouldFail_When_ImageFrameFormatIsInvalid() - { - using (var glCalculatorHelper = new GlCalculatorHelper()) - { - glCalculatorHelper.InitializeForTest(GpuResources.Create().Value()); - - using (var imageFrame = new ImageFrame(ImageFormat.Types.Format.Sbgra, 32, 24)) - { - var status = glCalculatorHelper.RunInGlContext(() => - { - using (var texture = glCalculatorHelper.CreateSourceTexture(imageFrame)) - { - texture.Release(); - } - }); - Assert.AreEqual(Status.StatusCode.FailedPrecondition, status.Code()); - - status.Dispose(); - } - } - } - #endregion - - #region #CreateDestinationTexture - [Test, GpuOnly] - public void CreateDestinationTexture_ShouldReturnGlTexture_When_GpuBufferFormatIsValid() - { - using (var glCalculatorHelper = new GlCalculatorHelper()) - { - glCalculatorHelper.InitializeForTest(GpuResources.Create().Value()); - - var status = glCalculatorHelper.RunInGlContext(() => - { - var glTexture = glCalculatorHelper.CreateDestinationTexture(32, 24, GpuBufferFormat.kBGRA32); - - Assert.AreEqual(32, glTexture.width); - Assert.AreEqual(24, glTexture.height); - }); - - Assert.True(status.Ok()); - } - } - #endregion - - #region #framebuffer - [Test, GpuOnly] - public void Framebuffer_ShouldReturnGLName() - { - using (var glCalculatorHelper = new GlCalculatorHelper()) - { - glCalculatorHelper.InitializeForTest(GpuResources.Create().Value()); - - // default frame buffer - Assert.AreEqual(0, glCalculatorHelper.framebuffer); - } - } - #endregion - - #region #GetGlContext - [Test, GpuOnly] - public void GetGlContext_ShouldReturnCurrentContext() - { - using (var glCalculatorHelper = new GlCalculatorHelper()) - { - glCalculatorHelper.InitializeForTest(GpuResources.Create().Value()); - - using (var glContext = glCalculatorHelper.GetGlContext()) - { -#if UNITY_EDITOR_LINUX || UNITY_STANDALONE_LINUX || UNITY_ANDROID - Assert.AreNotEqual(IntPtr.Zero, glContext.eglContext); -#elif UNITY_STANDALONE_OSX - Assert.AreNotEqual(IntPtr.Zero, glContext.nsglContext); -#elif UNITY_IOS - Assert.AreNotEqual(IntPtr.Zero, glContext.eaglContext); -#endif - } - } - } - #endregion - } -} diff --git a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Gpu/GlCalculatorHelperTest.cs.meta b/Packages/com.github.homuler.mediapipe/Tests/EditMode/Gpu/GlCalculatorHelperTest.cs.meta deleted file mode 100644 index bf45527..0000000 --- a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Gpu/GlCalculatorHelperTest.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 7f47dcca1b6cbd6538c87a9914863444 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Gpu/GlContextTest.cs b/Packages/com.github.homuler.mediapipe/Tests/EditMode/Gpu/GlContextTest.cs deleted file mode 100644 index bdc44d6..0000000 --- a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Gpu/GlContextTest.cs +++ /dev/null @@ -1,83 +0,0 @@ -// Copyright (c) 2021 homuler -// -// Use of this source code is governed by an MIT-style -// license that can be found in the LICENSE file or at -// https://opensource.org/licenses/MIT. - -using NUnit.Framework; -using System; - -namespace Mediapipe.Tests -{ - public class GlContextTest - { - #region .GetCurrent - [Test, GpuOnly] - public void GetCurrent_ShouldReturnNull_When_CalledOutOfGlContext() - { - var glContext = GlContext.GetCurrent(); - - Assert.Null(glContext); - } - - [Test, GpuOnly] - public void GetCurrent_ShouldReturnCurrentContext_When_CalledInGlContext() - { - using (var glCalculatorHelper = new GlCalculatorHelper()) - { - glCalculatorHelper.InitializeForTest(GpuResources.Create().Value()); - - glCalculatorHelper.RunInGlContext(() => - { - using (var glContext = GlContext.GetCurrent()) - { - Assert.NotNull(glContext); - Assert.True(glContext.IsCurrent()); - } - }).AssertOk(); - } - } - #endregion - - #region #IsCurrent - public void IsCurrent_ShouldReturnFalse_When_CalledOutOfGlContext() - { - var glContext = GetGlContext(); - - Assert.False(glContext.IsCurrent()); - } - #endregion - - #region properties - [Test, GpuOnly] - public void ShouldReturnProperties() - { - using (var glContext = GetGlContext()) - { -#if UNITY_EDITOR_LINUX || UNITY_STANDALONE_LINUX || UNITY_ANDROID - Assert.AreNotEqual(IntPtr.Zero, glContext.eglDisplay); - Assert.AreNotEqual(IntPtr.Zero, glContext.eglConfig); - Assert.AreNotEqual(IntPtr.Zero, glContext.eglContext); - Assert.AreEqual(3, glContext.glMajorVersion); - Assert.AreEqual(2, glContext.glMinorVersion); - Assert.AreEqual(0, glContext.glFinishCount); -#elif UNITY_STANDALONE_OSX - Assert.AreNotEqual(IntPtr.Zero, glContext.nsglContext); -#elif UNITY_IOS - Assert.AreNotEqual(IntPtr.Zero, glContext.eaglContext); -#endif - } - } - #endregion - - private GlContext GetGlContext() - { - using (var glCalculatorHelper = new GlCalculatorHelper()) - { - glCalculatorHelper.InitializeForTest(GpuResources.Create().Value()); - - return glCalculatorHelper.GetGlContext(); - } - } - } -} diff --git a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Gpu/GlContextTest.cs.meta b/Packages/com.github.homuler.mediapipe/Tests/EditMode/Gpu/GlContextTest.cs.meta deleted file mode 100644 index 0eb97b3..0000000 --- a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Gpu/GlContextTest.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: d5e3ffbb666f2d185b043064194cbf12 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Gpu/GlTextureTest.cs b/Packages/com.github.homuler.mediapipe/Tests/EditMode/Gpu/GlTextureTest.cs deleted file mode 100644 index e24b137..0000000 --- a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Gpu/GlTextureTest.cs +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright (c) 2021 homuler -// -// Use of this source code is governed by an MIT-style -// license that can be found in the LICENSE file or at -// https://opensource.org/licenses/MIT. - -using NUnit.Framework; - -namespace Mediapipe.Tests -{ - public class GlTextureTest - { - #region Constructor - [Test, GpuOnly] - public void Ctor_ShouldInstantiateGlTexture_When_CalledWithNoArguments() - { - using (var glTexture = new GlTexture()) - { - Assert.AreEqual(0, glTexture.width); - Assert.AreEqual(0, glTexture.height); - } - } - #endregion - - #region #isDisposed - [Test, GpuOnly] - public void IsDisposed_ShouldReturnFalse_When_NotDisposedYet() - { - using (var glTexture = new GlTexture()) - { - Assert.False(glTexture.isDisposed); - } - } - - [Test, GpuOnly] - public void IsDisposed_ShouldReturnTrue_When_AlreadyDisposed() - { - var glTexture = new GlTexture(); - glTexture.Dispose(); - - Assert.True(glTexture.isDisposed); - } - #endregion - - #region target - [Test, GpuOnly] - public void Target_ShouldReturnTarget() - { - using (var glTexture = new GlTexture()) - { - Assert.AreEqual(Gl.GL_TEXTURE_2D, glTexture.target); - } - } - #endregion - } -} diff --git a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Gpu/GlTextureTest.cs.meta b/Packages/com.github.homuler.mediapipe/Tests/EditMode/Gpu/GlTextureTest.cs.meta deleted file mode 100644 index 607ac50..0000000 --- a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Gpu/GlTextureTest.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: fbe1d82329bb2b09a88651d8ac9ad4fd -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Gpu/GpuResourcesTest.cs b/Packages/com.github.homuler.mediapipe/Tests/EditMode/Gpu/GpuResourcesTest.cs deleted file mode 100644 index 6c2281b..0000000 --- a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Gpu/GpuResourcesTest.cs +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright (c) 2021 homuler -// -// Use of this source code is governed by an MIT-style -// license that can be found in the LICENSE file or at -// https://opensource.org/licenses/MIT. - -using NUnit.Framework; - -namespace Mediapipe.Tests -{ - public class GpuResourcesTest - { - #region Create - [Test, GpuOnly] - public void Create_ShouldReturnStatusOrGpuResources() - { - using (var statusOrGpuResources = GpuResources.Create()) - { - Assert.True(statusOrGpuResources.Ok()); - } - } - #endregion - - #region #isDisposed - [Test, GpuOnly] - public void IsDisposed_ShouldReturnFalse_When_NotDisposedYet() - { - using (var gpuResources = GpuResources.Create().Value()) - { - Assert.False(gpuResources.isDisposed); - } - } - - [Test, GpuOnly] - public void IsDisposed_ShouldReturnTrue_When_AlreadyDisposed() - { - var gpuResources = GpuResources.Create().Value(); - gpuResources.Dispose(); - - Assert.True(gpuResources.isDisposed); - } - #endregion - } -} diff --git a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Gpu/GpuResourcesTest.cs.meta b/Packages/com.github.homuler.mediapipe/Tests/EditMode/Gpu/GpuResourcesTest.cs.meta deleted file mode 100644 index 42a6a65..0000000 --- a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Gpu/GpuResourcesTest.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 7e987f90210347a37b48e4a9f9f93c53 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Unity/Extension/ImageFrameExtensionTest.cs b/Packages/com.github.homuler.mediapipe/Tests/EditMode/Unity/Extension/ImageFrameExtensionTest.cs deleted file mode 100644 index 8354432..0000000 --- a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Unity/Extension/ImageFrameExtensionTest.cs +++ /dev/null @@ -1,1308 +0,0 @@ -// Copyright (c) 2021 homuler -// -// Use of this source code is governed by an MIT-style -// license that can be found in the LICENSE file or at -// https://opensource.org/licenses/MIT. - -using NUnit.Framework; -using Unity.Collections; -using UnityEngine; - -using System.Linq; - -namespace Mediapipe.Unity.Tests -{ - public class ImageFrameExtensionTest - { - #region TryReadChannel(byte) - [Test] - public void TryReadChannelByte_ShouldReturnFalse_When_ChannelNumberIsNegative() - { - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Srgba, 0, 0, 0, new byte[] { })) - { - Assert.False(imageFrame.TryReadChannel(-1, new byte[] { })); - } - } - - [Test] - public void TryReadChannelByte_ShouldReturnFalse_When_TheChannelDataIsNotStoredInBytes() - { - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Srgb48, 0, 0, 0, new byte[] { })) - { - Assert.False(imageFrame.TryReadChannel(0, new byte[] { })); - } - - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Srgba64, 0, 0, 0, new byte[] { })) - { - Assert.False(imageFrame.TryReadChannel(0, new byte[] { })); - } - - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Gray16, 0, 0, 0, new byte[] { })) - { - Assert.False(imageFrame.TryReadChannel(0, new byte[] { })); - } - - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Vec32F1, 0, 0, 0, new byte[] { })) - { - Assert.False(imageFrame.TryReadChannel(0, new byte[] { })); - } - - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Vec32F2, 0, 0, 0, new byte[] { })) - { - Assert.False(imageFrame.TryReadChannel(0, new byte[] { })); - } - } - - [Test] - public void TryReadChannelByte_ShouldReturnFalse_When_ChannelNumberEqualsTheNumberOfChannels() - { - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Srgb, 0, 0, 0, new byte[] { })) - { - Assert.False(imageFrame.TryReadChannel(3, new byte[] { })); - } - - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Srgba, 0, 0, 0, new byte[] { })) - { - Assert.False(imageFrame.TryReadChannel(4, new byte[] { })); - } - - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Sbgra, 0, 0, 0, new byte[] { })) - { - Assert.False(imageFrame.TryReadChannel(4, new byte[] { })); - } - - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Gray8, 0, 0, 0, new byte[] { })) - { - Assert.False(imageFrame.TryReadChannel(1, new byte[] { })); - } - - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Lab8, 0, 0, 0, new byte[] { })) - { - Assert.False(imageFrame.TryReadChannel(3, new byte[] { })); - } - } - - [Test] - public void TryReadChannelByte_ShouldReturnTrue_When_ChannelNumberIsLessThanTheNumberOfChannels() - { - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Srgb, 0, 0, 0, new byte[] { })) - { - Assert.True(imageFrame.TryReadChannel(2, new byte[] { })); - } - - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Srgba, 0, 0, 0, new byte[] { })) - { - Assert.True(imageFrame.TryReadChannel(3, new byte[] { })); - } - - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Sbgra, 0, 0, 0, new byte[] { })) - { - Assert.True(imageFrame.TryReadChannel(3, new byte[] { })); - } - - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Gray8, 0, 0, 0, new byte[] { })) - { - Assert.True(imageFrame.TryReadChannel(0, new byte[] { })); - } - - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Lab8, 0, 0, 0, new byte[] { })) - { - Assert.True(imageFrame.TryReadChannel(2, new byte[] { })); - } - } - - [Test] - public void TryReadChannelByte_ShouldReadTheSpecifiedChannelData_When_TheFormatIsSrgb() - { - // (w, h, c) -> w << 5 + h << 3 + (c + 1) - var bytes = new byte[] { - // padding is 16 - 3 * 3 = 7 - 1, 2, 3, 33, 34, 35, 65, 66, 67, 0, 0, 0, 0, 0, 0, 0, - 9, 10, 11, 41, 42, 43, 73, 74, 75, 0, 0, 0, 0, 0, 0, 0, - }; - var result = new byte[6]; - - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Srgb, 3, 2, 16, bytes)) - { - Assert.True(imageFrame.TryReadChannel(0, result, false, false)); - Assert.AreEqual(new byte[] { 9, 41, 73, 1, 33, 65 }, result); - - Assert.True(imageFrame.TryReadChannel(0, result, false, true)); - Assert.AreEqual(new byte[] { 1, 33, 65, 9, 41, 73 }, result); - - Assert.True(imageFrame.TryReadChannel(0, result, true, false)); - Assert.AreEqual(new byte[] { 73, 41, 9, 65, 33, 1 }, result); - - Assert.True(imageFrame.TryReadChannel(0, result, true, true)); - Assert.AreEqual(new byte[] { 65, 33, 1, 73, 41, 9 }, result); - - Assert.True(imageFrame.TryReadChannel(1, result, false, false)); - Assert.AreEqual(new byte[] { 10, 42, 74, 2, 34, 66 }, result); - - Assert.True(imageFrame.TryReadChannel(1, result, false, true)); - Assert.AreEqual(new byte[] { 2, 34, 66, 10, 42, 74 }, result); - - Assert.True(imageFrame.TryReadChannel(1, result, true, false)); - Assert.AreEqual(new byte[] { 74, 42, 10, 66, 34, 2 }, result); - - Assert.True(imageFrame.TryReadChannel(1, result, true, true)); - Assert.AreEqual(new byte[] { 66, 34, 2, 74, 42, 10 }, result); - - Assert.True(imageFrame.TryReadChannel(2, result, false, false)); - Assert.AreEqual(new byte[] { 11, 43, 75, 3, 35, 67 }, result); - - Assert.True(imageFrame.TryReadChannel(2, result, false, true)); - Assert.AreEqual(new byte[] { 3, 35, 67, 11, 43, 75 }, result); - - Assert.True(imageFrame.TryReadChannel(2, result, true, false)); - Assert.AreEqual(new byte[] { 75, 43, 11, 67, 35, 3 }, result); - - Assert.True(imageFrame.TryReadChannel(2, result, true, true)); - Assert.AreEqual(new byte[] { 67, 35, 3, 75, 43, 11 }, result); - - } - } - - [Test] - public void TryReadChannelByte_ShouldReadTheSpecifiedChannelData_When_TheFormatIsSrgba() - { - // (w, h, c) -> w << 5 + h << 3 + (c + 1) - var bytes = new byte[] { - // padding is 16 - 3 * 4 = 4 - 1, 2, 3, 4, 33, 34, 35, 36, 65, 66, 67, 68, 0, 0, 0, 0, - 9, 10, 11, 12, 41, 42, 43, 44, 73, 74, 75, 76, 0, 0, 0, 0, - }; - var result = new byte[6]; - - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Srgba, 3, 2, 16, bytes)) - { - Assert.True(imageFrame.TryReadChannel(0, result, false, false)); - Assert.AreEqual(new byte[] { 9, 41, 73, 1, 33, 65 }, result); - - Assert.True(imageFrame.TryReadChannel(0, result, false, true)); - Assert.AreEqual(new byte[] { 1, 33, 65, 9, 41, 73 }, result); - - Assert.True(imageFrame.TryReadChannel(0, result, true, false)); - Assert.AreEqual(new byte[] { 73, 41, 9, 65, 33, 1 }, result); - - Assert.True(imageFrame.TryReadChannel(0, result, true, true)); - Assert.AreEqual(new byte[] { 65, 33, 1, 73, 41, 9 }, result); - - Assert.True(imageFrame.TryReadChannel(1, result, false, false)); - Assert.AreEqual(new byte[] { 10, 42, 74, 2, 34, 66 }, result); - - Assert.True(imageFrame.TryReadChannel(1, result, false, true)); - Assert.AreEqual(new byte[] { 2, 34, 66, 10, 42, 74 }, result); - - Assert.True(imageFrame.TryReadChannel(1, result, true, false)); - Assert.AreEqual(new byte[] { 74, 42, 10, 66, 34, 2 }, result); - - Assert.True(imageFrame.TryReadChannel(1, result, true, true)); - Assert.AreEqual(new byte[] { 66, 34, 2, 74, 42, 10 }, result); - - Assert.True(imageFrame.TryReadChannel(2, result, false, false)); - Assert.AreEqual(new byte[] { 11, 43, 75, 3, 35, 67 }, result); - - Assert.True(imageFrame.TryReadChannel(2, result, false, true)); - Assert.AreEqual(new byte[] { 3, 35, 67, 11, 43, 75 }, result); - - Assert.True(imageFrame.TryReadChannel(2, result, true, false)); - Assert.AreEqual(new byte[] { 75, 43, 11, 67, 35, 3 }, result); - - Assert.True(imageFrame.TryReadChannel(2, result, true, true)); - Assert.AreEqual(new byte[] { 67, 35, 3, 75, 43, 11 }, result); - - Assert.True(imageFrame.TryReadChannel(3, result, false, false)); - Assert.AreEqual(new byte[] { 12, 44, 76, 4, 36, 68 }, result); - - Assert.True(imageFrame.TryReadChannel(3, result, false, true)); - Assert.AreEqual(new byte[] { 4, 36, 68, 12, 44, 76 }, result); - - Assert.True(imageFrame.TryReadChannel(3, result, true, false)); - Assert.AreEqual(new byte[] { 76, 44, 12, 68, 36, 4 }, result); - - Assert.True(imageFrame.TryReadChannel(3, result, true, true)); - Assert.AreEqual(new byte[] { 68, 36, 4, 76, 44, 12 }, result); - } - } - - [Test] - public void TryReadChannelByte_ShouldReadTheSpecifiedChannelData_When_TheFormatIsSbgra() - { - // (w, h, c) -> w << 5 + h << 3 + (c + 1) - var bytes = new byte[] { - // padding is 16 - 4 * 3 = 4 - 1, 2, 3, 4, 33, 34, 35, 36, 65, 66, 67, 68, 0, 0, 0, 0, - 9, 10, 11, 12, 41, 42, 43, 44, 73, 74, 75, 76, 0, 0, 0, 0, - }; - var result = new byte[6]; - - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Sbgra, 3, 2, 16, bytes)) - { - Assert.True(imageFrame.TryReadChannel(0, result, false, false)); - Assert.AreEqual(new byte[] { 9, 41, 73, 1, 33, 65 }, result); - - Assert.True(imageFrame.TryReadChannel(0, result, false, true)); - Assert.AreEqual(new byte[] { 1, 33, 65, 9, 41, 73 }, result); - - Assert.True(imageFrame.TryReadChannel(0, result, true, false)); - Assert.AreEqual(new byte[] { 73, 41, 9, 65, 33, 1 }, result); - - Assert.True(imageFrame.TryReadChannel(0, result, true, true)); - Assert.AreEqual(new byte[] { 65, 33, 1, 73, 41, 9 }, result); - - Assert.True(imageFrame.TryReadChannel(1, result, false, false)); - Assert.AreEqual(new byte[] { 10, 42, 74, 2, 34, 66 }, result); - - Assert.True(imageFrame.TryReadChannel(1, result, false, true)); - Assert.AreEqual(new byte[] { 2, 34, 66, 10, 42, 74 }, result); - - Assert.True(imageFrame.TryReadChannel(1, result, true, false)); - Assert.AreEqual(new byte[] { 74, 42, 10, 66, 34, 2 }, result); - - Assert.True(imageFrame.TryReadChannel(1, result, true, true)); - Assert.AreEqual(new byte[] { 66, 34, 2, 74, 42, 10 }, result); - - Assert.True(imageFrame.TryReadChannel(2, result, false, false)); - Assert.AreEqual(new byte[] { 11, 43, 75, 3, 35, 67 }, result); - - Assert.True(imageFrame.TryReadChannel(2, result, false, true)); - Assert.AreEqual(new byte[] { 3, 35, 67, 11, 43, 75 }, result); - - Assert.True(imageFrame.TryReadChannel(2, result, true, false)); - Assert.AreEqual(new byte[] { 75, 43, 11, 67, 35, 3 }, result); - - Assert.True(imageFrame.TryReadChannel(2, result, true, true)); - Assert.AreEqual(new byte[] { 67, 35, 3, 75, 43, 11 }, result); - - Assert.True(imageFrame.TryReadChannel(3, result, false, false)); - Assert.AreEqual(new byte[] { 12, 44, 76, 4, 36, 68 }, result); - - Assert.True(imageFrame.TryReadChannel(3, result, false, true)); - Assert.AreEqual(new byte[] { 4, 36, 68, 12, 44, 76 }, result); - - Assert.True(imageFrame.TryReadChannel(3, result, true, false)); - Assert.AreEqual(new byte[] { 76, 44, 12, 68, 36, 4 }, result); - - Assert.True(imageFrame.TryReadChannel(3, result, true, true)); - Assert.AreEqual(new byte[] { 68, 36, 4, 76, 44, 12 }, result); - } - } - - [Test] - public void TryReadChannelByte_ShouldReadTheSpecifiedChannelData_When_TheFormatIsGray8() - { - var bytes = new byte[] { - // padding is 16 - 3 * 1 = 13 - 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 4, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - }; - var result = new byte[6]; - - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Gray8, 3, 2, 16, bytes)) - { - Assert.True(imageFrame.TryReadChannel(0, result, false, false)); - Assert.AreEqual(new byte[] { 4, 5, 6, 1, 2, 3 }, result); - - Assert.True(imageFrame.TryReadChannel(0, result, false, true)); - Assert.AreEqual(new byte[] { 1, 2, 3, 4, 5, 6 }, result); - - Assert.True(imageFrame.TryReadChannel(0, result, true, false)); - Assert.AreEqual(new byte[] { 6, 5, 4, 3, 2, 1 }, result); - - Assert.True(imageFrame.TryReadChannel(0, result, true, true)); - Assert.AreEqual(new byte[] { 3, 2, 1, 6, 5, 4 }, result); - } - } - - [Test] - public void TryReadChannelByte_ShouldReadTheSpecifiedChannelData_When_TheFormatIsLab8() - { - // (w, h, c) -> w << 5 + h << 3 + (c + 1) - var bytes = new byte[] { - // padding is 16 - 3 * 3 = 7 - 1, 2, 3, 33, 34, 35, 65, 66, 67, 0, 0, 0, 0, 0, 0, 0, - 9, 10, 11, 41, 42, 43, 73, 74, 75, 0, 0, 0, 0, 0, 0, 0, - }; - var result = new byte[6]; - - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Lab8, 3, 2, 16, bytes)) - { - Assert.True(imageFrame.TryReadChannel(0, result, false, false)); - Assert.AreEqual(new byte[] { 9, 41, 73, 1, 33, 65 }, result); - - Assert.True(imageFrame.TryReadChannel(0, result, false, true)); - Assert.AreEqual(new byte[] { 1, 33, 65, 9, 41, 73 }, result); - - Assert.True(imageFrame.TryReadChannel(0, result, true, false)); - Assert.AreEqual(new byte[] { 73, 41, 9, 65, 33, 1 }, result); - - Assert.True(imageFrame.TryReadChannel(0, result, true, true)); - Assert.AreEqual(new byte[] { 65, 33, 1, 73, 41, 9 }, result); - - Assert.True(imageFrame.TryReadChannel(1, result, false, false)); - Assert.AreEqual(new byte[] { 10, 42, 74, 2, 34, 66 }, result); - - Assert.True(imageFrame.TryReadChannel(1, result, false, true)); - Assert.AreEqual(new byte[] { 2, 34, 66, 10, 42, 74 }, result); - - Assert.True(imageFrame.TryReadChannel(1, result, true, false)); - Assert.AreEqual(new byte[] { 74, 42, 10, 66, 34, 2 }, result); - - Assert.True(imageFrame.TryReadChannel(1, result, true, true)); - Assert.AreEqual(new byte[] { 66, 34, 2, 74, 42, 10 }, result); - - Assert.True(imageFrame.TryReadChannel(2, result, false, false)); - Assert.AreEqual(new byte[] { 11, 43, 75, 3, 35, 67 }, result); - - Assert.True(imageFrame.TryReadChannel(2, result, false, true)); - Assert.AreEqual(new byte[] { 3, 35, 67, 11, 43, 75 }, result); - - Assert.True(imageFrame.TryReadChannel(2, result, true, false)); - Assert.AreEqual(new byte[] { 75, 43, 11, 67, 35, 3 }, result); - - Assert.True(imageFrame.TryReadChannel(2, result, true, true)); - Assert.AreEqual(new byte[] { 67, 35, 3, 75, 43, 11 }, result); - } - } - #endregion - - #region TryReadChannel(ushort) - [Test] - public void TryReadChannelUshort_ShouldReturnFalse_When_ChannelNumberIsNegative() - { - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Srgba64, 0, 0, 0, new byte[] { })) - { - Assert.False(imageFrame.TryReadChannel(-1, new ushort[] { })); - } - } - - [Test] - public void TryReadChannelUshort_ShouldReturnFalse_When_TheChannelDataIsNotStoredInUshorts() - { - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Srgb, 0, 0, 0, new byte[] { })) - { - Assert.False(imageFrame.TryReadChannel(0, new ushort[] { })); - } - - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Srgba, 0, 0, 0, new byte[] { })) - { - Assert.False(imageFrame.TryReadChannel(0, new ushort[] { })); - } - - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Sbgra, 0, 0, 0, new byte[] { })) - { - Assert.False(imageFrame.TryReadChannel(0, new ushort[] { })); - } - - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Gray8, 0, 0, 0, new byte[] { })) - { - Assert.False(imageFrame.TryReadChannel(0, new ushort[] { })); - } - - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Vec32F1, 0, 0, 0, new byte[] { })) - { - Assert.False(imageFrame.TryReadChannel(0, new ushort[] { })); - } - - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Vec32F2, 0, 0, 0, new byte[] { })) - { - Assert.False(imageFrame.TryReadChannel(0, new ushort[] { })); - } - - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Lab8, 0, 0, 0, new byte[] { })) - { - Assert.False(imageFrame.TryReadChannel(0, new ushort[] { })); - } - } - - [Test] - public void TryReadChannelUshort_ShouldReturnFalse_When_ChannelNumberEqualsTheNumberOfChannels() - { - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Srgb48, 0, 0, 0, new byte[] { })) - { - Assert.False(imageFrame.TryReadChannel(3, new ushort[] { })); - } - - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Srgba64, 0, 0, 0, new byte[] { })) - { - Assert.False(imageFrame.TryReadChannel(4, new ushort[] { })); - } - - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Gray16, 0, 0, 0, new byte[] { })) - { - Assert.False(imageFrame.TryReadChannel(1, new ushort[] { })); - } - } - - [Test] - public void TryReadChannelUshort_ShouldReturnTrue_When_ChannelNumberIsLessThanTheNumberOfChannels() - { - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Srgb48, 0, 0, 0, new byte[] { })) - { - Assert.True(imageFrame.TryReadChannel(2, new ushort[] { })); - } - - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Srgba64, 0, 0, 0, new byte[] { })) - { - Assert.True(imageFrame.TryReadChannel(3, new ushort[] { })); - } - - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Gray16, 0, 0, 0, new byte[] { })) - { - Assert.True(imageFrame.TryReadChannel(0, new ushort[] { })); - } - } - - [Test] - public void TryReadChannelUshort_ShouldReadTheSpecifiedChannelData_When_TheFormatIsSrgb48() - { - // (w, h, c) -> w << 5 + h << 3 + (c + 1) - var bytes = new byte[] { - // padding is 24 - 2 * 3 * 3 = 6 - 1, 0, 2, 0, 3, 0, 33, 0, 34, 0, 35, 0, 65, 0, 66, 0, 67, 0, 0, 0, 0, 0, 0, 0, - 9, 0, 10, 0, 11, 0, 41, 0, 42, 0, 43, 0, 73, 0, 74, 0, 75, 0, 0, 0, 0, 0, 0, 0, - }; - var result = new ushort[6]; - - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Srgb48, 3, 2, 24, bytes)) - { - Assert.True(imageFrame.TryReadChannel(0, result, false, false)); - Assert.AreEqual(new ushort[] { 9, 41, 73, 1, 33, 65 }, result); - - Assert.True(imageFrame.TryReadChannel(0, result, false, true)); - Assert.AreEqual(new ushort[] { 1, 33, 65, 9, 41, 73 }, result); - - Assert.True(imageFrame.TryReadChannel(0, result, true, false)); - Assert.AreEqual(new ushort[] { 73, 41, 9, 65, 33, 1 }, result); - - Assert.True(imageFrame.TryReadChannel(0, result, true, true)); - Assert.AreEqual(new ushort[] { 65, 33, 1, 73, 41, 9 }, result); - - Assert.True(imageFrame.TryReadChannel(1, result, false, false)); - Assert.AreEqual(new ushort[] { 10, 42, 74, 2, 34, 66 }, result); - - Assert.True(imageFrame.TryReadChannel(1, result, false, true)); - Assert.AreEqual(new ushort[] { 2, 34, 66, 10, 42, 74 }, result); - - Assert.True(imageFrame.TryReadChannel(1, result, true, false)); - Assert.AreEqual(new ushort[] { 74, 42, 10, 66, 34, 2 }, result); - - Assert.True(imageFrame.TryReadChannel(1, result, true, true)); - Assert.AreEqual(new ushort[] { 66, 34, 2, 74, 42, 10 }, result); - - Assert.True(imageFrame.TryReadChannel(2, result, false, false)); - Assert.AreEqual(new ushort[] { 11, 43, 75, 3, 35, 67 }, result); - - Assert.True(imageFrame.TryReadChannel(2, result, false, true)); - Assert.AreEqual(new ushort[] { 3, 35, 67, 11, 43, 75 }, result); - - Assert.True(imageFrame.TryReadChannel(2, result, true, false)); - Assert.AreEqual(new ushort[] { 75, 43, 11, 67, 35, 3 }, result); - - Assert.True(imageFrame.TryReadChannel(2, result, true, true)); - Assert.AreEqual(new ushort[] { 67, 35, 3, 75, 43, 11 }, result); - } - } - - [Test] - public void TryReadChannelUshort_ShouldReadTheSpecifiedChannelData_When_TheFormatIsSrgba64() - { - // (w, h, c) -> w << 5 + h << 3 + (c + 1) - var bytes = new byte[] { - // padding is 24 - 2 * 3 * 4 = 0 - 1, 0, 2, 0, 3, 0, 4, 0, 33, 0, 34, 0, 35, 0, 36, 0, 65, 0, 66, 0, 67, 0, 68, 0, - 9, 0, 10, 0, 11, 0, 12, 0, 41, 0, 42, 0, 43, 0, 44, 0, 73, 0, 74, 0, 75, 0, 76, 0, - }; - var result = new ushort[6]; - - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Srgba64, 3, 2, 24, bytes)) - { - Assert.True(imageFrame.TryReadChannel(0, result, false, false)); - Assert.AreEqual(new ushort[] { 9, 41, 73, 1, 33, 65 }, result); - - Assert.True(imageFrame.TryReadChannel(0, result, false, true)); - Assert.AreEqual(new ushort[] { 1, 33, 65, 9, 41, 73 }, result); - - Assert.True(imageFrame.TryReadChannel(0, result, true, false)); - Assert.AreEqual(new ushort[] { 73, 41, 9, 65, 33, 1 }, result); - - Assert.True(imageFrame.TryReadChannel(0, result, true, true)); - Assert.AreEqual(new ushort[] { 65, 33, 1, 73, 41, 9 }, result); - - Assert.True(imageFrame.TryReadChannel(1, result, false, false)); - Assert.AreEqual(new ushort[] { 10, 42, 74, 2, 34, 66 }, result); - - Assert.True(imageFrame.TryReadChannel(1, result, false, true)); - Assert.AreEqual(new ushort[] { 2, 34, 66, 10, 42, 74 }, result); - - Assert.True(imageFrame.TryReadChannel(1, result, true, false)); - Assert.AreEqual(new ushort[] { 74, 42, 10, 66, 34, 2 }, result); - - Assert.True(imageFrame.TryReadChannel(1, result, true, true)); - Assert.AreEqual(new ushort[] { 66, 34, 2, 74, 42, 10 }, result); - - Assert.True(imageFrame.TryReadChannel(2, result, false, false)); - Assert.AreEqual(new ushort[] { 11, 43, 75, 3, 35, 67 }, result); - - Assert.True(imageFrame.TryReadChannel(2, result, false, true)); - Assert.AreEqual(new ushort[] { 3, 35, 67, 11, 43, 75 }, result); - - Assert.True(imageFrame.TryReadChannel(2, result, true, false)); - Assert.AreEqual(new ushort[] { 75, 43, 11, 67, 35, 3 }, result); - - Assert.True(imageFrame.TryReadChannel(2, result, true, true)); - Assert.AreEqual(new ushort[] { 67, 35, 3, 75, 43, 11 }, result); - - Assert.True(imageFrame.TryReadChannel(3, result, false, false)); - Assert.AreEqual(new ushort[] { 12, 44, 76, 4, 36, 68 }, result); - - Assert.True(imageFrame.TryReadChannel(3, result, false, true)); - Assert.AreEqual(new ushort[] { 4, 36, 68, 12, 44, 76 }, result); - - Assert.True(imageFrame.TryReadChannel(3, result, true, false)); - Assert.AreEqual(new ushort[] { 76, 44, 12, 68, 36, 4 }, result); - - Assert.True(imageFrame.TryReadChannel(3, result, true, true)); - Assert.AreEqual(new ushort[] { 68, 36, 4, 76, 44, 12 }, result); - } - } - - [Test] - public void TryReadChannelUshort_ShouldReadTheSpecifiedChannelData_When_TheFormatIsGray16() - { - var bytes = new byte[] { - // padding is 16 - 2 * 3 = 10 - 1, 0, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 4, 0, 5, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - }; - var result = new ushort[6]; - - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Gray16, 3, 2, 16, bytes)) - { - Assert.True(imageFrame.TryReadChannel(0, result, false, false)); - Assert.AreEqual(new ushort[] { 4, 5, 6, 1, 2, 3 }, result); - - Assert.True(imageFrame.TryReadChannel(0, result, false, true)); - Assert.AreEqual(new ushort[] { 1, 2, 3, 4, 5, 6 }, result); - - Assert.True(imageFrame.TryReadChannel(0, result, true, false)); - Assert.AreEqual(new ushort[] { 6, 5, 4, 3, 2, 1 }, result); - - Assert.True(imageFrame.TryReadChannel(0, result, true, true)); - Assert.AreEqual(new ushort[] { 3, 2, 1, 6, 5, 4 }, result); - } - } - #endregion - - #region TryReadChannel(float) - [Test] - public void TryReadChannelFloat_ShouldReturnFalse_When_ChannelNumberIsNegative() - { - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Vec32F1, 0, 0, 0, new byte[] { })) - { - Assert.False(imageFrame.TryReadChannel(-1, new float[] { })); - } - } - - [Test] - public void TryReadChannelFloat_ShouldReturnFalse_When_TheChannelDataIsNotStoredInFloats() - { - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Srgb, 0, 0, 0, new byte[] { })) - { - Assert.False(imageFrame.TryReadChannel(0, new float[] { })); - } - - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Srgba, 0, 0, 0, new byte[] { })) - { - Assert.False(imageFrame.TryReadChannel(0, new float[] { })); - } - - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Sbgra, 0, 0, 0, new byte[] { })) - { - Assert.False(imageFrame.TryReadChannel(0, new float[] { })); - } - - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Srgb48, 0, 0, 0, new byte[] { })) - { - Assert.False(imageFrame.TryReadChannel(3, new float[] { })); - } - - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Srgba64, 0, 0, 0, new byte[] { })) - { - Assert.False(imageFrame.TryReadChannel(4, new float[] { })); - } - - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Gray8, 0, 0, 0, new byte[] { })) - { - Assert.False(imageFrame.TryReadChannel(0, new float[] { })); - } - - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Gray16, 0, 0, 0, new byte[] { })) - { - Assert.False(imageFrame.TryReadChannel(0, new float[] { })); - } - - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Lab8, 0, 0, 0, new byte[] { })) - { - Assert.False(imageFrame.TryReadChannel(0, new float[] { })); - } - } - - [Test] - public void TryReadChannelFloat_ShouldReturnFalse_When_ChannelNumberEqualsTheNumberOfChannels() - { - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Vec32F1, 0, 0, 0, new byte[] { })) - { - Assert.False(imageFrame.TryReadChannel(1, new float[] { })); - } - - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Vec32F2, 0, 0, 0, new byte[] { })) - { - Assert.False(imageFrame.TryReadChannel(2, new float[] { })); - } - } - - [Test] - public void TryReadChannelFloat_ShouldReturnTrue_When_ChannelNumberIsLessThanTheNumberOfChannels() - { - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Vec32F1, 0, 0, 0, new byte[] { })) - { - Assert.True(imageFrame.TryReadChannel(0, new float[] { })); - } - - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Vec32F2, 0, 0, 0, new byte[] { })) - { - Assert.True(imageFrame.TryReadChannel(1, new float[] { })); - } - } - - [Test] - public void TryReadChannelFloat_ShouldReadTheSpecifiedChannelData_When_TheFormatIsVec32F1() - { - var floats = new float[] { - // padding is 16 - 3 * 4 = 4 - 1.0f / 255, 2.0f / 255, 3.0f / 255, 0, - 4.0f / 255, 5.0f / 255, 6.0f / 255, 0, - }; - var bytes = FloatsToBytes(floats); - var result = new float[6]; - - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Vec32F1, 3, 2, 16, bytes)) - { - Assert.True(imageFrame.TryReadChannel(0, result, false, false)); - Assert.AreEqual(new float[] { 4.0f / 255, 5.0f / 255, 6.0f / 255, 1.0f / 255, 2.0f / 255, 3.0f / 255 }, result); - - Assert.True(imageFrame.TryReadChannel(0, result, false, true)); - Assert.AreEqual(new float[] { 1.0f / 255, 2.0f / 255, 3.0f / 255, 4.0f / 255, 5.0f / 255, 6.0f / 255 }, result); - - Assert.True(imageFrame.TryReadChannel(0, result, true, false)); - Assert.AreEqual(new float[] { 6.0f / 255, 5.0f / 255, 4.0f / 255, 3.0f / 255, 2.0f / 255, 1.0f / 255 }, result); - - Assert.True(imageFrame.TryReadChannel(0, result, true, true)); - Assert.AreEqual(new float[] { 3.0f / 255, 2.0f / 255, 1.0f / 255, 6.0f / 255, 5.0f / 255, 4.0f / 255 }, result); - } - } - - [Test] - public void TryReadChannelFloat_ShouldReadTheSpecifiedChannelData_When_TheFormatIsVec32F2() - { - // (w, h, c) -> w << 5 + h << 3 + (c + 1) - var floats = new float[] { - // padding is 32 - 2 * 3 * 4 = 8 - 1.0f / 255, 2.0f / 255, 33.0f / 255, 34.0f / 255, 65.0f / 255, 66.0f / 255, 0, 0, - 9.0f / 255, 10.0f / 255, 41.0f / 255, 42.0f / 255, 73.0f / 255, 74.0f / 255, 0, 0, - }; - var bytes = FloatsToBytes(floats); - var result = new float[6]; - - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Vec32F2, 3, 2, 32, bytes)) - { - Assert.True(imageFrame.TryReadChannel(0, result, false, false)); - Assert.AreEqual(new float[] { 9.0f / 255, 41.0f / 255, 73.0f / 255, 1.0f / 255, 33.0f / 255, 65.0f / 255 }, result); - - Assert.True(imageFrame.TryReadChannel(0, result, false, true)); - Assert.AreEqual(new float[] { 1.0f / 255, 33.0f / 255, 65.0f / 255, 9.0f / 255, 41.0f / 255, 73.0f / 255 }, result); - - Assert.True(imageFrame.TryReadChannel(0, result, true, false)); - Assert.AreEqual(new float[] { 73.0f / 255, 41.0f / 255, 9.0f / 255, 65.0f / 255, 33.0f / 255, 1.0f / 255 }, result); - - Assert.True(imageFrame.TryReadChannel(0, result, true, true)); - Assert.AreEqual(new float[] { 65.0f / 255, 33.0f / 255, 1.0f / 255, 73.0f / 255, 41.0f / 255, 9.0f / 255 }, result); - - Assert.True(imageFrame.TryReadChannel(1, result, false, false)); - Assert.AreEqual(new float[] { 10.0f / 255, 42.0f / 255, 74.0f / 255, 2.0f / 255, 34.0f / 255, 66.0f / 255 }, result); - - Assert.True(imageFrame.TryReadChannel(1, result, false, true)); - Assert.AreEqual(new float[] { 2.0f / 255, 34.0f / 255, 66.0f / 255, 10.0f / 255, 42.0f / 255, 74.0f / 255 }, result); - - Assert.True(imageFrame.TryReadChannel(1, result, true, false)); - Assert.AreEqual(new float[] { 74.0f / 255, 42.0f / 255, 10.0f / 255, 66.0f / 255, 34.0f / 255, 2.0f / 255 }, result); - - Assert.True(imageFrame.TryReadChannel(1, result, true, true)); - Assert.AreEqual(new float[] { 66.0f / 255, 34.0f / 255, 2.0f / 255, 74.0f / 255, 42.0f / 255, 10.0f / 255 }, result); - } - } - #endregion - - #region TryReadChannelNormalized - [Test] - public void TryReadChannelNormalized_ShouldReturnFalse_When_ChannelNumberIsNegative() - { - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Srgba, 0, 0, 0, new byte[] { })) - { - Assert.False(imageFrame.TryReadChannelNormalized(-1, new float[] { })); - } - } - - [Test] - public void TryReadChannelNormalized_ShouldReturnFalse_When_ChannelNumberEqualsTheNumberOfChannels() - { - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Srgb, 0, 0, 0, new byte[] { })) - { - Assert.False(imageFrame.TryReadChannelNormalized(3, new float[] { })); - } - - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Srgba, 0, 0, 0, new byte[] { })) - { - Assert.False(imageFrame.TryReadChannelNormalized(4, new float[] { })); - } - - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Sbgra, 0, 0, 0, new byte[] { })) - { - Assert.False(imageFrame.TryReadChannelNormalized(4, new float[] { })); - } - - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Srgb48, 0, 0, 0, new byte[] { })) - { - Assert.False(imageFrame.TryReadChannelNormalized(3, new float[] { })); - } - - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Srgba64, 0, 0, 0, new byte[] { })) - { - Assert.False(imageFrame.TryReadChannelNormalized(4, new float[] { })); - } - - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Gray8, 0, 0, 0, new byte[] { })) - { - Assert.False(imageFrame.TryReadChannelNormalized(1, new float[] { })); - } - - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Gray16, 0, 0, 0, new byte[] { })) - { - Assert.False(imageFrame.TryReadChannelNormalized(1, new float[] { })); - } - - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Vec32F1, 0, 0, 0, new byte[] { })) - { - Assert.False(imageFrame.TryReadChannelNormalized(1, new float[] { })); - } - - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Vec32F2, 0, 0, 0, new byte[] { })) - { - Assert.False(imageFrame.TryReadChannelNormalized(2, new float[] { })); - } - - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Lab8, 0, 0, 0, new byte[] { })) - { - Assert.False(imageFrame.TryReadChannelNormalized(3, new float[] { })); - } - } - - [Test] - public void TryReadChannelNormalized_ShouldReturnTrue_When_ChannelNumberIsLessThanTheNumberOfChannels() - { - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Srgb, 0, 0, 0, new byte[] { })) - { - Assert.True(imageFrame.TryReadChannelNormalized(2, new float[] { })); - } - - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Srgba, 0, 0, 0, new byte[] { })) - { - Assert.True(imageFrame.TryReadChannelNormalized(3, new float[] { })); - } - - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Sbgra, 0, 0, 0, new byte[] { })) - { - Assert.True(imageFrame.TryReadChannelNormalized(3, new float[] { })); - } - - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Srgb48, 0, 0, 0, new byte[] { })) - { - Assert.True(imageFrame.TryReadChannelNormalized(2, new float[] { })); - } - - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Srgba64, 0, 0, 0, new byte[] { })) - { - Assert.True(imageFrame.TryReadChannelNormalized(3, new float[] { })); - } - - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Gray8, 0, 0, 0, new byte[] { })) - { - Assert.True(imageFrame.TryReadChannelNormalized(0, new float[] { })); - } - - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Gray16, 0, 0, 0, new byte[] { })) - { - Assert.True(imageFrame.TryReadChannelNormalized(0, new float[] { })); - } - - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Vec32F1, 0, 0, 0, new byte[] { })) - { - Assert.True(imageFrame.TryReadChannelNormalized(0, new float[] { })); - } - - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Vec32F2, 0, 0, 0, new byte[] { })) - { - Assert.True(imageFrame.TryReadChannelNormalized(1, new float[] { })); - } - - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Lab8, 0, 0, 0, new byte[] { })) - { - Assert.True(imageFrame.TryReadChannelNormalized(2, new float[] { })); - } - } - - [Test] - public void TryReadChannelNormalized_ShouldReadTheSpecifiedChannelData_When_TheFormatIsSrgba() - { - // (w, h, c) -> w << 5 + h << 3 + (c + 1) - var bytes = new byte[] { - // padding is 16 - 3 * 4 = 4 - 1, 2, 3, 4, 33, 34, 35, 36, 65, 66, 67, 68, 0, 0, 0, 0, - 9, 10, 11, 12, 41, 42, 43, 44, 73, 74, 75, 76, 0, 0, 0, 0, - }; - var result = new float[6]; - - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Srgba, 3, 2, 16, bytes)) - { - Assert.True(imageFrame.TryReadChannelNormalized(0, result, false, false)); - AssertNormalized(new byte[] { 9, 41, 73, 1, 33, 65 }, result); - - Assert.True(imageFrame.TryReadChannelNormalized(0, result, false, true)); - AssertNormalized(new byte[] { 1, 33, 65, 9, 41, 73 }, result); - - Assert.True(imageFrame.TryReadChannelNormalized(0, result, true, false)); - AssertNormalized(new byte[] { 73, 41, 9, 65, 33, 1 }, result); - - Assert.True(imageFrame.TryReadChannelNormalized(0, result, true, true)); - AssertNormalized(new byte[] { 65, 33, 1, 73, 41, 9 }, result); - - Assert.True(imageFrame.TryReadChannelNormalized(1, result, false, false)); - AssertNormalized(new byte[] { 10, 42, 74, 2, 34, 66 }, result); - - Assert.True(imageFrame.TryReadChannelNormalized(1, result, false, true)); - AssertNormalized(new byte[] { 2, 34, 66, 10, 42, 74 }, result); - - Assert.True(imageFrame.TryReadChannelNormalized(1, result, true, false)); - AssertNormalized(new byte[] { 74, 42, 10, 66, 34, 2 }, result); - - Assert.True(imageFrame.TryReadChannelNormalized(1, result, true, true)); - AssertNormalized(new byte[] { 66, 34, 2, 74, 42, 10 }, result); - - Assert.True(imageFrame.TryReadChannelNormalized(2, result, false, false)); - AssertNormalized(new byte[] { 11, 43, 75, 3, 35, 67 }, result); - - Assert.True(imageFrame.TryReadChannelNormalized(2, result, false, true)); - AssertNormalized(new byte[] { 3, 35, 67, 11, 43, 75 }, result); - - Assert.True(imageFrame.TryReadChannelNormalized(2, result, true, false)); - AssertNormalized(new byte[] { 75, 43, 11, 67, 35, 3 }, result); - - Assert.True(imageFrame.TryReadChannelNormalized(2, result, true, true)); - AssertNormalized(new byte[] { 67, 35, 3, 75, 43, 11 }, result); - - Assert.True(imageFrame.TryReadChannelNormalized(3, result, false, false)); - AssertNormalized(new byte[] { 12, 44, 76, 4, 36, 68 }, result); - - Assert.True(imageFrame.TryReadChannelNormalized(3, result, false, true)); - AssertNormalized(new byte[] { 4, 36, 68, 12, 44, 76 }, result); - - Assert.True(imageFrame.TryReadChannelNormalized(3, result, true, false)); - AssertNormalized(new byte[] { 76, 44, 12, 68, 36, 4 }, result); - - Assert.True(imageFrame.TryReadChannelNormalized(3, result, true, true)); - AssertNormalized(new byte[] { 68, 36, 4, 76, 44, 12 }, result); - } - } - - [Test] - public void TryReadChannelNormalized_ShouldReadTheSpecifiedChannelData_When_TheFormatIsGray8() - { - var bytes = new byte[] { - // padding is 16 - 3 * 1 = 13 - 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 4, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - }; - var result = new float[6]; - - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Gray8, 3, 2, 16, bytes)) - { - Assert.True(imageFrame.TryReadChannelNormalized(0, result, false, false)); - AssertNormalized(new byte[] { 4, 5, 6, 1, 2, 3 }, result); - - Assert.True(imageFrame.TryReadChannelNormalized(0, result, false, true)); - AssertNormalized(new byte[] { 1, 2, 3, 4, 5, 6 }, result); - - Assert.True(imageFrame.TryReadChannelNormalized(0, result, true, false)); - AssertNormalized(new byte[] { 6, 5, 4, 3, 2, 1 }, result); - - Assert.True(imageFrame.TryReadChannelNormalized(0, result, true, true)); - AssertNormalized(new byte[] { 3, 2, 1, 6, 5, 4 }, result); - } - } - - [Test] - public void TryReadChannelNormalized_ShouldReadTheSpecifiedChannelData_When_TheFormatIsSrgba64() - { - // (w, h, c) -> w << 5 + h << 3 + (c + 1) - var bytes = new byte[] { - // padding is 24 - 2 * 3 * 4 = 0 - 1, 0, 2, 0, 3, 0, 4, 0, 33, 0, 34, 0, 35, 0, 36, 0, 65, 0, 66, 0, 67, 0, 68, 0, - 9, 0, 10, 0, 11, 0, 12, 0, 41, 0, 42, 0, 43, 0, 44, 0, 73, 0, 74, 0, 75, 0, 76, 0, - }; - var result = new float[6]; - - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Srgba64, 3, 2, 24, bytes)) - { - Assert.True(imageFrame.TryReadChannelNormalized(0, result, false, false)); - AssertNormalized(new ushort[] { 9, 41, 73, 1, 33, 65 }, result); - - Assert.True(imageFrame.TryReadChannelNormalized(0, result, false, true)); - AssertNormalized(new ushort[] { 1, 33, 65, 9, 41, 73 }, result); - - Assert.True(imageFrame.TryReadChannelNormalized(0, result, true, false)); - AssertNormalized(new ushort[] { 73, 41, 9, 65, 33, 1 }, result); - - Assert.True(imageFrame.TryReadChannelNormalized(0, result, true, true)); - AssertNormalized(new ushort[] { 65, 33, 1, 73, 41, 9 }, result); - - Assert.True(imageFrame.TryReadChannelNormalized(1, result, false, false)); - AssertNormalized(new ushort[] { 10, 42, 74, 2, 34, 66 }, result); - - Assert.True(imageFrame.TryReadChannelNormalized(1, result, false, true)); - AssertNormalized(new ushort[] { 2, 34, 66, 10, 42, 74 }, result); - - Assert.True(imageFrame.TryReadChannelNormalized(1, result, true, false)); - AssertNormalized(new ushort[] { 74, 42, 10, 66, 34, 2 }, result); - - Assert.True(imageFrame.TryReadChannelNormalized(1, result, true, true)); - AssertNormalized(new ushort[] { 66, 34, 2, 74, 42, 10 }, result); - - Assert.True(imageFrame.TryReadChannelNormalized(2, result, false, false)); - AssertNormalized(new ushort[] { 11, 43, 75, 3, 35, 67 }, result); - - Assert.True(imageFrame.TryReadChannelNormalized(2, result, false, true)); - AssertNormalized(new ushort[] { 3, 35, 67, 11, 43, 75 }, result); - - Assert.True(imageFrame.TryReadChannelNormalized(2, result, true, false)); - AssertNormalized(new ushort[] { 75, 43, 11, 67, 35, 3 }, result); - - Assert.True(imageFrame.TryReadChannelNormalized(2, result, true, true)); - AssertNormalized(new ushort[] { 67, 35, 3, 75, 43, 11 }, result); - - Assert.True(imageFrame.TryReadChannelNormalized(3, result, false, false)); - AssertNormalized(new ushort[] { 12, 44, 76, 4, 36, 68 }, result); - - Assert.True(imageFrame.TryReadChannelNormalized(3, result, false, true)); - AssertNormalized(new ushort[] { 4, 36, 68, 12, 44, 76 }, result); - - Assert.True(imageFrame.TryReadChannelNormalized(3, result, true, false)); - AssertNormalized(new ushort[] { 76, 44, 12, 68, 36, 4 }, result); - - Assert.True(imageFrame.TryReadChannelNormalized(3, result, true, true)); - AssertNormalized(new ushort[] { 68, 36, 4, 76, 44, 12 }, result); - } - } - - [Test] - public void TryReadChannelNormalized_ShouldReadTheSpecifiedChannelData_When_TheFormatIsGray16() - { - var bytes = new byte[] { - // padding is 16 - 2 * 3 = 10 - 1, 0, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 4, 0, 5, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - }; - var result = new float[6]; - - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Gray16, 3, 2, 16, bytes)) - { - Assert.True(imageFrame.TryReadChannelNormalized(0, result, false, false)); - AssertNormalized(new ushort[] { 4, 5, 6, 1, 2, 3 }, result); - - Assert.True(imageFrame.TryReadChannelNormalized(0, result, false, true)); - AssertNormalized(new ushort[] { 1, 2, 3, 4, 5, 6 }, result); - - Assert.True(imageFrame.TryReadChannelNormalized(0, result, true, false)); - AssertNormalized(new ushort[] { 6, 5, 4, 3, 2, 1 }, result); - - Assert.True(imageFrame.TryReadChannelNormalized(0, result, true, true)); - AssertNormalized(new ushort[] { 3, 2, 1, 6, 5, 4 }, result); - } - } - #endregion - - #region TryReadPixelData - [Test] - public void TryReadPixelData_ShouldReturnFalse_When_TheFormatIsInvalid() - { - using (var imageFrame = new ImageFrame()) - { - Assert.False(imageFrame.TryReadPixelData(new Color32[] { })); - } - } - - [Test] - public void TryReadPixelData_ShouldReturnFalse_When_ColorsLengthIsWrong() - { - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Srgba, 0, 0, 0, new byte[] { })) - { - Assert.False(imageFrame.TryReadPixelData(new Color32[1] { new Color32() })); - } - } - - [Test] - public void TryReadPixelData_ShouldReturnTrue_When_TheFormatIsSrgb() - { - // (w, h, c) -> w << 5 + h << 3 + (c + 1) - var bytes = new byte[] { - // padding is 16 - 3 * 3 = 7 - 1, 2, 3, 33, 34, 35, 65, 66, 67, 0, 0, 0, 0, 0, 0, 0, - 9, 10, 11, 41, 42, 43, 73, 74, 75, 0, 0, 0, 0, 0, 0, 0, - }; - var expected = new Color32[] { - new Color32(9, 10, 11, 255), new Color32(41, 42, 43, 255), new Color32(73, 74, 75, 255), - new Color32(1, 2, 3, 255), new Color32(33, 34, 35, 255), new Color32(65, 66, 67, 255), - }; - var result = new Color32[6]; - - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Srgb, 3, 2, 16, bytes)) - { - Assert.True(imageFrame.TryReadPixelData(result)); - Assert.AreEqual(expected, result); - } - } - - [Test] - public void TryReadPixelData_ShouldReturnTrue_When_TheFormatIsSrgba() - { - // (w, h, c) -> w << 5 + h << 3 + (c + 1) - var bytes = new byte[] { - // padding is 16 - 3 * 4 = 4 - 1, 2, 3, 4, 33, 34, 35, 36, 65, 66, 67, 68, 0, 0, 0, 0, - 9, 10, 11, 12, 41, 42, 43, 44, 73, 74, 75, 76, 0, 0, 0, 0, - }; - var expected = new Color32[] { - new Color32(9, 10, 11, 12), new Color32(41, 42, 43, 44), new Color32(73, 74, 75, 76), - new Color32(1, 2, 3, 4), new Color32(33, 34, 35, 36), new Color32(65, 66, 67, 68), - }; - var result = new Color32[6]; - - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Srgba, 3, 2, 16, bytes)) - { - Assert.True(imageFrame.TryReadPixelData(result)); - Assert.AreEqual(expected, result); - } - } - - [Test] - public void TryReadPixelData_ShouldReturnTrue_When_TheFormatIsSbgra() - { - // (w, h, c) -> w << 5 + h << 3 + (c + 1) - var bytes = new byte[] { - // padding is 16 - 3 * 4 = 4 - 1, 2, 3, 4, 33, 34, 35, 36, 65, 66, 67, 68, 0, 0, 0, 0, - 9, 10, 11, 12, 41, 42, 43, 44, 73, 74, 75, 76, 0, 0, 0, 0, - }; - var expected = new Color32[] { - new Color32(11, 10, 9, 12), new Color32(43, 42, 41, 44), new Color32(75, 74, 73, 76), - new Color32(3, 2, 1, 4), new Color32(35, 34, 33, 36), new Color32(67, 66, 65, 68), - }; - var result = new Color32[6]; - - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Sbgra, 3, 2, 16, bytes)) - { - Assert.True(imageFrame.TryReadPixelData(result)); - Assert.AreEqual(expected, result); - } - } - - [Test] - public void TryReadPixelData_ShouldReturnTrue_When_TheFormatIsGray8() - { - var bytes = new byte[] { - // padding is 16 - 3 * 1 = 13 - 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 4, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - }; - var expected = new Color32[] { - new Color32(4, 4, 4, 255), new Color32(5, 5, 5, 255), new Color32(6, 6, 6, 255), - new Color32(1, 1, 1, 255), new Color32(2, 2, 2, 255), new Color32(3, 3, 3, 255), - }; - var result = new Color32[6]; - - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Gray8, 3, 2, 16, bytes)) - { - Assert.True(imageFrame.TryReadPixelData(result)); - Assert.AreEqual(expected, result); - } - } - - [Test] - public void TryReadPixelData_ShouldReturnTrue_When_TheFormatIsLab8() - { - var bytes = new byte[] { - // padding is 16 - 3 * 1 = 13 - 0, 0, 0, 0, 128, 128, 0, 128, 127, 0, 127, 128, 0, 127, 127, 0, - 50, 0, 0, 50, 128, 128, 50, 128, 127, 50, 127, 128, 50, 127, 127, 0, - 100, 0, 0, 100, 128, 128, 100, 128, 127, 100, 127, 128, 100, 127, 127, 0, - 69, 10, 30, 62, 207, 87, 27, 241, 100, 12, 79, 78, 36, 70, 2, 0, // random - }; - var expected = new Color32[] { - new Color32(204, 161, 115, 255), new Color32(93, 169, 0, 255), new Color32(71, 68, 0, 255), new Color32(122, 0, 0, 255), new Color32(178, 0, 84, 255), - new Color32(255, 255, 255, 255), new Color32(0, 255, 255, 255), new Color32(0, 255, 0, 255), new Color32(255, 139, 255, 255), new Color32(255, 70, 0, 255), - new Color32(119, 119, 119, 255), new Color32(0, 169, 255, 255), new Color32(0, 152, 0, 255), new Color32(183, 0, 255, 255), new Color32(255, 0, 0, 255), - new Color32(0, 0, 0, 255), new Color32(0, 64, 194, 255), new Color32(0, 45, 0, 255), new Color32(0, 0, 195, 255), new Color32(132, 0, 0, 255), - }; - var result = new Color32[20]; - - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Lab8, 5, 4, 16, bytes)) - { - Assert.True(imageFrame.TryReadPixelData(result)); - Assert.AreEqual(expected, result); - } - } - - [Test] - public void TryReadPixelData_ShouldReturnTrue_When_TheFormatIsSrgb48() - { - // (w, h, c) -> w << 5 + h << 3 + (c + 1) - var bytes = new byte[] { - // padding is 24 - 2 * 3 * 3 = 6 - 0, 1, 0, 2, 0, 3, 0, 33, 0, 34, 0, 35, 0, 65, 0, 66, 0, 67, 0, 0, 0, 0, 0, 0, - 0, 9, 0, 10, 0, 11, 0, 41, 0, 42, 0, 43, 0, 73, 0, 74, 0, 75, 0, 0, 0, 0, 0, 0, - }; - var expected = new Color32[] { - new Color32(9, 10, 11, 255), new Color32(41, 42, 43, 255), new Color32(73, 74, 75, 255), - new Color32(1, 2, 3, 255), new Color32(33, 34, 35, 255), new Color32(65, 66, 67, 255), - }; - var result = new Color32[6]; - - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Srgb48, 3, 2, 24, bytes)) - { - Assert.True(imageFrame.TryReadPixelData(result)); - Assert.AreEqual(expected, result); - } - } - - [Test] - public void TryReadPixelData_ShouldReturnTrue_When_TheFormatIsSrgba64() - { - // (w, h, c) -> w << 5 + h << 3 + (c + 1) - var bytes = new byte[] { - // padding is 24 - 2 * 3 * 4 = 0 - 0, 1, 0, 2, 0, 3, 0, 4, 0, 33, 0, 34, 0, 35, 0, 36, 0, 65, 0, 66, 0, 67, 0, 68, - 0, 9, 0, 10, 0, 11, 0, 12, 0, 41, 0, 42, 0, 43, 0, 44, 0, 73, 0, 74, 0, 75, 0, 76, - }; - var expected = new Color32[] { - new Color32(9, 10, 11, 12), new Color32(41, 42, 43, 44), new Color32(73, 74, 75, 76), - new Color32(1, 2, 3, 4), new Color32(33, 34, 35, 36), new Color32(65, 66, 67, 68), - }; - var result = new Color32[6]; - - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Srgba64, 3, 2, 24, bytes)) - { - Assert.True(imageFrame.TryReadPixelData(result)); - Assert.AreEqual(expected, result); - } - } - - [Test] - public void TryReadPixelData_ShouldReturnTrue_When_TheFormatIsGray16() - { - var bytes = new byte[] { - // padding is 16 - 2 * 3 = 10 - 0, 1, 0, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 4, 0, 5, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - }; - var expected = new Color32[] { - new Color32(4, 4, 4, 255), new Color32(5, 5, 5, 255), new Color32(6, 6, 6, 255), - new Color32(1, 1, 1, 255), new Color32(2, 2, 2, 255), new Color32(3, 3, 3, 255), - }; - var result = new Color32[6]; - - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Gray16, 3, 2, 16, bytes)) - { - Assert.True(imageFrame.TryReadPixelData(result)); - Assert.AreEqual(expected, result); - } - } - - [Test] - public void TryReadPixelData_ShouldReturnTrue_When_TheFormatIsVec32f1() - { - var floats = new float[] { - // padding is 16 - 3 * 4 = 4 - 1.0f / 255, 2.0f / 255, 3.0f / 255, 0, - 4.0f / 255, 5.0f / 255, 6.0f / 255, 0, - }; - var bytes = FloatsToBytes(floats); - var expected = new Color32[] { - new Color32(4, 4, 4, 255), new Color32(5, 5, 5, 255), new Color32(6, 6, 6, 255), - new Color32(1, 1, 1, 255), new Color32(2, 2, 2, 255), new Color32(3, 3, 3, 255), - }; - var result = new Color32[6]; - - using (var imageFrame = BuildImageFrame(ImageFormat.Types.Format.Vec32F1, 3, 2, 16, bytes)) - { - Assert.True(imageFrame.TryReadPixelData(result)); - Assert.AreEqual(expected, result); - } - } - #endregion - - private ImageFrame BuildImageFrame(ImageFormat.Types.Format format, int width, int height, int widthStep, byte[] pixelData) - { - var array = new NativeArray(pixelData.Length, Allocator.Temp, NativeArrayOptions.UninitializedMemory); - array.CopyFrom(pixelData); - - return new ImageFrame(format, width, height, widthStep, array); - } - - private byte[] FloatsToBytes(float[] array) - { - var bytes = new byte[array.Length * 4]; - - unsafe - { - fixed (float* pArray = array) - { - var pByte = (byte*)pArray; - for (var i = 0; i < 4 * array.Length; i++) - { - bytes[i] = *pByte++; - } - } - } - return bytes; - } - - private void AssertNormalized(byte[] expectedUnnormalized, float[] result) - { - Assert.True(result.All((v) => v >= 0.0f && v <= 1.0f)); - AreAlmostEqual(expectedUnnormalized.Select((v) => (float)v / 255).ToArray(), result, 1e-6); - } - - private void AssertNormalized(ushort[] expectedUnnormalized, float[] result) - { - Assert.True(result.All((v) => v >= 0.0f && v <= 1.0f)); - AreAlmostEqual(expectedUnnormalized.Select((v) => (float)v / 65525).ToArray(), result, 1e-6); - } - - private void AreAlmostEqual(float[] expected, float[] actual, double threshold) - { - Assert.AreEqual(expected.Length, actual.Length); - Assert.True(expected.Zip(actual, (x, y) => x - y).All((diff) => Mathf.Abs(diff) < threshold)); - } - } -} diff --git a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Unity/Extension/ImageFrameExtensionTest.cs.meta b/Packages/com.github.homuler.mediapipe/Tests/EditMode/Unity/Extension/ImageFrameExtensionTest.cs.meta deleted file mode 100644 index b8a26e3..0000000 --- a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Unity/Extension/ImageFrameExtensionTest.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 46cfb5995c4d2b93899f4920ae0b016a -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ProjectSettings/EditorBuildSettings.asset b/ProjectSettings/EditorBuildSettings.asset index 71eb92e..a17bf9c 100644 --- a/ProjectSettings/EditorBuildSettings.asset +++ b/ProjectSettings/EditorBuildSettings.asset @@ -6,10 +6,10 @@ EditorBuildSettings: serializedVersion: 2 m_Scenes: - enabled: 1 - path: Assets/Common/Scenes/WebcamAuthorization.unity + path: Assets/Common/Scenes/Boot.unity guid: ac3a19079fe45844a996d6a9eb62ad76 - enabled: 1 - path: Assets/Common/Scenes/StartScreen.unity + path: Assets/Common/Scenes/MainMenuScreen.unity guid: a50df781449ac1fa5a036626c4710b24 - enabled: 1 path: Assets/Accounts/Scenes/UserCreationScreen.unity @@ -21,7 +21,7 @@ EditorBuildSettings: path: Assets/Accounts/Scenes/UserProgressScreen.unity guid: 222ac8b048efd45478729efeea1f6110 - enabled: 1 - path: Assets/Common/Scenes/CoursesScreen.unity + path: Assets/Common/Scenes/CoursesMenuScreen.unity guid: 4fb0b014dad7fcdcb96413a2c31b9cd1 - enabled: 1 path: Assets/Common/Scenes/ListMinigamesScreen.unity @@ -33,18 +33,18 @@ EditorBuildSettings: path: Assets/Common/Scenes/SettingsScreen.unity guid: 082b8c0d94b135d4a98f83699c92e45b - enabled: 1 - path: Assets/Courses/Scenes/Course_0.unity + path: Assets/Common/Scenes/CourseActivityScreen.unity + guid: 5ff44b09f5858a64692f58938fd6d2ff + - enabled: 1 + path: Assets/Common/Scenes/MinigameActivityScreen.unity + guid: 8e27404f21454dc4583f76b4c7df0c30 + - enabled: 1 + path: Assets/Common/Scenes/ThemeSelectionScreen.unity + guid: 2dfa1265c9d65014c90941ac4240a977 + - enabled: 1 + path: Assets/Courses/Scenes/TemplateCourse.unity guid: 2cda990e2423bbf4892e6590ba056729 - enabled: 1 path: Assets/SpellingBee/Scenes/Game.unity guid: 652195ae9a0ff3ad18f6338db6a909bd - - enabled: 1 - path: Assets/Common/Scenes/InfoMinigame.unity - guid: 8e27404f21454dc4583f76b4c7df0c30 - - enabled: 1 - path: Assets/Common/Scenes/InfoCourse.unity - guid: 5ff44b09f5858a64692f58938fd6d2ff - - enabled: 1 - path: Assets/SpellingBee/Scenes/ThemeSelection.unity - guid: 2dfa1265c9d65014c90941ac4240a977 m_configObjects: {} diff --git a/Assets/Common/Scripts/CourseScreenManager.cs b/assets/common/scripts/CourseMenuScreen.cs similarity index 94% rename from Assets/Common/Scripts/CourseScreenManager.cs rename to assets/common/scripts/CourseMenuScreen.cs index 9b223a5..b229b22 100644 --- a/Assets/Common/Scripts/CourseScreenManager.cs +++ b/assets/common/scripts/CourseMenuScreen.cs @@ -1,12 +1,11 @@ using System; using System.Collections.Generic; using UnityEngine; -using UnityEngine.SceneManagement; /// -/// CourseScreen scene manager +/// CourseMenuScreen scene manager /// -public class CourseScreenManager : MonoBehaviour +public class CourseMenuScreen : MonoBehaviour { /// /// Reference to text that displays when there are no recent courses @@ -79,6 +78,6 @@ public class CourseScreenManager : MonoBehaviour /// The path to the new scene (path == $"Assets/{sceneName}") public void LoadScene(string sceneName) { - SceneManager.LoadScene(sceneName); + SystemController.GetInstance().LoadNextScene(sceneName); } } diff --git a/Assets/Common/Scripts/CourseScreenManager.cs.meta b/assets/common/scripts/CourseMenuScreen.cs.meta similarity index 100% rename from Assets/Common/Scripts/CourseScreenManager.cs.meta rename to assets/common/scripts/CourseMenuScreen.cs.meta diff --git a/wesign-builds/WeSign-Linux.zip b/wesign-builds/WeSign-Linux.zip new file mode 100644 index 0000000..0822381 Binary files /dev/null and b/wesign-builds/WeSign-Linux.zip differ diff --git a/wesign-builds/WeSign-MacOS.app.zip b/wesign-builds/WeSign-MacOS.app.zip new file mode 100644 index 0000000..5f6816a Binary files /dev/null and b/wesign-builds/WeSign-MacOS.app.zip differ diff --git a/wesign-builds/WeSign-Windows.zip b/wesign-builds/WeSign-Windows.zip new file mode 100644 index 0000000..0356d4e Binary files /dev/null and b/wesign-builds/WeSign-Windows.zip differ