Skip to content

Commit

Permalink
OpenHardwareMonitor lib integration part II
Browse files Browse the repository at this point in the history
  • Loading branch information
DevtechProfile committed Jan 18, 2022
1 parent b81f6de commit 1c3a65a
Show file tree
Hide file tree
Showing 64 changed files with 3,135 additions and 2,372 deletions.
16 changes: 15 additions & 1 deletion CapFrameX.sln
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,9 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CapFrameX.CustomInstallerAc
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CapFrameX.Remote", "source\CapFrameX.ApiInterface\CapFrameX.Remote.csproj", "{A692A512-627A-4896-9D2D-4412FDD8C78C}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CapFrameX.SystemInfo.NetStandard", "source\CapFrameX.SystemInfo.NetStandard\CapFrameX.SystemInfo.NetStandard.csproj", "{6CDB7AB8-0A71-4950-8EC3-A5D8F43CB074}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CapFrameX.SystemInfo.NetStandard", "source\CapFrameX.SystemInfo.NetStandard\CapFrameX.SystemInfo.NetStandard.csproj", "{6CDB7AB8-0A71-4950-8EC3-A5D8F43CB074}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CapFrameX.Monitoring.Contracts", "source\CapFrameX.Monitoring.Contracts\CapFrameX.Monitoring.Contracts.csproj", "{2F0D1227-BE4F-4501-B3A2-66A753ED742C}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Expand Down Expand Up @@ -460,6 +462,18 @@ Global
{6CDB7AB8-0A71-4950-8EC3-A5D8F43CB074}.Release|x64.Build.0 = Release|Any CPU
{6CDB7AB8-0A71-4950-8EC3-A5D8F43CB074}.Release|x86.ActiveCfg = Release|Any CPU
{6CDB7AB8-0A71-4950-8EC3-A5D8F43CB074}.Release|x86.Build.0 = Release|Any CPU
{2F0D1227-BE4F-4501-B3A2-66A753ED742C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2F0D1227-BE4F-4501-B3A2-66A753ED742C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2F0D1227-BE4F-4501-B3A2-66A753ED742C}.Debug|x64.ActiveCfg = Debug|Any CPU
{2F0D1227-BE4F-4501-B3A2-66A753ED742C}.Debug|x64.Build.0 = Debug|Any CPU
{2F0D1227-BE4F-4501-B3A2-66A753ED742C}.Debug|x86.ActiveCfg = Debug|Any CPU
{2F0D1227-BE4F-4501-B3A2-66A753ED742C}.Debug|x86.Build.0 = Debug|Any CPU
{2F0D1227-BE4F-4501-B3A2-66A753ED742C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2F0D1227-BE4F-4501-B3A2-66A753ED742C}.Release|Any CPU.Build.0 = Release|Any CPU
{2F0D1227-BE4F-4501-B3A2-66A753ED742C}.Release|x64.ActiveCfg = Release|Any CPU
{2F0D1227-BE4F-4501-B3A2-66A753ED742C}.Release|x64.Build.0 = Release|Any CPU
{2F0D1227-BE4F-4501-B3A2-66A753ED742C}.Release|x86.ActiveCfg = Release|Any CPU
{2F0D1227-BE4F-4501-B3A2-66A753ED742C}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand Down
25 changes: 25 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -206,6 +206,31 @@ This doesn't affect any processes you already have on your list. If our online l
* Report: parameter table
* Synchronization: display changed times(dc), histogram data

