Thanks to visit codestin.com
Credit goes to github.com

Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
95 commits
Select commit Hold shift + click to select a range
7d5689e
Dev version bump [Skip CI]
nblumhardt Oct 22, 2017
6d3f7ae
Minor documentation fix [Skip CI]
nblumhardt Oct 24, 2017
ae6c75b
Add additional JSON config sample
adamchester Apr 29, 2018
438c963
Merge pull request #38 from serilog/adamchester-patch-1
nblumhardt Apr 29, 2018
150de66
README : add example to specify theme in xml config
tsimbalar May 8, 2018
3e6fae9
Merge pull request #39 from tsimbalar/xml-doc
nblumhardt May 9, 2018
c03f763
New NuGet key
nblumhardt May 9, 2018
0c769a8
Make Theme:Code[TertiaryText] different to [Text]
adamchester May 20, 2018
f1dc616
Merge pull request #40 from serilog/adamchester-code-tertiary-text
nblumhardt May 21, 2018
911a47c
fixing repository url
MaximRouiller Sep 21, 2018
074e04c
Merge pull request #45 from MaximRouiller/repositoryurl
nblumhardt Sep 22, 2018
be343cd
Update Nuget package license specification
tsimbalar Jan 4, 2019
903fda5
Merge pull request #51 from tsimbalar/nuget-license
nblumhardt Jan 5, 2019
e6c9b40
Copy output formatting tests from core serilog repo
tsimbalar Oct 30, 2018
ac0468d
Update the test to make them pass
tsimbalar Nov 18, 2018
aba33ef
Fix .sln file to remove reference to inexisting file
tsimbalar Jan 4, 2019
75e1dd4
Merge pull request #52 from tsimbalar/test/template-format
tsimbalar Jan 15, 2019
d2d64b5
pad check
sungam3r Mar 12, 2019
3a170af
spell check
sungam3r Mar 12, 2019
bed2f43
code cleanup
sungam3r Mar 12, 2019
da93355
code cleanup
sungam3r Mar 12, 2019
53b681a
Revert "pad check"
sungam3r Mar 12, 2019
597d51f
more code cleanup
sungam3r Mar 13, 2019
aff642d
oops
sungam3r Mar 13, 2019
95d1184
Merge pull request #55 from sungam3r/code-cleanup
nblumhardt Mar 14, 2019
59d2e8f
Updated NuGet API Key
merbla May 6, 2019
b0cecc1
#60 add target to netstandard 2.0
May 11, 2019
e6f24c2
Merge pull request #61 from vhatsura/netstandard2.0
nblumhardt May 12, 2019
1ab6bb7
moved code out of critical section that isn't critical
Jun 23, 2019
b146f27
Merge pull request #62 from bender2k14/optimize_critical_section
nblumhardt Jun 24, 2019
cf3c392
Fix an out-of-order line in documentation
teo-tsirpanis Jul 5, 2019
a00fb7c
Merge pull request #63 from teo-tsirpanis/patch-1
nblumhardt Jul 5, 2019
be0da3d
Synchronize writes across all instances of ConsoleSink
nblumhardt Jul 31, 2019
c308d76
Configurable sync root for console sink,
adamchester Aug 2, 2019
95bbfb6
Fix accidental spaces
adamchester Aug 2, 2019
7737b6d
Merge pull request #65 from nblumhardt/shared-locking
nblumhardt Aug 2, 2019
d12536d
revert sample changes
adamchester Aug 15, 2019
dbd80a7
revert sample changes
adamchester Aug 15, 2019
7813ab9
Move default synroot to config extensions
adamchester Aug 15, 2019
083b684
Principle-of-least-surprise - use RenderedCompactJsonFormatter in the…
nblumhardt Aug 15, 2019
cf8a95a
Merge pull request #69 from nblumhardt/readme-rendered-formatter
nblumhardt Aug 15, 2019
ad280ad
Added `SyncWritesDemo`
adamchester Aug 20, 2019
181aec0
disable Mono on travis
SimonCropp Aug 21, 2019
1ad869f
Merge pull request #71 from SimonCropp/monoNone
nblumhardt Aug 21, 2019
d5a5128
run against netcore app 2.2
SimonCropp Aug 22, 2019
c521c7a
simplify build
SimonCropp Aug 22, 2019
6f01144
simplify build
SimonCropp Aug 22, 2019
4989e8b
Merge pull request #72 from SimonCropp/netcore22
nblumhardt Aug 22, 2019
a464f75
Fixes #73 - CoC link
nblumhardt Sep 13, 2019
65fa7d4
add applyThemeOnOutputRedirection option to console sink. Fix for htt…
Nov 21, 2019
b294696
fix typo
Nov 21, 2019
f7167b2
add unit tests
Nov 21, 2019
71eb8e0
remove unused imports
Nov 21, 2019
44db5e2
undo commented line in test project
Nov 21, 2019
d9d645b
Change parameter name from `applyThemeOnOutputRedirection` to `applyT…
Nov 22, 2019
dc2c98e
Drop explicit private modifier
nblumhardt Nov 22, 2019
70d892b
Incoming breaking changes
nblumhardt Nov 22, 2019
e83f2f3
Merge pull request #66 from adamchester/configurable-locking
nblumhardt Nov 22, 2019
0ca100a
Merge branch 'dev' into add_apply_theme_on_output_redirection_option
nblumhardt Nov 22, 2019
e5d1247
Merge pull request #77 from tjaart/add_apply_theme_on_output_redirect…
nblumhardt Nov 22, 2019
9ba1374
Adding netcoreapp2.0 target
megakid Jan 12, 2020
48485bc
Stop using the alias `ls` for `Get-ChildItem`
adamchester Jan 15, 2020
eafe7d5
Merge pull request #80 from megakid/dev
nblumhardt Jan 24, 2020
4ea1e04
Initial nullable reference support
rafaelsc Jul 17, 2020
503e7aa
Add nullable reference support to test Project
rafaelsc Jul 17, 2020
ccbd4d2
Update Nullable
rafaelsc Jul 18, 2020
6d36dc7
Update Nullable
rafaelsc Jul 18, 2020
9e188c5
Add more XML Documentation
rafaelsc Jul 18, 2020
cbccb75
Use faster null check
rafaelsc Jul 18, 2020
3e849e4
Force SyncRoot be readonly
rafaelsc Jul 18, 2020
11bf0f4
Rollback Change
rafaelsc Jul 18, 2020
2fe1f53
Update Nullable Support
rafaelsc Jul 20, 2020
05eeca9
Test in all Frameworks
rafaelsc Jul 20, 2020
7201374
Update appveyor config
rafaelsc Jul 22, 2020
0aa4237
Update Test Project
rafaelsc Jul 22, 2020
e992708
Merge pull request #96 from rafaelsc/optimization/fastNullCheck
nblumhardt Jul 23, 2020
65ce4a1
Rollback Refactor
rafaelsc Jul 23, 2020
6b65cee
Merge branch 'dev' into feature/nullableReference
rafaelsc Jul 23, 2020
32763e5
Fix DefineConstants
rafaelsc Jul 23, 2020
75b5b76
Code rearange
rafaelsc Jul 23, 2020
a238a59
Merge branch 'feature/nullableReference' of https://github.com/rafael…
rafaelsc Jul 23, 2020
489aaed
Prefer to use Bang operator
rafaelsc Jul 23, 2020
642c817
Changing error message
rafaelsc Jul 23, 2020
65e237f
Merge pull request #95 from rafaelsc/feature/improveDocumentation
nblumhardt Jul 24, 2020
d3d36f6
Change the behaver when ToString() return null.
rafaelsc Jul 30, 2020
31f5aec
Remove unnecessary references
rafaelsc Jul 31, 2020
ba18b19
Add More TargetFrameworks
rafaelsc Jul 31, 2020
3caf0ef
Update Package
rafaelsc Aug 5, 2020
407285e
Remove PINVOKE Constants
rafaelsc Aug 5, 2020
64a5a03
Update Buld Script and Appveyor
rafaelsc Aug 5, 2020
ae71432
Update Buld Script and Appveyor
rafaelsc Aug 5, 2020
ddb04ae
Merge pull request #99 from rafaelsc/feature/cleanUpReferences
nblumhardt Jul 12, 2021
89af075
Merge branch 'dev' into feature/nullableReference
nblumhardt Jul 12, 2021
ffc2c0f
Merge pull request #98 from rafaelsc/feature/nullableReference
nblumhardt Jul 12, 2021
9f26947
Tidy up, fix build, add net5.0 targets, use the Nullable support package
nblumhardt Jul 12, 2021
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions .idea/.idea.serilog-sinks-console/.idea/.gitignore

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 4 additions & 0 deletions .idea/.idea.serilog-sinks-console/.idea/encodings.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions .idea/.idea.serilog-sinks-console/.idea/indexLayout.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions .idea/.idea.serilog-sinks-console/.idea/vcs.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 3 additions & 2 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,10 @@ language: csharp
matrix:
include:
- os: linux # Ubuntu 14.04
dist: trusty
dist: xenial
sudo: required
dotnet: 1.0.4
dotnet: 2.2.401
mono: none
group: edge

script:
Expand Down
32 changes: 23 additions & 9 deletions Build.ps1
Original file line number Diff line number Diff line change
@@ -1,27 +1,30 @@
echo "build: Build started"
Write-Output "build: Build started"

& dotnet --info
& dotnet --list-sdks

Push-Location $PSScriptRoot

if(Test-Path .\artifacts) {
echo "build: Cleaning .\artifacts"
Write-Output "build: Cleaning .\artifacts"
Remove-Item .\artifacts -Force -Recurse
}

& dotnet restore --no-cache

$branch = @{ $true = $env:APPVEYOR_REPO_BRANCH; $false = $(git symbolic-ref --short -q HEAD) }[$env:APPVEYOR_REPO_BRANCH -ne $NULL];
$revision = @{ $true = "{0:00000}" -f [convert]::ToInt32("0" + $env:APPVEYOR_BUILD_NUMBER, 10); $false = "local" }[$env:APPVEYOR_BUILD_NUMBER -ne $NULL];
$suffix = @{ $true = ""; $false = "$($branch.Substring(0, [math]::Min(10,$branch.Length)))-$revision"}[$branch -eq "master" -and $revision -ne "local"]
$suffix = @{ $true = ""; $false = "$($branch.Substring(0, [math]::Min(10,$branch.Length)))-$revision"}[$branch -eq "main" -and $revision -ne "local"]
$commitHash = $(git rev-parse --short HEAD)
$buildSuffix = @{ $true = "$($suffix)-$($commitHash)"; $false = "$($branch)-$($commitHash)" }[$suffix -ne ""]

echo "build: Package version suffix is $suffix"
echo "build: Build version suffix is $buildSuffix"
Write-Output "build: Package version suffix is $suffix"
Write-Output "build: Build version suffix is $buildSuffix"

foreach ($src in ls src/*) {
foreach ($src in Get-ChildItem src/*) {
Push-Location $src

echo "build: Packaging project in $src"
Write-Output "build: Packaging project in $src"

& dotnet build -c Release --version-suffix=$buildSuffix
if ($suffix) {
Expand All @@ -34,10 +37,21 @@ foreach ($src in ls src/*) {
Pop-Location
}

foreach ($test in ls test/*.Tests) {
foreach ($sample in Get-ChildItem sample/*) {
Push-Location $sample

Write-Output "build: Testing project in $sample"

& dotnet build -c Release --version-suffix=$buildSuffix
if($LASTEXITCODE -ne 0) { exit 3 }

Pop-Location
}

foreach ($test in Get-ChildItem test/*.Tests) {
Push-Location $test

echo "build: Testing project in $test"
Write-Output "build: Testing project in $test"

& dotnet test -c Release
if($LASTEXITCODE -ne 0) { exit 3 }
Expand Down
2 changes: 1 addition & 1 deletion CODE_OF_CONDUCT.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
# Code of Conduct

Please refer to the [Serilog Code of Conduct](https://github.com/serilog/serilog/blob/dev/CONTRIBUTING.md) which covers all repositories within the Serilog Organisation.
Please refer to the [Serilog Code of Conduct](https://github.com/serilog/serilog/blob/dev/CODE_OF_CONDUCT.md) which covers all repositories within the Serilog Organization.
57 changes: 35 additions & 22 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@ A Serilog sink that writes log events to the Windows Console or an ANSI terminal

To use the console sink, first install the [NuGet package](https://nuget.org/packages/serilog.sinks.console):

```powershell
Install-Package Serilog.Sinks.Console
```shell
dotnet add package Serilog.Sinks.Console
```

