Permalink
Browse files

Added new Retail PoC application for Csharp and Python tensorflow. Bu…

…g fixes on the RLM core. Removed the bin and obj files that was erroneously committed. New and updated queries for the rlm visualizer. Optimizations for the RLM the load network.
  • Loading branch information...
randolph-useaible committed Nov 6, 2017
1 parent 5fba930 commit e72ed20c455b8272affb0a6038bd0d722d8da846
Showing with 7,122 additions and 66,062 deletions.
  1. +383 −158 Core/RLM/RLM.Database/RlmDbMgr.cs
  2. +23 −11 Core/RLM/RLM.Memory/Manager.cs
  3. +17 −0 Core/RLM/RLM.Models/Models/Archives/RlmLearnedSession.cs
  4. +1 −1 Core/RLM/RLM.Models/Models/EF/Rneuron.cs
  5. +5 −1 Core/RLM/RLM.Models/Models/LoadRnetworkResult.cs
  6. +1 −0 Core/RLM/RLM.Models/RLM.Models.csproj
  7. +55 −15 Core/RLM/RLM/RlmNetwork.cs
  8. +1 −1 Core/RLM/RLM/RlmNetworkLegacy.cs
  9. +163 −14 Core/RLM/RLM/RlmSessionCaseHistory.cs
  10. BIN ExampleApps/CSharp/RetailPoC 2.0/Installers/RetailPoCIBMSetup.msi
  11. BIN ExampleApps/CSharp/RetailPoC 2.0/Installers/setup.exe
  12. +38 −0 ExampleApps/CSharp/RetailPoC 2.0/RetailPoC20/App.config
  13. +39 −0 ExampleApps/CSharp/RetailPoC 2.0/RetailPoC20/App.xaml
  14. +37 −0 ExampleApps/CSharp/RetailPoC 2.0/RetailPoC20/App.xaml.cs
  15. +117 −0 ExampleApps/CSharp/RetailPoC 2.0/RetailPoC20/DataGeneration/DataFactory.cs
  16. +349 −0 ExampleApps/CSharp/RetailPoC 2.0/RetailPoC20/DataGeneration/MockData.cs
  17. +33 −0 ExampleApps/CSharp/RetailPoC 2.0/RetailPoC20/DataPanel.xaml
  18. +175 −0 ExampleApps/CSharp/RetailPoC 2.0/RetailPoC20/DataPanel.xaml.cs
  19. +14 −0 ExampleApps/CSharp/RetailPoC 2.0/RetailPoC20/Design/projectGuides.guides
  20. +97 −0 ExampleApps/CSharp/RetailPoC 2.0/RetailPoC20/EngineTrainingWindow.xaml
  21. +64 −0 ExampleApps/CSharp/RetailPoC 2.0/RetailPoC20/EngineTrainingWindow.xaml.cs
  22. BIN ExampleApps/CSharp/RetailPoC 2.0/RetailPoC20/Fonts/Oswald-Bold.ttf
  23. BIN ExampleApps/CSharp/RetailPoC 2.0/RetailPoC20/Fonts/Oswald-ExtraLight.ttf
  24. BIN ExampleApps/CSharp/RetailPoC 2.0/RetailPoC20/Fonts/Oswald-Light.ttf
  25. BIN ExampleApps/CSharp/RetailPoC 2.0/RetailPoC20/Fonts/Oswald-Medium.ttf
  26. BIN ExampleApps/CSharp/RetailPoC 2.0/RetailPoC20/Fonts/Oswald-Regular.ttf
  27. BIN ExampleApps/CSharp/RetailPoC 2.0/RetailPoC20/Fonts/Oswald-SemiBold.ttf
  28. BIN ExampleApps/CSharp/RetailPoC 2.0/RetailPoC20/Img/Flowchart.png
  29. BIN ExampleApps/CSharp/RetailPoC 2.0/RetailPoC20/Img/check.png
  30. BIN ExampleApps/CSharp/RetailPoC 2.0/RetailPoC20/Img/exclamation.png
  31. +14 −0 ExampleApps/CSharp/RetailPoC 2.0/RetailPoC20/ItemAttributesPanel.xaml
  32. +28 −0 ExampleApps/CSharp/RetailPoC 2.0/RetailPoC20/ItemAttributesPanel.xaml.cs
  33. +34 −0 ExampleApps/CSharp/RetailPoC 2.0/RetailPoC20/ItemClickedCommand.cs
  34. +35 −0 ExampleApps/CSharp/RetailPoC 2.0/RetailPoC20/ItemComparisonPanel.xaml
  35. +51 −0 ExampleApps/CSharp/RetailPoC 2.0/RetailPoC20/ItemComparisonPanel.xaml.cs
  36. +224 −0 ExampleApps/CSharp/RetailPoC 2.0/RetailPoC20/MainWindow.xaml
  37. +1,364 −0 ExampleApps/CSharp/RetailPoC 2.0/RetailPoC20/MainWindow.xaml.cs
  38. +70 −0 ExampleApps/CSharp/RetailPoC 2.0/RetailPoC20/MetricPanel.xaml
  39. +513 −0 ExampleApps/CSharp/RetailPoC 2.0/RetailPoC20/MetricPanel.xaml.cs
  40. +29 −0 ExampleApps/CSharp/RetailPoC 2.0/RetailPoC20/Models/Attributes.cs
  41. +17 −0 ExampleApps/CSharp/RetailPoC 2.0/RetailPoC20/Models/Item.cs
  42. +147 −0 ExampleApps/CSharp/RetailPoC 2.0/RetailPoC20/Models/PlanogramContext.cs
  43. +47 −0 ExampleApps/CSharp/RetailPoC 2.0/RetailPoC20/Models/PlanogramOptResults.cs
  44. +33 −0 ExampleApps/CSharp/RetailPoC 2.0/RetailPoC20/Models/PlanogramOptResultsSettings.cs
  45. +23 −0 ExampleApps/CSharp/RetailPoC 2.0/RetailPoC20/Models/PlanogramSize.cs
  46. +35 −0 ExampleApps/CSharp/RetailPoC 2.0/RetailPoC20/Models/RPOCSimulationSettings.cs
  47. +25 −0 ExampleApps/CSharp/RetailPoC 2.0/RetailPoC20/Models/RetailData.cs
  48. +16 −0 ExampleApps/CSharp/RetailPoC 2.0/RetailPoC20/Models/Scale.cs
  49. +36 −0 ExampleApps/CSharp/RetailPoC 2.0/RetailPoC20/Models/Shelf.cs
  50. +22 −0 ExampleApps/CSharp/RetailPoC 2.0/RetailPoC20/Models/ShelfItem.cs
  51. +16 −0 ExampleApps/CSharp/RetailPoC 2.0/RetailPoC20/Models/SimulationData.cs
  52. +19 −0 ExampleApps/CSharp/RetailPoC 2.0/RetailPoC20/NoDataNotificationWindow.xaml
  53. +48 −0 ExampleApps/CSharp/RetailPoC 2.0/RetailPoC20/NoDataNotificationWindow.xaml.cs
  54. +456 −0 ExampleApps/CSharp/RetailPoC 2.0/RetailPoC20/PlanogramOptimizer.cs
  55. +315 −0 ExampleApps/CSharp/RetailPoC 2.0/RetailPoC20/PlanogramOptimizerEncog.cs
  56. +55 −0 ExampleApps/CSharp/RetailPoC 2.0/RetailPoC20/Properties/AssemblyInfo.cs
  57. +63 −0 ExampleApps/CSharp/RetailPoC 2.0/RetailPoC20/Properties/Resources.Designer.cs
  58. +120 −0 ExampleApps/CSharp/RetailPoC 2.0/RetailPoC20/Properties/Resources.resx
  59. +26 −0 ExampleApps/CSharp/RetailPoC 2.0/RetailPoC20/Properties/Settings.Designer.cs
  60. +7 −0 ExampleApps/CSharp/RetailPoC 2.0/RetailPoC20/Properties/Settings.settings
  61. +108 −0 ExampleApps/CSharp/RetailPoC 2.0/RetailPoC20/RLVOutputVisualizer.cs
  62. BIN ExampleApps/CSharp/RetailPoC 2.0/RetailPoC20/Retail POC How to.docx
  63. +299 −0 ExampleApps/CSharp/RetailPoC 2.0/RetailPoC20/RetailPoC20.csproj
  64. +70 −0 ExampleApps/CSharp/RetailPoC 2.0/RetailPoC20/SimulationCsvLogger.cs
  65. +46 −0 ExampleApps/CSharp/RetailPoC 2.0/RetailPoC20/SimulationPanel.xaml
  66. +243 −0 ExampleApps/CSharp/RetailPoC 2.0/RetailPoC20/SimulationPanel.xaml.cs
  67. +18 −0 ExampleApps/CSharp/RetailPoC 2.0/RetailPoC20/StartupWindow.xaml
  68. +27 −0 ExampleApps/CSharp/RetailPoC 2.0/RetailPoC20/StartupWindow.xaml.cs
  69. +36 −0 ExampleApps/CSharp/RetailPoC 2.0/RetailPoC20/TempRLVContainerPanel.xaml
  70. +61 −0 ExampleApps/CSharp/RetailPoC 2.0/RetailPoC20/TempRLVContainerPanel.xaml.cs
  71. BIN ExampleApps/CSharp/RetailPoC 2.0/RetailPoC20/The useAIble Planogram Challenge.docx
  72. +102 −0 ExampleApps/CSharp/RetailPoC 2.0/RetailPoC20/ViewModels/AttributesVM.cs
  73. +61 −0 ExampleApps/CSharp/RetailPoC 2.0/RetailPoC20/ViewModels/ItemVM.cs
  74. +46 −0 ExampleApps/CSharp/RetailPoC 2.0/RetailPoC20/ViewModels/MetricVM.cs
  75. BIN ExampleApps/CSharp/RetailPoC 2.0/RetailPoC20/help-btn.png
  76. +9 −0 ExampleApps/CSharp/RetailPoC 2.0/RetailPoC20/packages.config
  77. +6 −6 ExampleApps/CSharp/XOR/XORConsoleApp/XORConsoleApp.csproj
  78. BIN ExampleApps/CSharp/XOR/XORConsoleApp/bin/Debug/EntityFramework.SqlServer.dll
  79. +0 −2,048 ExampleApps/CSharp/XOR/XORConsoleApp/bin/Debug/EntityFramework.SqlServer.xml
  80. BIN ExampleApps/CSharp/XOR/XORConsoleApp/bin/Debug/EntityFramework.dll
  81. +0 −52,816 ExampleApps/CSharp/XOR/XORConsoleApp/bin/Debug/EntityFramework.xml
  82. BIN ExampleApps/CSharp/XOR/XORConsoleApp/bin/Debug/Newtonsoft.Json.dll
  83. +0 −9,229 ExampleApps/CSharp/XOR/XORConsoleApp/bin/Debug/Newtonsoft.Json.xml
  84. BIN ExampleApps/CSharp/XOR/XORConsoleApp/bin/Debug/PagedList.dll
  85. +0 −388 ExampleApps/CSharp/XOR/XORConsoleApp/bin/Debug/PagedList.xml
  86. BIN ExampleApps/CSharp/XOR/XORConsoleApp/bin/Debug/PoCTools.dll
  87. BIN ExampleApps/CSharp/XOR/XORConsoleApp/bin/Debug/PoCTools.pdb
  88. BIN ExampleApps/CSharp/XOR/XORConsoleApp/bin/Debug/RLM.Database.dll
  89. +0 −26 ExampleApps/CSharp/XOR/XORConsoleApp/bin/Debug/RLM.Database.dll.config
  90. BIN ExampleApps/CSharp/XOR/XORConsoleApp/bin/Debug/RLM.Database.pdb
  91. BIN ExampleApps/CSharp/XOR/XORConsoleApp/bin/Debug/RLM.Memory.dll
  92. BIN ExampleApps/CSharp/XOR/XORConsoleApp/bin/Debug/RLM.Memory.pdb
  93. BIN ExampleApps/CSharp/XOR/XORConsoleApp/bin/Debug/RLM.Models.dll
  94. BIN ExampleApps/CSharp/XOR/XORConsoleApp/bin/Debug/RLM.Models.pdb
  95. BIN ExampleApps/CSharp/XOR/XORConsoleApp/bin/Debug/RLM.dll
  96. BIN ExampleApps/CSharp/XOR/XORConsoleApp/bin/Debug/RLM.pdb
  97. +0 −121 ExampleApps/CSharp/XOR/XORConsoleApp/bin/Debug/RLM.xml
  98. BIN ExampleApps/CSharp/XOR/XORConsoleApp/bin/Debug/System.Data.HashFunction.Core.dll
  99. +0 −1,058 ExampleApps/CSharp/XOR/XORConsoleApp/bin/Debug/System.Data.HashFunction.Core.xml
  100. BIN ExampleApps/CSharp/XOR/XORConsoleApp/bin/Debug/System.Data.HashFunction.Interfaces.dll
  101. +0 −56 ExampleApps/CSharp/XOR/XORConsoleApp/bin/Debug/System.Data.HashFunction.Interfaces.xml
  102. BIN ExampleApps/CSharp/XOR/XORConsoleApp/bin/Debug/System.Data.HashFunction.xxHash.dll
  103. +0 −65 ExampleApps/CSharp/XOR/XORConsoleApp/bin/Debug/System.Data.HashFunction.xxHash.xml
  104. BIN ExampleApps/CSharp/XOR/XORConsoleApp/bin/Debug/XORConsoleApp.exe
  105. +0 −6 ExampleApps/CSharp/XOR/XORConsoleApp/bin/Debug/XORConsoleApp.exe.config
  106. BIN ExampleApps/CSharp/XOR/XORConsoleApp/bin/Debug/XORConsoleApp.pdb
  107. BIN ExampleApps/CSharp/XOR/XORConsoleApp/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache
  108. +0 −1 ExampleApps/CSharp/XOR/XORConsoleApp/obj/Debug/XORConsoleApp.csproj.CoreCompileInputs.cache
  109. +0 −34 ExampleApps/CSharp/XOR/XORConsoleApp/obj/Debug/XORConsoleApp.csproj.FileListAbsolute.txt
  110. BIN ExampleApps/CSharp/XOR/XORConsoleApp/obj/Debug/XORConsoleApp.csprojResolveAssemblyReference.cache
  111. BIN ExampleApps/CSharp/XOR/XORConsoleApp/obj/Debug/XORConsoleApp.exe
  112. BIN ExampleApps/CSharp/XOR/XORConsoleApp/obj/Debug/XORConsoleApp.pdb
  113. +69 −0 ExampleApps/CompetitorComparableApps/RetailPoC 2.0/RetailPoC20_Tensorflow/ConfigFileManager.py
  114. +62 −0 ExampleApps/CompetitorComparableApps/RetailPoC 2.0/RetailPoC20_Tensorflow/Headtohead.py
  115. +277 −0 ExampleApps/CompetitorComparableApps/RetailPoC 2.0/RetailPoC20_Tensorflow/PlanogramOptTensorflow.py
  116. +45 −0 ExampleApps/CompetitorComparableApps/RetailPoC 2.0/RetailPoC20_Tensorflow/RetailPoC20.pyproj
  117. +15 −6 ...RLM.dll.config → CompetitorComparableApps/RetailPoC 2.0/RetailPoC20_Tensorflow/python.exe.config}
  118. +22 −1 RLM.sln

