aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenGridServices
diff options
context:
space:
mode:
authormingchen2007-06-26 17:50:27 +0000
committermingchen2007-06-26 17:50:27 +0000
commit8ff1d0968ff3c4173b036398359ef62a356ad2b2 (patch)
tree46e740c18866096e1c4f03e4a42cf7e0c0a4539c /OpenGridServices
parent* Updated demo filter to show more common usage (as well as embedding multipl... (diff)
downloadopensim-SC-8ff1d0968ff3c4173b036398359ef62a356ad2b2.zip
opensim-SC-8ff1d0968ff3c4173b036398359ef62a356ad2b2.tar.gz
opensim-SC-8ff1d0968ff3c4173b036398359ef62a356ad2b2.tar.bz2
opensim-SC-8ff1d0968ff3c4173b036398359ef62a356ad2b2.tar.xz
*Added support for reservations in OpenGridServices (mysql only for now)
*SQL file coming soon (as soon as I can figure out how to get the
Diffstat (limited to 'OpenGridServices')
-rw-r--r--OpenGridServices/OpenGrid.Framework.Data.MSSQL/MSSQLGridData.cs8
-rw-r--r--OpenGridServices/OpenGrid.Framework.Data.MySQL/MySQLGridData.cs27
-rw-r--r--OpenGridServices/OpenGrid.Framework.Data.MySQL/MySQLManager.cs28
-rw-r--r--OpenGridServices/OpenGrid.Framework.Data.SQLite/SQLiteGridData.cs5
-rw-r--r--OpenGridServices/OpenGridServices.AssetServer/Main.cs2
-rw-r--r--OpenGridServices/OpenGridServices.GridServer/GridManager.cs26
-rw-r--r--OpenGridServices/OpenGridServices.UserServer/Main.cs8
-rw-r--r--OpenGridServices/OpenGridServices.UserServer/OpenGridServices.UserServer.csproj55
8 files changed, 119 insertions, 40 deletions
diff --git a/OpenGridServices/OpenGrid.Framework.Data.MSSQL/MSSQLGridData.cs b/OpenGridServices/OpenGrid.Framework.Data.MSSQL/MSSQLGridData.cs
index 92169c4..1dac4bd 100644
--- a/OpenGridServices/OpenGrid.Framework.Data.MSSQL/MSSQLGridData.cs
+++ b/OpenGridServices/OpenGrid.Framework.Data.MSSQL/MSSQLGridData.cs
@@ -181,10 +181,12 @@ namespace OpenGrid.Framework.Data.MSSQL
181 181
182 byte[] stream = TextProvider.GetBytes(uuid.ToStringHyphenated() + ":" + handle.ToString() + ":" + challenge); 182 byte[] stream = TextProvider.GetBytes(uuid.ToStringHyphenated() + ":" + handle.ToString() + ":" + challenge);
183 byte[] hash = HashProvider.ComputeHash(stream); 183 byte[] hash = HashProvider.ComputeHash(stream);
184
185 return false; 184 return false;
186 } 185 }
186 public ReservationData GetReservationAtPoint(uint x, uint y)
187 {
188 return null;
189 }
187 } 190 }
188 191
189
190} 192}
diff --git a/OpenGridServices/OpenGrid.Framework.Data.MySQL/MySQLGridData.cs b/OpenGridServices/OpenGrid.Framework.Data.MySQL/MySQLGridData.cs
index d9a517d..4d6cf63 100644
--- a/OpenGridServices/OpenGrid.Framework.Data.MySQL/MySQLGridData.cs
+++ b/OpenGridServices/OpenGrid.Framework.Data.MySQL/MySQLGridData.cs
@@ -252,6 +252,33 @@ namespace OpenGrid.Framework.Data.MySQL
252 252
253 return false; 253 return false;
254 } 254 }
255
256 public ReservationData GetReservationAtPoint(uint x, uint y)
257 {
258 try
259 {
260 lock (database)
261 {
262 Dictionary<string, string> param = new Dictionary<string, string>();
263 param["?x"] = x.ToString();
264 param["?y"] = y.ToString();
265 System.Data.IDbCommand result = database.Query("SELECT * FROM reservations WHERE resXMin <= ?x AND resXMax >= ?x AND resYMin <= ?y AND resYMax >= ?y", param);
266 System.Data.IDataReader reader = result.ExecuteReader();
267
268 ReservationData row = database.readReservationRow(reader);
269 reader.Close();
270 result.Dispose();
271
272 return row;
273 }
274 }
275 catch (Exception e)
276 {
277 database.Reconnect();
278 Console.WriteLine(e.ToString());
279 return null;
280 }
281 }
255 } 282 }
256 283
257 284
diff --git a/OpenGridServices/OpenGrid.Framework.Data.MySQL/MySQLManager.cs b/OpenGridServices/OpenGrid.Framework.Data.MySQL/MySQLManager.cs
index 76d3faf..53b3bdd 100644
--- a/OpenGridServices/OpenGrid.Framework.Data.MySQL/MySQLManager.cs
+++ b/OpenGridServices/OpenGrid.Framework.Data.MySQL/MySQLManager.cs
@@ -241,6 +241,34 @@ namespace OpenGrid.Framework.Data.MySQL
241 } 241 }
242 242
243 /// <summary> 243 /// <summary>
244 /// Reads a reservation row from a database reader
245 /// </summary>
246 /// <param name="reader">An active database reader</param>
247 /// <returns>A reservation data object</returns>
248 public ReservationData readReservationRow(IDataReader reader)
249 {
250 ReservationData retval = new ReservationData();
251 if (reader.Read())
252 {
253 retval.gridRecvKey = (string)reader["gridRecvKey"];
254 retval.gridSendKey = (string)reader["gridSendKey"];
255 retval.reservationCompany = (string)reader["resCompany"];
256 retval.reservationMaxX = (int)reader["resXMax"];
257 retval.reservationMaxY = (int)reader["resYMax"];
258 retval.reservationMinX = (int)reader["resXMin"];
259 retval.reservationMinY = (int)reader["resYMin"];
260 retval.reservationName = (string)reader["resName"];
261 retval.status = (bool)reader["status"];
262 retval.userUUID = new libsecondlife.LLUUID((string)reader["userUUID"]);
263
264 }
265 else
266 {
267 return null;
268 }
269 return retval;
270 }
271 /// <summary>
244 /// Reads an agent row from a database reader 272 /// Reads an agent row from a database reader
245 /// </summary> 273 /// </summary>
246 /// <param name="reader">An active database reader</param> 274 /// <param name="reader">An active database reader</param>
diff --git a/OpenGridServices/OpenGrid.Framework.Data.SQLite/SQLiteGridData.cs b/OpenGridServices/OpenGrid.Framework.Data.SQLite/SQLiteGridData.cs
index 94ed46f..d7a5a69 100644
--- a/OpenGridServices/OpenGrid.Framework.Data.SQLite/SQLiteGridData.cs
+++ b/OpenGridServices/OpenGrid.Framework.Data.SQLite/SQLiteGridData.cs
@@ -184,6 +184,11 @@ namespace OpenGrid.Framework.Data.SQLite
184 184
185 return false; 185 return false;
186 } 186 }
187
188 public ReservationData GetReservationAtPoint(uint x, uint y)
189 {
190 return null;
191 }
187 } 192 }
188 193
189 194
diff --git a/OpenGridServices/OpenGridServices.AssetServer/Main.cs b/OpenGridServices/OpenGridServices.AssetServer/Main.cs
index 057004d..96c9dba 100644
--- a/OpenGridServices/OpenGridServices.AssetServer/Main.cs
+++ b/OpenGridServices/OpenGridServices.AssetServer/Main.cs
@@ -81,7 +81,7 @@ namespace OpenGridServices.AssetServer
81 private OpenAsset_Main() 81 private OpenAsset_Main()
82 { 82 {
83 m_console = new LogBase("opengrid-AssetServer-console.log", "OpenAsset", this, false); 83 m_console = new LogBase("opengrid-AssetServer-console.log", "OpenAsset", this, false);
84 MainLog.Instance = m_console; 84 OpenSim.Framework.Console.MainLog.Instance = m_console;
85 } 85 }
86 86
87 public void Startup() 87 public void Startup()
diff --git a/OpenGridServices/OpenGridServices.GridServer/GridManager.cs b/OpenGridServices/OpenGridServices.GridServer/GridManager.cs
index cfbf591..bf80652 100644
--- a/OpenGridServices/OpenGridServices.GridServer/GridManager.cs
+++ b/OpenGridServices/OpenGridServices.GridServer/GridManager.cs
@@ -392,11 +392,11 @@ namespace OpenGridServices.GridServer
392 simProfileBlock["map-image-id"] = simProfile.regionMapTextureID.ToString(); 392 simProfileBlock["map-image-id"] = simProfile.regionMapTextureID.ToString();
393 393
394 // For Sugilite compatibility 394 // For Sugilite compatibility
395 simProfileBlock["regionhandle"] = aSim.Value.regionHandle.ToString(); 395 simProfileBlock["regionhandle"] = simProfile.regionHandle.ToString();
396 simProfileBlock["sim_ip"] = aSim.Value.serverIP.ToString(); 396 simProfileBlock["sim_ip"] = simProfile.serverIP.ToString();
397 simProfileBlock["sim_port"] = aSim.Value.serverPort.ToString(); 397 simProfileBlock["sim_port"] = simProfile.serverPort.ToString();
398 simProfileBlock["sim_uri"] = aSim.Value.serverURI.ToString(); 398 simProfileBlock["sim_uri"] = simProfile.serverURI.ToString();
399 simProfileBlock["uuid"] = aSim.Value.UUID.ToStringHyphenated(); 399 simProfileBlock["uuid"] = simProfile.UUID.ToStringHyphenated();
400 400
401 simProfileList.Add(simProfileBlock); 401 simProfileList.Add(simProfileBlock);
402 } 402 }
@@ -561,6 +561,7 @@ namespace OpenGridServices.GridServer
561 return "ERROR! Servers must register with public addresses."; 561 return "ERROR! Servers must register with public addresses.";
562 } 562 }
563 563
564
564 try 565 try
565 { 566 {
566 OpenSim.Framework.Console.MainLog.Instance.Verbose("Updating / adding via " + _plugins.Count + " storage provider(s) registered."); 567 OpenSim.Framework.Console.MainLog.Instance.Verbose("Updating / adding via " + _plugins.Count + " storage provider(s) registered.");
@@ -568,9 +569,18 @@ namespace OpenGridServices.GridServer
568 { 569 {
569 try 570 try
570 { 571 {
571 kvp.Value.AddProfile(TheSim); 572 //Check reservations
572 OpenSim.Framework.Console.MainLog.Instance.Verbose("New sim added to grid (" + TheSim.regionName + ")"); 573 ReservationData reserveData = kvp.Value.GetReservationAtPoint(TheSim.regionLocX, TheSim.regionLocY);
573 logToDB(TheSim.UUID.ToStringHyphenated(), "RestSetSimMethod", "", 5, "Region successfully updated and connected to grid."); 574 if ((reserveData != null && reserveData.gridRecvKey == TheSim.regionRecvKey) || (reserveData == null))
575 {
576 kvp.Value.AddProfile(TheSim);
577 OpenSim.Framework.Console.MainLog.Instance.Verbose("New sim added to grid (" + TheSim.regionName + ")");
578 logToDB(TheSim.UUID.ToStringHyphenated(), "RestSetSimMethod", "", 5, "Region successfully updated and connected to grid.");
579 }
580 else
581 {
582 return "Unable to update region (RestSetSimMethod): Incorrect auth key.";
583 }
574 } 584 }
575 catch (Exception e) 585 catch (Exception e)
576 { 586 {
diff --git a/OpenGridServices/OpenGridServices.UserServer/Main.cs b/OpenGridServices/OpenGridServices.UserServer/Main.cs
index 56a3892..5c27d57 100644
--- a/OpenGridServices/OpenGridServices.UserServer/Main.cs
+++ b/OpenGridServices/OpenGridServices.UserServer/Main.cs
@@ -73,7 +73,7 @@ namespace OpenGridServices.UserServer
73 private OpenUser_Main() 73 private OpenUser_Main()
74 { 74 {
75 m_console = new LogBase("opengrid-userserver-console.log", "OpenUser", this , false); 75 m_console = new LogBase("opengrid-userserver-console.log", "OpenUser", this , false);
76 MainLog.Instance = m_console; 76 OpenSim.Framework.Console.MainLog.Instance = m_console;
77 } 77 }
78 78
79 private void Work() 79 private void Work()
@@ -93,16 +93,16 @@ namespace OpenGridServices.UserServer
93 this.ConfigDB(this.localXMLConfig); 93 this.ConfigDB(this.localXMLConfig);
94 this.localXMLConfig.Close(); 94 this.localXMLConfig.Close();
95 95
96 MainLog.Instance.Verbose("Main.cs:Startup() - Loading configuration"); 96 OpenSim.Framework.Console.MainLog.Instance.Verbose("Main.cs:Startup() - Loading configuration");
97 Cfg = this.LoadConfigDll(this.ConfigDll); 97 Cfg = this.LoadConfigDll(this.ConfigDll);
98 Cfg.InitConfig(); 98 Cfg.InitConfig();
99 99
100 MainLog.Instance.Verbose( "Main.cs:Startup() - Establishing data connection"); 100 OpenSim.Framework.Console.MainLog.Instance.Verbose("Main.cs:Startup() - Establishing data connection");
101 m_userManager = new UserManager(); 101 m_userManager = new UserManager();
102 m_userManager._config = Cfg; 102 m_userManager._config = Cfg;
103 m_userManager.AddPlugin(StorageDll); 103 m_userManager.AddPlugin(StorageDll);
104 104
105 MainLog.Instance.Verbose("Main.cs:Startup() - Starting HTTP process"); 105 OpenSim.Framework.Console.MainLog.Instance.Verbose("Main.cs:Startup() - Starting HTTP process");
106 BaseHttpServer httpServer = new BaseHttpServer(8002); 106 BaseHttpServer httpServer = new BaseHttpServer(8002);
107 107
108 httpServer.AddXmlRPCHandler("login_to_simulator", m_userManager.XmlRpcLoginMethod); 108 httpServer.AddXmlRPCHandler("login_to_simulator", m_userManager.XmlRpcLoginMethod);
diff --git a/OpenGridServices/OpenGridServices.UserServer/OpenGridServices.UserServer.csproj b/OpenGridServices/OpenGridServices.UserServer/OpenGridServices.UserServer.csproj
index ad0080a..32368c5 100644
--- a/OpenGridServices/OpenGridServices.UserServer/OpenGridServices.UserServer.csproj
+++ b/OpenGridServices/OpenGridServices.UserServer/OpenGridServices.UserServer.csproj
@@ -1,4 +1,4 @@
1<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 1<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
2 <PropertyGroup> 2 <PropertyGroup>
3 <ProjectType>Local</ProjectType> 3 <ProjectType>Local</ProjectType>
4 <ProductVersion>8.0.50727</ProductVersion> 4 <ProductVersion>8.0.50727</ProductVersion>
@@ -6,7 +6,8 @@
6 <ProjectGuid>{66591469-0000-0000-0000-000000000000}</ProjectGuid> 6 <ProjectGuid>{66591469-0000-0000-0000-000000000000}</ProjectGuid>
7 <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> 7 <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
8 <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> 8 <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
9 <ApplicationIcon></ApplicationIcon> 9 <ApplicationIcon>
10 </ApplicationIcon>
10 <AssemblyKeyContainerName> 11 <AssemblyKeyContainerName>
11 </AssemblyKeyContainerName> 12 </AssemblyKeyContainerName>
12 <AssemblyName>OpenGridServices.UserServer</AssemblyName> 13 <AssemblyName>OpenGridServices.UserServer</AssemblyName>
@@ -15,9 +16,11 @@
15 <DefaultTargetSchema>IE50</DefaultTargetSchema> 16 <DefaultTargetSchema>IE50</DefaultTargetSchema>
16 <DelaySign>false</DelaySign> 17 <DelaySign>false</DelaySign>
17 <OutputType>Exe</OutputType> 18 <OutputType>Exe</OutputType>
18 <AppDesignerFolder></AppDesignerFolder> 19 <AppDesignerFolder>
20 </AppDesignerFolder>
19 <RootNamespace>OpenGridServices.UserServer</RootNamespace> 21 <RootNamespace>OpenGridServices.UserServer</RootNamespace>
20 <StartupObject></StartupObject> 22 <StartupObject>
23 </StartupObject>
21 <FileUpgradeFlags> 24 <FileUpgradeFlags>
22 </FileUpgradeFlags> 25 </FileUpgradeFlags>
23 </PropertyGroup> 26 </PropertyGroup>
@@ -28,7 +31,8 @@
28 <ConfigurationOverrideFile> 31 <ConfigurationOverrideFile>
29 </ConfigurationOverrideFile> 32 </ConfigurationOverrideFile>
30 <DefineConstants>TRACE;DEBUG</DefineConstants> 33 <DefineConstants>TRACE;DEBUG</DefineConstants>
31 <DocumentationFile></DocumentationFile> 34 <DocumentationFile>
35 </DocumentationFile>
32 <DebugSymbols>True</DebugSymbols> 36 <DebugSymbols>True</DebugSymbols>
33 <FileAlignment>4096</FileAlignment> 37 <FileAlignment>4096</FileAlignment>
34 <Optimize>False</Optimize> 38 <Optimize>False</Optimize>
@@ -37,7 +41,8 @@
37 <RemoveIntegerChecks>False</RemoveIntegerChecks> 41 <RemoveIntegerChecks>False</RemoveIntegerChecks>
38 <TreatWarningsAsErrors>False</TreatWarningsAsErrors> 42 <TreatWarningsAsErrors>False</TreatWarningsAsErrors>
39 <WarningLevel>4</WarningLevel> 43 <WarningLevel>4</WarningLevel>
40 <NoWarn></NoWarn> 44 <NoWarn>
45 </NoWarn>
41 </PropertyGroup> 46 </PropertyGroup>
42 <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> 47 <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
43 <AllowUnsafeBlocks>False</AllowUnsafeBlocks> 48 <AllowUnsafeBlocks>False</AllowUnsafeBlocks>
@@ -46,7 +51,8 @@
46 <ConfigurationOverrideFile> 51 <ConfigurationOverrideFile>
47 </ConfigurationOverrideFile> 52 </ConfigurationOverrideFile>
48 <DefineConstants>TRACE</DefineConstants> 53 <DefineConstants>TRACE</DefineConstants>
49 <DocumentationFile></DocumentationFile> 54 <DocumentationFile>
55 </DocumentationFile>
50 <DebugSymbols>False</DebugSymbols> 56 <DebugSymbols>False</DebugSymbols>
51 <FileAlignment>4096</FileAlignment> 57 <FileAlignment>4096</FileAlignment>
52 <Optimize>True</Optimize> 58 <Optimize>True</Optimize>
@@ -55,50 +61,47 @@
55 <RemoveIntegerChecks>False</RemoveIntegerChecks> 61 <RemoveIntegerChecks>False</RemoveIntegerChecks>
56 <TreatWarningsAsErrors>False</TreatWarningsAsErrors> 62 <TreatWarningsAsErrors>False</TreatWarningsAsErrors>
57 <WarningLevel>4</WarningLevel> 63 <WarningLevel>4</WarningLevel>
58 <NoWarn></NoWarn> 64 <NoWarn>
65 </NoWarn>
59 </PropertyGroup> 66 </PropertyGroup>
60 <ItemGroup> 67 <ItemGroup>
61 <Reference Include="Db4objects.Db4o.dll" > 68 <Reference Include="Db4objects.Db4o.dll">
62 <HintPath>..\..\bin\Db4objects.Db4o.dll</HintPath> 69 <HintPath>..\..\bin\Db4objects.Db4o.dll</HintPath>
63 <Private>False</Private> 70 <Private>False</Private>
64 </Reference> 71 </Reference>
65 <Reference Include="libsecondlife.dll" > 72 <Reference Include="libsecondlife.dll">
66 <HintPath>..\..\bin\libsecondlife.dll</HintPath> 73 <HintPath>..\..\bin\libsecondlife.dll</HintPath>
67 <Private>False</Private> 74 <Private>False</Private>
68 </Reference> 75 </Reference>
69 <Reference Include="OpenGrid.Framework.UserManager" > 76 <Reference Include="OpenSim.Framework">
70 <HintPath>OpenGrid.Framework.UserManager.dll</HintPath>
71 <Private>False</Private>
72 </Reference>
73 <Reference Include="OpenSim.Framework" >
74 <HintPath>OpenSim.Framework.dll</HintPath> 77 <HintPath>OpenSim.Framework.dll</HintPath>
75 <Private>False</Private> 78 <Private>False</Private>
76 </Reference> 79 </Reference>
77 <Reference Include="OpenSim.Framework.Console" > 80 <Reference Include="OpenSim.Framework.Console">
78 <HintPath>OpenSim.Framework.Console.dll</HintPath> 81 <HintPath>OpenSim.Framework.Console.dll</HintPath>
79 <Private>False</Private> 82 <Private>False</Private>
80 </Reference> 83 </Reference>
81 <Reference Include="OpenSim.GenericConfig.Xml" > 84 <Reference Include="OpenSim.GenericConfig.Xml">
82 <HintPath>OpenSim.GenericConfig.Xml.dll</HintPath> 85 <HintPath>OpenSim.GenericConfig.Xml.dll</HintPath>
83 <Private>False</Private> 86 <Private>False</Private>
84 </Reference> 87 </Reference>
85 <Reference Include="OpenSim.Servers" > 88 <Reference Include="OpenSim.Servers">
86 <HintPath>OpenSim.Servers.dll</HintPath> 89 <HintPath>OpenSim.Servers.dll</HintPath>
87 <Private>False</Private> 90 <Private>False</Private>
88 </Reference> 91 </Reference>
89 <Reference Include="System" > 92 <Reference Include="System">
90 <HintPath>System.dll</HintPath> 93 <HintPath>System.dll</HintPath>
91 <Private>False</Private> 94 <Private>False</Private>
92 </Reference> 95 </Reference>
93 <Reference Include="System.Data" > 96 <Reference Include="System.Data">
94 <HintPath>System.Data.dll</HintPath> 97 <HintPath>System.Data.dll</HintPath>
95 <Private>False</Private> 98 <Private>False</Private>
96 </Reference> 99 </Reference>
97 <Reference Include="System.Xml" > 100 <Reference Include="System.Xml">
98 <HintPath>System.Xml.dll</HintPath> 101 <HintPath>System.Xml.dll</HintPath>
99 <Private>False</Private> 102 <Private>False</Private>
100 </Reference> 103 </Reference>
101 <Reference Include="XMLRPC" > 104 <Reference Include="XMLRPC">
102 <HintPath>XMLRPC.dll</HintPath> 105 <HintPath>XMLRPC.dll</HintPath>
103 <Private>False</Private> 106 <Private>False</Private>
104 </Reference> 107 </Reference>
@@ -108,7 +111,11 @@
108 <Name>OpenGrid.Framework.Data</Name> 111 <Name>OpenGrid.Framework.Data</Name>
109 <Project>{62CDF671-0000-0000-0000-000000000000}</Project> 112 <Project>{62CDF671-0000-0000-0000-000000000000}</Project>
110 <Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package> 113 <Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package>
111 <Private>False</Private> 114 <Private>False</Private>
115 </ProjectReference>
116 <ProjectReference Include="..\..\Common\OpenGrid.Framework.UserManager\OpenGrid.Framework.UserManagement.csproj">
117 <Project>{DA9A7391-0000-0000-0000-000000000000}</Project>
118 <Name>OpenGrid.Framework.UserManagement</Name>
112 </ProjectReference> 119 </ProjectReference>
113 </ItemGroup> 120 </ItemGroup>
114 <ItemGroup> 121 <ItemGroup>
@@ -129,4 +136,4 @@
129 <PostBuildEvent> 136 <PostBuildEvent>
130 </PostBuildEvent> 137 </PostBuildEvent>
131 </PropertyGroup> 138 </PropertyGroup>
132</Project> 139</Project> \ No newline at end of file