diff --git a/Controllers/Budget.Controller.cs b/Controllers/Budget.Controller.cs index 3d1fc89..52ac663 100644 --- a/Controllers/Budget.Controller.cs +++ b/Controllers/Budget.Controller.cs @@ -3568,7 +3568,41 @@ namespace rmutr_report.Controllers return Ok(); } + [SwaggerOperation("สรุปงบประมาณรายจ่าย V2")] + [HttpPost, Route("reports/summary_budget_expense_2/{type}")] + [ApiExplorerSettings(GroupName = "reports")] + public IActionResult GetBudgetSummaryExpenseReport([FromRoute] string type, + [FromBody] summary_budget_expense_report budget) + { + var summaryBudget = new List() { budget }; + Report report = new Report(); + report.Load(_setting.report_path + "summary_budget_expense_1.frx"); + report.RegisterData(summaryBudget, "summary_budget_expense_report"); + report.Prepare(); + + MemoryStream stream = new MemoryStream(); + switch (type) + { + case "pdf": + PDFExport pdf = new PDFExport(); + report.Export(pdf, stream); + stream.Seek(0, SeekOrigin.Begin); + return File(stream, "application/pdf"); + + case "xls": + case "xlsx": + Excel2007Export excel = new Excel2007Export(); + report.Export(excel, stream); + stream.Seek(0, SeekOrigin.Begin); + return File( + stream, + "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + "summary_budget_expense_report" + ".xlsx"); + } + + return Ok(); + } [SwaggerOperation("ประมาณการรายรับ รายจ่าย")] [HttpPost, Route("reports/estimate_income_expenses/{type}")] [ApiExplorerSettings(GroupName = "reports")] diff --git a/Models/budget/summary_budget_expense.cs b/Models/budget/summary_budget_expense.cs index e062ec8..3edce54 100644 --- a/Models/budget/summary_budget_expense.cs +++ b/Models/budget/summary_budget_expense.cs @@ -3,36 +3,67 @@ using System.Collections.Generic; namespace rmutr_report.Models { public class summary_budget_expense - { - public string budget_year { get; set; } - public string agency_name_th { get; set; } - public string budget_plan_name_th { get; set; } - public string parent_agency_name { get; set; } - public List data { get; set; } - public decimal? total_equipment { get; set; } - public decimal? total_land_building { get; set; } - public decimal? total_subsidy { get; set; } - public decimal? total_compensation { get; set; } - public decimal? total_living_expenses { get; set; } - public decimal? total_material { get; set; } - public decimal? total_utilities { get; set; } - public decimal? total_other_expenses { get; set; } - public decimal? total_other_budget_expenses { get; set; } - public decimal? total_all { get; set; } - } +{ + public string budget_year { get; set; } + public string agency_name_th { get; set; } + public string budget_plan_name_th { get; set; } + public string parent_agency_name { get; set; } + public List data { get; set; } + public decimal? total_equipment { get; set; } + public decimal? total_land_building { get; set; } + public decimal? total_subsidy { get; set; } + public decimal? total_compensation { get; set; } + public decimal? total_living_expenses { get; set; } + public decimal? total_material { get; set; } + public decimal? total_utilities { get; set; } + public decimal? total_other_expenses { get; set; } + public decimal? total_other_budget_expenses { get; set; } + public decimal? total_all { get; set; } +} - public class summary_budget_expense_detail - { - public string budget_project_name_th { get; set; } - public decimal? equipment { get; set; } - public decimal? land_building { get; set; } - public decimal? subsidy { get; set; } - public decimal? compensation { get; set; } - public decimal? living_expenses { get; set; } - public decimal? material { get; set; } - public decimal? utilities { get; set; } - public decimal? other_expenses { get; set; } - public decimal? other_budget_expenses { get; set; } - public decimal? total { get; set; } - } +public class summary_budget_expense_detail +{ + public string budget_project_name_th { get; set; } + public decimal? equipment { get; set; } + public decimal? land_building { get; set; } + public decimal? subsidy { get; set; } + public decimal? compensation { get; set; } + public decimal? living_expenses { get; set; } + public decimal? material { get; set; } + public decimal? utilities { get; set; } + public decimal? other_expenses { get; set; } + public decimal? other_budget_expenses { get; set; } + public decimal? total { get; set; } +} + +public class summary_budget_expense_report +{ + public string budget_year { get; set; } + public string agency_name_th { get; set; } + public string budget_plan_name_th { get; set; } + public string parent_agency_name { get; set; } + public string budget_project_name { get; set; } + public List data { get; set; } + public decimal? total_equipment { get; set; } + public decimal? total_land_building { get; set; } + public decimal? total_subsidy_university_staff { get; set; } + public decimal? total_subsidy { get; set; } + public decimal? total_operating_expenses { get; set; } + public decimal? total_other_expenses { get; set; } + public decimal? total_other_budget_expenses { get; set; } + public decimal? total_all { get; set; } +} + +public class summary_budget_expense_report_detail +{ + public string budget_project_name_th { get; set; } + public decimal? equipment { get; set; } + public decimal? land_building { get; set; } + public decimal? subsidy_university_staff { get; set; } + public decimal? subsidy { get; set; } + public decimal? operating_expenses { get; set; } + public decimal? other_expenses { get; set; } + public decimal? other_budget_expenses { get; set; } + public decimal? total { get; set; } +} } \ No newline at end of file diff --git a/bin/Debug/net5.0/rmutr_report.dll b/bin/Debug/net5.0/rmutr_report.dll index 806751a..01942df 100644 Binary files a/bin/Debug/net5.0/rmutr_report.dll and b/bin/Debug/net5.0/rmutr_report.dll differ diff --git a/bin/Debug/net5.0/rmutr_report.pdb b/bin/Debug/net5.0/rmutr_report.pdb index 83fa6d9..9969cc1 100644 Binary files a/bin/Debug/net5.0/rmutr_report.pdb and b/bin/Debug/net5.0/rmutr_report.pdb differ diff --git a/bin/Debug/netcoreapp3.1/rmutr_report.dll b/bin/Debug/netcoreapp3.1/rmutr_report.dll index 8de6f61..de1cf65 100644 Binary files a/bin/Debug/netcoreapp3.1/rmutr_report.dll and b/bin/Debug/netcoreapp3.1/rmutr_report.dll differ diff --git a/bin/Debug/netcoreapp3.1/rmutr_report.pdb b/bin/Debug/netcoreapp3.1/rmutr_report.pdb index a399777..1cb7919 100644 Binary files a/bin/Debug/netcoreapp3.1/rmutr_report.pdb and b/bin/Debug/netcoreapp3.1/rmutr_report.pdb differ diff --git a/obj/Debug/net5.0/ref/rmutr_report.dll b/obj/Debug/net5.0/ref/rmutr_report.dll index 25ab819..912078b 100644 Binary files a/obj/Debug/net5.0/ref/rmutr_report.dll and b/obj/Debug/net5.0/ref/rmutr_report.dll differ diff --git a/obj/Debug/net5.0/refint/rmutr_report.dll b/obj/Debug/net5.0/refint/rmutr_report.dll index 25ab819..912078b 100644 Binary files a/obj/Debug/net5.0/refint/rmutr_report.dll and b/obj/Debug/net5.0/refint/rmutr_report.dll differ diff --git a/obj/Debug/net5.0/rmutr_report.AssemblyInfo.cs b/obj/Debug/net5.0/rmutr_report.AssemblyInfo.cs index f1f75e5..75c57d1 100644 --- a/obj/Debug/net5.0/rmutr_report.AssemblyInfo.cs +++ b/obj/Debug/net5.0/rmutr_report.AssemblyInfo.cs @@ -13,7 +13,7 @@ using System.Reflection; [assembly: System.Reflection.AssemblyCompanyAttribute("rmutr_report")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+c5e56063e2ef2d254a6fbb2035095a181b7103c3")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+335c7602600da360f238b4f78352fad0d17b8ee0")] [assembly: System.Reflection.AssemblyProductAttribute("rmutr_report")] [assembly: System.Reflection.AssemblyTitleAttribute("rmutr_report")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] diff --git a/obj/Debug/net5.0/rmutr_report.AssemblyInfoInputs.cache b/obj/Debug/net5.0/rmutr_report.AssemblyInfoInputs.cache index 1f4e36e..2988276 100644 --- a/obj/Debug/net5.0/rmutr_report.AssemblyInfoInputs.cache +++ b/obj/Debug/net5.0/rmutr_report.AssemblyInfoInputs.cache @@ -1 +1 @@ -a6497678f9a2aa9e7e5abc4d22eb7e42715ef7b2ca97041d4bf70762dfbe0fd9 +9e09f1935e2fb9aa8a39f607c1d3877230f6136ee9b0ac8eb9aceca72ff474b8 diff --git a/obj/Debug/net5.0/rmutr_report.RazorTargetAssemblyInfo.cache b/obj/Debug/net5.0/rmutr_report.RazorTargetAssemblyInfo.cache index 35b630d..de96e97 100644 --- a/obj/Debug/net5.0/rmutr_report.RazorTargetAssemblyInfo.cache +++ b/obj/Debug/net5.0/rmutr_report.RazorTargetAssemblyInfo.cache @@ -1 +1 @@ -3282571f3aaad087370b963afc8333e1479c897b11aab5684c6fc3015052c2b9 +85f13af2d809553412ddd33691f9de015d05d9f5f13be31ba7532b8ed5046afb diff --git a/obj/Debug/net5.0/rmutr_report.assets.cache b/obj/Debug/net5.0/rmutr_report.assets.cache index 70b70da..9707e62 100644 Binary files a/obj/Debug/net5.0/rmutr_report.assets.cache and b/obj/Debug/net5.0/rmutr_report.assets.cache differ diff --git a/obj/Debug/net5.0/rmutr_report.dll b/obj/Debug/net5.0/rmutr_report.dll index 806751a..01942df 100644 Binary files a/obj/Debug/net5.0/rmutr_report.dll and b/obj/Debug/net5.0/rmutr_report.dll differ diff --git a/obj/Debug/net5.0/rmutr_report.pdb b/obj/Debug/net5.0/rmutr_report.pdb index 83fa6d9..9969cc1 100644 Binary files a/obj/Debug/net5.0/rmutr_report.pdb and b/obj/Debug/net5.0/rmutr_report.pdb differ diff --git a/obj/Debug/net5.0/staticwebassets/msbuild.rmutr_report.Microsoft.AspNetCore.StaticWebAssets.props b/obj/Debug/net5.0/staticwebassets/msbuild.rmutr_report.Microsoft.AspNetCore.StaticWebAssets.props index feaf436..07ed064 100644 --- a/obj/Debug/net5.0/staticwebassets/msbuild.rmutr_report.Microsoft.AspNetCore.StaticWebAssets.props +++ b/obj/Debug/net5.0/staticwebassets/msbuild.rmutr_report.Microsoft.AspNetCore.StaticWebAssets.props @@ -2896,6 +2896,22 @@ PreserveNewest $([System.IO.Path]::GetFullPath($(MSBuildThisFileDirectory)..\staticwebassets\reports\summary_budget_expense.frx)) + + Package + rmutr_report + $(MSBuildThisFileDirectory)..\staticwebassets\ + _content/rmutr_report + reports\summary_budget_expense_1.frx + + + + + + + + PreserveNewest + $([System.IO.Path]::GetFullPath($(MSBuildThisFileDirectory)..\staticwebassets\reports\summary_budget_expense_1.frx)) + Package rmutr_report diff --git a/obj/Debug/net5.0/staticwebassets/rmutr_report.StaticWebAssets.Pack.cache b/obj/Debug/net5.0/staticwebassets/rmutr_report.StaticWebAssets.Pack.cache index 87d2cab..b6b428d 100644 --- a/obj/Debug/net5.0/staticwebassets/rmutr_report.StaticWebAssets.Pack.cache +++ b/obj/Debug/net5.0/staticwebassets/rmutr_report.StaticWebAssets.Pack.cache @@ -1 +1 @@ -55bc044448429e1c530fe751e53f25556ac50f37a37299c368138242061eff81 +feb24e70c21b9d83dc31845e6343ebf94a5549a3846e2fb29ef9fc07034acaa5 diff --git a/obj/Debug/netcoreapp3.1/rmutr_report.AssemblyInfo.cs b/obj/Debug/netcoreapp3.1/rmutr_report.AssemblyInfo.cs index f1f75e5..4d926d3 100644 --- a/obj/Debug/netcoreapp3.1/rmutr_report.AssemblyInfo.cs +++ b/obj/Debug/netcoreapp3.1/rmutr_report.AssemblyInfo.cs @@ -13,7 +13,7 @@ using System.Reflection; [assembly: System.Reflection.AssemblyCompanyAttribute("rmutr_report")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+c5e56063e2ef2d254a6fbb2035095a181b7103c3")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+fc127f2ab687baa8ba5894f3d97c68f488282f47")] [assembly: System.Reflection.AssemblyProductAttribute("rmutr_report")] [assembly: System.Reflection.AssemblyTitleAttribute("rmutr_report")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] diff --git a/obj/Debug/netcoreapp3.1/rmutr_report.AssemblyInfoInputs.cache b/obj/Debug/netcoreapp3.1/rmutr_report.AssemblyInfoInputs.cache index 1f4e36e..523bb95 100644 --- a/obj/Debug/netcoreapp3.1/rmutr_report.AssemblyInfoInputs.cache +++ b/obj/Debug/netcoreapp3.1/rmutr_report.AssemblyInfoInputs.cache @@ -1 +1 @@ -a6497678f9a2aa9e7e5abc4d22eb7e42715ef7b2ca97041d4bf70762dfbe0fd9 +89a13338d3f200d448542c7bc8fbd921d2ca962ee38e1223dfdf6f075f4838aa diff --git a/obj/Debug/netcoreapp3.1/rmutr_report.RazorTargetAssemblyInfo.cache b/obj/Debug/netcoreapp3.1/rmutr_report.RazorTargetAssemblyInfo.cache index d395b35..e8f1c9d 100644 --- a/obj/Debug/netcoreapp3.1/rmutr_report.RazorTargetAssemblyInfo.cache +++ b/obj/Debug/netcoreapp3.1/rmutr_report.RazorTargetAssemblyInfo.cache @@ -1 +1 @@ -7b9ea42177d03ced8fb55213fec1b4d1c2989a406793ce7eea8fa8ff8087eae0 +8c4765109802d78bfd5b22ab68f5f2853c8dab91c4548a070c99df7232356c83 diff --git a/obj/Debug/netcoreapp3.1/rmutr_report.assets.cache b/obj/Debug/netcoreapp3.1/rmutr_report.assets.cache index 16c9b8b..fdd3219 100644 Binary files a/obj/Debug/netcoreapp3.1/rmutr_report.assets.cache and b/obj/Debug/netcoreapp3.1/rmutr_report.assets.cache differ diff --git a/obj/Debug/netcoreapp3.1/rmutr_report.dll b/obj/Debug/netcoreapp3.1/rmutr_report.dll index 8de6f61..de1cf65 100644 Binary files a/obj/Debug/netcoreapp3.1/rmutr_report.dll and b/obj/Debug/netcoreapp3.1/rmutr_report.dll differ diff --git a/obj/Debug/netcoreapp3.1/rmutr_report.pdb b/obj/Debug/netcoreapp3.1/rmutr_report.pdb index a399777..1cb7919 100644 Binary files a/obj/Debug/netcoreapp3.1/rmutr_report.pdb and b/obj/Debug/netcoreapp3.1/rmutr_report.pdb differ diff --git a/obj/Debug/netcoreapp3.1/staticwebassets/msbuild.rmutr_report.Microsoft.AspNetCore.StaticWebAssets.props b/obj/Debug/netcoreapp3.1/staticwebassets/msbuild.rmutr_report.Microsoft.AspNetCore.StaticWebAssets.props index feaf436..07ed064 100644 --- a/obj/Debug/netcoreapp3.1/staticwebassets/msbuild.rmutr_report.Microsoft.AspNetCore.StaticWebAssets.props +++ b/obj/Debug/netcoreapp3.1/staticwebassets/msbuild.rmutr_report.Microsoft.AspNetCore.StaticWebAssets.props @@ -2896,6 +2896,22 @@ PreserveNewest $([System.IO.Path]::GetFullPath($(MSBuildThisFileDirectory)..\staticwebassets\reports\summary_budget_expense.frx)) + + Package + rmutr_report + $(MSBuildThisFileDirectory)..\staticwebassets\ + _content/rmutr_report + reports\summary_budget_expense_1.frx + + + + + + + + PreserveNewest + $([System.IO.Path]::GetFullPath($(MSBuildThisFileDirectory)..\staticwebassets\reports\summary_budget_expense_1.frx)) + Package rmutr_report diff --git a/obj/Debug/netcoreapp3.1/staticwebassets/rmutr_report.StaticWebAssets.Pack.cache b/obj/Debug/netcoreapp3.1/staticwebassets/rmutr_report.StaticWebAssets.Pack.cache index 87d2cab..b6b428d 100644 --- a/obj/Debug/netcoreapp3.1/staticwebassets/rmutr_report.StaticWebAssets.Pack.cache +++ b/obj/Debug/netcoreapp3.1/staticwebassets/rmutr_report.StaticWebAssets.Pack.cache @@ -1 +1 @@ -55bc044448429e1c530fe751e53f25556ac50f37a37299c368138242061eff81 +feb24e70c21b9d83dc31845e6343ebf94a5549a3846e2fb29ef9fc07034acaa5 diff --git a/obj/project.nuget.cache b/obj/project.nuget.cache index f26cce9..ee71743 100644 --- a/obj/project.nuget.cache +++ b/obj/project.nuget.cache @@ -34,23 +34,23 @@ "C:\\Users\\USER\\.nuget\\packages\\microsoft.win32.registry\\4.4.0\\microsoft.win32.registry.4.4.0.nupkg.sha512", "C:\\Users\\USER\\.nuget\\packages\\microsoft.win32.systemevents\\4.7.0\\microsoft.win32.systemevents.4.7.0.nupkg.sha512", "C:\\Users\\USER\\.nuget\\packages\\runtime.native.system.data.sqlclient.sni\\4.4.0\\runtime.native.system.data.sqlclient.sni.4.4.0.nupkg.sha512", - "C:\\Users\\USER\\.nuget\\packages\\runtime.win-arm64.runtime.native.system.data.sqlclient.sni\\4.4.0\\runtime.win-arm64.runtime.native.system.data.sqlclient.sni.4.4.0.nupkg.sha512", - "C:\\Users\\USER\\.nuget\\packages\\runtime.win-x64.runtime.native.system.data.sqlclient.sni\\4.4.0\\runtime.win-x64.runtime.native.system.data.sqlclient.sni.4.4.0.nupkg.sha512", - "C:\\Users\\USER\\.nuget\\packages\\runtime.win-x86.runtime.native.system.data.sqlclient.sni\\4.4.0\\runtime.win-x86.runtime.native.system.data.sqlclient.sni.4.4.0.nupkg.sha512", + "C:\\Program Files\\dotnet\\sdk\\NuGetFallbackFolder\\runtime.win-arm64.runtime.native.system.data.sqlclient.sni\\4.4.0\\runtime.win-arm64.runtime.native.system.data.sqlclient.sni.4.4.0.nupkg.sha512", + "C:\\Program Files\\dotnet\\sdk\\NuGetFallbackFolder\\runtime.win-x64.runtime.native.system.data.sqlclient.sni\\4.4.0\\runtime.win-x64.runtime.native.system.data.sqlclient.sni.4.4.0.nupkg.sha512", + "C:\\Program Files\\dotnet\\sdk\\NuGetFallbackFolder\\runtime.win-x86.runtime.native.system.data.sqlclient.sni\\4.4.0\\runtime.win-x86.runtime.native.system.data.sqlclient.sni.4.4.0.nupkg.sha512", "C:\\Users\\USER\\.nuget\\packages\\swashbuckle.aspnetcore\\6.5.0\\swashbuckle.aspnetcore.6.5.0.nupkg.sha512", "C:\\Users\\USER\\.nuget\\packages\\swashbuckle.aspnetcore.annotations\\6.5.0\\swashbuckle.aspnetcore.annotations.6.5.0.nupkg.sha512", "C:\\Users\\USER\\.nuget\\packages\\swashbuckle.aspnetcore.swagger\\6.5.0\\swashbuckle.aspnetcore.swagger.6.5.0.nupkg.sha512", "C:\\Users\\USER\\.nuget\\packages\\swashbuckle.aspnetcore.swaggergen\\6.5.0\\swashbuckle.aspnetcore.swaggergen.6.5.0.nupkg.sha512", "C:\\Users\\USER\\.nuget\\packages\\swashbuckle.aspnetcore.swaggerui\\6.5.0\\swashbuckle.aspnetcore.swaggerui.6.5.0.nupkg.sha512", "C:\\Users\\USER\\.nuget\\packages\\system.buffers\\4.5.1\\system.buffers.4.5.1.nupkg.sha512", - "C:\\Users\\USER\\.nuget\\packages\\system.collections.immutable\\1.5.0\\system.collections.immutable.1.5.0.nupkg.sha512", + "C:\\Program Files\\dotnet\\sdk\\NuGetFallbackFolder\\system.collections.immutable\\1.5.0\\system.collections.immutable.1.5.0.nupkg.sha512", "C:\\Users\\USER\\.nuget\\packages\\system.componentmodel.annotations\\5.0.0\\system.componentmodel.annotations.5.0.0.nupkg.sha512", "C:\\Users\\USER\\.nuget\\packages\\system.data.sqlclient\\4.4.3\\system.data.sqlclient.4.4.3.nupkg.sha512", "C:\\Users\\USER\\.nuget\\packages\\system.drawing.common\\4.7.3\\system.drawing.common.4.7.3.nupkg.sha512", "C:\\Users\\USER\\.nuget\\packages\\system.formats.asn1\\8.0.0\\system.formats.asn1.8.0.0.nupkg.sha512", "C:\\Users\\USER\\.nuget\\packages\\system.io.packaging\\4.7.0\\system.io.packaging.4.7.0.nupkg.sha512", "C:\\Users\\USER\\.nuget\\packages\\system.memory\\4.5.5\\system.memory.4.5.5.nupkg.sha512", - "C:\\Users\\USER\\.nuget\\packages\\system.reflection.metadata\\1.6.0\\system.reflection.metadata.1.6.0.nupkg.sha512", + "C:\\Program Files\\dotnet\\sdk\\NuGetFallbackFolder\\system.reflection.metadata\\1.6.0\\system.reflection.metadata.1.6.0.nupkg.sha512", "C:\\Users\\USER\\.nuget\\packages\\system.runtime.compilerservices.unsafe\\6.0.0\\system.runtime.compilerservices.unsafe.6.0.0.nupkg.sha512", "C:\\Users\\USER\\.nuget\\packages\\system.security.accesscontrol\\4.4.0\\system.security.accesscontrol.4.4.0.nupkg.sha512", "C:\\Users\\USER\\.nuget\\packages\\system.security.cryptography.cng\\5.0.0\\system.security.cryptography.cng.5.0.0.nupkg.sha512", diff --git a/obj/rider.project.model.nuget.info b/obj/rider.project.model.nuget.info index 8731d64..ba2e2a9 100644 --- a/obj/rider.project.model.nuget.info +++ b/obj/rider.project.model.nuget.info @@ -1 +1 @@ -17404853499076394 \ No newline at end of file +17409848290670725 \ No newline at end of file diff --git a/obj/rider.project.restore.info b/obj/rider.project.restore.info index bd04564..6dcb28a 100644 --- a/obj/rider.project.restore.info +++ b/obj/rider.project.restore.info @@ -1 +1 @@ -17408131531650790 \ No newline at end of file +17423749204531663 \ No newline at end of file diff --git a/wwwroot/reports/summary_budget_expense_1.frx b/wwwroot/reports/summary_budget_expense_1.frx new file mode 100644 index 0000000..49409ff --- /dev/null +++ b/wwwroot/reports/summary_budget_expense_1.frx @@ -0,0 +1,159 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +