Skip to content

Commit

Permalink
Merge branch 'identify-graph-root' into main
Browse files Browse the repository at this point in the history
  • Loading branch information
0xced committed Aug 30, 2024
2 parents 59600aa + e1600a4 commit d1688be
Show file tree
Hide file tree
Showing 16 changed files with 164 additions and 92 deletions.
18 changes: 18 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,24 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
</ItemGroup>
```

* The dependency graph roots (i.e. direct package and project references) are now identified with an hexagon shape and stronger borders.

```mermaid
graph
classDef root stroke-width:4px
classDef default fill:aquamarine,stroke:#009061,color:#333333
classDef removed fill:lightcoral,stroke:#A42A2A
Azure.Identity --> Azure.Core
Microsoft.Data.SqlClient{{Microsoft.Data.SqlClient}} --> Azure.Identity
class Azure.Core removed
class Azure.Identity removed
class Microsoft.Data.SqlClient root
class Microsoft.Data.SqlClient default
```

## [1.0.0][1.0.0] - 2024-04-12

* Fix a crash when MSBuild is running on the desktop .NET Framework
Expand Down
67 changes: 35 additions & 32 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,7 @@ Specifying the _direct_ dependencies is enough. Looking at the produced graph co
```mermaid
graph LR
classDef root stroke-width:4px
classDef default fill:aquamarine,stroke:#009061,color:#333333
classDef removed fill:lightcoral,stroke:#A42A2A
Expand All @@ -100,19 +101,19 @@ DnsClient/1.6.1 --> Microsoft.Win32.Registry/5.0.0
Microsoft.Extensions.Logging.Abstractions/8.0.1 --> Microsoft.Extensions.DependencyInjection.Abstractions/8.0.1
Microsoft.Win32.Registry/5.0.0 --> System.Security.AccessControl/5.0.0
Microsoft.Win32.Registry/5.0.0 --> System.Security.Principal.Windows/5.0.0
MongoDB.Bson/2.24.0 --> System.Runtime.CompilerServices.Unsafe/6.0.0
MongoDB.Driver/2.24.0 --> Microsoft.Extensions.Logging.Abstractions/8.0.1
MongoDB.Driver/2.24.0 --> MongoDB.Bson/2.24.0
MongoDB.Driver/2.24.0 --> MongoDB.Driver.Core/2.24.0
MongoDB.Driver/2.24.0 --> MongoDB.Libmongocrypt/1.8.2
MongoDB.Driver.Core/2.24.0 --> AWSSDK.SecurityToken/3.7.100.14
MongoDB.Driver.Core/2.24.0 --> DnsClient/1.6.1
MongoDB.Driver.Core/2.24.0 --> Microsoft.Extensions.Logging.Abstractions/8.0.1
MongoDB.Driver.Core/2.24.0 --> MongoDB.Bson/2.24.0
MongoDB.Driver.Core/2.24.0 --> MongoDB.Libmongocrypt/1.8.2
MongoDB.Driver.Core/2.24.0 --> SharpCompress/0.30.1
MongoDB.Driver.Core/2.24.0 --> Snappier/1.0.0
MongoDB.Driver.Core/2.24.0 --> ZstdSharp.Port/0.7.3
MongoDB.Bson/2.28.0 --> System.Runtime.CompilerServices.Unsafe/5.0.0
MongoDB.Driver/2.28.0{{MongoDB.Driver/2.28.0}} --> Microsoft.Extensions.Logging.Abstractions/8.0.1
MongoDB.Driver/2.28.0{{MongoDB.Driver/2.28.0}} --> MongoDB.Bson/2.28.0
MongoDB.Driver/2.28.0{{MongoDB.Driver/2.28.0}} --> MongoDB.Driver.Core/2.28.0
MongoDB.Driver/2.28.0{{MongoDB.Driver/2.28.0}} --> MongoDB.Libmongocrypt/1.11.0
MongoDB.Driver.Core/2.28.0 --> AWSSDK.SecurityToken/3.7.100.14
MongoDB.Driver.Core/2.28.0 --> DnsClient/1.6.1
MongoDB.Driver.Core/2.28.0 --> Microsoft.Extensions.Logging.Abstractions/8.0.1
MongoDB.Driver.Core/2.28.0 --> MongoDB.Bson/2.28.0
MongoDB.Driver.Core/2.28.0 --> MongoDB.Libmongocrypt/1.11.0
MongoDB.Driver.Core/2.28.0 --> SharpCompress/0.30.1
MongoDB.Driver.Core/2.28.0 --> Snappier/1.0.0
MongoDB.Driver.Core/2.28.0 --> ZstdSharp.Port/0.7.3
System.Security.AccessControl/5.0.0 --> System.Security.Principal.Windows/5.0.0
class AWSSDK.Core/3.7.100.14 removed
Expand All @@ -121,13 +122,14 @@ class DnsClient/1.6.1 default
class Microsoft.Extensions.DependencyInjection.Abstractions/8.0.1 default
class Microsoft.Extensions.Logging.Abstractions/8.0.1 default
class Microsoft.Win32.Registry/5.0.0 default
class MongoDB.Bson/2.24.0 default
class MongoDB.Driver/2.24.0 default
class MongoDB.Driver.Core/2.24.0 default
class MongoDB.Libmongocrypt/1.8.2 default
class MongoDB.Bson/2.28.0 default
class MongoDB.Driver/2.28.0 root
class MongoDB.Driver/2.28.0 default
class MongoDB.Driver.Core/2.28.0 default
class MongoDB.Libmongocrypt/1.11.0 default
class SharpCompress/0.30.1 default
class Snappier/1.0.0 default
class System.Runtime.CompilerServices.Unsafe/6.0.0 default
class System.Runtime.CompilerServices.Unsafe/5.0.0 default
class System.Security.AccessControl/5.0.0 default
class System.Security.Principal.Windows/5.0.0 default
class ZstdSharp.Port/0.7.3 default
Expand All @@ -154,11 +156,13 @@ As with the MongoDB driver, specifying the three _direct_ dependencies is enough
```mermaid
graph LR
classDef root stroke-width:4px
classDef default fill:aquamarine,stroke:#009061,color:#333333
classDef project fill:skyblue,stroke:#05587C
classDef removed fill:lightcoral,stroke:#A42A2A
Azure.Core --> Microsoft.Bcl.AsyncInterfaces
Azure.Core --> System.ClientModel
Azure.Core --> System.Diagnostics.DiagnosticSource
Azure.Core --> System.Memory.Data
Azure.Core --> System.Text.Encodings.Web
Expand All @@ -168,15 +172,15 @@ Azure.Identity --> Microsoft.Identity.Client
Azure.Identity --> Microsoft.Identity.Client.Extensions.Msal
Azure.Identity --> System.Security.Cryptography.ProtectedData
Azure.Identity --> System.Text.Json
Microsoft.Data.SqlClient --> Azure.Identity
Microsoft.Data.SqlClient --> Microsoft.Identity.Client
Microsoft.Data.SqlClient --> Microsoft.IdentityModel.JsonWebTokens
Microsoft.Data.SqlClient --> Microsoft.IdentityModel.Protocols.OpenIdConnect
Microsoft.Data.SqlClient --> Microsoft.SqlServer.Server
Microsoft.Data.SqlClient --> System.Configuration.ConfigurationManager
Microsoft.Data.SqlClient --> System.Runtime.Caching
Microsoft.Data.SqlClient{{Microsoft.Data.SqlClient}} --> Azure.Identity
Microsoft.Data.SqlClient{{Microsoft.Data.SqlClient}} --> Microsoft.Identity.Client
Microsoft.Data.SqlClient{{Microsoft.Data.SqlClient}} --> Microsoft.IdentityModel.JsonWebTokens
Microsoft.Data.SqlClient{{Microsoft.Data.SqlClient}} --> Microsoft.IdentityModel.Protocols.OpenIdConnect
Microsoft.Data.SqlClient{{Microsoft.Data.SqlClient}} --> Microsoft.SqlServer.Server
Microsoft.Data.SqlClient{{Microsoft.Data.SqlClient}} --> System.Configuration.ConfigurationManager
Microsoft.Data.SqlClient{{Microsoft.Data.SqlClient}} --> System.Runtime.Caching
Microsoft.Identity.Client{{Microsoft.Identity.Client}}
Microsoft.Identity.Client.Extensions.Msal --> Microsoft.Identity.Client
Microsoft.Identity.Client.Extensions.Msal --> System.IO.FileSystem.AccessControl
Microsoft.Identity.Client.Extensions.Msal --> System.Security.Cryptography.ProtectedData
Microsoft.IdentityModel.JsonWebTokens --> Microsoft.IdentityModel.Tokens
Microsoft.IdentityModel.JsonWebTokens --> System.Text.Encodings.Web
Expand All @@ -188,22 +192,23 @@ Microsoft.IdentityModel.Protocols.OpenIdConnect --> Microsoft.IdentityModel.Prot
Microsoft.IdentityModel.Protocols.OpenIdConnect --> System.IdentityModel.Tokens.Jwt
Microsoft.IdentityModel.Tokens --> Microsoft.IdentityModel.Logging
Microsoft.IdentityModel.Tokens --> System.Security.Cryptography.Cng
System.ClientModel --> System.Memory.Data
System.ClientModel --> System.Text.Json
System.Configuration.ConfigurationManager --> System.Diagnostics.EventLog
System.Configuration.ConfigurationManager --> System.Security.Cryptography.ProtectedData
System.Diagnostics.DiagnosticSource --> System.Runtime.CompilerServices.Unsafe
System.IdentityModel.Tokens.Jwt --> Microsoft.IdentityModel.JsonWebTokens
System.IdentityModel.Tokens.Jwt --> Microsoft.IdentityModel.Tokens
System.IO.FileSystem.AccessControl --> System.Security.AccessControl
System.IO.FileSystem.AccessControl --> System.Security.Principal.Windows
System.Memory.Data --> System.Text.Encodings.Web
System.Memory.Data --> System.Text.Json
System.Runtime.Caching --> System.Configuration.ConfigurationManager
System.Security.AccessControl --> System.Security.Principal.Windows
class Azure.Core removed
class Azure.Identity removed
class Microsoft.Bcl.AsyncInterfaces removed
class Microsoft.Data.SqlClient root
class Microsoft.Data.SqlClient default
class Microsoft.Identity.Client root
class Microsoft.Identity.Client project
class Microsoft.Identity.Client.Extensions.Msal removed
class Microsoft.IdentityModel.Abstractions removed
Expand All @@ -213,18 +218,16 @@ class Microsoft.IdentityModel.Protocols removed
class Microsoft.IdentityModel.Protocols.OpenIdConnect removed
class Microsoft.IdentityModel.Tokens removed
class Microsoft.SqlServer.Server default
class System.ClientModel removed
class System.Configuration.ConfigurationManager default
class System.Diagnostics.DiagnosticSource removed
class System.Diagnostics.EventLog default
class System.IdentityModel.Tokens.Jwt removed
class System.IO.FileSystem.AccessControl removed
class System.Memory.Data removed
class System.Runtime.Caching default
class System.Runtime.CompilerServices.Unsafe removed
class System.Security.AccessControl removed
class System.Security.Cryptography.Cng removed
class System.Security.Cryptography.ProtectedData default
class System.Security.Principal.Windows removed
class System.Text.Encodings.Web removed
class System.Text.Json removed
```
Expand Down
19 changes: 17 additions & 2 deletions src/Chisel/GraphWriter.Graphviz.cs
Original file line number Diff line number Diff line change
Expand Up @@ -40,10 +40,25 @@ protected override void WriteNode(Package package, GraphOptions options)
PackageState.Remove => options.Color.Removed,
_ => package.IsProjectReference ? options.Color.Project : (Color?)null,
};
if (color.HasValue)

