diff --git a/msvc/2008_amd_opencl/BULLET_PHYSICS.sln b/msvc/2008_amd_opencl/BULLET_PHYSICS.sln new file mode 100644 index 000000000..ccbb9ac37 --- /dev/null +++ b/msvc/2008_amd_opencl/BULLET_PHYSICS.sln @@ -0,0 +1,135 @@ +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Studio 2008 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "AppOpenCLClothDemo_AMD", "Demos\OpenCLClothDemo\AMD\AppOpenCLClothDemo_AMD.vcproj", "{EBD980B9-223B-4346-AFAD-1912F5F16CAD}" + ProjectSection(ProjectDependencies) = postProject + {DD0534F8-4526-4481-A1E6-2C913F6E75FD} = {DD0534F8-4526-4481-A1E6-2C913F6E75FD} + {830FA940-E0D6-419E-A7D9-39BB8D2B796E} = {830FA940-E0D6-419E-A7D9-39BB8D2B796E} + {F2B826DC-2943-4DD1-A513-7EDD5591AA0A} = {F2B826DC-2943-4DD1-A513-7EDD5591AA0A} + {FC9157DD-3E38-49D4-8F7E-E07AC67A7905} = {FC9157DD-3E38-49D4-8F7E-E07AC67A7905} + {FC031F5B-926E-49B0-AA87-30784877F1E7} = {FC031F5B-926E-49B0-AA87-30784877F1E7} + {5692EAB0-1D79-48AA-AEA1-0D6A62793770} = {5692EAB0-1D79-48AA-AEA1-0D6A62793770} + {E1EB34CA-CDD0-4760-9A30-D033663B1A05} = {E1EB34CA-CDD0-4760-9A30-D033663B1A05} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "AppParticlesOCL_AMD", "Demos\ParticlesOpenCL\AMD\AppParticlesOCL_AMD.vcproj", "{8E9FC92B-D144-46DB-9D66-250B303E9131}" + ProjectSection(ProjectDependencies) = postProject + {DD0534F8-4526-4481-A1E6-2C913F6E75FD} = {DD0534F8-4526-4481-A1E6-2C913F6E75FD} + {FC031F5B-926E-49B0-AA87-30784877F1E7} = {FC031F5B-926E-49B0-AA87-30784877F1E7} + {5692EAB0-1D79-48AA-AEA1-0D6A62793770} = {5692EAB0-1D79-48AA-AEA1-0D6A62793770} + {F2B826DC-2943-4DD1-A513-7EDD5591AA0A} = {F2B826DC-2943-4DD1-A513-7EDD5591AA0A} + {E1EB34CA-CDD0-4760-9A30-D033663B1A05} = {E1EB34CA-CDD0-4760-9A30-D033663B1A05} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "AppVectorAdd_AMD", "Demos\VectorAdd_OpenCL\AMD\AppVectorAdd_AMD.vcproj", "{1E61ADA4-BA79-4506-95AB-8B85833B4BBC}" + ProjectSection(ProjectDependencies) = postProject + {F2B826DC-2943-4DD1-A513-7EDD5591AA0A} = {F2B826DC-2943-4DD1-A513-7EDD5591AA0A} + {E1EB34CA-CDD0-4760-9A30-D033663B1A05} = {E1EB34CA-CDD0-4760-9A30-D033663B1A05} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "BulletCollision", "src\BulletCollision\BulletCollision.vcproj", "{5692EAB0-1D79-48AA-AEA1-0D6A62793770}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "BulletDynamics", "src\BulletDynamics\BulletDynamics.vcproj", "{FC031F5B-926E-49B0-AA87-30784877F1E7}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "BulletMultiThreaded", "src\BulletMultiThreaded\BulletMultiThreaded.vcproj", "{F2B826DC-2943-4DD1-A513-7EDD5591AA0A}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "BulletSoftBody", "src\BulletSoftBody\BulletSoftBody.vcproj", "{FC9157DD-3E38-49D4-8F7E-E07AC67A7905}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "BulletSoftBodySolvers_OpenCL_AMD", "src\BulletMultiThreaded\GpuSoftBodySolvers\OpenCL\AMD\BulletSoftBodySolvers_OpenCL_AMD.vcproj", "{830FA940-E0D6-419E-A7D9-39BB8D2B796E}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "LinearMath", "src\LinearMath\LinearMath.vcproj", "{E1EB34CA-CDD0-4760-9A30-D033663B1A05}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "OpenGLSupport", "Demos\OpenGL\OpenGLSupport.vcproj", "{DD0534F8-4526-4481-A1E6-2C913F6E75FD}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + MinSizeRel|Win32 = MinSizeRel|Win32 + Release|Win32 = Release|Win32 + RelWithDebInfo|Win32 = RelWithDebInfo|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {EBD980B9-223B-4346-AFAD-1912F5F16CAD}.Debug|Win32.ActiveCfg = Debug|Win32 + {EBD980B9-223B-4346-AFAD-1912F5F16CAD}.Debug|Win32.Build.0 = Debug|Win32 + {EBD980B9-223B-4346-AFAD-1912F5F16CAD}.MinSizeRel|Win32.ActiveCfg = MinSizeRel|Win32 + {EBD980B9-223B-4346-AFAD-1912F5F16CAD}.MinSizeRel|Win32.Build.0 = MinSizeRel|Win32 + {EBD980B9-223B-4346-AFAD-1912F5F16CAD}.Release|Win32.ActiveCfg = Release|Win32 + {EBD980B9-223B-4346-AFAD-1912F5F16CAD}.Release|Win32.Build.0 = Release|Win32 + {EBD980B9-223B-4346-AFAD-1912F5F16CAD}.RelWithDebInfo|Win32.ActiveCfg = RelWithDebInfo|Win32 + {EBD980B9-223B-4346-AFAD-1912F5F16CAD}.RelWithDebInfo|Win32.Build.0 = RelWithDebInfo|Win32 + {8E9FC92B-D144-46DB-9D66-250B303E9131}.Debug|Win32.ActiveCfg = Debug|Win32 + {8E9FC92B-D144-46DB-9D66-250B303E9131}.Debug|Win32.Build.0 = Debug|Win32 + {8E9FC92B-D144-46DB-9D66-250B303E9131}.MinSizeRel|Win32.ActiveCfg = MinSizeRel|Win32 + {8E9FC92B-D144-46DB-9D66-250B303E9131}.MinSizeRel|Win32.Build.0 = MinSizeRel|Win32 + {8E9FC92B-D144-46DB-9D66-250B303E9131}.Release|Win32.ActiveCfg = Release|Win32 + {8E9FC92B-D144-46DB-9D66-250B303E9131}.Release|Win32.Build.0 = Release|Win32 + {8E9FC92B-D144-46DB-9D66-250B303E9131}.RelWithDebInfo|Win32.ActiveCfg = RelWithDebInfo|Win32 + {8E9FC92B-D144-46DB-9D66-250B303E9131}.RelWithDebInfo|Win32.Build.0 = RelWithDebInfo|Win32 + {1E61ADA4-BA79-4506-95AB-8B85833B4BBC}.Debug|Win32.ActiveCfg = Debug|Win32 + {1E61ADA4-BA79-4506-95AB-8B85833B4BBC}.Debug|Win32.Build.0 = Debug|Win32 + {1E61ADA4-BA79-4506-95AB-8B85833B4BBC}.MinSizeRel|Win32.ActiveCfg = MinSizeRel|Win32 + {1E61ADA4-BA79-4506-95AB-8B85833B4BBC}.MinSizeRel|Win32.Build.0 = MinSizeRel|Win32 + {1E61ADA4-BA79-4506-95AB-8B85833B4BBC}.Release|Win32.ActiveCfg = Release|Win32 + {1E61ADA4-BA79-4506-95AB-8B85833B4BBC}.Release|Win32.Build.0 = Release|Win32 + {1E61ADA4-BA79-4506-95AB-8B85833B4BBC}.RelWithDebInfo|Win32.ActiveCfg = RelWithDebInfo|Win32 + {1E61ADA4-BA79-4506-95AB-8B85833B4BBC}.RelWithDebInfo|Win32.Build.0 = RelWithDebInfo|Win32 + {5692EAB0-1D79-48AA-AEA1-0D6A62793770}.Debug|Win32.ActiveCfg = Debug|Win32 + {5692EAB0-1D79-48AA-AEA1-0D6A62793770}.Debug|Win32.Build.0 = Debug|Win32 + {5692EAB0-1D79-48AA-AEA1-0D6A62793770}.MinSizeRel|Win32.ActiveCfg = MinSizeRel|Win32 + {5692EAB0-1D79-48AA-AEA1-0D6A62793770}.MinSizeRel|Win32.Build.0 = MinSizeRel|Win32 + {5692EAB0-1D79-48AA-AEA1-0D6A62793770}.Release|Win32.ActiveCfg = Release|Win32 + {5692EAB0-1D79-48AA-AEA1-0D6A62793770}.Release|Win32.Build.0 = Release|Win32 + {5692EAB0-1D79-48AA-AEA1-0D6A62793770}.RelWithDebInfo|Win32.ActiveCfg = RelWithDebInfo|Win32 + {5692EAB0-1D79-48AA-AEA1-0D6A62793770}.RelWithDebInfo|Win32.Build.0 = RelWithDebInfo|Win32 + {FC031F5B-926E-49B0-AA87-30784877F1E7}.Debug|Win32.ActiveCfg = Debug|Win32 + {FC031F5B-926E-49B0-AA87-30784877F1E7}.Debug|Win32.Build.0 = Debug|Win32 + {FC031F5B-926E-49B0-AA87-30784877F1E7}.MinSizeRel|Win32.ActiveCfg = MinSizeRel|Win32 + {FC031F5B-926E-49B0-AA87-30784877F1E7}.MinSizeRel|Win32.Build.0 = MinSizeRel|Win32 + {FC031F5B-926E-49B0-AA87-30784877F1E7}.Release|Win32.ActiveCfg = Release|Win32 + {FC031F5B-926E-49B0-AA87-30784877F1E7}.Release|Win32.Build.0 = Release|Win32 + {FC031F5B-926E-49B0-AA87-30784877F1E7}.RelWithDebInfo|Win32.ActiveCfg = RelWithDebInfo|Win32 + {FC031F5B-926E-49B0-AA87-30784877F1E7}.RelWithDebInfo|Win32.Build.0 = RelWithDebInfo|Win32 + {F2B826DC-2943-4DD1-A513-7EDD5591AA0A}.Debug|Win32.ActiveCfg = Debug|Win32 + {F2B826DC-2943-4DD1-A513-7EDD5591AA0A}.Debug|Win32.Build.0 = Debug|Win32 + {F2B826DC-2943-4DD1-A513-7EDD5591AA0A}.MinSizeRel|Win32.ActiveCfg = MinSizeRel|Win32 + {F2B826DC-2943-4DD1-A513-7EDD5591AA0A}.MinSizeRel|Win32.Build.0 = MinSizeRel|Win32 + {F2B826DC-2943-4DD1-A513-7EDD5591AA0A}.Release|Win32.ActiveCfg = Release|Win32 + {F2B826DC-2943-4DD1-A513-7EDD5591AA0A}.Release|Win32.Build.0 = Release|Win32 + {F2B826DC-2943-4DD1-A513-7EDD5591AA0A}.RelWithDebInfo|Win32.ActiveCfg = RelWithDebInfo|Win32 + {F2B826DC-2943-4DD1-A513-7EDD5591AA0A}.RelWithDebInfo|Win32.Build.0 = RelWithDebInfo|Win32 + {FC9157DD-3E38-49D4-8F7E-E07AC67A7905}.Debug|Win32.ActiveCfg = Debug|Win32 + {FC9157DD-3E38-49D4-8F7E-E07AC67A7905}.Debug|Win32.Build.0 = Debug|Win32 + {FC9157DD-3E38-49D4-8F7E-E07AC67A7905}.MinSizeRel|Win32.ActiveCfg = MinSizeRel|Win32 + {FC9157DD-3E38-49D4-8F7E-E07AC67A7905}.MinSizeRel|Win32.Build.0 = MinSizeRel|Win32 + {FC9157DD-3E38-49D4-8F7E-E07AC67A7905}.Release|Win32.ActiveCfg = Release|Win32 + {FC9157DD-3E38-49D4-8F7E-E07AC67A7905}.Release|Win32.Build.0 = Release|Win32 + {FC9157DD-3E38-49D4-8F7E-E07AC67A7905}.RelWithDebInfo|Win32.ActiveCfg = RelWithDebInfo|Win32 + {FC9157DD-3E38-49D4-8F7E-E07AC67A7905}.RelWithDebInfo|Win32.Build.0 = RelWithDebInfo|Win32 + {830FA940-E0D6-419E-A7D9-39BB8D2B796E}.Debug|Win32.ActiveCfg = Debug|Win32 + {830FA940-E0D6-419E-A7D9-39BB8D2B796E}.Debug|Win32.Build.0 = Debug|Win32 + {830FA940-E0D6-419E-A7D9-39BB8D2B796E}.MinSizeRel|Win32.ActiveCfg = MinSizeRel|Win32 + {830FA940-E0D6-419E-A7D9-39BB8D2B796E}.MinSizeRel|Win32.Build.0 = MinSizeRel|Win32 + {830FA940-E0D6-419E-A7D9-39BB8D2B796E}.Release|Win32.ActiveCfg = Release|Win32 + {830FA940-E0D6-419E-A7D9-39BB8D2B796E}.Release|Win32.Build.0 = Release|Win32 + {830FA940-E0D6-419E-A7D9-39BB8D2B796E}.RelWithDebInfo|Win32.ActiveCfg = RelWithDebInfo|Win32 + {830FA940-E0D6-419E-A7D9-39BB8D2B796E}.RelWithDebInfo|Win32.Build.0 = RelWithDebInfo|Win32 + {E1EB34CA-CDD0-4760-9A30-D033663B1A05}.Debug|Win32.ActiveCfg = Debug|Win32 + {E1EB34CA-CDD0-4760-9A30-D033663B1A05}.Debug|Win32.Build.0 = Debug|Win32 + {E1EB34CA-CDD0-4760-9A30-D033663B1A05}.MinSizeRel|Win32.ActiveCfg = MinSizeRel|Win32 + {E1EB34CA-CDD0-4760-9A30-D033663B1A05}.MinSizeRel|Win32.Build.0 = MinSizeRel|Win32 + {E1EB34CA-CDD0-4760-9A30-D033663B1A05}.Release|Win32.ActiveCfg = Release|Win32 + {E1EB34CA-CDD0-4760-9A30-D033663B1A05}.Release|Win32.Build.0 = Release|Win32 + {E1EB34CA-CDD0-4760-9A30-D033663B1A05}.RelWithDebInfo|Win32.ActiveCfg = RelWithDebInfo|Win32 + {E1EB34CA-CDD0-4760-9A30-D033663B1A05}.RelWithDebInfo|Win32.Build.0 = RelWithDebInfo|Win32 + {DD0534F8-4526-4481-A1E6-2C913F6E75FD}.Debug|Win32.ActiveCfg = Debug|Win32 + {DD0534F8-4526-4481-A1E6-2C913F6E75FD}.Debug|Win32.Build.0 = Debug|Win32 + {DD0534F8-4526-4481-A1E6-2C913F6E75FD}.MinSizeRel|Win32.ActiveCfg = MinSizeRel|Win32 + {DD0534F8-4526-4481-A1E6-2C913F6E75FD}.MinSizeRel|Win32.Build.0 = MinSizeRel|Win32 + {DD0534F8-4526-4481-A1E6-2C913F6E75FD}.Release|Win32.ActiveCfg = Release|Win32 + {DD0534F8-4526-4481-A1E6-2C913F6E75FD}.Release|Win32.Build.0 = Release|Win32 + {DD0534F8-4526-4481-A1E6-2C913F6E75FD}.RelWithDebInfo|Win32.ActiveCfg = RelWithDebInfo|Win32 + {DD0534F8-4526-4481-A1E6-2C913F6E75FD}.RelWithDebInfo|Win32.Build.0 = RelWithDebInfo|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/msvc/2008_amd_opencl/Demos/OpenCLClothDemo/AMD/AppOpenCLClothDemo_AMD.vcproj b/msvc/2008_amd_opencl/Demos/OpenCLClothDemo/AMD/AppOpenCLClothDemo_AMD.vcproj new file mode 100644 index 000000000..9f09096c0 --- /dev/null +++ b/msvc/2008_amd_opencl/Demos/OpenCLClothDemo/AMD/AppOpenCLClothDemo_AMD.vcproj @@ -0,0 +1,471 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/msvc/2008_amd_opencl/Demos/OpenGL/OpenGLSupport.vcproj b/msvc/2008_amd_opencl/Demos/OpenGL/OpenGLSupport.vcproj new file mode 100644 index 000000000..d542e8534 --- /dev/null +++ b/msvc/2008_amd_opencl/Demos/OpenGL/OpenGLSupport.vcproj @@ -0,0 +1,307 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/msvc/2008_amd_opencl/Demos/ParticlesOpenCL/AMD/AppParticlesOCL_AMD.vcproj b/msvc/2008_amd_opencl/Demos/ParticlesOpenCL/AMD/AppParticlesOCL_AMD.vcproj new file mode 100644 index 000000000..f73eb178e --- /dev/null +++ b/msvc/2008_amd_opencl/Demos/ParticlesOpenCL/AMD/AppParticlesOCL_AMD.vcproj @@ -0,0 +1,483 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/msvc/2008_amd_opencl/Demos/VectorAdd_OpenCL/AMD/AppVectorAdd_AMD.vcproj b/msvc/2008_amd_opencl/Demos/VectorAdd_OpenCL/AMD/AppVectorAdd_AMD.vcproj new file mode 100644 index 000000000..9c56c6e17 --- /dev/null +++ b/msvc/2008_amd_opencl/Demos/VectorAdd_OpenCL/AMD/AppVectorAdd_AMD.vcproj @@ -0,0 +1,431 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/msvc/2008_amd_opencl/src/BulletCollision/BulletCollision.vcproj b/msvc/2008_amd_opencl/src/BulletCollision/BulletCollision.vcproj new file mode 100644 index 000000000..e82807454 --- /dev/null +++ b/msvc/2008_amd_opencl/src/BulletCollision/BulletCollision.vcproj @@ -0,0 +1,871 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/msvc/2008_amd_opencl/src/BulletDynamics/BulletDynamics.vcproj b/msvc/2008_amd_opencl/src/BulletDynamics/BulletDynamics.vcproj new file mode 100644 index 000000000..1c6702d34 --- /dev/null +++ b/msvc/2008_amd_opencl/src/BulletDynamics/BulletDynamics.vcproj @@ -0,0 +1,391 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/msvc/2008_amd_opencl/src/BulletMultiThreaded/BulletMultiThreaded.vcproj b/msvc/2008_amd_opencl/src/BulletMultiThreaded/BulletMultiThreaded.vcproj new file mode 100644 index 000000000..fa85bec85 --- /dev/null +++ b/msvc/2008_amd_opencl/src/BulletMultiThreaded/BulletMultiThreaded.vcproj @@ -0,0 +1,385 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/msvc/2008_amd_opencl/src/BulletSoftBody/BulletSoftBody.vcproj b/msvc/2008_amd_opencl/src/BulletSoftBody/BulletSoftBody.vcproj new file mode 100644 index 000000000..e417eaa87 --- /dev/null +++ b/msvc/2008_amd_opencl/src/BulletSoftBody/BulletSoftBody.vcproj @@ -0,0 +1,298 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/msvc/2008_amd_opencl/src/LinearMath/LinearMath.vcproj b/msvc/2008_amd_opencl/src/LinearMath/LinearMath.vcproj new file mode 100644 index 000000000..7c345cf6d --- /dev/null +++ b/msvc/2008_amd_opencl/src/LinearMath/LinearMath.vcproj @@ -0,0 +1,325 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +