From 83b9a2347e7c0041f52633e7a3bda3c93daf57fb Mon Sep 17 00:00:00 2001 From: geffzhang Date: Fri, 5 Oct 2018 14:39:39 +0800 Subject: [PATCH] refactor di and modify async/await MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit feat : refactor di and modify async/await --- BotSharp.Core/AgentStorageInMemory.cs | 11 +-- BotSharp.Core/AgentStorageInRedis.cs | 11 +-- BotSharp.Core/BotSharp.Core.csproj | 1 + BotSharp.Core/Engines/BotEngineBase.cs | 10 +-- BotSharp.Core/Engines/BotSharp/BotSharpNLU.cs | 4 +- BotSharp.Core/Engines/BotTrainer.cs | 4 +- BotSharp.Core/IAgentStorageFactory.cs | 11 +++ BotSharp.Core/Modules/IModule.cs | 32 ++++++++ BotSharp.Core/Modules/ModuleOptions.cs | 17 ++++ BotSharp.Core/Modules/ModulesOptions.cs | 17 ++++ BotSharp.Core/Modules/ModulesStartup.cs | 79 +++++++++++++++++++ BotSharp.Core/NLUSetting.cs | 17 ++++ BotSharp.Core/PlatformBuilderBase.cs | 59 +++++++------- .../IAgentImporter.cs | 9 ++- .../IAgentStorage.cs | 11 +-- BotSharp.Platform.Abstraction/IBotEngine.cs | 5 +- .../IPlatformBuilder.cs | 11 +-- BotSharp.WebHost/BotSharp.WebHost.csproj | 2 + BotSharp.WebHost/Settings/DialogflowAi.json | 2 +- BotSharp.WebHost/Settings/RasaAi.json | 2 +- BotSharp.WebHost/Settings/app.json | 7 +- BotSharp.WebHost/Startup.cs | 9 ++- BotSharp.sln | 14 ++++ 23 files changed, 269 insertions(+), 76 deletions(-) create mode 100644 BotSharp.Core/IAgentStorageFactory.cs create mode 100644 BotSharp.Core/Modules/IModule.cs create mode 100644 BotSharp.Core/Modules/ModuleOptions.cs create mode 100644 BotSharp.Core/Modules/ModulesOptions.cs create mode 100644 BotSharp.Core/Modules/ModulesStartup.cs create mode 100644 BotSharp.Core/NLUSetting.cs diff --git a/BotSharp.Core/AgentStorageInMemory.cs b/BotSharp.Core/AgentStorageInMemory.cs index 6c5d1368d..854e37826 100644 --- a/BotSharp.Core/AgentStorageInMemory.cs +++ b/BotSharp.Core/AgentStorageInMemory.cs @@ -4,6 +4,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; +using System.Threading.Tasks; namespace BotSharp.Core { @@ -20,7 +21,7 @@ public AgentStorageInMemory() if (agents == null) agents = new Dictionary(); } - public TAgent FetchById(string agentId) + public async Task FetchById(string agentId) { if (agents.ContainsKey(agentId)) { @@ -32,14 +33,14 @@ public TAgent FetchById(string agentId) } } - public TAgent FetchByName(string agentName) + public async Task FetchByName(string agentName) { var data = agents.FirstOrDefault(x => x.Value.Name == agentName); return data.Value; } - public bool Persist(TAgent agent) + public async Task Persist(TAgent agent) { if (String.IsNullOrEmpty(agent.Id)) { @@ -54,7 +55,7 @@ public bool Persist(TAgent agent) return true; } - public int PurgeAllAgents() + public async Task PurgeAllAgents() { int count = agents.Count; @@ -63,7 +64,7 @@ public int PurgeAllAgents() return count; } - public List Query() + public async Task> Query() { return agents.Select(x => x.Value).ToList(); } diff --git a/BotSharp.Core/AgentStorageInRedis.cs b/BotSharp.Core/AgentStorageInRedis.cs index 9b29a440f..e76b64c29 100644 --- a/BotSharp.Core/AgentStorageInRedis.cs +++ b/BotSharp.Core/AgentStorageInRedis.cs @@ -7,6 +7,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; +using System.Threading.Tasks; namespace BotSharp.Core { @@ -30,7 +31,7 @@ public AgentStorageInRedis() } } - public TAgent FetchById(string agentId) + public async Task FetchById(string agentId) { var key = agentId; if (csredis.Exists(key)) @@ -43,7 +44,7 @@ public TAgent FetchById(string agentId) } } - public TAgent FetchByName(string agentName) + public async Task FetchByName(string agentName) { var agents = new List(); @@ -62,7 +63,7 @@ public TAgent FetchByName(string agentName) return default(TAgent); } - public bool Persist(TAgent agent) + public async Task Persist(TAgent agent) { if (String.IsNullOrEmpty(agent.Id)) { @@ -80,7 +81,7 @@ public bool Persist(TAgent agent) return true; } - public int PurgeAllAgents() + public async Task PurgeAllAgents() { var keys = csredis.Keys($"{prefix}*"); @@ -89,7 +90,7 @@ public int PurgeAllAgents() return keys.Count(); } - public List Query() + public async Task> Query() { var agents = new List(); diff --git a/BotSharp.Core/BotSharp.Core.csproj b/BotSharp.Core/BotSharp.Core.csproj index f4f20c732..425bee9b9 100644 --- a/BotSharp.Core/BotSharp.Core.csproj +++ b/BotSharp.Core/BotSharp.Core.csproj @@ -79,6 +79,7 @@ If you feel that this project is helpful to you, please Star on the project, we + diff --git a/BotSharp.Core/Engines/BotEngineBase.cs b/BotSharp.Core/Engines/BotEngineBase.cs index ee0a59e1e..0f8d8d52b 100644 --- a/BotSharp.Core/Engines/BotEngineBase.cs +++ b/BotSharp.Core/Engines/BotEngineBase.cs @@ -24,19 +24,19 @@ namespace BotSharp.Core.Engines /// public abstract class BotEngineBase { - protected Database dc; + protected Database Dc; - protected AgentBase agent { get; set; } + protected AgentBase Agent { get; set; } public BotEngineBase() { - dc = new DefaultDataContextLoader().GetDefaultDc(); + Dc = new DefaultDataContextLoader().GetDefaultDc(); } - public AiResponse TextRequest(AiRequest request) + public async Task TextRequest(AiRequest request) { var preditor = new BotPredictor(); - var doc = preditor.Predict(agent, new AiRequest + var doc = preditor.Predict(Agent, new AiRequest { AgentDir = request.AgentDir, Model = request.Model, diff --git a/BotSharp.Core/Engines/BotSharp/BotSharpNLU.cs b/BotSharp.Core/Engines/BotSharp/BotSharpNLU.cs index 9ce3142ed..114d0b025 100644 --- a/BotSharp.Core/Engines/BotSharp/BotSharpNLU.cs +++ b/BotSharp.Core/Engines/BotSharp/BotSharpNLU.cs @@ -11,8 +11,8 @@ public class BotSharpNLU : BotEngineBase, IBotEngine { public override async Task Train(BotTrainOptions options) { - var trainer = new BotTrainer(agent.Id, dc); - await trainer.Train(agent, options); + var trainer = new BotTrainer(Agent.Id, Dc); + await trainer.Train(Agent, options); } } } diff --git a/BotSharp.Core/Engines/BotTrainer.cs b/BotSharp.Core/Engines/BotTrainer.cs index 91661cdea..e93d8b4d8 100644 --- a/BotSharp.Core/Engines/BotTrainer.cs +++ b/BotSharp.Core/Engines/BotTrainer.cs @@ -19,9 +19,9 @@ namespace BotSharp.Core.Engines { public class BotTrainer { - private Database dc; + private readonly Database dc; - private string agentId; + private readonly string agentId; public BotTrainer() { diff --git a/BotSharp.Core/IAgentStorageFactory.cs b/BotSharp.Core/IAgentStorageFactory.cs new file mode 100644 index 000000000..2f8b520b8 --- /dev/null +++ b/BotSharp.Core/IAgentStorageFactory.cs @@ -0,0 +1,11 @@ +using BotSharp.Platform.Abstraction; +using BotSharp.Platform.Models; +using System.Threading.Tasks; + +namespace BotSharp.Core +{ + public interface IAgentStorageFactory + { + Task> Get() where TAgent : AgentBase; + } +} diff --git a/BotSharp.Core/Modules/IModule.cs b/BotSharp.Core/Modules/IModule.cs new file mode 100644 index 000000000..550b129b4 --- /dev/null +++ b/BotSharp.Core/Modules/IModule.cs @@ -0,0 +1,32 @@ +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using System; + +namespace BotSharp.Core.Modules +{ + /// + /// Represents a configurable module containing multiple servies. + /// + public interface IModule + { + /// + /// Configurates the module services. + /// + /// + /// Instance of . + /// + /// + /// Instance of . + /// + void ConfigureServices(IServiceCollection services, IConfiguration configuration); + + /// + /// Configures module services. + /// + /// + /// Instance of . + /// + void Configure(IApplicationBuilder app); + } +} diff --git a/BotSharp.Core/Modules/ModuleOptions.cs b/BotSharp.Core/Modules/ModuleOptions.cs new file mode 100644 index 000000000..b1d920614 --- /dev/null +++ b/BotSharp.Core/Modules/ModuleOptions.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace BotSharp.Core.Modules +{ + /// + /// Module configuration . + /// + public class ModuleOptions + { + /// + /// Module type. + /// + public string Type { get; set; } + } +} diff --git a/BotSharp.Core/Modules/ModulesOptions.cs b/BotSharp.Core/Modules/ModulesOptions.cs new file mode 100644 index 000000000..4f2d9ee5b --- /dev/null +++ b/BotSharp.Core/Modules/ModulesOptions.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace BotSharp.Core.Modules +{ + /// + /// Module Host configuration. + /// + public class ModulesOptions + { + /// + /// List of module configurations. + /// + public List Modules { get; set; } + } +} diff --git a/BotSharp.Core/Modules/ModulesStartup.cs b/BotSharp.Core/Modules/ModulesStartup.cs new file mode 100644 index 000000000..c610be072 --- /dev/null +++ b/BotSharp.Core/Modules/ModulesStartup.cs @@ -0,0 +1,79 @@ +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace BotSharp.Core.Modules +{ + /// + /// Startup class for configurable modules + /// + public class ModulesStartup + { + private readonly IEnumerable _modules; + private readonly IConfiguration _configuration; + + /// + /// Create an instance of + /// + /// + /// Application configuration containing modules configuration + /// + public ModulesStartup(IConfiguration configuration) + { + this._configuration = configuration ?? + throw new ArgumentNullException(nameof(configuration)); + ModulesOptions options = configuration.Get(); + + this._modules = options.Modules + .Select(s => + { + Type type = Type.GetType(s.Type); + + if (type == null) + { + throw new TypeLoadException( + $"Cannot load type \"{s.Type}\""); + } + + IModule module = (IModule)Activator.CreateInstance(type); + return module; + } + ); + } + + /// + /// Configurates the services. + /// + /// + /// Instance of . + /// + /// + /// Instance of . + /// + public void ConfigureServices(IServiceCollection services) + { + foreach (IModule module in this._modules) + { + module.ConfigureServices(services, this._configuration); + } + } + + /// + /// Configures module services. + /// + /// + /// Instance of . + /// + public void Configure(IApplicationBuilder app) + { + foreach (IModule module in this._modules) + { + module.Configure(app); + } + } + } +} diff --git a/BotSharp.Core/NLUSetting.cs b/BotSharp.Core/NLUSetting.cs new file mode 100644 index 000000000..594989e68 --- /dev/null +++ b/BotSharp.Core/NLUSetting.cs @@ -0,0 +1,17 @@ +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Options; +using System; +using System.Collections.Generic; +using System.Text; + +namespace BotSharp.Core +{ + public class NLUSetting + { + + public string BotEngine { get; set; } + + public string AgentStorage { get; set; } + } + +} diff --git a/BotSharp.Core/PlatformBuilderBase.cs b/BotSharp.Core/PlatformBuilderBase.cs index 802d8820a..12f1e60dc 100644 --- a/BotSharp.Core/PlatformBuilderBase.cs +++ b/BotSharp.Core/PlatformBuilderBase.cs @@ -18,34 +18,39 @@ public abstract class PlatformBuilderBase where TAgent : AgentBase { public IAgentStorage Storage { get; set; } - public IConfiguration PlatformConfig { get; set; } + private readonly IAgentStorageFactory agentStorageFactory; + public PlatformBuilderBase(IAgentStorageFactory agentStorageFactory) + { + this.agentStorageFactory = agentStorageFactory; + } - public List GetAllAgents() + public async Task> GetAllAgents() { - GetStorage(); + await GetStorage(); - return Storage.Query(); + return await Storage.Query(); } - public TAgent LoadAgentFromFile(string dataDir) where TImporter : IAgentImporter, new() + public async Task LoadAgentFromFile(string dataDir) where TImporter : IAgentImporter, new() { var meta = LoadMeta(dataDir); - var importer = new TImporter(); - - importer.AgentDir = dataDir; + var importer = new TImporter + { + AgentDir = dataDir + }; // Load agent summary - var agent = importer.LoadAgent(meta); + var agent = await importer.LoadAgent(meta); // Load user custom entities - importer.LoadCustomEntities(agent); + await importer.LoadCustomEntities(agent); // Load agent intents - importer.LoadIntents(agent); + await importer.LoadIntents(agent); // Load system buildin entities - importer.LoadBuildinEntities(agent); + await importer.LoadBuildinEntities(agent); return agent; } @@ -58,18 +63,18 @@ private AgentImportHeader LoadMeta(string dataDir) return JsonConvert.DeserializeObject(metaJson); } - public TAgent GetAgentById(string agentId) + public async Task GetAgentById(string agentId) { GetStorage(); - return Storage.FetchById(agentId); + return await Storage.FetchById(agentId); } - public TAgent GetAgentByName(string agentName) + public async Task GetAgentByName(string agentName) { - GetStorage(); + await GetStorage(); - return Storage.FetchByName(agentName); + return await Storage.FetchByName(agentName); } public virtual async Task Train(TAgent agent, TrainingCorpus corpus, BotTrainOptions options) @@ -92,32 +97,22 @@ public virtual async Task Train(TAgent agent, TrainingCorpus corp return info; } - public virtual bool SaveAgent(TAgent agent) + public virtual async Task SaveAgent(TAgent agent) { - GetStorage(); + await GetStorage(); // default save agent in FileStorage - Storage.Persist(agent); + await Storage.Persist(agent); return true; } - private IAgentStorage GetStorage() + protected async Task> GetStorage() { if (Storage == null) { - string storageName = PlatformConfig.GetValue("AgentStorage"); - switch (storageName) - { - case "AgentStorageInRedis": - Storage = Activator.CreateInstance>(); - break; - case "AgentStorageInMemory": - Storage = Activator.CreateInstance>(); - break; - } + Storage = await agentStorageFactory.Get(); } - return Storage; } } diff --git a/BotSharp.Platform.Abstraction/IAgentImporter.cs b/BotSharp.Platform.Abstraction/IAgentImporter.cs index 1c59a3400..b7e6ddb18 100644 --- a/BotSharp.Platform.Abstraction/IAgentImporter.cs +++ b/BotSharp.Platform.Abstraction/IAgentImporter.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; using System.Text; +using System.Threading.Tasks; namespace BotSharp.Platform.Abstraction { @@ -16,24 +17,24 @@ public interface IAgentImporter /// Load agent summary /// /// - TAgent LoadAgent(AgentImportHeader agentHeader); + Task LoadAgent(AgentImportHeader agentHeader); /// /// Load user customized entity type which defined in dictionary /// /// - void LoadCustomEntities(TAgent agent); + Task LoadCustomEntities(TAgent agent); /// /// Load user customized intents /// /// - void LoadIntents(TAgent agent); + Task LoadIntents(TAgent agent); /// /// Add entities that labeled in intent.UserSays into user customized entity dictionary /// /// - void LoadBuildinEntities(TAgent agent); + Task LoadBuildinEntities(TAgent agent); } } diff --git a/BotSharp.Platform.Abstraction/IAgentStorage.cs b/BotSharp.Platform.Abstraction/IAgentStorage.cs index f1a899777..94b0e769f 100644 --- a/BotSharp.Platform.Abstraction/IAgentStorage.cs +++ b/BotSharp.Platform.Abstraction/IAgentStorage.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; using System.Text; +using System.Threading.Tasks; namespace BotSharp.Platform.Abstraction { @@ -16,32 +17,32 @@ public interface IAgentStorage /// /// /// - bool Persist(TAgent agent); + Task Persist(TAgent agent); /// /// Get agent by id /// /// /// - TAgent FetchById(string agentId); + Task FetchById(string agentId); /// /// Get agent by name /// /// /// - TAgent FetchByName(string agentName); + Task FetchByName(string agentName); /// /// Query agents /// /// - List Query(); + Task> Query(); /// /// Delete agents /// /// - int PurgeAllAgents(); + Task PurgeAllAgents(); } } diff --git a/BotSharp.Platform.Abstraction/IBotEngine.cs b/BotSharp.Platform.Abstraction/IBotEngine.cs index 9a0ac7c06..f3a560227 100644 --- a/BotSharp.Platform.Abstraction/IBotEngine.cs +++ b/BotSharp.Platform.Abstraction/IBotEngine.cs @@ -1,9 +1,6 @@ using BotSharp.Platform.Models; using BotSharp.Platform.Models.AiRequest; using BotSharp.Platform.Models.AiResponse; -using System; -using System.Collections.Generic; -using System.Text; using System.Threading.Tasks; namespace BotSharp.Platform.Abstraction @@ -13,7 +10,7 @@ namespace BotSharp.Platform.Abstraction /// public interface IBotEngine { - AiResponse TextRequest(AiRequest request); + Task TextRequest(AiRequest request); Task Train(BotTrainOptions options); } diff --git a/BotSharp.Platform.Abstraction/IPlatformBuilder.cs b/BotSharp.Platform.Abstraction/IPlatformBuilder.cs index 4e3a470bb..f9f7cb9ed 100644 --- a/BotSharp.Platform.Abstraction/IPlatformBuilder.cs +++ b/BotSharp.Platform.Abstraction/IPlatformBuilder.cs @@ -2,9 +2,6 @@ using BotSharp.Platform.Models.AiRequest; using BotSharp.Platform.Models.AiResponse; using BotSharp.Platform.Models.MachineLearning; -using System; -using System.Collections.Generic; -using System.Text; using System.Threading.Tasks; namespace BotSharp.Platform.Abstraction @@ -30,7 +27,7 @@ public interface IPlatformBuilder /// /// /// - TrainingCorpus ExtractorCorpus(TAgent agent); + Task ExtractorCorpus(TAgent agent); /// /// Load agent from files. @@ -38,7 +35,7 @@ public interface IPlatformBuilder /// /// /// - TAgent LoadAgentFromFile(string dataDir) where TImporter : IAgentImporter, new(); + Task LoadAgentFromFile(string dataDir) where TImporter : IAgentImporter, new(); /// /// @@ -46,10 +43,10 @@ public interface IPlatformBuilder /// /// /// - bool SaveAgent(TAgent agent); + Task SaveAgent(TAgent agent); Task Train(TAgent agent, TrainingCorpus corpus, BotTrainOptions options); - AiResponse TextRequest(AiRequest request); + Task TextRequest(AiRequest request); } } diff --git a/BotSharp.WebHost/BotSharp.WebHost.csproj b/BotSharp.WebHost/BotSharp.WebHost.csproj index ae9a330a2..a707ef6a1 100644 --- a/BotSharp.WebHost/BotSharp.WebHost.csproj +++ b/BotSharp.WebHost/BotSharp.WebHost.csproj @@ -78,6 +78,8 @@ + + diff --git a/BotSharp.WebHost/Settings/DialogflowAi.json b/BotSharp.WebHost/Settings/DialogflowAi.json index 31f219e5e..5b5c6c4bc 100644 --- a/BotSharp.WebHost/Settings/DialogflowAi.json +++ b/BotSharp.WebHost/Settings/DialogflowAi.json @@ -2,6 +2,6 @@ "dialogflowAi": { "botEngine": "BotSharpNLU", - "agentStorage": "AgentStorageInRedis" + "agentStorage": "AgentStorageInMemory" } } diff --git a/BotSharp.WebHost/Settings/RasaAi.json b/BotSharp.WebHost/Settings/RasaAi.json index 3876f0038..8c246b86f 100644 --- a/BotSharp.WebHost/Settings/RasaAi.json +++ b/BotSharp.WebHost/Settings/RasaAi.json @@ -2,6 +2,6 @@ "rasaAi": { "botEngine": "BotSharpNLU", - "agentStorage": "AgentStorageInRedis" + "agentStorage": "AgentStorageInMemory" } } diff --git a/BotSharp.WebHost/Settings/app.json b/BotSharp.WebHost/Settings/app.json index 58a0a84fc..4fb428652 100644 --- a/BotSharp.WebHost/Settings/app.json +++ b/BotSharp.WebHost/Settings/app.json @@ -8,5 +8,10 @@ "machineLearning": { "dataDir": "D:\\Projects\\BotSharp\\Data" - } + }, + + "Modules": [ + { "Type": "BotSharp.Platform.Dialogflow.DialogflowModule, BotSharp.Platform.Dialogflow" }, + //{ "Type": "BotSharp.Platform.Rasa.RasaModule, BotSharp.Platform.Rasa" } + ] } diff --git a/BotSharp.WebHost/Startup.cs b/BotSharp.WebHost/Startup.cs index b0d514e03..e8b542b76 100644 --- a/BotSharp.WebHost/Startup.cs +++ b/BotSharp.WebHost/Startup.cs @@ -1,4 +1,5 @@ -using DotNetToolkit.JwtHelper; +using BotSharp.Core.Modules; +using DotNetToolkit.JwtHelper; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; @@ -18,8 +19,11 @@ public partial class Startup public Startup(IConfiguration configuration) { Configuration = configuration; + this.modulesStartup = new ModulesStartup(configuration); } + private readonly ModulesStartup modulesStartup; + public IConfiguration Configuration { get; } public void ConfigureServices(IServiceCollection services) @@ -36,7 +40,8 @@ public void ConfigureServices(IServiceCollection services) options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); }); - services.AddPlatformEmulator(Configuration, assembly => mvcBuilder.AddApplicationPart(assembly)); + this.modulesStartup.ConfigureServices(services); + //services.AddPlatformEmulator(Configuration, assembly => mvcBuilder.AddApplicationPart(assembly)); services.AddSwaggerGen(c => { diff --git a/BotSharp.sln b/BotSharp.sln index 9321ee622..82dc9a1d8 100644 --- a/BotSharp.sln +++ b/BotSharp.sln @@ -24,6 +24,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BotSharp.Platform.Models", EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BotSharp.Platform.Dialogflow", "..\botsharp-dialogflow\BotSharp.Platform.Dialogflow\BotSharp.Platform.Dialogflow.csproj", "{83D56CDD-7122-48D3-9CDC-BCE21CB10681}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BotSharp.Platform.Rasa", "..\botsharp-rasa\BotSharp.Platform.Rasa\BotSharp.Platform.Rasa.csproj", "{2902810C-F8F2-400E-88DB-72CBE393B175}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -130,6 +132,18 @@ Global {83D56CDD-7122-48D3-9CDC-BCE21CB10681}.Release|Any CPU.Build.0 = Release|Any CPU {83D56CDD-7122-48D3-9CDC-BCE21CB10681}.Release|x64.ActiveCfg = Release|Any CPU {83D56CDD-7122-48D3-9CDC-BCE21CB10681}.Release|x64.Build.0 = Release|Any CPU + {2902810C-F8F2-400E-88DB-72CBE393B175}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2902810C-F8F2-400E-88DB-72CBE393B175}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2902810C-F8F2-400E-88DB-72CBE393B175}.Debug|x64.ActiveCfg = Debug|Any CPU + {2902810C-F8F2-400E-88DB-72CBE393B175}.Debug|x64.Build.0 = Debug|Any CPU + {2902810C-F8F2-400E-88DB-72CBE393B175}.DIALOGFLOW|Any CPU.ActiveCfg = Debug|Any CPU + {2902810C-F8F2-400E-88DB-72CBE393B175}.DIALOGFLOW|Any CPU.Build.0 = Debug|Any CPU + {2902810C-F8F2-400E-88DB-72CBE393B175}.DIALOGFLOW|x64.ActiveCfg = Debug|Any CPU + {2902810C-F8F2-400E-88DB-72CBE393B175}.DIALOGFLOW|x64.Build.0 = Debug|Any CPU + {2902810C-F8F2-400E-88DB-72CBE393B175}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2902810C-F8F2-400E-88DB-72CBE393B175}.Release|Any CPU.Build.0 = Release|Any CPU + {2902810C-F8F2-400E-88DB-72CBE393B175}.Release|x64.ActiveCfg = Release|Any CPU + {2902810C-F8F2-400E-88DB-72CBE393B175}.Release|x64.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE