diff --git a/Tests/Cosmos.Compiler.Tests.SingleEchoTest/AssemblyInfo.cs b/Tests/Cosmos.Compiler.Tests.SingleEchoTest/AssemblyInfo.cs new file mode 100644 index 000000000..6848b03ad --- /dev/null +++ b/Tests/Cosmos.Compiler.Tests.SingleEchoTest/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System; +using System.Reflection; +using System.Resources; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Package Name")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Company")] +[assembly: AssemblyProduct("Package Name")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] +[assembly: ComVisible(false)] +[assembly: CLSCompliant(false)] +[assembly: NeutralResourcesLanguage("en-US")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] + + + diff --git a/Tests/Cosmos.Compiler.Tests.SingleEchoTest/Cosmos.Compiler.Tests.SingleEchoTest.csproj b/Tests/Cosmos.Compiler.Tests.SingleEchoTest/Cosmos.Compiler.Tests.SingleEchoTest.csproj new file mode 100644 index 000000000..c231fb66b --- /dev/null +++ b/Tests/Cosmos.Compiler.Tests.SingleEchoTest/Cosmos.Compiler.Tests.SingleEchoTest.csproj @@ -0,0 +1,70 @@ + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {3E28CFD9-25D4-4EBB-86E3-4A4A8A8936FE} + Library + Properties + Cosmos.Compiler.Tests.SingleEchoTest + Cosmos.Compiler.Tests.SingleEchoTest + 512 + v4.5 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + x86 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + true + + + Cosmos.snk + + + + + + + + + + + + + {61607f1e-58f9-41cf-972f-128384f3e115} + Cosmos.Debug.Kernel + + + {3def0461-08ab-471a-8f03-a9c556652a0f} + Cosmos.System + + + + + + + + \ No newline at end of file diff --git a/Tests/Cosmos.Compiler.Tests.SingleEchoTest/Cosmos.Compiler.Tests.SingleEchoTestBoot.Cosmos b/Tests/Cosmos.Compiler.Tests.SingleEchoTest/Cosmos.Compiler.Tests.SingleEchoTestBoot.Cosmos new file mode 100644 index 000000000..caf7fb957 --- /dev/null +++ b/Tests/Cosmos.Compiler.Tests.SingleEchoTest/Cosmos.Compiler.Tests.SingleEchoTestBoot.Cosmos @@ -0,0 +1,58 @@ + + + + Debug + 2.0 + {41efaeb7-7d53-4f6b-ae63-cfda84a22a38} + false + Cosmos.Compiler.Tests.SingleEchoTestBoot + elf + v4.5 + + + VMware + + true + Source + User + False + false + Player + bin\Debug\ + Cosmos.Compiler.Tests.SingleEchoTestBoot + Use VMware Player or Workstation to deploy and debug. + ISO + VMware + Pipe: Cosmos\Serial + + + + Cosmos.Core.Plugs + {d9a87aad-fcc9-4517-b31d-e904dad00784} + True + + + Cosmos.Debug.Kernel.Plugs + {b97a2956-c363-47f2-a6aa-b4fccff4d315} + True + + + Cosmos.System.Plugs + {7c64b97f-516d-4a6d-b9e1-3fe48f561409} + True + + + Cosmos.Compiler.Tests.SingleEchoTest + {3e28cfd9-25d4-4ebb-86e3-4a4a8a8936fe} + True + + + + + \ No newline at end of file diff --git a/Tests/Cosmos.Compiler.Tests.SingleEchoTest/Cosmos.snk b/Tests/Cosmos.Compiler.Tests.SingleEchoTest/Cosmos.snk new file mode 100644 index 000000000..68808d392 Binary files /dev/null and b/Tests/Cosmos.Compiler.Tests.SingleEchoTest/Cosmos.snk differ diff --git a/Tests/Cosmos.Compiler.Tests.SingleEchoTest/Kernel.cs b/Tests/Cosmos.Compiler.Tests.SingleEchoTest/Kernel.cs new file mode 100644 index 000000000..dd6193908 --- /dev/null +++ b/Tests/Cosmos.Compiler.Tests.SingleEchoTest/Kernel.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using System.Text; +using Sys = Cosmos.System; + +namespace Cosmos.Compiler.Tests.SingleEchoTest +{ + public class Kernel : Sys.Kernel + { + protected override void BeforeRun() + { + Console.WriteLine("Cosmos booted successfully. Type a line of text to get it echoed back."); + } + + protected override void Run() + { + // start by faking a b c + Sys.TestingHelpers.KeyboardAddFakeScanCode(0x1E, false); + Sys.TestingHelpers.KeyboardAddFakeScanCode(0x1E, true); + Sys.TestingHelpers.KeyboardAddFakeScanCode(0x2E, false); + Sys.TestingHelpers.KeyboardAddFakeScanCode(0x2E, true); + Sys.TestingHelpers.KeyboardAddFakeScanCode(0x30, false); + Sys.TestingHelpers.KeyboardAddFakeScanCode(0x30, true); + // enter: + Sys.TestingHelpers.KeyboardAddFakeScanCode(0x1C, false); + Sys.TestingHelpers.KeyboardAddFakeScanCode(0x1C, true); + + Console.Write("Input: "); + var input = Console.ReadLine(); + Console.Write("Text typed: "); + Console.WriteLine(input); + while (true) + ; + } + } +} diff --git a/Tests/Cosmos.TestRunner.Core/Cosmos.TestRunner.Core.csproj b/Tests/Cosmos.TestRunner.Core/Cosmos.TestRunner.Core.csproj index de49b7c53..105b3df9b 100644 --- a/Tests/Cosmos.TestRunner.Core/Cosmos.TestRunner.Core.csproj +++ b/Tests/Cosmos.TestRunner.Core/Cosmos.TestRunner.Core.csproj @@ -133,6 +133,10 @@ {57045fe8-b0fe-4fc1-810f-7c3914aef1de} Cosmos.Compiler.Tests.SimpleWriteLine.Kernel + + {3e28cfd9-25d4-4ebb-86e3-4a4a8a8936fe} + Cosmos.Compiler.Tests.SingleEchoTest + {E6D3B644-C487-472D-A978-C1A82D0C099B} Cosmos.TestRunner.TestController diff --git a/Tests/Cosmos.TestRunner.Core/DefaultEngineConfiguration.cs b/Tests/Cosmos.TestRunner.Core/DefaultEngineConfiguration.cs index d7debef1a..3433104db 100644 --- a/Tests/Cosmos.TestRunner.Core/DefaultEngineConfiguration.cs +++ b/Tests/Cosmos.TestRunner.Core/DefaultEngineConfiguration.cs @@ -15,16 +15,17 @@ namespace Cosmos.TestRunner.Core engine.AllowedSecondsInKernel = 180; // If you want to test only specific platforms, add them to the list, like next line. By default, all platforms are ran. - //engine.RunTargets.Add(RunTargetEnum.Bochs); + engine.RunTargets.Add(RunTargetEnum.Bochs); // if you're working on the compiler (or other lower parts), you can choose to run the compiler in process // 1 thing to keep in mind though, is that this only works with 1 kernel at a time! - engine.RunIL2CPUInProcess = false; + engine.RunIL2CPUInProcess = true; engine.RunWithGDB = false; - engine.AddKernel(typeof(Cosmos.Compiler.Tests.SimpleWriteLine.Kernel.Kernel).Assembly.Location); - engine.AddKernel(typeof(SimpleStructsAndArraysTest.Kernel).Assembly.Location); - engine.AddKernel(typeof(VGACompilerCrash.Kernel).Assembly.Location); + //engine.AddKernel(typeof(Cosmos.Compiler.Tests.SimpleWriteLine.Kernel.Kernel).Assembly.Location); + //engine.AddKernel(typeof(SimpleStructsAndArraysTest.Kernel).Assembly.Location); + //engine.AddKernel(typeof(VGACompilerCrash.Kernel).Assembly.Location); + engine.AddKernel(typeof(Cosmos.Compiler.Tests.SingleEchoTest.Kernel).Assembly.Location); // known bugs, therefor disabled for now: //engine.AddKernel(typeof(BoxingTests.Kernel).Assembly.Location); diff --git a/Tests/Cosmos.TestRunner/Cosmos.TestRunner.csproj b/Tests/Cosmos.TestRunner/Cosmos.TestRunner.csproj index b1d63f43c..bfb30c2ef 100644 --- a/Tests/Cosmos.TestRunner/Cosmos.TestRunner.csproj +++ b/Tests/Cosmos.TestRunner/Cosmos.TestRunner.csproj @@ -65,6 +65,10 @@ {57045fe8-b0fe-4fc1-810f-7c3914aef1de} Cosmos.Compiler.Tests.SimpleWriteLine.Kernel + + {3e28cfd9-25d4-4ebb-86e3-4a4a8a8936fe} + Cosmos.Compiler.Tests.SingleEchoTest + {758FAF24-9974-4DB8-82EF-1B64DAF2F0BC} Cosmos.TestRunner.Core diff --git a/source/Cosmos.HAL/Global.cs b/source/Cosmos.HAL/Global.cs index 9a61a2bb8..781a5f55e 100644 --- a/source/Cosmos.HAL/Global.cs +++ b/source/Cosmos.HAL/Global.cs @@ -82,7 +82,10 @@ namespace Cosmos.HAL { //TextScreen.Clear(); Global.Dbg.Send("Keyboard"); - Keyboard = new DefaultKeyboard(); + if (Keyboard == null) + { + Keyboard = new DefaultKeyboard(); + } // Find hardcoded ATA controllers Global.Dbg.Send("ATA Master"); diff --git a/source/Cosmos.HAL/Keyboard.cs b/source/Cosmos.HAL/Keyboard.cs index 044443ae0..ef4b0e637 100644 --- a/source/Cosmos.HAL/Keyboard.cs +++ b/source/Cosmos.HAL/Keyboard.cs @@ -78,6 +78,14 @@ namespace Cosmos.HAL { HandleScancode(xScanCode, xReleased); } + /// + /// Allow faking scancodes. Used for test kernels + /// + internal void HandleFakeScanCode(byte aScancode, bool aReleased) + { + HandleScancode(aScancode, aReleased); + } + protected abstract void HandleScancode(byte aScancode, bool aReleased); private static Queue mQueuedKeys; diff --git a/source/Cosmos.HAL/Properties/AssemblyInfo.cs b/source/Cosmos.HAL/Properties/AssemblyInfo.cs index 9753526d2..ae34db9c8 100644 --- a/source/Cosmos.HAL/Properties/AssemblyInfo.cs +++ b/source/Cosmos.HAL/Properties/AssemblyInfo.cs @@ -2,7 +2,7 @@ using System.Runtime.CompilerServices; using System.Runtime.InteropServices; -// General Information about an assembly is controlled through the following +// General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. using Cosmos.Common; @@ -16,8 +16,8 @@ using Cosmos.Common; [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from // COM, set the ComVisible attribute to true on that type. [assembly: ComVisible(false)] @@ -27,14 +27,16 @@ using Cosmos.Common; // Version information for an assembly consists of the following four values: // // Major Version -// Minor Version +// Minor Version // Build Number // Revision // -// You can specify all the values or you can default the Build and Revision Numbers +// You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("1.0.0.0")] [assembly: AssemblyFileVersion("1.0.0.0")] -[assembly: Ring(Ring.HAL)] \ No newline at end of file +[assembly: Ring(Ring.HAL)] + +[assembly: InternalsVisibleTo("Cosmos.System, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e3ef5198fa2f8926f006b5d2053eb3b3c875e74695675a6b97bd27ba6b0c5cbee26710c04277f7975927ace4a037692eddb71340a4c3f11e06c645c6a4cebad303301228943b39378bf3222f9432ff9c72c31d1a5e936db6cf9f18c23bd52a43c091fc803ce2139cd390a9678553d1e6061656c3d0196ddbd2233143fc433195")] diff --git a/source/Cosmos.System/Cosmos.System.csproj b/source/Cosmos.System/Cosmos.System.csproj index 0bc9d051a..89c17580b 100644 --- a/source/Cosmos.System/Cosmos.System.csproj +++ b/source/Cosmos.System/Cosmos.System.csproj @@ -99,6 +99,7 @@ + diff --git a/source/Cosmos.System/Properties/AssemblyInfo.cs b/source/Cosmos.System/Properties/AssemblyInfo.cs index 159961c51..a45c70475 100644 --- a/source/Cosmos.System/Properties/AssemblyInfo.cs +++ b/source/Cosmos.System/Properties/AssemblyInfo.cs @@ -2,7 +2,7 @@ using System.Runtime.CompilerServices; using System.Runtime.InteropServices; -// General Information about an assembly is controlled through the following +// General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. using Cosmos.Common; @@ -16,8 +16,8 @@ using Cosmos.Common; [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from // COM, set the ComVisible attribute to true on that type. [assembly: ComVisible(false)] @@ -27,11 +27,11 @@ using Cosmos.Common; // Version information for an assembly consists of the following four values: // // Major Version -// Minor Version +// Minor Version // Build Number // Revision // -// You can specify all the values or you can default the Build and Revision Numbers +// You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("1.0.0.0")] @@ -40,4 +40,5 @@ using Cosmos.Common; [assembly: Ring(Ring.System)] // to allow VSTests: -[assembly: InternalsVisibleTo("Cosmos.System.VSTests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e3ef5198fa2f8926f006b5d2053eb3b3c875e74695675a6b97bd27ba6b0c5cbee26710c04277f7975927ace4a037692eddb71340a4c3f11e06c645c6a4cebad303301228943b39378bf3222f9432ff9c72c31d1a5e936db6cf9f18c23bd52a43c091fc803ce2139cd390a9678553d1e6061656c3d0196ddbd2233143fc433195")] \ No newline at end of file +[assembly: InternalsVisibleTo("Cosmos.System.VSTests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e3ef5198fa2f8926f006b5d2053eb3b3c875e74695675a6b97bd27ba6b0c5cbee26710c04277f7975927ace4a037692eddb71340a4c3f11e06c645c6a4cebad303301228943b39378bf3222f9432ff9c72c31d1a5e936db6cf9f18c23bd52a43c091fc803ce2139cd390a9678553d1e6061656c3d0196ddbd2233143fc433195")] +[assembly: InternalsVisibleTo("Cosmos.Compiler.Tests.SingleEchoTest, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e3ef5198fa2f8926f006b5d2053eb3b3c875e74695675a6b97bd27ba6b0c5cbee26710c04277f7975927ace4a037692eddb71340a4c3f11e06c645c6a4cebad303301228943b39378bf3222f9432ff9c72c31d1a5e936db6cf9f18c23bd52a43c091fc803ce2139cd390a9678553d1e6061656c3d0196ddbd2233143fc433195")] diff --git a/source/Cosmos.System/TestingHelpers.cs b/source/Cosmos.System/TestingHelpers.cs new file mode 100644 index 000000000..fcc5ec673 --- /dev/null +++ b/source/Cosmos.System/TestingHelpers.cs @@ -0,0 +1,11 @@ +namespace Cosmos.System +{ + // This class exists purely for testing purposes. + internal static class TestingHelpers + { + internal static void KeyboardAddFakeScanCode(byte aScanCode, bool aReleased) + { + HAL.Global.Keyboard.HandleFakeScanCode(aScanCode, aReleased); + } + } +} diff --git a/source/Cosmos.sln b/source/Cosmos.sln index 9347c32f2..d51984d36 100644 --- a/source/Cosmos.sln +++ b/source/Cosmos.sln @@ -239,6 +239,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BoxingTests", "..\Tests\Box EndProject Project("{471EC4BB-E47E-4229-A789-D1F5F83B52D4}") = "BoxingTestsBoot", "..\Tests\BoxingTests\BoxingTestsBoot.Cosmos", "{444098BC-8F72-4030-A8C0-118D2DD93EB8}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Cosmos.Compiler.Tests.SingleEchoTest", "..\Tests\Cosmos.Compiler.Tests.SingleEchoTest\Cosmos.Compiler.Tests.SingleEchoTest.csproj", "{3E28CFD9-25D4-4EBB-86E3-4A4A8A8936FE}" +EndProject +Project("{471EC4BB-E47E-4229-A789-D1F5F83B52D4}") = "Cosmos.Compiler.Tests.SingleEchoTestBoot", "..\Tests\Cosmos.Compiler.Tests.SingleEchoTest\Cosmos.Compiler.Tests.SingleEchoTestBoot.Cosmos", "{41EFAEB7-7D53-4F6B-AE63-CFDA84A22A38}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -1228,6 +1232,38 @@ Global {444098BC-8F72-4030-A8C0-118D2DD93EB8}.Release|Mixed Platforms.Build.0 = Debug|x86 {444098BC-8F72-4030-A8C0-118D2DD93EB8}.Release|x86.ActiveCfg = Debug|x86 {444098BC-8F72-4030-A8C0-118D2DD93EB8}.Release|x86.Build.0 = Debug|x86 + {3E28CFD9-25D4-4EBB-86E3-4A4A8A8936FE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3E28CFD9-25D4-4EBB-86E3-4A4A8A8936FE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3E28CFD9-25D4-4EBB-86E3-4A4A8A8936FE}.Debug|Itanium.ActiveCfg = Debug|Any CPU + {3E28CFD9-25D4-4EBB-86E3-4A4A8A8936FE}.Debug|Itanium.Build.0 = Debug|Any CPU + {3E28CFD9-25D4-4EBB-86E3-4A4A8A8936FE}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {3E28CFD9-25D4-4EBB-86E3-4A4A8A8936FE}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {3E28CFD9-25D4-4EBB-86E3-4A4A8A8936FE}.Debug|x86.ActiveCfg = Debug|Any CPU + {3E28CFD9-25D4-4EBB-86E3-4A4A8A8936FE}.Debug|x86.Build.0 = Debug|Any CPU + {3E28CFD9-25D4-4EBB-86E3-4A4A8A8936FE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3E28CFD9-25D4-4EBB-86E3-4A4A8A8936FE}.Release|Any CPU.Build.0 = Release|Any CPU + {3E28CFD9-25D4-4EBB-86E3-4A4A8A8936FE}.Release|Itanium.ActiveCfg = Release|Any CPU + {3E28CFD9-25D4-4EBB-86E3-4A4A8A8936FE}.Release|Itanium.Build.0 = Release|Any CPU + {3E28CFD9-25D4-4EBB-86E3-4A4A8A8936FE}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {3E28CFD9-25D4-4EBB-86E3-4A4A8A8936FE}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {3E28CFD9-25D4-4EBB-86E3-4A4A8A8936FE}.Release|x86.ActiveCfg = Release|Any CPU + {3E28CFD9-25D4-4EBB-86E3-4A4A8A8936FE}.Release|x86.Build.0 = Release|Any CPU + {41EFAEB7-7D53-4F6B-AE63-CFDA84A22A38}.Debug|Any CPU.ActiveCfg = Debug|x86 + {41EFAEB7-7D53-4F6B-AE63-CFDA84A22A38}.Debug|Any CPU.Build.0 = Debug|x86 + {41EFAEB7-7D53-4F6B-AE63-CFDA84A22A38}.Debug|Itanium.ActiveCfg = Debug|x86 + {41EFAEB7-7D53-4F6B-AE63-CFDA84A22A38}.Debug|Itanium.Build.0 = Debug|x86 + {41EFAEB7-7D53-4F6B-AE63-CFDA84A22A38}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 + {41EFAEB7-7D53-4F6B-AE63-CFDA84A22A38}.Debug|Mixed Platforms.Build.0 = Debug|x86 + {41EFAEB7-7D53-4F6B-AE63-CFDA84A22A38}.Debug|x86.ActiveCfg = Debug|x86 + {41EFAEB7-7D53-4F6B-AE63-CFDA84A22A38}.Debug|x86.Build.0 = Debug|x86 + {41EFAEB7-7D53-4F6B-AE63-CFDA84A22A38}.Release|Any CPU.ActiveCfg = Debug|x86 + {41EFAEB7-7D53-4F6B-AE63-CFDA84A22A38}.Release|Any CPU.Build.0 = Debug|x86 + {41EFAEB7-7D53-4F6B-AE63-CFDA84A22A38}.Release|Itanium.ActiveCfg = Debug|x86 + {41EFAEB7-7D53-4F6B-AE63-CFDA84A22A38}.Release|Itanium.Build.0 = Debug|x86 + {41EFAEB7-7D53-4F6B-AE63-CFDA84A22A38}.Release|Mixed Platforms.ActiveCfg = Debug|x86 + {41EFAEB7-7D53-4F6B-AE63-CFDA84A22A38}.Release|Mixed Platforms.Build.0 = Debug|x86 + {41EFAEB7-7D53-4F6B-AE63-CFDA84A22A38}.Release|x86.ActiveCfg = Debug|x86 + {41EFAEB7-7D53-4F6B-AE63-CFDA84A22A38}.Release|x86.Build.0 = Debug|x86 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -1322,5 +1358,7 @@ Global {0B20C26F-CA92-4D88-8211-EC7B0A261337} = {79173AE7-4596-4D33-866F-6F94A2314BE8} {F8889473-5866-4913-86AC-8072A1A2558C} = {F104F6BC-EF8E-4408-A786-D570D7565231} {444098BC-8F72-4030-A8C0-118D2DD93EB8} = {F104F6BC-EF8E-4408-A786-D570D7565231} + {3E28CFD9-25D4-4EBB-86E3-4A4A8A8936FE} = {F104F6BC-EF8E-4408-A786-D570D7565231} + {41EFAEB7-7D53-4F6B-AE63-CFDA84A22A38} = {F104F6BC-EF8E-4408-A786-D570D7565231} EndGlobalSection EndGlobal