diff --git a/backend/FwLite/FwDataMiniLcmBridge/Api/FwDataMiniLcmApi.cs b/backend/FwLite/FwDataMiniLcmBridge/Api/FwDataMiniLcmApi.cs index 80eebd829..df1c5c047 100644 --- a/backend/FwLite/FwDataMiniLcmBridge/Api/FwDataMiniLcmApi.cs +++ b/backend/FwLite/FwDataMiniLcmBridge/Api/FwDataMiniLcmApi.cs @@ -160,8 +160,9 @@ internal void CompleteExemplars(WritingSystems writingSystems) } } - public Task CreateWritingSystem(WritingSystemType type, WritingSystem writingSystem) + public async Task CreateWritingSystem(WritingSystemType type, WritingSystem writingSystem) { + await validators.ValidateAndThrow(writingSystem); var exitingWs = type == WritingSystemType.Analysis ? Cache.ServiceLocator.WritingSystems.AnalysisWritingSystems : Cache.ServiceLocator.WritingSystems.VernacularWritingSystems; if (exitingWs.Any(ws => ws.Id == writingSystem.WsId)) { @@ -194,7 +195,7 @@ public Task CreateWritingSystem(WritingSystemType type, WritingSy WritingSystemType.Vernacular => WritingSystemContainer.CurrentVernacularWritingSystems.Count, _ => throw new ArgumentOutOfRangeException(nameof(type), type, null) } - 1; - return Task.FromResult(FromLcmWritingSystem(ws, index, type)); + return FromLcmWritingSystem(ws, index, type); } public async Task UpdateWritingSystem(WritingSystemId id, WritingSystemType type, UpdateObjectInput update) @@ -220,6 +221,7 @@ await Cache.DoUsingNewOrCurrentUOW("Update WritingSystem", public async Task UpdateWritingSystem(WritingSystem before, WritingSystem after) { + await validators.ValidateAndThrow(after); await Cache.DoUsingNewOrCurrentUOW("Update WritingSystem", "Revert WritingSystem", async () => @@ -246,8 +248,9 @@ public IAsyncEnumerable GetPartsOfSpeech() ? FromLcmPartOfSpeech(partOfSpeech) : null); } - public Task CreatePartOfSpeech(PartOfSpeech partOfSpeech) + public async Task CreatePartOfSpeech(PartOfSpeech partOfSpeech) { + await validators.ValidateAndThrow(partOfSpeech); IPartOfSpeech? lcmPartOfSpeech = null; if (partOfSpeech.Id == default) partOfSpeech.Id = Guid.NewGuid(); UndoableUnitOfWorkHelper.DoUsingNewOrCurrentUOW("Create Part of Speech", @@ -259,7 +262,7 @@ public Task CreatePartOfSpeech(PartOfSpeech partOfSpeech) .Create(partOfSpeech.Id, Cache.LangProject.PartsOfSpeechOA); UpdateLcmMultiString(lcmPartOfSpeech.Name, partOfSpeech.Name); }); - return Task.FromResult(FromLcmPartOfSpeech(lcmPartOfSpeech ?? throw new InvalidOperationException("Part of speech was not created"))); + return FromLcmPartOfSpeech(lcmPartOfSpeech ?? throw new InvalidOperationException("Part of speech was not created")); } public Task UpdatePartOfSpeech(Guid id, UpdateObjectInput update) @@ -278,6 +281,7 @@ public Task UpdatePartOfSpeech(Guid id, UpdateObjectInput UpdatePartOfSpeech(PartOfSpeech before, PartOfSpeech after) { + await validators.ValidateAndThrow(after); await PartOfSpeechSync.Sync(before, after, this); return await GetPartOfSpeech(after.Id) ?? throw new NullReferenceException($"unable to find part of speech with id {after.Id}"); } @@ -301,7 +305,7 @@ internal SemanticDomain FromLcmSemanticDomain(ICmSemanticDomain semanticDomain) Id = semanticDomain.Guid, Name = FromLcmMultiString(semanticDomain.Name), Code = semanticDomain.Abbreviation.UiString ?? "", - Predefined = true, // TODO: Look up in a GUID list of predefined data + Predefined = CanonicalGuidsSemanticDomain.CanonicalSemDomGuids.Contains(semanticDomain.Guid), }; } @@ -323,6 +327,7 @@ public IAsyncEnumerable GetSemanticDomains() public async Task CreateSemanticDomain(SemanticDomain semanticDomain) { + await validators.ValidateAndThrow(semanticDomain); if (semanticDomain.Id == Guid.Empty) semanticDomain.Id = Guid.NewGuid(); UndoableUnitOfWorkHelper.DoUsingNewOrCurrentUOW("Create Semantic Domain", "Remove semantic domain", @@ -355,6 +360,7 @@ public Task UpdateSemanticDomain(Guid id, UpdateObjectInput UpdateSemanticDomain(SemanticDomain before, SemanticDomain after) { + await validators.ValidateAndThrow(after); await SemanticDomainSync.Sync(before, after, this); return await GetSemanticDomain(after.Id) ?? throw new NullReferenceException($"unable to find semantic domain with id {after.Id}"); } @@ -429,6 +435,7 @@ public Task UpdateComplexFormType(Guid id, UpdateObjectInput UpdateComplexFormType(ComplexFormType before, ComplexFormType after) { + await validators.ValidateAndThrow(after); await ComplexFormTypeSync.Sync(before, after, this); return ToComplexFormType(ComplexFormTypesFlattened.Single(c => c.Guid == after.Id)); } @@ -460,7 +467,7 @@ private PartOfSpeech FromLcmPartOfSpeech(IPartOfSpeech lcmPos) Id = lcmPos.Guid, Name = FromLcmMultiString(lcmPos.Name), // TODO: Abreviation = FromLcmMultiString(partOfSpeech.Abreviation), - Predefined = true, // NOTE: the !string.IsNullOrEmpty(lcmPos.CatalogSourceId) check doesn't work if the PoS originated in CRDT + Predefined = CanonicalGuidsPartOfSpeech.CanonicalPosGuids.Contains(lcmPos.Guid), }; } @@ -660,6 +667,7 @@ public IAsyncEnumerable SearchEntries(string query, QueryOptions? options public async Task CreateEntry(Entry entry) { entry.Id = entry.Id == default ? Guid.NewGuid() : entry.Id; + await validators.ValidateAndThrow(entry); try { UndoableUnitOfWorkHelper.DoUsingNewOrCurrentUOW("Create Entry", @@ -852,6 +860,7 @@ public Task UpdateEntry(Guid id, UpdateObjectInput update) public async Task UpdateEntry(Entry before, Entry after) { + await validators.ValidateAndThrow(after); await Cache.DoUsingNewOrCurrentUOW("Update Entry", "Revert entry", async () => @@ -957,16 +966,17 @@ private void ApplySenseToLexSense(Sense sense, ILexSense lexSense) return Task.FromResult(lcmSense is null ? null : FromLexSense(lcmSense)); } - public Task CreateSense(Guid entryId, Sense sense, BetweenPosition? between = null) + public async Task CreateSense(Guid entryId, Sense sense, BetweenPosition? between = null) { if (sense.Id == default) sense.Id = Guid.NewGuid(); if (!EntriesRepository.TryGetObject(entryId, out var lexEntry)) throw new InvalidOperationException("Entry not found"); + await validators.ValidateAndThrow(sense); UndoableUnitOfWorkHelper.DoUsingNewOrCurrentUOW("Create Sense", "Remove sense", Cache.ServiceLocator.ActionHandler, () => CreateSense(lexEntry, sense, between)); - return Task.FromResult(FromLexSense(SenseRepository.GetObject(sense.Id))); + return FromLexSense(SenseRepository.GetObject(sense.Id)); } public Task UpdateSense(Guid entryId, Guid senseId, UpdateObjectInput update) @@ -986,6 +996,7 @@ public Task UpdateSense(Guid entryId, Guid senseId, UpdateObjectInput UpdateSense(Guid entryId, Sense before, Sense after) { + await validators.ValidateAndThrow(after); await Cache.DoUsingNewOrCurrentUOW("Update Sense", "Revert Sense", async () => @@ -1067,16 +1078,17 @@ internal void CreateExampleSentence(ILexSense lexSense, ExampleSentence exampleS lexExampleSentence.Reference.get_WritingSystem(0)); } - public Task CreateExampleSentence(Guid entryId, Guid senseId, ExampleSentence exampleSentence) + public async Task CreateExampleSentence(Guid entryId, Guid senseId, ExampleSentence exampleSentence) { if (exampleSentence.Id == default) exampleSentence.Id = Guid.NewGuid(); if (!SenseRepository.TryGetObject(senseId, out var lexSense)) throw new InvalidOperationException("Sense not found"); + await validators.ValidateAndThrow(exampleSentence); UndoableUnitOfWorkHelper.DoUsingNewOrCurrentUOW("Create Example Sentence", "Remove example sentence", Cache.ServiceLocator.ActionHandler, () => CreateExampleSentence(lexSense, exampleSentence)); - return Task.FromResult(FromLexExampleSentence(senseId, ExampleSentenceRepository.GetObject(exampleSentence.Id))); + return FromLexExampleSentence(senseId, ExampleSentenceRepository.GetObject(exampleSentence.Id)); } public Task UpdateExampleSentence(Guid entryId, @@ -1102,6 +1114,7 @@ public async Task UpdateExampleSentence(Guid entryId, ExampleSentence before, ExampleSentence after) { + await validators.ValidateAndThrow(after); await Cache.DoUsingNewOrCurrentUOW("Update Example Sentence", "Revert Example Sentence", async () => diff --git a/backend/FwLite/FwLiteProjectSync.Tests/Sena3SyncTests.cs b/backend/FwLite/FwLiteProjectSync.Tests/Sena3SyncTests.cs index b69dcb937..e8100a5b8 100644 --- a/backend/FwLite/FwLiteProjectSync.Tests/Sena3SyncTests.cs +++ b/backend/FwLite/FwLiteProjectSync.Tests/Sena3SyncTests.cs @@ -11,6 +11,7 @@ namespace FwLiteProjectSync.Tests; +[Trait("Category", "Integration")] public class Sena3SyncTests : IClassFixture, IAsyncLifetime { private readonly Sena3Fixture _fixture; diff --git a/backend/FwLite/FwLiteProjectSync.Tests/SyncTests.cs b/backend/FwLite/FwLiteProjectSync.Tests/SyncTests.cs index 31d75100c..865a16988 100644 --- a/backend/FwLite/FwLiteProjectSync.Tests/SyncTests.cs +++ b/backend/FwLite/FwLiteProjectSync.Tests/SyncTests.cs @@ -74,6 +74,7 @@ public SyncTests(SyncFixture fixture) } [Fact] + [Trait("Category", "Integration")] public async Task FirstSyncJustDoesAnImport() { var crdtApi = _fixture.CrdtApi; @@ -90,6 +91,7 @@ public async Task FirstSyncJustDoesAnImport() } [Fact] + [Trait("Category", "Integration")] public async Task SecondSyncDoesNothing() { var crdtApi = _fixture.CrdtApi; @@ -101,6 +103,7 @@ public async Task SecondSyncDoesNothing() } [Fact] + [Trait("Category", "Integration")] public static async Task SyncFailsWithMismatchedProjectIds() { var fixture = SyncFixture.Create(); @@ -120,6 +123,7 @@ await fixture.Services.GetRequiredService().ProjectData. } [Fact] + [Trait("Category", "Integration")] public async Task CreatingAnEntryInEachProjectSyncsAcrossBoth() { var crdtApi = _fixture.CrdtApi; @@ -154,6 +158,7 @@ await crdtApi.CreateEntry(new Entry() } [Fact] + [Trait("Category", "Integration")] public async Task SyncDryRun_NoChangesAreSynced() { var crdtApi = _fixture.CrdtApi; @@ -189,6 +194,7 @@ await crdtApi.CreateEntry(new Entry() } [Fact] + [Trait("Category", "Integration")] public async Task CreatingAComplexEntryInFwDataSyncsWithoutIssue() { var crdtApi = _fixture.CrdtApi; @@ -240,6 +246,7 @@ public async Task CreatingAComplexEntryInFwDataSyncsWithoutIssue() [Fact] + [Trait("Category", "Integration")] public async Task PartsOfSpeechSyncBothWays() { var crdtApi = _fixture.CrdtApi; @@ -275,6 +282,7 @@ public async Task PartsOfSpeechSyncBothWays() } [Fact] + [Trait("Category", "Integration")] public async Task PartsOfSpeechSyncInEntries() { var crdtApi = _fixture.CrdtApi; @@ -318,6 +326,7 @@ await crdtApi.CreateEntry(new Entry() } [Fact] + [Trait("Category", "Integration")] public async Task SemanticDomainsSyncBothWays() { var crdtApi = _fixture.CrdtApi; @@ -355,6 +364,7 @@ public async Task SemanticDomainsSyncBothWays() } [Fact] + [Trait("Category", "Integration")] public async Task SemanticDomainsSyncInEntries() { var crdtApi = _fixture.CrdtApi; @@ -399,6 +409,7 @@ await crdtApi.CreateEntry(new Entry() } [Fact] + [Trait("Category", "Integration")] public async Task UpdatingAnEntryInEachProjectSyncsAcrossBoth() { var crdtApi = _fixture.CrdtApi; @@ -427,6 +438,7 @@ public async Task UpdatingAnEntryInEachProjectSyncsAcrossBoth() } [Fact] + [Trait("Category", "Integration")] public async Task CanSyncAnyEntryWithDeletedComplexForm() { var crdtApi = _fixture.CrdtApi; @@ -464,6 +476,7 @@ await fwdataApi.CreateEntry(new Entry() } [Fact] + [Trait("Category", "Integration")] public async Task AddingASenseToAnEntryInEachProjectSyncsAcrossBoth() { var crdtApi = _fixture.CrdtApi; @@ -493,6 +506,7 @@ public async Task AddingASenseToAnEntryInEachProjectSyncsAcrossBoth() } [Fact] + [Trait("Category", "Integration")] public async Task CanCreateAComplexFormAndItsComponentInOneSync() { //ensure they are synced so a real sync will happen when we want it to @@ -513,6 +527,7 @@ public async Task CanCreateAComplexFormAndItsComponentInOneSync() } [Fact] + [Trait("Category", "Integration")] public async Task CanCreateAComplexFormTypeAndSyncsIt() { //ensure they are synced so a real sync will happen when we want it to diff --git a/backend/FwLite/LcmCrdt/CrdtMiniLcmApi.cs b/backend/FwLite/LcmCrdt/CrdtMiniLcmApi.cs index 44fa6fcd0..8279b9e0a 100644 --- a/backend/FwLite/LcmCrdt/CrdtMiniLcmApi.cs +++ b/backend/FwLite/LcmCrdt/CrdtMiniLcmApi.cs @@ -45,6 +45,7 @@ public async Task GetWritingSystems() public async Task CreateWritingSystem(WritingSystemType type, WritingSystem writingSystem) { + await validators.ValidateAndThrow(writingSystem); var entityId = Guid.NewGuid(); var wsCount = await WritingSystems.CountAsync(ws => ws.Type == type); try @@ -69,6 +70,7 @@ public async Task UpdateWritingSystem(WritingSystemId id, Writing public async Task UpdateWritingSystem(WritingSystem before, WritingSystem after) { + await validators.ValidateAndThrow(after); await WritingSystemSync.Sync(before, after, this); return await GetWritingSystem(after.WsId, after.Type) ?? throw new NullReferenceException("unable to find writing system with id " + after.WsId); } @@ -101,6 +103,7 @@ public IAsyncEnumerable GetPartsOfSpeech() public async Task CreatePartOfSpeech(PartOfSpeech partOfSpeech) { + await validators.ValidateAndThrow(partOfSpeech); await dataModel.AddChange(ClientId, new CreatePartOfSpeechChange(partOfSpeech.Id, partOfSpeech.Name, partOfSpeech.Predefined)); return await GetPartOfSpeech(partOfSpeech.Id) ?? throw new NullReferenceException(); } @@ -116,6 +119,7 @@ public async Task UpdatePartOfSpeech(Guid id, UpdateObjectInput UpdatePartOfSpeech(PartOfSpeech before, PartOfSpeech after) { + await validators.ValidateAndThrow(after); await PartOfSpeechSync.Sync(before, after, this); return await GetPartOfSpeech(after.Id) ?? throw new NullReferenceException($"unable to find part of speech with id {after.Id}"); } @@ -137,6 +141,7 @@ public async Task DeletePartOfSpeech(Guid id) public async Task CreateSemanticDomain(MiniLcm.Models.SemanticDomain semanticDomain) { + await validators.ValidateAndThrow(semanticDomain); await dataModel.AddChange(ClientId, new CreateSemanticDomainChange(semanticDomain.Id, semanticDomain.Name, semanticDomain.Code, semanticDomain.Predefined)); return await GetSemanticDomain(semanticDomain.Id) ?? throw new NullReferenceException(); } @@ -152,6 +157,7 @@ public async Task UpdateSemanticDomain(Guid id, UpdateObjectInpu public async Task UpdateSemanticDomain(SemanticDomain before, SemanticDomain after) { + await validators.ValidateAndThrow(after); await SemanticDomainSync.Sync(before, after, this); return await GetSemanticDomain(after.Id) ?? throw new NullReferenceException($"unable to find semantic domain with id {after.Id}"); } @@ -192,6 +198,7 @@ public async Task UpdateComplexFormType(Guid id, UpdateObjectIn public async Task UpdateComplexFormType(ComplexFormType before, ComplexFormType after) { + await validators.ValidateAndThrow(after); await ComplexFormTypeSync.Sync(before, after, this); return await GetComplexFormType(after.Id) ?? throw new NullReferenceException($"unable to find complex form type with id {after.Id}"); } @@ -361,6 +368,7 @@ private IEnumerable CreateEntryChanges(Entry entry, Dictionary CreateEntry(Entry entry) { + await validators.ValidateAndThrow(entry); await dataModel.AddChanges(ClientId, [ new CreateEntryChange(entry), @@ -448,6 +456,7 @@ public async Task UpdateEntry(Guid id, public async Task UpdateEntry(Entry before, Entry after) { + await validators.ValidateAndThrow(after); await EntrySync.Sync(before, after, this); return await GetEntry(after.Id) ?? throw new NullReferenceException("unable to find entry with id " + after.Id); } @@ -493,6 +502,7 @@ public async Task CreateSense(Guid entryId, Sense sense, BetweenPosition? throw new InvalidOperationException("Order should not be provided when creating a sense"); sense.Order = await OrderPicker.PickOrder(Senses.Where(s => s.EntryId == entryId), between); + await validators.ValidateAndThrow(sense); await dataModel.AddChanges(ClientId, await CreateSenseChanges(entryId, sense).ToArrayAsync()); return await dataModel.GetLatest(sense.Id) ?? throw new NullReferenceException(); } @@ -509,6 +519,7 @@ public async Task UpdateSense(Guid entryId, public async Task UpdateSense(Guid entryId, Sense before, Sense after) { + await validators.ValidateAndThrow(after); await SenseSync.Sync(entryId, before, after, this); return await GetSense(entryId, after.Id) ?? throw new NullReferenceException("unable to find sense with id " + after.Id); } @@ -538,6 +549,7 @@ public async Task CreateExampleSentence(Guid entryId, Guid senseId, ExampleSentence exampleSentence) { + await validators.ValidateAndThrow(exampleSentence); await dataModel.AddChange(ClientId, new CreateExampleSentenceChange(exampleSentence, senseId)); return await dataModel.GetLatest(exampleSentence.Id) ?? throw new NullReferenceException(); } @@ -566,6 +578,7 @@ public async Task UpdateExampleSentence(Guid entryId, ExampleSentence before, ExampleSentence after) { + await validators.ValidateAndThrow(after); await ExampleSentenceSync.Sync(entryId, senseId, before, after, this); return await GetExampleSentence(entryId, senseId, after.Id) ?? throw new NullReferenceException(); } diff --git a/backend/FwLite/MiniLcm.Tests/AutoFakerHelpers/EntryFakerHelper.cs b/backend/FwLite/MiniLcm.Tests/AutoFakerHelpers/EntryFakerHelper.cs index ae84a8c21..c293934c7 100644 --- a/backend/FwLite/MiniLcm.Tests/AutoFakerHelpers/EntryFakerHelper.cs +++ b/backend/FwLite/MiniLcm.Tests/AutoFakerHelpers/EntryFakerHelper.cs @@ -25,6 +25,7 @@ public static async Task EntryReadyForCreation(this AutoFaker autoFaker, await api.CreatePartOfSpeech(new PartOfSpeech() { Id = sense.PartOfSpeechId.Value, + Predefined = false, Name = { { "en", sense.PartOfSpeech } } }); } diff --git a/backend/FwLite/MiniLcm.Tests/BasicApiTestsBase.cs b/backend/FwLite/MiniLcm.Tests/BasicApiTestsBase.cs index ac0c6074b..914273d3a 100644 --- a/backend/FwLite/MiniLcm.Tests/BasicApiTestsBase.cs +++ b/backend/FwLite/MiniLcm.Tests/BasicApiTestsBase.cs @@ -334,7 +334,7 @@ public async Task CreateSense_WontCreateMissingDomains() var createdSense = await Api.CreateSense(Entry1Id, new Sense() { Id = senseId, - SemanticDomains = [new SemanticDomain() { Id = Guid.NewGuid(), Code = "test", Name = new MultiString() }], + SemanticDomains = [new SemanticDomain() { Id = Guid.NewGuid(), Code = "test", Name = new MultiString(){{"en", "semdom"}} }], }); createdSense.Id.Should().Be(senseId); createdSense.SemanticDomains.Should().BeEmpty("because the domain does not exist (or was deleted)"); @@ -438,7 +438,7 @@ public async Task UpdateSenseSemanticDomain() new Sense() { SemanticDomains = - [new SemanticDomain() { Id = Guid.Empty, Code = "test", Name = new MultiString() }], + [new SemanticDomain() { Id = Guid.Empty, Code = "test", Name = new MultiString(){{"en", "semdom"}} }], Definition = new MultiString { Values = { { "en", "test" } } } } ] diff --git a/backend/FwLite/MiniLcm.Tests/Validators/EntryValidatorTests.cs b/backend/FwLite/MiniLcm.Tests/Validators/EntryValidatorTests.cs index 3a92fc6b9..63c033415 100644 --- a/backend/FwLite/MiniLcm.Tests/Validators/EntryValidatorTests.cs +++ b/backend/FwLite/MiniLcm.Tests/Validators/EntryValidatorTests.cs @@ -11,16 +11,15 @@ public class EntryValidatorTests public void Succeeds_WhenSenseEntryIdIsGuidEmpty() { var entryId = Guid.NewGuid(); - var entry = new Entry() { Id = entryId, Senses = [new Sense() { EntryId = Guid.Empty, }] }; + var entry = new Entry() { Id = entryId, LexemeForm = new MultiString(){{"en", "lexeme"}}, Senses = [new Sense() { EntryId = Guid.Empty, }] }; _validator.TestValidate(entry).ShouldNotHaveAnyValidationErrors(); } [Fact] public void Succeeds_WhenSenseEntryIdMatchesEntry() { - var entryId = Guid.NewGuid(); - var entry = new Entry() { Id = entryId, Senses = [new Sense() { EntryId = entryId, }] }; + var entry = new Entry() { Id = entryId, LexemeForm = new MultiString(){{"en", "lexeme"}}, Senses = [new Sense() { EntryId = entryId, }] }; _validator.TestValidate(entry).ShouldNotHaveAnyValidationErrors(); } @@ -28,7 +27,123 @@ public void Succeeds_WhenSenseEntryIdMatchesEntry() public void Fails_WhenSenseEntryIdDoesNotMatchEntry() { var entryId = Guid.NewGuid(); - var entry = new Entry() { Id = entryId, Senses = [new Sense() { EntryId = Guid.NewGuid(), }] }; + var entry = new Entry() { Id = entryId, LexemeForm = new MultiString(){{"en", "lexeme"}}, Senses = [new Sense() { EntryId = Guid.NewGuid(), }] }; _validator.TestValidate(entry).ShouldHaveValidationErrorFor("Senses[0].EntryId"); } + + [Fact] + public void Succeeds_WhenDeletedAtIsNull() + { + var entryId = Guid.NewGuid(); + var entry = new Entry() { Id = entryId, DeletedAt = null, LexemeForm = new MultiString(){{"en", "lexeme"}}, Senses = [new Sense() { EntryId = entryId, }] }; + _validator.TestValidate(entry).ShouldNotHaveAnyValidationErrors(); + } + + [Fact] + public void Fails_WhenDeletedAtIsNotNull() + { + var entryId = Guid.NewGuid(); + var now = DateTime.UtcNow; + var entry = new Entry() { Id = entryId, DeletedAt = now, LexemeForm = new MultiString(){{"en", "lexeme"}}, Senses = [new Sense() { EntryId = Guid.Empty, }] }; + _validator.TestValidate(entry).ShouldHaveValidationErrorFor("DeletedAt"); + } + + [Fact] + public void Succeeds_WhenLexemeFormIsPresent() + { + var entry = new Entry() { Id = Guid.NewGuid(), LexemeForm = new MultiString(){{"en", "lexeme"}} }; + _validator.TestValidate(entry).ShouldNotHaveAnyValidationErrors(); + } + + [Fact] + public void Fails_WhenLexemeFormIsMissing() + { + var entry = new Entry() { Id = Guid.NewGuid() }; + _validator.TestValidate(entry).ShouldHaveValidationErrorFor("LexemeForm"); + } + + [Fact] + public void Fails_WhenLexemeFormHasWsWithEmptyContent() + { + var entry = new Entry() { Id = Guid.NewGuid(), LexemeForm = new MultiString(){{"en", ""}} }; + _validator.TestValidate(entry).ShouldHaveValidationErrorFor("LexemeForm"); + } + + [Theory] + [InlineData(nameof(Entry.CitationForm))] + [InlineData(nameof(Entry.LiteralMeaning))] + [InlineData(nameof(Entry.Note))] + public void Succeeds_WhenNonEmptyFieldIsPresent(string fieldName) + { + var entry = new Entry() { Id = Guid.NewGuid(), LexemeForm = new MultiString(){{"en", "lexeme"}} }; + SetProperty(entry, fieldName, "content"); + _validator.TestValidate(entry).ShouldNotHaveAnyValidationErrors(); + } + + [Theory] + [InlineData(nameof(Entry.CitationForm))] + [InlineData(nameof(Entry.LiteralMeaning))] + [InlineData(nameof(Entry.Note))] + public void Succeeds_WhenNonEmptyFieldHasNoContent(string fieldName) + { + var entry = new Entry() { Id = Guid.NewGuid(), LexemeForm = new MultiString(){{"en", "lexeme"}} }; + MakePropertyEmpty(entry, fieldName); + _validator.TestValidate(entry).ShouldNotHaveAnyValidationErrors(); + } + + [Theory] + [InlineData(nameof(Entry.CitationForm))] + [InlineData(nameof(Entry.LiteralMeaning))] + [InlineData(nameof(Entry.Note))] + public void Fails_WhenNonEmptyFieldHasWsWithEmptyContent(string fieldName) + { + var entry = new Entry() { Id = Guid.NewGuid(), LexemeForm = new MultiString(){{"en", "lexeme"}} }; + SetProperty(entry, fieldName, ""); + _validator.TestValidate(entry).ShouldHaveValidationErrorFor(fieldName); + } + + [Fact] + public void Fails_WhenComplexFormsContainCircularReference() + { + var entryId = Guid.NewGuid(); + var entry = new Entry() { Id = entryId, LexemeForm = new MultiString(){{"en", "lexeme"}}, ComplexForms = [new ComplexFormComponent(){ ComplexFormEntryId = entryId, ComponentEntryId = Guid.Empty }] }; + _validator.TestValidate(entry).ShouldHaveValidationErrorFor("ComplexForms[0]"); + } + + [Fact] + public void Fails_WhenComponentsContainCircularReference() + { + var entryId = Guid.NewGuid(); + var entry = new Entry() { Id = entryId, LexemeForm = new MultiString(){{"en", "lexeme"}}, Components = [new ComplexFormComponent(){ ComplexFormEntryId = Guid.Empty, ComponentEntryId = entryId }] }; + _validator.TestValidate(entry).ShouldHaveValidationErrorFor("Components[0]"); + } + + + [Fact] + public void Succeeds_WhenComplexFormsContainEmptyGuid() + { + var entryId = Guid.NewGuid(); + var entry = new Entry() { Id = entryId, LexemeForm = new MultiString(){{"en", "lexeme"}}, ComplexForms = [new ComplexFormComponent(){ ComplexFormEntryId = Guid.Empty, ComponentEntryId = entryId }] }; + _validator.TestValidate(entry).ShouldNotHaveAnyValidationErrors(); + } + + [Fact] + public void Fails_WhenComponentsContainEmptyGuid() + { + var entryId = Guid.NewGuid(); + var entry = new Entry() { Id = entryId, LexemeForm = new MultiString(){{"en", "lexeme"}}, Components = [new ComplexFormComponent(){ ComplexFormEntryId = entryId, ComponentEntryId = Guid.Empty }] }; + _validator.TestValidate(entry).ShouldHaveValidationErrorFor("Components[0]"); + } + + private void SetProperty(Entry entry, string propName, string content) + { + var propInfo = typeof(Entry).GetProperty(propName); + propInfo?.SetValue(entry, new MultiString(){{"en", content}}); + } + + private void MakePropertyEmpty(Entry entry, string propName) + { + var propInfo = typeof(Entry).GetProperty(propName); + propInfo?.SetValue(entry, new MultiString()); + } } diff --git a/backend/FwLite/MiniLcm.Tests/Validators/ExampleSentenceValidatorTests.cs b/backend/FwLite/MiniLcm.Tests/Validators/ExampleSentenceValidatorTests.cs new file mode 100644 index 000000000..8ce002626 --- /dev/null +++ b/backend/FwLite/MiniLcm.Tests/Validators/ExampleSentenceValidatorTests.cs @@ -0,0 +1,65 @@ +using FluentValidation.TestHelper; +using MiniLcm.Validators; + +namespace MiniLcm.Tests.Validators; + +public class ExampleSentenceValidatorTests +{ + private readonly ExampleSentenceValidator _validator = new(); + + [Fact] + public void Succeeds_WhenDeletedAtIsNull() + { + var example = new ExampleSentence() { Id = Guid.NewGuid(), Sentence = new MultiString(){{"en", "sentence"}}, DeletedAt = null }; + _validator.TestValidate(example).ShouldNotHaveAnyValidationErrors(); + } + + [Fact] + public void Fails_WhenDeletedAtIsNotNull() + { + var example = new ExampleSentence() { Id = Guid.NewGuid(), DeletedAt = DateTimeOffset.UtcNow }; + _validator.TestValidate(example).ShouldHaveValidationErrorFor("DeletedAt"); + } + + [Theory] + [InlineData(nameof(ExampleSentence.Sentence))] + [InlineData(nameof(ExampleSentence.Translation))] + public void Succeeds_WhenNonEmptyFieldIsPresent(string fieldName) + { + var example = new ExampleSentence() { Id = Guid.NewGuid() }; + SetProperty(example, fieldName, "content"); + _validator.TestValidate(example).ShouldNotHaveAnyValidationErrors(); + } + + [Theory] + [InlineData(nameof(ExampleSentence.Sentence))] + [InlineData(nameof(ExampleSentence.Translation))] + public void Succeeds_WhenNonEmptyFieldHasNoContent(string fieldName) + { + var example = new ExampleSentence() { Id = Guid.NewGuid() }; + MakePropertyEmpty(example, fieldName); + _validator.TestValidate(example).ShouldNotHaveAnyValidationErrors(); + } + + [Theory] + [InlineData(nameof(ExampleSentence.Sentence))] + [InlineData(nameof(ExampleSentence.Translation))] + public void Fails_WhenNonEmptyFieldHasWsWithEmptyContent(string fieldName) + { + var example = new ExampleSentence() { Id = Guid.NewGuid() }; + SetProperty(example, fieldName, ""); + _validator.TestValidate(example).ShouldHaveValidationErrorFor(fieldName); + } + + private void SetProperty(ExampleSentence example, string propName, string content) + { + var propInfo = typeof(ExampleSentence).GetProperty(propName); + propInfo?.SetValue(example, new MultiString(){{"en", content}}); + } + + private void MakePropertyEmpty(ExampleSentence example, string propName) + { + var propInfo = typeof(ExampleSentence).GetProperty(propName); + propInfo?.SetValue(example, new MultiString()); + } +} diff --git a/backend/FwLite/MiniLcm.Tests/Validators/SenseValidatorTests.cs b/backend/FwLite/MiniLcm.Tests/Validators/SenseValidatorTests.cs new file mode 100644 index 000000000..69104e216 --- /dev/null +++ b/backend/FwLite/MiniLcm.Tests/Validators/SenseValidatorTests.cs @@ -0,0 +1,65 @@ +using FluentValidation.TestHelper; +using MiniLcm.Validators; + +namespace MiniLcm.Tests.Validators; + +public class SenseValidatorTests +{ + private readonly SenseValidator _validator = new(); + + [Fact] + public void Succeeds_WhenDeletedAtIsNull() + { + var sense = new Sense() { Id = Guid.NewGuid(), DeletedAt = null }; + _validator.TestValidate(sense).ShouldNotHaveAnyValidationErrors(); + } + + [Fact] + public void Fails_WhenDeletedAtIsNotNull() + { + var sense = new Sense() { Id = Guid.NewGuid(), DeletedAt = DateTimeOffset.UtcNow }; + _validator.TestValidate(sense).ShouldHaveValidationErrorFor("DeletedAt"); + } + + [Theory] + [InlineData("Definition")] + [InlineData("Gloss")] + public void Succeeds_WhenNonEmptyFieldIsPresent(string fieldName) + { + var sense = new Sense() { Id = Guid.NewGuid() }; + SetProperty(sense, fieldName, "content"); + _validator.TestValidate(sense).ShouldNotHaveAnyValidationErrors(); + } + + [Theory] + [InlineData("Definition")] + [InlineData("Gloss")] + public void Succeeds_WhenNonEmptyFieldHasNoContent(string fieldName) + { + var sense = new Sense() { Id = Guid.NewGuid() }; + MakePropertyEmpty(sense, fieldName); + _validator.TestValidate(sense).ShouldNotHaveAnyValidationErrors(); + } + + [Theory] + [InlineData("Definition")] + [InlineData("Gloss")] + public void Fails_WhenNonEmptyFieldHasWsWithEmptyContent(string fieldName) + { + var sense = new Sense() { Id = Guid.NewGuid() }; + SetProperty(sense, fieldName, ""); + _validator.TestValidate(sense).ShouldHaveValidationErrorFor(fieldName); + } + + private void SetProperty(Sense sense, string propName, string content) + { + var propInfo = typeof(Sense).GetProperty(propName); + propInfo?.SetValue(sense, new MultiString(){{"en", content}}); + } + + private void MakePropertyEmpty(Sense sense, string propName) + { + var propInfo = typeof(Sense).GetProperty(propName); + propInfo?.SetValue(sense, new MultiString()); + } +} diff --git a/backend/FwLite/MiniLcm/Validators/CanonicalGuidsPartOfSpeech.cs b/backend/FwLite/MiniLcm/Validators/CanonicalGuidsPartOfSpeech.cs new file mode 100644 index 000000000..22937608a --- /dev/null +++ b/backend/FwLite/MiniLcm/Validators/CanonicalGuidsPartOfSpeech.cs @@ -0,0 +1,69 @@ +using System.Collections.Frozen; + +namespace MiniLcm.Validators; + +public static class CanonicalGuidsPartOfSpeech +{ + // GUID list taken from src/SIL.LCModel/Templates/GOLDEtic.xml in liblcm + // TODO: Consider loading GOLDEtic.xml into app as a resource and add singleton providing access to it, then look up GUIDs there rather than using this hardcoded list + public static readonly FrozenSet CanonicalPosGuids = [ + new Guid("30d07580-5052-4d91-bc24-469b8b2d7df9"), + new Guid("ae115ea8-2cd7-4501-8ae7-dc638e4f17c5"), + new Guid("18f1b2b8-0ce3-4889-90e9-003fed6a969f"), + new Guid("923e5aed-d84a-48b0-9b7a-331c1336864a"), + new Guid("46e4fe08-ffa0-4c8b-bf98-2c56f38904d9"), + new Guid("31616603-aadd-47af-a710-cb565fbbbd57"), + new Guid("131209ac-b8f1-44aa-b4f0-9a983e3d5bad"), + new Guid("6e0682a7-efd4-43c9-b083-22c4ce245419"), + new Guid("75ac4332-a445-4ce8-918e-b27b04073745"), + new Guid("2d7a5bc6-bbc7-4be9-a036-3d046dbc65f7"), + new Guid("09052f32-bf65-400a-8179-6a1c54ef30c9"), + new Guid("a0a9906d-d987-42cb-8a65-f549462b16fc"), + new Guid("8f7ba502-e7c9-4bc4-a881-b0cb1b630466"), + new Guid("c5f222a3-e1aa-4250-b196-d94f0eb0d47b"), + new Guid("6df1c8ee-5530-4180-99e8-be2afab0f60d"), + new Guid("af3f65de-b0d5-4243-a196-53b67bd6a4df"), + new Guid("92ab3e14-e1af-4e7f-8492-e37a1f386e3f"), + new Guid("d07c625d-ff8b-4c4e-99be-e32b2924626e"), + new Guid("093264d7-06c3-42e1-bc4d-5a965ce63887"), + new Guid("a4a759b4-5a10-4d7a-80a3-accf5bd840b1"), + new Guid("e680330e-2b41-4bec-b96b-514743c47cae"), + new Guid("a5311f3b-ff98-47d2-8ece-b1aca03a8bbd"), + new Guid("b330eb7d-f43d-4531-846e-5cd5820851ad"), + new Guid("1c030229-affa-4729-9773-878100c1fd28"), + new Guid("3d9d43d6-527c-4e79-be00-82cf2d0fd9bd"), + new Guid("0e652cc3-ef08-4cb1-8b73-a68ebd8e7c04"), + new Guid("25b2ef8c-d87e-4868-898c-8f5375afeeb3"), + new Guid("cc60cb18-5067-442b-a740-d3b913b2610a"), + new Guid("d32dff62-4117-4762-a887-96478406769b"), + new Guid("a8e41fd3-e343-4c7c-aa05-01ea3dd5cfb5"), + new Guid("085360ef-166c-4324-a5c4-5f4d8eabf75a"), + new Guid("18b523c8-7dca-4361-93d8-6d039335f26d"), + new Guid("a8d31dff-1cdd-4bc7-ab3a-befef67711c2"), + new Guid("584412e9-3a96-4251-99e2-438f1394432e"), + new Guid("83fdec31-e15b-40e7-bcd2-69134c5a0fcd"), + new Guid("6e758bbc-2b40-427d-b79f-bf14a7c96c6a"), + new Guid("c6853f58-a74c-483e-9494-732002a7ab5b"), + new Guid("07455e91-118a-4d7d-848c-39bedd355a3d"), + new Guid("12435333-c423-43d7-acf9-6028e3d20a42"), + new Guid("f1ac9eab-5f8c-41cf-b234-e53405aaaac5"), + new Guid("4e676ad2-542d-461d-9d78-1dbcb55ec456"), + new Guid("a4fc78d6-7591-4fb3-8edd-82f10ae3739d"), + new Guid("e5e7d0cb-36c5-497d-831c-cb614e283d7c"), + new Guid("e28bb667-fcaa-4c6e-944b-9b90683a2570"), + new Guid("d599dd69-b445-4627-a7f3-b9647abdb905"), + new Guid("a3274cfd-225f-45fd-8851-a7b1a1e1037a"), + new Guid("b5d9ab85-fa93-4d6a-892b-837efb299ef7"), + new Guid("2fad3a89-47d7-472a-a8cc-270e7e3e0239"), + new Guid("98f5507f-bf51-43e4-8e08-e066c36c6d6e"), + new Guid("64e3b502-90f5-4df0-9212-65f6e5c96c30"), + new Guid("605c54f9-a81f-4bca-8d8c-a6fb08c29676"), + new Guid("d9a90c6c-3575-4937-bfaf-b3585a1954a9"), + new Guid("3f9bffe2-da9b-42fa-afbd-d7ca8bca7d4a"), + new Guid("86ff66f6-0774-407a-a0dc-3eeaf873daf7"), + new Guid("55f2a00e-5f07-4ace-8a44-8794ed1a38a8"), + new Guid("efadf1d3-580a-4e4b-a94c-3f1d6e59c5fc"), + new Guid("4459ff09-9ee0-4b50-8787-ae40fd76d3b7"), + new Guid("54712931-442f-42d5-8634-f12bd2e310ce"), + ]; +} diff --git a/backend/FwLite/MiniLcm/Validators/CanonicalGuidsSemanticDomain.cs b/backend/FwLite/MiniLcm/Validators/CanonicalGuidsSemanticDomain.cs new file mode 100644 index 000000000..bb4d9a4a4 --- /dev/null +++ b/backend/FwLite/MiniLcm/Validators/CanonicalGuidsSemanticDomain.cs @@ -0,0 +1,1804 @@ +using System.Collections.Frozen; + +namespace MiniLcm.Validators; + +public static class CanonicalGuidsSemanticDomain +{ + // GUID list taken from src/SIL.LCModel/Templates/SemDom.xml in liblcm + // TODO: Consider loading SemDom.xml into app as a resource and add singleton providing access to it, then look up GUIDs there rather than using this hardcoded list + public static readonly FrozenSet CanonicalSemDomGuids = [ + // TODO: convert to Guid constructor that won't have to parse all these strings. Obviously do something automated to get the result. Then do same for CanonicalGuidsPartOfSpeech because why not. + new Guid("63403699-07C1-43F3-A47C-069D6E4316E5"), + new Guid("999581C4-1611-4ACB-AE1B-5E6C1DFE6F0C"), + new Guid("DC1A2C6F-1B32-4631-8823-36DACC8CB7BB"), + new Guid("1BD42665-0610-4442-8D8D-7C666FEE3A6D"), + new Guid("B044E890-CE30-455C-AEDE-7E9D5569396E"), + new Guid("A0D073DF-D413-4DFD-9BA1-C3C68F126D90"), + new Guid("E836B01B-6C1A-4D41-B90A-EA5F349F88D4"), + new Guid("18595DF7-1C69-40DB-A7C1-74D490115C0C"), + new Guid("B4AA4BBD-8ABF-4503-96E4-05C75EFD23D5"), + new Guid("93B8BD61-137A-4EBC-B12F-52FA5D2B3EA4"), + new Guid("5B12EA7B-790F-4F3E-8D07-893FC267773E"), + new Guid("BFA3BE74-0390-4E2E-BDB7-ED41EB67E4F1"), + new Guid("AB8F12FB-57B0-4D61-8AE0-50D7CBC412DF"), + new Guid("380B0D15-77A1-49BA-AD83-A508E7FFB83D"), + new Guid("63C69D11-1101-4870-AEB8-43EE364381B0"), + new Guid("349937E3-A2FD-41F8-B7C4-BD6FA106ADD4"), + new Guid("E6B21531-B7D0-4E37-B01B-3CA49A285168"), + new Guid("B47D2604-8B23-41E9-9158-01526DD83894"), + new Guid("CCE98603-FF8F-4213-945A-BD6746716139"), + new Guid("0AC5E5F9-E7FE-4D37-A631-EAB1CEB1F8AE"), + new Guid("D50F3921-FCEA-4AC9-B64A-25BF47DC3292"), + new Guid("4FB79B12-3BD1-46ED-8698-7D27052A5DC7"), + new Guid("CD403434-A5A1-4700-8AD3-B7C9AABD99D9"), + new Guid("B3BE00A9-41A4-42AE-BA51-320B5000A563"), + new Guid("7988974C-99FD-40DD-9B5E-2D81EC603DDC"), + new Guid("B3745F13-3632-4F13-B0CC-A74C51F8F2A1"), + new Guid("F899802D-BD32-427F-A101-C84219F7E14E"), + new Guid("180A2220-942C-4E17-96EE-CD4F63A4C715"), + new Guid("0F07ADB7-4387-4723-9800-8362E825AD45"), + new Guid("3DF7D174-83D1-4E17-890E-1272E171CA41"), + new Guid("56C9C38C-728A-42FE-B93C-6CA67FDF2A9A"), + new Guid("21BCC306-13CB-4162-98B3-2BA319BA14EA"), + new Guid("756728A8-9EB8-4329-AEE2-D6A3D64585F2"), + new Guid("F56A2511-10CC-4829-940D-49051429BFBA"), + new Guid("962CB994-0183-4AC5-94B2-82A33F1D64E4"), + new Guid("34C3EDAD-A158-44E7-989B-5B74401E6945"), + new Guid("60364974-A005-4567-82E9-7AAEFF894AB0"), + new Guid("79EBB5CE-F0FD-4FB5-9F22-1FA4965A555B"), + new Guid("14E9C20C-6EB5-49A4-A03F-3BE26A934500"), + new Guid("31777669-E37B-4B77-9CCE-0D8C33F6EBB9"), + new Guid("4153416A-784D-4F7C-A664-2640F7979A14"), + new Guid("BF6E1719-11EE-4ACE-9C84-72019C01AABC"), + new Guid("928741B5-BFF6-4DD1-BE37-EC6E7A4EB6CA"), + new Guid("50AB3705-A81E-4FCC-B3AE-95C075966F69"), + new Guid("60595D09-4A15-4499-B6E1-D36A704BCBE9"), + new Guid("647603C2-6F32-48F3-91FA-1F7F0E44B539"), + new Guid("A9FBC056-3134-41AF-BAF4-9F63FA5BD5AE"), + new Guid("741C417A-11E9-460C-9AB3-51B8220DF016"), + new Guid("B09205D4-FBB4-4BCD-94EF-F8D83E298462"), + new Guid("C1A63BA2-1DB6-410D-A4ED-5F64D1798BC1"), + new Guid("F38F8344-838F-44BA-B103-22289C2D2793"), + new Guid("0B0801A3-8A0C-40EA-BF41-07DF80BD0D5F"), + new Guid("BF25931D-4760-4C66-ABE8-C05A6DC5ADBE"), + new Guid("E7E5DBF2-6D5B-4869-B357-8A7860C29002"), + new Guid("4D19F09F-035B-477E-862C-A4157ACDFE81"), + new Guid("8D47C9EC-80C4-4309-9848-C453DCD71182"), + new Guid("06A89652-70E0-40ac-B929-ED42F011C9FC"), + new Guid("1C512719-6ECB-48cb-980E-4FF20E8B5F9B"), + new Guid("025DA6F4-B1B6-423A-8C0F-B324F531A6F1"), + new Guid("0EE5B933-F1AB-485F-894A-51FE239CB726"), + new Guid("531AF868-B5FB-41C2-BA50-764458F9102F"), + new Guid("C345F278-91FF-463D-B9A6-8ABAC8A267EB"), + new Guid("D06DAE77-134A-403F-BA88-52ECD66C0522"), + new Guid("D117AA22-3F18-47C4-9683-51ECF1DC7134"), + new Guid("D2CA3194-E393-480E-AE1D-DD67BED55227"), + new Guid("F7B7EB3C-B784-4BA5-8DAC-A68FD27CE0EA"), + new Guid("944CF5AF-469E-4B03-878F-A05D34B0D9F6"), + new Guid("73499B8B-76FC-4121-8BFA-1BDEBE537259"), + new Guid("5E9F361D-17DC-4ADA-A312-8DA269D22A64"), + new Guid("40248A12-1809-4561-B786-E4E274C14D82"), + new Guid("56EF3F06-7FB9-462E-A7D0-517F3CE1623F"), + new Guid("BBD3C3F1-7387-4EC6-A75D-66C1355A94EF"), + new Guid("A8B9E892-DF3E-44C4-8C68-7A0F7F4468BB"), + new Guid("31171AA9-E243-4B46-ABD8-F3E52843CDFC"), + new Guid("445F3084-F250-40FA-87BA-EBD233F9018F"), + new Guid("E22D860A-D207-4649-8AB5-4592B838FEBB"), + new Guid("2C322D8B-D762-43CE-B905-AAB41F9C7BBB"), + new Guid("83B483B8-F036-44BE-8510-EA337D010A1C"), + new Guid("EE446395-781B-4651-AFEF-CAD78B71F843"), + new Guid("7D472317-B5E8-4CAE-A03F-913ECDAF4C29"), + new Guid("36B3CFB6-0FEA-4628-AA8D-F9B7AF48F436"), + new Guid("FAF0AE24-6584-4766-A93B-389C1CB06D8D"), + new Guid("C21C28E8-9731-4EE0-ACBB-32501BF8ABD1"), + new Guid("8D8A7656-8F8E-467E-B72E-535DB6A17C6A"), + new Guid("85188748-1919-4210-A9E9-91171D9D6454"), + new Guid("3014DE03-88E5-4330-9682-51963A41CA50"), + new Guid("ECC39BC2-6336-48CA-BE46-CF5E49A3C267"), + new Guid("CFB159F7-82F6-4789-B9B4-8F611820F350"), + new Guid("38473463-4B92-4681-8FD0-0ACA0342E88A"), + new Guid("FFD0547E-E537-4614-AC3F-6D8CD3351F33"), + new Guid("E6221C7A-4608-4114-BA9F-532A3B943113"), + new Guid("203F46D2-F0D0-4DDA-8D1A-DDC15065B005"), + new Guid("73F3BD83-C9A5-4613-AEB1-0C5076D4850E"), + new Guid("0A37E7D5-B10E-4F1D-BAF0-E71668425B3E"), + new Guid("5D72AF95-FACD-4BE2-80E9-37528F0F34B5"), + new Guid("AC187298-85E8-43ED-BA85-CC06A62C08BA"), + new Guid("B6A40216-FE93-4B0F-B85B-5622327031D0"), + new Guid("E76227E8-4A04-4FBD-A16E-5BAA3D9E97A9"), + new Guid("284433DF-7B37-4E63-A614-78520C483213"), + new Guid("8F68D85F-70F8-4662-9B4B-1DD2900A002A"), + new Guid("CB99A086-8C6D-4F90-81DB-6AFA69AE5455"), + new Guid("17D5F429-6550-4A3A-A755-5AC3C3D7E04F"), + new Guid("85646774-8145-4553-B8A7-6927CD077908"), + new Guid("7C64F65B-2889-4F90-BA61-6B5F7634D4BC"), + new Guid("AA57936D-F8A9-4603-8C3D-27ABCCD13531"), + new Guid("F4ED1712-C072-4213-B89D-EB3A9BE233B2"), + new Guid("BA06DE9E-63E1-43E6-AE94-77BEA498379A"), + new Guid("1B0270A5-BABF-4151-99F5-279BA5A4B044"), + new Guid("D98C1C67-B70E-4A35-89DB-2E744BD5197F"), + new Guid("BC8D0AD4-6EBF-4FA0-BC7E-60E8EC9C43DB"), + new Guid("2E97B83D-1152-473F-9CBE-347F0655041A"), + new Guid("68ED3E51-DDC4-4cec-89FF-605259AC9FCF"), + new Guid("E626C65E-EB79-4230-B07A-A6D975D3FE3D"), + new Guid("C8602DC5-5C91-480a-B5CE-1C82FE3DA83A"), + new Guid("A80F12AA-C30D-4892-978A-B076985742D5"), + new Guid("C5282457-BE5F-4CE9-A802-91140CB0A22B"), + new Guid("C2F01AA8-9F94-43C9-9ADA-B1E4A60ABA07"), + new Guid("71F89512-17F0-484C-ACA8-DDD226E3C794"), + new Guid("9CFE4C5A-80D4-4B31-BA89-79B2E3D28A1C"), + new Guid("DF2B9D7A-9B90-4704-8BC3-11DCFFE985F4"), + new Guid("2E5ACFD2-3009-4496-9CC2-58D2A0088994"), + new Guid("1D8633E0-4279-4DDC-826E-16AA08A977E5"), + new Guid("49C525B3-2163-48E1-B3BD-57E5CDC486A4"), + new Guid("4C862416-F7C4-4A3C-82AC-FE81E1EFB879"), + new Guid("2D0B3058-D8BB-4110-A54A-E507B0D3A0E4"), + new Guid("B9A4B336-080A-4973-A7E3-A9AF10FC347C"), + new Guid("7DBD7F43-4291-47F8-A392-6FDF3C98D522"), + new Guid("3D5D93CE-00E0-46FF-B220-553C12C38381"), + new Guid("7FE69C4C-2603-4949-AFCA-F39C010AD24E"), + new Guid("A1959B00-9702-4B45-AC46-93F18D3BC5E6"), + new Guid("8B52A9D6-A07E-4ac8-8F84-6EB5BA578D97"), + new Guid("75825D72-695B-4E92-9F33-0F3AB4D7DD11"), + new Guid("591FD489-36E6-4FFD-A976-58876D851829"), + new Guid("8C41D2D1-6DA6-4AB8-8B29-7E226192D64E"), + new Guid("D395EDC8-FB58-4BA4-8446-DACF8EA0477A"), + new Guid("E7F94AEA-BA50-481D-B640-D5CD8BDEDC72"), + new Guid("CBC24A98-1C64-467E-98AA-251A28E4C0B8"), + new Guid("38BBB33A-90BF-4A2C-A0E5-4BDE7E134BD9"), + new Guid("A8568A16-4C3B-4CE4-84A7-B8B0C6B0432F"), + new Guid("D7861DEF-70C1-470F-BCA6-8230CBBAA3E9"), + new Guid("FDA0C1AC-5728-4ba2-9F8E-827F161B5BB1"), + new Guid("90C06635-A12C-4cd4-A190-46925FF0F43E"), + new Guid("273F4956-F79F-4B1E-B552-466280A65E60"), + new Guid("3F4C559F-AB4F-411F-A23B-D2396C977005"), + new Guid("79A33505-0C33-4E92-89B9-6A42E6FF2228"), + new Guid("CD6F1B37-5BDD-4237-8827-B1C947C8E1B4"), + new Guid("EC118A28-FD23-48B3-8819-BFE1329F028D"), + new Guid("4275DF2E-D4F6-461A-9279-39E0712DC082"), + new Guid("E4517880-AA2D-4977-B55A-DCB0B6D1F533"), + new Guid("2F151C35-72E1-4665-BC05-6FC70A3ECFF2"), + new Guid("E4E05724-01EC-4C61-90F0-B8658CC8CA51"), + new Guid("8503660C-03AF-49EE-86B6-525AAB4DA828"), + new Guid("0DE28F92-C851-413c-BB6C-3AD21F5E267F"), + new Guid("ACF5E294-D169-45C1-A9D3-960536E018CC"), + new Guid("FD33670E-EF16-4566-A62E-AA077E58407B"), + new Guid("6804DB44-B71B-4452-98B1-B726BC7CF022"), + new Guid("D853597B-F3ED-470b-B6DD-8FE93B8E43EB"), + new Guid("8497FB66-8B91-46B9-A0D5-FB9385319561"), + new Guid("ED7930DF-E7B4-43C9-A11A-B09521276B57"), + new Guid("72274E9D-5D3C-4AE7-93AB-DB3617CDDA1E"), + new Guid("295DC021-5B50-47B3-8340-1631C6D6FADC"), + new Guid("F7706644-542F-4FCB-B8E1-E91D04C8032A"), + new Guid("E949F393-2A5B-4792-AF8F-75138322CEEE"), + new Guid("94AF09FA-FF23-433B-A881-CEACA87D9D18"), + new Guid("2DAEDE19-CE5F-46b6-AE68-32D6092441F1"), + new Guid("B5700AD7-36A1-4608-8789-8F84007244F8"), + new Guid("2C401E7F-6CE9-470F-B6B6-FADF7A798536"), + new Guid("32BEBE7E-BDCC-4E40-8F0A-894CD6B26F25"), + new Guid("7C6CAD26-79C3-403A-A3AA-59BABDFCD46F"), + new Guid("104D40C9-2A4F-4696-AD99-5CF0EB86AB2E"), + new Guid("CF337287-C9FA-43D2-93C4-284F45E262C0"), + new Guid("F0DE6C5A-3DF6-4483-8C63-2D8FCD6C97BE"), + new Guid("4D2A67FB-91C8-4436-87F4-F4EAB6CB0828"), + new Guid("39DCB6B9-94DF-45BE-A128-C14C7A9DCDBD"), + new Guid("77F0D0DC-61EE-4373-9879-35A7059BD892"), + new Guid("9D865347-6656-4AB7-8613-BF2E8BC53AA7"), + new Guid("5FCADAE4-B4A8-4600-8D30-C4F67986D619"), + new Guid("962941B2-66BD-437F-AADC-B1921BCAE5B4"), + new Guid("C2DBE83A-D638-45AC-A6D5-5F041B9DDE71"), + new Guid("B602C0E1-5398-4CC9-850B-7CFB5C592D13"), + new Guid("23FB1571-C04E-4850-B499-F170BC45247F"), + new Guid("3BE7E3FE-89D4-471A-92BD-8C70FCB146BB"), + new Guid("D2F05CC8-1A3F-4BC2-9A2B-38174BB84091"), + new Guid("4A5C8FDB-C8A0-49D2-A0D6-342428682D65"), + new Guid("FA32115E-E389-47bd-91E1-61779172CCF2"), + new Guid("A894D991-D5DA-45A6-9C62-009133257F36"), + new Guid("768AED05-DBC9-4CAF-9461-76CB3720F908"), + new Guid("5238FE9C-4BBE-444C-B5F6-18F946B3D6AA"), + new Guid("6EABA0C3-CDFE-435D-8811-7F2DDF6FACBD"), + new Guid("D83EBE2C-C1D6-49EC-A4A9-1CDCED843387"), + new Guid("81E03DF2-33A8-4735-AA23-80EF1C63679E"), + new Guid("5C091D8D-5BC4-40C3-8A30-2A08FB0794B8"), + new Guid("101C16F8-EC76-4EC7-895A-FD814FEF51DD"), + new Guid("C01BBCEF-7D89-4753-BAFD-3A7F23648982"), + new Guid("B82C7BA0-9F4E-44DA-BCD0-D30F5B224DE5"), + new Guid("F3627C41-5DAF-4F73-AC42-8A0522035E0B"), + new Guid("250A52E4-EDE0-427D-8382-46A5742D4F96"), + new Guid("8E88ED6A-000D-400A-8CD8-7B3CC7F1818C"), + new Guid("A01A1900-FC1F-462E-BA3D-AE822711B034"), + new Guid("50DB27B5-89EB-4FFB-AF82-566F51C8EC0B"), + new Guid("FFCC57F8-6C6D-4BF4-85BE-9220CA7C739D"), + new Guid("2E95BD1E-82F0-461D-8CA6-B5F1CE1FB180"), + new Guid("ED4A2CA6-C03C-4C72-9431-B72FB7294B8F"), + new Guid("F7E625A6-53E3-4F9B-8764-119E3906F5CF"), + new Guid("F6E416B3-50B1-4E48-8A39-2998725B1C79"), + new Guid("EDBFC928-049C-4CB7-8C88-8E8AF38287C7"), + new Guid("C753FC8B-22AE-4E71-807F-56FB3EBD3CDD"), + new Guid("9F6754AE-A429-4BBA-8F6F-2CD4EA0CBE45"), + new Guid("23190F9E-2DB2-4EF9-8C0E-495DBEF05571"), + new Guid("B0905FA9-2F90-410B-8EB5-7C7944C4F0F9"), + new Guid("35E61EC4-0542-4583-B5DA-0AA5E31A35AA"), + new Guid("3CB4C07C-8760-4FF9-8D45-1C0BED80FFB3"), + new Guid("BD002DFA-E842-47D6-B11B-3C213CBF133A"), + new Guid("DBEBC3BD-2D01-4D62-A009-866C18EE3527"), + new Guid("56984B2B-3417-49B4-A082-1A383551A9E9"), + new Guid("5C468A85-E45F-4EA0-A3BA-68FEDA7E85A1"), + new Guid("F3D162D7-DA79-4CE4-9610-040F03B57D9D"), + new Guid("F4F99472-0B23-42B9-8B51-1D56FE24715B"), + new Guid("447F258B-2160-42C7-9431-FFEEB86EDCB8"), + new Guid("34A02A17-23FB-4260-9F97-C125842A3594"), + new Guid("444407F2-0C75-4BB9-A84C-CBD52D0FA9C9"), + new Guid("79CA34EA-68A7-4FE9-B5AC-4F3D6A1AB99D"), + new Guid("A19E219A-6CC1-4057-A8D9-18554AE88DE1"), + new Guid("7D472DD5-636D-4499-BF66-83CF23C0DBE1"), + new Guid("CA91E41A-81C3-4C96-87E6-F67477FCD686"), + new Guid("F74F28D1-8742-4C9F-95DC-D08336E91249"), + new Guid("FC82FCEC-D03C-4FB0-BF62-714C71754402"), + new Guid("8FFF393A-23C2-42BB-8DA8-9B151E790904"), + new Guid("F718FC15-59B2-4B6A-A9E3-39B3E8D487D7"), + new Guid("ADF6AD2B-7AF9-4BD8-A7B4-F864B9DAD86D"), + new Guid("9E587127-4F2C-4796-9C67-D37332B57303"), + new Guid("0DB5817E-05BF-4703-A6B9-E239AC44F857"), + new Guid("04582A28-B94A-4E7F-8CC4-5CDEFA8A39F0"), + new Guid("AE6F73AB-432D-42E8-AA1A-C848652A13F0"), + new Guid("1C3C8AF0-56B9-4617-862E-21F39B388606"), + new Guid("B8D2FDB9-22EA-4040-8ABB-AEEFF0399F23"), + new Guid("7E2B6218-0837-4B16-A982-C9535CCCDB21"), + new Guid("08D5E632-0AED-4924-B3BB-D43DE3420385"), + new Guid("F2D0F288-5BBE-4FA0-9E8F-DDCC74891701"), + new Guid("CA9C215A-E568-4D09-B3A9-B5727CD831D6"), + new Guid("32CF3835-BCED-4EA1-9C7A-F7FF653E59FE"), + new Guid("1EC85151-EBA0-48F4-B56D-4F8040602A4B"), + new Guid("0281FB1D-AB12-41b9-A3DC-09EF6B1E4733"), + new Guid("F4491F9B-3C5E-42AB-AFC0-F22E19D0FFF5"), + new Guid("1CB79293-D4F7-4990-9F50-3BB595744F61"), + new Guid("6FE11B6A-8D01-4A0B-BDEB-E4E6F420340A"), + new Guid("A2508183-7EA5-434E-A773-00D53087D27B"), + new Guid("E9EF98D9-8844-4804-88A5-614493D150F5"), + new Guid("267B98AA-E17C-4EBB-A752-ED4210701867"), + new Guid("5B5BCD42-09BB-4c2f-A2DA-569CFA69B6AC"), + new Guid("878A313B-A201-444E-8BDB-67048D60C63E"), + new Guid("DF9EE372-E92E-4F73-AAC5-D36908497698"), + new Guid("7185BD93-5281-46DE-80AF-767F0EC40FF6"), + new Guid("2A2AF155-9DB9-41C5-860A-FE0A3A09D6DE"), + new Guid("BE89E0BA-4C6A-4986-AC0D-859A901B89A1"), + new Guid("48AC206F-2706-4500-BB63-2E499B790259"), + new Guid("1F3519F8-D946-4857-A1FD-553D98DDDF6D"), + new Guid("6866EE4C-78CD-47D1-BA4A-8461FDCC5E2A"), + new Guid("3FD34185-19A1-44BD-8555-BC76E2847BEE"), + new Guid("A42DB5B4-6317-4D3F-BEFF-CB92DBACA914"), + new Guid("F0E68D2F-F7B3-4722-80A4-8E9C5638B0D4"), + new Guid("F39B14C4-52CF-4AFA-956C-F0F5815EF6AC"), + new Guid("167BFBA5-0785-4BB5-A083-3FFBEFA57897"), + new Guid("F1AF3F4C-6E0E-4CFA-ADCF-9DCDDF05FEAB"), + new Guid("909A3113-88BC-470B-8D48-7C0D37966982"), + new Guid("EAC4B58E-1FD7-4CE1-9A68-C7516470E876"), + new Guid("880647E5-6543-46DD-9178-8EDAE9272ADD"), + new Guid("07476166-C5E5-4701-97D3-D97DE8B5BE6F"), + new Guid("14954A0F-5C8A-4680-90B0-53398BD3A2A7"), + new Guid("E3300171-D7B2-4FB4-A103-E8FDCF3FF2ED"), + new Guid("E0E8AF5A-04C1-49a1-9955-9A2AF7879068"), + new Guid("D10301F3-573C-4005-AD65-1C73FB80B3B6"), + new Guid("CAB8E9DC-5E4F-4A12-8B3D-4ACBB7AD2059"), + new Guid("CBA1F6CC-58AC-4D09-AA6A-1661F5945787"), + new Guid("6EA13B69-B2A8-41f9-B0BC-14316EBC5118"), + new Guid("541DFA10-BF97-4713-A534-9CBCC7F66BC9"), + new Guid("C0F4715E-55C9-4379-AB6F-AD561A5E7151"), + new Guid("691BDBA3-C216-4b42-877C-674BBDB517A7"), + new Guid("0F46CB61-7BB5-410D-ABC5-4A75DC80A24F"), + new Guid("6FC8AE4D-9FAD-462E-9EA0-C613C3C1CB5E"), + new Guid("FD9B8618-1F62-419B-85C3-365A12E85523"), + new Guid("1D5C798B-0F2D-49F2-BDE6-CBCF2EF8FD02"), + new Guid("2855CDA6-A031-46AA-BF3F-718D94374D46"), + new Guid("B8E633F7-CA67-40CB-84E7-8B42887D161B"), + new Guid("81E366FA-450B-42AD-B23F-7074DC7823E2"), + new Guid("3AAB9C42-B696-4440-8E28-8380F5D25199"), + new Guid("6C6259F0-ECA6-4A30-8662-EEDBAF293527"), + new Guid("A3F1D702-8CA1-457A-A569-EB6FDF696BBE"), + new Guid("9F868391-F1DF-4682-BDCB-2C2C799006CF"), + new Guid("CE30EB9C-8260-476B-878C-0A078D596955"), + new Guid("A86B2E14-1299-4F59-842C-C4C5A401AACE"), + new Guid("65A928B8-8587-48BE-8F23-41F85549C547"), + new Guid("45E90D41-A462-4671-968F-92166378B3F0"), + new Guid("5E3BB9E5-FD70-4C5A-95A0-938BC4876A47"), + new Guid("AAF63ABD-C8A5-4546-8FC1-A51C6E607683"), + new Guid("218C1D59-0EBB-4936-B9CF-0A93E88AA729"), + new Guid("C956A98A-4C85-4C85-868D-F27F44BD6422"), + new Guid("05F95ABB-163A-4927-83C5-8C81EF7B769C"), + new Guid("B50F39CB-3152-4D56-9DDC-4B98F763E76A"), + new Guid("AF4AC058-D4B3-4C7A-ADE8-6AF762D0486D"), + new Guid("B6B73D41-E23F-4F22-B01E-7E75F4115FCE"), + new Guid("FED2B7BD-2315-4085-B0A7-2CED988120F3"), + new Guid("7337B2DD-B574-4A41-AFFA-2DFAD7F6CDBC"), + new Guid("7BF77556-64DF-428E-BFDD-095AF5BFEEDA"), + new Guid("26BC089A-A989-4763-BE6C-05D127D1C0E8"), + new Guid("15FB022E-1B45-41E9-BD8A-09DDC9DC6ACD"), + new Guid("CC121082-2D07-484E-8A6F-7382F7D71F39"), + new Guid("41B80F5D-0298-4D3C-B1A3-6D5E6C3985B1"), + new Guid("45F7B003-ADE3-4EFC-8DEE-259DCBF80A4A"), + new Guid("D2E73238-FF99-4BA3-8CE6-D8AE98721710"), + new Guid("1137590C-6F2F-4B69-B04E-F6A890A335A2"), + new Guid("593073D6-9893-4670-98FB-C485406A950B"), + new Guid("6B19E828-F597-4D0D-B7A6-F52F3BBD041F"), + new Guid("5EA9301A-9906-4E81-97CF-48EE95A54C63"), + new Guid("8EA4E0D4-71A2-4583-A1FE-F1A941AF8478"), + new Guid("6BFB7813-3A7D-47E2-88E1-D54034C07E5D"), + new Guid("9D428E57-E125-4575-B165-9BC6FD4EC507"), + new Guid("AD56DC48-9C39-43F6-9386-F7DF80D93CD4"), + new Guid("6FBE39FB-A4CB-4FCF-830B-8875FD4324E0"), + new Guid("E6EC43EF-0100-4CF4-A047-C575EE8613B4"), + new Guid("3445E61B-61A3-4EDE-93F5-402EBE9CA51C"), + new Guid("C1C1DCB4-8FE5-43AC-9B91-B2B2BC33DE5B"), + new Guid("8383B4CB-E14A-4D04-A8C3-9C5276384953"), + new Guid("A3E905B8-107B-4311-BB50-0ABE151131B3"), + new Guid("8F46496A-D5B2-411D-944D-9D4D4B6F2E31"), + new Guid("B6BAA8BF-7691-431D-8715-3937372B9DA0"), + new Guid("66FC9A08-3661-4DD5-94B0-1EEA41FB4554"), + new Guid("C8C74EC6-3F7A-4B45-B0E9-399B97C4A800"), + new Guid("7C9C6263-9F7D-472C-A4C9-1767015D41FE"), + new Guid("DAFC4B97-2B70-4986-B2B4-C05EB060786D"), + new Guid("612424B8-997E-4661-A452-772E14A3C4A0"), + new Guid("CB95189C-8C74-465B-AF07-48E08DBF7C39"), + new Guid("474AA982-8350-47E2-A983-E1E2BCE9D928"), + new Guid("D030F0C7-31A3-47DA-BE35-46F1EBA63AE9"), + new Guid("50EB32A2-6DBB-4B7C-B370-AACDCFEAF5FC"), + new Guid("CE6D5E60-7CF6-46AB-BD02-453EC7B04F7A"), + new Guid("EF409FC6-BD89-4CC6-ADE5-ABB882272313"), + new Guid("AC550D1F-EC74-46A8-BF81-7832ACE533EE"), + new Guid("E54CD744-D106-4BCF-BD07-B8783C075C21"), + new Guid("F0FDBDFA-094E-4BEC-AE19-AF23D2C02ED6"), + new Guid("4AEDD6D3-8F4B-4986-8D51-B0ACE0137BF0"), + new Guid("46B13A77-FE12-49FB-AFBE-826480EC97F4"), + new Guid("AFA77A2A-8B0F-4A39-91BC-040E90FFBB3A"), + new Guid("26FB2E94-B8FE-4216-9057-CA17A71DF83B"), + new Guid("9351D5B6-5A87-422A-9E82-CA6A0BACD3E9"), + new Guid("0E590DA7-C027-42E0-B580-F65686CEE461"), + new Guid("F9D020D6-B129-4BB8-9509-3B4A6C27482E"), + new Guid("00364F0C-9A3A-4910-A82E-1FFBC4D4137F"), + new Guid("85912845-21B0-41EB-8B8C-1F5C3D53DF08"), + new Guid("1C0C4951-03B6-49B8-8A8E-724397CFD5A7"), + new Guid("BB2A112F-AF6F-4A54-BBF0-BA7B8289E58B"), + new Guid("5C31BDF6-901F-4F14-AB64-7A99524710FC"), + new Guid("0FA0BE21-2246-40B2-86B1-CA572FE8C16C"), + new Guid("E0A8E1D9-C43E-4092-A8DC-476A3417924E"), + new Guid("60DC7CF6-0A41-4CD3-99A6-0B7A71488E7E"), + new Guid("6142C173-161A-47D5-BDEC-C827518FD67C"), + new Guid("82ECB5B3-9128-4B38-B9C5-612857417CEB"), + new Guid("97393C87-07E2-4633-88F9-C8BF4D9B935C"), + new Guid("8D5C28B8-91BE-40B0-B6C2-4D5ADBB495A3"), + new Guid("2E30F02D-D1E6-489C-A1FB-8B9FB6ECD819"), + new Guid("39611E8D-CC67-4C84-977C-094C5CBE9DBC"), + new Guid("BFE8902A-32A7-4092-93B2-9DCF3DCE205F"), + new Guid("67D10A00-FDA8-4A3A-BECD-F3AE3B00FCCA"), + new Guid("262FC4AE-7735-465B-934B-2125D95DE147"), + new Guid("F3654A7F-D16E-4870-9EF0-4B4268FAEFFB"), + new Guid("DA39C0D9-A5C1-4F10-BD3B-4E988ABCAB5A"), + new Guid("43CB3488-711B-4D9D-9D0E-03D0C1F6EB8B"), + new Guid("E08E252A-9227-42E4-BCB8-B803D25071B6"), + new Guid("2A62F8E4-7DA3-4F37-BF44-E24033C99C00"), + new Guid("8CE6709F-F772-4638-A1AA-C132666F3563"), + new Guid("2B6F9AF7-04EE-4030-A2CD-87D55959CAA8"), + new Guid("BA1E8D2B-7D3E-4B65-A9BE-EE1A4063C796"), + new Guid("64E3D6B1-1D61-454C-97AB-E1D7CB0A8917"), + new Guid("100E62A6-B6F4-4B30-B317-0517D6B102A9"), + new Guid("8052744F-7A9A-49DA-89E3-4C518126180B"), + new Guid("C9AEE4DF-AC3E-4159-BD1A-060DB1A5F070"), + new Guid("9EFA7949-DE15-499A-B382-4560E06C4FB4"), + new Guid("1E9A0881-F715-4057-9AF8-251CB8EEC9DA"), + new Guid("8C7DA1D1-D7D7-470C-B6A3-EDEFB0E9A4D2"), + new Guid("9612BDD6-15CB-4269-AAF9-481C7B35B5DD"), + new Guid("B2FA4109-1165-4C1F-9613-C5B2D349D2D4"), + new Guid("78B0AD1B-0766-41BA-B788-D176ADDD5E9F"), + new Guid("F5642647-9B9C-499B-A66E-349593C863F1"), + new Guid("E482BB5A-5A32-4BC5-A0DE-32CBE0AA7908"), + new Guid("E96F6860-0914-4324-9C49-48F24A0FF7F1"), + new Guid("8F779877-7D86-4683-8A8B-298C7FC62815"), + new Guid("E45B8BAC-9623-4f84-A113-9DEC13A8DB64"), + new Guid("1148684A-0F44-4B5A-9E3E-3823163CD4A1"), + new Guid("DC1AB28C-3E1E-474C-8359-2548B7AD5595"), + new Guid("E080687B-0900-4dd0-9677-E3AAA3EAE641"), + new Guid("7AD54364-CA8C-4b7c-9748-F83EFB44D0EA"), + new Guid("67D282F8-151D-429B-8183-6A7D2F5AC98D"), + new Guid("0539DE86-F407-4B3D-B1B8-028822FB9F26"), + new Guid("728BBC7C-E5B3-47D8-8532-72239E5C88BB"), + new Guid("49CD2C20-098A-46D9-9E47-6BF109308793"), + new Guid("06B23BCD-69DF-471A-B5A5-4CA8CAB7F0D9"), + new Guid("AC2E424B-6AEE-4031-8864-7B3F4A6FB5A3"), + new Guid("3BC961D1-9F4F-4F1B-ADA7-B1E9A2928EA4"), + new Guid("9F0BCAB1-8256-47A1-853C-408F025E04E7"), + new Guid("02B6DA2B-FAE3-49F4-83F0-FD014024E117"), + new Guid("016E3F5B-B527-446E-9DA6-49AF34870001"), + new Guid("51D9D243-35CC-4A1E-BCDD-F2749975F5FD"), + new Guid("AB8CA07C-B23C-43DC-B705-7FE34DDF6D4D"), + new Guid("EC1BCACE-FC10-45DF-8E1F-29BCE1EF786A"), + new Guid("14A32765-81B0-411E-89FA-91E092A70818"), + new Guid("E033CA92-EE8C-4ab9-9368-5F6F4E942987"), + new Guid("52B04E15-7062-4FB2-9EAA-4FE8726F302A"), + new Guid("A9625460-7162-447C-B400-84FBC5744F1B"), + new Guid("45B9BF61-3138-4206-9478-B4D3F082358B"), + new Guid("77B4D6C1-87BF-4839-B4BE-6A45119B700A"), + new Guid("5FDF3946-7E47-4FD2-906F-4DA7CE5FA490"), + new Guid("A30E0391-EA64-4938-9ECA-023C351D60AF"), + new Guid("16DBD62C-F60D-4530-BA4E-0E74221E4681"), + new Guid("EAFDEA8E-521E-4614-8FD5-E8446ADF9203"), + new Guid("EBAC5EC8-DC4C-4B2B-A727-3CA82404CDBB"), + new Guid("E5020B79-6FB0-4BE4-A359-D4F899DA5C7E"), + new Guid("A4958DD9-03CC-4863-AB76-CD0682060CB0"), + new Guid("27048124-C204-4585-9997-C51728F085D6"), + new Guid("53D34F16-2F94-4AFA-9530-7AC75E05B8D4"), + new Guid("80415FAC-B3D8-4E3C-BDB8-DC92F3C6DAD8"), + new Guid("BC9D763C-E4FE-48AB-AD44-87A36F6CC06F"), + new Guid("C79D49F1-74EC-4DBA-A5AA-5E861AF63D05"), + new Guid("81B62078-984C-4E82-94C4-39FA44DD3E56"), + new Guid("E2D3294B-4463-48BB-95E4-8C9B5238ECEC"), + new Guid("7BCA1201-31F8-4F65-8DA9-AF0EFF36B388"), + new Guid("F3DBB078-6265-4861-A6E3-46CC151C5D72"), + new Guid("3DBA39BC-48F2-4BCB-9357-C8FBED6922CA"), + new Guid("05472990-3F51-40B3-BCA8-DF3CF383328B"), + new Guid("CC3F1DC8-A31E-4459-BA13-F82B45DF37B5"), + new Guid("F2342D42-BDC4-449C-9891-58F90318B9F1"), + new Guid("22E8F542-0AB1-4F25-AF50-FD0D02917FDA"), + new Guid("7158C621-C46E-4173-80C1-188F514A920F"), + new Guid("BC96B3E3-6185-4925-B79E-8F0F9555BFB7"), + new Guid("29A8EBBE-EBC4-4295-B6AF-84331D019361"), + new Guid("4A388000-D5C6-4127-91CD-F4E0C9FAC6F1"), + new Guid("3160B7AD-E4E8-4A46-8E2E-D5E601969547"), + new Guid("F0404B23-DB91-46C7-87E1-9F1BE0712980"), + new Guid("65EF6AAE-019F-4980-B6D9-5B7AD2C8E68F"), + new Guid("26D32F3E-CED6-45FC-AFD0-7E017FA252C6"), + new Guid("F0F3C371-166E-4A66-849F-60D6FA7AD889"), + new Guid("2629943B-3A69-4C6B-9956-2AA59EBD03D3"), + new Guid("A4FA9F98-73C6-4c3e-9DAD-D73D2634BE3B"), + new Guid("F4B77866-C607-43F0-B816-95459C269525"), + new Guid("59A95939-44D7-4396-9EF7-3A80C17E9FB1"), + new Guid("767AA167-AF3D-4E11-A68B-EC31F9D2EF1A"), + new Guid("96A1AD48-1A70-425B-BD20-59294902581F"), + new Guid("EF876104-EB3E-420D-9C7B-124538A7B2A6"), + new Guid("339F54A5-125B-435F-BF37-CFC2A2BD26D3"), + new Guid("CBC0A8F5-9CBA-41D2-A7E5-565FBF09C8C4"), + new Guid("B4FE4698-54A2-4BCD-9490-E07EE1EE97AF"), + new Guid("70EAC6BE-66E8-4827-8F2F-D15427EFFF60"), + new Guid("AF700054-258A-458A-9E38-E90397833E51"), + new Guid("8DB7C016-BDC9-410B-9523-3197602358F4"), + new Guid("710828BC-5DFB-4685-B1A5-156700AB08F1"), + new Guid("50AC28AB-7385-408F-B5EB-3E27B191FCF4"), + new Guid("BA8D18BD-2556-47A0-AA33-3EBEF3E90814"), + new Guid("B7801F6E-683B-4D5D-9BAB-57F6E593DB8C"), + new Guid("D586A164-AC8F-4356-8AA8-07721C2B5E09"), + new Guid("C4330001-83CA-485D-8B9B-09F7E1BE60CC"), + new Guid("8894CAC9-C82A-4616-856E-0516D2ED1DF7"), + new Guid("EDF17F72-7E7A-4F8D-A5EE-F4889492D73A"), + new Guid("751BD45C-ABFB-443F-AC55-AAD3472C20DE"), + new Guid("8225DE87-35A3-4C7A-B35C-F45B152CAEBE"), + new Guid("CAC1D7A8-7382-466E-BA4A-BA2BFE50F13B"), + new Guid("EEF8C50E-C391-482C-9F60-1BBA2D8892B3"), + new Guid("32BF055A-D666-4D6E-A3C6-6C984E2C9868"), + new Guid("12781062-EE36-4703-9BC0-CEE4ED467EE5"), + new Guid("4F516445-E044-4D9C-AC9B-A3178F72B405"), + new Guid("80DC5CA1-44CE-4406-ADD8-2BBE19C122AB"), + new Guid("8D266C98-9DB3-4D3E-B204-956AA848FFA5"), + new Guid("6137239A-B469-46BE-B7CB-B9AC22FCC195"), + new Guid("4093BFE8-54B3-4FFC-BFE3-3999279840B5"), + new Guid("3FDBA5E5-EB24-4B2F-A6FC-D1ED7397C39C"), + new Guid("1FA683B9-78FD-4FEB-9978-55D5953F38EC"), + new Guid("E4BACC52-DCAA-4e68-B736-F0B5D9AECA41"), + new Guid("87DD09B8-689C-4A56-B3F6-846A849F71B8"), + new Guid("1886FFC9-0A18-41EA-B2F6-C17C297F1681"), + new Guid("1688280E-27C4-47A8-87B7-8FE31B174AB8"), + new Guid("51D4E258-430C-4032-94E3-EE53095E7045"), + new Guid("62B4AE33-F3C2-447A-9EF7-7E41805B6A02"), + new Guid("0E79435B-F5FF-4061-81FF-49557BA2AED4"), + new Guid("646DAB64-5C2F-4F45-8E28-4D13437639D4"), + new Guid("B40637E5-BE76-4A82-96BB-C55306EE293D"), + new Guid("995751EF-D71B-429C-A4EE-032F5B309BD7"), + new Guid("513771EB-8467-468A-8BC8-E52567E66DF9"), + new Guid("469B0A30-3C26-4CFD-B948-7BB952EEFF41"), + new Guid("B5D679E3-506A-4994-81A2-BE48A698D945"), + new Guid("D49F2C9D-1B4A-4370-B107-71F9B9FBDC8E"), + new Guid("AEC8C246-0EF7-414A-94A6-B9FDD6812A7C"), + new Guid("9AC6DEC6-1B8F-463C-8239-E2ACB93586B1"), + new Guid("D59A84E1-5E12-4CB7-B72B-15C51810AD48"), + new Guid("EAED8C63-9F97-4116-927C-19F364A99E72"), + new Guid("A8B2ABB3-D09F-4FF1-89CE-6AE99F16401C"), + new Guid("4651AEF1-E18F-481E-9C3E-D9DFFF4A6B51"), + new Guid("0AC81210-20FF-4A89-948F-5D154668F05C"), + new Guid("C223335B-4803-4F1B-BF4D-F1EE077513CF"), + new Guid("675D67BB-DA64-456E-8825-BDF074BB82BE"), + new Guid("06341E45-C407-49D0-98D8-74ECC303FB02"), + new Guid("AEB20093-26BA-492B-A69D-AF18D5BA51EB"), + new Guid("E7C58C11-2911-446A-96B0-2113247F3792"), + new Guid("529140D1-6E8E-44FE-99F0-95289E933607"), + new Guid("D1E58469-52E3-4B50-B0DE-00BF9F09F8D4"), + new Guid("44DC42E4-E9C7-4AA9-AC9B-1008385244B1"), + new Guid("BB29001E-97F3-4BB4-8946-7C33B9835FCB"), + new Guid("87C499B3-5FAB-45E0-9999-9C4FCBBA1E2B"), + new Guid("F47D681B-4F0D-43CA-A465-2E1724825752"), + new Guid("75202262-CDBA-4C43-9343-764C84138797"), + new Guid("F957A4AA-D3D4-4DAD-93D1-20565B5158D4"), + new Guid("EB0C9E02-E4C1-4E5E-84B6-BE63AAF439D5"), + new Guid("89944377-8694-4394-BCED-153CC22A0E30"), + new Guid("49BC0D75-4F07-44B4-A50F-BC9A557DC15E"), + new Guid("A4627CA8-F27B-44CE-91F5-CC992332BC86"), + new Guid("89AD4E41-BF08-4D93-A4F3-F72E8CC62BED"), + new Guid("04370E1F-25AA-4D9E-97C5-DE9B59156666"), + new Guid("57237095-23CF-43BA-AA6C-89CECDD35FF8"), + new Guid("0656F6A7-9A88-4C03-A8AB-ACE8C0F52EBF"), + new Guid("4405E74C-F64C-4609-8F7B-99BA563D659A"), + new Guid("FA41DBC5-ADBB-4AD0-9FD2-0278D4689A28"), + new Guid("A781D57D-174D-47A6-B6A1-AE635A13DF84"), + new Guid("6CBDAF94-8E2C-4B26-936A-D2F86D158250"), + new Guid("57225F57-BA51-45D7-B6D2-B22052877EA4"), + new Guid("935DA513-126E-4CAB-8E07-625458821181"), + new Guid("7459C0D8-4DA1-4944-A95E-BC64CDE860F5"), + new Guid("6709CC78-CB0B-493E-B3E6-8590A2F20C95"), + new Guid("C358B041-7A1A-43D6-8E61-26B9507F559F"), + new Guid("4F19AB95-428A-4A0B-A069-CA8BE6B72B08"), + new Guid("252886C4-9317-4C6B-A69E-13520EB89736"), + new Guid("17851B86-F8FB-4850-9B33-C1A9FCB0AEC1"), + new Guid("54B6DFF4-A21D-490D-8279-69F36A179C93"), + new Guid("EFD03C89-BF8B-4D46-A921-06CC06F28356"), + new Guid("87EB572C-BAE2-45D8-A36A-919561B55D0D"), + new Guid("86F90EFF-158B-4F6D-82E9-FAB136DFD141"), + new Guid("E3A6F918-4B0F-4515-BD6C-4F3370BCBF67"), + new Guid("E173F481-EC57-4D1C-B517-BE38CCB038F5"), + new Guid("92EF1096-BAE2-4BC5-B4B8-C16F429C4867"), + new Guid("F81B7632-3E5A-4a2d-8A93-648872A6616B"), + new Guid("C4B110CF-D968-4BC6-AC0C-7E70CBAD2756"), + new Guid("71CBEFC3-E0A5-4B97-9672-FA0CB34C59E4"), + new Guid("DDC96103-4BC5-44d3-9412-C57569D2A9F5"), + new Guid("AFF720BD-FB3D-4F85-BBC4-41D5FC5B83F8"), + new Guid("5446B5CF-F05A-4BB2-89EB-CE63E27040F3"), + new Guid("AA0F165D-3013-4A0C-B68C-14EA317013F9"), + new Guid("7FED6281-326A-4A15-8CBF-DC574594DA19"), + new Guid("DE6B15D3-6409-4998-B03D-903133F4AD70"), + new Guid("0A1B26B2-2152-45E2-9B63-4A68FCA73A90"), + new Guid("91DDF495-A28B-4A32-90DC-6F997D0CD069"), + new Guid("4B3A9B5A-DF7D-4EC2-9576-2C07FE396021"), + new Guid("E27ADDA9-0761-4B7F-ABBF-24938CE1C01A"), + new Guid("6745C89D-1FCD-44B8-BE4B-9FD9D62F64E7"), + new Guid("721E7782-9ADD-41FA-A7CF-659D5CA33926"), + new Guid("AC4A936E-6C05-4e73-8D40-DFE4223B47FA"), + new Guid("2D92E248-1512-4E89-B886-425814C6DD32"), + new Guid("01441207-4935-49A5-A192-16D949F5606C"), + new Guid("6187E620-89BD-4B9D-9896-0C0C788E7740"), + new Guid("21EBC64A-A1B8-45bd-B7F6-143A053F1D31"), + new Guid("28E874FB-B2E7-4AFA-A4D7-600306AD2583"), + new Guid("42133F78-9860-4BB7-8083-5559083F0714"), + new Guid("A3D95C6A-4B0B-4AF0-ACA8-ADDD042BECD2"), + new Guid("C27B87CF-1211-4DF2-96B1-12C416EDABBE"), + new Guid("37A08F65-5A79-4E17-8E19-0975D6531D64"), + new Guid("4E791773-94C8-4667-93F8-92DC0100DDFE"), + new Guid("E791DF50-8880-4080-A5EE-D4E58BB7B8CA"), + new Guid("8E11DD10-459B-4FB3-B876-7D80EC5F8A4D"), + new Guid("30E6B42C-6BBF-4659-99E7-AA4B8E68C9CE"), + new Guid("744D1402-05F5-4491-9C15-A5AF03595EDB"), + new Guid("A6797FD1-E368-422B-9710-96E0AF39552D"), + new Guid("1461C106-D9E0-417D-9487-A57E6D0CCED0"), + new Guid("4260E110-7B04-4D40-9391-486A57AA3031"), + new Guid("2B846476-00CF-4D82-97A1-26E1EDA880CA"), + new Guid("DE1FFD73-AF3B-47A2-8E98-AC1659A84CAC"), + new Guid("CB783AD9-4650-416E-BF63-88C4CA43FE6A"), + new Guid("AFC25FBB-9060-4AF2-8225-3FDDBAB2227D"), + new Guid("8D490E91-6383-45EA-A3D7-B9C950822F98"), + new Guid("93489181-AD8C-4A18-8DBC-FD7A9C871126"), + new Guid("9B0FEF63-5935-447D-801A-BB02DD6212BB"), + new Guid("A2A3E21A-819C-4400-B2E6-E6C1A0A0DED3"), + new Guid("5D21B3F1-85D5-4999-AF64-C4D0101050C0"), + new Guid("18B3CA02-18FE-4AB5-8709-C20957A0A2FB"), + new Guid("054E81CE-ABD8-4069-989D-13E2FA58851C"), + new Guid("E7CAA24F-155D-47CD-946D-CC0D06DFC764"), + new Guid("642FF468-E6C8-4FD0-8F52-262EFA8F7774"), + new Guid("B553E989-2B2A-4B1E-A987-AE75F3862501"), + new Guid("611AA361-4DDD-450B-A152-94984A274575"), + new Guid("771E3882-F672-4E67-8580-EDD82D7E5090"), + new Guid("EC79E90E-ECD3-497F-BC14-AC64181F53D7"), + new Guid("87D344AC-94CC-49D6-9878-EBC86A933033"), + new Guid("60E63D4A-702E-4238-A42B-D97F6BE09C29"), + new Guid("50DFFFE4-DFE8-445F-BDDE-4CC8D83EBD6B"), + new Guid("92E441DF-7E56-4E2C-B205-79A95800F567"), + new Guid("E6CF2C28-7630-41D7-835D-BD171AB67378"), + new Guid("5DCF3CE8-AA00-4478-B00E-691549FA29E8"), + new Guid("A7E4F8A8-3FE3-4C86-85DF-059F8983DF26"), + new Guid("B5B36C31-C56D-44B9-933C-FE0E62D80C25"), + new Guid("0F323BEE-0D8A-4564-9691-87880F55D910"), + new Guid("50E28FA7-F6C3-45BC-871D-12EF771D532C"), + new Guid("5D9EF67A-E4BA-47CA-8C8C-EA0F512A66CD"), + new Guid("FE66D433-5135-498E-A29D-B42BF0317252"), + new Guid("57C9A370-0F46-4475-98FD-C7A8B3F5074C"), + new Guid("9060339E-D697-4C35-BC83-CED6BEBFEE63"), + new Guid("B0E5042D-1ADE-4FB1-A6FD-9A165F5C4763"), + new Guid("80B48F92-0A83-4EEB-BFE0-6980285FEB65"), + new Guid("7D54D3DD-5FB2-4640-9BCF-C234696AF894"), + new Guid("5658AE3D-EA15-44DB-BAE4-47DF792DA12E"), + new Guid("EEA7C79B-6150-4ABA-8105-A94B7E6AEAB7"), + new Guid("99EE1558-34B2-4A1B-BFD2-EB4CCBFE7728"), + new Guid("81855F47-AA24-435D-A123-7DFE61C80702"), + new Guid("A730D0B4-B6DB-45AC-BF6E-CEFC96AE3FBB"), + new Guid("9BF21458-0ACC-4D8D-BA9A-7B9FB6B8EE0B"), + new Guid("8ADD7F4D-333B-4B2C-9999-48A14162152B"), + new Guid("3E546C11-BCB6-4024-B2F3-C15BE40E257F"), + new Guid("4ACC430B-9C98-4A49-A8B4-15EDC0F6D19B"), + new Guid("9A9C7174-4148-43C2-875C-0D2F884A5FE3"), + new Guid("CD8B2A8B-687B-42E9-91E7-CFB8812B64EE"), + new Guid("721E2EE8-7EA5-4D17-94CC-D77D8E92BD27"), + new Guid("F4EC8F2E-F89E-40C1-AE50-900927D20AF6"), + new Guid("FC193988-26CA-49E9-849A-B12456D98792"), + new Guid("BCE3F390-452C-4CA9-8C36-5FBCFD6B4755"), + new Guid("0EFE342D-4969-4BD1-95BE-556F6C62ADFC"), + new Guid("73A59333-134F-4A1D-ABA7-E134BDEFE059"), + new Guid("F5567550-E3C9-4589-8F88-8159EADCD194"), + new Guid("6A6BBF65-B521-4B74-BF35-DEDE87217D3C"), + new Guid("9BB173C6-CF38-47CD-803F-EBDF964CA2FC"), + new Guid("C1144A6E-3FCE-4084-93D6-6F305EDA8B1F"), + new Guid("01459DB0-BF2A-422B-8D55-0AB505AEA2B4"), + new Guid("4C823E93-3966-461F-BD64-3A9303966338"), + new Guid("E0E83CC9-B876-47F6-8E66-60C9C505B927"), + new Guid("9EC62FFE-69BE-4B9B-944C-29A0F4F133DB"), + new Guid("C8C8B1F6-A898-4D5B-A1CE-FA7284915E8F"), + new Guid("97885CAB-CD96-4D34-A62A-3E3DAAC0C165"), + new Guid("9A7604B4-D42F-44B7-9AEF-47847DC93F0B"), + new Guid("65BB0844-9A71-4EEC-9B86-BF4B4B508A28"), + new Guid("76A4A286-1C8A-4C4A-9EAF-DCA040BE574A"), + new Guid("401BBBE4-A33A-4A1E-B26A-18A756E002C4"), + new Guid("20FADD54-6CEC-4BB3-A47C-66C29AAFF227"), + new Guid("A90E47FB-667C-46F7-BEAB-5EC4E9E6EDB5"), + new Guid("05811FBE-2361-4219-A5D3-BE3DC487F6FA"), + new Guid("2AABD548-5EE2-4962-8F10-84D1B0427C41"), + new Guid("7BABF463-5E62-4A82-96D3-EF5989803C41"), + new Guid("3DD684E6-75D9-41F4-AAA3-FB0CB3C7D400"), + new Guid("51C2E2E4-438C-414B-BD15-773B664DD289"), + new Guid("7EC98665-275F-4D57-8022-2740B9E90059"), + new Guid("65926A7A-BC46-4A40-A2C9-BF84696A3903"), + new Guid("06AC577A-4D61-4898-AC9D-E3F18B7504AF"), + new Guid("0A42FD83-3B30-4C85-BB68-F5132E9FFEEE"), + new Guid("6C282031-F1CA-492A-B94C-B48E74E6F25D"), + new Guid("290F0994-CE8E-4922-975F-FA091F566823"), + new Guid("0EDA983B-633E-4B11-B5C8-28BE60067782"), + new Guid("B5499348-B8CA-4FAE-8486-B23863560AE5"), + new Guid("99B40843-54BF-4C59-AE1D-D7146CEBEC48"), + new Guid("CE6A862D-A4BB-4378-B14D-439806870C41"), + new Guid("AAD7C9B0-AFF3-4684-86D5-657A20E39288"), + new Guid("67087306-0211-4C28-B17E-0B6827723F07"), + new Guid("B8F59DDD-48DE-4B3D-AF47-687C9237CCD9"), + new Guid("577017B0-AE87-4FA2-A51B-4F430497BE75"), + new Guid("F70907C6-A064-425A-830F-E669319C38DA"), + new Guid("94F919C2-BF8B-4AE5-A611-8C0CD4D7A5D2"), + new Guid("A84A5FFC-006C-4D29-B71F-5215CC40A5A8"), + new Guid("BF0BDEEB-564D-407B-8BDF-31221AFF7364"), + new Guid("B0A9A631-E0DC-47D4-A762-E9A627732218"), + new Guid("B632B00B-B03F-4549-8E02-6402C05A4F06"), + new Guid("28BA8F5C-5BAA-4500-A6F5-BE292CAA673F"), + new Guid("430CE279-1464-4D55-8483-5525A3C3094D"), + new Guid("E1AC83C2-352F-4a2e-9612-99E66D6D3D0C"), + new Guid("896D57D4-4C25-4F0B-9985-A30974F64704"), + new Guid("C60CF6A1-7868-4536-AC73-387BFA26E04B"), + new Guid("E9947962-A243-4A44-A94D-64D68718D88C"), + new Guid("4A8C6C2E-7A8F-4DD6-97D3-20A35D7D10E9"), + new Guid("BC61BD8D-295B-4965-A183-703D21A56996"), + new Guid("BD9BB361-3C12-4C70-8098-40B0DF9824CE"), + new Guid("785E7F1F-21ED-46B6-8599-C6CED4FD26D8"), + new Guid("A977C4B6-1004-448F-B6B0-DAF5CE87D76D"), + new Guid("9ED42115-8532-4F99-B0C0-36ABFE9DB652"), + new Guid("7558D071-A885-447B-9AA2-604C29669492"), + new Guid("7DDBD56F-E458-4A72-A9BC-9B7DB6BDE75A"), + new Guid("DED0E58D-8AD7-4909-B0F1-B9AB9C10BB0D"), + new Guid("5F3E44B8-E94C-49B4-9E2D-1ACD93DDDF75"), + new Guid("134C68A9-AC3F-4B7E-8FCA-63642D796A75"), + new Guid("D2F516F4-DF1C-44F6-8704-76DD52201317"), + new Guid("562F55DE-EFC7-41A7-B450-6F9DEA2813E2"), + new Guid("F9935962-9A14-485D-9BEF-BD4A52DD92C1"), + new Guid("FF0A16F2-C44D-4ED4-9520-C214ACFB68E5"), + new Guid("BF007CD9-925D-4073-A1D6-16D64A45CA25"), + new Guid("5E7A5899-DF78-4AA7-BEC9-B354ACFE087F"), + new Guid("16D2C60A-52D7-4EC5-A5B1-C559DC078BF3"), + new Guid("0448C78B-DBB7-417C-AFC5-B227A1475825"), + new Guid("D7349BAC-EFC0-41BA-BA60-F23D38E97A36"), + new Guid("8B6AECFB-071D-439D-9EE0-EFA3C57967A0"), + new Guid("57ED66EE-F82B-4E80-955F-7492D85372B0"), + new Guid("B53DEAC1-26C7-4FE9-9109-8496E248E8C7"), + new Guid("D8631167-08BD-4571-BC7C-57A4407DA51C"), + new Guid("C8D94C8F-DB0B-4016-BDD2-E41A2EAE4288"), + new Guid("A7DAE83A-DCE6-47EA-AB3F-AC8A3AF4CCE9"), + new Guid("B536622C-80A3-4B31-9D22-4ED2FB76324D"), + new Guid("0F983449-1C43-4974-B388-7695B1AF4BFA"), + new Guid("EC998DC6-D509-4832-8434-D2ABAC34BA70"), + new Guid("87BD0D45-8A94-41CB-9864-90D53A11A4B9"), + new Guid("F51BCAFA-E624-4555-B8F1-B5726D74734D"), + new Guid("05A7BBDC-7CF5-47D3-830B-84E1591B11CC"), + new Guid("1DC717B9-C5E8-4482-B076-22102DA9D553"), + new Guid("30EA3057-753D-4C4C-9B1F-ED30E569FEEA"), + new Guid("CCA44B46-437C-42EE-93D7-A8820D61D0C8"), + new Guid("85214614-AB45-4805-9014-092750D47511"), + new Guid("E10B9449-08A3-4C13-AFF2-31486749B62F"), + new Guid("67D74DE1-33F9-4D39-8FA5-5DD27E7CD1D1"), + new Guid("FA660C9D-8787-4335-8744-3DBC139B2DF1"), + new Guid("E83586C6-8D8E-4A23-BDDA-A1731A5ECE22"), + new Guid("CA511A0C-5628-4726-8A6E-AA9FA3B73BFC"), + new Guid("70963C34-DD34-40C2-BB21-E9CEA73C7923"), + new Guid("59D19623-0F3B-484D-96EB-A9093B020C8D"), + new Guid("2CD48908-8F12-4E0F-A22E-87237618CE9F"), + new Guid("BD7D0C9C-791E-4C34-B9ED-EBDDAD8F9724"), + new Guid("0C1BCC98-9BC3-4DA0-8EAC-FF8A6EECBF84"), + new Guid("0EDE51D2-69BD-411E-97F9-DA0D5118BBFF"), + new Guid("8570F05C-A152-4117-9F54-4EDFA9C06A32"), + new Guid("6BF7569E-DC79-49DA-9CE1-E2E03303828A"), + new Guid("BA98F891-77DF-4910-8657-38F4BA79D3A5"), + new Guid("FECA6B23-1CA1-4D99-AC79-3672D1D1F7DB"), + new Guid("13F62FA1-589C-4A46-9BBC-B0FD1001E21F"), + new Guid("BF5175F6-FBE4-4AC6-9041-F8AA78B7AC78"), + new Guid("55A7B809-4196-4C5A-A6D6-09B586CE71E7"), + new Guid("9FCAE400-CE8F-4E30-9516-97AB794C30A9"), + new Guid("62EFA729-0920-4933-93F3-B6A48519A5C7"), + new Guid("EF6D136E-AC1D-48B9-819D-252485534557"), + new Guid("69455770-FCA7-4F41-9E7D-236E8F094CE6"), + new Guid("6AA8133A-2578-4617-BD9C-6428E897A4F1"), + new Guid("596AB399-E442-4AFE-8796-633A49DE65A7"), + new Guid("38BDFF04-C7A9-41FA-A6A2-7AA214DE308C"), + new Guid("793D3124-8B77-4FF0-82EC-09A3A9D8D865"), + new Guid("5737714D-49E4-4EB4-8E46-03203EE5340B"), + new Guid("F9516C66-AC2C-49DD-951A-0D3606450463"), + new Guid("BD31529C-AB67-419B-89A4-949AEE8B3B11"), + new Guid("BB4E0A69-DB20-4757-BEFF-5DCB1C5E0F92"), + new Guid("F7DA1907-E6C5-4D21-A8E8-81376F3467DF"), + new Guid("189F8C29-F0FF-44b6-A0DB-5B287C412A75"), + new Guid("763FA2E0-C119-4f50-A307-81ED8C3497ED"), + new Guid("55201761-FE2E-40D5-A2A7-8079E00A2C32"), + new Guid("E072BD42-EB0F-48C8-97FD-AE9CA8BC3A75"), + new Guid("37E6C8B5-F63C-4F5B-8C16-ECCD727D6618"), + new Guid("80563285-4DE7-4040-8080-A5B22208E7D5"), + new Guid("5489F4AE-34A7-4F8B-9086-4247B0D8B3DE"), + new Guid("243D8A57-D5ED-4D7F-BD5E-F2605634F0FC"), + new Guid("530FF7E0-E3CB-4DC3-9C1C-3034969E1CE8"), + new Guid("8594CB26-9F3C-48F5-B00B-F055EB5A5E61"), + new Guid("0066F0F7-02DD-4F8E-AFA5-59B8CB5A434A"), + new Guid("8A7FDD75-01DC-4D40-84FF-FA0484DA3ABB"), + new Guid("77F27500-AAD8-409C-A28E-92DF73794DCE"), + new Guid("A3BA10F3-66E3-4AD5-8057-453B8941E497"), + new Guid("225C48DD-9FC2-4467-944F-16A098B4E518"), + new Guid("C8595A5F-4DDE-4260-B8D8-265D0554CE93"), + new Guid("17102138-B97A-4F1D-81BC-9BE4AF90889E"), + new Guid("8A5C87AD-2D15-40C2-9F15-D7942AC80261"), + new Guid("21461D78-02F9-4BE6-80E3-6A4498CE8F4C"), + new Guid("F595DEAB-1838-4DDB-9EBE-55FB3007B309"), + new Guid("D90DB6D4-6C78-4ac8-9764-0CAFA79B8B31"), + new Guid("7D629C80-E5C2-409f-A592-39C56E9ACE6D"), + new Guid("EB842DC1-AD9C-4c1a-9EB2-A48B7F3092BE"), + new Guid("F5E2AD18-5AD4-4186-9572-B1542096759E"), + new Guid("362A2BDD-985E-4BC0-A41C-358BD1BABB12"), + new Guid("98830EDA-3997-4F4A-9BA4-664DF669E7E2"), + new Guid("738A09A5-59DF-40F9-8A4E-176E00D03BBF"), + new Guid("3615C3D1-FD5B-40C5-80AD-80BFD6451D56"), + new Guid("0B7B9A1C-588B-475A-AC14-00F0999CBFE9"), + new Guid("6EAFBB5A-26BA-44B5-A0D5-21B9E7750ECE"), + new Guid("9AFB64D6-FEAE-4490-9B7E-95768627F643"), + new Guid("FD7E03F8-61C9-47E9-AFA4-AB8917DB03A5"), + new Guid("675ECCBB-9858-4CD4-8405-5F0D0FAA792C"), + new Guid("9B9CCD76-76D6-457B-93D2-C4D242A395F8"), + new Guid("1CA26512-75F6-4A7A-A7CC-07D08AA799D9"), + new Guid("4B669BED-BA46-41CC-BCBA-C2EF8E129C85"), + new Guid("7D7C81D5-9713-423F-B12E-8E11E451F0A7"), + new Guid("A1DD1D94-FA8E-4325-9F72-B39BCAC69755"), + new Guid("9E2B0C61-304E-4CAD-9708-792BFDE880B4"), + new Guid("3F069313-4827-4FC5-B73B-B9FBD42CA38C"), + new Guid("7556A257-3703-40D3-91D3-C891FB250947"), + new Guid("B60BF544-7774-4623-8C67-19B32B53DEA2"), + new Guid("7F6C81FB-02A4-415F-A363-FB11CC6B9254"), + new Guid("25BF6690-6ED1-42E9-8A4A-3518F9CF382C"), + new Guid("E9FDC131-ADDB-4DB6-8F79-AE0044E1EB81"), + new Guid("61F52196-A8B2-496D-96EA-8C15DC7D377A"), + new Guid("B6E45998-9F6A-4B19-9CDA-62410A11AFA2"), + new Guid("3EA52505-AA6C-4F28-B475-F15AC1820EC1"), + new Guid("38D1A6FE-0811-4EB0-A1D8-F69B6AD978E0"), + new Guid("106C2C42-36FD-4B0A-94F7-E998F6EAE6F5"), + new Guid("7C7F62D8-0293-45BA-8658-956C38BAFC66"), + new Guid("147C2E58-9AE8-460F-8CAB-BF04A668945D"), + new Guid("B2830B72-C642-484F-9485-24682AA11ED8"), + new Guid("B9C752A4-66BE-493C-8955-CFA5324A54C1"), + new Guid("4CB8B433-4EFA-4698-8EBD-0F00F8FC3F66"), + new Guid("00DDE3BE-E53D-42C3-B3FF-717E25CBFFB6"), + new Guid("2CCAB97A-FB98-4054-A29B-E5CEAC8CA1B4"), + new Guid("5A4A8AE5-A209-4946-8FA1-3C3BD5083E0D"), + new Guid("9F792202-8023-4EF3-B269-5AE4B6908A0B"), + new Guid("B790470F-ED4E-42AC-932D-CD15EF701B03"), + new Guid("24361BE2-49BE-4860-BB56-4E46DD1E8B0C"), + new Guid("6105A207-4311-4920-8C19-63259424BFAF"), + new Guid("62ED8254-E53A-4781-935E-79869619E40A"), + new Guid("79F3B53A-EB56-4188-87F8-48317F76E7CE"), + new Guid("1C3F8996-362E-4EE0-AF02-0DD02887F6AA"), + new Guid("FF505092-6D88-4B5E-8095-04E471D7AD4C"), + new Guid("2470AD05-636E-4C85-96AB-CD880DA58741"), + new Guid("EF860EE3-A4A5-4A42-B810-FDF41E35D151"), + new Guid("1229DD8F-5CFC-4644-93C3-D256FC34D054"), + new Guid("AB8F5391-AD8B-42DC-A43C-22590A09CE77"), + new Guid("4CE22ED0-6FE3-47AE-83E4-E7C7310CB1D4"), + new Guid("DF647B1A-ED79-4A8E-B781-56ED25FE4405"), + new Guid("F211DEFE-D80F-4E40-9842-AF19CB0719E7"), + new Guid("F6134BE5-3F96-4750-A03E-FCA381A42DB1"), + new Guid("E311CC3A-A387-449E-A05A-07ED9678411D"), + new Guid("B97531DF-8256-4796-8335-F69753A8F2E3"), + new Guid("9B476AFD-58C2-46A2-8294-449AC4AAD3A9"), + new Guid("725D78EB-8CAC-4B2F-B5A4-F0A9ADB80F5D"), + new Guid("0F883EB0-00A1-44cc-B719-97FB6EC145D4"), + new Guid("BD4A2527-F66C-4F48-922E-8B180BBA8EF6"), + new Guid("44BF22FD-3725-4C49-BD3C-434402C33493"), + new Guid("F732BDB5-9A04-468A-B50B-510F94D20FB4"), + new Guid("4FC734F2-A91D-4693-8CAF-E7FE51A2DF8A"), + new Guid("943EB131-2761-4C98-90A0-0BDFB0F8584D"), + new Guid("FE89A0F4-2155-424B-BF90-C1133DC41C8D"), + new Guid("A220A734-AF03-4DE3-8D05-369A3CAD14CF"), + new Guid("4098899A-0AD0-4D71-9F9F-B99D5BA2E0D5"), + new Guid("1FDA68D4-5941-4695-B656-090D603A3344"), + new Guid("FC0AFB69-A4D4-439A-91CD-ED0CE67677B5"), + new Guid("726923D4-B25C-46EB-8AB0-427207177AE3"), + new Guid("6E83C471-0FE8-4641-8ECF-68B63DF29AB7"), + new Guid("8A9B5484-EDA8-4194-95CA-C2E76E83AE67"), + new Guid("AC7DE73D-0059-4F35-9317-462A1813EDBA"), + new Guid("DBD3E164-3F70-4395-9728-1C24C8900DA6"), + new Guid("1B399FA1-E4F7-4D7B-A33E-3972B8B556E2"), + new Guid("CD01DB6C-8AA6-42D1-93AC-05E81A8BE523"), + new Guid("0F568473-880D-43BD-B5CE-590100FDCAF6"), + new Guid("8242FC85-A703-4EFA-A78A-0556A84E811E"), + new Guid("02D404D7-F3D7-492C-92A0-C6C9FF1A1908"), + new Guid("08788E9A-93B8-4A2E-AB01-DEA177F061E8"), + new Guid("12B6934D-3A4A-4623-995F-865F401349AB"), + new Guid("0A27D9D1-0F1F-475A-92A2-BBCCF5B15F41"), + new Guid("40FF5CEE-31D8-4C89-A212-877347212A0E"), + new Guid("6DE42A33-35B2-49C6-B2C4-FA9C0C5094F0"), + new Guid("B4E6C077-4F5E-44F3-8868-1F7AE3486585"), + new Guid("B3D3DD7D-0CB1-4C25-BCAE-CC402FCFA3EA"), + new Guid("5BCD08A6-CB46-41BB-A732-0D690B5EA596"), + new Guid("32125C5F-D69A-442F-BA66-6277EC0A3B15"), + new Guid("1447278F-EFFF-4807-B9EA-C487DEA1BA5E"), + new Guid("9CAE4EE3-03CF-46F7-9475-21D66C93AE04"), + new Guid("929720F5-C264-49FD-B817-3E1EBFF6E1DE"), + new Guid("E496A6D3-A00C-470E-81C3-314F3F97840E"), + new Guid("462F5606-5BD8-4543-AA35-26B0CFFD7163"), + new Guid("1F608E18-958E-4BB3-A977-04879FB5ACD5"), + new Guid("5C348090-12F4-4C83-8331-E10971BBC8D3"), + new Guid("D4769748-7C4E-4359-9DA5-2EA64D5948D9"), + new Guid("AA5658DA-8926-4519-83A5-D451DC5A6B49"), + new Guid("36AD58E3-ADE7-49B9-9922-DE0B5C3F13C3"), + new Guid("9BB6F1ED-7170-4CAA-A14C-747FD95CA30E"), + new Guid("7BECA90C-3671-4B3C-BF9A-FB8F08FF914B"), + new Guid("BF0B24D2-4BD6-4E9C-8775-A623ACE8DB56"), + new Guid("E11D6360-6FA9-45A9-A23E-2252A301CF86"), + new Guid("C7C1C25A-D89D-4720-846C-D6E1DD723A17"), + new Guid("EFFC49DD-6322-4302-899C-4CF540F0E2E4"), + new Guid("2EBA12C6-7817-4DFD-9E7C-94C8B8B389EF"), + new Guid("31DC3D15-C6F8-4405-A33B-8F3A52F8671A"), + new Guid("2D894ECA-8F6C-4B63-B265-0914A65D9BE9"), + new Guid("EE8A20B7-4202-489A-B8CD-BDEBAF770313"), + new Guid("D067B555-E53C-4C16-BB09-5314862D8BAE"), + new Guid("C6688928-6694-4264-8048-A60B665B5793"), + new Guid("3710E019-46C9-44DB-A0AA-9054D3126161"), + new Guid("029E0760-3306-41cc-B032-40BEFB22303E"), + new Guid("8A11E609-E88D-4247-8C5F-224DDB20DE10"), + new Guid("EE6E993C-5551-42AE-B35E-26BC6AEEB3A4"), + new Guid("410A3D81-290F-416B-8012-3AA16EAA9E55"), + new Guid("5B41C1ED-95BB-4CCA-8CFF-87361ACB5683"), + new Guid("C3B808D4-D94E-4C8E-B7B2-87B4F4A83198"), + new Guid("C817AF65-7CC8-4105-A8ED-47067D97B73B"), + new Guid("40516AF2-D413-418E-8B68-8443847EE169"), + new Guid("4445CCCD-E9B9-4F25-9E8C-2EF58408297D"), + new Guid("5450043D-907B-4884-A9E5-35CFD5935947"), + new Guid("72D9B7CD-AA06-4F7B-A66B-B992171D2CD4"), + new Guid("15947464-997A-4F44-9A4B-AC4916E7E19B"), + new Guid("844F922B-6FB6-49AA-864B-B1C49EDAA1AE"), + new Guid("5BDB3C06-FBEE-4F5F-991A-E2128F65BB86"), + new Guid("6B8366B9-B5E8-42B8-991C-C568D4442A81"), + new Guid("FC1E4EA7-15FA-4BBF-8697-F312762504BA"), + new Guid("B0E3486C-BD3D-4B5C-BE9A-40CD2C0CE2A1"), + new Guid("64FA0BA7-73CB-40E9-A8D2-3E61FFF146C9"), + new Guid("041B5AC9-99BE-4281-A17E-654EFF33D793"), + new Guid("9C21F9BD-A7E0-4989-99F1-7FA2853AB73C"), + new Guid("84D67C87-86FF-4E71-8A26-ABE048132F8F"), + new Guid("C81004A7-499E-4E05-84C8-3D74A17E97FD"), + new Guid("03E22B05-8505-442D-9C3B-7E691BD525E0"), + new Guid("6EA9BFC6-723C-466F-9EFC-0992879AE47D"), + new Guid("7F1DFB68-BF07-472D-A481-B802D2591CA6"), + new Guid("93DE2257-8303-490D-B2FE-6D1D838B08C6"), + new Guid("FF7E3ABD-6810-4128-83C9-701B4925C2FE"), + new Guid("1438C623-C4CE-4559-B71B-CFB86A71E6D7"), + new Guid("9A456463-3C71-4F9A-8117-DC2FCB087BD3"), + new Guid("514974A2-C2FD-4B25-A24D-2FF52FA3D798"), + new Guid("2933A9C1-AA62-46FB-A03C-68AED7FAE9B7"), + new Guid("B93BDFA4-486C-44A0-8266-557CCDC78B31"), + new Guid("9FC25175-3B4A-4248-BC7F-B86012EC584F"), + new Guid("70164474-A65B-4506-9953-F26AFB6B497A"), + new Guid("BBB897B5-F09B-4263-9F81-826CA61084F1"), + new Guid("46AD1505-9049-41D8-831B-768F46F12500"), + new Guid("DD12AC0F-55CC-4C79-A50C-D23CC7EA60B3"), + new Guid("9D79BE9A-F21E-4189-BE39-779DB79DA027"), + new Guid("DAE6488C-7FEA-4FA3-84C9-B611D017B6A5"), + new Guid("DC71598D-21A2-4598-9C12-13978796D2C9"), + new Guid("C09EEDD3-C4E1-4CF9-B6D1-A01624C6426A"), + new Guid("D502512C-966B-4752-8636-716FB29FACFE"), + new Guid("A3FE0CA2-64FE-44DB-AC3F-14513385BC25"), + new Guid("6736DAFE-2916-40F6-B6B7-B6300100933B"), + new Guid("2158EB7D-EB59-4740-9628-9080D7F51A97"), + new Guid("716B3E9D-9BB9-42A6-BA56-829B1C018B28"), + new Guid("F07F867D-808F-4750-92CA-859AEA59E58C"), + new Guid("C82FA28F-7E26-489E-A244-4D69CEA87B94"), + new Guid("D68911F6-6507-483A-B015-44726FDF868A"), + new Guid("8BE94377-A3CC-4187-A6E2-51523E953503"), + new Guid("B6EAD5E6-DAB5-4941-9017-D03452182709"), + new Guid("D8366DAF-AE1D-4B2C-A447-478C73580639"), + new Guid("3393B3B2-B324-408D-9C59-057A0DE9C3BD"), + new Guid("64493789-1C2C-4B24-A7E6-F00FF9BE923E"), + new Guid("8411FA09-B1A5-4B62-AA47-F28BEE9F6616"), + new Guid("29D131D2-5E52-49E3-83B1-C872D331CF03"), + new Guid("34DD26B6-D081-42F5-8BE9-C5FE7A7253B2"), + new Guid("B4DC89DC-3811-4D45-B0EE-0B71E28305CC"), + new Guid("424CED39-D801-419A-86FE-265942A9B74B"), + new Guid("A72515EC-998D-4B48-BD69-C67CF9245ABC"), + new Guid("D6C29733-BEEB-4FC9-975F-5E78A8ACC273"), + new Guid("5B3C7B4D-D5BB-488E-8F3F-FE8206FB0E55"), + new Guid("398FFED0-BFA7-452C-8521-7D37B3082DCF"), + new Guid("0D935E77-E437-426F-ACFF-DCCFB516EC8C"), + new Guid("303539BA-7253-4590-B8C4-7751CAA52C65"), + new Guid("80F26FBC-CA89-4789-996D-4C09547F2504"), + new Guid("5F63805F-1C8E-440A-A13C-222C5D81EB9C"), + new Guid("B760A3A7-EA7F-4A4B-A4B5-81752F2CA158"), + new Guid("6E04A3E2-3B3A-4D0B-BF71-1596CA0AA211"), + new Guid("0C21AE3D-10B1-481F-8D8F-66E2590C4578"), + new Guid("A2AE0C29-DF1C-486D-A44B-96FCC4E0AA8C"), + new Guid("53BA3B61-4F4E-4749-8A7F-0D2B327A113D"), + new Guid("DA203891-90A2-48F0-955A-8A80B6C62AF9"), + new Guid("6FCEEC81-1967-4FE5-81F3-86BCAF3F1C2F"), + new Guid("889DE305-82AD-4D1A-9A97-63733ED27BFC"), + new Guid("F77053F4-ED5A-4376-BCBA-17552EA447BA"), + new Guid("6EB2EF50-7E6B-41B8-A82E-6EB307C908CA"), + new Guid("6DD16E6E-FBDB-4DF1-9730-4877651E68F3"), + new Guid("A7568031-43E3-4CF9-B162-AC2FE74125F1"), + new Guid("31CCB9E3-D434-4430-AC84-486CC5A1C53D"), + new Guid("77BCDCAB-E9FD-48BA-8DCD-63F425367735"), + new Guid("58EEB55B-C57D-4F59-A7D6-9BF663FBF831"), + new Guid("A764174F-CCB7-48B1-ADD7-158BC89A5E81"), + new Guid("7C6BA6E5-D81E-4a50-A111-C946A0793378"), + new Guid("2E9F06F3-C986-43DA-A035-E3CC9AEF13D4"), + new Guid("B285BC3B-BA9F-4160-8E79-81DD43DFDBAA"), + new Guid("67247AB3-7B3A-4035-A0D0-A05C8E615C71"), + new Guid("97F40359-F4E8-4545-9BA5-980B47487540"), + new Guid("5D92B4A7-BAF7-495E-BB43-4F733CC55935"), + new Guid("EA839451-F89E-4432-B361-3086CA4F13FD"), + new Guid("5BB29704-FE0F-4594-9622-CE0AA42B93C8"), + new Guid("CB362FC7-B3AA-46F4-B9A8-0F8C97FB16FE"), + new Guid("36A2C83F-F7AA-41B0-9B17-F801F3720E4F"), + new Guid("7D7BC686-FAF5-484B-8519-B2529AC581BF"), + new Guid("D7E4E538-039F-47BB-AA42-A2CF455668CC"), + new Guid("37F6A1D9-985D-465E-B62D-37C1F9BF855B"), + new Guid("7524887A-5CF0-4459-96D1-FD8262BEF7D4"), + new Guid("C982941C-0CFF-47AA-9E08-5234A8E0D6E8"), + new Guid("139CD00C-429C-465A-A227-512AF0C48039"), + new Guid("2854734E-834A-42CB-8812-D9E7028916DC"), + new Guid("AF5BCF27-56E2-4072-B321-30A31B58AF78"), + new Guid("7D9F48F5-ABA3-486F-B49D-CD2CB0AC03F8"), + new Guid("B7662B2B-E57C-400B-8EF6-6FB612F5EE9F"), + new Guid("198436AE-C3C6-4F3C-8FE0-EA10C867F1C6"), + new Guid("31426C31-9439-406C-9867-BC98C6CA0565"), + new Guid("99D0D129-B427-4468-B4C6-91005BE63E18"), + new Guid("BF1F9360-6DD4-4EE3-B9F8-A5539BAEB53B"), + new Guid("EF5EE2BE-8A32-452A-818B-80191EDB8E41"), + new Guid("18043B8C-3FF0-46A5-87CC-626F62F967CC"), + new Guid("22300E2C-3D7D-4C36-A2B7-E2BBB247F793"), + new Guid("D345142F-D51E-4023-A25A-2A4C0F1FBCBF"), + new Guid("685D474D-3B84-4339-98C6-2AAC28B9870C"), + new Guid("62030451-C0F2-4E80-8085-05C6400FC914"), + new Guid("58DE3766-8729-48E2-97FE-937A441EB722"), + new Guid("BE280123-DDA6-49A0-BD8C-5E2855B56159"), + new Guid("811E8C93-D97A-4AAB-BD67-268B7783FF11"), + new Guid("32F868E0-54A7-4D04-8689-AC10E13396E5"), + new Guid("9E98C76F-6C1C-4B7D-8F71-38F9F0E8750E"), + new Guid("A2CE1453-9832-447C-9481-70C9E2DA4227"), + new Guid("A9FE3347-12AE-4624-B55E-45EA42CDBF9B"), + new Guid("0698B0F4-0A31-4A70-9262-8D36677D8FAA"), + new Guid("C2630384-2F72-4A96-BAED-3FFF03383362"), + new Guid("0E5A6BD0-470F-4231-9F57-A73B725807F4"), + new Guid("35FAEFB3-7498-4735-9B05-E7035DD368FC"), + new Guid("A8BFD196-8B54-4084-B11A-FE6E8BC5DA4C"), + new Guid("4BEDAE6A-1DF4-40E5-8A2F-AB0A1F41997E"), + new Guid("8080C7ED-E69A-4A8A-BD8D-BF3447B13630"), + new Guid("8FB9A1A6-844D-45A5-86C7-977D3E420149"), + new Guid("69D0A37D-F5B3-48A5-9486-5654D37B030B"), + new Guid("47ED6C39-B728-4AE7-BE7C-C45C714C3153"), + new Guid("CEEDCE41-CDEF-4766-9C5E-8FF5608C5464"), + new Guid("FF9DFC70-526D-405E-B613-5A2A21C1B2D8"), + new Guid("0D972590-5947-4983-A092-443697BAEC24"), + new Guid("C7990233-EF2E-4EA6-8D1E-CCF56E540394"), + new Guid("79B580FF-64A7-445B-ABCB-B49B9093779C"), + new Guid("8C28C640-DB5B-43E2-A1E6-B0E381962129"), + new Guid("32FC19FD-A04E-4B69-9442-F7D57348EC55"), + new Guid("26B97047-EDB1-44E9-8C7B-463DE9CFBE78"), + new Guid("C36131C3-B5E1-4AAC-A7B5-7C9CFA1E8F74"), + new Guid("C888C7AC-8CF4-49D2-A33E-20D19D84C47B"), + new Guid("10A82711-8829-461A-B172-FC8FFF3D555C"), + new Guid("49C878DD-277F-4BC9-B8AD-9BA192709108"), + new Guid("E545BAAB-581D-4AF8-81F2-5A884E272349"), + new Guid("167A5BAE-F06F-424C-BFCB-EC547A076C8D"), + new Guid("D85391FA-680A-4715-81AC-C0835ACAC8C5"), + new Guid("71A2CC77-F968-4341-84C1-6C16D007A093"), + new Guid("C880C81F-65DC-4D93-8C39-22920FDBE4C7"), + new Guid("B2BB077A-92C8-4E54-8DFA-C89EFD60B82D"), + new Guid("D7DA5318-DCCF-477F-967D-1E3F6A421860"), + new Guid("040E4B3E-2F36-430A-AB09-1917F96A09DE"), + new Guid("71DBAF5F-2AFA-4282-B9B8-8A50D8C8E5E9"), + new Guid("ACDDD447-BF8A-4D74-8501-7DEFB0525CC0"), + new Guid("4F80A620-30DB-4529-94E8-F0CD9D0B0E96"), + new Guid("9E6D7C69-788C-4D40-8584-32F185E91932"), + new Guid("A1CE19C4-D12C-46DA-A718-6D03949B3DB1"), + new Guid("62B40326-F74C-4D80-9B1C-4DAE0FC07026"), + new Guid("196F81D0-6A1A-4CC0-936A-367423FF485C"), + new Guid("4E0992CD-C04C-4B55-BEAB-6B0A3C98A994"), + new Guid("B0E2635E-47C4-4995-942B-07F6635FAF6F"), + new Guid("EA46DE30-A1A9-4828-84A8-9165F61F8B20"), + new Guid("573BF23A-3FDE-4552-9263-62B7C71CAD02"), + new Guid("D7E0ED88-6D5A-44CC-A0FE-070A5AAB3E60"), + new Guid("EB07E333-38D2-4DDB-9BC9-5990403600B4"), + new Guid("7C234CCC-0DBE-42B0-A377-DB99EBD2B51E"), + new Guid("CDE96694-79E5-44AF-8D38-D988D1938E5F"), + new Guid("DC177F3C-D0FD-4232-ADF1-A77B339CDBB2"), + new Guid("191CA5A5-0A67-426E-ADFC-6FDF7C2AAA2C"), + new Guid("C8E3C39C-D895-4E42-8E1E-1574137BA016"), + new Guid("7981A8E1-CF0B-44A0-9DE4-12160B2F201D"), + new Guid("C1CEEBE1-1274-40C1-A932-696265D9D412"), + new Guid("7A8CB8D3-797D-478d-B7DD-265A1EEDC0C1"), + new Guid("22ACD714-B11E-462A-BD8E-6FF50843C103"), + new Guid("50903B35-5606-4727-8474-01C06BF588DA"), + new Guid("EEC72226-106C-4825-B245-6E18110EE917"), + new Guid("3A568F98-8446-4327-876B-7C5EC78D9084"), + new Guid("BAFA274E-8BF0-4CF7-8CE7-2C28293DB809"), + new Guid("EEEE02E1-157E-4786-AB92-80C92E5023B8"), + new Guid("58BE5DB0-C648-4522-BAD0-02CD9CC15F37"), + new Guid("D2B61570-AF54-44F3-846E-6D7EC9D3737F"), + new Guid("84A8D541-9571-4CE9-ABEA-BD9CCCB8DBF0"), + new Guid("97E1ABA5-2AC1-44A3-8F18-59B2347A54A1"), + new Guid("4A44AC87-5AD5-44DE-8170-9FD88B056010"), + new Guid("C6B62D63-B355-46C9-A8C7-E0A0BF112A9E"), + new Guid("31DEBFE3-91DA-4588-B433-21B0E14A101B"), + new Guid("73ADCFBE-8A74-4FDA-969F-616964226B9B"), + new Guid("9BAB95C4-9773-4894-9CB9-D7AD39378B45"), + new Guid("71430132-F2EA-40FE-B3F5-B6775741CC56"), + new Guid("EC8E1481-827C-4554-BF50-0D3F592F3702"), + new Guid("7EDF9E7C-3E32-4307-B5E3-B0D704DF7803"), + new Guid("B6E9B9C9-632B-48E7-99F7-FA53EBCB3BC5"), + new Guid("77D1610F-4757-46DE-B5F8-E127DC270DFD"), + new Guid("34E92FF1-32AA-49C7-B4DA-D161BEDC5ADC"), + new Guid("C5996B7D-0ACC-4AC7-BFA0-09B93A0ECCBC"), + new Guid("993B8955-52DB-4B2A-8E9A-405A155E7B60"), + new Guid("7EE3CCB5-E6CB-4028-9AF5-62AE782967B5"), + new Guid("66ABFBE5-E011-48DE-8773-905F1B1CE215"), + new Guid("5A585789-2EF6-42C5-9C5A-34FF716059B7"), + new Guid("3F6DC9AF-0C50-44D5-99F0-4AA67C668186"), + new Guid("084E2568-3F54-4EAB-B436-8A87FB466659"), + new Guid("33037A4D-3454-4C59-9A61-C5FB747F107A"), + new Guid("8B76F4A2-9926-4C76-8D4F-563371683219"), + new Guid("1FD8A8D6-6795-4A5B-90E0-342E8B0975A1"), + new Guid("ADDE4A66-9040-47A9-91AB-327934A2E97E"), + new Guid("345E019F-87D2-415D-BA37-9FB85460F7E1"), + new Guid("0FEF044A-C822-450D-B54A-EAC8621E50C2"), + new Guid("D8389A63-8B39-4E23-8528-CD756DAE2F5C"), + new Guid("F6EB81D5-CABA-4735-BE6F-AE038656B555"), + new Guid("0B7BFD0A-249C-45B6-9427-2C17AE00BF37"), + new Guid("019E3B64-C68A-4B19-BEC5-A22F4EB88F48"), + new Guid("7EE96F62-7C8E-4C27-A373-D7A534844612"), + new Guid("49471924-2458-4CB0-9430-F38CFC2FB63B"), + new Guid("0BC02285-8E70-442A-8D08-E04D922507C8"), + new Guid("89BA59D4-B314-4070-83BB-F9F868BCD363"), + new Guid("6B208FDA-544C-4CBA-B8CC-887B1018837F"), + new Guid("3AE3A1BE-CFB5-4953-B65B-68F0C51B1D40"), + new Guid("0644F4DA-C9FE-4239-BBE5-6EFC85F98968"), + new Guid("683F570A-0BFE-4A97-B55D-4319B328508B"), + new Guid("515F9B40-0637-4CE3-B343-2D99DE3F723B"), + new Guid("0205145D-23B6-4C3C-BF2D-BF866BB010E7"), + new Guid("6F83B918-DC9F-4053-90A4-A6B9E750DB29"), + new Guid("A6616A09-DF51-4CA6-850F-733EE73C8750"), + new Guid("F1373316-7917-4DCA-9D33-C6B520BD4034"), + new Guid("B917FFEC-AB7E-496A-BFE4-35C567FA0785"), + new Guid("6342C8BF-55B5-400F-AF7E-63055FE6813B"), + new Guid("EFE8E7B5-E008-4A3A-B3E1-23AE03A0083E"), + new Guid("A3BC1FBD-9F2F-4A9D-AE6E-7B02DA8A05B4"), + new Guid("818E33FF-590E-4D0E-B84E-67771324A545"), + new Guid("65C68427-2E20-42B2-8F49-623055EA9246"), + new Guid("62964BAF-FEA6-4D8E-8509-D312BFF8761A"), + new Guid("BE4AB208-1FA0-463F-9CA0-4C7E3E03AAFD"), + new Guid("5CD2F365-2D84-451E-9F2D-BC2561EFF909"), + new Guid("B2FEE662-C451-4D32-ACA5-A913CA0B2164"), + new Guid("ECA46133-C350-4573-A349-9B7CE11B6FA8"), + new Guid("4D3412E3-85A0-4F81-9DAD-EFD6101B4945"), + new Guid("3ACF5E20-B626-4F0A-A582-D386A0E30792"), + new Guid("3AEC74E5-6CFD-46D2-B26F-503FAD761583"), + new Guid("7575D654-E528-4FE0-85EB-481B0E6654BB"), + new Guid("2B893D04-3450-4862-B046-7DF6F87272F6"), + new Guid("FF736F67-197B-46B9-BC14-EDBEB1FB3D5A"), + new Guid("D9CB2E69-133D-4525-BCA5-50B0F3402CBB"), + new Guid("C1A70060-BA04-4F16-879E-5563492AEE02"), + new Guid("45993C48-3893-4D9E-96A3-B6B1AD160538"), + new Guid("2E2A17BA-9D81-4A3D-8AF5-96C8F0E39E7E"), + new Guid("3022C764-BA88-41D0-94DB-393312214F4E"), + new Guid("4F22EBDB-01DB-432A-9D7A-41CD44010265"), + new Guid("D1AECDBA-3938-4B0C-A2E6-7DC3B7CC5CDE"), + new Guid("B1756402-83C4-476D-8F55-010A0A10B5D9"), + new Guid("07CF5182-D090-4432-817B-037895B5CD1D"), + new Guid("5627904E-59C7-4DD5-AEB5-C6FE0C0A0571"), + new Guid("DD830047-D7F5-4010-A8EA-AE20468A0CBF"), + new Guid("044F740B-94F3-4096-AA3A-C07F5E708346"), + new Guid("D21DB541-4122-465f-9DB5-4C76F5E84426"), + new Guid("749AD6FE-5509-4E45-B236-84EA12DE102E"), + new Guid("85F211AE-CC16-4042-8C27-E99FF8F01F61"), + new Guid("339EE46B-D69A-4F2E-8FBA-D1B2ADFF763B"), + new Guid("0105615F-0A96-4D08-AB00-CA4B4473DE39"), + new Guid("6681F03B-06C4-4509-9253-E4739C9C1614"), + new Guid("67931F1C-9A0C-4D18-9762-E553C132256C"), + new Guid("063E0810-8E49-44EF-AA8F-BB9E63BB66DD"), + new Guid("A758718D-6E90-471D-ACDE-A637BA9FF9EB"), + new Guid("0F7C4D2F-ED94-49BA-A91C-FBA36193F35A"), + new Guid("A755EABA-FCE9-4A8B-B9CF-B3970A49F464"), + new Guid("ECBDF1C5-9D7F-4446-B6A1-644A379A480B"), + new Guid("FFE84C4F-8C38-4B84-AC36-E79FFADBD426"), + new Guid("36123FFE-14D8-4198-B32C-EABD0B23E0DD"), + new Guid("0CA05184-08B9-4DC7-A4C7-FF762380B111"), + new Guid("3B69F6B6-D64A-43AA-99DC-05E34F81E07F"), + new Guid("57E367F4-7029-4916-A700-791DB32B4745"), + new Guid("869D0C7B-D792-45AB-BF31-FD9F6FEA3107"), + new Guid("7E0BC050-5298-4808-AF22-5E284526C652"), + new Guid("49EE84FF-EB2B-4BA3-B193-3018D34599C2"), + new Guid("48380D5D-BD54-48A9-92BC-7C8A93DE0567"), + new Guid("EC90E061-E6A0-435F-8784-7269A24C670A"), + new Guid("4EB41E40-4115-435A-934A-5D91022A29DC"), + new Guid("1DA9C4F4-8AE2-47D9-8068-FF65FA3848A9"), + new Guid("5A2355B4-C295-4B94-86DA-6AC18198BAE4"), + new Guid("43282DE6-51E1-4E52-99FC-D54E2043FB6C"), + new Guid("0772919E-EB4C-45E3-B705-73007F5E5583"), + new Guid("ED2113C8-1784-4808-AB1A-FD269F86FA99"), + new Guid("9A8F2F6A-A039-45DD-80D3-D1E0911907B2"), + new Guid("63B18261-FAF3-4AB2-BCB4-7C3AC4D6D6BA"), + new Guid("DB2232D9-8B17-4920-936F-2B6249C6F7FA"), + new Guid("D7AE7208-7869-46E3-90C1-676342C3D7AF"), + new Guid("A8AE0EE7-56CA-4BDF-BD9A-C56DA3FF9254"), + new Guid("B4FC91FE-68F7-45A6-8863-75BBA1029BEF"), + new Guid("892B66F4-5DFD-4451-A491-4C4FD2179081"), + new Guid("A36B3354-8598-4228-B779-C7C922B1E61D"), + new Guid("F726D9BB-AE80-4C01-BDEF-B600CB27736E"), + new Guid("0B98FB79-222F-418C-8107-5D4E791D329C"), + new Guid("5C770098-2C91-4A9C-BFA0-A7FFAA871A7F"), + new Guid("B33DA469-FEFA-44F3-B35C-D70411BFE7E1"), + new Guid("CD436263-30A3-498C-93F6-3D5682F7F7C0"), + new Guid("73726931-EF12-4D39-A76E-7742F4B7C9CD"), + new Guid("A197DBFB-20E4-40C2-9C76-6ABBEB1A9B12"), + new Guid("D60FAF11-CC6E-48DB-8A13-82F86D78AB00"), + new Guid("9F3B4CAB-DC8A-430E-88F3-D3002DF64FB8"), + new Guid("8841AF5E-74E6-4C5D-A313-BA9AA7FDB78B"), + new Guid("975D0109-1BBA-4B0E-85B8-2C6B51C8E074"), + new Guid("0AAE0254-DC06-4906-8ECF-2D8450FB83F1"), + new Guid("3A28AB73-2847-44A4-97ED-7129269F1366"), + new Guid("C3F20CE7-D30E-40FD-AF8A-713A65C46CD0"), + new Guid("566BE8C1-3E42-4F8B-87EB-E70E8C13C6F8"), + new Guid("85B9908F-4F57-4BAA-9ED2-BC4705B12E72"), + new Guid("8E65904C-F9E9-4E12-B430-C1DDC540F1AE"), + new Guid("85DFC6A3-6C70-41F2-A869-32E2FB3C40EE"), + new Guid("86E5C062-D90F-476C-A363-264ADFAFEDFA"), + new Guid("C7C85346-158D-4881-839D-9A6A8E47209B"), + new Guid("5CC64831-C14A-4DBE-BEBA-214E725AD041"), + new Guid("643CC712-B3B3-42D0-971E-7A4C8A6CBF1E"), + new Guid("B16DE6A0-71DD-448C-9FFA-49F6646A5219"), + new Guid("A2BBF179-8D38-4D2E-84CD-0E00BB6C74F3"), + new Guid("5ABD1270-261A-4980-93E5-E10EACEA99AD"), + new Guid("1017CBC3-0DFB-4930-9881-28F96784035C"), + new Guid("E442AFE1-E7CD-4AB2-B456-963E2E041A1E"), + new Guid("DEFF977C-A664-4456-9D44-A5127DD2A7D1"), + new Guid("250BAAB9-5A31-493C-95EA-9FEE8BAF9FD5"), + new Guid("B5AA5873-4C66-4D2D-935A-18E0AB231DBB"), + new Guid("879E66BC-AF29-4FE4-86E0-0047973A57D6"), + new Guid("3F535689-944A-4E9C-8F64-EC6395B7C8D7"), + new Guid("985F099D-F38C-4957-907A-769D1A45CA10"), + new Guid("C6132280-D2AA-46F8-9E94-B087DBDA09CB"), + new Guid("32D5B3DE-0500-4AD6-B94E-20B8001D0A91"), + new Guid("12FE5F6C-7F98-47BA-936A-BCD1065C2DB3"), + new Guid("8E59041E-660B-4F3E-9A11-83217417209E"), + new Guid("6DE4E99B-2B5A-493A-A208-F024D1EABDF3"), + new Guid("F4B18E9C-B465-4763-BA79-D7EED2CEBCFA"), + new Guid("9D6CBE74-93D6-41FB-B7E2-CC30ADB28187"), + new Guid("16081DD6-72E5-4826-B86D-958DD82A01C0"), + new Guid("B14DB9F4-5E1D-4a2b-BEC0-0D6BCB5B1A31"), + new Guid("60A5FA58-45B1-41AE-9430-5200E8BFBCB8"), + new Guid("8BCC3B3D-DD0C-4838-A33A-B395F354C86F"), + new Guid("3C9FE647-2647-4F43-8BAC-7FACC054F7FF"), + new Guid("36176D59-171B-4A0A-A0F7-A8F9857536A1"), + new Guid("FCD22C85-7EE1-4D31-8633-9DBD32344211"), + new Guid("5832EB32-8A90-42A7-B2BC-A9BB575B1B7C"), + new Guid("2CC624FA-76CB-46AB-87C8-C13C6ADB1C72"), + new Guid("AA8D812B-7C13-414A-AD02-A4240D2CEF68"), + new Guid("20E7D987-0D55-46D4-AB69-0B0CCE2F1E24"), + new Guid("B08424B7-A2F1-4A0E-82D1-665249E12CFC"), + new Guid("88269184-D033-454E-B750-559D5F53287C"), + new Guid("D95ED463-AC64-4004-9C3B-0FCE2F7639BE"), + new Guid("EA2D0DC5-2CDB-4686-9F48-ABE65ED295A4"), + new Guid("5A021F98-2EFB-4BAF-9384-A553DC3DF86C"), + new Guid("6F01B67C-33A0-4ED3-8205-F868E97A1A3A"), + new Guid("C0B7F354-A75C-41D5-A489-AE2DF6364D02"), + new Guid("1E102423-6167-486A-BFEF-DAD1C9CDF1EB"), + new Guid("4D1AC5E6-DFE3-4643-B6E5-21649A01CCE9"), + new Guid("F4580C19-BA9E-4F71-A46A-6F3C4B19C36C"), + new Guid("4BFE53D2-FB85-4397-98A8-97D59B907064"), + new Guid("FFFA74FB-5B5C-453F-9120-94686033D894"), + new Guid("0BBE1739-E0B4-442E-B69C-02A0EA20D790"), + new Guid("75EB23C7-28B5-4C98-937A-1D8F371B24CF"), + new Guid("161CAE07-D1CB-467C-920F-62BA9039584C"), + new Guid("547F1151-5816-4D89-B0BC-ECE2A86C92EB"), + new Guid("70953222-5BC5-4fa2-A85A-01827F7BC537"), + new Guid("CF93B8E0-9F28-4485-B9D6-22293CCD73CE"), + new Guid("390AD7FC-8360-4EAE-8736-3AEDC15AE659"), + new Guid("196BF7B1-54A1-4A78-8D10-C61585849C63"), + new Guid("ECF9EBD7-F991-41DF-98CD-BCF1254D5D0B"), + new Guid("1B73B2BF-9582-4F8A-822A-E0D020272C7C"), + new Guid("902CFCBE-6E42-4E55-B2A5-9146702FC16B"), + new Guid("678A3319-A12B-4F92-857D-167DEF8EF583"), + new Guid("19D54C2F-AE03-4CBC-9B7E-57292F92FBC1"), + new Guid("34C9408C-C3F7-49db-8BCE-DE7FA7DA03D7"), + new Guid("D7140538-FB99-4AF9-8398-8C31A1B79FB5"), + new Guid("36E8F1DF-1798-4AE6-904D-600CA6EB4145"), + new Guid("28A68CEA-9128-4D5C-8542-8DF38C907310"), + new Guid("6330871B-6008-490E-BFFF-E28E17EBCE7E"), + new Guid("7110ADBE-A4CE-47B0-8C2F-6B41EDAF2FCB"), + new Guid("82EB3050-D382-48F6-A049-22A5F8A3B25A"), + new Guid("D88D862C-01D4-4B43-9FBE-59208922E022"), + new Guid("38AB2681-FCC7-4A75-BB0B-29C5CD2E3A8F"), + new Guid("2810998C-D6CC-47A3-A946-66D0986A2767"), + new Guid("6430B89C-7077-418A-A558-51F0E3F2C1A6"), + new Guid("7831223B-E5ED-4186-A321-94E9AE72A27D"), + new Guid("EF025CD9-DD92-442B-A8F9-FE7AC944CCEC"), + new Guid("05371057-2FE4-49EF-B203-F5BD6727645E"), + new Guid("06905A7E-47F4-4C86-AFEA-A4175295B566"), + new Guid("28A37D39-8347-4254-99BF-8E3C37DBF8A8"), + new Guid("D9F336CF-0682-4702-AB94-5ADE755DDC64"), + new Guid("DDEF260E-B183-47F7-837E-165FFBD1AF2C"), + new Guid("B035DCF9-1DD0-4FB3-BD04-7C8945E92CDF"), + new Guid("D975A233-1E48-4313-8BED-AADA7460487E"), + new Guid("7C7FC1B6-3775-4881-BBE0-9D0CE50E42A9"), + new Guid("F472B2D2-B4D3-4852-914D-71B66BDB6F26"), + new Guid("AB127348-7F98-43E5-801D-01241ECDB517"), + new Guid("756F67E9-2B22-4C43-913C-CEFF0E781545"), + new Guid("5A39EDAE-1ACE-4889-B636-1DFD2A1BCC3C"), + new Guid("6BD023F6-730E-44C2-AE8F-78DF967E2E18"), + new Guid("20BAA5E7-4F02-4782-A292-C6281D7B5F3A"), + new Guid("E931DA8A-EFC1-46CB-836A-72FBA4A1EB4F"), + new Guid("11CF45EC-F9D6-4C99-8782-738E26A342C8"), + new Guid("3180B6AA-3AD9-4BD3-96F7-AE72264406FB"), + new Guid("87C55AEA-2C3F-44CE-81EC-18A153C5DEB2"), + new Guid("B79F8775-D8D0-4AA5-B4AB-917F6F3D6C13"), + new Guid("BCA1AF45-7621-43c0-9152-FAC0018E5319"), + new Guid("3B4B947A-F223-4C87-8839-9F6237CDA9F6"), + new Guid("C35CBA91-742C-4B98-B848-DFD520D959CF"), + new Guid("3885231E-8B18-4DA3-AF76-C75E8B731ED8"), + new Guid("B7ED2482-6883-4A02-A992-E86C2573CC74"), + new Guid("1E419F7A-7363-46BC-8044-157ED0B40CCD"), + new Guid("5DB1B502-7C36-44FB-A7B4-50744E9EC286"), + new Guid("EB821083-3FB0-441A-9F1D-AD2A9ED918D8"), + new Guid("DF47F55D-B15D-4261-881E-3C4B0DC6D9BE"), + new Guid("40590157-9412-4558-B0F7-311867B649CC"), + new Guid("8B9F23F4-A147-4EA8-A13A-C5B1EDC7F5E4"), + new Guid("D7E4BF3E-E539-43BC-BB43-3AE0980FFB86"), + new Guid("7992958D-FD36-469E-A94B-F8A9EB26AF64"), + new Guid("440608DF-3C98-4DC8-9FD3-FAD08AFE7AEF"), + new Guid("7C80F6EE-E76D-4903-AEE6-7A33D1DA3F75"), + new Guid("5B925EE1-82EF-4692-BBA2-9CE3CB41C7BB"), + new Guid("2608BCF8-ED20-4501-8510-4ECACF922DD4"), + new Guid("A2240259-608B-40F1-990A-7F8E00EF1D07"), + new Guid("991357DC-9F56-47ED-8790-85CBD5F9B06F"), + new Guid("24398EEC-EDD1-449a-AD36-D609BE24A79E"), + new Guid("56D1A950-8798-45FB-BCCD-D8B1EB37C071"), + new Guid("C96AC1EB-12F2-47AF-9E96-9D99FCE7E8F5"), + new Guid("ADFC2BCD-6B8E-486C-B105-29B286B61CC0"), + new Guid("86C065EA-2420-4619-82D4-1D43527B3371"), + new Guid("7DF3078C-F681-4123-A712-4B83E438EA1D"), + new Guid("1B3DCCFE-29E4-478E-8443-17BE9454A05A"), + new Guid("6C32038C-ADF3-4085-BDE3-CD2F21A421BA"), + new Guid("E7119442-3063-422a-A03E-D02E570CCD0F"), + new Guid("6045C6EB-EFEA-4586-95F8-840D32578D66"), + new Guid("C16334A0-BE29-4A1E-A870-4CB3F1DF984D"), + new Guid("30B3FAA8-747E-465F-833A-A9957A259BE2"), + new Guid("71B19B9E-231C-4196-A7D7-AA56A5079782"), + new Guid("B7F058AF-9CE6-4DD0-B555-00526975300E"), + new Guid("08239F53-DAA5-47A6-9F39-29A9064B0C27"), + new Guid("6AB060CA-ECFC-4A46-ACCB-42B0473998CD"), + new Guid("E43C9905-AE67-4627-8B10-BD7A453828B4"), + new Guid("2B27B8CA-188E-44ad-AA86-FFA1F99106E3"), + new Guid("A31C85DF-02A9-4DD8-A094-0F07A0AFBCCA"), + new Guid("FE58AE61-AB0B-43A4-86FB-D9AEDD199932"), + new Guid("9B158C9E-9BA5-4BE2-A9A1-77EF888A3B06"), + new Guid("9B267CC1-983C-407A-98D2-1E27ADD6292C"), + new Guid("761706FE-D289-4ACE-B2C3-AB15D80DBA7F"), + new Guid("5F791DAF-98A2-4787-93CC-8813AEA93C4D"), + new Guid("E6C9FE4C-199E-4934-B622-739A85B0830D"), + new Guid("583C98FF-1CC8-4B05-9086-974D13A78894"), + new Guid("B3FB9960-8F42-43BC-9595-DFB3E04F5BFD"), + new Guid("BE2F2785-7219-4A35-B8D3-AA56B9B78514"), + new Guid("467DD680-AC64-4DC4-8A17-1CFE297D3392"), + new Guid("3FAE9066-EB66-444e-BD41-818B9F7B3BAE"), + new Guid("4068488F-59E9-47d1-8884-A1D6DCC10C36"), + new Guid("DFE59469-D1BF-4ed2-9FAA-6D5AF52EEFDD"), + new Guid("043D12AC-C76D-4B4C-813B-4EF7758C8085"), + new Guid("0CE61F27-9DE8-49B2-9189-6F6EFE488F6D"), + new Guid("BD9DE99F-6A92-47EE-B6BC-E9877EA21202"), + new Guid("B7F4FD44-FA17-46A8-BDAF-D3399D6CB0AC"), + new Guid("66D8B546-92F5-4E94-B992-08BE81C3D30C"), + new Guid("D25F7907-091E-4CF7-BD8C-BDB97278B616"), + new Guid("5718FCC8-1EBA-4B8D-9B6B-0C8349F53F80"), + new Guid("BE4A63E7-F4BA-4DE2-BE69-D26219D99CB6"), + new Guid("0A85EE64-E466-4295-8E2C-5B06C8E3054F"), + new Guid("709D43DD-CE94-4DF1-91B1-EDB0B12FDAEA"), + new Guid("A3BA23D2-618E-4618-AF18-9BEFAE2F888B"), + new Guid("06BE473E-C2F3-45FE-8522-3A0C033B5067"), + new Guid("E5F9C9CF-0B0C-47AA-B7DF-8C37F211CD00"), + new Guid("23B1A6B4-8D91-425C-B8C2-52D06B1C1D23"), + new Guid("B62B5FC7-1B20-4F63-8459-8EB4991839EE"), + new Guid("42BE1634-72CA-4A20-80A1-BA726E5CD1D2"), + new Guid("B0B161B2-E773-4B04-99EB-23778FD2AA80"), + new Guid("313A65BF-450F-48DA-8903-A43247F1A5F8"), + new Guid("C5B8C936-1E01-4E86-9145-A2B721EC9E39"), + new Guid("F5156CDE-9735-4249-920D-597FB0A7A8E3"), + new Guid("EB00B4C2-5B87-4EF8-9548-800FC5C9B524"), + new Guid("1A28D255-8F58-428C-9641-59F17F8B1E08"), + new Guid("CA98BD7B-8711-41F6-86D0-5CD07B7BFE0D"), + new Guid("41CAC849-613D-4BE4-A3BC-389412B7F653"), + new Guid("C72985CF-B07F-4ED5-873A-A2209929667E"), + new Guid("C6C772AF-7B6B-4393-B0DA-5B4A329D3426"), + new Guid("FB84538A-17A8-4ADC-8D50-E2B66F8E4099"), + new Guid("B6686C7C-39DE-40B5-ADEE-67FC7DC54374"), + new Guid("2C04FA05-EEBF-4331-B392-23F795C32382"), + new Guid("D086C2AD-2D11-4250-A25A-DC6538439DB6"), + new Guid("816490A4-2CAC-472A-BBB0-EAFBB9BBE4A8"), + new Guid("D85D0838-A9E4-4787-8FCE-7D0466BC24B9"), + new Guid("A57185C3-0CB5-41FA-94BF-DA0C9EDAC600"), + new Guid("FFA13B7D-5EAA-43BE-8518-51D9AA08F321"), + new Guid("64E6C0DB-6DD6-4B80-BBE9-C96BB161674B"), + new Guid("0E250E72-6C3F-424f-9E62-2DCC9729D817"), + new Guid("C0D903BF-6502-45DD-9DD8-CFF7F022C696"), + new Guid("8BDF4847-903B-4AF6-9553-3CFAB65DE516"), + new Guid("83899B19-8B39-4BF0-B124-4C6188569EC8"), + new Guid("7CF6312E-F9F0-49E8-AE60-7677FAC86C3F"), + new Guid("57F07B5F-75BF-4565-B969-CE0ADC0B50D4"), + new Guid("7B17E304-9A3F-463F-8216-CD1E1E119E0E"), + new Guid("0EBF9FCC-EE38-4F5F-AB5E-C76E199EF7AE"), + new Guid("1B6B0C12-9ECD-45CB-BB0E-0DADB435EDDF"), + new Guid("36934FAB-C0ED-4F25-A387-E1CCA26B2401"), + new Guid("D8EA1902-5FA6-4FDA-B7B2-1F9C301CDC5F"), + new Guid("8216627D-9D20-4A5C-8BFD-0709C16E7A08"), + new Guid("FCC204A3-EAE4-46D1-A9DC-08864FDE1772"), + new Guid("F2022802-4F43-4FA2-8C58-33A8B9E75895"), + new Guid("1FF743CB-49E0-483D-8A1D-4603A7D6C395"), + new Guid("F7960E84-5AF9-4999-9028-783058AA8C5C"), + new Guid("CBCFF912-E1C2-4D9B-9938-85D73E7E7265"), + new Guid("BFBFB9B5-363D-4767-A5CB-1B11B348EFD6"), + new Guid("BBB21324-089D-4368-A2AC-37C6BBFCBFFC"), + new Guid("D1687857-0F1D-4098-AFFB-B283A6677B6B"), + new Guid("0AAACFFE-9B6C-49a7-BF68-C0F9FF3E120E"), + new Guid("AFDD8B8E-9502-4D06-94EE-E79815B65750"), + new Guid("E94A5CF3-1FD4-4B52-902F-BBF0AD6BAC2B"), + new Guid("8F4C9266-A025-4b7a-BD67-FE0C043BF6F5"), + new Guid("CA752706-1C9E-43E7-BD17-845C4736CCD8"), + new Guid("3389561C-F264-48B9-B94C-86C33FC3C423"), + new Guid("7CFC8B3C-AD67-4928-AE6A-74AFD47CED89"), + new Guid("AADEFEE4-ED14-4753-952E-E945F2972E37"), + new Guid("1D34380D-61BF-4247-9145-BA318A14A97E"), + new Guid("286EE16C-A218-43D5-BBAC-AB15F80C3FCF"), + new Guid("755A7462-1D87-48B0-939C-08BE5B5EA002"), + new Guid("1621AAC3-4EA9-4373-BF1B-40FCE0CA7B5E"), + new Guid("D1B3D0F0-5319-4a6a-8A70-2179A8E76D22"), + new Guid("60B8DCFD-49A0-4AB4-82A7-2C5058B325AE"), + new Guid("8A81B9BC-9C66-4D57-A2D1-2E592604C4B1"), + new Guid("E9CAFABE-F0F7-4142-A6F6-D1C94BDC4B5C"), + new Guid("8A0C5ED9-0041-4AF5-A193-329E6C9F2717"), + new Guid("B43FAE8E-6B19-42ED-98CD-D363174B9CF8"), + new Guid("7648040B-0AA5-4D9A-8F13-FFD066B81602"), + new Guid("3CCC3A21-07C8-4983-A044-E3C74B538135"), + new Guid("B844D2F8-D3EF-4605-B038-8BC0A2CFF0AF"), + new Guid("0AAE1951-4D5B-45A0-853C-1839764C9862"), + new Guid("B1688009-474D-4E2E-A137-ACC1E32A435F"), + new Guid("627280F0-4F98-4B31-AD23-EABE37B002AD"), + new Guid("45D867C7-8496-4c92-BB41-B7DB5DB47717"), + new Guid("08C05E00-9660-4491-AF2F-A05FAB27EF39"), + new Guid("F8863B67-B911-4334-A1B6-6EB913BD14AF"), + new Guid("AA2B547C-2C82-4CE0-A1B3-35FA809D666C"), + new Guid("67E57493-D286-4271-B877-F63F962DDDF1"), + new Guid("EA17ABA7-6D4E-4DBF-89EA-84A1B1C47647"), + new Guid("73D580AC-DC89-474C-8048-3453EBDDA807"), + new Guid("BBA30B56-6CD8-4542-81AB-F983CF1354BD"), + new Guid("1133AD78-9CE9-46AA-B181-BB6F7A84A07B"), + new Guid("7D8898D6-6296-4D4D-B8DD-2F48C49F9E98"), + new Guid("6C54F0B0-B056-4090-B3F0-D5EC6710D4AB"), + new Guid("4E7A6DFE-3654-4CA1-874D-02424581B774"), + new Guid("D0DEE676-F3AE-43CC-96F1-7E3BB65870F5"), + new Guid("4D61F524-7213-4C2C-8C14-F8EFF3AED813"), + new Guid("7162885D-1D35-4baf-97D6-7368FFF7C723"), + new Guid("A3FB18FD-BEFB-493F-8A19-760883ED9697"), + new Guid("DFDCFA24-B013-4566-AF4A-28EF1DFD4742"), + new Guid("ABA3F7F1-9E13-4B48-ACBB-3BF6D6BFA0E8"), + new Guid("D574C970-6834-4566-AE37-F42C7E95483B"), + new Guid("6E7D10F8-6DA5-4A8A-A06D-952511194105"), + new Guid("AC9EE84F-F0C7-48B3-8E5A-B4C967112394"), + new Guid("080BF07B-E58B-4A75-BB97-84D980A143F0"), + new Guid("6FFE33FE-B49C-45C8-A50B-CD0065C0C869"), + new Guid("07E97F87-68CA-4D18-9F86-A326E0400947"), + new Guid("A3CA2A31-259E-4E15-9696-75B0C81886E9"), + new Guid("61F40376-729D-4D99-894F-06C5689A06AC"), + new Guid("82A4AE36-8E70-4C0D-8144-AD9FC3C0E04F"), + new Guid("B8DF8589-D03C-4E6D-BBEB-4F24FBF6A1DC"), + new Guid("0ADD0775-0ED0-46BE-BA4A-76310E63A036"), + new Guid("5C35C2F8-D17C-42A3-AA12-A4C29B6603E8"), + new Guid("7EE92CA4-19AA-4ABD-9F88-508766ACC39C"), + new Guid("19FEA936-30D1-482F-A103-1C5549B19745"), + new Guid("8F7C9D7D-9B2A-40F3-9314-8F16F0AA31EF"), + new Guid("6C36A680-4FF4-43B9-A7C2-9037CEB0D3F6"), + new Guid("2D563D27-8AC3-41C9-B326-856C9E1F6401"), + new Guid("995EE828-2393-462B-BE82-47F5B5439AAF"), + new Guid("3D10E03A-7902-458D-9C45-938DA103D639"), + new Guid("0FABC72A-CE97-41F3-8A2D-2F27EAE09499"), + new Guid("706CB38C-9ACA-4e2f-9653-D9562F07331C"), + new Guid("45B7DCCE-21D5-4738-A64D-E8B0BE8A1824"), + new Guid("2594FE01-4D20-4A20-B093-2DF70BCED18F"), + new Guid("2621E605-3ECC-4F3D-B28C-F8C92B3C4584"), + new Guid("867F515B-ED0F-431E-A84A-6C562E1BDBB7"), + new Guid("2E09535F-F61F-4FF5-8D56-23C2916CBB7F"), + new Guid("313CA832-CE91-44C9-BB35-BD130C39D924"), + new Guid("34FE8676-7BDA-493D-A012-BC5748E87823"), + new Guid("396A2A1B-832F-4180-B26A-C606550541D7"), + new Guid("C8AEA8B2-4088-4D20-A0D2-45C2AD974EE1"), + new Guid("4BF411B7-2B5B-4673-B116-0E6C31FBD08A"), + new Guid("A7824686-A3F3-4C8A-907E-5D841CF846C8"), + new Guid("64E41545-3A0A-4524-A8D4-8E5E0F0E2391"), + new Guid("2330813B-7413-41A8-8EB2-AE138511C953"), + new Guid("BF9606EC-9A8E-4822-8BFD-D5EEBC58C65B"), + new Guid("CBA6876C-5B48-42F4-AE0A-7FBE9BB971EF"), + new Guid("D01F1C51-522E-4B35-81B3-00577DBFA3BD"), + new Guid("7ADF468C-B93A-4B04-8AF6-4C691122A4EB"), + new Guid("FF73FB69-7DAC-43E2-876B-0EAD264C3F2D"), + new Guid("538A4C20-01D7-40B9-B462-AE279FF3DC27"), + new Guid("536A2D3E-2303-43BC-BF53-379131EB5730"), + new Guid("16DE6EAB-AFAB-4BA4-A279-CF0BA4D7C9E6"), + new Guid("A8B3FA0C-077E-4C0D-B4CC-36DCFBDCB4D4"), + new Guid("97ED5AF8-29CA-428D-8AC5-C61B61A963FD"), + new Guid("AED6C1EC-ABBE-47e3-A6CC-A99ECFF3B825"), + new Guid("742996CD-B87F-40A8-BDB3-DBA74219BD73"), + new Guid("82E4394A-2F58-4356-8D9C-1AD9DBE95293"), + new Guid("BFEBA2A4-4479-49E9-838C-3BAA2AD0FCAE"), + new Guid("25763563-5AD6-4B4D-9073-3FC88F6DD44E"), + new Guid("FE9253F4-D063-4D63-91AF-85273D61337F"), + new Guid("99B5B80A-A2D6-4820-ADFC-1DA72528C272"), + new Guid("FBA27833-D6F1-4C36-AC39-28902B29261B"), + new Guid("0D427D55-D63E-4A35-A66A-5E4DCE0A963E"), + new Guid("99988F94-3AA4-4984-88DF-AE228F01D3B7"), + new Guid("2F98291A-47A7-4b7b-9256-2C0249105BE1"), + new Guid("23FA2115-3979-472c-8939-4DB8D54E4C98"), + new Guid("06A44085-CBCF-4217-AE5E-56C51899C99A"), + new Guid("F6896060-4D5C-45E2-B89A-F9F6328A479C"), + new Guid("B0156A7C-928A-4CC8-A021-4AF4DC74FEAD"), + new Guid("2CCCFD92-DE45-42C2-83F7-1E0EF7DFDDC1"), + new Guid("6A6F0748-A6E9-4D64-B14E-543BB6EC2EC8"), + new Guid("AC527685-F31D-42F3-81BD-97221A01C7EF"), + new Guid("AF62C8F6-43C7-4C44-A0D1-AB9BCFF8E26F"), + new Guid("0C7C33F2-4CFA-42df-84BB-19FC915A72BD"), + new Guid("C05BF8C3-78F2-4EC5-B0D7-32D4963A5794"), + new Guid("E86364AC-6FA1-4AAD-A6C1-068D56B6A1F1"), + new Guid("16EE1E09-27AD-48C5-AA07-6933ECBBC716"), + new Guid("314C8FEA-4BDB-4BC8-AB67-A26A9C5ABBD4"), + new Guid("6C305AF5-CFF5-4F7F-BD89-040D4C265355"), + new Guid("47F170EB-5F1D-49A5-85BB-240047F392C0"), + new Guid("83ADEB9D-C0BE-4073-894D-913014420280"), + new Guid("AECF2AAD-B7A4-444F-9B13-64BC534126D2"), + new Guid("434EC34F-E7CA-44F8-9252-DFF5B9B2B62F"), + new Guid("91CC7E8F-522E-4FF1-B545-5A5B72F4E953"), + new Guid("C7CCC5BB-181D-420F-8665-64793FEFB37B"), + new Guid("B59F6FC4-629D-4E62-8673-CF62F8AD8197"), + new Guid("11665F1D-ACA9-4699-AFB2-BCDEA69C6645"), + new Guid("8938E132-6534-4428-9B03-CB1F459B7CBE"), + new Guid("C9B5F83E-529D-45AF-949F-4CC6B0591B66"), + new Guid("F29DCCAE-1654-4EB7-8AAE-04F7DF4FE90C"), + new Guid("21F21658-A69A-491C-A37B-156A8F4AD3FB"), + new Guid("C7DBD50E-0FF5-42AF-A7A9-9EAF03671C49"), + new Guid("2B2BEDD5-3F9C-4C18-A256-AA65EE19F15C"), + new Guid("76A06E45-99F7-446F-A2E8-E23EDF6064BD"), + new Guid("94F50CB8-9A59-42CC-9891-247CC3DE7428"), + new Guid("DE7B8DF5-83A7-4456-A63A-1075FF17DBAF"), + new Guid("03352940-C220-4A32-A9A5-FC08D1D0DC71"), + new Guid("98F9CEFF-E8A2-4E24-ABC4-561B80BB5889"), + new Guid("CD4300C9-265E-4457-8E33-4E0C9A4D4BA8"), + new Guid("130E2CBB-7E51-4F6F-A1CF-7A053A44C9B7"), + new Guid("91E95825-677A-4221-9E55-78A73BBAC6EE"), + new Guid("312CE7A7-8C7C-416D-BF93-73376F1F16D8"), + new Guid("21167445-F1B1-49B4-B147-BC792616C432"), + new Guid("14AD95AD-50FC-450F-B44D-4273DF0B1E8B"), + new Guid("F8C6A6A9-49F0-408A-9237-A66E852DA7D3"), + new Guid("AFE7CC92-E0AD-40D9-BE56-AA12D2693A3F"), + new Guid("1088CC2F-83AE-4911-8018-401A745DCFD5"), + new Guid("3A0DC521-F028-4C17-945C-B121E2D3DC0B"), + new Guid("0CC62B4A-D5FF-4F45-83D1-E2B46E5D159A"), + new Guid("B21ACE5F-9307-4BDC-B103-9FDF14A5655E"), + new Guid("DE544EBD-9F94-4831-8887-944C3BBBC254"), + new Guid("4E23B037-0547-4650-89C3-2B259B637FB6"), + new Guid("46DBDA42-FE21-4E52-8EEB-4263DED7031B"), + new Guid("0622D3F7-1AB2-482B-9F9C-9C101CD35182"), + new Guid("FCF16495-5226-4192-AFDB-E748192EFC3A"), + new Guid("1689AC96-1159-4575-BF5F-D16345F9496C"), + new Guid("659CCABF-F978-4852-A1A6-C225F1D76B97"), + new Guid("C2B720F5-1123-446E-9F60-088A3272B889"), + new Guid("5BB495A5-AB5B-4409-8CD1-E48B56401FAD"), + new Guid("7EA946FB-6469-4F21-A5A4-7963878E6FE2"), + new Guid("C8185CA6-567A-40EF-939F-FFEFDD9A4770"), + new Guid("F3A26E0A-727F-43AB-9310-88B8CEC8F6D7"), + new Guid("532245E7-8F46-4394-9045-240475EE62E8"), + new Guid("06CB2024-5F7B-467C-B32C-EF4C56030AC0"), + new Guid("12D752D5-53A9-46F6-9E81-3153401CC760"), + new Guid("C4FDB9CE-93CC-405B-B673-4058821BF794"), + new Guid("1F4EFAE7-1029-4B66-80EE-802459A7BAF5"), + new Guid("00269021-E1C4-474D-9DBA-341D296BDAC7"), + new Guid("00041516-72D1-4E56-9ED8-FE235A9B1A68"), + new Guid("F352A437-58F2-4920-AEC3-EDA8041F7447"), + new Guid("A345D090-14E2-4897-9186-DEBCB05AB27C"), + new Guid("49AA89F2-2022-4213-845E-DBBB4B53476C"), + new Guid("6712385A-6740-4F28-8BBE-8615EA17116B"), + new Guid("95A8D932-9554-439F-AFB5-AB158F2EED96"), + new Guid("D80360F9-7319-40A7-A2BC-FD8718711BA4"), + new Guid("BDAECF2F-D0FA-49F7-891E-BCB0A31AE630"), + new Guid("9F8B8C01-F790-469F-BC37-DECE6227E276"), + new Guid("69D039E6-F669-4D54-8B67-89B19FF0A19C"), + new Guid("6BF8CE57-1970-4EFB-A7D7-B0BF8BE6FB6B"), + new Guid("EB662979-604C-455E-A2C6-A84B03A2EE3A"), + new Guid("B7B0819B-ECEB-4F16-AE6D-2298C4DF1E6F"), + new Guid("6FB1D03C-B0FE-49B7-A473-168F12A54A36"), + new Guid("4526B41D-6F3C-494F-93A2-EA3E9705269D"), + new Guid("DAEFD275-98E3-4534-A991-C7D396B54C69"), + new Guid("18A6684F-D324-45EE-855C-44D473916B14"), + new Guid("3F37BB6F-CD32-4430-AA35-700ACABBEE15"), + new Guid("5261497B-6BEB-4DB1-9DE2-10B5F6F8EC69"), + new Guid("2C42F822-2079-440C-B3B7-7725B6A8DB8B"), + new Guid("86615235-8CDD-413d-B722-11BC5A4653D6"), + new Guid("590570C5-3267-4966-B0DB-2AF7A5105C83"), + new Guid("3EDB307F-BE46-40B6-A6A4-AE075B40258C"), + new Guid("BBC5B3A2-4C6E-4D07-849B-4D616615A794"), + new Guid("0656CD5E-641F-46F3-BCAD-6F643727A344"), + new Guid("7B816F6A-4B46-403D-A1A2-2914EE070568"), + new Guid("3FBE3EA6-3AD3-430F-AB67-2D9C9F852C61"), + new Guid("50C1A392-2928-407A-8306-3C70141E375E"), + new Guid("D27A5602-ECE1-452E-9ED6-7261082DC8B8"), + new Guid("99E38DA1-91AD-4DFF-A68F-972607936E50"), + new Guid("73EA23C2-DB45-49FA-A72B-0FC6EFF4CE30"), + new Guid("04543543-4C3D-4D71-AA87-53191EF3B7B0"), + new Guid("615674AC-8158-4089-AE70-B55472FD279B"), + new Guid("0D38C343-9C51-47fe-A367-FFADFC92C507"), + new Guid("CC6F100A-5220-4f53-801C-B1FDCC619608"), + new Guid("EFEF45BD-26BE-46F8-B85B-424BE55BCDAC"), + new Guid("99861DCB-C6CA-4E50-A19A-EFADBB10C2CF"), + new Guid("31E0FDE8-B3AB-47ae-B791-54309E6ED0BD"), + new Guid("B015F460-FAEB-4AA5-B453-9E5E9AE061FE"), + new Guid("457231C8-4EB6-4460-AA45-3E9F2C4E8975"), + new Guid("2351F52A-8822-46AD-99C4-7EF526E94A6F"), + new Guid("776DE0C6-FDD7-46DF-B33F-B1E4AF6EE099"), + new Guid("12F12BF3-F232-4477-BF39-D91B7F55C2C3"), + new Guid("03D65D0C-AAFB-40C0-9CD2-3E5CED66AD03"), + new Guid("1C8DA3AA-3C74-4188-8949-5AB82FC1F99C"), + new Guid("4E2ADAED-145E-45FC-8448-81C0BD47C414"), + new Guid("780FBF89-F2BA-404C-B288-F6CA637BBC90"), + new Guid("0D7409AB-FC1F-4680-B040-D91D7004084F"), + new Guid("08244B88-BFBA-487A-96BC-CA3771D1FA7C"), + new Guid("76D4C718-A84D-4B7B-9767-1C350C3BC124"), + new Guid("DF149819-608F-46CD-BA0F-55F1D9D2E8EC"), + new Guid("2FC69F71-E9F1-45F9-B88E-BDAF97457FC3"), + new Guid("AF399519-5D7C-4100-9C79-8162CB4641CB"), + new Guid("4C31AC6A-3197-4762-9937-2FDEA90784B7"), + new Guid("2DCA9338-85CB-4F58-B40D-D2D759E8EDD6"), + new Guid("F76C3803-1C7A-4181-9A87-64AE7231A67D"), + new Guid("70F80041-AF88-4521-9EBD-21D8F0B0D131"), + new Guid("775B53F1-BFCF-4270-A60D-B5AFFC9D6A99"), + new Guid("B8FC54D8-AFD2-4EF8-B811-EFB8AA7064DB"), + new Guid("6BC8E911-36F2-4D45-B237-2BDB6C03CC11"), + new Guid("C7C2D82E-D86C-4BF3-81A1-82772E87D709"), + new Guid("86287A4C-0D64-4F28-9A5C-17FB9DF37AB6"), + new Guid("C13CA251-6103-4475-85AF-933311923F2C"), + new Guid("0A1AD4C9-8BF3-448B-A27F-611813B305DE"), + new Guid("2265A4BD-379D-4A9D-80D5-2318E6C8C683"), + new Guid("F4829D9D-A93F-4FC5-918C-6D4C501A6573"), + new Guid("8596F086-EE46-4245-8D45-2171A60E19E4"), + new Guid("BCB1252C-7CB4-4FBC-B83F-E5F9C65B4AFB"), + new Guid("D2001C9C-3C37-4910-8B8A-ADCFFC6FBF26"), + new Guid("2C143278-3EA0-49C6-9E50-E0BF7C8CF4E2"), + new Guid("4F485A60-E3BA-42E6-9D59-185305C5D1F2"), + new Guid("095C36BD-B74A-44F5-987B-85909E3F4C1D"), + new Guid("9ED66151-C144-4E5E-A3A2-F5D08B0C9BB8"), + new Guid("1A8322D7-CDA9-41E5-A14B-F41274CB7157"), + new Guid("E0AD6BB1-D422-408A-83F8-F1A7661ED225"), + new Guid("84084E67-B321-4B6A-A436-29EAD0BEE586"), + new Guid("3420B36A-A033-4AF9-A8C4-53F8221EE56E"), + new Guid("21A284AB-B9A3-42C8-8FB9-96AFF1E1FE8F"), + new Guid("6B1EEEBD-2433-4F39-9E67-7AC4DD0FE20A"), + new Guid("80BCBC99-3C85-46D6-B15C-895367231747"), + new Guid("8AFFE94D-A396-4404-A0D7-C65046E617E6"), + new Guid("A4B03891-C2DF-4d72-BBDC-13BC8D4ECEBA"), + new Guid("EC6F626C-E7A0-4EC7-A541-D683F20C9271"), + new Guid("80DE758C-537D-4C8C-8308-4BABFB2C787A"), + new Guid("F45A456E-8E23-4364-8842-047CC73F529B"), + new Guid("061749A8-E28A-461C-BF2D-052AB3E157D5"), + new Guid("3785D9F3-0922-4D79-A0FA-B97C4A26FE17"), + new Guid("8FBED974-7D25-44C3-80CB-7D02E4069007"), + new Guid("91913920-8A6A-4BA0-9361-D6CC9E1F3639"), + new Guid("BDDC70EA-D46F-4e4b-83A1-A47BEA858DD6"), + new Guid("ED976BBE-4FB2-4365-B136-D2FCE077A73F"), + new Guid("5EE64D88-C462-4505-B14A-5D36E357A024"), + new Guid("6A4F5638-388E-4c8e-9BB7-8E742DAC43DB"), + new Guid("9E775794-3DDA-4942-B6AF-087FFD57F342"), + new Guid("4D2A247E-4925-4750-8C39-E2D78665D33C"), + new Guid("E2806BED-B450-4469-900A-1AFA7DED2224"), + new Guid("3005971D-DE4D-401F-8400-B25DE5E052AD"), + new Guid("FC170F70-520E-4f3e-B8B8-98E4B898FD24"), + new Guid("E1E0B800-85AD-4886-ABE5-9F67C022A5ED"), + new Guid("349F0278-7998-422A-9C3B-6053989CBB20"), + new Guid("3A2C0773-6B3E-4F8B-909D-C8F84D66D4F4"), + new Guid("A72CA6F7-E389-408A-8276-FEC4D60A3A56"), + new Guid("0D63ADCE-41DD-4873-B0BF-331D0205E65D"), + new Guid("093EEEA2-4FF6-4EE8-AD05-8AF1702B7246"), + new Guid("DA988F73-FC9D-4A23-B70D-22299A7C6097"), + new Guid("94CAD4CA-C2EC-4FF3-B9B1-11107549941D"), + new Guid("E28F3F79-D4A5-402C-8A70-196856791078"), + new Guid("B158FE11-5AF2-4467-BBC0-CC1AEE766592"), + new Guid("12A028D1-D910-4011-AB9D-59BE69DAAF65"), + new Guid("D47B69E0-AB4A-4111-AEC3-2C889A4E70B3"), + new Guid("ECAFF061-6A12-4ad6-B818-9B140A9A3E11"), + new Guid("2D5D634E-75B5-4921-922E-573A809A49F8"), + new Guid("10B6C417-D020-4318-A44A-AE69EA3EEC5A"), + new Guid("754AC437-2841-48C3-BBB0-7D6DFF52605E"), + new Guid("0037693A-AE42-4E5C-85F5-10A05482D4EE"), + new Guid("C9741B97-AD50-465C-A4CA-B21D488F45FE"), + new Guid("74CD7314-5EF6-4505-A35A-81468B5A3F3A"), + new Guid("316F27AA-ED6D-4BC3-9D14-840946A6F4E9"), + new Guid("D9B9DB39-D87E-4D04-8298-1F1B969DBDA1"), + new Guid("AF0909A5-928A-4421-BAAA-F33B14302714"), + new Guid("64F39297-426B-45A8-B5D2-097CF71D688C"), + new Guid("24D3D7F9-0FDA-4759-930B-6B721D3E9115"), + new Guid("0296465A-25DE-4AF6-A122-376956B4B452"), + new Guid("13DF6EE2-4189-4FAA-B54D-768588D03978"), + new Guid("D4521B0F-0703-48CC-94A0-F42CCC09959C"), + new Guid("8DB17EEF-6C42-4BA0-9F07-A3B0E7C8F1E1"), + new Guid("76795FDD-55DC-4FB7-A9AD-D1423C31DF50"), + new Guid("AD4D28F0-5CBB-4B82-B736-9B41860A248C"), + new Guid("A139558A-8DF9-4FC9-BD3E-816A1408BA7F"), + new Guid("811A2ABC-4BF3-44E4-9FF4-E33FF4470CE6"), + new Guid("F950B7CC-FB85-4DBB-B8CA-934D38CAE7FC"), + new Guid("A42AA891-E4FD-489E-B573-B9D20DFC5C2A"), + new Guid("2C576C40-17AE-45A7-9EC8-6C16E02AB9C3"), + new Guid("AE04020A-3BB2-4672-AD75-71CE72D461EA"), + new Guid("A7B32D1B-1BE7-43EC-94A1-FC7BDD826168"), + new Guid("DA41EA1F-DD09-421D-A1A5-174FF43F4EFF"), + new Guid("B34DC5C9-3367-4BFC-B077-CD014250DC5C"), + new Guid("8206415E-A915-4842-A46A-FBEA64F1A0E3"), + new Guid("35624F3A-2029-43B3-B70A-83E63AC9052F"), + new Guid("0049664F-0931-487B-AB3C-CE11E134CE7A"), + new Guid("A4F4943F-AD94-4736-BF5D-F8A3CB15919F"), + new Guid("751F726B-B7CD-470E-A9FD-F2F1B460DD0D"), + new Guid("5422D4BA-8AF4-4767-912E-43B60EF28EAB"), + new Guid("AAF9D375-F0A0-4C7B-BBF8-3C7FFD4F5A52"), + new Guid("7F91AA6D-F342-4fb9-9448-69D694CDA9C5"), + new Guid("1082C52B-490A-4eec-ACF1-7016796DAFD9"), + new Guid("73B959AB-0229-4710-AF99-DFC9B5370540"), + new Guid("984DC2B7-6FDD-4257-ABDC-5873ABB7BB70"), + new Guid("E1DD83DD-955A-4BC7-A761-FC91555DA1F8"), + new Guid("D74914E7-E329-49d4-8513-EC8D850241E4"), + new Guid("A22D5C1C-DAED-4E7A-8243-493F2D841314"), + new Guid("C7C3AA7D-A4B5-45AF-9A31-A640179E8FA4"), + new Guid("61A28BDC-C05C-49D8-B47E-D54A9082156C"), + new Guid("793993AC-20C1-49F0-9716-E4CDC7DA4439"), + new Guid("DF2EE830-0668-43D7-8A32-E2FD3E7B31D8"), + new Guid("CCBBD16F-58C5-45C1-BFFF-1FBA64D9740E"), + new Guid("321D0A74-705F-40BF-8D24-809F65BEE895"), + new Guid("54F59B23-A2E8-4BFC-9DA2-7DD7C37D2A47"), + new Guid("7BF05F4E-909F-40CA-B742-9BE21EBA9FBB"), + new Guid("59D936F3-DFFB-4585-80E0-EAF6CD6A8026"), + new Guid("AB8D8DC9-EEB7-41FF-93A9-CBBD50B89A73"), + new Guid("47FEEE3E-80E1-469A-911C-0C550B37A2F8"), + new Guid("C3DDFC77-E3A6-450E-A853-111F5595DF87"), + new Guid("965C6A0B-3034-4E2F-A00B-ED2EB3119A5D"), + new Guid("EDEB9458-3BDB-4D14-AAA1-6EB457307B9C"), + new Guid("6FA33DE6-00F4-44D5-B6B3-B3C4A4F671E5"), + new Guid("3EA4C495-B837-4310-8741-38D89FA63E0B"), + new Guid("AD7CC381-1DC6-4FC2-94A4-ACD5BF7A11DA"), + new Guid("AF6FE2D6-576D-473F-8A32-583779D95D1D"), + new Guid("84EB31D3-B932-4B3B-B945-85884EA856C7"), + new Guid("85C5B8F7-8086-493D-B70D-A361BFA56F09"), + new Guid("E0C32642-7C51-4E23-A776-F63F2F2F936D"), + new Guid("1A635032-6E13-4A56-AA03-6C6A015C502E"), + new Guid("13E67CC9-055B-4F9B-9217-A16B18DB0329"), + new Guid("E0B00A13-8648-4635-AFE5-0BE3C0B6A05C"), + new Guid("858AF232-B570-4153-B4C0-F60930DF9CED"), + new Guid("7C022751-A9F9-412D-8B27-8CD03B797E2D"), + new Guid("CA495E57-A8E0-4294-BFE3-7B7995DC96C7"), + new Guid("F883266A-146A-41C7-B1DB-85120840C3A8"), + new Guid("04752883-AA3E-42A2-BD42-454E9CD99B11"), + new Guid("CF5F83BE-2C19-4CF8-8CC5-53BD32B50530"), + new Guid("A03663CA-0C66-4570-BE2D-B40105CC4400"), + new Guid("350667EE-592B-47AF-ADCA-14E820EC58CF"), + new Guid("B4C1E05F-F741-45CC-8D13-A1F60F474325"), + new Guid("E64E647E-A5FB-463C-8EEF-44879E2E70B2"), + new Guid("1DE2CEF5-3A2D-45C1-8CB6-06B2AC087907"), + new Guid("FA8E72A0-1BFE-4B49-A287-293B44213960"), + new Guid("AAB82DC7-DE9F-44B3-845E-0C926F47CFB6"), + new Guid("BB8DDF5F-707D-46C0-AFF4-45683D26FD68"), + new Guid("93DF663C-9A5E-48AA-984F-FDF413079BC2"), + new Guid("4415AFF1-4D74-463E-A25D-9832C7477329"), + new Guid("4F587B2B-60A6-4EA0-9FE5-89E5A502D380"), + new Guid("D0B14231-1471-41B3-AEB5-69199ACAAEFB"), + new Guid("AABC32EE-46E4-469F-93AD-673373CB2E8D"), + new Guid("71757FF0-D698-426D-A791-50C4BDE6F735"), + new Guid("400D318E-A9EF-40B4-92BE-0D7E96E51D8A"), + new Guid("A9470E53-EE43-4C87-9CCE-09CC4FA6B1C1"), + new Guid("9F91CD53-8B9E-4D76-82E4-5EDE39112322"), + new Guid("66E2806D-3E16-4FB2-A158-7F3B4DD5D9AF"), + new Guid("0EEFA07A-E0A3-49E3-AEB4-62F1EAFD8E23"), + new Guid("42B21A6E-E2F3-4468-9E92-49EE4DE6909A"), + new Guid("3A545732-145A-4034-8F72-E08D752CB4D4"), + new Guid("6903B844-79BE-4E9D-A3C8-1CA2A385BF4F"), + new Guid("D39B2432-87D5-4F3E-8101-DE06001B42D6"), + new Guid("52F9A8F0-D97D-4AA1-8C2C-D907D7CB83FC"), + new Guid("116BEF13-E80F-4A15-BB0A-BB7B3794FFAC"), + new Guid("CA0F9B9B-31FC-4AE6-9563-ABEDC4A5AF98"), + new Guid("99C51A2C-AD49-48A6-BB0B-F059DA745EC4"), + new Guid("55B93F1C-6CE0-4D13-AE1E-F06360E4689C"), + new Guid("7F7FC197-5064-43C0-AF51-2919FB7355C9"), + new Guid("265F5645-94CB-485C-8BF9-0A3AB2354F63"), + new Guid("C029EED8-2EC0-4F6F-AA22-3A066BB23EA6"), + new Guid("8B5F9519-7301-4400-B93D-EBDE4EA3DEF8"), + new Guid("13EDBEFF-8913-49EF-8F02-777F86FB512D"), + new Guid("ECF1CCE7-ED58-44BF-870A-E8579B309C54"), + new Guid("30FFF450-1AA5-4993-9C14-C8019A5F072E"), + new Guid("49F45F97-95F8-4A53-8952-F90147AF2BA9"), + new Guid("F94E9041-49B0-4D25-AA54-9446C5AB45F4"), + new Guid("D8DFA6FC-84EA-4178-B4F5-95E0C113140A"), + new Guid("EA7C06D0-5E33-4702-B6A0-51582B216FE8"), + new Guid("251B17BD-5796-43CE-BA10-54140A99A1E0"), + new Guid("B2FD2D29-1389-4114-91A8-15B8D9742794"), + new Guid("66DEDB31-DD2A-4E94-825E-331590AC59A9"), + new Guid("05E20A72-9496-4BBA-8097-5605692E83A1"), + new Guid("1B4F987D-3EAA-46DD-95EE-E0CB1F30CFBB"), + new Guid("3759BDDA-2B52-43DC-8995-8379E3129DCE"), + new Guid("779E4547-DEE6-4780-A180-30A740F9574C"), + new Guid("23BC906D-C15A-4368-B0CA-7443D5E37B83"), + new Guid("E173EA34-C216-4702-AA24-CA9AB40D48DD"), + new Guid("BE3559D9-D69F-4E06-8184-071C35AA2E10"), + new Guid("48D3DE9F-3619-4785-B50B-6921BA7EECD6"), + new Guid("139409C3-7860-4586-897F-85BA3226046C"), + new Guid("18BF6C79-6399-4977-BE3D-93135302D8C4"), + new Guid("4FDF3CF1-0808-4F11-ACDD-9DB71550BAAB"), + new Guid("F858278A-2727-4403-9CF0-565CDECECB1E"), + new Guid("2F28F1AB-476E-4317-8787-124D95D6B9D2"), + new Guid("F02AE505-D6B7-4B30-9D97-8505D0D1A0C7"), + new Guid("638679C7-1C7C-41DA-AB60-0AC7E98FCD72"), + new Guid("7C1C3730-3B35-4150-B54E-BF6D344546B3"), + new Guid("C103D339-24F2-45C6-8539-D3C445E15C49"), + new Guid("577A9F51-263A-4C80-A439-84CE45B9C7CC"), + new Guid("FBF40F2E-E743-479D-80B2-63325407D5D1"), + new Guid("15E0B54B-BB7C-4900-B048-20B718D05F79"), + new Guid("41837400-BDC5-4CBC-A1DC-D793F713F883"), + new Guid("2E5A80F9-35AE-4850-9627-BE530832A781"), + new Guid("5B7666BD-C6C1-45E7-AA2E-1799FCB16D97"), + new Guid("7B513A02-C3AE-4243-9410-16854D911258"), + new Guid("6B921117-47E9-4717-B3B3-4E170D26B6D9"), + new Guid("C2EC9CEE-7FE3-44F2-9008-C8B42F6F78DD"), + new Guid("774CDFF1-8CBA-4F94-A519-C66ABD3B5F49"), + new Guid("5771F3A1-FDA3-4111-9ABC-7A0D76C60A79"), + new Guid("DD3E872A-FB50-4204-9646-7A24C644013B"), + new Guid("94F573FF-29F0-42AE-B1D9-F882823B2935"), + new Guid("EBB5F3E5-BFE5-4A40-986A-938C1BDB9C76"), + new Guid("69541573-F845-4E77-91F6-1E3551FC6C82"), + new Guid("EE0585B1-627A-4A71-888D-B5D82619431E"), + new Guid("85CB1E3C-62BA-4A77-A838-0237707FB0CB"), + new Guid("B8E66BB4-140C-45B4-89CE-D9A77B9E5D21"), + new Guid("35A9DA32-53EE-44FA-9C65-5A15F88AD283"), + new Guid("69D366D2-9735-4A1B-B938-7B212932B568"), + new Guid("09AC3709-0B0E-4046-B6B2-7869D574AA0D"), + new Guid("D90E71BF-2898-4501-9D09-C518999F83E2"), + new Guid("A105E31C-1268-4FC2-8655-838D34860ECE"), + new Guid("E8EC3885-C692-4B90-A5B3-4C86DA642666"), + new Guid("7D111356-E04E-4891-960C-2F35147EBA82"), + new Guid("5DF53B87-7F59-4F5C-991E-5AE007B68FA9"), + new Guid("4223D3BA-5560-4C30-B013-4E31FEE36329"), + ]; +} diff --git a/backend/FwLite/MiniLcm/Validators/EntryValidator.cs b/backend/FwLite/MiniLcm/Validators/EntryValidator.cs index a68076b26..986caaf86 100644 --- a/backend/FwLite/MiniLcm/Validators/EntryValidator.cs +++ b/backend/FwLite/MiniLcm/Validators/EntryValidator.cs @@ -7,7 +7,47 @@ public class EntryValidator : AbstractValidator { public EntryValidator() { + RuleFor(e => e.DeletedAt).Null(); + RuleFor(e => e.LexemeForm).Required(); + RuleFor(e => e.CitationForm).NoEmptyValues(); + RuleFor(e => e.LiteralMeaning).NoEmptyValues(); + RuleFor(e => e.Note).NoEmptyValues(); RuleForEach(e => e.Senses).SetValidator(entry => new SenseValidator(entry)); - //todo just a stub as an example for senses + RuleForEach(e => e.Components).Must(NotBeEmptyComponentReference); + RuleForEach(e => e.Components).Must(NotBeComponentSelfReference); + RuleForEach(e => e.Components).Must(HaveCorrectComponentEntryReference); + RuleForEach(e => e.ComplexForms).Must(NotBeComplexFormSelfReference); + RuleForEach(e => e.ComplexForms).Must(HaveCorrectComplexFormEntryReference); + // RuleForEach(e => e.Components).SetValidator(entry => new ComplexFormComponentValidator(entry)); // TODO: Not implemented yet + // RuleForEach(e => e.ComplexForms).SetValidator(entry => new ComplexFormComponentValidator(entry)); // TODO: Not implemented yet + // TODO: ComplexFormComponentValidator(entry) might need to know the "direction" of the entry it's validating, i.e. one class for "I'm a component" and another for "I'm the complex entry" + RuleForEach(e => e.ComplexFormTypes).SetValidator(new ComplexFormTypeValidator()); + } + + private bool NotBeEmptyComponentReference(Entry entry, ComplexFormComponent component) + { + return component.ComponentEntryId != Guid.Empty; + } + + private bool NotBeComponentSelfReference(Entry entry, ComplexFormComponent component) + { + return component.ComponentEntryId != entry.Id; + } + + private bool HaveCorrectComponentEntryReference(Entry entry, ComplexFormComponent component) + { + // Empty GUID is okay here because it can be guessed from the parent object + return component.ComplexFormEntryId == entry.Id || component.ComplexFormEntryId == Guid.Empty; + } + + private bool NotBeComplexFormSelfReference(Entry entry, ComplexFormComponent component) + { + return component.ComplexFormEntryId != entry.Id || component.ComplexFormEntryId == Guid.Empty; + } + + private bool HaveCorrectComplexFormEntryReference(Entry entry, ComplexFormComponent component) + { + // Empty GUID is okay here because it can be guessed from the parent object + return component.ComponentEntryId == entry.Id || component.ComponentEntryId == Guid.Empty; } } diff --git a/backend/FwLite/MiniLcm/Validators/ExampleSentenceValidator.cs b/backend/FwLite/MiniLcm/Validators/ExampleSentenceValidator.cs new file mode 100644 index 000000000..557e7a25c --- /dev/null +++ b/backend/FwLite/MiniLcm/Validators/ExampleSentenceValidator.cs @@ -0,0 +1,20 @@ +using FluentValidation; +using MiniLcm.Models; + +namespace MiniLcm.Validators; + +public class ExampleSentenceValidator : AbstractValidator +{ + public ExampleSentenceValidator() + { + RuleFor(es => es.DeletedAt).Null(); + RuleFor(es => es.Sentence).NoEmptyValues(); + RuleFor(es => es.Translation).NoEmptyValues(); + } + + public ExampleSentenceValidator(Sense sense) : this() + { + //it's ok if SenseId is an Empty guid + RuleFor(es => es.SenseId).Equal(sense.Id).When(es => es.SenseId != Guid.Empty).WithMessage(examplesentence => $"ExampleSentence (Id: {examplesentence.Id}) EntryId must match Sense {sense.Id}, but instead was {examplesentence.SenseId}"); + } +} diff --git a/backend/FwLite/MiniLcm/Validators/IsCanonicalPartOfSpeechGuidValidator.cs b/backend/FwLite/MiniLcm/Validators/IsCanonicalPartOfSpeechGuidValidator.cs new file mode 100644 index 000000000..1ae40a6e0 --- /dev/null +++ b/backend/FwLite/MiniLcm/Validators/IsCanonicalPartOfSpeechGuidValidator.cs @@ -0,0 +1,16 @@ +using FluentValidation; + +namespace MiniLcm.Validators; + +public class IsCanonicalPartOfSpeechGuidValidator : AbstractValidator +{ + public IsCanonicalPartOfSpeechGuidValidator() + { + RuleFor(id => id).Must(BeCanonicalGuid); + } + + private bool BeCanonicalGuid(Guid? id) + { + return id == null || CanonicalGuidsPartOfSpeech.CanonicalPosGuids.Contains(id.Value); + } +} diff --git a/backend/FwLite/MiniLcm/Validators/MiniLcmValidators.cs b/backend/FwLite/MiniLcm/Validators/MiniLcmValidators.cs index 2da5c773c..11f241ac6 100644 --- a/backend/FwLite/MiniLcm/Validators/MiniLcmValidators.cs +++ b/backend/FwLite/MiniLcm/Validators/MiniLcmValidators.cs @@ -4,12 +4,49 @@ namespace MiniLcm.Validators; -public record MiniLcmValidators(IValidator ComplexFormTypeValidator) +public record MiniLcmValidators( + IValidator ComplexFormTypeValidator, + IValidator EntryValidator, + IValidator SenseValidator, + IValidator ExampleSentenceValidator, + IValidator WritingSystemValidator, + IValidator PartOfSpeechValidator, + IValidator SemanticDomainValidator) { public async Task ValidateAndThrow(ComplexFormType value) { await ComplexFormTypeValidator.ValidateAndThrowAsync(value); } + + public async Task ValidateAndThrow(Entry value) + { + await EntryValidator.ValidateAndThrowAsync(value); + } + + public async Task ValidateAndThrow(Sense value) + { + await SenseValidator.ValidateAndThrowAsync(value); + } + + public async Task ValidateAndThrow(ExampleSentence value) + { + await ExampleSentenceValidator.ValidateAndThrowAsync(value); + } + + public async Task ValidateAndThrow(WritingSystem value) + { + await WritingSystemValidator.ValidateAndThrowAsync(value); + } + + public async Task ValidateAndThrow(PartOfSpeech value) + { + await PartOfSpeechValidator.ValidateAndThrowAsync(value); + } + + public async Task ValidateAndThrow(SemanticDomain value) + { + await SemanticDomainValidator.ValidateAndThrowAsync(value); + } } public static class MiniLcmValidatorsExtensions @@ -18,6 +55,12 @@ public static IServiceCollection AddMiniLcmValidators(this IServiceCollection se { services.AddTransient(); services.AddTransient, ComplexFormTypeValidator>(); + services.AddTransient, EntryValidator>(); + services.AddTransient, SenseValidator>(); + services.AddTransient, ExampleSentenceValidator>(); + services.AddTransient, WritingSystemValidator>(); + services.AddTransient, PartOfSpeechValidator>(); + services.AddTransient, SemanticDomainValidator>(); return services; } } diff --git a/backend/FwLite/MiniLcm/Validators/PartOfSpeechValidator.cs b/backend/FwLite/MiniLcm/Validators/PartOfSpeechValidator.cs new file mode 100644 index 000000000..572d894a8 --- /dev/null +++ b/backend/FwLite/MiniLcm/Validators/PartOfSpeechValidator.cs @@ -0,0 +1,19 @@ +using FluentValidation; +using MiniLcm.Models; + +namespace MiniLcm.Validators; + +public class PartOfSpeechValidator : AbstractValidator +{ + public PartOfSpeechValidator() + { + // RuleFor(pos => pos.Id).Must(BeCanonicalGuid).When(pos => pos.Predefined); // TODO: Uncomment once PR 1350 is merged + RuleFor(pos => pos.DeletedAt).Null(); + RuleFor(pos => pos.Name).Required(); + } + + private bool BeCanonicalGuid(Guid id) + { + return CanonicalGuidsPartOfSpeech.CanonicalPosGuids.Contains(id); + } +} diff --git a/backend/FwLite/MiniLcm/Validators/SemanticDomainValidator.cs b/backend/FwLite/MiniLcm/Validators/SemanticDomainValidator.cs new file mode 100644 index 000000000..37c20ae21 --- /dev/null +++ b/backend/FwLite/MiniLcm/Validators/SemanticDomainValidator.cs @@ -0,0 +1,20 @@ +using FluentValidation; +using MiniLcm.Models; + +namespace MiniLcm.Validators; + +public class SemanticDomainValidator : AbstractValidator +{ + public SemanticDomainValidator() + { + RuleFor(s => s.Code).NotNull().NotEmpty(); + RuleFor(s => s.DeletedAt).Null(); + RuleFor(s => s.Id).Must(BeCanonicalGuid).When(s => s.Predefined); + RuleFor(s => s.Name).Required(); + } + + private bool BeCanonicalGuid(Guid id) + { + return CanonicalGuidsSemanticDomain.CanonicalSemDomGuids.Contains(id); + } +} diff --git a/backend/FwLite/MiniLcm/Validators/SenseValidator.cs b/backend/FwLite/MiniLcm/Validators/SenseValidator.cs index 43f72508d..34e28f713 100644 --- a/backend/FwLite/MiniLcm/Validators/SenseValidator.cs +++ b/backend/FwLite/MiniLcm/Validators/SenseValidator.cs @@ -7,7 +7,13 @@ public class SenseValidator : AbstractValidator { public SenseValidator() { - //todo add validation for the other properties + RuleFor(s => s.DeletedAt).Null(); + RuleFor(s => s.Definition).NoEmptyValues(); + RuleFor(s => s.Gloss).NoEmptyValues(); + // RuleFor(s => s.PartOfSpeech).Empty(); // TODO: Comment out if we're not yet ready to move away from strings + // RuleFor(s => s.PartOfSpeechId).SetValidator(new IsCanonicalPartOfSpeechGuidValidator()); // Can't do this statelessly, as we'd need a full PartOfSpeech object to check if it's predefined or not + RuleForEach(s => s.SemanticDomains).SetValidator(new SemanticDomainValidator()); + RuleForEach(s => s.ExampleSentences).SetValidator(sense => new ExampleSentenceValidator(sense)); } public SenseValidator(Entry entry): this() diff --git a/backend/FwLite/MiniLcm/Validators/WritingSystemValidator.cs b/backend/FwLite/MiniLcm/Validators/WritingSystemValidator.cs new file mode 100644 index 000000000..35ec4a7b7 --- /dev/null +++ b/backend/FwLite/MiniLcm/Validators/WritingSystemValidator.cs @@ -0,0 +1,21 @@ +using FluentValidation; +using MiniLcm.Models; +using SIL.WritingSystems; + +namespace MiniLcm.Validators; + +public class WritingSystemValidator : AbstractValidator +{ + public WritingSystemValidator() + { + RuleFor(ws => ws.Abbreviation).NotNull().NotEmpty(); + RuleFor(ws => ws.DeletedAt).Null(); + RuleFor(ws => ws.Name).NotNull().NotEmpty(); + RuleFor(ws => ws.WsId).Must(BeValidWsId); + } + + private bool BeValidWsId(WritingSystemId wsId) + { + return wsId.Code == "default" || wsId.Code == "__key" || IetfLanguageTag.IsValid(wsId.Code); + } +}