bugfixes
This commit is contained in:
parent
54a4324a7f
commit
16a186c861
@ -7897,75 +7897,95 @@ namespace WinFormsApp1
|
|||||||
return $"{input[0].ToString().ToUpper()}{input.Substring(1)}";
|
return $"{input[0].ToString().ToUpper()}{input.Substring(1)}";
|
||||||
}
|
}
|
||||||
|
|
||||||
// Hilfs-Methode, damit ListView-Einträge schnell aktualisiert werden können
|
|
||||||
private static bool TryUpdateRow(ListView list, string modelName, ModelDetails d)
|
|
||||||
{
|
|
||||||
foreach (ListViewItem li in list.Items)
|
|
||||||
if (li.SubItems[2].Text.Equals(modelName, StringComparison.OrdinalIgnoreCase))
|
|
||||||
{
|
|
||||||
li.SubItems[4].Text = d.last_update; // oder last_broadcast, je nach Spalte
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task GetCBOnlineModelsAsync()
|
private async Task GetCBOnlineModelsAsync()
|
||||||
{
|
{
|
||||||
|
// Reentrancy-Guard
|
||||||
|
if (CbApiCheckIsRunning) return;
|
||||||
|
CbApiCheckIsRunning = true;
|
||||||
|
|
||||||
|
CancellationTokenSource? oldCts = null;
|
||||||
|
bool lockTaken = false;
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
// 0) Abruf, Cancellation & Lock -----------------------------------
|
// API überhaupt aktiv?
|
||||||
_cbApiCts?.Cancel();
|
if (!checkBox_useCBApi.Checked) return;
|
||||||
|
|
||||||
|
// Altes CTS abbrechen & entsorgen, neues mit Timeout erstellen
|
||||||
|
oldCts = _cbApiCts;
|
||||||
_cbApiCts = new CancellationTokenSource(TimeSpan.FromSeconds(30));
|
_cbApiCts = new CancellationTokenSource(TimeSpan.FromSeconds(30));
|
||||||
|
oldCts?.Cancel();
|
||||||
|
oldCts?.Dispose();
|
||||||
|
|
||||||
var ct = _cbApiCts.Token;
|
var ct = _cbApiCts.Token;
|
||||||
|
|
||||||
// kein Warten auf dem UI-Thread, falls das Semaphore schon belegt ist
|
// Nicht blockierend versuchen, den Lock zu bekommen
|
||||||
if (!await modelAccessLock.WaitAsync(0).ConfigureAwait(false))
|
lockTaken = await modelAccessLock.WaitAsync(0).ConfigureAwait(false);
|
||||||
return;
|
if (!lockTaken || ct.IsCancellationRequested) return;
|
||||||
|
|
||||||
// 1) Mini-Hop: Statusmeldung und (falls nötig) Fav-/Like-Caches
|
// 1) Mini-UI-Hop: Status + Caches
|
||||||
HashSet<string> favNames = default!;
|
HashSet<string> favNames = default!;
|
||||||
HashSet<string> likeNames = default!;
|
HashSet<string> likeNames = default!;
|
||||||
|
|
||||||
|
|
||||||
await this.InvokeAsync(() =>
|
await this.InvokeAsync(() =>
|
||||||
{
|
{
|
||||||
|
if (IsDisposed) return;
|
||||||
UpdateStatusLabel("Lade API…");
|
UpdateStatusLabel("Lade API…");
|
||||||
|
|
||||||
_favNameCache ??= GetModelNamesFromListView(listView_Favorites);
|
_favNameCache ??= GetModelNamesFromListView(listView_Favorites);
|
||||||
_likeNameCache ??= GetModelNamesFromListView(listView_Likes);
|
_likeNameCache ??= GetModelNamesFromListView(listView_Likes);
|
||||||
favNames = _favNameCache;
|
favNames = _favNameCache!;
|
||||||
likeNames = _likeNameCache;
|
likeNames = _likeNameCache!;
|
||||||
});
|
});
|
||||||
|
|
||||||
// 2) API-Download (kein UI-Kontext)
|
if (ct.IsCancellationRequested) return;
|
||||||
string json = await _httpClient
|
|
||||||
.GetStringAsync(API_URL, ct)
|
|
||||||
.ConfigureAwait(false);
|
|
||||||
|
|
||||||
// 3) CPU-Arbeit auslagern
|
// 2) HTTP – alle "Abbruch-ähnlichen" Fehler still akzeptieren
|
||||||
var (updatedInfo, onlineNow) = await Task
|
string json;
|
||||||
.Run(() => BuildPatch(json, favNames, likeNames), ct)
|
try
|
||||||
.ConfigureAwait(false);
|
{
|
||||||
|
using var req = new HttpRequestMessage(HttpMethod.Get, API_URL);
|
||||||
|
using var resp = await _httpClient.SendAsync(req, HttpCompletionOption.ResponseHeadersRead, ct)
|
||||||
|
.ConfigureAwait(false);
|
||||||
|
resp.EnsureSuccessStatusCode();
|
||||||
|
json = await resp.Content.ReadAsStringAsync(ct).ConfigureAwait(false);
|
||||||
|
}
|
||||||
|
catch (OperationCanceledException) { return; } // regulärer Abbruch
|
||||||
|
catch (ObjectDisposedException) { return; } // Stream schon zu (z. B. TLS)
|
||||||
|
catch (System.Net.Sockets.SocketException ex) when (ex.ErrorCode == 995) { return; } // „I/O abgebrochen“
|
||||||
|
catch (HttpRequestException)
|
||||||
|
{
|
||||||
|
// Netzwerkfehler kurz melden, aber App stabil halten
|
||||||
|
await this.InvokeAsync(() => { if (!IsDisposed) UpdateStatusLabel("API nicht erreichbar"); });
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// 4) Globale Dictionaries patchen (wir halten noch das Lock)
|
if (ct.IsCancellationRequested) return;
|
||||||
|
|
||||||
|
// 3) CPU-Arbeit auslagern (Parse & Patch vorbereiten)
|
||||||
|
var (updatedInfo, onlineNow) = await Task.Run(() => BuildPatch(json, favNames, likeNames), ct)
|
||||||
|
.ConfigureAwait(false);
|
||||||
|
|
||||||
|
if (ct.IsCancellationRequested) return;
|
||||||
|
|
||||||
|
// 4) Globale Models patchen (wir halten noch das Semaphore)
|
||||||
foreach (var (name, details) in updatedInfo)
|
foreach (var (name, details) in updatedInfo)
|
||||||
modelDetails[name] = details;
|
modelDetails[name] = details;
|
||||||
|
|
||||||
foreach (var (name, details) in modelDetails)
|
foreach (var kv in modelDetails)
|
||||||
if (!onlineNow.Contains(name))
|
if (!onlineNow.Contains(kv.Key))
|
||||||
details.room_status = "Offline";
|
kv.Value.room_status = "Offline";
|
||||||
|
|
||||||
// 5) EIN Hop zurück auf das UI zur Anzeige
|
// 5) UI aktualisieren
|
||||||
await this.InvokeAsync(() =>
|
await this.InvokeAsync(() =>
|
||||||
{
|
{
|
||||||
ApplyUpdates(updatedInfo,
|
if (IsDisposed) return;
|
||||||
listView_Likes, listView_Favorites,
|
|
||||||
|
ApplyUpdates(updatedInfo, listView_Likes, listView_Favorites,
|
||||||
out int likesOnline, out int favsOnline);
|
out int likesOnline, out int favsOnline);
|
||||||
|
|
||||||
label_LikesOnline_Value.Text = likesOnline.ToString();
|
label_LikesOnline_Value.Text = likesOnline.ToString();
|
||||||
label_FavoritesOnline_Value.Text = favsOnline.ToString();
|
label_FavoritesOnline_Value.Text = favsOnline.ToString();
|
||||||
|
|
||||||
// Tags nur anfassen, wenn sich etwas geändert hat
|
// Tags nur aktualisieren, wenn welche geliefert wurden
|
||||||
if (updatedInfo.Values.Any(m => m.tags?.Count > 0))
|
if (updatedInfo.Values.Any(m => m.tags?.Count > 0))
|
||||||
{
|
{
|
||||||
LoadTagsFromModelDetails();
|
LoadTagsFromModelDetails();
|
||||||
@ -7979,23 +7999,23 @@ namespace WinFormsApp1
|
|||||||
UpdateTagFilterCheckedListBox(allTags, checkedListBox_Archive_Tags);
|
UpdateTagFilterCheckedListBox(allTags, checkedListBox_Archive_Tags);
|
||||||
}
|
}
|
||||||
|
|
||||||
UpdateStatusLabel(""); // fertig
|
UpdateStatusLabel(""); // fertig
|
||||||
});
|
});
|
||||||
|
|
||||||
// 6) Hintertür: API deaktiviert?
|
// Falls währenddessen deaktiviert wurde
|
||||||
if (!checkBox_useCBApi.Checked)
|
if (!checkBox_useCBApi.Checked)
|
||||||
{
|
{
|
||||||
timer_getRoomlist.Stop();
|
timer_getRoomlist.Stop();
|
||||||
modelDetails.Clear();
|
modelDetails.Clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
// ────────────────────────────────────────────────────────────────
|
// ──────────────────────────────────────────────────────────────
|
||||||
// lokale Hilfsfunktion: baut den Patch komplett im Thread-Pool
|
// Lokale Helfer: komplett im Threadpool ohne UI-Zugriff
|
||||||
// ────────────────────────────────────────────────────────────────
|
// ──────────────────────────────────────────────────────────────
|
||||||
(Dictionary<string, ModelDetails> updated, HashSet<string> online)
|
static (Dictionary<string, ModelDetails> updated, HashSet<string> online)
|
||||||
BuildPatch(string jsonText, IReadOnlyCollection<string> favs, IReadOnlyCollection<string> likes)
|
BuildPatch(string jsonText, IReadOnlyCollection<string> favs, IReadOnlyCollection<string> likes)
|
||||||
{
|
{
|
||||||
var rooms = JArray.Parse(jsonText); // Newtonsoft
|
var rooms = Newtonsoft.Json.Linq.JArray.Parse(jsonText);
|
||||||
var updatedInfo = new Dictionary<string, ModelDetails>(StringComparer.OrdinalIgnoreCase);
|
var updatedInfo = new Dictionary<string, ModelDetails>(StringComparer.OrdinalIgnoreCase);
|
||||||
var onlineNow = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
|
var onlineNow = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
|
||||||
|
|
||||||
@ -8006,8 +8026,9 @@ namespace WinFormsApp1
|
|||||||
|
|
||||||
onlineNow.Add(name);
|
onlineNow.Add(name);
|
||||||
|
|
||||||
|
// nur interessant, wenn in Likes/Favs
|
||||||
if (!favs.Contains(name) && !likes.Contains(name))
|
if (!favs.Contains(name) && !likes.Contains(name))
|
||||||
continue; // fürs UI uninteressant
|
continue;
|
||||||
|
|
||||||
updatedInfo[name] = new ModelDetails
|
updatedInfo[name] = new ModelDetails
|
||||||
{
|
{
|
||||||
@ -8029,7 +8050,9 @@ namespace WinFormsApp1
|
|||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
modelAccessLock.Release();
|
if (lockTaken) modelAccessLock.Release();
|
||||||
|
CbApiCheckIsRunning = false;
|
||||||
|
oldCts?.Dispose(); // (zur Sicherheit, falls oben nicht erreicht)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -11334,10 +11357,64 @@ namespace WinFormsApp1
|
|||||||
|
|
||||||
private void comboBox_checkSpeed_SelectedIndexChanged(object sender, EventArgs e)
|
private void comboBox_checkSpeed_SelectedIndexChanged(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
Properties.Settings.Default.selectedSpeed = comboBox_checkSpeed.SelectedIndex;
|
if (!loadingCompleted) return;
|
||||||
Properties.Settings.Default.Save();
|
TrySaveSelectedSpeed(comboBox_checkSpeed.SelectedIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void EnsureSettingsGroupName()
|
||||||
|
{
|
||||||
|
// Vollqualifizierter Settings-Typname -> gültiger Abschnittsname
|
||||||
|
var expected = typeof(Properties.Settings).FullName; // "WinFormsApp1.Properties.Settings" o.ä.
|
||||||
|
var ctx = Properties.Settings.Default.Context;
|
||||||
|
|
||||||
|
if (ctx["GroupName"] is not string s || string.IsNullOrWhiteSpace(s))
|
||||||
|
ctx["GroupName"] = expected;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void TrySaveSelectedSpeed(int index)
|
||||||
|
{
|
||||||
|
EnsureSettingsGroupName();
|
||||||
|
Properties.Settings.Default.selectedSpeed = index;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Properties.Settings.Default.Save();
|
||||||
|
}
|
||||||
|
catch (System.Configuration.ConfigurationErrorsException ex)
|
||||||
|
{
|
||||||
|
// häufig: kaputte user.config -> umbenennen und neu erzeugen
|
||||||
|
var file = (ex as System.Configuration.ConfigurationErrorsException)?.Filename
|
||||||
|
?? (ex.InnerException as System.Configuration.ConfigurationErrorsException)?.Filename;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (!string.IsNullOrEmpty(file) && System.IO.File.Exists(file))
|
||||||
|
{
|
||||||
|
var backup = file + ".bak";
|
||||||
|
System.IO.File.Move(file, backup, overwrite: true);
|
||||||
|
}
|
||||||
|
|
||||||
|
// neu laden und nochmal speichern
|
||||||
|
Properties.Settings.Default.Reload();
|
||||||
|
EnsureSettingsGroupName();
|
||||||
|
Properties.Settings.Default.selectedSpeed = index;
|
||||||
|
Properties.Settings.Default.Save();
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
// Letzter Fallback: ignorieren (Einstellung gilt bis zum Neustart)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (ArgumentException)
|
||||||
|
{
|
||||||
|
// Falls doch wieder 'sectionGroupName' bemängelt wird: GroupName setzen und nochmal
|
||||||
|
EnsureSettingsGroupName();
|
||||||
|
Properties.Settings.Default.Save();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private void checkBox_completedDownloadNotification_CheckedChanged(object sender, EventArgs e)
|
private void checkBox_completedDownloadNotification_CheckedChanged(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
if (checkBox_completedDownloadNotification.Checked)
|
if (checkBox_completedDownloadNotification.Checked)
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
<!-- https://go.microsoft.com/fwlink/?LinkID=208121. -->
|
<!-- https://go.microsoft.com/fwlink/?LinkID=208121. -->
|
||||||
<Project>
|
<Project>
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<History>True|2025-09-11T07:25:26.7487573Z||;True|2025-09-05T10:35:16.3265491+02:00||;True|2025-08-13T07:12:45.6489499+02:00||;True|2025-08-08T07:25:38.8935816+02:00||;True|2025-08-08T07:19:07.3835648+02:00||;True|2025-08-06T07:38:46.3420158+02:00||;True|2025-07-16T07:41:34.3557961+02:00||;True|2025-07-15T11:01:48.5566218+02:00||;True|2025-07-07T14:59:37.1240379+02:00||;False|2025-07-07T14:57:39.0613209+02:00||;True|2025-07-07T06:29:53.8853096+02:00||;True|2025-07-06T23:39:21.1017631+02:00||;True|2025-07-06T23:24:37.7792733+02:00||;False|2025-07-06T23:19:52.7135594+02:00||;True|2025-07-06T05:55:51.5281444+02:00||;True|2025-07-06T05:14:26.6590895+02:00||;True|2025-07-06T05:07:43.4335057+02:00||;False|2025-07-06T05:06:42.5442365+02:00||;True|2025-06-27T09:56:34.6625992+02:00||;True|2025-06-27T09:55:33.6399545+02:00||;True|2025-06-27T09:35:44.7409289+02:00||;True|2025-06-27T09:35:11.7955472+02:00||;True|2025-06-27T09:23:44.1433728+02:00||;True|2025-06-27T09:10:34.1084041+02:00||;True|2025-06-27T09:06:49.8646149+02:00||;True|2025-06-27T08:55:00.3110860+02:00||;True|2025-06-27T08:47:18.4476580+02:00||;True|2025-06-11T14:42:56.1622930+02:00||;True|2025-06-11T12:33:26.7419370+02:00||;True|2025-06-11T07:48:58.3963584+02:00||;True|2025-06-11T07:42:53.0277862+02:00||;False|2025-06-11T07:39:31.7470335+02:00||;True|2025-06-03T19:58:59.1868907+02:00||;True|2025-06-03T14:33:55.4389500+02:00||;True|2025-06-03T14:16:34.6963918+02:00||;True|2025-06-03T13:26:58.4834917+02:00||;True|2025-06-02T19:01:22.1305699+02:00||;True|2025-06-02T18:27:48.1629252+02:00||;True|2025-06-02T18:12:01.0339452+02:00||;True|2025-04-25T14:02:07.8958669+02:00||;True|2025-04-24T07:32:32.3215936+02:00||;True|2025-04-23T14:24:27.8051379+02:00||;True|2025-04-22T07:23:33.4961515+02:00||;True|2025-04-22T07:16:30.0019927+02:00||;True|2025-04-17T07:35:19.5003910+02:00||;True|2025-04-16T07:51:44.2105982+02:00||;True|2025-04-15T17:39:22.9354819+02:00||;True|2025-04-15T13:59:38.1491035+02:00||;True|2025-04-15T13:26:09.1911007+02:00||;False|2025-04-15T13:24:05.8283613+02:00||;True|2025-04-15T12:05:53.7928484+02:00||;True|2025-04-14T11:46:19.0213400+02:00||;True|2025-04-14T11:19:57.9110025+02:00||;False|2025-04-14T11:18:49.2970157+02:00||;True|2025-04-14T10:56:19.4313583+02:00||;True|2025-04-14T10:09:57.0472222+02:00||;True|2025-04-11T09:36:58.9281719+02:00||;True|2025-04-11T07:56:15.1143584+02:00||;True|2025-04-10T08:08:20.7849097+02:00||;True|2025-04-09T12:56:06.8510589+02:00||;True|2025-04-09T12:39:21.5101756+02:00||;True|2025-04-09T12:35:02.6306664+02:00||;True|2025-04-09T07:53:00.7307516+02:00||;True|2025-04-07T15:17:24.3233000+02:00||;True|2025-04-04T18:09:18.8844877+02:00||;True|2025-04-03T12:27:18.9922316+02:00||;True|2025-04-03T09:48:50.2518754+02:00||;True|2025-03-31T13:53:07.3910797+02:00||;True|2025-03-31T12:46:18.3638787+02:00||;True|2025-03-31T11:01:06.0182900+02:00||;True|2025-03-31T10:55:30.7399322+02:00||;True|2025-03-31T10:41:08.8975919+02:00||;True|2025-03-31T10:15:29.6315309+02:00||;True|2025-03-31T08:53:20.4511304+02:00||;True|2025-03-29T14:23:34.4407251+01:00||;True|2025-03-29T13:42:06.7348581+01:00||;True|2025-03-28T18:06:37.5932036+01:00||;True|2025-03-27T13:26:13.4721799+01:00||;True|2025-03-27T11:19:53.3525657+01:00||;True|2025-03-27T10:09:53.9177515+01:00||;True|2025-03-27T07:56:40.2542279+01:00||;True|2025-03-26T16:58:27.4112741+01:00||;True|2025-03-26T15:03:46.9772542+01:00||;True|2025-03-25T11:14:58.7342381+01:00||;True|2025-03-25T09:57:45.7084482+01:00||;True|2025-03-25T07:43:59.3237279+01:00||;True|2025-03-24T14:10:05.5099691+01:00||;True|2025-03-24T13:48:18.7826715+01:00||;True|2025-03-24T08:45:04.4414362+01:00||;True|2025-03-24T08:09:16.9512603+01:00||;True|2025-03-20T14:13:12.1535010+01:00||;True|2025-03-20T14:00:29.9824607+01:00||;True|2025-03-20T13:45:43.1699125+01:00||;True|2025-03-19T14:19:58.3321359+01:00||;True|2025-03-19T13:26:31.1028654+01:00||;True|2025-03-19T12:59:58.9858416+01:00||;True|2025-03-18T13:00:20.7436962+01:00||;False|2025-03-18T12:57:53.3072280+01:00||;True|2025-03-18T08:57:30.7588196+01:00||;True|2025-03-18T07:49:25.6452787+01:00||;</History>
|
<History>True|2025-09-22T07:12:21.1738434Z||;True|2025-09-22T08:41:28.2063145+02:00||;True|2025-09-11T09:25:26.7487573+02:00||;True|2025-09-05T10:35:16.3265491+02:00||;True|2025-08-13T07:12:45.6489499+02:00||;True|2025-08-08T07:25:38.8935816+02:00||;True|2025-08-08T07:19:07.3835648+02:00||;True|2025-08-06T07:38:46.3420158+02:00||;True|2025-07-16T07:41:34.3557961+02:00||;True|2025-07-15T11:01:48.5566218+02:00||;True|2025-07-07T14:59:37.1240379+02:00||;False|2025-07-07T14:57:39.0613209+02:00||;True|2025-07-07T06:29:53.8853096+02:00||;True|2025-07-06T23:39:21.1017631+02:00||;True|2025-07-06T23:24:37.7792733+02:00||;False|2025-07-06T23:19:52.7135594+02:00||;True|2025-07-06T05:55:51.5281444+02:00||;True|2025-07-06T05:14:26.6590895+02:00||;True|2025-07-06T05:07:43.4335057+02:00||;False|2025-07-06T05:06:42.5442365+02:00||;True|2025-06-27T09:56:34.6625992+02:00||;True|2025-06-27T09:55:33.6399545+02:00||;True|2025-06-27T09:35:44.7409289+02:00||;True|2025-06-27T09:35:11.7955472+02:00||;True|2025-06-27T09:23:44.1433728+02:00||;True|2025-06-27T09:10:34.1084041+02:00||;True|2025-06-27T09:06:49.8646149+02:00||;True|2025-06-27T08:55:00.3110860+02:00||;True|2025-06-27T08:47:18.4476580+02:00||;True|2025-06-11T14:42:56.1622930+02:00||;True|2025-06-11T12:33:26.7419370+02:00||;True|2025-06-11T07:48:58.3963584+02:00||;True|2025-06-11T07:42:53.0277862+02:00||;False|2025-06-11T07:39:31.7470335+02:00||;True|2025-06-03T19:58:59.1868907+02:00||;True|2025-06-03T14:33:55.4389500+02:00||;True|2025-06-03T14:16:34.6963918+02:00||;True|2025-06-03T13:26:58.4834917+02:00||;True|2025-06-02T19:01:22.1305699+02:00||;True|2025-06-02T18:27:48.1629252+02:00||;True|2025-06-02T18:12:01.0339452+02:00||;True|2025-04-25T14:02:07.8958669+02:00||;True|2025-04-24T07:32:32.3215936+02:00||;True|2025-04-23T14:24:27.8051379+02:00||;True|2025-04-22T07:23:33.4961515+02:00||;True|2025-04-22T07:16:30.0019927+02:00||;True|2025-04-17T07:35:19.5003910+02:00||;True|2025-04-16T07:51:44.2105982+02:00||;True|2025-04-15T17:39:22.9354819+02:00||;True|2025-04-15T13:59:38.1491035+02:00||;True|2025-04-15T13:26:09.1911007+02:00||;False|2025-04-15T13:24:05.8283613+02:00||;True|2025-04-15T12:05:53.7928484+02:00||;True|2025-04-14T11:46:19.0213400+02:00||;True|2025-04-14T11:19:57.9110025+02:00||;False|2025-04-14T11:18:49.2970157+02:00||;True|2025-04-14T10:56:19.4313583+02:00||;True|2025-04-14T10:09:57.0472222+02:00||;True|2025-04-11T09:36:58.9281719+02:00||;True|2025-04-11T07:56:15.1143584+02:00||;True|2025-04-10T08:08:20.7849097+02:00||;True|2025-04-09T12:56:06.8510589+02:00||;True|2025-04-09T12:39:21.5101756+02:00||;True|2025-04-09T12:35:02.6306664+02:00||;True|2025-04-09T07:53:00.7307516+02:00||;True|2025-04-07T15:17:24.3233000+02:00||;True|2025-04-04T18:09:18.8844877+02:00||;True|2025-04-03T12:27:18.9922316+02:00||;True|2025-04-03T09:48:50.2518754+02:00||;True|2025-03-31T13:53:07.3910797+02:00||;True|2025-03-31T12:46:18.3638787+02:00||;True|2025-03-31T11:01:06.0182900+02:00||;True|2025-03-31T10:55:30.7399322+02:00||;True|2025-03-31T10:41:08.8975919+02:00||;True|2025-03-31T10:15:29.6315309+02:00||;True|2025-03-31T08:53:20.4511304+02:00||;True|2025-03-29T14:23:34.4407251+01:00||;True|2025-03-29T13:42:06.7348581+01:00||;True|2025-03-28T18:06:37.5932036+01:00||;True|2025-03-27T13:26:13.4721799+01:00||;True|2025-03-27T11:19:53.3525657+01:00||;True|2025-03-27T10:09:53.9177515+01:00||;True|2025-03-27T07:56:40.2542279+01:00||;True|2025-03-26T16:58:27.4112741+01:00||;True|2025-03-26T15:03:46.9772542+01:00||;True|2025-03-25T11:14:58.7342381+01:00||;True|2025-03-25T09:57:45.7084482+01:00||;True|2025-03-25T07:43:59.3237279+01:00||;True|2025-03-24T14:10:05.5099691+01:00||;True|2025-03-24T13:48:18.7826715+01:00||;True|2025-03-24T08:45:04.4414362+01:00||;True|2025-03-24T08:09:16.9512603+01:00||;True|2025-03-20T14:13:12.1535010+01:00||;True|2025-03-20T14:00:29.9824607+01:00||;True|2025-03-20T13:45:43.1699125+01:00||;True|2025-03-19T14:19:58.3321359+01:00||;True|2025-03-19T13:26:31.1028654+01:00||;True|2025-03-19T12:59:58.9858416+01:00||;True|2025-03-18T13:00:20.7436962+01:00||;False|2025-03-18T12:57:53.3072280+01:00||;</History>
|
||||||
<LastFailureDetails />
|
<LastFailureDetails />
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
</Project>
|
</Project>
|
||||||
@ -14,7 +14,7 @@ using System.Reflection;
|
|||||||
[assembly: System.Reflection.AssemblyCompanyAttribute("WinFormsApp1")]
|
[assembly: System.Reflection.AssemblyCompanyAttribute("WinFormsApp1")]
|
||||||
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
|
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
|
||||||
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
|
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
|
||||||
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+40fb31e1518103b1a61cd4ac5bd6d5ecbb9dac9e")]
|
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+54a4324a7febff6403f28a7d75159411f753c9f5")]
|
||||||
[assembly: System.Reflection.AssemblyProductAttribute("WinFormsApp1")]
|
[assembly: System.Reflection.AssemblyProductAttribute("WinFormsApp1")]
|
||||||
[assembly: System.Reflection.AssemblyTitleAttribute("WinFormsApp1")]
|
[assembly: System.Reflection.AssemblyTitleAttribute("WinFormsApp1")]
|
||||||
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
|
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
|
||||||
|
|||||||
@ -14,7 +14,7 @@ using System.Reflection;
|
|||||||
[assembly: System.Reflection.AssemblyCompanyAttribute("WinFormsApp1")]
|
[assembly: System.Reflection.AssemblyCompanyAttribute("WinFormsApp1")]
|
||||||
[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")]
|
[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")]
|
||||||
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
|
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
|
||||||
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+40fb31e1518103b1a61cd4ac5bd6d5ecbb9dac9e")]
|
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+54a4324a7febff6403f28a7d75159411f753c9f5")]
|
||||||
[assembly: System.Reflection.AssemblyProductAttribute("WinFormsApp1")]
|
[assembly: System.Reflection.AssemblyProductAttribute("WinFormsApp1")]
|
||||||
[assembly: System.Reflection.AssemblyTitleAttribute("WinFormsApp1")]
|
[assembly: System.Reflection.AssemblyTitleAttribute("WinFormsApp1")]
|
||||||
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
|
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -14,7 +14,7 @@ using System.Reflection;
|
|||||||
[assembly: System.Reflection.AssemblyCompanyAttribute("WinFormsApp1")]
|
[assembly: System.Reflection.AssemblyCompanyAttribute("WinFormsApp1")]
|
||||||
[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")]
|
[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")]
|
||||||
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
|
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
|
||||||
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+40fb31e1518103b1a61cd4ac5bd6d5ecbb9dac9e")]
|
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+54a4324a7febff6403f28a7d75159411f753c9f5")]
|
||||||
[assembly: System.Reflection.AssemblyProductAttribute("WinFormsApp1")]
|
[assembly: System.Reflection.AssemblyProductAttribute("WinFormsApp1")]
|
||||||
[assembly: System.Reflection.AssemblyTitleAttribute("WinFormsApp1")]
|
[assembly: System.Reflection.AssemblyTitleAttribute("WinFormsApp1")]
|
||||||
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
|
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user