if (package.IsRoot || color.HasValue)
{
Writer.Write($" [ {Color(color.Value)} ]");
Writer.Write(" [");
if (package.IsRoot)
{
Writer.Write(" shape = hexagon, penwidth = 4");
}
if (color.HasValue)
{
if (package.IsRoot)
{
Writer.Write(',');
}
Writer.Write($" {Color(color.Value)}");
}
Writer.Write(" ]");
}

Writer.WriteLine();
}

Expand Down
12 changes: 10 additions & 2 deletions src/Chisel/GraphWriter.Mermaid.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ protected override void WriteHeader(bool hasProject, bool hasIgnored, bool hasRe
Writer.WriteLine();

Writer.WriteLine();
Writer.WriteLine("classDef root stroke-width:4px");
Writer.WriteLine(ClassDef("default", options.Color.Default));
if (hasProject)
Writer.WriteLine(ClassDef("project", options.Color.Project));
Expand All @@ -40,11 +41,16 @@ protected override void WriteFooter()

protected override void WriteRoot(Package package, GraphOptions options)
{
Writer.WriteLine($"{GetPackageId(package, options)}");
var packageId = GetPackageId(package, options);
Writer.WriteLine($"{packageId}{{{{{packageId}}}}}");
}

protected override void WriteNode(Package package, GraphOptions options)
{
if (package.IsRoot)
{
Writer.WriteLine($"class {GetPackageId(package, options)} root");
}
var className = package.State switch
{
PackageState.Ignore => "ignored",
Expand All @@ -56,6 +62,8 @@ protected override void WriteNode(Package package, GraphOptions options)

protected override void WriteEdge(Package package, Package dependency, GraphOptions options)
{
Writer.WriteLine($"{GetPackageId(package, options)} --> {GetPackageId(dependency, options)}");
var packageId = GetPackageId(package, options);
var source = package.IsRoot ? $"{packageId}{{{{{packageId}}}}}" : packageId;
Writer.WriteLine($"{source} --> {GetPackageId(dependency, options)}");
}
}
4 changes: 4 additions & 0 deletions src/Chisel/LockFileExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,10 @@ public static (IReadOnlyDictionary<string, Package> Packages, IReadOnlyCollectio
var projectDependencies = lockFile.ProjectFileDependencyGroups.Where(e => e.FrameworkName == frameworkName).SelectMany(e => e.Dependencies).Select(ParseProjectFileDependency);
var packageDependencies = framework.Dependencies.Select(e => e.Name);
var roots = new HashSet<Package>(projectDependencies.Concat(packageDependencies).Where(e => packages.ContainsKey(e)).Select(e => packages[e]));
foreach (var root in roots)
{
root.IsRoot = true;
}
return (packages, roots);
}

Expand Down
2 changes: 2 additions & 0 deletions src/Chisel/Package.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ internal sealed class Package(string name, NuGetVersion version, bool isProjectR
public bool IsProjectReference { get; } = isProjectReference;
public IReadOnlyCollection<Dependency> Dependencies { get; } = dependencies;

public bool IsRoot { get; set; }

public PackageState State { get; set; } = PackageState.Keep;

public override string ToString() => Name;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

graph LR

classDef root stroke-width:4px
classDef default fill:aquamarine,stroke:#009061,color:#333333
classDef removed fill:lightcoral,stroke:#A42A2A

Expand All @@ -16,15 +17,15 @@ Azure.Identity/1.11.4 --> Microsoft.Identity.Client/4.61.3
Azure.Identity/1.11.4 --> Microsoft.Identity.Client.Extensions.Msal/4.61.3
Azure.Identity/1.11.4 --> System.Security.Cryptography.ProtectedData/8.0.0
Azure.Identity/1.11.4 --> System.Text.Json/8.0.4
Microsoft.Data.SqlClient/5.2.2 --> Azure.Identity/1.11.4
Microsoft.Data.SqlClient/5.2.2 --> Microsoft.Identity.Client/4.61.3
Microsoft.Data.SqlClient/5.2.2 --> Microsoft.IdentityModel.JsonWebTokens/6.35.0
Microsoft.Data.SqlClient/5.2.2 --> Microsoft.IdentityModel.Protocols.OpenIdConnect/6.35.0
Microsoft.Data.SqlClient/5.2.2 --> Microsoft.SqlServer.Server/1.0.0
Microsoft.Data.SqlClient/5.2.2 --> System.Configuration.ConfigurationManager/8.0.0
Microsoft.Data.SqlClient/5.2.2 --> System.Runtime.Caching/8.0.0
Microsoft.Extensions.DependencyModel/8.0.1 --> System.Text.Encodings.Web/8.0.0
Microsoft.Extensions.DependencyModel/8.0.1 --> System.Text.Json/8.0.4
Microsoft.Data.SqlClient/5.2.2{{Microsoft.Data.SqlClient/5.2.2}} --> Azure.Identity/1.11.4
Microsoft.Data.SqlClient/5.2.2{{Microsoft.Data.SqlClient/5.2.2}} --> Microsoft.Identity.Client/4.61.3
Microsoft.Data.SqlClient/5.2.2{{Microsoft.Data.SqlClient/5.2.2}} --> Microsoft.IdentityModel.JsonWebTokens/6.35.0
Microsoft.Data.SqlClient/5.2.2{{Microsoft.Data.SqlClient/5.2.2}} --> Microsoft.IdentityModel.Protocols.OpenIdConnect/6.35.0
Microsoft.Data.SqlClient/5.2.2{{Microsoft.Data.SqlClient/5.2.2}} --> Microsoft.SqlServer.Server/1.0.0
Microsoft.Data.SqlClient/5.2.2{{Microsoft.Data.SqlClient/5.2.2}} --> System.Configuration.ConfigurationManager/8.0.0
Microsoft.Data.SqlClient/5.2.2{{Microsoft.Data.SqlClient/5.2.2}} --> System.Runtime.Caching/8.0.0
Microsoft.Extensions.DependencyModel/8.0.1{{Microsoft.Extensions.DependencyModel/8.0.1}} --> System.Text.Encodings.Web/8.0.0
Microsoft.Extensions.DependencyModel/8.0.1{{Microsoft.Extensions.DependencyModel/8.0.1}} --> System.Text.Json/8.0.4
Microsoft.Identity.Client/4.61.3 --> Microsoft.IdentityModel.Abstractions/6.35.0
Microsoft.Identity.Client/4.61.3 --> System.Diagnostics.DiagnosticSource/6.0.1
Microsoft.Identity.Client.Extensions.Msal/4.61.3 --> Microsoft.Identity.Client/4.61.3
Expand Down Expand Up @@ -54,7 +55,9 @@ System.Text.Json/8.0.4 --> System.Text.Encodings.Web/8.0.0
class Azure.Core/1.38.0 removed
class Azure.Identity/1.11.4 removed
class Microsoft.Bcl.AsyncInterfaces/1.1.1 removed
class Microsoft.Data.SqlClient/5.2.2 root
class Microsoft.Data.SqlClient/5.2.2 default
class Microsoft.Extensions.DependencyModel/8.0.1 root
class Microsoft.Extensions.DependencyModel/8.0.1 default
class Microsoft.Identity.Client/4.61.3 default
class Microsoft.Identity.Client.Extensions.Msal/4.61.3 removed
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

graph LR

classDef root stroke-width:4px
classDef default fill:aquamarine,stroke:#009061,color:#333333
classDef removed fill:lightcoral,stroke:#A42A2A

Expand All @@ -16,16 +17,16 @@ Azure.Identity/1.11.4 --> Microsoft.Identity.Client/4.61.3
Azure.Identity/1.11.4 --> Microsoft.Identity.Client.Extensions.Msal/4.61.3
Azure.Identity/1.11.4 --> System.Security.Cryptography.ProtectedData/8.0.0
Azure.Identity/1.11.4 --> System.Text.Json/8.0.4
Microsoft.Data.SqlClient/5.2.2 --> Azure.Identity/1.11.4
Microsoft.Data.SqlClient/5.2.2 --> Microsoft.Data.SqlClient.SNI.runtime/5.2.0
Microsoft.Data.SqlClient/5.2.2 --> Microsoft.Identity.Client/4.61.3
Microsoft.Data.SqlClient/5.2.2 --> Microsoft.IdentityModel.JsonWebTokens/6.35.0
Microsoft.Data.SqlClient/5.2.2 --> Microsoft.IdentityModel.Protocols.OpenIdConnect/6.35.0
Microsoft.Data.SqlClient/5.2.2 --> Microsoft.SqlServer.Server/1.0.0
Microsoft.Data.SqlClient/5.2.2 --> System.Configuration.ConfigurationManager/8.0.0
Microsoft.Data.SqlClient/5.2.2 --> System.Runtime.Caching/8.0.0
Microsoft.Extensions.DependencyModel/8.0.1 --> System.Text.Encodings.Web/8.0.0
Microsoft.Extensions.DependencyModel/8.0.1 --> System.Text.Json/8.0.4
Microsoft.Data.SqlClient/5.2.2{{Microsoft.Data.SqlClient/5.2.2}} --> Azure.Identity/1.11.4
Microsoft.Data.SqlClient/5.2.2{{Microsoft.Data.SqlClient/5.2.2}} --> Microsoft.Data.SqlClient.SNI.runtime/5.2.0
Microsoft.Data.SqlClient/5.2.2{{Microsoft.Data.SqlClient/5.2.2}} --> Microsoft.Identity.Client/4.61.3
Microsoft.Data.SqlClient/5.2.2{{Microsoft.Data.SqlClient/5.2.2}} --> Microsoft.IdentityModel.JsonWebTokens/6.35.0
Microsoft.Data.SqlClient/5.2.2{{Microsoft.Data.SqlClient/5.2.2}} --> Microsoft.IdentityModel.Protocols.OpenIdConnect/6.35.0
Microsoft.Data.SqlClient/5.2.2{{Microsoft.Data.SqlClient/5.2.2}} --> Microsoft.SqlServer.Server/1.0.0
Microsoft.Data.SqlClient/5.2.2{{Microsoft.Data.SqlClient/5.2.2}} --> System.Configuration.ConfigurationManager/8.0.0
Microsoft.Data.SqlClient/5.2.2{{Microsoft.Data.SqlClient/5.2.2}} --> System.Runtime.Caching/8.0.0
Microsoft.Extensions.DependencyModel/8.0.1{{Microsoft.Extensions.DependencyModel/8.0.1}} --> System.Text.Encodings.Web/8.0.0
Microsoft.Extensions.DependencyModel/8.0.1{{Microsoft.Extensions.DependencyModel/8.0.1}} --> System.Text.Json/8.0.4
Microsoft.Identity.Client/4.61.3 --> Microsoft.IdentityModel.Abstractions/6.35.0
Microsoft.Identity.Client/4.61.3 --> System.Diagnostics.DiagnosticSource/6.0.1
Microsoft.Identity.Client.Extensions.Msal/4.61.3 --> Microsoft.Identity.Client/4.61.3
Expand Down Expand Up @@ -55,8 +56,10 @@ System.Text.Json/8.0.4 --> System.Text.Encodings.Web/8.0.0
class Azure.Core/1.38.0 removed
class Azure.Identity/1.11.4 removed
class Microsoft.Bcl.AsyncInterfaces/1.1.1 removed
class Microsoft.Data.SqlClient/5.2.2 root
class Microsoft.Data.SqlClient/5.2.2 default
class Microsoft.Data.SqlClient.SNI.runtime/5.2.0 default
class Microsoft.Extensions.DependencyModel/8.0.1 root
class Microsoft.Extensions.DependencyModel/8.0.1 default
class Microsoft.Identity.Client/4.61.3 default
class Microsoft.Identity.Client.Extensions.Msal/4.61.3 removed
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,13 +27,13 @@ digraph

"AWSSDK.Core" [ fillcolor = lightcoral, color = "#A42A2A" ]
"AWSSDK.SecurityToken" [ fillcolor = lightcoral, color = "#A42A2A" ]
"ByteSize"
"ByteSize" [ shape = hexagon, penwidth = 4 ]
"DnsClient"
"Microsoft.Extensions.DependencyInjection.Abstractions"
"Microsoft.Extensions.Logging.Abstractions"
"Microsoft.Extensions.Logging.Abstractions" [ shape = hexagon, penwidth = 4 ]
"Microsoft.Win32.Registry"
"MongoDB.Bson"
"MongoDB.Driver"
"MongoDB.Driver" [ shape = hexagon, penwidth = 4 ]
"MongoDB.Driver.Core"
"MongoDB.Libmongocrypt"
"SharpCompress"
Expand Down
Loading

0 comments on commit d1688be

Please sign in to comment.