Then enable the sink using `WriteTo.Console()`:
Expand Down Expand Up @@ -64,14 +64,14 @@ The default template, shown in the example above, uses built-in properties like

The sink can write JSON output instead of plain text. `CompactJsonFormatter` or `RenderedCompactJsonFormatter` from [Serilog.Formatting.Compact](https://github.com/serilog/serilog-formatting-compact) is recommended:

```powershell
Install-Package Serilog.Formatting.Compact
```shell
dotnet add package Serilog.Formatting.Compact
```

Pass a formatter to the `Console()` configuration method:

```csharp
.WriteTo.Console(new CompactJsonFormatter())
.WriteTo.Console(new RenderedCompactJsonFormatter())
```

Output theming is not available when custom formatters are used.
Expand All @@ -80,8 +80,8 @@ Output theming is not available when custom formatters are used.

To use the console sink with the [Serilog.Settings.AppSettings](https://github.com/serilog/serilog-settings-appsettings) package, first install that package if you haven't already done so:

```powershell
Install-Package Serilog.Settings.AppSettings
```shell
dotnet add package Serilog.Settings.AppSettings
```

Instead of configuring the logger in code, call `ReadFrom.AppSettings()`:
Expand All @@ -101,12 +101,21 @@ In your application's `App.config` or `Web.config` file, specify the console sin
<add key="serilog:write-to:Console" />
```

To configure the console sink with a different theme and include the `SourceContext` in the output, change your `App.config`/`Web.config` to:
```xml
<configuration>
<appSettings>
<add key="serilog:using:Console" value="Serilog.Sinks.Console" />
<add key="serilog:write-to:Console.theme" value="Serilog.Sinks.SystemConsole.Themes.AnsiConsoleTheme::Code, Serilog.Sinks.Console" />
<add key="serilog:write-to:Console.outputTemplate" value="[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj} &lt;s:{SourceContext}&gt;{NewLine}{Exception}" />
```

### JSON `appsettings.json` configuration

To use the console sink with _Microsoft.Extensions.Configuration_, for example with ASP.NET Core or .NET Core, use the [Serilog.Settings.Configuration](https://github.com/serilog/serilog-settings-configuration) package. First install that package if you have not already done so:

```powershell
Install-Package Serilog.Settings.Configuration
```shell
dotnet add package Serilog.Settings.Configuration
```

Instead of configuring the sink directly in code, call `ReadFrom.Configuration()`:
Expand All @@ -122,7 +131,6 @@ var logger = new LoggerConfiguration()
```

In your `appsettings.json` file, under the `Serilog` node, :

```json
{
"Serilog": {
Expand All @@ -131,18 +139,23 @@ In your `appsettings.json` file, under the `Serilog` node, :
}
```

### Upgrading from _Serilog.Sinks.Console_ 2.x

To achieve output identical to version 2 of this sink, specify a formatter and output template explicitly:

```csharp
.WriteTo.Console(new MessageTemplateTextFormatter(
"{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level}] {Message}{NewLine}{Exception}",
null))
To configure the console sink with a different theme and include the `SourceContext` in the output, change your `appsettings.json` to:
```json
{
"Serilog": {
"WriteTo": [
{
"Name": "Console",
"Args": {
"theme": "Serilog.Sinks.SystemConsole.Themes.AnsiConsoleTheme::Code, Serilog.Sinks.Console",
"outputTemplate": "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj} <s:{SourceContext}>{NewLine}{Exception}"
}
}
]
}
}
```

This will bypass theming and use Serilog's built-in message template formatting.

### Contributing

Would you like to help make the Serilog console sink even better? We keep a list of issues that are approachable for newcomers under the [up-for-grabs](https://github.com/serilog/serilog-sinks-console/issues?labels=up-for-grabs&state=open) label. Before starting work on a pull request, we suggest commenting on, or raising, an issue on the issue tracker so that we can help and coordinate efforts. For more details check out our [contributing guide](CONTRIBUTING.md).
Expand All @@ -155,7 +168,7 @@ When contributing please keep in mind our [Code of Conduct](CODE_OF_CONDUCT.md).
Branch | AppVeyor | Travis
------------- | ------------- |-------------
dev | [![Build status](https://ci.appveyor.com/api/projects/status/w1w3m1wyk3in1c96/branch/dev?svg=true)](https://ci.appveyor.com/project/serilog/serilog-sinks-console/branch/dev) | [![Build Status](https://travis-ci.org/serilog/serilog-sinks-console.svg?branch=dev)](https://travis-ci.org/serilog/serilog-sinks-console)
master | [![Build status](https://ci.appveyor.com/api/projects/status/w1w3m1wyk3in1c96/branch/master?svg=true)](https://ci.appveyor.com/project/serilog/serilog-sinks-console/branch/master) | [![Build Status](https://travis-ci.org/serilog/serilog-sinks-console.svg?branch=master)](https://travis-ci.org/serilog/serilog-sinks-console)
main | [![Build status](https://ci.appveyor.com/api/projects/status/w1w3m1wyk3in1c96/branch/main?svg=true)](https://ci.appveyor.com/project/serilog/serilog-sinks-console/branch/main) | [![Build Status](https://travis-ci.org/serilog/serilog-sinks-console.svg?branch=main)](https://travis-ci.org/serilog/serilog-sinks-console)


_Copyright &copy; 2017 Serilog Contributors - Provided under the [Apache License, Version 2.0](http://apache.org/licenses/LICENSE-2.0.html)._
_Copyright &copy; Serilog Contributors - Provided under the [Apache License, Version 2.0](http://apache.org/licenses/LICENSE-2.0.html)._
9 changes: 4 additions & 5 deletions appveyor.yml
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
version: '{build}'
skip_tags: true
image: Visual Studio 2017
configuration: Release
image: Visual Studio 2019
test: off
build_script:
- ps: ./Build.ps1
Expand All @@ -10,14 +9,14 @@ artifacts:
deploy:
- provider: NuGet
api_key:
secure: nvZ/z+pMS91b3kG4DgfES5AcmwwGoBYQxr9kp4XiJHj25SAlgdIxFx++1N0lFH2x
secure: rbdBqxBpLt4MkB+mrDOYNDOd8aVZ1zMkysaVNAXNKnC41FYifzX3l9LM8DCrUWU5
skip_symbols: true
on:
branch: /^(master|dev)$/
branch: /^(main|dev)$/
- provider: GitHub
auth_token:
secure: p4LpVhBKxGS5WqucHxFQ5c7C8cP74kbNB0Z8k9Oxx/PMaDQ1+ibmoexNqVU5ZlmX
artifact: /Serilog.*\.nupkg/
tag: v$(appveyor_build_version)
on:
branch: master
branch: main
Binary file added assets/icon.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
9 changes: 4 additions & 5 deletions build.sh
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,14 @@ dotnet --info
dotnet restore

for path in src/**/*.csproj; do
dotnet build -f netstandard1.3 -c Release ${path}
dotnet build -f netcoreapp1.1 -c Release ${path}
dotnet build -f netstandard2.0 -c Release ${path}
done

for path in test/*.Tests/*.csproj; do
dotnet test -f netcoreapp1.1 -c Release ${path}
dotnet test -f netcoreapp2.2 -c Release ${path}
done

for path in sample/ConsoleDemo/*.csproj; do
dotnet build -f netcoreapp1.1 -c Release ${path}
dotnet run -f netcoreapp1.1 --project ${path}
dotnet build -f netcoreapp2.2 -c Release ${path}
dotnet run -f netcoreapp2.2 --project ${path}
done
2 changes: 1 addition & 1 deletion sample/ConsoleDemo/ConsoleDemo.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFrameworks>netcoreapp1.1;net45</TargetFrameworks>
<TargetFrameworks>netcoreapp2.1;netcoreapp2.2;netcoreapp3.0;netcoreapp3.1;net452;net462;net472;net48;net5.0</TargetFrameworks>
</PropertyGroup>

<ItemGroup>
Expand Down
4 changes: 2 additions & 2 deletions sample/ConsoleDemo/Program.cs
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
using Serilog;
using Serilog.Sinks.SystemConsole.Themes;
using System;
using System.Threading;
using Serilog.Sinks.SystemConsole.Themes;

namespace ConsoleDemo
{
public class Program
public static class Program
{
public static void Main()
{
Expand Down
57 changes: 57 additions & 0 deletions sample/SyncWritesDemo/Program.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
using Serilog;
using Serilog.Sinks.SystemConsole.Themes;
using System;
using System.Threading;
using System.Threading.Tasks;

namespace SyncWritesDemo
{
public static class Program
{
public static void Main(string[] args)
{
Console.WriteLine("A sample of how to sync writes to the console sink.");

if (args != null && args.Length == 1)
{
switch (args[0])
{
case "--sync-root-default":
SystemConsoleSyncTest(syncRootForLogger1: null, syncRootForLogger2: null);
return;
case "--sync-root-separate":
SystemConsoleSyncTest(syncRootForLogger1: new object(), syncRootForLogger2: new object());
return;
case "--sync-root-same":
var sameSyncRoot = new object();
SystemConsoleSyncTest(syncRootForLogger1: sameSyncRoot, syncRootForLogger2: sameSyncRoot);
return;
}
}

Console.WriteLine("Expecting one of the following arguments:{0}--sync-root-default{0}--sync-root-separate{0}--sync-root-same", Environment.NewLine);
}

static void SystemConsoleSyncTest(object syncRootForLogger1, object syncRootForLogger2)
{
var logger1 = new LoggerConfiguration()
.MinimumLevel.Verbose()
.Enrich.WithProperty("Logger", "logger1")
.WriteTo.Console(theme: SystemConsoleTheme.Literate, syncRoot: syncRootForLogger1)
.CreateLogger();

var logger2 = new LoggerConfiguration()
.MinimumLevel.Verbose()
.Enrich.WithProperty("Logger", "logger2")
.WriteTo.Console(theme: SystemConsoleTheme.Literate, syncRoot: syncRootForLogger2)
.CreateLogger();

var options = new ParallelOptions { MaxDegreeOfParallelism = 8 };
Parallel.For(0, 1000, options, (i, loopState) =>
{
var logger = (i % 2 == 0) ? logger1 : logger2;
logger.Information("Event {Iteration} generated by {ThreadId}", i, Thread.CurrentThread.ManagedThreadId);
});
}
}
}
12 changes: 12 additions & 0 deletions sample/SyncWritesDemo/SyncWritesDemo.csproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net5.0</TargetFramework>
</PropertyGroup>

<ItemGroup>
<ProjectReference Include="..\..\src\Serilog.Sinks.Console\Serilog.Sinks.Console.csproj" />
</ItemGroup>

</Project>
Loading