diff --git a/MP.MONO.ANALYZER/MP.MONO.ANALYZER.csproj b/MP.MONO.ANALYZER/MP.MONO.ANALYZER.csproj
index 7f36479..cf180be 100644
--- a/MP.MONO.ANALYZER/MP.MONO.ANALYZER.csproj
+++ b/MP.MONO.ANALYZER/MP.MONO.ANALYZER.csproj
@@ -6,7 +6,7 @@
enable
enable
AnyCPU;x86;x64
- 1.2.2210.2223
+ 1.2.2210.2315
diff --git a/MP.MONO.ANALYZER/Resources/ChangeLog.html b/MP.MONO.ANALYZER/Resources/ChangeLog.html
index ea22985..6df1f5c 100644
--- a/MP.MONO.ANALYZER/Resources/ChangeLog.html
+++ b/MP.MONO.ANALYZER/Resources/ChangeLog.html
@@ -1,6 +1,6 @@
MAPO-MONO
- Version: 1.2.2210.2223
+ Version: 1.2.2210.2315
Release Note:
-
diff --git a/MP.MONO.ANALYZER/Resources/VersNum.txt b/MP.MONO.ANALYZER/Resources/VersNum.txt
index 4cced33..2141faa 100644
--- a/MP.MONO.ANALYZER/Resources/VersNum.txt
+++ b/MP.MONO.ANALYZER/Resources/VersNum.txt
@@ -1 +1 @@
-1.2.2210.2223
+1.2.2210.2315
diff --git a/MP.MONO.ANALYZER/Resources/manifest.xml b/MP.MONO.ANALYZER/Resources/manifest.xml
index 978c134..6527695 100644
--- a/MP.MONO.ANALYZER/Resources/manifest.xml
+++ b/MP.MONO.ANALYZER/Resources/manifest.xml
@@ -1,6 +1,6 @@
-
- 1.2.2210.2223
+ 1.2.2210.2315
http://nexus.steamware.net/repository/SWS/MP.MONO.ANALYZER/stable/LAST/MP.Mon.zip
http://nexus.steamware.net/repository/SWS/MP.MONO.ANALYZER/stable/LAST/ChangeLog.html
false
diff --git a/MP.MONO.Core/CONF/MachDataItem.cs b/MP.MONO.Core/CONF/MachDataItem.cs
index ddae228..b3fd393 100644
--- a/MP.MONO.Core/CONF/MachDataItem.cs
+++ b/MP.MONO.Core/CONF/MachDataItem.cs
@@ -10,7 +10,8 @@ namespace MP.MONO.Core.CONF
#region Public Constructors
public MachDataItem()
- { }
+ {
+ }
#endregion Public Constructors
@@ -19,32 +20,32 @@ namespace MP.MONO.Core.CONF
///
/// Categoria oggetto
///
- public DataItemCategory Category { get; set; }
+ public DataItemCategory Category { get; set; } = DataItemCategory.EVENT;
///
/// Nome / descrizione
///
- public string Name { get; set; }
+ public string Name { get; set; } = "";
///
/// Tipologia specifica
///
- public string SubType { get; set; }
+ public string SubType { get; set; } = "";
///
/// Tipologia principale
///
- public string Type { get; set; }
+ public string Type { get; set; } = "";
///
/// Unità di misura
///
- public string Units { get; set; }
+ public string Units { get; set; } = "";
///
/// ID generico
///
- public string uuid { get; set; }
+ public string uuid { get; set; } = "";
#endregion Public Properties
}
diff --git a/MP.MONO.Core/MP.MONO.Core.csproj b/MP.MONO.Core/MP.MONO.Core.csproj
index d8beca4..2a4914e 100644
--- a/MP.MONO.Core/MP.MONO.Core.csproj
+++ b/MP.MONO.Core/MP.MONO.Core.csproj
@@ -1,4 +1,4 @@
-
+
net6.0
diff --git a/MP.MONO.DECODER/AlarmsBlinkManager.cs b/MP.MONO.DECODER/AlarmsBlinkManager.cs
new file mode 100644
index 0000000..bc0092c
--- /dev/null
+++ b/MP.MONO.DECODER/AlarmsBlinkManager.cs
@@ -0,0 +1,323 @@
+using Microsoft.Extensions.Configuration;
+using MP.MONO.Core;
+using Newtonsoft.Json;
+using NLog;
+using StackExchange.Redis;
+
+namespace MP.MONO.DECODER
+{
+ public class AlarmsBlinkManager
+ {
+ #region Protected Fields
+
+ protected static Logger Log = LogManager.GetCurrentClassLogger();
+
+ #endregion Protected Fields
+
+ #region Private Fields
+
+ private static ConnectionMultiplexer? redisConn = null;
+ private static IDatabase? redisDb = null;
+
+ #endregion Private Fields
+
+ #region Public Constructors
+
+ public AlarmsBlinkManager()
+ {
+ var env = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
+ var builder = new ConfigurationBuilder()
+ .AddJsonFile($"appsettings.json", true, true)
+ .AddJsonFile($"appsettings.{env}.json", true, true)
+ .AddEnvironmentVariables();
+ var config = builder.Build();
+
+ redisConn = ConnectionMultiplexer.Connect(config.GetConnectionString("Redis"));
+ redisDb = redisConn.GetDatabase();
+
+ Log.Info("AlarmsBlinkManager OK");
+ Console.WriteLine("AlarmsBlinkManager OK");
+ }
+
+ #endregion Public Constructors
+
+ #region Public Methods
+
+ ///
+ /// Funzione chiamata x verifica allarmi:
+ /// - fornisce elenco dei NUOVI come ref
+ /// - fornisce elenco dei CESSATI come ref
+ ///
+ ///
+ ///
+ ///
+ /// Boolean che indica se ci siano state variazioni
+ public static bool processData(List alarmListReceived, ref List alarmListAdded, ref List alarmListCeased)
+ {
+ bool answ = false;
+ // primo step: verifico gli allarmi ricevuti siano > 0 e NON contengano duplicati...
+ List alarmListReceivedOk = new List();
+ if (alarmListReceived.Count > 0)
+ {
+ alarmListReceivedOk = alarmListReceived
+ .GroupBy(x => x)
+ .Select(grp => grp.First())
+ .OrderBy(x => x)
+ .ToList();
+ Log.Info($"Ricezione update allarmi | {alarmListReceived.Count} --> {alarmListReceivedOk.Count} distinct");
+ }
+ else
+ {
+ Log.Info($"Ricezione ZERO allarmi | {alarmListReceived.Count}");
+ }
+
+ // salvo set allarmi ricevuti...
+ setAlarms("LastReceived", alarmListReceivedOk);
+ Log.Debug($"Salvataggio LastReceived | count {alarmListReceivedOk.Count}");
+
+ // recupero allarmi correnti...
+ List alarmListCurrent = getAlarms("Current");
+
+ // elenco allarmi confermati
+ var alarmListConf = alarmListCurrent.Intersect(alarmListReceivedOk);
+
+ // copio oggetti x allarmi NUOVI e cessati
+ alarmListAdded = new List(alarmListReceivedOk);
+ alarmListCeased = new List(alarmListCurrent);
+ foreach (var item in alarmListConf)
+ {
+ // calcolo allarmi nuovi/cessati eliminando eventuali elementi comuni
+ alarmListAdded.Remove(item);
+ alarmListCeased.Remove(item);
+ }
+
+ // aggiungo i nuovi a current
+ alarmListCurrent.AddRange(alarmListAdded);
+ // riordino
+ alarmListCurrent = alarmListCurrent.OrderBy(x => x).ToList();
+ // ...e salvo
+ setAlarms("Current", alarmListCurrent);
+
+ // loggo controllo
+ Log.Debug($"Esito controllo | {alarmListReceivedOk.Count} ricevuti | {alarmListAdded.Count} aggiunti | {alarmListCeased.Count} cessati");
+#if false
+ // gestione allarmi muted
+ List? mutedAlarmsList = new List();
+ string rawData = redisDb.StringGet(Constants.ALARMS_SETT_RLIST_KEY);
+ if (!string.IsNullOrEmpty(rawData))
+ {
+ mutedAlarmsList = JsonConvert.DeserializeObject
>(rawData);
+ }
+ if (mutedAlarmsList == null)
+ {
+ mutedAlarmsList = dbController.AlarmListGetAll();
+ }
+
+ // rileggo da REDIS la conf attuale allarmi già attivi da area ALARM_CURR_KEY
+
+ // FIXME TODO !!! usare una lista thread safe?!?!?
+ List lastAlarms = getAlarms("Current");
+ List startedAlarms = new List();
+ List ceasedAlarms = new List();
+ string serAlarms = "";
+
+ // ciclo x ogni allarme ricevuto x vedere se sia INIZIATO o vada filtrato x muted
+ if (alarmList != null)
+ {
+ // ciclo x ogni allarme attivo x verificare se si sia CHIUSO
+ foreach (var newAlarm in alarmList)
+ {
+ var currNewAlarm = newAlarm;
+ // se ho valori trim pre/post li applica...
+ if (!string.IsNullOrEmpty(AlarmCleanPre))
+ {
+ currNewAlarm = currNewAlarm.Replace(AlarmCleanPre, "");
+ }
+ if (!string.IsNullOrEmpty(AlarmCleanPost))
+ {
+ currNewAlarm = currNewAlarm.Replace(AlarmCleanPost, "");
+ }
+ // se AlarmIgnoreEmpty=true + vuoto --> salto
+ if (AlarmIgnoreEmpty && string.IsNullOrWhiteSpace(currNewAlarm))
+ {
+ alarmList.Remove(currNewAlarm);
+ alarmList.Remove(newAlarm);
+ }
+ else
+ {
+ // in primis... se è muted --> lo escludo...
+ bool isMuted = false;
+ var maybeMuted = mutedAlarmsList.Where(x => x.FullValue == currNewAlarm).FirstOrDefault();
+ if (maybeMuted != null)
+ {
+ isMuted = maybeMuted.Muted;
+ }
+ // cerco l'allarme nell'elenco degli allarmi dal DB
+ AlarmListModel? foundAlarm = getAlarmModel(currNewAlarm);
+
+ if (!isMuted)
+ {
+ if (!lastAlarms.Contains(currNewAlarm))
+ {
+ if (foundAlarm != null)
+ {
+ // segno come iniziato...
+ AlarmRecModel newAlarmRec = new AlarmRecModel()
+ {
+ MachineId = MachineId,
+ DtStart = adesso,
+ DtEnd = adesso.AddMinutes(-1),
+ AlarmId = foundAlarm.AlarmId
+ };
+ alarmRecList.Add(newAlarmRec);
+ startedAlarms.Add(currNewAlarm);
+ lastAlarms.Add(currNewAlarm);
+ needsWrite = true;
+ }
+ }
+ }
+ else
+ {
+ // rimuovo da alarmList perché muted...
+ alarmList.Remove(currNewAlarm);
+ alarmList.Remove(newAlarm);
+ }
+ }
+ }
+ }
+
+ // salvo
+ serAlarms = JsonConvert.SerializeObject(lastAlarms);
+ // invio sulla message pipeline corretta TUTTI gli allarmi serializzati
+ alarmsSendPipe.saveAndSendMessage(Constants.ALARM_CURR_KEY, serAlarms);
+
+ // calcolo allarmi cessati...
+ if (lastAlarms != null)
+ {
+ // ciclo x ogni allarme attivo x verificare se si sia CHIUSO
+ foreach (var oldData in lastAlarms)
+ {
+ bool trovato = false;
+ if (alarmList != null)
+ {
+ trovato = alarmList.Contains(oldData);
+ }
+ // se non c'è... segno cessato
+ if (!trovato)
+ {
+ ceasedAlarms.Add(oldData);
+ await Task.Run(async () =>
+ {
+ await checkCeasedAlarm(oldData);
+ });
+ }
+ }
+ }
+
+ Log.Debug($"Stato lastAlarms | count {lastAlarms.Count}");
+
+ // gli allarmi cessati avvio un task di verifica dopo periodo di blink
+ if (needsWrite)
+ {
+ Log.Debug($"Preparazione AlarmLogRecord | count {lastAlarms.Count}");
+
+ // preparo dati x alarmLog
+ AlarmLogModel newAlarmLog = new AlarmLogModel()
+ {
+ MachineId = MachineId,
+ DtRif = adesso,
+ MemAddress = "ND",
+ Index = 0,
+ // usare alarmList o lastAlarms
+ Status = (uint)alarmList.Count,
+ ValDecoded = alarmList.Count > 0 ? string.Join(", ", alarmList) : "All OK"
+ };
+ alarmLogList.Add(newAlarmLog);
+ }
+
+ if (lastAlarms != null)
+ {
+ lastAlarms = lastAlarms.OrderBy(x => x).ToList();
+ // serializzo l'elenco allarmi...
+ serAlarms = JsonConvert.SerializeObject(lastAlarms);
+
+ // se vuoto metto controllo x chiusura
+ if (lastAlarms.Count() == 0)
+ {
+ await Task.Run(async () =>
+ {
+ await checkCloseAllAlarm();
+ });
+ }
+
+ // invio sulla message pipeline corretta TUTTI gli allarmi serializzati
+ alarmsSendPipe.saveAndSendMessage(Constants.ALARM_CURR_KEY, serAlarms);
+
+ Log.Debug($"Salvataggio/invio allarmi | serAlarms | count {lastAlarms.Count}");
+ }
+#endif
+ // restituisco esito esecuzione
+ return answ;
+ }
+
+ #endregion Public Methods
+
+ #region Private Methods
+
+ ///
+ /// Recupero da redis gli allarmi secondo tipo LastReceived / Current
+ ///
+ private static List getAlarms(string tipo)
+ {
+ // rileggo da REDIS la conf attuale allarmi già attivi da area ALARM_CURR_KEY
+ List lastAlarms = new List();
+ // in base al tipo leggo una chiave redis o l'altra...
+ string rawData = "";
+ if (redisDb != null)
+ {
+ if (tipo == "LastReceived")
+ {
+ rawData = redisDb.StringGet(Constants.ALARM_RECEIV_KEY);
+ }
+ else
+ {
+ rawData = redisDb.StringGet(Constants.ALARM_CURR_KEY);
+ }
+ }
+ // se trovati uso questi...
+ if (!string.IsNullOrEmpty(rawData))
+ {
+ var rawLastAlarms = JsonConvert.DeserializeObject>(rawData);
+ lastAlarms = rawLastAlarms != null ? rawLastAlarms : new List();
+ Log.Debug($"Lettura allarmi | tipo: {tipo} | num: {lastAlarms.Count}");
+ }
+ return lastAlarms;
+ }
+
+ ///
+ /// Salvo in redis gli allarmi secondo tipo LastReceived / Sent
+ ///
+ private static bool setAlarms(string tipo, List listAlarm)
+ {
+ bool fatto = false;
+ string rawData = JsonConvert.SerializeObject(listAlarm);
+
+ if (redisDb != null)
+ {
+ if (tipo == "LastReceived")
+ {
+ fatto = redisDb.StringSet(Constants.ALARM_RECEIV_KEY, rawData);
+ }
+ else
+ {
+ fatto = redisDb.StringSet(Constants.ALARM_CURR_KEY, rawData);
+ }
+ }
+
+ Log.Debug($"Scrittura allarmi | tipo: {tipo} | num: {listAlarm.Count}");
+ return fatto;
+ }
+
+ #endregion Private Methods
+ }
+}
\ No newline at end of file
diff --git a/MP.MONO.DECODER/MP.MONO.DECODER.csproj b/MP.MONO.DECODER/MP.MONO.DECODER.csproj
index 2221491..a680f5a 100644
--- a/MP.MONO.DECODER/MP.MONO.DECODER.csproj
+++ b/MP.MONO.DECODER/MP.MONO.DECODER.csproj
@@ -6,7 +6,7 @@
enable
enable
AnyCPU;x86;x64
- 1.2.2210.2223
+ 1.2.2210.2315
diff --git a/MP.MONO.DECODER/Program.cs b/MP.MONO.DECODER/Program.cs
index 676a50b..ced2193 100644
--- a/MP.MONO.DECODER/Program.cs
+++ b/MP.MONO.DECODER/Program.cs
@@ -174,7 +174,7 @@ void setupAlarmState()
{
// setup preliminare allarmi da DB
var actAlarmsList = dbController.AlarmRecGetActive().Select(x => x.AlarmListNav.FullValue).Distinct().ToList();
- setAlarms("Sent", actAlarmsList);
+ setAlarms("Current", actAlarmsList);
setAlarms("LastReceived", new List());
Log.Debug($"Setup Stato allarmi | act: {actAlarmsList.Count}");
}
@@ -291,7 +291,7 @@ async Task checkCeasedAlarm(string alarmFullCode)
Log.Debug($"checkCeasedAlarm 03 | Chiusura allarme | cod: {alarmFullCode} | Id: {foundAlarm.AlarmId}");
}
// --> rimuovo da elenco attivi!
- var alarmListSent = getAlarms("Sent");
+ var alarmListSent = getAlarms("Current");
int numPre = alarmListSent.Count();
alarmListSent.Remove(alarmFullCode);
int numPost = alarmListSent.Count();
@@ -314,7 +314,7 @@ async Task checkCloseAllAlarm()
bool answ = false;
Log.Debug($"Verifica checkCloseAllAlarm");
// cerco allarme da valore REDIS ultimi ricevuti
- var alarmSent = getAlarms("Sent");
+ var alarmSent = getAlarms("Current");
if (alarmSent != null)
{
bool isZero = alarmSent.Count() == 0;
@@ -324,7 +324,7 @@ async Task checkCloseAllAlarm()
// attendo periodo pausa...
await Task.Delay(BlinkPeriodMSec * 2);
// rileggo stato
- alarmSent = getAlarms("Sent");
+ alarmSent = getAlarms("Current");
isZero = alarmSent.Count() == 0;
// ...SE fossero sempre zero
if (isZero)
@@ -700,7 +700,7 @@ async void AlarmsValPipe_EA_NewMessage(object? sender, EventArgs e)
// rileggo da REDIS la conf attuale allarmi già attivi da area ALARM_CURR_KEY
// FIXME TODO !!! usare una lista thread safe?!?!?
- List lastAlarms = getAlarms("Sent");
+ List lastAlarms = getAlarms("Current");
List startedAlarms = new List();
List ceasedAlarms = new List();
string serAlarms = "";
diff --git a/MP.MONO.DECODER/Resources/ChangeLog.html b/MP.MONO.DECODER/Resources/ChangeLog.html
index ea22985..6df1f5c 100644
--- a/MP.MONO.DECODER/Resources/ChangeLog.html
+++ b/MP.MONO.DECODER/Resources/ChangeLog.html
@@ -1,6 +1,6 @@
MAPO-MONO
- Version: 1.2.2210.2223
+ Version: 1.2.2210.2315
Release Note:
-
diff --git a/MP.MONO.DECODER/Resources/VersNum.txt b/MP.MONO.DECODER/Resources/VersNum.txt
index 4cced33..2141faa 100644
--- a/MP.MONO.DECODER/Resources/VersNum.txt
+++ b/MP.MONO.DECODER/Resources/VersNum.txt
@@ -1 +1 @@
-1.2.2210.2223
+1.2.2210.2315
diff --git a/MP.MONO.DECODER/Resources/manifest.xml b/MP.MONO.DECODER/Resources/manifest.xml
index 84bbcc5..1dd278a 100644
--- a/MP.MONO.DECODER/Resources/manifest.xml
+++ b/MP.MONO.DECODER/Resources/manifest.xml
@@ -1,6 +1,6 @@
-
- 1.2.2210.2223
+ 1.2.2210.2315
http://nexus.steamware.net/repository/SWS/MP.MONO.DECODER/stable/LAST/MP.Mon.zip
http://nexus.steamware.net/repository/SWS/MP.MONO.DECODER/stable/LAST/ChangeLog.html
false
diff --git a/MP.MONO.Data/Controllers/MpDbController.cs b/MP.MONO.Data/Controllers/MpDbController.cs
index cc17845..943a529 100644
--- a/MP.MONO.Data/Controllers/MpDbController.cs
+++ b/MP.MONO.Data/Controllers/MpDbController.cs
@@ -942,18 +942,21 @@ namespace MP.MONO.Data.Controllers
.DbSetPMTask
.Where(x => x.PMTaskId == currRec.PMTaskId)
.FirstOrDefault();
- // se effettivo delete
- if (forceDelete)
+ if (currVal != null)
{
- localDbCtx
- .DbSetPMTask
- .Remove(currVal);
+ // se effettivo delete
+ if (forceDelete)
+ {
+ localDbCtx
+ .DbSetPMTask
+ .Remove(currVal);
+ }
+ else
+ {
+ currVal.IsDisabled = true;
+ }
+ await localDbCtx.SaveChangesAsync();
}
- else
- {
- currVal.IsDisabled = true;
- }
- await localDbCtx.SaveChangesAsync();
fatto = true;
}
catch (Exception exc)
@@ -980,12 +983,15 @@ namespace MP.MONO.Data.Controllers
.DbSetPMTask
.Where(x => x.PMTaskId == currRec.PMTaskId)
.FirstOrDefault();
- // se effettivo delete
- if (currRec.IsDisabled)
+ if (currVal != null)
{
- currVal.IsDisabled = false;
+ // se effettivo delete
+ if (currRec.IsDisabled)
+ {
+ currVal.IsDisabled = false;
+ }
+ await localDbCtx.SaveChangesAsync();
}
- await localDbCtx.SaveChangesAsync();
fatto = true;
}
catch (Exception exc)
diff --git a/MP.MONO.SIM/MP.MONO.SIM.csproj b/MP.MONO.SIM/MP.MONO.SIM.csproj
index d00b57c..fa58789 100644
--- a/MP.MONO.SIM/MP.MONO.SIM.csproj
+++ b/MP.MONO.SIM/MP.MONO.SIM.csproj
@@ -6,7 +6,7 @@
enable
enable
AnyCPU;x86;x64
- 1.2.2210.2223
+ 1.2.2210.2315
diff --git a/MP.MONO.SIM/Resources/ChangeLog.html b/MP.MONO.SIM/Resources/ChangeLog.html
index ea22985..6df1f5c 100644
--- a/MP.MONO.SIM/Resources/ChangeLog.html
+++ b/MP.MONO.SIM/Resources/ChangeLog.html
@@ -1,6 +1,6 @@
MAPO-MONO
-
Version: 1.2.2210.2223
+ Version: 1.2.2210.2315
Release Note:
-
diff --git a/MP.MONO.SIM/Resources/VersNum.txt b/MP.MONO.SIM/Resources/VersNum.txt
index 4cced33..2141faa 100644
--- a/MP.MONO.SIM/Resources/VersNum.txt
+++ b/MP.MONO.SIM/Resources/VersNum.txt
@@ -1 +1 @@
-1.2.2210.2223
+1.2.2210.2315
diff --git a/MP.MONO.SIM/Resources/manifest.xml b/MP.MONO.SIM/Resources/manifest.xml
index 58abb0d..37ce65a 100644
--- a/MP.MONO.SIM/Resources/manifest.xml
+++ b/MP.MONO.SIM/Resources/manifest.xml
@@ -1,6 +1,6 @@
-
- 1.2.2210.2223
+ 1.2.2210.2315
http://nexus.steamware.net/repository/SWS/MP.MONO.SIM/stable/LAST/MP.Mon.zip
http://nexus.steamware.net/repository/SWS/MP.MONO.SIM/stable/LAST/ChangeLog.html
false
diff --git a/MP.MONO.UI/MP.MONO.UI.csproj b/MP.MONO.UI/MP.MONO.UI.csproj
index 52abaf4..35b3c20 100644
--- a/MP.MONO.UI/MP.MONO.UI.csproj
+++ b/MP.MONO.UI/MP.MONO.UI.csproj
@@ -5,7 +5,7 @@
enable
enable
AnyCPU;x86;x64
- 1.2.2210.2223
+ 1.2.2210.2315
diff --git a/MP.MONO.UI/Resources/ChangeLog.html b/MP.MONO.UI/Resources/ChangeLog.html
index ea22985..6df1f5c 100644
--- a/MP.MONO.UI/Resources/ChangeLog.html
+++ b/MP.MONO.UI/Resources/ChangeLog.html
@@ -1,6 +1,6 @@
MAPO-MONO
-
Version: 1.2.2210.2223
+ Version: 1.2.2210.2315
Release Note:
-
diff --git a/MP.MONO.UI/Resources/VersNum.txt b/MP.MONO.UI/Resources/VersNum.txt
index 4cced33..2141faa 100644
--- a/MP.MONO.UI/Resources/VersNum.txt
+++ b/MP.MONO.UI/Resources/VersNum.txt
@@ -1 +1 @@
-1.2.2210.2223
+1.2.2210.2315
diff --git a/MP.MONO.UI/Resources/manifest.xml b/MP.MONO.UI/Resources/manifest.xml
index 3eef232..2b9193d 100644
--- a/MP.MONO.UI/Resources/manifest.xml
+++ b/MP.MONO.UI/Resources/manifest.xml
@@ -1,6 +1,6 @@
-
- 1.2.2210.2223
+ 1.2.2210.2315
http://nexus.steamware.net/repository/SWS/MP.MONO.UI/stable/LAST/MP.Mon.zip
http://nexus.steamware.net/repository/SWS/MP.MONO.UI/stable/LAST/ChangeLog.html
false