Large diffs are not rendered by default.

Oops, something went wrong.
@@ -107,7 +107,7 @@ public Manager(IRlmNetwork network, bool trackStats = false)
solution_queue = new BlockingCollection<Solution>();
case_queue = new BlockingCollection<Case>();
rlmDb = (network.PersistData) ? new RlmDbMgr(network.DatabaseName) : null;
rlmDb = new RlmDbMgr(network.DatabaseName, network.PersistData);
rlmDbEnqueuer = new RlmObjectEnqueuer();
ctSourceSessions = new CancellationTokenSource();
@@ -370,6 +370,8 @@ public GetRneuronResult GetRneuronFromInputs(IEnumerable<RlmIOWithValue> inputs,
return retVal;
}
object lockDynamicInputs = new object();
/// <summary>
/// Sets the Rneuron
/// </summary>
@@ -400,10 +402,13 @@ public void SetRneuronWithInputs(Rneuron rneuron)
if (lastInputValue.RelatedInputs == null)
lastInputValue.RelatedInputs = new SortedList<RlmInputKey, RlmInputValue>(i.InputType == Enums.RlmInputType.Linear ? linearComparer : distinctComparer);
if (!lastInputValue.RelatedInputs.TryGetValue(inputKey, out inputVal))
lock (lastInputValue.RelatedInputs)
{
inputVal = new RlmInputValue();
lastInputValue.RelatedInputs.Add(inputKey, inputVal);
if (!lastInputValue.RelatedInputs.TryGetValue(inputKey, out inputVal))
{
inputVal = new RlmInputValue();
lastInputValue.RelatedInputs.Add(inputKey, inputVal);
}
}
lastInputValue = inputVal;
@@ -414,12 +419,14 @@ public void SetRneuronWithInputs(Rneuron rneuron)
DynamicInputs = new SortedList<RlmInputKey, RlmInputValue>(i.InputType == Enums.RlmInputType.Linear ? linearComparer : distinctComparer);
isFirstInput = false;
if (!DynamicInputs.TryGetValue(inputKey, out inputVal))
lock (lockDynamicInputs)
{
inputVal = new RlmInputValue();
DynamicInputs.Add(inputKey, inputVal);
if (!DynamicInputs.TryGetValue(inputKey, out inputVal))
{
inputVal = new RlmInputValue();
DynamicInputs.Add(inputKey, inputVal);
}
}
lastInputValue = inputVal;
}
cnt++;
@@ -813,7 +820,7 @@ public void StopRlmDbWorkersSessions()
public void StopRlmDbWorkersCases()
{
case_queue.CompleteAdding();
ctSourceCases.Cancel();
dbSavingTime.Stop();
@@ -831,6 +838,11 @@ public void StopRlmDbWorkersCases()
// notify parent network that db background workers are done
DataPersistenceComplete?.Invoke();
progressUpdater.Stop();
foreach (var item in rlmDb.CaseWorkerQueues)
{
item.CompleteAdding();
}
}
/// <summary>
/// Loads the network result
@@ -840,7 +852,7 @@ public void StopRlmDbWorkersCases()
public LoadRnetworkResult LoadNetwork(string networkName)
{
var result = rlmDb.LoadNetwork(networkName, Network);
if (result.Loaded)
if (result.Loaded && Network.PersistData)
{
StartRlmDbWorkers();
}
@@ -886,7 +898,7 @@ public void TrainingDone()
//}
if (sessionsDone &&
rlmDb.DistinctCaseSessionsCount() == totalSessionsCount &&
//rlmDb.DistinctCaseSessionsCount() == totalSessionsCount &&
MASTER_CASE_QUEUE.Count == 1 &&
MASTER_CASE_QUEUE.ElementAt(0).Count == 0)
{
@@ -0,0 +1,17 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace RLM.Models
{
public class RlmLearnedSession
{
public long SessionId { get; set; }
public double Score { get; set; }
public int Time { get; set; }
public bool IsCurrent { get; set; }
public long SessionNum { get; set; }
}
}
@@ -19,7 +19,7 @@ public class Rneuron
[ForeignKey("Rnetwork_ID")]
public virtual Rnetwork Rnetwork { get; set; }
public virtual ICollection<Case> Cases { get; set; }
public virtual ICollection<Input_Values_Rneuron> Input_Values_Reneurons { get; set; }
public ICollection<Input_Values_Rneuron> Input_Values_Reneurons { get; set; }
[NotMapped]
public bool SavedToDb { get; set; }
@@ -1,4 +1,5 @@
using System;
using RLM.Models.Interfaces;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
@@ -13,5 +14,8 @@ public class LoadRnetworkResult
public string CurrentNetworkName { get; set; }
public long CaseOrder { get; set; }
public int SessionCount { get; set; }
public IEnumerable<RlmIO> Inputs { get; set; }
public IEnumerable<RlmIO> Outputs { get; set; }
public IDictionary<long, RlmInputMomentum> InputMomentums { get; set; }
}
}
@@ -56,6 +56,7 @@
<Compile Include="Interfaces\IManager.cs" />
<Compile Include="Interfaces\IRlmNetwork.cs" />
<Compile Include="Models\Archives\RlmIODetails.cs" />
<Compile Include="Models\Archives\RlmLearnedSession.cs" />
<Compile Include="Models\Archives\RlmLearnedSessionDetails.cs" />
<Compile Include="Models\GetSolutionResult.cs" />
<Compile Include="Models\GetRneuronResult.cs" />
View
@@ -309,10 +309,11 @@ public RlmNetwork(bool persistData = true)
/// <summary>
/// sets your preferred database name
/// </summary>
/// <param name="databaseName">database name</param>
public RlmNetwork(string databaseName)
/// <param name="databaseName">Uses a custom database name instead of the default generated name</param>
/// <param name="persistData">Allows you to turn on/off the data persistence feature of the RLM. Turned on by default.</param>
public RlmNetwork(string databaseName, bool persistData = true)
{
PersistData = true;
PersistData = persistData;
DatabaseName = databaseName;
Initialize();
//MemoryManager.StartRnnDbWorkers();
@@ -404,20 +405,27 @@ public void NewNetwork(string name, IEnumerable<RlmIO> inputs, IEnumerable<RlmIO
/// <returns>Returns true if network is successfully loaded</returns>
public bool LoadNetwork()
{
string networkName = null;
using (RlmDbEntities db = new RlmDbEntities(DatabaseName))
{
networkName = db.Rnetworks.Select(a => a.Name).FirstOrDefault();
}
bool retVal = false;
if (networkName == null)
{
return false;
}
else
if (PersistData)
{
return LoadNetwork(networkName);
string networkName = null;
using (RlmDbEntities db = new RlmDbEntities(DatabaseName))
{
networkName = db.Rnetworks.Select(a => a.Name).FirstOrDefault();
}
if (networkName == null)
{
retVal = false;
}
else
{
retVal = LoadNetwork(networkName);
}
}
return retVal;
}
/// <summary>
@@ -442,14 +450,46 @@ public bool LoadNetwork(string name)
CurrentNetworkName = result.CurrentNetworkName;
CaseOrder = result.CaseOrder;
SessionCountInitial = SessionCount = result.SessionCount;
Inputs = result.Inputs;
Outputs = result.Outputs;
InputMomentums = result.InputMomentums;
}
retVal = result.Loaded;
retVal = result.Loaded;
}
return retVal;
}
public bool LoadNetwork(IRlmNetwork networkToCopy)
{
MemoryManager.Sessions = new ConcurrentDictionary<long, Session>(networkToCopy.MemoryManager.Sessions.ToList());
MemoryManager.BestSolutions = new ConcurrentDictionary<long, Dictionary<long, BestSolution>>(networkToCopy.MemoryManager.BestSolutions.ToList());
MemoryManager.Rneurons = new ConcurrentDictionary<long, Rneuron>(networkToCopy.MemoryManager.Rneurons.ToList());
MemoryManager.Solutions = new ConcurrentDictionary<long, Solution>(networkToCopy.MemoryManager.Solutions.ToList());
MemoryManager.DynamicInputs = new SortedList<RlmInputKey, RlmInputValue>(networkToCopy.MemoryManager.DynamicInputs.Comparer);
foreach(var item in networkToCopy.MemoryManager.DynamicInputs)
{
MemoryManager.DynamicInputs.Add(item.Key, item.Value);
}
MemoryManager.DynamicOutputs = new ConcurrentDictionary<long, HashSet<SolutionOutputSet>>(networkToCopy.MemoryManager.DynamicOutputs.ToList());
CurrentNetworkID = networkToCopy.CurrentNetworkID;
CurrentNetworkName = networkToCopy.CurrentNetworkName;
CaseOrder = networkToCopy.CaseOrder;
SessionCountInitial = SessionCount = networkToCopy.SessionCount;
Inputs = networkToCopy.Inputs.ToList();
Outputs = networkToCopy.Outputs.ToList();
InputMomentums = new Dictionary<long, RlmInputMomentum>();
foreach (var item in networkToCopy.InputMomentums)
{
InputMomentums.Add(item.Key, new RlmInputMomentum() { InputID = item.Value.InputID });
}
return true;
}
public void ResetNetwork()
{
if (CurrentNetworkID < 0)
@@ -15,7 +15,7 @@ namespace RLM
public class RlmNetworkLegacy : RlmNetwork
{
public RlmNetworkLegacy() : base() { }
public RlmNetworkLegacy(string dbName) : base(dbName) { }
public RlmNetworkLegacy(string dbName, bool persistData = true) : base(dbName, persistData) { }
public override long SessionStart()
{
Oops, something went wrong.

0 comments on commit e72ed20

Please sign in to comment.