# Test application monitoring library
The hardware monitoring library is based on [OpenHardareMonitor](https://github.com/openhardwaremonitor/openhardwaremonitor). It is customized and extended with many additional sensors. If you want to use it in our own projects note the following points.
* Import the projects "OpenHardwareMonitorLib" and "CapFrameX.Monitoring.Contracts"
* Allow unsafe code in the build options of the project "OpenHardwareMonitorLib"
* Implement "IProcessService" (see sample code)
* Install all necessary Nuget packages:

```packages.config
<packages>
<package id="Microsoft.Extensions.Logging.Abstractions" version="5.0.0" targetFramework="net472" />
<package id="Newtonsoft.Json" version="12.0.1" targetFramework="net472" />
<package id="Serilog" version="2.9.0" targetFramework="net472" />
<package id="System.Buffers" version="4.5.1" targetFramework="net472" />
<package id="System.ComponentModel.Annotations" version="4.7.0" targetFramework="net472" />
<package id="System.Memory" version="4.5.4" targetFramework="net472" />
<package id="System.Numerics.Vectors" version="4.5.0" targetFramework="net472" />
<package id="System.Reactive" version="4.3.2" targetFramework="net472" />
<package id="System.Runtime.CompilerServices.Unsafe" version="5.0.0" targetFramework="net472" />
<package id="System.Threading.Tasks.Extensions" version="4.5.4" targetFramework="net472" />
<package id="System.ValueTuple" version="4.5.0" targetFramework="net472" />
</packages>
```

See "MonitoringLibTestApp" example code how to integrate the customized library.

# Requirements
* .NET 4.7.2
* Microsoft Visual C++ Redistributable Package
Expand Down
6 changes: 4 additions & 2 deletions source/CapFrameX.Contracts/CapFrameX.Contracts.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -129,8 +129,6 @@
<Compile Include="Overlay\IOverlayService.cs" />
<Compile Include="RTSS\IRTSSService.cs" />
<Compile Include="Sensor\EHardwareType.cs" />
<Compile Include="Sensor\IProcessService.cs" />
<Compile Include="Sensor\ISensorConfig.cs" />
<Compile Include="Sensor\ISensorEntry.cs" />
<Compile Include="Sensor\ISensorService.cs" />
<Compile Include="Sensor\ISensorEntryProvider.cs" />
Expand All @@ -141,6 +139,10 @@
<Project>{6BE48CF4-C2F0-44CB-95D8-7500A3CB430E}</Project>
<Name>CapFrameX.Data.Session</Name>
</ProjectReference>
<ProjectReference Include="..\CapFrameX.Monitoring.Contracts\CapFrameX.Monitoring.Contracts.csproj">
<Project>{2F0D1227-BE4F-4501-B3A2-66A753ED742C}</Project>
<Name>CapFrameX.Monitoring.Contracts</Name>
</ProjectReference>
<ProjectReference Include="..\CapFrameX.Statistics.NetStandard\CapFrameX.Statistics.NetStandard.csproj">
<Project>{7D35C9C8-6E9A-4ABB-9042-930BE5E26DC6}</Project>
<Name>CapFrameX.Statistics.NetStandard</Name>
Expand Down
2 changes: 1 addition & 1 deletion source/CapFrameX.Contracts/RTSS/IRTSSService.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
using CapFrameX.Contracts.Overlay;
using CapFrameX.Contracts.Sensor;
using CapFrameX.Monitoring.Contracts;
using System;
using System.Threading.Tasks;

Expand Down
4 changes: 4 additions & 0 deletions source/CapFrameX.Data/CapFrameX.Data.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -173,6 +173,10 @@
<Project>{a4559b99-7fcb-40ef-bf97-d293a2b7d6d3}</Project>
<Name>CapFrameX.Extensions</Name>
</ProjectReference>
<ProjectReference Include="..\CapFrameX.Monitoring.Contracts\CapFrameX.Monitoring.Contracts.csproj">
<Project>{2F0D1227-BE4F-4501-B3A2-66A753ED742C}</Project>
<Name>CapFrameX.Monitoring.Contracts</Name>
</ProjectReference>
<ProjectReference Include="..\CapFrameX.PresentMonInterface\CapFrameX.PresentMonInterface.csproj">
<Project>{ADFBAECE-B74F-4A80-87D1-84BC990527B0}</Project>
<Name>CapFrameX.PresentMonInterface</Name>
Expand Down
1 change: 1 addition & 0 deletions source/CapFrameX.Data/CaptureManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
using System.Runtime.InteropServices;
using System.Threading;
using System.Threading.Tasks;
using CapFrameX.Monitoring.Contracts;

namespace CapFrameX.Data
{
Expand Down
1 change: 0 additions & 1 deletion source/CapFrameX.Extensions/CapFrameX.Extensions.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,6 @@
<ItemGroup>
<Compile Include="CollectionExtensions.cs" />
<Compile Include="ContainerExtensions.cs" />
<Compile Include="FileExtensions.cs" />
<Compile Include="HttpRequestHeadersExtensions.cs" />
<Compile Include="LinqExtensions.cs" />
<Compile Include="ObjectCopier.cs" />
Expand Down
25 changes: 0 additions & 25 deletions source/CapFrameX.Extensions/FileExtensions.cs

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{2F0D1227-BE4F-4501-B3A2-66A753ED742C}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>CapFrameX.Monitoring.Contracts</RootNamespace>
<AssemblyName>CapFrameX.Monitoring.Contracts</AssemblyName>
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<Deterministic>true</Deterministic>
</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>
<PlatformTarget>x64</PlatformTarget>
</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.Reactive, Version=4.3.0.0, Culture=neutral, PublicKeyToken=94bc3704cddfc263, processorArchitecture=MSIL">
<HintPath>..\MonitoringLibTestApp\ConsoleApp1\packages\System.Reactive.4.3.2\lib\net46\System.Reactive.dll</HintPath>
</Reference>
<Reference Include="System.Runtime.CompilerServices.Unsafe, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\MonitoringLibTestApp\ConsoleApp1\packages\System.Runtime.CompilerServices.Unsafe.5.0.0\lib\net45\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
</Reference>
<Reference Include="System.Threading.Tasks.Extensions, Version=4.2.0.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\MonitoringLibTestApp\ConsoleApp1\packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll</HintPath>
</Reference>
<Reference Include="System.ValueTuple, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\MonitoringLibTestApp\ConsoleApp1\packages\System.ValueTuple.4.5.0\lib\net47\System.ValueTuple.dll</HintPath>
</Reference>
<Reference Include="System.Windows" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Xml" />
<Reference Include="WindowsBase" />
</ItemGroup>
<ItemGroup>
<Compile Include="IProcessService.cs" />
<Compile Include="ISensorConfig.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
<None Include="packages.config" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
using System.Reactive.Subjects;

namespace CapFrameX.Contracts.Sensor
namespace CapFrameX.Monitoring.Contracts
{
public interface IProcessService
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
using System.Threading.Tasks;

namespace CapFrameX.Contracts.Sensor
namespace CapFrameX.Monitoring.Contracts
{
public interface ISensorConfig
{
Expand Down
36 changes: 36 additions & 0 deletions source/CapFrameX.Monitoring.Contracts/Properties/AssemblyInfo.cs
Original file line number Diff line number Diff line change
@@ -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("CapFrameX.Monitoring.Contracts")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("CapFrameX.Monitoring.Contracts")]
[assembly: AssemblyCopyright("Copyright © 2022")]
[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("2f0d1227-be4f-4501-b3a2-66a753ed742c")]

// 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")]
11 changes: 11 additions & 0 deletions source/CapFrameX.Monitoring.Contracts/app.config
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="5.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
7 changes: 7 additions & 0 deletions source/CapFrameX.Monitoring.Contracts/packages.config
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="System.Reactive" version="4.3.2" targetFramework="net472" />
<package id="System.Runtime.CompilerServices.Unsafe" version="5.0.0" targetFramework="net472" />
<package id="System.Threading.Tasks.Extensions" version="4.5.4" targetFramework="net472" />
<package id="System.ValueTuple" version="4.5.0" targetFramework="net472" />
</packages>
4 changes: 4 additions & 0 deletions source/CapFrameX.Overlay/CapFrameX.Overlay.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,10 @@
<Project>{a4559b99-7fcb-40ef-bf97-d293a2b7d6d3}</Project>
<Name>CapFrameX.Extensions</Name>
</ProjectReference>
<ProjectReference Include="..\CapFrameX.Monitoring.Contracts\CapFrameX.Monitoring.Contracts.csproj">
<Project>{2F0D1227-BE4F-4501-B3A2-66A753ED742C}</Project>
<Name>CapFrameX.Monitoring.Contracts</Name>
</ProjectReference>
<ProjectReference Include="..\CapFrameX.PresentMonInterface\CapFrameX.PresentMonInterface.csproj">
<Project>{ADFBAECE-B74F-4A80-87D1-84BC990527B0}</Project>
<Name>CapFrameX.PresentMonInterface</Name>
Expand Down
2 changes: 1 addition & 1 deletion source/CapFrameX.Overlay/OverlayEntryProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
using CapFrameX.Contracts.Sensor;
using CapFrameX.EventAggregation.Messages;
using CapFrameX.Extensions;
using CapFrameX.Monitoring.Contracts;
using CapFrameX.PresentMonInterface;
using CapFrameX.Statistics.NetStandard.Contracts;
using Microsoft.Extensions.Logging;
Expand All @@ -13,7 +14,6 @@
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Linq;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,10 @@
<Project>{4C3B8B5C-54D7-46A1-91A1-32BF82FD42CD}</Project>
<Name>CapFrameX.Contracts</Name>
</ProjectReference>
<ProjectReference Include="..\CapFrameX.Monitoring.Contracts\CapFrameX.Monitoring.Contracts.csproj">
<Project>{2F0D1227-BE4F-4501-B3A2-66A753ED742C}</Project>
<Name>CapFrameX.Monitoring.Contracts</Name>
</ProjectReference>
<ProjectReference Include="..\CapFrameX.RTSSInterface\CapFrameX.RTSSInterface.vcxproj">
<Project>{9c46d3f3-72e0-4e6c-ad3e-54a5ee121475}</Project>
<Name>CapFrameX.RTSSInterface</Name>
Expand Down
4 changes: 4 additions & 0 deletions source/CapFrameX.Sensor/CapFrameX.Sensor.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,10 @@
<Project>{a4559b99-7fcb-40ef-bf97-d293a2b7d6d3}</Project>
<Name>CapFrameX.Extensions</Name>
</ProjectReference>
<ProjectReference Include="..\CapFrameX.Monitoring.Contracts\CapFrameX.Monitoring.Contracts.csproj">
<Project>{2F0D1227-BE4F-4501-B3A2-66A753ED742C}</Project>
<Name>CapFrameX.Monitoring.Contracts</Name>
</ProjectReference>
<ProjectReference Include="..\CapFrameX.Overlay\CapFrameX.Overlay.csproj">
<Project>{624777C2-6AF6-46D5-A019-1285F699B8A7}</Project>
<Name>CapFrameX.Overlay</Name>
Expand Down
1 change: 1 addition & 0 deletions source/CapFrameX.Sensor/SensorEntryProvider.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using CapFrameX.Contracts.Sensor;
using CapFrameX.Extensions;
using CapFrameX.Monitoring.Contracts;
using OpenHardwareMonitor.Hardware;
using System;
using System.Collections.Generic;
Expand Down
1 change: 1 addition & 0 deletions source/CapFrameX.Sensor/SensorService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using CapFrameX.Contracts.RTSS;
using CapFrameX.Contracts.Sensor;
using CapFrameX.Data.Session.Contracts;
using CapFrameX.Monitoring.Contracts;
using Microsoft.Extensions.Logging;
using OpenHardwareMonitor.Hardware;
using System;
Expand Down
4 changes: 4 additions & 0 deletions source/CapFrameX.Test/CapFrameX.Test.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,10 @@
<Project>{a4559b99-7fcb-40ef-bf97-d293a2b7d6d3}</Project>
<Name>CapFrameX.Extensions</Name>
</ProjectReference>
<ProjectReference Include="..\CapFrameX.Monitoring.Contracts\CapFrameX.Monitoring.Contracts.csproj">
<Project>{2F0D1227-BE4F-4501-B3A2-66A753ED742C}</Project>
<Name>CapFrameX.Monitoring.Contracts</Name>
</ProjectReference>
<ProjectReference Include="..\CapFrameX.Overlay\CapFrameX.Overlay.csproj">
<Project>{624777C2-6AF6-46D5-A019-1285F699B8A7}</Project>
<Name>CapFrameX.Overlay</Name>
Expand Down
4 changes: 4 additions & 0 deletions source/CapFrameX.ViewModel/CapFrameX.ViewModel.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -252,6 +252,10 @@
<Project>{B033A95B-C385-4A33-8992-2872DF979ECD}</Project>
<Name>CapFrameX.Hotkey</Name>
</ProjectReference>
<ProjectReference Include="..\CapFrameX.Monitoring.Contracts\CapFrameX.Monitoring.Contracts.csproj">
<Project>{2F0D1227-BE4F-4501-B3A2-66A753ED742C}</Project>
<Name>CapFrameX.Monitoring.Contracts</Name>
</ProjectReference>
<ProjectReference Include="..\CapFrameX.MVVM\CapFrameX.MVVM.csproj">
<Project>{cfb57d81-1886-45d2-aa16-ede1dd17a9ca}</Project>
<Name>CapFrameX.MVVM</Name>
Expand Down
2 changes: 1 addition & 1 deletion source/CapFrameX.ViewModel/CaptureViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.Globalization;
using System.Linq;
using System.Reactive.Linq;
Expand All @@ -31,6 +30,7 @@
using OxyPlot.Legends;
using CapFrameX.Overlay;
using CapFrameX.Extensions.NetStandard;
using CapFrameX.Monitoring.Contracts;

namespace CapFrameX.ViewModel
{
Expand Down
Loading

0 comments on commit 1c3a65a

Please sign in to comment.