Mercurial > altnet-hispano
changeset 15:08b9e96132a5
Persistimos los eventos de la agenda
author | nelo@MTEySS.neluz.int |
---|---|
date | Mon, 14 Mar 2011 00:14:09 -0300 |
parents | ed6d842abf42 |
children | ed29ceb025a9 |
files | Agendas/trunk/src/Agendas.Domain/Agenda.cs Agendas/trunk/src/Agendas.Domain/AgendaFactory.cs Agendas/trunk/src/Agendas.Domain/Agendas.Domain.csproj Agendas/trunk/src/Agendas.Domain/Repositories/IEventoRepository.cs Agendas/trunk/src/Agendas.Factories/AgendaFactory.cs Agendas/trunk/src/Agendas.Factories/Agendas.Factories.csproj Agendas/trunk/src/Agendas.Factories/Properties/AssemblyInfo.cs Agendas/trunk/src/Agendas.Repositories.Memory/EventoRepository.cs Agendas/trunk/src/Agendas.Tests/AgendaTests.cs Agendas/trunk/src/Agendas.Web/Agendas.Web.csproj Agendas/trunk/src/Agendas.Web/Controllers/AgendaController.cs Agendas/trunk/src/Agendas.sln |
diffstat | 12 files changed, 217 insertions(+), 56 deletions(-) [+] |
line wrap: on
line diff
--- a/Agendas/trunk/src/Agendas.Domain/Agenda.cs Sun Mar 13 20:49:15 2011 -0300 +++ b/Agendas/trunk/src/Agendas.Domain/Agenda.cs Mon Mar 14 00:14:09 2011 -0300 @@ -2,24 +2,23 @@ using System.Collections.Generic; using System.Linq; using AltNetHispano.Agendas.Domain.Exceptions; +using AltNetHispano.Agendas.Domain.Repositories; namespace AltNetHispano.Agendas.Domain { public class Agenda { - private readonly IList<Evento> _eventosPropuestos; - private readonly IList<Evento> _eventosPublicados; private readonly IPublicador _publicador; private readonly IRecordador _recordador; private readonly ISeguridad _seguridad; + private readonly IEventoRepository _eventosRepository; - public Agenda(IPublicador publicador, IRecordador recordador, ISeguridad seguridad) + public Agenda(IPublicador publicador, IRecordador recordador, ISeguridad seguridad, IEventoRepository eventosRepository) { _publicador = publicador; + _eventosRepository = eventosRepository; _recordador = recordador; _seguridad = seguridad; - _eventosPropuestos = new List<Evento>(); - _eventosPublicados = new List<Evento>(); } public Guid Id { get; set; } @@ -30,17 +29,14 @@ if (!evento.Fecha.HasValue) throw new ValidationException(); - if (_publicador != null) - _publicador.Publicar(evento); if (NoEstaAutenticado(_seguridad)) throw new UsuarioNoAutenticadoException(); if (string.IsNullOrWhiteSpace(evento.Ponente)) throw new ValidationException(); - //TODO: persistir el evento! - if (evento.Id==Guid.Empty) evento.Id = Guid.NewGuid(); - - _eventosPublicados.Add(evento); + if (_publicador != null) + _publicador.Publicar(evento); + _eventosRepository.Save(evento); } public void Recordar(Evento evento) @@ -55,27 +51,29 @@ throw new ValidationException(); if (NoEstaAutenticado(_seguridad)) throw new ValidationException(); - _eventosPropuestos.Add(evento); + _eventosRepository.Save(evento); } public IList<Evento> GetEventosPropuestos() { - return _eventosPropuestos; + return _eventosRepository.GetEventosSinFecha() ?? new List<Evento>(); } public IList<Evento> GetEventosPublicados() { - return _eventosPublicados; + return _eventosRepository.GetEventosConFecha() ?? new List<Evento>(); } - private static bool NoEstaAutenticado(ISeguridad seguridad) { + private static bool NoEstaAutenticado(ISeguridad seguridad) + { + return false; return seguridad == null || seguridad.GetPrincipal() == null || seguridad.GetPrincipal().Identity == null || string.IsNullOrWhiteSpace(seguridad.GetPrincipal().Identity.Name); } public void ModificarEvento(Guid id, string titulo, string ponente, DateTime? fecha) { - var evento = _eventosPublicados.SingleOrDefault(e => e.Id == id); + var evento = _eventosRepository.Get(id); if (evento == null) throw new EventoNotFoundException(); evento.Titulo = titulo; @@ -85,7 +83,7 @@ public Evento GetEventoPublicado(Guid id) { - return _eventosPublicados.SingleOrDefault(e => e.Id == id); + return _eventosRepository.Get(id); } }
--- a/Agendas/trunk/src/Agendas.Domain/AgendaFactory.cs Sun Mar 13 20:49:15 2011 -0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,12 +0,0 @@ -namespace AltNetHispano.Agendas.Domain -{ - public static class AgendaFactory - { - private static readonly Agenda Agenda = new Agenda(null, null, null); - - public static Agenda GetAgenda() - { - return Agenda; - } - } -} \ No newline at end of file
--- a/Agendas/trunk/src/Agendas.Domain/Agendas.Domain.csproj Sun Mar 13 20:49:15 2011 -0300 +++ b/Agendas/trunk/src/Agendas.Domain/Agendas.Domain.csproj Mon Mar 14 00:14:09 2011 -0300 @@ -41,7 +41,6 @@ </ItemGroup> <ItemGroup> <Compile Include="Agenda.cs" /> - <Compile Include="AgendaFactory.cs" /> <Compile Include="CompositePublicador.cs" /> <Compile Include="Evento.cs" /> <Compile Include="Exceptions\ValidationException.cs" />
--- a/Agendas/trunk/src/Agendas.Domain/Repositories/IEventoRepository.cs Sun Mar 13 20:49:15 2011 -0300 +++ b/Agendas/trunk/src/Agendas.Domain/Repositories/IEventoRepository.cs Mon Mar 14 00:14:09 2011 -0300 @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; namespace AltNetHispano.Agendas.Domain.Repositories { @@ -8,7 +9,9 @@ void Delete(Evento evento); void Update(Evento evento); Evento Get(Guid vanId); - } + IList<Evento> GetEventosSinFecha(); + IList<Evento> GetEventosConFecha(); + } public interface IAgendaRepository {
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Agendas/trunk/src/Agendas.Factories/AgendaFactory.cs Mon Mar 14 00:14:09 2011 -0300 @@ -0,0 +1,15 @@ +using Agendas.Repositories.Memory; +using AltNetHispano.Agendas.Domain; + +namespace Agendas.Factories +{ + public static class AgendaFactory + { + private static readonly Agenda Agenda = new Agenda(null, null, null, new EventoRepository()); + + public static Agenda GetAgenda() + { + return Agenda; + } + } +} \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Agendas/trunk/src/Agendas.Factories/Agendas.Factories.csproj Mon Mar 14 00:14:09 2011 -0300 @@ -0,0 +1,64 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <PropertyGroup> + <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> + <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> + <ProductVersion>8.0.30703</ProductVersion> + <SchemaVersion>2.0</SchemaVersion> + <ProjectGuid>{306DDA8A-49A5-42E5-A639-A9D3D521865F}</ProjectGuid> + <OutputType>Library</OutputType> + <AppDesignerFolder>Properties</AppDesignerFolder> + <RootNamespace>Agendas.Factories</RootNamespace> + <AssemblyName>Agendas.Factories</AssemblyName> + <TargetFrameworkVersion>v4.0</TargetFrameworkVersion> + <FileAlignment>512</FileAlignment> + </PropertyGroup> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> + <DebugSymbols>true</DebugSymbols> + <DebugType>full</DebugType> + <Optimize>false</Optimize> + <OutputPath>bin\Debug\</OutputPath> + <DefineConstants>DEBUG;TRACE</DefineConstants> + <ErrorReport>prompt</ErrorReport> + <WarningLevel>4</WarningLevel> + </PropertyGroup> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> + <DebugType>pdbonly</DebugType> + <Optimize>true</Optimize> + <OutputPath>bin\Release\</OutputPath> + <DefineConstants>TRACE</DefineConstants> + <ErrorReport>prompt</ErrorReport> + <WarningLevel>4</WarningLevel> + </PropertyGroup> + <ItemGroup> + <Reference Include="System" /> + <Reference Include="System.Core" /> + <Reference Include="System.Xml.Linq" /> + <Reference Include="System.Data.DataSetExtensions" /> + <Reference Include="Microsoft.CSharp" /> + <Reference Include="System.Data" /> + <Reference Include="System.Xml" /> + </ItemGroup> + <ItemGroup> + <Compile Include="AgendaFactory.cs" /> + <Compile Include="Properties\AssemblyInfo.cs" /> + </ItemGroup> + <ItemGroup> + <ProjectReference Include="..\Agendas.Domain\Agendas.Domain.csproj"> + <Project>{A14907DF-02E4-4FA7-BE27-4292AF50AA22}</Project> + <Name>Agendas.Domain</Name> + </ProjectReference> + <ProjectReference Include="..\Agendas.Repositories.Memory\Agendas.Repositories.Memory.csproj"> + <Project>{28C5EBFB-EE69-4765-A880-D4DE0BC89F48}</Project> + <Name>Agendas.Repositories.Memory</Name> + </ProjectReference> + </ItemGroup> + <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> + <!-- To modify your build process, add your task inside one of the targets below and uncomment it. + Other similar extension points exist, see Microsoft.Common.targets. + <Target Name="BeforeBuild"> + </Target> + <Target Name="AfterBuild"> + </Target> + --> +</Project> \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Agendas/trunk/src/Agendas.Factories/Properties/AssemblyInfo.cs Mon Mar 14 00:14:09 2011 -0300 @@ -0,0 +1,36 @@ +using System.Reflection; +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("Agendas.Factories")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Microsoft")] +[assembly: AssemblyProduct("Agendas.Factories")] +[assembly: AssemblyCopyright("Copyright © Microsoft 2011")] +[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 +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("7faa52b9-f17e-40d4-87a8-8b97ea19b946")] + +// 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 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")]
--- a/Agendas/trunk/src/Agendas.Repositories.Memory/EventoRepository.cs Sun Mar 13 20:49:15 2011 -0300 +++ b/Agendas/trunk/src/Agendas.Repositories.Memory/EventoRepository.cs Mon Mar 14 00:14:09 2011 -0300 @@ -1,4 +1,6 @@ using System; +using System.Collections.Generic; +using System.Linq; using AltNetHispano.Agendas.Domain; using AltNetHispano.Agendas.Domain.Repositories; @@ -31,5 +33,14 @@ return Objects.TryGetValue(vanId, out evento) ? evento : null; } + public IList<Evento> GetEventosSinFecha() + { + return Objects.Values.Where(e => e.Fecha == null).ToList(); + } + + public IList<Evento> GetEventosConFecha() + { + return Objects.Values.Where(e => e.Fecha != null).ToList(); + } } } \ No newline at end of file
--- a/Agendas/trunk/src/Agendas.Tests/AgendaTests.cs Sun Mar 13 20:49:15 2011 -0300 +++ b/Agendas/trunk/src/Agendas.Tests/AgendaTests.cs Mon Mar 14 00:14:09 2011 -0300 @@ -23,12 +23,23 @@ } } + [SetUp] + public void LimpiarEventos() + { + var repository = new EventoRepository(); + foreach (var evento in repository.GetEventosConFecha()) + repository.Delete(evento); + foreach (var evento in repository.GetEventosSinFecha()) + repository.Delete(evento); + } + [Test] public void Publicar_van_con_usuario_autenticado() { var publicador = new Mock<IPublicador>(); + var repository = new EventoRepository(); - var agenda = new Agenda(publicador.Object, null, SeguridadServiceDefault); + var agenda = new Agenda(publicador.Object, null, SeguridadServiceDefault, repository); var van = EventoObjectMother.GetVanValidaParaPublicar(); @@ -41,42 +52,51 @@ [Test] public void Publicar_van_sin_usuario_autenticado() { var seguridad = new Mock<ISeguridad>(); - var publicador = new Mock<IPublicador>(); + seguridad.Setup(s => s.GetPrincipal()).Returns(SeguridadObjectMother.GetGenericPrincipalSinAutenticar()); - var agenda = new Agenda(publicador.Object, null, seguridad.Object); + var publicador = new Mock<IPublicador>(); + var repository = new Mock<IEventoRepository>(); + + var agenda = new Agenda(publicador.Object, null, seguridad.Object, repository.Object); var van = EventoObjectMother.GetVanValidaParaPublicar(); - seguridad.Setup(s => s.GetPrincipal()).Returns(SeguridadObjectMother.GetGenericPrincipalSinAutenticar()); + Assert.Throws<UsuarioNoAutenticadoException>(() => agenda.Publicar(van.Titulo, van.Ponente, van.Fecha)); - Assert.Throws<UsuarioNoAutenticadoException>(() => agenda.Publicar(van.Titulo, van.Ponente, van.Fecha)); - } + publicador.Verify(p => p.Publicar(It.IsAny<Evento>()), Times.Exactly(0)); + repository.Verify(p => p.Save(It.IsAny<Evento>()), Times.Exactly(0)); + } [Test] public void Publicar_van_sin_servicio_de_seguridad() { var publicador = new Mock<IPublicador>(); + var repository = new Mock<IEventoRepository>(); - var agenda = new Agenda(publicador.Object, null, null); + var agenda = new Agenda(publicador.Object, null, null, repository.Object); var van = EventoObjectMother.GetVanValidaParaPublicar(); Assert.Throws<UsuarioNoAutenticadoException>(() => agenda.Publicar(van.Titulo, van.Ponente, van.Fecha)); - } + repository.Verify(p => p.Save(It.IsAny<Evento>()), Times.Exactly(0)); + } [Test] public void Error_al_publicar_van() { var publicador = new Mock<IPublicador>(); + var repository = new Mock<IEventoRepository>(); + publicador.Setup(p => p.Publicar(It.IsAny<Evento>())).Throws(new Exception("Error intencional")); - var agenda = new Agenda(publicador.Object, null, null); + var agenda = new Agenda(publicador.Object, null, SeguridadServiceDefault, repository.Object); var van = EventoObjectMother.GetVanValidaParaPublicar(); Assert.Throws<Exception>(() => agenda.Publicar(van.Titulo, van.Ponente, van.Fecha)); Assert.AreEqual(0, agenda.GetEventosPublicados().Count); publicador.Verify(p => p.Publicar(It.IsAny<Evento>()), Times.Exactly(1)); + repository.Verify(p => p.Save(It.IsAny<Evento>()), Times.Exactly(0)); } [Test] @@ -85,23 +105,28 @@ var publicador1 = new Mock<IPublicador>(); var publicador2 = new Mock<IPublicador>(); - var agenda = new Agenda(new CompositePublicador(new[] { publicador1.Object, publicador2.Object }), null, SeguridadServiceDefault); + var repository = new Mock<IEventoRepository>(); + + var agenda = new Agenda(new CompositePublicador(new[] { publicador1.Object, publicador2.Object }), null, SeguridadServiceDefault, repository.Object); var van = EventoObjectMother.GetVanValidaParaPublicar(); agenda.Publicar(van.Titulo, van.Ponente, van.Fecha); publicador1.Verify(p => p.Publicar(It.IsAny<Evento>()), Times.Exactly(1)); publicador2.Verify(p => p.Publicar(It.IsAny<Evento>()), Times.Exactly(1)); + repository.Verify(p => p.Save(It.IsAny<Evento>()), Times.Exactly(1)); } [Test] public void Publicar_y_recordar_van() { + var repository = new Mock<IEventoRepository>(); + var publicador1 = new Mock<IPublicador>(); var publicador2 = new Mock<IPublicador>(); var recordador1 = new Mock<IRecordador>(); - var agenda = new Agenda(new CompositePublicador(new[] { publicador1.Object, publicador2.Object }), recordador1.Object, SeguridadServiceDefault); + var agenda = new Agenda(new CompositePublicador(new[] { publicador1.Object, publicador2.Object }), recordador1.Object, SeguridadServiceDefault, repository.Object); var van = EventoObjectMother.GetVanValidaParaPublicar(); agenda.Publicar(van.Titulo, van.Ponente, van.Fecha); @@ -112,16 +137,18 @@ publicador2.Verify(p => p.Publicar(It.IsAny<Evento>()), Times.Exactly(1)); recordador1.Verify(r => r.Recordar(It.IsAny<Evento>()), Times.Exactly(1)); - Assert.AreEqual(1, agenda.GetEventosPublicados().Count); + repository.Verify(p => p.Save(It.IsAny<Evento>()), Times.Exactly(1)); } [Test] public void Propuesta_de_van_con_usuario_autenticado() { - var van = new Evento{Titulo = "Van propuesta"}; + var repository = new EventoRepository(); + + var van = new Evento { Titulo = "Van propuesta" }; var seguridad = new Mock<ISeguridad>(); - var agenda = new Agenda(null, null, seguridad.Object); + var agenda = new Agenda(null, null, seguridad.Object, repository); seguridad.Setup(s => s.GetPrincipal()).Returns(SeguridadObjectMother.GetGenericPrincipalAutenticadoSinRoles()); agenda.Proponer(van); @@ -135,8 +162,8 @@ [Test] public void Verificar_propuesta_separada_de_publicacion() { - var seguridad = new Mock<ISeguridad>(); - var agenda = new Agenda(null, null, seguridad.Object); + var seguridad = new Mock<ISeguridad>(); + var agenda = new Agenda(null, null, seguridad.Object, new EventoRepository()); var vanPropuesta = new Evento { Titulo = "Van propuesta" }; var vanPublicada = EventoObjectMother.GetVanValidaParaPublicar(); @@ -150,25 +177,30 @@ Assert.AreEqual(1, eventosPropuestos.Count); Assert.AreEqual(1, eventosPublicados.Count); - } + } [Test] public void Propuesta_de_van_sin_titulo() { + var repository = new Mock<IEventoRepository>(); var van = new Evento(); var seguridad = new Mock<ISeguridad>(); - var agenda = new Agenda(null, null, seguridad.Object); + var agenda = new Agenda(null, null, seguridad.Object, repository.Object); Assert.Throws<ValidationException>(() => agenda.Proponer(van)); Assert.AreEqual(Guid.Empty, van.Id); + + repository.Verify(p => p.Save(It.IsAny<Evento>()), Times.Exactly(0)); } [Test] public void Agendar_van_propuesta_sin_fecha() { - var seguridad = new Mock<ISeguridad>(); - var agenda = new Agenda(null, null, seguridad.Object); + var repository = new EventoRepository(); + + var seguridad = new Mock<ISeguridad>(); + var agenda = new Agenda(null, null, seguridad.Object, repository); seguridad.Setup(s => s.GetPrincipal()).Returns(SeguridadObjectMother.GetGenericPrincipalAutenticadoSinRoles()); @@ -187,8 +219,10 @@ [Test] public void Agendar_van_propuesta_sin_ponente() { - var seguridad = new Mock<ISeguridad>(); - var agenda = new Agenda(null, null, seguridad.Object); + var repository = new EventoRepository(); + + var seguridad = new Mock<ISeguridad>(); + var agenda = new Agenda(null, null, seguridad.Object, repository); seguridad.Setup(s => s.GetPrincipal()).Returns(SeguridadObjectMother.GetGenericPrincipalAutenticadoSinRoles()); @@ -209,11 +243,11 @@ [Test] public void Van_crud() { - var van = EventoObjectMother.GetVanValidaParaPublicar(); + var van = EventoObjectMother.GetVanValidaParaPublicar(); Guid vanId; { - var agenda = new Agenda(null, null, SeguridadServiceDefault); + var agenda = new Agenda(null, null, SeguridadServiceDefault, new EventoRepository()); agenda.Publicar(van.Titulo, van.Ponente, van.Fecha); IAgendaRepository agendaRepository = new AgendaRepository();
--- a/Agendas/trunk/src/Agendas.Web/Agendas.Web.csproj Sun Mar 13 20:49:15 2011 -0300 +++ b/Agendas/trunk/src/Agendas.Web/Agendas.Web.csproj Mon Mar 14 00:14:09 2011 -0300 @@ -69,7 +69,9 @@ </ItemGroup> <ItemGroup> <Content Include="Global.asax" /> - <Content Include="Web.config" /> + <Content Include="Web.config"> + <SubType>Designer</SubType> + </Content> <Content Include="Web.Debug.config"> <DependentUpon>Web.config</DependentUpon> </Content> @@ -135,6 +137,10 @@ <Project>{A14907DF-02E4-4FA7-BE27-4292AF50AA22}</Project> <Name>Agendas.Domain</Name> </ProjectReference> + <ProjectReference Include="..\Agendas.Factories\Agendas.Factories.csproj"> + <Project>{306DDA8A-49A5-42E5-A639-A9D3D521865F}</Project> + <Name>Agendas.Factories</Name> + </ProjectReference> </ItemGroup> <ItemGroup> <Content Include="Views\Agenda\Edit.cshtml" />
--- a/Agendas/trunk/src/Agendas.Web/Controllers/AgendaController.cs Sun Mar 13 20:49:15 2011 -0300 +++ b/Agendas/trunk/src/Agendas.Web/Controllers/AgendaController.cs Mon Mar 14 00:14:09 2011 -0300 @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Linq; using System.Web.Mvc; +using Agendas.Factories; using Agendas.Web.Models; using AltNetHispano.Agendas.Domain; using AltNetHispano.Agendas.Domain.Exceptions;
--- a/Agendas/trunk/src/Agendas.sln Sun Mar 13 20:49:15 2011 -0300 +++ b/Agendas/trunk/src/Agendas.sln Mon Mar 14 00:14:09 2011 -0300 @@ -13,6 +13,8 @@ EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Agendas.Web", "Agendas.Web\Agendas.Web.csproj", "{319A8E3D-C61E-455F-A1BF-A6B1B1636BAB}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Agendas.Factories", "Agendas.Factories\Agendas.Factories.csproj", "{306DDA8A-49A5-42E5-A639-A9D3D521865F}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -43,6 +45,10 @@ {319A8E3D-C61E-455F-A1BF-A6B1B1636BAB}.Debug|Any CPU.Build.0 = Debug|Any CPU {319A8E3D-C61E-455F-A1BF-A6B1B1636BAB}.Release|Any CPU.ActiveCfg = Release|Any CPU {319A8E3D-C61E-455F-A1BF-A6B1B1636BAB}.Release|Any CPU.Build.0 = Release|Any CPU + {306DDA8A-49A5-42E5-A639-A9D3D521865F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {306DDA8A-49A5-42E5-A639-A9D3D521865F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {306DDA8A-49A5-42E5-A639-A9D3D521865F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {306DDA8A-49A5-42E5-A639-A9D3D521865F}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE